[ADD][VIM] Mappings to navigate quickfix history
It also supports navigating the location list history when inside a location list. The autoload plug-in idea was taken from this Vimways article: <https://vimways.org/2018/colder-quickfix-lists/>
This commit is contained in:
parent
1a72e67273
commit
809a348490
68
vim/.vim/autoload/quickfixed.vim
Normal file
68
vim/.vim/autoload/quickfixed.vim
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
" Taken from the Vimways article
|
||||||
|
|
||||||
|
function! s:isLocation()
|
||||||
|
" Get dictionary of properties of the current window
|
||||||
|
let wininfo = filter(getwininfo(), {i,v -> v.winnr == winnr()})[0]
|
||||||
|
return wininfo.loclist
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:length()
|
||||||
|
" Get the size of the current quickfix/location list
|
||||||
|
return len(s:isLocation() ? getloclist(0) : getqflist())
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:getProperty(key, ...)
|
||||||
|
" getqflist() and getloclist() expect a dictionary argument
|
||||||
|
" If a 2nd argument has been passed in, use it as the value, else 0
|
||||||
|
let l:what = {a:key : a:0 ? a:1 : 0}
|
||||||
|
let l:listdict = s:isLocation() ? getloclist(0, l:what) : getqflist(l:what)
|
||||||
|
return get(l:listdict, a:key)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:isFirst()
|
||||||
|
return s:getProperty('nr') <= 1
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:isLast()
|
||||||
|
return s:getProperty('nr') == s:getProperty('nr', '$')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:history(goNewer)
|
||||||
|
" Build the command: one of colder/cnewer/lolder/lnewer
|
||||||
|
let l:cmd = (s:isLocation() ? 'l' : 'c') . (a:goNewer ? 'newer' : 'older')
|
||||||
|
|
||||||
|
" Apply the cmd repeatedly until we hit a non-empty list, or first/last list
|
||||||
|
" is reached
|
||||||
|
while 1
|
||||||
|
if (a:goNewer && s:isLast()) || (!a:goNewer && s:isFirst()) | break | endif
|
||||||
|
" Run the command. Use :silent to suppress message-history output.
|
||||||
|
" Note that the :try wrapper is no longer necessary
|
||||||
|
silent execute l:cmd
|
||||||
|
if s:length() | break | endif
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
" Echo a description of the new quickfix / location list.
|
||||||
|
" And make it look like a rainbow.
|
||||||
|
let l:nr = s:getProperty('nr')
|
||||||
|
let l:last = s:getProperty('nr', '$')
|
||||||
|
echohl MoreMsg | echon '('
|
||||||
|
echohl Identifier | echon l:nr
|
||||||
|
if l:last > 1
|
||||||
|
echohl LineNr | echon ' of '
|
||||||
|
echohl Identifier | echon l:last
|
||||||
|
endif
|
||||||
|
echohl MoreMsg | echon ') '
|
||||||
|
echohl MoreMsg | echon '['
|
||||||
|
echohl Identifier | echon s:length()
|
||||||
|
echohl MoreMsg | echon '] '
|
||||||
|
echohl Normal | echon s:getProperty('title')
|
||||||
|
echohl None
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! quickfixed#older()
|
||||||
|
call s:history(0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! quickfixed#newer()
|
||||||
|
call s:history(1)
|
||||||
|
endfunction
|
7
vim/.vim/ftplugin/qf.vim
Normal file
7
vim/.vim/ftplugin/qf.vim
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
" Use h/l to go to the previous/next non-empty quickfix or location list
|
||||||
|
nnoremap <silent> <buffer> h :call quickfixed#older()<CR>
|
||||||
|
nnoremap <silent> <buffer> l :call quickfixed#newer()<CR>
|
||||||
|
|
||||||
|
" Use left/right to go to the previous/next non-empty quickfix or location list
|
||||||
|
nnoremap <silent> <buffer> <Left> :call quickfixed#older()<CR>
|
||||||
|
nnoremap <silent> <buffer> <Right> :call quickfixed#newer()<CR>
|
Loading…
Reference in a new issue