Самый простой способ - использовать 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, в «Инструменты ➙ Преобразовать в HEX» и «Инструменты ➙ Преобразовать обратно».
В вики подсказках есть страница с дополнительной информацией и некоторыми вспомогательными скриптами. Лично я думаю, что вам лучше использовать настоящий шестнадцатеричный редактор, если вы часто редактируете двоичные файлы. Vim может
выполнять свою работу, но он явно не предназначен для этого, и если вы когда-либо будете писать без :set binary
Vim, вы можете уничтожить ваши двоичные файлы!