我正在尝试在Visual模式下执行base64 --decode
命令,但似乎传递给base64
的是整行文本而不仅仅是当前所选内容。
我使用Visual模式选择文本,然后进入Normal模式,以使我的命令行看起来像这样:
:'<,'>!base64 --decode
在Vim中,我如何仅传递选定的行片段给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>
你可以使用Python代替,这应该有效。
在Visual模式下选择要解码的行(通过V),然后执行以下命令:
:'<,'>!python -m base64 -d
如果你想用base64
的输出替换文本,可以使用以下方法:
:vnoremap <leader>64 y:let @"=system('base64 --decode', @")<cr>gvP
解释:
y
→ 将当前选定的文本复制到寄存器"
。这将取消选择文本。:let @"=system('base64 --decode', @")
→ 将"
寄存器的内容传递给base64
并将结果写入同一寄存器"
。gv
→ 再次选择先前选择的文本。P
→ 粘贴来自寄存器"
的文本,替换当前选择的文本。y:
是什么意思吗? - Matthias Braunvnoremap <leader>b y:let @"=system('base64 -w 0', @")<cr>gvP
和 vnoremap <leader>B y:let @"=system('base64 --decode', @")<cr>gvP
- Nathan Wallacey
只是 "yank" 命令,即将当前选择的文本复制到剪贴板。然后 :let ...
将寄存器 "
分配给命令输出。 - daniel kullmannbase64
模块提供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-functions
,func-range
,i_0_CTRL-D
,i_CTRL-R_CTRL-O
,expr-register
,system()
,user-commands
,command-nargs
,command-range
,:normal
在缓冲区和剪贴板中对选定的区域进行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>