重定向到Vim中的搜索文件

时间:2009-02-11 15:53:32

标签: vim

我的问题很简单。我搜索文件中的特定模式(比如说Tex文件中的标签)

:g/label/#

但有很多事情发生。所以我想将此输出重定向到另一个文件,以便能够轻松使用它。

你有一个我不知道的技巧或命令吗?

5 个答案:

答案 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