vimで現在の行に一致する行を検索する方法


11

通常はで単語を検索しますが:/string、現在の行全体を検索する必要がある場合は、その方法を調べます。

event: 1  beacon: 0x02              //line 1
event: 19 beacon: 0x02              //line 2
event: 1  beacon: 0x03              //line 3
event: 1  beacon: 0x02              //line 4
event: 8  beacon: 0x01              //line 5
event: 19 beacon: 0x02              //line 6
event: 1  beacon: 0x02              //line 7

たとえば、現在の行全体を含むテキストの場合cursorline 1同じように検索する方法が現在ある場合:/。カーソルは次に一致するline 4にジャンプし、再びline 7

回答:


7

ここに私がそれをする方法があります:

  1. 最後に改行を含めずに、行を(名前のないレジスターに)ヤンクします。 0y$
  2. 非常にnomagic検索を開始します。/\V
  3. ヤンク線を追加します。 <c-r>"
  4. 検索を開始します。 <cr>

以下のよう@EvergreenTreeコメントで指摘し、あなたはもちろん、一度にすべてのステップを実行するためのマッピングを作成することができます。

nnoremap <leader>* 0y$/\V<c-r>"<cr>

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

:help registers
:help /magic
:help c_CTRL-R

注意:検索している行にバックスラッシュが含まれている場合でも、非常に単純な検索を行っても、バックスラッシュを通過してエスケープする必要があります(別のバックスラッシュを追加することにより)。


4
もちろん、あなたも、このためのマッピングを作成することができます: nnoremap {key} 0y$/\V<c-r>"<cr>
EvergreenTree

9

特にマッピングの目的で、私はgetline()自分でヤンクするよりもエレガントな方法を使用しています。getline()文字列で呼び出すと'.'、カーソルの下の行が返されます。これを使用するには、2つの適切なオプションがあります。

:exec '/' . getline('.')

文字列'/'getline()一緒に返されるものを解析し、それをvimコマンドとして実行します。

または

/<C-r>=getline('.')<CR>

式レジスタを使用します@=。次の式=は最初の式の後に評価<CR>され、コマンドラインに配置されます。


いいね!行に次のような文字が含まれている場合、/または'うまく機能しない場合。とにかく、今日は何かを学びます!ありがとう
Luc M

4

個人的には、ビジュアルスタープラグインを入手します(そこにはほとんどありません)。これについては素晴らしいVimcastがあります:選択したテキストを検索します。つまり、視覚的に線を選択してを押すことができます*

プラグインがあなたのものではない場合は、次のマッピングをに追加できますvimrc

xnoremap * :<c-u>let @/=@"<cr>gvy:let [@/,@"]=[@",@/]<cr>/\V<c-r>=substitute(escape(@/,'/\'),'\n','\\n','g')<cr><cr>

注:<c-v>このマッピングではビジュアルブロック()はサポートされていません。


マッピングを追加しましたが、実際には最初に一致した単語にジャンプし、行全体を選択していません。
manav mn 2016

単語と一致する場合は*、通常モードから使用しているか、マッピングが正しくインストールされていないと考えられます。
Peter Rincker、2016年

4

パターンの一部として解釈される特定の項目が行に含まれている場合、既存の回答はすべて失敗します。\Vポイントはそこに道のほとんどを取得しますが、それでもバックスラッシュで台無し。

これを試して、バックスラッシュをエスケープしてください...

/\V<C-R>=escape(getline('.'), '\')

そして、マッピングでそれを使用している場合、それが<Enter>どのように機能するかに応じて、最後に1つまたは2つのが必要になります。


素晴らしい答えです!行には、他の回答を混乱させる両方の種類のスラッシュが含まれていることがよくあります。ただし、エスケープの最後の引数にはスラッシュも含める必要がありますescape(…, '/\')
。– bobbogo

2

VIM-アスタリスクはちょうど使用インストールV$*(または0v$*現在の行を選択して、それを検索するため)。

0カーソルがすでに行の先頭にある場合、2番目のコマンドは必要ありません。


1
*カーソルの下の単語を検索するだけでなく、現在の視覚的な選択も検索しませんか?
EvergreenTree

1
@EvergreenTreeプラグインのことを忘れていました。通知ありがとう
adelarsq

2

これを行うもう1つの方法は、コマンドラインウィンドウを使用することです。 yy/<Ctrl-F>p<Enter>

  • 必要な行全体をヤンク yy
  • /Ctrlキーを押しながらFキーを押して、コマンドラインウィンドウを開きます
  • を押しpて行を貼り付けます
  • Enterキーを押して検索を開始します

5
q/と同じ効果を得るために使用することもできます/<c-f>
evilsoup

2

http://vim.wikia.com/wiki/Searching_for_expressions_which_include_slashesは、次のように検索レジスターを直接設定できることを示しています。

:let @/='/abc/def/ghi/'

これにより、行の検索が可能になり、行にスラッシュが含まれている場合でも機能します。

たとえば、\*行検索にマップするには、次のようにします。

nnoremap <leader>* :set hlsearch<cr>:let @/=getline('.')<cr>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.