La forma más simple es usar la binary
opción. 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.
Si no hace esto, y su entorno está usando una codificación multibyte (por ejemplo, UTF-8, como la mayoría de la gente usa), Vim intenta codificar el texto como tal, lo que generalmente daña los archivos.
Puede verificar esto abriendo un archivo y simplemente usando :w
. Ahora está cambiado.
Si configura LANG
y LC_ALL
en C
(ASCII), Vim no convierte nada y los archivos permanecen igual (aunque aún agrega una nueva línea) ya que Vim no necesitará hacer ninguna codificación multibyte.
Personalmente, también prefiero deshabilitar set wrap
para binario, aunque otros prefieren habilitarlo . YMMV. Otra cosa útil que hacer es :set display=uhex
. De :help 'display'
:
uhex Show unprintable characters hexadecimal as <xx>
instead of using ^C and ~C.
Y como último consejo, puede mostrar el valor hexadecimal del personaje debajo del cursor en la regla con %B
( :set rulerformat=0x%B
).
Más avanzado: xxd
Puede usar la xxd(1)
herramienta para convertir un archivo a un formato más legible y (este es el bit importante), analizar el "formato legible" editado y volver a escribirlo como datos binarios. xxd
es parte de vim
, por lo que si ha vim
instalado también debería tener xxd
.
Para usarlo:
$ xxd /bin/ls | vi -
O si ya ha abierto el archivo, puede usar:
:%!xxd
Ahora haga sus cambios, debe hacerlo en el lado izquierdo de la pantalla (los números hexadecimales), los cambios en el lado derecho (representación imprimible) se ignoran al escribir.
Para guardarlo, use xxd -r
:
:%!xxd -r > new-ls
Esto guardará el archivo en new-ls
.
O para cargar el binario en el búfer actual:
:%!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.
Y luego solo usa :w
para escribirlo. ( cuidado : desea configurar la binary
opción antes de escribir en el archivo, por los mismos motivos descritos anteriormente).
Teclas complementarias para hacer esto un poco más fácil:
" 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>
Esto también está disponible en el menú si está utilizando gVim, en 'Herramientas ➙ Convertir a HEX' y 'Herramientas ➙ Convertir de nuevo'.
El wiki de vim tips tiene una página con más información y algunos scripts de ayuda. Personalmente, creo que probablemente sea mejor usar un editor hexadecimal real si está editando archivos binarios con tanta frecuencia. Vim puede
hacer el trabajo, pero obviamente no está diseñado para ello, y si alguna vez escribe sin :set binary
Vim podría destruir sus archivos binarios.