web-dev-qa-db-ja.com

Evil-modeEmacsでのキーシーケンスの定義

Evilドキュメントでキーシーケンスを定義するための指示が見つかりませんでした。

開発者によって与えられた例は、単一のキーのみをカバーしています。

(define-key evil-normal-state "w" 'foo)

通常モードで「gv」を定義したり、挿入モードで「; RET」を定義したりする場合は、どうすればよいですか?

たとえば、Vimでは次のようにします。

imap ;<cr> <end>;<cr>
map gv :tabprev<cr>
4
Mark T.

Evil wiki page は、 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

同様に、次のように定義できます。

(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)))))
1
djf