如何在Vim中对选定的文本执行'base64 --decode'?

rqdpfwrv  于 2023-06-06  发布在  其他
关注(0)|答案(5)|浏览(144)

我试图在Visual模式下选择的一段文本上执行base64 --decode,但似乎是整行传递给base64命令,而不仅仅是当前选择。
我在Visual模式下选择文本,然后进入Normal模式,因此我的命令行看起来像这样:

:'<,'>!base64 --decode

如何在Vim中只将选中的一段代码传递给shell命令调用?

dhxwm5r4

dhxwm5r41#

如果要传递给shell命令的文本首先被拉到一个寄存器,比如未命名的寄存器,可以使用以下命令:

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

可以将复制所选文本和运行命令组合到单个视觉模式键Map中:

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

可以进一步修改Map,以通过表达式寄存器用shell命令的输出替换所选文本:

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

jchrr9hc2#

你可以使用Python来代替,这应该是可行的。
选择要在可视模式下解码的行(通过V),然后执行以下命令:

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

nwo49xxi3#

如果要用base64的输出替换文本,请使用类似

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

说明:

  • y →拖动当前选定的文本以注册"。这将取消选择文本。
  • :let @"=system('base64 --decode', @") →将"寄存器的内容传递到base64,并将结果写入同一寄存器"
  • gv →再次选择先前选择的文本。
  • P →粘贴寄存器"中的文本,替换当前选定的文本。
twh00eeo

twh00eeo4#

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>
zzzyeukh

zzzyeukh5#

下面是一个使用Python和base64模块提供base64解码和编码命令的脚本。支持任何其他base64程序也很简单,只要它从stdin读取-只需将python -m base64 -e替换为encoding命令,将python -m base64 -d替换为decoding命令。

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-functionsfunc-rangei_0_CTRL-Di_CTRL-R_CTRL-Oexpr-registersystem()user-commandscommand-nargscommand-range:normal

相关问题