5

问:在 Emacs 中,如何为 中的文本对象进行特定于模式的键绑定evil

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

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

但是,我不清楚如何以特定于模式的方式将键绑定到evil-outer-text-objects-map(或其-inner-对应物)。作为替代方案,也不清楚如何通过模式挂钩以缓冲区本地方式绑定这些映射中的键。

它看起来evil-local-set-key不会这样做,因为它需要一个状态(正常、插入等)作为它的第一个参数,而这与这个任务无关。

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

4

2 回答 2

2

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

(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)

在此示例中,我将 'inner' e 运算符绑定到自定义 sp-evil-i-sexp 文本对象,仅用于 elisp 模式。

来回答你的第二个问题;evil 会覆盖本地地图,因此使用 local-set-key 是不够的。相反,您可以使用:

  • 带有钩子的局部邪恶地图;就像前一个例子中的 evil-normal-state-local-map
  • 使用邪恶定义键;即:(evil-define-key 'normal emacs-lisp-mode-map (kbd " ") 'my-leader) 请注意,您不能以这种方式覆盖 Evil 的绑定,但那些在全球或本地级别失业或受雇的绑定。如果您想覆盖 Evil 绑定,请使用第一种方法。
  • 并且存在evil-make-overriding-map导致 local-map 覆盖 Evil 的绑定的原因,但这很少是您想要的,因为您希望 hjkl 至少可以工作,但对于像 dired 这样的模式很有用,而邪恶则没有多大意义。

脚注:从 Emacs 的角度来看,Evil 的操作符或文本对象没有什么特别之处。它们只是绑定的键盘映射。例如: i 键绑定到 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 中找到这些行

于 2014-10-27T12:30:50.557 回答
2

在阅读邮件列表时,有人提到最好使用键绑定eval-after-load而不是钩子,所以这里是:

(eval-after-load "<mode>"
  '(progn
     <object-definition>))

至于定义新的文本对象,我必须从@gordon-gustafson推荐这个函数:

(defmacro define-and-bind-text-object (key start-regex end-regex)
  (let ((inner-name (make-symbol "inner-name"))
        (outer-name (make-symbol "outer-name")))
    `(progn
      (evil-define-text-object ,inner-name (count &optional beg end type)
        (evil-select-paren ,start-regex ,end-regex beg end type count t))
      (evil-define-text-object ,outer-name (count &optional beg end type)
        (evil-select-paren ,start-regex ,end-regex beg end type count nil))
      (define-key evil-inner-text-objects-map ,key (quote ,inner-name))
      (define-key evil-outer-text-objects-map ,key (quote ,outer-name)))))

所以这部<object-definitions>分会变成:

(define-and-bind-text-object "<key>" "<start-regex>" "<end-regex>")
于 2014-09-08T07:33:36.470 回答