如何在特定的邪恶状态下为模式设置按键绑定?


9

我有一套键绑定,既用于(Evil)的插入模式,web-modephp-mode用于插入模式。所以我不能使用set-local-map。因为在正常模式下,相同的键将随后调用其他命令。因此,绑定evil-insert-state-map仅需处于活动状态。

我有以下内容:

(eval-after-load 'php-mode
  '(progn
     (define-key evil-insert-state-map
       (kbd "C-<next>") (lambda () (interactive) (insert " = ")))
     (define-key evil-insert-state-map
       (kbd "C-<prior>") (lambda () (interactive) (insert "->")))))

(eval-after-load 'web-mode
  '(progn
     (define-key evil-insert-state-map
       (kbd "C-<next>") 'zencoding-expand-yas) 
     (define-key evil-insert-state-map
       (kbd "C-<prior>") 'zencoding-expand-line)))

因此,每次web-modephp-mode正在加载时,这些键绑定都会被激活。

问题是:假设我有两个打开的缓冲区,一个在中php-mode,另一个在中web-mode。当web-mode缓冲区是当前缓冲区并且我切换到另一个缓冲区时php-modeweb-mode绑定在php-mode缓冲区内部仍然处于活动状态。

我试图通过使用(add-hook 'web-mode-hook [...])(add-hook 'php-mode-hook [...])而不是在中设置绑定来解决此问题eval-after-load。但是这种解决方案在这种情况下不起作用。

有什么建议么?我真的很感激。

Answers:


12

Evil具有仅evil-define-key用于定义特定按键图中某些状态的命令的宏:

(evil-define-key 'insert emacs-lisp-mode-map (kbd "C-c C-c") 'butterfly
                                             (kbd "<pause>") 'zone)

它能够延迟绑定的执行(通过eval-after-load自身使用),并且还可以采用多个键盘命令对,这是一个相当不错的补充。


您的解决方案有效,对此我深表感谢。从来不知道有邪恶定义密钥之类的东西。确实,您可以将更多的keycommand对绑定到上,这确实很不错evil-define-key
ReneFroger 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.