「?」で検索を開始した場合でも、「n」を先に進めるにはどうすればよいですか?または「#」?


19

Vimには、(少なくとも)反対方向に検索するコマンドのセットが2つあります。入力して/からパターンを入力すると、ドキュメント内でパターンが前方に検索されます。入力?してからパターンを逆方向に検索します。コマンド*#コマンドの間に同じ関係が存在します。

私が嫌いなのは、これらのコマンドがnand Nコマンドの検索方向も設定することです。使用した後/n文書を前方になり、N後方に行きます。を使用した後?n後方にN進み、前方に進みます。(つまり、n常に元の検索と同じ方向に進み、常にN別の方向に進みます。)

検索を開始した方向に関係なく、どのようにnしてドキュメントを前に進み、後に進むことができNますか?

回答:


29

以下を使用することでnN一貫して下向き/上向きの検索の動作を変更できます。

nnoremap <expr> n 'Nn'[v:searchforward]
nnoremap <expr> N 'nN'[v:searchforward]

更新:どのように機能しますか?

これは式マップを使用します。これは、マップのlhを、lhが検出されるたびに評価される式にマップします。:h map-expressionヘルプを参照してください。

起こるのは、v:searchforward変数(最後の検索が行われた方向の内部状態を決定する、を参照:h v:searchforward)がその前の文字列のインデックスとして使用されることです。したがって、最初のマップの場合、最後の検索方向が順方向の場合、nは「n」(インデックス1、2番目の文字を返すことを意味する)にマップされ、逆方向の場合、「n」は'N'(v:searchforward変数が0であり、したがって 'N'が返されるため。

これらのマップを記述する別の方法は次のとおりです(より明確な場合があります)。

nnoremap <expr> n (v:searchforward ? 'n' : 'N')
nnoremap <expr> N (v:searchforward ? 'N' : 'n')

それを行うプラグインもいくつかあります(つまり、SearchRepeatプラグインと他のプラグインもあります)。


プラグインについて言及してくれてありがとう。私はちょうどそれを代替案として推薦しようとしていた:
インゴカルカット

2
添え字の賢い使用!
wchargin

6
説明を追加してください。この構文を見たことがありません。どのように機能するのか知りたいです。
エバーグリーン

1
@EvergreenTree:さらに説明を追加
クリスチャンブラバンド

2
@ChristianBrabandtそれはとても賢いです。v:searchforwardインデックスとして使用することを考えたことがありません。
エバーグリーン

1

クリスチャンブラバンドのソリューションに基づいて私が思いついた

nnoremap <expr> n 'Nn'[v:searchforward].(&fdo=~'search\\|all'?'zv':'')
nnoremap <expr> N 'nN'[v:searchforward].(&fdo=~'search\\|all'?'zv':'')

これらのマッピングもfoldopen設定に従います


0

SearchIndexプラグインを使用しています。クリスチャンBrabandtの答えを使用していますが、試合数、各時間Iタイプを表示するプラグインの機能を維持するために、nまたはN、私は私のvimrcでこれを置きます:

nnoremap <silent><expr> n (v:searchforward ? 'n' : 'N') . ":SearchIndex<CR>"
nnoremap <silent><expr> N (v:searchforward ? 'N' : 'n') . ":SearchIndex<CR>"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.