mirror of
1
0
Fork 0

Updated plugins

This commit is contained in:
amix 2017-03-07 18:04:28 +01:00
parent fe46dfbbe6
commit ccb7854aa2
103 changed files with 1729 additions and 445 deletions

View File

@ -0,0 +1,37 @@
" =============================================================================
" Filename: autoload/lightline/colorscheme/darcula.vim
" Author: kkopec
" License: MIT License
" Last Change: 2017/02/11 21:18:54.
" =============================================================================
let s:black = [ '#2b2b2b', 235 ]
let s:gray = [ '#323232', 236 ]
let s:white = [ '#a9b7c6', 250 ]
let s:blue = [ '#6897bb' , 67 ]
let s:green = [ '#629755', 71 ]
let s:purple = [ '#9876aa', 104 ]
let s:red = [ '#ff6b68', 204 ]
let s:yellow = [ '#ffc66d', 222 ]
let s:p = {'normal': {}, 'inactive': {}, 'insert': {}, 'replace': {}, 'visual': {}, 'tabline': {}}
let s:p.normal.left = [ [ s:black, s:purple ], [ s:purple, s:gray ] ]
let s:p.normal.right = [ [ s:black, s:purple ], [ s:purple, s:gray ] ]
let s:p.inactive.left = [ [ s:black, s:blue ], [ s:blue, s:gray ] ]
let s:p.inactive.right = [ [ s:black, s:blue ], [ s:blue, s:gray ] ]
let s:p.insert.left = [ [ s:black, s:green ], [ s:green, s:gray ] ]
let s:p.insert.right = [ [ s:black, s:green ], [ s:green, s:gray ] ]
let s:p.replace.left = [ [ s:black, s:red ], [ s:red, s:gray ] ]
let s:p.replace.right = [ [ s:black, s:red ], [ s:red, s:gray ] ]
let s:p.visual.left = [ [ s:black, s:yellow ], [ s:yellow, s:gray ] ]
let s:p.visual.right = [ [ s:black, s:yellow ], [ s:yellow, s:gray ] ]
let s:p.normal.middle = [ [ s:white, s:gray ] ]
let s:p.inactive.middle = [ [ s:white, s:gray ] ]
let s:p.tabline.left = [ [ s:blue, s:gray ] ]
let s:p.tabline.tabsel = [ [ s:black, s:blue ] ]
let s:p.tabline.middle = [ [ s:blue, s:gray ] ]
let s:p.tabline.right = [ [ s:black, s:blue ] ]
let s:p.normal.error = [ [ s:red, s:black ] ]
let s:p.normal.warning = [ [ s:yellow, s:black ] ]
let g:lightline#colorscheme#darcula#palette = lightline#colorscheme#flatten(s:p)

View File

@ -223,7 +223,8 @@ OPTIONS *lightline-option*
The colorscheme for lightline.vim. The colorscheme for lightline.vim.
Currently, wombat, solarized, powerline, jellybeans, Tomorrow, Currently, wombat, solarized, powerline, jellybeans, Tomorrow,
Tomorrow_Night, Tomorrow_Night_Blue, Tomorrow_Night_Eighties, Tomorrow_Night, Tomorrow_Night_Blue, Tomorrow_Night_Eighties,
PaperColor, seoul256, landscape, one, Dracula, Molokai and 16color are available. PaperColor, seoul256, landscape, one, Dracula, darcula,
Molokai and 16color are available.
The default value is: The default value is:
> >
let g:lightline.colorscheme = 'default' let g:lightline.colorscheme = 'default'

View File

@ -20,108 +20,105 @@ endfunction
"FUNCTION: s:UI._dumpHelp {{{1 "FUNCTION: s:UI._dumpHelp {{{1
"prints out the quick help "prints out the quick help
function! s:UI._dumpHelp() function! s:UI._dumpHelp()
let old_h = @h
if self.getShowHelp() if self.getShowHelp()
let @h= "\" NERD tree (" . nerdtree#version() . ") quickhelp~\n" let help = "\" NERD tree (" . nerdtree#version() . ") quickhelp~\n"
let @h=@h."\" ============================\n" let help .= "\" ============================\n"
let @h=@h."\" File node mappings~\n" let help .= "\" File node mappings~\n"
let @h=@h."\" ". (g:NERDTreeMouseMode ==# 3 ? "single" : "double") ."-click,\n" let help .= "\" ". (g:NERDTreeMouseMode ==# 3 ? "single" : "double") ."-click,\n"
let @h=@h."\" <CR>,\n" let help .= "\" <CR>,\n"
if self.nerdtree.isTabTree() if self.nerdtree.isTabTree()
let @h=@h."\" ". g:NERDTreeMapActivateNode .": open in prev window\n" let help .= "\" ". g:NERDTreeMapActivateNode .": open in prev window\n"
else else
let @h=@h."\" ". g:NERDTreeMapActivateNode .": open in current window\n" let help .= "\" ". g:NERDTreeMapActivateNode .": open in current window\n"
endif endif
if self.nerdtree.isTabTree() if self.nerdtree.isTabTree()
let @h=@h."\" ". g:NERDTreeMapPreview .": preview\n" let help .= "\" ". g:NERDTreeMapPreview .": preview\n"
endif endif
let @h=@h."\" ". g:NERDTreeMapOpenInTab.": open in new tab\n" let help .= "\" ". g:NERDTreeMapOpenInTab.": open in new tab\n"
let @h=@h."\" ". g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n" let help .= "\" ". g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n"
let @h=@h."\" middle-click,\n" let help .= "\" middle-click,\n"
let @h=@h."\" ". g:NERDTreeMapOpenSplit .": open split\n" let help .= "\" ". g:NERDTreeMapOpenSplit .": open split\n"
let @h=@h."\" ". g:NERDTreeMapPreviewSplit .": preview split\n" let help .= "\" ". g:NERDTreeMapPreviewSplit .": preview split\n"
let @h=@h."\" ". g:NERDTreeMapOpenVSplit .": open vsplit\n" let help .= "\" ". g:NERDTreeMapOpenVSplit .": open vsplit\n"
let @h=@h."\" ". g:NERDTreeMapPreviewVSplit .": preview vsplit\n" let help .= "\" ". g:NERDTreeMapPreviewVSplit .": preview vsplit\n"
let @h=@h."\"\n\" ----------------------------\n" let help .= "\"\n\" ----------------------------\n"
let @h=@h."\" Directory node mappings~\n" let help .= "\" Directory node mappings~\n"
let @h=@h."\" ". (g:NERDTreeMouseMode ==# 1 ? "double" : "single") ."-click,\n" let help .= "\" ". (g:NERDTreeMouseMode ==# 1 ? "double" : "single") ."-click,\n"
let @h=@h."\" ". g:NERDTreeMapActivateNode .": open & close node\n" let help .= "\" ". g:NERDTreeMapActivateNode .": open & close node\n"
let @h=@h."\" ". g:NERDTreeMapOpenRecursively .": recursively open node\n" let help .= "\" ". g:NERDTreeMapOpenRecursively .": recursively open node\n"
let @h=@h."\" ". g:NERDTreeMapCloseDir .": close parent of node\n" let help .= "\" ". g:NERDTreeMapCloseDir .": close parent of node\n"
let @h=@h."\" ". g:NERDTreeMapCloseChildren .": close all child nodes of\n" let help .= "\" ". g:NERDTreeMapCloseChildren .": close all child nodes of\n"
let @h=@h."\" current node recursively\n" let help .= "\" current node recursively\n"
let @h=@h."\" middle-click,\n" let help .= "\" middle-click,\n"
let @h=@h."\" ". g:NERDTreeMapOpenExpl.": explore selected dir\n" let help .= "\" ". g:NERDTreeMapOpenExpl.": explore selected dir\n"
let @h=@h."\"\n\" ----------------------------\n" let help .= "\"\n\" ----------------------------\n"
let @h=@h."\" Bookmark table mappings~\n" let help .= "\" Bookmark table mappings~\n"
let @h=@h."\" double-click,\n" let help .= "\" double-click,\n"
let @h=@h."\" ". g:NERDTreeMapActivateNode .": open bookmark\n" let help .= "\" ". g:NERDTreeMapActivateNode .": open bookmark\n"
let @h=@h."\" ". g:NERDTreeMapOpenInTab.": open in new tab\n" let help .= "\" ". g:NERDTreeMapOpenInTab.": open in new tab\n"
let @h=@h."\" ". g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n" let help .= "\" ". g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n"
let @h=@h."\" ". g:NERDTreeMapDeleteBookmark .": delete bookmark\n" let help .= "\" ". g:NERDTreeMapDeleteBookmark .": delete bookmark\n"
let @h=@h."\"\n\" ----------------------------\n" let help .= "\"\n\" ----------------------------\n"
let @h=@h."\" Tree navigation mappings~\n" let help .= "\" Tree navigation mappings~\n"
let @h=@h."\" ". g:NERDTreeMapJumpRoot .": go to root\n" let help .= "\" ". g:NERDTreeMapJumpRoot .": go to root\n"
let @h=@h."\" ". g:NERDTreeMapJumpParent .": go to parent\n" let help .= "\" ". g:NERDTreeMapJumpParent .": go to parent\n"
let @h=@h."\" ". g:NERDTreeMapJumpFirstChild .": go to first child\n" let help .= "\" ". g:NERDTreeMapJumpFirstChild .": go to first child\n"
let @h=@h."\" ". g:NERDTreeMapJumpLastChild .": go to last child\n" let help .= "\" ". g:NERDTreeMapJumpLastChild .": go to last child\n"
let @h=@h."\" ". g:NERDTreeMapJumpNextSibling .": go to next sibling\n" let help .= "\" ". g:NERDTreeMapJumpNextSibling .": go to next sibling\n"
let @h=@h."\" ". g:NERDTreeMapJumpPrevSibling .": go to prev sibling\n" let help .= "\" ". g:NERDTreeMapJumpPrevSibling .": go to prev sibling\n"
let @h=@h."\"\n\" ----------------------------\n" let help .= "\"\n\" ----------------------------\n"
let @h=@h."\" Filesystem mappings~\n" let help .= "\" Filesystem mappings~\n"
let @h=@h."\" ". g:NERDTreeMapChangeRoot .": change tree root to the\n" let help .= "\" ". g:NERDTreeMapChangeRoot .": change tree root to the\n"
let @h=@h."\" selected dir\n" let help .= "\" selected dir\n"
let @h=@h."\" ". g:NERDTreeMapUpdir .": move tree root up a dir\n" let help .= "\" ". g:NERDTreeMapUpdir .": move tree root up a dir\n"
let @h=@h."\" ". g:NERDTreeMapUpdirKeepOpen .": move tree root up a dir\n" let help .= "\" ". g:NERDTreeMapUpdirKeepOpen .": move tree root up a dir\n"
let @h=@h."\" but leave old root open\n" let help .= "\" but leave old root open\n"
let @h=@h."\" ". g:NERDTreeMapRefresh .": refresh cursor dir\n" let help .= "\" ". g:NERDTreeMapRefresh .": refresh cursor dir\n"
let @h=@h."\" ". g:NERDTreeMapRefreshRoot .": refresh current root\n" let help .= "\" ". g:NERDTreeMapRefreshRoot .": refresh current root\n"
let @h=@h."\" ". g:NERDTreeMapMenu .": Show menu\n" let help .= "\" ". g:NERDTreeMapMenu .": Show menu\n"
let @h=@h."\" ". g:NERDTreeMapChdir .":change the CWD to the\n" let help .= "\" ". g:NERDTreeMapChdir .":change the CWD to the\n"
let @h=@h."\" selected dir\n" let help .= "\" selected dir\n"
let @h=@h."\" ". g:NERDTreeMapCWD .":change tree root to CWD\n" let help .= "\" ". g:NERDTreeMapCWD .":change tree root to CWD\n"
let @h=@h."\"\n\" ----------------------------\n" let help .= "\"\n\" ----------------------------\n"
let @h=@h."\" Tree filtering mappings~\n" let help .= "\" Tree filtering mappings~\n"
let @h=@h."\" ". g:NERDTreeMapToggleHidden .": hidden files (" . (self.getShowHidden() ? "on" : "off") . ")\n" let help .= "\" ". g:NERDTreeMapToggleHidden .": hidden files (" . (self.getShowHidden() ? "on" : "off") . ")\n"
let @h=@h."\" ". g:NERDTreeMapToggleFilters .": file filters (" . (self.isIgnoreFilterEnabled() ? "on" : "off") . ")\n" let help .= "\" ". g:NERDTreeMapToggleFilters .": file filters (" . (self.isIgnoreFilterEnabled() ? "on" : "off") . ")\n"
let @h=@h."\" ". g:NERDTreeMapToggleFiles .": files (" . (self.getShowFiles() ? "on" : "off") . ")\n" let help .= "\" ". g:NERDTreeMapToggleFiles .": files (" . (self.getShowFiles() ? "on" : "off") . ")\n"
let @h=@h."\" ". g:NERDTreeMapToggleBookmarks .": bookmarks (" . (self.getShowBookmarks() ? "on" : "off") . ")\n" let help .= "\" ". g:NERDTreeMapToggleBookmarks .": bookmarks (" . (self.getShowBookmarks() ? "on" : "off") . ")\n"
"add quickhelp entries for each custom key map "add quickhelp entries for each custom key map
let @h=@h."\"\n\" ----------------------------\n" let help .= "\"\n\" ----------------------------\n"
let @h=@h."\" Custom mappings~\n" let help .= "\" Custom mappings~\n"
for i in g:NERDTreeKeyMap.All() for i in g:NERDTreeKeyMap.All()
if !empty(i.quickhelpText) if !empty(i.quickhelpText)
let @h=@h."\" ". i.key .": ". i.quickhelpText ."\n" let help .= "\" ". i.key .": ". i.quickhelpText ."\n"
endif endif
endfor endfor
let @h=@h."\"\n\" ----------------------------\n" let help .= "\"\n\" ----------------------------\n"
let @h=@h."\" Other mappings~\n" let help .= "\" Other mappings~\n"
let @h=@h."\" ". g:NERDTreeMapQuit .": Close the NERDTree window\n" let help .= "\" ". g:NERDTreeMapQuit .": Close the NERDTree window\n"
let @h=@h."\" ". g:NERDTreeMapToggleZoom .": Zoom (maximize-minimize)\n" let help .= "\" ". g:NERDTreeMapToggleZoom .": Zoom (maximize-minimize)\n"
let @h=@h."\" the NERDTree window\n" let help .= "\" the NERDTree window\n"
let @h=@h."\" ". g:NERDTreeMapHelp .": toggle help\n" let help .= "\" ". g:NERDTreeMapHelp .": toggle help\n"
let @h=@h."\"\n\" ----------------------------\n" let help .= "\"\n\" ----------------------------\n"
let @h=@h."\" Bookmark commands~\n" let help .= "\" Bookmark commands~\n"
let @h=@h."\" :Bookmark [<name>]\n" let help .= "\" :Bookmark [<name>]\n"
let @h=@h."\" :BookmarkToRoot <name>\n" let help .= "\" :BookmarkToRoot <name>\n"
let @h=@h."\" :RevealBookmark <name>\n" let help .= "\" :RevealBookmark <name>\n"
let @h=@h."\" :OpenBookmark <name>\n" let help .= "\" :OpenBookmark <name>\n"
let @h=@h."\" :ClearBookmarks [<names>]\n" let help .= "\" :ClearBookmarks [<names>]\n"
let @h=@h."\" :ClearAllBookmarks\n" let help .= "\" :ClearAllBookmarks\n"
silent! put h silent! put =help
elseif !self.isMinimal() elseif !self.isMinimal()
let @h="\" Press ". g:NERDTreeMapHelp ." for help\n" let help ="\" Press ". g:NERDTreeMapHelp ." for help\n"
silent! put h silent! put =help
endif endif
let @h = old_h
endfunction endfunction
@ -440,10 +437,7 @@ function! s:UI.render()
call cursor(line(".")+1, col(".")) call cursor(line(".")+1, col("."))
"draw the tree "draw the tree
let old_o = @o silent put =self.nerdtree.root.renderToString()
let @o = self.nerdtree.root.renderToString()
silent put o
let @o = old_o
"delete the blank line at the top of the buffer "delete the blank line at the top of the buffer
silent 1,1delete _ silent 1,1delete _

View File

@ -101,10 +101,10 @@ enabled.
Syntastic itself has rather relaxed requirements: it doesn't have any external Syntastic itself has rather relaxed requirements: it doesn't have any external
dependencies, and it needs a version of [Vim][vim] compiled with a few common dependencies, and it needs a version of [Vim][vim] compiled with a few common
features: `autocmd`, `eval`, `file_in_path`, `modify_fname`, `quickfix`, features: `autocmd`, `eval`, `file_in_path`, `modify_fname`, `quickfix`,
`reltime`, and `user_commands`. Not all possible combinations of features that `reltime`, `statusline`, and `user_commands`. Not all possible combinations of
include the ones above make equal sense on all operating systems, but Vim features that include the ones above make equal sense on all operating systems,
version 7 or later with the "normal", "big", or "huge" feature sets should be but Vim version 7 or later with the "normal", "big", or "huge" feature sets
fine. should be fine.
Syntastic should work with any modern plugin managers for Vim, such as Syntastic should work with any modern plugin managers for Vim, such as
[NeoBundle][neobundle], [Pathogen][pathogen], [Vim-Addon-Manager][vam], [NeoBundle][neobundle], [Pathogen][pathogen], [Vim-Addon-Manager][vam],

View File

@ -132,9 +132,9 @@ endfunction " }}}2
" returns " returns
" "
" {'exe': '/usr/bin/perl', 'args': ['-f', '-bar']} " {'exe': '/usr/bin/perl', 'args': ['-f', '-bar']}
function! syntastic#util#parseShebang() abort " {{{2 function! syntastic#util#parseShebang(buf) abort " {{{2
for lnum in range(1, 5) for lnum in range(1, 5)
let line = getline(lnum) let line = get(getbufline(a:buf, lnum), 0, '')
if line =~# '^#!' if line =~# '^#!'
let line = substitute(line, '\v^#!\s*(\S+/env(\s+-\S+)*\s+)?', '', '') let line = substitute(line, '\v^#!\s*(\S+/env(\s+-\S+)*\s+)?', '', '')
let exe = matchstr(line, '\m^\S*\ze') let exe = matchstr(line, '\m^\S*\ze')

View File

@ -164,7 +164,7 @@ When syntax errors are detected a flag will be shown. The content of the flag
is derived from the |'syntastic_stl_format'| option. is derived from the |'syntastic_stl_format'| option.
Please note that these settings might conflict with other Vim plugins that Please note that these settings might conflict with other Vim plugins that
change the way statusline works. Refer to the |syntastic-compatibility| notes change the way 'statusline' works. Refer to the |syntastic-compatibility| notes
below and to the respective plugins' documentation for possible solutions. below and to the respective plugins' documentation for possible solutions.
In particular see |syntastic-airline| below if you're using the "airline" Vim In particular see |syntastic-airline| below if you're using the "airline" Vim

View File

@ -19,7 +19,7 @@ if has('reltime')
lockvar! g:_SYNTASTIC_START lockvar! g:_SYNTASTIC_START
endif endif
let g:_SYNTASTIC_VERSION = '3.8.0-21' let g:_SYNTASTIC_VERSION = '3.8.0-26'
lockvar g:_SYNTASTIC_VERSION lockvar g:_SYNTASTIC_VERSION
" Sanity checks {{{1 " Sanity checks {{{1
@ -36,7 +36,8 @@ for s:feature in [
\ 'modify_fname', \ 'modify_fname',
\ 'quickfix', \ 'quickfix',
\ 'reltime', \ 'reltime',
\ 'user_commands' \ 'statusline',
\ 'user_commands',
\ ] \ ]
if !has(s:feature) if !has(s:feature)
call syntastic#log#error('need Vim compiled with feature ' . s:feature) call syntastic#log#error('need Vim compiled with feature ' . s:feature)

View File

@ -34,19 +34,20 @@ function! SyntaxCheckers_asm_gcc_IsAvailable() dict " {{{1
endfunction " }}}1 endfunction " }}}1
function! SyntaxCheckers_asm_gcc_GetLocList() dict " {{{1 function! SyntaxCheckers_asm_gcc_GetLocList() dict " {{{1
let buf = bufnr('')
return syntastic#c#GetLocList('asm', 'gcc', { return syntastic#c#GetLocList('asm', 'gcc', {
\ 'errorformat': \ 'errorformat':
\ '%-G%f:%s:,' . \ '%-G%f:%s:,' .
\ '%f:%l:%c: %trror: %m,' . \ '%f:%l:%c: %trror: %m,' .
\ '%f:%l:%c: %tarning: %m,' . \ '%f:%l:%c: %tarning: %m,' .
\ '%f:%l: %m', \ '%f:%l: %m',
\ 'main_flags': '-x assembler -fsyntax-only' . (g:syntastic_asm_generic ? '' : ' -masm=' . s:GetDialect()) }) \ 'main_flags': '-x assembler -fsyntax-only' . (g:syntastic_asm_generic ? '' : ' -masm=' . s:GetDialect(buf)) })
endfunction " }}}1 endfunction " }}}1
" Utilities {{{1 " Utilities {{{1
function! s:GetDialect() " {{{2 function! s:GetDialect(buf) " {{{2
return syntastic#util#var('asm_dialect', expand('%:e', 1) ==? 'asm' ? 'intel' : 'att') return syntastic#util#bufVar(a:buf, 'asm_dialect', fnamemodify(bufname(a:buf), ':e') ==? 'asm' ? 'intel' : 'att')
endfunction " }}}2 endfunction " }}}2
" }}}1 " }}}1

