2008-11-25 79 views
11

我在.emacs文件以下時untabify。這會導致emacs在保存C++文件之前在緩衝區上運行untabify獲取Emacs的節約某些文件類型(只有那些文件類型)

的問題是,我已加載一個C++文件之後,被施加了untabify所有後續文件寫入,即使對於其他類型的文件的緩衝區。這意味着如果我打開一個C++文件然後編輯一個製表符分隔的文本文件,那麼在保存文件時這些製表符會被破壞。

我不是elisp大師,但我認爲(make-local-hook 'write-contents-hooks)行試圖使除write-contents-hooks只適用於本地緩衝區。但是,它不起作用,並且c++-mode-untabify對於所有緩衝區都在write-contents-hooks

我在Windows XP盒子上使用EmacsW32 22.0。有沒有人有任何想法如何使write-contents-hooks本地更改爲特定緩衝區或如何在切換到其他非C++緩衝區時將其重置爲nil

回答

5

我的Emacs中的文檔說現在make-local-hook從21.1開始已經過時了,因爲add-hook現在需要一個可選參數來創建一個鉤子本地緩衝區。所以,你可以嘗試:

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

另一種選擇是讓C++ - 模式untabify功能檢查當前模式。我可能只寫,就像這樣:

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

嘗試增加你的鉤子是這樣的:

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

注意兩個額外aguments增加掛機。如果我正確地閱讀它,根據文檔說明,尾隨t應該做什麼make-local-hook(或反之亦然),但我也看到引用make-local-hook被棄用。至少在我的機器上(linux,gnu emacs 21.3.1)我看到了你想要的效果 - 鉤子只附加到C++緩衝區,而不是所有其他的。

作爲最後的手段,你總是可以在你的C++ - mode-untabify函數中檢查一下,如果當前的主模式是C++模式,那麼只能做它的魔術。

然而,這是一個好奇的解決方案。如果您刪除了所有標籤,那麼您將標籤放回原位?如果你停止任何你不需要的破解。

+0

感謝:

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

這是從我用的,這確實其他一些東西,是抽象出來的具有特定的編程-模式工作蒸餾水!我把它放在自動刪除舊代碼中的標籤,我沒有寫但偶爾需要維護, – DanielMcP 2008-11-25 21:53:32

19

write-contents-hooks也過時了。這就是你追求的:

(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) 
相關問題