Last active
October 3, 2024 17:12
-
-
Save bfrg/63e49d4a7c2d43fe9206b104e7837aff to your computer and use it in GitHub Desktop.
Toggle the quickfix and location-list windows and resize the quickfix window automatically
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
" 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> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Not at all. I wonder how much one can count on such magic in other languages such as Lua, Python, Go, ...