Vim用得越來越順手,同時我也知道我目前使用到的可能只是Vim強大功能的1%不到。對於Vim的多buffer編輯一直沒有搞清楚,今天徹底的學習一下。
- 啥是buffer? 一個buffer就是一個已經載入內存的文件。所有打開的文件都對應着一個buffer,同時也存在着不對應任何文件的buffer。
- 咋確定一個buffer? 每個buffer都有一個特定的編號和名字,這個名字就是文件的名字,編號是由Vim自動分配的,確保唯一性。
- 咋創建一個buffer? 打開一個文件,就創造一個buffer。比如說
:edit file
- 俺咋能把一個文件加到buffer list,但又不打開這個文件? 用命令
-
。
:badd
- 咋查看當前的buffers list?
:buffers
:ls
:files
- 咋delete一個buffer?
:bdelete
- 咋從窗口移除一個buffer? 這有好幾個方法:
-
命令。后面可以指定buffer的編號或者名稱。
-
1 關閉窗口,或者在那個窗口編輯另一個buffer的內容
-
2 使用命令
:bunload
-
。這個命令將當前的buffer從窗口移除並且從內存里面移除。但是buffer不會從buffer list中移除。
- 咋從buffer list里面編輯一個已經存在的buffer? 1 使用
:buffer
-
命令,並指定已存在的buffer的編號或名稱
-
2 先輸入buffer的編號,然后用Ctrl-^跳過去
-
3 使用
:sbuffer
-
命令,並傳遞buffer的名稱,此時Vim會開一個新窗口並且在其中打開對應的buffer
-
4 先輸入buffer的編號,然后用
Ctrl-W ^
Ctrl-W Ctrl-^
- 俺想從不同的buffer里面跳來跳去的,咋整? 1 跳到第一個buffer,用
-
,同樣是在新窗口中打開指定buffer
:bfirst
-
或
:brewind
-
2 同上,但是在新窗口中,用
:sbfirst
-
或
:sbrewind
-
3 跳到下一個用
:bnext
-
或
:sbnext
-
4 跳到前一個用
:bprevious
-
或
:bNext
-
,相應的有
:sbprevious
-
和
:sbNext
-
5 跳到最后一個buffer,用
:blast
-
或
:sblast
- 俺咋才能打開所有已經load的buffer? 使用命令
:unhide
-
或者
:sunhide
- 俺咋跳到下一個修改過的buffer? 用命令
-
,這樣每個buffer都會在新窗口中打開。
:bmodified
-
或
:sbmodified
- 有沒有個腳本能讓buffer用起來更簡單點? 有的,有個腳本名字叫
bufexplorer.Vim
注意:這個我要看一下
- 能在Vim會話里面保存buffer list嗎? 顯然啊,在
Viminfo
-
中包含
%
- 俺咋能把buffer list里面的都給刪了? 打開Vim的時候帶個文件名,或者用個命令
-
就OK了
:bdelete
- 啥是隱藏buffer(hidden buffer)? 這個buffer,記錄沒保存的修改,不在窗口顯示。當你同時編輯多個buffer,暫時沒有保存的信息就歸這個隱藏buffer管
- 俺如何載入多個buffer,其中有這個修改還沒有保存的buffer? 你要先設置
hidden
- 當一個buffer變成hidden的時候,能不能將其unload或者delete掉? 有幾個選項可以控制,設置
-
,這樣的話Vim會記住你對buffer做的修改。當你退出Vim,就會詢問你是不是要保存已做的修改。
bufhidden
-
的時候,你可以指定當一個buffer變成hidden狀態時要怎么處理,如果設置成
delete
-
,那么buffer會被delete掉,如果設置成
unload
-
,那么buffer會unload,如果設置成
hide
- 俺怎么能對buffer list里面的所有文件都執行同一個命令? 用
-
,那就只是hide而已。
:bufdo
- 當俺從buffer list中打開一個buffer,如果那個buffer已經在一個窗口里面,俺想讓那個窗口激活,而不是說再開一個新窗口,那該咋辦? 把
switchbuf
-
選項設置成
useopen
- buffer里面都存了些啥額外信息? 光標最后所在位置、marks、jump list之流
- 上面白話了那么多,所謂這個delete和unload到底有什么區別?
unload
-
的話,buffer還在buffer list里面待着,不過文件內容要從內存里面移除;
delete
- 有沒有可能做到這樣一件事,重用已經delete的buffer的編號? 別想了,impossible。
- 俺怎樣得到一個臨時性的buffer(scratch)? 可以這樣設置
-
的話,先unload之,然后從buffer list里面刪掉
:set buftype=nofile
:set bufhidden=hide
:setlocal noswapfile
- 俺咋能不讓一個buffer加到buffer list里面?
:set nobuflisted
- 俺咋知道一個buffer是改了還是沒該? 方法有好些。最簡單的就是看標題欄或者狀態欄,上面有個“+”。另外就是查看一下標記位
:set modified?
- 咋能不讓修改buffer?
:set nomodifiable
-
,要是改變心意了,就
:set modifiable
- 俺只設定當前這個buffer,咋辦? 用
:setlocal
-
,比如說吧,
:setlocal textwidth=70
- 俺只對當前這個buffer用縮寫,怎么辦?
:map
-
或者是
:abb