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!
:set binary noeol fenc=utf-8
. W rzeczywistości robi to natychmiast po otwarciu pliku, zanim to powie[noeol] [converted]
. Dlaczego vim musi zwiększyć bufor o 150%? Jak mogę zapobiec takiemu uszkodzeniu plików?:r !xxd <file>
(lub$ xxd <file> | vim -
) czytanie i:w !xxd -r > <file>
pisanie, ale nie jest to idealne.Aby wyświetlić zawartość pliku binarnego w widoku szesnastkowym, otwórz plik, włącz tryb binarny i przefiltruj bufor za pomocą
xxd
polecenia:Możesz dokonać zmian w lewym obszarze (edytować numery szesnastkowe), a kiedy będziesz gotowy, przefiltruj
xxd -r
i ostatecznie zapisz plik:Jeśli krok filtrowania po otwarciu i przed zamknięciem wydaje się uciążliwy, a często robisz to z plikami z
.bin
rozszerzeniem, możesz dodać to do vimrc, aby proces był automatyczny:źródło
:%!xxd
,:%!xxd -r
,:w
, zrobił wprowadzać żadnych zmian!) To plik binarny napisane jest nie taka sama jak oryginał ... Czy to sprawa dla ciebie (I przetestowane/bin/ls
). Muszę użyć:set binary
przed zapisaniem (zobacz także moją odpowiedź, która wyjaśnia dlaczego) ... Może to coś w moim vimrc? Ale niezależnie od tego zawsze używałbymset binary
dla bezpieczeństwa ...augroup
skrypt,~/.vim/plugin/binary.vim
jeśli nie chcesz zaśmiecać.vimrc
augroup Binary
wpis znajduje się w:help hex-editing
lub:help using-xxd
w Vimie od 5.5 (wrzesień 1999).Użyj edytora „bvi”. http://bvi.sourceforge.net/ (znajduje się w każdym repozytorium Linux).
źródło
TL; DR Odpowiedź
Otwórz plik za pomocą Vima w trybie binarnym:
W Vimie przejdź do trybu edycji szesnastkowej:
Zapisać:
Spowoduje to konwersję bufora z trybu szesnastkowego, a następnie zapisanie pliku w zwykły sposób.
Zwróć uwagę na opcję -p. Pozwala to uniknąć dodatkowego zbędnego drukowania i adresowania puchu, a jedynie pokazuje heks. Po prostu pomiń -p, jeśli potrzebujesz dodatkowego kontekstu.
Ostrożnie otwieraj plik, gdy Vim nie jest w trybie binarnym, ponieważ podczas zapisywania doda (zwykle niezamierzony) znak LF na końcu pliku.
źródło
:h using-xxd
i istnieje od tego czasuv7.0001
i prawdopodobnie dłużej. Ta witryna byłaby mniej aktywna, gdyby ludzie przeszukiwali dokumenty.To wygląda mało poręczne vim wtyczki, która wykonuje prace przy użyciu pliku tymczasowego, który pisze iz powrotem automatycznie.
Kilka lat temu znalazłem podobną wtyczkę, którą dostosowałem i ulepszyłem na własny użytek. Podałem tutaj odpowiedni kod na wypadek, gdyby ktoś tego chciał. Opiera się również na narzędziu xxd. Jestem pewien, że wersja GitHub, którą podłączyłem powyżej, działa lepiej, ale ja sam jej nie użyłem, więc pomyślałem, że opublikuję również tę, o której wiem, że na pewno działa.
Źródłem tej drugiej wersji była wiki vim, w szczególności ta strona .
Oto kod:
źródło