2009-09-12 13 views
8

Zadzwoń do mnie lame, ale jestem zmęczony podświadomości C-x C-s nerwowy drganie. Często przełączam bufory i myślę, że chciałbym zapisać pewien bufor, gdy tylko przejdę na inny. Nie miałem jeszcze czasu, aby nauczyć się podstaw Emacs-Lisp.Emacs automatycznie zapisać na buforze przełącznika

Jakieś wskazówki, jak to zrobić, lub lepsze rozwiązania?

(Na powiązana uwaga znalazłem autosave workaround który może zapisać bieżący bufor, jak tylko są bezczynne przez określoną ilość czasu.)

Odpowiedz

16

Aby rozwinąć na Seth „s answer, chciałbym to zrobić:

(defadvice switch-to-buffer (before save-buffer-now activate) 
    (when buffer-file-name (save-buffer))) 
(defadvice other-window (before other-window-now activate) 
    (when buffer-file-name (save-buffer))) 
(defadvice other-frame (before other-frame-now activate) 
    (when buffer-file-name (save-buffer))) 

Czek dla buffer-file-name unika zapisywanie buforów plików w/out. Musisz wymyślić wszystkie punkty wejścia, których używasz do zmiany buforów, które Cię interesują (chciałbym też doradzić other-window).

+0

+1 ode mnie ... zapomniałem o pliku bufora -name – seth

+1

Idealny! Dzięki :) 6 lat później i wciąż świetna odpowiedź –

6

Jestem rodzaj nowe do Emacs Lisp siebie, ale to działa w moich testów:

(defadvice switch-to-buffer (before save-buffer-now) 
    (save-buffer)) 

(ad-activate 'switch-to-buffer) 

to trochę irytujące, choć bo to się nazywa po każdym buforze (jak zarysować). Rozważ tę odpowiedź jako wskazówkę.

Gdy chcesz go wyłączyć, trzeba zadzwonić:

(ad-disable-advice 'switch-to-buffer 'before 'save-buffer-now) 
(ad-activate 'switch-to-buffer) 
2

Kilka pomysłów.

Po pierwsze, jeśli wywołujesz polecenie takie jak zapis o wystarczająco wysokiej częstotliwości, możesz rozważyć krótsze powiązanie klucza dla polecenia. Na przykład również znalazłem się w posiadaniu tego samego "drgania", więc teraz używam f2 zamiast C-x C-s do zapisywania zmian.

Funkcja, którą łączę z f2, bezwarunkowo zapisuje każdy niezapisany bufor. Może się to okazać przydatne:

(defun force-save-all() 
    "Unconditionally saves all unsaved buffers." 
    (interactive) 
    (save-some-buffers t)) 

(global-set-key [f2] 'force-save-all) 

Teraz do głównego numeru. Można spróbować coś takiego (zauważ, że force-save-all nazywa):

(defun my-switch-to-buffer (buffer) 
    (interactive (list (read-buffer "Switch to buffer: " (cadr buffer-name-history) nil))) 
    (force-save-all) 
    (switch-to-buffer buffer)) 

(global-set-key "\C-xb" 'my-switch-to-buffer) 

Oczywiście, można również powiązać funkcje bufora przełącznik do innego klucza, jak klawisza funkcyjnego, tak, że jest to operacja jedno naciśnięcie.

Pomyślałem, że @seth miał świetny pomysł na skorzystanie z porady, ale zauważyłem, że podręcznik ELisp sugeruje, że advice not be used for key bindings. Nie jestem do końca pewien, dlaczego tak się dzieje, ale tak właśnie sugeruje podręcznik dla FYI.

+0

Interesujące. Nie widziałem tej części o skrótach, kiedy czytałem podręcznik. Dzięki. – seth

+0

Jedynym problemem z tym rozwiązaniem jest sytuacja, gdy np. zacznij używać 'ido-switch-buffer', musisz także śledzić zmiany w swojej funkcji. –

+0

To prawda, przypuszczam, że można ponownie powiązać symbol przełączania bufora z tą nową funkcją (zapisanie oryginału w innym symbolu, np. Zapisywanie oryginału w buforze) –

Powiązane problemy