最初の検索結果を自動的に中央に配置するにはどうすればよいですか?


7

最初の検索結果を画面の中央に配置したい。:nnoremap n nzzマッピングについては知っていますが、最初のマッチではなく、次のマッチの中央揃えでのみ機能します。

AutoCmdを使用できると思いましたが、適切なイベントが見つかりませんでした。

回答:


14

次のマッピングを使用できます。

cnoremap <expr> <CR> getcmdtype() == '/' ? '<CR>zz' : '<CR>'

これは次のように説明できます:

  • cnoremap コマンドラインモードでマッピングを作成する
  • <expr> マッピングは式を評価します(条件を使用できます)
  • <CR> 再マッピングの鍵(Enter
  • getcmdtype() 使用するコマンドラインモードを示す文字を返します
  • == '/'getcmdtype()返されました/か?これは、検索モードであることを意味しますか?
  • '<CR>zz' 検索モードの場合は、zzを押した後に実行します<CR>
  • '<CR>' それ以外は実行のみ <CR>

関連するヘルプトピック:


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>'

3
多分getcmdtype() =~ '[?/]'少し簡単になるでしょう。
アントニー

@Antony確かにそれはずっと良いです、私は私の答えを編集しました。ありがとうございました!
statox

2
驚くばかり!ちょうど私が必要なもの、ありがとう!また、詳細な説明に感謝します。Vimscriptの学習に非常に役立ちます。
JanWarchoł16年

最近、これを/モーションとして使用するときに問題が発生しました。たとえばc/search、現在の位置から次の場所のマッチングに変更されますsearchが、のためcnoremap、テキストを挿入しますzz。回避策についての考え、またはマッピングを削除する必要がありますか?
D.ベンノーブル

1
@DavidBenKnoble確かにそれは私が考えていなかった問題です。回避策を見つけて、答えが見つかったら編集します。
スタトックス

5

Statoxの答えは間違いなくこれまでで最高ですが、代わりに、「バッファー内検索エクスペリエンスの向上」を目的とするプラグインであるVim-slashについて知りました。

そしてそれからreadmeです:

カスタマイズ

検索後zz

現在のマッチをウィンドウの中央に配置します。

noremap <plug>(slash-after) zz

試してみたところ、両方向(/?)でスムーズに動作しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.