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!
:set binary noeol fenc=utf-8
. Na verdade, ele está fazendo isso imediatamente após abrir o arquivo antes que ele diga[noeol] [converted]
. Por que o vim precisa aumentar o buffer em 150%? Como evito que ele corrompa arquivos como esse?:r !xxd <file>
(ou$ xxd <file> | vim -
) ler e:w !xxd -r > <file>
escrever, mas isso não é o ideal.Para visualizar o conteúdo de um arquivo binário em uma visualização hexadecimal, abra o arquivo, ative o modo binário e filtre o buffer através do
xxd
comando:Você pode fazer alterações na área esquerda (editar os números hexadecimais) e, quando estiver pronto, filtrar
xxd -r
e finalmente salvar o arquivo:Se a etapa de filtragem após a abertura e antes do fechamento parecer entediante, e você costuma fazer isso com arquivos com
.bin
extensão, pode adicioná-lo ao seu vimrc para tornar o processo automático:fonte
:%!xxd
,:%!xxd -r
,:w
, didnt fazer qualquer alteração!), Em seguida, o arquivo binário escrito é não o mesmo que o original ... É este o caso para você (eu testei com/bin/ls
). Preciso usar:set binary
antes de salvar (veja também minha resposta que explica o porquê) ... Talvez seja algo no meu vimrc? Mas, independentemente disso, eu sempre usoset binary
para a segurança ...augroup
script para~/.vim/plugin/binary.vim
se você não quiser encher o seu.vimrc
augroup Binary
listagem estará localizada em:help hex-editing
ou:help using-xxd
em qualquer Vim desde 5.5 (setembro de 1999).Use o editor "bvi". http://bvi.sourceforge.net/ (Está em todos os repositórios Linux.)
fonte
Resposta TL; DR
Abra o arquivo com o Vim no modo binário:
No Vim, entre no modo de edição hexadecimal da seguinte forma:
Salvar:
Isso converterá o buffer novamente do modo hexadecimal e salvará o arquivo normalmente.
Observe a opção -p. Isso evita todo o fluff extra de impressão e endereço e mostra apenas o hexadecimal. Apenas omita -p se quiser o contexto extra.
Cuidado ao abrir o arquivo com o Vim não no modo binário, pois ele anexará um caractere LF (geralmente não intencional) ao final do arquivo quando você o salvar.
fonte
:h using-xxd
e existe desde entãov7.0001
e provavelmente por mais tempo. Este site ficaria menos ativo se as pessoas pesquisassem os documentos.Este parece um pouco útil plug-in vim que faz o trabalho usando um arquivo temporário que escreve e para trás para você automaticamente.
Há alguns anos, encontrei um plugin semelhante que adaptei e aprimorei para meu próprio uso. Eu incluí o código relevante para isso aqui, caso alguém queira. Também é baseado na ferramenta xxd. Tenho certeza de que a versão do GitHub que eu vinculei acima funciona melhor, mas na verdade eu não a usei, então imaginei que também postaria essa que sei que com certeza funciona.
A fonte desta outra versão foi a vim wikia, especificamente esta página .
Aqui está o código:
fonte