web-dev-qa-db-ja.com

MacVimで<Esc>を再マッピングすると、Vim自体が怒ります

.vimrcに次の行があります。

nnoremap <Esc> :noh<Cr>

これはMacVimで正常に機能します。 Vim自体を開くと、その「コマンドバー」は次のように始まります。

.2c

コマンドを実行するためにEnterキーを押すと、VimはE16: Invalid rangeと文句を言います。

ちょっとした煩わしさですが、どうすればこの問題を解決できますか?

5
Closure Cowboy

マッピング Esc それは起こるべきではありませんが、常に少しトリッキーで、一般的にこの種のトラブルを招きます。

マッピングの「標準的な」方法は次のとおりです。

nnoremap <silent> <C-l> :nohlsearch<CR><C-l>

そのように Ctrl+L (通常は画面を再描画します)は、ハイライトを停止し、画面を再描画します。


何が起こるかはわかったと思いますが、まだ解決策がありません。 Vimが<ESC>と "2c"を含む文字列を受け取ったと想定したので、次のマッピングを使用して表示しました。

nnoremap <Esc> :"

その結果、起動時に次のプロンプトが表示されました。

:"[>0;261;0c

これは、起動時に何かが<ESC>[>0;261;0cを送信したことを意味します。元の xterm制御シーケンス を検索すると、次のことがわかります。

ESC [         Control Sequence Introducer (CSI is 0x9b)

そして

CSI>P s c

デバイス属性の送信(セカンダリDA)。

P s = 0または省略→端末の識別コードを要求します。応答はdecTerminalIDリソース設定によって異なります。 VT220以降にのみ適用されますが、xtermはこれをVT100に拡張します。

→CSI>P p;P v ;P cc

ここで、P pは端末タイプを示します

P p = 0→ ‘‘ VT100 ’’。
P p = 1→「VT220」。

およびP vはファームウェアバージョンです(xtermの場合、これは元々XFree86パッチでした)番号、95から始まります)。DEC端末では、P cはROMカートリッジ登録番号を示します)常にゼロです。

したがって、私の場合、何かがCSI >P p = 0(→端末タイプVT100)、P v = 261(→私のxtermバージョン)、およびP c = 0。

それでも私はそれがどこから来たのか、それを止める方法がわかりません。私の推測では、端末とVimの間の情報交換が失敗し、何かがバグを起こしていると思います。

3
peth

問題は、一部の端末vimが[> 0; 261; 0cをそのように受信することです。そして最後の「c」はvimの起動を苦痛にしますが、起動時に最初の「c」をスキップする簡単なトリックを見つけました。

nnoremap c :nunmap c<Cr>
0
oselivanov