View File

@ -23,7 +23,8 @@ if !exists('g:syntastic_pc_lint_config_file')
endif endif
function! SyntaxCheckers_c_pc_lint_GetLocList() dict function! SyntaxCheckers_c_pc_lint_GetLocList() dict
let config = syntastic#util#findFileInParent(g:syntastic_pc_lint_config_file, expand('%:p:h', 1)) let buf = bufnr('')
let config = syntastic#util#findFileInParent(g:syntastic_pc_lint_config_file, fnamemodify(bufname(buf), ':p:h'))
call self.log('config =', config) call self.log('config =', config)
" -hFs1 - show filename, add space after messages, try to make message 1 line " -hFs1 - show filename, add space after messages, try to make message 1 line

View File

@ -31,6 +31,7 @@ function! SyntaxCheckers_cabal_cabal_GetHighlightRegex(item)
endfunction endfunction
function! SyntaxCheckers_cabal_cabal_GetLocList() dict function! SyntaxCheckers_cabal_cabal_GetLocList() dict
let buf = bufnr('')
let makeprg = self.getExecEscaped() . ' check' let makeprg = self.getExecEscaped() . ' check'
let errorformat = let errorformat =
@ -40,9 +41,9 @@ function! SyntaxCheckers_cabal_cabal_GetLocList() dict
return SyntasticMake({ return SyntasticMake({
\ 'makeprg': makeprg, \ 'makeprg': makeprg,
\ 'errorformat': errorformat, \ 'errorformat': errorformat,
\ 'cwd': expand('%:p:h', 1), \ 'cwd': fnamemodify(bufname(buf), ':p:h'),
\ 'preprocess': 'cabal', \ 'preprocess': 'cabal',
\ 'defaults': {'bufnr': bufnr('')} }) \ 'defaults': {'bufnr': buf} })
endfunction endfunction
call g:SyntasticRegistry.CreateAndRegisterChecker({ call g:SyntasticRegistry.CreateAndRegisterChecker({

View File

@ -18,7 +18,8 @@ let s:save_cpo = &cpo
set cpo&vim set cpo&vim
function! SyntaxCheckers_cuda_nvcc_GetLocList() dict function! SyntaxCheckers_cuda_nvcc_GetLocList() dict
let arch_flag = syntastic#util#var('cuda_arch') let buf = bufnr('')
let arch_flag = syntastic#util#bufVar(buf, 'cuda_arch')
if arch_flag !=# '' if arch_flag !=# ''
let arch_flag = '-arch=' . arch_flag let arch_flag = '-arch=' . arch_flag
call syntastic#log#oneTimeWarn('variable g:syntastic_cuda_arch is deprecated, ' . call syntastic#log#oneTimeWarn('variable g:syntastic_cuda_arch is deprecated, ' .
@ -27,9 +28,9 @@ function! SyntaxCheckers_cuda_nvcc_GetLocList() dict
let build_opts = {} let build_opts = {}
let dummy = '' let dummy = ''
if index(['h', 'hpp', 'cuh'], expand('%:e', 1), 0, 1) >= 0 if index(['h', 'hpp', 'cuh'], fnamemodify(bufname(buf), ':e'), 0, 1) >= 0
if syntastic#util#var('cuda_check_header', 0) if syntastic#util#bufVar(buf, 'cuda_check_header', 0)
let dummy = expand('%:p:h', 1) . syntastic#util#Slash() . '.syntastic_dummy.cu' let dummy = fnamemodify(bufname(buf), ':p:h') . syntastic#util#Slash() . '.syntastic_dummy.cu'
let build_opts = { let build_opts = {
\ 'exe_before': 'echo > ' . syntastic#util#shescape(dummy) . ' ;', \ 'exe_before': 'echo > ' . syntastic#util#shescape(dummy) . ' ;',
\ 'fname_before': '.syntastic_dummy.cu -include' } \ 'fname_before': '.syntastic_dummy.cu -include' }
@ -62,7 +63,18 @@ function! SyntaxCheckers_cuda_nvcc_GetLocList() dict
\ '%DMaking %*\a in %f,'. \ '%DMaking %*\a in %f,'.
\ '%f|%l| %m' \ '%f|%l| %m'
let loclist = SyntasticMake({ 'makeprg': makeprg, 'errorformat': errorformat }) let loclist = SyntasticMake({
\ 'makeprg': makeprg,
\ 'errorformat': errorformat,
\ 'defaults': {'type': 'E'} })
for e in loclist
let pat = matchstr(e['text'], '\m\c^\s*warning:\s*\zs.*')
if pat !=# ''
let e['text'] = pat
let e['type'] = 'W'
endif
endfor
if dummy !=# '' if dummy !=# ''
call delete(dummy) call delete(dummy)

View File

@ -44,8 +44,9 @@ function! SyntaxCheckers_d_dmd_IsAvailable() dict " {{{1
endfunction " }}}1 endfunction " }}}1
function! SyntaxCheckers_d_dmd_GetLocList() dict " {{{1 function! SyntaxCheckers_d_dmd_GetLocList() dict " {{{1
let buf = bufnr('')
if !exists('g:syntastic_d_include_dirs') if !exists('g:syntastic_d_include_dirs')
let g:syntastic_d_include_dirs = s:GetIncludes(self, expand('%:p:h')) let g:syntastic_d_include_dirs = s:GetIncludes(self, fnamemodify(bufname(buf), ':p:h'))
endif endif
return syntastic#c#GetLocList('d', 'dmd', { return syntastic#c#GetLocList('d', 'dmd', {

View File

@ -27,9 +27,10 @@ function! SyntaxCheckers_elixir_elixir_IsAvailable() dict
endfunction endfunction
function! SyntaxCheckers_elixir_elixir_GetLocList() dict function! SyntaxCheckers_elixir_elixir_GetLocList() dict
let buf = bufnr('')
let make_options = {} let make_options = {}
let compile_command = 'elixir' let compile_command = 'elixir'
let mix_file = syntastic#util#findFileInParent('mix.exs', expand('%:p:h', 1)) let mix_file = syntastic#util#findFileInParent('mix.exs', fnamemodify(bufname(buf), ':p:h'))
if filereadable(mix_file) if filereadable(mix_file)
let compile_command = 'mix compile' let compile_command = 'mix compile'

View File

@ -25,11 +25,13 @@ let s:save_cpo = &cpo
set cpo&vim set cpo&vim
function! SyntaxCheckers_erlang_escript_GetLocList() dict function! SyntaxCheckers_erlang_escript_GetLocList() dict
if expand('%:e', 1) ==# 'hrl' let buf = bufnr('')
if fnamemodify(bufname(buf), ':e') ==# 'hrl'
return [] return []
endif endif
let shebang = syntastic#util#parseShebang() let shebang = syntastic#util#parseShebang(buf)
if shebang['exe'] ==# 'escript' if shebang['exe'] ==# 'escript'
let args = '-s' let args = '-s'
let post_args = '' let post_args = ''
@ -39,7 +41,7 @@ function! SyntaxCheckers_erlang_escript_GetLocList() dict
endif endif
let makeprg = self.makeprgBuild({ let makeprg = self.makeprgBuild({
\ 'args_after': args, \ 'args_after': args,
\ 'fname': syntastic#util#shexpand('%:p'), \ 'fname': syntastic#util#shexpand(fnamemodify(bufname(buf), ':p')),
\ 'post_args_after': post_args }) \ 'post_args_after': post_args })
let errorformat = let errorformat =

View File

@ -31,7 +31,8 @@ function! SyntaxCheckers_eruby_ruby_GetLocList() dict
let s:ruby_new = syntastic#util#versionIsAtLeast(self.getVersion(), [1, 9]) let s:ruby_new = syntastic#util#versionIsAtLeast(self.getVersion(), [1, 9])
endif endif
let fname = "'" . escape(expand('%', 1), "\\'") . "'" let buf = bufnr('')
let fname = "'" . escape(bufname(buf), "\\'") . "'"
" TODO: encodings became useful in ruby 1.9 :) " TODO: encodings became useful in ruby 1.9 :)
if s:ruby_new if s:ruby_new
@ -69,7 +70,7 @@ function! SyntaxCheckers_eruby_ruby_GetLocList() dict
\ 'makeprg': makeprg, \ 'makeprg': makeprg,
\ 'errorformat': errorformat, \ 'errorformat': errorformat,
\ 'env': env, \ 'env': env,
\ 'defaults': { 'bufnr': bufnr(''), 'vcol': 1 } }) \ 'defaults': { 'bufnr': buf, 'vcol': 1 } })
endfunction endfunction
call g:SyntasticRegistry.CreateAndRegisterChecker({ call g:SyntasticRegistry.CreateAndRegisterChecker({

View File

@ -28,8 +28,9 @@ let s:save_cpo = &cpo
set cpo&vim set cpo&vim
function! SyntaxCheckers_glsl_cgc_GetLocList() dict " {{{1 function! SyntaxCheckers_glsl_cgc_GetLocList() dict " {{{1
let buf = bufnr('')
let makeprg = self.makeprgBuild({ let makeprg = self.makeprgBuild({
\ 'args_before': '-oglsl -profile ' . s:GetProfile(), \ 'args_before': '-oglsl -profile ' . s:GetProfile(buf),
\ 'args': (exists('g:syntastic_glsl_options') ? ' ' . g:syntastic_glsl_options : '') }) \ 'args': (exists('g:syntastic_glsl_options') ? ' ' . g:syntastic_glsl_options : '') })
let errorformat = let errorformat =
@ -43,27 +44,11 @@ endfunction " }}}1
" Utilities {{{1 " Utilities {{{1
function! s:GetProfile() " {{{2 function! s:GetProfile(buf) " {{{2
let save_view = winsaveview() let profile = matchstr(get(filter(getbufline(a:buf, 1, 100), 'v:val =~# "\\m\\C^//\\s*profile:"'), 0, ''), '\m\C^//\s*profile:\s*\zs.*')
let old_foldenable = &foldenable if profile ==# ''
let old_lazyredraw = &lazyredraw let extensions = syntastic#util#bufVar(a:buf, 'glsl_extensions', s:glsl_extensions)
let profile = get(extensions, tolower(fnamemodify(bufname(a:buf), ':e')), 'gpu_vert')
let &lazyredraw = 1
let &foldenable = 0
call cursor(1, 1)
let magic = '\m\C^// profile:\s*'
let line = search(magic, 'c')
call winrestview(save_view)
let &foldenable = old_foldenable
let &lazyredraw = old_lazyredraw
if line
let profile = matchstr(getline(line), magic . '\zs.*')
else
let extensions = exists('g:syntastic_glsl_extensions') ? g:syntastic_glsl_extensions : s:glsl_extensions
let profile = get(extensions, tolower(expand('%:e', 1)), 'gpu_vert')
endif endif
return profile return profile

View File

@ -30,6 +30,7 @@ function! SyntaxCheckers_go_go_GetLocList() dict
if !exists('s:go_new') if !exists('s:go_new')
let s:go_new = syntastic#util#versionIsAtLeast(self.getVersion(self.getExecEscaped() . ' version'), [1, 5]) let s:go_new = syntastic#util#versionIsAtLeast(self.getVersion(self.getExecEscaped() . ' version'), [1, 5])
endif endif
let buf = bufnr('')
" Check with gofmt first, since `go build` and `go test` might not report " Check with gofmt first, since `go build` and `go test` might not report
" syntax errors in the current file if another file with syntax error is " syntax errors in the current file if another file with syntax error is
@ -53,14 +54,14 @@ function! SyntaxCheckers_go_go_GetLocList() dict
" Test files, i.e. files with a name ending in `_test.go`, are not " Test files, i.e. files with a name ending in `_test.go`, are not
" compiled by `go build`, therefore `go test` must be called for those. " compiled by `go build`, therefore `go test` must be called for those.
if match(expand('%', 1), '\m_test\.go$') == -1 if bufname(buf) =~# '\m_test\.go$'
let cmd = 'build'
let opts = syntastic#util#var('go_go_build_args', s:go_new ? '-buildmode=archive' : '')
let cleanup = 0
else
let cmd = 'test -c' let cmd = 'test -c'
let opts = syntastic#util#var('go_go_test_args', s:go_new ? '-buildmode=archive' : '') let opts = syntastic#util#bufVar(buf, 'go_go_test_args', s:go_new ? '-buildmode=archive' : '')
let cleanup = 1 let cleanup = 1
else
let cmd = 'build'
let opts = syntastic#util#bufVar(buf, 'go_go_build_args', s:go_new ? '-buildmode=archive' : '')
let cleanup = 0
endif endif
let opt_str = (type(opts) != type('') || opts !=# '') ? join(syntastic#util#argsescape(opts)) : opts let opt_str = (type(opts) != type('') || opts !=# '') ? join(syntastic#util#argsescape(opts)) : opts
let makeprg = self.getExecEscaped() . ' ' . cmd . ' ' . opt_str let makeprg = self.getExecEscaped() . ' ' . cmd . ' ' . opt_str
@ -82,12 +83,12 @@ function! SyntaxCheckers_go_go_GetLocList() dict
let errors = SyntasticMake({ let errors = SyntasticMake({
\ 'makeprg': makeprg, \ 'makeprg': makeprg,
\ 'errorformat': errorformat, \ 'errorformat': errorformat,
\ 'cwd': expand('%:p:h', 1), \ 'cwd': fnamemodify(bufname(buf), ':p:h'),
\ 'env': {'GOGC': 'off'}, \ 'env': {'GOGC': 'off'},
\ 'defaults': {'type': 'e'} }) \ 'defaults': {'type': 'e'} })
if cleanup if cleanup
call delete(expand('%:p:h', 1) . syntastic#util#Slash() . expand('%:p:h:t', 1) . '.test') call delete(fnamemodify(bufname(buf), ':p:h') . syntastic#util#Slash() . fnamemodify(bufname(buf), ':p:h') . '.test')
endif endif
return errors return errors

View File

@ -19,9 +19,10 @@ let s:save_cpo = &cpo
set cpo&vim set cpo&vim
function! SyntaxCheckers_go_gometalinter_GetLocList() dict function! SyntaxCheckers_go_gometalinter_GetLocList() dict
let buf = bufnr('')
let makeprg = self.makeprgBuild({ let makeprg = self.makeprgBuild({
\ 'args': '-t', \ 'args': '-t',
\ 'fname': syntastic#util#shexpand('%:p:h') }) \ 'fname': syntastic#util#shescape(fnamemodify(bufname(buf), ':p:h')) })
let errorformat = let errorformat =
\ '%f:%l:%c:%trror: %m,' . \ '%f:%l:%c:%trror: %m,' .

View File

@ -19,8 +19,9 @@ let s:save_cpo = &cpo
set cpo&vim set cpo&vim
function! SyntaxCheckers_go_gotype_GetLocList() dict function! SyntaxCheckers_go_gotype_GetLocList() dict
let buf = bufnr('')
let makeprg = self.makeprgBuild({ let makeprg = self.makeprgBuild({
\ 'args': (expand('%', 1) =~# '\m_test\.go$' ? '-a' : ''), \ 'args': (bufname(buf) =~# '\m_test\.go$' ? '-a' : ''),
\ 'fname': '.' }) \ 'fname': '.' })
let errorformat = let errorformat =
@ -34,7 +35,7 @@ function! SyntaxCheckers_go_gotype_GetLocList() dict
return SyntasticMake({ return SyntasticMake({
\ 'makeprg': makeprg, \ 'makeprg': makeprg,
\ 'errorformat': errorformat, \ 'errorformat': errorformat,
\ 'cwd': expand('%:p:h', 1), \ 'cwd': fnamemodify(bufname(buf), ':p:h'),
\ 'defaults': {'type': 'e'} }) \ 'defaults': {'type': 'e'} })
endfunction endfunction

View File

@ -19,6 +19,7 @@ let s:save_cpo = &cpo
set cpo&vim set cpo&vim
function! SyntaxCheckers_go_govet_GetLocList() dict function! SyntaxCheckers_go_govet_GetLocList() dict
let buf = bufnr('')
let makeprg = self.getExecEscaped() . ' vet' let makeprg = self.getExecEscaped() . ' vet'
let errorformat = let errorformat =
@ -33,7 +34,7 @@ function! SyntaxCheckers_go_govet_GetLocList() dict
return SyntasticMake({ return SyntasticMake({
\ 'makeprg': makeprg, \ 'makeprg': makeprg,
\ 'errorformat': errorformat, \ 'errorformat': errorformat,
\ 'cwd': expand('%:p:h', 1), \ 'cwd': fnamemodify(bufname(buf), ':p:h'),
\ 'defaults': {'type': 'w'} }) \ 'defaults': {'type': 'w'} })
endfunction endfunction

View File

@ -25,9 +25,10 @@ function! SyntaxCheckers_haskell_hdevtools_GetLocList() dict
let g:syntastic_haskell_hdevtools_args = g:hdevtools_options let g:syntastic_haskell_hdevtools_args = g:hdevtools_options
endif endif
let buf = bufnr('')
let makeprg = self.makeprgBuild({ let makeprg = self.makeprgBuild({
\ 'exe_after': 'check', \ 'exe_after': 'check',
\ 'fname': syntastic#util#shexpand('%:p') }) \ 'fname': syntastic#util#shescape(fnamemodify(bufname(buf), ':p')) })
let errorformat = let errorformat =
\ '%-Z %#,'. \ '%-Z %#,'.

View File

@ -14,8 +14,9 @@ let s:save_cpo = &cpo
set cpo&vim set cpo&vim
function! SyntaxCheckers_haskell_hlint_GetLocList() dict function! SyntaxCheckers_haskell_hlint_GetLocList() dict
let buf = bufnr('')
let makeprg = self.makeprgBuild({ let makeprg = self.makeprgBuild({
\ 'fname': syntastic#util#shexpand('%:p')}) \ 'fname': syntastic#util#shescape(fnamemodify(bufname(buf), ':p')) })
let errorformat = let errorformat =
\ '%E%f:%l:%v: Error while reading hint file\, %m,' . \ '%E%f:%l:%v: Error while reading hint file\, %m,' .

View File

@ -19,12 +19,10 @@ let s:save_cpo = &cpo
set cpo&vim set cpo&vim
function! SyntaxCheckers_haxe_haxe_GetLocList() dict function! SyntaxCheckers_haxe_haxe_GetLocList() dict
if exists('b:vaxe_hxml') let buf = bufnr('')
let hxml = b:vaxe_hxml let hxml = syntastic#util#bufRawVar(buf, 'vaxe_hxml')
elseif exists('g:vaxe_hxml') if hxml ==# ''
let hxml = g:vaxe_hxml let hxml = syntastic#util#findGlobInParent('*.hxml', fnamemodify(bufname(buf), ':p:h'))
else
let hxml = syntastic#util#findGlobInParent('*.hxml', expand('%:p:h', 1))
endif endif
let hxml = fnamemodify(hxml, ':p') let hxml = fnamemodify(hxml, ':p')

View File

@ -31,7 +31,8 @@ let s:save_cpo = &cpo
set cpo&vim set cpo&vim
function! SyntaxCheckers_html_validator_GetLocList() dict function! SyntaxCheckers_html_validator_GetLocList() dict
let fname = syntastic#util#shexpand('%') let buf = bufnr('')
let fname = syntastic#util#shescape(fnamemodify(bufname(buf), ':p'))
let makeprg = self.getExecEscaped() . ' -q -L -s --compressed -F out=gnu -F asciiquotes=yes' . let makeprg = self.getExecEscaped() . ' -q -L -s --compressed -F out=gnu -F asciiquotes=yes' .
\ (g:syntastic_html_validator_parser !=# '' ? ' -F parser=' . g:syntastic_html_validator_parser : '') . \ (g:syntastic_html_validator_parser !=# '' ? ' -F parser=' . g:syntastic_html_validator_parser : '') .
\ (g:syntastic_html_validator_nsfilter !=# '' ? ' -F nsfilter=' . g:syntastic_html_validator_nsfilter : '') . \ (g:syntastic_html_validator_nsfilter !=# '' ? ' -F nsfilter=' . g:syntastic_html_validator_nsfilter : '') .

View File

@ -23,8 +23,9 @@ let s:save_cpo = &cpo
set cpo&vim set cpo&vim
function! SyntaxCheckers_html_w3_GetLocList() dict function! SyntaxCheckers_html_w3_GetLocList() dict
let buf = bufnr('')
let makeprg = self.getExecEscaped() . ' -q -L -s -F output=json ' . let makeprg = self.getExecEscaped() . ' -q -L -s -F output=json ' .
\ '-F uploaded_file=@' . syntastic#util#shexpand('%:p') . '\;type=text/html ' . \ '-F uploaded_file=@' . syntastic#util#shescape(fnamemodify(bufname(buf), ':p')) . '\;type=text/html ' .
\ g:syntastic_html_w3_api \ g:syntastic_html_w3_api
let errorformat = let errorformat =

View File

@ -40,6 +40,8 @@ endfunction
function! SyntaxCheckers_java_checkstyle_GetLocList() dict function! SyntaxCheckers_java_checkstyle_GetLocList() dict
let buf = bufnr('')
" classpath " classpath
if !exists('s:sep') if !exists('s:sep')
let s:sep = syntastic#util#isRunningWindows() || has('win32unix') ? ';' : ':' let s:sep = syntastic#util#isRunningWindows() || has('win32unix') ? ';' : ':'
@ -58,7 +60,7 @@ function! SyntaxCheckers_java_checkstyle_GetLocList() dict
\ '-f', 'xml' ]) \ '-f', 'xml' ])
" filename " filename
let fname = syntastic#util#shescape( expand('%:p:h', 1) . syntastic#util#Slash() . expand('%:t', 1) ) let fname = syntastic#util#shescape( fnamemodify(bufname(buf), ':p:h') . syntastic#util#Slash() . fnamemodify(bufname(buf), ':t') )
if has('win32unix') if has('win32unix')
let fname = substitute(syntastic#util#system('cygpath -m ' . fname), '\m\%x00', '', 'g') let fname = substitute(syntastic#util#system('cygpath -m ' . fname), '\m\%x00', '', 'g')
endif endif

View File

@ -223,7 +223,7 @@ endfunction " }}}2
function! s:SaveClasspath() " {{{2 function! s:SaveClasspath() " {{{2
" build classpath from lines " build classpath from lines
let path = '' let path = ''
let lines = getline(1, line('$')) let lines = getline(1, '$')
for l in lines for l in lines
let path = s:AddToClasspath(path, l) let path = s:AddToClasspath(path, l)
endfor endfor
@ -281,7 +281,7 @@ endfunction " }}}2
function! s:SaveConfig() " {{{2 function! s:SaveConfig() " {{{2
" get lines " get lines
let lines = getline(1, line('$')) let lines = getline(1, '$')
if g:syntastic_java_javac_config_file_enabled if g:syntastic_java_javac_config_file_enabled
" save config file lines " save config file lines
call writefile(lines, expand(g:syntastic_java_javac_config_file, 1)) call writefile(lines, expand(g:syntastic_java_javac_config_file, 1))

View File

@ -42,11 +42,12 @@ function! SyntaxCheckers_javascript_closurecompiler_GetLocList() dict
call syntastic#log#deprecationWarn('javascript_closure_compiler_options', 'javascript_closurecompiler_args') call syntastic#log#deprecationWarn('javascript_closure_compiler_options', 'javascript_closurecompiler_args')
call syntastic#log#deprecationWarn('javascript_closure_compiler_file_list', 'javascript_closurecompiler_file_list') call syntastic#log#deprecationWarn('javascript_closure_compiler_file_list', 'javascript_closurecompiler_file_list')
let flist = expand(get(g:, 'syntastic_javascript_closurecompiler_file_list', ''), 1) let buf = bufnr('')
let flist = expand(syntastic#util#bufVar(buf, 'javascript_closurecompiler_file_list'), 1)
if filereadable(flist) if filereadable(flist)
let file_list = map( readfile(flist), 'expand(v:var, 1)' ) let file_list = map( readfile(flist), 'expand(v:var, 1)' )
else else
let file_list = [expand('%', 1)] let file_list = [bufname(buf)]
endif endif
let makeprg = self.makeprgBuild({ let makeprg = self.makeprgBuild({

View File

@ -29,7 +29,8 @@ function! SyntaxCheckers_javascript_flow_IsAvailable() dict
endfunction endfunction
function! SyntaxCheckers_javascript_flow_GetLocList() dict function! SyntaxCheckers_javascript_flow_GetLocList() dict
if syntastic#util#findFileInParent('.flowconfig', expand('%:p:h', 1)) ==# '' let buf = bufnr('')
if syntastic#util#findFileInParent('.flowconfig', fnamemodify(bufname(buf), ':p:h')) ==# ''
return [] return []
endif endif

View File

@ -19,6 +19,7 @@ let s:save_cpo = &cpo
set cpo&vim set cpo&vim
function! SyntaxCheckers_limbo_limbo_GetLocList() dict function! SyntaxCheckers_limbo_limbo_GetLocList() dict
let buf = bufnr('')
let include = $INFERNO_HOME !=# '' ? '-I$INFERNO_HOME ' : '' let include = $INFERNO_HOME !=# '' ? '-I$INFERNO_HOME ' : ''
" don't generate .dis in current dir while checking syntax, " don't generate .dis in current dir while checking syntax,
" .dis should be generated by `mk` " .dis should be generated by `mk`
@ -27,7 +28,7 @@ function! SyntaxCheckers_limbo_limbo_GetLocList() dict
let makeprg = self.makeprgBuild({ 'args_before': include . '-w' . output }) let makeprg = self.makeprgBuild({ 'args_before': include . '-w' . output })
let errorformat = '%E%f:%l:%m' let errorformat = '%E%f:%l:%m'
if expand('%', 1) =~# '\m\.m$' if bufname(buf) =~# '\m\.m$'
let errorformat = '%-G%f:%l: near ` EOF ` : no implementation module,' . errorformat let errorformat = '%-G%f:%l: near ` EOF ` : no implementation module,' . errorformat
endif endif

View File

@ -19,9 +19,10 @@ let s:save_cpo = &cpo
set cpo&vim set cpo&vim
function! SyntaxCheckers_nasm_nasm_GetLocList() dict function! SyntaxCheckers_nasm_nasm_GetLocList() dict
let buf = bufnr('')
let makeprg = self.makeprgBuild({ let makeprg = self.makeprgBuild({
\ 'args_after': '-X gnu' . \ 'args_after': '-X gnu' .
\ ' -I ' . syntastic#util#shescape(expand('%:p:h', 1) . syntastic#util#Slash()) . \ ' -I ' . syntastic#util#shescape(fnamemodify(bufname(buf), ':p:h') . syntastic#util#Slash()) .
\ ' ' . syntastic#c#NullOutput() }) \ ' ' . syntastic#c#NullOutput() })
let errorformat = '%f:%l: %t%*[^:]: %m' let errorformat = '%f:%l: %t%*[^:]: %m'

View File

@ -44,7 +44,8 @@ function! SyntaxCheckers_ocaml_camlp4o_IsAvailable() dict " {{{1
endfunction " }}}1 endfunction " }}}1
function! SyntaxCheckers_ocaml_camlp4o_GetLocList() dict " {{{1 function! SyntaxCheckers_ocaml_camlp4o_GetLocList() dict " {{{1
let makeprg = s:GetMakeprg() let buf = bufnr('')
let makeprg = s:GetMakeprg(buf)
if makeprg ==# '' if makeprg ==# ''
return [] return []
endif endif
@ -65,7 +66,7 @@ function! SyntaxCheckers_ocaml_camlp4o_GetLocList() dict " {{{1
let loclist = SyntasticMake({ let loclist = SyntasticMake({
\ 'makeprg': makeprg, \ 'makeprg': makeprg,
\ 'errorformat': errorformat, \ 'errorformat': errorformat,
\ 'defaults': {'bufnr': bufnr('')} }) \ 'defaults': {'bufnr': buf} })
for e in loclist for e in loclist
if get(e, 'col', 0) && get(e, 'nr', 0) if get(e, 'col', 0) && get(e, 'nr', 0)
@ -79,40 +80,41 @@ endfunction " }}}1
" Utilities {{{1 " Utilities {{{1
function! s:GetMakeprg() " {{{2 function! s:GetMakeprg(buf) " {{{2
return return
\ g:syntastic_ocaml_use_ocamlc ? g:syntastic_ocaml_use_ocamlc : \ g:syntastic_ocaml_use_ocamlc ? g:syntastic_ocaml_use_ocamlc :
\ (g:syntastic_ocaml_use_ocamlbuild && isdirectory('_build')) ? s:GetOcamlcMakeprg() : \ (g:syntastic_ocaml_use_ocamlbuild && isdirectory('_build')) ? s:GetOcamlcMakeprg(a:buf) :
\ s:GetOtherMakeprg() \ s:GetOtherMakeprg(a:buf)
endfunction " }}}2 endfunction " }}}2
function! s:GetOcamlcMakeprg() " {{{2 function! s:GetOcamlcMakeprg(buf) " {{{2
let build_cmd = g:syntastic_ocaml_use_janestreet_core ? let build_cmd = g:syntastic_ocaml_use_janestreet_core ?
\ 'ocamlc -I ' . syntastic#util#shexpand(g:syntastic_ocaml_janestreet_core_dir) : 'ocamlc' \ 'ocamlc -I ' . syntastic#util#shexpand(g:syntastic_ocaml_janestreet_core_dir) : 'ocamlc'
let build_cmd .= ' -c ' . syntastic#util#shexpand('%') let build_cmd .= ' -c ' . syntastic#util#shescape(bufname(a:buf))
return build_cmd return build_cmd
endfunction " }}}2 endfunction " }}}2
function! s:GetOcamlBuildMakeprg() " {{{2 function! s:GetOcamlBuildMakeprg(buf) " {{{2
return 'ocamlbuild -quiet -no-log -tag annot,' . s:ocamlpp . ' -no-links -no-hygiene -no-sanitize ' . return 'ocamlbuild -quiet -no-log -tag annot,' . s:ocamlpp . ' -no-links -no-hygiene -no-sanitize ' .
\ syntastic#util#shexpand('%:r') . '.cmi' \ syntastic#util#shexpand(fnamemodify(bufname(a:buf), ':r')) . '.cmi'
endfunction " }}}2 endfunction " }}}2
function! s:GetOtherMakeprg() " {{{2 function! s:GetOtherMakeprg(buf) " {{{2
"TODO: give this function a better name? "TODO: give this function a better name?
" "
"TODO: should use throw/catch instead of returning an empty makeprg "TODO: should use throw/catch instead of returning an empty makeprg
let extension = expand('%:e', 1) let fname = bufname(a:buf)
let extension = fnamemodify(fname, ':e')
let makeprg = '' let makeprg = ''
if stridx(extension, 'mly') >= 0 && executable('menhir') if stridx(extension, 'mly') >= 0 && executable('menhir')
" ocamlyacc output can't be redirected, so use menhir " ocamlyacc output can't be redirected, so use menhir
let makeprg = 'menhir --only-preprocess ' . syntastic#util#shexpand('%') . ' >' . syntastic#util#DevNull() let makeprg = 'menhir --only-preprocess ' . syntastic#util#shescape(fname) . ' >' . syntastic#util#DevNull()
elseif stridx(extension,'mll') >= 0 && executable('ocamllex') elseif stridx(extension,'mll') >= 0 && executable('ocamllex')
let makeprg = 'ocamllex -q ' . syntastic#c#NullOutput() . ' ' . syntastic#util#shexpand('%') let makeprg = 'ocamllex -q ' . syntastic#c#NullOutput() . ' ' . syntastic#util#shescape(fname)
else else
let makeprg = 'camlp4o ' . syntastic#c#NullOutput() . ' ' . syntastic#util#shexpand('%') let makeprg = 'camlp4o ' . syntastic#c#NullOutput() . ' ' . syntastic#util#shescape(fname)
endif endif
return makeprg return makeprg

View File

@ -51,13 +51,14 @@ function! SyntaxCheckers_perl_perl_IsAvailable() dict " {{{1
endfunction " }}}1 endfunction " }}}1
function! SyntaxCheckers_perl_perl_GetLocList() dict " {{{1 function! SyntaxCheckers_perl_perl_GetLocList() dict " {{{1
let buf = bufnr('')
if type(g:syntastic_perl_lib_path) == type('') if type(g:syntastic_perl_lib_path) == type('')
call syntastic#log#oneTimeWarn('variable g:syntastic_perl_lib_path should be a list') call syntastic#log#oneTimeWarn('variable g:syntastic_perl_lib_path should be a list')
let includes = split(g:syntastic_perl_lib_path, ',') let includes = split(g:syntastic_perl_lib_path, ',')
else else
let includes = copy(syntastic#util#var('perl_lib_path', [])) let includes = copy(syntastic#util#bufVar(buf, 'perl_lib_path', []))
endif endif
let shebang = syntastic#util#parseShebang() let shebang = syntastic#util#parseShebang(buf)
let extra = map(includes, '"-I" . v:val') + let extra = map(includes, '"-I" . v:val') +
\ (index(shebang['args'], '-T') >= 0 ? ['-T'] : []) + \ (index(shebang['args'], '-T') >= 0 ? ['-T'] : []) +
\ (index(shebang['args'], '-t') >= 0 ? ['-t'] : []) \ (index(shebang['args'], '-t') >= 0 ? ['-t'] : [])

View File

@ -43,11 +43,13 @@ function! SyntaxCheckers_r_lint_IsAvailable() dict
endfunction endfunction
function! SyntaxCheckers_r_lint_GetLocList() dict function! SyntaxCheckers_r_lint_GetLocList() dict
let buf = bufnr('')
let setwd = syntastic#util#isRunningWindows() ? 'setwd("' . escape(getcwd(), '"\') . '"); ' : '' let setwd = syntastic#util#isRunningWindows() ? 'setwd("' . escape(getcwd(), '"\') . '"); ' : ''
let makeprg = self.getExecEscaped() . ' --slave --restore --no-save' . let makeprg = self.getExecEscaped() . ' --slave --restore --no-save' .
\ ' -e ' . syntastic#util#shescape(setwd . 'library(lint); ' . \ ' -e ' . syntastic#util#shescape(setwd . 'library(lint); ' .
\ 'try(lint(commandArgs(TRUE), ' . g:syntastic_r_lint_styles . '))') . \ 'try(lint(commandArgs(TRUE), ' . g:syntastic_r_lint_styles . '))') .
\ ' --args ' . syntastic#util#shexpand('%') \ ' --args ' . syntastic#util#shescape(bufname(buf))
let errorformat = let errorformat =
\ '%t:%f:%l:%v: %m,' . \ '%t:%f:%l:%v: %m,' .

View File

@ -38,7 +38,7 @@ set cpo&vim
function! SyntaxCheckers_r_lintr_GetHighlightRegex(item) function! SyntaxCheckers_r_lintr_GetHighlightRegex(item)
let term = matchstr(a:item['text'], "\\m'\\zs[^']\\+\\ze'") let term = matchstr(a:item['text'], "\\m'\\zs[^']\\+\\ze'")
return term != '' ? '\V' . escape(term, '\') : '' return term !=# '' ? '\V' . escape(term, '\') : ''
endfunction endfunction
function! SyntaxCheckers_r_lintr_IsAvailable() dict function! SyntaxCheckers_r_lintr_IsAvailable() dict
@ -50,11 +50,13 @@ function! SyntaxCheckers_r_lintr_IsAvailable() dict
endfunction endfunction
function! SyntaxCheckers_r_lintr_GetLocList() dict function! SyntaxCheckers_r_lintr_GetLocList() dict
let buf = bufnr('')
let setwd = syntastic#util#isRunningWindows() ? 'setwd("' . escape(getcwd(), '"\') . '"); ' : '' let setwd = syntastic#util#isRunningWindows() ? 'setwd("' . escape(getcwd(), '"\') . '"); ' : ''
let makeprg = self.getExecEscaped() . ' --slave --no-restore --no-save' . let makeprg = self.getExecEscaped() . ' --slave --no-restore --no-save' .
\ ' -e ' . syntastic#util#shescape(setwd . 'suppressPackageStartupMessages(library(lintr)); ' . \ ' -e ' . syntastic#util#shescape(setwd . 'suppressPackageStartupMessages(library(lintr)); ' .
\ 'lint(cache = ' . g:syntastic_r_lintr_cache . ', commandArgs(TRUE), ' . g:syntastic_r_lintr_linters . ')') . \ 'lint(cache = ' . g:syntastic_r_lintr_cache . ', commandArgs(TRUE), ' . g:syntastic_r_lintr_linters . ')') .
\ ' --args ' . syntastic#util#shexpand('%') \ ' --args ' . syntastic#util#shescape(bufname(buf))
let errorformat = let errorformat =
\ '%W%f:%l:%c: style: %m,' . \ '%W%f:%l:%c: style: %m,' .

View File

@ -46,11 +46,13 @@ function! SyntaxCheckers_r_svtools_IsAvailable() dict
endfunction endfunction
function! SyntaxCheckers_r_svtools_GetLocList() dict function! SyntaxCheckers_r_svtools_GetLocList() dict
let buf = bufnr('')
let setwd = syntastic#util#isRunningWindows() ? 'setwd("' . escape(getcwd(), '"\') . '"); ' : '' let setwd = syntastic#util#isRunningWindows() ? 'setwd("' . escape(getcwd(), '"\') . '"); ' : ''
let makeprg = self.getExecEscaped() . ' --slave --restore --no-save' . let makeprg = self.getExecEscaped() . ' --slave --restore --no-save' .
\ ' -e ' . syntastic#util#shescape(setwd . 'library(svTools); ' . \ ' -e ' . syntastic#util#shescape(setwd . 'library(svTools); ' .
\ 'try(lint(commandArgs(TRUE), filename = commandArgs(TRUE), type = "flat", sep = ":"))') . \ 'try(lint(commandArgs(TRUE), filename = commandArgs(TRUE), type = "flat", sep = ":"))') .
\ ' --args ' . syntastic#util#shexpand('%') \ ' --args ' . syntastic#util#shescape(bufname(buf))
let errorformat = let errorformat =
\ '%trror:%f:%\s%#%l:%\s%#%v:%m,' . \ '%trror:%f:%\s%#%l:%\s%#%v:%m,' .

View File

@ -26,11 +26,12 @@ augroup syntastic
augroup END augroup END
function! SyntaxCheckers_rst_sphinx_GetLocList() dict function! SyntaxCheckers_rst_sphinx_GetLocList() dict
let buf = bufnr('')
let srcdir = syntastic#util#var('rst_sphinx_source_dir') let srcdir = syntastic#util#bufVar(buf, 'rst_sphinx_source_dir')
call self.log('g:syntastic_rst_sphinx_source_dir =', srcdir) call self.log('syntastic_rst_sphinx_source_dir =', srcdir)
if srcdir ==# '' if srcdir ==# ''
let config = syntastic#util#findFileInParent('conf.py', expand('%:p:h', 1)) let config = syntastic#util#findFileInParent('conf.py', fnamemodify(bufname(buf), ':p:h'))
if config ==# '' || !filereadable(config) if config ==# '' || !filereadable(config)
call self.log('conf.py file not found') call self.log('conf.py file not found')
return [] return []
@ -38,10 +39,10 @@ function! SyntaxCheckers_rst_sphinx_GetLocList() dict
let srcdir = fnamemodify(config, ':p:h') let srcdir = fnamemodify(config, ':p:h')
endif endif
let confdir = syntastic#util#var('rst_sphinx_config_dir') let confdir = syntastic#util#bufVar(buf, 'rst_sphinx_config_dir')
call self.log('g:syntastic_rst_sphinx_config_dir =', confdir) call self.log('syntastic_rst_sphinx_config_dir =', confdir)
if confdir ==# '' if confdir ==# ''
let config = syntastic#util#findFileInParent('conf.py', expand('%:p:h', 1)) let config = syntastic#util#findFileInParent('conf.py', fnamemodify(bufname(buf), ':p:h'))
let confdir = (config !=# '' && filereadable(config)) ? fnamemodify(config, ':p:h') : srcdir let confdir = (config !=# '' && filereadable(config)) ? fnamemodify(config, ':p:h') : srcdir
endif endif

View File

@ -15,8 +15,8 @@ if exists('g:loaded_syntastic_sass_sass_checker')
endif endif
let g:loaded_syntastic_sass_sass_checker = 1 let g:loaded_syntastic_sass_sass_checker = 1
"sass caching for large files drastically speeds up the checking, but store it " sass caching for large files drastically speeds up the checking, but store it
"in a temp location otherwise sass puts .sass_cache dirs in the users project " in a temp location otherwise sass puts .sass_cache dirs in the users project
let s:sass_cache_location = syntastic#util#tmpdir() let s:sass_cache_location = syntastic#util#tmpdir()
lockvar s:sass_cache_location lockvar s:sass_cache_location
@ -24,12 +24,12 @@ augroup syntastic
autocmd VimLeave * call syntastic#util#rmrf(s:sass_cache_location) autocmd VimLeave * call syntastic#util#rmrf(s:sass_cache_location)
augroup END augroup END
"By default do not check partials as unknown variables are a syntax error " By default do not check partials as unknown variables are a syntax error
if !exists('g:syntastic_sass_check_partials') if !exists('g:syntastic_sass_check_partials')
let g:syntastic_sass_check_partials = 0 let g:syntastic_sass_check_partials = 0
endif endif
"use compass imports if available " use compass imports if available
let s:imports = '' let s:imports = ''
if executable('compass') if executable('compass')
let s:imports = '--compass' let s:imports = '--compass'
@ -39,7 +39,8 @@ let s:save_cpo = &cpo
set cpo&vim set cpo&vim
function! SyntaxCheckers_sass_sass_GetLocList() dict function! SyntaxCheckers_sass_sass_GetLocList() dict
if !g:syntastic_sass_check_partials && expand('%:t', 1)[0] ==# '_' let buf = bufnr('')
if !syntastic#util#bufVar(buf, 'sass_check_partials') && fnamemodify(bufname(buf), ':t')[0] ==# '_'
return [] return []
endif endif

View File

@ -24,9 +24,10 @@ function! SyntaxCheckers_scala_fsc_GetLocList() dict
" fsc has some serious problems with the " fsc has some serious problems with the
" working directory changing after being started " working directory changing after being started
" that's why we better pass an absolute path " that's why we better pass an absolute path
let buf = bufnr('')
let makeprg = self.makeprgBuild({ let makeprg = self.makeprgBuild({
\ 'args': '-Ystop-after:parser', \ 'args': '-Ystop-after:parser',
\ 'fname': syntastic#util#shexpand('%:p') }) \ 'fname': syntastic#util#shescape(fnamemodify(bufname(buf), ':p')) })
let errorformat = let errorformat =
\ '%E%f:%l: %trror: %m,' . \ '%E%f:%l: %trror: %m,' .

View File

@ -19,21 +19,23 @@ let s:save_cpo = &cpo
set cpo&vim set cpo&vim
function! SyntaxCheckers_sh_sh_IsAvailable() dict " {{{1 function! SyntaxCheckers_sh_sh_IsAvailable() dict " {{{1
call self.log('shell =', s:GetShell()) let buf = bufnr('')
return s:IsShellValid() call self.log('shell =', s:GetShell(buf))
return s:IsShellValid(buf)
endfunction " }}}1 endfunction " }}}1
function! SyntaxCheckers_sh_sh_GetLocList() dict " {{{1 function! SyntaxCheckers_sh_sh_GetLocList() dict " {{{1
if s:GetShell() ==# 'zsh' let buf = bufnr('')
if s:GetShell(buf) ==# 'zsh'
return s:ForwardToZshChecker() return s:ForwardToZshChecker()
endif endif
if !s:IsShellValid() if !s:IsShellValid(buf)
return [] return []
endif endif
let makeprg = self.makeprgBuild({ let makeprg = self.makeprgBuild({
\ 'exe': s:GetShell(), \ 'exe': s:GetShell(buf),
\ 'args_after': '-n' }) \ 'args_after': '-n' })
let errorformat = '%f: line %l: %m' let errorformat = '%f: line %l: %m'
@ -45,29 +47,29 @@ endfunction " }}}1
" Utilities {{{1 " Utilities {{{1
function! s:GetShell() " {{{2 function! s:GetShell(buf) " {{{2
if !exists('b:shell') || b:shell ==# '' let shell = syntastic#util#getbufvar(a:buf, 'shell')
let b:shell = '' if shell ==# ''
let shebang = syntastic#util#parseShebang()['exe'] let shebang = syntastic#util#parseShebang(a:buf)['exe']
if shebang !=# '' if shebang !=# ''
if shebang[-strlen('bash'):-1] ==# 'bash' if shebang[-strlen('bash'):-1] ==# 'bash'
let b:shell = 'bash' let shell = 'bash'
elseif shebang[-strlen('zsh'):-1] ==# 'zsh' elseif shebang[-strlen('zsh'):-1] ==# 'zsh'
let b:shell = 'zsh' let shell = 'zsh'
elseif shebang[-strlen('sh'):-1] ==# 'sh' elseif shebang[-strlen('sh'):-1] ==# 'sh'
let b:shell = 'sh' let shell = 'sh'
endif endif
endif endif
" try to use env variable in case no shebang could be found " try to use env variable in case no shebang could be found
if b:shell ==# '' if shell ==# ''
let b:shell = fnamemodify($SHELL, ':t') let shell = fnamemodify($SHELL, ':t')
endif endif
endif endif
return b:shell return shell
endfunction " }}}2 endfunction " }}}2
function! s:IsShellValid() " {{{2 function! s:IsShellValid(buf) " {{{2
let shell = s:GetShell() let shell = s:GetShell(a:buf)
return shell !=# '' && executable(shell) return shell !=# '' && executable(shell)
endfunction " }}}2 endfunction " }}}2

View File

@ -12,8 +12,9 @@ let s:save_cpo = &cpo
set cpo&vim set cpo&vim
function! SyntaxCheckers_sh_shellcheck_GetLocList() dict " {{{1 function! SyntaxCheckers_sh_shellcheck_GetLocList() dict " {{{1
let buf = bufnr('')
let makeprg = self.makeprgBuild({ let makeprg = self.makeprgBuild({
\ 'args': s:GetShell(), \ 'args': s:GetShell(buf),
\ 'args_after': '-f gcc' }) \ 'args_after': '-f gcc' })
let errorformat = let errorformat =
@ -38,15 +39,15 @@ endfunction " }}}1
" Utilities {{{1 " Utilities {{{1
function! s:GetShell() " {{{2 function! s:GetShell(buf) " {{{2
let sh = '' let sh = ''
if syntastic#util#parseShebang()['exe'] ==# '' if syntastic#util#parseShebang(a:buf)['exe'] ==# ''
if syntastic#util#rawVar('is_kornshell', 0) || syntastic#util#rawVar('is_posix', 0) if syntastic#util#bufRawVar(a:buf, 'is_kornshell', 0) || syntastic#util#bufRawVar(a:buf, 'is_posix', 0)
let sh = 'ksh' let sh = 'ksh'
elseif syntastic#util#rawVar('is_bash', 0) elseif syntastic#util#bufRawVar(a:buf, 'is_bash', 0)
let sh = 'bash' let sh = 'bash'
elseif syntastic#util#rawVar('is_sh', 0) elseif syntastic#util#bufRawVar(a:buf, 'is_sh', 0)
let sh = 'sh' let sh = 'sh'
endif endif
endif endif

View File

@ -44,19 +44,17 @@ endfunction " }}}1
" Utilities {{{1 " Utilities {{{1
function! s:GetValaOpts(buf, name, comment, cmd) " {{{2 function! s:GetValaOpts(buf, name, comment, cmd) " {{{2
let var = syntastic#util#var('vala_' . a:name) let var = syntastic#util#bufVar(a:buf, 'vala_' . a:name)
if type(var) == type([]) if type(var) == type([])
let opts = map(copy(var), 'syntastic#util#shescape(v:val)') let opts = map(copy(var), 'syntastic#util#shescape(v:val)')
elseif type(var) == type('') elseif type(var) == type('')
if var !=# '' if var !=# ''
let opts = split(var, '\s\+') let opts = split(var, '\m\s\+')
else else
let opts = [] let opts = []
for line in filter(getbufline(a:buf, 1, 100), 'v:val =~# ' . string('\m^//\s\+' . a:comment . ':\s*')) for line in filter(getbufline(a:buf, 1, 100), 'v:val =~# ' . string('\m^//\s\+' . a:comment . ':\s*'))
call extend(opts, split( matchstr(line, '\m^//\s\+' . a:comment . ':\s*\zs.*'), '\s\+' )) call extend(opts, split( matchstr(line, '\m^//\s\+' . a:comment . ':\s*\zs.*'), '\m\s\+' ))
endfor endfor
call map( filter(opts, 'v:val !=# ""'), 'syntastic#util#shescape(v:val)' )
endif endif
else else
call syntastic#log#error('syntastic_vala_' . a:name . ' must be either a list, or a string') call syntastic#log#error('syntastic_vala_' . a:name . ' must be either a list, or a string')

View File

@ -44,6 +44,8 @@ function! SyntaxCheckers_vim_vimlint_IsAvailable() dict " {{{1
endfunction " }}}1 endfunction " }}}1
function! SyntaxCheckers_vim_vimlint_GetLocList() dict " {{{1 function! SyntaxCheckers_vim_vimlint_GetLocList() dict " {{{1
let buf = bufnr('')
" EVL102: unused variable v " EVL102: unused variable v
" EVL103: unused argument v " EVL103: unused argument v
" EVL104: variable may not be initialized on some execution path: v " EVL104: variable may not be initialized on some execution path: v
@ -67,17 +69,15 @@ function! SyntaxCheckers_vim_vimlint_GetLocList() dict " {{{1
\ 'EVL204': 3, \ 'EVL204': 3,
\ 'EVL205': 3 } \ 'EVL205': 3 }
if exists('g:syntastic_vimlint_options') || exists('b:syntastic_vimlint_options') let opts = syntastic#util#bufVar(buf, 'vimlint_options')
let opts = syntastic#util#var('vimlint_options') if type(opts) == type({})
if type(opts) == type({}) let options = filter(copy(opts), 'v:key =~# "\\m^EVL"')
let options = filter(copy(opts), 'v:key =~# "\\m^EVL"') call extend(param, options, 'force')
call extend(param, options, 'force')
endif
endif endif
call self.log('options =', param) call self.log('options =', param)
return vimlint#vimlint(expand('%', 1), param) return vimlint#vimlint(bufname(buf), param)
endfunction " }}}1 endfunction " }}}1
" Utilities {{{1 " Utilities {{{1

View File

@ -18,10 +18,11 @@ let s:save_cpo = &cpo
set cpo&vim set cpo&vim
function! SyntaxCheckers_xquery_basex_GetLocList() dict function! SyntaxCheckers_xquery_basex_GetLocList() dict
let buf = bufnr('')
let makeprg = self.makeprgBuild({ let makeprg = self.makeprgBuild({
\ 'args_after': '-z', \ 'args_after': '-z',
\ 'fname_before': '-q', \ 'fname_before': '-q',
\ 'fname': syntastic#util#shescape('inspect:module("' . escape(expand('%:p', 1), '"') . '")') }) \ 'fname': syntastic#util#shescape('inspect:module("' . escape(fnamemodify(bufname(buf), ':p'), '"') . '")') })
let errorformat = let errorformat =
\ '%f:%l:%c:%t:%n:%m,' . \ '%f:%l:%c:%t:%n:%m,' .

View File

@ -29,13 +29,14 @@ function! SyntaxCheckers_yaml_yamlxs_IsAvailable() dict
" don't call executable() here, to allow things like " don't call executable() here, to allow things like
" let g:syntastic_perl_interpreter='/usr/bin/env perl' " let g:syntastic_perl_interpreter='/usr/bin/env perl'
silent! call syntastic#util#system(self.getExecEscaped() . ' ' . s:Modules() . ' -e ' . syntastic#util#shescape('exit(0)')) silent! call syntastic#util#system(self.getExecEscaped() . ' ' . s:Modules(bufnr('')) . ' -e ' . syntastic#util#shescape('exit(0)'))
return v:shell_error == 0 return v:shell_error == 0
endfunction endfunction
function! SyntaxCheckers_yaml_yamlxs_GetLocList() dict function! SyntaxCheckers_yaml_yamlxs_GetLocList() dict
let buf = bufnr('')
let makeprg = self.makeprgBuild({ let makeprg = self.makeprgBuild({
\ 'args_before': s:Modules() . ' -e ' . syntastic#util#shescape('YAML::XS::LoadFile($ARGV[0])') }) \ 'args_before': s:Modules(buf) . ' -e ' . syntastic#util#shescape('YAML::XS::LoadFile($ARGV[0])') })
let errorformat = let errorformat =
\ '%EYAML::XS::Load Error: The problem:,' . \ '%EYAML::XS::Load Error: The problem:,' .
@ -51,12 +52,13 @@ function! SyntaxCheckers_yaml_yamlxs_GetLocList() dict
\ 'defaults': {'bufnr': bufnr('')} }) \ 'defaults': {'bufnr': bufnr('')} })
endfunction endfunction
function s:Modules() function s:Modules(buf)
if type(g:syntastic_perl_lib_path) == type('') let lib_path = syntastic#util#bufVar(a:buf, 'perl_lib_path')
call syntastic#log#oneTimeWarn('variable g:syntastic_perl_lib_path should be a list') if type(lib_path) == type('')
let includes = split(g:syntastic_perl_lib_path, ',') call syntastic#log#oneTimeWarn('variable syntastic_perl_lib_path should be a list')
let includes = split(lib_path, ',')
else else
let includes = copy(syntastic#util#var('perl_lib_path')) let includes = copy(lib_path)
endif endif
return join(map(includes, '"-I" . v:val') + ['-MYAML::XS']) return join(map(includes, '"-I" . v:val') + ['-MYAML::XS'])
endfunction endfunction

View File

@ -1,3 +1,14 @@
All files except:
ftdetect/vim-literate-coffeescript.vim
indent/litcoffee.vim
syntax/litcoffee.vim
test/test.coffee.md
test/test.litcoffee
test/test.png
Issued under WTFPL:
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
Version 2, December 2004 Version 2, December 2004
@ -13,3 +24,31 @@
0. You just DO WHAT THE FUCK YOU WANT TO. 0. You just DO WHAT THE FUCK YOU WANT TO.
These files issed under this license:
ftdetect/vim-literate-coffeescript.vim
indent/litcoffee.vim
syntax/litcoffee.vim
test/test.coffee.md
test/test.litcoffee
test/test.png
Copyright (c) 2013 Michael Smith
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -337,23 +337,15 @@ It behaves very similar to `:make`, described [above](#compile-to-javascript).
## Literate CoffeeScript ## Literate CoffeeScript
Literate CoffeeScript syntax and indent support is provided by Literate CoffeeScript syntax and indent support is now built in! The `Coffee`
[vim-literate-coffeescript]. The `Coffee` commands detect when they're running commands detect when they're running on a litcoffee file and pass the
on a litcoffee file and pass the `--literate` flag to their respective tools, `--literate` flag to their respective tools.
but at this time the commands are not automatically loaded when a litcoffee file
is opened.
[vim-literate-coffeescript]: https://github.com/mintplant/vim-literate-coffeescript Literate CoffeeScript syntax and indent support was written by @mintplant
(Michael Smith). A standalone repo
To load them, run [exists](https://github.com/jwhitley/vim-literate-coffeescript), but you'll
need to copy the `ftplugin/litcoffee.vim` file or set up an autocmd to get the
runtime ftplugin/coffee.vim `Coffee` commands to be automatically loaded for litcoffee files.
while inside a litcoffee buffer. To do this automatically, add
autocmd FileType litcoffee runtime ftplugin/coffee.vim
to your vimrc.
## CoffeeScript in HTML ## CoffeeScript in HTML

View File

@ -0,0 +1,8 @@
" Language: Literate CoffeeScript
" Maintainer: Michael Smith <michael@diglumi.com>
" URL: https://github.com/mintplant/vim-literate-coffeescript
" License: MIT
autocmd BufNewFile,BufRead *.litcoffee set filetype=litcoffee
autocmd BufNewFile,BufRead *.coffee.md set filetype=litcoffee

View File

@ -0,0 +1 @@
runtime ftplugin/coffee.vim

View File

@ -0,0 +1,22 @@
if exists('b:did_indent')
finish
endif
runtime! indent/coffee.vim
let b:did_indent = 1
setlocal indentexpr=GetLitCoffeeIndent()
if exists('*GetLitCoffeeIndent')
finish
endif
function GetLitCoffeeIndent()
if searchpair('^ \|\t', '', '$', 'bWnm') > 0
return GetCoffeeIndent(v:lnum)
else
return -1
endif
endfunc

View File

@ -32,7 +32,7 @@ hi def link coffeeConditional Conditional
syn match coffeeException /\<\%(try\|catch\|finally\)\>/ display syn match coffeeException /\<\%(try\|catch\|finally\)\>/ display
hi def link coffeeException Exception hi def link coffeeException Exception
syn match coffeeKeyword /\<\%(new\|in\|of\|by\|and\|or\|not\|is\|isnt\|class\|extends\|super\|do\|yield\|debugger\|import\|export\)\>/ syn match coffeeKeyword /\<\%(new\|in\|of\|by\|and\|or\|not\|is\|isnt\|class\|extends\|super\|do\|yield\|debugger\|import\|export\|await\)\>/
\ display \ display
" The `own` keyword is only a keyword after `for`. " The `own` keyword is only a keyword after `for`.
syn match coffeeKeyword /\<for\s\+own\>/ contained containedin=coffeeRepeat syn match coffeeKeyword /\<for\s\+own\>/ contained containedin=coffeeRepeat

View File

@ -0,0 +1,23 @@
" Language: Literate CoffeeScript
" Maintainer: Michael Smith <michael@diglumi.com>
" URL: https://github.com/mintplant/vim-literate-coffeescript
" License: MIT
if exists('b:current_syntax') && b:current_syntax == 'litcoffee'
finish
endif
syn include @markdown syntax/markdown.vim
syn include @coffee syntax/coffee.vim
" Partition the file into notCoffee and inlineCoffee. Each line will match
" exactly one of these regions. notCoffee matches with a zero-width
" look-behind.
syn region notCoffee start='^\%( \|\t\)\@<!' end='$' contains=@markdown
syn region inlineCoffee start='^ \|\t' end='$' contains=@coffee
" We defined notCoffee as a region so we can highlight every element in it
" that doesn't have it's own explicit rule.
highlight default link notCoffee Comment
let b:current_syntax = "litcoffee"

View File

@ -0,0 +1,117 @@
The **Scope** class regulates lexical scoping within CoffeeScript. As you
generate code, you create a tree of scopes in the same shape as the nested
function bodies. Each scope knows about the variables declared within it,
and has a reference to its parent enclosing scope. In this way, we know which
variables are new and need to be declared with `var`, and which are shared
with external scopes.
Import the helpers we plan to use.
{extend, last} = require './helpers'
exports.Scope = class Scope
The `root` is the top-level **Scope** object for a given file.
@root: null
Initialize a scope with its parent, for lookups up the chain,
as well as a reference to the **Block** node it belongs to, which is
where it should declare its variables, and a reference to the function that
it belongs to.
constructor: (@parent, @expressions, @method) ->
@variables = [{name: 'arguments', type: 'arguments'}]
@positions = {}
Scope.root = this unless @parent
Adds a new variable or overrides an existing one.
add: (name, type, immediate) ->
return @parent.add name, type, immediate if @shared and not immediate
if Object::hasOwnProperty.call @positions, name
@variables[@positions[name]].type = type
else
@positions[name] = @variables.push({name, type}) - 1
When `super` is called, we need to find the name of the current method we're
in, so that we know how to invoke the same method of the parent class. This
can get complicated if super is being called from an inner function.
`namedMethod` will walk up the scope tree until it either finds the first
function object that has a name filled in, or bottoms out.
namedMethod: ->
return @method if @method.name or !@parent
@parent.namedMethod()
Look up a variable name in lexical scope, and declare it if it does not
already exist.
find: (name) ->
return yes if @check name
@add name, 'var'
no
Reserve a variable name as originating from a function parameter for this
scope. No `var` required for internal references.
parameter: (name) ->
return if @shared and @parent.check name, yes
@add name, 'param'
Just check to see if a variable has already been declared, without reserving,
walks up to the root scope.
check: (name) ->
!!(@type(name) or @parent?.check(name))
Generate a temporary variable name at the given index.
temporary: (name, index) ->
if name.length > 1
'_' + name + if index > 1 then index - 1 else ''
else
'_' + (index + parseInt name, 36).toString(36).replace /\d/g, 'a'
Gets the type of a variable.
type: (name) ->
return v.type for v in @variables when v.name is name
null
If we need to store an intermediate result, find an available name for a
compiler-generated variable. `_var`, `_var2`, and so on...
freeVariable: (name, reserve=true) ->
index = 0
index++ while @check((temp = @temporary name, index))
@add temp, 'var', yes if reserve
temp
Ensure that an assignment is made at the top of this scope
(or at the top-level scope, if requested).
assign: (name, value) ->
@add name, {value, assigned: yes}, yes
@hasAssignments = yes
Does this scope have any declared variables?
hasDeclarations: ->
!!@declaredVariables().length
Return the list of variables first declared in this scope.
declaredVariables: ->
realVars = []
tempVars = []
for v in @variables when v.type is 'var'
(if v.name.charAt(0) is '_' then tempVars else realVars).push v.name
realVars.sort().concat tempVars.sort()
Return the list of assignments that are supposed to be made at the top
of this scope.
assignedVariables: ->
"#{v.name} = #{v.type.value}" for v in @variables when v.type.assigned

View File

@ -0,0 +1,117 @@
The **Scope** class regulates lexical scoping within CoffeeScript. As you
generate code, you create a tree of scopes in the same shape as the nested
function bodies. Each scope knows about the variables declared within it,
and has a reference to its parent enclosing scope. In this way, we know which
variables are new and need to be declared with `var`, and which are shared
with external scopes.
Import the helpers we plan to use.
{extend, last} = require './helpers'
exports.Scope = class Scope
The `root` is the top-level **Scope** object for a given file.
@root: null
Initialize a scope with its parent, for lookups up the chain,
as well as a reference to the **Block** node it belongs to, which is
where it should declare its variables, and a reference to the function that
it belongs to.
constructor: (@parent, @expressions, @method) ->
@variables = [{name: 'arguments', type: 'arguments'}]
@positions = {}
Scope.root = this unless @parent
Adds a new variable or overrides an existing one.
add: (name, type, immediate) ->
return @parent.add name, type, immediate if @shared and not immediate
if Object::hasOwnProperty.call @positions, name
@variables[@positions[name]].type = type
else
@positions[name] = @variables.push({name, type}) - 1
When `super` is called, we need to find the name of the current method we're
in, so that we know how to invoke the same method of the parent class. This
can get complicated if super is being called from an inner function.
`namedMethod` will walk up the scope tree until it either finds the first
function object that has a name filled in, or bottoms out.
namedMethod: ->
return @method if @method.name or !@parent
@parent.namedMethod()
Look up a variable name in lexical scope, and declare it if it does not
already exist.
find: (name) ->
return yes if @check name
@add name, 'var'
no
Reserve a variable name as originating from a function parameter for this
scope. No `var` required for internal references.
parameter: (name) ->
return if @shared and @parent.check name, yes
@add name, 'param'
Just check to see if a variable has already been declared, without reserving,
walks up to the root scope.
check: (name) ->
!!(@type(name) or @parent?.check(name))
Generate a temporary variable name at the given index.
temporary: (name, index) ->
if name.length > 1
'_' + name + if index > 1 then index - 1 else ''
else
'_' + (index + parseInt name, 36).toString(36).replace /\d/g, 'a'
Gets the type of a variable.
type: (name) ->
return v.type for v in @variables when v.name is name
null
If we need to store an intermediate result, find an available name for a
compiler-generated variable. `_var`, `_var2`, and so on...
freeVariable: (name, reserve=true) ->
index = 0
index++ while @check((temp = @temporary name, index))
@add temp, 'var', yes if reserve
temp
Ensure that an assignment is made at the top of this scope
(or at the top-level scope, if requested).
assign: (name, value) ->
@add name, {value, assigned: yes}, yes
@hasAssignments = yes
Does this scope have any declared variables?
hasDeclarations: ->
!!@declaredVariables().length
Return the list of variables first declared in this scope.
declaredVariables: ->
realVars = []
tempVars = []
for v in @variables when v.type is 'var'
(if v.name.charAt(0) is '_' then tempVars else realVars).push v.name
realVars.sort().concat tempVars.sort()
Return the list of assignments that are supposed to be made at the top
of this scope.
assignedVariables: ->
"#{v.name} = #{v.type.value}" for v in @variables when v.type.assigned

View File

@ -1060,13 +1060,14 @@ function! s:Commit(args, ...) abort
else else
noautocmd silent execute '!'.command.' > '.outfile.' 2> '.errorfile noautocmd silent execute '!'.command.' > '.outfile.' 2> '.errorfile
endif endif
let error = v:shell_error
finally finally
execute cd.'`=dir`' execute cd.'`=dir`'
endtry endtry
if !has('gui_running') if !has('gui_running')
redraw! redraw!
endif endif
if !v:shell_error if !error
if filereadable(outfile) if filereadable(outfile)
for line in readfile(outfile) for line in readfile(outfile)
echo line echo line

View File

@ -4,10 +4,10 @@ Write here what's happening and what you're expecting instead of...
### Steps to reproduce: ### Steps to reproduce:
Please create a reproducible case of your problem. If this step is Please create a reproducible case of your problem. If this step is
not provided, the issue will be **closed** not provided, the issue will be **closed**
Re produce it with a minimal `vimrc` with all plugins disabled and Re produce it with a minimal `vimrc` with all plugins disabled and
only `vim-go` enabled: only `vim-go` enabled:
1. 1.
@ -20,7 +20,6 @@ Add here your current configuration and additional information that might be
useful, such as: useful, such as:
* `vimrc` you used to reproduce * `vimrc` you used to reproduce
* vim version: * vim version:
* vim-go version: * vim-go version:
* go version: * go version:

View File

@ -19,4 +19,3 @@ install: |
cd - cd -
script: ./scripts/test.sh script: ./scripts/test.sh

View File

@ -2,6 +2,7 @@
FEATURES: FEATURES:
* New `:GoAddTags` and `:GoRemoveTags` command based on the tool [gomodifytags](https://github.com/fatih/gomodifytags). This fixes many old bugs that were due prior regexp based implementation. For the usage please read the docs and checkout the demo at: https://github.com/fatih/vim-go/pull/1204 [gh-1204]
* Add new `errl` snippet that expands to [gh-1185]: * Add new `errl` snippet that expands to [gh-1185]:
``` ```
@ -14,6 +15,10 @@ IMPROVEMENTS:
* Lowercase `<Leader>` in mappings examples for consisten documentation across the README [gh-1192] * Lowercase `<Leader>` in mappings examples for consisten documentation across the README [gh-1192]
* All of files should be written in utf-8 if the file will be passed to external command. [gh-1184] * All of files should be written in utf-8 if the file will be passed to external command. [gh-1184]
* `:GoAddTags` is now able to add options to existing tags with the syntax `:GoAddTags key,option`, i.e: `:GoAddTags json,omitempty` [gh-985]
* Document 'noshowmode' requirement for echo_go_info [gh-1197]
* Improve godoc view for vertical splits [gh-1195]
* Set GOPATH for both possible go guru execution paths (sync and async) [gh-1193]
BUG FIXES: BUG FIXES:
@ -22,6 +27,15 @@ BUG FIXES:
* Update statusline before and after `go#jobcontrol#Spawn` command is executed [gh-1176] * Update statusline before and after `go#jobcontrol#Spawn` command is executed [gh-1176]
* Correctly report the value of the 'g:go_guru_tags' variable [gh-1177] * Correctly report the value of the 'g:go_guru_tags' variable [gh-1177]
* Ensure no trailing `:` exist in GOPATH detection if initial GOPATH is not set [gh-1194] * Ensure no trailing `:` exist in GOPATH detection if initial GOPATH is not set [gh-1194]
* Fix `:GoAddTags` to allow modifying existing comments [gh-984]
* Fix `:GoAddTags` to work with nested structs [gh-990]
* Fix `:GoAddTags` adding tags twice for existing tags [gh-1064]
* Fix `:GoAddTags` not working for fiels of types `interface{}` [gh-1091]
* Fix `:GoAddTags` not working for fields with one line comments [gh-1181]
* Fix `:GoAddTags` not working if any field comment would contain `{}` [gh-1189]
* Respect go_fmt_options when running goimports [gh-1211]
* Set the filename in the location-list when there is an error with :GoFmt [gh-1199]
## 1.11 - (January 9, 2017) ## 1.11 - (January 9, 2017)
@ -80,7 +94,7 @@ FEATURES:
you have at least Vim 8.0.0087. Backwards compatible with Vim 7.4.x. you have at least Vim 8.0.0087. Backwards compatible with Vim 7.4.x.
If you see any problems, please open an issue. If you see any problems, please open an issue.
* We have now a [logo for vim-go](https://github.com/fatih/vim-go/blob/master/assets/vim-go.png)! Thanks to @egonelbre for his work on this. * We have now a [logo for vim-go](https://github.com/fatih/vim-go/blob/master/assets/vim-go.png)! Thanks to @egonelbre for his work on this.
* `:GoBuild`, `:GoTest`, `:GoTestCompile`, `:GoInstall` commands are now fully * `:GoBuild`, `:GoTest`, `:GoTestCompile`, `:GoInstall` commands are now fully
async. Async means it doesn't block your UI anymore. If the command finished async. Async means it doesn't block your UI anymore. If the command finished
it echoes the status. For a better experience use the statusline information it echoes the status. For a better experience use the statusline information
@ -95,7 +109,7 @@ FEATURES:
`:GoMetaLinterAutoSaveToggle` (temporary) or add `let `:GoMetaLinterAutoSaveToggle` (temporary) or add `let
g:go_metalinter_autosave = 1` (persistent) to your virmc). g:go_metalinter_autosave = 1` (persistent) to your virmc).
* All `guru` commands run asynchronously if Vim 8.0 is being used. Current * All `guru` commands run asynchronously if Vim 8.0 is being used. Current
Commands: Commands:
* GoImplements * GoImplements
* GoWhicherrs * GoWhicherrs
@ -111,7 +125,7 @@ FEATURES:
auto sameids mode. In this mode it constantly evaluates the identifier under the auto sameids mode. In this mode it constantly evaluates the identifier under the
cursor whenever it's in hold position and then calls :GoSameIds. As a cursor whenever it's in hold position and then calls :GoSameIds. As a
reminder, to enable auto info either call `:GoSameIdsAutoToggle`(temporary) reminder, to enable auto info either call `:GoSameIdsAutoToggle`(temporary)
or add `let g:go_auto_sameids = 1` (persistent) to your vimrc. or add `let g:go_auto_sameids = 1` (persistent) to your vimrc.
* `:GoInfo` is now non blocking and works in async mode if `guru` is used in * `:GoInfo` is now non blocking and works in async mode if `guru` is used in
`g:go_info_mode`. This makes it useful especially for autoinfo mode. In this `g:go_info_mode`. This makes it useful especially for autoinfo mode. In this
@ -221,7 +235,7 @@ FEATURES:
* The snippet expansion `json` is now much more smarter. It pre populates the placeholder according to the first word and it also applies `snake_case` or `camelCase` conversion. Together with `:GoAddTags` it gives `vim-go` users flexible ways of populating a field tag. Checkout the demo to see it in action: https://twitter.com/fatih/status/754477622042689536 [gh-927] * The snippet expansion `json` is now much more smarter. It pre populates the placeholder according to the first word and it also applies `snake_case` or `camelCase` conversion. Together with `:GoAddTags` it gives `vim-go` users flexible ways of populating a field tag. Checkout the demo to see it in action: https://twitter.com/fatih/status/754477622042689536 [gh-927]
* New **`:GoSameIds`** command. When called highlights all same identifiers in the current file. Can be also enabled to highlight identifiers automatically (with `:GoSameIdsAutoToggle` or `g:go_auto_sameids`). Checkout the demo to see it in action: https://twitter.com/fatih/status/753673709278339072. [gh-936] * New **`:GoSameIds`** command. When called highlights all same identifiers in the current file. Can be also enabled to highlight identifiers automatically (with `:GoSameIdsAutoToggle` or `g:go_auto_sameids`). Checkout the demo to see it in action: https://twitter.com/fatih/status/753673709278339072. [gh-936]
* New **`:GoWhicherrs`** command. It shows all possible values of the selected error variable. [gh-948] * New **`:GoWhicherrs`** command. It shows all possible values of the selected error variable. [gh-948]
* Add new `errp` snippet to expand an `if err != nil { panic() }` clause [gh-926] * Add new `errp` snippet to expand an `if err != nil { panic() }` clause [gh-926]
* If you open a new buffer with a Go filename it get automatically populated based on the directory. If there are no Go files a simple main package is created, otherwise the file will include the package declaration line based on the package in the current directory. Checkout the demo to see it in action: https://twitter.com/fatih/status/748333086643994624. This is enabled by default. Can be disabled with `let g:go_template_autocreate = 0`. You can use your own template with `let g:go_template_file = "foo.go"` and putting the file under the `templates/` folder. [gh-918] * If you open a new buffer with a Go filename it get automatically populated based on the directory. If there are no Go files a simple main package is created, otherwise the file will include the package declaration line based on the package in the current directory. Checkout the demo to see it in action: https://twitter.com/fatih/status/748333086643994624. This is enabled by default. Can be disabled with `let g:go_template_autocreate = 0`. You can use your own template with `let g:go_template_file = "foo.go"` and putting the file under the `templates/` folder. [gh-918]
* Added new toggle commands to enable/disable feature that run for your * Added new toggle commands to enable/disable feature that run for your
automatic. For example if you have `let g:go_auto_type_info = 1` enabled, you automatic. For example if you have `let g:go_auto_type_info = 1` enabled, you
@ -371,4 +385,3 @@ BACKWARDS INCOMPATIBILITIES:
## Previous releases ## Previous releases
Previous changelogs can be found here: https://github.com/fatih/vim-go/releases Previous changelogs can be found here: https://github.com/fatih/vim-go/releases

View File

@ -25,7 +25,7 @@ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
This software includes some portions from Go. Go is used under the terms of the This software includes some portions from Go. Go is used under the terms of the
BSD like license. BSD like license.

View File

@ -1,4 +1,4 @@
# vim-go [![Build Status](http://img.shields.io/travis/fatih/vim-go.svg?style=flat-square)](https://travis-ci.org/fatih/vim-go) # vim-go [![Build Status](http://img.shields.io/travis/fatih/vim-go.svg?style=flat-square)](https://travis-ci.org/fatih/vim-go)
<p align="center"> <p align="center">
<img style="float: right;" src="assets/vim-go.png" alt="Vim-go logo"/> <img style="float: right;" src="assets/vim-go.png" alt="Vim-go logo"/>
@ -235,9 +235,9 @@ let g:go_get_update = 0
### Using with Neovim (beta) ### Using with Neovim (beta)
Note: Neovim currently is not a first class citizen for vim-go. You are free Note: Neovim currently is not a first class citizen for vim-go. You are free
to open bug, however I'm not using Neovim so it's hard for me to test it. to open bug, however I'm not using Neovim so it's hard for me to test it.
vim-go might not work well as good as in Vim. I'm happy to accept pull requests vim-go might not work well as good as in Vim. I'm happy to accept pull requests
or very detailed bug reports. If you're interested to improve the state of or very detailed bug reports. If you're interested to improve the state of
Neovim in vim-go you're always welcome! Neovim in vim-go you're always welcome!

View File

@ -39,7 +39,7 @@ function! ctrlp#decls#accept(mode, str) abort
let vals = matchlist(a:str, '|\(.\{-}\):\(\d\+\):\(\d\+\)\s*\(.*\)|') let vals = matchlist(a:str, '|\(.\{-}\):\(\d\+\):\(\d\+\)\s*\(.*\)|')
" i.e: main.go " i.e: main.go
let filename = vals[1] let filename = vals[1]
let line = vals[2] let line = vals[2]
let col = vals[3] let col = vals[3]
@ -119,7 +119,7 @@ function! ctrlp#decls#enter() abort
let space .= " " let space .= " "
endfor endfor
call add(s:decls, printf("%s\t%s |%s:%s:%s|\t%s", call add(s:decls, printf("%s\t%s |%s:%s:%s|\t%s",
\ decl.ident . space, \ decl.ident . space,
\ decl.keyword, \ decl.keyword,
\ fnamemodify(decl.filename, ":t"), \ fnamemodify(decl.filename, ":t"),
@ -135,7 +135,7 @@ function! s:enable_syntax() abort
return return
endif endif
syntax match CtrlPIdent '\zs\h\+\ze\s' syntax match CtrlPIdent '\zs\h\+\ze\s'
syntax match CtrlPKeyword '\zs[^\t|]\+\ze|[^|]\+:\d\+:\d\+|' syntax match CtrlPKeyword '\zs[^\t|]\+\ze|[^|]\+:\d\+:\d\+|'
syntax match CtrlPFilename '|\zs[^|]\+:\d\+:\d\+\ze|' syntax match CtrlPFilename '|\zs[^|]\+:\d\+:\d\+\ze|'
syntax match CtrlPSignature '\zs\t.*\ze$' contains=CtrlPKeyWord,CtrlPFilename syntax match CtrlPSignature '\zs\t.*\ze$' contains=CtrlPKeyWord,CtrlPFilename

View File

@ -373,7 +373,7 @@ function! go#cmd#Generate(bang, ...) abort
let errors = go#list#Get(l:listtype) let errors = go#list#Get(l:listtype)
call go#list#Window(l:listtype, len(errors)) call go#list#Window(l:listtype, len(errors))
if !empty(errors) if !empty(errors)
if !a:bang if !a:bang
call go#list#JumpToFirst(l:listtype) call go#list#JumpToFirst(l:listtype)
endif endif

View File

@ -27,11 +27,11 @@ function! s:gocodeCommand(cmd, preargs, args) abort
let $GOROOT = go#util#env("goroot") let $GOROOT = go#util#env("goroot")
let socket_type = get(g:, 'go_gocode_socket_type', s:sock_type) let socket_type = get(g:, 'go_gocode_socket_type', s:sock_type)
let cmd = printf('%s -sock %s %s %s %s', let cmd = printf('%s -sock %s %s %s %s',
\ go#util#Shellescape(bin_path), \ go#util#Shellescape(bin_path),
\ socket_type, \ socket_type,
\ join(a:preargs), \ join(a:preargs),
\ go#util#Shellescape(a:cmd), \ go#util#Shellescape(a:cmd),
\ join(a:args) \ join(a:args)
\ ) \ )
@ -55,7 +55,7 @@ endfunction
let s:optionsEnabled = 0 let s:optionsEnabled = 0
function! s:gocodeEnableOptions() abort function! s:gocodeEnableOptions() abort
if s:optionsEnabled if s:optionsEnabled
return return
endif endif

View File

@ -34,7 +34,7 @@ function! go#coverage#Buffer(bang, ...) abort
try try
execute cd . fnameescape(expand("%:p:h")) execute cd . fnameescape(expand("%:p:h"))
if empty(glob("*_test.go")) if empty(glob("*_test.go"))
call go#util#EchoError("no tests files available") call go#util#EchoError("no test files available")
return return
endif endif
finally finally
@ -89,8 +89,8 @@ function! go#coverage#Clear() abort
if exists("s:toggle") | let s:toggle = 0 | endif if exists("s:toggle") | let s:toggle = 0 | endif
" remove the autocmd we defined " remove the autocmd we defined
if exists("#BufWinLeave#<buffer>") if exists("#BufWinLeave#<buffer>")
autocmd! BufWinLeave <buffer> autocmd! BufWinLeave <buffer>
endif endif
endfunction endfunction
@ -160,8 +160,8 @@ function! go#coverage#genmatch(cov) abort
" example: foo.go:92.2,92.65 1 0 " example: foo.go:92.2,92.65 1 0
if a:cov.startline == a:cov.endline if a:cov.startline == a:cov.endline
call add(matches, { call add(matches, {
\ 'group': color, \ 'group': color,
\ 'pos': [[a:cov.startline, a:cov.startcol, a:cov.endcol - a:cov.startcol]], \ 'pos': [[a:cov.startline, a:cov.startcol, a:cov.endcol - a:cov.startcol]],
\ 'priority': 2, \ 'priority': 2,
\ }) \ })
return matches return matches
@ -171,8 +171,8 @@ function! go#coverage#genmatch(cov) abort
" the line, we assume it is at maximum 200 bytes. I know this is hacky, " the line, we assume it is at maximum 200 bytes. I know this is hacky,
" but that's only way of fixing the issue " but that's only way of fixing the issue
call add(matches, { call add(matches, {
\ 'group': color, \ 'group': color,
\ 'pos': [[a:cov.startline, a:cov.startcol, 200]], \ 'pos': [[a:cov.startline, a:cov.startcol, 200]],
\ 'priority': 2, \ 'priority': 2,
\ }) \ })
@ -181,16 +181,16 @@ function! go#coverage#genmatch(cov) abort
while start_line < a:cov.endline while start_line < a:cov.endline
let start_line += 1 let start_line += 1
call add(matches, { call add(matches, {
\ 'group': color, \ 'group': color,
\ 'pos': [[start_line]], \ 'pos': [[start_line]],
\ 'priority': 2, \ 'priority': 2,
\ }) \ })
endwhile endwhile
" finally end columns " finally end columns
call add(matches, { call add(matches, {
\ 'group': color, \ 'group': color,
\ 'pos': [[a:cov.endline, a:cov.endcol-1]], \ 'pos': [[a:cov.endline, a:cov.endcol-1]],
\ 'priority': 2, \ 'priority': 2,
\ }) \ })

View File

@ -209,7 +209,7 @@ function! go#def#StackUI() abort
let prefix = " " let prefix = " "
endif endif
call add(stackOut, printf("%s %d %s|%d col %d|%s", call add(stackOut, printf("%s %d %s|%d col %d|%s",
\ prefix, i+1, entry["file"], entry["line"], entry["col"], entry["ident"])) \ prefix, i+1, entry["file"], entry["line"], entry["col"], entry["ident"]))
let i += 1 let i += 1
endwhile endwhile

View File

@ -32,10 +32,10 @@ function! go#doc#OpenBrowser(...) abort
let import = out["import"] let import = out["import"]
let name = out["name"] let name = out["name"]
let decl = out["decl"] let decl = out["decl"]
let godoc_url = "https://godoc.org/" . import let godoc_url = "https://godoc.org/" . import
if decl !~ "^package" if decl !~ "^package"
let godoc_url .= "#" . name let godoc_url .= "#" . name
endif endif
echo godoc_url echo godoc_url
@ -92,13 +92,20 @@ function! s:GodocView(newposition, position, content) abort
execute bufwinnr(s:buf_nr) . 'wincmd w' execute bufwinnr(s:buf_nr) . 'wincmd w'
endif endif
" cap buffer height to 20, but resize it for smaller contents if a:position == "split"
let max_height = 20 " cap buffer height to 20, but resize it for smaller contents
let content_height = len(split(a:content, "\n")) let max_height = 20
if content_height > max_height let content_height = len(split(a:content, "\n"))
exe 'resize ' . max_height if content_height > max_height
exe 'resize ' . max_height
else
exe 'resize ' . content_height
endif
else else
exe 'resize ' . content_height " set a sane maximum width for vertical splits. In this case the minimum
" that fits the godoc for package http without extra linebreaks and line
" numbers on
exe 'vertical resize 84'
endif endif
setlocal filetype=godoc setlocal filetype=godoc

View File

@ -77,7 +77,7 @@ function! go#fmt#Format(withGoimport) abort
if go#util#ShellError() == 0 if go#util#ShellError() == 0
call go#fmt#update_file(l:tmpname, expand('%')) call go#fmt#update_file(l:tmpname, expand('%'))
elseif g:go_fmt_fail_silently == 0 elseif g:go_fmt_fail_silently == 0
let errors = s:parse_errors(out) let errors = s:parse_errors(expand('%'), out)
call s:show_errors(errors) call s:show_errors(errors)
endif endif
@ -102,7 +102,7 @@ function! go#fmt#Format(withGoimport) abort
endfunction endfunction
" update_file updates the target file with the given formatted source " update_file updates the target file with the given formatted source
function! go#fmt#update_file(source, target) function! go#fmt#update_file(source, target)
" remove undo point caused via BufWritePre " remove undo point caused via BufWritePre
try | silent undojoin | catch | endtry try | silent undojoin | catch | endtry
@ -133,8 +133,8 @@ endfunction
" run runs the gofmt/goimport command for the given source file and returns " run runs the gofmt/goimport command for the given source file and returns
" the the output of the executed command. Target is the real file to be " the the output of the executed command. Target is the real file to be
" formated. " formated.
function! go#fmt#run(bin_name, source, target) function! go#fmt#run(bin_name, source, target)
let cmd = s:fmt_cmd(a:bin_name, a:source, a:target) let cmd = s:fmt_cmd(a:bin_name, a:source, a:target)
if cmd[0] == "goimports" if cmd[0] == "goimports"
" change GOPATH too, so goimports can pick up the correct library " change GOPATH too, so goimports can pick up the correct library
@ -168,10 +168,9 @@ function! s:fmt_cmd(bin_name, source, target)
" start constructing the command " start constructing the command
let cmd = [bin_path] let cmd = [bin_path]
call add(cmd, "-w") call add(cmd, "-w")
call extend(cmd, split(g:go_fmt_options, " "))
if a:bin_name != "goimports" if a:bin_name == "goimports"
call extend(cmd, split(g:go_fmt_options, " "))
else
" lazy check if goimports support `-srcdir`. We should eventually remove " lazy check if goimports support `-srcdir`. We should eventually remove
" this in the future " this in the future
if !exists('b:goimports_vendor_compatible') if !exists('b:goimports_vendor_compatible')
@ -196,7 +195,7 @@ function! s:fmt_cmd(bin_name, source, target)
endfunction endfunction
" parse_errors parses the given errors and returns a list of parsed errors " parse_errors parses the given errors and returns a list of parsed errors
function! s:parse_errors(content) abort function! s:parse_errors(filename, content) abort
let splitted = split(a:content, '\n') let splitted = split(a:content, '\n')
" list of errors to be put into location list " list of errors to be put into location list
@ -205,6 +204,7 @@ function! s:parse_errors(content) abort
let tokens = matchlist(line, '^\(.\{-}\):\(\d\+\):\(\d\+\)\s*\(.*\)') let tokens = matchlist(line, '^\(.\{-}\):\(\d\+\):\(\d\+\)\s*\(.*\)')
if !empty(tokens) if !empty(tokens)
call add(errors,{ call add(errors,{
\"filename": a:filename,
\"lnum": tokens[2], \"lnum": tokens[2],
\"col": tokens[3], \"col": tokens[3],
\"text": tokens[4], \"text": tokens[4],
@ -218,13 +218,13 @@ endfunction
" show_errors opens a location list and shows the given errors. If the given " show_errors opens a location list and shows the given errors. If the given
" errors is empty, it closes the the location list " errors is empty, it closes the the location list
function! s:show_errors(errors) abort function! s:show_errors(errors) abort
let l:listtype = "locationlist" let l:listtype = "locationlist"
if !empty(a:errors) if !empty(a:errors)
call go#list#Populate(l:listtype, a:errors, 'Format') call go#list#Populate(l:listtype, a:errors, 'Format')
echohl Error | echomsg "Gofmt returned error" | echohl None echohl Error | echomsg "Gofmt returned error" | echohl None
endif endif
" this closes the window if there are no errors or it opens " this closes the window if there are no errors or it opens
" it if there is any " it if there is any
call go#list#Window(l:listtype, len(a:errors)) call go#list#Window(l:listtype, len(a:errors))
endfunction endfunction

View File

@ -25,7 +25,7 @@ function! s:guru_cmd(args) range abort
endif endif
"return with a warning if the binary doesn't exist "return with a warning if the binary doesn't exist
let bin_path = go#path#CheckBinPath("guru") let bin_path = go#path#CheckBinPath("guru")
if empty(bin_path) if empty(bin_path)
return {'err': "bin path not found"} return {'err': "bin path not found"}
endif endif
@ -41,7 +41,7 @@ function! s:guru_cmd(args) range abort
endif endif
" enable outputting in json format " enable outputting in json format
if format == "json" if format == "json"
call add(cmd, "-json") call add(cmd, "-json")
endif endif
@ -120,8 +120,6 @@ function! s:sync_guru(args) abort
endif endif
endif endif
let old_gopath = $GOPATH
let $GOPATH = go#path#Detect()
" run, forrest run!!! " run, forrest run!!!
let command = join(result.cmd, " ") let command = join(result.cmd, " ")
@ -131,8 +129,6 @@ function! s:sync_guru(args) abort
let out = go#util#System(command) let out = go#util#System(command)
endif endif
let $GOPATH = old_gopath
if has_key(a:args, 'custom_parse') if has_key(a:args, 'custom_parse')
call a:args.custom_parse(go#util#ShellError(), out) call a:args.custom_parse(go#util#ShellError(), out)
else else
@ -217,11 +213,17 @@ endfunc
" run_guru runs the given guru argument " run_guru runs the given guru argument
function! s:run_guru(args) abort function! s:run_guru(args) abort
let old_gopath = $GOPATH
let $GOPATH = go#path#Detect()
if go#util#has_job() if go#util#has_job()
return s:async_guru(a:args) let res = s:async_guru(a:args)
else
let res = s:sync_guru(a:args)
endif endif
return s:sync_guru(a:args) let $GOPATH = old_gopath
return res
endfunction endfunction
" Show 'implements' relation for selected package " Show 'implements' relation for selected package
@ -270,7 +272,7 @@ endfunction
function! go#guru#DescribeInfo() abort function! go#guru#DescribeInfo() abort
" json_encode() and friends are introduced with this patch (7.4.1304) " json_encode() and friends are introduced with this patch (7.4.1304)
" vim: https://groups.google.com/d/msg/vim_dev/vLupTNhQhZ8/cDGIk0JEDgAJ " vim: https://groups.google.com/d/msg/vim_dev/vLupTNhQhZ8/cDGIk0JEDgAJ
" nvim: https://github.com/neovim/neovim/pull/4131 " nvim: https://github.com/neovim/neovim/pull/4131
if !exists("*json_decode") if !exists("*json_decode")
call go#util#EchoError("requires 'json_decode'. Update your Vim/Neovim version.") call go#util#EchoError("requires 'json_decode'. Update your Vim/Neovim version.")
return return
@ -465,7 +467,7 @@ function! go#guru#SameIds() abort
" json_encode() and friends are introduced with this patch (7.4.1304) " json_encode() and friends are introduced with this patch (7.4.1304)
" vim: https://groups.google.com/d/msg/vim_dev/vLupTNhQhZ8/cDGIk0JEDgAJ " vim: https://groups.google.com/d/msg/vim_dev/vLupTNhQhZ8/cDGIk0JEDgAJ
" nvim: https://github.com/neovim/neovim/pull/4131 " nvim: https://github.com/neovim/neovim/pull/4131
if !exists("*json_decode") if !exists("*json_decode")
call go#util#EchoError("GoSameIds requires 'json_decode'. Update your Vim/Neovim version.") call go#util#EchoError("GoSameIds requires 'json_decode'. Update your Vim/Neovim version.")
return return
@ -547,7 +549,7 @@ function! go#guru#ClearSameIds() abort
endfunction endfunction
function! go#guru#ToggleSameIds() abort function! go#guru#ToggleSameIds() abort
if len(getmatches()) != 0 if len(getmatches()) != 0
call go#guru#ClearSameIds() call go#guru#ClearSameIds()
else else
call go#guru#SameIds() call go#guru#SameIds()

View File

@ -18,7 +18,7 @@ function! go#impl#Impl(...) abort
return return
endif endif
elseif a:0 == 1 elseif a:0 == 1
" we assume the user only passed the interface type, " we assume the user only passed the interface type,
" i.e: ':GoImpl io.Writer' " i.e: ':GoImpl io.Writer'
let receiveType = expand("<cword>") let receiveType = expand("<cword>")
let recv = printf("%s *%s", tolower(receiveType)[0], receiveType) let recv = printf("%s *%s", tolower(receiveType)[0], receiveType)
@ -44,7 +44,7 @@ function! go#impl#Impl(...) abort
end end
let pos = getpos('.') let pos = getpos('.')
put ='' put =''
put =result put =result
call setpos('.', pos) call setpos('.', pos)
endfunction endfunction

View File

@ -109,9 +109,9 @@ endfunction
" Golint calls 'golint' on the current directory. Any warnings are populated in " Golint calls 'golint' on the current directory. Any warnings are populated in
" the location list " the location list
function! go#lint#Golint(...) abort function! go#lint#Golint(...) abort
let bin_path = go#path#CheckBinPath(g:go_golint_bin) let bin_path = go#path#CheckBinPath(g:go_golint_bin)
if empty(bin_path) if empty(bin_path)
return return
endif endif
if a:0 == 0 if a:0 == 0
@ -280,7 +280,7 @@ function s:lint_job(args)
call go#statusline#Update(status_dir, status) call go#statusline#Update(status_dir, status)
let errors = go#list#Get(l:listtype) let errors = go#list#Get(l:listtype)
if empty(errors) if empty(errors)
call go#list#Window(l:listtype, len(errors)) call go#list#Window(l:listtype, len(errors))
elseif has("patch-7.4.2200") elseif has("patch-7.4.2200")
if l:listtype == 'quickfix' if l:listtype == 'quickfix'

View File

@ -124,7 +124,7 @@ function! go#list#Type(listtype) abort
if g:go_list_type == "locationlist" if g:go_list_type == "locationlist"
return "locationlist" return "locationlist"
elseif g:go_list_type == "quickfix" elseif g:go_list_type == "quickfix"
return "quickfix" return "quickfix"
else else
return a:listtype return a:listtype
endif endif

View File

@ -70,7 +70,7 @@ function! s:get_visual_selection() abort
return join(lines, "\n") return join(lines, "\n")
endfunction endfunction
" following two functions are from: https://github.com/mattn/gist-vim " following two functions are from: https://github.com/mattn/gist-vim
" thanks @mattn " thanks @mattn
function! s:get_browser_command() abort function! s:get_browser_command() abort
let go_play_browser_command = get(g:, 'go_play_browser_command', '') let go_play_browser_command = get(g:, 'go_play_browser_command', '')

View File

@ -4,7 +4,7 @@
" s:statuses is a global reference to all statuses. It stores the statuses per " s:statuses is a global reference to all statuses. It stores the statuses per
" import paths (map[string]status), where each status is unique per its " import paths (map[string]status), where each status is unique per its
" type. Current status dict is in form: " type. Current status dict is in form:
" { " {
" 'desc' : 'Job description', " 'desc' : 'Job description',
" 'state' : 'Job state, such as success, failure, etc..', " 'state' : 'Job state, such as success, failure, etc..',
" 'type' : 'Job type, such as build, test, etc..' " 'type' : 'Job type, such as build, test, etc..'

View File

@ -0,0 +1,206 @@
function! go#tags#Add(start, end, count, ...) abort
let fname = fnamemodify(expand("%"), ':p:gs?\\?/?')
if &modified
" Write current unsaved buffer to a temp file and use the modified content
let l:tmpname = tempname()
call writefile(getline(1, '$'), l:tmpname)
let fname = l:tmpname
endif
let offset = 0
if a:count == -1
let offset = go#util#OffsetCursor()
endif
let test_mode = 0
call call("go#tags#run", [a:start, a:end, offset, "add", fname, test_mode] + a:000)
" if exists, delete it as we don't need it anymore
if exists("l:tmpname")
call delete(l:tmpname)
endif
endfunction
function! go#tags#Remove(start, end, count, ...) abort
let fname = fnamemodify(expand("%"), ':p:gs?\\?/?')
if &modified
" Write current unsaved buffer to a temp file and use the modified content
let l:tmpname = tempname()
call writefile(getline(1, '$'), l:tmpname)
let fname = l:tmpname
endif
let offset = 0
if a:count == -1
let offset = go#util#OffsetCursor()
endif
let test_mode = 0
call call("go#tags#run", [a:start, a:end, offset, "remove", fname, test_mode] + a:000)
" if exists, delete it as we don't need it anymore
if exists("l:tmpname")
call delete(l:tmpname)
endif
endfunction
" run runs gomodifytag. This is an internal test so we can test it
function! go#tags#run(start, end, offset, mode, fname, test_mode, ...) abort
" do not split this into multiple lines, somehow tests fail in that case
let args = {'mode': a:mode,'start': a:start,'end': a:end,'offset': a:offset,'fname': a:fname,'cmd_args': a:000}
let result = s:create_cmd(args)
if has_key(result, 'err')
call go#util#EchoError(result.err)
return -1
endif
let command = join(result.cmd, " ")
call go#cmd#autowrite()
let out = go#util#System(command)
if go#util#ShellError() != 0
call go#util#EchoError(out)
return
endif
if a:test_mode
exe 'edit ' . a:fname
endif
call s:write_out(out)
if a:test_mode
exe 'write! ' . a:fname
endif
endfunc
" write_out writes back the given output to the current buffer
func s:write_out(out) abort
" not a json output
if a:out[0] !=# '{'
return
endif
" nothing to do
if empty(a:out) || type(a:out) != type("")
return
endif
let result = json_decode(a:out)
if type(result) != type({})
call go#util#EchoError(printf("malformed output from gomodifytags: %s", a:out))
return
endif
let lines = result['lines']
let start_line = result['start']
let end_line = result['end']
let index = 0
for line in range(start_line, end_line)
call setline(line, lines[index])
let index += 1
endfor
endfunc
" create_cmd returns a dict that contains the command to execute gomodifytags
func s:create_cmd(args) abort
if !exists("*json_decode")
return {'err': "requires 'json_decode'. Update your Vim/Neovim version."}
endif
let bin_path = go#path#CheckBinPath('gomodifytags')
if empty(bin_path)
return {'err': "gomodifytags does not exist"}
endif
let l:start = a:args.start
let l:end = a:args.end
let l:offset = a:args.offset
let l:mode = a:args.mode
let l:cmd_args = a:args.cmd_args
" start constructing the command
let cmd = [bin_path]
call extend(cmd, ["-format", "json"])
call extend(cmd, ["-file", a:args.fname])
if l:offset != 0
call extend(cmd, ["-offset", l:offset])
else
let range = printf("%d,%d", l:start, l:end)
call extend(cmd, ["-line", range])
endif
if l:mode == "add"
let l:tags = []
let l:options = []
if !empty(l:cmd_args)
for item in l:cmd_args
let splitted = split(item, ",")
" tag only
if len(splitted) == 1
call add(l:tags, splitted[0])
endif
" options only
if len(splitted) == 2
call add(l:tags, splitted[0])
call add(l:options, printf("%s=%s", splitted[0], splitted[1]))
endif
endfor
endif
" construct options
if !empty(l:options)
call extend(cmd, ["-add-options", join(l:options, ",")])
else
" default value
if empty(l:tags)
let l:tags = ["json"]
endif
" construct tags
call extend(cmd, ["-add-tags", join(l:tags, ",")])
endif
elseif l:mode == "remove"
if empty(l:cmd_args)
call add(cmd, "-clear-tags")
else
let l:tags = []
let l:options = []
for item in l:cmd_args
let splitted = split(item, ",")
" tag only
if len(splitted) == 1
call add(l:tags, splitted[0])
endif
" options only
if len(splitted) == 2
call add(l:options, printf("%s=%s", splitted[0], splitted[1]))
endif
endfor
" construct tags
if !empty(l:tags)
call extend(cmd, ["-remove-tags", join(l:tags, ",")])
endif
" construct options
if !empty(l:options)
call extend(cmd, ["-remove-options", join(l:options, ",")])
endif
endif
else
return {'err': printf("unknown mode: %s", l:mode)}
endif
return {'cmd': cmd}
endfunc

View File

@ -0,0 +1,28 @@
func Test_add_tags()
let input_file = tempname()
call writefile(readfile("test-fixtures/tags/add_all_input.go"), input_file)
let expected = join(readfile("test-fixtures/tags/add_all_golden.go"), "\n")
" run for offset 40, which is inside the struct
call go#tags#run(0, 0, 40, "add", input_file, 1)
let actual = join(readfile(input_file), "\n")
call assert_equal(expected, actual)
endfunc
func Test_remove_tags()
let input_file = tempname()
call writefile(readfile("test-fixtures/tags/remove_all_input.go"), input_file)
let expected = join(readfile("test-fixtures/tags/remove_all_golden.go"), "\n")
" run for offset 40, which is inside the struct
call go#tags#run(0, 0, 40, "remove", input_file, 1)
let actual = join(readfile(input_file), "\n")
call assert_equal(expected, actual)
endfunc

View File

@ -67,7 +67,7 @@ function! go#textobj#Function(mode) abort
normal! v normal! v
call cursor(info.rbrace.line, info.rbrace.col) call cursor(info.rbrace.line, info.rbrace.col)
return return
endif endif
" rest is inner mode, a:mode == 'i' " rest is inner mode, a:mode == 'i'

View File

@ -164,7 +164,7 @@ function! go#tool#Exists(importpath) abort
endfunction endfunction
" following two functions are from: https://github.com/mattn/gist-vim " following two functions are from: https://github.com/mattn/gist-vim
" thanks @mattn " thanks @mattn
function! s:get_browser_command() abort function! s:get_browser_command() abort
let go_play_browser_command = get(g:, 'go_play_browser_command', '') let go_play_browser_command = get(g:, 'go_play_browser_command', '')

View File

@ -53,7 +53,7 @@ let s:env_cache = {}
" env returns the go environment variable for the given key. Where key can be " env returns the go environment variable for the given key. Where key can be
" GOARCH, GOOS, GOROOT, etc... It caches the result and returns the cached " GOARCH, GOOS, GOROOT, etc... It caches the result and returns the cached
" version. " version.
function! go#util#env(key) abort function! go#util#env(key) abort
let l:key = tolower(a:key) let l:key = tolower(a:key)
if has_key(s:env_cache, l:key) if has_key(s:env_cache, l:key)

View File

@ -576,7 +576,7 @@ CTRL-t
*:GoSameIdsToggle* *:GoSameIdsToggle*
:GoSameIdsToggle :GoSameIdsToggle
Toggle between |:GoSameIds| and |:GoSameIdsClear|. Toggle between |:GoSameIds| and |:GoSameIdsClear|.
*:GoSameIdsAutoToggle* *:GoSameIdsAutoToggle*
:GoSameIdsAutoToggle :GoSameIdsAutoToggle
@ -669,12 +669,13 @@ CTRL-t
:GoImpl T io.ReadWriteCloser :GoImpl T io.ReadWriteCloser
< <
*:GoAddTags* *:GoAddTags*
:[range]GoAddTags [key] [key1] ... :[range]GoAddTags [key],[option] [key1],[option] ...
Adds field tags for the fields of a struct. If called inside a struct it Adds field tags for the fields of a struct. If called inside a struct it
automatically add field tags with the `json` key and the value automatically add field tags with the `json` key and the value
automatically generated based on the field name. An error message is given automatically generated based on the field name. An error message is given
if it's called outside a struct definition. if it's called outside a struct definition or if the file is not correctly
formatted.
If [range] is given, only the selected fields will be changed. If [range] is given, only the selected fields will be changed.
@ -682,6 +683,37 @@ CTRL-t
arguments. An example of adding `xml` and `db` would be: arguments. An example of adding `xml` and `db` would be:
> >
:GoAddTags xml db :GoAddTags xml db
<
If [option] is passed it'll either add a new tag with an option or will
modify exising tags. An example of adding `omitempty` to all `json` fields
would be:
>
:GoAddTags json,omitempty
<
You can define a constant value instead of the default field based value.
For example the following command will add ``valid:"1"`` to all fields.
>
:GoAddTags valid=1
<
*:GoRemoveTags*
:[range]GoRemoveTags [key],[option] [key1],[option1] ...
Rmove field tags for the fields of a struct. If called inside a struct it
automatically remove all field tags. An error message is given if it's
called outside a struct definition or if the file is not correctly
formatted
If [range] is given, only the selected fields will be changed.
If [key] is given, it will only remove those keys. Example:
>
:GoRemoveTags json
<
If [option] is passed with a [key], it will only remove the options.
Example, this will only remove `omitempty` options from fields containing
`json`:
>
:GoRemoveTags json,omitempty
< <
*:GoAutoTypeInfoToggle* *:GoAutoTypeInfoToggle*
:GoAutoTypeInfoToggle :GoAutoTypeInfoToggle
@ -958,7 +990,7 @@ Shows the status of a job running asynchronously. Can be used to plug into the
statusline. It works to show the status per package instead of per statusline. It works to show the status per package instead of per
file. Assume you have three files open, all belonging to the same package, if file. Assume you have three files open, all belonging to the same package, if
the package build (`:GoBuild`) is successful, all statusline's will show the package build (`:GoBuild`) is successful, all statusline's will show
`success`, if you it fails all file's statusline will show `failed`. `success`, if you it fails all file's statusline will show `failed`.
To avoid always showing old status information, the status information is To avoid always showing old status information, the status information is
cleaned for each package after `60` seconds. This can be changed with the cleaned for each package after `60` seconds. This can be changed with the
@ -1488,6 +1520,8 @@ default it's enabled >
let g:go_echo_go_info = 1 let g:go_echo_go_info = 1
< <
Please note that 'noshowmode' must be set for this feature to work correctly.
*'g:go_statusline_duration'* *'g:go_statusline_duration'*
Specifices the duration of statusline information being showed per package. By Specifices the duration of statusline information being showed per package. By

View File

@ -14,14 +14,15 @@ command! -range=% GoChannelPeers call go#guru#ChannelPeers(<count>)
command! -range=% GoReferrers call go#guru#Referrers(<count>) command! -range=% GoReferrers call go#guru#Referrers(<count>)
command! -nargs=? GoGuruTags call go#guru#Tags(<f-args>) command! -nargs=? GoGuruTags call go#guru#Tags(<f-args>)
command! -nargs=* -range GoAddTags call go#util#AddTags(<line1>, <line2>, <f-args>)
command! -range=0 GoSameIds call go#guru#SameIds() command! -range=0 GoSameIds call go#guru#SameIds()
command! -range=0 GoSameIdsClear call go#guru#ClearSameIds() command! -range=0 GoSameIdsClear call go#guru#ClearSameIds()
command! -range=0 GoSameIdsToggle call go#guru#ToggleSameIds() command! -range=0 GoSameIdsToggle call go#guru#ToggleSameIds()
command! -range=0 GoSameIdsAutoToggle call go#guru#AutoToogleSameIds() command! -range=0 GoSameIdsAutoToggle call go#guru#AutoToogleSameIds()
" -- tags
command! -nargs=* -range GoAddTags call go#tags#Add(<line1>, <line2>, <count>, <f-args>)
command! -nargs=* -range GoRemoveTags call go#tags#Remove(<line1>, <line2>, <count>, <f-args>)
" -- tool " -- tool
command! -nargs=0 GoFiles echo go#tool#Files() command! -nargs=0 GoFiles echo go#tool#Files()
command! -nargs=0 GoDeps echo go#tool#Deps() command! -nargs=0 GoDeps echo go#tool#Deps()

View File

@ -15,9 +15,9 @@ endif
function! s:SetTagbar() function! s:SetTagbar()
let bin_path = go#path#CheckBinPath(g:go_gotags_bin) let bin_path = go#path#CheckBinPath(g:go_gotags_bin)
if empty(bin_path) if empty(bin_path)
return return
endif endif
if !exists("g:tagbar_type_go") if !exists("g:tagbar_type_go")

View File

@ -175,7 +175,7 @@ if err != nil {
${0} ${0}
endsnippet endsnippet
# error test # error test
snippet errt "Error test fatal " !b snippet errt "Error test fatal " !b
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)

View File

@ -18,6 +18,7 @@ let s:packages = [
\ "github.com/jstemmer/gotags", \ "github.com/jstemmer/gotags",
\ "github.com/klauspost/asmfmt/cmd/asmfmt", \ "github.com/klauspost/asmfmt/cmd/asmfmt",
\ "github.com/fatih/motion", \ "github.com/fatih/motion",
\ "github.com/fatih/gomodifytags",
\ "github.com/zmb3/gogetdoc", \ "github.com/zmb3/gogetdoc",
\ "github.com/josharian/impl", \ "github.com/josharian/impl",
\ ] \ ]

View File

@ -4,6 +4,9 @@ set -e
cd $(dirname $0) cd $(dirname $0)
# install dependencies
go get github.com/fatih/gomodifytags
# cleanup test.log # cleanup test.log
if [ -f "test.log" ]; then if [ -f "test.log" ]; then
rm test.log rm test.log

View File

@ -30,7 +30,7 @@ syn region pugJavascript matchgroup=pugJavascriptOutputChar start="[!&]\==\|\~"
syn region pugJavascript matchgroup=pugJavascriptChar start="-" skip=",\s*$" end="$" contained contains=@htmlJavascript keepend syn region pugJavascript matchgroup=pugJavascriptChar start="-" skip=",\s*$" end="$" contained contains=@htmlJavascript keepend
syn cluster pugTop contains=pugBegin,pugComment,pugHtmlComment,pugJavascript syn cluster pugTop contains=pugBegin,pugComment,pugHtmlComment,pugJavascript
syn match pugBegin "^\s*\%([<>]\|&[^=~ ]\)\@!" nextgroup=pugTag,pugClassChar,pugIdChar,pugPlainChar,pugJavascript,pugScriptConditional,pugScriptStatement,pugPipedText syn match pugBegin "^\s*\%([<>]\|&[^=~ ]\)\@!" nextgroup=pugTag,pugClassChar,pugIdChar,pugPlainChar,pugJavascript,pugScriptConditional,pugScriptStatement,pugPipedText
syn match pugTag "+\?\w\+\%(:\w\+\)\=" contained contains=htmlTagName,htmlSpecialTagName nextgroup=@pugComponent syn match pugTag "+\?[[:alnum:]_-]\+\%(:\w\+\)\=" contained contains=htmlTagName,htmlSpecialTagName nextgroup=@pugComponent
syn cluster pugComponent contains=pugAttributes,pugIdChar,pugBlockExpansionChar,pugClassChar,pugPlainChar,pugJavascript,pugTagBlockChar,pugTagInlineText syn cluster pugComponent contains=pugAttributes,pugIdChar,pugBlockExpansionChar,pugClassChar,pugPlainChar,pugJavascript,pugTagBlockChar,pugTagInlineText
syntax keyword pugCommentTodo contained TODO FIXME XXX TBD syntax keyword pugCommentTodo contained TODO FIXME XXX TBD
syn match pugComment '\(\s\+\|^\)\/\/.*$' contains=pugCommentTodo syn match pugComment '\(\s\+\|^\)\/\/.*$' contains=pugCommentTodo

View File

@ -96,4 +96,8 @@ snippet datetime "YYYY-MM-DD hh:mm" w
`!v strftime("%Y-%m-%d %H:%M")` `!v strftime("%Y-%m-%d %H:%M")`
endsnippet endsnippet
snippet todo "TODO comment" bw
`!p snip.rv=get_comment_format()[0]` ${2:TODO}: $0${3: <${4:`!v strftime('%d-%m-%y')`}${5:, `!v g:snips_author`}>} `!p snip.rv=get_comment_format()[2]`
endsnippet
# vim:ft=snippets: # vim:ft=snippets:

View File

@ -4,6 +4,28 @@ extends c
# We want to overwrite everything in parent ft. # We want to overwrite everything in parent ft.
priority -49 priority -49
###########################################################################
# Global functions #
###########################################################################
global !p
def write_docstring_args(arglist, snip):
args = str(arglist).split(',')
if len(args) > 1:
c = 0
for arg in args:
if c == 0:
snip.rv += arg
c = 1
else:
snip += '* : %s' % arg.strip()
else:
snip.rv = args[0]
endglobal
########################################################################### ###########################################################################
# TextMate Snippets # # TextMate Snippets #
@ -70,4 +92,19 @@ public:
#endif /* $2 */ #endif /* $2 */
endsnippet endsnippet
snippet fnc "Basic c++ doxygen function template" b
/**
* @brief: ${4:brief}
*
* @param: `!p write_docstring_args(t[3],snip)`
*
* @return: `!p snip.rv = t[1]`
*/
${1:ReturnType} ${2:FunctionName}(${3:param})
{
${0:FunctionBody}
}
endsnippet
# vim:ft=snippets: # vim:ft=snippets:

View File

@ -0,0 +1,234 @@
priority -50
# JavaScript versions -- from the TextMate bundle + some additions
# for jasmine-jquery matchers
#
snippet des "Describe (js)" b
describe('${1:description}', () => {
$0
});
endsnippet
snippet it "it (js)" b
it('${1:description}', () => {
$0
});
endsnippet
snippet bef "before each (js)" b
beforeEach(() => {
$0
});
endsnippet
snippet aft "after each (js)" b
afterEach(() => {
$0
});
endsnippet
snippet befa "before all (js)" b
beforeAll(() => {
$0
});
endsnippet
snippet afta "after all (js)" b
afterAll(() => {
$0
});
endsnippet
snippet any "any (js)" b
jasmine.any($1)
endsnippet
snippet anyt "anything (js)" b
jasmine.anything()
endsnippet
snippet objc "object containing (js)" b
jasmine.objectContaining({
${VISUAL}$0
});
endsnippet
snippet arrc "array containing (js)" b
jasmine.arrayContaining([${1:value1}]);
endsnippet
snippet strm "string matching (js)" b
jasmine.stringMatching("${1:matcher}")
endsnippet
snippet ru "runs (js)" b
runs(() => {
$0
});
endsnippet
snippet wa "waits (js)" b
waits($1);
endsnippet
snippet ex "expect (js)" b
expect(${1:target})$0;
endsnippet
snippet ee "expect to equal (js)" b
expect(${1:target}).toEqual(${2:value});
endsnippet
snippet el "expect to be less than (js)" b
expect(${1:target}).toBeLessThan(${2:value});
endsnippet
snippet eg "expect to be greater than (js)" b
expect(${1:target}).toBeGreaterThan(${2:value});
endsnippet
snippet eb "expect to be (js)" b
expect(${1:target}).toBe(${2:value});
endsnippet
snippet em "expect to match (js)" b
expect(${1:target}).toMatch(${2:pattern});
endsnippet
snippet eha "expect to have attribute (js)" b
expect(${1:target}).toHaveAttr('${2:attr}'${3:, '${4:value}'});
endsnippet
snippet et "expect to be truthy (js)" b
expect(${1:target}).toBeTruthy();
endsnippet
snippet ef "expect to be falsy (js)" b
expect(${1:target}).toBeFalsy();
endsnippet
snippet ed "expect to be defined (js)" b
expect(${1:target}).toBeDefined();
endsnippet
snippet eud "expect to be defined (js)" b
expect(${1:target}).toBeUndefined();
endsnippet
snippet en "expect to be null (js)" b
expect(${1:target}).toBeNull();
endsnippet
snippet ec "expect to contain (js)" b
expect(${1:target}).toContain(${2:value});
endsnippet
snippet ev "expect to be visible (js)" b
expect(${1:target}).toBeVisible();
endsnippet
snippet eh "expect to be hidden (js)" b
expect(${1:target}).toBeHidden();
endsnippet
snippet eth "expect to throw (js)" b
expect(${1:target}).toThrow(${2:value});
endsnippet
snippet ethe "expect to throw error (js)" b
expect(${1:target}).toThrowError(${2:value});
endsnippet
snippet notx "expect not (js)" b
expect(${1:target}).not$0;
endsnippet
snippet note "expect not to equal (js)" b
expect(${1:target}).not.toEqual(${2:value});
endsnippet
snippet notl "expect to not be less than (js)" b
expect(${1:target}).not.toBeLessThan(${2:value});
endsnippet
snippet notg "expect to not be greater than (js)" b
expect(${1:target}).not.toBeGreaterThan(${2:value});
endsnippet
snippet notm "expect not to match (js)" b
expect(${1:target}).not.toMatch(${2:pattern});
endsnippet
snippet notha "expect to not have attribute (js)" b
expect(${1:target}).not.toHaveAttr('${2:attr}'${3:, '${4:value}'});
endsnippet
snippet nott "expect not to be truthy (js)" b
expect(${1:target}).not.toBeTruthy();
endsnippet
snippet notf "expect not to be falsy (js)" b
expect(${1:target}).not.toBeFalsy();
endsnippet
snippet notd "expect not to be defined (js)" b
expect(${1:target}).not.toBeDefined();
endsnippet
snippet notn "expect not to be null (js)" b
expect(${1:target}).not.toBeNull();
endsnippet
snippet notc "expect not to contain (js)" b
expect(${1:target}).not.toContain(${2:value});
endsnippet
snippet notv "expect not to be visible (js)" b
expect(${1:target}).not.toBeVisible();
endsnippet
snippet noth "expect not to be hidden (js)" b
expect(${1:target}).not.toBeHidden();
endsnippet
snippet notth "expect not to throw (js)" b
expect(${1:target}).not.toThrow(${2:value});
endsnippet
snippet notthe "expect not to throw error (js)" b
expect(${1:target}).not.toThrowError(${2:value});
endsnippet
snippet s "spy on (js)" b
spyOn(${1:object}, '${2:method}')$0;
endsnippet
snippet sr "spy on and return (js)" b
spyOn(${1:object}, '${2:method}').and.returnValue(${3:arguments});
endsnippet
snippet st "spy on and throw (js)" b
spyOn(${1:object}, '${2:method}').and.throwError(${3:exception});
endsnippet
snippet sct "spy on and call through (js)" b
spyOn(${1:object}, '${2:method}').and.callThrough();
endsnippet
snippet scf "spy on and call fake (js)" b
spyOn(${1:object}, '${2:method}').and.callFake(${3:function});
endsnippet
snippet ethbc "expect to have been called (js)" b
expect(${1:target}).toHaveBeenCalled();
endsnippet
snippet nthbc "expect not to have been called (js)" b
expect(${1:target}).not.toHaveBeenCalled();
endsnippet
snippet ethbcw "expect to have been called with (js)" b
expect(${1:target}).toHaveBeenCalledWith(${2:arguments});
endsnippet

View File

@ -132,6 +132,14 @@ snippet eh "expect to be hidden (js)" b
expect(${1:target}).toBeHidden(); expect(${1:target}).toBeHidden();
endsnippet endsnippet
snippet eth "expect to throw (js)" b
expect(${1:target}).toThrow(${2:value});
endsnippet
snippet ethe "expect to throw error (js)" b
expect(${1:target}).toThrowError(${2:value});
endsnippet
snippet notx "expect not (js)" b snippet notx "expect not (js)" b
expect(${1:target}).not$0; expect(${1:target}).not$0;
endsnippet endsnippet
@ -145,7 +153,7 @@ expect(${1:target}).not.toBeLessThan(${2:value});
endsnippet endsnippet
snippet notg "expect to not be greater than (js)" b snippet notg "expect to not be greater than (js)" b
expect(${1:target})..not.toBeGreaterThan(${2:value}); expect(${1:target}).not.toBeGreaterThan(${2:value});
endsnippet endsnippet
snippet notm "expect not to match (js)" b snippet notm "expect not to match (js)" b
@ -184,6 +192,14 @@ snippet noth "expect not to be hidden (js)" b
expect(${1:target}).not.toBeHidden(); expect(${1:target}).not.toBeHidden();
endsnippet endsnippet
snippet notth "expect not to throw (js)" b
expect(${1:target}).not.toThrow(${2:value});
endsnippet
snippet notthe "expect not to throw error (js)" b
expect(${1:target}).not.toThrowError(${2:value});
endsnippet
snippet s "spy on (js)" b snippet s "spy on (js)" b
spyOn(${1:object}, '${2:method}')$0; spyOn(${1:object}, '${2:method}')$0;
endsnippet endsnippet

View File

@ -1,5 +1,19 @@
priority -50 priority -50
############
# COMMON #
############
# The smart snippets use a global options called
# "g:ultisnips_javascript.{option}" which can control the format
# of trailing semicolon, space before function paren, etc.
global !p
from javascript_snippets import (
semi, space_before_function_paren, keyword_spacing
)
endglobal
########################################################################### ###########################################################################
# TextMate Snippets # # TextMate Snippets #
########################################################################### ###########################################################################
@ -8,13 +22,13 @@ getElement${1/(T)|.*/(?1:s)/}By${1:T}${1/(T)|(I)|.*/(?1:agName)(?2:d)/}('$2')
endsnippet endsnippet
snippet '':f "object method string" snippet '':f "object method string"
'${1:${2:#thing}:${3:click}}': function(element) { '${1:${2:#thing}:${3:click}}': function`!p snip.rv = space_before_function_paren(snip)`(element) {
${VISUAL}$0 ${VISUAL}$0
}${10:,} }${10:,}
endsnippet endsnippet
snippet :f "Object Method" snippet :f "Object Method"
${1:method_name}: function(${3:attribute}) { ${1:method_name}: function`!p snip.rv = space_before_function_paren(snip)`(${3:attribute}) {
${VISUAL}$0 ${VISUAL}$0
}${10:,} }${10:,}
endsnippet endsnippet
@ -28,48 +42,99 @@ ${1:key}: ${2:"${3:value}"}${4:, }
endsnippet endsnippet
snippet proto "Prototype (proto)" snippet proto "Prototype (proto)"
${1:class_name}.prototype.${2:method_name} = function(${3:first_argument}) { ${1:class_name}.prototype.${2:method_name} = function`!p snip.rv = space_before_function_paren(snip)`(${3:first_argument}) {
${VISUAL}$0 ${VISUAL}$0
}; }`!p snip.rv = semi(snip)`
endsnippet endsnippet
snippet fun "function (fun)" w snippet fun "function (fun)" w
function ${1:function_name}(${2:argument}) { function ${1:function_name}`!p snip.rv = space_before_function_paren(snip)`(${2:argument}) {
${VISUAL}$0 ${VISUAL}$0
} }
endsnippet endsnippet
snippet vf "Function assigned to var" snippet vf "Function assigned to var"
${1:var }${2:function_name} = function $2($3) { ${1:var }${2:function_name} = function $2`!p snip.rv = space_before_function_paren(snip)`($3) {
${VISUAL}$0 ${VISUAL}$0
}; }`!p snip.rv = semi(snip)`
endsnippet endsnippet
snippet af "Anonymous Function" i snippet af "Anonymous Function" i
function($1) { function`!p snip.rv = space_before_function_paren(snip)`($1) {
${VISUAL}$0 ${VISUAL}$0
} }
endsnippet endsnippet
snippet iife "Immediately-Invoked Function Expression (iife)" snippet iife "Immediately-Invoked Function Expression (iife)"
(function(${1:window}) { (function`!p snip.rv = space_before_function_paren(snip)`(${1:window}) {
${VISUAL}$0 ${VISUAL}$0
}(${2:$1})); }(${2:$1}))`!p snip.rv = semi(snip)`
endsnippet
snippet ;fe "Minify safe iife"
;(function`!p snip.rv = space_before_function_paren(snip)`(${1}) {
${VISUAL}$0
}(${2}))
endsnippet endsnippet
snippet timeout "setTimeout function" snippet timeout "setTimeout function"
setTimeout(function() { setTimeout(function`!p snip.rv = space_before_function_paren(snip)`() {
${VISUAL}$0 ${VISUAL}$0
}${2:.bind(${3:this})}, ${1:10}); }${2:.bind(${3:this})}, ${1:10})`!p snip.rv = semi(snip)`
endsnippet endsnippet
snippet fi "for prop in obj using hasOwnProperty" b snippet fi "for prop in obj using hasOwnProperty" b
for (${1:prop} in ${2:obj}){ for`!p snip.rv = keyword_spacing(snip)`(${1:prop} in ${2:obj}){
if ($2.hasOwnProperty($1)) { if`!p snip.rv = keyword_spacing(snip)`($2.hasOwnProperty($1)) {
${VISUAL}$0 ${VISUAL}$0
} }
} }
endsnippet endsnippet
snippet if "if (condition) { ... }"
if`!p snip.rv = keyword_spacing(snip)`(${1:true}) {
${VISUAL}$0
}
endsnippet
snippet ife "if (condition) { ... } else { ... }"
if`!p snip.rv = keyword_spacing(snip)`(${1:true}) {
${VISUAL}$0
}`!p snip.rv = keyword_spacing(snip)`else`!p snip.rv = keyword_spacing(snip)`{
${2}
}
endsnippet
snippet switch
switch`!p snip.rv = keyword_spacing(snip)`(${VISUAL}${1:expression}) {
case '${VISUAL}${3:case}':
${4}
break`!p snip.rv = semi(snip)`
${0}
default:
${2}
}
endsnippet
snippet case "case 'xyz': ... break"
case`!p snip.rv = keyword_spacing(snip)`'${VISUAL}${1:case}':
${VISUAL}$0
break`!p snip.rv = semi(snip)`
endsnippet
snippet do "do { ... } while (condition)"
do`!p snip.rv = keyword_spacing(snip)`{
${VISUAL}$0
}`!p snip.rv = keyword_spacing(snip)`while`!p snip.rv = keyword_spacing(snip)`(${1:/* condition */})`!p snip.rv = semi(snip)`
endsnippet
snippet ret "Return statement"
return ${VISUAL}$0`!p snip.rv = semi(snip)`
endsnippet
snippet us
'use strict'`!p snip.rv = semi(snip)`
endsnippet
# vim:ft=snippets: # vim:ft=snippets:

View File

@ -0,0 +1,24 @@
priority -50
snippet switch "switch ... otherwise"
switch ${1:n}
case ${2:0}
${3}${4:
otherwise
${5}}
end
endsnippet
snippet clc "class with constructor" b
classdef ${1:`!p
snip.rv = snip.basename or "class_name"`}
properties
${2}
end
methods
function obj = $1(${3})
${4}
end${0}
end
end
endsnippet

View File

@ -1,5 +1,26 @@
priority -50 priority -50
#
# Global functions
#
global !p
def write_instance_vars(arglist, snip):
args = str(arglist).split(',')
for arg in args:
name = arg.strip().replace(':', ' ').split(' ', 1)[0]
if name:
snip += ' @{} = {}'.format(name, name)
else:
snip += ''
endglobal
#
# Snippets
#
snippet "^#!" "#!/usr/bin/env ruby" r snippet "^#!" "#!/usr/bin/env ruby" r
#!/usr/bin/env ruby #!/usr/bin/env ruby
$0 $0
@ -17,8 +38,7 @@ end
endsnippet endsnippet
snippet defi "def initialize ..." snippet defi "def initialize ..."
def initialize${1:(${2:*args})} def initialize($1)`!p write_instance_vars(t[1],snip)`$0
$0
end end
endsnippet endsnippet
@ -212,32 +232,6 @@ except:
end end
endsnippet endsnippet
snippet "(\S+)\.Each_?w(ith)?_?i(ndex)?" ".each_with_index { |<element>,<i>| <block> }" r
`!p snip.rv=match.group(1)`.each_with_index { |${1:`!p
element_name = match.group(1).lstrip('$@')
ematch = re.search("([A-Za-z][A-Za-z0-9_]+?)s?[^A-Za-z0-9_]*?$", element_name)
try:
wmatch = re.search("([A-Za-z][A-Za-z0-9_]+)$", ematch.group(1))
snip.rv = wmatch.group(1).lower()
except:
snip.rv = 'element'
`},${2:i}| $0 }
endsnippet
snippet "(\S+)\.each_?w(ith)?_?i(ndex)?" ".each_with_index do |<element>,<i>| <block> end" r
`!p snip.rv=match.group(1)`.each_with_index do |${1:`!p
element_name = match.group(1).lstrip('$@')
ematch = re.search("([A-Za-z][A-Za-z0-9_]+?)s?[^A-Za-z0-9_]*?$", element_name)
try:
wmatch = re.search("([A-Za-z][A-Za-z0-9_]+)$", ematch.group(1))
snip.rv = wmatch.group(1).lower()
except:
snip.rv = 'element'
`},${2:i}|
$0
end
endsnippet
snippet "(\S+)\.Each_?p(air)?" ".each_pair { |<key>,<value>| <block> }" r snippet "(\S+)\.Each_?p(air)?" ".each_pair { |<key>,<value>| <block> }" r
`!p snip.rv=match.group(1)`.each_pair { |${1:key},${2:value}| $0 } `!p snip.rv=match.group(1)`.each_pair { |${1:key},${2:value}| $0 }
endsnippet endsnippet
@ -298,20 +292,6 @@ rescue
end end
endsnippet endsnippet
snippet begin "begin ... rescue ... else ... ensure ... end"
begin
${1:# Raise exception}
rescue Exception => e
puts e.message
puts e.backtrace.inspect
${2:# Rescue}
else
${3:# other exception}
ensure
${0:# always excute}
end
endsnippet
snippet rescue snippet rescue
rescue Exception => e rescue Exception => e
puts e.message puts e.message
@ -326,10 +306,6 @@ $0
end end
endsnippet endsnippet
snippet alias "alias :<new_name> :<old_name>"
alias :${1:new_name} :${2:old_name}
endsnippet
snippet class "class <class_name> def initialize ... end end" snippet class "class <class_name> def initialize ... end end"
class ${1:class_name} class ${1:class_name}
def initialize(${2:*args}) def initialize(${2:*args})

View File

@ -2,15 +2,15 @@ priority -50
# We use a little hack so that the snippet is expanded # We use a little hack so that the snippet is expanded
# and parsed correctly # and parsed correctly
snippet snip "Snippet definition" b snippet usnip "Ultisnips snippet definition" b
`!p snip.rv = "snippet"` ${1:Tab_trigger} "${2:Description}" ${3:b} `!p snip.rv = "snippet"` ${1:Tab_trigger} "${2:Description}" ${3:b}
$0 ${0:${VISUAL}}
`!p snip.rv = "endsnippet"` `!p snip.rv = "endsnippet"`
endsnippet endsnippet
snippet global "Global snippet" b snippet global "Global snippet" b
`!p snip.rv = "global"` !p `!p snip.rv = "global"` !p
$0 ${0:${VISUAL}}
`!p snip.rv = "endglobal"` `!p snip.rv = "endglobal"`
endsnippet endsnippet

View File

@ -0,0 +1,48 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Helper utilities to format javascript snippets.
"""
ALWAYS = 'always'
NEVER = 'never'
def get_option(snip, option, default=None):
return snip.opt('g:ultisnips_javascript["{}"]'.format(option), default)
def semi(snip):
option = get_option(snip, 'semi', ALWAYS)
if option == NEVER:
ret = ''
elif option == ALWAYS:
ret = ';'
else:
ret = ';'
return ret
def space_before_function_paren(snip):
option = get_option(snip, 'space-before-function-paren', NEVER)
if option == NEVER:
ret = ''
elif option == ALWAYS:
ret = ' '
else:
ret = ''
return ret
def keyword_spacing(snip):
option = get_option(snip, 'keyword-spacing', ALWAYS)
if option == NEVER:
ret = ''
elif option == ALWAYS:
ret = ' '
else:
ret = ''
return ret

View File

@ -130,6 +130,84 @@ snippet fun
{ {
${4} ${4}
} }
# function definition with zero parameters
snippet fun0
${1:void} ${2:function_name}()
{
${3}
}
# function definition with Doxygen documentation
snippet dfun0
/*! \brief ${1:Brief function description here}
*
* ${2:Detailed description of the function}
*
* \return ${3:Return parameter description}
*/
${4:void} ${5:function_name}()
{
${6}
}
# function definition with one parameter
snippet fun1
${1:void} ${2:function_name}(${3:Type} ${4:Parameter})
{
${5}
}
# function definition with one parameter with Doxygen documentation
snippet dfun1
/*! \brief ${1:Brief function description here}
*
* ${2:Detailed description of the function}
*
* \param $3 ${4:Parameter description}
* \return ${5:Return parameter description}
*/
${6:void} ${7:function_name}(${8:Type} ${3:Parameter})
{
${9}
}
# function definition with two parameters
snippet fun2
${1:void} ${2:function_name}(${3:Type} ${4:Parameter}, ${5:Type} ${6:Parameter})
{
${7}
}
# function definition with two parameters with Doxygen documentation
snippet dfun2
/*! \brief ${1:Brief function description here}
*
* ${2:Detailed description of the function}
*
* \param $3 ${4:Parameter description}
* \param $5 ${6:Parameter description}
* \return ${7:Return parameter description}
*/
${8:void} ${9:function_name}(${10:Type} ${3:Parameter}, ${11:Type} ${5:Parameter})
{
${12}
}
# function definition with two parameters
snippet fun3
${1:void} ${2:function_name}(${3:Type} ${4:Parameter}, ${5:Type} ${6:Parameter}, ${7:Type} ${8:Parameter})
{
${9}
}
# function definition with two parameters with Doxygen documentation
snippet dfun3
/*! \brief ${1:Brief function description here}
*
* ${2:Detailed description of the function}
*
* \param $3 ${4:Parameter description}
* \param $5 ${6:Parameter description}
* \param $7 ${8:Parameter description}
* \return ${9:Return parameter description}
*/
${10:void} ${11:function_name}(${12:Type} ${3:Parameter}, ${13:Type} ${5:Parameter}, ${14:Type} ${7:Parameter})
{
${15}
}
# function declaration # function declaration
snippet fund snippet fund
${1:void} ${2:function_name}(${3}); ${1:void} ${2:function_name}(${3});
@ -140,21 +218,39 @@ snippet td
typedef ${1:int} ${2:MyCustomType}; typedef ${1:int} ${2:MyCustomType};
# struct # struct
snippet st snippet st
/*! \struct $1
* \brief ${3:Brief struct description}
*
* ${4:Detailed description}
*/
struct ${1:`vim_snippets#Filename('$1_t', 'name')`} { struct ${1:`vim_snippets#Filename('$1_t', 'name')`} {
${2:/* data */} ${2:Data} /*!< ${4:Description} */
}${3: /* optional variable list */}; }${5: /* optional variable list */};
# typedef struct # typedef struct
snippet tds snippet tds
/*! \struct $2
* \brief ${5:Brief struct description}
*
* ${6:Detailed description}
*/
typedef struct ${2:_$1 }{ typedef struct ${2:_$1 }{
${3:/* data */} m_${3:Data} /*!< ${4:Description} */
} ${1:`vim_snippets#Filename('$1_t', 'name')`}; } ${1:`vim_snippets#Filename('$1_t', 'name')`};
snippet enum snippet enum
/*! \enum $1
*
* ${2:Detailed description}
*/
enum ${1:name} { ${0} }; enum ${1:name} { ${0} };
# typedef enum # typedef enum
snippet tde snippet tde
/*! \enum $2
*
* ${4:Detailed description}
*/
typedef enum { typedef enum {
${1:/* data */} ${1:Data} /*!< ${3:Description} */
} ${2:foo}; } ${2:foo};
## ##
## Input/Output ## Input/Output
@ -228,6 +324,11 @@ snippet getopt
} }
} }
## ##
# TODO section
snippet todo
/*! TODO: ${1:Todo description here}
* \todo $1
*/
## Miscellaneous ## Miscellaneous
# This is kind of convenient # This is kind of convenient
snippet . snippet .

View File

@ -78,20 +78,61 @@ snippet mu
## Class ## Class
# class # class
snippet cl snippet cl
/*! \class $1
* \brief ${3:Brief class description}
*
* ${4:Detailed description}
*/
class ${1:`vim_snippets#Filename('$1', 'name')`} class ${1:`vim_snippets#Filename('$1', 'name')`}
{ {
public: public:
$1(${2}); $1(${2});
~$1(); virtual ~$1();
private: protected:
${0:/* data */} m_${5}; /*!< ${6:Member description} */
}; };
# member function implementation # member function implementation
snippet mfun snippet mfun
${4:void} ${1:`vim_snippets#Filename('$1', 'ClassName')`}::${2:memberFunction}(${3}) { ${4:void} ${1:`vim_snippets#Filename('$1', 'ClassName')`}::${2:memberFunction}(${3}) {
${0} ${0}
} }
# member function implementation without parameters
snippet dmfun0
/*! \brief ${4:Brief function description here}
*
* ${5:Detailed description}
*
* \return ${6:Return parameter description}
*/
${3:void} ${1:`vim_snippets#Filename('$1', 'ClassName')`}::${2:memberFunction}() {
${0}
}
# member function implementation with one parameter
snippet dmfun1
/*! \brief ${6:Brief function description here}
*
* ${7:Detailed description}
*
* \param $4 ${8:Parameter description}
* \return ${9:Return parameter description}
*/
${5:void} ${1:`vim_snippets#Filename('$1', 'ClassName')`}::${2:memberFunction}(${3:Type} ${4:Parameter}) {
${0}
}
# member function implementation with two parameter
snippet dmfun2
/*! \brief ${8:Brief function description here}
*
* ${9:Detailed description}
*
* \param $4 ${10:Parameter description}
* \param $6 ${11:Parameter description}
* \return ${12:Return parameter description}
*/
${7:void} ${1:`vim_snippets#Filename('$1', 'ClassName')`}::${2:memberFunction}(${3:Type} ${4:Parameter},${5:Type} ${6:Parameter}) {
${0}
}
# namespace # namespace
snippet ns snippet ns
namespace ${1:`vim_snippets#Filename('', 'my')`} { namespace ${1:`vim_snippets#Filename('', 'my')`} {
@ -152,3 +193,13 @@ snippet lld
[${1}](${2}){ [${1}](${2}){
${3} ${3}
}; };
# snippets exception
snippet try
try {
}catch(${1}) {
}

View File

@ -28,9 +28,12 @@ snippet doc
$0 $0
snippet dox snippet dox
!> @brief ${1} !> @brief ${1}
!!
!> ${2} !> ${2}
!> @author `g:snips_author` !> @author `g:snips_author`
${0} ${0}
snippet doxp
!> @param[${1}]${0}
# Variables definitions # Variables definitions
# Boolean # Boolean
snippet bool snippet bool

View File

@ -78,7 +78,7 @@ snippet spaceless
snippet ssi snippet ssi
{% ssi ${0} %} {% ssi ${0} %}
snippet trans snippet trans
{% trans "${0:string}" %} {% trans %}${0}{% endtrans %}
snippet url snippet url
{% url ${1} as ${0} %} {% url ${1} as ${0} %}
snippet widthratio snippet widthratio

View File

@ -0,0 +1,64 @@
snippet if if
if ${1}
${0}
end
snippet ife if ... else
if ${1}
${2}
else
${0}
end
snippet el else
else
${0}
snippet eif elsif
elseif ${1}
${0}
snippet wh while
while ${1}
${0}
end
snippet for for
for ${1:i} = ${2:1:n}
${0}
end
snippet parfor parfor
parfor ${1:i} = ${2:1:n}
${0}
end
snippet fun function
function [${3:out}] = ${1:`vim_snippets#Filename("$1", "fun_name")`}(${2})
${0}
snippet try try ... catch
try
${1}
catch ${2:err}
${0}
end
snippet switch switch
switch ${1:n}
case ${2:0}
${0}
end
snippet @ anonymous function
@(${1:x}) ${0:x*x}
snippet cl class
classdef ${1:`vim_snippets#Filename("$1", "class_name")`}
properties
${2}
end
methods
${0}
end
end

View File

@ -94,9 +94,9 @@ snippet E
$_ENV['${1:variable}'] $_ENV['${1:variable}']
snippet F snippet F
$_FILES['${1:variable}'] $_FILES['${1:variable}']
snippet G snippet G "_GET array"
$_GET['${1:variable}'] $_GET['${1:variable}']
snippet P snippet P "_POST array"
$_POST['${1:variable}'] $_POST['${1:variable}']
snippet R snippet R
$_REQUEST['${1:variable}'] $_REQUEST['${1:variable}']

Some files were not shown because too many files have changed in this diff Show More