2011-10-21 8 views
13

Estoy tratando de ejecutar 'base64 --decode' en un fragmento de texto seleccionado en modo visual, pero el comando base64 parece estar pasado toda la línea, no solo la selección que hice.Ejecutando 'base64 --decode' en una selección en vim

Estoy seleccionando el texto en el modo visual, a continuación, entrar en el modo normal, de modo que mi línea de comandos es el siguiente:

:'<,'>!base64 --decode 

Cómo debería pasar únicamente la pieza seleccionada de la línea de base 64 --decode ?

Gracias de antemano

+0

¿Quieres reemplazar el texto seleccionado? –

+0

Reemplazar estaría bien, la salida simple a la consola estaría bien también. – Jonatan

Respuesta

15

Si el texto para pasar al comando Shell es un tirón a un registro (por ejemplo, al registro sin nombre), se puede utilizar el siguiente comando.

:echo system('base64 --decode', @") 

Es posible combinar la copia del texto seleccionado y ejecutar el comando en un solo paso utilizando un mapeo modo Visual.

:vnoremap <leader>64 y:echo system('base64 --decode', @")<cr> 

El mapeo puede modificarse para reemplazar el texto seleccionado con la salida del comando shell mediante registro de expresión.

:vnoremap <leader>64 c<c-r>=system('base64 --decode', @")<cr><esc> 
+1

¿Es posible hacer eco del primer ejemplo en una nueva pestaña vim? – shredding

+0

¿O cómo haría una macro si fuera así? – shredding

+1

@shredding: Simplemente agregue un comando abriendo un búfer vacío en una nueva página de pestañas entre copiar y llamar a 'base64':': vnoremap 64 y: tabe \ | pu! = System ('base64 -d', @@) '. –

4

Si desea reemplazar el texto con la salida de base64, usar algo como

:vnoremap <leader>64 y:let @"=system('base64 --decode', @")<cr>gvP 
5

Se puede utilizar en lugar de Python que debe trabajar.

líneas de selección que desea decodificar en el modo visual (V), a continuación, ejecutar el siguiente comando:

:'<,'>!python -m base64 -d 
0

base 64 de codificación/decodificación región visual seleccionada en tampón y el portapapeles, poner esto en ~/.vimrc, y utilizar F2 para codificar la selección, y F3 para decodificar la selección

" 1. base64-encode(visual-selection) -> F2 -> encoded base64-string 
:vnoremap <F2> c<c-r>=system("base64 -w 0", @")<cr><esc> 

" 2. base64-decode(visual-selection) -> F3 -> decoded string 
:vnoremap <F3> c<c-r>=system("base64 -d", @")<cr> 
0

Aquí hay un script que usa Python y el módulo base64 para proporcionar decodificación base 64 y enc comandos de oda. Sería bastante sencillo admitir cualquier otro programa base64, siempre que se lea desde stdin: simplemente reemplace python -m base64 -e con el comando de codificación y python -m base64 -d con el comando de decodificación.

function! Base64Encode() range 
    " go to first line, last line, delete into @b, insert text 
    " note the substitute() call to join the b64 into one line 
    " this lets `:Base64Encode | Base64Decode` work without modifying the text 
    " at all, regardless of line length -- although that particular command is 
    " useless, lossless editing is a plus 
    exe "normal! " . a:firstline . "GV" . a:lastline . "G" 
    \ . "\"bdO0\<C-d>\<C-r>\<C-o>" 
    \ . "=substitute(system('python -m base64 -e', @b), " 
    \ . "'\\n', '', 'g')\<CR>\<ESC>" 
endfunction 

function! Base64Decode() range 
    let l:join = "\"bc" 
    if a:firstline != a:lastline 
     " gJ exits vis mode so we need a cc to change two lines 
     let l:join = "gJ" . l:join . "c" 
    endif 
    exe "normal! " . a:firstline . "GV" . a:lastline . "G" . l:join 
    \ . "0\<C-d>\<C-r>\<C-o>" 
    \ . "=system('python -m base64 -d', @b)\<CR>\<BS>\<ESC>" 
endfunction 

command! -nargs=0 -range -bar Base64Encode <line1>,<line2>call Base64Encode() 
command! -nargs=0 -range -bar Base64Decode <line1>,<line2>call Base64Decode() 

Algunas de las características que esto proporciona:

  • Soporta rangos, se convierte sólo la línea en curso por defecto (:%Base64Encode utilizar para codificar todo el archivo, por ejemplo, y que funcionará como se esperaba desde dentro modo visual, aunque solo convierte líneas enteras)

  • No deja sangría a la salida: todas las sangrías (pestañas/espacios) están codificadas en base64 y se conservan al decodificar.

  • Soporta combinarse con otros comandos con |

relevantes :help tags: user-functions, func-range, i_0_CTRL-D, i_CTRL-R_CTRL-O, expr-register, system(), user-commands, command-nargs, command-range, :normal