Czy mogę ustawić określony plik tak, aby automatycznie i cicho akceptował zmiany?

9

Czy mogę określić dla konkretnego pliku, że nie chcę, aby Emacs powiadamiał mnie o zmianie pliku na dysku i pytał, czy chcę zaakceptować zmiany, czy nie? Nie chcę tego robić globalnie, tylko dla plików, o których wiem, że często będą zmieniane poza Emacsem (w szczególności pliki Org związane z kalendarzem).

emacsomancer
źródło

Odpowiedzi:

8

Możesz to zrobić dla określonego bufora za pomocą M-x auto-revert-mode( manual ). W przypadku buforów plików będzie sprawdzał zmiany co auto-revert-intervalsekundę (domyślnie 5) i automatycznie aktualizuje bufor z dysku.

W tytule znajduje się „konkretny plik”, a treść pytania wspomina o typie pliku (pliki organizacji). W zależności od okoliczności, oto kilka sposobów na ustawienie tego trybu w celu uzyskania pożądanego efektu w trwały sposób. Wcześniejsze metody są prawdopodobnie czystsze i wydajniejsze, jeśli dotyczą konkretnego przypadku użycia.

Jeśli wiesz, że chcesz tego dla każdego pliku określonego typu, rozważ dodanie haka trybu do konfiguracji init.

(add-hook 'org-mode-hook (lambda () (auto-revert-mode 1)))

Jeśli wiesz, że chcesz tego do wszystkiego w określonym katalogu, rozważ ustawienie go w pliku .dir-locals.el w odpowiedniej lokalizacji, upewnij się, że VCS zignoruje plik ustawień lokalnych, jeśli to konieczne. Ten przykład dotyczy wszystkich buforów trybu org dla plików w tym samym katalogu (i podkatalogach). Możesz także uruchomić, M-x add-dir-local-variableaby Emacs wygenerował i zapisał to dla ciebie automatycznie.

(
  (org-mode . ((auto-revert-mode . 1)))
 )

Jeśli żadne z dwóch powyższych podejść nie działa dobrze, rozważ zmienną lokalną pliku w każdym pliku. Najkrótszym, najogólniejszym sposobem ustawienia jednego z nich jest umieszczenie w pierwszym wierszu pliku docelowego:

-*- eval: (auto-revert-mode 1); -*-

W plikach źródłowych tekst może występować po ograniczniku komentarza (//, # itp.). Możesz uruchomić, M-x add-file-local-variable-proplineaby Emacs wygenerował to dla ciebie automatycznie lub M-x add-file-local-variabledla formatu, który używa dolnej części pliku zamiast górnej.

Użyj tej metody tylko wtedy, gdy nie udostępniasz pliku nikomu innemu. Z podręcznika GNU :

Często błędem jest określenie w ten sposób pomniejszych trybów. Niewielkie tryby reprezentują indywidualne preferencje użytkownika i może być niewłaściwe narzucanie preferencji innym użytkownikom, którzy mogą edytować plik. Jeśli chcesz automatycznie włączyć lub wyłączyć tryb podrzędny w sposób zależny od sytuacji, często lepiej jest to zrobić w trybie głównym.

Mian
źródło
2
Czy nie (auto-revert-mode 1)jest kanonicznym sposobem włączenia trybu podrzędnego zamiast setq?
mbork,
1
Tak, masz rację. Czyszczenie tego przykładu w ciągu jednej sekundy. Dzięki.
Mian
1
Nie ma za co. (To powiedziawszy, AFAIU, zmienne lokalne pliku najlepiej nadają się do przypadku użycia OP).
mbork
1
Możesz mieć rację. IMO zależy od szczegółów organizacji plików. Jeśli znane im pliki będą często zmieniane poza emacsem, to wszystkie pliki org lub wszystkie znajdują się w tym samym miejscu (np. Katalog Dropbox), podejście oparte na trybie lub katalogu może być czystsze i łatwiejsze i pozwoli uniknąć zaśmiecanie ich plików jako bonus.
Mian
2
Aby połączyć się z obiema tymi metodami, istnieją add-file-local-variablei add-dir-local-variable.
Sean Allred,
3

Tak. Umieść to na końcu pliku.

* COMMENT Config
Local Variables:
eval: (auto-revert-mode 1)
End:

Zakłada to tryb Org, w przypadku innych trybów użyj komentarzy w używanym języku, jak wyjaśniono w linku podanym poniżej.

Uwaga: zobacz Lokalne zmienne w plikach w podręczniku, aby uzyskać informacje na temat tła, informacje dotyczące bezpieczeństwa i zastrzeżenie, że nie zawsze może to być dobry pomysł. Ponadto sekcja dotycząca cofania mówi np. Jak zmienić domyślny 5-sekundowy interwał automatycznego cofania.

Mbork
źródło
Czy to absolutnie musi być na końcu? Mam skrypt, który generuje pliki .org i
kazałem
1
Tak, patrz link. I zobacz inne odpowiedzi na rozwiązanie pierwszej linii.
mbork,