Cara paling sederhana adalah dengan menggunakan binary
opsi. Dari :help binary
:
This option should be set before editing a binary file. You can also
use the -b Vim argument. When this option is switched on a few
options will be changed (also when it already was on):
'textwidth' will be set to 0
'wrapmargin' will be set to 0
'modeline' will be off
'expandtab' will be off
Also, 'fileformat' and 'fileformats' options will not be used, the
file is read and written like 'fileformat' was "unix" (a single <NL>
separates lines).
The 'fileencoding' and 'fileencodings' options will not be used, the
file is read without conversion.
[..]
When writing a file the <EOL> for the last line is only written if
there was one in the original file (normally Vim appends an <EOL> to
the last line if there is none; this would make the file longer). See
the 'endofline' option.
Jika Anda tidak melakukan ini, dan lingkungan Anda menggunakan pengkodean multibyte (misalnya UTF-8, seperti yang digunakan kebanyakan orang), Vim mencoba menyandikan teks seperti itu, biasanya mengarah ke file korupsi.
Anda dapat memverifikasi ini dengan membuka file, dan hanya menggunakan :w
. Sekarang sudah berubah.
Jika Anda mengatur LANG
dan LC_ALL
ke C
(ASCII), Vim tidak mengonversi apa pun dan file tetap sama (tetap menambahkan baris baru) karena Vim tidak perlu melakukan pengkodean multibyte apa pun.
Saya pribadi juga lebih memilih untuk menonaktifkan set wrap
biner, meskipun orang lain mungkin lebih suka mengaktifkannya . YMMV. Hal lain yang bermanfaat untuk dilakukan adalah :set display=uhex
. Dari :help 'display'
:
uhex Show unprintable characters hexadecimal as <xx>
instead of using ^C and ~C.
Dan sebagai tip terakhir, Anda dapat menunjukkan nilai hex karakter di bawah kursor dalam penggaris dengan %B
( :set rulerformat=0x%B
).
Lebih maju: xxd
Anda dapat menggunakan xxd(1)
alat ini untuk mengonversi file ke format yang lebih mudah dibaca, dan (ini adalah bagian penting), parsing "format yang dapat dibaca" yang diedit dan tulis kembali sebagai data biner. xxd
adalah bagian dari vim
, jadi jika Anda telah vim
menginstal Anda juga harus memiliki xxd
.
Untuk menggunakannya:
$ xxd /bin/ls | vi -
Atau jika Anda sudah membuka file, Anda dapat menggunakan:
:%!xxd
Sekarang buat perubahan Anda, Anda perlu melakukan itu di sisi kiri layar (angka hex), perubahan ke sisi kanan (representasi yang dapat dicetak) diabaikan saat menulis.
Untuk menyimpannya, gunakan xxd -r
:
:%!xxd -r > new-ls
Ini akan menyimpan file new-ls
.
Atau untuk memuat biner di buffer saat ini:
:%!xxd -r
Dari xxd(1)
:
-r | -revert
reverse operation: convert (or patch) hexdump into binary. If
not writing to stdout, xxd writes into its output file without
truncating it. Use the combination -r -p to read plain hexadeci‐
mal dumps without line number information and without a particu‐
lar column layout. Additional Whitespace and line-breaks are
allowed anywhere.
Dan kemudian gunakan :w
untuk menulisnya. ( hati-hati : Anda ingin mengatur binary
opsi sebelum menulis ke file, untuk alasan yang sama menguraikan di atas).
Ikatan pelengkap untuk membuatnya lebih mudah:
" Hex read
nmap <Leader>hr :%!xxd<CR> :set filetype=xxd<CR>
" Hex write
nmap <Leader>hw :%!xxd -r<CR> :set binary<CR> :set filetype=<CR>
Ini juga tersedia dari menu jika Anda menggunakan gVim, di bawah 'Alat ➙ Konversi ke HEX' dan 'Alat ➙ Konversi kembali'.
The kiat vim wiki memiliki halaman dengan informasi lebih lanjut dan beberapa skrip pembantu. Secara pribadi, saya pikir Anda mungkin lebih baik menggunakan hex editor nyata jika Anda sering mengedit file biner. Vim dapat
melakukan pekerjaan itu, tetapi jelas tidak dirancang untuk itu, dan jika Anda pernah menulis tanpa :set binary
Vim dapat merusak file biner Anda!
:set binary noeol fenc=utf-8
. Bahkan, ia melakukannya segera setelah membuka file sebelum dikatakan[noeol] [converted]
. Mengapa vim perlu membuat buffer 150% lebih besar? Bagaimana saya mencegahnya merusak file seperti itu?:r !xxd <file>
(atau$ xxd <file> | vim -
) membaca, dan:w !xxd -r > <file>
menulis, tetapi ini tidak ideal.Untuk melihat konten file biner dalam tampilan hex, buka file, aktifkan mode biner, dan filter buffer melalui
xxd
perintah:Anda dapat membuat perubahan di area kiri (mengedit nomor hex), dan ketika siap, filter melalui
xxd -r
, dan akhirnya simpan file:Jika langkah penyaringan setelah membuka dan sebelum menutup terdengar membosankan, dan Anda sering melakukan ini dengan file dengan
.bin
ekstensi, Anda dapat menambahkan ini ke vimrc Anda untuk membuat proses otomatis:sumber
:%!xxd
,:%!xxd -r
,:w
, didnt membuat perubahan!) Maka file biner tertulis tidak sama dengan aslinya ... Ini adalah kasus untuk Anda (saya diuji dengan/bin/ls
). Saya perlu menggunakan:set binary
sebelum menyimpan (juga lihat jawaban saya yang menjelaskan mengapa) ... Mungkin ada sesuatu di vimrc saya? Tapi bagaimanapun, saya akan selalu menggunakanset binary
untuk keselamatan ...augroup
skrip~/.vim/plugin/binary.vim
jika Anda tidak ingin mengacaukan.vimrc
augroup Binary
cantuman itu berlokasi di:help hex-editing
atau:help using-xxd
di Vim mana pun sejak 5,5 (Sep 1999).Gunakan editor "bvi". http://bvi.sourceforge.net/ (Ada di setiap repositori Linux.)
sumber
TL; DR Jawab
Buka file dengan Vim dalam mode biner:
Di Vim, masuk ke mode edit hex seperti:
Untuk menyimpan:
Ini akan mengubah buffer kembali dari mode hex dan kemudian menyimpan file seperti biasa.
Perhatikan opsi -p. Ini menghindari semua bulu cetak dan alamat tambahan dan hanya menampilkan hex. Abaikan saja -p jika Anda menginginkan konteks tambahan.
Hati-hati membuka file dengan Vim tidak dalam mode biner, karena akan menambahkan karakter LF (biasanya tidak disengaja) ke akhir file ketika Anda menyimpannya.
sumber
:h using-xxd
dan sudah ada sejakv7.0001
dan mungkin lebih lama. Situs ini akan menjadi kurang aktif jika orang mencari dokumen.Ini terlihat seperti plugin vim kecil yang berguna yang melakukan pekerjaan menggunakan file sementara yang ditulisnya bolak-balik untuk Anda secara otomatis.
Beberapa tahun yang lalu saya menemukan plugin serupa yang saya adaptasi dan tingkatkan untuk saya gunakan sendiri. Saya telah memasukkan kode yang relevan untuk itu di sini, kalau-kalau ada yang menginginkannya. Itu juga didasarkan pada alat xxd. Saya yakin versi GitHub yang saya tautkan di atas berfungsi lebih baik, tetapi saya belum benar-benar menggunakannya sendiri, jadi saya pikir saya juga akan memposting yang ini yang saya tahu pasti berfungsi.
Sumber untuk versi lain ini adalah wiki vim, khususnya halaman ini .
Ini kodenya:
sumber