標籤:

通過列表添加文件到「參數列表」(argslist)

參數列表,是 vim 中一個文件名列表,裡面羅列了一系列文件名,是 buffer 列表的子集。每個 vim 進程只有一個參數列表,進程之間的參數列表不共通。

:help arglistnn3. 參數列表ttttt*argument-list* *arglist*nn如果你在啟動 Vim 的時候給出多個文件名,這些文件將被記住,即參數列表。你可以跳n轉到該列表裡的任何一個文件。nn不要把它和 |:buffers| 命令里的緩衝區列表混淆。參數列表在 Vi 里已經存在,但n緩衝區列表是 Vim 新加入的。參數列表裡的文件名也會在緩衝區列表裡存在 (除非你用n|:bdel||:bwipe| 將其刪除),但不在參數列表而出現在緩衝區列表的名字很常見。n

參數列表的意義在於,讓用戶可以維護一個特定的「待編輯文件列表」。當我們在使用 vim 的時候,往往會有很多的 buffer ,除了我們需要編輯的文檔的 buffer 外,可能還會有一些參考文檔、臨時文檔之類我們不需要編輯的 buffer ,通過參數列表我們就能夠有效隔離不必要的 buffer 。

在命令行中,我們可以通過

vim a.txt b.txt c.txtn

的方式一次性打開 n 個文檔,並且這些文檔都會自動添加到參數列表中。這是通常的用法。

而在某些場合下,我們需要編輯的文檔列了在一個清單中:

cover.htmlnchapter1/chapter1.htmlnchapter1/intro.htmlnchapter2/chapter2.htmlnchapter3.htmlnchapter4.htmlnchapter5.htmln

這時我們要怎樣把這些文件簡單地添加到參數列表中呢?

如果你查找幫助,會發現這個方法:

:[count]arga[dd] {name} ..ttt*:arga* *:argadd* *E479*nttt將若干文件名 {name} 等加到參數列表裡。nttt如果忽略 [count], {name} 等加入到參數列表的當前項之nttt後。不然,加到第 [count] 個文件之後。如果參數列表是nttt"a b c",而 "b" 是當前參數,那麼以下命令會導致:ntttt命令tt新的參數列表 ~ntttt:argadd xta b x cntttt:0argadd xtx a b cntttt:1argadd xta x b cntttt:99argadd xta b c xnttt這裡不會檢查重複項,因此一個文件可能加入參數列表兩次。nttt不改變當前編輯的文件。nttt{Vi 無此功能} {僅當編譯時加入 |+listcmds| 特性才有效}nttt注意: 你也可以使用這個方法: >ntttt:args ## xn<ttt這會加入 "x" 項並對新的列表排序。n

但這個方法是沒法直接使用的,因為它總會把文件放到「當前項之後」。

比如說,我們現在打開了上面的文件列表:

rootn │n ├─ list.list <= 我們打開的文件n │ n ├─ cover.htmln │ n ├─ chapter1n │ │n │ ├─ chapter1.htmln │ │n │ └─ intro.htmln │ n ├─ chapter1n │ │n │ └─ chapter2.html n │ n ├─ chapter3.htmln │ n ├─ chapter4.htmln │n └─ chapter5.htmln

我們查看當前工作目錄的時候,顯示的將會是 list.list 所在的目錄:

:pwdnrootn

我們在 list.list 的 buffer 中,逐行使用 arga 命令的時候,arglist 的「當前項」將一直是加入到 arglist 的第一項(本例中會是 cover.html ),於是,後面加入的文件統統會排在 cover.html 之後,順序就都反了。

即,對 list.list 使用

:g/^/exec "arga " . getline(.)n

來添加文件到 arglist 中的話,得到的結果將會是:

[cover.html] chapter5.html chapter4.html chapter3.html chapter2/chapter2.html chapter1/intro.html chapter1/chapter1.html n

而不是我們期待的:

[cover.html] chapter1/chapter1.html chapter1/intro.html chapter2/chapter2.html chapter3.html chapter4.html chapter5.htmln

那麼要怎樣才能按順序來排呢?其實也很簡單,把所有文件先列到一行就可以了。

:%jn:exec "arga " . getline(.)n

推薦閱讀:

【小技巧】對文本中指定內容進行快速的全局刪改
SpaceVim - 讓你的vim變得更加高效和強大
vim短途跳轉用easymotion那長途呢?
vim怎麼批量縮進?
vim 怎麼脫離滑鼠?

TAG:Vim | vim脚本 |