2016/03/28

Recent entries from same category

  1. Zenn で Twitter bot 作成入門を書いた。
  2. プログラマーのための新しい情報共有コミュニティ Zenn で本を書いてみた。
  3. Windows ユーザは cmd.exe で生きるべき 2020年版
  4. Let's Encrypt を簡単操作できる CLI、Lego が MyDNS に対応した。
  5. golang でメモ専用コマンド「memo」作った。

ちょっとした昔話を一つ。

vimで方向キーがABCDを入力してしまう問題の解決 - Qiita

ubuntuでちょっとした設定ファイルを書き換える際にはvimを使っているのだけれど,方向キーでのカーソル入力が何か拍子にABCDと入力になってしまうことが度々あり不便なので原因を調べてみた。 ***...

http://qiita.com/blue_camel/items/e2bd59a3b33acd5edfd0
Vimで方向キー入力時にABCDが記述されるエラー対処 | vdeep

カーソル移動が「h,j,k,l」だとわかっていても、つい押してしまう「方向キー」。するとABCDと訳のわからない入力が。。

http://vdeep.net/vim-abcd

もう少し詳細を知っておくと、もし同じ様な現象に遭遇した時に解決が早くなるかもしれませんね。まずなぜ ABCD が挿入されてしまうのか。端末 vt100 ではカーソルの移動(↑↓←→)はそれぞれ以下のコントロールコードが割り当てられています。

キー コントロールコード
^[[A または ^[OA
^[[B または ^[OB
^[[C または ^[OC
^[[D または ^[OD

ここでの ^[\x1B つまりエスケープです。近代的な端末はこれらを解釈し、画面上の描画位置を期待した通りに移動してくれます。また近代的なプログラムであればこれらのキーシーケンスは一度に解釈されて正しくカーソルキーと判別されます。しかし大昔に作られた vi はこれらの先頭に付いている ESC に反応してインサートモードを抜ける動作になっていました。この結果、↑キーであれば ESC が押されてノーマルモードに戻り O が押されて1行上でインサートモードが開始され、A が押されて挿入される、という動作が行われます。

vi もその後進化し termcap というライブラリを使う様になりました。上記のキーシーケンスは一度に解釈されて正しくカーソルキーと判別される様になりました。しかし vi は互換性を重視するテキストエディタです。デフォルトでは互換モードで動作する為、きちんとこの動作を行う様になっています。オプション nocompatible を設定するだけで現象が直るのはこの為です。ちなみにまだこれらの端末技術が進んでいなかった頃(といってもそれほそお爺さんではありませんが)、僕たちは以下の様なワークアラウンドでカーソルキーを疑似していました。

:map! ^[OA ^[ka
:map! ^[OB ^[ja
:map! ^[OC ^[la
:map! ^[OD ^[ha

^[CTRL-VCTRL-[ で入力します。

カーソルキーが送られてきたら vi の map ですぐさま ESC を判別せずに ESC でノーマルモードに戻り、hjkl で移動し、a で再度インサートモードに戻っていたのです。もちろんこれを設定すると単独で ESC をタイプした時にタイムアウトが発生するまでキーが解釈されないので反応が悪くなります。

そして次第にこういったワークアラウンドは使わず hjkl で移動する様になりました。良くも悪くもカーソルキーを使わず操作する為のギプスだったのですね。

Posted at by