我是elisp的新手,我试图在搜索时定义一个设置突出显示行为的函数。目标是:在i-search
之后,我希望能够使用C-g
清除突出显示,但如果按Enter键,我希望保留突出显示。
所以我在init.el
中定义了一个函数:
(defun keyboard-quit-cleanup ()
"clean up highligh after keyboard quit"
(keyboard-quit)
(lazy-highlight-cleanup))
(global-set-key (kbd "C-g") '(keyboard-quit-cleanup))
然而,它不起作用。这有什么不对?
谢谢!
答案 0 :(得分:5)
很多事情,我害怕:)
您的global-set-key
已损坏:
(global-set-key (kbd "C-g") 'keyboard-quit-cleanup)
不
(global-set-key (kbd "C-g") '(keyboard-quit-cleanup))
(你在哪里看到的?)
您的自定义函数不是交互式命令,因此您无法将其绑定到密钥。它必须是:
(defun keyboard-quit-cleanup ()
"Clean up highlights after keyboard quit."
(interactive)
...)
您可能希望将FORCE
参数用于lazy-highlight-cleanup
你绑定了错误的东西。
C-g 绑定到isearch-abort
键盘映射中的isearch-mode-map
。
(编辑:根据tripleee的评论,搞乱全局绑定肯定是一个坏主意。肯定有一些与之相关的特殊行为,你不想冒险破坏它。 )
当您要为标准行为添加其他行为时,您可能希望使用钩子(根据偏好)或一些建议。在这种情况下,我们可以使用一个方便的钩子。
参见 C-h v isearch-mode-end-hook
RET
(add-hook 'isearch-mode-end-hook 'my-isearch-end)
(defun my-isearch-end ()
"Custom behaviours for `isearch-mode-end-hook'."
(when isearch-mode-end-hook-quit
(lazy-highlight-cleanup t)))
(我假设您lazy-highlight-cleanup
正常设置为nil
,否则默认情况下会进行清理。)