函数中带有参数的 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>")
我有一个文本文件,我想过滤其中的模式,以便快速浏览。我在 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>")