2012-03-09 12 views
7

Vimでビジュアル選択をフィルタリングしたいのですが、Vimフィルタはビジュアル選択だけで、行全体ではありません

ライン

this is a test 

a testを選択し、

:'<,'>!echo "the result" 

を入力するには

the result 
になります:私は知っている方法は、常に視覚的な選択が延びる上で完全な行をフィルタリング

しかし、私は欲しい:

this is the result 
+1

[vimの中での選択上で実行される 'base64で--decode']」の可能性のある重複(http://stackoverflow.com/questions/7845671/executing-base64-decode-on-a-selection-in -vim)」と入力します。 –

答えて

3

!は行単位 フィルタリングコマンドの動作を接着以下のマッピングを考えてみましょう(: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 
+0

非常に良い!申し訳ありませんが、私の質問はあまりにも正確ではありませんでした(同上)。実際には、私が両方をやりたい最も一般的なケースをターゲットにしていました。1)ビジュアル選択をコマンドに渡します。2)短いコマンドを使用してvimでこのコマンドを指定します。すなわち、vimコマンドはあなたの例では引数として 'base64 --decode'を取るべきです。 – highsciguy

+0

つまり、フィルタコマンドと同じように効果的に実行する必要があります。完全な行ではなく、視覚的な選択のみです。 – highsciguy

+0

@ user429540:今すぐ参照してください。そのフィルタリングコマンドを実装するために書き込まれたマッピングをリストアップした更新された回答を見てください。 –

3

あなたはビジュアルエリア内一致し\%Vを使用することができます。

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

ありがとうございますが、これは少し時間がかかります。どのようなvmapルックがシェルコマンドをパラメータとして受け取りますか? – highsciguy

+1

..もちろん私の例では、コマンドは一般的に可能な視覚的選択に依存しません。では、ビジュアル選択をコマンドの引数としてどのように渡すことができますか? – highsciguy

関連する問題