最简单的方法是使用该binary
选项。来自:help binary
:
This option should be set before editing a binary file. You can also
use the -b Vim argument. When this option is switched on a few
options will be changed (also when it already was on):
'textwidth' will be set to 0
'wrapmargin' will be set to 0
'modeline' will be off
'expandtab' will be off
Also, 'fileformat' and 'fileformats' options will not be used, the
file is read and written like 'fileformat' was "unix" (a single <NL>
separates lines).
The 'fileencoding' and 'fileencodings' options will not be used, the
file is read without conversion.
[..]
When writing a file the <EOL> for the last line is only written if
there was one in the original file (normally Vim appends an <EOL> to
the last line if there is none; this would make the file longer). See
the 'endofline' option.
如果您不这样做,而您的环境正在使用多字节编码(例如,大多数人使用的是UTF-8),则Vim会尝试对文本进行编码,这通常会导致文件损坏。
您可以通过打开文件并仅使用进行验证:w
。现在已更改。
如果将LANG
和设置LC_ALL
为C
(ASCII),由于Vim不需要进行任何多字节编码,因此Vim不会进行任何转换并且文件保持不变(尽管仍然会添加换行符)。
我个人也喜欢禁用 set wrap
二进制文件,尽管其他人可能喜欢启用它。YMMV。另一个有用的事情是:set display=uhex
。来自:help 'display'
:
uhex Show unprintable characters hexadecimal as <xx>
instead of using ^C and ~C.
最后,您可以使用%B
(:set rulerformat=0x%B
)在标尺中的光标下方显示字符的十六进制值。
更先进: xxd
您可以使用该xxd(1)
工具将文件转换为更具可读性的格式,然后(这是重要的一点),解析已编辑的“可读格式”,然后将其写回二进制数据。xxd
是的一部分vim
,因此如果您已vim
安装也应该拥有xxd
。
要使用它:
$ xxd /bin/ls | vi -
或者,如果您已经打开文件,则可以使用:
:%!xxd
现在进行更改,您需要在显示屏的左侧(十六进制数字)进行操作,在写入时将忽略右侧的更改(可打印的表示形式)。
要保存它,请使用xxd -r
:
:%!xxd -r > new-ls
这会将文件保存到new-ls
。
或将二进制文件加载到当前缓冲区中:
:%!xxd -r
来自xxd(1)
:
-r | -revert
reverse operation: convert (or patch) hexdump into binary. If
not writing to stdout, xxd writes into its output file without
truncating it. Use the combination -r -p to read plain hexadeci‐
mal dumps without line number information and without a particu‐
lar column layout. Additional Whitespace and line-breaks are
allowed anywhere.
然后只需使用:w
它来编写。(请注意:binary
出于与上述相同的原因,您想在写入文件之前设置该选项)。
互补的按键绑定使此操作更简单:
" Hex read
nmap <Leader>hr :%!xxd<CR> :set filetype=xxd<CR>
" Hex write
nmap <Leader>hw :%!xxd -r<CR> :set binary<CR> :set filetype=<CR>
如果您使用的是gVim,也可以从菜单中使用,在“工具➙转换为十六进制”和“工具➙转换回”下。
该VIM技巧的wiki有更多的信息和一些辅助脚本的页面。就个人而言,我认为如果经常编辑二进制文件,最好使用真正的十六进制编辑器。Vim 可以
胜任这项工作,但是显然不是为此而设计的,如果您在没有:set binary
Vim的情况下编写,可能会破坏您的二进制文件!