【问题标题】:Mode-specific or buffer-local text objects in evil?邪恶的模式特定或缓冲区本地文本对象?
【发布时间】:2014-08-23 15:13:00
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: emacs evil-mode


    【解决方案1】:

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

    (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 运算符绑定到自定义 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 这样的模式很有用,而 evil 不太有意义。

    脚注:从 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 中找到这些行

    【讨论】:

      【解决方案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)))))
      

      所以&lt;object-definitions&gt; 部分将变为:

      (define-and-bind-text-object "<key>" "<start-regex>" "<end-regex>")
      

      【讨论】:

      • 请注意,我没有询问 state-specific 文本对象,而是询问 mode-specificbuffer-local 文本对象——实际上,-inner--outer- 映射的本地键绑定。顺便说一句,人们通过操作符未决状态而不是正常状态访问文本对象。
      • 哦,是的,操作员状态。让我扩展一下并考虑@r-haluk-Öngör 的回答。
      猜你喜欢
      • 2014-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-11
      • 2020-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多