我现在在尝试从evil切换到emacs键位,给evil里的功能一个一个找替代品。
一般需要替换重复字符的时候,我会用evil的cgn,emacs键位下用query-replace
代替。但是手动输入from-string
和to-string
有点麻烦,我就写了一个小包裹函数。使用方法:
(我绑定到C-x C-q)
- 选中要替换的地方
- C-x C-q
- 修改选区(选区会高亮)
- 完成后C-x C-q
- 进入query replace模式,
from-string
是原来的字符,to-string
是修改后的选区
一开始写的时候比较紧凑,后来不需要了,但是我也懒得改了,反正不复杂,可读性还可以
(defvar smart-query-edit-mode-overlay nil
"Overlay of region to be replaced.")
(define-minor-mode smart-query-edit-mode
"Edit region and query replace."
:lighter "QUERY"
(if smart-query-edit-mode
(if (not mark-active)
(setq smart-query-edit-mode nil)
(overlay-put
(setq smart-query-edit-mode-from-string
(buffer-substring
(region-beginning)
(region-end))
smart-query-edit-mode-overlay
(make-overlay (region-beginning)
(region-end)
nil
nil
t))
'face '(:inherit highlight)))
(overlay-put smart-query-edit-mode-overlay
'face '(:inherit default))
(goto-char (overlay-end
smart-query-edit-mode-overlay))
(query-replace smart-query-edit-mode-from-string
(buffer-substring-no-properties
(overlay-start
smart-query-edit-mode-overlay)
(overlay-end
smart-query-edit-mode-overlay)))
(delete-overlay
smart-query-edit-mode-overlay)))