模式特定或缓冲区本地文本对象是邪恶的吗?

Dan*_*Dan 6 emacs evil-mode

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

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

(evil-define-key 'normal org-mode "a" 'some-command)
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 2

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

(eval-after-load "<mode>"
  '(progn
     <object-definition>))
Run Code Online (Sandbox Code Playgroud)

至于定义新的文本对象,我必须推荐@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)))))
Run Code Online (Sandbox Code Playgroud)

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

(define-and-bind-text-object "<key>" "<start-regex>" "<end-regex>")
Run Code Online (Sandbox Code Playgroud)