为键盘退出定义一个新功能并突出显示清除

时间:2013-05-29 01:29:38

标签: emacs elisp

我是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))
然而,它不起作用。这有什么不对?

谢谢!

1 个答案:

答案 0 :(得分:5)

很多事情,我害怕:)

  1. 您的global-set-key已损坏:

    (global-set-key (kbd "C-g") 'keyboard-quit-cleanup)
    

    (global-set-key (kbd "C-g") '(keyboard-quit-cleanup))
    

    (你在哪里看到的?)

  2. 您的自定义函数不是交互式命令,因此您无法将其绑定到密钥。它必须是:

    (defun keyboard-quit-cleanup ()
      "Clean up highlights after keyboard quit."
      (interactive)
      ...)
    
  3. 您可能希望将FORCE参数用于lazy-highlight-cleanup

  4. 你绑定了错误的东西。

    C-g 绑定到isearch-abort键盘映射中的isearch-mode-map

    (编辑:根据tripleee的评论,搞乱全局绑定肯定是一个坏主意。肯定有一些与之相关的特殊行为,你不想冒险破坏它。 )

  5. 当您要为标准行为添加其他行为时,您可能希望使用钩子(根据偏好)或一些建议。在这种情况下,我们可以使用一个方便的钩子。

    参见 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)))
    
  6. (我假设您lazy-highlight-cleanup正常设置为nil,否则默认情况下会进行清理。)