我已经开始学习 Vim 单词搜索,当光标位于当前单词上时使用*
和。#
但这种搜索仅限于当前文件缓冲区。
是否有命令或快捷方式可以将此搜索扩展到:
- 所有打开的选项卡?
- 所有打开的缓冲区?
答案1
这实际上是默认行为,尽管可能很难注意到:*
然后尝试更改到另一个选项卡并在命令模式下使用n
ansN
在搜索命中之间向前和向后跳转。
如果首先为所有命中打开突出显示,这可能会更有意义:
:set hlsearch
答案2
我没有针对您的问题的确切解决方案,希望能找到比我更好的答案。但这就是我解决在所有缓冲区中查找单词的问题的方法。
" enables to search in all open buffers with :Search <pattern>
command! -nargs=1 Search call setqflist([]) | silent bufdo grepadd! <args> %
nnoremap <left> :cprev<cr>zvzz
nnoremap <right> :cnext<cr>zvzz
第一行创建一个Search
以搜索模式作为参数的命令,它将结果写入快速修复列表中。另外两行将(至少对我来说)无用的箭头键映射到有用的东西;它们被映射为跳转到下一个/上一个搜索或下一个/上一个编译错误等,它们只是单步执行快速修复列表。您可以按如下方式使用它:
:Search foobar
<right>
<right>
…
答案3
:bufdo vimgrepadd yoursearchterm % | copen
答案4
由于我发现自己经常这样做,所以我混合了一个(可改进的)脚本。
您或其他人可能会发现它很有用。
简短说明:
基本上它搜索缓冲区列表并在快速修复窗口中显示结果。
添加了两个基本命令。
Search <pattern>
:搜索所有缓冲区中的<pattern>
。Search1 <pattern>
:在所有缓冲区中搜索<pattern>
,但仅显示每个缓冲区的第一个结果。通常可用于列出foo
使用函数、变量(或其他内容)的所有缓冲区。
使用 bang ( :Search! foo
) 附加到结果中。
另外,还添加了GSearch
and GSearch1
,区别在于Search
脚本添加了正则表达式分隔符,例如:
foo -> /foo/
GSearch
正如预期它被封闭的地方。
j
始终添加该标志以防止跳转。
代码:
有一些技巧可以防止错误列出,同时保持代码简短。try / catch
上有点麻烦bufdo
。
let s:not_idents = split("/!#$%&\"`´¨'¯()*+,-.:;<=>?¿@[\]^{|}µ¶·¸~±×÷®©«»¬ª°º¹²³¼½¾", '\zs')
" Create a delimited pattern. "
fun! s:Parse_pat(pat)
for c in s:not_idents
if stridx(a:pat, c) == -1
return c . a:pat . c
endif
endfor
echohl Error
echom "Could not delimit pattern '". a:pat ."'"
echohl None
return ''
endfun
fun! s:AllBufSearch(pat, bang, uno, isg)
if a:isg
let pat = a:pat
else
let pat = s:Parse_pat(a:pat)
endif
if pat == ''
return
endif
cclose
let [_buf, _view] = [bufnr("%"), winsaveview()]
let _foldenable = &foldenable
set nofoldenable
" Copy of current qflist. "
let qfc = getqflist()
" Hack to prevent error if no matches. "
call setqflist([{}])
silent execute "bufdo vimgrepadd! " . pat . "j %"
" Restore "
exec "buffer " . _buf
let &foldenable = _foldenable
call winrestview(_view)
" Fix "
let qf = getqflist()
call remove(qf, 0)
" Only one listing per buffer. "
if a:uno
let bn = {}
let i = 0
for m in qf
if has_key(bn, m["bufnr"])
call remove(qf, i)
else
let bn[m["bufnr"]] = 1
call remove(qf[i], "valid")
let i += 1
endif
endfor
endif
if a:bang == "!"
let qf = qfc + qf
endif
" If any matches, copen. "
if len(qf)
call setqflist(qf)
copen
endif
endfun
command! -nargs=1 -bang Search call s:AllBufSearch(<q-args>, "<bang>", 0, 0)
command! -nargs=1 -bang Search1 call s:AllBufSearch(<q-args>, "<bang>", 1, 0)
command! -nargs=1 -bang GSearch call s:AllBufSearch(<q-args>, "<bang>", 0, 1)
command! -nargs=1 -bang GSearch1 call s:AllBufSearch(<q-args>, "<bang>", 1, 1)