Le moyen le plus simple consiste à utiliser l' binary
option. 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 vous ne le faites pas et que votre environnement utilise un codage multi-octets (par exemple, UTF-8, comme le font la plupart des utilisateurs), Vim tente de coder le texte en tant que tel, ce qui entraîne généralement une corruption du fichier.
Vous pouvez le vérifier en ouvrant un fichier et en utilisant simplement :w
. C'est maintenant changé.
Si vous définissez LANG
et LC_ALL
sur C
(ASCII), Vim ne convertit rien et les fichiers restent identiques (il ajoute néanmoins une nouvelle ligne), car Vim n'aura pas besoin de codage multi-octets.
Personnellement, je préfère aussi désactiver set wrap
pour le binaire, bien que d’autres préfèrent l’ activer . YMMV. Une autre chose utile à faire est :set display=uhex
. De :help 'display'
:
uhex Show unprintable characters hexadecimal as <xx>
instead of using ^C and ~C.
Et comme dernier conseil, vous pouvez afficher la valeur hexadécimale du caractère situé sous le curseur dans la règle avec %B
( :set rulerformat=0x%B
).
Plus avancé: xxd
Vous pouvez utiliser l' xxd(1)
outil pour convertir un fichier dans un format plus lisible, et (c'est le bit important), analyser le "format lisible" édité et le réécrire sous forme de données binaires. xxd
fait partie de vim
, donc si vous avez vim
installé, vous devriez également avoir xxd
.
Pour l'utiliser:
$ xxd /bin/ls | vi -
Ou si vous avez déjà ouvert le fichier, vous pouvez utiliser:
:%!xxd
Maintenant, apportez vos modifications. Vous devez le faire dans la partie gauche de l’affichage (les nombres hexadécimaux). Les modifications dans la partie droite (représentation imprimable) sont ignorées lors de l’écriture.
Pour le sauvegarder, utilisez xxd -r
:
:%!xxd -r > new-ls
Cela enregistrera le fichier dans new-ls
.
Ou pour charger le binaire dans le tampon courant:
:%!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.
Et puis juste utiliser :w
pour l'écrire. ( attention : vous souhaitez définir l' binary
option avant d'écrire dans le fichier, pour les mêmes raisons que celles décrites ci-dessus).
Des clés complémentaires pour rendre cela un peu plus facile:
" 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>
Ceci est également disponible dans le menu si vous utilisez gVim, sous «Outils Convertir en HEX» et «Outils Convertir en arrière».
Le wiki vim tips a une page avec plus d’informations et des scripts d’aide. Personnellement, je pense que vous feriez probablement mieux d'utiliser un véritable éditeur hexadécimal si vous modifiez souvent des fichiers binaires. Vim peut en
quelque sorte faire le travail, mais ce n’est évidemment pas conçu pour cela, et si jamais vous écrivez sans :set binary
Vim, vos fichiers binaires seront détruits!