W niedawnym odpowiedzi przez lunaryorn , stwierdził on:
Odradzałbym jednak większość innych części Organizacji, z powodów już podanych w komentarzach: Jest stary, pełen spuścizny i szkodliwych praktyk (np. Wybierz plik-wybór-nos, aby czytać pliki w sposób nieinteraktywny).
Czy ktoś może wyjaśnić, dlaczego find-file-noselect
złym pomysłem jest odczytywanie plików w programach Elisp? Czy jest lepszy sposób? Pytam, bo myślałem o użyciu go w jednym z moich projektów.
good-practices
tagu; czy warto go używać?good-practices
należałoby to do kategorii „metatagów”, co jest odrzucone przez SE.Odpowiedzi:
TL; DR : Gdy
find-file-noselect
nie masz kontroli nad tym, co się faktycznie dzieje, możesz skończyć z dowolnymi mniejszymi trybami włączającymi się w buforze, w zależności od tego, co użytkownik w nich włączyłinit.el
. Również czyszczenie jest trudne.Użyj
with-temp-buffer
iinsert-file-contents
zamiast. Jeśli potrzebujesz określonych głównych lub mniejszych trybów w buforze, włącz je jawnie . Aby pisać pliki, użyjwith-temp-file
zamiast tego, który - pomimo nazwy - pozwala pisać do dowolnych plików.Skutki uboczne
find-file-noselect
ma wiele skutków ubocznych, w tymfind-file-hook
.Sam tryb normalny
Ponieważ wszystkie przechwytywania są uruchomione, otrzymujesz wszystkie pomniejsze tryby i funkcje przechwytujące, które użytkownik w nich uruchomił
init.el
, co może powodować wszystko, od drobnych niedogodności (jeśli włączone są niepożądane tryby pomniejsze) do poważnego spustoszenia (jeśli użytkownik dodał funkcję przechwytującą, która spodziewa się być wywoływanym z kontekstu interaktywnego).Zobacz https://github.com/flycheck/flycheck/issues/366 dla przykładu. Użycie
find-file-noselect
pliku Flycheck sprawiło, że plik danych został sprawdzony pod kątem składni, a ponieważ działo się to podczas zamykania Emacsa, nie było czasu na poprawne wyczyszczenie, pozostawiając plik tymczasowy.Sprzątać
Ze
find-file-noselect
trzeba być bardzo ostrożnym, aby ponownie zabić bufor.find-file-noselect
nie robi tego dla ciebie.Musisz pamiętać bufor w pewnym miejscu i ostrożnie go używać,
unwind-protect
aby upewnić się, że bufor zostanie zabity nawet w przypadku nielokalnych wyjść.Alternatywy
Aby odczytać pliki, użyj
with-temp-buffer
iinsert-file-contents
, który robi tylko najbardziej podstawowe rzeczy, np. Konwersję systemu kodowania, ale nie zadaje pytań, nie włącza haków ani nie konfiguruje zmiennych lokalnych:with-temp-buffer
dba o prawidłowe zabicie tymczasowego bufora na końcu jego ciała.Aby pisać pliki, użyj
with-temp-file
, który tworzy tymczasowy bufor i zapisuje zawartość pod podaną nazwą pliku na końcu jego treści:źródło
Z sekcji 24.3 instrukcji Elisp:
Przeszukując dokumentację Elisp
find-file-noselect
, jest oczywiste, że robi ona znacznie więcej niż tylko odczyt pliku do bufora. Być może ludzie, którzy myślą, że korzystanie z tej funkcji jest złym pomysłem, myślą o potencjalnie niepożądanych skutkach ubocznych? Myślę, że to zależy od tego, co chcesz osiągnąć. Jeśli chcesz mieć możliwie czystą / nietkniętą zawartość bufora, dobrym pomysłem może być użycie starej i sprawdzonej kombinacjiwith-temp-buffer
+insert-file-contents
. Jeśli chcesz, aby zawartość bufora być tak blisko tego, cofind-file
produkują, być może nie chcesz używaćfind-file-noselect
? A może myślałfind-file
;)źródło
find-file
proces.