'Find-file-noselect` ile ilgili sorun nedir?


11

Son olarak cevap tarafından lunaryorn , o şöyle demiştir:

Ancak, daha önce yorumlarda belirtilmiş nedenlerle Org'ın diğer bölümlerinin çoğuna karşı öneriyorum: Eski ve eski ve zararlı uygulamalarla dolu (örneğin, dosyaları etkileşimli olmayan bir şekilde okumak için find-file-noselect).

find-file-noselectElisp programlarındaki dosyaları okumak için neden kötü bir fikir olduğunu herkes açıklayabilir mi? Daha iyi bir yol var mı? Soruyorum çünkü projelerimden birinde kullanmayı düşünüyordum.


Görünüşe göre daha good-practicesönce hiç etiket yoktu ; kullanmak iyi bir fikir mi?
mbork

Ben SE tarafından kaşlarını çattıgood-practices "meta etiketi" kategorisine altında olacağını düşünüyorum .
nispio

1
@nispio Bence geçerli bir etiket, ama bunu elbette meta'ya götürebiliriz.
Malabarba

1
@nsipio: Bu makaleyi gözden geçirdim ve katılmıyorum. Ama karar veren ben değilim. ;-)
mbork

Yanıtlar:


14

TL; DR : Gerçekte ne olduğu find-file-noselectkonusunda hiçbir kontrole sahip değilsiniz ve kullanıcının neyi etkinleştirdiğine bağlı olarak arabellekte etkinleştirilen keyfi küçük modlarla sonuçlanabilir init.el. Ayrıca, temizlik zordur.

Kullanın with-temp-bufferve insert-file-contentsbunun yerine. Arabellekte belirli büyük veya küçük modlara ihtiyacınız varsa, bunları açıkça etkinleştirin . Dosya yazmak için with-temp-filebunun yerine, adına rağmen keyfi dosyalara yazmanıza olanak tanır.

Yan etkiler

find-file-noselectsahip çok da dahil olmak üzere, yan etkilerin

  • etkileşimli sorular sormak (sadece interaktif olmayan kullanımda bir hareketsizliktir),
  • salt okunur dosyalar için görüntüleme modunu otomatik olarak etkinleştirme,
  • aksi takdirde normal moda girilmesi,
  • ve çalışıyor find-file-hook.

Normal Modun kendisi

  • geçerli arabellek için otomatik olarak uygun bir ana mod seçer,
  • ilgili tüm büyük ve küçük mod kancalarını çalıştırır,
  • ve geçerli arabellek için tüm yerel değişkenleri okur, örneğin dosya değişkenleri ve dizin değişkenleri.

Tüm kancalar çalıştığından, kullanıcının etkinleştirdiği tüm küçük modları ve kanca işlevlerini alırsınız init.el, bu da küçük rahatsızlıklardan (istenmeyen küçük modlar etkinleştirilirse) büyük hasara (kullanıcı beklediği bir kanca işlevi eklediyse) etkileşimli bir bağlamdan çağrılabilir).

Örnek için https://github.com/flycheck/flycheck/issues/366 adresine bakın . find-file-noselectBir veri dosyasının kullanımı Flycheck tarafından sözdizimi ile kontrol edilmesine neden oldu ve Emacs kapatıldığında gerçekleştiği için, geçici bir dosyayı geride bırakarak düzgün bir şekilde temizlenmesi için zaman yoktu.

Temizlemek

İle find-file-noselectekstra dikkatli olmak gerekir tekrar tampon öldürmek için. find-file-noselectbunu sizin için yapmaz.

Bir yerde tamponu hatırlamanız ve unwind-protectyerel olmayan çıkışlarda bile tamponun öldürüldüğünden emin olmak için dikkatli bir şekilde kullanmanız gerekir.

Alternatifler

Dosyaları kullanımını okumak için with-temp-bufferve insert-file-contentssadece örneğin sistem dönüşümünü kodlama en temel şeyi gerçekleştirir, ancak kanca veya kurulum yerel değişkenler etkinleştirmek, soru sormak etmeyen,:

(with-temp-buffer
  (insert-file-contents (locate-user-emacs-file "foo.el"))
  ;; Enter the major mode explicitly
  (emacs-lisp-mode)
  ;; …
  )

with-temp-buffer geçici tamponu vücudunun sonunda uygun şekilde öldürmeye özen gösterir.

Dosyaları yazmak için with-temp-file, geçici bir arabellek oluşturan ve içeriğini gövdesinin sonunda verilen dosya adına yazan:

(with-temp-file  (locate-user-emacs-file "foo.el")
  (prin1 (list 'my 'data) (current-buffer)))

10

Elisp kılavuzundaki bölüm 24.3'ten:

Bir dosyanın içeriğini bir arabelleğe kopyalamak için işlevi kullanın insert-file-contents. (Komutu insert-fileLisp programında kullanmayın, çünkü bu işareti belirler.)

Bunun için Elisp belgelerini aramak, find-file-noselectsadece bir dosyayı tamponda okumaktan çok daha fazlasını yaptığı açıktır. Belki de bu işlevi kullanmanın kötü bir fikir olduğunu düşünen insanlar, muhtemelen istenmeyen yan etkileri düşünüyor? Sanırım neye ulaşmak istediğinize bağlı. Mümkün olduğunca temiz / el değmemiş arabellek içeriğine sahip olmak istiyorsanız, eski ve güvenilir with-temp-buffer+ insert-file-contentskombinasyonunu kullanmak iyi bir fikir olabilir . Eğer tampon içeriği ne yakın olarak olmak istiyorsanız find-fileüretmek, belki de do kullanılmak istiyor find-file-noselect? Ya da belki de find-file;)


3
Etkileşimli olmayan bir şey yapılıyorsa, "arabellek içeriği bul dosyasının ne üreteceğine yakın olmasını istediğiniz " herhangi bir senaryo göremiyorum . find dosyası yavaştır, çünkü her türlü kanca da dahil olmak üzere bir sürü gereksiz şey yapar. İsteyebileceğiniz find dosyasının tek "özelliği" büyük moddur, ancak o zaman sadece kendiniz etkinleştirmelisiniz (find dosyasının zaten istediğiniz modu açacağını garanti edemezsiniz).
Malabarba

Malabarba: Arabelleğin kullanıcı tarafından düzenleme için kullanılabilir kalmasını istiyorsanız, find-fileişlemi taklit etmek isteyebilirsiniz .
phils
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.