Vim - 复制到搜索寄存器

91

有没有一种简单/快速的方法可以将内容“yank”到vim的“last search”寄存器(“/”)中?

从vim文档中看来,似乎答案是否定的,但可以通过“let”命令进行分配:

It is writable with ":let", you can change it to have 'hlsearch' highlight
other matches without actually searching.  You can't yank or delete into this
register.

理想情况下,我想做的是这样的:

"/5yw

该命令会将光标下的接下来的5个单词删除并放入最后一次搜索的缓冲区中。

或者,如果有一种方法可以搜索命名寄存器中的内容,那也可以。换句话说,如果我能这样做:

"A5yw

如果你想搜索寄存器A中的内容,也可以这样做。

我能想到的最接近的方法是将其复制到一个命名寄存器中,然后将该寄存器复制到最后一次搜索的寄存器中,例如:

"A5yw
:let @/=@A

冒着让一个长问题变得更长的风险,我想声明并不总是我想要“yank & search”的5个单词——有时是17个字符,有时是到行尾等等... 因此硬编码宏并不能给我想要的灵活性。

5个回答

128

在按下/进入搜索字符串后,您可以使用Ctrl-R,然后键入表示要使用的寄存器的字母。

例如:

  • 首先,使用"Ayw将一个单词复制到寄存器A。
  • 然后,使用/^R A将寄存器A中的内容放入搜索字符串中。

1
当然,这个方法可以实现,但是看起来楼主可能并不想搜索,只是想要高亮显示。如果是这样的话,使用自定义运算符会更好。 - Cascabel
1
太棒了 - 谢谢,这正是我需要的(尽管在第一时间找到完美的解决方案是不可能的情况下)。感谢提供简明扼要的解决方案。 - Dan
15
仅仅是一条评论... "Ayw不会将单词拉到寄存器'A'中... 它会将被拉取的内容附加到'a'寄存器。" - jkerian
1
+1 已经寻找了一段时间,这是解决我尝试解决的问题的完美解决方案 - 谢谢。 - iblamefish
9
为了更清晰地说明,vim使用寄存器的大小写来确定是追加还是替换内容,因此"ayw(小写)会替换寄存器'a'的内容,而"Ayw会将内容追加到寄存器'a'中。 - Peter Gibson
显示剩余2条评论

51

如果您没有使用任何寄存器来存储复制的文本,vim将使用 0 寄存器。您可以在输入 / 后键入 Ctrl-R 0 来搜索该寄存器。

一个更复杂的例子。假设您想在另一个缓冲区中搜索当前光标下的引号内文本:

  • 您可以使用yi"(复制引号内的内容)
  • 进入要搜索的缓冲区
  • 键入 /Ctrl-R 0

2
我发现这个解决方案比使用“a'r”更有用,因为重复执行“'Ayw”会在寄存器A中产生一个附加的字符串。但是,在输入“/”后仅键入“yw”,然后键入“Ctrl-R 0”始终会给出我所拷贝的内容。 - David Jung
2
这个解决方案更好。大多数情况下,我在抓取时不指定寄存器。 - Jyhonn

10
我正在使用以下代码:
vnoremap <silent>* <ESC>:call VisualSearch('/')<CR>/<CR>
vnoremap <silent># <ESC>:call VisualSearch('?')<CR>?<CR>

    function! VisualSearch(dirrection)
        let l:register=@@
        normal! gvy
        let l:search=escape(@@, '$.*/\[]')
        if a:dirrection=='/'
            execute 'normal! /'.l:search
        else
            execute 'normal! ?'.l:search
        endif
        let @/=l:search
        normal! gV
        let @@=l:register
    endfunction

1
如果不清楚的话,这允许您在可视模式下选择一些文本,并使用*或#搜索该文本。 - Edward Anderson

8

查找一个选择:

如果您想首先抽取行的一部分,然后使用“v”键并使用光标移动,直到标记您想要的内容,然后按“y”键进行复制,现在选择已存入寄存器0

然后您可以输入/Ctrl-R 0


5

基本上是#和*命令的扩展版本,对吧?听起来你想定义一个自定义操作符(一个需要动作的命令)。我从未实际尝试过这样做,但我找到了一个插件,看起来可能会更容易实现。提供了一些示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接