2017-01-16 10 views
1

Мне часто нужно преобразовать небольшую часть текста, которую я редактирую в vim от hex до ascii и наоборот. Я знаю, что могу передать текст, хотя xxd, чтобы выполнить это, но я хотел бы автоматизировать это так, чтобы я визуально выбирал какой-то текст, а затем использовал ярлык для преобразования выделенного текста в hex/ascii.Преобразование ascii в hex в VIM

Например, если я выберу 123 Foo Я хотел бы преобразовать это в 31323320466f6f. Есть ли плагин vim, который делает это? Могу ли я использовать некоторые функции для этого?

+0

не отвечает на вопрос, но накладывает курсор на символ и нажимает 'ga' givs представление doc, hex, oct указанного символа. –

ответ

1

Вот отображение, который может сделать это для вас:

vnoremap ; :<c-u>s/\%V./\=printf("%x",char2nr(submatch(0)))/g<cr><c-l>`< 

Вы можете изменить ; в любой комбинации, которую вы хотите.

Edit:

Вы можете обратить, что, как указано в комментариях по @CyberMuz:

vnoremap u :<c-u>s/\%V\x\x/\=nr2char(printf("%d", "0x".submatch(0)))/g<cr><c-l>`< 
+0

Спасибо, это работает! Есть ли способ конвертировать другой способ? Итак, от '313233' до' 123'? – CyberMuz

+0

@CyberMuz Я проверю его. хорошая попытка! (+1) –

+1

Я придумал это отображение, он работает правильно: 'vnoremap u: s/\% V [0-9a-fA-F] \ {2 \}/\ = nr2char (printf ("% d", "0x" .submatch (0)))/g "' <' – CyberMuz

1

Существует функция, вы передаете в строке, он печатает (эхо) шестигранник для вы:

function! ToHex(str) abort 
    let s = '' 
    for c in split(a:str, '\zs') 
     let s .= printf("%x", char2nr(c)) 
    endfor 
    echo s 
endfunction 

Если изменить echo s строку в return s, вы получите преобразованную строку. Вы можете сделать его «однострочным» на map(). Однако я думаю, что цикл более читабельен.

Я думаю, что передача визуального выбранного материала в функцию и изменение текста с возвращенной строкой не проблема для вас?