2014年8月9日土曜日

Vimで方向キーを押すとABCDが出てうまく動かない問題

Cygwin 1.7 + CygTerm + Tera Term な環境で。

vim の挿入モード(インサートモード)で矢印キーを押すと、A(↑),B(↓),C(→),D(←) が入力されてしまう。
よくキーマップを変更する方法が紹介されているけど、色々問題もあるみたいなので、今回はその方法はなし。
今回は「Vimリファレンスマニュアル (ヘルプ) による方法」と「vi 互換モードをやめる方法」を紹介。

Vimリファレンスマニュアル (ヘルプ) による方法


Vimの中で「:help vt100-cursor-keys」や「:help xterm-cursor-keys」を実行すると、解決策が紹介されている。
同じ内容が こちら (日本語) でも見られる。


vt100 や xterm などの端末ではカーソルキーを押すと <Esc>OA や <Esc>OB などが送られます。不運なことに、これらは「挿入を終了し、上に新規行を作成して 'A' や 'B' を挿入する」という挿入モードでのコマンドでもあります。
このコマンドを実行するのでなく、カーソルキーのシーケンスが入力されたのだと誤認識してしまうかもしれません。これを防ぎ、意図通りの動作をさせるには次の設定を使います
:
        :set notimeout          " マッピングについてタイムアウトしない
        :set ttimeout           " 端末のキーコードについてタイムアウトする
        :set timeoutlen=100     " 100 ミリ秒後にタイムアウトする
この設定をすると、キーコードが 100 ミリ秒以内に送られた場合のみカーソルキーと認識されます。ユーザーが普通に入力するときはそんなに速くないので、たとえまったく同じキーコードのシーケンスを送信しても、個々のコマンドと認識されます。
Vim documentation: term


上記を Vim 中で実行するか、~/.vimrc に以下の様に記述すればいい。

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

vi 互換モードをやめる方法


Vimの中で「:help 'nocompatible'」を実行すると、vi 互換モードについての説明が表示できる
同じ内容がこちら (日本語) でも見られる

VimをなるべくVi互換にするか、便利な機能を使えるようにするかを決定する。これは、特別な種類のオプションである。このオプションの値が変更されると、それに伴って他のオプションも変更されるからだ。

(略)

このオプションをファイル vimrc 内で設定するなら、一番先頭に置くこと。

(略)

オフに設定すると、「Viの既定値」と「Vimの既定値」が異なっているオプションについて、Vimの既定値が用いられるようになる。下の表で '+' がついているものを参照。その他のオプションは影響を受けない。
オンにすると、他のオプションがいくつか変更され、Vimはできる限りVi互換を保とうとする。下の表を参照。これはVi互換の編集方法に戻りたいと思うときに使うことができる。

(表は省略)
Vim documentation: options

.vimrc の先頭に以下を追加すればいい

" Vim 互換モードを使用しない
" このオプションは .vimrc の先頭に記述すること
set nocompatible

ちなみに・・・


Cygwinで、vi は vim をリンクしてるのかと思ったら、別物?
$ ls -l /usr/bin/vi*
-rwxr-xr-x 1 ike None 828K 6月  23 04:31 /usr/bin/vi.exe*
lrwxrwxrwx 1 ike None    7 8月   2 19:42 /usr/bin/view -> vim.exe*
-rwxr-xr-x 1 ike None 2.1M 6月  23 04:31 /usr/bin/vim.exe*
lrwxrwxrwx 1 ike None    7 8月   2 19:42 /usr/bin/vimdiff -> vim.exe*
-rwxr-xr-x 1 ike None 2.1K 6月  23 04:31 /usr/bin/vimtutor*
でも、vi を実行しても、vim を実行しても、Vimのトップ画面が表示される。vi で実行すると Vim が Vi 互換モードで起動するんだろうか?? 一応、.bashrc で alias を設定しておいた
alias vi='vim'

0 件のコメント:

コメントを投稿