0

我是初学者 vi 用户。我不知道术语,但我想将我的 gvim 终端(屏幕?)分成 2 个窗口,每个窗口都有 5 个不同的文件(缓冲区?)。我可以在一个窗口中打开前 5 个文件,然后拆分到第二个窗口,但我不知道如何在第二个窗口中打开另外 5 个不同的文件。我一直无法找到这些信息。:n通常我用和切换文件:prev

再说一遍:我想要左侧窗口中的文件 1-5 和右侧窗口中的文件 6-10。这可能吗?

4

5 回答 5

7

您确实可以拥有窗口本地参数列表:

:arglocal
:args file1 file2 file3 file4 file5
:vsplit
:arglocal
:args file6 file7 file8 file9 file10

这样,您可以为左侧窗口设置一个参数列表(包含文件 1-5),并在拆分的右侧窗口上设置另一个参数列表(包含文件 6-10)。:next窗口中的和之类的命令:first则相互独立。

于 2013-07-13T11:56:01.950 回答
3

缓冲区是全局的。这意味着你不能拥有,比如说两个垂直窗口,容纳两组专有的缓冲区。当然,这同样适用于选项卡。

因此,只需使用两个实例:一个在左侧使用文件 1-5,另一个在左侧使用文件 6-10。

因为这两个实例是分开的,所以您可以安全地使用:net:prev而不会“溢出”。

于 2013-07-12T23:16:01.323 回答
2

选项卡是窗口的视口,窗口是缓冲区的视口。您可以在任何窗口中查看任何缓冲区。不过,我不会说不可能创建一些解决方法:例如,您可以创建命令:NEXT:PREV通过::command使它们仅遍历在此窗口中打开的缓冲区,:EDIT如下面的代码所示。但我强烈建议使用一些有助于缓冲区切换的插件,例如Command-T(我有nnoremap ,b :CommandTBuffer<CR>用于缓冲区切换的),而忘记非常低效的:next/:previous命令。

function s:Edit(args)
    let w:winbuflist=get(w:, 'winbuflist', [bufnr('%')])
    execute 'edit' a:args
    let buf=bufnr('%')
    if index(w:winbuflist, buf) == -1
        call add(w:winbuflist, bufnr('%'))
    endif
endfunction
function s:Switch(direction)
    let buf=bufnr('%')
    let w:winbuflist=get(w:, 'winbuflist', [buf])
    let idx=index(w:winbuflist, buf)
    if idx==-1 || w:winbuflist ==# [buf]
        if idx == -1
            echohl ErrorMsg
            echomsg 'Current buffer was not opened using :E or was opened in another window'
            echohl None
        endif
        execute a:direction
        return
    elseif a:direction is# 'next'
        let idx += 1
        if idx == len(w:winbuflist)
            let idx=0
        endif
    elseif a:direction is# 'previous'
        let idx -= 1
        if idx == -1
            let idx=len(w:winbuflist)-1
        endif
    endif
    execute 'buffer' w:winbuflist[idx]
endfunction
function s:RemoveBuf(buf)
    for tab in range(1, tabpagenr('$'))
        for win in range(1, tabpagewinnr(tab, '$'))
            call filter(getwinvar(win, 'winbuflist', []), 'v:val isnot '.a:buf)
        endfor
    endfor
endfunction

augroup BufWinList
    autocmd! BufWipeout * :call s:RemoveBuf(+expand('<abuf>'))
augroup END

"       \/\/\/\/\/\/\/ Warning: this is not a completion option. It also
"       \/\/\/\/\/\/\/ makes command do the expansion of its arguments.
command -complete=file -nargs=? -bar EDIT :call s:Edit(<q-args>)
command                -nargs=0 -bar NEXT :call s:Switch('next')
command                -nargs=0 -bar PREV :call s:Switch('previous')
于 2013-07-13T10:39:13.363 回答
0

看起来您只需要执行几次拆分。

  1. 拆分为 2 个垂直窗口:Ctrl-w v
  2. 在每个窗口中:Ctrl-w s(重复 4 次,获得 5 个缓冲区)

您可以使用 Ctrl-w j / Ctrl-w k 在窗口之间移动

于 2013-07-12T20:41:19.593 回答
0

:split命令采用文件名,并在新的水平拆分窗口中打开该文件名。(但您也可以先只:split/ <C-W>s/ <C-W>v,然后:edit/:next另一个文件。)预先:vertical(或更短:vsplit)垂直分割。有了这个,你可以创建你想要的布局。

要聚焦不同的窗口,有许多以Ctrl+开头的映射W,例如<C-w>j转到下面的窗口。查看:help CTRL-W完整列表。

于 2013-07-12T20:41:41.263 回答