函数中带有参数的 vglobal,将文本文件过滤到临时文件中

vglobal with parameter in function, to filter textfile into temporary file

我有一个文本文件,我想过滤其中的模式,以便快速浏览。我在 vim 中的常规方法是通过 :v/pattern/d 进行过滤。这工作正常,但如果我不小心保存了文件,在我进行过滤后,我丢失了未过滤的信息。

为了避免这种情况,我搜索了一个不会意外破坏原始文本文件的解决方案。

我当前的解决方案是将纺织品读入一个临时文件,然后 运行 该文件上的过滤器。但是如果我尝试搜索类似 ^linestart 的内容,该功能将不起作用。此外,我想强调搜索模式,它也没有按预期工作。

这是我在 vim 脚本中的函数:

function! FilterJournal(pattern)
    :exe 'e ~/tempfile'
    " delete all existing lines
    :1,$d
    :exe 'r ~/journal.txt'
    :exe 'silent v/ ' . a:pattern . '/d'
    " to highlight the search pattern
    :exe 'silent / ' . a:pattern  

endfunction
:command! -nargs=1 Fijo :call FilterJournal("<args>")  

当我运行命令时:Fijo foo我得到了结果,但是突出显示不起作用。

当我 运行 命令时:Fijo ^foo 我收到一些错误消息并且临时文件为空:

Error during execution of "function FilterJournal":
Line 6: 
E486: Pattern not found: ^foo

如何过滤我的文本文件而不意外破坏它让我的函数工作?

试一试,它会拉出匹配的行并将其显示在 vsplit 缓冲区中:

function! FilterIt(pat)
    call setreg('x', '')
    call setreg('/', a:pat)
    exec 'g/'.a:pat.'/y X'
    exec 'vsp /tmp/t'       
    exec 'norm! ggVG"xp'
endfunction

:command! -nargs=1 Fijo :call FilterIt("<args>")

如果你真的想“快速了解”,你可以简单地做:

:g/pattern

打印匹配行而不影响缓冲区。

您可以根据自己的功能尝试一下。请注意

  • v/ 中的space导致E486: Pattern not found
  • 我试过 set hlsearch 但在这种情况下它不起作用。但是,:match 在当前缓冲区
  • 中突出显示效果很好
  • 不需要前导:
function! FilterJournal(pattern)
    exe 'e ~/tempfile'
    " delete all existing lines
    1,$d
    exe 'r ~/journal.txt'
    exe 'v/' . a:pattern . '/d'

    " to highlight the search pattern
    exe 'match Search /' . a:pattern . '/'
endfunction

:command! -nargs=1 Fijo :call FilterJournal("<args>")