Highlighting_In_Vim - rmu75/linuxcnc-wiki GitHub Wiki
upload:synton.png
Syntax hilighting for vim
from [this email thread]
1.make yourself a ~/.vim/ directory 2.make a syntax directory in there 3.save upload:ngc.vim into ~/.vim/syntax/ 4.save upload:filetype.vim into ~/.vim/ (or merge with your existing one, if any): 5.open, or restart vim 6.open any files with *.ngc extensions, and it should auto-highlight them
You can also force highlighting with: :set syntax=ngc
There are ways to have Vim check a few lines in the file to determine type, but that's more involved, and an exercise for a later date. You can duplicate the au! line in filetype.vim to add your own extension(s), or just modify the one that's already there (*.ngc).
The syntax file I made is understandably remedial, given the single night of R&D, but it already properly highlights a rather extensive set of the files I tested. I endeavored to break up each highlighting type in sensible, pre-defined ways, such that the power user with lots of the standard sub-types defined for their Vim sessions could benefit from something passably familiar. In fact, there are no custom highlight types - all are linked to types that already exist in Vim. I happen to have a lot of my subtypes as the same core type colors, so there's actually more separation of highlight types than you're seeing, but already I think it's a bit easier to visually parse.
Here's what I got to highlight before giving up:
- conditionals (if, else, endif)
- repeats (do, while, endwhile, break, continue)
- functions (sub, endsub, call, return)
- comments
- special comments (log stuff, print, msg, debug)
- identifiers (e.g. vars: #1, #<foo>, #<also_works>)
- operators (+, -, *, /, %, and all the EQ, and ACOS things)
- constants (ints, and floats)
- all g-codes
- all m-codes
- any o-code style number
- old-fashioned n# line numbers
- TODO, FIXME, XXX
- axes (x, y, z, a, b, c, u, v, w)
- feed rates
- "special" characters (i, j, k, e, d, l, p, r, s)
- tool selects, w/ h offset tool indices
Cool extras:
- everything is case-insensitive, as w/ NGC/LinuxCNC (g1, and G1 are the same)
- line breaks in comments break their highlighting to indicate the error
- special comments allow whitespace around keyword (e.g. ( MSG , etc...)
- identifiers inside special comments have their own highlight type
- n# labels, and o-codes only match if first non whitespace block on line
- TODO stuff all works from within comments, of course (where else?)
- axes highlight only if preceded by whitespace, and followed by digit, or [
- feed rates follow axes' rules, but can also be first characters on line
- special chars follow the rules of axes
Caveats:
- "-" is a tough one, in that it means 'minus,' and also 'negative'
- it currently never highlights with the constant (always an operator)
- I've at various points had it working in various ways
- this has much to do with the order in which highlights are defined
- it would appear to have a non-trivial, multi-workaround solution
- any change to order, or method breaks other highlighting - sigh...
- I got a bit lazy by the time I got to special chars/tool select stuff
- there are likely some oddities in this stuff
- I rarely/never use any of that stuff; it was low-priority for me
- probably plenty more :)
There could be all manner of fancy extras, like catching lots of other errors, and flagging them as such, but it gets rather complicated rather quickly. I wanted to post this ASAP in case it helps any Vim users, and in case anyone wanted to enhance it with things like more robust error-checking, tighter adherence to the spec, or new ways to break up the concepts (e.g. highlighting an entire X[#<something>] block as a single type (not my preference, but perhaps someone would prefer that), or properly checking item locations in lines, or getting negative constants working, without breaking all else. There are a lot of parts of the g-code spec that I've never touched (e.g. I've never used an M-code), so I've probably missed whole swaths of highlightables.
Anyway, feedback/corrections much appreciated, and if anyone gets it working, or makes some nice modifications, I'd love to hear about it. I don't think I have wiki powers, but if someone would like to add it, that would also be nice. Thanks! you're welcome. btw, how to edit wiki pages.
-Gary Fixler