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

she*_*per 1 emacs elisp

我对elisp很新,我试图在搜索时定义一个设置突出显示行为的函数.目标是:之后i-search,我希望能够清除突出显示C-g,但是如果我按回车键,我希望保持高亮显示.

所以我在我的定义了一个函数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))
Run Code Online (Sandbox Code Playgroud)

然而,它不起作用.这有什么不对?

谢谢!

phi*_*ils 5

很多事情,我害怕:)

  1. global-set-key坏了:

    (global-set-key (kbd "C-g") 'keyboard-quit-cleanup)
    
    Run Code Online (Sandbox Code Playgroud)

    不:

    (global-set-key (kbd "C-g") '(keyboard-quit-cleanup))
    
    Run Code Online (Sandbox Code Playgroud)

    (你在哪里看到的?)

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

    (defun keyboard-quit-cleanup ()
      "Clean up highlights after keyboard quit."
      (interactive)
      ...)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 您可能想要使用FORCE参数lazy-highlight-cleanup

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

    C-g必须isearch-abortisearch-mode-mapkeymap中.

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

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

    看到 C-hv 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)))
    
    Run Code Online (Sandbox Code Playgroud)

(我假设您已lazy-highlight-cleanup设置为nil正常,否则默认情况下会进行清理.)

  • 也许强调全球重新绑定Cg是一个非常糟糕的主意. (3认同)