2011-10-21 12 views
13

Sto provando ad eseguire 'base64 --decode' su un pezzo di testo selezionato in modalità visiva, ma il comando base64 sembra essere passato all'intera linea, non solo la selezione che ho fatto.Esecuzione di 'base64 --decode' su una selezione in vim

sto selezionando il testo in modalità visiva, quindi entrare in modalità normale in modo che la mia linea di comando è simile al seguente:

:'<,'>!base64 --decode 

Come devo solo passare il pezzo selezionato della linea di base64 --decode ?

Grazie in anticipo

+0

Vuoi sostituire il testo selezionato? –

+0

La sostituzione sarebbe OK, anche l'output normale alla console sarebbe OK. – Jonatan

risposta

15

Se il testo per passare al comando shell si approssima ad un registro (ad esempio, al registro senza nome), si può usare il seguente comando.

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

E 'possibile combinare la copia del testo selezionato ed eseguendo il comando in un unico passaggio utilizzando una mappatura Visual mode.

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

La mappatura può essere modificato per sostituire il testo selezionato con l'output del comando shell utilizzando registro espressione.

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

È possibile associare il primo esempio a una nuova scheda vim? – shredding

+0

O come farei una macro se lo fosse? – shredding

+1

@shredding: basta aggiungere un comando che apre un buffer vuoto in una nuova pagina di tabulazione tra copiare e chiamare 'base64':': vnoremap 64 y: tabe \ | pu! = System ('base64 -d', @@) '. –

4

Se si desidera sostituire il testo con l'uscita di base64, usare qualcosa come

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

È possibile utilizzare Python al posto che dovrebbe funzionare.

Selezionare le linee che si desidera decodificare in modalità visiva (V), quindi eseguire il seguente comando:

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

Base64 codifica/decodifica regione visivo-selezionato nel buffer e appunti, mettere questo in ~/.vimrc, e utilizzare F2 per codificare la selezione, e F3 per decodificare selezione

" 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

Ecco uno script che utilizza Python e il modulo base64 per fornire base64 decodificare e enc comandi di ode Sarebbe piuttosto semplice supportare qualsiasi altro programma base64, purché risulti dallo stdin - basta sostituire python -m base64 -e con il comando di codifica e python -m base64 -d con il comando di decodifica.

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() 

Alcune caratteristiche questo prevede:

  • Supporta gamme, converte solo la linea corrente di default (utilizzare :%Base64Encode per codificare l'intero file, per esempio, e che funzionerà come previsto dal di dentro modalità visiva, anche se converte solo intere righe)

  • Non lascia l'output rientrato: tutti i rientri (tabulazioni/spazi) sono codificati in base64 e quindi conservati durante la decodifica.

  • supporti essendo in combinazione con altri comandi con |

rilevanti :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