LINUX.ORG.RU

Я для открытия / закрытия QFix делаю так:

map <silent><F2> <Esc>:QFix<CR>

let g:jah_Quickfix_Win_Height = 10

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
andreyu ★★★★★
()
Ответ на: комментарий от andreyu

В принципе, если избавиться от глобальной переменной и использовать buffer-local autocmd, можно попробовать накостылять что-нибудь на основе этих BufWinEnter/BufWinLeave. А проще никак? Надо будет покопаться в справке по окнам.

anonymous
()
Ответ на: комментарий от anonymous

Для начала :help :copen, там есть про :quickfix_title, т.е. можно что-то вроде:

function! QFActive()
    for i in range(1, tabpagewinnr(tabpagenr(), '$') + 1)
        if getwinvar(i, 'quickfix_title', 'fake') != 'fake'
            return 1
        endif
    endfor
    return 0
endfunction

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Интересно, но почему-то работает только если открывать вручную с помощью :copen/:lopen. Когда открывается автоматически плагинами, не работает - переменной quickfix_title нет. Точно так же срабатывает autocmd BufWinEnter quickfix - только если открывать вручную. И quickfix_title, и BufWinEnter quickfix почему-то еще не различают quickfix list и location list. А мне бы надо различать.

anonymous
()
Ответ на: комментарий от anonymous

Похоже, проблема в том, что из автокоманды не вызываются другие автокоманды - в моем случае BufWinEnter quickfix (и вообще BufWinEnter *). Добавление в вызывающую автокоманду ключевого слова nested немного исправляет ситуацию: BufWinEnter quickfix все равно не вызывается, но BufWinEnter * вызывается. Однако это не очень помогает.

anonymous
()

В принципе, команда нормального режима :file выводит имя буфера - почти то, что нужно. Как бы только получить ее вывод в переменную?

anonymous
()

Судя по всему, в vim вообще невозможно отличить quickfix window от location window. Печалька.

anonymous
()
Ответ на: комментарий от anonymous

Можно смотреть на тип буфера:

function! QFActive()
    for i in range(1, tabpagewinnr(tabpagenr(), '$') + 1)
        if getbufvar(winbufnr(i), '&filetype', '') == 'qf'
            return 1
        endif
    endfor
    return 0
endfunction

почему-то еще не различают quickfix list и location list

Это два названия одного и того же, может различие в виде какой-нибудь переменной буфера есть. Может можно как-то неявно через getloclist() и getqflist() проверить тип буфера.

xaizek ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.