Cách đơn giản nhất là sử dụng binary
tùy chọn. Từ :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.
Nếu bạn không làm điều này và môi trường của bạn đang sử dụng mã hóa đa bào (ví dụ UTF-8, như hầu hết mọi người sử dụng), Vim cố gắng mã hóa văn bản như vậy, thường dẫn đến hỏng tệp.
Bạn có thể xác minh điều này bằng cách mở một tệp và chỉ cần sử dụng :w
. Bây giờ nó đã được thay đổi.
Nếu bạn đặt LANG
và LC_ALL
thành C
(ASCII), Vim sẽ không chuyển đổi bất cứ thứ gì và các tệp vẫn giữ nguyên (tuy nhiên nó vẫn thêm một dòng mới) vì Vim sẽ không cần thực hiện bất kỳ mã hóa đa bào nào.
Cá nhân tôi cũng thích vô hiệu hóa set wrap
nhị phân, mặc dù những người khác có thể thích kích hoạt nó. YMMV. Một điều hữu ích để làm là :set display=uhex
. Từ :help 'display'
:
uhex Show unprintable characters hexadecimal as <xx>
instead of using ^C and ~C.
Và như một mẹo cuối cùng, bạn có thể hiển thị giá trị hex của ký tự dưới con trỏ trong thước kẻ với %B
( :set rulerformat=0x%B
).
Nâng cao hơn: xxd
Bạn có thể sử dụng xxd(1)
công cụ để chuyển đổi một tệp thành định dạng dễ đọc hơn và (đây là bit quan trọng), phân tích "định dạng có thể đọc" đã chỉnh sửa và ghi lại dưới dạng dữ liệu nhị phân. xxd
là một phần của vim
, vì vậy nếu bạn đã vim
cài đặt, bạn cũng nên có xxd
.
Để dùng nó:
$ xxd /bin/ls | vi -
Hoặc nếu bạn đã mở tệp, bạn có thể sử dụng:
:%!xxd
Bây giờ thực hiện các thay đổi của bạn, bạn cần thực hiện điều đó ở phía bên trái của màn hình (các số hex), các thay đổi ở phía bên phải (biểu diễn có thể in) được bỏ qua khi ghi.
Để lưu nó, sử dụng xxd -r
:
:%!xxd -r > new-ls
Điều này sẽ lưu các tập tin vào new-ls
.
Hoặc để tải nhị phân trong bộ đệm hiện tại:
:%!xxd -r
Từ 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.
Và sau đó chỉ cần sử dụng :w
để viết nó. ( hãy cẩn thận : bạn muốn đặt binary
tùy chọn trước khi ghi vào tệp, vì những lý do tương tự như đã nêu ở trên).
Bàn phím bổ sung để làm điều này dễ dàng hơn một chút:
" 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>
Điều này cũng có sẵn từ menu nếu bạn đang sử dụng gVim, trong 'Công cụ Chuyển đổi sang HEX' và 'Công cụ Chuyển đổi trở lại'.
Các mẹo vim wiki có một trang với nhiều thông tin hơn và một số tập lệnh trợ giúp. Cá nhân, tôi nghĩ rằng có lẽ bạn nên sử dụng trình soạn thảo hex thực sự nếu bạn thường xuyên chỉnh sửa các tệp nhị phân. Vim có thể
thực hiện công việc, nhưng rõ ràng nó không được thiết kế cho nó và nếu bạn từng viết mà không có :set binary
Vim có thể phá hủy các tệp nhị phân của bạn!