Bir ara belleğin bir dosyayı ziyaret edip etmediğini nasıl kontrol edebilirim?


9

Bazı (örneğin, geçerli) arabellek bir dosyayı ziyaret edip etmediğini kontrol etmek istiyorum. Söyleyebilirdim:

(if (buffer-file-name) ...)

ama çok zarif görünmüyor - ilgilendiğim sadece boole değeri, söz konusu tamponun gerçek adı değil . Eğer buffer-file-namefonksiyon Elisp'de yazılmış olsaydı, ne kullandığını bulmak için kaynağına bakabilirdim - ama C ile yazılmış ve Emacs kaynaklarını kurarken, bir elisp adı bulamayacağımdan korkuyorum zaten orada olduğumu kontrol eden fonksiyon için.

Ne için ihtiyacım var Geçerli arabellek dosyasının adına dayalı bir dizin oluşturmak istiyorum ve şu anda az ya da çok bunu yapıyorum:

(make-directory (if (buffer-file-name) (file-name-base) "default-dir"))

Peki, bunu yapmanın Elisp-deyimsel yolu ne olurdu?


2
Neden buffer-file-namegerçekten kullanmaya itiraz ettiğinden emin değilim , bunu yapmanın doğru yolu (gerçekten istiyorsan yap t, (and (buffer-file-name) t)ama bu daha çirkin IMO). Uygulanması, filenamedoğrudan Elisp'ten erişilemeyen tampon C yapısının alanını okuyor. Sonunda, sadece boş olan bir işaretçi.
Sigma

Eđer bu dođru yolsa, benim için sorun deđil. Dediğim gibi - C uygulamasını bilmiyordum ve sağduyu, sadece herhangi bir şey olup olmadığını bilmek istediğimde dosya adını sormanın gereksiz olduğunu söylüyor.
mbork

Ve bunun (and (buffer-file-name) t)garip göründüğüne katılıyorum .
mbork

Bunun (if (buffer-file-name) ... )zarif olduğunu düşünmüyorsanız, uzun zamandır elisp'te kodlama yapmıyorsunuz. Buradan sadece çirkinleşiyor.
nispio

Yanıtlar:


12

Ben senin kullanım iddia ediyorum olduğu tamponunun adı kendi başına bir derece uygun mantıksal değerdir çünkü deyimsel elisp. Kılavuzdan alıntı :

Bir if ifadesinde doğruluk testinin önemli bir yönü vardır. Şimdiye kadar, yeni tür Emacs Lisp nesneleriymiş gibi tahminlerin değerleri olarak `` doğru '' ve `` yanlış '' dan bahsettik. Aslında, 'yanlış' sadece eski dostumuzdur nil. Başka her şey - hiç bir şey - `` doğrudur ''.

Daha ileriye gitmek için kodunu kontrol edin clone-buffer. Aşağıdakileri görmenizi bekliyorum:

(interactive
 (progn
   (if buffer-file-name
       (error "Cannot clone a file-visiting buffer"))
...

buffer-file-nameBunun, işlevi bağımsız değişken olmadan çağırmak yerine değişken bağlamasını test ettiğini unutmayın (buffer-file-name), ancak ikisi her zaman aynı şekilde davranmalıdır.


8

Ya kullanabilir (buffer-file-name)veya tampon yerel (isteğe bağlı tampon bağımsız değişken ile) buffer-file-namedeğişken. Her ikisi de belirli bir tampon için aynı değeri değerlendirir.

Yine de Elisp'te bunu yapmanın deyimsel yolu bu yüzden kodunuz iyi. Eğer umutsuzca istediyseniz, her zaman bir buffer-has-file-psarıcı işlevi yapabilirsiniz.


Teşekkürler. İşlevi veya değişkeni seçmek için önemli bir fark var mı?
mbork

1
Ben öyle düşünmüyorum. Tampon argümanını belirtmeniz gerekiyorsa (buffer-file-name BUFFER)kesinlikle daha güzel (with-current-buffer BUFFER buffer-file-name), ama aksi takdirde hangisini kullandığınızın önemli olduğunu düşünmüyorum (ve fonksiyon C'de yazıldığı için performansta çok fazla fark olduğundan şüpheliyim).
phils

3

Sadece kullan buffer-file-name. Lisp'de çoğu zaman doğrunil demek için değersiz bir değer kullanırız .

Bundan kaçınmak isteyebileceğiniz tek zaman, işlevin pahalı olması veya istenmeyen yan etkilere sahip olmasıdır.


Anlıyorum. nilDoğru olmayan bir şey olduğunu biliyorum, sadece herhangi bir adın var olup olmadığını bilmek istediğimde adı almayı düşündüm "pahalı" - ama görünüşe göre değil.
mbork

1

Gönderen "Tampon Listesi" bölümünde belgelerin:

Buffer-list tarafından döndürülen liste özel olarak oluşturulur; dahili bir Emacs veri yapısı değildir ve değiştirilmesinin arabelleklerin sırası üzerinde bir etkisi yoktur.

Bu yüzden canlı tamponlar listesinde arama yapmanın bir yolunu bulmalısınız. Işte bir tane:

  (if (string-match-p (regexp-quote "My buffer name") (format "%s" (buffer-list)))
      (message "Open")
    (message "Not open"))
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.