対象者
- spacemacs使ってる
- Vim寄りにしている(いわゆるEvil State)
- 入力中(insert mode)でもちょっとしたカーソル移動をしたいが逐一normal modeに戻るのがしんどい
ちょっとしたカーソル移動というのは例えば、"
を入力したら""
にしてくれるようなエディタで"okimochi"
まで書いた時、カーソルはi
と"
の間にあるので1文字だけ右に移動して入力し続けたい…ということ。
キーバインドを設定する
設定ファイル.spacemacs
を編集して、insert modeでもショートカットキーでカーソル移動できるようにする。
まずSpace f e d
で設定ファイルを開き、以下の関数を探す。
(defun dotspacemacs/user-config ()...
この直下にキーバインドを書く。例えば以下のようにする。
(defun dotspacemacs/user-config ()
;; Ctrl-hで左移動
(define-key evil-insert-state-map (kbd "C-h") 'left-char)
;; Ctrl-lで右移動
(define-key evil-insert-state-map (kbd "C-l") 'right-char)
;; Ctrl-jで次の行へ移動
(define-key evil-insert-state-map (kbd "C-j") 'next-line)
;; Ctrl-kで前の行へ移動
(define-key evil-insert-state-map (kbd "C-k") 'previous-line)
)
insert modeを狙い撃ってキーバインドを設定している。
(bind-key "C-k" 'previous-line)
のようにmodeを問わず全体適用してしまっても良いが、まさにこのキーバインドが正常に動作しない罠。
(他は動くがprevious-lineだけカーソル移動せず、謎の文字が入力されてしまう)
normal modeでは同じ挙動をさせない、ということもできる。以下のように。
(defun dotspacemacs/user-config ()
;; まずキーバインドを取る
(bind-key "C-h" 'nil)
(bind-key "C-l" 'nil)
(bind-key "C-j" 'nil)
(bind-key "C-k" 'nil)
;; ここからキーバインドを当てる
;; Ctrl-hで左移動
(define-key evil-insert-state-map (kbd "C-h") 'left-char)
;; Ctrl-lで右移動
(define-key evil-insert-state-map (kbd "C-l") 'right-char)
;; Ctrl-jで次の行へ移動
(define-key evil-insert-state-map (kbd "C-j") 'next-line)
;; Ctrl-kで前の行へ移動
(define-key evil-insert-state-map (kbd "C-k") 'previous-line)
)
余談
既存のキーバインド一覧はSpace ?
で閲覧できる。
Ctrl + k
にあたるキーバインドは見られないので、謎の挙動はキー衝突とは別の原因なのでは…?
(typoなど存在しない動作を割り当てると、怒られるだけで謎の挙動はしない
)