" Open/close/toggle the quickfix and location-list windows " ------------------------------------------------------------------------------ " File: autoload/qf/window.vim " ------------------------------------------------------------------------------ " Toggle quickfix or location-list window function! qf#window#toggle(loclist = 0) " Check if quickfix window is open in current tabpage, or if current " window's location-list window is open let is_open = getwininfo() \ ->filter('v:val.tabnr == tabpagenr()') \ ->filter({_,info -> a:loclist \ ? info.loclist && info.winid == getloclist(0, {'winid': 1}).winid \ : !info.loclist && info.quickfix \ }) \ ->len() if is_open execute a:loclist ? 'lclose' : 'cclose' .. (&filetype ==# 'qf' ? '| wincmd p' : '') else let size = a:loclist ? getloclist(0, {'size': 1}).size : getqflist({'size': 1}).size if size " See https://github.com/vim/vim/issues/5037 execute a:loclist ? 'lopen 1' : 'botright copen 1' execute 'resize' min([10, size]) endif endif endfunction " Same as :cwindow and :lwindow but resize the quickfix window automatically function! qf#window#open(loclist = 0) let size = a:loclist ? getloclist(0, {'size': 1}).size : getqflist({'size': 1}).size if !size execute a:loclist ? 'lclose' : 'cclose' else execute a:loclist ? 'lopen 1' : 'botright copen 1' execute 'resize' min([10, size]) endif endfunction function! qf#window#close() if getwininfo(win_getid())[0].loclist lclose else cclose " Required only after cclose wincmd p endif endfunction " ------------------------------------------------------------------------------ " File: vimrc " ------------------------------------------------------------------------------ " Don't scroll windows when opening new horizontal splits set splitkeep=topline " Toggle quickfix and location-list windows nnoremap <silent> goc :<c-u>call qf#window#toggle(0)<cr> nnoremap <silent> gol :<c-u>call qf#window#toggle(1)<cr> augroup quickfix autocmd! autocmd QuickFixCmdPost [^l]* ++nested call qf#window#open(0) autocmd QuickFixCmdPost l* ++nested call qf#window#open(1) autocmd VimEnter * ++nested call qf#window#open(0) augroup END " ------------------------------------------------------------------------------ " File: after/ftplugin/qf.vim " ------------------------------------------------------------------------------ " Close quickfix window nnoremap <silent> <buffer> gq :<c-u>call qf#window#close()<cr>