在邪恶模式 Emacs 中定义按键序列

Mar*_* T. 5 keyboard-shortcuts emacs vi elisp key-mapping

我在 Evil 文档中找不到任何关于定义键序列的说明。

开发人员给出的示例仅涵盖一个密钥。

(define-key evil-normal-state "w" 'foo)
Run Code Online (Sandbox Code Playgroud)

如果我想在正常模式下定义“gv”或在插入模式下定义“;RET”,我需要做什么?

例如,在 Vim 中,我只是这样做:

imap ;<cr> <end>;<cr>
map gv :tabprev<cr>
Run Code Online (Sandbox Code Playgroud)

djf*_*djf 2

Evil wiki 页面建议使用elscreen.el来模拟 Vim 的选项卡:

(load "elscreen" "ElScreen" t)

(define-key evil-normal-state-map (kbd "C-w t") 'elscreen-create) ;creat tab
(define-key evil-normal-state-map (kbd "C-w x") 'elscreen-kill) ;kill tab

(define-key evil-normal-state-map "gv" 'elscreen-previous) ;previous tab
(define-key evil-normal-state-map "gt" 'elscreen-next) ;next tab
Run Code Online (Sandbox Code Playgroud)

同样,您可以定义:

(define-key evil-insert-state-map (kbd "; <return>") 'move-end-of-line)

这仿效了imap ;<cr> <end>;<cr>。如果您按;后跟,Return则光标将跳到行尾并插入分号。我想让它更通用一点,但我缺少一个关键功能。

(define-key evil-insert-state-map (kbd ";") 'insert-or-append)

(defun insert-or-append ()
  "If the user enters <return>, then jump to end of line and append a semicolon,
   otherwise insert user input at the position of the cursor"
  (interactive)
  (let ((char-read (read-char-exclusive))
        (trigger ";"))
    (if (eql ?\r char-read)
        (progn
          (end-of-line)
          (insert trigger))
      (insert (this-command-keys)))))
Run Code Online (Sandbox Code Playgroud)