Abra outro arquivo com janelas divididas e alterne entre elas

3

Se eu abrir o vim com: $ vim -o a.ext b.ext

Eu recebo uma janela parecida com esta

+----------------------+
|           a          |
|                      |
| a.ext ---------------+
|           b          |
|                      |
+ b.ext ---------------+

Digamos que eu queira abrir outro arquivo, c.ext . Então faço algo como :e c.ext no painel superior.

+----------------------+
|           c          |
|                      |
| c.ext ---------------+
|           b          |
|                      |
+ b.ext ---------------+

Mas agora o arquivo a.ext está inacessível e não consigo voltar a ele usando :n . Qual é a maneira correta de abrir c.ext para que eu possa voltar para a.ext usando :n ?

    
por Matt 22.07.2011 / 00:32

3 respostas

5

Eu acho que você já está abrindo bem seus arquivos, mas eles estão em buffers separados e você precisa usar os comandos :bn (ou :bnext e :bprev ) para navegar para os buffers próximos e anteriores em um dado painel.

    
por 22.07.2011 / 00:56
1

Eu tentaria ': e #', que retorna ao arquivo aberto anteriormente.

    
por 22.07.2011 / 07:03
1

Em um comentário, você perguntou o seguinte:

Is there a way to make it loop through only files that were in that pane (not every file currently open)?

Eu não acho que o Vim rastreie todos os buffers que uma janela (“painel”) acessou anteriormente. No entanto, o Vim é script

Aqui está uma implementação que fornece uma versão dessa funcionalidade usando autocommands para gravar ( em uma variável de janela local ) que os buffers foram ativados em uma janela.

Os comandos (abreviados) são:

  • :Hb Listar os buffers históricos para esta janela.
  • :Hbn[!] [N] Mudar para o próximo buffer histórico. (como :bn , mas limitado aos buffers “históricos” da janela atual)
  • :Hbp[!] [N] Alterna para o N º buffer histórico anterior.
    (como :bp , mas limitado aos buffers “históricos” da janela atual)
  • :Hbf [N] ("forget") Remove o buffer atual (ou o número de buffer N) da lista de buffers históricos da janela atual.
    Se você não alternar para outro buffer para sair e entrar novamente nessa janela, o buffer atual será adicionado novamente à lista de buffers históricos.

O código a seguir pode ser colocado em seu .vimrc ou em um arquivo separado (por exemplo, plugin/buffer-history/buffer-history.vim em algum lugar em um dos seus runtimepath diretórios):

augroup UL17179_BufferHistory
    autocmd!
    autocmd BufEnter * call s:RecordBufEnter(0)
    " Grab WinEnter, since BufEnter is not triggered when doing
    " a bare ':split'. This also means that 'forgetting' a buffer is
    " only effective if you switch to another buffer before
    " switching away from the window.
    autocmd WinEnter * call s:RecordBufEnter(1)
augroup END

function! s:EnsureBufferHistory()
    if ! exists('w:BufferHistory')
        let w:BufferHistory = []
    endif
    return w:BufferHistory
endfunction

function! s:RecordBufEnter(w)
    let l = s:EnsureBufferHistory()
    let b = winbufnr(0)
    let i = index(l, b)
    if i >= 0
        unlet l[i]
    endif
    let l += [b]
    redraw
endfunction

function! s:ForgetBuffer(...)
    let l = s:EnsureBufferHistory()
    for b in a:000
        let b = b ? b+0 : winbufnr(0)
        let i = index(l, b)
        if i >= 0
            call remove(l, i)
        else
            try
                echohl WarningMsg
                echomsg 'Buffer' b 'not in history list.'
            finally
                echohl None
            endtry
        endif
    endfor
endfunction

function! s:ShowBuffers()
    let l = s:EnsureBufferHistory()
    for b in l
        echomsg b bufname(b)
    endfor
endfunction

function! s:HistoricalBufferNr(...)
    let  direction = a:0 >= 1 && !a:1 ? -1 : 1
    let move_count = a:0 >= 2 ? max([1, a:2]) : 1

    let current_bn = winbufnr(0)
    let historical_buffers = copy(filter(s:EnsureBufferHistory(),
                \ 'bufexists(v:val)'))
    let i = index(historical_buffers, current_bn)
    if i < 0
        let other_historical_buffers = historical_buffers
    elseif i == 0
        let other_historical_buffers = historical_buffers[1:]
    else
        let other_historical_buffers = historical_buffers[i+1:] +
                    \ historical_buffers[:i-1]
    endif

    if len(other_historical_buffers) <= 0
        try
            echohl ErrorMsg
            echomsg 'This window has no historical buffers!'
        finally
            echohl None
        endtry
        return 0
    endif
    if direction > 0
        let i = (move_count - 1) % len(other_historical_buffers)
    else
        let l = len(other_historical_buffers)
        let i = ((l - 1) * move_count ) % l
    endif
    return other_historical_buffers[i]
endfunction

" If the 1) user does not give a bang and
"        2) we run 'buffer N' (no bang) from inside the function and 
"        3) switching away from the buffer would require a bang,
" then the user will see an ugly 'Error detected while processing
" function' prefix before the usual E37 error message. Hoisting the
" 'buffer<bang> N' into the user-defined command means the user will
" just see a normal E37 message.
command! -nargs=0 -count=1 -bang -bar
            \ HistoricalBufferNext
            \ let s:new_bn = s:HistoricalBufferNr(1, <count>)
            \ | if s:new_bn | exe 'buffer<bang>' s:new_bn | endif
command! -nargs=0 -count=1 -bang -bar
            \ Hbn
            \ HistoricalBufferNext<bang> <count>
command! -nargs=0 -count=1 -bang -bar
            \ HistoricalBufferPrev
            \ let s:new_bn = s:HistoricalBufferNr(0, <count>)
            \ | if s:new_bn | exe 'buffer<bang>' s:new_bn | endif
command! -nargs=0 -count=1 -bang -bar
            \ Hbp
            \ HistoricalBufferPrev<bang> <count>
command! -nargs=* -count=0 -bar
            \ HistoricalBufferForget
            \ call s:ForgetBuffer(<count>, <f-args>)
command! -nargs=* -count=0 -bar
            \ Hbf
            \ HistoricalBufferForget <count> <args>
command! -nargs=0 -bar
            \ HistoricalBuffers
            \ call s:ShowBuffers()
command! -nargs=0 -bar
            \ Hb
            \ HistoricalBuffers
    
por 22.07.2011 / 14:32

Tags