Created
November 12, 2021 01:56
-
-
Save ShaneEverittM/4477e8cb661d92f539dffefb16eea21d to your computer and use it in GitHub Desktop.
Hex Edit FTDetect
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
" ex command for toggling hex mode - define mapping if desired | |
command -bar Hexmode call ToggleHex() | |
" helper function to toggle hex mode | |
function ToggleHex() | |
" hex mode should be considered a read-only operation | |
" save values for modified and read-only for restoration later, | |
" and clear the read-only flag for now | |
let l:modified=&mod | |
let l:oldreadonly=&readonly | |
let &readonly=0 | |
let l:oldmodifiable=&modifiable | |
let &modifiable=1 | |
if !exists("b:editHex") || !b:editHex | |
" save old options | |
let b:oldft=&ft | |
let b:oldbin=&bin | |
" set new options | |
setlocal binary " make sure it overrides any textwidth, etc. | |
silent :e " this will reload the file without trickeries | |
"(DOS line endings will be shown entirely ) | |
let &ft="xxd" | |
" set status | |
let b:editHex=1 | |
" switch to hex editor | |
%!xxd | |
else | |
" restore old options | |
let &ft=b:oldft | |
if !b:oldbin | |
setlocal nobinary | |
endif | |
" set status | |
let b:editHex=0 | |
" return to normal editing | |
%!xxd -r | |
endif | |
" restore values for modified and read only state | |
let &mod=l:modified | |
let &readonly=l:oldreadonly | |
let &modifiable=l:oldmodifiable | |
endfunction | |
" autocmds to automatically enter hex mode and handle file writes properly | |
if has("autocmd") | |
" vim -b : edit binary using xxd-format! | |
augroup Binary | |
au! | |
" set binary option for all binary files before reading them | |
au BufReadPre *.bin,*.hex setlocal binary | |
" if on a fresh read the buffer variable is already set, it's wrong | |
au BufReadPost * | |
\ if exists('b:editHex') && b:editHex | | |
\ let b:editHex = 0 | | |
\ endif | |
" convert to hex on startup for binary files automatically | |
au BufReadPost * | |
\ if &binary | Hexmode | endif | |
" When the text is freed, the next time the buffer is made active it will | |
" re-read the text and thus not match the correct mode, we will need to | |
" convert it again if the buffer is again loaded. | |
au BufUnload * | |
\ if getbufvar(expand("<afile>"), 'editHex') == 1 | | |
\ call setbufvar(expand("<afile>"), 'editHex', 0) | | |
\ endif | |
" before writing a file when editing in hex mode, convert back to non-hex | |
au BufWritePre * | |
\ if exists("b:editHex") && b:editHex && &binary | | |
\ let oldro=&ro | let &ro=0 | | |
\ let oldma=&ma | let &ma=1 | | |
\ silent exe "%!xxd -r" | | |
\ let &ma=oldma | let &ro=oldro | | |
\ unlet oldma | unlet oldro | | |
\ endif | |
" after writing a binary file, if we're in hex mode, restore hex mode | |
au BufWritePost * | |
\ if exists("b:editHex") && b:editHex && &binary | | |
\ let oldro=&ro | let &ro=0 | | |
\ let oldma=&ma | let &ma=1 | | |
\ silent exe "%!xxd" | | |
\ exe "set nomod" | | |
\ let &ma=oldma | let &ro=oldro | | |
\ unlet oldma | unlet oldro | | |
\ endif | |
augroup END | |
endif |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment