LoginSignup
0
1

More than 3 years have passed since last update.

SpacemacsのVim stateでinsert modeでもキーバインドからカーソル移動する

Last updated at Posted at 2019-08-08

対象者

  • 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など存在しない動作を割り当てると、怒られるだけで謎の挙動はしない

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1