2013-07-12 99 views
0

我是一個初學者vi用戶。我不知道術語,但我想將我的gvim終端(屏幕?)分成2個窗口,每個窗口有5個不同的文件(緩衝區?)。我可以在一個窗口中打開前5個文件,然後分割到第二個窗口,但我不知道如何在第二個窗口中打開5個不同的文件。我一直無法找到這些信息。通常我在:n:prev之間切換文件。在gvim中創建兩個獨立文件(?)的窗口

再說一遍:我想要在左窗口上顯示文件1-5和右窗口上的文件6-10。這可能嗎?

回答

7

事實上,你可以有窗口局部的參數列表:

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

這種方式,你可以有一個參數列表(與文件1-5)左窗口,另一個(與文件6-10)在分裂的右邊窗口。然後窗口中的:next:first等命令相互獨立。

+0

arglist! Facepalm ... – romainl

+0

@romainl我從來沒有使用窗口本地arglists到目前爲止,但不是很高興發現Vim你有覆蓋! –

+0

如何將一個額外的參數添加到當前的本地參數? – Stuart

0

看起來你只需要執行幾次拆分。

  1. 斯普利特2個垂直窗口:CTRL-W v
  2. 在每個窗口:CTRL-W S(重複4次,得到5個緩衝器)

你可以在窗口之間用移動Ctrl-w j/Ctrl-w k

+0

我只想要兩個窗口,我想在一個窗口中創建1-5個文件,在另一個窗口中創建6-10個文件,這樣我就可以在當前窗口的文件中用':n'和':prev' 。 – Stuart

0

:split命令獲取一個文件名,並在一個新的水平分割窗口中打開它。 (但是,您也可以首先使用:split/<C-W>s/<C-W>v,然後使用:edit/:next另一個文件。)在垂直分割前加上:vertical(或更短的:vsplit)。有了這個,你可以創建你想要的佈局。

聚焦於不同窗口中,有與Ctrl鍵 + W¯¯,例如啓動許多映射<C-w>j去下面的窗口。完整列表見:help CTRL-W

+0

我很熟悉分裂。我試圖編輯該問題的澄清。 – Stuart

+0

啊,你的問題真的不清楚。請看我的其他答案。 –

3

緩衝區是全球性的。這意味着你不能擁有兩個垂直的窗口,它們包含兩套獨特的緩衝區。當然,這同樣適用於製表符。

所以,只需使用兩個實例:一個在文件1-5的左邊,另一個在文件6-10的左邊。

由於兩個實例是分開的,因此您可以安全地使用:n:prev而不會出現「溢出」。

+0

你是說在同一屏幕上的所有標籤共享相同的緩衝區? – Stuart

+1

當你在一個窗口或者一個標籤中,無論是哪個標籤或窗口,你都可以訪問相同的緩衝區列表:每個Vim實例只有一個緩衝區列表,並且沒有辦法解決它。你需要兩個獨立的緩衝區列表,所以你必須使用兩個獨立的vim實例。 – romainl

2

選項卡是窗口的視口,窗口是緩衝區的視口。您可以在任何窗口中查看任何緩衝區。我不會說它不可能創建一些解決方法,例如:您可以通過:command創建命令:NEXT:PREV,並使它們僅在通過: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') 
相關問題