2017-01-16 7 views
1

私はvimで編集しているテキストの一部を16進数からasciiに変換する必要があることがよくあります。私はこれを達成するためにxxdを使ってテキストをパイプすることができますが、私は視覚的にいくつかのテキストを選択し、選択されたテキストを16進/ ASCIIに変換する方法でこれを自動化したいと思います。VIMでasciiを16進数に変換する

たとえば、123 Fooを選択すると、これを31323320466f6fに変換します。 これを行うvimプラグインはありますか?これを行うためにいくつかの関数を使用できますか?ここで

+0

質問に答えるのではなく、カーソルを文字の上に置き、「ga」を押すと、その文字のdoc、hex、oct表現が得られます。 –

答えて

1

はあなたのためにそれを行うことができマッピングです:

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

あなたが望む任意の組み合わせに;を変更することができます。

編集:あなたは@Cyber​​Muzのコメントに記載されているようにすることを逆にすることができます

:関数があり

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

ありがとう、これは動作します!他の方法に変換する方法はありますか?だから '313233'から' 123'まで? – CyberMuz

+0

@Cyber​​Muz私はそれをチェックします。よい試み ! (+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 

あなたはreturn secho sラインを変更した場合は、変換された文字列を取得します。 map()で「ワンライナー」にすることができます。しかし、私はループがより読みやすいと思います。

私は、関数に視覚的に選択されたものを渡し、返された文字列でテキストを修正するのはあなたにとっては問題ではないと思いますか?

関連する問題