2016-02-20 08:13:10 -05:00
|
|
|
if !exists("g:go_list_type")
|
2016-06-26 07:12:36 -04:00
|
|
|
let g:go_list_type = ""
|
2016-02-20 08:13:10 -05:00
|
|
|
endif
|
|
|
|
|
|
|
|
" Window opens the list with the given height up to 10 lines maximum.
|
2015-12-08 08:20:04 -05:00
|
|
|
" Otherwise g:go_loclist_height is used. If no or zero height is given it
|
|
|
|
" closes the window
|
2016-12-27 09:46:49 -05:00
|
|
|
function! go#list#Window(listtype, ...) abort
|
2016-06-26 07:12:36 -04:00
|
|
|
let l:listtype = go#list#Type(a:listtype)
|
|
|
|
" 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
|
|
|
|
" for a better user experience. If the number of errors in a current
|
|
|
|
" location list increases/decreases, cwindow will not resize when a new
|
|
|
|
" updated height is passed. lopen in the other hand resizes the screen.
|
|
|
|
if !a:0 || a:1 == 0
|
|
|
|
if l:listtype == "locationlist"
|
|
|
|
lclose
|
|
|
|
else
|
|
|
|
cclose
|
2015-12-08 08:20:04 -05:00
|
|
|
endif
|
2016-06-26 07:12:36 -04:00
|
|
|
return
|
|
|
|
endif
|
2015-12-08 08:20:04 -05:00
|
|
|
|
2016-06-26 07:12:36 -04:00
|
|
|
let height = get(g:, "go_list_height", 0)
|
|
|
|
if height == 0
|
|
|
|
" prevent creating a large location height for a large set of numbers
|
|
|
|
if a:1 > 10
|
|
|
|
let height = 10
|
2016-02-20 08:13:10 -05:00
|
|
|
else
|
2016-06-26 07:12:36 -04:00
|
|
|
let height = a:1
|
2016-02-20 08:13:10 -05:00
|
|
|
endif
|
2016-06-26 07:12:36 -04:00
|
|
|
endif
|
|
|
|
|
|
|
|
if l:listtype == "locationlist"
|
|
|
|
exe 'lopen ' . height
|
|
|
|
else
|
|
|
|
exe 'copen ' . height
|
|
|
|
endif
|
2015-12-08 08:20:04 -05:00
|
|
|
endfunction
|
|
|
|
|
|
|
|
|
|
|
|
" Get returns the current list of items from the location list
|
2016-12-27 09:46:49 -05:00
|
|
|
function! go#list#Get(listtype) abort
|
2016-06-26 07:12:36 -04:00
|
|
|
let l:listtype = go#list#Type(a:listtype)
|
|
|
|
if l:listtype == "locationlist"
|
|
|
|
return getloclist(0)
|
|
|
|
else
|
|
|
|
return getqflist()
|
|
|
|
endif
|
2015-12-08 08:20:04 -05:00
|
|
|
endfunction
|
|
|
|
|
|
|
|
" Populate populate the location list with the given items
|
2016-12-27 09:46:49 -05:00
|
|
|
function! go#list#Populate(listtype, items, title) abort
|
2016-06-26 07:12:36 -04:00
|
|
|
let l:listtype = go#list#Type(a:listtype)
|
|
|
|
if l:listtype == "locationlist"
|
|
|
|
call setloclist(0, a:items, 'r')
|
2016-12-27 09:46:49 -05:00
|
|
|
|
|
|
|
" 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
|
2016-06-26 07:12:36 -04:00
|
|
|
else
|
|
|
|
call setqflist(a:items, 'r')
|
2016-12-27 09:46:49 -05:00
|
|
|
if has("patch-7.4.2200") | call setqflist([], 'a', {'title': a:title}) | endif
|
2016-06-26 07:12:36 -04:00
|
|
|
endif
|
2015-12-08 08:20:04 -05:00
|
|
|
endfunction
|
|
|
|
|
2016-12-27 09:46:49 -05:00
|
|
|
function! go#list#PopulateWin(winnr, items) abort
|
2016-06-26 07:12:36 -04:00
|
|
|
call setloclist(a:winnr, a:items, 'r')
|
2015-12-16 08:53:53 -05:00
|
|
|
endfunction
|
|
|
|
|
2017-07-06 08:57:35 -04:00
|
|
|
" Parse parses the given items based on the specified errorformat and
|
2015-12-08 08:20:04 -05:00
|
|
|
" populates the location list.
|
2016-12-27 09:46:49 -05:00
|
|
|
function! go#list#ParseFormat(listtype, errformat, items, title) abort
|
2016-06-26 07:12:36 -04:00
|
|
|
let l:listtype = go#list#Type(a:listtype)
|
|
|
|
" backup users errorformat, will be restored once we are finished
|
|
|
|
let old_errorformat = &errorformat
|
2015-12-08 08:20:04 -05:00
|
|
|
|
2016-06-26 07:12:36 -04:00
|
|
|
" parse and populate the location list
|
|
|
|
let &errorformat = a:errformat
|
|
|
|
if l:listtype == "locationlist"
|
|
|
|
lgetexpr a:items
|
2016-12-27 09:46:49 -05:00
|
|
|
if has("patch-7.4.2200") | call setloclist(0, [], 'a', {'title': a:title}) | endif
|
2016-06-26 07:12:36 -04:00
|
|
|
else
|
|
|
|
cgetexpr a:items
|
2016-12-27 09:46:49 -05:00
|
|
|
if has("patch-7.4.2200") | call setqflist([], 'a', {'title': a:title}) | endif
|
2016-06-26 07:12:36 -04:00
|
|
|
endif
|
2015-12-08 08:20:04 -05:00
|
|
|
|
2016-06-26 07:12:36 -04:00
|
|
|
"restore back
|
|
|
|
let &errorformat = old_errorformat
|
2015-12-08 08:20:04 -05:00
|
|
|
endfunction
|
|
|
|
|
2016-02-20 08:13:10 -05:00
|
|
|
" Parse parses the given items based on the global errorformat and
|
2015-12-08 08:20:04 -05:00
|
|
|
" populates the location list.
|
2016-12-27 09:46:49 -05:00
|
|
|
function! go#list#Parse(listtype, items) abort
|
2016-06-26 07:12:36 -04:00
|
|
|
let l:listtype = go#list#Type(a:listtype)
|
|
|
|
if l:listtype == "locationlist"
|
|
|
|
lgetexpr a:items
|
|
|
|
else
|
|
|
|
cgetexpr a:items
|
|
|
|
endif
|
2015-12-08 08:20:04 -05:00
|
|
|
endfunction
|
|
|
|
|
|
|
|
" JumpToFirst jumps to the first item in the location list
|
2016-12-27 09:46:49 -05:00
|
|
|
function! go#list#JumpToFirst(listtype) abort
|
2016-06-26 07:12:36 -04:00
|
|
|
let l:listtype = go#list#Type(a:listtype)
|
|
|
|
if l:listtype == "locationlist"
|
|
|
|
ll 1
|
|
|
|
else
|
|
|
|
cc 1
|
|
|
|
endif
|
2015-12-08 08:20:04 -05:00
|
|
|
endfunction
|
|
|
|
|
|
|
|
" Clean cleans the location list
|
2016-12-27 09:46:49 -05:00
|
|
|
function! go#list#Clean(listtype) abort
|
2016-06-26 07:12:36 -04:00
|
|
|
let l:listtype = go#list#Type(a:listtype)
|
|
|
|
if l:listtype == "locationlist"
|
|
|
|
lex []
|
|
|
|
else
|
|
|
|
cex []
|
|
|
|
endif
|
2015-12-08 08:20:04 -05:00
|
|
|
endfunction
|
2016-02-20 08:13:10 -05:00
|
|
|
|
2016-12-27 09:46:49 -05:00
|
|
|
function! go#list#Type(listtype) abort
|
2016-06-26 07:12:36 -04:00
|
|
|
if g:go_list_type == "locationlist"
|
|
|
|
return "locationlist"
|
|
|
|
elseif g:go_list_type == "quickfix"
|
2017-03-07 12:04:28 -05:00
|
|
|
return "quickfix"
|
2016-06-26 07:12:36 -04:00
|
|
|
else
|
|
|
|
return a:listtype
|
|
|
|
endif
|
2016-02-20 08:13:10 -05:00
|
|
|
endfunction
|
|
|
|
|
2016-06-26 07:12:36 -04:00
|
|
|
" vim: sw=2 ts=2 et
|