A maneira mais simples é usar a binary
opção De :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.
Se você não fizer isso, e seu ambiente estiver usando uma codificação multibyte (por exemplo, UTF-8, como a maioria das pessoas usa), o Vim tenta codificar o texto como tal, geralmente causando corrupção de arquivo.
Você pode verificar isso abrindo um arquivo e apenas usando :w
. Agora está alterado.
Se você definir LANG
e LC_ALL
para C
(ASCII), o Vim não converterá nada e os arquivos permanecerão os mesmos (ainda adiciona uma nova linha), pois o Vim não precisará fazer nenhuma codificação multibyte.
Pessoalmente, também prefiro desativar o set wrap
binário, embora outros possam preferir ativá- lo. YMMV. Outra coisa útil a fazer é :set display=uhex
. De :help 'display'
:
uhex Show unprintable characters hexadecimal as <xx>
instead of using ^C and ~C.
E como última dica, você pode mostrar o valor hexadecimal do caractere sob o cursor na régua com %B
( :set rulerformat=0x%B
).
Mais avancado: xxd
Você pode usar a xxd(1)
ferramenta para converter um arquivo em um formato mais legível e (esse é o bit mais importante), analisar o "formato legível" editado e gravá-lo como dados binários. xxd
faz parte vim
, portanto, se você vim
instalou, também deve xxd
.
Para usá-lo:
$ xxd /bin/ls | vi -
Ou, se você já abriu o arquivo, pode usar:
:%!xxd
Agora faça as alterações, você precisa fazer isso no lado esquerdo da tela (os números hexadecimais), as alterações no lado direito (representação imprimível) são ignoradas na gravação.
Para salvá-lo, use xxd -r
:
:%!xxd -r > new-ls
Isso salvará o arquivo em new-ls
.
Ou para carregar o binário no buffer atual:
:%!xxd -r
De 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.
E então apenas use :w
para escrevê-lo. ( cuidado : você deseja definir a binary
opção antes de gravar no arquivo, pelos mesmos motivos descritos acima).
Teclados complementares para facilitar um pouco isso:
" 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>
Isso também está disponível no menu, se você estiver usando o gVim, em 'Ferramentas ➙ Converter em HEX' e 'Ferramentas ➙ Converter de volta'.
O wiki de dicas do vim tem uma página com mais informações e alguns scripts auxiliares. Pessoalmente, acho que é melhor você usar um editor hexadecimal real se estiver editando arquivos binários com tanta frequência. O Vim pode
meio que fazer o trabalho, mas obviamente não foi projetado para isso, e se você escrever sem o :set binary
Vim poderá destruir seus arquivos binários!