如何在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

例如,if cursor目前在line 1如何类似于:/包含整个当前行的文本的搜索中。光标应跳到匹配line 4,然后再跳到line 7

Answers:


7

这是我的处理方式:

  1. 将行插入(进入未命名的寄存器),而不在末尾包括换行符: 0y$
  2. 启动一个非常神奇的搜索:/\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()用字符串调用'.'将返回光标下方的行。使用此方法有两个不错的选择:

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

它解析字符串'/'getline()一起返回的内容,并将其作为vim命令执行。

要么

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

使用表达式寄存器@=。随后的表达式=在第一个之后求值,<CR>并放在命令行中。


真好!当该行包含like字符/'行不通时。无论如何,我今天学到了一些东西!谢谢
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

如果匹配一个单词,那么我认为您使用的*是普通模式,或者未正确安装映射。
Peter Rincker '16

4

如果您的行中包含某些被解释为模式一部分的项目,则现有答案都将失败。该\V点获得大部分的方式出现,但仍用反斜杠弄乱。

试试这个来逃避反斜杠...

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

然后,如果您在映射中使用它,则最后需要一到两个<Enter>秒,具体取决于您希望它如何工作。


很好的答案!行通常包含两种斜线,这会混淆其他答案。关于逃脱的最后一个论点也应包括正斜杠:escape(…, '/\')
bobbogo

2

随着VIM星号安装的只是使用V$*(或0v$*)选择当前行和搜索。

0如果光标已经在行的开头,则在第二个命令中是不必要的。


1
*不仅搜索光标下的单词,也不搜索当前的视觉选择吗?
EvergreenTree

1
@EvergreenTree我确实忘记提及插件了。感谢您的通知
adelarsq


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.