问:Emacs 中的 ,如何为 evil 中的文本对象制作特定于模式的键绑定(bind)?

可以在特定模式下绑定(bind)特定状态(正常、插入等)的键,如下例所示:

(evil-define-key 'normal org-mode "a" 'some-command)

但是,我不清楚如何以特定于模式的方式将键绑定(bind)到 evil-outer-text-objects-map(或其对应的 -inner-)。作为替代方案,也不清楚如何通过模式 Hook 以缓冲区本地方式绑定(bind)这些映射中的键。
evil-local-set-key 看起来不会这样做,因为它需要一个状态(正常、插入等)作为它的第一个参数,而这与此任务无关。

在这种情况下也不清楚如何使用 local-set-key,因为它需要一个键和一个命令作为参数,但不接受一个映射作为参数。

最佳答案

这有点晚了,但对于问题的第一部分,您可以使用本地 map ,例如:

(defun my-elisp-mode-configuration ()
  (with-eval-after-load 'evil
    (define-key evil-visual-state-local-map "ie" 'sp-evil-i-sexp)
    (define-key evil-operator-state-local-map "ie" 'sp-evil-i-sexp)))

(add-hook 'emacs-lisp-mode-hook #'my-elisp-mode-configuration)

在此示例中,我将“内部”e 运算符绑定(bind)到仅用于 elisp 模式的自定义 sp-evil-i-sexp 文本对象。

来到你的第二个问题; evil 覆盖本地 map ,因此使用 local-set-key 是不够的。相反,您可以使用:
  • 带有钩子(Hook)的局部邪恶映射;像前一个例子中的 evil-normal-state-local-map
  • 使用 evil-define-key;即:(evil-define-key 'normal emacs-lisp-mode-map (kbd " ") 'my-leader)请注意,您不能以这种方式覆盖 Evil 的绑定(bind),但可以覆盖那些失业或在全局或本地级别就业的绑定(bind)。如果您想覆盖 Evil 绑定(bind),请使用第一种方法。
  • 并且有 evil-make-overriding-map 会导致 local-map 覆盖 Evil 的绑定(bind),但这很少是您想要的,因为您希望 hjkl 至少可以工作,但对于像 dired 这样的模式很有用,而邪恶的意义不大。

  • 脚注:从 Emacs 的角度来看,Evil 的运算符或文本对象没有什么特别之处。他们只是绑定(bind)键盘映射。例如: i 键绑定(bind)到 evil-inner-text-objects-map ,其中包含像 w 这样的文本对象,如下所示:
    (define-key evil-visual-state-map "i" evil-inner-text-objects-map)
    (define-key evil-inner-text-objects-map "w" 'evil-inner-word)
    

    你可以在 evil-maps.el 中找到这些行

    关于emacs - 特定模式或缓冲区本地文本对象是邪恶的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25463369/

    10-11 02:14