我的问题很简单。我搜索文件中的特定模式(比如说Tex文件中的标签)
:g/label/#
但有很多事情发生。所以我想将此输出重定向到另一个文件,以便能够轻松使用它。
你有一个我不知道的技巧或命令吗?
答案 0 :(得分:12)
从原始帖子中我不清楚“用它轻松工作”是什么意思,但在缓冲区中查看并快速跳转所有匹配项而不将“匹配”提取到单独的缓冲区中通常很有用。
vim内置了一个内部grep。你的例子就是这样的(在vim中,%
表示当前文件)
:vimgrep /label/ %
这将带您到第一次出现并报告有多少匹配。很酷的是你可以通过使用
打开quickfix错误列表来查看列出的所有匹配项:cope
现在您可以滚动并按一行上的enter
跳转到匹配的确切位置。
如果从vim内部运行make并且编译器抛出错误,则quickfix错误列表与您使用的缓冲区完全相同:它会为您提供错误内容和位置的列表。
跳转到quickfix指向的某个位置后,您可以通过:cn
和:cp
在列表中前进和后退。 :ccl
关闭错误列表。
您还可以通过:vimgrepa /newpattern/ %
或:vimgrepadd
(记录的)警告是vim的内部grep比大多数本机grep实现慢(但是你确实在windows中“免费”获取它)。如果你确实安装了grep,你可以使用:grep而不是:vimgrep来获得类似的结果。
引用:help grep
Vim有两种方法可以找到a的匹配 模式:内部和外部。该 内部grep的优点是 它适用于所有系统并使用 强大的Vim搜索模式。一个 外部grep程序可以在何时使用 Vim grep不会对你做什么 想。
内部方法会比较慢, 因为文件被读入内存。 优点是: - 自动识别行分隔符和编码,就像文件一样 正在编辑。 - 使用Vim搜索模式。可以使用多线图案。 - 启用插件时:可以搜索压缩文件和远程文件。
如果您已使用错误列表处理编译错误,也可以使用位置列表。只需将l
(对于location
)添加到grep命令的开头(:lvimgrep
,:lvimgrepa
:lgrep
,:lgrepa
)并使用{{ 1}} :lopen
:ln
:lp
代替:lcl
个。
有关更多命令,请参阅
:c*
答案 1 :(得分:4)
:redir > matches.txt|execute 'g/foo/#'|redir END
参见:h :redir
,您还可以重定向到寄存器,变量,剪贴板等。
答案 2 :(得分:3)
您正在执行的操作主要是命令行中的'grep -n label file '。所以你可以运行那个命令>它很容易变成文件。
'grep'的推导甚至来自基本相同的来源。
答案 3 :(得分:2)
我在某个时候得到了这个网:
function GoToLine(mainbuffer)
let linenumber = expand("<cword>")
silent bd!
silent execute "buffer" a:mainbuffer
silent execute ":"linenumber
silent nunmap <Enter>
endfunction
command -nargs=1 GoToLine :call GoToLine(<f-args>)
function GrepToBuffer(pattern)
let mainbuffer = bufnr("%")
silent %yank g
enew
silent put! g
execute "%!egrep -n" a:pattern "| cut -b1-80 | sed 's/:/ /'"
silent 1s/^/\="# Press Enter on a line to view it\n"/
silent :2
silent execute "nmap <Enter> 0:silent GoToLine" mainbuffer "<Enter>"
" silent nmap <C-G> <C-O>:bd!<Enter>
endfunction
command -nargs=+ Grep :call GrepToBuffer(<q-args>)
将它放在.vimrc中,然后:Grep Foo
需要外部grep程序才能正常工作。
答案 4 :(得分:0)
(只是一个想法 - 未经测试。)
您可以删除包含图案的所有行,写入另一个文件,然后撤消删除。
:g/label/d
:w matches
u