2011-01-15 11 views
6

Chcę ustawić klucz w emacs, aby wykonać polecenie powłoki na pliku w buforze i przywrócić bufor bez pytania. Polecenie powłoki to: p4 edit 'currentfilename.ext'elisp: polecenie wywołania w bieżącym pliku

(global-set-key [\C-E] (funcall 'revert-buffer 1 1 1)) 
;; my attempt above to call revert-buffer with a non-nil 
;; argument (ignoring the shell command for now) -- get an init error: 
;; Error in init file: error: "Buffer does not seem to be associated with any file" 

Całkowicie nowy elisp. Z emacs manual, tutaj jest definicja revert buforu:

Command: revert-buffer &optional ignore-auto noconfirm preserve-modes 

Dzięki!

+0

Czy chcesz przywrócić bufor, ponieważ został już edytowany, lub ponieważ polecenie powłoki powoduje przepełnienie zawartości bufora? – zwol

+0

Ponieważ zmienia bufor do zapisu zamiast tylko do odczytu i dodaje go do kontroli wersji. – ash

Odpowiedz

5

Rzeczywisty błąd, który widzisz, polega na tym, że nieprawidłowo ustawiłeś klucz globalny, a mianowicie wywołanie funkcji. Co chcesz to:

(global-set-key (kbd "C-S-e") '(lambda() (revert-buffer t t t))) 

Miałeś funcall faktycznie oceniając kiedy .emacs ładował, co jest, co było przyczyną błędu.

Następnie, aby uzyskać całość, można stworzyć poleceniem:

(defun call-something-on-current-buffers-file() 
    "run a command on the current file and revert the buffer" 
    (interactive) 
    (shell-command 
    (format "/home/tjackson/bin/dummy.sh %s" 
     (shell-quote-argument (buffer-file-name)))) 
    (revert-buffer t t t)) 
(global-set-key (kbd "C-S-e") 'call-something-on-current-buffers-file) 

Oczywiście dostosować komendy i dodać sprawdzanie błędów, jeśli chcesz.

+1

Musisz podać nazwę pliku dla powłoki w jakiś sposób ... 'comint-quote-filename' * wygląda * tak, jak robi to zadanie, ale niestety robi to tylko wtedy, gdy jesteś już w buforze powłoki. To tyle, ile mam. – zwol

+0

Dodano @Zack 'comint-quote-filename' call. –

+0

Dzięki za odpowiedź. Otrzymuję: 'Definicja funkcji symbolu jest nieważna: comint-quote-filename'. Zamieniłem go na 'shell-quote-argument' i działało świetnie. Uwaga boczna: podręcznik emacsa stwierdził: "Klucze, których należy unikać: [Ctrl] + [Shift] + [litera] W terminalach tekstowych nie można odróżnić wersji przesuniętych i nie przeniesionych takiej kombinacji. Działa dobrze, jeśli zawsze używasz emacs w GUI środowisko." Zmieniłem go na i rozpoznałem klucz. – ash

0

Być może przy użyciu trybu podrzędnego "automatyczny-rewers" jest opcją. Wystarczy ją włączyć na bieżącym buforze:

M-x "auto-revert-mode" 

i zawsze upewnić się, że bufor jest zapisany przed wykonaniem polecenia zewnętrznego.

+0

To jest przyjemne, ale domyślny czas automatycznego cofania wynosi 5 sekund (zbyt wolno). Następnie, jeśli zmienię go na 1 sekundę, sprawdzałby każdy bufor co sekundę, co jest niepotrzebne. – ash