Vim Tips Wiki
Register
Advertisement
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Tip 1008 Printable Monobook Previous Next

created 2005 · complexity basic · author jheddings · version 6.0


Here is a newer solution that seems to alleviate any problems with multiple tabs and out of sync issues.

function! GetBufferList()
  redir =>buflist
  silent! ls!
  redir END
  return buflist
endfunction

function! ToggleList(bufname, pfx)
  let buflist = GetBufferList()
  for bufnum in map(filter(split(buflist, '\n'), 'v:val =~ "'.a:bufname.'"'), 'str2nr(matchstr(v:val, "\\d\\+"))')
    if bufwinnr(bufnum) != -1
      exec(a:pfx.'close')
      return
    endif
  endfor
  if a:pfx == 'l' && len(getloclist(0)) == 0
      echohl ErrorMsg
      echo "Location List is Empty."
      return
  endif
  let winnr = winnr()
  exec(a:pfx.'open')
  if winnr() != winnr
    wincmd p
  endif
endfunction

nmap <silent> <leader>l :call ToggleList("Location List", 'l')<CR>
nmap <silent> <leader>e :call ToggleList("Quickfix List", 'c')<CR>

Using this function and command:

command -bang -nargs=? QFix call QFixToggle(<bang>0)
function! QFixToggle(forced)
  if exists("g:qfix_win") && a:forced == 0
    cclose
    unlet g:qfix_win
  else
    copen 10
    let g:qfix_win = bufnr("$")
  endif
endfunction

Calling ':QFix' will "toggle" the quickfix open and closed. It's easiest to map this to something fast. I use:

nmap <silent> \` :QFix<CR>

If you want to force the window open, use ':QFix!' and the window will open or stay open.

Comments

Using autocommands, you can fix the "out-of-sync" issue. The entire code for this would be:

" toggles the quickfix window.
command -bang -nargs=? QFix call QFixToggle(<bang>0)
function! QFixToggle(forced)
  if exists("g:qfix_win") && a:forced == 0
    cclose
  else
    execute "copen " . g:jah_Quickfix_Win_Height
  endif
endfunction

" used to track the quickfix window
augroup QFixToggle
 autocmd!
 autocmd BufWinEnter quickfix let g:qfix_win = bufnr("$")
 autocmd BufWinLeave * if exists("g:qfix_win") && expand("<abuf>") == g:qfix_win | unlet! g:qfix_win | endif
augroup END

I set g:jah_Quickfix_Win_Height in my vimrc to something around 10.


Maybe I'm missing something, but why don't just use :copen and :cclose? Why do you need that function/command?


Because this is a toggle (open/close) in a single command, whereas :copen and :cclose are 2 different commands and 2 different mappings, in case you wish to map it.


You can use t:qfix_win instead of g:qfix_win if you need to switch between tabs.


How about this? I used python.

function! GetActiveBufferName()
redir => buffname
sil exe "ls! %"
redir END
python3 << EOF
import vim,re 
b=vim.eval('buffname')
result = re.search('\"([^\"]*)\"',b).group(1)
vim.command('let l:s="%s"'%result)
EOF
return l:s
endfunction 

function! Toggle_Quickfix()
python3 << EOF
current_buffer_name=vim.eval('GetActiveBufferName()')
if current_buffer_name=='[Quickfix List]':
    vim.command('q')
else:
    vim.command('copen')
EOF
endfunction
Advertisement