我是vim的新手,还在探索它的一些功能.我有vimgrep的问题.我可以搜索vimgrep /define/ **
这样的模式,以便找到并打开包含a的下一个文件define
.但我还不知道如何转到与我的模式匹配的下一个文件/行.有什么指针吗?
在vim中,我经常使用vimgrep进行搜索.我有如下映射:
map <leader>s :execute "noautocmd vimgrep /\\<" . expand("<cword>") . "\\>/gj **/*.*" <Bar>
cw<CR> 5
Run Code Online (Sandbox Code Playgroud)
问题是我不想搜索一些临时子文件夹(如obj,objd).如何排除与给定模式匹配的子文件夹.例如,前缀为"objd"的子文件夹不应包含在搜索中.
我ag
在Vim中使用字符串/文件搜索效果很好.
然而,似乎没有太多文档如何为ag构建模式.
我试图在Practical Vim的一个例子中使用ag而不是vimgrep.
我希望在递归中的目录中的所有文件中找到"Pragmatic Vim"的每一个出现,并用"Practical Vim"替换该字符串.在某些文件中还有"Pragmatic Bookshelf",并且该字符串必须保留.
这本书暗示了这种方法:
/Pragmatic\ze Vim
:vimgrep /<C-r>// **/*.txt
Run Code Online (Sandbox Code Playgroud)
然后,在该步骤之后,使用:Qargs
plugin命令填充quickfix list ,最后:argdo %s//Practical/g
现在,我如何指定/Pragmatic\ze
模式使用ag
?
是ag
在所有设计什么,我想在这里做什么?
有没有人知道Vimgrep的语法搜索多个文件globs?我试图使用此命令在当前目录中搜索.
map <F3> :execute "vimgrep /" . expand("<cword>") . "/j **/*.c* *.txt" <Bar> cw<CR>
Run Code Online (Sandbox Code Playgroud)
使用此命令,Vim仅搜索*.c*
.有关如何搜索多种文件类型的任何想法?
我正在阅读Vim中的大型C++代码库.
在一个文件中,我可以做到
/foo
n
n
n
Run Code Online (Sandbox Code Playgroud)
现在,如果我想搜索多个文件,我必须这样做:
:vimgrep /foo/
:cn
:cn
:cn
Run Code Online (Sandbox Code Playgroud)
现在,打字:cn
比不那么方便n
.有没有办法搜索vimgrep结果n
(比如搜索/
)而不是:cn
?
我想写一个函数myFunc,这样:
myFunc /function foo/
Run Code Online (Sandbox Code Playgroud)
变
:vimgrep /function foo/ **/*.cpp **/*.hpp
Run Code Online (Sandbox Code Playgroud)
和
myFunc /class bar: public/
Run Code Online (Sandbox Code Playgroud)
变
vimgrep /class bar: public/ **/*.cpp **/*.hpp
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?
谢谢!
在我的vimrc中,我有一个映射来查找其中包含TODO的所有行,并将它们放在quickfix窗口中:
nnoremap <leader>f :vimgrep /TODO/j % \| :cw<CR>
Run Code Online (Sandbox Code Playgroud)
我现在想以相同的方式添加替代模式FIXME.所以我试过了
nnoremap <leader>f :vimgrep /TODO\|FIXME/j % \| :cw<CR>
Run Code Online (Sandbox Code Playgroud)
和
nnoremap <leader>f :vimgrep /TODO<bar>FIXME/j % \| :cw<CR>
Run Code Online (Sandbox Code Playgroud)
但是没有返回任何结果.
vimgrep /TODO|FIXME/j %
Run Code Online (Sandbox Code Playgroud)
在手动输入时,在:提示符下工作.到目前为止,我的解决方法是:
function! FindFixme()
vimgrep /TODO\|FIXME/j %
cw
endfunction
nnoremap <leader>f :call FindFixme()<CR>
Run Code Online (Sandbox Code Playgroud)
但我真的不明白为什么我不能让它作为单个地图命令工作.
谢谢.
当我使用vim时,我偶尔会得到一个像这样的分割菜单设置:
###############################################
# | | #
# | | #
# NERDTree | main window | tagbar #
# | | #
# | | #
###############################################
Run Code Online (Sandbox Code Playgroud)
即使标签栏关闭,我也可能会得到类似的设置,例如当我比较不同的文件时.
但是,当我执行vimgrep命令时,结果(显示在quickfix列表中)仅显示在主窗口下方,当标签栏(或右侧的其他分割)关闭时.
因此,此设置每次都能正常工作:
###############################################
# | #
# | #
# NERDTree | main window #
# | #
# | #
# |__________________________________#
# | #
# | quickfix list: vimgrep results #
# | #
###############################################
Run Code Online (Sandbox Code Playgroud)
......虽然这不是:
###############################################
# | | #
# | | #
# NERDTree | …
Run Code Online (Sandbox Code Playgroud) 为什么他们使用双星号?
我读过Vim的帮助上vimgrep
,我看了看周围的堆栈溢出和vimcasts并同时我发现很多人说这是怎么你在当前目录中递归搜索,我还没有找到一个解释,为什么。
让我们用一个例子来更容易解释。如果我想在当前目录下查找所有出现的 foo,我可以使用
:vim[grep][!] /{pattern}/[g][j] {file}
Run Code Online (Sandbox Code Playgroud)
这样就变成
:vimgrep /foo/ **/*
Run Code Online (Sandbox Code Playgroud)
所以看看{file}
这个grep的部分:
*
) 是通配符。我的具体问题是为什么它以
**/*
并不是
*/*
我已经尝试在几种不同的情况下使用/进行搜索,这似乎是在距我当前目录正好 1 深的任何目录中搜索任何文件,我认为这就是使用双星号的原因。
即为什么它是一个双星号?这是否通过一些我不完全理解的巧妙机制表示“我希望您递归搜索”,或者这只是一个用于表示“递归搜索”的关键字?我是否完全关闭,这不是 vim 的内置部分,而是外壳的一部分?(这些部分不是我的实际问题,而是有助于理解我的困惑,我的实际问题在上面)。
如果有什么方法可以改进我的问题,请告诉我,这是我第一次提问。
我想只在当前文件的视觉选择中搜索vimgrep而不是整个文件.这可能吗?怎么样?我无法通过Google或vim帮助查找此案例.
我想要这个的原因是因为我需要quicklist(copen
)中的结果,并且:g/FOO
显示底部的匹配行没有完成这项工作.