2008-11-25 11 views
11

Ich habe folgendes in meiner .emacs-Datei:Erste Emacs untabify sehr, wenn bestimmte Dateitypen speichern (und nur die Dateitypen)

(defun c++-mode-untabify() 
    (save-excursion 
    (goto-char (point-min)) 
    (while (re-search-forward "[ \t]+$" nil t) 
     (delete-region (match-beginning 0) (match-end 0))) 
    (goto-char (point-min)) 
    (if (search-forward "\t" nil t) 
     (untabify (1- (point)) (point-max)))) 
    nil) 

(add-hook 'c++-mode-hook 
      '(lambda() 
       (make-local-hook 'write-contents-hooks) 
       (add-hook 'write-contents-hooks 'c++-mode-untabify))) 

Vorwiegend aus http://www.jwz.org/doc/tabs-vs-spaces.html abgezockt. Das führt dazu, dass Emacs untabify auf dem Puffer ausführen, bevor eine C++ - Datei gespeichert wird.

Das Problem ist, dass, nachdem ich eine C++ Datei geladen haben, die untabify Haken angelegt wird an alle nachfolgenden Datei, auch für die Puffer der anderen Dateitypen schreibt. Das heißt, wenn ich eine C++ - Datei öffne und dann zB eine tabulatorgetrennte Textdatei bearbeite, werden die Tabs beim Speichern der Datei durcheinander gebracht.

Ich bin kein elisp Guru, aber ich denke, die (make-local-hook 'write-contents-hooks) Zeile versucht, die Ergänzung zu write-contents-hooks gelten nur für den lokalen Puffer. Es funktioniert jedoch nicht und c++-mode-untabify ist in write-contents-hooks für alle Puffer.

Ich verwende EmacsW32 22.0 auf einer Windows XP-Box. Hat jemand eine Idee, wie man die write-contents-hooks Änderung lokal zu einem bestimmten Puffer oder wie man es auf nil beim Umschalten auf andere, nicht-C++ - Puffer zurücksetzen?

Antwort

5

Die Dokumentation in meinem Emacs sagt, dass make-local-hook jetzt ab 21.1 veraltet ist, da add-hook jetzt ein optionales Argument für die Erstellung eines hook buffer-local verwendet. So können Sie es versuchen:

Eine andere Option ist, dass die C++ - Modus-Unababify-Funktion den aktuellen Modus überprüft. Ich würde wahrscheinlich nur schreiben, dass so etwas wie:

(defun c++-mode-untabify() 
    (if (string= (substring mode-name 0 3) "C++") 
     (save-excursion 
     (delete-trailing-whitespace) 
     (untabify (point-min) (point-max))))) 
2

Versuchen Sie, Ihre Haken wie folgt ergänzt:

(add-hook 'c++-mode-hook 
      '(lambda() 
       (add-hook 'write-contents-hooks 'c++-mode-untabify nil t))) 

Beachten Sie die beiden zusätzlichen aguments hinzufügen Haken. Wenn ich es richtig lese, laut der Dokumentation, dass Trailing t tun sollte, was Make-Local-Hook tut (oder umgekehrt), aber ich habe auch Referenzen zu make-local-hook gesehen, die veraltet sind. Zumindest auf meiner Box (Linux, Gnu Emacs 21.3.1) sehe ich den gewünschten Effekt - der Hook ist nur an C++ - Puffer und nicht an alle anderen angehängt.

Als letzten Ausweg können Sie Ihre C++ - Mode-Unababify-Funktion immer einchecken, damit es nur magisch ist, wenn der aktuelle Hauptmodus der C++ - Modus ist.

Dies ist jedoch eine merkwürdige Lösung. Wenn Sie alle Registerkarten entfernen, was tun Sie, um die Registerkarten wieder einzufügen? Wenn du aufhörst, was auch immer das ist, wirst du diesen Hack nicht brauchen.

+0

Dank! Ich setze das ein, um automatisch Tabs von älterem Code zu entfernen, den ich nicht geschrieben habe, aber gelegentlich pflegen muss. – DanielMcP

19

write-contents-hooks ist ebenfalls veraltet. Dies ist, was Sie nach:

(add-hook 'c++-mode-hook 
     '(lambda() 
     (add-hook 'before-save-hook 
        (lambda() 
        (untabify (point-min) (point-max)))))) 

Das von destilliert, was ich, was tut ein paar andere Dinge, und abstrahiert aus mit der Programmierung spezifischen Modi zu arbeiten:

(defun untabify-buffer() 
    "Untabify current buffer" 
    (interactive) 
    (untabify (point-min) (point-max))) 

(defun progmodes-hooks() 
    "Hooks for programming modes" 
    (yas/minor-mode-on) 
    (add-hook 'before-save-hook 'progmodes-write-hooks)) 

(defun progmodes-write-hooks() 
    "Hooks which run on file write for programming modes" 
    (prog1 nil 
    (set-buffer-file-coding-system 'utf-8-unix) 
    (untabify-buffer) 
    (copyright-update) 
    (maybe-delete-trailing-whitespace))) 

(defun delete-trailing-whitespacep() 
    "Should we delete trailing whitespace when saving this file?" 
    (save-excursion 
    (goto-char (point-min)) 
    (ignore-errors (next-line 25)) 
    (let ((pos (point))) 
     (goto-char (point-min)) 
     (and (re-search-forward (concat "@author +" user-full-name) pos t) t)))) 

(defun maybe-delete-trailing-whitespace() 
    "Delete trailing whitespace if I am the author of this file." 
    (interactive) 
    (and (delete-trailing-whitespacep) (delete-trailing-whitespace))) 

(add-hook 'php-mode-hook 'progmodes-hooks) 
(add-hook 'python-mode-hook 'progmodes-hooks) 
(add-hook 'js2-mode-hook 'progmodes-hooks)