2012-03-09 13 views
7

Vorrei filtrare una selezione visiva in Vim tramite un comando. Il modo in cui so filtra sempre le linee complete su cui la selezione visuale si estende:Solo selezione visiva del filtro Vim non dell'intera riga

Selezione a test nella linea

this is a test 

e digitando

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

si tradurrà in

the result 

Ma io voglio:

this is the result 
+1

Eventuali duplicati di "[Esecuzione 'base64 --decode' su una selezione in vim] (http://stackoverflow.com/questions/7845671/executing-base64-decode-on-a-selection-in -vim)". –

risposta

3

considerare i seguenti mappature che aderiscono il comportamento dei formato da linee comandi ! di filtraggio (vedi :helpg \*!\* e :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

Molto bene! Scusa se la mia domanda non è stata troppo precisa (idem kev). In realtà stava prendendo di mira il caso più generale in cui voglio fare entrambe le cose: 1) passare la selezione visiva ad un comando 2) specificare questo comando in vim usando comandi brevi; cioè il comando vim dovrebbe prendere il 'base64 --decode' nell'esempio come argomento. – highsciguy

+0

In altre parole, dovrebbe fare esattamente lo stesso del comando filtro!, Solo per la selezione visiva, non per le linee complete. – highsciguy

+0

@ user429540: ora vedo. Dai un'occhiata alla risposta aggiornata che elenca i mapping scritti nel tentativo di implementare i comandi di filtraggio. –

3

È possibile utilizzare \%V per abbinare all'interno dell'area a vista:

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

Grazie, funziona, è un po 'lungo tuttavia. Come sarebbe un vmap lookk che prende il comando shell come parametro? – highsciguy

+1

.. e naturalmente nel mio esempio il comando non dipende dalla selezione visiva che può essere in generale il caso. Quindi, come posso passare la selezione visuale come argomento al comando? – highsciguy

Problemi correlati