diff options
Diffstat (limited to 'autoload/zig/list.vim')
-rw-r--r-- | autoload/zig/list.vim | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/autoload/zig/list.vim b/autoload/zig/list.vim new file mode 100644 index 00000000..97ebf47f --- /dev/null +++ b/autoload/zig/list.vim @@ -0,0 +1,162 @@ +if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'zig') != -1 + finish +endif + +" Adapted from fatih/vim-go: autoload/go/list.vim +" +" Copyright 2011 The Go Authors. All rights reserved. +" Use of this source code is governed by a BSD-style +" license that can be found in the LICENSE file. +" + +" Window opens the list with the given height up to 10 lines maximum. +" Otherwise g:zig_loclist_height is used. +" +" If no or zero height is given it closes the window by default. +" To prevent this, set g:zig_list_autoclose = 0 +function! zig#list#Window(listtype, ...) abort + " 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 + call zig#list#Close(a:listtype) + return + endif + + let height = zig#config#ListHeight() + if height == 0 + " prevent creating a large location height for a large set of numbers + if a:1 > 10 + let height = 10 + else + let height = a:1 + endif + endif + + if a:listtype == "locationlist" + exe 'lopen ' . height + else + exe 'copen ' . height + endif +endfunction + + +" Get returns the current items from the list +function! zig#list#Get(listtype) abort + if a:listtype == "locationlist" + return getloclist(0) + else + return getqflist() + endif +endfunction + +" Populate populate the list with the given items +function! zig#list#Populate(listtype, items, title) abort + if a:listtype == "locationlist" + 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 + call setqflist(a:items, 'r') + if has("patch-7.4.2200") | call setqflist([], 'a', {'title': a:title}) | endif + endif +endfunction + +" Parse parses the given items based on the specified errorformat and +" populates the list. +function! zig#list#ParseFormat(listtype, errformat, items, title) abort + " backup users errorformat, will be restored once we are finished + let old_errorformat = &errorformat + + " parse and populate the location list + let &errorformat = a:errformat + try + call zig#list#Parse(a:listtype, a:items, a:title) + finally + "restore back + let &errorformat = old_errorformat + endtry +endfunction + +" Parse parses the given items based on the global errorformat and +" populates the list. +function! zig#list#Parse(listtype, items, title) abort + if a:listtype == "locationlist" + lgetexpr a:items + if has("patch-7.4.2200") | call setloclist(0, [], 'a', {'title': a:title}) | endif + else + cgetexpr a:items + if has("patch-7.4.2200") | call setqflist([], 'a', {'title': a:title}) | endif + endif +endfunction + +" JumpToFirst jumps to the first item in the location list +function! zig#list#JumpToFirst(listtype) abort + if a:listtype == "locationlist" + ll 1 + else + cc 1 + endif +endfunction + +" Clean cleans and closes the location list +function! zig#list#Clean(listtype) abort + if a:listtype == "locationlist" + lex [] + else + cex [] + endif + + call zig#list#Close(a:listtype) +endfunction + +" Close closes the location list +function! zig#list#Close(listtype) abort + let autoclose_window = zig#config#ListAutoclose() + if !autoclose_window + return + endif + + if a:listtype == "locationlist" + lclose + else + cclose + endif +endfunction + +function! s:listtype(listtype) abort + let listtype = zig#config#ListType() + if empty(listtype) + return a:listtype + endif + + return listtype +endfunction + +" s:default_list_type_commands is the defaults that will be used for each of +" the supported commands (see documentation for g:zig_list_type_commands). When +" defining a default, quickfix should be used if the command operates on +" multiple files, while locationlist should be used if the command operates on a +" single file or buffer. Keys that begin with an underscore are not supported +" in g:zig_list_type_commands. +let s:default_list_type_commands = { + \ "ZigFmt": "locationlist", + \ } + +function! zig#list#Type(for) abort + let l:listtype = s:listtype(get(s:default_list_type_commands, a:for)) + if l:listtype == "0" + call zig#util#EchoError(printf( + \ "unknown list type command value found ('%s'). Please open a bug report in the zig.vim repo.", + \ a:for)) + let l:listtype = "quickfix" + endif + + return get(zig#config#ListTypeCommands(), a:for, l:listtype) +endfunction + +" vim: sw=2 ts=2 et |