vim-haskell -> hasksyn
This commit is contained in:
parent
0a4fcd12b6
commit
35433aa23c
9
after/ftplugin/haskell.vim
Normal file
9
after/ftplugin/haskell.vim
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
" Vim ftplugin file
|
||||||
|
" Language: Haskell
|
||||||
|
" Maintainer: Tristan Ravitch
|
||||||
|
|
||||||
|
" I don't fully understand what the vim-default ftplugin does, but I do know
|
||||||
|
" that the three-part comment entry really messes up this indenter (I also
|
||||||
|
" hate the leading '-'s it puts in on each line). Disable it here.
|
||||||
|
setlocal comments&
|
||||||
|
setlocal comments=:--
|
2
build.sh
2
build.sh
@ -49,7 +49,6 @@ syntax 'groenewege/vim-less' &
|
|||||||
syntax 'wavded/vim-stylus' &
|
syntax 'wavded/vim-stylus' &
|
||||||
syntax 'tpope/vim-cucumber' &
|
syntax 'tpope/vim-cucumber' &
|
||||||
syntax 'jrk/vim-ocaml' &
|
syntax 'jrk/vim-ocaml' &
|
||||||
syntax 'wlangstroth/vim-haskell' &
|
|
||||||
syntax 'slim-template/vim-slim' &
|
syntax 'slim-template/vim-slim' &
|
||||||
syntax 'vim-scripts/XSLT-syntax' &
|
syntax 'vim-scripts/XSLT-syntax' &
|
||||||
syntax 'vim-scripts/python.vim--Vasiliev' &
|
syntax 'vim-scripts/python.vim--Vasiliev' &
|
||||||
@ -59,6 +58,7 @@ syntax 'spf13/PIV' &
|
|||||||
syntax 'briancollins/vim-jst' &
|
syntax 'briancollins/vim-jst' &
|
||||||
syntax 'derekwyatt/vim-scala' &
|
syntax 'derekwyatt/vim-scala' &
|
||||||
syntax 'derekwyatt/vim-sbt' &
|
syntax 'derekwyatt/vim-sbt' &
|
||||||
|
syntax 'travitch/hasksyn' &
|
||||||
|
|
||||||
wait
|
wait
|
||||||
|
|
||||||
|
@ -1,2 +0,0 @@
|
|||||||
" autocommand
|
|
||||||
au BufRead,BufNewFile *.hs set comments=sl:{-,mb:--,elx:-}
|
|
@ -1,13 +0,0 @@
|
|||||||
"
|
|
||||||
" general Haskell source settings
|
|
||||||
" (shared functions are in autoload/haskellmode.vim)
|
|
||||||
"
|
|
||||||
" (Claus Reinke, last modified: 28/04/2009)
|
|
||||||
"
|
|
||||||
" part of haskell plugins: http://projects.haskell.org/haskellmode-vim
|
|
||||||
" please send patches to <claus.reinke@talk21.com>
|
|
||||||
|
|
||||||
" try gf on import line, or ctrl-x ctrl-i, or [I, [i, ..
|
|
||||||
setlocal include=^import\\s*\\(qualified\\)\\?\\s*
|
|
||||||
setlocal includeexpr=substitute(v:fname,'\\.','/','g').'.'
|
|
||||||
setlocal suffixesadd=hs,lhs,hsc
|
|
@ -1,85 +1,296 @@
|
|||||||
" Vim indent file
|
" Vim indent file
|
||||||
" Language: Haskell
|
" Language: Haskell
|
||||||
" Author: motemen <motemen@gmail.com>
|
" Maintainer: Tristan Ravitch
|
||||||
" Version: 0.1
|
|
||||||
" Last Change: 2007-07-25
|
|
||||||
"
|
|
||||||
" Modify g:haskell_indent_if and g:haskell_indent_case to
|
|
||||||
" change indentation for `if'(default 3) and `case'(default 5).
|
|
||||||
" Example (in .vimrc):
|
|
||||||
" > let g:haskell_indent_if = 2
|
|
||||||
|
|
||||||
if exists('b:did_indent')
|
if exists('b:did_indent')
|
||||||
finish
|
finish
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let b:did_indent = 1
|
let b:did_indent = 1
|
||||||
|
|
||||||
if !exists('g:haskell_indent_if')
|
if !exists('g:hasksyn_indent_search_backward')
|
||||||
" if bool
|
let g:hasksyn_indent_search_backward = 100
|
||||||
" >>>then ...
|
|
||||||
" >>>else ...
|
|
||||||
let g:haskell_indent_if = 2
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if !exists('g:haskell_indent_case')
|
if !exists('g:hasksyn_dedent_after_return')
|
||||||
" case xs of
|
let g:hasksyn_dedent_after_return = 1
|
||||||
" >>>>>[] -> ...
|
|
||||||
" >>>>>(y:ys) -> ...
|
|
||||||
let g:haskell_indent_case = 2
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
setlocal indentexpr=GetHaskellIndent()
|
if !exists('g:hasksyn_dedent_after_catchall_case')
|
||||||
setlocal indentkeys=!^F,o,O
|
let g:hasksyn_dedent_after_catchall_case = 1
|
||||||
|
endif
|
||||||
|
|
||||||
function! GetHaskellIndent()
|
setlocal noautoindent
|
||||||
let line = substitute(getline(getpos('.')[1] - 1), '\t', repeat(' ', &tabstop), 'g')
|
setlocal indentexpr=HIndent(v:lnum)
|
||||||
|
setlocal indentkeys+=0=where
|
||||||
|
setlocal indentkeys+=0=->
|
||||||
|
setlocal indentkeys+=0==>
|
||||||
|
setlocal indentkeys+=0=in
|
||||||
|
setlocal indentkeys+=0=class,0=instance,0=import
|
||||||
|
setlocal indentkeys+=<Bar>
|
||||||
|
setlocal indentkeys+=0\,
|
||||||
|
|
||||||
if line =~ '[!#$%&*+./<=>?@\\^|~-]$\|\<do$'
|
if exists("*HIndent")
|
||||||
return match(line, '\s*where \zs\|\S') + &shiftwidth
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
function! HIndent(lnum)
|
||||||
|
" Don't do anything boneheaded if we are inside of a block comment
|
||||||
|
if s:IsInBlockComment()
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
|
||||||
|
let plnum = s:PrevNonCommentLineNum(a:lnum)
|
||||||
|
if plnum == 0
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
let prevl = s:GetAndStripTrailingComments(plnum)
|
||||||
|
let thisl = s:GetAndStripTrailingComments(a:lnum)
|
||||||
|
let previ = indent(plnum)
|
||||||
|
|
||||||
|
" If this is a bare where clause, indent it one step. where as part of an
|
||||||
|
" instance should be unaffected unless you put it in an odd place.
|
||||||
|
" This is the wrong thing if you are deeply indented already and want to put
|
||||||
|
" a where clause on the top-level construct, but there isn't much that can
|
||||||
|
" be done about that case...
|
||||||
|
if thisl =~ '^\s*where\s*$'
|
||||||
|
return previ + &sw
|
||||||
|
endif
|
||||||
|
|
||||||
|
" If we start a new line for a type signature, see if we can line it up with
|
||||||
|
" the previous line.
|
||||||
|
if thisl =~ '^\s*\(->\|=>\)\s*'
|
||||||
|
let tokPos = s:BackwardPatternSearch(a:lnum, '\(::\|->\|=>\)')
|
||||||
|
if tokPos != -1
|
||||||
|
return tokPos
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
if prevl =~ '\Wof\s*$' || prevl =~ '\Wdo\s*$'
|
||||||
|
return previ + &sw
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Now for commas. Commas will align pretty naturally for simple pattern
|
||||||
|
" guards, so don't worry about that for now. If we see the line is just a
|
||||||
|
" comma, search up for something to align it to. In the easy case, look
|
||||||
|
" for a [ or { (the last in their line). Also consider other commas that
|
||||||
|
" are preceeded only by whitespace. This isn't just a previous line check
|
||||||
|
" necessarily, though that would cover most cases.
|
||||||
|
if thisl =~ '^\s*,'
|
||||||
|
let cmatch = match(prevl, '\(^\s*\)\@<=,')
|
||||||
|
if cmatch != -1
|
||||||
|
return cmatch
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if line =~ '{$'
|
let bmatch = match(prevl, '\({\|\[\)')
|
||||||
return match(line, '\s*where \zs\|\S') + &shiftwidth
|
if bmatch != -1
|
||||||
|
return bmatch
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Match an 'in' keyword with the corresponding let. Unfortunately, if the
|
||||||
|
" name of your next binding happens to start with 'in', this will muck with
|
||||||
|
" it. Not sure if there is a workaround because we can't force an
|
||||||
|
" auto-indent after 'in ' as far as I can see.
|
||||||
|
if thisl =~ '\s*in$'
|
||||||
|
let letStart = s:BackwardPatternSearch(a:lnum, '\(\W\)\@<=let\W')
|
||||||
|
if letStart != -1
|
||||||
|
return letStart
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
" We don't send data or type to column zero because they can be indented
|
||||||
|
" inside of 'class' definitions for data/type families
|
||||||
|
if thisl =~ '^\s*\(class\|instance\|newtype\|import\)'
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
" FIXME: Only do this if the previous line was not already indented for the
|
||||||
|
" same reason. Also be careful of -> in type signatures. Make sure we have
|
||||||
|
" an earlier rule to line those up properly.
|
||||||
|
if prevl =~ '[=>\$\.\^+\&`(-]\s*$'
|
||||||
|
return previ + &sw
|
||||||
|
endif
|
||||||
|
|
||||||
|
" We have a special case for dealing with trailing '*' operators. If the *
|
||||||
|
" is the end of a kind signature in a type family/associated type, we don't
|
||||||
|
" want to indent the next line. We do if it is just being a * operator in
|
||||||
|
" an expression, though.
|
||||||
|
if prevl =~ '\(\(type\|data\).*\)\@<!\*\s*$'
|
||||||
|
return previ + &sw
|
||||||
|
endif
|
||||||
|
|
||||||
|
" If the previous line ends in a where, indent us a step
|
||||||
|
if prevl =~ '\Wwhere\s*$'
|
||||||
|
return previ + &sw
|
||||||
|
endif
|
||||||
|
|
||||||
|
" If we see a |, first try to line it up with the pipe on the previous line.
|
||||||
|
" Search backward on nearby lines, giving up if we hit a line with a \w at
|
||||||
|
" column 0. Otherwise, indent it relative to the previous line
|
||||||
|
"
|
||||||
|
" Here we can also handle the case of lining up data declarations. The
|
||||||
|
" backwards pipe search will fail for a data declaration (since data is at
|
||||||
|
" column 0), so we can have an extra check after the pipe search for
|
||||||
|
" data..=.
|
||||||
|
if thisl =~ '^\s*|$'
|
||||||
|
let nearestPipeIndex = s:BackwardPatternSearch(a:lnum, '\(^\s*\)\@<=|')
|
||||||
|
if nearestPipeIndex != -1
|
||||||
|
return nearestPipeIndex
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if line =~ '^\(instance\|class\).*\&.*where$'
|
let dataEquals = match(prevl, '\(data.*\)\@<==')
|
||||||
return &shiftwidth
|
if dataEquals != -1
|
||||||
|
return dataEquals
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if line =~ ')$'
|
return previ + &sw
|
||||||
let pos = getpos('.')
|
endif
|
||||||
normal k$
|
|
||||||
let paren_end = getpos('.')
|
" If the previous line has a let, line the cursor up with the start of the
|
||||||
normal %
|
" first binding name. Autoindent handles subsequent cases.
|
||||||
let paren_begin = getpos('.')
|
"
|
||||||
call setpos('.', pos)
|
" This should come after the 'in' aligner so that 'in' is not treated as
|
||||||
if paren_begin[1] != paren_end[1]
|
" just something to be aligned to the previous binding.
|
||||||
return paren_begin[2] - 1
|
let lbindStart = match(prevl, '\(\Wlet\s\+\)\@<=\w')
|
||||||
endif
|
if lbindStart != -1
|
||||||
|
return lbindStart
|
||||||
|
endif
|
||||||
|
|
||||||
|
" If requested, dedent from a bare return (presumably in a do block).
|
||||||
|
" This comes after the trailing operator case - hopefully that will avoid
|
||||||
|
" returns on lines by themselves but not really in a do block. This is a
|
||||||
|
" heuristic.
|
||||||
|
if g:hasksyn_dedent_after_return && prevl =~ '^\s*return\W'
|
||||||
|
return previ - &sw
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Similar to the return dedent - after a catchall case _ -> ..., we can
|
||||||
|
" almost certainly dedent. Again, it comes after the line continuation
|
||||||
|
" heuristic so we don't dedent while someone is making an obviously
|
||||||
|
" multi-line construct
|
||||||
|
if g:hasksyn_dedent_after_catchall_case && prevl =~ '^\s*_\s*->\W'
|
||||||
|
return previ - &sw
|
||||||
|
endif
|
||||||
|
|
||||||
|
" On the other hand, if the previous line is a where with some bindings
|
||||||
|
" following it on the same line, accommodate and align with the first non-ws
|
||||||
|
" char after the where
|
||||||
|
if prevl =~ '\Wwhere\s\+\w'
|
||||||
|
let bindStart = match(prevl, '\(\Wwhere\s\+\)\@<=\w')
|
||||||
|
if bindStart != -1
|
||||||
|
return bindStart
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if line !~ '\<else\>'
|
return previ + &sw
|
||||||
let s = match(line, '\<if\>.*\&.*\zs\<then\>')
|
endif
|
||||||
if s > 0
|
|
||||||
return s
|
|
||||||
endif
|
|
||||||
|
|
||||||
let s = match(line, '\<if\>')
|
return previ
|
||||||
if s > 0
|
endfunction
|
||||||
return s + g:haskell_indent_if
|
|
||||||
endif
|
" Search backwards for a token from the cursor position
|
||||||
|
function! s:FindTokenNotInCommentOrString(tok)
|
||||||
|
return search('\(--.*\|"\([^"]\|\\"\)*\)\@<!' . tok, 'bcnW')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Should return -1 if the given line is inside of an unclosed block comment.
|
||||||
|
" This is meant to let us exit early from the indenter if we are in a comment.
|
||||||
|
" Look for the nearest -} and {- such that they are not between "" or in a
|
||||||
|
" line comment
|
||||||
|
"
|
||||||
|
" Note: we may need to restrict how far back this will search. On the other
|
||||||
|
" hand, the native vim 'search' function might be efficient enough to support
|
||||||
|
" entire buffers.
|
||||||
|
function! s:IsInBlockComment()
|
||||||
|
let openCommPos = s:FindTokenNotInCommentOrString('{-')
|
||||||
|
" If there is no open comment, then we don't have to look for a close
|
||||||
|
if openCommPos == 0
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Or if there is a close comment marker that comes after the open marker, we
|
||||||
|
" are not in a comment. Note that we potentially need to check the position
|
||||||
|
" in the line if they are both on the same line. I'll fix it later.
|
||||||
|
let closeCommPos = s:FindTokenNotInCommentOrString('-}')
|
||||||
|
if closeCommPos >= openCommPos
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
return 1
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Get the previous line that is not a comment. Pass in the *current* line
|
||||||
|
" number. Also skips blank lines.
|
||||||
|
function! s:PrevNonCommentLineNum(lnum)
|
||||||
|
if a:lnum <= 1
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
let lnum = a:lnum - 1
|
||||||
|
|
||||||
|
while 1
|
||||||
|
if lnum == 0
|
||||||
|
return 0
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let s = match(line, '\<do\s\+\zs[^{]\|\<where\s\+\zs\w\|\<let\s\+\zs\S\|^\s*\zs|\s')
|
let aline = getline(lnum)
|
||||||
if s > 0
|
if aline =~ '^\s*--'
|
||||||
return s
|
let lnum = lnum - 1
|
||||||
|
else
|
||||||
|
return lnum
|
||||||
|
endif
|
||||||
|
endwhile
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:GetAndStripTrailingComments(lnum)
|
||||||
|
let aline = getline(a:lnum)
|
||||||
|
" We can't just remove the string literal since that leaves us with a
|
||||||
|
" trailing operator (=), so replace it with a fake identifier
|
||||||
|
let noStrings = substitute(aline, '"\([^"]\|\\"\)*"', 's', '')
|
||||||
|
let noLineCom = substitute(noStrings, '--.*$', '', '')
|
||||||
|
|
||||||
|
" If there are no fancy block comments involved, skip some of this extra
|
||||||
|
" work
|
||||||
|
if noLineCom !~ '\({-\|-}\)'
|
||||||
|
return noLineCom
|
||||||
|
endif
|
||||||
|
|
||||||
|
" We stripped line comments, now we need to strip out any relevant multiline
|
||||||
|
" comments. This includes comments starting much earlier but ending on this
|
||||||
|
" line or comments starting on this line and continuing to the next. This
|
||||||
|
" is probably easiest in two steps: {- to (-}|$) and then ^ to -}.
|
||||||
|
" Note we are using a non-greedy match here so that only the minimal {- -}
|
||||||
|
" pair is consumed.
|
||||||
|
let noBlock1 = substitute(noLineComm, '{-.\{-}-}', '', '')
|
||||||
|
let noBlock2 = substitute(noBlock1, '{-.\{-}$', '', '')
|
||||||
|
let noBlock3 = substitute(noBlock2, '^.\{-}-}', '', '')
|
||||||
|
return noBlock3
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Search backwards from lnum for pat, returning the starting index if found
|
||||||
|
" within the search range or -1 if not found. Stops searching at lines
|
||||||
|
" starting at column 0 with an identifier character.
|
||||||
|
function! s:BackwardPatternSearch(lnum, pat)
|
||||||
|
let lnum = s:PrevNonCommentLineNum(a:lnum)
|
||||||
|
while 1
|
||||||
|
let aline = s:GetAndStripTrailingComments(lnum)
|
||||||
|
if a:lnum - lnum > g:hasksyn_indent_search_backward
|
||||||
|
return -1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let s = match(line, '\<case\>')
|
let theMatch = match(aline, a:pat)
|
||||||
if s > 0
|
if theMatch != -1
|
||||||
return s + g:haskell_indent_case
|
return theMatch
|
||||||
|
else
|
||||||
|
" We want to be able to consider lines starting in column 0, but we don't
|
||||||
|
" want to search back past them.
|
||||||
|
if aline =~ '^\w'
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
let lnum = s:PrevNonCommentLineNum(lnum)
|
||||||
endif
|
endif
|
||||||
|
endwhile
|
||||||
|
endfunction
|
||||||
|
|
||||||
return match(line, '\S')
|
|
||||||
endfunction
|
|
147
syntax/cabal.vim
Normal file
147
syntax/cabal.vim
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
" Vim syntax file
|
||||||
|
" Language: Cabal
|
||||||
|
" Author: Tristan Ravitch
|
||||||
|
" Version: 0.0.1
|
||||||
|
|
||||||
|
if version < 600
|
||||||
|
syntax clear
|
||||||
|
elseif exists('b:current_syntax')
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
syn sync minlines=50 maxlines=200
|
||||||
|
syn case ignore
|
||||||
|
|
||||||
|
" Top-level package keywords
|
||||||
|
syn match cabalKey '^name:'
|
||||||
|
syn match cabalKey '^version:'
|
||||||
|
syn match cabalKey '^cabal-version:'
|
||||||
|
syn match cabalKey '^build-type:'
|
||||||
|
syn match cabalKey '^license:'
|
||||||
|
syn match cabalKey '^license-file:'
|
||||||
|
syn match cabalKey '^copyright:'
|
||||||
|
syn match cabalKey '^author:'
|
||||||
|
syn match cabalKey '^maintainer:'
|
||||||
|
syn match cabalKey '^stability:'
|
||||||
|
syn match cabalKey '^homepage:'
|
||||||
|
syn match cabalKey '^bug-reports:'
|
||||||
|
syn match cabalKey '^package-url:'
|
||||||
|
syn match cabalKey '^synopsis:'
|
||||||
|
syn match cabalKey '^description:'
|
||||||
|
syn match cabalKey '^category:'
|
||||||
|
syn match cabalKey '^tested-with:'
|
||||||
|
syn match cabalKey '^data-files:'
|
||||||
|
syn match cabalKey '^data-dir:'
|
||||||
|
syn match cabalKey '^extra-source-files:'
|
||||||
|
syn match cabalKey '^extra-tmp-files:'
|
||||||
|
|
||||||
|
" Other keywords
|
||||||
|
syn match cabalLit '\(:\s*\)\@<=\(true\|false\)'
|
||||||
|
|
||||||
|
" Library-specifics
|
||||||
|
syn region cabalLibraryR start='^library\(\s\|$\)\@=' end='^\w' transparent keepend contains=cabalLibrayKey,cabalBuildKey,cabalCondition,cabalOperator
|
||||||
|
syn match cabalLibraryKey '^library\(\s\|$\)\@='
|
||||||
|
syn match cabalLibraryKey '\(^\s\+\)\@<=exposed-modules:'
|
||||||
|
syn match cabalLibraryKey '\(^\s\+\)\@<=exposed:'
|
||||||
|
|
||||||
|
" Executable-specifics
|
||||||
|
syn region cabalExeR start='^executable\s\@=' end='^\w' transparent keepend contains=cabalExeKey,cabalBuildKey,cabalCondition,cabalOperator,cabalBuildableName
|
||||||
|
syn match cabalExeKey '^executable\s\@='
|
||||||
|
syn match cabalExeKey '\(^\s\+\)\@<=main-is:'
|
||||||
|
|
||||||
|
" Test-specifics
|
||||||
|
syn region cabalTestR start='^test-suite\s\@=' end='^\w' transparent keepend contains=cabalTestKey,cabalBuildKey,cabalCondition,cabalOperator,cabalBuildableName
|
||||||
|
syn match cabalTestKey '^test-suite\s\@='
|
||||||
|
syn match cabalTestKey '\(^\s\+\)\@<=type:'
|
||||||
|
syn match cabalTestKey '\(^\s\+\)\@<=main-is:'
|
||||||
|
syn match cabalTestKey '\(^\s\+\)\@<=test-module:'
|
||||||
|
|
||||||
|
" Benchmark-specifics
|
||||||
|
syn region cabalBenchR start='^benchmark\s\@=' end='^\w' transparent keepend contains=cabalBenchKey,cabalBuildKey,cabalCondition,cabalOperator,cabalBuildableName
|
||||||
|
syn match cabalBenchKey '^benchmark\s\@='
|
||||||
|
syn match cabalBenchKey '\(^\s\+\)\@<=type:'
|
||||||
|
syn match cabalBenchKey '\(^\s\+\)\@<=main-is:'
|
||||||
|
|
||||||
|
syn match cabalBuildableName '\(^\(^benchmark\|test-suite\|executable\)\s\+\)\@<=\w\+'
|
||||||
|
|
||||||
|
" General build info
|
||||||
|
syn match cabalBuildKey '\(^\s\+\)\@<=default-language:'
|
||||||
|
syn match cabalBuildKey '\(^\s\+\)\@<=build-depends:'
|
||||||
|
syn match cabalBuildKey '\(^\s\+\)\@<=other-modules:'
|
||||||
|
syn match cabalBuildKey '\(^\s\+\)\@<=hs-source-dirs:'
|
||||||
|
syn match cabalBuildKey '\(^\s\+\)\@<=extensions:'
|
||||||
|
syn match cabalBuildKey '\(^\s\+\)\@<=build-tools:'
|
||||||
|
syn match cabalBuildKey '\(^\s\+\)\@<=buildable:'
|
||||||
|
syn match cabalBuildKey '\(^\s\+\)\@<=ghc-options:'
|
||||||
|
syn match cabalBuildKey '\(^\s\+\)\@<=ghc-prof-options:'
|
||||||
|
syn match cabalBuildKey '\(^\s\+\)\@<=ghc-shared-options:'
|
||||||
|
syn match cabalBuildKey '\(^\s\+\)\@<=hugs-options:'
|
||||||
|
syn match cabalBuildKey '\(^\s\+\)\@<=nch98-options:'
|
||||||
|
syn match cabalBuildKey '\(^\s\+\)\@<=includes:'
|
||||||
|
syn match cabalBuildKey '\(^\s\+\)\@<=install-includes:'
|
||||||
|
syn match cabalBuildKey '\(^\s\+\)\@<=include-dirs:'
|
||||||
|
syn match cabalBuildKey '\(^\s\+\)\@<=c-sources:'
|
||||||
|
syn match cabalBuildKey '\(^\s\+\)\@<=extra-libraries:'
|
||||||
|
syn match cabalBuildKey '\(^\s\+\)\@<=extra-lib-dirs:'
|
||||||
|
syn match cabalBuildKey '\(^\s\+\)\@<=cc-options:'
|
||||||
|
syn match cabalBuildKey '\(^\s\+\)\@<=cpp-options:'
|
||||||
|
syn match cabalBuildKey '\(^\s\+\)\@<=ld-options:'
|
||||||
|
syn match cabalBuildKey '\(^\s\+\)\@<=pkgconfig-depends:'
|
||||||
|
syn match cabalBuildKey '\(^\s\+\)\@<=frameworks:'
|
||||||
|
|
||||||
|
syn region cabalFlagR start='^flag\s\@=' end='^\w' transparent keepend contains=cabalFlagKey,cabalCondition,cabalFlag
|
||||||
|
syn match cabalFlagKey '^flag\s\@='
|
||||||
|
syn match cabalFlagKey '\(^\s\+\)\@<=description:'
|
||||||
|
syn match cabalFlagKey '\(^\s\+\)\@<=default:'
|
||||||
|
syn match cabalFlagKey '\(^\s\+\)\@<=manual:'
|
||||||
|
syn match cabalFlag '\(flag\s\+\)\@<=\w\+'
|
||||||
|
syn match cabalFlag '\(flag(\)\@<=\w\+)\@='
|
||||||
|
|
||||||
|
syn region cabalSourceR start='^source-repository' end='^\w' transparent keepend contains=cabalSourceKey
|
||||||
|
syn match cabalSourceKey '^source-repository\s\@='
|
||||||
|
syn match cabalSourceKey '\(^\s\+\)\@<=type:'
|
||||||
|
syn match cabalSourceKey '\(^\s\+\)\@<=location:'
|
||||||
|
syn match cabalSourceKey '\(^\s\+\)\@<=module:'
|
||||||
|
syn match cabalSourceKey '\(^\s\+\)\@<=branch:'
|
||||||
|
syn match cabalSourceKey '\(^\s\+\)\@<=tag:'
|
||||||
|
syn match cabalSourceKey '\(^\s\+\)\@<=subdir:'
|
||||||
|
|
||||||
|
syn match cabalCondition '\(^\s\+\)\@<=if\((\|\s\)\@='
|
||||||
|
syn match cabalCondition '\(^\s\+\)\@<=else\($\|\s\)\@='
|
||||||
|
syn match cabalCondition '\(^\s\+\)\@<=if\((\|\s\)\@='
|
||||||
|
syn match cabalCondition '\(^\s\+\)\@<=else\($\|\s\)\@='
|
||||||
|
syn match cabalOperator '\W\@<=os\((.\+)\)\@='
|
||||||
|
syn match cabalOperator '\W\@<=arch\((.\+)\)\@='
|
||||||
|
syn match cabalOperator '\W\@<=impl\((.\+)\)\@='
|
||||||
|
syn match cabalOperator '\W\@<=flag\((.\+)\)\@='
|
||||||
|
syn match cabalOperator '\(^\s*--.*\)\@<!\(<\|>\|=\|||\|&&\)'
|
||||||
|
|
||||||
|
syn match cabalComment '\s\@<=--.*$'
|
||||||
|
|
||||||
|
if version >= 508 || !exists('did_cabal_syntax_inits')
|
||||||
|
if version < 508
|
||||||
|
let did_cabal_syntax_inits = 1
|
||||||
|
command -nargs=+ HiLink hi link <args>
|
||||||
|
else
|
||||||
|
command -nargs=+ HiLink hi def link <args>
|
||||||
|
endif
|
||||||
|
|
||||||
|
HiLink cabalBuildableName Structure
|
||||||
|
HiLink cabalFlag Special
|
||||||
|
HiLink cabalComment Comment
|
||||||
|
HiLink cabalCondition Conditional
|
||||||
|
HiLink cabalSourceKey Keyword
|
||||||
|
HiLink cabalOperator Operator
|
||||||
|
HiLink cabalKey Keyword
|
||||||
|
HiLink cabalLibraryKey Keyword
|
||||||
|
HiLink cabalTestKey Keyword
|
||||||
|
HiLink cabalExeKey Keyword
|
||||||
|
HiLink cabalBenchKey Keyword
|
||||||
|
HiLink cabalBuildKey Keyword
|
||||||
|
HiLink cabalFlagKey Keyword
|
||||||
|
HiLink cabalLit Constant
|
||||||
|
|
||||||
|
delcommand HiLink
|
||||||
|
endif
|
||||||
|
|
||||||
|
let b:current_syntax = 'cabal'
|
@ -1,265 +1,115 @@
|
|||||||
" Vim syntax file
|
" Vim syntax file
|
||||||
"
|
" Language: Haskell
|
||||||
" Modification of vims Haskell syntax file:
|
" Author: Tristan Ravitch
|
||||||
" - match types using regular expression
|
" Maintainer: Tristan Ravitch
|
||||||
" - highlight toplevel functions
|
" Version: 0.0.1
|
||||||
" - use "syntax keyword" instead of "syntax match" where appropriate
|
|
||||||
" - functions and types in import and module declarations are matched
|
|
||||||
" - removed hs_highlight_more_types (just not needed anymore)
|
|
||||||
" - enable spell checking in comments and strings only
|
|
||||||
" - FFI highlighting
|
|
||||||
" - QuasiQuotation
|
|
||||||
" - top level Template Haskell slices
|
|
||||||
" - PackageImport
|
|
||||||
"
|
|
||||||
" TODO: find out which vim versions are still supported
|
|
||||||
"
|
|
||||||
" From Original file:
|
|
||||||
" ===================
|
|
||||||
"
|
|
||||||
" Language: Haskell
|
|
||||||
" Maintainer: Haskell Cafe mailinglist <haskell-cafe@haskell.org>
|
|
||||||
" Last Change: 2010 Feb 21
|
|
||||||
" Original Author: John Williams <jrw@pobox.com>
|
|
||||||
"
|
|
||||||
" Thanks to Ryan Crumley for suggestions and John Meacham for
|
|
||||||
" pointing out bugs. Also thanks to Ian Lynagh and Donald Bruce Stewart
|
|
||||||
" for providing the inspiration for the inclusion of the handling
|
|
||||||
" of C preprocessor directives, and for pointing out a bug in the
|
|
||||||
" end-of-line comment handling.
|
|
||||||
"
|
|
||||||
" Options-assign a value to these variables to turn the option on:
|
|
||||||
"
|
|
||||||
" hs_highlight_delimiters - Highlight delimiter characters--users
|
|
||||||
" with a light-colored background will
|
|
||||||
" probably want to turn this on.
|
|
||||||
" hs_highlight_boolean - Treat True and False as keywords.
|
|
||||||
" hs_highlight_types - Treat names of primitive types as keywords.
|
|
||||||
" hs_highlight_debug - Highlight names of debugging functions.
|
|
||||||
" hs_allow_hash_operator - Don't highlight seemingly incorrect C
|
|
||||||
" preprocessor directives but assume them to be
|
|
||||||
" operators
|
|
||||||
"
|
|
||||||
"
|
|
||||||
|
|
||||||
if version < 600
|
if version < 600
|
||||||
syn clear
|
syntax clear
|
||||||
elseif exists("b:current_syntax")
|
elseif exists('b:current_syntax')
|
||||||
finish
|
finish
|
||||||
endif
|
endif
|
||||||
|
|
||||||
"syntax sync fromstart "mmhhhh.... is this really ok to do so?
|
syn sync minlines=50 maxlines=200
|
||||||
syntax sync linebreaks=15 minlines=50 maxlines=500
|
|
||||||
|
|
||||||
syn match hsSpecialChar contained "\\\([0-9]\+\|o[0-7]\+\|x[0-9a-fA-F]\+\|[\"\\'&\\abfnrtv]\|^[A-Z^_\[\\\]]\)"
|
" These basic lexical definitions are taken from the orignal haskell syntax
|
||||||
syn match hsSpecialChar contained "\\\(NUL\|SOH\|STX\|ETX\|EOT\|ENQ\|ACK\|BEL\|BS\|HT\|LF\|VT\|FF\|CR\|SO\|SI\|DLE\|DC1\|DC2\|DC3\|DC4\|NAK\|SYN\|ETB\|CAN\|EM\|SUB\|ESC\|FS\|GS\|RS\|US\|SP\|DEL\)"
|
" description from vim 7.3.
|
||||||
syn match hsSpecialCharError contained "\\&\|'''\+"
|
syn match hsSpecialChar contained "\\\([0-9]\+\|o[0-7]\+\|x[0-9a-fA-F]\+\|[\"\\'&\\abfnrtv]\|^[A-Z^_\[\\\]]\)"
|
||||||
sy region hsString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=hsSpecialChar,@Spell
|
syn match hsSpecialChar contained "\\\(NUL\|SOH\|STX\|ETX\|EOT\|ENQ\|ACK\|BEL\|BS\|HT\|LF\|VT\|FF\|CR\|SO\|SI\|DLE\|DC1\|DC2\|DC3\|DC4\|NAK\|SYN\|ETB\|CAN\|EM\|SUB\|ESC\|FS\|GS\|RS\|US\|SP\|DEL\)"
|
||||||
sy match hsCharacter "[^a-zA-Z0-9_']'\([^\\]\|\\[^']\+\|\\'\)'"lc=1 contains=hsSpecialChar,hsSpecialCharError
|
syn match hsSpecialCharError contained "\\&\|'''\+"
|
||||||
sy match hsCharacter "^'\([^\\]\|\\[^']\+\|\\'\)'" contains=hsSpecialChar,hsSpecialCharError
|
syn region hsString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=hsSpecialChar
|
||||||
|
syn match hsCharacter "[^a-zA-Z0-9_']'\([^\\]\|\\[^']\+\|\\'\)'"lc=1 contains=hsSpecialChar,hsSpecialCharError
|
||||||
|
syn match hsCharacter "^'\([^\\]\|\\[^']\+\|\\'\)'" contains=hsSpecialChar,hsSpecialCharError
|
||||||
|
syn match hsNumber "\<[0-9]\+\>\|\<0[xX][0-9a-fA-F]\+\>\|\<0[oO][0-7]\+\>"
|
||||||
|
syn match hsFloat "\<[0-9]\+\.[0-9]\+\([eE][-+]\=[0-9]\+\)\=\>"
|
||||||
|
|
||||||
" (Qualified) identifiers (no default highlighting)
|
" This case matches the names of types and constructors: names beginning with
|
||||||
syn match ConId "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=\<[A-Z][a-zA-Z0-9_']*\>"
|
" a capital letter. Note that this also handles the case of @M.lookup@ where
|
||||||
syn match VarId "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=\<[a-z][a-zA-Z0-9_']*\>"
|
" M is a qualified import. There is a big negative lookbehind assertion here
|
||||||
|
" so that we don't highlight import and module statements oddly.
|
||||||
|
syn match hsTypeName "\(^import\s.*\|^module\s.*\)\@<!\([^a-zA-Z0-9]\)\@<=[A-Z][a-zA-Z0-9_]*"
|
||||||
|
" Also make unit and the empty list easy to spot - they are constructors too.
|
||||||
|
syn match hsTypeName "()"
|
||||||
|
syn match hsTypeName "\[\]"
|
||||||
|
|
||||||
" Infix operators--most punctuation characters and any (qualified) identifier
|
" These are keywords that are only highlighted if they are in comments.
|
||||||
" enclosed in `backquotes`. An operator starting with : is a constructor,
|
syn keyword hsFIXME contained FIXME TODO XXX BUG NOTE
|
||||||
" others are variables (e.g. functions).
|
|
||||||
syn match hsVarSym "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=[-!#$%&\*\+/<=>\?@\\^|~.][-!#$%&\*\+/<=>\?@\\^|~:.]*"
|
|
||||||
syn match hsConSym "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=:[-!#$%&\*\+./<=>\?@\\^|~:]*"
|
|
||||||
syn match hsVarSym "`\(\<[A-Z][a-zA-Z0-9_']*\.\)\=[a-z][a-zA-Z0-9_']*`"
|
|
||||||
syn match hsConSym "`\(\<[A-Z][a-zA-Z0-9_']*\.\)\=[A-Z][a-zA-Z0-9_']*`"
|
|
||||||
|
|
||||||
" Toplevel Template Haskell support
|
" Comment stuff
|
||||||
"sy match hsTHTopLevel "^[a-z]\(\(.\&[^=]\)\|\(\n[^a-zA-Z0-9]\)\)*"
|
syn region hsPragma start='{-#' end='#-}'
|
||||||
sy match hsTHIDTopLevel "^[a-z]\S*"
|
syn region hsBlockComment start='{-' end='-}' fold contains=hsFIXME,hsBlockComment
|
||||||
sy match hsTHTopLevel "^\$(\?" nextgroup=hsTHTopLevelName
|
" FIXME: haddock block comments should be able to contain hsBlockComments, but
|
||||||
sy match hsTHTopLevelName "[a-z]\S*" contained
|
" it doesn't seem to work at the moment.
|
||||||
|
syn region hsHaddockComment start='{-|' end='-}' contains=hsFIXME
|
||||||
" Reserved symbols--cannot be overloaded.
|
syn match hsLineComment "--.*$" contains=hsFIXME
|
||||||
syn match hsDelimiter "(\|)\|\[\|\]\|,\|;\|_\|{\|}"
|
" Line-based haddock comments are trickier - they continue until
|
||||||
|
" the next line that isn't part of the same block of comments.
|
||||||
sy region hsInnerParen start="(" end=")" contained contains=hsInnerParen,hsConSym,hsType,hsVarSym
|
syn region hsHaddockComment start='-- |' end='^\(\s*--\)\@!' contains=hsFIXME
|
||||||
sy region hs_InfixOpFunctionName start="^(" end=")\s*[^:`]\(\W\&\S\&[^'\"`()[\]{}@]\)\+"re=s
|
syn region hsHaddockComment start='-- \$\w\+' end='^\(\s*--\)\@!' contains=hsFIXME
|
||||||
\ contained keepend contains=hsInnerParen,hs_HlInfixOp
|
syn region hsHaddockComment start='-- ^' end='^\(\s*--\)\@!' contains=hsFIXME
|
||||||
|
" Haddock sections for import lists
|
||||||
sy match hs_hlFunctionName "[a-z_]\(\S\&[^,\(\)\[\]]\)*" contained
|
syn match hsHaddockSection '-- \*.*$'
|
||||||
sy match hs_FunctionName "^[a-z_]\(\S\&[^,\(\)\[\]]\)*" contained contains=hs_hlFunctionName
|
" Named documentation chunks (also for import lists)
|
||||||
sy match hs_HighliteInfixFunctionName "`[a-z_][^`]*`" contained
|
syn match hsHaddockSection '-- \$.*$'
|
||||||
sy match hs_InfixFunctionName "^\S[^=]*`[a-z_][^`]*`"me=e-1 contained contains=hs_HighliteInfixFunctionName,hsType,hsConSym,hsVarSym,hsString,hsCharacter
|
|
||||||
sy match hs_HlInfixOp "\(\W\&\S\&[^`(){}'[\]]\)\+" contained contains=hsString
|
|
||||||
sy match hs_InfixOpFunctionName "^\(\(\w\|[[\]{}]\)\+\|\(\".*\"\)\|\('.*'\)\)\s*[^:]=*\(\W\&\S\&[^='\"`()[\]{}@]\)\+"
|
|
||||||
\ contained contains=hs_HlInfixOp,hsCharacter
|
|
||||||
|
|
||||||
sy match hs_OpFunctionName "(\(\W\&[^(),\"]\)\+)" contained
|
|
||||||
"sy region hs_Function start="^["'a-z_([{]" end="=\(\s\|\n\|\w\|[([]\)" keepend extend
|
|
||||||
sy region hs_Function start="^["'a-zA-Z_([{]\(\(.\&[^=]\)\|\(\n\s\)\)*=" end="\(\s\|\n\|\w\|[([]\)"
|
|
||||||
\ contains=hs_OpFunctionName,hs_InfixOpFunctionName,hs_InfixFunctionName,hs_FunctionName,hsType,hsConSym,hsVarSym,hsString,hsCharacter
|
|
||||||
|
|
||||||
sy match hs_TypeOp "::"
|
|
||||||
sy match hs_DeclareFunction "^[a-z_(]\S*\(\s\|\n\)*::" contains=hs_FunctionName,hs_OpFunctionName,hs_TypeOp
|
|
||||||
|
|
||||||
" hi hs_TypeOp guibg=red
|
|
||||||
|
|
||||||
" hi hs_InfixOpFunctionName guibg=yellow
|
|
||||||
" hi hs_Function guibg=green
|
|
||||||
" hi hs_InfixFunctionName guibg=red
|
|
||||||
" hi hs_DeclareFunction guibg=red
|
|
||||||
|
|
||||||
sy keyword hsStructure data family class where instance default deriving
|
|
||||||
sy keyword hsTypedef type newtype
|
|
||||||
|
|
||||||
sy keyword hsInfix infix infixl infixr
|
|
||||||
sy keyword hsStatement do case of let in
|
|
||||||
sy keyword hsConditional if then else
|
|
||||||
|
|
||||||
"if exists("hs_highlight_types")
|
|
||||||
" Primitive types from the standard prelude and libraries.
|
|
||||||
sy match hsType "\<[A-Z]\(\S\&[^,.]\)*\>"
|
|
||||||
sy match hsType "()"
|
|
||||||
"endif
|
|
||||||
|
|
||||||
" Not real keywords, but close.
|
|
||||||
if exists("hs_highlight_boolean")
|
|
||||||
" Boolean constants from the standard prelude.
|
|
||||||
syn keyword hsBoolean True False
|
|
||||||
endif
|
|
||||||
|
|
||||||
syn region hsPackageString start=+L\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=cSpecial contained
|
|
||||||
sy match hsModuleName excludenl "\([A-Z]\w*\.\?\)*" contained
|
|
||||||
|
|
||||||
sy match hsImport "\<import\>\s\+\(qualified\s\+\)\?\(\<\(\w\|\.\)*\>\)"
|
|
||||||
\ contains=hsModuleName,hsImportLabel
|
|
||||||
\ nextgroup=hsImportParams,hsImportIllegal skipwhite
|
|
||||||
sy keyword hsImportLabel import qualified contained
|
|
||||||
|
|
||||||
sy match hsImportIllegal "\w\+" contained
|
|
||||||
|
|
||||||
sy keyword hsAsLabel as contained
|
|
||||||
sy keyword hsHidingLabel hiding contained
|
|
||||||
|
|
||||||
sy match hsImportParams "as\s\+\(\w\+\)" contained
|
|
||||||
\ contains=hsModuleName,hsAsLabel
|
|
||||||
\ nextgroup=hsImportParams,hsImportIllegal skipwhite
|
|
||||||
sy match hsImportParams "hiding" contained
|
|
||||||
\ contains=hsHidingLabel
|
|
||||||
\ nextgroup=hsImportParams,hsImportIllegal skipwhite
|
|
||||||
sy region hsImportParams start="(" end=")" contained
|
|
||||||
\ contains=hsBlockComment,hsLineComment, hsType,hsDelimTypeExport,hs_hlFunctionName,hs_OpFunctionName
|
|
||||||
\ nextgroup=hsImportIllegal skipwhite
|
|
||||||
|
|
||||||
" hi hsImport guibg=red
|
|
||||||
"hi hsImportParams guibg=bg
|
|
||||||
"hi hsImportIllegal guibg=bg
|
|
||||||
"hi hsModuleName guibg=bg
|
|
||||||
|
|
||||||
"sy match hsImport "\<import\>\(.\|[^(]\)*\((.*)\)\?"
|
|
||||||
" \ contains=hsPackageString,hsImportLabel,hsImportMod,hsModuleName,hsImportList
|
|
||||||
"sy keyword hsImportLabel import contained
|
|
||||||
"sy keyword hsImportMod as qualified hiding contained
|
|
||||||
"sy region hsImportListInner start="(" end=")" contained keepend extend contains=hs_OpFunctionName
|
|
||||||
"sy region hsImportList matchgroup=hsImportListParens start="("rs=s+1 end=")"re=e-1
|
|
||||||
" \ contained
|
|
||||||
" \ keepend extend
|
|
||||||
" \ contains=hsType,hsLineComment,hsBlockComment,hs_hlFunctionName,hsImportListInner
|
|
||||||
|
|
||||||
|
|
||||||
|
" Keywords appearing in expressions, plus a few top-level keywords
|
||||||
|
syn keyword hsKeyword do let in _ where
|
||||||
|
syn keyword hsKeyword infix infixl infixr
|
||||||
|
syn keyword hsKeyword forall foreign
|
||||||
|
syn match hsKeyword '\(^\(data\|type\)\s\+\)\@<=family\(\W\)\@='
|
||||||
|
|
||||||
" new module highlighting
|
" Vim has a special syntax category for conditionals, so here are all of the
|
||||||
syn region hsDelimTypeExport start="\<[A-Z]\(\S\&[^,.]\)*\>(" end=")" contained
|
" haskell conditionals. These are just keywords with a slightly more flexible
|
||||||
\ contains=hsType
|
" coloring.
|
||||||
|
syn keyword hsConditional case of if then else
|
||||||
|
|
||||||
sy keyword hsExportModuleLabel module contained
|
" We define a region for module NNNN (...) where so that haddock section
|
||||||
sy match hsExportModule "\<module\>\(\s\|\t\|\n\)*\([A-Z]\w*\.\?\)*" contained contains=hsExportModuleLabel,hsModuleName
|
" headers (-- *) can be highlighted specially only within this context.
|
||||||
|
syn region hsModuleHeader start="^module\s" end="where" contains=hsHaddockSection keepend fold transparent
|
||||||
|
" Treat Module imports as the #include category; it maps reasonably well
|
||||||
|
syn keyword hsImport import qualified as hiding module
|
||||||
|
|
||||||
sy keyword hsModuleStartLabel module contained
|
syn keyword hsTypeDecls class instance data newtype type deriving default
|
||||||
sy keyword hsModuleWhereLabel where contained
|
" FIXME: Maybe we can do something fancy for data/type families? 'family' is
|
||||||
|
" only a keyword if it follows data/type...
|
||||||
|
|
||||||
syn match hsModuleStart "^module\(\s\|\n\)*\(\<\(\w\|\.\)*\>\)\(\s\|\n\)*"
|
" This is uglier than I'd like. We want to let '-' participate in operators,
|
||||||
\ contains=hsModuleStartLabel,hsModuleName
|
" but we can't let it match '--' because that interferes with comments. Hacks
|
||||||
\ nextgroup=hsModuleCommentA,hsModuleExports,hsModuleWhereLabel
|
" for now - just include some common operators with '-'.
|
||||||
|
syn match hsOperator "<-\|->\|-->\|-\(-\)\@!\|[%\~\&\*/\$\^|@:+<!>=#!\?]\+"
|
||||||
|
" A bare . is an operator (but not surrounded by alnum chars)
|
||||||
|
syn match hsOperator "\s\@<=\.\s\@="
|
||||||
|
" . is also an operator if adjacent to some other operator char
|
||||||
|
syn match hsOperator "[%\~\&\*\$\^|@:+<!>=#!\?]\+\.[%\~\&\*\$\^|@:+<\.!>=#!\?]*"
|
||||||
|
syn match hsOperator "[%\~\&\*\$\^|@:+<!>=#!\?]*\.[%\~\&\*\$\^|@:+\.<!>=#!\?]\+"
|
||||||
|
" Include support for infix functions as operators
|
||||||
|
syn match hsOperator "`[a-zA-Z0-9\.]\+`"
|
||||||
|
|
||||||
syn region hsModuleCommentA start="{-" end="-}"
|
" Highlight function/value names in type signatures. Looks ahead to find a ::
|
||||||
\ contains=hsModuleCommentA,hsCommentTodo,@Spell contained
|
" after a name. This allows whitespace before the name so that it can match
|
||||||
\ nextgroup=hsModuleCommentA,hsModuleExports,hsModuleWhereLabel skipwhite skipnl
|
" in a 'where,' but it won't match local type annotations on random little
|
||||||
|
" things.
|
||||||
|
syn match hsFunctionList "^\s*\([a-z][a-zA-Z0-9']*[[:space:]\n,]\+\)*[a-z][a-zA-Z0-9']*[[:space:]\n]*::" contains=hsFunction
|
||||||
|
syn match hsFunction "\s*[a-z][a-zA-Z0-9']*[[:space:]\n]*\(::\|,\)\@=" contained
|
||||||
|
" Also support the style where the first where binding is on the same line as
|
||||||
|
" the where keyword.
|
||||||
|
syn match hsFunction "\(^\s\+where\s\+\)\@<=[a-z][a-zA-Z0-9']*\(\s*::\)\@="
|
||||||
|
|
||||||
syn match hsModuleCommentA "--.*\n"
|
" FIXME Ignoring proc for now, also mdo and rec
|
||||||
\ contains=hsCommentTodo,@Spell contained
|
|
||||||
\ nextgroup=hsModuleCommentA,hsModuleExports,hsModuleWhereLabel skipwhite skipnl
|
|
||||||
|
|
||||||
syn region hsModuleExports start="(" end=")" contained
|
" Give undefined a bit of special treatment
|
||||||
\ nextgroup=hsModuleCommentB,hsModuleWhereLabel skipwhite skipnl
|
syn keyword hsScary undefined
|
||||||
\ contains=hsBlockComment,hsLineComment,hsType,hsDelimTypeExport,hs_hlFunctionName,hs_OpFunctionName,hsExportModule
|
|
||||||
|
|
||||||
syn match hsModuleCommentB "--.*\n"
|
" C Preprocessor stuff
|
||||||
\ contains=hsCommentTodo,@Spell contained
|
syn match hsCPP '\(^\s*\)\@<=#\(warning\|pragma\|error\)\W\@='
|
||||||
\ nextgroup=hsModuleCommentB,hsModuleWhereLabel skipwhite skipnl
|
syn match hsCPPCond '\(^\s*\)\@<=#\(if\|ifdef\|elif\)\W\@='
|
||||||
|
syn match hsCPPCond '\(^\s*\)\@<=#\(endif\|else\)\(\s*$\|\W\)\@='
|
||||||
|
syn match hsCPPInclude '\(^\s*\)\@<=#include\W\@='
|
||||||
|
syn match hsCPPDefine '\(^\s*\)\@<=#define\W\@='
|
||||||
|
syn match hsCPPDefined '\(^\s*.*\W\)\@<=defined(\w\+)'
|
||||||
|
|
||||||
syn region hsModuleCommentB start="{-" end="-}"
|
if version >= 508 || !exists('did_hs_syntax_inits')
|
||||||
\ contains=hsModuleCommentB,hsCommentTodo,@Spell contained
|
|
||||||
\ nextgroup=hsModuleCommentB,hsModuleWhereLabel skipwhite skipnl
|
|
||||||
" end module highlighting
|
|
||||||
|
|
||||||
" FFI support
|
|
||||||
sy keyword hsFFIForeign foreign contained
|
|
||||||
"sy keyword hsFFIImportExport import export contained
|
|
||||||
sy keyword hsFFIImportExport export contained
|
|
||||||
sy keyword hsFFICallConvention ccall stdcall contained
|
|
||||||
sy keyword hsFFISafety safe unsafe contained
|
|
||||||
sy region hsFFIString start=+"+ skip=+\\\\\|\\"+ end=+"+ contained contains=hsSpecialChar
|
|
||||||
sy match hsFFI excludenl "\<foreign\>\(.\&[^\"]\)*\"\(.\)*\"\(\s\|\n\)*\(.\)*::"
|
|
||||||
\ keepend
|
|
||||||
\ contains=hsFFIForeign,hsFFIImportExport,hsFFICallConvention,hsFFISafety,hsFFIString,hs_OpFunctionName,hs_hlFunctionName
|
|
||||||
|
|
||||||
|
|
||||||
sy match hsNumber "\<[0-9]\+\>\|\<0[xX][0-9a-fA-F]\+\>\|\<0[oO][0-7]\+\>"
|
|
||||||
sy match hsFloat "\<[0-9]\+\.[0-9]\+\([eE][-+]\=[0-9]\+\)\=\>"
|
|
||||||
|
|
||||||
" Comments
|
|
||||||
sy keyword hsCommentTodo TODO FIXME XXX TBD contained
|
|
||||||
sy match hsLineComment "---*\([^-!#$%&\*\+./<=>\?@\\^|~].*\)\?$" contains=hsCommentTodo,@Spell
|
|
||||||
sy region hsBlockComment start="{-" end="-}" contains=hsBlockComment,hsCommentTodo,@Spell
|
|
||||||
sy region hsPragma start="{-#" end="#-}"
|
|
||||||
|
|
||||||
" QuasiQuotation
|
|
||||||
sy region hsQQ start="\[\$" end="|\]"me=e-2 keepend contains=hsQQVarID,hsQQContent nextgroup=hsQQEnd
|
|
||||||
sy region hsQQNew start="\[\(.\&[^|]\&\S\)*|" end="|\]"me=e-2 keepend contains=hsQQVarIDNew,hsQQContent nextgroup=hsQQEnd
|
|
||||||
sy match hsQQContent ".*" contained
|
|
||||||
sy match hsQQEnd "|\]" contained
|
|
||||||
sy match hsQQVarID "\[\$\(.\&[^|]\)*|" contained
|
|
||||||
sy match hsQQVarIDNew "\[\(.\&[^|]\)*|" contained
|
|
||||||
|
|
||||||
if exists("hs_highlight_debug")
|
|
||||||
" Debugging functions from the standard prelude.
|
|
||||||
syn keyword hsDebug undefined error trace
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
" C Preprocessor directives. Shamelessly ripped from c.vim and trimmed
|
|
||||||
" First, see whether to flag directive-like lines or not
|
|
||||||
if (!exists("hs_allow_hash_operator"))
|
|
||||||
syn match cError display "^\s*\(%:\|#\).*$"
|
|
||||||
endif
|
|
||||||
" Accept %: for # (C99)
|
|
||||||
syn region cPreCondit start="^\s*\(%:\|#\)\s*\(if\|ifdef\|ifndef\|elif\)\>" skip="\\$" end="$" end="//"me=s-1 contains=cComment,cCppString,cCommentError
|
|
||||||
syn match cPreCondit display "^\s*\(%:\|#\)\s*\(else\|endif\)\>"
|
|
||||||
syn region cCppOut start="^\s*\(%:\|#\)\s*if\s\+0\+\>" end=".\@=\|$" contains=cCppOut2
|
|
||||||
syn region cCppOut2 contained start="0" end="^\s*\(%:\|#\)\s*\(endif\>\|else\>\|elif\>\)" contains=cCppSkip
|
|
||||||
syn region cCppSkip contained start="^\s*\(%:\|#\)\s*\(if\>\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*\(%:\|#\)\s*endif\>" contains=cCppSkip
|
|
||||||
syn region cIncluded display contained start=+"+ skip=+\\\\\|\\"+ end=+"+
|
|
||||||
syn match cIncluded display contained "<[^>]*>"
|
|
||||||
syn match cInclude display "^\s*\(%:\|#\)\s*include\>\s*["<]" contains=cIncluded
|
|
||||||
syn cluster cPreProcGroup contains=cPreCondit,cIncluded,cInclude,cDefine,cCppOut,cCppOut2,cCppSkip,cCommentStartError
|
|
||||||
syn region cDefine matchgroup=cPreCondit start="^\s*\(%:\|#\)\s*\(define\|undef\)\>" skip="\\$" end="$"
|
|
||||||
syn region cPreProc matchgroup=cPreCondit start="^\s*\(%:\|#\)\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" keepend
|
|
||||||
|
|
||||||
syn region cComment matchgroup=cCommentStart start="/\*" end="\*/" contains=cCommentStartError,cSpaceError contained
|
|
||||||
syntax match cCommentError display "\*/" contained
|
|
||||||
syntax match cCommentStartError display "/\*"me=e-1 contained
|
|
||||||
syn region cCppString start=+L\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=cSpecial contained
|
|
||||||
|
|
||||||
|
|
||||||
if version >= 508 || !exists("did_hs_syntax_inits")
|
|
||||||
if version < 508
|
if version < 508
|
||||||
let did_hs_syntax_inits = 1
|
let did_hs_syntax_inits = 1
|
||||||
command -nargs=+ HiLink hi link <args>
|
command -nargs=+ HiLink hi link <args>
|
||||||
@ -267,91 +117,42 @@ if version >= 508 || !exists("did_hs_syntax_inits")
|
|||||||
command -nargs=+ HiLink hi def link <args>
|
command -nargs=+ HiLink hi def link <args>
|
||||||
endif
|
endif
|
||||||
|
|
||||||
HiLink hs_hlFunctionName Function
|
" CPP
|
||||||
HiLink hs_HighliteInfixFunctionName Function
|
HiLink hsCPP PreProc
|
||||||
HiLink hs_HlInfixOp Function
|
HiLink hsCPPCond PreCondit
|
||||||
HiLink hs_OpFunctionName Function
|
HiLink hsCPPInclude Include
|
||||||
HiLink hsTypedef Typedef
|
HiLink hsCPPDefine Define
|
||||||
HiLink hsVarSym hsOperator
|
HiLink hsCPPDefined PreProc
|
||||||
HiLink hsConSym hsOperator
|
|
||||||
if exists("hs_highlight_delimiters")
|
|
||||||
" Some people find this highlighting distracting.
|
|
||||||
HiLink hsDelimiter Delimiter
|
|
||||||
endif
|
|
||||||
|
|
||||||
HiLink hsModuleStartLabel Structure
|
" Comments
|
||||||
HiLink hsExportModuleLabel Keyword
|
HiLink hsLineComment Comment
|
||||||
HiLink hsModuleWhereLabel Structure
|
HiLink hsBlockComment Comment
|
||||||
HiLink hsModuleName Normal
|
HiLink hsPragma Comment
|
||||||
|
HiLink hsHaddockComment SpecialComment
|
||||||
HiLink hsImportIllegal Error
|
HiLink hsHaddockSection SpecialComment
|
||||||
HiLink hsAsLabel hsImportLabel
|
|
||||||
HiLink hsHidingLabel hsImportLabel
|
|
||||||
HiLink hsImportLabel Include
|
|
||||||
HiLink hsImportMod Include
|
|
||||||
HiLink hsPackageString hsString
|
|
||||||
|
|
||||||
HiLink hsOperator Operator
|
HiLink hsKeyword Keyword
|
||||||
|
HiLink hsConditional Conditional
|
||||||
|
HiLink hsImport Include
|
||||||
|
HiLink hsTypeDecls Keyword
|
||||||
|
|
||||||
HiLink hsInfix Keyword
|
HiLink hsFIXME Todo
|
||||||
HiLink hsStructure Structure
|
|
||||||
HiLink hsStatement Statement
|
|
||||||
HiLink hsConditional Conditional
|
|
||||||
|
|
||||||
HiLink hsSpecialCharError Error
|
HiLink hsOperator Operator
|
||||||
HiLink hsSpecialChar SpecialChar
|
|
||||||
HiLink hsString String
|
|
||||||
HiLink hsFFIString String
|
|
||||||
HiLink hsCharacter Character
|
|
||||||
HiLink hsNumber Number
|
|
||||||
HiLink hsFloat Float
|
|
||||||
|
|
||||||
HiLink hsLiterateComment hsComment
|
HiLink hsModuleQualifier StorageClass
|
||||||
HiLink hsBlockComment hsComment
|
|
||||||
HiLink hsLineComment hsComment
|
|
||||||
HiLink hsModuleCommentA hsComment
|
|
||||||
HiLink hsModuleCommentB hsComment
|
|
||||||
HiLink hsComment Comment
|
|
||||||
HiLink hsCommentTodo Todo
|
|
||||||
HiLink hsPragma SpecialComment
|
|
||||||
HiLink hsBoolean Boolean
|
|
||||||
|
|
||||||
if exists("hs_highlight_types")
|
HiLink hsFunction Function
|
||||||
HiLink hsDelimTypeExport hsType
|
HiLink hsTypeName Type
|
||||||
HiLink hsType Type
|
|
||||||
endif
|
|
||||||
|
|
||||||
HiLink hsDebug Debug
|
" Literals
|
||||||
|
HiLink hsSpecialChar SpecialChar
|
||||||
|
HiLink hsFloat Float
|
||||||
|
HiLink hsNumber Number
|
||||||
|
HiLink hsCharacter Character
|
||||||
|
HiLink hsString String
|
||||||
|
|
||||||
HiLink hs_TypeOp hsOperator
|
HiLink hsScary Todo
|
||||||
|
|
||||||
HiLink cCppString hsString
|
|
||||||
HiLink cCommentStart hsComment
|
|
||||||
HiLink cCommentError hsError
|
|
||||||
HiLink cCommentStartError hsError
|
|
||||||
HiLink cInclude Include
|
|
||||||
HiLink cPreProc PreProc
|
|
||||||
HiLink cDefine Macro
|
|
||||||
HiLink cIncluded hsString
|
|
||||||
HiLink cError Error
|
|
||||||
HiLink cPreCondit PreCondit
|
|
||||||
HiLink cComment Comment
|
|
||||||
HiLink cCppSkip cCppOut
|
|
||||||
HiLink cCppOut2 cCppOut
|
|
||||||
HiLink cCppOut Comment
|
|
||||||
|
|
||||||
HiLink hsFFIForeign Keyword
|
|
||||||
HiLink hsFFIImportExport Structure
|
|
||||||
HiLink hsFFICallConvention Keyword
|
|
||||||
HiLink hsFFISafety Keyword
|
|
||||||
|
|
||||||
HiLink hsTHIDTopLevel Macro
|
|
||||||
HiLink hsTHTopLevelName Macro
|
|
||||||
|
|
||||||
HiLink hsQQVarID Keyword
|
|
||||||
HiLink hsQQVarIDNew Keyword
|
|
||||||
HiLink hsQQEnd Keyword
|
|
||||||
HiLink hsQQContent String
|
|
||||||
|
|
||||||
delcommand HiLink
|
delcommand HiLink
|
||||||
endif
|
endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user