2011-10-21 6 views
13

Próbuję wykonać "base64 --decode" na fragmencie tekstu zaznaczonego w trybie wizualnym, ale wydaje się, że polecenie base64 zostało przekazane całej linii, a nie tylko wybór, który zrobiłem.Wykonywanie "base64 --decode" na zaznaczeniu w vim

Ja wybierając tekst w trybie wizualnym, a następnie przejściu do trybu normalnego, tak, że moja linia poleceń wygląda następująco:

:'<,'>!base64 --decode 

Jak mam przejść tylko wybrany fragment linii do base64 --decode ?

góry dzięki

+0

Chcesz zastąpić wybrany tekst? –

+0

Wymiana byłaby OK, zwykłe wyjście do konsoli byłoby również OK. – Jonatan

Odpowiedz

15

Jeśli tekst aby przejść do polecenia powłoki jest szarpnięciem do rejestru (np do bezimiennego rejestru), można użyć następującego polecenia.

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

Możliwe jest łączenie kopiowanie zaznaczonego tekstu i uruchamiając komendę w jednym kroku przy użyciu mapowania trybie wizualnym.

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

odwzorowanie może być zmodyfikowany tak, aby zastąpić zaznaczonego tekstu wyjścia polecenia powłoki za pomocą rejestru ekspresyjny.

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

Można powtórzyć pierwszy przykład w nowej zakładce vim? – shredding

+0

Albo w jaki sposób mogę zrobić makro, jeśli to? – shredding

+1

@shredding: Wystarczy dodać polecenie otwierające pusty bufor na stronie nowej karty między kopiowaniem a wywoływaniem 'base64':': vnoremap 64 y: tabe \ | pu! = System ('base64 -d', @@) '. –

4

Jeśli chcesz zamienić tekst z wyjściem base64, użyć czegoś podobnego

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

można użyć zamiast Pythona, który powinien działać.

Wybierz wiersze, które chcesz dekodować w trybie wizualnym (V), a następnie wykonać następujące polecenie:

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

Base64 kodowanie/dekodowanie obszar wizualny wybrany w buforze i schowka, umieścić to w ~/.vimrc i używać do kodowania wybór F2, F3 i zdekodować wybór

" 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

Oto skrypt, który wykorzystuje Pythona i moduł base64 dostarczenie base64 dekodować i Enc polecenia Ode. Byłoby całkiem łatwo obsłużyć jakikolwiek inny program base64, o ile odczytuje on ze standardowego wejścia - wystarczy zastąpić python -m base64 -e komendą kodowania i python -m base64 -d za pomocą polecenia dekodującego.

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

Niektóre funkcje Zapewnia:

  • Obsługuje zakresy, konwertuje tylko bieżącą linię (domyślnie wykorzystać :%Base64Encode kodować cały plik, na przykład, i będzie działać zgodnie z oczekiwaniami od wewnątrz tryb wizualny, chociaż konwertuje tylko całe linie)

  • Nie pozostawia wcięcia wyjścia - wszystkie wcięcia (tabulacje/spacje) są kodowane do base64, a następnie zachowywane podczas dekodowania.

  • Wspiera ich w połączeniu z innymi poleceniami z |

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