분할된 창으로 다른 파일을 열고 창 간 전환

분할된 창으로 다른 파일을 열고 창 간 전환

다음을 사용하여 vim을 열면: $ vim -o a.ext b.ext

이런 창이 뜹니다

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

다른 파일을 열고 싶다고 가정해 보겠습니다. 그래서 c.ext상단 :e c.ext패널에서 다음과 같은 작업을 수행합니다.

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

하지만 이제 a.ext파일에 액세스할 수 없어 사용할 수 없습니다 . 다시 사용할 수 있도록 :n파일을 여는 올바른 방법은 무엇입니까 ?c.exta.ext:n

답변1

이미 파일을 열 수 있다고 생각하지만 파일은 별도의 버퍼에 있으므로 주어진 창에서 다음 및 이전 버퍼로 이동하려면 :bn(또는 전체 :bnext및 ) 명령을 사용해야 합니다 .:bprev

답변2

이전에 열었던 파일로 돌아가려면 ':e #'을 시도하겠습니다.

답변3

댓글에서 다음과 같은 질문을 하셨습니다.

해당 창에 있는 파일만 반복하도록 하는 방법이 있습니까(현재 열려 있는 모든 파일이 아님)?

내 생각에는 Vim이 창("창")이 이전에 액세스한 모든 버퍼를 추적하지 않는 것 같습니다. 그러나 Vim은스크립트 가능

다음은 다음을 사용하여 이 기능의 버전을 제공하는 구현입니다.자동 명령기록(에서창 지역 변수)는 창의 어떤 버퍼가 활성화되어 있는지 보여줍니다.

(축약된) 명령은 다음과 같습니다.

  • :Hb이 창의 기록 버퍼를 나열합니다.
  • :Hbn[!] [N]N번째 다음 히스토리 버퍼로 전환합니다.
    ( 와 유사 :bn하지만 현재 창의 "기록" 버퍼로 제한됨)
  • :Hbp[!] [N]처음 N개의 기록 버퍼로 전환합니다.
    ( 와 유사 :bp하지만 현재 창의 "기록" 버퍼로 제한됨)
  • :Hbf [N]("forget") 현재 창의 기록 버퍼 목록에서 현재 버퍼(또는 버퍼 번호 N)를 제거합니다.
    다른 버퍼로 전환하지 않고 이 창을 떠났다가 다시 들어가면 현재 버퍼가 기록 버퍼 목록에 다시 추가됩니다.

다음 코드는 파일 .vimrc이나 별도의 파일(예: plugin/buffer-history/buffer-history.vim파일 중 하나 아래) 에 넣을 수 있습니다.runtimepath목차):

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

관련 정보