Add elm support, closes #81
This commit is contained in:
parent
ba7a783c7f
commit
08ea94e011
@ -36,6 +36,7 @@ Optionally download one of the [releases](https://github.com/sheerun/vim-polyglo
|
|||||||
- [cucumber](https://github.com/tpope/vim-cucumber) (syntax, indent, compiler, ftplugin, ftdetect)
|
- [cucumber](https://github.com/tpope/vim-cucumber) (syntax, indent, compiler, ftplugin, ftdetect)
|
||||||
- [dart](https://github.com/dart-lang/dart-vim-plugin) (syntax, indent, ftplugin, ftdetect)
|
- [dart](https://github.com/dart-lang/dart-vim-plugin) (syntax, indent, ftplugin, ftdetect)
|
||||||
- [dockerfile](https://github.com/honza/dockerfile.vim) (syntax, ftdetect)
|
- [dockerfile](https://github.com/honza/dockerfile.vim) (syntax, ftdetect)
|
||||||
|
- [elm](https://github.com/lambdatoast/elm.vim) (syntax, indent, autoload, ftplugin, ftdetect)
|
||||||
- [elixir](https://github.com/elixir-lang/vim-elixir) (syntax, indent, compiler, ftplugin, ftdetect)
|
- [elixir](https://github.com/elixir-lang/vim-elixir) (syntax, indent, compiler, ftplugin, ftdetect)
|
||||||
- [emberscript](https://github.com/heartsentwined/vim-ember-script) (syntax, indent, ftplugin, ftdetect)
|
- [emberscript](https://github.com/heartsentwined/vim-ember-script) (syntax, indent, ftplugin, ftdetect)
|
||||||
- [emblem](https://github.com/heartsentwined/vim-emblem) (syntax, indent, ftplugin, ftdetect)
|
- [emblem](https://github.com/heartsentwined/vim-emblem) (syntax, indent, ftplugin, ftdetect)
|
||||||
|
12
autoload/elm/io.vim
Normal file
12
autoload/elm/io.vim
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elm') == -1
|
||||||
|
|
||||||
|
" System IO
|
||||||
|
|
||||||
|
" Craft a system command and run it, returning the output.
|
||||||
|
function! elm#io#system(program, args)
|
||||||
|
let cmd ="which " . a:program . " && " . a:program . " " . a:args
|
||||||
|
return system(cmd)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
endif
|
1
build
1
build
@ -107,6 +107,7 @@ PACKS="
|
|||||||
cucumber:tpope/vim-cucumber
|
cucumber:tpope/vim-cucumber
|
||||||
dart:dart-lang/dart-vim-plugin
|
dart:dart-lang/dart-vim-plugin
|
||||||
dockerfile:honza/dockerfile.vim
|
dockerfile:honza/dockerfile.vim
|
||||||
|
elm:lambdatoast/elm.vim
|
||||||
elixir:elixir-lang/vim-elixir
|
elixir:elixir-lang/vim-elixir
|
||||||
emberscript:heartsentwined/vim-ember-script
|
emberscript:heartsentwined/vim-ember-script
|
||||||
emblem:heartsentwined/vim-emblem
|
emblem:heartsentwined/vim-emblem
|
||||||
|
@ -58,6 +58,10 @@ function! s:DetectElixir()
|
|||||||
endfunction
|
endfunction
|
||||||
autocmd BufNewFile,BufRead * call s:DetectElixir()
|
autocmd BufNewFile,BufRead * call s:DetectElixir()
|
||||||
endif
|
endif
|
||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elm') == -1
|
||||||
|
|
||||||
|
au BufNewFile,BufRead *.elm set filetype=elm
|
||||||
|
endif
|
||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'emberscript') == -1
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'emberscript') == -1
|
||||||
|
|
||||||
autocmd BufNewFile,BufRead *.em set filetype=ember-script
|
autocmd BufNewFile,BufRead *.em set filetype=ember-script
|
||||||
|
86
ftplugin/elm.vim
Normal file
86
ftplugin/elm.vim
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elm') == -1
|
||||||
|
|
||||||
|
" elm.vim - Plugin for the Elm programming language
|
||||||
|
" Maintainer: Alexander Noriega <http://lambdatoast.com/>
|
||||||
|
" Version: 0.4.3
|
||||||
|
|
||||||
|
" Plugin setup stuff
|
||||||
|
|
||||||
|
if exists("b:did_ftplugin")
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
let b:did_ftplugin = 1
|
||||||
|
|
||||||
|
" Compilation
|
||||||
|
|
||||||
|
function! ElmMake(file)
|
||||||
|
let args = a:file
|
||||||
|
return elm#io#system("elm-make", args)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! ElmMakeCurrentFile()
|
||||||
|
echo ElmMake(expand("%"))
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! ElmMakeMain()
|
||||||
|
echo ElmMake("Main.elm")
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! ElmMakeFile(file)
|
||||||
|
echo ElmMake(a:file)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" REPL
|
||||||
|
|
||||||
|
function! ElmRepl()
|
||||||
|
!elm-repl
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Evaluation
|
||||||
|
|
||||||
|
function! ElmEvalLine()
|
||||||
|
return ElmEval(getline("."))
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! ElmEvalSelection()
|
||||||
|
let savedReg = @z
|
||||||
|
normal! `<v`>"zy
|
||||||
|
let res = ElmEval(substitute(getreg("z"), "\n", "\\\n", "g"))
|
||||||
|
let @z = savedReg
|
||||||
|
normal! gv
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! ElmEval(sourceCode)
|
||||||
|
let currentLine = a:sourceCode
|
||||||
|
let args = "echo '" . currentLine . "' | elm-repl"
|
||||||
|
let result = elm#io#system("echo", args)
|
||||||
|
let cleanResult = "-- " . join(s:Filtered(function("s:IsUsefulReplOutput"), split(result, "\n")), "")
|
||||||
|
put =cleanResult
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:IsUsefulReplOutput(str)
|
||||||
|
return a:str !~ "^Elm REPL" && a:str !~ "Type :help" && a:str !~ ">\\s*$"
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" List processing
|
||||||
|
|
||||||
|
function! s:Filtered(fn, l)
|
||||||
|
let new_list = deepcopy(a:l)
|
||||||
|
call filter(new_list, string(a:fn) . '(v:val)')
|
||||||
|
return new_list
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
command -buffer ElmEvalLine call ElmEvalLine()
|
||||||
|
command -buffer ElmEvalSelection call ElmEvalSelection()
|
||||||
|
command -buffer ElmMakeMain call ElmMakeMain()
|
||||||
|
command -buffer -nargs=1 ElmMakeFile call ElmMakeFile <args>
|
||||||
|
command -buffer ElmMakeCurrentFile call ElmMakeCurrentFile()
|
||||||
|
command -buffer ElmRepl call ElmRepl()
|
||||||
|
|
||||||
|
" Define comment convention
|
||||||
|
|
||||||
|
setlocal comments=:--
|
||||||
|
setlocal commentstring=--%s
|
||||||
|
|
||||||
|
endif
|
129
indent/elm.vim
Normal file
129
indent/elm.vim
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elm') == -1
|
||||||
|
|
||||||
|
" Vim indent file
|
||||||
|
" Language: Haskell
|
||||||
|
" Maintainer: lilydjwg <lilydjwg@gmail.com>
|
||||||
|
" Version: 1.0
|
||||||
|
" References: http://en.wikibooks.org/wiki/Haskell/Indentation
|
||||||
|
" http://book.realworldhaskell.org/read/
|
||||||
|
" See Also: The Align plugin http://www.vim.org/scripts/script.php?script_id=294
|
||||||
|
|
||||||
|
" Only load this indent file when no other was loaded.
|
||||||
|
if exists("b:did_indent")
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let b:did_indent = 1
|
||||||
|
|
||||||
|
setlocal indentexpr=HaskellIndent()
|
||||||
|
for i in split('0{,:,0#,e', ',')
|
||||||
|
exec "setlocal indentkeys-=" . i
|
||||||
|
endfor
|
||||||
|
setlocal indentkeys+=0=else,0=in,0=where,0),0<bar>
|
||||||
|
setlocal tabstop=8
|
||||||
|
setlocal expandtab
|
||||||
|
|
||||||
|
if !exists('g:Haskell_no_mapping')
|
||||||
|
inoremap <silent> <BS> <C-R>=<SID>HaskellDedent(1)<CR>
|
||||||
|
inoremap <silent> <C-D> <C-R>=<SID>HaskellDedent(0)<CR>
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Only define the functions once.
|
||||||
|
if exists("*HaskellIndent")
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
let s:align_map = {
|
||||||
|
\ 'in': '\<let\>',
|
||||||
|
\ '\<else\>': '\<then\>',
|
||||||
|
\ ',': '\v%(\s|\w|^)@<=[[{]%(\s|\w|"|$)@='
|
||||||
|
\ }
|
||||||
|
let s:indent_self = ['=']
|
||||||
|
let s:indent_next = ['let', 'in', 'where', 'do', 'if']
|
||||||
|
let s:indent_if_final = ['=', 'do', '->', 'of', 'where']
|
||||||
|
|
||||||
|
function HaskellIndent()
|
||||||
|
let lnum = v:lnum - 1
|
||||||
|
|
||||||
|
" Hit the start of the file, use zero indent.
|
||||||
|
if lnum == 0
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
let ind = indent(lnum)
|
||||||
|
let prevline = getline(lnum)
|
||||||
|
let curline = getline(v:lnum)
|
||||||
|
let curwords = split(curline)
|
||||||
|
if len(curwords) > 0
|
||||||
|
if has_key(s:align_map, curwords[0])
|
||||||
|
let word = s:align_map[curwords[0]]
|
||||||
|
let m = -1
|
||||||
|
let line = v:lnum
|
||||||
|
while m == -1
|
||||||
|
let line -= 1
|
||||||
|
if line <= 0
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
let m = match(getline(line), word)
|
||||||
|
endwhile
|
||||||
|
return m
|
||||||
|
elseif index(s:indent_self, curwords[0]) != -1
|
||||||
|
return ind + &sw
|
||||||
|
elseif curwords[0] == '|'
|
||||||
|
return match(prevline, '\v%(\s|\w|^)@<=[|=]%(\s|\w)@=')
|
||||||
|
elseif index([')', '}'], curwords[0]) != -1
|
||||||
|
return ind - &sw
|
||||||
|
elseif curwords[0] == 'where'
|
||||||
|
if prevline =~ '\v^\s+\|%(\s|\w)@='
|
||||||
|
return ind - 1
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
let prevwords = split(prevline)
|
||||||
|
if len(prevwords) == 0
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
if prevwords[-1] == 'where' && prevwords[0] == 'module'
|
||||||
|
return 0
|
||||||
|
elseif index(s:indent_if_final, prevwords[-1]) != -1
|
||||||
|
return ind + &sw
|
||||||
|
elseif prevwords[-1] =~ '\v%(\s|\w|^)@<=[[{(]$'
|
||||||
|
return ind + &sw
|
||||||
|
else
|
||||||
|
for word in reverse(prevwords)
|
||||||
|
if index(s:indent_next, word) != -1
|
||||||
|
return match(prevline, '\<'.word.'\>') + len(word) + 1
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
endif
|
||||||
|
|
||||||
|
if len(curwords) > 0 && curwords[0] == 'where'
|
||||||
|
return ind + &sw
|
||||||
|
endif
|
||||||
|
|
||||||
|
return ind
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function s:HaskellDedent(isbs)
|
||||||
|
if a:isbs && strpart(getline('.'), 0, col('.')-1) !~ '^\s\+$'
|
||||||
|
return "\<BS>"
|
||||||
|
endif
|
||||||
|
|
||||||
|
let curind = indent('.')
|
||||||
|
let line = line('.') - 1
|
||||||
|
while curind > 0 && line > 0
|
||||||
|
let ind = indent(line)
|
||||||
|
if ind >= curind
|
||||||
|
let line -= 1
|
||||||
|
else
|
||||||
|
echomsg curind ind
|
||||||
|
call setline('.', repeat(' ', ind) .
|
||||||
|
\ substitute(getline('.'), '^\s\+', '', ''))
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
endwhile
|
||||||
|
return a:isbs ? "\<BS>" : ''
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
endif
|
81
syntax/elm.vim
Normal file
81
syntax/elm.vim
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elm') == -1
|
||||||
|
|
||||||
|
" Vim syntax file
|
||||||
|
" Language: Elm (http://elm-lang.org/)
|
||||||
|
" Maintainer: Alexander Noriega
|
||||||
|
" Latest Revision: 19 April 2015
|
||||||
|
|
||||||
|
if exists("b:current_syntax")
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Keywords
|
||||||
|
syn keyword elmKeyword alias as case else exposing if import in let module of port then type where
|
||||||
|
|
||||||
|
" Builtin operators
|
||||||
|
syn match elmBuiltinOp "\~"
|
||||||
|
syn match elmBuiltinOp "||"
|
||||||
|
syn match elmBuiltinOp "|>"
|
||||||
|
syn match elmBuiltinOp "|"
|
||||||
|
syn match elmBuiltinOp "`"
|
||||||
|
syn match elmBuiltinOp "\^"
|
||||||
|
syn match elmBuiltinOp "\\"
|
||||||
|
syn match elmBuiltinOp ">>"
|
||||||
|
syn match elmBuiltinOp ">="
|
||||||
|
syn match elmBuiltinOp ">"
|
||||||
|
syn match elmBuiltinOp "=="
|
||||||
|
syn match elmBuiltinOp "="
|
||||||
|
syn match elmBuiltinOp "<\~"
|
||||||
|
syn match elmBuiltinOp "<|"
|
||||||
|
syn match elmBuiltinOp "<="
|
||||||
|
syn match elmBuiltinOp "<<"
|
||||||
|
syn match elmBuiltinOp "<-"
|
||||||
|
syn match elmBuiltinOp "<"
|
||||||
|
syn match elmBuiltinOp "::"
|
||||||
|
syn match elmBuiltinOp ":"
|
||||||
|
syn match elmBuiltinOp "/="
|
||||||
|
syn match elmBuiltinOp "//"
|
||||||
|
syn match elmBuiltinOp "/"
|
||||||
|
syn match elmBuiltinOp "\.\."
|
||||||
|
syn match elmBuiltinOp "\."
|
||||||
|
syn match elmBuiltinOp "->"
|
||||||
|
syn match elmBuiltinOp "-"
|
||||||
|
syn match elmBuiltinOp "++"
|
||||||
|
syn match elmBuiltinOp "+"
|
||||||
|
syn match elmBuiltinOp "*"
|
||||||
|
syn match elmBuiltinOp "&&"
|
||||||
|
syn match elmBuiltinOp "%"
|
||||||
|
|
||||||
|
" Special names
|
||||||
|
syntax match specialName "^main "
|
||||||
|
|
||||||
|
" Comments
|
||||||
|
syn match elmTodo "[tT][oO][dD][oO]\|FIXME\|XXX" contained
|
||||||
|
syn match elmLineComment "--.*" contains=elmTodo,@spell
|
||||||
|
syn region elmComment matchgroup=elmComment start="{-|\=" end="-}" contains=elmTodo,elmComment,@spell
|
||||||
|
|
||||||
|
" String literals
|
||||||
|
syn region elmString start="\"" skip="\\\"" end="\"" contains=elmStringEscape
|
||||||
|
syn match elmStringEscape "\\u[0-9a-fA-F]\{4}" contained
|
||||||
|
syn match elmStringEscape "\\[nrfvbt\\\"]" contained
|
||||||
|
|
||||||
|
" Number literals
|
||||||
|
syn match elmNumber "\(\<\d\+\>\)"
|
||||||
|
syn match elmNumber "\(\<\d\+\.\d\+\>\)"
|
||||||
|
|
||||||
|
" Types
|
||||||
|
syn match elmType "\<[A-Z][0-9A-Za-z_'-]*"
|
||||||
|
|
||||||
|
let b:current_syntax = "elm"
|
||||||
|
|
||||||
|
hi def link elmKeyword Keyword
|
||||||
|
hi def link elmBuiltinOp Special
|
||||||
|
hi def link elmType Type
|
||||||
|
hi def link elmTodo Todo
|
||||||
|
hi def link elmLineComment Comment
|
||||||
|
hi def link elmComment Comment
|
||||||
|
hi def link elmString String
|
||||||
|
hi def link elmNumber Number
|
||||||
|
hi def link specialName Special
|
||||||
|
|
||||||
|
endif
|
Loading…
x
Reference in New Issue
Block a user