Перейти к байтовому адресу в vim?
Я изучаю файл UTF-8, в котором много длинних строк. Однако файл не является полностью текстовым файлом, есть мусор. Чтобы найти свою точку зрения, я использую hd
и grep
.
Итак, в какой-то момент я знаю, что это интересно, например. 0000301a, поэтому я хочу быстро открыть файл в Vim и перейти к этой позиции.
Пример (на самом деле крошечный файл, здесь позиция 0000001c):
[email protected]:~$ 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
[email protected]:~$
Есть ли в Vim трюк, чтобы перейти к позиции байта? Или как можно ближе?
Ответы
Ответ 1
Да, есть. Это команда нормального режима go
.
Из :h go
:
[count] go Перейдите в {count} байт в буфере.
Например, 42go
переходит к байту 42.
Чтобы перейти к шестнадцатеричному или восьмеричному адресу, вам нужно будет построить команду с :normal! go
или эквивалентной функцией :goto
и str2nr()
или printf()
.
:exe 'normal! ' . str2nr('0x2a', 16) . 'go'
:exe 'goto' str2nr('0x2a', 16)
Ответ 2
Да, используя :help starting.txt
, вы можете найти справку обо всех аргументах командной строки vim.
Используя вышеприведенную команду goto, предоставленную несколькими другими, вы должны будете предоставить vim команду из командной строки, чтобы перейти к смещению байта, например
vim "+exe 'goto' str2nr('0x2a', 16)" file
Существует флаг времени компиляции, описанный в :help +byte_offset
, который вы можете проверить для использования команды :ve
. Моя версия Ubuntu скомпилирована по умолчанию.
Ответ 3
В то время как этот вопрос имеет свои собственные достоинства, могу ли я предположить, что вы делаете все это довольно круто, используя все hd
, grep
, Vim и оболочку?
Почему бы не использовать Vim и только Vim для всего процесса?
Ключ находится в :h 23.4
, "Двоичные файлы": Vim может быть вашим шестнадцатеричным редактором.
После запуска Vim с вашим файлом vim -b myfile
рабочий процесс будет выглядеть следующим образом:
:%!xxd -g1<Enter>
/00 <Enter>
...
...
:%!xxd -r<Enter>
Обязательно прочитайте :h hex-editing
, для получения более подробной информации.