Najprostszym sposobem jest skorzystanie z tej binary
opcji. Od :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.
Jeśli tego nie zrobisz, a twoje środowisko korzysta z kodowania wielobajtowego (np. UTF-8, jak większość ludzi używa), Vim próbuje zakodować tekst jako taki, co zwykle prowadzi do uszkodzenia pliku.
Możesz to sprawdzić, otwierając plik i po prostu używając :w
. To się teraz zmieniło.
Jeśli ustawisz LANG
i LC_ALL
na C
(ASCII), Vim nic nie konwertuje, a pliki pozostaną takie same (mimo to dodaje nowy wiersz), ponieważ Vim nie będzie musiał wykonywać żadnego kodowania wielobajtowego.
Ja też wolę wyłączyć set wrap
binarne, chociaż inni wolą to włączyć . YMMV. Kolejną przydatną rzeczą do zrobienia jest :set display=uhex
. Od :help 'display'
:
uhex Show unprintable characters hexadecimal as <xx>
instead of using ^C and ~C.
Na koniec możesz pokazać wartość szesnastkową znaku pod kursorem na linijce za pomocą %B
( :set rulerformat=0x%B
).
Bardziej zaawansowany: xxd
Możesz użyć tego xxd(1)
narzędzia do konwersji pliku do bardziej czytelnego formatu i (to jest ważny bit), przeanalizować edytowany „format czytelny” i zapisać go jako dane binarne. xxd
jest częścią vim
, więc jeśli vim
zainstalowałeś, powinieneś także mieć xxd
.
Aby go użyć:
$ xxd /bin/ls | vi -
Lub jeśli już otworzyłeś plik, możesz użyć:
:%!xxd
Teraz dokonaj zmian, musisz to zrobić po lewej stronie wyświetlacza (liczby szesnastkowe), zmiany po prawej stronie (reprezentacja do wydrukowania) są ignorowane podczas zapisu.
Aby go zapisać, użyj xxd -r
:
:%!xxd -r > new-ls
Spowoduje to zapisanie pliku w new-ls
.
Lub załadować plik binarny do bieżącego bufora:
:%!xxd -r
Od 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.
A potem po prostu użyj, :w
aby to napisać. ( uwaga : chcesz ustawić binary
opcję przed zapisaniem do pliku, z tych samych powodów, które opisano powyżej).
Uzupełniające się skróty klawiszowe, aby to trochę ułatwić:
" 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>
Jest to również dostępne z menu, jeśli używasz gVim, w „Narzędzia ➙ Konwertuj na HEX” i „Narzędzia ➙ Konwertuj z powrotem”.
Wskazówki vim Wiki ma stronę z większą zawartością, a niektóre skrypty pomocnicze. Osobiście uważam, że lepiej jest używać prawdziwego edytora szesnastkowego, jeśli często edytujesz pliki binarne. Vim może w
pewnym sensie wykonać to zadanie, ale oczywiście nie jest do tego przeznaczony, a jeśli kiedykolwiek napiszesz bez niego, :set binary
może zniszczyć twoje pliki binarne!