Подтвердить что ты не робот

Выполнение 'base64 --decode' на выбор в vim

Я пытаюсь выполнить 'base64 -decode' на фрагменте текста, выбранном в визуальном режиме, но команда base64, кажется, передается по всей строке, а не только по выбору, который я сделал.

Я выбираю текст в визуальном режиме, а затем вхожу в обычный режим, чтобы моя командная строка выглядела так:

:'<,'>!base64 --decode

Как передать только выбранный фрагмент строки в base64 -decode?

Заранее спасибо

4b9b3361

Ответ 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'