Выполнение 'base64 --decode' на выбор в vim
Я пытаюсь выполнить 'base64 -decode' на фрагменте текста, выбранном в визуальном режиме, но команда base64, кажется, передается по всей строке, а не только по выбору, который я сделал.
Я выбираю текст в визуальном режиме, а затем вхожу в обычный режим, чтобы моя командная строка выглядела так:
:'<,'>!base64 --decode
Как передать только выбранный фрагмент строки в base64 -decode?
Заранее спасибо
Ответы
Ответ 1
Если текст, передаваемый команде оболочки, выворачивается в регистр (например,
к безымянному регистру), можно использовать следующую команду.
:echo system('base64 --decode', @")
Можно комбинировать копирование выделенного текста и выполнение команды
за один шаг, используя отображение визуального режима.
:vnoremap <leader>64 y:echo system('base64 --decode', @")<cr>
Отображение может быть изменено для замены выделенного текста на выход
shell с использованием выражения.
:vnoremap <leader>64 c<c-r>=system('base64 --decode', @")<cr><esc>
Ответ 2
Вместо этого вы можете использовать Python, который должен работать.
Выберите строки, которые вы хотите декодировать в визуальном режиме (V), затем выполните следующую команду:
:'<,'>!python -m base64 -d
Ответ 3
Если вы хотите заменить текст выводом base64
, используйте что-то вроде
:vnoremap <leader>64 y:let @"=system('base64 --decode', @")<cr>gvP
Ответ 4
Base64 кодирует/декодирует визуально выбранную область в буфере и буфере обмена,
поместите это в ~/.vimrc и используйте F2 для кодирования выделения, а F3 - для декодирования выделения
" 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>
Ответ 5
Heres a script, который использует Python и модуль base64
для обеспечения команд декодирования base64 и кодирования. Itd довольно просто поддерживать любую другую программу 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
для кодирования всего файла, например, и itll работает как ожидалось из визуального режима, хотя он только преобразует целые строки)
-
Не оставляет вывод с отступом - все отступы (вкладки/пробелы) кодируются в 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
Ответ 6
Просто моя версия решения.
vnoremap <Leader>64e "ay:let @a=system("base64 -w 0", @a)<cr>gv"ap
vnoremap <Leader>64d "ay:let @a=system("base64 --decode", @a)<cr>gv"ap
Итак, мое отображение:
\64d - decode selected text
\64e - encode selected text
Как работает эта магия?
vnoremap - non-recursive versions of vmap ('v' means only for visual mode)
<Leader> - that special VIM variable tltr: default '\' you can set it with :let
mapleader = "\"
64e and 64d - mapped keys
"ay - copy to register a (VIM have many of registers, you can google it). Now inside register 'a' we have our selected text.
let @a=system("base64 -w 0", @a) - for register 'a' set value of encoded register 'a' ( -w 0 means no wrapping)
let @a=system("base64 --decode", @a) - for register 'a' set value of dencoded register 'a'
<cr> - simulate <Enter> pressing
gv - command select the same text which we select at first time
"ap - paste from register 'a'