+ Statusline for Hexfiles
git-svn-id: https://vimsuite.svn.sourceforge.net/svnroot/vimsuite/trunk@183 eb2d0018-73a3-4aeb-bfe9-1def61c9ec69
This commit is contained in:
parent
587fd7e78a
commit
bd755f44a3
131
vimfiles.stefan/ftplugin/hex.vim
Normal file
131
vimfiles.stefan/ftplugin/hex.vim
Normal file
@ -0,0 +1,131 @@
|
||||
|
||||
" Parse Intel Hex Line into Dictionary
|
||||
function! s:HexParseLine(line)
|
||||
let Pattern = '^:\(..\)\(....\)\(..\)\(.*\)\(..\)$'
|
||||
let Length = substitute(a:line, Pattern, '\1', '')
|
||||
let Address = substitute(a:line, Pattern, '\2', '')
|
||||
let Type = substitute(a:line, Pattern, '\3', '')
|
||||
let Data = substitute(a:line, Pattern, '\4', '')
|
||||
let Checksum = substitute(a:line, Pattern, '\5', '')
|
||||
let LineDict = {
|
||||
\'Length': Length,
|
||||
\'Address': Address,
|
||||
\'Type': Type,
|
||||
\'Data': Data,
|
||||
\'Checksum': Checksum,
|
||||
\}
|
||||
return LineDict
|
||||
endfunction
|
||||
|
||||
" Get number of current byte of data
|
||||
function! s:HexGetDataByte()
|
||||
let Pos = getpos('.')
|
||||
let Column = Pos[2]
|
||||
let FirstData = 10
|
||||
let LastData = len(getline(line('.'))) - 2
|
||||
if Column < FirstData
|
||||
let Column = FirstData
|
||||
endif
|
||||
if Column > LastData
|
||||
let Column = LastData
|
||||
endif
|
||||
let DataByte = eval('('.Column.'-'.FirstData.') / 2')
|
||||
return DataByte
|
||||
endfunction
|
||||
|
||||
" Get Address of current cursor position
|
||||
function! s:HexGetAddress()
|
||||
let AddressLineNumber = search('^:02*', 'bcnW')
|
||||
let AddressLine = getline(AddressLineNumber)
|
||||
|
||||
let LineDict = s:HexParseLine(AddressLine)
|
||||
let ExtLinAddress = LineDict['Data']
|
||||
|
||||
let LineDict = s:HexParseLine(getline(line('.')))
|
||||
let AddressOffset = LineDict['Address']
|
||||
|
||||
let LineAddressOffset = s:HexGetDataByte()
|
||||
|
||||
let Address = eval(
|
||||
\ ' (0x'.ExtLinAddress.' * 0x10000)'
|
||||
\ .'+(0x'.AddressOffset.')'
|
||||
\ .'+( '.LineAddressOffset.')'
|
||||
\ )
|
||||
return printf('0x%x', Address)
|
||||
endfunction
|
||||
|
||||
" Split data string in List of byte strings
|
||||
function! HexSplitData(DataString)
|
||||
let DataList = split(a:DataString, '..\zs')
|
||||
return DataList
|
||||
endfunction
|
||||
|
||||
" Get ASCII representation of current data
|
||||
function! s:HexGetAsciiLine()
|
||||
let String = ''
|
||||
let LineDict = s:HexParseLine(getline(line('.')))
|
||||
let Data = LineDict['Data']
|
||||
let DataList = HexSplitData(Data)
|
||||
for Byte in DataList
|
||||
let ByteVal = eval('0x'.Byte)
|
||||
let String .= nr2char(ByteVal)
|
||||
endfor
|
||||
return String
|
||||
endfunction
|
||||
|
||||
" Get value of current data under cursor for a:Bytes
|
||||
function! HexGetVal(Bytes)
|
||||
let StartByte = s:HexGetDataByte()
|
||||
let HexString = ''
|
||||
let LineDict = s:HexParseLine(getline(line('.')))
|
||||
let Data = LineDict['Data']
|
||||
let DataList = HexSplitData(Data)
|
||||
let ByteNum = 0
|
||||
while ByteNum < a:Bytes
|
||||
try
|
||||
let HexString .= DataList[StartByte + ByteNum]
|
||||
catch /^Vim\%((\a\+)\)\=:E684/
|
||||
throw 'oops'
|
||||
finally
|
||||
let ByteNum += 1
|
||||
endtry
|
||||
endwhile
|
||||
return eval('0x'.HexString)
|
||||
endfunction
|
||||
|
||||
" Get actual values for 1, 2, 4 Bytes in hex and dez
|
||||
function! s:HexGetDezValuesString()
|
||||
let String = ''
|
||||
for i in [1, 2, 4]
|
||||
try
|
||||
let Byte = HexGetVal(i)
|
||||
catch /oops/
|
||||
break
|
||||
endtry
|
||||
let String .= ' ' . printf('0x%x (%d)', Byte, Byte)
|
||||
endfor
|
||||
return String
|
||||
endfunction
|
||||
|
||||
" Build string for statusline
|
||||
function! HexStatusLine()
|
||||
let StatusLine =
|
||||
\ ' Address: '
|
||||
\ . s:HexGetAddress()
|
||||
\ . ' Data: '
|
||||
\ . s:HexGetAsciiLine()
|
||||
\ . ' Values: '
|
||||
\ . s:HexGetDezValuesString()
|
||||
return StatusLine
|
||||
endfunction
|
||||
|
||||
"command! HexAddress call Test()
|
||||
"function! Test()
|
||||
" echo HexStatusLine()
|
||||
"endfunction
|
||||
|
||||
command HexStatusLine set statusline=%!HexStatusLine()
|
||||
" Update statusline with HEX info
|
||||
set statusline=%!HexStatusLine()
|
||||
" Always show statusline
|
||||
set laststatus=2
|
Loading…
x
Reference in New Issue
Block a user