web-dev-qa-db-fra.com

Aller à l'adresse d'octet dans vim?

J'étudie un fichier principalement UTF-8 avec beaucoup de longues lignes. Cependant, le fichier n'est pas entièrement un fichier texte, il y a des ordures. Pour trouver mon point d'intérêt, j'utilise hd et grep.

Donc, à un moment donné, je sais que cela m'intéresse, par exemple 0000301a, donc je veux ouvrir rapidement le fichier dans Vim et sauter à cette position.

Exemple (en fait un petit fichier, ici la position est 0000001c):

me@here:~$ hd file | grep -C 10 \ 00\ 
00000000  6c 69 6e 65 31 0a 6c 69  6e 65 32 0a 6c 69 6e 65  |line1.line2.line|
00000010  33 0a 6c 69 6e 65 34 0a  6c 69 6e 65 00 35 0a 6c  |3.line4.line.5.l|
00000020  69 6e 65 36 0a 6c 69 6e  65 37 0a 6c 69 6e 65 38  |ine6.line7.line8|
00000030  0a 6c 69 6e 65 39 0a 6c  69 6e 65 31 30 0a        |.line9.line10.|
0000003e
me@here:~$ 

Y a-t-il une astuce dans Vim pour passer à un position en octets? Ou le plus près possible?

38
Alois Mahdal

Oui il y a. C'est la commande en mode normal go.

De :h go :

[count] go Aller à {count} octet dans le tampon.

Par exemple, 42go Passe à l'octet 42.

Pour passer à une adresse hexadécimale ou octale, vous devez créer une commande avec :normal! go Ou l'équivalent :goto Et la fonction str2nr() ou printf() fonction.

:exe 'normal! ' . str2nr('0x2a', 16) . 'go'
:exe 'goto' str2nr('0x2a', 16)
53
glts

Bien que cette question ait son propre mérite, puis-je suggérer que vous fassiez tout cela de manière plutôt détournée, en utilisant tous les hd, grep, Vim et le shell?

Pourquoi ne pas utiliser Vim et uniquement Vim pour l'ensemble du processus?

La clé est à :h 23.4 , "Fichiers binaires": Vim peut être votre éditeur hexadécimal.

Après avoir démarré Vim avec votre fichier, vim -b myfile, le workflow devient:

:%!xxd -g1<Enter>
/00 <Enter>
...
...
:%!xxd -r<Enter>

N'oubliez pas de lire :h hex-editing , aussi, pour plus de détails.

5
glts

Oui, en utilisant :help starting.txt, Vous pouvez trouver l'aide sur tous les arguments de ligne de commande vim.

En utilisant la commande goto ci-dessus donnée par plusieurs autres, vous devriez pouvoir donner à vim une commande à partir de la ligne de commande pour accéder au décalage d'octet, comme

vim "+exe 'goto' str2nr('0x2a', 16)" file

Il existe un indicateur de temps de compilation décrit dans :help +byte_offset, Vous pouvez vérifier l'utilisation de la commande :ve. Ma version Ubuntu l'a compilé par défaut.

3
Grant Bowman