Updated plugins
This commit is contained in:
parent
04abc6907c
commit
a6de243fca
67 changed files with 2836 additions and 1097 deletions
|
@ -1,8 +1,9 @@
|
||||||
" =============================================================================
|
" =============================================================================
|
||||||
" File: autoload/ctrlp.vim
|
" File: autoload/ctrlp.vim
|
||||||
" Description: Fuzzy file, buffer, mru, tag, etc finder.
|
" Description: Fuzzy file, buffer, mru, tag, etc finder.
|
||||||
" Author: Kien Nguyen <github.com/kien>
|
" Author: CtrlP Dev Team
|
||||||
" Version: 1.79
|
" Original: Kien Nguyen <github.com/kien>
|
||||||
|
" Version: 1.80
|
||||||
" =============================================================================
|
" =============================================================================
|
||||||
|
|
||||||
" ** Static variables {{{1
|
" ** Static variables {{{1
|
||||||
|
@ -1583,7 +1584,7 @@ fu! s:formatline(str)
|
||||||
let str .= printf(' %s', '<bp>'.parts[3].'</bp>')
|
let str .= printf(' %s', '<bp>'.parts[3].'</bp>')
|
||||||
en
|
en
|
||||||
el
|
el
|
||||||
let str .= printf(' %-5s %-30s %s',
|
let str .= printf(' %-5s %-30s',
|
||||||
\ parts[0],
|
\ parts[0],
|
||||||
\ parts[2])
|
\ parts[2])
|
||||||
if (!empty(s:bufpath_mod))
|
if (!empty(s:bufpath_mod))
|
||||||
|
|
|
@ -1497,6 +1497,28 @@ Special thanks:~
|
||||||
===============================================================================
|
===============================================================================
|
||||||
CHANGELOG *ctrlp-changelog*
|
CHANGELOG *ctrlp-changelog*
|
||||||
|
|
||||||
|
Before 2016/11/28~
|
||||||
|
|
||||||
|
+ New command: |YankLine()| to yank current line.
|
||||||
|
+ New option: |g:ctrlp_types| to select builtin modes.
|
||||||
|
+ New feature: asynchronized spawn of |g:ctrlp_user_command|. This enable
|
||||||
|
with set |g:user_command_async| to 1.
|
||||||
|
+ Support buffertag for delphi, rust and golang.
|
||||||
|
+ New option: |g:ctrlp_brief_prompt|,
|
||||||
|
|g:match_current_file|,
|
||||||
|
|g:ctrlp_compare_lim|.
|
||||||
|
+ New feature: Auto-ignore extension.
|
||||||
|
+ Support buffertag for ant, tex, dosbatch, matlab and vhdl.
|
||||||
|
+ New option |g:ctrlp_line_prefix| for integrating third party plugins.
|
||||||
|
+ New option |g:open_single_match| to open single file in matches.
|
||||||
|
+ Add <plug>(ctrlp) for launch CtrlP.
|
||||||
|
+ Accept bang for CtrlPBookmarkDirAdd to avoid confirm.
|
||||||
|
+ Handle variable like "g:ctrlp_TYPE_MODE".
|
||||||
|
ex: let g:ctrlp_path_sort
|
||||||
|
+ New option: |g:ctrlp_custom_ancestors|
|
||||||
|
|
||||||
|
Before 2014/08/08~
|
||||||
|
|
||||||
+ New buffer explorer mode with highlighting (|+conceal| recommended)
|
+ New buffer explorer mode with highlighting (|+conceal| recommended)
|
||||||
+ New options: |g:ctrlp_bufname_mod|,
|
+ New options: |g:ctrlp_bufname_mod|,
|
||||||
|g:ctrlp_bufpath_mod|
|
|g:ctrlp_bufpath_mod|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
" Filename: autoload/lightline.vim
|
" Filename: autoload/lightline.vim
|
||||||
" Author: itchyny
|
" Author: itchyny
|
||||||
" License: MIT License
|
" License: MIT License
|
||||||
" Last Change: 2016/10/05 08:00:00.
|
" Last Change: 2016/12/03 12:08:08.
|
||||||
" =============================================================================
|
" =============================================================================
|
||||||
|
|
||||||
let s:save_cpo = &cpo
|
let s:save_cpo = &cpo
|
||||||
|
@ -156,7 +156,7 @@ function! lightline#init() abort
|
||||||
endfor
|
endfor
|
||||||
call extend(s:lightline.tabline_separator, s:lightline.separator, 'keep')
|
call extend(s:lightline.tabline_separator, s:lightline.separator, 'keep')
|
||||||
call extend(s:lightline.tabline_subseparator, s:lightline.subseparator, 'keep')
|
call extend(s:lightline.tabline_subseparator, s:lightline.subseparator, 'keep')
|
||||||
let s:lightline.tabline_configured = 0
|
let s:lightline.tabline_configured = has_key(get(get(g:, 'lightline', {}), 'component_expand', {}), 'tabs')
|
||||||
for components in deepcopy(s:lightline.tabline.left + s:lightline.tabline.right)
|
for components in deepcopy(s:lightline.tabline.left + s:lightline.tabline.right)
|
||||||
if len(filter(components, 'v:val !=# "tabs" && v:val !=# "close"')) > 0
|
if len(filter(components, 'v:val !=# "tabs" && v:val !=# "close"')) > 0
|
||||||
let s:lightline.tabline_configured = 1
|
let s:lightline.tabline_configured = 1
|
||||||
|
@ -229,16 +229,16 @@ function! lightline#link(...) abort
|
||||||
for [p, l] in [['Left', len(s:lightline.active.left)], ['Right', len(s:lightline.active.right)]]
|
for [p, l] in [['Left', len(s:lightline.active.left)], ['Right', len(s:lightline.active.right)]]
|
||||||
for [i, t] in map(range(0, l), '[v:val, 0]') + types
|
for [i, t] in map(range(0, l), '[v:val, 0]') + types
|
||||||
if i != l
|
if i != l
|
||||||
exec printf('hi link LightLine%s_active_%s LightLine%s_%s_%s', p, i, p, mode, i)
|
exec printf('hi link Lightline%s_active_%s Lightline%s_%s_%s', p, i, p, mode, i)
|
||||||
endif
|
endif
|
||||||
for [j, s] in map(range(0, l), '[v:val, 0]') + types
|
for [j, s] in map(range(0, l), '[v:val, 0]') + types
|
||||||
if i + 1 == j || t || s && i != l
|
if i + 1 == j || t || s && i != l
|
||||||
exec printf('hi link LightLine%s_active_%s_%s LightLine%s_%s_%s_%s', p, i, j, p, mode, i, j)
|
exec printf('hi link Lightline%s_active_%s_%s Lightline%s_%s_%s_%s', p, i, j, p, mode, i, j)
|
||||||
endif
|
endif
|
||||||
endfor
|
endfor
|
||||||
endfor
|
endfor
|
||||||
endfor
|
endfor
|
||||||
exec printf('hi link LightLineMiddle_active LightLineMiddle_%s', mode)
|
exec printf('hi link LightlineMiddle_active LightlineMiddle_%s', mode)
|
||||||
return ''
|
return ''
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
@ -279,17 +279,17 @@ function! lightline#highlight(...) abort
|
||||||
for [i, t] in map(range(0, l), '[v:val, 0]') + types
|
for [i, t] in map(range(0, l), '[v:val, 0]') + types
|
||||||
if i < l || i < 1
|
if i < l || i < 1
|
||||||
let r = t ? (has_key(get(c, d, []), i) ? c[d][i][0] : has_key(get(c, 'tabline', {}), i) ? c.tabline[i][0] : get(c.normal, i, zs)[0]) : get(zs, i, ms)
|
let r = t ? (has_key(get(c, d, []), i) ? c[d][i][0] : has_key(get(c, 'tabline', {}), i) ? c.tabline[i][0] : get(c.normal, i, zs)[0]) : get(zs, i, ms)
|
||||||
exec printf('hi LightLine%s_%s_%s guifg=%s guibg=%s ctermfg=%s ctermbg=%s %s', p, mode, i, r[0], r[1], r[2], r[3], s:term(r))
|
exec printf('hi Lightline%s_%s_%s guifg=%s guibg=%s ctermfg=%s ctermbg=%s %s', p, mode, i, r[0], r[1], r[2], r[3], s:term(r))
|
||||||
endif
|
endif
|
||||||
for [j, s] in map(range(0, l), '[v:val, 0]') + types
|
for [j, s] in map(range(0, l), '[v:val, 0]') + types
|
||||||
if i + 1 == j || t || s && i != l
|
if i + 1 == j || t || s && i != l
|
||||||
let q = s ? (has_key(get(c, d, []), j) ? c[d][j][0] : has_key(get(c, 'tabline', {}), j) ? c.tabline[j][0] : get(c.normal, j, zs)[0]) : (j != l ? get(zs, j, ms) :ms)
|
let q = s ? (has_key(get(c, d, []), j) ? c[d][j][0] : has_key(get(c, 'tabline', {}), j) ? c.tabline[j][0] : get(c.normal, j, zs)[0]) : (j != l ? get(zs, j, ms) :ms)
|
||||||
exec printf('hi LightLine%s_%s_%s_%s guifg=%s guibg=%s ctermfg=%s ctermbg=%s', p, mode, i, j, r[1], q[1], r[3], q[3])
|
exec printf('hi Lightline%s_%s_%s_%s guifg=%s guibg=%s ctermfg=%s ctermbg=%s', p, mode, i, j, r[1], q[1], r[3], q[3])
|
||||||
endif
|
endif
|
||||||
endfor
|
endfor
|
||||||
endfor
|
endfor
|
||||||
endfor
|
endfor
|
||||||
exec printf('hi LightLineMiddle_%s guifg=%s guibg=%s ctermfg=%s ctermbg=%s %s', mode, ms[0], ms[1], ms[2], ms[3], s:term(ms))
|
exec printf('hi LightlineMiddle_%s guifg=%s guibg=%s ctermfg=%s ctermbg=%s %s', mode, ms[0], ms[1], ms[2], ms[3], s:term(ms))
|
||||||
endfor
|
endfor
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
@ -400,7 +400,7 @@ function! s:line(tabline, inactive) abort
|
||||||
let r_ = has_key(s:lightline, mode) ? s:lightline[mode].right : s:lightline.active.right
|
let r_ = has_key(s:lightline, mode) ? s:lightline[mode].right : s:lightline.active.right
|
||||||
let [rt, rc, rl] = s:expand(copy(r_))
|
let [rt, rc, rl] = s:expand(copy(r_))
|
||||||
for i in range(len(lt))
|
for i in range(len(lt))
|
||||||
let _ .= '%#LightLineLeft_' . mode . '_' . ll[i] . '#'
|
let _ .= '%#LightlineLeft_' . mode . '_' . ll[i] . '#'
|
||||||
for j in range(len(lt[i]))
|
for j in range(len(lt[i]))
|
||||||
let x = lc[i][j] ? lt[i][j] : has_key(f, lt[i][j]) ? (exists('*' . f[lt[i][j]]) ? '%{' . f[lt[i][j]] . '()}' : '%{exists("*' . f[lt[i][j]] . '")?' . f[lt[i][j]] . '():""}') : get(c, lt[i][j], '')
|
let x = lc[i][j] ? lt[i][j] : has_key(f, lt[i][j]) ? (exists('*' . f[lt[i][j]]) ? '%{' . f[lt[i][j]] . '()}' : '%{exists("*' . f[lt[i][j]] . '")?' . f[lt[i][j]] . '():""}') : get(c, lt[i][j], '')
|
||||||
let _ .= has_key(t, lt[i][j]) && t[lt[i][j]] ==# 'raw' || x ==# '' ? x : '%( ' . x . ' %)'
|
let _ .= has_key(t, lt[i][j]) && t[lt[i][j]] ==# 'raw' || x ==# '' ? x : '%( ' . x . ' %)'
|
||||||
|
@ -408,14 +408,14 @@ function! s:line(tabline, inactive) abort
|
||||||
let _ .= s:subseparator(lt[i][(j):], s.left, lc[i][(j):])
|
let _ .= s:subseparator(lt[i][(j):], s.left, lc[i][(j):])
|
||||||
endif
|
endif
|
||||||
endfor
|
endfor
|
||||||
let _ .= '%#LightLineLeft_' . mode . '_' . ll[i] . '_' . ll[i + 1] . '#'
|
let _ .= '%#LightlineLeft_' . mode . '_' . ll[i] . '_' . ll[i + 1] . '#'
|
||||||
let _ .= i < l + len(lt) - len(l_) && ll[i] < l || ll[i] != ll[i + 1] ? p.left : len(lt[i]) ? s.left : ''
|
let _ .= i < l + len(lt) - len(l_) && ll[i] < l || ll[i] != ll[i + 1] ? p.left : len(lt[i]) ? s.left : ''
|
||||||
endfor
|
endfor
|
||||||
let _ .= '%#LightLineMiddle_' . mode . '#%='
|
let _ .= '%#LightlineMiddle_' . mode . '#%='
|
||||||
for i in reverse(range(len(rt)))
|
for i in reverse(range(len(rt)))
|
||||||
let _ .= '%#LightLineRight_' . mode . '_' . rl[i] . '_' . rl[i + 1] . '#'
|
let _ .= '%#LightlineRight_' . mode . '_' . rl[i] . '_' . rl[i + 1] . '#'
|
||||||
let _ .= i < r + len(rt) - len(r_) && rl[i] < r || rl[i] != rl[i + 1] ? p.right : len(rt[i]) ? s.right : ''
|
let _ .= i < r + len(rt) - len(r_) && rl[i] < r || rl[i] != rl[i + 1] ? p.right : len(rt[i]) ? s.right : ''
|
||||||
let _ .= '%#LightLineRight_' . mode . '_' . rl[i] . '#'
|
let _ .= '%#LightlineRight_' . mode . '_' . rl[i] . '#'
|
||||||
for j in range(len(rt[i]))
|
for j in range(len(rt[i]))
|
||||||
let x = rc[i][j] ? rt[i][j] : has_key(f, rt[i][j]) ? (exists('*' . f[rt[i][j]]) ? '%{' . f[rt[i][j]] . '()}' : '%{exists("*' . f[rt[i][j]] . '")?' . f[rt[i][j]] . '():""}') : get(c, rt[i][j], '')
|
let x = rc[i][j] ? rt[i][j] : has_key(f, rt[i][j]) ? (exists('*' . f[rt[i][j]]) ? '%{' . f[rt[i][j]] . '()}' : '%{exists("*' . f[rt[i][j]] . '")?' . f[rt[i][j]] . '():""}') : get(c, rt[i][j], '')
|
||||||
let _ .= has_key(t, rt[i][j]) && t[rt[i][j]] ==# 'raw' || x ==# '' ? x : '%( ' . x . ' %)'
|
let _ .= has_key(t, rt[i][j]) && t[rt[i][j]] ==# 'raw' || x ==# '' ? x : '%( ' . x . ' %)'
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
" =============================================================================
|
||||||
|
" Filename: autoload/lightline/colorscheme/molokai.vim
|
||||||
|
" Author: challsted
|
||||||
|
" License: MIT License
|
||||||
|
" Last Change: 2016/11/17 00:27:58.
|
||||||
|
" =============================================================================
|
||||||
|
"
|
||||||
|
let s:black = [ '#232526', 233 ]
|
||||||
|
let s:gray = [ '#808080', 244 ]
|
||||||
|
let s:white = [ '#f8f8f2', 234 ]
|
||||||
|
let s:cyan = [ '#66d9ef', 81 ]
|
||||||
|
let s:green = [ '#a6e22e', 118 ]
|
||||||
|
let s:orange = [ '#ef5939', 166 ]
|
||||||
|
let s:pink = [ '#f92672', 161 ]
|
||||||
|
let s:red = [ '#ff0000', 160 ]
|
||||||
|
let s:yellow = [ '#e6db74', 229 ]
|
||||||
|
|
||||||
|
let s:p = {'normal': {}, 'inactive': {}, 'insert': {}, 'replace': {}, 'visual': {}, 'tabline': {}}
|
||||||
|
|
||||||
|
let s:p.normal.left = [ [ s:black, s:cyan ], [ s:orange, s:black ] ]
|
||||||
|
let s:p.normal.middle = [ [ s:orange, s:black ] ]
|
||||||
|
let s:p.normal.right = [ [ s:pink, s:black ], [ s:black, s:pink ] ]
|
||||||
|
let s:p.normal.error = [ [ s:pink, s:black ] ]
|
||||||
|
let s:p.normal.warning = [ [ s:yellow, s:black ] ]
|
||||||
|
let s:p.insert.left = [ [ s:black, s:green ], [ s:green, s:black ] ]
|
||||||
|
let s:p.visual.left = [ [ s:black, s:yellow ], [ s:yellow, s:black ] ]
|
||||||
|
let s:p.replace.left = [ [ s:black, s:red ], [ s:red, s:black ] ]
|
||||||
|
let s:p.inactive.left = [ [ s:pink, s:black ], [ s:white, s:black ] ]
|
||||||
|
let s:p.inactive.middle = [ [ s:gray, s:black ] ]
|
||||||
|
let s:p.inactive.right = [ [ s:white, s:pink ], [ s:pink, s:black ] ]
|
||||||
|
let s:p.tabline.left = [ [ s:pink, s:black ] ]
|
||||||
|
let s:p.tabline.middle = [ [ s:pink, s:black] ]
|
||||||
|
let s:p.tabline.right = copy(s:p.normal.right)
|
||||||
|
let s:p.tabline.tabsel = [ [ s:black, s:pink ] ]
|
||||||
|
|
||||||
|
let g:lightline#colorscheme#molokai#palette = lightline#colorscheme#flatten(s:p)
|
|
@ -223,7 +223,7 @@ 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, and 16color are available.
|
PaperColor, seoul256, landscape, one, Dracula, Molokai and 16color are available.
|
||||||
The default value is:
|
The default value is:
|
||||||
>
|
>
|
||||||
let g:lightline.colorscheme = 'default'
|
let g:lightline.colorscheme = 'default'
|
||||||
|
@ -636,6 +636,16 @@ compiled version of your colorscheme.
|
||||||
<
|
<
|
||||||
Then copy and paste the result to the colorscheme file.
|
Then copy and paste the result to the colorscheme file.
|
||||||
|
|
||||||
|
If you want to contribute a new colorscheme that is not currently available
|
||||||
|
please follow the following rules:
|
||||||
|
*) All hex codes should be lowercase only
|
||||||
|
*) Use 2 space soft tabs
|
||||||
|
*) If your colorscheme has both light and dark variants, use a single file
|
||||||
|
*) Normal Mode should default to Cyan
|
||||||
|
*) Insert Mode should default to Green
|
||||||
|
*) Visual Mode should default to Yellow
|
||||||
|
*) Replace Mode should default to Red
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
EXAMPLES *lightline-examples*
|
EXAMPLES *lightline-examples*
|
||||||
You can configure the appearance of statusline.
|
You can configure the appearance of statusline.
|
||||||
|
|
|
@ -23,14 +23,14 @@ function! s:suite.highlight()
|
||||||
call lightline#init()
|
call lightline#init()
|
||||||
call lightline#colorscheme()
|
call lightline#colorscheme()
|
||||||
let palette = lightline#palette()
|
let palette = lightline#palette()
|
||||||
call s:assert.match(s:hi('LightLineLeft_normal_0'), s:pattern(palette.normal.left[0]))
|
call s:assert.match(s:hi('LightlineLeft_normal_0'), s:pattern(palette.normal.left[0]))
|
||||||
call s:assert.match(s:hi('LightLineLeft_normal_1'), s:pattern(palette.normal.left[1]))
|
call s:assert.match(s:hi('LightlineLeft_normal_1'), s:pattern(palette.normal.left[1]))
|
||||||
call s:assert.match(s:hi('LightLineLeft_normal_2'), 'E411: highlight group not found\|cleared')
|
call s:assert.match(s:hi('LightlineLeft_normal_2'), 'E411: highlight group not found\|cleared')
|
||||||
call s:assert.match(s:hi('LightLineRight_normal_0'), s:pattern(palette.normal.right[0]))
|
call s:assert.match(s:hi('LightlineRight_normal_0'), s:pattern(palette.normal.right[0]))
|
||||||
call s:assert.match(s:hi('LightLineRight_normal_1'), s:pattern(palette.normal.right[1]))
|
call s:assert.match(s:hi('LightlineRight_normal_1'), s:pattern(palette.normal.right[1]))
|
||||||
call s:assert.match(s:hi('LightLineRight_normal_2'), s:pattern(palette.normal.right[2]))
|
call s:assert.match(s:hi('LightlineRight_normal_2'), s:pattern(palette.normal.right[2]))
|
||||||
call s:assert.match(s:hi('LightLineRight_normal_3'), 'E411: highlight group not found\|cleared')
|
call s:assert.match(s:hi('LightlineRight_normal_3'), 'E411: highlight group not found\|cleared')
|
||||||
call s:assert.match(s:hi('LightLineMiddle_normal'), s:pattern(palette.normal.middle[0]))
|
call s:assert.match(s:hi('LightlineMiddle_normal'), s:pattern(palette.normal.middle[0]))
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:suite.insert()
|
function! s:suite.insert()
|
||||||
|
@ -39,14 +39,14 @@ function! s:suite.insert()
|
||||||
call lightline#colorscheme()
|
call lightline#colorscheme()
|
||||||
call lightline#highlight('insert')
|
call lightline#highlight('insert')
|
||||||
let palette = lightline#palette()
|
let palette = lightline#palette()
|
||||||
call s:assert.match(s:hi('LightLineLeft_insert_0'), s:pattern(palette.insert.left[0]))
|
call s:assert.match(s:hi('LightlineLeft_insert_0'), s:pattern(palette.insert.left[0]))
|
||||||
call s:assert.match(s:hi('LightLineLeft_insert_1'), s:pattern(palette.insert.left[1]))
|
call s:assert.match(s:hi('LightlineLeft_insert_1'), s:pattern(palette.insert.left[1]))
|
||||||
call s:assert.match(s:hi('LightLineLeft_insert_2'), 'E411: highlight group not found\|cleared')
|
call s:assert.match(s:hi('LightlineLeft_insert_2'), 'E411: highlight group not found\|cleared')
|
||||||
call s:assert.match(s:hi('LightLineRight_insert_0'), s:pattern(palette.insert.right[0]))
|
call s:assert.match(s:hi('LightlineRight_insert_0'), s:pattern(palette.insert.right[0]))
|
||||||
call s:assert.match(s:hi('LightLineRight_insert_1'), s:pattern(palette.insert.right[1]))
|
call s:assert.match(s:hi('LightlineRight_insert_1'), s:pattern(palette.insert.right[1]))
|
||||||
call s:assert.match(s:hi('LightLineRight_insert_2'), s:pattern(palette.insert.right[2]))
|
call s:assert.match(s:hi('LightlineRight_insert_2'), s:pattern(palette.insert.right[2]))
|
||||||
call s:assert.match(s:hi('LightLineRight_insert_3'), 'E411: highlight group not found\|cleared')
|
call s:assert.match(s:hi('LightlineRight_insert_3'), 'E411: highlight group not found\|cleared')
|
||||||
call s:assert.match(s:hi('LightLineMiddle_insert'), s:pattern(palette.insert.middle[0]))
|
call s:assert.match(s:hi('LightlineMiddle_insert'), s:pattern(palette.insert.middle[0]))
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
@ -56,14 +56,14 @@ function! s:suite.visual()
|
||||||
call lightline#colorscheme()
|
call lightline#colorscheme()
|
||||||
call lightline#highlight('visual')
|
call lightline#highlight('visual')
|
||||||
let palette = lightline#palette()
|
let palette = lightline#palette()
|
||||||
call s:assert.match(s:hi('LightLineLeft_visual_0'), s:pattern(palette.visual.left[0]))
|
call s:assert.match(s:hi('LightlineLeft_visual_0'), s:pattern(palette.visual.left[0]))
|
||||||
call s:assert.match(s:hi('LightLineLeft_visual_1'), s:pattern(palette.visual.left[1]))
|
call s:assert.match(s:hi('LightlineLeft_visual_1'), s:pattern(palette.visual.left[1]))
|
||||||
call s:assert.match(s:hi('LightLineLeft_visual_2'), 'E411: highlight group not found\|cleared')
|
call s:assert.match(s:hi('LightlineLeft_visual_2'), 'E411: highlight group not found\|cleared')
|
||||||
call s:assert.match(s:hi('LightLineRight_visual_0'), s:pattern(palette.normal.right[0]))
|
call s:assert.match(s:hi('LightlineRight_visual_0'), s:pattern(palette.normal.right[0]))
|
||||||
call s:assert.match(s:hi('LightLineRight_visual_1'), s:pattern(palette.normal.right[1]))
|
call s:assert.match(s:hi('LightlineRight_visual_1'), s:pattern(palette.normal.right[1]))
|
||||||
call s:assert.match(s:hi('LightLineRight_visual_2'), s:pattern(palette.normal.right[2]))
|
call s:assert.match(s:hi('LightlineRight_visual_2'), s:pattern(palette.normal.right[2]))
|
||||||
call s:assert.match(s:hi('LightLineRight_visual_3'), 'E411: highlight group not found\|cleared')
|
call s:assert.match(s:hi('LightlineRight_visual_3'), 'E411: highlight group not found\|cleared')
|
||||||
call s:assert.match(s:hi('LightLineMiddle_normal'), s:pattern(palette.normal.middle[0]))
|
call s:assert.match(s:hi('LightlineMiddle_normal'), s:pattern(palette.normal.middle[0]))
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:suite.replace()
|
function! s:suite.replace()
|
||||||
|
@ -72,14 +72,14 @@ function! s:suite.replace()
|
||||||
call lightline#colorscheme()
|
call lightline#colorscheme()
|
||||||
call lightline#highlight('replace')
|
call lightline#highlight('replace')
|
||||||
let palette = lightline#palette()
|
let palette = lightline#palette()
|
||||||
call s:assert.match(s:hi('LightLineLeft_replace_0'), s:pattern(palette.replace.left[0]))
|
call s:assert.match(s:hi('LightlineLeft_replace_0'), s:pattern(palette.replace.left[0]))
|
||||||
call s:assert.match(s:hi('LightLineLeft_replace_1'), s:pattern(palette.replace.left[1]))
|
call s:assert.match(s:hi('LightlineLeft_replace_1'), s:pattern(palette.replace.left[1]))
|
||||||
call s:assert.match(s:hi('LightLineLeft_replace_2'), 'E411: highlight group not found\|cleared')
|
call s:assert.match(s:hi('LightlineLeft_replace_2'), 'E411: highlight group not found\|cleared')
|
||||||
call s:assert.match(s:hi('LightLineRight_replace_0'), s:pattern(palette.replace.right[0]))
|
call s:assert.match(s:hi('LightlineRight_replace_0'), s:pattern(palette.replace.right[0]))
|
||||||
call s:assert.match(s:hi('LightLineRight_replace_1'), s:pattern(palette.replace.right[1]))
|
call s:assert.match(s:hi('LightlineRight_replace_1'), s:pattern(palette.replace.right[1]))
|
||||||
call s:assert.match(s:hi('LightLineRight_replace_2'), s:pattern(palette.replace.right[2]))
|
call s:assert.match(s:hi('LightlineRight_replace_2'), s:pattern(palette.replace.right[2]))
|
||||||
call s:assert.match(s:hi('LightLineRight_replace_3'), 'E411: highlight group not found\|cleared')
|
call s:assert.match(s:hi('LightlineRight_replace_3'), 'E411: highlight group not found\|cleared')
|
||||||
call s:assert.match(s:hi('LightLineMiddle_replace'), s:pattern(palette.replace.middle[0]))
|
call s:assert.match(s:hi('LightlineMiddle_replace'), s:pattern(palette.replace.middle[0]))
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:suite.left_right()
|
function! s:suite.left_right()
|
||||||
|
@ -92,18 +92,18 @@ function! s:suite.left_right()
|
||||||
call lightline#init()
|
call lightline#init()
|
||||||
call lightline#colorscheme()
|
call lightline#colorscheme()
|
||||||
let palette = lightline#palette()
|
let palette = lightline#palette()
|
||||||
call s:assert.match(s:hi('LightLineLeft_normal_0'), s:pattern(palette.normal.left[0]))
|
call s:assert.match(s:hi('LightlineLeft_normal_0'), s:pattern(palette.normal.left[0]))
|
||||||
call s:assert.match(s:hi('LightLineLeft_normal_1'), s:pattern(palette.normal.left[1]))
|
call s:assert.match(s:hi('LightlineLeft_normal_1'), s:pattern(palette.normal.left[1]))
|
||||||
call s:assert.match(s:hi('LightLineLeft_normal_2'), s:pattern(palette.normal.middle[0]))
|
call s:assert.match(s:hi('LightlineLeft_normal_2'), s:pattern(palette.normal.middle[0]))
|
||||||
call s:assert.match(s:hi('LightLineLeft_normal_3'), s:pattern(palette.normal.middle[0]))
|
call s:assert.match(s:hi('LightlineLeft_normal_3'), s:pattern(palette.normal.middle[0]))
|
||||||
call s:assert.match(s:hi('LightLineLeft_normal_4'), 'E411: highlight group not found\|cleared')
|
call s:assert.match(s:hi('LightlineLeft_normal_4'), 'E411: highlight group not found\|cleared')
|
||||||
call s:assert.match(s:hi('LightLineRight_normal_0'), s:pattern(palette.normal.right[0]))
|
call s:assert.match(s:hi('LightlineRight_normal_0'), s:pattern(palette.normal.right[0]))
|
||||||
call s:assert.match(s:hi('LightLineRight_normal_1'), s:pattern(palette.normal.right[1]))
|
call s:assert.match(s:hi('LightlineRight_normal_1'), s:pattern(palette.normal.right[1]))
|
||||||
call s:assert.match(s:hi('LightLineRight_normal_2'), s:pattern(palette.normal.right[2]))
|
call s:assert.match(s:hi('LightlineRight_normal_2'), s:pattern(palette.normal.right[2]))
|
||||||
call s:assert.match(s:hi('LightLineRight_normal_3'), s:pattern(palette.normal.middle[0]))
|
call s:assert.match(s:hi('LightlineRight_normal_3'), s:pattern(palette.normal.middle[0]))
|
||||||
call s:assert.match(s:hi('LightLineRight_normal_4'), s:pattern(palette.normal.middle[0]))
|
call s:assert.match(s:hi('LightlineRight_normal_4'), s:pattern(palette.normal.middle[0]))
|
||||||
call s:assert.match(s:hi('LightLineRight_normal_5'), 'E411: highlight group not found\|cleared')
|
call s:assert.match(s:hi('LightlineRight_normal_5'), 'E411: highlight group not found\|cleared')
|
||||||
call s:assert.match(s:hi('LightLineMiddle_normal'), s:pattern(palette.normal.middle[0]))
|
call s:assert.match(s:hi('LightlineMiddle_normal'), s:pattern(palette.normal.middle[0]))
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:suite.no_components()
|
function! s:suite.no_components()
|
||||||
|
@ -120,11 +120,11 @@ function! s:suite.no_components()
|
||||||
call lightline#init()
|
call lightline#init()
|
||||||
call lightline#colorscheme()
|
call lightline#colorscheme()
|
||||||
let palette = lightline#palette()
|
let palette = lightline#palette()
|
||||||
call s:assert.match(s:hi('LightLineLeft_normal_0'), s:pattern(palette.normal.left[0]))
|
call s:assert.match(s:hi('LightlineLeft_normal_0'), s:pattern(palette.normal.left[0]))
|
||||||
call s:assert.match(s:hi('LightLineLeft_normal_1'), 'E411: highlight group not found\|cleared')
|
call s:assert.match(s:hi('LightlineLeft_normal_1'), 'E411: highlight group not found\|cleared')
|
||||||
call s:assert.match(s:hi('LightLineRight_normal_0'), s:pattern(palette.normal.right[0]))
|
call s:assert.match(s:hi('LightlineRight_normal_0'), s:pattern(palette.normal.right[0]))
|
||||||
call s:assert.match(s:hi('LightLineRight_normal_1'), 'E411: highlight group not found\|cleared')
|
call s:assert.match(s:hi('LightlineRight_normal_1'), 'E411: highlight group not found\|cleared')
|
||||||
call s:assert.match(s:hi('LightLineMiddle_normal'), s:pattern(palette.normal.middle[0]))
|
call s:assert.match(s:hi('LightlineMiddle_normal'), s:pattern(palette.normal.middle[0]))
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:suite.subseparator()
|
function! s:suite.subseparator()
|
||||||
|
@ -140,9 +140,9 @@ function! s:suite.subseparator()
|
||||||
for i in range(4)
|
for i in range(4)
|
||||||
for j in range(5)
|
for j in range(5)
|
||||||
if i + 1 == j
|
if i + 1 == j
|
||||||
call s:assert.match(s:hi(printf('LightLineLeft_normal_%s_%s', i, j)), s:pattern(get(palette.normal.left, i, palette.normal.middle[0]), get(palette.normal.left, j, palette.normal.middle[0])))
|
call s:assert.match(s:hi(printf('LightlineLeft_normal_%s_%s', i, j)), s:pattern(get(palette.normal.left, i, palette.normal.middle[0]), get(palette.normal.left, j, palette.normal.middle[0])))
|
||||||
else
|
else
|
||||||
call s:assert.match(s:hi(printf('LightLineLeft_normal_%s_%s', i, j)), 'E411: highlight group not found\|cleared')
|
call s:assert.match(s:hi(printf('LightlineLeft_normal_%s_%s', i, j)), 'E411: highlight group not found\|cleared')
|
||||||
endif
|
endif
|
||||||
endfor
|
endfor
|
||||||
endfor
|
endfor
|
||||||
|
@ -154,18 +154,18 @@ function! s:suite.component_type()
|
||||||
call lightline#colorscheme()
|
call lightline#colorscheme()
|
||||||
let palette = lightline#palette()
|
let palette = lightline#palette()
|
||||||
for type in ['error', 'warning']
|
for type in ['error', 'warning']
|
||||||
call s:assert.match(s:hi(printf('LightLineLeft_normal_%s', type)), s:pattern(palette.normal[type][0]))
|
call s:assert.match(s:hi(printf('LightlineLeft_normal_%s', type)), s:pattern(palette.normal[type][0]))
|
||||||
call s:assert.match(s:hi(printf('LightLineLeft_normal_0_%s', type)), s:pattern(palette.normal.left[0], palette.normal[type][0]))
|
call s:assert.match(s:hi(printf('LightlineLeft_normal_0_%s', type)), s:pattern(palette.normal.left[0], palette.normal[type][0]))
|
||||||
call s:assert.match(s:hi(printf('LightLineLeft_normal_1_%s', type)), s:pattern(palette.normal.left[1], palette.normal[type][0]))
|
call s:assert.match(s:hi(printf('LightlineLeft_normal_1_%s', type)), s:pattern(palette.normal.left[1], palette.normal[type][0]))
|
||||||
call s:assert.match(s:hi(printf('LightLineLeft_normal_2_%s', type)), 'E411: highlight group not found\|cleared')
|
call s:assert.match(s:hi(printf('LightlineLeft_normal_2_%s', type)), 'E411: highlight group not found\|cleared')
|
||||||
call s:assert.match(s:hi(printf('LightLineLeft_normal_%s_0', type)), s:pattern(palette.normal[type][0], palette.normal.left[0]))
|
call s:assert.match(s:hi(printf('LightlineLeft_normal_%s_0', type)), s:pattern(palette.normal[type][0], palette.normal.left[0]))
|
||||||
call s:assert.match(s:hi(printf('LightLineLeft_normal_%s_1', type)), s:pattern(palette.normal[type][0], palette.normal.left[1]))
|
call s:assert.match(s:hi(printf('LightlineLeft_normal_%s_1', type)), s:pattern(palette.normal[type][0], palette.normal.left[1]))
|
||||||
call s:assert.match(s:hi(printf('LightLineLeft_normal_%s_2', type)), s:pattern(palette.normal[type][0], palette.normal.middle[0]))
|
call s:assert.match(s:hi(printf('LightlineLeft_normal_%s_2', type)), s:pattern(palette.normal[type][0], palette.normal.middle[0]))
|
||||||
call s:assert.match(s:hi(printf('LightLineLeft_normal_%s_3', type)), 'E411: highlight group not found\|cleared')
|
call s:assert.match(s:hi(printf('LightlineLeft_normal_%s_3', type)), 'E411: highlight group not found\|cleared')
|
||||||
endfor
|
endfor
|
||||||
for type1 in ['error', 'warning']
|
for type1 in ['error', 'warning']
|
||||||
for type2 in ['error', 'warning']
|
for type2 in ['error', 'warning']
|
||||||
call s:assert.match(s:hi(printf('LightLineLeft_normal_%s_%s', type1, type2)), s:pattern(palette.normal[type1][0], palette.normal[type2][0]))
|
call s:assert.match(s:hi(printf('LightlineLeft_normal_%s_%s', type1, type2)), s:pattern(palette.normal[type1][0], palette.normal[type2][0]))
|
||||||
endfor
|
endfor
|
||||||
endfor
|
endfor
|
||||||
endfunction
|
endfunction
|
||||||
|
|
|
@ -17,50 +17,50 @@ endfunction
|
||||||
|
|
||||||
function! s:suite.link()
|
function! s:suite.link()
|
||||||
call lightline#link()
|
call lightline#link()
|
||||||
call s:assert.match(s:hi('LightLineLeft_active_0'), 'LightLineLeft_normal_0')
|
call s:assert.match(s:hi('LightlineLeft_active_0'), 'LightlineLeft_normal_0')
|
||||||
call s:assert.match(s:hi('LightLineLeft_active_1'), 'LightLineLeft_normal_1')
|
call s:assert.match(s:hi('LightlineLeft_active_1'), 'LightlineLeft_normal_1')
|
||||||
call s:assert.match(s:hi('LightLineLeft_active_2'), 'E411: highlight group not found')
|
call s:assert.match(s:hi('LightlineLeft_active_2'), 'E411: highlight group not found')
|
||||||
call s:assert.match(s:hi('LightLineRight_active_0'), 'LightLineRight_normal_0')
|
call s:assert.match(s:hi('LightlineRight_active_0'), 'LightlineRight_normal_0')
|
||||||
call s:assert.match(s:hi('LightLineRight_active_1'), 'LightLineRight_normal_1')
|
call s:assert.match(s:hi('LightlineRight_active_1'), 'LightlineRight_normal_1')
|
||||||
call s:assert.match(s:hi('LightLineRight_active_2'), 'LightLineRight_normal_2')
|
call s:assert.match(s:hi('LightlineRight_active_2'), 'LightlineRight_normal_2')
|
||||||
call s:assert.match(s:hi('LightLineRight_active_3'), 'E411: highlight group not found')
|
call s:assert.match(s:hi('LightlineRight_active_3'), 'E411: highlight group not found')
|
||||||
call s:assert.match(s:hi('LightLineMiddle_active'), 'LightLineMiddle_normal')
|
call s:assert.match(s:hi('LightlineMiddle_active'), 'LightlineMiddle_normal')
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:suite.insert()
|
function! s:suite.insert()
|
||||||
call lightline#link('i')
|
call lightline#link('i')
|
||||||
call s:assert.match(s:hi('LightLineLeft_active_0'), 'LightLineLeft_insert_0')
|
call s:assert.match(s:hi('LightlineLeft_active_0'), 'LightlineLeft_insert_0')
|
||||||
call s:assert.match(s:hi('LightLineLeft_active_1'), 'LightLineLeft_insert_1')
|
call s:assert.match(s:hi('LightlineLeft_active_1'), 'LightlineLeft_insert_1')
|
||||||
call s:assert.match(s:hi('LightLineLeft_active_2'), 'E411: highlight group not found')
|
call s:assert.match(s:hi('LightlineLeft_active_2'), 'E411: highlight group not found')
|
||||||
call s:assert.match(s:hi('LightLineRight_active_0'), 'LightLineRight_insert_0')
|
call s:assert.match(s:hi('LightlineRight_active_0'), 'LightlineRight_insert_0')
|
||||||
call s:assert.match(s:hi('LightLineRight_active_1'), 'LightLineRight_insert_1')
|
call s:assert.match(s:hi('LightlineRight_active_1'), 'LightlineRight_insert_1')
|
||||||
call s:assert.match(s:hi('LightLineRight_active_2'), 'LightLineRight_insert_2')
|
call s:assert.match(s:hi('LightlineRight_active_2'), 'LightlineRight_insert_2')
|
||||||
call s:assert.match(s:hi('LightLineRight_active_3'), 'E411: highlight group not found')
|
call s:assert.match(s:hi('LightlineRight_active_3'), 'E411: highlight group not found')
|
||||||
call s:assert.match(s:hi('LightLineMiddle_active'), 'LightLineMiddle_insert')
|
call s:assert.match(s:hi('LightlineMiddle_active'), 'LightlineMiddle_insert')
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:suite.visual()
|
function! s:suite.visual()
|
||||||
call lightline#link('v')
|
call lightline#link('v')
|
||||||
call s:assert.match(s:hi('LightLineLeft_active_0'), 'LightLineLeft_visual_0')
|
call s:assert.match(s:hi('LightlineLeft_active_0'), 'LightlineLeft_visual_0')
|
||||||
call s:assert.match(s:hi('LightLineLeft_active_1'), 'LightLineLeft_visual_1')
|
call s:assert.match(s:hi('LightlineLeft_active_1'), 'LightlineLeft_visual_1')
|
||||||
call s:assert.match(s:hi('LightLineLeft_active_2'), 'E411: highlight group not found')
|
call s:assert.match(s:hi('LightlineLeft_active_2'), 'E411: highlight group not found')
|
||||||
call s:assert.match(s:hi('LightLineRight_active_0'), 'LightLineRight_visual_0')
|
call s:assert.match(s:hi('LightlineRight_active_0'), 'LightlineRight_visual_0')
|
||||||
call s:assert.match(s:hi('LightLineRight_active_1'), 'LightLineRight_visual_1')
|
call s:assert.match(s:hi('LightlineRight_active_1'), 'LightlineRight_visual_1')
|
||||||
call s:assert.match(s:hi('LightLineRight_active_2'), 'LightLineRight_visual_2')
|
call s:assert.match(s:hi('LightlineRight_active_2'), 'LightlineRight_visual_2')
|
||||||
call s:assert.match(s:hi('LightLineRight_active_3'), 'E411: highlight group not found')
|
call s:assert.match(s:hi('LightlineRight_active_3'), 'E411: highlight group not found')
|
||||||
call s:assert.match(s:hi('LightLineMiddle_active'), 'LightLineMiddle_visual')
|
call s:assert.match(s:hi('LightlineMiddle_active'), 'LightlineMiddle_visual')
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:suite.replace()
|
function! s:suite.replace()
|
||||||
call lightline#link('R')
|
call lightline#link('R')
|
||||||
call s:assert.match(s:hi('LightLineLeft_active_0'), 'LightLineLeft_replace_0')
|
call s:assert.match(s:hi('LightlineLeft_active_0'), 'LightlineLeft_replace_0')
|
||||||
call s:assert.match(s:hi('LightLineLeft_active_1'), 'LightLineLeft_replace_1')
|
call s:assert.match(s:hi('LightlineLeft_active_1'), 'LightlineLeft_replace_1')
|
||||||
call s:assert.match(s:hi('LightLineLeft_active_2'), 'E411: highlight group not found')
|
call s:assert.match(s:hi('LightlineLeft_active_2'), 'E411: highlight group not found')
|
||||||
call s:assert.match(s:hi('LightLineRight_active_0'), 'LightLineRight_replace_0')
|
call s:assert.match(s:hi('LightlineRight_active_0'), 'LightlineRight_replace_0')
|
||||||
call s:assert.match(s:hi('LightLineRight_active_1'), 'LightLineRight_replace_1')
|
call s:assert.match(s:hi('LightlineRight_active_1'), 'LightlineRight_replace_1')
|
||||||
call s:assert.match(s:hi('LightLineRight_active_2'), 'LightLineRight_replace_2')
|
call s:assert.match(s:hi('LightlineRight_active_2'), 'LightlineRight_replace_2')
|
||||||
call s:assert.match(s:hi('LightLineRight_active_3'), 'E411: highlight group not found')
|
call s:assert.match(s:hi('LightlineRight_active_3'), 'E411: highlight group not found')
|
||||||
call s:assert.match(s:hi('LightLineMiddle_active'), 'LightLineMiddle_replace')
|
call s:assert.match(s:hi('LightlineMiddle_active'), 'LightlineMiddle_replace')
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:suite.left_right()
|
function! s:suite.left_right()
|
||||||
|
@ -73,18 +73,18 @@ function! s:suite.left_right()
|
||||||
call lightline#init()
|
call lightline#init()
|
||||||
call lightline#colorscheme()
|
call lightline#colorscheme()
|
||||||
call lightline#link()
|
call lightline#link()
|
||||||
call s:assert.match(s:hi('LightLineLeft_active_0'), 'LightLineLeft_normal_0')
|
call s:assert.match(s:hi('LightlineLeft_active_0'), 'LightlineLeft_normal_0')
|
||||||
call s:assert.match(s:hi('LightLineLeft_active_1'), 'LightLineLeft_normal_1')
|
call s:assert.match(s:hi('LightlineLeft_active_1'), 'LightlineLeft_normal_1')
|
||||||
call s:assert.match(s:hi('LightLineLeft_active_2'), 'LightLineLeft_normal_2')
|
call s:assert.match(s:hi('LightlineLeft_active_2'), 'LightlineLeft_normal_2')
|
||||||
call s:assert.match(s:hi('LightLineLeft_active_3'), 'LightLineLeft_normal_3')
|
call s:assert.match(s:hi('LightlineLeft_active_3'), 'LightlineLeft_normal_3')
|
||||||
call s:assert.match(s:hi('LightLineLeft_active_4'), 'E411: highlight group not found')
|
call s:assert.match(s:hi('LightlineLeft_active_4'), 'E411: highlight group not found')
|
||||||
call s:assert.match(s:hi('LightLineRight_active_0'), 'LightLineRight_normal_0')
|
call s:assert.match(s:hi('LightlineRight_active_0'), 'LightlineRight_normal_0')
|
||||||
call s:assert.match(s:hi('LightLineRight_active_1'), 'LightLineRight_normal_1')
|
call s:assert.match(s:hi('LightlineRight_active_1'), 'LightlineRight_normal_1')
|
||||||
call s:assert.match(s:hi('LightLineRight_active_2'), 'LightLineRight_normal_2')
|
call s:assert.match(s:hi('LightlineRight_active_2'), 'LightlineRight_normal_2')
|
||||||
call s:assert.match(s:hi('LightLineRight_active_3'), 'LightLineRight_normal_3')
|
call s:assert.match(s:hi('LightlineRight_active_3'), 'LightlineRight_normal_3')
|
||||||
call s:assert.match(s:hi('LightLineRight_active_4'), 'LightLineRight_normal_4')
|
call s:assert.match(s:hi('LightlineRight_active_4'), 'LightlineRight_normal_4')
|
||||||
call s:assert.match(s:hi('LightLineRight_active_5'), 'E411: highlight group not found')
|
call s:assert.match(s:hi('LightlineRight_active_5'), 'E411: highlight group not found')
|
||||||
call s:assert.match(s:hi('LightLineMiddle_active'), 'LightLineMiddle_normal')
|
call s:assert.match(s:hi('LightlineMiddle_active'), 'LightlineMiddle_normal')
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:suite.subseparator()
|
function! s:suite.subseparator()
|
||||||
|
@ -100,9 +100,9 @@ function! s:suite.subseparator()
|
||||||
for i in range(4)
|
for i in range(4)
|
||||||
for j in range(5)
|
for j in range(5)
|
||||||
if i + 1 == j
|
if i + 1 == j
|
||||||
call s:assert.match(s:hi(printf('LightLineLeft_active_%s_%s', i, j)), printf('LightLineLeft_normal_%s_%s', i, j))
|
call s:assert.match(s:hi(printf('LightlineLeft_active_%s_%s', i, j)), printf('LightlineLeft_normal_%s_%s', i, j))
|
||||||
else
|
else
|
||||||
call s:assert.match(s:hi(printf('LightLineLeft_active_%s_%s', i, j)), 'E411: highlight group not found')
|
call s:assert.match(s:hi(printf('LightlineLeft_active_%s_%s', i, j)), 'E411: highlight group not found')
|
||||||
endif
|
endif
|
||||||
endfor
|
endfor
|
||||||
endfor
|
endfor
|
||||||
|
@ -114,18 +114,18 @@ function! s:suite.component_type()
|
||||||
call lightline#colorscheme()
|
call lightline#colorscheme()
|
||||||
call lightline#link()
|
call lightline#link()
|
||||||
for type in ['error', 'warning']
|
for type in ['error', 'warning']
|
||||||
call s:assert.match(s:hi(printf('LightLineLeft_active_%s', type)), printf('LightLineLeft_normal_%s', type))
|
call s:assert.match(s:hi(printf('LightlineLeft_active_%s', type)), printf('LightlineLeft_normal_%s', type))
|
||||||
call s:assert.match(s:hi(printf('LightLineLeft_active_0_%s', type)), printf('LightLineLeft_normal_0_%s', type))
|
call s:assert.match(s:hi(printf('LightlineLeft_active_0_%s', type)), printf('LightlineLeft_normal_0_%s', type))
|
||||||
call s:assert.match(s:hi(printf('LightLineLeft_active_1_%s', type)), printf('LightLineLeft_normal_1_%s', type))
|
call s:assert.match(s:hi(printf('LightlineLeft_active_1_%s', type)), printf('LightlineLeft_normal_1_%s', type))
|
||||||
call s:assert.match(s:hi(printf('LightLineLeft_active_2_%s', type)), 'E411: highlight group not found')
|
call s:assert.match(s:hi(printf('LightlineLeft_active_2_%s', type)), 'E411: highlight group not found')
|
||||||
call s:assert.match(s:hi(printf('LightLineLeft_active_%s_0', type)), printf('LightLineLeft_normal_%s_0', type))
|
call s:assert.match(s:hi(printf('LightlineLeft_active_%s_0', type)), printf('LightlineLeft_normal_%s_0', type))
|
||||||
call s:assert.match(s:hi(printf('LightLineLeft_active_%s_1', type)), printf('LightLineLeft_normal_%s_1', type))
|
call s:assert.match(s:hi(printf('LightlineLeft_active_%s_1', type)), printf('LightlineLeft_normal_%s_1', type))
|
||||||
call s:assert.match(s:hi(printf('LightLineLeft_active_%s_2', type)), printf('LightLineLeft_normal_%s_2', type))
|
call s:assert.match(s:hi(printf('LightlineLeft_active_%s_2', type)), printf('LightlineLeft_normal_%s_2', type))
|
||||||
call s:assert.match(s:hi(printf('LightLineLeft_active_%s_3', type)), 'E411: highlight group not found')
|
call s:assert.match(s:hi(printf('LightlineLeft_active_%s_3', type)), 'E411: highlight group not found')
|
||||||
endfor
|
endfor
|
||||||
for type1 in ['error', 'warning']
|
for type1 in ['error', 'warning']
|
||||||
for type2 in ['error', 'warning']
|
for type2 in ['error', 'warning']
|
||||||
call s:assert.match(s:hi(printf('LightLineLeft_active_%s_%s', type1, type2)), printf('LightLineLeft_normal_%s_%s', type1, type2))
|
call s:assert.match(s:hi(printf('LightlineLeft_active_%s_%s', type1, type2)), printf('LightlineLeft_normal_%s_%s', type1, type2))
|
||||||
endfor
|
endfor
|
||||||
endfor
|
endfor
|
||||||
endfunction
|
endfunction
|
||||||
|
|
|
@ -97,9 +97,9 @@ let errorformat =
|
||||||
\ '%-G%.%#'
|
\ '%-G%.%#'
|
||||||
```
|
```
|
||||||
|
|
||||||
[bug_tracker]: https://github.com/scrooloose/syntastic/issues
|
[bug_tracker]: https://github.com/vim-syntastic/syntastic/issues
|
||||||
[manual]: https://github.com/scrooloose/syntastic/blob/master/doc/syntastic.txt
|
[manual]: https://github.com/vim-syntastic/syntastic/blob/master/doc/syntastic.txt
|
||||||
[github]: https://github.com/scrooloose/syntastic
|
[github]: https://github.com/vim-syntastic/syntastic
|
||||||
[branches]: https://github.com/dchelimsky/rspec/wiki/Topic-Branches#using-topic-branches-when-contributing-patches
|
[branches]: https://github.com/dchelimsky/rspec/wiki/Topic-Branches#using-topic-branches-when-contributing-patches
|
||||||
[variables]: http://www.refactoring.com/catalog/extractVariable.html
|
[variables]: http://www.refactoring.com/catalog/extractVariable.html
|
||||||
[guide]: https://github.com/scrooloose/syntastic/wiki/Syntax-Checker-Guide
|
[guide]: https://github.com/vim-syntastic/syntastic/wiki/Syntax-Checker-Guide
|
||||||
|
|
|
@ -49,11 +49,12 @@
|
||||||
|
|
||||||
## 1\. Introduction
|
## 1\. Introduction
|
||||||
|
|
||||||
Syntastic is a syntax checking plugin for [Vim][vim] that runs files through
|
Syntastic is a syntax checking plugin for [Vim][vim] created by
|
||||||
external syntax checkers and displays any resulting errors to the user. This
|
[Martin Grenfell][scrooloose]. It runs files through external syntax checkers
|
||||||
can be done on demand, or automatically as files are saved. If syntax errors
|
and displays any resulting errors to the user. This can be done on demand, or
|
||||||
are detected, the user is notified and is happy because they didn't have to
|
automatically as files are saved. If syntax errors are detected, the user is
|
||||||
compile their code or execute their script to find them.
|
notified and is happy because they didn't have to compile their code or execute
|
||||||
|
their script to find them.
|
||||||
|
|
||||||
At the time of this writing, syntastic has checking plugins for ACPI
|
At the time of this writing, syntastic has checking plugins for ACPI
|
||||||
Source Language, ActionScript, Ada, Ansible configurations, API Blueprint,
|
Source Language, ActionScript, Ada, Ansible configurations, API Blueprint,
|
||||||
|
@ -153,7 +154,7 @@ You now have pathogen installed and can put syntastic into `~/.vim/bundle` like
|
||||||
this:
|
this:
|
||||||
```sh
|
```sh
|
||||||
cd ~/.vim/bundle && \
|
cd ~/.vim/bundle && \
|
||||||
git clone --depth=1 https://github.com/scrooloose/syntastic.git
|
git clone --depth=1 https://github.com/vim-syntastic/syntastic.git
|
||||||
```
|
```
|
||||||
Quit vim and start it back up to reload it, then type:
|
Quit vim and start it back up to reload it, then type:
|
||||||
```vim
|
```vim
|
||||||
|
@ -501,15 +502,16 @@ plugins that provide more functionality than syntastic. You might want to take
|
||||||
a look at [ghcmod-vim][ghcmod], [jedi-vim][jedi], [python-mode][python_mode], [vim-go][vimgo], or
|
a look at [ghcmod-vim][ghcmod], [jedi-vim][jedi], [python-mode][python_mode], [vim-go][vimgo], or
|
||||||
[YouCompleteMe][ycm].
|
[YouCompleteMe][ycm].
|
||||||
|
|
||||||
[screenshot]: https://github.com/scrooloose/syntastic/raw/master/_assets/screenshot_1.png
|
[scrooloose]: https://github.com/scrooloose
|
||||||
|
[screenshot]: https://github.com/vim-syntastic/syntastic/raw/master/_assets/screenshot_1.png
|
||||||
|
|
||||||
[bug_tracker]: https://github.com/scrooloose/syntastic/issues
|
[bug_tracker]: https://github.com/vim-syntastic/syntastic/issues
|
||||||
[checkers]: https://github.com/scrooloose/syntastic/blob/master/doc/syntastic-checkers.txt
|
[checkers]: https://github.com/vim-syntastic/syntastic/blob/master/doc/syntastic-checkers.txt
|
||||||
[crystal]: https://github.com/rhysd/vim-crystal
|
[crystal]: https://github.com/rhysd/vim-crystal
|
||||||
[eastwood]: https://github.com/venantius/vim-eastwood
|
[eastwood]: https://github.com/venantius/vim-eastwood
|
||||||
[ghcmod]: https://github.com/eagletmt/ghcmod-vim
|
[ghcmod]: https://github.com/eagletmt/ghcmod-vim
|
||||||
[google_group]: https://groups.google.com/group/vim-syntastic
|
[google_group]: https://groups.google.com/group/vim-syntastic
|
||||||
[guide]: https://github.com/scrooloose/syntastic/wiki/Syntax-Checker-Guide
|
[guide]: https://github.com/vim-syntastic/syntastic/wiki/Syntax-Checker-Guide
|
||||||
[jedi]: https://github.com/davidhalter/jedi-vim
|
[jedi]: https://github.com/davidhalter/jedi-vim
|
||||||
[merlin]: https://github.com/the-lambda-church/merlin
|
[merlin]: https://github.com/the-lambda-church/merlin
|
||||||
[myint]: https://github.com/myint/syntastic-extras
|
[myint]: https://github.com/myint/syntastic-extras
|
||||||
|
|
|
@ -37,8 +37,24 @@ function! syntastic#util#system(command) abort " {{{2
|
||||||
let $LC_MESSAGES = 'C'
|
let $LC_MESSAGES = 'C'
|
||||||
let $LC_ALL = ''
|
let $LC_ALL = ''
|
||||||
|
|
||||||
|
let crashed = 0
|
||||||
let cmd_start = reltime()
|
let cmd_start = reltime()
|
||||||
|
try
|
||||||
let out = system(a:command)
|
let out = system(a:command)
|
||||||
|
catch
|
||||||
|
let crashed = 1
|
||||||
|
call syntastic#log#error('exception running system(' . string(a:command) . '): ' . v:exception)
|
||||||
|
if syntastic#util#isRunningWindows()
|
||||||
|
call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, '$TMP = ' . string($TMP) . ', $TEMP = ' . string($TEMP))
|
||||||
|
else
|
||||||
|
call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, '$TERM = ' . string($TERM))
|
||||||
|
call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, '$TMPDIR = ' . string($TMPDIR))
|
||||||
|
endif
|
||||||
|
call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, '$PATH = ' . string($PATH))
|
||||||
|
call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, 'getcwd() = ' . string(getcwd()))
|
||||||
|
call syntastic#log#debugShowOptions(g:_SYNTASTIC_DEBUG_TRACE, g:_SYNTASTIC_SHELL_OPTIONS)
|
||||||
|
let out = ''
|
||||||
|
endtry
|
||||||
let cmd_time = split(reltimestr(reltime(cmd_start)))[0]
|
let cmd_time = split(reltimestr(reltime(cmd_start)))[0]
|
||||||
|
|
||||||
let $LC_ALL = old_lc_all
|
let $LC_ALL = old_lc_all
|
||||||
|
@ -46,7 +62,7 @@ function! syntastic#util#system(command) abort " {{{2
|
||||||
|
|
||||||
let &shell = old_shell
|
let &shell = old_shell
|
||||||
|
|
||||||
if exists('g:_SYNTASTIC_DEBUG_TRACE')
|
if !crashed && exists('g:_SYNTASTIC_DEBUG_TRACE')
|
||||||
call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, 'system: command run in ' . cmd_time . 's')
|
call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, 'system: command run in ' . cmd_time . 's')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
|
@ -2009,7 +2009,7 @@ Security~
|
||||||
|
|
||||||
This checker executes the code in the files it checks:
|
This checker executes the code in the files it checks:
|
||||||
|
|
||||||
https://github.com/scrooloose/syntastic/issues/1141
|
https://github.com/vim-syntastic/syntastic/issues/1141
|
||||||
|
|
||||||
This is probably fine if you wrote the files yourself, but it can be a problem
|
This is probably fine if you wrote the files yourself, but it can be a problem
|
||||||
if you're trying to check third party files. If you are 100% willing to let
|
if you're trying to check third party files. If you are 100% willing to let
|
||||||
|
@ -2277,6 +2277,13 @@ Type: string
|
||||||
Default: unset
|
Default: unset
|
||||||
Additional arguments to pass to "cgc".
|
Additional arguments to pass to "cgc".
|
||||||
|
|
||||||
|
Note~
|
||||||
|
|
||||||
|
You probably also need a plugin to set |filetype| for OpenGL files, such as
|
||||||
|
"vim-glsl":
|
||||||
|
|
||||||
|
https://github.com/tikhomirov/vim-glsl
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
SYNTAX CHECKERS FOR GO *syntastic-checkers-go*
|
SYNTAX CHECKERS FOR GO *syntastic-checkers-go*
|
||||||
|
|
||||||
|
@ -2385,7 +2392,7 @@ Maintainer: Kamil Kisiel <kamil@kamilkisiel.net>
|
||||||
|
|
||||||
See the tool's documentation for details:
|
See the tool's documentation for details:
|
||||||
|
|
||||||
https://godoc.org/golang.org/x/tools/cmd/vet
|
https://godoc.org/cmd/vet
|
||||||
|
|
||||||
Note~
|
Note~
|
||||||
|
|
||||||
|
@ -5123,7 +5130,7 @@ Security~
|
||||||
|
|
||||||
This checker executes the code in the files it checks:
|
This checker executes the code in the files it checks:
|
||||||
|
|
||||||
https://github.com/scrooloose/syntastic/issues/1773
|
https://github.com/vim-syntastic/syntastic/issues/1773
|
||||||
|
|
||||||
This is probably fine if you wrote the files yourself, but it can be a problem
|
This is probably fine if you wrote the files yourself, but it can be a problem
|
||||||
if you're trying to check third party files. If you are 100% willing to let
|
if you're trying to check third party files. If you are 100% willing to let
|
||||||
|
@ -6010,7 +6017,7 @@ Maintainer: LCD 47 <lcd047@gmail.com>
|
||||||
"Stylint" is a linter for Stylus (http://learnboost.github.io/stylus). See
|
"Stylint" is a linter for Stylus (http://learnboost.github.io/stylus). See
|
||||||
the project's page at GitHub for details:
|
the project's page at GitHub for details:
|
||||||
|
|
||||||
https://github.com/rossPatton/stylint
|
https://github.com/SimenB/stylint
|
||||||
|
|
||||||
Checker options~
|
Checker options~
|
||||||
|
|
||||||
|
|
|
@ -85,7 +85,7 @@ Take a look at the list of supported filetypes and checkers: |syntastic-checkers
|
||||||
Note: This doc only deals with using syntastic. To learn how to write syntax
|
Note: This doc only deals with using syntastic. To learn how to write syntax
|
||||||
checker integrations, see the guide on the GitHub wiki:
|
checker integrations, see the guide on the GitHub wiki:
|
||||||
|
|
||||||
https://github.com/scrooloose/syntastic/wiki/Syntax-Checker-Guide
|
https://github.com/vim-syntastic/syntastic/wiki/Syntax-Checker-Guide
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
1.1. Quick start *syntastic-quickstart*
|
1.1. Quick start *syntastic-quickstart*
|
||||||
|
@ -1196,7 +1196,7 @@ The core maintainers of syntastic are:
|
||||||
|
|
||||||
Find the latest version of syntastic at:
|
Find the latest version of syntastic at:
|
||||||
|
|
||||||
http://github.com/scrooloose/syntastic
|
http://github.com/vim-syntastic/syntastic
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
9. License *syntastic-license*
|
9. License *syntastic-license*
|
||||||
|
|
|
@ -19,7 +19,7 @@ if has('reltime')
|
||||||
lockvar! g:_SYNTASTIC_START
|
lockvar! g:_SYNTASTIC_START
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let g:_SYNTASTIC_VERSION = '3.8.0-3'
|
let g:_SYNTASTIC_VERSION = '3.8.0-10'
|
||||||
lockvar g:_SYNTASTIC_VERSION
|
lockvar g:_SYNTASTIC_VERSION
|
||||||
|
|
||||||
" Sanity checks {{{1
|
" Sanity checks {{{1
|
||||||
|
@ -126,7 +126,7 @@ endif
|
||||||
|
|
||||||
" Debug {{{1
|
" Debug {{{1
|
||||||
|
|
||||||
let s:_DEBUG_DUMP_OPTIONS = [
|
let g:_SYNTASTIC_SHELL_OPTIONS = [
|
||||||
\ 'shell',
|
\ 'shell',
|
||||||
\ 'shellcmdflag',
|
\ 'shellcmdflag',
|
||||||
\ 'shellpipe',
|
\ 'shellpipe',
|
||||||
|
@ -142,10 +142,10 @@ for s:feature in [
|
||||||
\ ]
|
\ ]
|
||||||
|
|
||||||
if exists('+' . s:feature)
|
if exists('+' . s:feature)
|
||||||
call add(s:_DEBUG_DUMP_OPTIONS, s:feature)
|
call add(g:_SYNTASTIC_SHELL_OPTIONS, s:feature)
|
||||||
endif
|
endif
|
||||||
endfor
|
endfor
|
||||||
lockvar! s:_DEBUG_DUMP_OPTIONS
|
lockvar! g:_SYNTASTIC_SHELL_OPTIONS
|
||||||
|
|
||||||
" debug constants
|
" debug constants
|
||||||
let g:_SYNTASTIC_DEBUG_TRACE = 1
|
let g:_SYNTASTIC_DEBUG_TRACE = 1
|
||||||
|
@ -231,7 +231,7 @@ function! SyntasticInfo(...) abort " {{{2
|
||||||
call s:modemap.modeInfo(a:000)
|
call s:modemap.modeInfo(a:000)
|
||||||
call s:registry.echoInfoFor(a:000)
|
call s:registry.echoInfoFor(a:000)
|
||||||
call s:_explain_skip(a:000)
|
call s:_explain_skip(a:000)
|
||||||
call syntastic#log#debugShowOptions(g:_SYNTASTIC_DEBUG_TRACE, s:_DEBUG_DUMP_OPTIONS)
|
call syntastic#log#debugShowOptions(g:_SYNTASTIC_DEBUG_TRACE, g:_SYNTASTIC_SHELL_OPTIONS)
|
||||||
call syntastic#log#debugDump(g:_SYNTASTIC_DEBUG_VARIABLES)
|
call syntastic#log#debugDump(g:_SYNTASTIC_DEBUG_VARIABLES)
|
||||||
endfunction " }}}2
|
endfunction " }}}2
|
||||||
|
|
||||||
|
@ -382,7 +382,7 @@ endfunction " }}}2
|
||||||
"refresh and redraw all the error info for this buf when saving or reading
|
"refresh and redraw all the error info for this buf when saving or reading
|
||||||
function! s:UpdateErrors(buf, auto_invoked, checker_names) abort " {{{2
|
function! s:UpdateErrors(buf, auto_invoked, checker_names) abort " {{{2
|
||||||
call syntastic#log#debugShowVariables(g:_SYNTASTIC_DEBUG_TRACE, 'version')
|
call syntastic#log#debugShowVariables(g:_SYNTASTIC_DEBUG_TRACE, 'version')
|
||||||
call syntastic#log#debugShowOptions(g:_SYNTASTIC_DEBUG_TRACE, s:_DEBUG_DUMP_OPTIONS)
|
call syntastic#log#debugShowOptions(g:_SYNTASTIC_DEBUG_TRACE, g:_SYNTASTIC_SHELL_OPTIONS)
|
||||||
call syntastic#log#debugDump(g:_SYNTASTIC_DEBUG_VARIABLES)
|
call syntastic#log#debugDump(g:_SYNTASTIC_DEBUG_VARIABLES)
|
||||||
call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, 'UpdateErrors' . (a:auto_invoked ? ' (auto)' : '') .
|
call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, 'UpdateErrors' . (a:auto_invoked ? ' (auto)' : '') .
|
||||||
\ ': ' . (len(a:checker_names) ? join(a:checker_names) : 'default checkers'))
|
\ ': ' . (len(a:checker_names) ? join(a:checker_names) : 'default checkers'))
|
||||||
|
@ -455,7 +455,12 @@ function! s:CacheErrors(buf, checker_names) abort " {{{2
|
||||||
if !s:_skip_file(a:buf)
|
if !s:_skip_file(a:buf)
|
||||||
" debug logging {{{3
|
" debug logging {{{3
|
||||||
call syntastic#log#debugShowVariables(g:_SYNTASTIC_DEBUG_TRACE, 'aggregate_errors')
|
call syntastic#log#debugShowVariables(g:_SYNTASTIC_DEBUG_TRACE, 'aggregate_errors')
|
||||||
|
if syntastic#util#isRunningWindows()
|
||||||
|
call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, '$TMP = ' . string($TMP) . ', $TEMP = ' . string($TEMP))
|
||||||
|
else
|
||||||
call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, '$TERM = ' . string($TERM))
|
call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, '$TERM = ' . string($TERM))
|
||||||
|
call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, '$TMPDIR = ' . string($TMPDIR))
|
||||||
|
endif
|
||||||
call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, '$PATH = ' . string($PATH))
|
call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, '$PATH = ' . string($PATH))
|
||||||
call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, 'getcwd() = ' . string(getcwd()))
|
call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, 'getcwd() = ' . string(getcwd()))
|
||||||
" }}}3
|
" }}}3
|
||||||
|
|
|
@ -19,13 +19,25 @@ let s:save_cpo = &cpo
|
||||||
set cpo&vim
|
set cpo&vim
|
||||||
|
|
||||||
function! SyntaxCheckers_stylus_stylint_GetLocList() dict
|
function! SyntaxCheckers_stylus_stylint_GetLocList() dict
|
||||||
|
if !exists('s:stylint_new')
|
||||||
|
let s:stylint_new = syntastic#util#versionIsAtLeast(self.getVersion(), [1, 5, 7])
|
||||||
|
endif
|
||||||
|
|
||||||
let makeprg = self.makeprgBuild({})
|
let makeprg = self.makeprgBuild({})
|
||||||
|
|
||||||
|
if s:stylint_new
|
||||||
|
let errorformat =
|
||||||
|
\ '%P%f,' .
|
||||||
|
\ '%-Q,' .
|
||||||
|
\ '%\m%l:%c%\s%\+%t%\%%(rror%\|arning%\)%\s%\+%m%\s%\+%\S%\+%\s%#,' .
|
||||||
|
\ '%\m%l%\s%\+%t%\%%(rror%\|arning%\)%\s%\+%m%\s%\+%\S%\+%\s%#'
|
||||||
|
else
|
||||||
let errorformat =
|
let errorformat =
|
||||||
\ '%WWarning: %m,' .
|
\ '%WWarning: %m,' .
|
||||||
\ '%EError: %m,' .
|
\ '%EError: %m,' .
|
||||||
\ '%CFile: %f,' .
|
\ '%CFile: %f,' .
|
||||||
\ '%CLine: %l:%.%#'
|
\ '%CLine: %l:%.%#'
|
||||||
|
endif
|
||||||
|
|
||||||
return SyntasticMake({
|
return SyntasticMake({
|
||||||
\ 'makeprg': makeprg,
|
\ 'makeprg': makeprg,
|
||||||
|
|
|
@ -2321,7 +2321,7 @@ function! s:Browse(bang,line1,count,...) abort
|
||||||
if empty(url) && raw ==# '.'
|
if empty(url) && raw ==# '.'
|
||||||
call s:throw("Instaweb failed to start")
|
call s:throw("Instaweb failed to start")
|
||||||
elseif empty(url)
|
elseif empty(url)
|
||||||
call s:throw('"'.remote."' is not a supported remote")
|
call s:throw("'".remote."' is not a supported remote")
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let url = s:gsub(url, '[ <>]', '\="%".printf("%02X",char2nr(submatch(0)))')
|
let url = s:gsub(url, '[ <>]', '\="%".printf("%02X",char2nr(submatch(0)))')
|
||||||
|
|
|
@ -1,16 +1,14 @@
|
||||||
### Actual behavior
|
### Behavior
|
||||||
|
|
||||||
Write here what's happening ...
|
Write here what's happening and what you're expecting instead of...
|
||||||
|
|
||||||
### Expected behavior
|
|
||||||
|
|
||||||
Write here what you're expecting ...
|
|
||||||
|
|
||||||
### Steps to reproduce:
|
### Steps to reproduce:
|
||||||
|
|
||||||
Please create a reproducible case of your problem. Re produce it
|
Please create a reproducible case of your problem. If this step is
|
||||||
with a minimal `vimrc` with all plugins disabled and only `vim-go`
|
not provided, the issue will be **closed**
|
||||||
enabled:
|
|
||||||
|
Re produce it with a minimal `vimrc` with all plugins disabled and
|
||||||
|
only `vim-go` enabled:
|
||||||
|
|
||||||
1.
|
1.
|
||||||
2.
|
2.
|
||||||
|
@ -23,6 +21,6 @@ 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:
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,123 @@
|
||||||
## Unplanned
|
## 1.11 - Unplanned
|
||||||
|
|
||||||
* 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.
|
FEATURES:
|
||||||
|
|
||||||
|
* Add new `g:go_updatetime` setting to change the default updatetime (which was hardcoded previously) [gh-1055]
|
||||||
|
* Add new `g:go_template_use_pkg` setting to enable to use cwd as package name instead of basic template file [gh-1124]
|
||||||
|
|
||||||
IMPROVEMENTS:
|
IMPROVEMENTS:
|
||||||
|
|
||||||
* Function calls are now highligted as wel when `g:go_highlight_functions` is enabled [gh-1048]
|
* Add `statusline` support for `:GoMetaLinter` [gh-1120]
|
||||||
* Add completion support for uninported packages. This allows to complete even if the package is not improted [gh-1084]
|
* Quickfix and Location lists contain now a descriptive title (requires at least Vim `7.4.2200`)[gh-1004]
|
||||||
* Tools that embeds GOROOT into their binaries do not work when people update their Go version and the GOROOT contains the vesion as part of their path (i.e: `/usr/local/Cellar/go/1.7.2/libexec`, [more info](https://blog.filippo.io/stale-goroot-and-gorebuild/)) . This is now fixed by introducing automatic GOROOT set/unset before each tool invoke. [gh-954]
|
|
||||||
|
BUG FIXES:
|
||||||
|
|
||||||
|
* Always use full path to detect packages to be shown in statusline [gh-1121]
|
||||||
|
* Use `echom` to persist errors in case of multiple echos [gh-1122]
|
||||||
|
* Fix a race condition where a quickfix window was not closed if a job has succeeded [gh-1123]
|
||||||
|
* Do not expand coverage arguments for non job execution of `:GoCoverage` [gh-1127]
|
||||||
|
* `:GoCoverage` doesn't mess up custom syntax anymore [gh-1128]
|
||||||
|
* Disable autoformat for `asm` files as they might be non Go ASM format [gh-1141]
|
||||||
|
* Fix indentation broken when using a action with a minus sign like `{{-` [gh-1143]
|
||||||
|
* Fix breaking Neovim change of passing less arguments to callbacks [gh-1145]
|
||||||
|
* Fix `guru` commands if custom build tags were set [gh-1136]
|
||||||
|
* Fix referencing a non defined variable for async commands when bang (!) was used
|
||||||
|
* Fix `:GoDef` failing for a modified buffer if `hidden` was not set [gh-1132]
|
||||||
|
* Fix `:GoDefStack` to allow popping from jump list when buffer is modified [gh-1133]
|
||||||
|
|
||||||
|
|
||||||
|
## 1.10 (November 24, 2016)
|
||||||
|
|
||||||
|
FEATURES:
|
||||||
|
|
||||||
|
* **Vim 8.0 support!** This is the initial version to add Vim 8.0 based support to
|
||||||
|
all basic commands (check out below for more information). With time we'll
|
||||||
|
going to extend it to other commands. All the features are only enabled if
|
||||||
|
you have at least Vim 8.0.0087. Backwards compatible with Vim 7.4.x.
|
||||||
|
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.
|
||||||
|
* `:GoBuild`, `:GoTest`, `:GoTestCompile`, `:GoInstall` commands are now fully
|
||||||
|
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
|
||||||
|
(more info below)
|
||||||
|
|
||||||
|
* `:GoCoverage` and `:GoCoverageBrowser` commands are fully async.
|
||||||
|
* `:GoDef` is fully async if `guru` is used as command.
|
||||||
|
* `:GoRename` is fully async .
|
||||||
|
|
||||||
|
* `:GoMetaLinter` is fully asnyc. Also works with the current autosave linting
|
||||||
|
feature. As a reminder, to enable auto linting on save either call
|
||||||
|
`:GoMetaLinterAutoSaveToggle` (temporary) or add `let
|
||||||
|
g:go_metalinter_autosave = 1` (persistent) to your virmc).
|
||||||
|
|
||||||
|
* All `guru` commands run asynchronously if Vim 8.0 is being used. Current
|
||||||
|
Commands:
|
||||||
|
* GoImplements
|
||||||
|
* GoWhicherrs
|
||||||
|
* GoCallees
|
||||||
|
* GoDescribe
|
||||||
|
* GoCallers
|
||||||
|
* GoCallstack
|
||||||
|
* GoFreevars
|
||||||
|
* GoChannelPeers
|
||||||
|
* GoReferrers
|
||||||
|
|
||||||
|
* `:GoSameIds` also runs asynchronously. This makes it useful especially for
|
||||||
|
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
|
||||||
|
reminder, to enable auto info either call `:GoSameIdsAutoToggle`(temporary)
|
||||||
|
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
|
||||||
|
`g:go_info_mode`. This makes it useful especially for autoinfo mode. In this
|
||||||
|
mode it constantly evaluates the identifier under the cursor whenever it's in
|
||||||
|
hold position and then calls :GoInfo. As a reminder, to enable auto info
|
||||||
|
either call `:GoAutoTypeInfoToggle`(temporary) or add `let
|
||||||
|
g:go_auto_type_info = 1` (persistent) to your vimrc. To use `guru` instead of
|
||||||
|
`gocode` add following to your vimrc: `let g:go_info_mode = 'guru'`
|
||||||
|
|
||||||
|
The `guru` is more accurate and reliabed due the usage of `guru` describe. It
|
||||||
|
doesn't rely on `pkg/` folder like `gocode` does. However it's slower than
|
||||||
|
`gocode` as there is no caching mechanism in `guru` yet.
|
||||||
|
|
||||||
|
* **New**: Statusline function: `go#statusline#Show()` which can be plugged into
|
||||||
|
the statusline bar. Works only with vim 8.0. It shows all asynchronously
|
||||||
|
called functions status real time. Checkout it in action:
|
||||||
|
https://twitter.com/fatih/status/800473735467847680. To enable it add the
|
||||||
|
following to your `vimrc`. If you use lightline, airline, .. check out their
|
||||||
|
respective documentation on how to add a custom function:
|
||||||
|
|
||||||
|
```viml
|
||||||
|
" go command status (requires vim-go)
|
||||||
|
set statusline+=%#goStatuslineColor#
|
||||||
|
set statusline+=%{go#statusline#Show()}
|
||||||
|
set statusline+=%*
|
||||||
|
```
|
||||||
|
|
||||||
|
IMPROVEMENTS:
|
||||||
|
|
||||||
|
* **:GoDocBrowser** is now capable to to understand the identifier under the cursor (just like :GoDoc)
|
||||||
|
* Function calls are now highlighted as well when `g:go_highlight_functions` is enabled [gh-1048]
|
||||||
|
* Add completion support for un-imported packages. This allows to complete even
|
||||||
|
if the package is not imported. By default it's disabled, enable by adding
|
||||||
|
`let g:go_gocode_unimported_packages = 1` [gh-1084]
|
||||||
|
* Tools that embeds GOROOT into their binaries do not work when people update
|
||||||
|
their Go version and the GOROOT contains the vesion as part of their path
|
||||||
|
(i.e: `/usr/local/Cellar/go/1.7.2/libexec`, [more
|
||||||
|
info](https://blog.filippo.io/stale-goroot-and-gorebuild/)) . This is now
|
||||||
|
fixed by introducing automatic GOROOT set/unset before each tool invoke.
|
||||||
|
[gh-954]
|
||||||
|
* Added new setting `g:go_echo_go_info` to enable/disable printing identifier
|
||||||
|
information when completion is done [gh-1101]
|
||||||
|
* Added new `go_echo_command_info` setting is added, which is enabled by
|
||||||
|
default. It's just a switch for disabling messages of commands, such as
|
||||||
|
`:GoBuild`, `:GoTest`, etc.. Useful to *disable* if `go#statusline#Show()` is
|
||||||
|
being used in Statusline, to prevent to see duplicates notifications.
|
||||||
|
* goSameId highlighting is now linked to `Search`, which is much more clear as
|
||||||
|
it changes according to the users colorscheme
|
||||||
|
* Add plug mapping `(go-lint)` for :GoLint [gh-1089]
|
||||||
|
|
||||||
|
|
||||||
BUG FIXES:
|
BUG FIXES:
|
||||||
|
|
||||||
|
@ -16,6 +127,17 @@ BUG FIXES:
|
||||||
* Highlight nested structs correctly [gh-1075]
|
* Highlight nested structs correctly [gh-1075]
|
||||||
* Highlight builtin functions correctly if `g:go_highlight_functions` is enabled [gh-1070]
|
* Highlight builtin functions correctly if `g:go_highlight_functions` is enabled [gh-1070]
|
||||||
* Fix `:GoSameIds` highlighting if a new buffer is opened in the same window [gh-1067]
|
* Fix `:GoSameIds` highlighting if a new buffer is opened in the same window [gh-1067]
|
||||||
|
* Internal: add `abort` to all vim function to return in case of errors [gh-1100]
|
||||||
|
* Fix `:GoCoverage` to be executed if working dir is not inside the test dir [gh-1033]
|
||||||
|
|
||||||
|
BACKWARDS INCOMPATIBILITIES:
|
||||||
|
|
||||||
|
* remove vim-dispatch and vimproc.vim support. vim 8.0 has now the necessary
|
||||||
|
API to invoke async jobs and timers. Going forward we should use those. Also
|
||||||
|
this will remove the burden to maintain compatibility with those plugins.
|
||||||
|
|
||||||
|
* `go#jobcontrol#Statusline()` is removed in favor of the new, global and
|
||||||
|
extensible `go#statusline#Show()`
|
||||||
|
|
||||||
## 1.9 (September 13, 2016)
|
## 1.9 (September 13, 2016)
|
||||||
|
|
||||||
|
|
|
@ -46,10 +46,8 @@ disabled/enabled easily.
|
||||||
* Custom vim text objects such as `a function` or `inner function`
|
* Custom vim text objects such as `a function` or `inner function`
|
||||||
list.
|
list.
|
||||||
* Jump to function or type declarations with `:GoDecls` or `:GoDeclsDir`
|
* Jump to function or type declarations with `:GoDecls` or `:GoDeclsDir`
|
||||||
* A async launcher for the go command is implemented for Neovim, fully async
|
* Vim 8.0 support. Async execution for most commands, various underlying improvements.
|
||||||
building and testing (beta).
|
* NeoVim support (beta). Async execution for some commands.
|
||||||
* Integrated with the Neovim terminal, launch `:GoRun` and other go commands
|
|
||||||
in their own new terminal. (beta)
|
|
||||||
* Alternate between implementation and test code with `:GoAlternate`
|
* Alternate between implementation and test code with `:GoAlternate`
|
||||||
|
|
||||||
Checkout the official [tutorial](https://github.com/fatih/vim-go-tutorial)
|
Checkout the official [tutorial](https://github.com/fatih/vim-go-tutorial)
|
||||||
|
@ -237,9 +235,10 @@ 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 bugs but I'm not going to look at them. Even though I'm using Neovim
|
to open bug, however I'm not using Neovim so it's hard for me to test it.
|
||||||
myself, Neovim itself is still alpha. So vim-go might not work well as good as
|
vim-go might not work well as good as in Vim. I'm happy to accept pull requests
|
||||||
in Vim. I'm happy to accept pull requests or very detailed bug reports.
|
or very detailed bug reports. If you're interested to improve the state of
|
||||||
|
Neovim in vim-go you're always welcome!
|
||||||
|
|
||||||
|
|
||||||
Run `:GoRun` in a new tab, horizontal split or vertical split terminal
|
Run `:GoRun` in a new tab, horizontal split or vertical split terminal
|
||||||
|
|
|
@ -14,12 +14,12 @@ else
|
||||||
let g:ctrlp_ext_vars = [s:go_decls_var]
|
let g:ctrlp_ext_vars = [s:go_decls_var]
|
||||||
endif
|
endif
|
||||||
|
|
||||||
function! ctrlp#decls#init()
|
function! ctrlp#decls#init() abort
|
||||||
cal s:enable_syntax()
|
cal s:enable_syntax()
|
||||||
return s:decls
|
return s:decls
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! ctrlp#decls#exit()
|
function! ctrlp#decls#exit() abort
|
||||||
unlet! s:decls s:current_dir s:target
|
unlet! s:decls s:current_dir s:target
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ endfunction
|
||||||
" a:mode the mode that has been chosen by pressing <cr> <c-v> <c-t> or <c-x>
|
" a:mode the mode that has been chosen by pressing <cr> <c-v> <c-t> or <c-x>
|
||||||
" the values are 'e', 'v', 't' and 'h', respectively
|
" the values are 'e', 'v', 't' and 'h', respectively
|
||||||
" a:str the selected string
|
" a:str the selected string
|
||||||
function! ctrlp#decls#accept(mode, str)
|
function! ctrlp#decls#accept(mode, str) abort
|
||||||
let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd '
|
let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd '
|
||||||
let dir = getcwd()
|
let dir = getcwd()
|
||||||
try
|
try
|
||||||
|
@ -56,7 +56,7 @@ function! ctrlp#decls#accept(mode, str)
|
||||||
endtry
|
endtry
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! ctrlp#decls#enter()
|
function! ctrlp#decls#enter() abort
|
||||||
let s:current_dir = fnameescape(expand('%:p:h'))
|
let s:current_dir = fnameescape(expand('%:p:h'))
|
||||||
let s:decls = []
|
let s:decls = []
|
||||||
|
|
||||||
|
@ -130,7 +130,7 @@ function! ctrlp#decls#enter()
|
||||||
endfor
|
endfor
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
function! s:enable_syntax()
|
function! s:enable_syntax() abort
|
||||||
if !(has('syntax') && exists('g:syntax_on'))
|
if !(has('syntax') && exists('g:syntax_on'))
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
@ -148,7 +148,7 @@ endfunction
|
||||||
|
|
||||||
let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
|
let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
|
||||||
|
|
||||||
function! ctrlp#decls#cmd(mode, ...)
|
function! ctrlp#decls#cmd(mode, ...) abort
|
||||||
let s:mode = a:mode
|
let s:mode = a:mode
|
||||||
if a:0 && !empty(a:1)
|
if a:0 && !empty(a:1)
|
||||||
let s:target = a:1
|
let s:target = a:1
|
||||||
|
|
|
@ -4,7 +4,7 @@ if !exists("g:go_alternate_mode")
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" Test alternates between the implementation of code and the test code.
|
" Test alternates between the implementation of code and the test code.
|
||||||
function! go#alternate#Switch(bang, cmd)
|
function! go#alternate#Switch(bang, cmd) abort
|
||||||
let file = expand('%')
|
let file = expand('%')
|
||||||
if empty(file)
|
if empty(file)
|
||||||
call go#util#EchoError("no buffer name")
|
call go#util#EchoError("no buffer name")
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
"
|
"
|
||||||
" Options:
|
" Options:
|
||||||
"
|
"
|
||||||
" g:go_asmfmt_autosave [default=1]
|
" g:go_asmfmt_autosave [default=0]
|
||||||
"
|
"
|
||||||
" Flag to automatically call :Fmt when file is saved.
|
" Flag to automatically call :Fmt when file is saved.
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ let s:got_fmt_error = 0
|
||||||
|
|
||||||
" This is a trimmed-down version of the logic in fmt.vim.
|
" This is a trimmed-down version of the logic in fmt.vim.
|
||||||
|
|
||||||
function! go#asmfmt#Format()
|
function! go#asmfmt#Format() abort
|
||||||
" Save state.
|
" Save state.
|
||||||
let l:curw = winsaveview()
|
let l:curw = winsaveview()
|
||||||
|
|
||||||
|
@ -55,15 +55,15 @@ function! go#asmfmt#Format()
|
||||||
call winrestview(l:curw)
|
call winrestview(l:curw)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#asmfmt#ToggleAsmFmtAutoSave()
|
function! go#asmfmt#ToggleAsmFmtAutoSave() abort
|
||||||
if get(g:, "go_asmfmt_autosave", 1)
|
if get(g:, "go_asmfmt_autosave", 0)
|
||||||
let g:go_asmfmt_autosave = 0
|
let g:go_asmfmt_autosave = 1
|
||||||
call go#util#EchoProgress("auto asmfmt disabled")
|
call go#util#EchoProgress("auto asmfmt enabled")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
let g:go_asmfmt_autosave = 1
|
let g:go_asmfmt_autosave = 0
|
||||||
call go#util#EchoProgress("auto asmfmt enabled")
|
call go#util#EchoProgress("auto asmfmt disabled")
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" vim: sw=2 ts=2 et
|
" vim: sw=2 ts=2 et
|
||||||
|
|
|
@ -1,19 +1,14 @@
|
||||||
if !exists("g:go_dispatch_enabled")
|
function! go#cmd#autowrite() abort
|
||||||
let g:go_dispatch_enabled = 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
function! go#cmd#autowrite()
|
|
||||||
if &autowrite == 1
|
if &autowrite == 1
|
||||||
silent wall
|
silent! wall
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
" Build builds the source code without producting any output binary. We live in
|
" Build builds the source code without producting any output binary. We live in
|
||||||
" an editor so the best is to build it to catch errors and fix them. By
|
" an editor so the best is to build it to catch errors and fix them. By
|
||||||
" default it tries to call simply 'go build', but it first tries to get all
|
" default it tries to call simply 'go build', but it first tries to get all
|
||||||
" dependent files for the current folder and passes it to go build.
|
" dependent files for the current folder and passes it to go build.
|
||||||
function! go#cmd#Build(bang, ...)
|
function! go#cmd#Build(bang, ...) abort
|
||||||
" expand all wildcards(i.e: '%' to the current file name)
|
" expand all wildcards(i.e: '%' to the current file name)
|
||||||
let goargs = map(copy(a:000), "expand(v:val)")
|
let goargs = map(copy(a:000), "expand(v:val)")
|
||||||
|
|
||||||
|
@ -26,8 +21,18 @@ function! go#cmd#Build(bang, ...)
|
||||||
" placeholder with the current folder (indicated with '.')
|
" placeholder with the current folder (indicated with '.')
|
||||||
let args = ["build"] + goargs + [".", "errors"]
|
let args = ["build"] + goargs + [".", "errors"]
|
||||||
|
|
||||||
|
if go#util#has_job()
|
||||||
|
if get(g:, 'go_echo_command_info', 1)
|
||||||
|
call go#util#EchoProgress("building dispatched ...")
|
||||||
|
endif
|
||||||
|
|
||||||
|
call s:cmd_job({
|
||||||
|
\ 'cmd': ['go'] + args,
|
||||||
|
\ 'bang': a:bang,
|
||||||
|
\})
|
||||||
|
return
|
||||||
|
elseif has('nvim')
|
||||||
" if we have nvim, call it asynchronously and return early ;)
|
" if we have nvim, call it asynchronously and return early ;)
|
||||||
if has('nvim')
|
|
||||||
call go#util#EchoProgress("building dispatched ...")
|
call go#util#EchoProgress("building dispatched ...")
|
||||||
call go#jobcontrol#Spawn(a:bang, "build", args)
|
call go#jobcontrol#Spawn(a:bang, "build", args)
|
||||||
return
|
return
|
||||||
|
@ -45,10 +50,7 @@ function! go#cmd#Build(bang, ...)
|
||||||
let dir = getcwd()
|
let dir = getcwd()
|
||||||
try
|
try
|
||||||
execute cd . fnameescape(expand("%:p:h"))
|
execute cd . fnameescape(expand("%:p:h"))
|
||||||
if g:go_dispatch_enabled && exists(':Make') == 2
|
if l:listtype == "locationlist"
|
||||||
call go#util#EchoProgress("building dispatched ...")
|
|
||||||
silent! exe 'Make'
|
|
||||||
elseif l:listtype == "locationlist"
|
|
||||||
silent! exe 'lmake!'
|
silent! exe 'lmake!'
|
||||||
else
|
else
|
||||||
silent! exe 'make!'
|
silent! exe 'make!'
|
||||||
|
@ -60,11 +62,8 @@ function! go#cmd#Build(bang, ...)
|
||||||
|
|
||||||
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) && !a:bang
|
||||||
if !empty(errors)
|
|
||||||
if !a:bang
|
|
||||||
call go#list#JumpToFirst(l:listtype)
|
call go#list#JumpToFirst(l:listtype)
|
||||||
endif
|
|
||||||
else
|
else
|
||||||
call go#util#EchoSuccess("[build] SUCCESS")
|
call go#util#EchoSuccess("[build] SUCCESS")
|
||||||
endif
|
endif
|
||||||
|
@ -75,7 +74,7 @@ endfunction
|
||||||
|
|
||||||
|
|
||||||
" Run runs the current file (and their dependencies if any) in a new terminal.
|
" Run runs the current file (and their dependencies if any) in a new terminal.
|
||||||
function! go#cmd#RunTerm(bang, mode, files)
|
function! go#cmd#RunTerm(bang, mode, files) abort
|
||||||
if empty(a:files)
|
if empty(a:files)
|
||||||
let cmd = "go run ". go#util#Shelljoin(go#tool#Files())
|
let cmd = "go run ". go#util#Shelljoin(go#tool#Files())
|
||||||
else
|
else
|
||||||
|
@ -88,12 +87,18 @@ endfunction
|
||||||
" This is intented to test small programs and play with them. It's not
|
" This is intented to test small programs and play with them. It's not
|
||||||
" suitable for long running apps, because vim is blocking by default and
|
" suitable for long running apps, because vim is blocking by default and
|
||||||
" calling long running apps will block the whole UI.
|
" calling long running apps will block the whole UI.
|
||||||
function! go#cmd#Run(bang, ...)
|
function! go#cmd#Run(bang, ...) abort
|
||||||
if has('nvim')
|
if has('nvim')
|
||||||
call go#cmd#RunTerm(a:bang, '', a:000)
|
call go#cmd#RunTerm(a:bang, '', a:000)
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
if go#util#has_job()
|
||||||
|
" NOTE(arslan): 'term': 'open' case is not implement for +jobs. This means
|
||||||
|
" executions waiting for stdin will not work. That's why we don't do
|
||||||
|
" anything. Once this is implemented we're going to make :GoRun async
|
||||||
|
endif
|
||||||
|
|
||||||
let old_gopath = $GOPATH
|
let old_gopath = $GOPATH
|
||||||
let $GOPATH = go#path#Detect()
|
let $GOPATH = go#path#Detect()
|
||||||
|
|
||||||
|
@ -119,9 +124,7 @@ function! go#cmd#Run(bang, ...)
|
||||||
|
|
||||||
let l:listtype = go#list#Type("quickfix")
|
let l:listtype = go#list#Type("quickfix")
|
||||||
|
|
||||||
if g:go_dispatch_enabled && exists(':Make') == 2
|
if l:listtype == "locationlist"
|
||||||
silent! exe 'Make'
|
|
||||||
elseif l:listtype == "locationlist"
|
|
||||||
exe 'lmake!'
|
exe 'lmake!'
|
||||||
else
|
else
|
||||||
exe 'make!'
|
exe 'make!'
|
||||||
|
@ -130,7 +133,7 @@ function! go#cmd#Run(bang, ...)
|
||||||
let items = go#list#Get(l:listtype)
|
let items = go#list#Get(l:listtype)
|
||||||
let errors = go#tool#FilterValids(items)
|
let errors = go#tool#FilterValids(items)
|
||||||
|
|
||||||
call go#list#Populate(l:listtype, errors)
|
call go#list#Populate(l:listtype, errors, &makeprg)
|
||||||
call go#list#Window(l:listtype, len(errors))
|
call go#list#Window(l:listtype, len(errors))
|
||||||
if !empty(errors) && !a:bang
|
if !empty(errors) && !a:bang
|
||||||
call go#list#JumpToFirst(l:listtype)
|
call go#list#JumpToFirst(l:listtype)
|
||||||
|
@ -141,9 +144,28 @@ function! go#cmd#Run(bang, ...)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Install installs the package by simple calling 'go install'. If any argument
|
" Install installs the package by simple calling 'go install'. If any argument
|
||||||
" is given(which are passed directly to 'go install') it tries to install those
|
" is given(which are passed directly to 'go install') it tries to install
|
||||||
" packages. Errors are populated in the location window.
|
" those packages. Errors are populated in the location window.
|
||||||
function! go#cmd#Install(bang, ...)
|
function! go#cmd#Install(bang, ...) abort
|
||||||
|
" use vim's job functionality to call it asynchronously
|
||||||
|
if go#util#has_job()
|
||||||
|
" expand all wildcards(i.e: '%' to the current file name)
|
||||||
|
let goargs = map(copy(a:000), "expand(v:val)")
|
||||||
|
|
||||||
|
" escape all shell arguments before we pass it to make
|
||||||
|
let goargs = go#util#Shelllist(goargs, 1)
|
||||||
|
|
||||||
|
if get(g:, 'go_echo_command_info', 1)
|
||||||
|
call go#util#EchoProgress("installing dispatched ...")
|
||||||
|
endif
|
||||||
|
|
||||||
|
call s:cmd_job({
|
||||||
|
\ 'cmd': ['go', 'install'] + goargs,
|
||||||
|
\ 'bang': a:bang,
|
||||||
|
\})
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
let old_gopath = $GOPATH
|
let old_gopath = $GOPATH
|
||||||
let $GOPATH = go#path#Detect()
|
let $GOPATH = go#path#Detect()
|
||||||
let default_makeprg = &makeprg
|
let default_makeprg = &makeprg
|
||||||
|
@ -159,10 +181,7 @@ function! go#cmd#Install(bang, ...)
|
||||||
let dir = getcwd()
|
let dir = getcwd()
|
||||||
try
|
try
|
||||||
execute cd . fnameescape(expand("%:p:h"))
|
execute cd . fnameescape(expand("%:p:h"))
|
||||||
if g:go_dispatch_enabled && exists(':Make') == 2
|
if l:listtype == "locationlist"
|
||||||
call go#util#EchoProgress("building dispatched ...")
|
|
||||||
silent! exe 'Make'
|
|
||||||
elseif l:listtype == "locationlist"
|
|
||||||
silent! exe 'lmake!'
|
silent! exe 'lmake!'
|
||||||
else
|
else
|
||||||
silent! exe 'make!'
|
silent! exe 'make!'
|
||||||
|
@ -174,12 +193,10 @@ function! go#cmd#Install(bang, ...)
|
||||||
|
|
||||||
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) && !a:bang
|
||||||
if !a:bang
|
|
||||||
call go#list#JumpToFirst(l:listtype)
|
call go#list#JumpToFirst(l:listtype)
|
||||||
endif
|
|
||||||
else
|
else
|
||||||
redraws! | echon "vim-go: " | echohl Function | echon "installed to ". $GOPATH | echohl None
|
call go#util#EchoSuccess("installed to ". $GOPATH)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let $GOPATH = old_gopath
|
let $GOPATH = old_gopath
|
||||||
|
@ -189,7 +206,7 @@ endfunction
|
||||||
" Test runs `go test` in the current directory. If compile is true, it'll
|
" Test runs `go test` in the current directory. If compile is true, it'll
|
||||||
" compile the tests instead of running them (useful to catch errors in the
|
" compile the tests instead of running them (useful to catch errors in the
|
||||||
" test files). Any other argument is appendend to the final `go test` command
|
" test files). Any other argument is appendend to the final `go test` command
|
||||||
function! go#cmd#Test(bang, compile, ...)
|
function! go#cmd#Test(bang, compile, ...) abort
|
||||||
let args = ["test"]
|
let args = ["test"]
|
||||||
|
|
||||||
" don't run the test, only compile it. Useful to capture and fix errors.
|
" don't run the test, only compile it. Useful to capture and fix errors.
|
||||||
|
@ -199,9 +216,15 @@ function! go#cmd#Test(bang, compile, ...)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if a:0
|
if a:0
|
||||||
|
let goargs = a:000
|
||||||
|
|
||||||
|
" do not expand for coverage mode as we're passing the arg ourself
|
||||||
|
if a:1 != '-coverprofile'
|
||||||
" expand all wildcards(i.e: '%' to the current file name)
|
" expand all wildcards(i.e: '%' to the current file name)
|
||||||
let goargs = map(copy(a:000), "expand(v:val)")
|
let goargs = map(copy(a:000), "expand(v:val)")
|
||||||
if !has('nvim')
|
endif
|
||||||
|
|
||||||
|
if !(has('nvim') || go#util#has_job())
|
||||||
let goargs = go#util#Shelllist(goargs, 1)
|
let goargs = go#util#Shelllist(goargs, 1)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -212,13 +235,29 @@ function! go#cmd#Test(bang, compile, ...)
|
||||||
call add(args, printf("-timeout=%s", timeout))
|
call add(args, printf("-timeout=%s", timeout))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
if get(g:, 'go_echo_command_info', 1)
|
||||||
if a:compile
|
if a:compile
|
||||||
echon "vim-go: " | echohl Identifier | echon "compiling tests ..." | echohl None
|
echon "vim-go: " | echohl Identifier | echon "compiling tests ..." | echohl None
|
||||||
else
|
else
|
||||||
echon "vim-go: " | echohl Identifier | echon "testing ..." | echohl None
|
echon "vim-go: " | echohl Identifier | echon "testing ..." | echohl None
|
||||||
endif
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
if has('nvim')
|
if go#util#has_job()
|
||||||
|
" use vim's job functionality to call it asynchronously
|
||||||
|
let job_args = {
|
||||||
|
\ 'cmd': ['go'] + args,
|
||||||
|
\ 'bang': a:bang,
|
||||||
|
\ }
|
||||||
|
|
||||||
|
if a:compile
|
||||||
|
let job_args['custom_cb'] = function('s:test_compile', [compile_file])
|
||||||
|
endif
|
||||||
|
|
||||||
|
call s:cmd_job(job_args)
|
||||||
|
return
|
||||||
|
elseif has('nvim')
|
||||||
|
" use nvims's job functionality
|
||||||
if get(g:, 'go_term_enabled', 0)
|
if get(g:, 'go_term_enabled', 0)
|
||||||
let id = go#term#new(a:bang, ["go"] + args)
|
let id = go#term#new(a:bang, ["go"] + args)
|
||||||
else
|
else
|
||||||
|
@ -252,7 +291,7 @@ function! go#cmd#Test(bang, compile, ...)
|
||||||
let errors = go#tool#ParseErrors(split(out, '\n'))
|
let errors = go#tool#ParseErrors(split(out, '\n'))
|
||||||
let errors = go#tool#FilterValids(errors)
|
let errors = go#tool#FilterValids(errors)
|
||||||
|
|
||||||
call go#list#Populate(l:listtype, errors)
|
call go#list#Populate(l:listtype, errors, command)
|
||||||
call go#list#Window(l:listtype, len(errors))
|
call go#list#Window(l:listtype, len(errors))
|
||||||
if !empty(errors) && !a:bang
|
if !empty(errors) && !a:bang
|
||||||
call go#list#JumpToFirst(l:listtype)
|
call go#list#JumpToFirst(l:listtype)
|
||||||
|
@ -276,7 +315,7 @@ endfunction
|
||||||
|
|
||||||
" Testfunc runs a single test that surrounds the current cursor position.
|
" Testfunc runs a single test that surrounds the current cursor position.
|
||||||
" Arguments are passed to the `go test` command.
|
" Arguments are passed to the `go test` command.
|
||||||
function! go#cmd#TestFunc(bang, ...)
|
function! go#cmd#TestFunc(bang, ...) abort
|
||||||
" search flags legend (used only)
|
" search flags legend (used only)
|
||||||
" 'b' search backward instead of forward
|
" 'b' search backward instead of forward
|
||||||
" 'c' accept a match at the cursor position
|
" 'c' accept a match at the cursor position
|
||||||
|
@ -304,7 +343,7 @@ function! go#cmd#TestFunc(bang, ...)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Generate runs 'go generate' in similar fashion to go#cmd#Build()
|
" Generate runs 'go generate' in similar fashion to go#cmd#Build()
|
||||||
function! go#cmd#Generate(bang, ...)
|
function! go#cmd#Generate(bang, ...) abort
|
||||||
let default_makeprg = &makeprg
|
let default_makeprg = &makeprg
|
||||||
|
|
||||||
let old_gopath = $GOPATH
|
let old_gopath = $GOPATH
|
||||||
|
@ -322,9 +361,7 @@ function! go#cmd#Generate(bang, ...)
|
||||||
let l:listtype = go#list#Type("quickfix")
|
let l:listtype = go#list#Type("quickfix")
|
||||||
|
|
||||||
echon "vim-go: " | echohl Identifier | echon "generating ..."| echohl None
|
echon "vim-go: " | echohl Identifier | echon "generating ..."| echohl None
|
||||||
if g:go_dispatch_enabled && exists(':Make') == 2
|
if l:listtype == "locationlist"
|
||||||
silent! exe 'Make'
|
|
||||||
elseif l:listtype == "locationlist"
|
|
||||||
silent! exe 'lmake!'
|
silent! exe 'lmake!'
|
||||||
else
|
else
|
||||||
silent! exe 'make!'
|
silent! exe 'make!'
|
||||||
|
@ -346,12 +383,79 @@ function! go#cmd#Generate(bang, ...)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
" ---------------------
|
||||||
|
" | Vim job callbacks |
|
||||||
|
" ---------------------
|
||||||
|
|
||||||
|
function s:cmd_job(args) abort
|
||||||
|
let status_dir = expand('%:p:h')
|
||||||
|
let started_at = reltime()
|
||||||
|
|
||||||
|
call go#statusline#Update(status_dir, {
|
||||||
|
\ 'desc': "current status",
|
||||||
|
\ 'type': a:args.cmd[1],
|
||||||
|
\ 'state': "started",
|
||||||
|
\})
|
||||||
|
|
||||||
|
" autowrite is not enabled for jobs
|
||||||
|
call go#cmd#autowrite()
|
||||||
|
|
||||||
|
function! s:error_info_cb(job, exit_status, data) closure abort
|
||||||
|
let status = {
|
||||||
|
\ 'desc': 'last status',
|
||||||
|
\ 'type': a:args.cmd[1],
|
||||||
|
\ 'state': "success",
|
||||||
|
\ }
|
||||||
|
|
||||||
|
if a:exit_status
|
||||||
|
let status.state = "failed"
|
||||||
|
endif
|
||||||
|
|
||||||
|
let elapsed_time = reltimestr(reltime(started_at))
|
||||||
|
" strip whitespace
|
||||||
|
let elapsed_time = substitute(elapsed_time, '^\s*\(.\{-}\)\s*$', '\1', '')
|
||||||
|
let status.state .= printf(" (%ss)", elapsed_time)
|
||||||
|
|
||||||
|
call go#statusline#Update(status_dir, status)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
let a:args.error_info_cb = function('s:error_info_cb')
|
||||||
|
let callbacks = go#job#Spawn(a:args)
|
||||||
|
|
||||||
|
let start_options = {
|
||||||
|
\ 'callback': callbacks.callback,
|
||||||
|
\ 'close_cb': callbacks.close_cb,
|
||||||
|
\ }
|
||||||
|
|
||||||
|
" modify GOPATH if needed
|
||||||
|
let old_gopath = $GOPATH
|
||||||
|
let $GOPATH = go#path#Detect()
|
||||||
|
|
||||||
|
" pre start
|
||||||
|
let dir = getcwd()
|
||||||
|
let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd '
|
||||||
|
let jobdir = fnameescape(expand("%:p:h"))
|
||||||
|
execute cd . jobdir
|
||||||
|
|
||||||
|
call job_start(a:args.cmd, start_options)
|
||||||
|
|
||||||
|
" post start
|
||||||
|
execute cd . fnameescape(dir)
|
||||||
|
let $GOPATH = old_gopath
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
" test_compile is called when a GoTestCompile call is finished
|
||||||
|
function! s:test_compile(test_file, job, exit_status, data) abort
|
||||||
|
call delete(a:test_file)
|
||||||
|
endfunction
|
||||||
|
|
||||||
" -----------------------
|
" -----------------------
|
||||||
" | Neovim job handlers |
|
" | Neovim job handlers |
|
||||||
" -----------------------
|
" -----------------------
|
||||||
let s:test_compile_handlers = {}
|
let s:test_compile_handlers = {}
|
||||||
|
|
||||||
function! s:test_compile_handler(job, exit_status, data)
|
function! s:test_compile_handler(job, exit_status, data) abort
|
||||||
if !has_key(s:test_compile_handlers, a:job.id)
|
if !has_key(s:test_compile_handlers, a:job.id)
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
let s:sock_type = (has('win32') || has('win64')) ? 'tcp' : 'unix'
|
let s:sock_type = (has('win32') || has('win64')) ? 'tcp' : 'unix'
|
||||||
|
|
||||||
function! s:gocodeCurrentBuffer()
|
function! s:gocodeCurrentBuffer() abort
|
||||||
let buf = getline(1, '$')
|
let buf = getline(1, '$')
|
||||||
if &encoding != 'utf-8'
|
if &encoding != 'utf-8'
|
||||||
let buf = map(buf, 'iconv(v:val, &encoding, "utf-8")')
|
let buf = map(buf, 'iconv(v:val, &encoding, "utf-8")')
|
||||||
|
@ -16,7 +16,7 @@ function! s:gocodeCurrentBuffer()
|
||||||
return file
|
return file
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:gocodeCommand(cmd, preargs, args)
|
function! s:gocodeCommand(cmd, preargs, args) abort
|
||||||
for i in range(0, len(a:args) - 1)
|
for i in range(0, len(a:args) - 1)
|
||||||
let a:args[i] = go#util#Shellescape(a:args[i])
|
let a:args[i] = go#util#Shellescape(a:args[i])
|
||||||
endfor
|
endfor
|
||||||
|
@ -59,12 +59,12 @@ function! s:gocodeCommand(cmd, preargs, args)
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:gocodeCurrentBufferOpt(filename)
|
function! s:gocodeCurrentBufferOpt(filename) abort
|
||||||
return '-in=' . a:filename
|
return '-in=' . a:filename
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
let s:optionsEnabled = 0
|
let s:optionsEnabled = 0
|
||||||
function! s:gocodeEnableOptions()
|
function! s:gocodeEnableOptions() abort
|
||||||
if s:optionsEnabled
|
if s:optionsEnabled
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
@ -78,14 +78,14 @@ function! s:gocodeEnableOptions()
|
||||||
|
|
||||||
call go#util#System(printf('%s set propose-builtins %s', go#util#Shellescape(bin_path), s:toBool(get(g:, 'go_gocode_propose_builtins', 1))))
|
call go#util#System(printf('%s set propose-builtins %s', go#util#Shellescape(bin_path), s:toBool(get(g:, 'go_gocode_propose_builtins', 1))))
|
||||||
call go#util#System(printf('%s set autobuild %s', go#util#Shellescape(bin_path), s:toBool(get(g:, 'go_gocode_autobuild', 1))))
|
call go#util#System(printf('%s set autobuild %s', go#util#Shellescape(bin_path), s:toBool(get(g:, 'go_gocode_autobuild', 1))))
|
||||||
call go#util#System(printf('%s set unimported-packages %s', go#util#Shellescape(bin_path), s:toBool(get(g:, 'go_gocode_unimported_packages', 1))))
|
call go#util#System(printf('%s set unimported-packages %s', go#util#Shellescape(bin_path), s:toBool(get(g:, 'go_gocode_unimported_packages', 0))))
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:toBool(val)
|
function! s:toBool(val) abort
|
||||||
if a:val | return 'true ' | else | return 'false' | endif
|
if a:val | return 'true ' | else | return 'false' | endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:gocodeAutocomplete()
|
function! s:gocodeAutocomplete() abort
|
||||||
call s:gocodeEnableOptions()
|
call s:gocodeEnableOptions()
|
||||||
|
|
||||||
let filename = s:gocodeCurrentBuffer()
|
let filename = s:gocodeCurrentBuffer()
|
||||||
|
@ -96,7 +96,7 @@ function! s:gocodeAutocomplete()
|
||||||
return result
|
return result
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#complete#GetInfo()
|
function! go#complete#GetInfo() abort
|
||||||
let offset = go#util#OffsetCursor()+1
|
let offset = go#util#OffsetCursor()+1
|
||||||
let filename = s:gocodeCurrentBuffer()
|
let filename = s:gocodeCurrentBuffer()
|
||||||
let result = s:gocodeCommand('autocomplete',
|
let result = s:gocodeCommand('autocomplete',
|
||||||
|
@ -137,7 +137,7 @@ function! go#complete#GetInfo()
|
||||||
return ""
|
return ""
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#complete#Info(auto)
|
function! go#complete#Info(auto) abort
|
||||||
" auto is true if we were called by g:go_auto_type_info's autocmd
|
" auto is true if we were called by g:go_auto_type_info's autocmd
|
||||||
let result = go#complete#GetInfo()
|
let result = go#complete#GetInfo()
|
||||||
if !empty(result)
|
if !empty(result)
|
||||||
|
@ -147,12 +147,12 @@ function! go#complete#Info(auto)
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:trim_bracket(val)
|
function! s:trim_bracket(val) abort
|
||||||
let a:val.word = substitute(a:val.word, '[(){}\[\]]\+$', '', '')
|
let a:val.word = substitute(a:val.word, '[(){}\[\]]\+$', '', '')
|
||||||
return a:val
|
return a:val
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#complete#Complete(findstart, base)
|
function! go#complete#Complete(findstart, base) abort
|
||||||
"findstart = 1 when we need to get the text length
|
"findstart = 1 when we need to get the text length
|
||||||
if a:findstart == 1
|
if a:findstart == 1
|
||||||
execute "silent let g:gocomplete_completions = " . s:gocodeAutocomplete()
|
execute "silent let g:gocomplete_completions = " . s:gocodeAutocomplete()
|
||||||
|
@ -167,7 +167,7 @@ function! go#complete#Complete(findstart, base)
|
||||||
endif
|
endif
|
||||||
endf
|
endf
|
||||||
|
|
||||||
function! go#complete#ToggleAutoTypeInfo()
|
function! go#complete#ToggleAutoTypeInfo() abort
|
||||||
if get(g:, "go_auto_type_info", 0)
|
if get(g:, "go_auto_type_info", 0)
|
||||||
let g:go_auto_type_info = 0
|
let g:go_auto_type_info = 0
|
||||||
call go#util#EchoProgress("auto type info disabled")
|
call go#util#EchoProgress("auto type info disabled")
|
||||||
|
|
|
@ -3,7 +3,7 @@ let s:toggle = 0
|
||||||
" Buffer creates a new cover profile with 'go test -coverprofile' and changes
|
" Buffer creates a new cover profile with 'go test -coverprofile' and changes
|
||||||
" the current buffers highlighting to show covered and uncovered sections of
|
" the current buffers highlighting to show covered and uncovered sections of
|
||||||
" the code. If run again it clears the annotation.
|
" the code. If run again it clears the annotation.
|
||||||
function! go#coverage#BufferToggle(bang, ...)
|
function! go#coverage#BufferToggle(bang, ...) abort
|
||||||
if s:toggle
|
if s:toggle
|
||||||
call go#coverage#Clear()
|
call go#coverage#Clear()
|
||||||
return
|
return
|
||||||
|
@ -20,7 +20,7 @@ endfunction
|
||||||
" teh current buffers highlighting to show covered and uncovered sections of
|
" teh current buffers highlighting to show covered and uncovered sections of
|
||||||
" the code. Calling it again reruns the tests and shows the last updated
|
" the code. Calling it again reruns the tests and shows the last updated
|
||||||
" coverage.
|
" coverage.
|
||||||
function! go#coverage#Buffer(bang, ...)
|
function! go#coverage#Buffer(bang, ...) abort
|
||||||
" we use matchaddpos() which was introduce with 7.4.330, be sure we have
|
" we use matchaddpos() which was introduce with 7.4.330, be sure we have
|
||||||
" it: http://ftp.vim.org/vim/patches/7.4/7.4.330
|
" it: http://ftp.vim.org/vim/patches/7.4/7.4.330
|
||||||
if !exists("*matchaddpos")
|
if !exists("*matchaddpos")
|
||||||
|
@ -43,8 +43,17 @@ function! go#coverage#Buffer(bang, ...)
|
||||||
|
|
||||||
let s:toggle = 1
|
let s:toggle = 1
|
||||||
let l:tmpname = tempname()
|
let l:tmpname = tempname()
|
||||||
let args = [a:bang, 0, "-coverprofile", l:tmpname]
|
|
||||||
|
|
||||||
|
if go#util#has_job()
|
||||||
|
call s:coverage_job({
|
||||||
|
\ 'cmd': ['go', 'test', '-coverprofile', l:tmpname],
|
||||||
|
\ 'custom_cb': function('s:coverage_callback', [l:tmpname]),
|
||||||
|
\ 'bang': a:bang,
|
||||||
|
\ })
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let args = [a:bang, 0, "-coverprofile", l:tmpname]
|
||||||
if a:0
|
if a:0
|
||||||
call extend(args, a:000)
|
call extend(args, a:000)
|
||||||
endif
|
endif
|
||||||
|
@ -75,11 +84,8 @@ function! go#coverage#Buffer(bang, ...)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Clear clears and resets the buffer annotation matches
|
" Clear clears and resets the buffer annotation matches
|
||||||
function! go#coverage#Clear()
|
function! go#coverage#Clear() abort
|
||||||
" only reset the syntax if the user has syntax enabled
|
call clearmatches()
|
||||||
if !empty(&syntax)
|
|
||||||
if exists("g:syntax_on") | syntax enable | endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
if exists("s:toggle") | let s:toggle = 0 | endif
|
if exists("s:toggle") | let s:toggle = 0 | endif
|
||||||
|
|
||||||
|
@ -87,25 +93,34 @@ function! go#coverage#Clear()
|
||||||
if exists("#BufWinLeave#<buffer>")
|
if exists("#BufWinLeave#<buffer>")
|
||||||
autocmd! BufWinLeave <buffer>
|
autocmd! BufWinLeave <buffer>
|
||||||
endif
|
endif
|
||||||
|
|
||||||
call clearmatches()
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Browser creates a new cover profile with 'go test -coverprofile' and opens
|
" Browser creates a new cover profile with 'go test -coverprofile' and opens
|
||||||
" a new HTML coverage page from that profile in a new browser
|
" a new HTML coverage page from that profile in a new browser
|
||||||
function! go#coverage#Browser(bang, ...)
|
function! go#coverage#Browser(bang, ...) abort
|
||||||
let l:tmpname = tempname()
|
let l:tmpname = tempname()
|
||||||
let args = [a:bang, 0, "-coverprofile", l:tmpname]
|
if go#util#has_job()
|
||||||
|
call s:coverage_job({
|
||||||
|
\ 'cmd': ['go', 'test', '-coverprofile', l:tmpname],
|
||||||
|
\ 'custom_cb': function('s:coverage_browser_callback', [l:tmpname]),
|
||||||
|
\ 'bang': a:bang,
|
||||||
|
\ })
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let args = [a:bang, 0, "-coverprofile", l:tmpname]
|
||||||
if a:0
|
if a:0
|
||||||
call extend(args, a:000)
|
call extend(args, a:000)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let id = call('go#cmd#Test', args)
|
let id = call('go#cmd#Test', args)
|
||||||
if has('nvim')
|
if has('nvim')
|
||||||
call go#jobcontrol#AddHandler(function('s:coverage_browser_handler'))
|
call go#jobcontrol#AddHandler(function('s:coverage_browser_handler'))
|
||||||
let s:coverage_browser_handler_jobs[id] = l:tmpname
|
let s:coverage_browser_handler_jobs[id] = l:tmpname
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
if go#util#ShellError() == 0
|
if go#util#ShellError() == 0
|
||||||
let openHTML = 'go tool cover -html='.l:tmpname
|
let openHTML = 'go tool cover -html='.l:tmpname
|
||||||
call go#tool#ExecuteInDir(openHTML)
|
call go#tool#ExecuteInDir(openHTML)
|
||||||
|
@ -116,7 +131,7 @@ endfunction
|
||||||
|
|
||||||
" Parses a single line from the cover file generated via go test -coverprofile
|
" Parses a single line from the cover file generated via go test -coverprofile
|
||||||
" and returns a single coverage profile block.
|
" and returns a single coverage profile block.
|
||||||
function! go#coverage#parsegocoverline(line)
|
function! go#coverage#parsegocoverline(line) abort
|
||||||
" file:startline.col,endline.col numstmt count
|
" file:startline.col,endline.col numstmt count
|
||||||
let mx = '\([^:]\+\):\(\d\+\)\.\(\d\+\),\(\d\+\)\.\(\d\+\)\s\(\d\+\)\s\(\d\+\)'
|
let mx = '\([^:]\+\):\(\d\+\)\.\(\d\+\),\(\d\+\)\.\(\d\+\)\s\(\d\+\)\s\(\d\+\)'
|
||||||
let tokens = matchlist(a:line, mx)
|
let tokens = matchlist(a:line, mx)
|
||||||
|
@ -133,7 +148,7 @@ endfunction
|
||||||
|
|
||||||
" Generates matches to be added to matchaddpos for the given coverage profile
|
" Generates matches to be added to matchaddpos for the given coverage profile
|
||||||
" block
|
" block
|
||||||
function! go#coverage#genmatch(cov)
|
function! go#coverage#genmatch(cov) abort
|
||||||
let color = 'goCoverageCovered'
|
let color = 'goCoverageCovered'
|
||||||
if a:cov.cnt == 0
|
if a:cov.cnt == 0
|
||||||
let color = 'goCoverageUncover'
|
let color = 'goCoverageUncover'
|
||||||
|
@ -183,7 +198,7 @@ function! go#coverage#genmatch(cov)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Reads the given coverprofile file and annotates the current buffer
|
" Reads the given coverprofile file and annotates the current buffer
|
||||||
function! go#coverage#overlay(file)
|
function! go#coverage#overlay(file) abort
|
||||||
if !filereadable(a:file)
|
if !filereadable(a:file)
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
@ -204,7 +219,7 @@ function! go#coverage#overlay(file)
|
||||||
let cnt += 1
|
let cnt += 1
|
||||||
endwhile
|
endwhile
|
||||||
|
|
||||||
let fname = expand('%:t')
|
let fname = expand('%')
|
||||||
|
|
||||||
" when called for a _test.go file, run the coverage for the actuall file
|
" when called for a _test.go file, run the coverage for the actuall file
|
||||||
" file
|
" file
|
||||||
|
@ -221,6 +236,9 @@ function! go#coverage#overlay(file)
|
||||||
exe ":edit ". fnamemodify(fname, ":p")
|
exe ":edit ". fnamemodify(fname, ":p")
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
" cov.file includes only the filename itself, without full path
|
||||||
|
let fname = fnamemodify(fname, ":t")
|
||||||
|
|
||||||
for line in lines[1:]
|
for line in lines[1:]
|
||||||
let cov = go#coverage#parsegocoverline(line)
|
let cov = go#coverage#parsegocoverline(line)
|
||||||
|
|
||||||
|
@ -233,8 +251,6 @@ function! go#coverage#overlay(file)
|
||||||
call extend(matches, go#coverage#genmatch(cov))
|
call extend(matches, go#coverage#genmatch(cov))
|
||||||
endfor
|
endfor
|
||||||
|
|
||||||
syntax manual
|
|
||||||
|
|
||||||
" clear the matches if we leave the buffer
|
" clear the matches if we leave the buffer
|
||||||
autocmd BufWinLeave <buffer> call go#coverage#Clear()
|
autocmd BufWinLeave <buffer> call go#coverage#Clear()
|
||||||
|
|
||||||
|
@ -244,6 +260,78 @@ function! go#coverage#overlay(file)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
" ---------------------
|
||||||
|
" | Vim job callbacks |
|
||||||
|
" ---------------------
|
||||||
|
"
|
||||||
|
function s:coverage_job(args)
|
||||||
|
" autowrite is not enabled for jobs
|
||||||
|
call go#cmd#autowrite()
|
||||||
|
|
||||||
|
let status_dir = expand('%:p:h')
|
||||||
|
function! s:error_info_cb(job, exit_status, data) closure
|
||||||
|
let status = {
|
||||||
|
\ 'desc': 'last status',
|
||||||
|
\ 'type': "coverage",
|
||||||
|
\ 'state': "finished",
|
||||||
|
\ }
|
||||||
|
|
||||||
|
if a:exit_status
|
||||||
|
let status.state = "failed"
|
||||||
|
endif
|
||||||
|
|
||||||
|
call go#statusline#Update(status_dir, status)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
let a:args.error_info_cb = function('s:error_info_cb')
|
||||||
|
let callbacks = go#job#Spawn(a:args)
|
||||||
|
|
||||||
|
let start_options = {
|
||||||
|
\ 'callback': callbacks.callback,
|
||||||
|
\ 'close_cb': callbacks.close_cb,
|
||||||
|
\ }
|
||||||
|
|
||||||
|
" modify GOPATH if needed
|
||||||
|
let old_gopath = $GOPATH
|
||||||
|
let $GOPATH = go#path#Detect()
|
||||||
|
|
||||||
|
" pre start
|
||||||
|
let dir = getcwd()
|
||||||
|
let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd '
|
||||||
|
let jobdir = fnameescape(expand("%:p:h"))
|
||||||
|
execute cd . jobdir
|
||||||
|
|
||||||
|
call go#statusline#Update(status_dir, {
|
||||||
|
\ 'desc': "current status",
|
||||||
|
\ 'type': "coverage",
|
||||||
|
\ 'state': "started",
|
||||||
|
\})
|
||||||
|
|
||||||
|
call job_start(a:args.cmd, start_options)
|
||||||
|
|
||||||
|
" post start
|
||||||
|
execute cd . fnameescape(dir)
|
||||||
|
let $GOPATH = old_gopath
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" coverage_callback is called when the coverage execution is finished
|
||||||
|
function! s:coverage_callback(coverfile, job, exit_status, data)
|
||||||
|
if a:exit_status == 0
|
||||||
|
call go#coverage#overlay(a:coverfile)
|
||||||
|
endif
|
||||||
|
|
||||||
|
call delete(a:coverfile)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:coverage_browser_callback(coverfile, job, exit_status, data)
|
||||||
|
if a:exit_status == 0
|
||||||
|
let openHTML = 'go tool cover -html='.a:coverfile
|
||||||
|
call go#tool#ExecuteInDir(openHTML)
|
||||||
|
endif
|
||||||
|
|
||||||
|
call delete(a:coverfile)
|
||||||
|
endfunction
|
||||||
|
|
||||||
" -----------------------
|
" -----------------------
|
||||||
" | Neovim job handlers |
|
" | Neovim job handlers |
|
||||||
" -----------------------
|
" -----------------------
|
||||||
|
@ -251,7 +339,7 @@ endfunction
|
||||||
let s:coverage_handler_jobs = {}
|
let s:coverage_handler_jobs = {}
|
||||||
let s:coverage_browser_handler_jobs = {}
|
let s:coverage_browser_handler_jobs = {}
|
||||||
|
|
||||||
function! s:coverage_handler(job, exit_status, data)
|
function! s:coverage_handler(job, exit_status, data) abort
|
||||||
if !has_key(s:coverage_handler_jobs, a:job.id)
|
if !has_key(s:coverage_handler_jobs, a:job.id)
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
@ -264,7 +352,7 @@ function! s:coverage_handler(job, exit_status, data)
|
||||||
unlet s:coverage_handler_jobs[a:job.id]
|
unlet s:coverage_handler_jobs[a:job.id]
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:coverage_browser_handler(job, exit_status, data)
|
function! s:coverage_browser_handler(job, exit_status, data) abort
|
||||||
if !has_key(s:coverage_browser_handler_jobs, a:job.id)
|
if !has_key(s:coverage_browser_handler_jobs, a:job.id)
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
@ -279,4 +367,5 @@ function! s:coverage_browser_handler(job, exit_status, data)
|
||||||
unlet s:coverage_browser_handler_jobs[a:job.id]
|
unlet s:coverage_browser_handler_jobs[a:job.id]
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
" vim: sw=2 ts=2 et
|
" vim: sw=2 ts=2 et
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
let s:go_stack = []
|
let s:go_stack = []
|
||||||
let s:go_stack_level = 0
|
let s:go_stack_level = 0
|
||||||
|
|
||||||
function! go#def#Jump(mode)
|
function! go#def#Jump(mode) abort
|
||||||
let old_gopath = $GOPATH
|
let old_gopath = $GOPATH
|
||||||
let $GOPATH = go#path#Detect()
|
let $GOPATH = go#path#Detect()
|
||||||
|
|
||||||
|
@ -27,42 +27,53 @@ function! go#def#Jump(mode)
|
||||||
endif
|
endif
|
||||||
let command = printf("%s -f=%s -o=%s -t", bin_path, fname, go#util#OffsetCursor())
|
let command = printf("%s -f=%s -o=%s -t", bin_path, fname, go#util#OffsetCursor())
|
||||||
let out = go#util#System(command)
|
let out = go#util#System(command)
|
||||||
|
|
||||||
" append the type information to the same line so our
|
|
||||||
" jump_to_declaration() function can parse it. This makes it
|
|
||||||
" compatible with guru definition as well too
|
|
||||||
let out = join(split(out, '\n'), ':')
|
|
||||||
if exists("l:tmpname")
|
if exists("l:tmpname")
|
||||||
call delete(l:tmpname)
|
call delete(l:tmpname)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
elseif bin_name == 'guru'
|
elseif bin_name == 'guru'
|
||||||
let flags = ""
|
|
||||||
let in = ""
|
|
||||||
|
|
||||||
if &modified
|
|
||||||
let sep = go#util#LineEnding()
|
|
||||||
let content = join(getline(1, '$'), sep)
|
|
||||||
let in = fname . "\n" . strlen(content) . "\n" . content
|
|
||||||
let flags .= " -modified"
|
|
||||||
endif
|
|
||||||
|
|
||||||
let bin_path = go#path#CheckBinPath("guru")
|
let bin_path = go#path#CheckBinPath("guru")
|
||||||
if empty(bin_path)
|
if empty(bin_path)
|
||||||
let $GOPATH = old_gopath
|
let $GOPATH = old_gopath
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if exists('g:go_guru_tags')
|
let cmd = [bin_path]
|
||||||
let tags = get(g:, 'go_guru_tags')
|
let stdin_content = ""
|
||||||
let flags .= printf(" -tags %s", tags)
|
|
||||||
endif
|
|
||||||
|
|
||||||
let fname = shellescape(fname.':#'.go#util#OffsetCursor())
|
|
||||||
let command = printf("%s %s definition %s", bin_path, flags, fname)
|
|
||||||
|
|
||||||
if &modified
|
if &modified
|
||||||
let out = go#util#System(command, in)
|
let sep = go#util#LineEnding()
|
||||||
|
let content = join(getline(1, '$'), sep)
|
||||||
|
let stdin_content = fname . "\n" . strlen(content) . "\n" . content
|
||||||
|
call add(cmd, "-modified")
|
||||||
|
endif
|
||||||
|
|
||||||
|
if exists('g:go_guru_tags')
|
||||||
|
let tags = get(g:, 'go_guru_tags')
|
||||||
|
call extend(cmd, ["-tags", tags])
|
||||||
|
endif
|
||||||
|
|
||||||
|
let fname = fname.':#'.go#util#OffsetCursor()
|
||||||
|
call extend(cmd, ["definition", fname])
|
||||||
|
|
||||||
|
if go#util#has_job()
|
||||||
|
let l:spawn_args = {
|
||||||
|
\ 'cmd': cmd,
|
||||||
|
\ 'custom_cb': function('s:jump_to_declaration_cb', [a:mode, bin_name]),
|
||||||
|
\ }
|
||||||
|
|
||||||
|
if &modified
|
||||||
|
let l:spawn_args.input = stdin_content
|
||||||
|
endif
|
||||||
|
|
||||||
|
call go#util#EchoProgress("searching declaration ...")
|
||||||
|
|
||||||
|
call s:def_job(spawn_args)
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let command = join(cmd, " ")
|
||||||
|
if &modified
|
||||||
|
let out = go#util#System(command, stdin_content)
|
||||||
else
|
else
|
||||||
let out = go#util#System(command)
|
let out = go#util#System(command)
|
||||||
endif
|
endif
|
||||||
|
@ -76,13 +87,28 @@ function! go#def#Jump(mode)
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
|
||||||
call s:jump_to_declaration(out, a:mode)
|
call s:jump_to_declaration(out, a:mode, bin_name)
|
||||||
let $GOPATH = old_gopath
|
let $GOPATH = old_gopath
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:jump_to_declaration(out, mode)
|
function! s:jump_to_declaration_cb(mode, bin_name, job, exit_status, data) abort
|
||||||
|
if a:exit_status != 0
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
call s:jump_to_declaration(a:data[0], a:mode, a:bin_name)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:jump_to_declaration(out, mode, bin_name) abort
|
||||||
|
let final_out = a:out
|
||||||
|
if a:bin_name == "godef"
|
||||||
|
" append the type information to the same line so our we can parse it.
|
||||||
|
" This makes it compatible with guru output.
|
||||||
|
let final_out = join(split(a:out, '\n'), ':')
|
||||||
|
endif
|
||||||
|
|
||||||
" strip line ending
|
" strip line ending
|
||||||
let out = split(a:out, go#util#LineEnding())[0]
|
let out = split(final_out, go#util#LineEnding())[0]
|
||||||
if go#util#IsWin()
|
if go#util#IsWin()
|
||||||
let parts = split(out, '\(^[a-zA-Z]\)\@<!:')
|
let parts = split(out, '\(^[a-zA-Z]\)\@<!:')
|
||||||
else
|
else
|
||||||
|
@ -120,7 +146,14 @@ function! s:jump_to_declaration(out, mode)
|
||||||
if get(g:, 'go_def_reuse_buffer', 0) && bufloaded(filename) != 0 && bufwinnr(filename) != -1
|
if get(g:, 'go_def_reuse_buffer', 0) && bufloaded(filename) != 0 && bufwinnr(filename) != -1
|
||||||
" jumpt to existing buffer if it exists
|
" jumpt to existing buffer if it exists
|
||||||
execute bufwinnr(filename) . 'wincmd w'
|
execute bufwinnr(filename) . 'wincmd w'
|
||||||
elseif a:mode == "tab"
|
else
|
||||||
|
if &modified
|
||||||
|
let cmd = 'hide edit'
|
||||||
|
else
|
||||||
|
let cmd = 'edit'
|
||||||
|
endif
|
||||||
|
|
||||||
|
if a:mode == "tab"
|
||||||
let &switchbuf = "usetab"
|
let &switchbuf = "usetab"
|
||||||
if bufloaded(filename) == 0
|
if bufloaded(filename) == 0
|
||||||
tab split
|
tab split
|
||||||
|
@ -132,7 +165,8 @@ function! s:jump_to_declaration(out, mode)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" open the file and jump to line and column
|
" open the file and jump to line and column
|
||||||
exec 'edit' filename
|
exec cmd filename
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
call cursor(line, col)
|
call cursor(line, col)
|
||||||
|
|
||||||
|
@ -142,7 +176,7 @@ function! s:jump_to_declaration(out, mode)
|
||||||
let &switchbuf = old_switchbuf
|
let &switchbuf = old_switchbuf
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#def#SelectStackEntry()
|
function! go#def#SelectStackEntry() abort
|
||||||
let target_window = go#ui#GetReturnWindow()
|
let target_window = go#ui#GetReturnWindow()
|
||||||
if empty(target_window)
|
if empty(target_window)
|
||||||
let target_window = winnr()
|
let target_window = winnr()
|
||||||
|
@ -157,7 +191,7 @@ function! go#def#SelectStackEntry()
|
||||||
call go#ui#CloseWindow()
|
call go#ui#CloseWindow()
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#def#StackUI()
|
function! go#def#StackUI() abort
|
||||||
if len(s:go_stack) == 0
|
if len(s:go_stack) == 0
|
||||||
call go#util#EchoError("godef stack empty")
|
call go#util#EchoError("godef stack empty")
|
||||||
return
|
return
|
||||||
|
@ -192,12 +226,12 @@ function! go#def#StackUI()
|
||||||
noremap <buffer> <silent> q :<C-U>call go#ui#CloseWindow()<CR>
|
noremap <buffer> <silent> q :<C-U>call go#ui#CloseWindow()<CR>
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#def#StackClear(...)
|
function! go#def#StackClear(...) abort
|
||||||
let s:go_stack = []
|
let s:go_stack = []
|
||||||
let s:go_stack_level = 0
|
let s:go_stack_level = 0
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#def#StackPop(...)
|
function! go#def#StackPop(...) abort
|
||||||
if len(s:go_stack) == 0
|
if len(s:go_stack) == 0
|
||||||
call go#util#EchoError("godef stack empty")
|
call go#util#EchoError("godef stack empty")
|
||||||
return
|
return
|
||||||
|
@ -218,7 +252,7 @@ function! go#def#StackPop(...)
|
||||||
call go#def#Stack(newLevel + 1)
|
call go#def#Stack(newLevel + 1)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#def#Stack(...)
|
function! go#def#Stack(...) abort
|
||||||
if len(s:go_stack) == 0
|
if len(s:go_stack) == 0
|
||||||
call go#util#EchoError("godef stack empty")
|
call go#util#EchoError("godef stack empty")
|
||||||
return
|
return
|
||||||
|
@ -246,7 +280,13 @@ function! go#def#Stack(...)
|
||||||
let target = s:go_stack[s:go_stack_level]
|
let target = s:go_stack[s:go_stack_level]
|
||||||
|
|
||||||
" jump
|
" jump
|
||||||
|
if expand('%:p') != target["file"]
|
||||||
|
if &modified
|
||||||
|
exec 'hide edit' target["file"]
|
||||||
|
else
|
||||||
exec 'edit' target["file"]
|
exec 'edit' target["file"]
|
||||||
|
endif
|
||||||
|
endif
|
||||||
call cursor(target["line"], target["col"])
|
call cursor(target["line"], target["col"])
|
||||||
normal! zz
|
normal! zz
|
||||||
else
|
else
|
||||||
|
@ -254,4 +294,27 @@ function! go#def#Stack(...)
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function s:def_job(args) abort
|
||||||
|
function! s:error_info_cb(job, exit_status, data) closure
|
||||||
|
" do not print anything during async definition search&jump
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
let a:args.error_info_cb = function('s:error_info_cb')
|
||||||
|
let callbacks = go#job#Spawn(a:args)
|
||||||
|
|
||||||
|
let start_options = {
|
||||||
|
\ 'callback': callbacks.callback,
|
||||||
|
\ 'close_cb': callbacks.close_cb,
|
||||||
|
\ }
|
||||||
|
|
||||||
|
if &modified
|
||||||
|
let l:tmpname = tempname()
|
||||||
|
call writefile(split(a:args.input, "\n"), l:tmpname, "b")
|
||||||
|
let l:start_options.in_io = "file"
|
||||||
|
let l:start_options.in_name = l:tmpname
|
||||||
|
endif
|
||||||
|
|
||||||
|
call job_start(a:args.cmd, start_options)
|
||||||
|
endfunction
|
||||||
|
|
||||||
" vim: sw=2 ts=2 et
|
" vim: sw=2 ts=2 et
|
||||||
|
|
|
@ -12,57 +12,39 @@ if !exists("g:go_doc_options")
|
||||||
let g:go_doc_options = ""
|
let g:go_doc_options = ""
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" returns the package and exported name. exported name might be empty.
|
function! go#doc#OpenBrowser(...) abort
|
||||||
" ie: fmt and Println
|
" check if we have gogetdoc as it gives us more and accurate information.
|
||||||
" ie: github.com/fatih/set and New
|
" Only supported if we have json_decode as it's not worth to parse the plain
|
||||||
function! s:godocWord(args)
|
" non-json output of gogetdoc
|
||||||
if !executable('godoc')
|
let bin_path = go#path#CheckBinPath('gogetdoc')
|
||||||
let msg = "godoc command not found."
|
if !empty(bin_path) && exists('*json_decode')
|
||||||
let msg .= " install with: go get golang.org/x/tools/cmd/godoc"
|
let json_out = s:gogetdoc(1)
|
||||||
call go#util#EchoWarning(msg)
|
if go#util#ShellError() != 0
|
||||||
return []
|
call go#util#EchoError(json_out)
|
||||||
|
return
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if !len(a:args)
|
let out = json_decode(json_out)
|
||||||
let oldiskeyword = &iskeyword
|
if type(out) != type({})
|
||||||
setlocal iskeyword+=.
|
call go#util#EchoError("gogetdoc output is malformed")
|
||||||
let word = expand('<cword>')
|
endif
|
||||||
let &iskeyword = oldiskeyword
|
|
||||||
let word = substitute(word, '[^a-zA-Z0-9\\/._~-]', '', 'g')
|
let import = out["import"]
|
||||||
let words = split(word, '\.\ze[^./]\+$')
|
let name = out["name"]
|
||||||
|
|
||||||
|
" if import is empty, it means we selected a package name
|
||||||
|
if import ==# ""
|
||||||
|
let godoc_url = "https://godoc.org/" . name
|
||||||
else
|
else
|
||||||
let words = a:args
|
let godoc_url = "https://godoc.org/" . import . "#" . name
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if !len(words)
|
echo godoc_url
|
||||||
return []
|
|
||||||
|
call go#tool#OpenBrowser(godoc_url)
|
||||||
|
return
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let pkg = words[0]
|
|
||||||
if len(words) == 1
|
|
||||||
let exported_name = ""
|
|
||||||
else
|
|
||||||
let exported_name = words[1]
|
|
||||||
endif
|
|
||||||
|
|
||||||
let packages = go#tool#Imports()
|
|
||||||
|
|
||||||
if has_key(packages, pkg)
|
|
||||||
let pkg = packages[pkg]
|
|
||||||
endif
|
|
||||||
|
|
||||||
return [pkg, exported_name]
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:godocNotFound(content)
|
|
||||||
if len(a:content) == 0
|
|
||||||
return 1
|
|
||||||
endif
|
|
||||||
|
|
||||||
return a:content =~# '^.*: no such file or directory\n$'
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! go#doc#OpenBrowser(...)
|
|
||||||
let pkgs = s:godocWord(a:000)
|
let pkgs = s:godocWord(a:000)
|
||||||
if empty(pkgs)
|
if empty(pkgs)
|
||||||
return
|
return
|
||||||
|
@ -76,7 +58,7 @@ function! go#doc#OpenBrowser(...)
|
||||||
call go#tool#OpenBrowser(godoc_url)
|
call go#tool#OpenBrowser(godoc_url)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#doc#Open(newmode, mode, ...)
|
function! go#doc#Open(newmode, mode, ...) abort
|
||||||
if len(a:000)
|
if len(a:000)
|
||||||
" check if we have 'godoc' and use it automatically
|
" check if we have 'godoc' and use it automatically
|
||||||
let bin_path = go#path#CheckBinPath('godoc')
|
let bin_path = go#path#CheckBinPath('godoc')
|
||||||
|
@ -87,34 +69,7 @@ function! go#doc#Open(newmode, mode, ...)
|
||||||
let command = printf("%s %s", bin_path, join(a:000, ' '))
|
let command = printf("%s %s", bin_path, join(a:000, ' '))
|
||||||
let out = go#util#System(command)
|
let out = go#util#System(command)
|
||||||
else
|
else
|
||||||
" check if we have 'gogetdoc' and use it automatically
|
let out = s:gogetdoc(0)
|
||||||
let bin_path = go#path#CheckBinPath('gogetdoc')
|
|
||||||
if empty(bin_path)
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
let offset = go#util#OffsetCursor()
|
|
||||||
let fname = expand("%:p:gs!\\!/!")
|
|
||||||
let pos = shellescape(fname.':#'.offset)
|
|
||||||
let command = printf("%s -pos %s", bin_path, pos)
|
|
||||||
|
|
||||||
if &modified
|
|
||||||
" gogetdoc supports the same archive format as guru for dealing with
|
|
||||||
" modified buffers.
|
|
||||||
" use the -modified flag
|
|
||||||
" write each archive entry on stdin as:
|
|
||||||
" filename followed by newline
|
|
||||||
" file size followed by newline
|
|
||||||
" file contents
|
|
||||||
let in = ""
|
|
||||||
let sep = go#util#LineEnding()
|
|
||||||
let content = join(getline(1, '$'), sep)
|
|
||||||
let in = fname . "\n" . strlen(content) . "\n" . content
|
|
||||||
let command .= " -modified"
|
|
||||||
let out = go#util#System(command, in)
|
|
||||||
else
|
|
||||||
let out = go#util#System(command)
|
|
||||||
endif
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if go#util#ShellError() != 0
|
if go#util#ShellError() != 0
|
||||||
|
@ -125,7 +80,7 @@ function! go#doc#Open(newmode, mode, ...)
|
||||||
call s:GodocView(a:newmode, a:mode, out)
|
call s:GodocView(a:newmode, a:mode, out)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:GodocView(newposition, position, content)
|
function! s:GodocView(newposition, position, content) abort
|
||||||
" reuse existing buffer window if it exists otherwise create a new one
|
" reuse existing buffer window if it exists otherwise create a new one
|
||||||
if !bufexists(s:buf_nr)
|
if !bufexists(s:buf_nr)
|
||||||
execute a:newposition
|
execute a:newposition
|
||||||
|
@ -169,4 +124,96 @@ function! s:GodocView(newposition, position, content)
|
||||||
noremap <buffer> <silent> <Esc> :<C-U>close<CR>
|
noremap <buffer> <silent> <Esc> :<C-U>close<CR>
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function! s:gogetdoc(json) abort
|
||||||
|
" check if we have 'gogetdoc' and use it automatically
|
||||||
|
let bin_path = go#path#CheckBinPath('gogetdoc')
|
||||||
|
if empty(bin_path)
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
|
||||||
|
let cmd = [bin_path]
|
||||||
|
|
||||||
|
let offset = go#util#OffsetCursor()
|
||||||
|
let fname = expand("%:p:gs!\\!/!")
|
||||||
|
let pos = shellescape(fname.':#'.offset)
|
||||||
|
|
||||||
|
let cmd += ["-pos", pos]
|
||||||
|
if a:json
|
||||||
|
let cmd += ["-json"]
|
||||||
|
endif
|
||||||
|
|
||||||
|
let command = join(cmd, " ")
|
||||||
|
|
||||||
|
if &modified
|
||||||
|
" gogetdoc supports the same archive format as guru for dealing with
|
||||||
|
" modified buffers.
|
||||||
|
" use the -modified flag
|
||||||
|
" write each archive entry on stdin as:
|
||||||
|
" filename followed by newline
|
||||||
|
" file size followed by newline
|
||||||
|
" file contents
|
||||||
|
let in = ""
|
||||||
|
let sep = go#util#LineEnding()
|
||||||
|
let content = join(getline(1, '$'), sep)
|
||||||
|
let in = fname . "\n" . strlen(content) . "\n" . content
|
||||||
|
let command .= " -modified"
|
||||||
|
let out = go#util#System(command, in)
|
||||||
|
else
|
||||||
|
let out = go#util#System(command)
|
||||||
|
endif
|
||||||
|
|
||||||
|
return out
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" returns the package and exported name. exported name might be empty.
|
||||||
|
" ie: fmt and Println
|
||||||
|
" ie: github.com/fatih/set and New
|
||||||
|
function! s:godocWord(args) abort
|
||||||
|
if !executable('godoc')
|
||||||
|
let msg = "godoc command not found."
|
||||||
|
let msg .= " install with: go get golang.org/x/tools/cmd/godoc"
|
||||||
|
call go#util#EchoWarning(msg)
|
||||||
|
return []
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !len(a:args)
|
||||||
|
let oldiskeyword = &iskeyword
|
||||||
|
setlocal iskeyword+=.
|
||||||
|
let word = expand('<cword>')
|
||||||
|
let &iskeyword = oldiskeyword
|
||||||
|
let word = substitute(word, '[^a-zA-Z0-9\\/._~-]', '', 'g')
|
||||||
|
let words = split(word, '\.\ze[^./]\+$')
|
||||||
|
else
|
||||||
|
let words = a:args
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !len(words)
|
||||||
|
return []
|
||||||
|
endif
|
||||||
|
|
||||||
|
let pkg = words[0]
|
||||||
|
if len(words) == 1
|
||||||
|
let exported_name = ""
|
||||||
|
else
|
||||||
|
let exported_name = words[1]
|
||||||
|
endif
|
||||||
|
|
||||||
|
let packages = go#tool#Imports()
|
||||||
|
|
||||||
|
if has_key(packages, pkg)
|
||||||
|
let pkg = packages[pkg]
|
||||||
|
endif
|
||||||
|
|
||||||
|
return [pkg, exported_name]
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:godocNotFound(content) abort
|
||||||
|
if len(a:content) == 0
|
||||||
|
return 1
|
||||||
|
endif
|
||||||
|
|
||||||
|
return a:content =~# '^.*: no such file or directory\n$'
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
" vim: sw=2 ts=2 et
|
" vim: sw=2 ts=2 et
|
||||||
|
|
|
@ -51,7 +51,7 @@ endif
|
||||||
" it doesn't undo changes and break undo history. If you are here reading
|
" it doesn't undo changes and break undo history. If you are here reading
|
||||||
" this and have VimL experience, please look at the function for
|
" this and have VimL experience, please look at the function for
|
||||||
" improvements, patches are welcome :)
|
" improvements, patches are welcome :)
|
||||||
function! go#fmt#Format(withGoimport)
|
function! go#fmt#Format(withGoimport) abort
|
||||||
if g:go_fmt_experimental == 1
|
if g:go_fmt_experimental == 1
|
||||||
" Using winsaveview to save/restore cursor state has the problem of
|
" Using winsaveview to save/restore cursor state has the problem of
|
||||||
" closing folds on save:
|
" closing folds on save:
|
||||||
|
@ -185,7 +185,7 @@ function! go#fmt#Format(withGoimport)
|
||||||
% | " Couldn't detect gofmt error format, output errors
|
% | " Couldn't detect gofmt error format, output errors
|
||||||
endif
|
endif
|
||||||
if !empty(errors)
|
if !empty(errors)
|
||||||
call go#list#Populate(l:listtype, errors)
|
call go#list#Populate(l:listtype, errors, 'Format')
|
||||||
echohl Error | echomsg "Gofmt returned error" | echohl None
|
echohl Error | echomsg "Gofmt returned error" | echohl None
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -215,7 +215,7 @@ function! go#fmt#Format(withGoimport)
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#fmt#ToggleFmtAutoSave()
|
function! go#fmt#ToggleFmtAutoSave() abort
|
||||||
if get(g:, "go_fmt_autosave", 1)
|
if get(g:, "go_fmt_autosave", 1)
|
||||||
let g:go_fmt_autosave = 0
|
let g:go_fmt_autosave = 0
|
||||||
call go#util#EchoProgress("auto fmt disabled")
|
call go#util#EchoProgress("auto fmt disabled")
|
||||||
|
|
|
@ -1,47 +1,63 @@
|
||||||
" guru.vim -- Vim integration for the Go guru.
|
" guru.vim -- Vim integration for the Go guru.
|
||||||
|
|
||||||
func! s:RunGuru(mode, format, selected, needs_scope) range abort
|
" guru_cmd returns a dict that contains the command to execute guru. option
|
||||||
|
" is dict with following options:
|
||||||
|
" mode : guru mode, such as 'implements'
|
||||||
|
" format : output format, either 'plain' or 'json'
|
||||||
|
" needs_scope : if 1, adds the current package to the scope
|
||||||
|
" selected : if 1, means it's a range of selection, otherwise it picks up the
|
||||||
|
" offset under the cursor
|
||||||
|
" example output:
|
||||||
|
" {'cmd' : ['guru', '-json', 'implements', 'demo/demo.go:#66']}
|
||||||
|
function! s:guru_cmd(args) range abort
|
||||||
|
let mode = a:args.mode
|
||||||
|
let format = a:args.format
|
||||||
|
let needs_scope = a:args.needs_scope
|
||||||
|
let selected = a:args.selected
|
||||||
|
|
||||||
|
let result = {}
|
||||||
|
let dirname = expand('%:p:h')
|
||||||
|
let pkg = go#package#ImportPath(dirname)
|
||||||
|
|
||||||
|
" this is important, check it!
|
||||||
|
if pkg == -1 && needs_scope
|
||||||
|
return {'err': "current directory is not inside of a valid GOPATH"}
|
||||||
|
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
|
||||||
|
|
||||||
let dirname = expand('%:p:h')
|
" start constructing the command
|
||||||
let pkg = go#package#ImportPath(dirname)
|
let cmd = [bin_path]
|
||||||
|
|
||||||
" this is important, check it!
|
|
||||||
if pkg == -1 && a:needs_scope
|
|
||||||
return {'err': "current directory is not inside of a valid GOPATH"}
|
|
||||||
endif
|
|
||||||
|
|
||||||
" start constructing the 'command' variable
|
|
||||||
let command = bin_path
|
|
||||||
|
|
||||||
let filename = fnamemodify(expand("%"), ':p:gs?\\?/?')
|
let filename = fnamemodify(expand("%"), ':p:gs?\\?/?')
|
||||||
let in = ""
|
let stdin_content = ""
|
||||||
if &modified
|
if &modified
|
||||||
let sep = go#util#LineEnding()
|
let sep = go#util#LineEnding()
|
||||||
let content = join(getline(1, '$'), sep )
|
let content = join(getline(1, '$'), sep )
|
||||||
let in = filename . "\n" . strlen(content) . "\n" . content
|
let result.stdin_content = filename . "\n" . strlen(content) . "\n" . content
|
||||||
let command .= " -modified"
|
call add(cmd, "-modified")
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" enable outputting in json format
|
" enable outputting in json format
|
||||||
if a:format == "json"
|
if format == "json"
|
||||||
let command .= " -json"
|
call add(cmd, "-json")
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" check for any tags
|
" check for any tags
|
||||||
if exists('g:go_guru_tags')
|
if exists('g:go_guru_tags')
|
||||||
let tags = get(g:, 'go_guru_tags')
|
let tags = get(g:, 'go_guru_tags')
|
||||||
let command .= printf(" -tags %s", tags)
|
call extend(cmd, ["-tags", tags])
|
||||||
|
let result.tags = tags
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" some modes require scope to be defined (such as callers). For these we
|
" some modes require scope to be defined (such as callers). For these we
|
||||||
" choose a sensible setting, which is using the current file's package
|
" choose a sensible setting, which is using the current file's package
|
||||||
let scopes = []
|
let scopes = []
|
||||||
if a:needs_scope
|
if needs_scope
|
||||||
let scopes = [pkg]
|
let scopes = [pkg]
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -66,274 +82,421 @@ func! s:RunGuru(mode, format, selected, needs_scope) range abort
|
||||||
let scopes = go#util#StripTrailingSlash(scopes)
|
let scopes = go#util#StripTrailingSlash(scopes)
|
||||||
|
|
||||||
" create shell-safe entries of the list
|
" create shell-safe entries of the list
|
||||||
let scopes = go#util#Shelllist(scopes)
|
if !go#util#has_job() | let scopes = go#util#Shelllist(scopes) | endif
|
||||||
|
|
||||||
" guru expect a comma-separated list of patterns, construct it
|
" guru expect a comma-separated list of patterns, construct it
|
||||||
let l:scope = join(scopes, ",")
|
let l:scope = join(scopes, ",")
|
||||||
let command .= printf(" -scope %s", l:scope)
|
let result.scope = l:scope
|
||||||
|
call extend(cmd, ["-scope", l:scope])
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let pos = printf("#%s", go#util#OffsetCursor())
|
let pos = printf("#%s", go#util#OffsetCursor())
|
||||||
if a:selected != -1
|
if selected != -1
|
||||||
" means we have a range, get it
|
" means we have a range, get it
|
||||||
let pos1 = go#util#Offset(line("'<"), col("'<"))
|
let pos1 = go#util#Offset(line("'<"), col("'<"))
|
||||||
let pos2 = go#util#Offset(line("'>"), col("'>"))
|
let pos2 = go#util#Offset(line("'>"), col("'>"))
|
||||||
let pos = printf("#%s,#%s", pos1, pos2)
|
let pos = printf("#%s,#%s", pos1, pos2)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" this is our final command
|
|
||||||
let filename .= ':'.pos
|
let filename .= ':'.pos
|
||||||
let command .= printf(' %s %s', a:mode, shellescape(filename))
|
call extend(cmd, [mode, filename])
|
||||||
|
|
||||||
|
let result.cmd = cmd
|
||||||
|
return result
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" sync_guru runs guru in sync mode with the given arguments
|
||||||
|
function! s:sync_guru(args) abort
|
||||||
|
let result = s:guru_cmd(a:args)
|
||||||
|
if has_key(result, 'err')
|
||||||
|
call go#util#EchoError(result.err)
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !has_key(a:args, 'disable_progress')
|
||||||
|
if a:args.needs_scope
|
||||||
|
call go#util#EchoProgress("analysing with scope ". result.scope . " ...")
|
||||||
|
elseif a:args.mode !=# 'what'
|
||||||
|
" the query might take time, let us give some feedback
|
||||||
|
call go#util#EchoProgress("analysing ...")
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
let old_gopath = $GOPATH
|
let old_gopath = $GOPATH
|
||||||
let $GOPATH = go#path#Detect()
|
let $GOPATH = go#path#Detect()
|
||||||
|
|
||||||
if a:needs_scope
|
|
||||||
call go#util#EchoProgress("analysing with scope ". l:scope . " ...")
|
|
||||||
elseif a:mode !=# 'what'
|
|
||||||
" the query might take time, let us give some feedback
|
|
||||||
call go#util#EchoProgress("analysing ...")
|
|
||||||
endif
|
|
||||||
|
|
||||||
" run, forrest run!!!
|
" run, forrest run!!!
|
||||||
|
let command = join(result.cmd, " ")
|
||||||
if &modified
|
if &modified
|
||||||
let out = go#util#System(command, in)
|
let out = go#util#System(command, result.stdin_content)
|
||||||
else
|
else
|
||||||
let out = go#util#System(command)
|
let out = go#util#System(command)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let $GOPATH = old_gopath
|
let $GOPATH = old_gopath
|
||||||
if go#util#ShellError() != 0
|
|
||||||
" the output contains the error message
|
if has_key(a:args, 'custom_parse')
|
||||||
return {'err' : out}
|
call a:args.custom_parse(go#util#ShellError(), out)
|
||||||
|
else
|
||||||
|
call s:parse_guru_output(go#util#ShellError(), out, a:args.mode)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
return {'out': out}
|
return out
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
" This uses Vim's errorformat to parse the output from Guru's 'plain output
|
" async_guru runs guru in async mode with the given arguments
|
||||||
" and put it into location list. I believe using errorformat is much more
|
function! s:async_guru(args) abort
|
||||||
" easier to use. If we need more power we can always switch back to parse it
|
let result = s:guru_cmd(a:args)
|
||||||
" via regex.
|
if has_key(result, 'err')
|
||||||
func! s:loclistSecond(output)
|
call go#util#EchoError(result.err)
|
||||||
" backup users errorformat, will be restored once we are finished
|
|
||||||
let old_errorformat = &errorformat
|
|
||||||
|
|
||||||
" match two possible styles of errorformats:
|
|
||||||
"
|
|
||||||
" 'file:line.col-line2.col2: message'
|
|
||||||
" 'file:line:col: message'
|
|
||||||
"
|
|
||||||
" We discard line2 and col2 for the first errorformat, because it's not
|
|
||||||
" useful and location only has the ability to show one line and column
|
|
||||||
" number
|
|
||||||
let errformat = "%f:%l.%c-%[%^:]%#:\ %m,%f:%l:%c:\ %m"
|
|
||||||
call go#list#ParseFormat("locationlist", errformat, split(a:output, "\n"))
|
|
||||||
|
|
||||||
let errors = go#list#Get("locationlist")
|
|
||||||
call go#list#Window("locationlist", len(errors))
|
|
||||||
endfun
|
|
||||||
|
|
||||||
|
|
||||||
function! go#guru#Scope(...)
|
|
||||||
if a:0
|
|
||||||
if a:0 == 1 && a:1 == '""'
|
|
||||||
unlet g:go_guru_scope
|
|
||||||
call go#util#EchoSuccess("guru scope is cleared")
|
|
||||||
else
|
|
||||||
let g:go_guru_scope = a:000
|
|
||||||
call go#util#EchoSuccess("guru scope changed to: ". join(a:000, ","))
|
|
||||||
endif
|
|
||||||
|
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if !exists('g:go_guru_scope')
|
let status_dir = expand('%:p:h')
|
||||||
call go#util#EchoError("guru scope is not set")
|
let statusline_type = printf("%s", a:args.mode)
|
||||||
else
|
|
||||||
call go#util#EchoSuccess("current guru scope: ". join(g:go_guru_scope, ","))
|
if !has_key(a:args, 'disable_progress')
|
||||||
|
if a:args.needs_scope
|
||||||
|
call go#util#EchoProgress("analysing with scope ". result.scope . " ...")
|
||||||
endif
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
function! s:close_cb(chan) closure
|
||||||
|
let messages = []
|
||||||
|
while ch_status(a:chan, {'part': 'out'}) == 'buffered'
|
||||||
|
let msg = ch_read(a:chan, {'part': 'out'})
|
||||||
|
call add(messages, msg)
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
while ch_status(a:chan, {'part': 'err'}) == 'buffered'
|
||||||
|
let msg = ch_read(a:chan, {'part': 'err'})
|
||||||
|
call add(messages, msg)
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
let l:job = ch_getjob(a:chan)
|
||||||
|
let l:info = job_info(l:job)
|
||||||
|
|
||||||
|
let out = join(messages, "\n")
|
||||||
|
|
||||||
|
let status = {
|
||||||
|
\ 'desc': 'last status',
|
||||||
|
\ 'type': statusline_type,
|
||||||
|
\ 'state': "finished",
|
||||||
|
\ }
|
||||||
|
|
||||||
|
if l:info.exitval
|
||||||
|
let status.state = "failed"
|
||||||
|
endif
|
||||||
|
|
||||||
|
call go#statusline#Update(status_dir, status)
|
||||||
|
|
||||||
|
if has_key(a:args, 'custom_parse')
|
||||||
|
call a:args.custom_parse(l:info.exitval, out)
|
||||||
|
else
|
||||||
|
call s:parse_guru_output(l:info.exitval, out, a:args.mode)
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
let start_options = {
|
||||||
|
\ 'close_cb': function("s:close_cb"),
|
||||||
|
\ }
|
||||||
|
|
||||||
|
if &modified
|
||||||
|
let l:tmpname = tempname()
|
||||||
|
call writefile(split(result.stdin_content, "\n"), l:tmpname, "b")
|
||||||
|
let l:start_options.in_io = "file"
|
||||||
|
let l:start_options.in_name = l:tmpname
|
||||||
|
endif
|
||||||
|
|
||||||
|
call go#statusline#Update(status_dir, {
|
||||||
|
\ 'desc': "current status",
|
||||||
|
\ 'type': statusline_type,
|
||||||
|
\ 'state': "analysing",
|
||||||
|
\})
|
||||||
|
|
||||||
|
return job_start(result.cmd, start_options)
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
" run_guru runs the given guru argument
|
||||||
|
function! s:run_guru(args) abort
|
||||||
|
if go#util#has_job()
|
||||||
|
return s:async_guru(a:args)
|
||||||
|
endif
|
||||||
|
|
||||||
|
return s:sync_guru(a:args)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#guru#Tags(...)
|
" Show 'implements' relation for selected package
|
||||||
if a:0
|
function! go#guru#Implements(selected) abort
|
||||||
if a:0 == 1 && a:1 == '""'
|
let args = {
|
||||||
unlet g:go_guru_tags
|
\ 'mode': 'implements',
|
||||||
call go#util#EchoSuccess("guru tags is cleared")
|
\ 'format': 'plain',
|
||||||
else
|
\ 'selected': a:selected,
|
||||||
let g:go_guru_tags = a:1
|
\ 'needs_scope': 1,
|
||||||
call go#util#EchoSuccess("guru tags changed to: ". a:1)
|
\ }
|
||||||
endif
|
|
||||||
|
|
||||||
return
|
call s:run_guru(args)
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists('g:go_guru_tags')
|
|
||||||
call go#util#EchoSuccess("guru tags is not set")
|
|
||||||
else
|
|
||||||
call go#util#EchoSuccess("current guru tags: ". a:1)
|
|
||||||
endif
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Report the possible constants, global variables, and concrete types that may
|
" Report the possible constants, global variables, and concrete types that may
|
||||||
" appear in a value of type error
|
" appear in a value of type error
|
||||||
function! go#guru#Whicherrs(selected)
|
function! go#guru#Whicherrs(selected) abort
|
||||||
let out = s:RunGuru('whicherrs', 'plain', a:selected, 1)
|
let args = {
|
||||||
if has_key(out, 'err')
|
\ 'mode': 'whicherrs',
|
||||||
call go#util#EchoError(out.err)
|
\ 'format': 'plain',
|
||||||
return
|
\ 'selected': a:selected,
|
||||||
endif
|
\ 'needs_scope': 1,
|
||||||
|
\ }
|
||||||
|
|
||||||
if empty(out.out)
|
|
||||||
call go#util#EchoSuccess("no error variables found. Try to change the scope with :GoGuruScope")
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
call s:loclistSecond(out.out)
|
" TODO(arslan): handle empty case for both sync/async
|
||||||
endfunction
|
" if empty(out.out)
|
||||||
|
" call go#util#EchoSuccess("no error variables found. Try to change the scope with :GoGuruScope")
|
||||||
" Show 'implements' relation for selected package
|
" return
|
||||||
function! go#guru#Implements(selected)
|
" endif
|
||||||
let out = s:RunGuru('implements', 'plain', a:selected, 1)
|
call s:run_guru(args)
|
||||||
if has_key(out, 'err')
|
|
||||||
call go#util#EchoError(out.err)
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
call s:loclistSecond(out.out)
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Describe selected syntax: definition, methods, etc
|
" Describe selected syntax: definition, methods, etc
|
||||||
function! go#guru#Describe(selected)
|
function! go#guru#Describe(selected) abort
|
||||||
let out = s:RunGuru('describe', 'plain', a:selected, 0)
|
let args = {
|
||||||
if has_key(out, 'err')
|
\ 'mode': 'describe',
|
||||||
call go#util#EchoError(out.err)
|
\ 'format': 'plain',
|
||||||
|
\ 'selected': a:selected,
|
||||||
|
\ 'needs_scope': 1,
|
||||||
|
\ }
|
||||||
|
|
||||||
|
call s:run_guru(args)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#guru#DescribeInfo() abort
|
||||||
|
" json_encode() and friends are introduced with this patch (7.4.1304)
|
||||||
|
" vim: https://groups.google.com/d/msg/vim_dev/vLupTNhQhZ8/cDGIk0JEDgAJ
|
||||||
|
" nvim: https://github.com/neovim/neovim/pull/4131
|
||||||
|
if !exists("*json_decode")
|
||||||
|
call go#util#EchoError("requires 'json_decode'. Update your Vim/Neovim version.")
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
|
||||||
call s:loclistSecond(out.out)
|
function! s:info(exit_val, output)
|
||||||
|
if a:exit_val != 0
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
if a:output[0] !=# '{'
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
if empty(a:output) || type(a:output) != type("")
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let result = json_decode(a:output)
|
||||||
|
if type(result) != type({})
|
||||||
|
call go#util#EchoError(printf("malformed output from guru: %s", a:output))
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !has_key(result, 'detail')
|
||||||
|
" if there is no detail check if there is a description and print it
|
||||||
|
if has_key(result, "desc")
|
||||||
|
call go#util#EchoInfo(result["desc"])
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
call go#util#EchoError("detail key is missing. Please open a bug report on vim-go repo.")
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let detail = result['detail']
|
||||||
|
let info = ""
|
||||||
|
|
||||||
|
" guru gives different information based on the detail mode. Let try to
|
||||||
|
" extract the most useful information
|
||||||
|
|
||||||
|
if detail == "value"
|
||||||
|
if !has_key(result, 'value')
|
||||||
|
call go#util#EchoError("value key is missing. Please open a bug report on vim-go repo.")
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let val = result["value"]
|
||||||
|
if !has_key(val, 'type')
|
||||||
|
call go#util#EchoError("type key is missing (value.type). Please open a bug report on vim-go repo.")
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let info = val["type"]
|
||||||
|
elseif detail == "type"
|
||||||
|
if !has_key(result, 'type')
|
||||||
|
call go#util#EchoError("type key is missing. Please open a bug report on vim-go repo.")
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let type = result["type"]
|
||||||
|
if !has_key(type, 'type')
|
||||||
|
call go#util#EchoError("type key is missing (type.type). Please open a bug report on vim-go repo.")
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let info = type["type"]
|
||||||
|
elseif detail == "package"
|
||||||
|
if !has_key(result, 'package')
|
||||||
|
call go#util#EchoError("package key is missing. Please open a bug report on vim-go repo.")
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let package = result["package"]
|
||||||
|
if !has_key(package, 'path')
|
||||||
|
call go#util#EchoError("path key is missing (package.path). Please open a bug report on vim-go repo.")
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let info = printf("package %s", package["path"])
|
||||||
|
elseif detail == "unknown"
|
||||||
|
let info = result["desc"]
|
||||||
|
else
|
||||||
|
call go#util#EchoError(printf("unknown detail mode found '%s'. Please open a bug report on vim-go repo", detail))
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
call go#util#EchoInfo(info)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
let args = {
|
||||||
|
\ 'mode': 'describe',
|
||||||
|
\ 'format': 'json',
|
||||||
|
\ 'selected': -1,
|
||||||
|
\ 'needs_scope': 1,
|
||||||
|
\ 'custom_parse': function('s:info'),
|
||||||
|
\ 'disable_progress': 1,
|
||||||
|
\ }
|
||||||
|
|
||||||
|
call s:run_guru(args)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Show possible targets of selected function call
|
" Show possible targets of selected function call
|
||||||
function! go#guru#Callees(selected)
|
function! go#guru#Callees(selected) abort
|
||||||
let out = s:RunGuru('callees', 'plain', a:selected, 1)
|
let args = {
|
||||||
if has_key(out, 'err')
|
\ 'mode': 'callees',
|
||||||
call go#util#EchoError(out.err)
|
\ 'format': 'plain',
|
||||||
return
|
\ 'selected': a:selected,
|
||||||
endif
|
\ 'needs_scope': 1,
|
||||||
|
\ }
|
||||||
|
|
||||||
call s:loclistSecond(out.out)
|
call s:run_guru(args)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Show possible callers of selected function
|
" Show possible callers of selected function
|
||||||
function! go#guru#Callers(selected)
|
function! go#guru#Callers(selected) abort
|
||||||
let out = s:RunGuru('callers', 'plain', a:selected, 1)
|
let args = {
|
||||||
if has_key(out, 'err')
|
\ 'mode': 'callers',
|
||||||
call go#util#EchoError(out.err)
|
\ 'format': 'plain',
|
||||||
return
|
\ 'selected': a:selected,
|
||||||
endif
|
\ 'needs_scope': 1,
|
||||||
|
\ }
|
||||||
|
|
||||||
call s:loclistSecond(out.out)
|
call s:run_guru(args)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Show path from callgraph root to selected function
|
" Show path from callgraph root to selected function
|
||||||
function! go#guru#Callstack(selected)
|
function! go#guru#Callstack(selected) abort
|
||||||
let out = s:RunGuru('callstack', 'plain', a:selected, 1)
|
let args = {
|
||||||
if has_key(out, 'err')
|
\ 'mode': 'callstack',
|
||||||
call go#util#EchoError(out.err)
|
\ 'format': 'plain',
|
||||||
return
|
\ 'selected': a:selected,
|
||||||
endif
|
\ 'needs_scope': 1,
|
||||||
|
\ }
|
||||||
|
|
||||||
call s:loclistSecond(out.out)
|
call s:run_guru(args)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Show free variables of selection
|
" Show free variables of selection
|
||||||
function! go#guru#Freevars(selected)
|
function! go#guru#Freevars(selected) abort
|
||||||
" Freevars requires a selection
|
" Freevars requires a selection
|
||||||
if a:selected == -1
|
if a:selected == -1
|
||||||
call go#util#EchoError("GoFreevars requires a selection (range) of code")
|
call go#util#EchoError("GoFreevars requires a selection (range) of code")
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let out = s:RunGuru('freevars', 'plain', a:selected, 0)
|
let args = {
|
||||||
if has_key(out, 'err')
|
\ 'mode': 'freevars',
|
||||||
call go#util#EchoError(out.err)
|
\ 'format': 'plain',
|
||||||
return
|
\ 'selected': 1,
|
||||||
endif
|
\ 'needs_scope': 0,
|
||||||
|
\ }
|
||||||
|
|
||||||
call s:loclistSecond(out.out)
|
call s:run_guru(args)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Show send/receive corresponding to selected channel op
|
" Show send/receive corresponding to selected channel op
|
||||||
function! go#guru#ChannelPeers(selected)
|
function! go#guru#ChannelPeers(selected) abort
|
||||||
let out = s:RunGuru('peers', 'plain', a:selected, 1)
|
let args = {
|
||||||
if has_key(out, 'err')
|
\ 'mode': 'peers',
|
||||||
call go#util#EchoError(out.err)
|
\ 'format': 'plain',
|
||||||
return
|
\ 'selected': a:selected,
|
||||||
endif
|
\ 'needs_scope': 1,
|
||||||
|
\ }
|
||||||
|
|
||||||
call s:loclistSecond(out.out)
|
call s:run_guru(args)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Show all refs to entity denoted by selected identifier
|
" Show all refs to entity denoted by selected identifier
|
||||||
function! go#guru#Referrers(selected)
|
function! go#guru#Referrers(selected) abort
|
||||||
let out = s:RunGuru('referrers', 'plain', a:selected, 0)
|
let args = {
|
||||||
if has_key(out, 'err')
|
\ 'mode': 'referrers',
|
||||||
call go#util#EchoError(out.err)
|
\ 'format': 'plain',
|
||||||
|
\ 'selected': a:selected,
|
||||||
|
\ 'needs_scope': 0,
|
||||||
|
\ }
|
||||||
|
|
||||||
|
call s:run_guru(args)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#guru#SameIdsTimer() abort
|
||||||
|
call timer_start(200, function('go#guru#SameIds'), {'repeat': -1})
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#guru#SameIds() abort
|
||||||
|
" we use matchaddpos() which was introduce with 7.4.330, be sure we have
|
||||||
|
" it: http://ftp.vim.org/vim/patches/7.4/7.4.330
|
||||||
|
if !exists("*matchaddpos")
|
||||||
|
call go#util#EchoError("GoSameIds requires 'matchaddpos'. Update your Vim/Neovim version.")
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
|
||||||
call s:loclistSecond(out.out)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! go#guru#What(selected)
|
|
||||||
" 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")
|
||||||
return {'err': "GoWhat is not supported due old version of Vim/Neovim"}
|
call go#util#EchoError("GoSameIds requires 'json_decode'. Update your Vim/Neovim version.")
|
||||||
endif
|
|
||||||
|
|
||||||
let out = s:RunGuru('what', 'json', a:selected, 0)
|
|
||||||
if has_key(out, 'err')
|
|
||||||
return {'err': out.err}
|
|
||||||
endif
|
|
||||||
|
|
||||||
let result = json_decode(out.out)
|
|
||||||
|
|
||||||
if type(result) != type({})
|
|
||||||
return {'err': "malformed output from guru"}
|
|
||||||
endif
|
|
||||||
|
|
||||||
return result
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! go#guru#AutoToogleSameIds()
|
|
||||||
if get(g:, "go_auto_sameids", 0)
|
|
||||||
call go#util#EchoProgress("sameids auto highlighting disabled")
|
|
||||||
call go#guru#ClearSameIds()
|
|
||||||
let g:go_auto_sameids = 0
|
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
|
||||||
call go#util#EchoSuccess("sameids auto highlighting enabled")
|
let args = {
|
||||||
let g:go_auto_sameids = 1
|
\ 'mode': 'what',
|
||||||
|
\ 'format': 'json',
|
||||||
|
\ 'selected': -1,
|
||||||
|
\ 'needs_scope': 0,
|
||||||
|
\ 'custom_parse': function('s:same_ids_highlight'),
|
||||||
|
\ }
|
||||||
|
|
||||||
|
call s:run_guru(args)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#guru#SameIds(selected)
|
function! s:same_ids_highlight(exit_val, output) abort
|
||||||
" we use matchaddpos() which was introduce with 7.4.330, be sure we have
|
|
||||||
" it: http://ftp.vim.org/vim/patches/7.4/7.4.330
|
|
||||||
if !exists("*matchaddpos")
|
|
||||||
call go#util#EchoError("GoSameIds is supported with Vim version 7.4-330 or later")
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
let result = go#guru#What(a:selected)
|
|
||||||
|
|
||||||
call go#guru#ClearSameIds() " run after calling guru to reduce flicker.
|
call go#guru#ClearSameIds() " run after calling guru to reduce flicker.
|
||||||
if has_key(result, 'err') && !get(g:, 'go_auto_sameids', 0)
|
|
||||||
" only echo if it's called via `:GoSameIds, but not if it's in automode
|
if a:output[0] !=# '{'
|
||||||
call go#util#EchoError(result.err)
|
if !get(g:, 'go_auto_sameids', 0)
|
||||||
|
call go#util#EchoError(a:output)
|
||||||
|
endif
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let result = json_decode(a:output)
|
||||||
|
if type(result) != type({}) && !get(g:, 'go_auto_sameids', 0)
|
||||||
|
call go#util#EchoError("malformed output from guru")
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -367,11 +530,11 @@ function! go#guru#SameIds(selected)
|
||||||
if get(g:, "go_auto_sameids", 0)
|
if get(g:, "go_auto_sameids", 0)
|
||||||
" re-apply SameIds at the current cursor position at the time the buffer
|
" re-apply SameIds at the current cursor position at the time the buffer
|
||||||
" is redisplayed: e.g. :edit, :GoRename, etc.
|
" is redisplayed: e.g. :edit, :GoRename, etc.
|
||||||
autocmd BufWinEnter <buffer> nested call go#guru#SameIds(-1)
|
autocmd BufWinEnter <buffer> nested call go#guru#SameIds()
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#guru#ClearSameIds()
|
function! go#guru#ClearSameIds() abort
|
||||||
let m = getmatches()
|
let m = getmatches()
|
||||||
for item in m
|
for item in m
|
||||||
if item['group'] == 'goSameId'
|
if item['group'] == 'goSameId'
|
||||||
|
@ -385,11 +548,94 @@ function! go#guru#ClearSameIds()
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#guru#ToggleSameIds(selected)
|
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(a:selected)
|
call go#guru#SameIds()
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#guru#AutoToogleSameIds() abort
|
||||||
|
if get(g:, "go_auto_sameids", 0)
|
||||||
|
call go#util#EchoProgress("sameids auto highlighting disabled")
|
||||||
|
call go#guru#ClearSameIds()
|
||||||
|
let g:go_auto_sameids = 0
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
call go#util#EchoSuccess("sameids auto highlighting enabled")
|
||||||
|
let g:go_auto_sameids = 1
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
""""""""""""""""""""""""""""""""""""""""
|
||||||
|
"" HELPER FUNCTIONS
|
||||||
|
""""""""""""""""""""""""""""""""""""""""
|
||||||
|
|
||||||
|
" This uses Vim's errorformat to parse the output from Guru's 'plain output
|
||||||
|
" and put it into location list. I believe using errorformat is much more
|
||||||
|
" easier to use. If we need more power we can always switch back to parse it
|
||||||
|
" via regex. Match two possible styles of errorformats:
|
||||||
|
"
|
||||||
|
" 'file:line.col-line2.col2: message'
|
||||||
|
" 'file:line:col: message'
|
||||||
|
"
|
||||||
|
" We discard line2 and col2 for the first errorformat, because it's not
|
||||||
|
" useful and location only has the ability to show one line and column
|
||||||
|
" number
|
||||||
|
function! s:parse_guru_output(exit_val, output, title) abort
|
||||||
|
if a:exit_val
|
||||||
|
call go#util#EchoError(a:output)
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let old_errorformat = &errorformat
|
||||||
|
let errformat = "%f:%l.%c-%[%^:]%#:\ %m,%f:%l:%c:\ %m"
|
||||||
|
call go#list#ParseFormat("locationlist", errformat, a:output, a:title)
|
||||||
|
let &errorformat = old_errorformat
|
||||||
|
|
||||||
|
let errors = go#list#Get("locationlist")
|
||||||
|
call go#list#Window("locationlist", len(errors))
|
||||||
|
endfun
|
||||||
|
|
||||||
|
function! go#guru#Scope(...) abort
|
||||||
|
if a:0
|
||||||
|
if a:0 == 1 && a:1 == '""'
|
||||||
|
unlet g:go_guru_scope
|
||||||
|
call go#util#EchoSuccess("guru scope is cleared")
|
||||||
|
else
|
||||||
|
let g:go_guru_scope = a:000
|
||||||
|
call go#util#EchoSuccess("guru scope changed to: ". join(a:000, ","))
|
||||||
|
endif
|
||||||
|
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists('g:go_guru_scope')
|
||||||
|
call go#util#EchoError("guru scope is not set")
|
||||||
|
else
|
||||||
|
call go#util#EchoSuccess("current guru scope: ". join(g:go_guru_scope, ","))
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#guru#Tags(...) abort
|
||||||
|
if a:0
|
||||||
|
if a:0 == 1 && a:1 == '""'
|
||||||
|
unlet g:go_guru_tags
|
||||||
|
call go#util#EchoSuccess("guru tags is cleared")
|
||||||
|
else
|
||||||
|
let g:go_guru_tags = a:1
|
||||||
|
call go#util#EchoSuccess("guru tags changed to: ". a:1)
|
||||||
|
endif
|
||||||
|
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists('g:go_guru_tags')
|
||||||
|
call go#util#EchoSuccess("guru tags is not set")
|
||||||
|
else
|
||||||
|
call go#util#EchoSuccess("current guru tags: ". a:1)
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
function! go#impl#Impl(...)
|
function! go#impl#Impl(...) abort
|
||||||
let binpath = go#path#CheckBinPath('impl')
|
let binpath = go#path#CheckBinPath('impl')
|
||||||
if empty(binpath)
|
if empty(binpath)
|
||||||
return
|
return
|
||||||
|
@ -69,7 +69,7 @@ else
|
||||||
endfunction
|
endfunction
|
||||||
endif
|
endif
|
||||||
|
|
||||||
function! s:root_dirs()
|
function! s:root_dirs() abort
|
||||||
let dirs = []
|
let dirs = []
|
||||||
let root = go#util#goroot()
|
let root = go#util#goroot()
|
||||||
if root !=# '' && isdirectory(root)
|
if root !=# '' && isdirectory(root)
|
||||||
|
@ -88,7 +88,7 @@ function! s:root_dirs()
|
||||||
return dirs
|
return dirs
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:go_packages(dirs)
|
function! s:go_packages(dirs) abort
|
||||||
let pkgs = []
|
let pkgs = []
|
||||||
for d in a:dirs
|
for d in a:dirs
|
||||||
let pkg_root = expand(d . '/pkg/' . go#util#osarch())
|
let pkg_root = expand(d . '/pkg/' . go#util#osarch())
|
||||||
|
@ -97,7 +97,7 @@ function! s:go_packages(dirs)
|
||||||
return map(pkgs, "fnamemodify(v:val, ':t:r')")
|
return map(pkgs, "fnamemodify(v:val, ':t:r')")
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:interface_list(pkg)
|
function! s:interface_list(pkg) abort
|
||||||
let contents = split(go#util#System('go doc ' . a:pkg), "\n")
|
let contents = split(go#util#System('go doc ' . a:pkg), "\n")
|
||||||
if go#util#ShellError()
|
if go#util#ShellError()
|
||||||
return []
|
return []
|
||||||
|
@ -108,7 +108,7 @@ function! s:interface_list(pkg)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Complete package and interface for {interface}
|
" Complete package and interface for {interface}
|
||||||
function! go#impl#Complete(arglead, cmdline, cursorpos)
|
function! go#impl#Complete(arglead, cmdline, cursorpos) abort
|
||||||
let words = split(a:cmdline, '\s\+', 1)
|
let words = split(a:cmdline, '\s\+', 1)
|
||||||
if words[-1] ==# ''
|
if words[-1] ==# ''
|
||||||
return s:uniq(sort(s:go_packages(s:root_dirs())))
|
return s:uniq(sort(s:go_packages(s:root_dirs())))
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
"
|
"
|
||||||
" Check out the docs for more information at /doc/vim-go.txt
|
" Check out the docs for more information at /doc/vim-go.txt
|
||||||
"
|
"
|
||||||
function! go#import#SwitchImport(enabled, localname, path, bang)
|
function! go#import#SwitchImport(enabled, localname, path, bang) abort
|
||||||
let view = winsaveview()
|
let view = winsaveview()
|
||||||
let path = substitute(a:path, '^\s*\(.\{-}\)\s*$', '\1', '')
|
let path = substitute(a:path, '^\s*\(.\{-}\)\s*$', '\1', '')
|
||||||
|
|
||||||
|
@ -205,7 +205,7 @@ function! go#import#SwitchImport(enabled, localname, path, bang)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
function! s:Error(s)
|
function! s:Error(s) abort
|
||||||
echohl Error | echo a:s | echohl None
|
echohl Error | echo a:s | echohl None
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
|
109
sources_non_forked/vim-go/autoload/go/job.vim
Normal file
109
sources_non_forked/vim-go/autoload/go/job.vim
Normal file
|
@ -0,0 +1,109 @@
|
||||||
|
" Spawn returns callbacks to be used with job_start. It's abstracted to be
|
||||||
|
" used with various go command, such as build, test, install, etc.. This avoid
|
||||||
|
" us to write the same callback over and over for some commands. It's fully
|
||||||
|
" customizable so each command can change it to it's own logic.
|
||||||
|
function go#job#Spawn(args)
|
||||||
|
let cbs = {
|
||||||
|
\ 'winnr': winnr(),
|
||||||
|
\ 'dir': getcwd(),
|
||||||
|
\ 'jobdir': fnameescape(expand("%:p:h")),
|
||||||
|
\ 'messages': [],
|
||||||
|
\ 'args': a:args.cmd,
|
||||||
|
\ 'bang': 0,
|
||||||
|
\ }
|
||||||
|
|
||||||
|
if has_key(a:args, 'bang')
|
||||||
|
let cbs.bang = a:args.bang
|
||||||
|
endif
|
||||||
|
|
||||||
|
" add final callback to be called if async job is finished
|
||||||
|
" The signature should be in form: func(job, exit_status, messages)
|
||||||
|
if has_key(a:args, 'custom_cb')
|
||||||
|
let cbs.custom_cb = a:args.custom_cb
|
||||||
|
endif
|
||||||
|
|
||||||
|
if has_key(a:args, 'error_info_cb')
|
||||||
|
let cbs.error_info_cb = a:args.error_info_cb
|
||||||
|
endif
|
||||||
|
|
||||||
|
function cbs.callback(chan, msg) dict
|
||||||
|
call add(self.messages, a:msg)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function cbs.close_cb(chan) dict
|
||||||
|
let l:job = ch_getjob(a:chan)
|
||||||
|
let l:status = job_status(l:job)
|
||||||
|
|
||||||
|
" the job might be in fail status, we assume by default it's failed.
|
||||||
|
" However if it's dead, we can use the real exitval
|
||||||
|
let exitval = 1
|
||||||
|
if l:status == "dead"
|
||||||
|
let l:info = job_info(l:job)
|
||||||
|
let exitval = l:info.exitval
|
||||||
|
endif
|
||||||
|
|
||||||
|
if has_key(self, 'custom_cb')
|
||||||
|
call self.custom_cb(l:job, exitval, self.messages)
|
||||||
|
endif
|
||||||
|
|
||||||
|
if has_key(self, 'error_info_cb')
|
||||||
|
call self.error_info_cb(l:job, exitval, self.messages)
|
||||||
|
endif
|
||||||
|
|
||||||
|
if get(g:, 'go_echo_command_info', 1)
|
||||||
|
if exitval == 0
|
||||||
|
call go#util#EchoSuccess("SUCCESS")
|
||||||
|
else
|
||||||
|
call go#util#EchoError("FAILED")
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
let l:listtype = go#list#Type("quickfix")
|
||||||
|
if exitval == 0
|
||||||
|
call go#list#Clean(l:listtype)
|
||||||
|
call go#list#Window(l:listtype)
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
call self.show_errors(l:listtype)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function cbs.show_errors(listtype) dict
|
||||||
|
let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd '
|
||||||
|
try
|
||||||
|
execute cd self.jobdir
|
||||||
|
let errors = go#tool#ParseErrors(self.messages)
|
||||||
|
let errors = go#tool#FilterValids(errors)
|
||||||
|
finally
|
||||||
|
execute cd . fnameescape(self.dir)
|
||||||
|
endtry
|
||||||
|
|
||||||
|
if !len(errors)
|
||||||
|
" failed to parse errors, output the original content
|
||||||
|
call go#util#EchoError(join(self.messages, " "))
|
||||||
|
call go#util#EchoError(self.dir)
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
if self.winnr == winnr()
|
||||||
|
call go#list#Populate(a:listtype, errors, join(self.args))
|
||||||
|
call go#list#Window(a:listtype, len(errors))
|
||||||
|
if !empty(errors) && !self.bang
|
||||||
|
call go#list#JumpToFirst(a:listtype)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" override callback handler if user provided it
|
||||||
|
if has_key(a:args, 'callback')
|
||||||
|
let cbs.callback = a:args.callback
|
||||||
|
endif
|
||||||
|
|
||||||
|
" override close callback handler if user provided it
|
||||||
|
if has_key(a:args, 'close_cb')
|
||||||
|
let cbs.close_cb = a:args.close_cb
|
||||||
|
endif
|
||||||
|
|
||||||
|
return cbs
|
||||||
|
endfunction
|
||||||
|
" vim: sw=2 ts=2 et
|
|
@ -9,7 +9,7 @@ let s:handlers = {}
|
||||||
" Spawn is a wrapper around s:spawn. It can be executed by other files and
|
" Spawn is a wrapper around s:spawn. It can be executed by other files and
|
||||||
" scripts if needed. Desc defines the description for printing the status
|
" scripts if needed. Desc defines the description for printing the status
|
||||||
" during the job execution (useful for statusline integration).
|
" during the job execution (useful for statusline integration).
|
||||||
function! go#jobcontrol#Spawn(bang, desc, args)
|
function! go#jobcontrol#Spawn(bang, desc, args) abort
|
||||||
" autowrite is not enabled for jobs
|
" autowrite is not enabled for jobs
|
||||||
call go#cmd#autowrite()
|
call go#cmd#autowrite()
|
||||||
|
|
||||||
|
@ -17,31 +17,8 @@ function! go#jobcontrol#Spawn(bang, desc, args)
|
||||||
return job.id
|
return job.id
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Statusline returns the current status of the job
|
|
||||||
function! go#jobcontrol#Statusline() abort
|
|
||||||
if empty(s:jobs)
|
|
||||||
return ''
|
|
||||||
endif
|
|
||||||
|
|
||||||
let import_path = go#package#ImportPath(expand('%:p:h'))
|
|
||||||
|
|
||||||
for job in values(s:jobs)
|
|
||||||
if job.importpath != import_path
|
|
||||||
continue
|
|
||||||
endif
|
|
||||||
|
|
||||||
if job.state == "SUCCESS"
|
|
||||||
return ''
|
|
||||||
endif
|
|
||||||
|
|
||||||
return printf("%s ... [%s]", job.desc, job.state)
|
|
||||||
endfor
|
|
||||||
|
|
||||||
return ''
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" AddHandler adds a on_exit callback handler and returns the id.
|
" AddHandler adds a on_exit callback handler and returns the id.
|
||||||
function! go#jobcontrol#AddHandler(handler)
|
function! go#jobcontrol#AddHandler(handler) abort
|
||||||
let i = len(s:handlers)
|
let i = len(s:handlers)
|
||||||
while has_key(s:handlers, string(i))
|
while has_key(s:handlers, string(i))
|
||||||
let i += 1
|
let i += 1
|
||||||
|
@ -52,7 +29,7 @@ function! go#jobcontrol#AddHandler(handler)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" RemoveHandler removes a callback handler by id.
|
" RemoveHandler removes a callback handler by id.
|
||||||
function! go#jobcontrol#RemoveHandler(id)
|
function! go#jobcontrol#RemoveHandler(id) abort
|
||||||
unlet s:handlers[a:id]
|
unlet s:handlers[a:id]
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
@ -60,7 +37,7 @@ endfunction
|
||||||
" a job is started a reference will be stored inside s:jobs. spawn changes the
|
" a job is started a reference will be stored inside s:jobs. spawn changes the
|
||||||
" GOPATH when g:go_autodetect_gopath is enabled. The job is started inside the
|
" GOPATH when g:go_autodetect_gopath is enabled. The job is started inside the
|
||||||
" current files folder.
|
" current files folder.
|
||||||
function! s:spawn(bang, desc, args)
|
function! s:spawn(bang, desc, args) abort
|
||||||
let job = {
|
let job = {
|
||||||
\ 'desc': a:desc,
|
\ 'desc': a:desc,
|
||||||
\ 'bang': a:bang,
|
\ 'bang': a:bang,
|
||||||
|
@ -113,7 +90,7 @@ endfunction
|
||||||
" references and also displaying errors in the quickfix window collected by
|
" references and also displaying errors in the quickfix window collected by
|
||||||
" on_stderr handler. If there are no errors and a quickfix window is open,
|
" on_stderr handler. If there are no errors and a quickfix window is open,
|
||||||
" it'll be closed.
|
" it'll be closed.
|
||||||
function! s:on_exit(job_id, exit_status)
|
function! s:on_exit(job_id, exit_status, event) dict abort
|
||||||
let std_combined = self.stderr + self.stdout
|
let std_combined = self.stderr + self.stdout
|
||||||
|
|
||||||
let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd '
|
let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd '
|
||||||
|
@ -122,9 +99,10 @@ function! s:on_exit(job_id, exit_status)
|
||||||
|
|
||||||
call s:callback_handlers_on_exit(s:jobs[a:job_id], a:exit_status, std_combined)
|
call s:callback_handlers_on_exit(s:jobs[a:job_id], a:exit_status, std_combined)
|
||||||
|
|
||||||
|
let l:listtype = go#list#Type("quickfix")
|
||||||
if a:exit_status == 0
|
if a:exit_status == 0
|
||||||
call go#list#Clean(0)
|
call go#list#Clean(l:listtype)
|
||||||
call go#list#Window(0)
|
call go#list#Window(l:listtype)
|
||||||
|
|
||||||
let self.state = "SUCCESS"
|
let self.state = "SUCCESS"
|
||||||
call go#util#EchoSuccess("SUCCESS")
|
call go#util#EchoSuccess("SUCCESS")
|
||||||
|
@ -149,8 +127,7 @@ function! s:on_exit(job_id, exit_status)
|
||||||
|
|
||||||
" if we are still in the same windows show the list
|
" if we are still in the same windows show the list
|
||||||
if self.winnr == winnr()
|
if self.winnr == winnr()
|
||||||
let l:listtype = "locationlist"
|
call go#list#Populate(l:listtype, errors, self.desc)
|
||||||
call go#list#Populate(l:listtype, errors)
|
|
||||||
call go#list#Window(l:listtype, len(errors))
|
call go#list#Window(l:listtype, len(errors))
|
||||||
if !empty(errors) && !self.bang
|
if !empty(errors) && !self.bang
|
||||||
call go#list#JumpToFirst(l:listtype)
|
call go#list#JumpToFirst(l:listtype)
|
||||||
|
@ -159,7 +136,7 @@ function! s:on_exit(job_id, exit_status)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" callback_handlers_on_exit runs all handlers for job on exit event.
|
" callback_handlers_on_exit runs all handlers for job on exit event.
|
||||||
function! s:callback_handlers_on_exit(job, exit_status, data)
|
function! s:callback_handlers_on_exit(job, exit_status, data) abort
|
||||||
if empty(s:handlers)
|
if empty(s:handlers)
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
@ -171,44 +148,14 @@ endfunction
|
||||||
|
|
||||||
" on_stdout is the stdout handler for jobstart(). It collects the output of
|
" on_stdout is the stdout handler for jobstart(). It collects the output of
|
||||||
" stderr and stores them to the jobs internal stdout list.
|
" stderr and stores them to the jobs internal stdout list.
|
||||||
function! s:on_stdout(job_id, data)
|
function! s:on_stdout(job_id, data) dict abort
|
||||||
call extend(self.stdout, a:data)
|
call extend(self.stdout, a:data)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" on_stderr is the stderr handler for jobstart(). It collects the output of
|
" on_stderr is the stderr handler for jobstart(). It collects the output of
|
||||||
" stderr and stores them to the jobs internal stderr list.
|
" stderr and stores them to the jobs internal stderr list.
|
||||||
function! s:on_stderr(job_id, data)
|
function! s:on_stderr(job_id, data) dict abort
|
||||||
call extend(self.stderr, a:data)
|
call extend(self.stderr, a:data)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" abort_all aborts all current jobs created with s:spawn()
|
|
||||||
function! s:abort_all()
|
|
||||||
if empty(s:jobs)
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
for id in keys(s:jobs)
|
|
||||||
if id > 0
|
|
||||||
silent! call jobstop(id)
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
|
|
||||||
let s:jobs = {}
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" abort aborts the job with the given name, where name is the first argument
|
|
||||||
" passed to s:spawn()
|
|
||||||
function! s:abort(path)
|
|
||||||
if empty(s:jobs)
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
for job in values(s:jobs)
|
|
||||||
if job.importpath == path && job.id > 0
|
|
||||||
silent! call jobstop(job.id)
|
|
||||||
unlet s:jobs['job.id']
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" vim: sw=2 ts=2 et
|
" vim: sw=2 ts=2 et
|
||||||
|
|
|
@ -29,37 +29,42 @@ function! go#lint#Gometa(autosave, ...) abort
|
||||||
let goargs = go#util#Shelljoin(a:000)
|
let goargs = go#util#Shelljoin(a:000)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let meta_command = "gometalinter --disable-all"
|
|
||||||
if a:autosave || empty(g:go_metalinter_command)
|
|
||||||
let bin_path = go#path#CheckBinPath("gometalinter")
|
let bin_path = go#path#CheckBinPath("gometalinter")
|
||||||
if empty(bin_path)
|
if empty(bin_path)
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if a:autosave
|
let cmd = [bin_path]
|
||||||
" include only messages for the active buffer
|
let cmd += ["--disable-all"]
|
||||||
let meta_command .= " --include='^" . expand('%:p') . ".*$'"
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
if a:autosave || empty(g:go_metalinter_command)
|
||||||
" linters
|
" linters
|
||||||
let linters = a:autosave ? g:go_metalinter_autosave_enabled : g:go_metalinter_enabled
|
let linters = a:autosave ? g:go_metalinter_autosave_enabled : g:go_metalinter_enabled
|
||||||
for linter in linters
|
for linter in linters
|
||||||
let meta_command .= " --enable=".linter
|
let cmd += ["--enable=".linter]
|
||||||
endfor
|
endfor
|
||||||
|
|
||||||
" deadline
|
|
||||||
let meta_command .= " --deadline=" . g:go_metalinter_deadline
|
|
||||||
|
|
||||||
" path
|
" path
|
||||||
let meta_command .= " " . goargs
|
let cmd += [expand('%:p:h')]
|
||||||
else
|
else
|
||||||
" the user wants something else, let us use it.
|
" the user wants something else, let us use it.
|
||||||
let meta_command = g:go_metalinter_command
|
let cmd += [split(g:go_metalinter_command, " ")]
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" comment out the following two lines for debugging
|
if go#util#has_job() && has('lambda')
|
||||||
" echo meta_command
|
call s:lint_job({'cmd': cmd})
|
||||||
" return
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
" we add deadline only for sync mode
|
||||||
|
let cmd += ["--deadline=" . g:go_metalinter_deadline]
|
||||||
|
if a:autosave
|
||||||
|
" include only messages for the active buffer
|
||||||
|
let cmd += ["--include='^" . expand('%:p') . ".*$'"]
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
let meta_command = join(cmd, " ")
|
||||||
|
|
||||||
let out = go#tool#ExecuteInDir(meta_command)
|
let out = go#tool#ExecuteInDir(meta_command)
|
||||||
|
|
||||||
|
@ -77,7 +82,7 @@ function! go#lint#Gometa(autosave, ...) abort
|
||||||
let errformat = "%f:%l:%c:%t%*[^:]:\ %m,%f:%l::%t%*[^:]:\ %m"
|
let errformat = "%f:%l:%c:%t%*[^:]:\ %m,%f:%l::%t%*[^:]:\ %m"
|
||||||
|
|
||||||
" Parse and populate our location list
|
" Parse and populate our location list
|
||||||
call go#list#ParseFormat(l:listtype, errformat, split(out, "\n"))
|
call go#list#ParseFormat(l:listtype, errformat, split(out, "\n"), 'GoMetaLinter')
|
||||||
|
|
||||||
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))
|
||||||
|
@ -117,7 +122,7 @@ endfunction
|
||||||
|
|
||||||
" Vet calls 'go vet' on the current directory. Any warnings are populated in
|
" Vet calls 'go vet' on the current directory. Any warnings are populated in
|
||||||
" the location list
|
" the location list
|
||||||
function! go#lint#Vet(bang, ...)
|
function! go#lint#Vet(bang, ...) abort
|
||||||
call go#cmd#autowrite()
|
call go#cmd#autowrite()
|
||||||
echon "vim-go: " | echohl Identifier | echon "calling vet..." | echohl None
|
echon "vim-go: " | echohl Identifier | echon "calling vet..." | echohl None
|
||||||
if a:0 == 0
|
if a:0 == 0
|
||||||
|
@ -129,7 +134,7 @@ function! go#lint#Vet(bang, ...)
|
||||||
let l:listtype = "quickfix"
|
let l:listtype = "quickfix"
|
||||||
if go#util#ShellError() != 0
|
if go#util#ShellError() != 0
|
||||||
let errors = go#tool#ParseErrors(split(out, '\n'))
|
let errors = go#tool#ParseErrors(split(out, '\n'))
|
||||||
call go#list#Populate(l:listtype, errors)
|
call go#list#Populate(l:listtype, errors, 'Vet')
|
||||||
call go#list#Window(l:listtype, len(errors))
|
call go#list#Window(l:listtype, len(errors))
|
||||||
if !empty(errors) && !a:bang
|
if !empty(errors) && !a:bang
|
||||||
call go#list#JumpToFirst(l:listtype)
|
call go#list#JumpToFirst(l:listtype)
|
||||||
|
@ -171,7 +176,7 @@ function! go#lint#Errcheck(...) abort
|
||||||
let errformat = "%f:%l:%c:\ %m, %f:%l:%c\ %#%m"
|
let errformat = "%f:%l:%c:\ %m, %f:%l:%c\ %#%m"
|
||||||
|
|
||||||
" Parse and populate our location list
|
" Parse and populate our location list
|
||||||
call go#list#ParseFormat(l:listtype, errformat, split(out, "\n"))
|
call go#list#ParseFormat(l:listtype, errformat, split(out, "\n"), 'Errcheck')
|
||||||
|
|
||||||
let errors = go#list#Get(l:listtype)
|
let errors = go#list#Get(l:listtype)
|
||||||
|
|
||||||
|
@ -182,7 +187,7 @@ function! go#lint#Errcheck(...) abort
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if !empty(errors)
|
if !empty(errors)
|
||||||
call go#list#Populate(l:listtype, errors)
|
call go#list#Populate(l:listtype, errors, 'Errcheck')
|
||||||
call go#list#Window(l:listtype, len(errors))
|
call go#list#Window(l:listtype, len(errors))
|
||||||
if !empty(errors)
|
if !empty(errors)
|
||||||
call go#list#JumpToFirst(l:listtype)
|
call go#list#JumpToFirst(l:listtype)
|
||||||
|
@ -196,7 +201,7 @@ function! go#lint#Errcheck(...) abort
|
||||||
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#lint#ToggleMetaLinterAutoSave()
|
function! go#lint#ToggleMetaLinterAutoSave() abort
|
||||||
if get(g:, "go_metalinter_autosave", 0)
|
if get(g:, "go_metalinter_autosave", 0)
|
||||||
let g:go_metalinter_autosave = 0
|
let g:go_metalinter_autosave = 0
|
||||||
call go#util#EchoProgress("auto metalinter disabled")
|
call go#util#EchoProgress("auto metalinter disabled")
|
||||||
|
@ -207,4 +212,88 @@ function! go#lint#ToggleMetaLinterAutoSave()
|
||||||
call go#util#EchoProgress("auto metalinter enabled")
|
call go#util#EchoProgress("auto metalinter enabled")
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function s:lint_job(args)
|
||||||
|
let status_dir = expand('%:p:h')
|
||||||
|
let started_at = reltime()
|
||||||
|
|
||||||
|
call go#statusline#Update(status_dir, {
|
||||||
|
\ 'desc': "current status",
|
||||||
|
\ 'type': "gometalinter",
|
||||||
|
\ 'state': "analysing",
|
||||||
|
\})
|
||||||
|
|
||||||
|
" autowrite is not enabled for jobs
|
||||||
|
call go#cmd#autowrite()
|
||||||
|
|
||||||
|
let l:listtype = go#list#Type("quickfix")
|
||||||
|
let l:errformat = '%f:%l:%c:%t%*[^:]:\ %m,%f:%l::%t%*[^:]:\ %m'
|
||||||
|
|
||||||
|
function! s:callback(chan, msg) closure
|
||||||
|
let old_errorformat = &errorformat
|
||||||
|
let &errorformat = l:errformat
|
||||||
|
caddexpr a:msg
|
||||||
|
let &errorformat = old_errorformat
|
||||||
|
|
||||||
|
" TODO(arslan): cursor still jumps to first error even If I don't want
|
||||||
|
" it. Seems like there is a regression somewhere, but not sure where.
|
||||||
|
copen
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:close_cb(chan) closure
|
||||||
|
let l:job = ch_getjob(a:chan)
|
||||||
|
let l:status = job_status(l:job)
|
||||||
|
|
||||||
|
let exitval = 1
|
||||||
|
if l:status == "dead"
|
||||||
|
let l:info = job_info(l:job)
|
||||||
|
let exitval = l:info.exitval
|
||||||
|
endif
|
||||||
|
|
||||||
|
let status = {
|
||||||
|
\ 'desc': 'last status',
|
||||||
|
\ 'type': "gometaliner",
|
||||||
|
\ 'state': "finished",
|
||||||
|
\ }
|
||||||
|
|
||||||
|
if exitval
|
||||||
|
let status.state = "failed"
|
||||||
|
endif
|
||||||
|
|
||||||
|
let elapsed_time = reltimestr(reltime(started_at))
|
||||||
|
" strip whitespace
|
||||||
|
let elapsed_time = substitute(elapsed_time, '^\s*\(.\{-}\)\s*$', '\1', '')
|
||||||
|
let status.state .= printf(" (%ss)", elapsed_time)
|
||||||
|
|
||||||
|
call go#statusline#Update(status_dir, status)
|
||||||
|
|
||||||
|
let errors = go#list#Get(l:listtype)
|
||||||
|
if empty(errors)
|
||||||
|
call go#list#Window(l:listtype, len(errors))
|
||||||
|
elseif has("patch-7.4.2200")
|
||||||
|
if l:listtype == 'quickfix'
|
||||||
|
call setqflist([], 'a', {'title': 'GoMetaLinter'})
|
||||||
|
else
|
||||||
|
call setloclist(0, [], 'a', {'title': 'GoMetaLinter'})
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
if get(g:, 'go_echo_command_info', 1)
|
||||||
|
call go#util#EchoSuccess("linting finished")
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
let start_options = {
|
||||||
|
\ 'callback': function("s:callback"),
|
||||||
|
\ 'close_cb': function("s:close_cb"),
|
||||||
|
\ }
|
||||||
|
|
||||||
|
call job_start(a:args.cmd, start_options)
|
||||||
|
|
||||||
|
call go#list#Clean(l:listtype)
|
||||||
|
|
||||||
|
if get(g:, 'go_echo_command_info', 1)
|
||||||
|
call go#util#EchoProgress("linting started ...")
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
" vim: sw=2 ts=2 et
|
" vim: sw=2 ts=2 et
|
||||||
|
|
|
@ -5,7 +5,7 @@ endif
|
||||||
" Window opens the list with the given height up to 10 lines maximum.
|
" Window opens the list with the given height up to 10 lines maximum.
|
||||||
" Otherwise g:go_loclist_height is used. If no or zero height is given it
|
" Otherwise g:go_loclist_height is used. If no or zero height is given it
|
||||||
" closes the window
|
" closes the window
|
||||||
function! go#list#Window(listtype, ...)
|
function! go#list#Window(listtype, ...) abort
|
||||||
let l:listtype = go#list#Type(a:listtype)
|
let l:listtype = go#list#Type(a:listtype)
|
||||||
" we don't use lwindow to close the location list as we need also the
|
" we don't use lwindow to close the location list as we need also the
|
||||||
" ability to resize the window. So, we are going to use lopen and lclose
|
" ability to resize the window. So, we are going to use lopen and lclose
|
||||||
|
@ -40,7 +40,7 @@ endfunction
|
||||||
|
|
||||||
|
|
||||||
" Get returns the current list of items from the location list
|
" Get returns the current list of items from the location list
|
||||||
function! go#list#Get(listtype)
|
function! go#list#Get(listtype) abort
|
||||||
let l:listtype = go#list#Type(a:listtype)
|
let l:listtype = go#list#Type(a:listtype)
|
||||||
if l:listtype == "locationlist"
|
if l:listtype == "locationlist"
|
||||||
return getloclist(0)
|
return getloclist(0)
|
||||||
|
@ -50,22 +50,27 @@ function! go#list#Get(listtype)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Populate populate the location list with the given items
|
" Populate populate the location list with the given items
|
||||||
function! go#list#Populate(listtype, items)
|
function! go#list#Populate(listtype, items, title) abort
|
||||||
let l:listtype = go#list#Type(a:listtype)
|
let l:listtype = go#list#Type(a:listtype)
|
||||||
if l:listtype == "locationlist"
|
if l:listtype == "locationlist"
|
||||||
call setloclist(0, a:items, 'r')
|
call setloclist(0, a:items, 'r')
|
||||||
|
|
||||||
|
" The last argument ({what}) is introduced with 7.4.2200:
|
||||||
|
" https://github.com/vim/vim/commit/d823fa910cca43fec3c31c030ee908a14c272640
|
||||||
|
if has("patch-7.4.2200") | call setloclist(0, [], 'a', {'title': a:title}) | endif
|
||||||
else
|
else
|
||||||
call setqflist(a:items, 'r')
|
call setqflist(a:items, 'r')
|
||||||
|
if has("patch-7.4.2200") | call setqflist([], 'a', {'title': a:title}) | endif
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#list#PopulateWin(winnr, items)
|
function! go#list#PopulateWin(winnr, items) abort
|
||||||
call setloclist(a:winnr, a:items, 'r')
|
call setloclist(a:winnr, a:items, 'r')
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Parse parses the given items based on the specified errorformat nad
|
" Parse parses the given items based on the specified errorformat nad
|
||||||
" populates the location list.
|
" populates the location list.
|
||||||
function! go#list#ParseFormat(listtype, errformat, items)
|
function! go#list#ParseFormat(listtype, errformat, items, title) abort
|
||||||
let l:listtype = go#list#Type(a:listtype)
|
let l:listtype = go#list#Type(a:listtype)
|
||||||
" backup users errorformat, will be restored once we are finished
|
" backup users errorformat, will be restored once we are finished
|
||||||
let old_errorformat = &errorformat
|
let old_errorformat = &errorformat
|
||||||
|
@ -74,8 +79,10 @@ function! go#list#ParseFormat(listtype, errformat, items)
|
||||||
let &errorformat = a:errformat
|
let &errorformat = a:errformat
|
||||||
if l:listtype == "locationlist"
|
if l:listtype == "locationlist"
|
||||||
lgetexpr a:items
|
lgetexpr a:items
|
||||||
|
if has("patch-7.4.2200") | call setloclist(0, [], 'a', {'title': a:title}) | endif
|
||||||
else
|
else
|
||||||
cgetexpr a:items
|
cgetexpr a:items
|
||||||
|
if has("patch-7.4.2200") | call setqflist([], 'a', {'title': a:title}) | endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
"restore back
|
"restore back
|
||||||
|
@ -84,7 +91,7 @@ endfunction
|
||||||
|
|
||||||
" Parse parses the given items based on the global errorformat and
|
" Parse parses the given items based on the global errorformat and
|
||||||
" populates the location list.
|
" populates the location list.
|
||||||
function! go#list#Parse(listtype, items)
|
function! go#list#Parse(listtype, items) abort
|
||||||
let l:listtype = go#list#Type(a:listtype)
|
let l:listtype = go#list#Type(a:listtype)
|
||||||
if l:listtype == "locationlist"
|
if l:listtype == "locationlist"
|
||||||
lgetexpr a:items
|
lgetexpr a:items
|
||||||
|
@ -94,7 +101,7 @@ function! go#list#Parse(listtype, items)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" JumpToFirst jumps to the first item in the location list
|
" JumpToFirst jumps to the first item in the location list
|
||||||
function! go#list#JumpToFirst(listtype)
|
function! go#list#JumpToFirst(listtype) abort
|
||||||
let l:listtype = go#list#Type(a:listtype)
|
let l:listtype = go#list#Type(a:listtype)
|
||||||
if l:listtype == "locationlist"
|
if l:listtype == "locationlist"
|
||||||
ll 1
|
ll 1
|
||||||
|
@ -104,7 +111,7 @@ function! go#list#JumpToFirst(listtype)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Clean cleans the location list
|
" Clean cleans the location list
|
||||||
function! go#list#Clean(listtype)
|
function! go#list#Clean(listtype) abort
|
||||||
let l:listtype = go#list#Type(a:listtype)
|
let l:listtype = go#list#Type(a:listtype)
|
||||||
if l:listtype == "locationlist"
|
if l:listtype == "locationlist"
|
||||||
lex []
|
lex []
|
||||||
|
@ -113,7 +120,7 @@ function! go#list#Clean(listtype)
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#list#Type(listtype)
|
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"
|
||||||
|
|
|
@ -28,7 +28,7 @@ if len(s:goarch) == 0
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
function! go#package#Paths()
|
function! go#package#Paths() abort
|
||||||
let dirs = []
|
let dirs = []
|
||||||
|
|
||||||
if !exists("s:goroot")
|
if !exists("s:goroot")
|
||||||
|
@ -54,7 +54,7 @@ function! go#package#Paths()
|
||||||
return dirs
|
return dirs
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#package#ImportPath(arg)
|
function! go#package#ImportPath(arg) abort
|
||||||
let path = fnamemodify(resolve(a:arg), ':p')
|
let path = fnamemodify(resolve(a:arg), ':p')
|
||||||
let dirs = go#package#Paths()
|
let dirs = go#package#Paths()
|
||||||
|
|
||||||
|
@ -77,7 +77,7 @@ function! go#package#ImportPath(arg)
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#package#FromPath(arg)
|
function! go#package#FromPath(arg) abort
|
||||||
let path = fnamemodify(resolve(a:arg), ':p')
|
let path = fnamemodify(resolve(a:arg), ':p')
|
||||||
let dirs = go#package#Paths()
|
let dirs = go#package#Paths()
|
||||||
|
|
||||||
|
@ -99,7 +99,7 @@ function! go#package#FromPath(arg)
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#package#CompleteMembers(package, member)
|
function! go#package#CompleteMembers(package, member) abort
|
||||||
silent! let content = go#util#System('godoc ' . a:package)
|
silent! let content = go#util#System('godoc ' . a:package)
|
||||||
if go#util#ShellError() || !len(content)
|
if go#util#ShellError() || !len(content)
|
||||||
return []
|
return []
|
||||||
|
@ -118,7 +118,7 @@ function! go#package#CompleteMembers(package, member)
|
||||||
endtry
|
endtry
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#package#Complete(ArgLead, CmdLine, CursorPos)
|
function! go#package#Complete(ArgLead, CmdLine, CursorPos) abort
|
||||||
let words = split(a:CmdLine, '\s\+', 1)
|
let words = split(a:CmdLine, '\s\+', 1)
|
||||||
|
|
||||||
" do not complete package members for these commands
|
" do not complete package members for these commands
|
||||||
|
|
|
@ -8,7 +8,7 @@ let s:initial_go_path = ""
|
||||||
" echoes the current GOPATH, if an argument is passed it replaces the current
|
" echoes the current GOPATH, if an argument is passed it replaces the current
|
||||||
" GOPATH with it. If two double quotes are passed (the empty string in go),
|
" GOPATH with it. If two double quotes are passed (the empty string in go),
|
||||||
" it'll clear the GOPATH and will restore to the initial GOPATH.
|
" it'll clear the GOPATH and will restore to the initial GOPATH.
|
||||||
function! go#path#GoPath(...)
|
function! go#path#GoPath(...) abort
|
||||||
" we have an argument, replace GOPATH
|
" we have an argument, replace GOPATH
|
||||||
if len(a:000)
|
if len(a:000)
|
||||||
" clears the current manually set GOPATH and restores it to the
|
" clears the current manually set GOPATH and restores it to the
|
||||||
|
@ -35,7 +35,7 @@ endfunction
|
||||||
" Default returns the default GOPATH. If there is a single GOPATH it returns
|
" Default returns the default GOPATH. If there is a single GOPATH it returns
|
||||||
" it. For multiple GOPATHS separated with a the OS specific separator, only
|
" it. For multiple GOPATHS separated with a the OS specific separator, only
|
||||||
" the first one is returned
|
" the first one is returned
|
||||||
function! go#path#Default()
|
function! go#path#Default() abort
|
||||||
let go_paths = split($GOPATH, go#util#PathListSep())
|
let go_paths = split($GOPATH, go#util#PathListSep())
|
||||||
|
|
||||||
if len(go_paths) == 1
|
if len(go_paths) == 1
|
||||||
|
@ -47,7 +47,7 @@ endfunction
|
||||||
|
|
||||||
" HasPath checks whether the given path exists in GOPATH environment variable
|
" HasPath checks whether the given path exists in GOPATH environment variable
|
||||||
" or not
|
" or not
|
||||||
function! go#path#HasPath(path)
|
function! go#path#HasPath(path) abort
|
||||||
let go_paths = split($GOPATH, go#util#PathListSep())
|
let go_paths = split($GOPATH, go#util#PathListSep())
|
||||||
let last_char = strlen(a:path) - 1
|
let last_char = strlen(a:path) - 1
|
||||||
|
|
||||||
|
@ -69,7 +69,7 @@ endfunction
|
||||||
" Godeps, GB, it will modify the GOPATH so those directories take precedence
|
" Godeps, GB, it will modify the GOPATH so those directories take precedence
|
||||||
" over the current GOPATH. It also detects diretories whose are outside
|
" over the current GOPATH. It also detects diretories whose are outside
|
||||||
" GOPATH.
|
" GOPATH.
|
||||||
function! go#path#Detect()
|
function! go#path#Detect() abort
|
||||||
let gopath = $GOPATH
|
let gopath = $GOPATH
|
||||||
|
|
||||||
" don't lookup for godeps if autodetect is disabled.
|
" don't lookup for godeps if autodetect is disabled.
|
||||||
|
@ -115,7 +115,7 @@ endfunction
|
||||||
|
|
||||||
|
|
||||||
" BinPath returns the binary path of installed go tools.
|
" BinPath returns the binary path of installed go tools.
|
||||||
function! go#path#BinPath()
|
function! go#path#BinPath() abort
|
||||||
let bin_path = ""
|
let bin_path = ""
|
||||||
|
|
||||||
" check if our global custom path is set, if not check if $GOBIN is set so
|
" check if our global custom path is set, if not check if $GOBIN is set so
|
||||||
|
@ -135,7 +135,7 @@ endfunction
|
||||||
|
|
||||||
" CheckBinPath checks whether the given binary exists or not and returns the
|
" CheckBinPath checks whether the given binary exists or not and returns the
|
||||||
" path of the binary. It returns an empty string doesn't exists.
|
" path of the binary. It returns an empty string doesn't exists.
|
||||||
function! go#path#CheckBinPath(binpath)
|
function! go#path#CheckBinPath(binpath) abort
|
||||||
" remove whitespaces if user applied something like 'goimports '
|
" remove whitespaces if user applied something like 'goimports '
|
||||||
let binpath = substitute(a:binpath, '^\s*\(.\{-}\)\s*$', '\1', '')
|
let binpath = substitute(a:binpath, '^\s*\(.\{-}\)\s*$', '\1', '')
|
||||||
" save off original path
|
" save off original path
|
||||||
|
@ -161,7 +161,7 @@ function! go#path#CheckBinPath(binpath)
|
||||||
" just get the basename
|
" just get the basename
|
||||||
let basename = fnamemodify(binpath, ":t")
|
let basename = fnamemodify(binpath, ":t")
|
||||||
if !executable(basename)
|
if !executable(basename)
|
||||||
echo "vim-go: could not find '" . basename . "'. Run :GoInstallBinaries to fix it."
|
echom "vim-go: could not find '" . basename . "'. Run :GoInstallBinaries to fix it."
|
||||||
" restore back!
|
" restore back!
|
||||||
let $PATH = old_path
|
let $PATH = old_path
|
||||||
return ""
|
return ""
|
||||||
|
|
|
@ -3,7 +3,7 @@ if !exists("g:go_play_open_browser")
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
function! go#play#Share(count, line1, line2)
|
function! go#play#Share(count, line1, line2) abort
|
||||||
if !executable('curl')
|
if !executable('curl')
|
||||||
echohl ErrorMsg | echomsg "vim-go: require 'curl' command" | echohl None
|
echohl ErrorMsg | echomsg "vim-go: require 'curl' command" | echohl None
|
||||||
return
|
return
|
||||||
|
@ -42,7 +42,7 @@ function! go#play#Share(count, line1, line2)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
function! s:get_visual_content()
|
function! s:get_visual_content() abort
|
||||||
let save_regcont = @"
|
let save_regcont = @"
|
||||||
let save_regtype = getregtype('"')
|
let save_regtype = getregtype('"')
|
||||||
silent! normal! gvy
|
silent! normal! gvy
|
||||||
|
@ -55,7 +55,7 @@ endfunction
|
||||||
" http://stackoverflow.com/questions/1533565/how-to-get-visually-selected-text-in-vimscript
|
" http://stackoverflow.com/questions/1533565/how-to-get-visually-selected-text-in-vimscript
|
||||||
" another function that returns the content of visual selection, it's not used
|
" another function that returns the content of visual selection, it's not used
|
||||||
" but might be useful in the future
|
" but might be useful in the future
|
||||||
function! s:get_visual_selection()
|
function! s:get_visual_selection() abort
|
||||||
let [lnum1, col1] = getpos("'<")[1:2]
|
let [lnum1, col1] = getpos("'<")[1:2]
|
||||||
let [lnum2, col2] = getpos("'>")[1:2]
|
let [lnum2, col2] = getpos("'>")[1:2]
|
||||||
|
|
||||||
|
@ -72,7 +72,7 @@ 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()
|
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', '')
|
||||||
if go_play_browser_command == ''
|
if go_play_browser_command == ''
|
||||||
if has('win32') || has('win64')
|
if has('win32') || has('win64')
|
||||||
|
|
|
@ -6,22 +6,22 @@ if !exists("g:go_gorename_prefill")
|
||||||
let g:go_gorename_prefill = 1
|
let g:go_gorename_prefill = 1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
function! go#rename#Rename(bang, ...)
|
function! go#rename#Rename(bang, ...) abort
|
||||||
let to = ""
|
let to_identifier = ""
|
||||||
if a:0 == 0
|
if a:0 == 0
|
||||||
let from = expand("<cword>")
|
let from = expand("<cword>")
|
||||||
let ask = printf("vim-go: rename '%s' to: ", from)
|
let ask = printf("vim-go: rename '%s' to: ", from)
|
||||||
if g:go_gorename_prefill
|
if g:go_gorename_prefill
|
||||||
let to = input(ask, from)
|
let to_identifier = input(ask, from)
|
||||||
else
|
else
|
||||||
let to = input(ask)
|
let to_identifier = input(ask)
|
||||||
endif
|
endif
|
||||||
redraw!
|
redraw!
|
||||||
if empty(to)
|
if empty(to_identifier)
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
else
|
else
|
||||||
let to = a:1
|
let to_identifier = a:1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
"return with a warning if the bin doesn't exist
|
"return with a warning if the bin doesn't exist
|
||||||
|
@ -32,10 +32,79 @@ function! go#rename#Rename(bang, ...)
|
||||||
|
|
||||||
let fname = expand('%:p')
|
let fname = expand('%:p')
|
||||||
let pos = go#util#OffsetCursor()
|
let pos = go#util#OffsetCursor()
|
||||||
let cmd = printf('%s -offset %s -to %s', shellescape(bin_path), shellescape(printf('%s:#%d', fname, pos)), shellescape(to))
|
let offset = printf('%s:#%d', fname, pos)
|
||||||
|
|
||||||
let out = go#tool#ExecuteInDir(cmd)
|
" no need to escape for job call
|
||||||
|
let bin_path = go#util#has_job() ? bin_path : shellescape(bin_path)
|
||||||
|
let offset = go#util#has_job() ? offset : shellescape(offset)
|
||||||
|
let to_identifier = go#util#has_job() ? to_identifier : shellescape(to_identifier)
|
||||||
|
|
||||||
|
let cmd = [bin_path, "-offset", offset, "-to", to_identifier]
|
||||||
|
|
||||||
|
if go#util#has_job()
|
||||||
|
call go#util#EchoProgress(printf("renaming to '%s' ...", to_identifier))
|
||||||
|
call s:rename_job({
|
||||||
|
\ 'cmd': cmd,
|
||||||
|
\ 'bang': a:bang,
|
||||||
|
\})
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let command = join(cmd, " ")
|
||||||
|
let out = go#tool#ExecuteInDir(command)
|
||||||
|
|
||||||
|
let splitted = split(out, '\n')
|
||||||
|
call s:parse_errors(go#util#ShellError(), a:bang, splitted)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function s:rename_job(args)
|
||||||
|
let messages = []
|
||||||
|
function! s:callback(chan, msg) closure
|
||||||
|
call add(messages, a:msg)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
let status_dir = expand('%:p:h')
|
||||||
|
|
||||||
|
function! s:close_cb(chan) closure
|
||||||
|
let l:job = ch_getjob(a:chan)
|
||||||
|
let l:info = job_info(l:job)
|
||||||
|
|
||||||
|
let status = {
|
||||||
|
\ 'desc': 'last status',
|
||||||
|
\ 'type': "gorename",
|
||||||
|
\ 'state': "finished",
|
||||||
|
\ }
|
||||||
|
|
||||||
|
if l:info.exitval
|
||||||
|
let status.state = "failed"
|
||||||
|
endif
|
||||||
|
|
||||||
|
call go#statusline#Update(status_dir, status)
|
||||||
|
|
||||||
|
call s:parse_errors(l:info.exitval, a:args.bang, messages)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
let start_options = {
|
||||||
|
\ 'callback': function("s:callback"),
|
||||||
|
\ 'close_cb': function("s:close_cb"),
|
||||||
|
\ }
|
||||||
|
|
||||||
|
" modify GOPATH if needed
|
||||||
|
let old_gopath = $GOPATH
|
||||||
|
let $GOPATH = go#path#Detect()
|
||||||
|
|
||||||
|
call go#statusline#Update(status_dir, {
|
||||||
|
\ 'desc': "current status",
|
||||||
|
\ 'type': "gorename",
|
||||||
|
\ 'state': "started",
|
||||||
|
\})
|
||||||
|
|
||||||
|
call job_start(a:args.cmd, start_options)
|
||||||
|
|
||||||
|
let $GOPATH = old_gopath
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function s:parse_errors(exit_val, bang, out)
|
||||||
" reload all files to reflect the new changes. We explicitly call
|
" reload all files to reflect the new changes. We explicitly call
|
||||||
" checktime to trigger a reload of all files. See
|
" checktime to trigger a reload of all files. See
|
||||||
" http://www.mail-archive.com/vim@vim.org/msg05900.html for more info
|
" http://www.mail-archive.com/vim@vim.org/msg05900.html for more info
|
||||||
|
@ -45,27 +114,27 @@ function! go#rename#Rename(bang, ...)
|
||||||
silent! checktime
|
silent! checktime
|
||||||
let &autoread = current_autoread
|
let &autoread = current_autoread
|
||||||
|
|
||||||
" strip out newline on the end that gorename puts. If we don't remove, it
|
|
||||||
" will trigger the 'Hit ENTER to continue' prompt
|
|
||||||
let clean = split(out, '\n')
|
|
||||||
|
|
||||||
let l:listtype = "quickfix"
|
let l:listtype = "quickfix"
|
||||||
if go#util#ShellError() != 0
|
if a:exit_val != 0
|
||||||
let errors = go#tool#ParseErrors(split(out, '\n'))
|
call go#util#EchoError("FAILED")
|
||||||
call go#list#Populate(l:listtype, errors)
|
let errors = go#tool#ParseErrors(a:out)
|
||||||
|
call go#list#Populate(l:listtype, errors, 'Rename')
|
||||||
call go#list#Window(l:listtype, len(errors))
|
call go#list#Window(l:listtype, len(errors))
|
||||||
if !empty(errors) && !a:bang
|
if !empty(errors) && !a:bang
|
||||||
call go#list#JumpToFirst(l:listtype)
|
call go#list#JumpToFirst(l:listtype)
|
||||||
elseif empty(errors)
|
elseif empty(errors)
|
||||||
" failed to parse errors, output the original content
|
" failed to parse errors, output the original content
|
||||||
call go#util#EchoError(out)
|
call go#util#EchoError(join(a:out, ""))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
return
|
return
|
||||||
else
|
endif
|
||||||
|
|
||||||
|
" strip out newline on the end that gorename puts. If we don't remove, it
|
||||||
|
" will trigger the 'Hit ENTER to continue' prompt
|
||||||
call go#list#Clean(l:listtype)
|
call go#list#Clean(l:listtype)
|
||||||
call go#list#Window(l:listtype)
|
call go#list#Window(l:listtype)
|
||||||
redraw | echon "vim-go: " | echohl Function | echon clean[0] | echohl None
|
call go#util#EchoSuccess(a:out[0])
|
||||||
endif
|
|
||||||
|
|
||||||
" refresh the buffer so we can see the new content
|
" refresh the buffer so we can see the new content
|
||||||
" TODO(arslan): also find all other buffers and refresh them too. For this
|
" TODO(arslan): also find all other buffers and refresh them too. For this
|
||||||
|
|
112
sources_non_forked/vim-go/autoload/go/statusline.vim
Normal file
112
sources_non_forked/vim-go/autoload/go/statusline.vim
Normal file
|
@ -0,0 +1,112 @@
|
||||||
|
" Statusline
|
||||||
|
""""""""""""""""""""""""""""""""
|
||||||
|
|
||||||
|
" 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
|
||||||
|
" type. Current status dict is in form:
|
||||||
|
" {
|
||||||
|
" 'desc' : 'Job description',
|
||||||
|
" 'state' : 'Job state, such as success, failure, etc..',
|
||||||
|
" 'type' : 'Job type, such as build, test, etc..'
|
||||||
|
" 'created_at' : 'Time it was created as seconds since 1st Jan 1970'
|
||||||
|
" }
|
||||||
|
let s:statuses = {}
|
||||||
|
|
||||||
|
" timer_id for cleaner
|
||||||
|
let s:timer_id = 0
|
||||||
|
|
||||||
|
" last_status stores the last generated text per status
|
||||||
|
let s:last_status = ""
|
||||||
|
|
||||||
|
" Show returns the current status of the job for 20 seconds (configurable). It
|
||||||
|
" displays it in form of 'desc: [type|state]' if there is any state available,
|
||||||
|
" if not it returns an empty string. This function should be plugged directly
|
||||||
|
" into the statusline.
|
||||||
|
function! go#statusline#Show() abort
|
||||||
|
" lazy initialiation of the cleaner
|
||||||
|
if !s:timer_id
|
||||||
|
" clean every 60 seconds all statuses
|
||||||
|
let interval = get(g:, 'go_statusline_duration', 60000)
|
||||||
|
let s:timer_id = timer_start(interval, function('go#statusline#Clear'), {'repeat': -1})
|
||||||
|
endif
|
||||||
|
|
||||||
|
" nothing to show
|
||||||
|
if empty(s:statuses)
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
|
||||||
|
let status_dir = expand('%:p:h')
|
||||||
|
|
||||||
|
if !has_key(s:statuses, status_dir)
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
|
||||||
|
let status = s:statuses[status_dir]
|
||||||
|
if !has_key(status, 'desc') || !has_key(status, 'state') || !has_key(status, 'type')
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
|
||||||
|
let status_text = printf("[%s|%s]", status.type, status.state)
|
||||||
|
if empty(status_text)
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
|
||||||
|
" only update highlight if status has changed.
|
||||||
|
if status_text != s:last_status
|
||||||
|
if status.state =~ "success" || status.state =~ "finished"
|
||||||
|
hi goStatusLineColor cterm=bold ctermbg=76 ctermfg=22
|
||||||
|
elseif status.state =~ "started" || status.state =~ "analysing"
|
||||||
|
hi goStatusLineColor cterm=bold ctermbg=208 ctermfg=88
|
||||||
|
elseif status.state =~ "failed"
|
||||||
|
hi goStatusLineColor cterm=bold ctermbg=196 ctermfg=52
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
let s:last_status = status_text
|
||||||
|
return status_text
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Update updates (adds) the statusline for the given status_dir with the
|
||||||
|
" given status dict. It overrides any previously set status.
|
||||||
|
function! go#statusline#Update(status_dir, status) abort
|
||||||
|
let a:status.created_at = reltime()
|
||||||
|
let s:statuses[a:status_dir] = a:status
|
||||||
|
|
||||||
|
" force to update the statusline, otherwise the user needs to move the
|
||||||
|
" cursor
|
||||||
|
exe 'let &ro = &ro'
|
||||||
|
|
||||||
|
" before we stop the timer, check if we have any previous jobs to be cleaned
|
||||||
|
" up. Otherwise every job will reset the timer when this function is called
|
||||||
|
" and thus old jobs will never be cleaned
|
||||||
|
call go#statusline#Clear(0)
|
||||||
|
|
||||||
|
" also reset the timer, so the user has time to see it in the statusline.
|
||||||
|
" Setting the timer_id to 0 will trigger a new cleaner routine.
|
||||||
|
call timer_stop(s:timer_id)
|
||||||
|
let s:timer_id = 0
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Clear clears all currently stored statusline data. The timer_id argument is
|
||||||
|
" just a placeholder so we can pass it to a timer_start() function if needed.
|
||||||
|
function! go#statusline#Clear(timer_id) abort
|
||||||
|
for [status_dir, status] in items(s:statuses)
|
||||||
|
let elapsed_time = reltimestr(reltime(status.created_at))
|
||||||
|
" strip whitespace
|
||||||
|
let elapsed_time = substitute(elapsed_time, '^\s*\(.\{-}\)\s*$', '\1', '')
|
||||||
|
|
||||||
|
if str2nr(elapsed_time) > 10
|
||||||
|
call remove(s:statuses, status_dir)
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
|
||||||
|
if len(s:statuses) == 0
|
||||||
|
let s:statuses = {}
|
||||||
|
endif
|
||||||
|
|
||||||
|
" force to update the statusline, otherwise the user needs to move the
|
||||||
|
" cursor
|
||||||
|
exe 'let &ro = &ro'
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" vim: sw=2 ts=2 et
|
|
@ -1,6 +1,7 @@
|
||||||
let s:current_file = expand("<sfile>")
|
let s:current_file = expand("<sfile>")
|
||||||
|
|
||||||
function! go#template#create()
|
function! go#template#create() abort
|
||||||
|
let l:go_template_use_pkg = get(g:, 'go_template_use_pkg', 0)
|
||||||
let l:root_dir = fnamemodify(s:current_file, ':h:h:h')
|
let l:root_dir = fnamemodify(s:current_file, ':h:h:h')
|
||||||
|
|
||||||
let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd '
|
let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd '
|
||||||
|
@ -10,12 +11,19 @@ function! go#template#create()
|
||||||
let l:package_name = go#tool#PackageName()
|
let l:package_name = go#tool#PackageName()
|
||||||
|
|
||||||
" if we can't figure out any package name(no Go files or non Go package
|
" if we can't figure out any package name(no Go files or non Go package
|
||||||
" files) from the directory create the template
|
" files) from the directory create the template or use the cwd
|
||||||
if l:package_name == -1
|
" as the name
|
||||||
|
if l:package_name == -1 && l:go_template_use_pkg != 1
|
||||||
let l:template_file = get(g:, 'go_template_file', "hello_world.go")
|
let l:template_file = get(g:, 'go_template_file', "hello_world.go")
|
||||||
let l:template_path = go#util#Join(l:root_dir, "templates", l:template_file)
|
let l:template_path = go#util#Join(l:root_dir, "templates", l:template_file)
|
||||||
exe '0r ' . fnameescape(l:template_path)
|
exe '0r ' . fnameescape(l:template_path)
|
||||||
$delete _
|
$delete _
|
||||||
|
elseif l:package_name == -1 && l:go_template_use_pkg == 1
|
||||||
|
" cwd is now the dir of the package
|
||||||
|
let l:path = fnamemodify(getcwd(), ':t')
|
||||||
|
let l:content = printf("package %s", l:path)
|
||||||
|
call append(0, l:content)
|
||||||
|
$delete _
|
||||||
else
|
else
|
||||||
let l:content = printf("package %s", l:package_name)
|
let l:content = printf("package %s", l:package_name)
|
||||||
call append(0, l:content)
|
call append(0, l:content)
|
||||||
|
@ -28,7 +36,7 @@ function! go#template#create()
|
||||||
execute cd . fnameescape(dir)
|
execute cd . fnameescape(dir)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#template#ToggleAutoCreate()
|
function! go#template#ToggleAutoCreate() abort
|
||||||
if get(g:, "go_template_autocreate", 1)
|
if get(g:, "go_template_autocreate", 1)
|
||||||
let g:go_template_autocreate = 0
|
let g:go_template_autocreate = 0
|
||||||
call go#util#EchoProgress("auto template create disabled")
|
call go#util#EchoProgress("auto template create disabled")
|
||||||
|
|
|
@ -7,12 +7,12 @@ let s:jobs = {}
|
||||||
|
|
||||||
" new creates a new terminal with the given command. Mode is set based on the
|
" new creates a new terminal with the given command. Mode is set based on the
|
||||||
" global variable g:go_term_mode, which is by default set to :vsplit
|
" global variable g:go_term_mode, which is by default set to :vsplit
|
||||||
function! go#term#new(bang, cmd)
|
function! go#term#new(bang, cmd) abort
|
||||||
return go#term#newmode(a:bang, a:cmd, g:go_term_mode)
|
return go#term#newmode(a:bang, a:cmd, g:go_term_mode)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" new creates a new terminal with the given command and window mode.
|
" new creates a new terminal with the given command and window mode.
|
||||||
function! go#term#newmode(bang, cmd, mode)
|
function! go#term#newmode(bang, cmd, mode) abort
|
||||||
let mode = a:mode
|
let mode = a:mode
|
||||||
if empty(mode)
|
if empty(mode)
|
||||||
let mode = g:go_term_mode
|
let mode = g:go_term_mode
|
||||||
|
@ -53,6 +53,7 @@ function! go#term#newmode(bang, cmd, mode)
|
||||||
let $GOPATH = old_gopath
|
let $GOPATH = old_gopath
|
||||||
|
|
||||||
let job.id = id
|
let job.id = id
|
||||||
|
let job.cmd = a:cmd
|
||||||
startinsert
|
startinsert
|
||||||
|
|
||||||
" resize new term if needed.
|
" resize new term if needed.
|
||||||
|
@ -74,7 +75,7 @@ function! go#term#newmode(bang, cmd, mode)
|
||||||
return id
|
return id
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:on_stdout(job_id, data)
|
function! s:on_stdout(job_id, data, event) dict abort
|
||||||
if !has_key(s:jobs, a:job_id)
|
if !has_key(s:jobs, a:job_id)
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
@ -83,7 +84,7 @@ function! s:on_stdout(job_id, data)
|
||||||
call extend(job.stdout, a:data)
|
call extend(job.stdout, a:data)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:on_stderr(job_id, data)
|
function! s:on_stderr(job_id, data, event) dict abort
|
||||||
if !has_key(s:jobs, a:job_id)
|
if !has_key(s:jobs, a:job_id)
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
@ -92,7 +93,7 @@ function! s:on_stderr(job_id, data)
|
||||||
call extend(job.stderr, a:data)
|
call extend(job.stderr, a:data)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:on_exit(job_id, exit_status)
|
function! s:on_exit(job_id, exit_status, event) dict abort
|
||||||
if !has_key(s:jobs, a:job_id)
|
if !has_key(s:jobs, a:job_id)
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
@ -115,7 +116,7 @@ function! s:on_exit(job_id, exit_status)
|
||||||
" close terminal we don't need it anymore
|
" close terminal we don't need it anymore
|
||||||
close
|
close
|
||||||
|
|
||||||
call go#list#Populate(l:listtype, errors)
|
call go#list#Populate(l:listtype, errors, job.cmd)
|
||||||
call go#list#Window(l:listtype, len(errors))
|
call go#list#Window(l:listtype, len(errors))
|
||||||
if !self.bang
|
if !self.bang
|
||||||
call go#list#JumpToFirst(l:listtype)
|
call go#list#JumpToFirst(l:listtype)
|
||||||
|
|
|
@ -13,7 +13,7 @@ endif
|
||||||
" < >
|
" < >
|
||||||
" t for tag
|
" t for tag
|
||||||
|
|
||||||
function! go#textobj#Function(mode)
|
function! go#textobj#Function(mode) abort
|
||||||
let offset = go#util#OffsetCursor()
|
let offset = go#util#OffsetCursor()
|
||||||
|
|
||||||
let fname = shellescape(expand("%:p"))
|
let fname = shellescape(expand("%:p"))
|
||||||
|
@ -84,7 +84,7 @@ function! go#textobj#Function(mode)
|
||||||
call cursor(info.rbrace.line-1, 1)
|
call cursor(info.rbrace.line-1, 1)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#textobj#FunctionJump(mode, direction)
|
function! go#textobj#FunctionJump(mode, direction) abort
|
||||||
" get count of the motion. This should be done before all the normal
|
" get count of the motion. This should be done before all the normal
|
||||||
" expressions below as those reset this value(because they have zero
|
" expressions below as those reset this value(because they have zero
|
||||||
" count!). We abstract -1 because the index starts from 0 in motion.
|
" count!). We abstract -1 because the index starts from 0 in motion.
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
function! go#tool#Files()
|
function! go#tool#Files() abort
|
||||||
if go#util#IsWin()
|
if go#util#IsWin()
|
||||||
let format = '{{range $f := .GoFiles}}{{$.Dir}}\{{$f}}{{printf \"\n\"}}{{end}}{{range $f := .CgoFiles}}{{$.Dir}}\{{$f}}{{printf \"\n\"}}{{end}}'
|
let format = '{{range $f := .GoFiles}}{{$.Dir}}\{{$f}}{{printf \"\n\"}}{{end}}{{range $f := .CgoFiles}}{{$.Dir}}\{{$f}}{{printf \"\n\"}}{{end}}'
|
||||||
else
|
else
|
||||||
|
@ -9,7 +9,7 @@ function! go#tool#Files()
|
||||||
return split(out, '\n')
|
return split(out, '\n')
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#tool#Deps()
|
function! go#tool#Deps() abort
|
||||||
if go#util#IsWin()
|
if go#util#IsWin()
|
||||||
let format = '{{range $f := .Deps}}{{$f}}{{printf \"\n\"}}{{end}}'
|
let format = '{{range $f := .Deps}}{{$f}}{{printf \"\n\"}}{{end}}'
|
||||||
else
|
else
|
||||||
|
@ -20,7 +20,7 @@ function! go#tool#Deps()
|
||||||
return split(out, '\n')
|
return split(out, '\n')
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#tool#Imports()
|
function! go#tool#Imports() abort
|
||||||
let imports = {}
|
let imports = {}
|
||||||
if go#util#IsWin()
|
if go#util#IsWin()
|
||||||
let format = '{{range $f := .Imports}}{{$f}}{{printf \"\n\"}}{{end}}'
|
let format = '{{range $f := .Imports}}{{$f}}{{printf \"\n\"}}{{end}}'
|
||||||
|
@ -43,7 +43,18 @@ function! go#tool#Imports()
|
||||||
return imports
|
return imports
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#tool#PackageName()
|
function! go#tool#Info(auto) abort
|
||||||
|
let l:mode = get(g:, 'go_info_mode', 'gocode')
|
||||||
|
if l:mode == 'gocode'
|
||||||
|
call go#complete#Info(a:auto)
|
||||||
|
elseif l:mode == 'guru'
|
||||||
|
call go#guru#DescribeInfo()
|
||||||
|
else
|
||||||
|
call go#util#EchoError('go_info_mode value: '. l:mode .' is not valid. Valid values are: [gocode, guru]')
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#tool#PackageName() abort
|
||||||
let command = "go list -f \"{{.Name}}\""
|
let command = "go list -f \"{{.Name}}\""
|
||||||
let out = go#tool#ExecuteInDir(command)
|
let out = go#tool#ExecuteInDir(command)
|
||||||
if go#util#ShellError() != 0
|
if go#util#ShellError() != 0
|
||||||
|
@ -53,7 +64,7 @@ function! go#tool#PackageName()
|
||||||
return split(out, '\n')[0]
|
return split(out, '\n')[0]
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#tool#ParseErrors(lines)
|
function! go#tool#ParseErrors(lines) abort
|
||||||
let errors = []
|
let errors = []
|
||||||
|
|
||||||
for line in a:lines
|
for line in a:lines
|
||||||
|
@ -85,7 +96,7 @@ endfunction
|
||||||
|
|
||||||
"FilterValids filters the given items with only items that have a valid
|
"FilterValids filters the given items with only items that have a valid
|
||||||
"filename. Any non valid filename is filtered out.
|
"filename. Any non valid filename is filtered out.
|
||||||
function! go#tool#FilterValids(items)
|
function! go#tool#FilterValids(items) abort
|
||||||
" Remove any nonvalid filename from the location list to avoid opening an
|
" Remove any nonvalid filename from the location list to avoid opening an
|
||||||
" empty buffer. See https://github.com/fatih/vim-go/issues/287 for
|
" empty buffer. See https://github.com/fatih/vim-go/issues/287 for
|
||||||
" details.
|
" details.
|
||||||
|
@ -141,7 +152,7 @@ endfunction
|
||||||
|
|
||||||
" Exists checks whether the given importpath exists or not. It returns 0 if
|
" Exists checks whether the given importpath exists or not. It returns 0 if
|
||||||
" the importpath exists under GOPATH.
|
" the importpath exists under GOPATH.
|
||||||
function! go#tool#Exists(importpath)
|
function! go#tool#Exists(importpath) abort
|
||||||
let command = "go list ". a:importpath
|
let command = "go list ". a:importpath
|
||||||
let out = go#tool#ExecuteInDir(command)
|
let out = go#tool#ExecuteInDir(command)
|
||||||
|
|
||||||
|
@ -155,7 +166,7 @@ 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()
|
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', '')
|
||||||
if go_play_browser_command == ''
|
if go_play_browser_command == ''
|
||||||
if go#util#IsWin()
|
if go#util#IsWin()
|
||||||
|
@ -173,7 +184,7 @@ function! s:get_browser_command()
|
||||||
return go_play_browser_command
|
return go_play_browser_command
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#tool#OpenBrowser(url)
|
function! go#tool#OpenBrowser(url) abort
|
||||||
let cmd = s:get_browser_command()
|
let cmd = s:get_browser_command()
|
||||||
if len(cmd) == 0
|
if len(cmd) == 0
|
||||||
redraw
|
redraw
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
let s:buf_nr = -1
|
let s:buf_nr = -1
|
||||||
|
|
||||||
"OpenWindow opens a new scratch window and put's the content into the window
|
"OpenWindow opens a new scratch window and put's the content into the window
|
||||||
function! go#ui#OpenWindow(title, content, filetype)
|
function! go#ui#OpenWindow(title, content, filetype) abort
|
||||||
" Ensure there's only one return window in this session/tabpage
|
" Ensure there's only one return window in this session/tabpage
|
||||||
call go#util#Windo("unlet! w:vim_go_return_window")
|
call go#util#Windo("unlet! w:vim_go_return_window")
|
||||||
" Mark the window we're leaving as such
|
" Mark the window we're leaving as such
|
||||||
|
@ -54,7 +54,7 @@ function! go#ui#OpenWindow(title, content, filetype)
|
||||||
echon
|
echon
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#ui#GetReturnWindow()
|
function! go#ui#GetReturnWindow() abort
|
||||||
for l:wn in range(1, winnr("$"))
|
for l:wn in range(1, winnr("$"))
|
||||||
if !empty(getwinvar(l:wn, "vim_go_return_window"))
|
if !empty(getwinvar(l:wn, "vim_go_return_window"))
|
||||||
return l:wn
|
return l:wn
|
||||||
|
@ -63,7 +63,7 @@ function! go#ui#GetReturnWindow()
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" CloseWindow closes the current window
|
" CloseWindow closes the current window
|
||||||
function! go#ui#CloseWindow()
|
function! go#ui#CloseWindow() abort
|
||||||
" Close any window associated with the ui buffer, if it's there
|
" Close any window associated with the ui buffer, if it's there
|
||||||
if bufexists(s:buf_nr)
|
if bufexists(s:buf_nr)
|
||||||
let ui_window_number = bufwinnr(s:buf_nr)
|
let ui_window_number = bufwinnr(s:buf_nr)
|
||||||
|
@ -82,7 +82,7 @@ endfunction
|
||||||
|
|
||||||
" OpenDefinition parses the current line and jumps to it by openening a new
|
" OpenDefinition parses the current line and jumps to it by openening a new
|
||||||
" tab
|
" tab
|
||||||
function! go#ui#OpenDefinition(filter)
|
function! go#ui#OpenDefinition(filter) abort
|
||||||
let curline = getline('.')
|
let curline = getline('.')
|
||||||
|
|
||||||
" don't touch our first line or any blank line
|
" don't touch our first line or any blank line
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
" PathSep returns the appropriate OS specific path separator.
|
" PathSep returns the appropriate OS specific path separator.
|
||||||
function! go#util#PathSep()
|
function! go#util#PathSep() abort
|
||||||
if go#util#IsWin()
|
if go#util#IsWin()
|
||||||
return '\'
|
return '\'
|
||||||
endif
|
endif
|
||||||
|
@ -7,7 +7,7 @@ function! go#util#PathSep()
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" PathListSep returns the appropriate OS specific path list separator.
|
" PathListSep returns the appropriate OS specific path list separator.
|
||||||
function! go#util#PathListSep()
|
function! go#util#PathListSep() abort
|
||||||
if go#util#IsWin()
|
if go#util#IsWin()
|
||||||
return ";"
|
return ";"
|
||||||
endif
|
endif
|
||||||
|
@ -15,7 +15,7 @@ function! go#util#PathListSep()
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" LineEnding returns the correct line ending, based on the current fileformat
|
" LineEnding returns the correct line ending, based on the current fileformat
|
||||||
function! go#util#LineEnding()
|
function! go#util#LineEnding() abort
|
||||||
if &fileformat == 'dos'
|
if &fileformat == 'dos'
|
||||||
return "\r\n"
|
return "\r\n"
|
||||||
elseif &fileformat == 'mac'
|
elseif &fileformat == 'mac'
|
||||||
|
@ -27,12 +27,12 @@ endfunction
|
||||||
|
|
||||||
" Join joins any number of path elements into a single path, adding a
|
" Join joins any number of path elements into a single path, adding a
|
||||||
" Separator if necessary and returns the result
|
" Separator if necessary and returns the result
|
||||||
function! go#util#Join(...)
|
function! go#util#Join(...) abort
|
||||||
return join(a:000, go#util#PathSep())
|
return join(a:000, go#util#PathSep())
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" IsWin returns 1 if current OS is Windows or 0 otherwise
|
" IsWin returns 1 if current OS is Windows or 0 otherwise
|
||||||
function! go#util#IsWin()
|
function! go#util#IsWin() abort
|
||||||
let win = ['win16', 'win32', 'win64', 'win95']
|
let win = ['win16', 'win32', 'win64', 'win95']
|
||||||
for w in win
|
for w in win
|
||||||
if (has(w))
|
if (has(w))
|
||||||
|
@ -43,12 +43,18 @@ function! go#util#IsWin()
|
||||||
return 0
|
return 0
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function! go#util#has_job() abort
|
||||||
|
" job was introduced in 7.4.xxx however there are multiple bug fixes and one
|
||||||
|
" of the latest is 8.0.0087 which is required for a stable async API.
|
||||||
|
return has('job') && has("patch-8.0.0087")
|
||||||
|
endfunction
|
||||||
|
|
||||||
let s:env_cache = {}
|
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)
|
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)
|
||||||
return s:env_cache[l:key]
|
return s:env_cache[l:key]
|
||||||
|
@ -68,81 +74,49 @@ function! go#util#env(key)
|
||||||
return l:var
|
return l:var
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#util#goarch()
|
function! go#util#goarch() abort
|
||||||
return substitute(go#util#System('go env GOARCH'), '\n', '', 'g')
|
return substitute(go#util#System('go env GOARCH'), '\n', '', 'g')
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#util#goos()
|
function! go#util#goos() abort
|
||||||
return substitute(go#util#System('go env GOOS'), '\n', '', 'g')
|
return substitute(go#util#System('go env GOOS'), '\n', '', 'g')
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#util#goroot()
|
function! go#util#goroot() abort
|
||||||
return substitute(go#util#System('go env GOROOT'), '\n', '', 'g')
|
return substitute(go#util#System('go env GOROOT'), '\n', '', 'g')
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#util#gopath()
|
function! go#util#gopath() abort
|
||||||
return substitute(go#util#System('go env GOPATH'), '\n', '', 'g')
|
return substitute(go#util#System('go env GOPATH'), '\n', '', 'g')
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#util#osarch()
|
function! go#util#osarch() abort
|
||||||
return go#util#goos() . '_' . go#util#goarch()
|
return go#util#goos() . '_' . go#util#goarch()
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
"Check if has vimproc
|
|
||||||
function! s:has_vimproc()
|
|
||||||
if !exists('g:go#use_vimproc')
|
|
||||||
if go#util#IsWin()
|
|
||||||
try
|
|
||||||
call vimproc#version()
|
|
||||||
let exists_vimproc = 1
|
|
||||||
catch
|
|
||||||
let exists_vimproc = 0
|
|
||||||
endtry
|
|
||||||
else
|
|
||||||
let exists_vimproc = 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
let g:go#use_vimproc = exists_vimproc
|
|
||||||
endif
|
|
||||||
|
|
||||||
return g:go#use_vimproc
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
if s:has_vimproc()
|
|
||||||
let s:vim_system = get(g:, 'gocomplete#system_function', 'vimproc#system2')
|
|
||||||
let s:vim_shell_error = get(g:, 'gocomplete#shell_error_function', 'vimproc#get_last_status')
|
|
||||||
else
|
|
||||||
let s:vim_system = get(g:, 'gocomplete#system_function', 'system')
|
|
||||||
let s:vim_shell_error = ''
|
|
||||||
endif
|
|
||||||
|
|
||||||
" System runs a shell command. It will reset the shell to /bin/sh for Unix-like
|
" System runs a shell command. It will reset the shell to /bin/sh for Unix-like
|
||||||
" systems if it is executable.
|
" systems if it is executable.
|
||||||
function! go#util#System(str, ...)
|
function! go#util#System(str, ...) abort
|
||||||
let l:shell = &shell
|
let l:shell = &shell
|
||||||
if !go#util#IsWin() && executable('/bin/sh')
|
if !go#util#IsWin() && executable('/bin/sh')
|
||||||
let &shell = '/bin/sh'
|
let &shell = '/bin/sh'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
try
|
try
|
||||||
let l:output = call(s:vim_system, [a:str] + a:000)
|
let l:output = call('system', [a:str] + a:000)
|
||||||
return l:output
|
return l:output
|
||||||
finally
|
finally
|
||||||
let &shell = l:shell
|
let &shell = l:shell
|
||||||
endtry
|
endtry
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#util#ShellError()
|
function! go#util#ShellError() abort
|
||||||
if empty(s:vim_shell_error)
|
|
||||||
return v:shell_error
|
return v:shell_error
|
||||||
endif
|
|
||||||
return call(s:vim_shell_error, [])
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
" StripPath strips the path's last character if it's a path separator.
|
" StripPath strips the path's last character if it's a path separator.
|
||||||
" example: '/foo/bar/' -> '/foo/bar'
|
" example: '/foo/bar/' -> '/foo/bar'
|
||||||
function! go#util#StripPathSep(path)
|
function! go#util#StripPathSep(path) abort
|
||||||
let last_char = strlen(a:path) - 1
|
let last_char = strlen(a:path) - 1
|
||||||
if a:path[last_char] == go#util#PathSep()
|
if a:path[last_char] == go#util#PathSep()
|
||||||
return strpart(a:path, 0, last_char)
|
return strpart(a:path, 0, last_char)
|
||||||
|
@ -153,13 +127,13 @@ endfunction
|
||||||
|
|
||||||
" StripTrailingSlash strips the trailing slash from the given path list.
|
" StripTrailingSlash strips the trailing slash from the given path list.
|
||||||
" example: ['/foo/bar/'] -> ['/foo/bar']
|
" example: ['/foo/bar/'] -> ['/foo/bar']
|
||||||
function! go#util#StripTrailingSlash(paths)
|
function! go#util#StripTrailingSlash(paths) abort
|
||||||
return map(copy(a:paths), 'go#util#StripPathSep(v:val)')
|
return map(copy(a:paths), 'go#util#StripPathSep(v:val)')
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Shelljoin returns a shell-safe string representation of arglist. The
|
" Shelljoin returns a shell-safe string representation of arglist. The
|
||||||
" {special} argument of shellescape() may optionally be passed.
|
" {special} argument of shellescape() may optionally be passed.
|
||||||
function! go#util#Shelljoin(arglist, ...)
|
function! go#util#Shelljoin(arglist, ...) abort
|
||||||
try
|
try
|
||||||
let ssl_save = &shellslash
|
let ssl_save = &shellslash
|
||||||
set noshellslash
|
set noshellslash
|
||||||
|
@ -174,9 +148,6 @@ function! go#util#Shelljoin(arglist, ...)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
fu! go#util#Shellescape(arg)
|
fu! go#util#Shellescape(arg)
|
||||||
if s:has_vimproc()
|
|
||||||
return vimproc#shellescape(a:arg)
|
|
||||||
endif
|
|
||||||
try
|
try
|
||||||
let ssl_save = &shellslash
|
let ssl_save = &shellslash
|
||||||
set noshellslash
|
set noshellslash
|
||||||
|
@ -188,7 +159,7 @@ endf
|
||||||
|
|
||||||
" Shelllist returns a shell-safe representation of the items in the given
|
" Shelllist returns a shell-safe representation of the items in the given
|
||||||
" arglist. The {special} argument of shellescape() may optionally be passed.
|
" arglist. The {special} argument of shellescape() may optionally be passed.
|
||||||
function! go#util#Shelllist(arglist, ...)
|
function! go#util#Shelllist(arglist, ...) abort
|
||||||
try
|
try
|
||||||
let ssl_save = &shellslash
|
let ssl_save = &shellslash
|
||||||
set noshellslash
|
set noshellslash
|
||||||
|
@ -202,7 +173,7 @@ function! go#util#Shelllist(arglist, ...)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Returns the byte offset for line and column
|
" Returns the byte offset for line and column
|
||||||
function! go#util#Offset(line, col)
|
function! go#util#Offset(line, col) abort
|
||||||
if &encoding != 'utf-8'
|
if &encoding != 'utf-8'
|
||||||
let sep = go#util#LineEnding()
|
let sep = go#util#LineEnding()
|
||||||
let buf = a:line == 1 ? '' : (join(getline(1, a:line-1), sep) . sep)
|
let buf = a:line == 1 ? '' : (join(getline(1, a:line-1), sep) . sep)
|
||||||
|
@ -213,13 +184,13 @@ function! go#util#Offset(line, col)
|
||||||
endfunction
|
endfunction
|
||||||
"
|
"
|
||||||
" Returns the byte offset for the cursor
|
" Returns the byte offset for the cursor
|
||||||
function! go#util#OffsetCursor()
|
function! go#util#OffsetCursor() abort
|
||||||
return go#util#Offset(line('.'), col('.'))
|
return go#util#Offset(line('.'), col('.'))
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Windo is like the built-in :windo, only it returns to the window the command
|
" Windo is like the built-in :windo, only it returns to the window the command
|
||||||
" was issued from
|
" was issued from
|
||||||
function! go#util#Windo(command)
|
function! go#util#Windo(command) abort
|
||||||
let s:currentWindow = winnr()
|
let s:currentWindow = winnr()
|
||||||
try
|
try
|
||||||
execute "windo " . a:command
|
execute "windo " . a:command
|
||||||
|
@ -231,7 +202,7 @@ endfunction
|
||||||
|
|
||||||
" snippetcase converts the given word to given preferred snippet setting type
|
" snippetcase converts the given word to given preferred snippet setting type
|
||||||
" case.
|
" case.
|
||||||
function! go#util#snippetcase(word)
|
function! go#util#snippetcase(word) abort
|
||||||
let l:snippet_case = get(g:, 'go_snippet_case_type', "snakecase")
|
let l:snippet_case = get(g:, 'go_snippet_case_type', "snakecase")
|
||||||
if l:snippet_case == "snakecase"
|
if l:snippet_case == "snakecase"
|
||||||
return go#util#snakecase(a:word)
|
return go#util#snakecase(a:word)
|
||||||
|
@ -244,7 +215,7 @@ endfunction
|
||||||
|
|
||||||
" snakecase converts a string to snake case. i.e: FooBar -> foo_bar
|
" snakecase converts a string to snake case. i.e: FooBar -> foo_bar
|
||||||
" Copied from tpope/vim-abolish
|
" Copied from tpope/vim-abolish
|
||||||
function! go#util#snakecase(word)
|
function! go#util#snakecase(word) abort
|
||||||
let word = substitute(a:word,'::','/','g')
|
let word = substitute(a:word,'::','/','g')
|
||||||
let word = substitute(word,'\(\u\+\)\(\u\l\)','\1_\2','g')
|
let word = substitute(word,'\(\u\+\)\(\u\l\)','\1_\2','g')
|
||||||
let word = substitute(word,'\(\l\|\d\)\(\u\)','\1_\2','g')
|
let word = substitute(word,'\(\l\|\d\)\(\u\)','\1_\2','g')
|
||||||
|
@ -255,7 +226,7 @@ endfunction
|
||||||
|
|
||||||
" camelcase converts a string to camel case. i.e: FooBar -> fooBar
|
" camelcase converts a string to camel case. i.e: FooBar -> fooBar
|
||||||
" Copied from tpope/vim-abolish
|
" Copied from tpope/vim-abolish
|
||||||
function! go#util#camelcase(word)
|
function! go#util#camelcase(word) abort
|
||||||
let word = substitute(a:word, '-', '_', 'g')
|
let word = substitute(a:word, '-', '_', 'g')
|
||||||
if word !~# '_' && word =~# '\l'
|
if word !~# '_' && word =~# '\l'
|
||||||
return substitute(word,'^.','\l&','')
|
return substitute(word,'^.','\l&','')
|
||||||
|
@ -264,7 +235,7 @@ function! go#util#camelcase(word)
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#util#AddTags(line1, line2, ...)
|
function! go#util#AddTags(line1, line2, ...) abort
|
||||||
" default is json
|
" default is json
|
||||||
let l:keys = ["json"]
|
let l:keys = ["json"]
|
||||||
if a:0
|
if a:0
|
||||||
|
@ -311,21 +282,27 @@ endfunction
|
||||||
|
|
||||||
" TODO(arslan): I couldn't parameterize the highlight types. Check if we can
|
" TODO(arslan): I couldn't parameterize the highlight types. Check if we can
|
||||||
" simplify the following functions
|
" simplify the following functions
|
||||||
|
"
|
||||||
|
" NOTE(arslan): echon doesn't work well with redraw, thus echo doesn't print
|
||||||
|
" even though we order it. However echom seems to be work fine.
|
||||||
function! go#util#EchoSuccess(msg)
|
function! go#util#EchoSuccess(msg)
|
||||||
redraw | echon "vim-go: " | echohl Function | echon a:msg | echohl None
|
redraw | echohl Function | echom "vim-go: " . a:msg | echohl None
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#util#EchoError(msg)
|
function! go#util#EchoError(msg)
|
||||||
redraw | echon "vim-go: " | echohl ErrorMsg | echon a:msg | echohl None
|
redraw | echohl ErrorMsg | echom "vim-go: " . a:msg | echohl None
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#util#EchoWarning(msg)
|
function! go#util#EchoWarning(msg)
|
||||||
redraw | echon "vim-go: " | echohl WarningMsg | echon a:msg | echohl None
|
redraw | echohl WarningMsg | echom "vim-go: " . a:msg | echohl None
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#util#EchoProgress(msg)
|
function! go#util#EchoProgress(msg)
|
||||||
redraw | echon "vim-go: " | echohl Identifier | echon a:msg | echohl None
|
redraw | echohl Identifier | echom "vim-go: " . a:msg | echohl None
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#util#EchoInfo(msg)
|
||||||
|
redraw | echohl Debug | echom "vim-go: " . a:msg | echohl None
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" vim: sw=2 ts=2 et
|
" vim: sw=2 ts=2 et
|
||||||
|
|
|
@ -327,7 +327,9 @@ CTRL-t
|
||||||
:GoInfo
|
:GoInfo
|
||||||
Show type information about the identifier under the cursor. For example
|
Show type information about the identifier under the cursor. For example
|
||||||
putting it above a function call is going to show the full function
|
putting it above a function call is going to show the full function
|
||||||
signature. It uses gocode to get the type informations.
|
signature. By default it uses `gocode` to get the type informations. To
|
||||||
|
change the underlying tool from `gocode` to another tool, see
|
||||||
|
|g:go_info_mode|.
|
||||||
|
|
||||||
|
|
||||||
*:GoInstall*
|
*:GoInstall*
|
||||||
|
@ -786,6 +788,10 @@ annotation.
|
||||||
|
|
||||||
Calls `goimports` for the current package
|
Calls `goimports` for the current package
|
||||||
|
|
||||||
|
*(go-lint)*
|
||||||
|
|
||||||
|
Calls `golint` for the current package
|
||||||
|
|
||||||
*(go-vet)*
|
*(go-vet)*
|
||||||
|
|
||||||
Calls `go vet` for the current package
|
Calls `go vet` for the current package
|
||||||
|
@ -946,13 +952,17 @@ vim-go also defines the following text motion objects:
|
||||||
==============================================================================
|
==============================================================================
|
||||||
FUNCTIONS *go-functions*
|
FUNCTIONS *go-functions*
|
||||||
|
|
||||||
*go#jobcontrol#Statusline()*
|
*go#statusline#Show()*
|
||||||
|
|
||||||
Shows the status of a job running asynchronously. Can be used to plug into the
|
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 be empty
|
the package build (`:GoBuild`) is successful, all statusline's will show
|
||||||
(means 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
|
||||||
|
cleaned for each package after `60` seconds. This can be changed with the
|
||||||
|
|g:go_statusline_duration| setting.
|
||||||
|
|
||||||
*go#complete#GetInfo()*
|
*go#complete#GetInfo()*
|
||||||
|
|
||||||
|
@ -989,17 +999,35 @@ with |:GoPlay|. By default it's enabled. >
|
||||||
|
|
||||||
Use this option to show the type info (|:GoInfo|) for the word under the
|
Use this option to show the type info (|:GoInfo|) for the word under the
|
||||||
cursor automatically. Whenever the cursor changes the type info will be
|
cursor automatically. Whenever the cursor changes the type info will be
|
||||||
updated. By default it's disabled.
|
updated. By default it's disabled. The delay can be configured with the
|
||||||
|
'g:go_updatetime' setting.
|
||||||
>
|
>
|
||||||
let g:go_auto_type_info = 0
|
let g:go_auto_type_info = 0
|
||||||
<
|
<
|
||||||
|
|
||||||
|
*'g:go_info_mode'*
|
||||||
|
|
||||||
|
Use this option to define the command to be used for |:GoInfo|. By default
|
||||||
|
`gocode` is being used as it's the fastest option. But one might also use
|
||||||
|
`guru` as it's covers more cases and is more accurate. Current valid options
|
||||||
|
are: `[gocode, guru]` >
|
||||||
|
|
||||||
|
let g:go_info_mode = 'gocode'
|
||||||
|
<
|
||||||
*'g:go_auto_sameids'*
|
*'g:go_auto_sameids'*
|
||||||
|
|
||||||
Use this option to highlight all uses of the identifier under the cursor
|
Use this option to highlight all uses of the identifier under the cursor
|
||||||
(:GoSameIds) automatically. By default it's disabled. The delay can be
|
(:GoSameIds) automatically. By default it's disabled. The delay can be
|
||||||
configured with the 'updatetime' setting.
|
configured with the 'g:go_updatetime' setting.
|
||||||
>
|
>
|
||||||
let g:go_auto_sameids = 0
|
let g:go_auto_sameids = 0
|
||||||
|
<
|
||||||
|
*'g:go_updatetime'*
|
||||||
|
|
||||||
|
Use this option to configure the a custom 'updatetime' for Go source files. If
|
||||||
|
set to 0, no custom time will be configured. By default it's set to 800ms.
|
||||||
|
>
|
||||||
|
let g:go_updatetime = 800
|
||||||
<
|
<
|
||||||
*'g:go_jump_to_error'*
|
*'g:go_jump_to_error'*
|
||||||
|
|
||||||
|
@ -1078,14 +1106,6 @@ Use this option to jump to an existing buffer for the split, vsplit and tab
|
||||||
mappings of |:GoDef|. By default it's disabled. >
|
mappings of |:GoDef|. By default it's disabled. >
|
||||||
|
|
||||||
let g:go_def_reuse_buffer = 0
|
let g:go_def_reuse_buffer = 0
|
||||||
<
|
|
||||||
*'g:go_dispatch_enabled'*
|
|
||||||
|
|
||||||
Use this option to enable/disable the use of Dispatch to execute the `:GoRun`,
|
|
||||||
`:GoBuild` and `:GoGenerate` commands. More information about Dispatch is
|
|
||||||
available at https://github.com/tpope/vim-dispatch. Default is disabled. >
|
|
||||||
|
|
||||||
let g:go_dispatch_enabled = 0
|
|
||||||
<
|
<
|
||||||
*'g:go_doc_command'*
|
*'g:go_doc_command'*
|
||||||
|
|
||||||
|
@ -1332,9 +1352,9 @@ appropriate kind of list for the command that was called. Supported values are
|
||||||
<
|
<
|
||||||
*'g:go_asmfmt_autosave'*
|
*'g:go_asmfmt_autosave'*
|
||||||
|
|
||||||
Use this option to auto |:AsmFmt| on save. By default it's enabled. >
|
Use this option to auto |:AsmFmt| on save. By default it's disabled. >
|
||||||
|
|
||||||
let g:go_asmfmt_autosave = 1
|
let g:go_asmfmt_autosave = 0
|
||||||
<
|
<
|
||||||
*'g:go_term_mode'*
|
*'g:go_term_mode'*
|
||||||
|
|
||||||
|
@ -1399,9 +1419,11 @@ to an autocompletion proposals. By default it is enabled.
|
||||||
*'g:go_gocode_unimported_packages'*
|
*'g:go_gocode_unimported_packages'*
|
||||||
|
|
||||||
Specifies whether `gocode` should include suggestions from unimported packages.
|
Specifies whether `gocode` should include suggestions from unimported packages.
|
||||||
By default it is enabled
|
By default it is disabled.
|
||||||
>
|
>
|
||||||
let g:go_gocode_unimported_packages = 1
|
let g:go_gocode_unimported_packages = 0
|
||||||
|
<
|
||||||
|
|
||||||
*'g:go_gocode_socket_type'*
|
*'g:go_gocode_socket_type'*
|
||||||
|
|
||||||
Specifies whether `gocode` should use a different socket type. By default
|
Specifies whether `gocode` should use a different socket type. By default
|
||||||
|
@ -1420,6 +1442,9 @@ If the new file is created in an already prepopulated package (with other Go
|
||||||
files), in this case a Go code template with only the Go package declaration
|
files), in this case a Go code template with only the Go package declaration
|
||||||
(which is automatically determined according to the current package) is added.
|
(which is automatically determined according to the current package) is added.
|
||||||
|
|
||||||
|
To always use the package name instead of the template, enable the
|
||||||
|
|`g:go_template_use_pkg`| setting.
|
||||||
|
|
||||||
By default it is enabled.
|
By default it is enabled.
|
||||||
>
|
>
|
||||||
let g:go_template_autocreate = 1
|
let g:go_template_autocreate = 1
|
||||||
|
@ -1431,15 +1456,45 @@ is created. Checkout |'g:go_template_autocreate'| for more info. By default
|
||||||
the `hello_world.go` file is used.
|
the `hello_world.go` file is used.
|
||||||
>
|
>
|
||||||
let g:go_template_file = "hello_world.go"
|
let g:go_template_file = "hello_world.go"
|
||||||
|
<
|
||||||
|
*'g:go_template_use_pkg'*
|
||||||
|
|
||||||
|
Specifies that, rather than using a template, the package name is used if a new
|
||||||
|
Go file is created. Checkout |'g:go_template_autocreate'| for more info. By
|
||||||
|
default the template file specified by |'g:go_template_file'| is used.
|
||||||
|
|
||||||
|
>
|
||||||
|
let g:go_template_use_pkg = 0
|
||||||
<
|
<
|
||||||
*'g:go_decls_includes'*
|
*'g:go_decls_includes'*
|
||||||
|
|
||||||
Only useful if `ctrlp.vim` is installed. This sets which declarations to
|
Only useful if `ctrlp.vim` is installed. This sets which declarations to show
|
||||||
show for |:GoDecls|.
|
for |:GoDecls|. It is a Comma delimited list Possible options are:
|
||||||
It is a Comma delimited list Possible options are: {func,type}.
|
{func,type}. The default is: >
|
||||||
The default is: >
|
|
||||||
|
|
||||||
let g:go_decls_includes = 'func,type'
|
let g:go_decls_includes = 'func,type'
|
||||||
|
<
|
||||||
|
*'g:go_echo_command_info'*
|
||||||
|
|
||||||
|
Echoes information about various Go commands, such as `:GoBuild`, `:GoTest`,
|
||||||
|
`:GoCoverage`, etc... Useful to disable if you use the statusline integration,
|
||||||
|
i.e: |go#statusline#Show()|. By default it's enabled
|
||||||
|
>
|
||||||
|
let g:go_echo_command_info = 1
|
||||||
|
<
|
||||||
|
*'g:go_echo_go_info'*
|
||||||
|
|
||||||
|
Use this option to show the identifier information when completion is done. By
|
||||||
|
default it's enabled >
|
||||||
|
|
||||||
|
let g:go_echo_go_info = 1
|
||||||
|
<
|
||||||
|
*'g:go_statusline_duration'*
|
||||||
|
|
||||||
|
Specifices the duration of statusline information being showed per package. By
|
||||||
|
default it's 60 seconds. Must be in milliseconds.
|
||||||
|
>
|
||||||
|
let g:go_statusline_duration = 60000
|
||||||
<
|
<
|
||||||
==============================================================================
|
==============================================================================
|
||||||
TROUBLESHOOTING *go-troubleshooting*
|
TROUBLESHOOTING *go-troubleshooting*
|
||||||
|
|
|
@ -57,7 +57,75 @@ if get(g:, "go_textobj_enabled", 1)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if get(g:, "go_auto_type_info", 0) || get(g:, "go_auto_sameids", 0)
|
if get(g:, "go_auto_type_info", 0) || get(g:, "go_auto_sameids", 0)
|
||||||
setlocal updatetime=800
|
let &l:updatetime= get(g:, "go_updatetime", 800)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
" NOTE(arslan): experimental, disabled by default, doesn't work well. No
|
||||||
|
" documentation as well. If anyone feels adventerous, enable the following and
|
||||||
|
" try to search for Go identifiers ;)
|
||||||
|
"
|
||||||
|
" if get(g:, "go_sameid_search_enabled", 0)
|
||||||
|
" autocmd FileType go nnoremap <buffer> <silent> * :<c-u>call Sameids_search(0)<CR>
|
||||||
|
" autocmd FileType go nnoremap <buffer> <silent> # :<c-u>call Sameids_search(1)<CR>
|
||||||
|
" autocmd FileType go nnoremap <buffer> <silent> n :<c-u>call Sameids_repeat(0)<CR>
|
||||||
|
" autocmd FileType go nnoremap <buffer> <silent> N :<c-u>call Sameids_repeat(1)<CR>
|
||||||
|
" autocmd FileType go cabbrev nohlsearch <C-r>=Sameids_nohlsearch()<CR>
|
||||||
|
" endif
|
||||||
|
|
||||||
|
" " mode 0: next 1: prev
|
||||||
|
" function! Sameids_repeat(mode)
|
||||||
|
" let matches = getmatches()
|
||||||
|
" if empty(matches)
|
||||||
|
" return
|
||||||
|
" endif
|
||||||
|
" let cur_offset = go#util#OffsetCursor()
|
||||||
|
|
||||||
|
" " reverse list to make it easy to find the prev occurence
|
||||||
|
" if a:mode
|
||||||
|
" call reverse(matches)
|
||||||
|
" endif
|
||||||
|
|
||||||
|
" for m in matches
|
||||||
|
" if !has_key(m, "group")
|
||||||
|
" return
|
||||||
|
" endif
|
||||||
|
|
||||||
|
" if m.group != "goSameId"
|
||||||
|
" return
|
||||||
|
" endif
|
||||||
|
|
||||||
|
" let offset = go#util#Offset(m.pos1[0], m.pos1[1])
|
||||||
|
|
||||||
|
" if a:mode && cur_offset > offset
|
||||||
|
" call cursor(m.pos1[0], m.pos1[1])
|
||||||
|
" return
|
||||||
|
" elseif !a:mode && cur_offset < offset
|
||||||
|
" call cursor(m.pos1[0], m.pos1[1])
|
||||||
|
" return
|
||||||
|
" endif
|
||||||
|
" endfor
|
||||||
|
|
||||||
|
" " reached start/end, jump to the end/start
|
||||||
|
" let initial_match = matches[0]
|
||||||
|
" if !has_key(initial_match, "group")
|
||||||
|
" return
|
||||||
|
" endif
|
||||||
|
|
||||||
|
" if initial_match.group != "goSameId"
|
||||||
|
" return
|
||||||
|
" endif
|
||||||
|
|
||||||
|
" call cursor(initial_match.pos1[0], initial_match.pos1[1])
|
||||||
|
" endfunction
|
||||||
|
|
||||||
|
" function! Sameids_search(mode)
|
||||||
|
" call go#guru#SameIds()
|
||||||
|
" call Sameids_repeat(a:mode)
|
||||||
|
" endfunction
|
||||||
|
|
||||||
|
" function! Sameids_nohlsearch()
|
||||||
|
" call go#guru#ClearSameIds()
|
||||||
|
" return "nohlsearch"
|
||||||
|
" endfunction
|
||||||
|
|
||||||
" vim: sw=2 ts=2 et
|
" vim: sw=2 ts=2 et
|
||||||
|
|
|
@ -17,15 +17,15 @@ command! -nargs=? GoGuruTags call go#guru#Tags(<f-args>)
|
||||||
|
|
||||||
command! -nargs=* -range GoAddTags call go#util#AddTags(<line1>, <line2>, <f-args>)
|
command! -nargs=* -range GoAddTags call go#util#AddTags(<line1>, <line2>, <f-args>)
|
||||||
|
|
||||||
command! -range=% GoSameIds call go#guru#SameIds(<count>)
|
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=% GoSameIdsToggle call go#guru#ToggleSameIds(<count>)
|
command! -range=0 GoSameIdsToggle call go#guru#ToggleSameIds()
|
||||||
command! -range=0 GoSameIdsAutoToggle call go#guru#AutoToogleSameIds()
|
command! -range=0 GoSameIdsAutoToggle call go#guru#AutoToogleSameIds()
|
||||||
|
|
||||||
" -- 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()
|
||||||
command! -nargs=* GoInfo call go#complete#Info(0)
|
command! -nargs=* GoInfo call go#tool#Info(0)
|
||||||
command! -nargs=0 GoAutoTypeInfoToggle call go#complete#ToggleAutoTypeInfo()
|
command! -nargs=0 GoAutoTypeInfoToggle call go#complete#ToggleAutoTypeInfo()
|
||||||
|
|
||||||
" -- cmd
|
" -- cmd
|
||||||
|
|
|
@ -31,7 +31,7 @@ nnoremap <silent> <Plug>(go-coverage-browser) :<C-u>call go#coverage#Browser(!g:
|
||||||
|
|
||||||
nnoremap <silent> <Plug>(go-files) :<C-u>call go#tool#Files()<CR>
|
nnoremap <silent> <Plug>(go-files) :<C-u>call go#tool#Files()<CR>
|
||||||
nnoremap <silent> <Plug>(go-deps) :<C-u>call go#tool#Deps()<CR>
|
nnoremap <silent> <Plug>(go-deps) :<C-u>call go#tool#Deps()<CR>
|
||||||
nnoremap <silent> <Plug>(go-info) :<C-u>call go#complete#Info(0)<CR>
|
nnoremap <silent> <Plug>(go-info) :<C-u>call go#tool#Info(0)<CR>
|
||||||
nnoremap <silent> <Plug>(go-import) :<C-u>call go#import#SwitchImport(1, '', expand('<cword>'), '')<CR>
|
nnoremap <silent> <Plug>(go-import) :<C-u>call go#import#SwitchImport(1, '', expand('<cword>'), '')<CR>
|
||||||
nnoremap <silent> <Plug>(go-imports) :<C-u>call go#fmt#Format(1)<CR>
|
nnoremap <silent> <Plug>(go-imports) :<C-u>call go#fmt#Format(1)<CR>
|
||||||
|
|
||||||
|
@ -43,9 +43,9 @@ nnoremap <silent> <Plug>(go-callstack) :<C-u>call go#guru#Callstack(-1)<CR>
|
||||||
xnoremap <silent> <Plug>(go-freevars) :<C-u>call go#guru#Freevars(0)<CR>
|
xnoremap <silent> <Plug>(go-freevars) :<C-u>call go#guru#Freevars(0)<CR>
|
||||||
nnoremap <silent> <Plug>(go-channelpeers) :<C-u>call go#guru#ChannelPeers(-1)<CR>
|
nnoremap <silent> <Plug>(go-channelpeers) :<C-u>call go#guru#ChannelPeers(-1)<CR>
|
||||||
nnoremap <silent> <Plug>(go-referrers) :<C-u>call go#guru#Referrers(-1)<CR>
|
nnoremap <silent> <Plug>(go-referrers) :<C-u>call go#guru#Referrers(-1)<CR>
|
||||||
nnoremap <silent> <Plug>(go-sameids) :<C-u>call go#guru#SameIds(-1)<CR>
|
nnoremap <silent> <Plug>(go-sameids) :<C-u>call go#guru#SameIds()<CR>
|
||||||
nnoremap <silent> <Plug>(go-whicherrs) :<C-u>call go#guru#Whicherrs(-1)<CR>
|
nnoremap <silent> <Plug>(go-whicherrs) :<C-u>call go#guru#Whicherrs(-1)<CR>
|
||||||
nnoremap <silent> <Plug>(go-sameids-toggle) :<C-u>call go#guru#ToggleSameIds(-1)<CR>
|
nnoremap <silent> <Plug>(go-sameids-toggle) :<C-u>call go#guru#ToggleSameIds()<CR>
|
||||||
|
|
||||||
nnoremap <silent> <Plug>(go-rename) :<C-u>call go#rename#Rename(!g:go_jump_to_error)<CR>
|
nnoremap <silent> <Plug>(go-rename) :<C-u>call go#rename#Rename(!g:go_jump_to_error)<CR>
|
||||||
|
|
||||||
|
@ -65,6 +65,7 @@ nnoremap <silent> <Plug>(go-doc-split) :<C-u>call go#doc#Open("new", "split")<CR
|
||||||
nnoremap <silent> <Plug>(go-doc-browser) :<C-u>call go#doc#OpenBrowser()<CR>
|
nnoremap <silent> <Plug>(go-doc-browser) :<C-u>call go#doc#OpenBrowser()<CR>
|
||||||
|
|
||||||
nnoremap <silent> <Plug>(go-metalinter) :<C-u>call go#lint#Gometa(0)<CR>
|
nnoremap <silent> <Plug>(go-metalinter) :<C-u>call go#lint#Gometa(0)<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-lint) :<C-u>call go#lint#Golint()<CR>
|
||||||
nnoremap <silent> <Plug>(go-vet) :<C-u>call go#lint#Vet(!g:go_jump_to_error)<CR>
|
nnoremap <silent> <Plug>(go-vet) :<C-u>call go#lint#Vet(!g:go_jump_to_error)<CR>
|
||||||
|
|
||||||
nnoremap <silent> <Plug>(go-alternate-edit) :<C-u>call go#alternate#Switch(0, "edit")<CR>
|
nnoremap <silent> <Plug>(go-alternate-edit) :<C-u>call go#alternate#Switch(0, "edit")<CR>
|
||||||
|
|
|
@ -30,13 +30,13 @@ function! GetGoHTMLTmplIndent(lnum)
|
||||||
|
|
||||||
" If need to indent based on last line
|
" If need to indent based on last line
|
||||||
let last_line = getline(a:lnum-1)
|
let last_line = getline(a:lnum-1)
|
||||||
if last_line =~ '^\s*{{\s*\%(if\|else\|range\|with\|define\|block\).*}}'
|
if last_line =~ '^\s*{{-\=\s*\%(if\|else\|range\|with\|define\|block\).*}}'
|
||||||
let ind += sw
|
let ind += sw
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" End of FuncMap block
|
" End of FuncMap block
|
||||||
let current_line = getline(a:lnum)
|
let current_line = getline(a:lnum)
|
||||||
if current_line =~ '^\s*{{\s*\%(else\|end\).*}}'
|
if current_line =~ '^\s*{{-\=\s*\%(else\|end\).*}}'
|
||||||
let ind -= sw
|
let ind -= sw
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
|
@ -126,6 +126,10 @@ endfunction
|
||||||
" ============================================================================
|
" ============================================================================
|
||||||
"
|
"
|
||||||
function! s:echo_go_info()
|
function! s:echo_go_info()
|
||||||
|
if !get(g:, "go_echo_go_info", 1)
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
if !exists('v:completed_item') || empty(v:completed_item)
|
if !exists('v:completed_item') || empty(v:completed_item)
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
@ -145,14 +149,14 @@ endfunction
|
||||||
function! s:auto_type_info()
|
function! s:auto_type_info()
|
||||||
" GoInfo automatic update
|
" GoInfo automatic update
|
||||||
if get(g:, "go_auto_type_info", 0)
|
if get(g:, "go_auto_type_info", 0)
|
||||||
call go#complete#Info(1)
|
call go#tool#Info(1)
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:auto_sameids()
|
function! s:auto_sameids()
|
||||||
" GoSameId automatic update
|
" GoSameId automatic update
|
||||||
if get(g:, "go_auto_sameids", 0)
|
if get(g:, "go_auto_sameids", 0)
|
||||||
call go#guru#SameIds(-1)
|
call go#guru#SameIds()
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
@ -165,7 +169,7 @@ endfunction
|
||||||
|
|
||||||
function! s:asmfmt_autosave()
|
function! s:asmfmt_autosave()
|
||||||
" Go asm formatting on save
|
" Go asm formatting on save
|
||||||
if get(g:, "go_asmfmt_autosave", 1)
|
if get(g:, "go_asmfmt_autosave", 0)
|
||||||
call go#asmfmt#Format()
|
call go#asmfmt#Format()
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
|
@ -374,12 +374,7 @@ endif
|
||||||
hi def link goCoverageNormalText Comment
|
hi def link goCoverageNormalText Comment
|
||||||
|
|
||||||
function! s:hi()
|
function! s:hi()
|
||||||
" :GoSameIds
|
hi def link goSameId Search
|
||||||
if &background == 'dark'
|
|
||||||
hi def goSameId term=bold cterm=bold ctermbg=white ctermfg=black guibg=white guifg=black
|
|
||||||
else
|
|
||||||
hi def goSameId term=bold cterm=bold ctermbg=14 guibg=Cyan
|
|
||||||
endif
|
|
||||||
|
|
||||||
" :GoCoverage commands
|
" :GoCoverage commands
|
||||||
hi def goCoverageCovered ctermfg=green guifg=#A6E22E
|
hi def goCoverageCovered ctermfg=green guifg=#A6E22E
|
||||||
|
|
|
@ -28,13 +28,9 @@ function! snipMate#expandSnip(snip, version, col) abort
|
||||||
let [snippet, b:snip_state.stops] = snipmate#parse#snippet(a:snip)
|
let [snippet, b:snip_state.stops] = snipmate#parse#snippet(a:snip)
|
||||||
" Build stop/mirror info
|
" Build stop/mirror info
|
||||||
let b:snip_state.stop_count = s:build_stops(snippet, b:snip_state.stops, lnum, col, indent)
|
let b:snip_state.stop_count = s:build_stops(snippet, b:snip_state.stops, lnum, col, indent)
|
||||||
let snipLines = map(copy(snippet),
|
|
||||||
\ 'snipMate#sniplist_str(v:val, b:snip_state.stops)')
|
|
||||||
else
|
else
|
||||||
let snippet = snipmate#legacy#process_snippet(a:snip)
|
let snippet = snipmate#legacy#process_snippet(a:snip)
|
||||||
let [b:snip_state.stops, b:snip_state.stop_count] = snipmate#legacy#build_stops(snippet, lnum, col - indent, indent)
|
let [b:snip_state.stops, b:snip_state.stop_count] = snipmate#legacy#build_stops(snippet, lnum, col - indent, indent)
|
||||||
let snipLines = split(substitute(snippet, printf('%s\d\+\|%s{\d\+.\{-}}',
|
|
||||||
\ g:snipmate#legacy#sigil, g:snipmate#legacy#sigil), '', 'g'), "\n", 1)
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" Abort if the snippet is empty
|
" Abort if the snippet is empty
|
||||||
|
@ -42,23 +38,7 @@ function! snipMate#expandSnip(snip, version, col) abort
|
||||||
return ''
|
return ''
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" Expand snippet onto current position
|
let col = s:insert_snippet_text(snippet, lnum, col, indent)
|
||||||
let afterCursor = strpart(line, col - 1)
|
|
||||||
" Keep text after the cursor
|
|
||||||
if afterCursor != "\t" && afterCursor != ' '
|
|
||||||
let line = strpart(line, 0, col - 1)
|
|
||||||
let snipLines[-1] .= afterCursor
|
|
||||||
else
|
|
||||||
let afterCursor = ''
|
|
||||||
" For some reason the cursor needs to move one right after this
|
|
||||||
if line != '' && col == 1 && &ve != 'all' && &ve != 'onemore'
|
|
||||||
let col += 1
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Insert snippet with proper indentation
|
|
||||||
call setline(lnum, line . snipLines[0])
|
|
||||||
call append(lnum, map(snipLines[1:], "empty(v:val) ? v:val : '" . strpart(line, 0, indent - 1) . "' . v:val"))
|
|
||||||
|
|
||||||
" Open any folds snippet expands into
|
" Open any folds snippet expands into
|
||||||
if &foldenable
|
if &foldenable
|
||||||
|
@ -77,6 +57,50 @@ function! snipMate#expandSnip(snip, version, col) abort
|
||||||
return b:snip_state.set_stop(0)
|
return b:snip_state.set_stop(0)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function! s:insert_snippet_text(snippet, lnum, col, indent)
|
||||||
|
let line = getline(a:lnum)
|
||||||
|
let col = a:col
|
||||||
|
let snippet = type(a:snippet) == type([]) ? a:snippet : split(a:snippet, "\n", 1)
|
||||||
|
let lnum = a:lnum
|
||||||
|
|
||||||
|
" Keep text after the cursor
|
||||||
|
let afterCursor = strpart(line, col - 1)
|
||||||
|
if afterCursor != "\t" && afterCursor != ' '
|
||||||
|
let line = strpart(line, 0, col - 1)
|
||||||
|
else
|
||||||
|
let afterCursor = ''
|
||||||
|
" For some reason the cursor needs to move one right after this
|
||||||
|
if line != '' && col == 1 && &ve != 'all' && &ve != 'onemore'
|
||||||
|
let col += 1
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
call setline(lnum, '')
|
||||||
|
call append(lnum, repeat([''], len(snippet) - 1))
|
||||||
|
|
||||||
|
for item in snippet
|
||||||
|
let add = lnum == a:lnum ? line : strpart(line, 0, a:indent - 1)
|
||||||
|
|
||||||
|
if !(empty(item) || (type(item) == type([]) && empty(item[0])))
|
||||||
|
if type(item) == type([])
|
||||||
|
call setline(lnum, add .
|
||||||
|
\ snipMate#sniplist_str(item, b:snip_state.stops))
|
||||||
|
else
|
||||||
|
call setline(lnum, add .
|
||||||
|
\ substitute(item, printf('%s\d\+\|%s{\d\+.\{-}}',
|
||||||
|
\ g:snipmate#legacy#sigil, g:snipmate#legacy#sigil),
|
||||||
|
\ '', 'g'))
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
let lnum += 1
|
||||||
|
endfor
|
||||||
|
|
||||||
|
call setline(lnum - 1, getline(lnum - 1) . afterCursor)
|
||||||
|
|
||||||
|
return col
|
||||||
|
endfunction
|
||||||
|
|
||||||
function! snipMate#placeholder_str(num, stops) abort
|
function! snipMate#placeholder_str(num, stops) abort
|
||||||
return snipMate#sniplist_str(a:stops[a:num].placeholder, a:stops)
|
return snipMate#sniplist_str(a:stops[a:num].placeholder, a:stops)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
383
sources_non_forked/vim-snippets/AUTHORS
Normal file
383
sources_non_forked/vim-snippets/AUTHORS
Normal file
|
@ -0,0 +1,383 @@
|
||||||
|
Authors
|
||||||
|
===============================================================================
|
||||||
|
|
||||||
|
Generated with "git log --oneline --pretty="%an" | sort | uniq > AUTHORS
|
||||||
|
|
||||||
|
Aaron Broder
|
||||||
|
Adnan Zafar
|
||||||
|
afolmert
|
||||||
|
aisensiy
|
||||||
|
Alexander Ross
|
||||||
|
Alexandre de Oliveira
|
||||||
|
Alexey Shevchenko
|
||||||
|
Alex Tan
|
||||||
|
Allen.M
|
||||||
|
Alvin Chan
|
||||||
|
ALX-Liu-Xiao
|
||||||
|
Andrea Giardini
|
||||||
|
Andreas Krennmair
|
||||||
|
Andreas Steinel
|
||||||
|
Andrei Cristian Petcu
|
||||||
|
Andrej Radovic
|
||||||
|
Andre Walker
|
||||||
|
Andrey Paskal
|
||||||
|
Andy Waite
|
||||||
|
Angel Alonso
|
||||||
|
Ángel Alonso
|
||||||
|
Anne Douwe Bouma
|
||||||
|
Anthony Wilson
|
||||||
|
Arvind
|
||||||
|
ashfinal
|
||||||
|
Audrius Kažukauskas
|
||||||
|
Austin Wood
|
||||||
|
Aydar Khabibullin
|
||||||
|
babybeasimple
|
||||||
|
Benjamin Nørgaard
|
||||||
|
Bernhard Graf
|
||||||
|
Bill Casarin
|
||||||
|
binaryplease
|
||||||
|
Björn
|
||||||
|
Björn-Egil Dahlberg
|
||||||
|
BlackEagle
|
||||||
|
Boone Severson
|
||||||
|
bounceme
|
||||||
|
Bradlee Speice
|
||||||
|
Brandon Dulaney
|
||||||
|
Brandon Hilkert
|
||||||
|
Brian Hogan
|
||||||
|
Brian van Burken
|
||||||
|
Bruno Sutic
|
||||||
|
Camilo Payan
|
||||||
|
carme
|
||||||
|
Cézar Antáres
|
||||||
|
Chad Paradis
|
||||||
|
Chen Zhongzheng
|
||||||
|
Ches Martin
|
||||||
|
ChickenNuggers
|
||||||
|
Chipairon
|
||||||
|
Chris Dueck
|
||||||
|
Chris Nicola
|
||||||
|
Chris Sims
|
||||||
|
Christian
|
||||||
|
Christian Höltje
|
||||||
|
Christian Neumüller
|
||||||
|
Christopher Joslyn
|
||||||
|
chrisyue
|
||||||
|
Ciro Santilli
|
||||||
|
Ciro Santilli 六四事件 法轮功
|
||||||
|
Claudio Maradonna
|
||||||
|
Connor Atherton
|
||||||
|
Cooper LeBrun
|
||||||
|
Corentin Peuvrel
|
||||||
|
Craig Paterson
|
||||||
|
Craig P Jolicoeur
|
||||||
|
crazymaster
|
||||||
|
daa84
|
||||||
|
Daeyun Shin
|
||||||
|
Dale Roberts
|
||||||
|
Daniel Hahler
|
||||||
|
Dan Loewenherz
|
||||||
|
Danny Navarro
|
||||||
|
daoo
|
||||||
|
Darrell Hamilton
|
||||||
|
David Arvelo
|
||||||
|
David Barnett
|
||||||
|
David C. Bishop
|
||||||
|
David Deryl Downey - AKA Deryl R. Doucette
|
||||||
|
David Rodríguez de Dios
|
||||||
|
David Sanson
|
||||||
|
dengyaolong
|
||||||
|
Derek Morey
|
||||||
|
dhilipsiva
|
||||||
|
djdt
|
||||||
|
Dmitry Dementev
|
||||||
|
Donny Yang
|
||||||
|
DSIW
|
||||||
|
dzikie drożdże
|
||||||
|
Eduardo Gurgel
|
||||||
|
Eli Gundry
|
||||||
|
emzap79
|
||||||
|
Enric Lluelles
|
||||||
|
Enrico Maria De Angelis
|
||||||
|
Erich Heine
|
||||||
|
Erik Westrup
|
||||||
|
Ernest
|
||||||
|
Eugene Kalinin
|
||||||
|
Eustaquio Rangel
|
||||||
|
Eustáquio Rangel
|
||||||
|
Fatih Arslan
|
||||||
|
Felix Jung
|
||||||
|
Filipe Giusti
|
||||||
|
Florent Lévigne
|
||||||
|
Florian Sattler
|
||||||
|
frans
|
||||||
|
Fuad Saud
|
||||||
|
Gabriel Chavez
|
||||||
|
Gaël Chamoulaud
|
||||||
|
Gea-Suan Lin
|
||||||
|
George Guimarães
|
||||||
|
George Lee
|
||||||
|
Georgios Samaras
|
||||||
|
Gert
|
||||||
|
gfixler
|
||||||
|
Gilad Peleg
|
||||||
|
gk
|
||||||
|
goonnow
|
||||||
|
Gueunet Charles
|
||||||
|
Gui Lin
|
||||||
|
guneysus
|
||||||
|
Gustavo Chain
|
||||||
|
Gustavo Ferreira
|
||||||
|
Hans-Guenter
|
||||||
|
Harald Wartig
|
||||||
|
Henrik Kjelsberg
|
||||||
|
HIRAKI Satoru
|
||||||
|
Holger Rapp
|
||||||
|
Honza
|
||||||
|
Honza Pokorny
|
||||||
|
hulufei
|
||||||
|
Igor Goldvekht
|
||||||
|
Ilker Cetinkaya
|
||||||
|
indi
|
||||||
|
Indra Susila
|
||||||
|
Ionică Bizău
|
||||||
|
Iuri Fernandes
|
||||||
|
Jack Stalnaker
|
||||||
|
Jacobo de Vera
|
||||||
|
Jacques Kvam
|
||||||
|
jake romer
|
||||||
|
Jakub Stasiak
|
||||||
|
James Turley
|
||||||
|
Jan Mollowitz
|
||||||
|
Jason S. Jones
|
||||||
|
Jean Jordaan
|
||||||
|
Jeffrey Tratner
|
||||||
|
Jens Hoepken
|
||||||
|
jiangyc0
|
||||||
|
Jim Deville
|
||||||
|
Jinzhu
|
||||||
|
Joey Curtin
|
||||||
|
Johannes Wienke
|
||||||
|
jonasac
|
||||||
|
Jonas Bygdén
|
||||||
|
Jonathan Martin
|
||||||
|
Jorge García
|
||||||
|
Jorge López Pérez
|
||||||
|
Joseph Lin
|
||||||
|
Josh Bode
|
||||||
|
Josh Davis
|
||||||
|
Josh Matthews
|
||||||
|
Josh Vandergrift
|
||||||
|
Josh Wainwright
|
||||||
|
JuanPablo
|
||||||
|
Julian Bennecker
|
||||||
|
Julien Deniau
|
||||||
|
Julien Pivard
|
||||||
|
Julien Stechele
|
||||||
|
Julien STECHELE
|
||||||
|
Kalinin Eugene
|
||||||
|
kenshin54
|
||||||
|
Kentaro Imai
|
||||||
|
Kevin Koltz
|
||||||
|
Kevin Lui
|
||||||
|
Kevin Mees
|
||||||
|
Kevin Murray
|
||||||
|
Kevin Schaul
|
||||||
|
Konstantin
|
||||||
|
Konstantin Gorodinskiy
|
||||||
|
Laas Toom
|
||||||
|
Laurent Georget
|
||||||
|
laxtiz
|
||||||
|
Leandro Moreira
|
||||||
|
Leonardo B
|
||||||
|
Leonidez Acosta
|
||||||
|
linduxed
|
||||||
|
Li Xin
|
||||||
|
Louis
|
||||||
|
Louis Pilfold
|
||||||
|
Lucas Hoffmann
|
||||||
|
Luis Carlos Cruz
|
||||||
|
Luis Carlos Cruz Carballo
|
||||||
|
Luiz Gonzaga dos Santos Filho
|
||||||
|
majjoha
|
||||||
|
mangege
|
||||||
|
Marc Camuzat
|
||||||
|
Marcelo D Montu
|
||||||
|
Marcelo Jacobus
|
||||||
|
Marcin Kulik
|
||||||
|
Marcus Kammer
|
||||||
|
Marc Weber
|
||||||
|
Mario de Frutos
|
||||||
|
Markus Benning
|
||||||
|
marocchino
|
||||||
|
Martin Atukunda
|
||||||
|
Martin Heuschober
|
||||||
|
Martxel Lasa
|
||||||
|
Matěj Cepl
|
||||||
|
Mathew Attlee
|
||||||
|
Mathieu Comandon
|
||||||
|
Matthew Barry
|
||||||
|
Matthias Viehweger
|
||||||
|
Mattia Tezzele
|
||||||
|
Matt Rasband
|
||||||
|
Matt Stevens
|
||||||
|
Mauro Porras P
|
||||||
|
Maximiliano Robaina
|
||||||
|
Mayeu (Cast)
|
||||||
|
Meng Zhuo
|
||||||
|
Michael Gehring
|
||||||
|
Michael Hinrichs
|
||||||
|
Michael Rutter
|
||||||
|
Michael Thessel
|
||||||
|
Michi Huber
|
||||||
|
Mickey
|
||||||
|
midchildan
|
||||||
|
Mike Foley
|
||||||
|
Mike Smullin
|
||||||
|
Miki Tebeka
|
||||||
|
Minjong Chung
|
||||||
|
M. Maxwell Watson
|
||||||
|
mMontu
|
||||||
|
mockturtl
|
||||||
|
m-pilia
|
||||||
|
Muhammad Hallaj Subery
|
||||||
|
mwcz
|
||||||
|
Namit
|
||||||
|
Nan Cloudio Jiang
|
||||||
|
Nan Zheng
|
||||||
|
Nate Mara
|
||||||
|
netei
|
||||||
|
Ngo The Trung
|
||||||
|
Nguyen Le
|
||||||
|
Nick Janetakis
|
||||||
|
Nicklasos
|
||||||
|
Nick Papanastasiou
|
||||||
|
Nicolas G. Querol
|
||||||
|
Nico Suhl
|
||||||
|
No Ducks
|
||||||
|
Norman Messtorff
|
||||||
|
obaoba
|
||||||
|
oddlydrawn
|
||||||
|
Oleg Voronkovich
|
||||||
|
Ole Hansen
|
||||||
|
Oliver Andrich
|
||||||
|
Ondrej Slinták
|
||||||
|
onemanstartup
|
||||||
|
opennota
|
||||||
|
Paco Esteban
|
||||||
|
Panagiotis Mavrogiorgos
|
||||||
|
Paolo Cretaro
|
||||||
|
Pascal
|
||||||
|
Paulo Romeira
|
||||||
|
Pawel Jankowski
|
||||||
|
phcerdan
|
||||||
|
Philippe Mongeau
|
||||||
|
Philipp Jovanovic
|
||||||
|
Piotr Jawniak
|
||||||
|
Piotr Yordanov
|
||||||
|
Pirogov Evgenij
|
||||||
|
Pompeu
|
||||||
|
Povilas Balzaravicius Pawka
|
||||||
|
Procras
|
||||||
|
protream
|
||||||
|
pydave
|
||||||
|
r4d2
|
||||||
|
Radosław Szymczyszyn
|
||||||
|
Ralph-Wang
|
||||||
|
Raül Torralba
|
||||||
|
raydeal
|
||||||
|
rcolombo
|
||||||
|
Rekky
|
||||||
|
René
|
||||||
|
Rene Vergara
|
||||||
|
Renzo Poddighe
|
||||||
|
Reyes Yang
|
||||||
|
ricardogcolombo
|
||||||
|
Ricardo Jesus
|
||||||
|
Rich Layte
|
||||||
|
Roberto Miranda
|
||||||
|
robin
|
||||||
|
Robin Grindrod
|
||||||
|
Rok Garbas
|
||||||
|
Roland Sommer
|
||||||
|
Rory McNamara
|
||||||
|
rsw0x
|
||||||
|
rtorralba
|
||||||
|
Ruben Vereecken
|
||||||
|
Ryan Bright
|
||||||
|
Ryan Pineo
|
||||||
|
Ryan Wang
|
||||||
|
Sam Shepherd
|
||||||
|
Santiago Gallego
|
||||||
|
sasidhar-d
|
||||||
|
Sathors
|
||||||
|
Sebastian Röder
|
||||||
|
Sebastian Wiesner
|
||||||
|
Sergey Lebedev
|
||||||
|
Sergey Zasenko
|
||||||
|
Serhiy Oplakanets
|
||||||
|
SevereOverfl0w
|
||||||
|
Simeon F. Willbanks
|
||||||
|
Simeon Willbanks
|
||||||
|
Simon Désaulniers
|
||||||
|
sirex
|
||||||
|
skv
|
||||||
|
Sokovikov
|
||||||
|
Srijan Choudhary
|
||||||
|
Steeve
|
||||||
|
stefan
|
||||||
|
Stephen Tudor
|
||||||
|
Stephen Woods
|
||||||
|
Steve Brown
|
||||||
|
Steven Humphrey
|
||||||
|
Steven Oliver
|
||||||
|
Stuart Grimshaw
|
||||||
|
Sudar
|
||||||
|
¨switch87¨
|
||||||
|
Tevin Zhang
|
||||||
|
theocrite
|
||||||
|
Thiago de Arruda
|
||||||
|
Thomas Duerr
|
||||||
|
Thomas Szymanski
|
||||||
|
tinyladi
|
||||||
|
Tobias Witt
|
||||||
|
Tobie Warburton
|
||||||
|
Tomasz Wisniewski
|
||||||
|
Tom Vincent
|
||||||
|
Tony
|
||||||
|
Tony Narlock
|
||||||
|
toogley
|
||||||
|
Torbjørn Vatn
|
||||||
|
tormaroe
|
||||||
|
ToruIwashita
|
||||||
|
Travis Holton
|
||||||
|
Trevor Sullivan
|
||||||
|
troydm
|
||||||
|
tUrG0n
|
||||||
|
twabiko
|
||||||
|
Tyler Ball
|
||||||
|
tyronepost
|
||||||
|
Tyrone Post
|
||||||
|
Vadim Khohlov
|
||||||
|
Vincent Hsu
|
||||||
|
Vladimir Rybas
|
||||||
|
Vladislav Khvostov
|
||||||
|
Vorzard
|
||||||
|
Vzaa
|
||||||
|
Waldecir Santos
|
||||||
|
Wildsky Fann
|
||||||
|
William Ma
|
||||||
|
William Travis Holton
|
||||||
|
X4fyr
|
||||||
|
xz.zhang
|
||||||
|
Yamamoto Yuji
|
||||||
|
Yannick Brehon
|
||||||
|
yerv000
|
||||||
|
Yike Lu
|
||||||
|
yuhuanbo
|
||||||
|
Yu Huanbo
|
||||||
|
Yves Lange
|
||||||
|
yvhn
|
||||||
|
zauguin
|
||||||
|
Zaven Muradyan
|
||||||
|
ZPH
|
5
sources_non_forked/vim-snippets/UltiSnips/cuda.snippets
Normal file
5
sources_non_forked/vim-snippets/UltiSnips/cuda.snippets
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
priority -50
|
||||||
|
|
||||||
|
extends cpp
|
||||||
|
|
||||||
|
# vim:ft=snippets:
|
|
@ -486,6 +486,11 @@ def __coerce__(self, other):
|
||||||
${25:pass}
|
${25:pass}
|
||||||
endsnippet
|
endsnippet
|
||||||
|
|
||||||
|
snippet deff
|
||||||
|
def ${1:fname}(`!p snip.rv = vim.eval('indent(".") ? "self" : ""')`$2):
|
||||||
|
$0
|
||||||
|
endsnippet
|
||||||
|
|
||||||
snippet def "function with docstrings" b
|
snippet def "function with docstrings" b
|
||||||
def ${1:function}(`!p
|
def ${1:function}(`!p
|
||||||
if snip.indent:
|
if snip.indent:
|
||||||
|
|
|
@ -10,7 +10,7 @@ endsnippet
|
||||||
|
|
||||||
snippet tab "tabular / array environment" b
|
snippet tab "tabular / array environment" b
|
||||||
\begin{${1:t}${1/(t)$|(a)$|(.*)/(?1:abular)(?2:rray)/}}{${2:c}}
|
\begin{${1:t}${1/(t)$|(a)$|(.*)/(?1:abular)(?2:rray)/}}{${2:c}}
|
||||||
$0${2/((?<=.)c|l|r)|./(?1: & )/g}
|
$0${2/(?<=.)(c|l|r)|./(?1: & )/g}
|
||||||
\end{$1${1/(t)$|(a)$|(.*)/(?1:abular)(?2:rray)/}}
|
\end{$1${1/(t)$|(a)$|(.*)/(?1:abular)(?2:rray)/}}
|
||||||
endsnippet
|
endsnippet
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ snippet table "Table environment" b
|
||||||
\caption{${2:caption}}
|
\caption{${2:caption}}
|
||||||
\label{tab:${3:label}}
|
\label{tab:${3:label}}
|
||||||
\begin{${4:t}${4/(t)$|(a)$|(.*)/(?1:abular)(?2:rray)/}}{${5:c}}
|
\begin{${4:t}${4/(t)$|(a)$|(.*)/(?1:abular)(?2:rray)/}}{${5:c}}
|
||||||
$0${5/((?<=.)c|l|r)|./(?1: & )/g}
|
$0${5/(?<=.)(c|l|r)|./(?1: & )/g}
|
||||||
\end{$4${4/(t)$|(a)$|(.*)/(?1:abular)(?2:rray)/}}
|
\end{$4${4/(t)$|(a)$|(.*)/(?1:abular)(?2:rray)/}}
|
||||||
\end{table}
|
\end{table}
|
||||||
endsnippet
|
endsnippet
|
||||||
|
|
|
@ -279,3 +279,11 @@ snippet AGPL
|
||||||
|
|
||||||
You should have received a copy of the GNU Affero General Public License
|
You should have received a copy of the GNU Affero General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
snippet ISC
|
||||||
|
${1:one line to give the program's name and a brief description}
|
||||||
|
Copyright `&enc[:2] == "utf" ? "©" : "(c)"` `strftime("%Y")`, ${2:`g:snips_author`}
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
${0}
|
||||||
|
|
1
sources_non_forked/vim-snippets/snippets/cuda.snippets
Normal file
1
sources_non_forked/vim-snippets/snippets/cuda.snippets
Normal file
|
@ -0,0 +1 @@
|
||||||
|
extends cpp
|
|
@ -26,6 +26,11 @@ snippet doc
|
||||||
! Description: $1
|
! Description: $1
|
||||||
! """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
! """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||||
$0
|
$0
|
||||||
|
snippet dox
|
||||||
|
!> @brief ${1}
|
||||||
|
!> ${2}
|
||||||
|
!> @author `g:snips_author`
|
||||||
|
${0}
|
||||||
# Variables definitions
|
# Variables definitions
|
||||||
# Boolean
|
# Boolean
|
||||||
snippet bool
|
snippet bool
|
||||||
|
@ -49,7 +54,7 @@ snippet type
|
||||||
snippet const
|
snippet const
|
||||||
${1:type}, parameter :: $2 = $0
|
${1:type}, parameter :: $2 = $0
|
||||||
snippet arr
|
snippet arr
|
||||||
${1:type}, allocatable, dimension(${2::}) :: $0
|
${1:type}, ${2:allocatable, }dimension(${3::}) :: $0
|
||||||
snippet intent
|
snippet intent
|
||||||
${1:type}, intent(inout) :: $0
|
${1:type}, intent(inout) :: $0
|
||||||
# Array
|
# Array
|
||||||
|
@ -57,7 +62,7 @@ snippet /
|
||||||
(/ $1 /) ${2:,&} $0
|
(/ $1 /) ${2:,&} $0
|
||||||
snippet if
|
snippet if
|
||||||
if (${1:condition}) then
|
if (${1:condition}) then
|
||||||
$2
|
$0
|
||||||
end if
|
end if
|
||||||
snippet case
|
snippet case
|
||||||
select case (${1:expr})
|
select case (${1:expr})
|
||||||
|
@ -66,8 +71,8 @@ snippet case
|
||||||
$3
|
$3
|
||||||
end select $0
|
end select $0
|
||||||
snippet do
|
snippet do
|
||||||
do ${1:i} = ${2:start},${3:end}, ${4:incr}
|
do ${1:i} = ${2:start}, ${3:end}, ${4:incr}
|
||||||
$4
|
$0
|
||||||
end do
|
end do
|
||||||
snippet dow
|
snippet dow
|
||||||
do while (${1:condition})
|
do while (${1:condition})
|
||||||
|
@ -84,10 +89,10 @@ snippet func
|
||||||
snippet pr
|
snippet pr
|
||||||
write(*,*) $0
|
write(*,*) $0
|
||||||
snippet read
|
snippet read
|
||||||
read( unit = ${1:fp}, file = ${2:filename}${3:, iostat = IERR }) $0
|
read(unit = ${1:fp}, file = ${2:filename}, iostat = ${3:ierr}) $0
|
||||||
snippet write
|
snippet write
|
||||||
write( unit = ${1:fp}, file = ${2:filename}${3:, iostat = IERR }) $0
|
write(unit = ${1:fp}, file = ${2:filename}, iostat = ${3:ierr}) $0
|
||||||
snippet open
|
snippet open
|
||||||
open (unit = ${1:fp}, file = ${2:filename}, status = unknown${3:, iostat = IERR }) $0
|
open(unit = ${1:fp}, file = ${2:filename}, status = ${3:unknown}, iostat = ${4:ierr}) $0
|
||||||
snippet close
|
snippet close
|
||||||
close ( unit = ${1:fp} ) $0
|
close(unit = ${1:fp}) $0
|
||||||
|
|
14
sources_non_forked/vim-snippets/snippets/handlebars.snippets
Normal file
14
sources_non_forked/vim-snippets/snippets/handlebars.snippets
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
snippet if # {{#if value}} ... {{/if}}
|
||||||
|
{{#if ${1:value}}}
|
||||||
|
${0}
|
||||||
|
{{/if}}
|
||||||
|
snippet ifn # {{#unless value}} ... {{/unless}}
|
||||||
|
{{#unless ${1:value}}}
|
||||||
|
${0}
|
||||||
|
{{/unless}}
|
||||||
|
snippet ife # {{#if value}} ... {{else}} .. {{/if}}
|
||||||
|
{{#if ${1:value}}}
|
||||||
|
${2}
|
||||||
|
{{else}}
|
||||||
|
${3}
|
||||||
|
{{/if}}
|
|
@ -2,8 +2,12 @@ snippet const
|
||||||
const ${1} = ${0};
|
const ${1} = ${0};
|
||||||
snippet let
|
snippet let
|
||||||
let ${1} = ${0};
|
let ${1} = ${0};
|
||||||
snippet im
|
snippet im "import xyz from 'xyz'"
|
||||||
import ${1} from '${0}';
|
import ${1} from '${2:$1}';
|
||||||
|
snippet imas "import * as xyz from 'xyz'"
|
||||||
|
import * as ${1} from '${2:$1}';
|
||||||
|
snippet imm "import { member } from 'xyz'"
|
||||||
|
import { ${1} } from '${2}';
|
||||||
snippet cla
|
snippet cla
|
||||||
class ${1} {
|
class ${1} {
|
||||||
${0}
|
${0}
|
||||||
|
@ -18,9 +22,8 @@ snippet clac
|
||||||
${0}
|
${0}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
# For of loop
|
snippet foro "for (const prop of object}) { ... }"
|
||||||
snippet foro
|
for (const ${1:prop} of ${2:object}) {
|
||||||
for (let ${1:prop} of ${2:object}) {
|
|
||||||
${0:$1}
|
${0:$1}
|
||||||
}
|
}
|
||||||
# Generator
|
# Generator
|
||||||
|
|
|
@ -5,7 +5,7 @@ snippet ex
|
||||||
module.exports = ${1};
|
module.exports = ${1};
|
||||||
# require
|
# require
|
||||||
snippet re
|
snippet re
|
||||||
${1:var} ${2} = require('${3:module_name}');
|
${1:const} ${2} = require('${3:module_name}');
|
||||||
# EventEmitter
|
# EventEmitter
|
||||||
snippet on
|
snippet on
|
||||||
on('${1:event_name}', function(${2:stream}) {
|
on('${1:event_name}', function(${2:stream}) {
|
||||||
|
|
|
@ -1,15 +1,12 @@
|
||||||
# if {{#value}} ... {{/value}}
|
snippet if # {{#value}} ... {{/value}}
|
||||||
snippet if
|
|
||||||
{{#${1:value}}}
|
{{#${1:value}}}
|
||||||
${0}
|
${0}
|
||||||
{{/$1}}
|
{{/$1}}
|
||||||
# if not {{^value}} ... {{/value}}
|
snippet ifn # {{^value}} ... {{/value}}
|
||||||
snippet ifn
|
|
||||||
{{^${1:value}}}
|
{{^${1:value}}}
|
||||||
${0}
|
${0}
|
||||||
{{/$1}}
|
{{/$1}}
|
||||||
# if else {{#value}} ... {{/value}} {{^value}} ... {{/value}}
|
snippet ife # {{#value}} ... {{/value}} {{^value}} ... {{/value}}
|
||||||
snippet ife
|
|
||||||
{{#${1:value}}}
|
{{#${1:value}}}
|
||||||
${2}
|
${2}
|
||||||
{{/$1}}
|
{{/$1}}
|
||||||
|
|
52
sources_non_forked/vim-snippets/snippets/purescript.snippets
Normal file
52
sources_non_forked/vim-snippets/snippets/purescript.snippets
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
snippet mod
|
||||||
|
module `substitute(substitute(expand('%:r'), '[/\\]','.','g'),'^\%(\l*\.\)\?','','')`
|
||||||
|
(
|
||||||
|
) where
|
||||||
|
|
||||||
|
import Prelude
|
||||||
|
|
||||||
|
${0}
|
||||||
|
snippet imp
|
||||||
|
import ${0:Data.List}
|
||||||
|
snippet impq
|
||||||
|
import ${1:Data.List} as ${0:List}
|
||||||
|
snippet fn0
|
||||||
|
${1:name} :: ${2:a}
|
||||||
|
$1 = ${0:undefined}
|
||||||
|
snippet fn
|
||||||
|
${1:fn} :: ${2:a} -> ${3:a}
|
||||||
|
$1 ${4}= ${0}
|
||||||
|
snippet fn1
|
||||||
|
${1:fn} :: ${2:a} -> ${3:a}
|
||||||
|
$1 ${4}= ${0}
|
||||||
|
snippet fn2
|
||||||
|
${1:fn} :: ${2:a} -> ${3:a} -> ${4:a}
|
||||||
|
$1 ${5}= ${0}
|
||||||
|
snippet fn3
|
||||||
|
${1:fn} :: ${2:a} -> ${3:a} -> ${4:a} -> ${5:a}
|
||||||
|
$1 ${6}= ${0}
|
||||||
|
snippet case
|
||||||
|
case ${1} of
|
||||||
|
${2} -> ${0}
|
||||||
|
snippet let
|
||||||
|
let
|
||||||
|
${1} = ${2}
|
||||||
|
in
|
||||||
|
${3}
|
||||||
|
snippet where
|
||||||
|
where
|
||||||
|
${1} = ${0}
|
||||||
|
snippet testunit
|
||||||
|
module Test.Main where
|
||||||
|
|
||||||
|
import Prelude
|
||||||
|
import Test.Unit (suite, test)
|
||||||
|
import Test.Unit.Main (runTest)
|
||||||
|
import Test.Unit.Assert as Assert
|
||||||
|
|
||||||
|
main = runTest do
|
||||||
|
suite "${1}" do
|
||||||
|
test "${2:the tests run}" do
|
||||||
|
Assert.equal
|
||||||
|
"Hello, world!"
|
||||||
|
"Hello, sailor!"
|
|
@ -325,7 +325,7 @@ snippet xpost
|
||||||
snippet xput
|
snippet xput
|
||||||
xhr :put, :${1:update}, id: ${2:1}, ${3:object}: ${4:object}
|
xhr :put, :${1:update}, id: ${2:1}, ${3:object}: ${4:object}
|
||||||
snippet test
|
snippet test
|
||||||
test 'should ${1:do something}' do
|
test '${1:should do something}' do
|
||||||
${0}
|
${0}
|
||||||
end
|
end
|
||||||
###########################
|
###########################
|
||||||
|
|
|
@ -1,317 +1,327 @@
|
||||||
|
#version 1
|
||||||
#PREAMBLE
|
#PREAMBLE
|
||||||
#newcommand
|
#newcommand
|
||||||
snippet nc \newcommand
|
snippet nc \newcommand
|
||||||
\newcommand{\\${1:cmd}}[${2:opt}]{${3:realcmd}} ${0}
|
\\newcommand{\\${1:cmd}}[${2:opt}]{${3:realcmd}} ${0}
|
||||||
#usepackage
|
#usepackage
|
||||||
snippet up \usepackage
|
snippet up \usepackage
|
||||||
\usepackage[${1:options}]{${2:package}} ${0}
|
\\usepackage[${1:options}]{${2:package}} ${0}
|
||||||
#newunicodechar
|
#newunicodechar
|
||||||
snippet nuc \newunicodechar
|
snippet nuc \newunicodechar
|
||||||
\newunicodechar{${1}}{${2:\ensuremath}${3:tex-substitute}}} ${0}
|
\\newunicodechar{${1}}{${2:\\ensuremath}${3:tex-substitute}}} ${0}
|
||||||
#DeclareMathOperator
|
#DeclareMathOperator
|
||||||
snippet dmo \DeclareMathOperator
|
snippet dmo \DeclareMathOperator
|
||||||
\DeclareMathOperator{${1}}{${2}} ${0}
|
\\DeclareMathOperator{${1}}{${2}} ${0}
|
||||||
|
|
||||||
#DOCUMENT
|
#DOCUMENT
|
||||||
# \begin{}...\end{}
|
# \begin{}...\end{}
|
||||||
snippet begin \begin{} ... \end{} block
|
snippet begin \begin{} ... \end{} block
|
||||||
\begin{${1:env}}
|
\\begin{${1:env}}
|
||||||
${0:${VISUAL}}
|
${0:${VISUAL}}
|
||||||
\end{$1}
|
\\end{$1}
|
||||||
# Tabular
|
# Tabular
|
||||||
snippet tab tabular (or arbitrary) environment
|
snippet tab tabular (or arbitrary) environment
|
||||||
\begin{${1:tabular}}{${2:c}}
|
\\begin{${1:tabular}}{${2:c}}
|
||||||
${0:${VISUAL}}
|
${0:${VISUAL}}
|
||||||
\end{$1}
|
\\end{$1}
|
||||||
snippet thm thm (or arbitrary) environment with optional argument
|
snippet thm thm (or arbitrary) environment with optional argument
|
||||||
\begin[${1:author}]{${2:thm}}
|
\\begin[${1:author}]{${2:thm}}
|
||||||
${0:${VISUAL}}
|
${0:${VISUAL}}
|
||||||
\end{$2}
|
\\end{$2}
|
||||||
snippet center center environment
|
snippet center center environment
|
||||||
\begin{center}
|
\\begin{center}
|
||||||
${0:${VISUAL}}
|
${0:${VISUAL}}
|
||||||
\end{center}
|
\\end{center}
|
||||||
# Align(ed)
|
# Align(ed)
|
||||||
snippet ali align(ed) environment
|
snippet ali align(ed) environment
|
||||||
\begin{align${1:ed}}
|
\\begin{align${1:ed}}
|
||||||
\label{eq:${2}}
|
\\label{eq:${2}}
|
||||||
${0:${VISUAL}}
|
${0:${VISUAL}}
|
||||||
\end{align$1}
|
\\end{align$1}
|
||||||
# Gather(ed)
|
# Gather(ed)
|
||||||
snippet gat gather(ed) environment
|
snippet gat gather(ed) environment
|
||||||
\begin{gather${1:ed}}
|
\\begin{gather${1:ed}}
|
||||||
${0:${VISUAL}}
|
${0:${VISUAL}}
|
||||||
\end{gather$1}
|
\\end{gather$1}
|
||||||
# Equation
|
# Equation
|
||||||
snippet eq equation environment
|
snippet eq equation environment
|
||||||
\begin{equation}
|
\\begin{equation}
|
||||||
${0:${VISUAL}}
|
${0:${VISUAL}}
|
||||||
\end{equation}
|
\\end{equation}
|
||||||
# Equation
|
# Equation
|
||||||
snippet eql Labeled equation environment
|
snippet eql Labeled equation environment
|
||||||
\begin{equation}
|
\\begin{equation}
|
||||||
\label{eq:${2}}
|
\\label{eq:${2}}
|
||||||
${0:${VISUAL}}
|
${0:${VISUAL}}
|
||||||
\end{equation}
|
\\end{equation}
|
||||||
# Equation
|
# Equation
|
||||||
snippet eq* unnumbered equation environment
|
snippet eq* unnumbered equation environment
|
||||||
\begin{equation*}
|
\\begin{equation*}
|
||||||
${0:${VISUAL}}
|
${0:${VISUAL}}
|
||||||
\end{equation*}
|
\\end{equation*}
|
||||||
# Unnumbered Equation
|
# Unnumbered Equation
|
||||||
snippet \ unnumbered equation: \[ ... \]
|
snippet \ unnumbered equation: \[ ... \]
|
||||||
\[
|
\\[
|
||||||
${0:${VISUAL}}
|
${0:${VISUAL}}
|
||||||
\]
|
\\]
|
||||||
# Equation array
|
# Equation array
|
||||||
snippet eqnarray eqnarray environment
|
snippet eqnarray eqnarray environment
|
||||||
\begin{eqnarray}
|
\\begin{eqnarray}
|
||||||
${0:${VISUAL}}
|
${0:${VISUAL}}
|
||||||
\end{eqnarray}
|
\\end{eqnarray}
|
||||||
# Label
|
# Label
|
||||||
snippet lab \label
|
snippet lab \label
|
||||||
\label{${1:eq:}${2:fig:}${3:tab:}${0}}
|
\\label{${1:eq:}${2:fig:}${3:tab:}${0}}
|
||||||
# Enumerate
|
# Enumerate
|
||||||
snippet enum enumerate environment
|
snippet enum enumerate environment
|
||||||
\begin{enumerate}
|
\\begin{enumerate}
|
||||||
\item ${0}
|
\\item ${0}
|
||||||
\end{enumerate}
|
\\end{enumerate}
|
||||||
snippet enuma enumerate environment
|
snippet enuma enumerate environment
|
||||||
\begin{enumerate}[(a)]
|
\\begin{enumerate}[(a)]
|
||||||
\item ${0}
|
\\item ${0}
|
||||||
\end{enumerate}
|
\\end{enumerate}
|
||||||
snippet enumi enumerate environment
|
snippet enumi enumerate environment
|
||||||
\begin{enumerate}[(i)]
|
\\begin{enumerate}[(i)]
|
||||||
\item ${0}
|
\\item ${0}
|
||||||
\end{enumerate}
|
\\end{enumerate}
|
||||||
# Itemize
|
# Itemize
|
||||||
snippet itemize itemize environment
|
snippet itemize itemize environment
|
||||||
\begin{itemize}
|
\\begin{itemize}
|
||||||
\item ${0}
|
\\item ${0}
|
||||||
\end{itemize}
|
\\end{itemize}
|
||||||
snippet item \item
|
snippet item \item
|
||||||
\item ${1:${VISUAL}}
|
\\item ${1:${VISUAL}}
|
||||||
# Description
|
# Description
|
||||||
snippet desc description environment
|
snippet desc description environment
|
||||||
\begin{description}
|
\\begin{description}
|
||||||
\item[${1}] ${0}
|
\\item[${1}] ${0}
|
||||||
\end{description}
|
\\end{description}
|
||||||
# Endless new item
|
# Endless new item
|
||||||
snippet ]i \item (recursive)
|
snippet ]i \item (recursive)
|
||||||
\item ${1}
|
\\item ${1}
|
||||||
${0:]i}
|
${0:]i}
|
||||||
# Matrix
|
# Matrix
|
||||||
snippet mat smart matrix environment
|
snippet mat smart matrix environment
|
||||||
\begin{${1:p/b/v/V/B/small}matrix}
|
\\begin{${1:p/b/v/V/B/small}matrix}
|
||||||
${0:${VISUAL}}
|
${0:${VISUAL}}
|
||||||
\end{$1matrix}
|
\\end{$1matrix}
|
||||||
# Cases
|
# Cases
|
||||||
snippet cas cases environment
|
snippet cas cases environment
|
||||||
\begin{cases}
|
\\begin{cases}
|
||||||
${1:equation}, &\text{ if }${2:case}\\
|
${1:equation}, &\\text{ if }${2:case}\\
|
||||||
${0:${VISUAL}}
|
${0:${VISUAL}}
|
||||||
\end{cases}
|
\\end{cases}
|
||||||
# Split
|
# Split
|
||||||
snippet spl split environment
|
snippet spl split environment
|
||||||
\begin{split}
|
\\begin{split}
|
||||||
${0:${VISUAL}}
|
${0:${VISUAL}}
|
||||||
\end{split}
|
\\end{split}
|
||||||
# Part
|
# Part
|
||||||
snippet part document \part
|
snippet part document \part
|
||||||
\part{${1:part name}} % (fold)
|
\\part{${1:part name}} % (fold)
|
||||||
\label{prt:${2:$1}}
|
\\label{prt:${2:$1}}
|
||||||
${0}
|
${0}
|
||||||
% part $2 (end)
|
% part $2 (end)
|
||||||
# Chapter
|
# Chapter
|
||||||
snippet cha \chapter
|
snippet cha \chapter
|
||||||
\chapter{${1:chapter name}}
|
\\chapter{${1:chapter name}}
|
||||||
\label{cha:${2:$1}}
|
\\label{cha:${2:$1}}
|
||||||
${0}
|
${0}
|
||||||
# Section
|
# Section
|
||||||
snippet sec \section
|
snippet sec \section
|
||||||
\section{${1:section name}}
|
\\section{${1:section name}}
|
||||||
\label{sec:${2:$1}}
|
\\label{sec:${2:$1}}
|
||||||
${0}
|
${0}
|
||||||
# Section without number
|
# Section without number
|
||||||
snippet sec* \section*
|
snippet sec* \section*
|
||||||
\section*{${1:section name}}
|
\\section*{${1:section name}}
|
||||||
\label{sec:${2:$1}}
|
\\label{sec:${2:$1}}
|
||||||
${0}
|
${0}
|
||||||
# Sub Section
|
# Sub Section
|
||||||
snippet sub \subsection
|
snippet sub \subsection
|
||||||
\subsection{${1:subsection name}}
|
\\subsection{${1:subsection name}}
|
||||||
\label{sub:${2:$1}}
|
\\label{sub:${2:$1}}
|
||||||
${0}
|
${0}
|
||||||
# Sub Section without number
|
# Sub Section without number
|
||||||
snippet sub* \subsection*
|
snippet sub* \subsection*
|
||||||
\subsection*{${1:subsection name}}
|
\\subsection*{${1:subsection name}}
|
||||||
\label{sub:${2:$1}}
|
\\label{sub:${2:$1}}
|
||||||
${0}
|
${0}
|
||||||
# Sub Sub Section
|
# Sub Sub Section
|
||||||
snippet subs \subsubsection
|
snippet subs \subsubsection
|
||||||
\subsubsection{${1:subsubsection name}}
|
\\subsubsection{${1:subsubsection name}}
|
||||||
\label{ssub:${2:$1}}
|
\\label{ssub:${2:$1}}
|
||||||
${0}
|
${0}
|
||||||
# Sub Sub Section without number
|
# Sub Sub Section without number
|
||||||
snippet subs* \subsubsection*
|
snippet subs* \subsubsection*
|
||||||
\subsubsection*{${1:subsubsection name}}
|
\\subsubsection*{${1:subsubsection name}}
|
||||||
\label{ssub:${2:$1}}
|
\\label{ssub:${2:$1}}
|
||||||
${0}
|
${0}
|
||||||
# Paragraph
|
# Paragraph
|
||||||
snippet par \paragraph
|
snippet par \paragraph
|
||||||
\paragraph{${1:paragraph name}}
|
\\paragraph{${1:paragraph name}}
|
||||||
\label{par:${2:$1}}
|
\\label{par:${2:$1}}
|
||||||
${0}
|
${0}
|
||||||
# Sub Paragraph
|
# Sub Paragraph
|
||||||
snippet subp \subparagraph
|
snippet subp \subparagraph
|
||||||
\subparagraph{${1:subparagraph name}}
|
\\subparagraph{${1:subparagraph name}}
|
||||||
\label{subp:${2:$1}}
|
\\label{subp:${2:$1}}
|
||||||
${0}
|
${0}
|
||||||
snippet ni \noindent
|
snippet ni \noindent
|
||||||
\noindent
|
\\noindent
|
||||||
${0}
|
${0}
|
||||||
#References
|
#References
|
||||||
snippet itd description \item
|
snippet itd description \item
|
||||||
\item[${1:description}] ${0:item}
|
\\item[${1:description}] ${0:item}
|
||||||
snippet figure reference to a figure
|
snippet figure reference to a figure
|
||||||
${1:Figure}~\ref{${2:fig:}}
|
${1:Figure}~\\ref{${2:fig:}}
|
||||||
snippet table reference to a table
|
snippet table reference to a table
|
||||||
${1:Table}~\ref{${2:tab:}}
|
${1:Table}~\\ref{${2:tab:}}
|
||||||
snippet listing reference to a listing
|
snippet listing reference to a listing
|
||||||
${1:Listing}~\ref{${2:list}}
|
${1:Listing}~\\ref{${2:list}}
|
||||||
snippet section reference to a section
|
snippet section reference to a section
|
||||||
${1:Section}~\ref{sec:${2}} ${0}
|
${1:Section}~\\ref{sec:${2}} ${0}
|
||||||
snippet page reference to a page
|
snippet page reference to a page
|
||||||
${1:page}~\pageref{${2}} ${0}
|
${1:page}~\\pageref{${2}} ${0}
|
||||||
snippet index \index
|
snippet index \index
|
||||||
\index{${1:index}} ${0}
|
\\index{${1:index}} ${0}
|
||||||
#Citations
|
#Citations
|
||||||
snippet citen \citen
|
snippet citen \citen
|
||||||
\citen{${1}} ${0}
|
\\citen{${1}} ${0}
|
||||||
# natbib citations
|
# natbib citations
|
||||||
snippet citep \citep
|
snippet citep \citep
|
||||||
\citep{${1}} ${0}
|
\\citep{${1}} ${0}
|
||||||
snippet citet \citet
|
snippet citet \citet
|
||||||
\citet{${1}} ${0}
|
\\citet{${1}} ${0}
|
||||||
snippet cite \cite[]{}
|
snippet cite \cite[]{}
|
||||||
\cite[${1}]{${2}} ${0}
|
\\cite[${1}]{${2}} ${0}
|
||||||
snippet citea \citeauthor
|
snippet citea \citeauthor
|
||||||
\citeauthor{${1}} ${0}
|
\\citeauthor{${1}} ${0}
|
||||||
snippet citey \citeyear
|
snippet citey \citeyear
|
||||||
\citeyear{${1}} ${0}
|
\\citeyear{${1}} ${0}
|
||||||
snippet fcite \footcite[]{}
|
snippet fcite \footcite[]{}
|
||||||
\footcite[${1}]{${2}}${0}
|
\\footcite[${1}]{${2}}${0}
|
||||||
#Formating text: italic, bold, underline, small capital, emphase ..
|
#Formating text: italic, bold, underline, small capital, emphase ..
|
||||||
snippet it italic text
|
snippet it italic text
|
||||||
\textit{${0:${VISUAL:text}}}
|
\\textit{${0:${VISUAL:text}}}
|
||||||
snippet bf bold face text
|
snippet bf bold face text
|
||||||
\textbf{${0:${VISUAL:text}}}
|
\\textbf{${0:${VISUAL:text}}}
|
||||||
snippet under underline text
|
snippet under underline text
|
||||||
\underline{${0:${VISUAL:text}}}
|
\\underline{${0:${VISUAL:text}}}
|
||||||
snippet emp emphasize text
|
snippet emp emphasize text
|
||||||
\emph{${0:${VISUAL:text}}}
|
\\emph{${0:${VISUAL:text}}}
|
||||||
snippet sc small caps text
|
snippet sc small caps text
|
||||||
\textsc{${0:${VISUAL:text}}}
|
\\textsc{${0:${VISUAL:text}}}
|
||||||
#Choosing font
|
#Choosing font
|
||||||
snippet sf sans serife text
|
snippet sf sans serife text
|
||||||
\textsf{${0:${VISUAL:text}}}
|
\\textsf{${0:${VISUAL:text}}}
|
||||||
snippet rm roman font text
|
snippet rm roman font text
|
||||||
\textrm{${0:${VISUAL:text}}}
|
\\textrm{${0:${VISUAL:text}}}
|
||||||
snippet tt typewriter (monospace) text
|
snippet tt typewriter (monospace) text
|
||||||
\texttt{${0:${VISUAL:text}}}
|
\\texttt{${0:${VISUAL:text}}}
|
||||||
#Math font
|
#Math font
|
||||||
snippet mf mathfrak
|
snippet mf mathfrak
|
||||||
\mathfrak{${0:${VISUAL:text}}}
|
\\mathfrak{${0:${VISUAL:text}}}
|
||||||
snippet mc mathcal
|
snippet mc mathcal
|
||||||
\mathcal{${0:${VISUAL:text}}}
|
\\mathcal{${0:${VISUAL:text}}}
|
||||||
snippet ms mathscr
|
snippet ms mathscr
|
||||||
\mathscr{${0:${VISUAL:text}}}
|
\\mathscr{${0:${VISUAL:text}}}
|
||||||
#misc
|
#misc
|
||||||
snippet ft \footnote
|
snippet ft \footnote
|
||||||
\footnote{${0:${VISUAL:text}}}
|
\\footnote{${0:${VISUAL:text}}}
|
||||||
snippet fig figure environment (includegraphics)
|
snippet fig figure environment (includegraphics)
|
||||||
\begin{figure}
|
\\begin{figure}
|
||||||
\begin{center}
|
\\begin{center}
|
||||||
\includegraphics[scale=${1}]{Figures/${2}}
|
\\includegraphics[scale=${1}]{Figures/${2}}
|
||||||
\end{center}
|
\\end{center}
|
||||||
\caption{${3}}
|
\\caption{${3}}
|
||||||
\label{fig:${4}}
|
\\label{fig:${4}}
|
||||||
\end{figure}
|
\\end{figure}
|
||||||
${0}
|
${0}
|
||||||
snippet tikz figure environment (tikzpicture)
|
snippet tikz figure environment (tikzpicture)
|
||||||
\begin{figure}
|
\\begin{figure}[htpb]
|
||||||
\begin{center}
|
\\begin{center}
|
||||||
\begin{tikzpicture}[scale=${1:1}]
|
\\begin{tikzpicture}[scale=${1:1}, transform shape]
|
||||||
${2}
|
${2}
|
||||||
\end{tikzpicture}
|
\\end{tikzpicture}
|
||||||
\end{center}
|
\\end{center}
|
||||||
\caption{${3}}
|
\\caption{${3}}
|
||||||
\label{fig:${4}}
|
\\label{fig:${4}}
|
||||||
\end{figure}
|
\\end{figure}
|
||||||
|
${0}
|
||||||
|
snippet subfig subfigure environment
|
||||||
|
\\begin{subfigure}[${1}]{${2:\\textwidth}}
|
||||||
|
\\begin{center}
|
||||||
|
${3}
|
||||||
|
\\end{center}
|
||||||
|
\\caption{${4}}
|
||||||
|
\\label{fig:${5}}
|
||||||
|
\\end{subfigure}
|
||||||
${0}
|
${0}
|
||||||
#math
|
#math
|
||||||
snippet stackrel \stackrel{}{}
|
snippet stackrel \stackrel{}{}
|
||||||
\stackrel{${1:above}}{${2:below}} ${0}
|
\\stackrel{${1:above}}{${2:below}} ${0}
|
||||||
snippet frac \frac{}{}
|
snippet frac \frac{}{}
|
||||||
\frac{${1:num}}{${2:denom}} ${0}
|
\\frac{${1:num}}{${2:denom}} ${0}
|
||||||
snippet sum \sum^{}_{}
|
snippet sum \sum^{}_{}
|
||||||
\sum^{${1:n}}_{${2:i=1}} ${0}
|
\\sum^{${1:n}}_{${2:i=1}} ${0}
|
||||||
snippet lim \lim_{}
|
snippet lim \lim_{}
|
||||||
\lim_{${1:n \to \infty}} ${0}
|
\\lim_{${1:n \\to \\infty}} ${0}
|
||||||
snippet frame frame environment
|
snippet frame frame environment
|
||||||
\begin{frame}[${1:t}]{${2:title}}
|
\\begin{frame}[${1:t}]{${2:title}}
|
||||||
${0:${VISUAL}}
|
${0:${VISUAL}}
|
||||||
\end{frame}
|
\\end{frame}
|
||||||
snippet block block environment
|
snippet block block environment
|
||||||
\begin{block}{${1:title}}
|
\\begin{block}{${1:title}}
|
||||||
${0:${VISUAL}}
|
${0:${VISUAL}}
|
||||||
\end{block}
|
\\end{block}
|
||||||
snippet alert alertblock environment
|
snippet alert alertblock environment
|
||||||
\begin{alertblock}{${1:title}}
|
\\begin{alertblock}{${1:title}}
|
||||||
${0:${VISUAL}}
|
${0:${VISUAL}}
|
||||||
\end{alertblock}
|
\\end{alertblock}
|
||||||
snippet example exampleblock environment
|
snippet example exampleblock environment
|
||||||
\begin{exampleblock}{${1:title}}
|
\\begin{exampleblock}{${1:title}}
|
||||||
${0:${VISUAL}}
|
${0:${VISUAL}}
|
||||||
\end{exampleblock}
|
\\end{exampleblock}
|
||||||
snippet col2 two-column environment
|
snippet col2 two-column environment
|
||||||
\begin{columns}
|
\\begin{columns}
|
||||||
\begin{column}{0.5\textwidth}
|
\\begin{column}{0.5\\textwidth}
|
||||||
${1}
|
${1}
|
||||||
\end{column}
|
\\end{column}
|
||||||
\begin{column}{0.5\textwidth}
|
\\begin{column}{0.5\\textwidth}
|
||||||
${0}
|
${0}
|
||||||
\end{column}
|
\\end{column}
|
||||||
\end{columns}
|
\\end{columns}
|
||||||
snippet \{ \{ \}
|
snippet \{ \{ \}
|
||||||
\\{ ${0} \\}
|
\\{ ${0} \\}
|
||||||
#delimiter
|
#delimiter
|
||||||
snippet lr left right
|
snippet lr left right
|
||||||
\left${1} ${0} \right$1
|
\\left${1} ${0} \\right$1
|
||||||
snippet lr( left( right)
|
snippet lr( left( right)
|
||||||
\left( ${0} \right)
|
\\left( ${0} \\right)
|
||||||
snippet lr| left| right|
|
snippet lr| left| right|
|
||||||
\left| ${0} \right|
|
\\left| ${0} \\right|
|
||||||
snippet lr{ left\{ right\}
|
snippet lr{ left\{ right\}
|
||||||
\left\\{ ${0} \right\\}
|
\\left\\{ ${0} \\right\\}
|
||||||
snippet lr[ left[ right]
|
snippet lr[ left[ right]
|
||||||
\left[ ${0} \right]
|
\\left[ ${0} \\right]
|
||||||
snippet lra langle rangle
|
snippet lra langle rangle
|
||||||
\langle ${0} \rangle
|
\\langle ${0} \\rangle
|
||||||
# Code listings
|
# Code listings
|
||||||
snippet lst
|
snippet lst
|
||||||
\begin{listing}[language=${1:language}]
|
\\begin{listing}[language=${1:language}]
|
||||||
${0:${VISUAL}}
|
${0:${VISUAL}}
|
||||||
\end{listing}
|
\\end{listing}
|
||||||
snippet lsi
|
snippet lsi
|
||||||
\lstinline|${1}| ${0}
|
\\lstinline|${1}| ${0}
|
||||||
# Hyperlinks
|
# Hyperlinks
|
||||||
snippet url
|
snippet url
|
||||||
\url{${1}} ${0}
|
\\url{${1}} ${0}
|
||||||
snippet href
|
snippet href
|
||||||
\href{${1}}{${2}} ${0}
|
\\href{${1}}{${2}} ${0}
|
||||||
# URL from Clipboard.
|
# URL from Clipboard.
|
||||||
snippet urlc
|
snippet urlc
|
||||||
\url{`@+`} ${0}
|
\\url{`@+`} ${0}
|
||||||
snippet hrefc
|
snippet hrefc
|
||||||
\href{`@+`}{${1}} ${0}
|
\\href{`@+`}{${1}} ${0}
|
||||||
|
|
Loading…
Reference in a new issue