我想通過命令過濾Vim中的視覺選擇。我認識路總是過濾器在其視覺選擇將延伸的完整的生產線:僅限Vim過濾器視覺選擇不是整行
選擇a test
在該行
this is a test
並鍵入
:'<,'>!echo "the result"
將導致
the result
但我想:
this is the result
我想通過命令過濾Vim中的視覺選擇。我認識路總是過濾器在其視覺選擇將延伸的完整的生產線:僅限Vim過濾器視覺選擇不是整行
選擇a test
在該行
this is a test
並鍵入
:'<,'>!echo "the result"
將導致
the result
但我想:
this is the result
考慮下面的映射是堅持的!
面向行 過濾命令的行爲(見:helpg \*!\*
和:help v_!
)。
nnoremap <silent> <leader>! :set opfunc=ProgramFilter<cr>[email protected]
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
非常好!對不起,我的問題不是太精確(同上kev)。它實際上是針對最想做的兩種情況:1)將視覺選擇傳遞給命令2)在vim中使用短命令指定此命令;即vim命令應該以您的示例中的'base64 --decode'作爲參數。 – highsciguy 2012-03-12 11:19:08
換句話說,它應該像過濾命令一樣有效地執行,僅僅用於視覺選擇,而不是完整的行。 – highsciguy 2012-03-12 11:25:57
@ user429540:現在我明白了。查看更新的答案,列出爲實現該過濾命令而編寫的映射。 – 2012-03-12 13:47:54
您可以使用\%V
相匹配的可視區域內:
:'<,'>s/\%V.*\%V/\=system('echo -n "the result"')
謝謝,這個工程,但是有點長。 vmap會如何將shell命令作爲參數? – highsciguy 2012-03-09 17:29:08
..當然在我的例子中,命令並不依賴於一般情況下的視覺選擇。那麼我怎樣才能將視覺選擇作爲參數傳遞給命令呢? – highsciguy 2012-03-09 21:08:01
的「可能的複製[執行上在vim選擇 '的base64 --decode'](http://stackoverflow.com/questions/7845671/executing-base64-decode-on-a-selection-in -vim)」。 – 2012-03-10 08:47:54