Q:,如何为evil
中的文本对象制作特定于模式的键绑定?
可以在特定模式下绑定特定状态(正常,插入等)中的密钥,如以下示例所示:
(evil-define-key 'normal org-mode "a" 'some-command)
但是,我不清楚如何以特定于模式的方式将密钥绑定到evil-outer-text-objects-map
(或其-inner-
对应方)。作为替代方案,它还不清楚如何通过模式挂钩以缓冲区本地方式绑定这些映射中的键。
它看起来不像evil-local-set-key
那样,因为它期望一个状态(正常,插入等)作为它的第一个参数,并且它与此任务无关。
它还不清楚如何在这个实例中使用local-set-key
,因为它需要一个键和一个命令作为参数,但不会将地图作为参数。
答案 0 :(得分: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>")
答案 1 :(得分: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运算符绑定到仅用于elisp模式的自定义sp-evil-i-sexp文本对象。
来到你的第二个问题; evil会覆盖本地地图,因此使用local-set-key是不够的。相反,您可以使用:
(evil-define-key 'normal emacs-lisp-mode-map (kbd " ") 'my-leader)
请注意,您不能以这种方式覆盖Evil的绑定,而是在全球或本地级别失业或雇用的绑定。如果要覆盖Evil绑定,请使用第一种方法。evil-make-overriding-map
会导致local-map覆盖Evil的绑定,但这很少是你想要的,因为你希望hjkl至少工作但对像dired这样的模式很有用,而邪恶则没有意义。脚注:从Emacs的角度来看,Evil的运算符或文本对象没有什么特别之处。它们只是键盘图。例如:我的键被绑定到邪恶的内部文本对象映射,其中包括像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
中找到这些行