Как автоматически закрыть окно быстрого исправления при выходе из файла? - PullRequest
8 голосов
/ 19 сентября 2011

Я использую плагин в vim для компиляции Tex-файлов.При наличии ошибок при компиляции все они отображаются в окне быстрого исправления в нижней части экрана.

Когда я хочу оставить файл, над которым я работаю (:q, :wq,и т. д.) окно быстрого исправления может раздражать, потому что оно остается открытым после того, как я оставил буфер файла, над которым я работал, и вынудил меня к :q в окне быстрого исправления.

Есть ли способ сказать,VIM немедленно выполнить :close, когда я использую :q?Я пробовал несколько autocmds, но безрезультатно.

Ответы [ 3 ]

15 голосов
/ 20 сентября 2011

Добавить в ваш .vimrc файл

aug QFClose
  au!
  au WinEnter * if winnr('$') == 1 && getbufvar(winbufnr(winnr()), "&buftype") == "quickfix"|q|endif
aug END

Предупреждение: это закроет vim, если окно быстрого исправления является единственным видимым окном (и только вкладка).

3 голосов
/ 19 сентября 2011

Команда :qa закроет все открытые окна.

1 голос
/ 03 сентября 2016

Чтобы правильно закрыть даже несколько окон быстрого исправления / местоположения / справки при выходе из файла (:q, :wq и т. Д.), Добавьте следующий код в .vimrc:

" s:NextNormalWindow() {{{2
function! s:NextNormalWindow() abort
    for i in range(1, winnr('$'))
        let buf = winbufnr(i)

        " skip unlisted buffers
        if !buflisted(buf)
            continue
        endif

        " skip temporary buffers with buftype set
        if getbufvar(buf, '&buftype') != ''
            continue
        endif

        " skip the preview window
        if getwinvar(i, '&previewwindow')
            continue
        endif

        " skip current window
        if i == winnr()
            continue
        endif

        return i
    endfor

    return -1
endfunction

" s:QuitIfOnlyWindow() {{{2
function! s:QuitIfOnlyWindow() abort
    let l:buftype = getbufvar(winbufnr(winnr()), "&buftype")
    if l:buftype != "quickfix" && l:buftype != "help"
        return
    endif

    " Check if there is more than one window
    if s:NextNormalWindow() == -1
        " Check if there is more than one tab page
        if tabpagenr('$') == 1
            " Before quitting Vim, delete the special buffer so that
            " the '0 mark is correctly set to the previous buffer.
            " Also disable autocmd on this command to avoid unnecessary
            " autocmd nesting.
            if winnr('$') == 1
                if has('autocmd')
                    noautocmd bdelete
                endif
            endif
            quit
        else
            " Note: workaround for the fact that in new tab the buftype is set
            " too late (and sticks during this WinEntry autocmd to the old -
            " potentially quickfix/help buftype - that would automatically
            " close the new tab and open the buffer in copen window instead
            " New tabpage has previous window set to 0
            if tabpagewinnr(tabpagenr(), '#') != 0
                let l:last_window = 0
                if winnr('$') == 1
                    let l:last_window = 1
                endif
                close
                if l:last_window == 1
                    " Note: workaround for the same bug, but w.r.t. Airline
                    " plugin (it needs to refresh buftype and status line after
                    " last special window autocmd close on a tab page
                    if exists(':AirlineRefresh')
                        execute "AirlineRefresh"
                    endif
                endif
            endif
        endif
    endif
endfunction

" autoclose last open location/quickfix/help windows on a tab
if has('autocmd')
    aug AutoCloseAllQF
        au!
        autocmd WinEnter * nested call s:QuitIfOnlyWindow()
    aug END
endif

Нет проблем с открытием новой вкладки из окна быстрого исправления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...