分割ウィンドウで別のファイルを開き、ウィンドウ間を切り替える

分割ウィンドウで別のファイルを開き、ウィンドウ間を切り替える

以下を使って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ファイルの1つ下)に配置できます。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

関連情報