设置Ediff
设置Ediff
一旦你改善了Ediff的使用体验,它就可以算是一个神器了。至少我的经历就是这样。在我看来这是一个非常好的工具,但是有些默认设置非常糟糕。
自定义
首先,我会展示出一个宏,我用设它来设置自定义变量:
(defmacro csetq (variable value) `(funcall (or (get ',variable 'custom-set) 'set-default) ',variable ,value))
这个宏是我自定义的,因为在Emacs的代码库中搜索后不到类似的东西; custom-set-variables
和 custom-initialize-changed
跟我想要的很接近。
基本上,我想要的是一个理解变量 custom-set
属性的 setq
. 如果你知道这样的宏,请告诉我。
更改某些Ediff选项
现在,我已经解释了自定义的setter(顺便说一下,使用 custom-set-variables
完全等同于 csetq
),下面是我的更改内容:
不要在单独的框架中使用控制面板,这个设置很奇怪。在Emacs中管理窗口,比在桌面(Unity或Gnome Shell)管理Emacs frame要好得多。
(csetq ediff-window-setup-function 'ediff-setup-windows-plain)
将窗户水平分开,而不是垂直分开。这样,更容易跟踪变更。
(csetq ediff-split-window-function 'split-window-horizontally)
忽略空格。我不怎么写Python,所以我不关心不同之处的空格。此外我根据喜好重新格式化编辑过的所有LISP代码,且只希望看到diff中的重要更改,而不希望看到毫无意义的空白。
(csetq ediff-diff-options "-w")
更改Ediff快捷键
我对每个不需要输入的每个mode就做的设置:设置j为下移,设置k为上移
(defun ora-ediff-hook () (ediff-setup-keymap) (define-key ediff-mode-map "j" 'ediff-next-difference) (define-key ediff-mode-map "k" 'ediff-previous-difference)) (add-hook 'ediff-mode-hook 'ora-ediff-hook)
Ediff退出后恢复窗户设置
当使用q退出一个Ediff会话时,它只会留下两个diff窗口,而不是恢复Ediff启动前的窗口配置。下面是恢复旧窗口配置的代码:
(winner-mode) (add-hook 'ediff-after-quit-hook-internal 'winner-undo)
调用Ediff的各种方法
从 magit
中调用
在80%的情况下,我使用快捷键e (magit-ediff
)从 magit-status-mode
调用Ediff。
这使我对更改有了更好的了解,特别是当我希望使用a (ediff-copy-A-to-B
)或b (ediff-copy-B-to-A
)来还原内容时。
使用a的情况比较多,因为magit似乎总是将 @{index}
文件放在 A
窗口,而将当前文件放入 B
窗口。
因此,当我我查看一个不同之处(我用j/k导航到它)时,我可以用a来进行还原。此时,当前文件中的diff区域将等于索引文件中的diff区域。
但这是还原的内容还未被保存。如果想保存 B
窗口的文件,可以使用wb (ediff-save-buffer
)。
在还原之后,还可以调用!(ediff-update-diffs
)来删除零长度的diff并更新模式行的diffcount。
其他方法
ediff-buffers
会对比两个(不同的)buffer。如果你碰巧只打开了两个窗口,并且刚好打开的是要对比的缓冲区,Ediff会使用它们作为默认值,并可以一路按下回车快速地选择这两个buffer。ediff-files
也类似,但对比对象为文件。我喜欢在dired
中使用m标记要对比的文件,然后它们也会被ediff-files
自动选中。ediff-current-file
用于查看对当前文件未保存之处的变更。我很少用它,因为我有一种冲动,一有机会就把每个文件都存起来。除非有人实现了一个类似的guru-mode的模式,它会在你保存文件时打扰你,否则很难从这种上瘾中恢复过来。实际上,经常执行C-x C-s
不是一个坏主意
哦,你前一小时已经保存该文件40次;上一次保存是在
0分34秒
;从那时算起你更改了27个字节.你 确定 要保存吗[y/N]
?