summaryrefslogtreecommitdiff
path: root/runtime/syntax/hex.vim
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/syntax/hex.vim')
-rw-r--r--runtime/syntax/hex.vim95
1 files changed, 70 insertions, 25 deletions
diff --git a/runtime/syntax/hex.vim b/runtime/syntax/hex.vim
index 40c655395..40f7f0dd1 100644
--- a/runtime/syntax/hex.vim
+++ b/runtime/syntax/hex.vim
@@ -1,7 +1,29 @@
" Vim syntax file
-" Language: Intel hex MCS51
-" Maintainer: Sams Ricahrd <sams@ping.at>
-" Last Change: 2003 Apr 25
+" Language: Intel HEX
+" Maintainer: Markus Heidelberg <markus.heidelberg@web.de>
+" Previous version: Sams Ricahrd <sams@ping.at>
+" Last Change: 2015 Feb 24
+
+" Each record (line) is built as follows:
+"
+" field digits states
+"
+" +----------+
+" | start | 1 (':') hexRecStart
+" +----------+
+" | count | 2 hexDataByteCount
+" +----------+
+" | address | 4 hexNoAddress, hexDataAddress, (hexAddressFieldUnknown)
+" +----------+
+" | type | 2 hexRecType, (hexRecTypeUnknown)
+" +----------+
+" | data | 0..510 hexDataOdd, hexDataEven, hexExtendedAddress, hexStartAddress, (hexDataFieldUnknown, hexDataUnexpected)
+" +----------+
+" | checksum | 2 hexChecksum
+" +----------+
+"
+" States in parentheses in the upper format description indicate that they
+" should not appear in a valid file.
" For version 5.x: Clear all syntax items
" For version 6.x: Quit when a syntax file was already loaded
@@ -11,21 +33,39 @@ elseif exists("b:current_syntax")
finish
endif
-syn case ignore
+syn match hexRecStart "^:"
+
+syn match hexDataByteCount "^:[0-9a-fA-F]\{2}" contains=hexRecStart nextgroup=hexAddress
+
+syn match hexAddress "[0-9a-fA-F]\{4}" transparent contained nextgroup=hexRecTypeUnknown,hexRecType
+" The address field groups include the record type field in the last 2
+" characters, the proper match for highlighting follows below.
+syn match hexAddressFieldUnknown "^:[0-9a-fA-F]\{8}" contains=hexDataByteCount nextgroup=hexDataFieldUnknown,hexChecksum
+syn match hexDataAddress "^:[0-9a-fA-F]\{6}00" contains=hexDataByteCount nextgroup=hexDataOdd,hexChecksum
+syn match hexNoAddress "^:[0-9a-fA-F]\{6}01" contains=hexDataByteCount nextgroup=hexDataUnexpected,hexChecksum
+syn match hexNoAddress "^:[0-9a-fA-F]\{6}0[24]" contains=hexDataByteCount nextgroup=hexExtendedAddress
+syn match hexNoAddress "^:[0-9a-fA-F]\{6}0[35]" contains=hexDataByteCount nextgroup=hexStartAddress
+
+syn match hexRecTypeUnknown "[0-9a-fA-F]\{2}" contained
+syn match hexRecType "0[0-5]" contained
+
+syn match hexDataFieldUnknown "[0-9a-fA-F]\{2}" contained nextgroup=hexDataFieldUnknown,hexChecksum
+" alternating highlight per byte for easier reading
+syn match hexDataOdd "[0-9a-fA-F]\{2}" contained nextgroup=hexDataEven,hexChecksum
+syn match hexDataEven "[0-9a-fA-F]\{2}" contained nextgroup=hexDataOdd,hexChecksum
+" data bytes which should not exist
+syn match hexDataUnexpected "[0-9a-fA-F]\{2}" contained nextgroup=hexDataUnexpected,hexChecksum
+" Data digit pair regex usage also results in only highlighting the checksum
+" if the number of data characters is even.
-" storage types
+" special data fields
+syn match hexExtendedAddress "[0-9a-fA-F]\{4}" contained nextgroup=hexDataUnexpected,hexChecksum
+syn match hexStartAddress "[0-9a-fA-F]\{8}" contained nextgroup=hexDataUnexpected,hexChecksum
-syn match hexChecksum "[0-9a-fA-F]\{2}$"
-syn match hexAdress "^:[0-9a-fA-F]\{6}" contains=hexDataByteCount
-syn match hexRecType "^:[0-9a-fA-F]\{8}" contains=hexAdress
-syn match hexDataByteCount contained "^:[0-9a-fA-F]\{2}" contains=hexStart
-syn match hexStart contained "^:"
-syn match hexExtAdrRec "^:02000002[0-9a-fA-F]\{4}" contains=hexSpecRec
-syn match hexExtLinAdrRec "^:02000004[0-9a-fA-F]\{4}" contains=hexSpecRec
-syn match hexSpecRec contained "^:0[02]00000[124]" contains=hexStart
-syn match hexEOF "^:00000001" contains=hexStart
+syn match hexChecksum "[0-9a-fA-F]\{2}$" contained
-syn case match
+" Folding Data Records below an Extended Segment/Linear Address Record
+syn region hexExtAdrBlock start="^:[0-9a-fA-F]\{7}[24]" skip="^:[0-9a-fA-F]\{7}0" end="^:"me=s-1 fold transparent
" Define the default highlighting.
" For version 5.7 and earlier: only when not done already
@@ -38,16 +78,21 @@ if version >= 508 || !exists("did_hex_syntax_inits")
command -nargs=+ HiLink hi def link <args>
endif
- " The default methods for highlighting. Can be overridden later
- HiLink hexStart SpecialKey
- HiLink hexDataByteCount Constant
- HiLink hexAdress Comment
- HiLink hexRecType WarningMsg
- HiLink hexChecksum Search
- HiLink hexExtAdrRec hexAdress
- HiLink hexEOF hexSpecRec
- HiLink hexExtLinAdrRec hexAdress
- HiLink hexSpecRec DiffAdd
+ " The default methods for highlighting. Can be overridden later
+ HiLink hexRecStart hexRecType
+ HiLink hexDataByteCount Constant
+ hi def hexAddressFieldUnknown term=italic cterm=italic gui=italic
+ HiLink hexDataAddress Comment
+ HiLink hexNoAddress DiffAdd
+ HiLink hexRecTypeUnknown hexRecType
+ HiLink hexRecType WarningMsg
+ hi def hexDataFieldUnknown term=italic cterm=italic gui=italic
+ hi def hexDataOdd term=bold cterm=bold gui=bold
+ hi def hexDataEven term=NONE cterm=NONE gui=NONE
+ HiLink hexDataUnexpected Error
+ HiLink hexExtendedAddress hexDataAddress
+ HiLink hexStartAddress hexDataAddress
+ HiLink hexChecksum DiffChange
delcommand HiLink
endif