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.
:set binary noeol fenc=utf-8
. De hecho, lo está haciendo inmediatamente al abrir el archivo antes de que lo diga[noeol] [converted]
. ¿Por qué vim necesita hacer el búfer 150% más grande? ¿Cómo evito que corrompa archivos como ese?:r !xxd <file>
(o$ xxd <file> | vim -
) leer y:w !xxd -r > <file>
escribir, pero esto no es lo ideal.Para ver el contenido de un archivo binario en una vista hexadecimal, abra el archivo, active el modo binario y filtre el búfer mediante el
xxd
comando:Puede realizar cambios en el área izquierda (editar los números hexadecimales) y, cuando esté listo, filtrar
xxd -r
y finalmente guardar el archivo:Si el paso de filtrado después de abrir y antes de cerrar suena tedioso, y a menudo lo hace con archivos con
.bin
extensión, puede agregar esto a su vimrc para que el proceso sea automático:fuente
:%!xxd
,:%!xxd -r
,:w
, ni de realizar ningún cambio!), Entonces el archivo binario escrito es no el mismo que el original ... ¿Es este el caso para usted (he probado con/bin/ls
). Necesito usar:set binary
antes de guardar (también vea mi respuesta que explica por qué) ... ¿Tal vez es algo en mi vimrc? Pero independientemente, siempre lo usaríaset binary
por seguridad ...augroup
script~/.vim/plugin/binary.vim
si no desea.vimrc
augroup Binary
lista se encuentra en:help hex-editing
o:help using-xxd
en cualquier Vim desde 5.5 (septiembre de 1999).Utilice el editor "bvi". http://bvi.sourceforge.net/ (está en todos los repositorios de Linux).
fuente
TL; DR Respuesta
Abra el archivo con Vim en modo binario:
En Vim, ingrese al modo de edición hexadecimal de esta manera:
Ahorrar:
Esto convertirá el búfer de vuelta del modo hexadecimal y luego guardará el archivo como de costumbre.
Tenga en cuenta la opción -p. Esto evita toda la pelusa adicional de impresión y dirección y solo le muestra el hexadecimal. Simplemente omita -p si desea el contexto adicional.
Tenga cuidado al abrir el archivo con Vim no en modo binario, ya que agregará un carácter LF (generalmente no intencionado) al final del archivo cuando lo guarde.
fuente
:h using-xxd
y ha estado presente desde entoncesv7.0001
y probablemente por más tiempo. Este sitio estaría menos activo si la gente buscara en los documentos.Esto parece un pequeño y práctico complemento vim que hace el trabajo usando un archivo temporal que escribe de un lado a otro automáticamente.
Hace algunos años encontré un complemento similar que adapté y mejoré para mi propio uso. He incluido el código relevante para eso aquí, en caso de que alguien lo quiera. También se basa en la herramienta xxd. Estoy seguro de que la versión de GitHub que vinculé anteriormente funciona mejor, pero en realidad no la he utilizado, así que pensé que también publicaría esta, que sé que funciona con seguridad.
La fuente de esta otra versión fue el vim wikia, específicamente esta página .
Aquí está el código:
fuente