h0rr0rr_drag0n 04.05.2009 13:10
Vim — hex-viewer из vim'a
При выполнении лабораторной работы по ассемблеру у меня возникла необходимость воспользоваться hex-редактором для изучения устройства bmp-файла. До этого я пользовался обычным гномовским "Шестнадцатеричным редактором", но в данном случае он мне показался неудобным из-за его некоторой громоздкости и перегруженности интерфейса. Да и шрифты банально не радовали глаз.Просматривая в synaptic'е список доступных шестнадцатеричных редакторов и параллельно ужасаясь тому, что кто-то пишет их с использованием mono, я вспомнил что vim тоже можно спокойно превратить в hex-редактор. Впрочем мне от него нужна была только функциональность viewer'а.
Для превращения vim в hex-viewer необходимо проделать следующее. Забиндить на удобную комбинацию клавиш переход в шестнадцатеричный режим. Я использовал Ctrl+h, но необходимо помнить, что в консольном vim'e подобная комбинация клавиш будет в первую очередь интерпретирована как Backspace, поэтому в таком случае лучше использовать gvim.
" Переключение в режим hex-редактора
nnoremap <C-H> :Hexmode<CR>
inoremap <C-H> <Esc>:Hexmode<CR>
vnoremap <C-H> :<C-U>Hexmode<CR>
Затем добавим в .vimrc собственно функцию Hexmode:
" Функция для переключения в режим hex-редактора
command -bar Hexmode call ToggleHex()
function ToggleHex()
let l:modified=&mod;
let l:oldreadonly=&readonly;
let &readonly;=0
let l:oldmodifiable=&modifiable;
let &modifiable;=1
if !exists("b:editHex") || !b:editHex
let b:oldft=&ft;
let b:oldbin=&bin;
setlocal binary
let &ft;="xxd"
let b:editHex=1
%!xxd
else
let &ft;=b:oldft
if !b:oldbin
setlocal nobinary
endif
let b:editHex=0
%!xxd -r
endif
let &mod;=l:modified
let &readonly;=l:oldreadonly
let &modifiable;=l:oldmodifiable
endfunction
В результате имеем что-то вроде этого:

Синхронизации положения курсора между hex и ascii представлениями нет, но для моих целей это не было критично.
При пользовании подобным hex-viewer'ом необходимо помнить, что не стоит сохраняться в hex-режиме. Можно получить интересный результат:
~$ echo "Hello world" > test
~$ vi test
~$ cat test
0000000: 4865 6c6c 6f20 776f 726c 640a Hello world.
~$ WTF?? O_o
ОноТолЕй СъеЛ WTF?? O_o. ПЫщЬ пЫщЬ!!!111
Воены УПЧК следят за тобой $USERNAME
~$
Рецепт обхода этого недоразумения, а также описание того, как превратить vim в полноценный hex-editor есть здесь.
А пакета hexer там не было случайно? Это vi-like hex-редактор на ncurses.