如何通过Vim中的外部命令过滤不跨越整行的可视选择的内容?

如何通过Vim中的外部命令过滤不跨越整行的可视选择的内容?,vim,Vim,我想通过命令过滤Vim中的视觉选择。“我知道的方式”始终过滤视觉选择延伸的完整行: 在行中选择测试 this is a test 和打字 :'<,'>!echo "the result" 但我想: this is the result 您可以使用\%V在可视区域内进行匹配: :'<,'>s/\%V.*\%V/\=system('echo -n "the result"') :”考虑以下映射,它们遵循的行为行 过滤命令(请参见:helpg\*!\*和:help v\

我想通过命令过滤Vim中的视觉选择。“我知道的方式”始终过滤视觉选择延伸的完整行:

在行中选择测试

this is a test
和打字

:'<,'>!echo "the result"
但我想:

this is the result

您可以使用
\%V
在可视区域内进行匹配:

:'<,'>s/\%V.*\%V/\=system('echo -n "the result"')

:”考虑以下映射,它们遵循
的行为行
过滤命令(请参见
:helpg\*!\*
:help v\!

nnoremap!:set opfunc=ProgramFilterg@
vnoremap!:调用ProgramFilter(visualmode(),1)
功能!程序过滤器(vt,…)
让[qr,qt]=[getreg(“”),getregtype(““”)]
让[oai、ocin、osi、oinde]=[&ai、cin、si和inde]
塞特诺艾诺辛诺西酒店=
让[sm,em]=['['[a:0]]
exe'norm!`.sm.a:vt.`.em.x'
调用inputsave()
设cmd=input(“!”)
调用inputrestore()
排放=系统(cmd,@”)
释放=替换(释放“\n$”,“,”)
exe“norm!i\=out\r”
let[&ai,&cin,&si,&inde]=[oai,ocin,osi,oinde]
调用setreg(“”,qr,qt)
端功能

谢谢,这是可行的,但是有点长。使用shell命令作为参数的vmap看起来会是什么样子?。当然,在我的示例中,命令不依赖于可视选择,通常情况下也是如此。因此,如何将可视选择作为参数传递给命令?非常好!很抱歉,我的问题不是这样太精确(与kev相同)它实际上针对的是我想同时执行这两项操作的最一般情况:1)将可视选择传递给命令2)使用短命令在vim中指定此命令;即vim命令应将示例中的“base64--decode”作为参数。换句话说,它应有效地执行与filter命令相同的操作,仅适用于vis仅适用于逻辑选择,不完整的行。@user429540:现在我明白了。请查看更新的答案,其中列出了为实现该过滤命令而编写的映射。我如何调用它?:“@user429540:Leader是一个可配置的键,便于创建映射(请参见
:help mapleader
);默认情况下,它是反斜杠字符。上述映射的使用方式应与默认的
过滤相同:在视觉模式下选择一段文本,然后按引线键(默认情况下也是反斜杠),然后按
;或者不选择任何内容,按此键组合,然后使用运动命令(例如
w
w
等)。另请参见“”。
:'<,'>s/\%V.*\%V/\=system('echo -n "the result"')
nnoremap <silent> <leader>! :set opfunc=ProgramFilter<cr>g@
vnoremap <silent> <leader>! :<c-u>call ProgramFilter(visualmode(), 1)<cr>
function! ProgramFilter(vt, ...)
    let [qr, qt] = [getreg('"'), getregtype('"')]
    let [oai, ocin, osi, oinde] = [&ai, &cin, &si, &inde]
    setl noai nocin nosi inde=

    let [sm, em] = ['[<'[a:0], ']>'[a:0]]
    exe 'norm!`' . sm . a:vt . '`' . em . 'x'

    call inputsave()
    let cmd = input('!')
    call inputrestore()

    let out = system(cmd, @")
    let out = substitute(out, '\n$', '', '')
    exe "norm!i\<c-r>=out\r"

    let [&ai, &cin, &si, &inde] = [oai, ocin, osi, oinde]
    call setreg('"', qr, qt)
endfunction