I was trying to create a trigger that does the following: When opening a new tab with a file, if there already exists a terminal buffer, it is opened below in this new tab.

I have seen in logfiles that the events triggered when opening a new tab are WinLeave, TabLeave, WinEnter and TabEnter (in this order). In my .vimrc file I created an augroup and tried to use autocmds.

The problem is that it does not work as expected (it does nothing, actually), and I am pretty sure that the wrong part is related to sequential autocmd.

Here is the code:

    " Take into account events in their order
    autocmd WinLeave ++nest autocmd TabLeave
        \ ++nest autocmd WinEnter ++nest autocmd TabEnter * |
        " Create variable with existing terminal buffers
        \ let term_buf = filter(range(1, bufnr('$')),
            \ 'getbufvar(v:val, "&buftype", "ERROR") == "terminal"') |
        \ if len(term_buf) > 0 |
            " First terminal buffer taken
            \ let x = term_buf[0] |
            " Open new buffer below
            \ exe 'below sbuffer'.x |
            \ startinsert |
        \ endif
augroup end

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.