Vim Tips Wiki
Register
Tags: Visual edit apiedit
 
(One intermediate revision by one other user not shown)
Line 16: Line 16:
 
function! GetBufferList()
 
function! GetBufferList()
 
redir =>buflist
 
redir =>buflist
silent! ls
+
silent! ls!
 
redir END
 
redir END
 
return buflist
 
return buflist
Line 96: Line 96:
 
----
 
----
 
You can use <code>t:qfix_win</code> instead of <code>g:qfix_win</code> if you need to switch between tabs.
 
You can use <code>t:qfix_win</code> instead of <code>g:qfix_win</code> if you need to switch between tabs.
  +
----
  +
How about this? I used python.
  +
<pre>
  +
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
  +
</pre>

Latest revision as of 08:34, 22 January 2017

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