2012-03-09 16 views
7

me gustaría filtrar una selección visual de Vim a través de un comando. La manera en que sé filtra siempre las líneas completas sobre las que la selección visual se extiende:filtro de Vim no solamente selección visual de toda la línea

Selección a test en la línea

this is a test 

y escribiendo

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

dará lugar a

the result 

Pero quiero:

this is the result 
+1

duplicado Posible de "[En ejecución '--decode base 64' en una selección en vim] (http://stackoverflow.com/questions/7845671/executing-base64-decode-on-a-selection-in -empuje)". –

Respuesta

3

considerar las siguientes asignaciones que se adhieren al comportamiento de los ! linewise comandos de filtrado (ver :helpg \*!\* y :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

¡Muy bien! Lamento que mi pregunta no fuera muy precisa (ídem kev). De hecho, se estaba enfocando en el caso más general en el que deseo hacer ambas cosas: 1) pasar la selección visual a un comando 2) especificar este comando en vim usando comandos cortos; es decir, el comando vim debería tomar el 'base64 --decode' en su ejemplo como argumento. – highsciguy

+0

En otras palabras, debería hacer lo mismo que el comando de filtro, solo para la selección visual solamente, no para las líneas completas. – highsciguy

+0

@ user429540: Ahora veo. Eche un vistazo a la respuesta actualizada que enumera las asignaciones escritas en un intento de implementar los comandos de filtrado. –

3

Puede utilizar \%V para que coincida con el interior de la zona visual:

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

Gracias, esto funciona, es un poco largo sin embargo. ¿Cómo sería un mapa de vmap que toma el comando de shell como parámetro? – highsciguy

+1

.. y, por supuesto, en mi ejemplo, el comando no depende de la selección visual que, en general, puede ser el caso. Entonces, ¿cómo puedo pasar la selección visual como argumento para el comando? – highsciguy

Cuestiones relacionadas