20

私は幸せなVIMユーザーですが、流暢には程遠いことは認めます。私はこの素敵な投稿を見つけました: Vimは最後の検索のハイライトを明確にし、検索を行うたびにランダムな文字シーケンスを打ち消す必要がなければ、私はより良い人になるだろうと思いました。今、私はここからvimrc設定も使用しています:

http://amix.dk/vim/vimrc.html

私が抱えている問題は、行を追加するnnoremap <esc> :noh<return><esc>と(配置した場所に違いがないようです)、コマンドモードで矢印を使用すると、厄介な動作が発生することです。つまり、AからDまでの文字が改行と挿入モードに切り替わります。

マッピングの競合が発生する必要がありますが、私の人生では、それがどこにあるのかわかりません。

編集:回答からわかるように、Ultimate vimrcの部分は関連性がないことが判明したため、上記のnnoremapコマンドは、それが唯一のvimrcエントリであっても、矢印の動作を変更します。タイトルをより有益なものに変更します。

PS。矢印を使うべきではないことはわかっています。いつかそこに着くといいのですが。

4

5 に答える 5

20

マッピング

nnoremap <esc> :noh<return><esc>

いわゆる「灰色のキー」と競合します。GVimでのみ使用するか、矢印などの特別なキーを使用しない人がターミナルVimで使用する必要があると思います。

Vimがキーを処理する方法を私が知っている(そして推測している)ことから、これで何もすることは不可能だと思います。Vimが特別なキーを認識するためには、そのすべてのコンポーネントが一列に並んでいる必要があるため、Vimを押すArrow Leftと、次の一連のコードが取得されます。

<esc> [ D

しかし、マッピングArrow Leftが次のようになった後:

: n o h l <cr> <esc>

[ D

Vimは2つの別々のシーケンスを認識し、キー<esc>を1回押すと処理するEscapeため、次の2つのキーコードはLeft Arrow特別な意味を失います。

したがって:noh、他のキーシーケンスにマップすることをお勧めします(たとえば、で始まるものにマップします。;を<leader>参照してください:help mapleader。Fキーを使用することはお勧めしません。矢印キーを使用するのと同じくらい悪いです)。

于 2012-08-13T20:17:59.467 に答える
16

原因はよく説明されていましたが、解決策は言及されていませんでした。しかし、まっすぐなものがあります。

から始まるキーシーケンスがあることをVimに明示的に伝える場合<esc>[

:nnoremap <silent><esc> :noh<CR>
:nnoremap <esc>[ <esc>[

シングル<esc>が押されたときよりも、Vimは1秒(または別の時間、を参照:h 'timeoutlen')または次のキー(<esc>たとえば秒)を待ってから、それを。に置き換え:noh<CR>ます。

于 2013-12-08T20:22:13.357 に答える
14

このソリューションは、へのESCマッピングを保持し:nohlsearchます。

なぜこれが起こっているのかを説明するこの回答へのコメントは、根本的な原因がvimのTermResponseの振る舞いであることを示しています。これは、TermResponseイベントの自動コマンドでマッピングをラップすることで補正できます。

これにより、用語応答が設定されるまでバインディングが発生しないことが保証され、 vimEscのような文字列も送信されなくなります。]>1;3201;0c

vimrcの行を次のように変更します。

augroup no_highlight
    autocmd TermResponse * nnoremap <esc> :noh<return><esc>
augroup END

augroupコマンドは必ずしも必要ではありませんが、vimを終了せずにvimrcをリロードすると、複数のマッピングが防止されます。

編集: GvimやMacvimなどのグラフィカルvimも使用している場合、TermResponseイベントは発生しません。単一のvimrcを使用すると仮定すると、次のような追加のコードが必要になります。

if has('gui_running')
  nnoremap <silent> <esc> :nohlsearch<return><esc>
else
  " code from above
  augroup no_highlight
    autocmd TermResponse * nnoremap <esc> :noh<return><esc>
  augroup END

end
于 2013-04-16T02:22:48.270 に答える
3

問題は、矢印を押すと端子がのようなものを発することです<Esc>OA。ターミナルをサポートするVimパーツは、使用しているのと同じマッピングメカニズムを使用してジョブを実行しているnmap <Esc>OAようです。何も表示されませんが、call feedkeys("\eOA")1行上に移動し、call feedkeys("\eOA", 'n')現在の行を超えて文字Aが追加されます。マッピングを再マッピングできないため、vimを<Esc>キーの一部として使用することを禁止します。問題は、ここで再マップ可能なマッピングが必要であるということですが、それがで始まる場合にのみ再帰的でなくても再マップ可能なマッピングを持つことができますが、機能し{lhs}ませ<Esc>:noh<CR>OAん。私は次のコードが(実際の最初の文字になるように使用<expr>し、副作用を伴って機能し、それでも起動する)と思いましたが、実際にはそうではありません:<Esc>{rhs}:noh

function s:NoHlSearch()
    nohlsearch
    return "\e"
endfunction
nmap <expr> <Esc> <SID>NoHlSearch()

。最初に含まれているが含まれていない非再帰的な再マップ可能なマッピングの問題を解決する方法は他にありませ{lhs}ん。

于 2012-08-13T20:13:45.037 に答える
1

私はこれで幸運に恵まれました

if $TERM =~ 'xterm'
  set noek
endif
nnoremap <silent> <esc> <esc>:noh<cr>

欠点は、ファンクションキーを挿入モードで使用できないことです。

:h ek
于 2012-08-13T19:23:01.527 に答える