" Vim syntax file
" Language:	Metafont
" Maintainer:	Andreas Scherer <andreas.scherer@pobox.com>
" Last Change:	April 25, 2001

" For version 5.x: Clear all syntax items
" For version 6.x: Quit when a syntax file was already loaded
if version < 600
  syn clear
elseif exists("b:current_syntax")
  finish
endif

" Metafont 'primitives' as defined in chapter 25 of 'The METAFONTbook'
" Page 210: 'boolean expressions'
syn keyword mfBoolExp true false known unknown odd charexists not and or

" Page 210: 'numeric expression'
syn keyword mfNumExp normaldeviate length ASCII oct hex angle turningnumber
syn keyword mfNumExp totalweight directiontime xpart ypart xxpart xypart
syn keyword mfNumExp yxpart yypart sqrt sind cosd mlog mexp floor
syn keyword mfNumExp uniformdeviate

" Page 211: 'internal quantities'
syn keyword mfInternal tracingtitles tracingequations tracingcapsules
syn keyword mfInternal tracingchoices tracingspecs tracingpens
syn keyword mfInternal tracingcommands tracingrestores tracingmacros
syn keyword mfInternal tracingedges tracingoutput tracingonline tracingstats
syn keyword mfInternal pausing showstopping fontmaking proofing
syn keyword mfInternal turningcheck warningcheck smoothing autorounding
syn keyword mfInternal granularity fillin year month day time
syn keyword mfInternal charcode charext charwd charht chardp charic
syn keyword mfInternal chardx chardy designsize hppp vppp xoffset yoffset
syn keyword mfInternal boundarychar

" Page 212: 'pair expressions'
syn keyword mfPairExp point of precontrol postcontrol penoffset rotated
syn keyword mfPairExp scaled shifted slanted transformed xscaled yscaled
syn keyword mfPairExp zscaled

" Page 213: 'path expressions'
syn keyword mfPathExp makepath reverse subpath curl tension atleast
syn keyword mfPathExp controls cycle

" Page 214: 'pen expressions'
syn keyword mfPenExp nullpen pencircle makepen

" Page 214: 'picutre expressions'
syn keyword mfPicExp nullpicture

" Page 214: 'string expressions'
syn keyword mfStringExp jobname readstring str char decimal substring

" Page 217: 'commands and statements'
syn keyword mfCommand end dump save interim newinternal randomseed let
syn keyword mfCommand delimiters outer everyjob show showvariable showtoken
syn keyword mfCommand showdependencies showstats message errmessage errhelp
syn keyword mfCommand batchmode nonstopmode scrollmode errorstopmode
syn keyword mfCommand addto also contour doublepath withpen withweight cull
syn keyword mfCommand keeping dropping display inwindow openwindow at from to
syn keyword mfCommand shipout special numspecial

" Page 56: 'types'
syn keyword mfType boolean numeric pair path pen picture string transform

" Page 155: 'grouping'
syn keyword mfStatement begingroup endgroup

" Page 165: 'definitions'
syn keyword mfDefinition enddef def expr suffix text primary secondary
syn keyword mfDefinition tertiary vardef primarydef secondarydef tertiarydef

" Page 169: 'conditions and loops'
syn keyword mfCondition if fi else elseif endfor for forsuffixes forever
syn keyword mfCondition step until exitif

" Other primitives listed in the index
syn keyword mfPrimitive charlist endinput expandafter extensible
syn keyword mfPrimitive fontdimen headerbyte inner input intersectiontimes
syn keyword mfPrimitive kern ligtable quote scantokens skipto

" Keywords defined by plain.mf (defined on pp.262-278)
if !exists("plain_mf_macros")
  let plain_mf_macros = 1 " Set this to '0' if your source gets too colourful
			  " metapost.vim does so to turn off Metafont macros
