Vim/insertモードでカーソルキーが使えない

Vim/insertモードでカーソルキーが使えない

VimをiTerm上で使おうとしたところ・・・

insertモードで矢印でカーソルを動かそうと思うと

A
B
C
D

とアルファベットが入力されてじゃんじゃん改行されてしまう。さーこまった。 この現象はgVimのほうでは発生せず、ターミナルバージョンのみで発生する。

いろいろ調べたが、原因はターミナルのエスケープシーケンスの受付時間の問題のようだ。 ターミナルはエスケープシーケンスによって文字の入力なのかそれとも端末の制御なのか判断している。 しかし歴史的な理由でその判断が難しい制御がある。その判断を確定させるためにユーザーからの入力を若干待つ仕様になっている。

こいつの設定が鈍いとエスケープシーケンスを伴う入力に対して誤動作するみたいだ。 そこで待つ長さをある程度区切ってしまって、処理を先にすすめることで誤動作を防止するといいみたい

ということで.vimrcに設定する

if !has('gui_running')
    set notimeout
    set ttimeout
    set timeoutlen=100
endif

この設定をするとエスケープシーケンスを100msec以内に入力しないと制御として反映されないのだが、 普通は機械がやるので通常使う範囲では問題無いということでOK

参考までに本質的じゃない解決法

誤作動をそのまま受け入れる

imap ^[OA <Up>
imap ^[OB <Down>
imap ^[OC <Right>
imap ^[OD <Left>

ここで^[OAと書かれている部分はctrl+vと入力する。

この方法でもなんとかなるが、escで抜けるのが遅くてイライラするので結局だめ

ターミナルのタイプを変える

export TERM=dtterm

とか書いてターミナルエミュレータのタイプを変えると治るというやつ。 探して一番最初に出てきた。

確かにinsertモードでもカーソルキーが効くようになったが、移動と同時にノーマルモードに抜けてしまうような挙動。 これじゃだめだ〜

バージョン

2012-04-23 新規

タグ

editor/vim/dont_work_arrow_keys_in_insert_mode.txt · 最終更新: 2017-09-27 10:48 by ore