回答:
次のマッピングを使用できます。
cnoremap <expr> <CR> getcmdtype() == '/' ? '<CR>zz' : '<CR>'
これは次のように説明できます:
cnoremap
コマンドラインモードでマッピングを作成する<expr>
マッピングは式を評価します(条件を使用できます)<CR>
再マッピングの鍵(Enter)getcmdtype()
使用するコマンドラインモードを示す文字を返します== '/'
がgetcmdtype()
返されました/
か?これは、検索モードであることを意味しますか?'<CR>zz'
検索モードの場合は、zz
を押した後に実行します<CR>
'<CR>'
それ以外は実行のみ <CR>
関連するヘルプトピック:
:h expr1
以下のためのX ? Y : Z
構文:h :cnoremap
:h :map-<expr>
:h getcmdtype()
EDITの前方と後方の両方の検索すなわちとうまくいくのマッピングを作成するために興味深いものになるだろうことを注意getcmdtype()
リターン/
かを?
。これを行うためのマッピングは次のとおりです。
cnoremap <expr> <CR> (getcmdtype() == '?' \|\| getcmdtype() == '/') ? '<CR>zz' : '<CR>'
|
文字のエスケープに注意してください。エスケープされていない場合、vimはcnoremap <expr> <CR> (getcmdtype() == '?'
最初に実行するコマンドとして理解し、その後にgetcmdtype() == '/') ? '<CR>zz' : '<CR>'
意味がなくエラーが発生します。
編集2 @Antonyは彼のおかげでより読みやすい解決策を提案しました:
cnoremap <expr> <CR> getcmdtype() =~ '[/?]' ? '<CR>zz' : '<CR>'
/
モーションとして使用するときに問題が発生しました。たとえばc/search
、現在の位置から次の場所のマッチングに変更されますsearch
が、のためcnoremap
、テキストを挿入しますzz
。回避策についての考え、またはマッピングを削除する必要がありますか?
getcmdtype() =~ '[?/]'
少し簡単になるでしょう。