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

27

我正在尝试在Visual模式下执行base64 --decode命令,但似乎传递给base64的是整行文本而不仅仅是当前所选内容。

我使用Visual模式选择文本,然后进入Normal模式,以使我的命令行看起来像这样:

:'<,'>!base64 --decode

在Vim中,我如何仅传递选定的行片段给shell命令调用?


您想要替换所选文本吗? - daniel kullmann
替换也可以,直接输出到控制台也可以。 - Jonatan
5个回答

31
如果要将文本传递给shell命令,首先应将其拷贝到寄存器中(比如无名寄存器),然后可以使用以下命令:
:echo system('base64 --decode', @")

可以将复制所选文本和运行命令合并为单个Visual模式键映射:

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

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

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

1
能否将第一个示例输出到新的vim标签页中? - shredding
或者我该如何将其制作成宏? - shredding
1
@shredding:在复制和调用“base64”之间添加一个打开空缓冲区的命令,以在新的选项卡页中插入:“:vnoremap <leader>64 y:tabe|pu!=system('base64 -d', @@)<cr>”。 - ib.
1
有没有一个函数可以通过相同的按键在Base64和纯文本之间切换?如果有,那就加分了。 - Jonathan Dumaine
3
如果可以切换base64编码,就不需要使用base64-d选项。例如:任何四个字母的单词都可以进行base64解码或编码。 - mosh

14

你可以使用Python代替,这应该有效。

在Visual模式下选择要解码的行(通过V),然后执行以下命令:

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

2
这与问题中的原始命令存在相同的问题。也就是说,在这种情况下,Python进程接收当前选择跨越的整行,而不是所选字符范围。 - ib.

8

如果你想用base64的输出替换文本,可以使用以下方法:

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

解释:

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

1
这个很好用!您介意解释一下 y: 是什么意思吗? - Matthias Braun
3
我在我的 .vimrc 文件中添加了以下两行代码来进行编码和解码: vnoremap <leader>b y:let @"=system('base64 -w 0', @")<cr>gvPvnoremap <leader>B y:let @"=system('base64 --decode', @")<cr>gvP - Nathan Wallace
1
@MatthiasBraun y 只是 "yank" 命令,即将当前选择的文本复制到剪贴板。然后 :let ... 将寄存器 " 分配给命令输出。 - daniel kullmann

0
这是一个使用Python和base64模块提供base64解码和编码命令的脚本。只要从stdin读取,支持任何其他的base64程序都很简单 - 只需将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-functionsfunc-rangei_0_CTRL-Di_CTRL-R_CTRL-Oexpr-registersystem()user-commandscommand-nargscommand-range:normal


0

在缓冲区和剪贴板中对选定的区域进行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> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接