Вот скрипт, который использует Python и модуль base64
для обеспечения команд base64 декодирования и кодирования. Также было бы довольно просто поддерживать любую другую программу base64, если она читает из stdin - просто замените python -m base64 -e
на команду кодирования и python -m base64 -d
на команду декодирования.
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()
Некоторые функции, которые это обеспечивает:
Поддерживает диапазоны, по умолчанию преобразует только текущую строку (например, используйте :%Base64Encode
для кодирования всего файла, и он будет работать, как и ожидалось, в визуальном режиме, хотя он преобразует только целые строки)
Не оставляет выходные данные с отступом - все отступы (табуляции / пробелы) кодируются в base64, а затем сохраняются при декодировании.
Поддерживает объединение с другими командами с |
Соответствующие :help
теги: user-functions
, func-range
, i_0_CTRL-D
, i_CTRL-R_CTRL-O
, expr-register
, system()
, user-commands
, command-nargs
, command-range
, :normal