diff options
| author | Adam Stankiewicz <sheerun@sher.pl> | 2015-12-06 11:53:26 +0100 | 
|---|---|---|
| committer | Adam Stankiewicz <sheerun@sher.pl> | 2015-12-06 11:53:26 +0100 | 
| commit | 08ea94e01188531e819e5d6bea5c84a773b4eb98 (patch) | |
| tree | 595c73c1476e2fdc8458529907efea083a405f68 | |
| parent | ba7a783c7f3d3c923ef151e4d3e99e087831ef69 (diff) | |
| download | vim-polyglot-08ea94e01188531e819e5d6bea5c84a773b4eb98.tar.gz vim-polyglot-08ea94e01188531e819e5d6bea5c84a773b4eb98.zip | |
Add elm support, closes #81
| -rw-r--r-- | README.md | 1 | ||||
| -rw-r--r-- | autoload/elm/io.vim | 12 | ||||
| -rwxr-xr-x | build | 1 | ||||
| -rw-r--r-- | ftdetect/polyglot.vim | 4 | ||||
| -rw-r--r-- | ftplugin/elm.vim | 86 | ||||
| -rw-r--r-- | indent/elm.vim | 129 | ||||
| -rw-r--r-- | syntax/elm.vim | 81 | 
7 files changed, 314 insertions, 0 deletions
| @@ -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)  - [dart](https://github.com/dart-lang/dart-vim-plugin) (syntax, indent, ftplugin, 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)  - [emberscript](https://github.com/heartsentwined/vim-ember-script) (syntax, indent, ftplugin, ftdetect)  - [emblem](https://github.com/heartsentwined/vim-emblem) (syntax, indent, ftplugin, ftdetect) diff --git a/autoload/elm/io.vim b/autoload/elm/io.vim new file mode 100644 index 00000000..509a8f6a --- /dev/null +++ b/autoload/elm/io.vim @@ -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 @@ -107,6 +107,7 @@ PACKS="    cucumber:tpope/vim-cucumber    dart:dart-lang/dart-vim-plugin    dockerfile:honza/dockerfile.vim +  elm:lambdatoast/elm.vim    elixir:elixir-lang/vim-elixir    emberscript:heartsentwined/vim-ember-script    emblem:heartsentwined/vim-emblem diff --git a/ftdetect/polyglot.vim b/ftdetect/polyglot.vim index 2ef84c93..9bd0f1c8 100644 --- a/ftdetect/polyglot.vim +++ b/ftdetect/polyglot.vim @@ -58,6 +58,10 @@ function! s:DetectElixir()  endfunction  autocmd BufNewFile,BufRead * call s:DetectElixir()  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  autocmd BufNewFile,BufRead *.em set filetype=ember-script diff --git a/ftplugin/elm.vim b/ftplugin/elm.vim new file mode 100644 index 00000000..7f121520 --- /dev/null +++ b/ftplugin/elm.vim @@ -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 diff --git a/indent/elm.vim b/indent/elm.vim new file mode 100644 index 00000000..48e96d7e --- /dev/null +++ b/indent/elm.vim @@ -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 diff --git a/syntax/elm.vim b/syntax/elm.vim new file mode 100644 index 00000000..5825e228 --- /dev/null +++ b/syntax/elm.vim @@ -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 | 
