ADDED vim/autoload/fish.vim Index: vim/autoload/fish.vim ================================================================== --- vim/autoload/fish.vim +++ vim/autoload/fish.vim @@ -0,0 +1,67 @@ +function! fish#Indent() + let l:shiftwidth = shiftwidth() + let l:prevlnum = prevnonblank(v:lnum - 1) + if l:prevlnum ==# 0 + return 0 + endif + let l:indent = 0 + let l:prevline = getline(l:prevlnum) + if l:prevline =~# '\v^\s*switch>' + let l:indent = l:shiftwidth * 2 + elseif l:prevline =~# '\v^\s*%(begin|if|else|while|for|function|case)>' + let l:indent = l:shiftwidth + endif + let l:line = getline(v:lnum) + if l:line =~# '\v^\s*end>' + return indent(v:lnum) - (l:indent ==# 0 ? l:shiftwidth : l:indent) + elseif l:line =~# '\v^\s*%(case|else)>' + return indent(v:lnum) - l:shiftwidth + endif + return indent(l:prevlnum) + l:indent +endfunction + +function! fish#Format() + if mode() =~# '\v^%(i|R)$' + return 1 + else + let l:command = v:lnum.','.(v:lnum+v:count-1).'!fish_indent' + echo l:command + execute l:command + endif +endfunction + +function! fish#Fold() + let l:line = getline(v:lnum) + if l:line =~# '\v^\s*%(begin|if|while|for|function|switch)>' + return 'a1' + elseif l:line =~# '\v^\s*end>' + return 's1' + else + return '=' + end +endfunction + +function! fish#Complete(findstart, base) + if a:findstart + return getline('.') =~# '\v^\s*$' ? -1 : 0 + else + if empty(a:base) + return [] + endif + let l:results = [] + let l:completions = + \ system('fish -c "complete -C'.shellescape(a:base).'"') + let l:cmd = substitute(a:base, '\v\S+$', '', '') + for l:line in split(l:completions, '\n') + let l:tokens = split(l:line, '\t') + call add(l:results, {'word': l:cmd.l:tokens[0], + \'abbr': l:tokens[0], + \'menu': get(l:tokens, 1, '')}) + endfor + return l:results + endif +endfunction + +function! fish#errorformat() + return '%Afish: %m,%-G%*\\ ^,%-Z%f (line %l):%s' +endfunction ADDED vim/ftdetect/fish.vim Index: vim/ftdetect/fish.vim ================================================================== --- vim/ftdetect/fish.vim +++ vim/ftdetect/fish.vim @@ -0,0 +1,23 @@ +autocmd BufRead,BufNewFile *.fish setfiletype fish + +" Detect fish scripts by the shebang line. +autocmd BufRead * + \ if getline(1) =~# '\v^#!%(\f*/|/usr/bin/env\s*<)fish>' | + \ setlocal filetype=fish | + \ endif + +" Move cursor to first empty line when using funced. +autocmd BufRead fish_funced_*_*.fish call search('^$') + +" Fish histories are YAML documents. +autocmd BufRead,BufNewFile ~/.config/fish/fish_{read_,}history setfiletype yaml + +" Universal variable storages should not be hand edited. +autocmd BufRead,BufNewFile ~/.config/fish/fishd.* setlocal readonly + +" Mimic `funced` when manually creating functions. +autocmd BufNewFile ~/.config/fish/functions/*.fish + \ call append(0, ['function '.expand('%:t:r'), + \'', + \'end']) | + \ 2 ADDED vim/indent/fish.vim Index: vim/indent/fish.vim ================================================================== --- vim/indent/fish.vim +++ vim/indent/fish.vim @@ -0,0 +1,2 @@ +setlocal indentexpr=fish#Indent() +setlocal indentkeys+==end,=else,=case ADDED vim/syntax/fish.vim Index: vim/syntax/fish.vim ================================================================== --- vim/syntax/fish.vim +++ vim/syntax/fish.vim @@ -0,0 +1,37 @@ +if exists('b:current_syntax') + finish +endif + +syntax case match + +syntax keyword fishKeyword begin function end +syntax keyword fishConditional if else switch +syntax keyword fishRepeat while for in +syntax keyword fishLabel case + +syntax match fishComment /#.*/ +syntax match fishSpecial /\\$/ +syntax match fishIdentifier /\$[[:alnum:]_]\+/ +syntax region fishString start=/'/ skip=/\\'/ end=/'/ +syntax region fishString start=/"/ skip=/\\"/ end=/"/ contains=fishIdentifier +syntax match fishCharacter /\v\\[abefnrtv *?~%#(){}\[\]<>&;"']|\\[xX][0-9a-f]{1,2}|\\o[0-7]{1,2}|\\u[0-9a-f]{1,4}|\\U[0-9a-f]{1,8}|\\c[a-z]/ +syntax match fishStatement /\v;\s*\zs\k+>/ +syntax match fishCommandSub /\v\(\s*\zs\k+>/ + +syntax region fishLineContinuation matchgroup=fishStatement + \ start='\v^\s*\zs\k+>' skip='\\$' end='$' + \ contains=fishSpecial,fishIdentifier,fishString,fishCharacter,fishStatement,fishCommandSub,fishComment + +highlight default link fishKeyword Keyword +highlight default link fishConditional Conditional +highlight default link fishRepeat Repeat +highlight default link fishLabel Label +highlight default link fishComment Comment +highlight default link fishSpecial Special +highlight default link fishIdentifier Identifier +highlight default link fishString String +highlight default link fishCharacter Character +highlight default link fishStatement Statement +highlight default link fishCommandSub fishStatement + +let b:current_syntax = 'fish'