vimのInsert modeで十字キーを無効化する

vimrcをいろいろ整理していたら,何故かInsert modeに入ると十字キーが入力されたときにABCDが入力されてしまう状態になってしまった.
これを防ぎ,十字キーの入力を受け付けないようにいろいろやったことをまとめておく.

環境

OSはArch Linux,ターミナルはDeepin Terminalを使用しています.

vi互換モードを停止させる

調べるとよく出てくるのはset nocompatibleでvi互換モードをやめたら出来たよっていう記事が多かった.
早速vimrcに設定を書き加えてみる.

set nocompatible

これでいけるかなと思ったが,まだABCDって入力されてしまっている.
記事を読むとvimはvimrcがあると自動的にset nocompatibleをやってくれるみたいです.
だったら設定しても意味ないですね.

十字キーを無効化する

vimnnoremapinoremapvnoremapでそれぞれのモードにおけるキーマッピングを変更できる.
そこでvimrcに以下のような記述を書き加えてみる.

nnoremap <Up> <Nop>
nnoremap <Down> <Nop>
nnoremap <Right> <Nop>
nnoremap <Left> <Nop>

inoremap <Up> <Nop>
inoremap <Down> <Nop>
inoremap <Right> <Nop>
inoremap <Left> <Nop>

vnoremap <Up> <Nop>
vnoremap <Down> <Nop>
vnoremap <Right> <Nop>
vnoremap <Left> <Nop>

これで大丈夫だろと思って編集したら,確かにNormal modeVisual modeでは無効化されたけど,やっぱりInsert modeでABCDが入力されてしまう...
ちなみにneovimはこの設定で十字キーを無効化することが出来ました.

vimを再インストールしてみる

vimのバージョンを調べるとSmall versionだからおかしいとあったので,自分のバージョンを確認してみたけど,Hugeなのでバージョンの違いによる問題ではなさそう.

とりあえず再インストールしてみたけどやはりダメ...

文字コードを使って無効化する

この記事を見ると十字キーの上や左を押すと^[OA^[ODvimに送信されるみたい.
この^[OAなどは^[(Esc) + O + Aが入力されることと同じ意味だそうです.つまり,

  1. EscでNormal modeに移行
  2. Oで一つ上の行でInsert modeを開始
  3. Aを挿入

といったようにvimは解釈するようです.思い返すとたしかに十字キーを押しっぱなしにしていたらInsert mode と Normal modeが交互に切り替わっていた.
特定の文字コードを無効化してやればいいんじゃないかと思うので,以下のような設定をvimrcに書き加える.

inoremap ^[OA <Nop>
inoremap ^[OB <Nop>
inoremap ^[OC <Nop>
inoremap ^[OD <Nop>

文字コードは C-v + 十字キーで挿入できます.
これでvimを起動してみるとABCDが挿入されなくなった.
なんか以前まではそのまま動いていたのでターミナルの問題なのかな.