Chciałbym sprawdzić, czy jakiś (powiedzmy, bieżący) bufor odwiedza plik, czy nie. Mógłbym powiedzieć:
(if (buffer-file-name) ...)
ale wydaje się, że nie jest zbyt elegancki - interesuje mnie tylko wartość logiczna, a nie faktyczna nazwa bufora. Gdyby buffer-file-name
funkcja została napisana w Elisp, mógłbym zajrzeć do jej źródła, aby dowiedzieć się, z czego korzysta - ale jest napisane w C i chociaż mogę zainstalować źródła Emacsa, obawiam się, że nie znalazłbym nazwy elisp dla funkcji, która i tak sprawdza to, co tam mam.
Potrzebuję do tego, aby utworzyć katalog na podstawie nazwy bieżącego bufora, a obecnie robię mniej więcej to:
(make-directory (if (buffer-file-name) (file-name-base) "default-dir"))
Więc jaki byłby Elisp-idiomatyczny sposób na zrobienie tego?
buffer-file-name
naprawdę sprzeciwisz się używaniu , jest to właściwy sposób (jeśli naprawdę chceszt
, zrób to,(and (buffer-file-name) t)
ale jest to brzydsze IMO). Jego implementacją jest odczytywaniefilename
pola struktury bufora C, która i tak nie jest dostępna bezpośrednio z Elisp. Ostatecznie jest to po prostu wskaźnik zerowy lub nie.(and (buffer-file-name) t)
wygląda to dziwnie.(if (buffer-file-name) ... )
to nie jest eleganckie, to nie pisałeś długo w elisp. Staje się coraz bardziej brzydki.Odpowiedzi:
Argumentowałbym, że twoje użycie jest idiomatyczne, ponieważ nazwa bufora jest sama w sobie całkowicie odpowiednią wartością logiczną. Cytowanie z instrukcji :
Aby przejść dalej, sprawdź kod dla
clone-buffer
. Oczekuję, że zobaczysz:Zauważ, że jest to testowanie wiązania zmiennej
buffer-file-name
zamiast wywoływania funkcji bez argumentu(buffer-file-name)
, ale oba powinny zawsze zachowywać się tak samo.źródło
Możesz użyć
(buffer-file-name)
(z opcjonalnym argumentem bufora) lubbuffer-file-name
zmiennej lokalnej bufora . Oba obliczają tę samą wartość dla danego bufora.Jest to jednak idiomatyczny sposób na wykonanie tego w Elisp, więc twój kod jest w porządku. Jeśli desperacko tego chciałeś, zawsze możesz wykonać funkcję
buffer-has-file-p
otoki.źródło
(buffer-file-name BUFFER)
to z pewnością jest on ładniejszy niż(with-current-buffer BUFFER buffer-file-name)
, ale poza tym nie sądzę, że ma to znaczenie, którego używasz (a ponieważ funkcja jest napisana w C, wątpię, żeby była nawet duża różnica w wydajności).Po prostu użyj
buffer-file-name
. W Lisp często używamy nie-nil
wartości, aby oznaczać „ prawda” .Jedynym czasem, kiedy możesz tego uniknąć, jest to, że funkcja jest kosztowna lub ma niepożądane skutki uboczne.
źródło
nil
jest prawdą, pomyślałem o tym, kiedy chcę tylko wiedzieć, czy jakieś imię istnieje, jest „kosztowne” - ale najwyraźniej tak nie jest.Z rozdziału „Lista buforów” dokumentacji:
Musisz więc znaleźć sposób wyszukiwania na liście buforów na żywo. Tutaj jest jeden:
źródło