Il modo più semplice è usare l' binary
opzione. Da :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 non lo fai, e il tuo ambiente utilizza una codifica multibyte (ad esempio UTF-8, come la maggior parte delle persone usa), Vim tenta di codificare il testo in quanto tale, di solito portando alla corruzione dei file.
Puoi verificarlo aprendo un file e semplicemente usando :w
. Ora è cambiato.
Se si imposta LANG
e LC_ALL
su C
(ASCII), Vim non converte nulla e i file rimangono gli stessi (aggiunge comunque una nuova riga) poiché Vim non dovrà eseguire alcuna codifica multibyte.
Personalmente preferisco anche disabilitare set wrap
per binario, anche se altri potrebbero preferire abilitarlo . YMMV. Un'altra cosa utile da fare è :set display=uhex
. Da :help 'display'
:
uhex Show unprintable characters hexadecimal as <xx>
instead of using ^C and ~C.
E come ultimo suggerimento, puoi mostrare il valore esadecimale del personaggio sotto il cursore nel righello con %B
( :set rulerformat=0x%B
).
Più avanzato: xxd
È possibile utilizzare lo xxd(1)
strumento per convertire un file in un formato più leggibile e (questo è il bit importante), analizzare il "formato leggibile" modificato e riscriverlo come dati binari. xxd
fa parte di vim
, quindi se hai vim
installato dovresti avere anche xxd
.
Per usarlo:
$ xxd /bin/ls | vi -
Oppure se hai già aperto il file, puoi utilizzare:
:%!xxd
Ora apporta le tue modifiche, devi farlo sul lato sinistro del display (i numeri esadecimali), le modifiche sul lato destro (rappresentazione stampabile) vengono ignorate in scrittura.
Per salvarlo, utilizzare xxd -r
:
:%!xxd -r > new-ls
Questo salverà il file in new-ls
.
Oppure per caricare il file binario nel buffer corrente:
:%!xxd -r
Da 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 poi basta usare :w
per scriverlo. ( attenzione : si desidera impostare l' binary
opzione prima di scrivere sul file, per gli stessi motivi indicati sopra).
Tasti complementari per semplificare un po 'questo:
" 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>
Questo è disponibile anche dal menu se stai usando gVim, sotto 'Strumenti ➙ Converti in esadecimale' e 'Strumenti ➙ Converti indietro'.
Il wiki di vim tips ha una pagina con maggiori informazioni e alcuni script di supporto. Personalmente, penso che probabilmente stai meglio usando un vero editor esadecimale se stai modificando i file binari così spesso. Vim può
fare un po 'il lavoro, ma ovviamente non è progettato per questo, e se mai scrivessi senza :set binary
Vim potresti distruggere i tuoi file binari!