Vim - 拉入搜索寄存器
Posted
技术标签:
【中文标题】Vim - 拉入搜索寄存器【英文标题】:Vim - yank into search register 【发布时间】:2011-01-19 17:58:32 【问题描述】:是否有任何简单/快速的方法可以“拉”到 vim 的“最后搜索”寄存器 ("/)?
从 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
冒着使长问题更长的风险,我想声明它并不总是 5 个字我想“拉 & 搜索”——有时是 17 个字符,有时是到行尾,等等...所以硬编码的宏不能给我想要的灵活性。
【问题讨论】:
【参考方案1】:按/
输入搜索字符串后,您可以使用Ctrl-R
,然后输入代表您要使用的寄存器的字母。
例如。
首先,"Ayw
将一个单词拉入寄存器 A
然后,/ ^R A
将寄存器 A 的内容放入搜索字符串中。
【讨论】:
这当然有效,但听起来 OP 可能实际上并不想搜索,只是突出显示。如果是这种情况,自定义运算符将是可行的方法。 超级 - 谢谢你...这正是我所需要的(好吧,在完美的解决方案实际上是不可能的约束下。)感谢简洁的解决方案。 只是一个评论...“Ayw 不会将单词拉入寄存器'A'....它将被拉入的东西附加到'a'寄存器中。 +1 一直在寻找这个,完美解决我试图解决的问题 - 谢谢。 为了清楚起见 - vim 使用寄存器的大小写来确定它是附加还是替换内容,所以"ayw
(小写)将替换寄存器'a'的内容,而"Ayw
将附加到寄存器'a'【参考方案2】:
如果你没有使用任何寄存器来存储被抽出的文本,vim 使用0
寄存器。您可以通过在/
之后输入Ctrl-R 0
来搜索。
一个更复杂的例子。假设您想在另一个缓冲区中搜索当前光标下引号内的文本:
您可以使用yi"
来做到这一点(抽出内引号)
转到要搜索的缓冲区
输入/Ctrl-R 0
【讨论】:
我发现这个解决方案比 a'r 的解决方案更有用,因为重复执行"Ayw
会在寄存器 A 中生成一个附加字符串。但只需键入 yw
然后在 /
之后键入 Ctrl-R 0
总是给出了我拉的东西。【参考方案3】:
我正在使用以下代码:
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
【讨论】:
如果不清楚,这允许您在可视模式下选择一些文本,并使用 * 或 # 搜索该文本。【参考方案4】:搜索选择:
如果你想先拉出一行的一部分,然后使用“v”并用光标移动,直到你标记了你想要的,然后按 y 拉,现在选择在寄存器 0 中
然后你可以输入/Ctrl-R 0
【讨论】:
【参考方案5】:所以基本上是 # 和 * 命令的扩展版本,对吧?听起来您想定义一个自定义运算符(一个需要动作的命令)。我从来没有真正这样做过,但我确实找到了一个plugin,看起来它可能会让这样做更容易。提供了一些示例。
【讨论】:
以上是关于Vim - 拉入搜索寄存器的主要内容,如果未能解决你的问题,请参考以下文章