2013-01-03 63 views
4

我想添加一個before-save-hook,我可以爲自上次保存後更改過的行執行一些操作。例如,刪除尾隨空白,檢查縮進等。我不想爲整個文件做這件事,我知道每個這些都有單獨的選項(只是爲所有更改的行刪除尾隨空白,等等),但我想要一些通用的東西,以便我可以添加更多的東西。我想有些東西可以讓我更改行號列表,或者獲取第一個更改行(),get-next-changed-line()類型的函數。如何在保存之前對Emacs中更改的行執行操作?

+0

也許你可以以某種方式使用'ediff-mode'。 – PascalVKooten

+2

你指的是哪個操作特定的軟件包?你也許可以重新使用部分實現。例如'ws-trim.el'依靠一個後命令鉤子去除已更改行上的空白。在任何情況下,如果您的操作不是計算量大並且可以逐行應用,我認爲在每行修改後運行它比在保存前鉤子的整個緩衝區更容易。 – Francesco

回答

3

使用高亮的變化模式機械

你可以使用highlight-changes-mode,然後遍歷通過它使用next-single-property-change設置text屬性hilit-chg

例如,

(with-current-buffer "my-buffer-name" 
    (let ((beg (point-min)) end) 
    (while (setq end (next-single-property-change beg 'hilit-chg)) 
     (setq beg (next-single-property-change end 'hilit-chg)) 
     (message "[[%s]]" (buffer-substring-no-properties end beg))))) 

將產生以下:

[[ 
these are my changes 

]] 
[[ and here]] 
[[ 
here are more changes 
]] 

*Messages*緩衝液(和在回聲區域)。

全面推行例如

ws-butler使用這個機制在EOL上保存修改 線修剪空間。

+0

我正在玩高亮度變化模式,但無法弄清楚如何迭代文本屬性。你能再解釋一下嗎? (對不起,這真的是我第一次嘗試elisp :) –

+1

@VijayKotari:使用屬性爲'hilit-chg'的函數'next-single-property-change'。 – sds

+0

巧合的是,這是我實施更好的(IMO)ws-trim模式 - ws-butler的方式。 –

相關問題