endif
if plain_mf_macros
  syn keyword mfMacro abs addto_currentpicture aspect_ratio base_name
  syn keyword mfMacro base_version beginchar blacker blankpicture bot bye byte
  syn keyword mfMacro capsule_def ceiling change_width clear_pen_memory clearit
  syn keyword mfMacro clearpen clearxy counterclockwise culldraw cullit
  syn keyword mfMacro currentpen currentpen_path currentpicture
  syn keyword mfMacro currenttransform currentwindow cutdraw cutoff d decr
  syn keyword mfMacro define_blacker_pixels define_corrected_pixels
  syn keyword mfMacro define_good_x_pixels define_good_y_pixels
  syn keyword mfMacro define_horizontal_corrected_pixels define_pixels
  syn keyword mfMacro define_whole_blacker_pixels define_whole_pixels
  syn keyword mfMacro define_whole_vertical_blacker_pixels
  syn keyword mfMacro define_whole_vertical_pixels dir direction directionpoint
  syn keyword mfMacro displaying ditto div dotprod down downto draw drawdot
  syn keyword mfMacro endchar eps epsilon extra_beginchar extra_endchar
  syn keyword mfMacro extra_setup erase exitunless fill filldraw fix_units flex
  syn keyword mfMacro font_coding_scheme font_extra_space font_identifier
  syn keyword mfMacro font_normal_shrink font_normal_space font_normal_stretch
  syn keyword mfMacro font_quad font_setup font_size font_slant font_x_height
  syn keyword mfMacro fullcircle generate gfcorners gobble gobbled grayfont h
  syn keyword mfMacro halfcircle hide hround identity image_rules incr infinity
  syn keyword mfMacro interact interpath intersectionpoint inverse italcorr
  syn keyword mfMacro join_radius killtext labelfont labels left lft localfont
  syn keyword mfMacro loggingall lowres lowres_fix mag magstep makebox makegrid
  syn keyword mfMacro makelabel maketicks max min mod mode mode_def mode_name
  syn keyword mfMacro mode_setup nodisplays notransforms number_of_modes numtok
  syn keyword mfMacro o_correction openit origin pen_bot pen_lft pen_rt pen_top
  syn keyword mfMacro penlabels penpos penrazor penspeck pensquare penstroke
  syn keyword mfMacro pickup pixels_per_inch proof proofoffset proofrule
  syn keyword mfMacro proofrulethickness quartercircle range reflectedabout
  syn keyword mfMacro relax right rotatedabout rotatedaround round rt rulepen
  syn keyword mfMacro savepen screenchars screen_rows screen_cols screenrule
  syn keyword mfMacro screenstrokes shipit showit slantfont smode smoke softjoin
  syn keyword mfMacro solve stop superellipse takepower tensepath titlefont
  syn keyword mfMacro tolerance top tracingall tracingnone undraw undrawdot
  syn keyword mfMacro unfill unfilldraw unitpixel unitsquare unitvector up upto
  syn keyword mfMacro vround w whatever
endif

" Some other basic macro names, e.g., from cmbase, logo, etc.
if !exists("other_mf_macros")
  let other_mf_macros = 1 " Set this to '0' if your code gets too colourful
			  " metapost.vim does so to turn off Metafont macros
endif
if other_mf_macros
  syn keyword mfMacro beginlogochar
endif

" Numeric tokens
syn match mfNumeric	"[-]\=\d\+"
syn match mfNumeric	"[-]\=\.\d\+"
syn match mfNumeric	"[-]\=\d\+\.\d\+"

" Metafont lengths
syn match mfLength	"\<\(bp\|cc\|cm\|dd\|in\|mm\|pc\|pt\)\>"
syn match mfLength	"\<[-]\=\d\+\(bp\|cc\|cm\|dd\|in\|mm\|pc\|pt\)\#\=\>"
syn match mfLength	"\<[-]\=\.\d\+\(bp\|cc\|cm\|dd\|in\|mm\|pc\|pt\)\#\=\>"
syn match mfLength	"\<[-]\=\d\+\.\d\+\(bp\|cc\|cm\|dd\|in\|mm\|pc\|pt\)\#\=\>"

" Metafont coordinates and points
syn match mfCoord	"\<[xy]\d\+\>"
syn match mfPoint	"\<z\d\+\>"

" String constants
syn region mfString	start=+"+ end=+"+

" Comments:
syn match mfComment	"%.*$"

" synchronizing
syn sync maxlines=50

" Define the default highlighting
" For version 5.7 and earlier: only when not done already
" For version 5.8 and later: only when an item doesn't have highlighting yet
if version >= 508 || !exists("did_mf_syntax_inits")
  if version < 508
    let did_mf_syntax_inits = 1
    command -nargs=+ HiLink hi link <args>
  else
    command -nargs=+ HiLink hi def link <args>
  endif

  HiLink mfBoolExp	Statement
  HiLink mfNumExp	Statement
  HiLink mfInternal	Identifier
  HiLink mfPairExp	Statement
  HiLink mfPathExp	Statement
  HiLink mfPenExp	Statement
  HiLink mfPicExp	Statement
  HiLink mfStringExp	Statement
  HiLink mfCommand	Statement
  HiLink mfType	Type
  HiLink mfStatement	Statement
  HiLink mfDefinition	Statement
  HiLink mfCondition	Conditional
  HiLink mfPrimitive	Statement
  HiLink mfMacro	Macro
  HiLink mfCoord	Identifier
  HiLink mfPoint	Identifier
  HiLink mfNumeric	Number
  HiLink mfLength	Number
  HiLink mfComment	Comment
  HiLink mfString	String

  delcommand HiLink
endif

let b:current_syntax = "mf"

" vim: ts=8
