Getting Started;
Editing Effectively;
Tuning Vim;
分別代表基本編輯技巧,更優化的編輯技巧和優化Vim編輯器本身。
先當然從Getting Started開始學習。
About the manuals.
這一節主要是對用戶手冊的基本介紹。其中說了,可以“從頭到尾像讀一本書那樣來讀用戶手冊”。這也是我準備要做的事。
最有用的是兩點,一是用“CTRL-]” 和“CTRL-o”跳來跳去;二是vimtutor的使用。
The first steps in vim
這一節提供了編輯文件的基本信息。是以後章節的基礎。除去和vimtutor重複的內容,基本知識如下:
vim中~代表不存在此行。
普通模式和插入模式。(當不知道在哪個模式時,就多按幾次esc回到插入 模式)
vim中方向鍵的選擇是出於按鍵最快捷的考慮。
J可以將兩行合行(join?).
第二次U命令會取消前一次U命令的結果。
多種插入方式:i, a, o, O。
ZZ命令可以推出vim。
:e!命令可以不保存修改,繼續編輯。
:help :help 關於如何獲取幫助的幫助。但這個幫助比較複雜,我覺得這一節中Finding help的內容就完全足夠了。
Moving around.
這一節主要講怎樣移動光標。移動光標是編輯文本時最頻繁的操作,所以移動光標的速度很大程度上決定了編輯效率。
跨單詞移動:w,b,e,ge。
用w和b跨段落移動比用l和k快得多。
跨句子移動:$, ^, 0 。
重要:單字符搜索命令,f,F,t, T。
%用於括號匹配(形象地理解爲兩個0通過斜槓匹配起來)。
gg回到文件第一行。
當前頁面的移動:H(home),M(middle),L(last)。
打開行標號:set number。
有用的命令zz,將光標行置於頁面中間。
使用*和#快捷搜索。
使用\<和\>來搜索完整單詞。
使用:scriptnames命令來找到配置腳本的實際位置。
用於搜索匹配的簡單正則表達式:
^表示句首,$表示句尾。
.用於匹配任意字符。
想搜索. 要使用轉義符\。
使用''跳回,或者使用CTRL-O,CTRL-I跳轉。(O代表older,I只是因爲在O旁邊)
mark(m):使用自己的標記。
特殊標記:', ", [, ]。
Making small changes.
此節主要講修改和移動文本的基本方法。包含三個重要概念:操作符和運動符,可視模式和文本對象。
exclusive和inclusive的區別。
operator-motion模式。
c:change, 與d類似,但會進入插入模式。
cw的例外:There is a saying that for every problem there is an answer that is simple, clear and wrong.
單字母命令:x--dl, X--dh, D--d$, C--c$, s--cl, S--cc 。
最簡單但有力的vim命令 . 。
使用v和V進入可視模式。
使用CTRL-v進入可視塊模式。
可視模式下的o和O命令: o for other end。
P 命令,粘貼在光標前或光標上。
xp快速修改“teh”這一類的問題。
y命令,用yank代替copy。
剪切板:用"*yy 和"*p來實現全局的 複製和粘貼。
文本對象 :aw(A Word), is(Inner Sentence), as(A Sentence)。
R進入替換模式。
用~來改變大小寫。
I 和 A, 句首插入和句尾插入。
Set your settings.
這一節介紹了最基本的優化vim和自定義偏好的方法,包括修改vimrc文件,增加插件和定義自己的宏。
:version命令可以查看vimrc文件的基本信息。
$VIMRUNTIME/vimrc_example.vim提供了一個簡單的vimrc文件樣版。
filetype plugin indent on : 自動辨別文件類型,插件和縮進。
映射可以將一系列的vim命令綁定到一個按鍵上。
一個簡單的映射:map<F5> i{<Esc>ea}<Esc> 。
常用反斜槓\來定義映射 。
vim插件只是一個啓動時自動加載的vim腳本。
使用:helptags 命令將一個腳本的幫助文檔加入到本地幫助文檔中。
:set iskeyword& 可以將選項置回爲默認值。
:set cmdheight=3 可以控制命令行高度。
Using syntax highlighting.
這一節主要將怎樣使用色彩來使文本更生動,並且提高工作速度。
使用:syntax enable來開啓色彩功能,例如註釋是藍色,關鍵字是褐色,字符串紅色等。
可用的文件類型參見$VIMRUNTIME/syntax。
使用:syntax reset來讓顏色恢復到默認值。
使用:colorsheme evening來選擇其他顏色策略,所有顏色策略參見$VIMRUNTIME/colors。
使用:runtime syntax/colortest.vim來檢測常用顏色組合的效果。
使用:TOhtml來將文件轉換成HTML格式。
關於顏色的更多內容參見usr_44.txt 和syntax的幫助內容。
Editing more than one file.
這一節主要講如何同時在一系列文件上工作,並做跳轉和複製。
使用:edit filename, vim會關閉當前文件開啓一個新的。
使用vim fileone filetwo filethree來編輯多個文件。
使用:next,:next!,:wnext來在文件間跳轉。
使用:args來看文件列表。
使用:set autowrite和:set noautowrite。
使用:args filefour filefive filesix來重定義文件列表。
使用CTRL-^在兩個文件間切換。
‘“可以回到上次光標停留的地方。
’.可以回到上次修改過的地方。
小寫字母是文件局部話的標籤,大寫字母則是全局標籤。
使用:marks M來查看M標籤的位置。
:set patchmode=.orig 來保存原文件。(對寫代碼很有用)
寄存器是vim存儲文本的地方,常使用a-z編號的寄存器。
"fyas代表向f寄存器中存儲一個句子。
使用"fp來粘貼。
使用:write >> logfile 將文本加入到另一個文件後面。
vim -R file 可以用只讀模式打開文件。
vim -M file 可以用更嚴格的只讀模式打開文件。
使用:saveas命令和:file命令。
這一節將的是分割窗口來同時編輯不同文件或同一文件的不同位置。
最簡單的分割窗口命令:split。
CTRL-W w 命令用來在窗口間跳轉,:close命令關閉窗口。
特殊的,使用:only來關閉除當前窗口外的所有窗口。
使用:split filename或者:new來分割窗口並編輯其它文件。
在vim中,調整窗口大小是一個特殊動作:使用鼠標比使用鍵盤方便得多。
使用:vsplit可以垂直分割窗口。(類似的:vnew也可用)
在窗口間移動和在文本中移動類似,只是要加上CTRL-W。
使用CTRL-W K可以將窗口移動到頂部(其它三個方向也類似)。
使用:qall或者:wall等對所有窗口進行操作。
vim -o one.txt two.txt three.txt或者:all命令的使用。
vimdiff main.c~ main.c 用來比較不同的文件。
使用:edit main.c 和:vertical diffsplit main.c~ 可以實現同樣的效果。
使用:edit main.c 和:vertical diffpatch main.c.diff來開啓比較模式。
使用]c 和[c在changes之間跳轉。
:diffupdate , dp(diff put)和do(diff obtain)。
:tabedit filename和:tab split。
這一節主要介紹vim的圖形界面可以提供的額外功能。
標題欄符號的意義:-不可修改,+包含變化,=只讀,=+只讀幷包含變化。
移除Toolbar,在vimrc文件中添加 :set guioptions-=T。
使用:behave xterm 或者:behave mswin 來修改鼠標的工作方式。
可優化的鼠標項: mouse, mousemodel, mousetime, mousehide, selectmode。
同時使用"current selection"和"real clipboard"來優化編輯效率。
"*寄存器代表current selection。
"+寄存器代表real clipboard。
Select mode:類似Visual mode,區別是選擇模式下輸入字符會替換已選字符。
使用:set selectmode+=mouse來開啓選擇模式, 此時可用SHIFT+方向鍵移動光標。
這一節講大規模更改文本的方法,主要是在可視模式下的操作和使用外部程序完成複雜操作。
錄製命令的三個步驟:start recording-q{register},type your commands,finish recording-press q。
使用命令@{register}執行錄製好的宏。
使用命令回放和使用.的區別:可重複多命令,有a-z這26個寄存器可用。
修改寄存器n中錯誤命令的技巧:
G Go to the end of the file.
o<Esc> Create an empty line.
"np Put the text from the n register.
{edits} Change the commands that were wrong.
0 Go to the start of the line.
"ny$ Yank the corrected commands into the n register.
dd Delete the scratch line.
使用q+大寫字母,代表在寄存器中增加命令。
替換命令 :[range]substitute/from/to/[flags], 例如:%s/old/new/g (g for global and c for confirm)。
使用:.write otherfile寫入單行文本。(. for current line and $ for the last line)
替換單個章節 :?^Chapter?,/^Chapter/s=grey=gray=g。
使用標記來描述範圍,mt,mb,:'t,'b。
更有力的命令:global, 形式如下:[range]g/{pattern}/{command}。
塊可視模式下,使用I和A插入。
塊可視模式下,使用c和C刪除塊同時插入字符串。
塊可視模式下,使用~,U和u進行大小寫轉換。
塊左右移動,使用>和<, 用:set shiftwidth=4進行設置。
使用:0read patch,將patch文件寫入文件首行。
使用:.,$write tempo,將光標到文件結束的內容寫入tempo中。
使用>>來增加文件內容而不是擦除重寫。
gqap調整當前段落顯示格式。
全行大寫gUU(gugu的簡化形式)。
使用外部程序,使用命令"!{motion}{program}"。
例如!5Gsort<Enter>, !!date<Enter>。
使用:read !dir讀取dir命令的輸出。
使用:write !wc將單詞數量寫入文件中(Unix命令 count words)。
CTRL-L, redraw the screen。
Recovering from a crash.
這一節主要介紹在電腦崩潰的情況下如何恢復以前的工作。
最基本的恢復手段:vim -r help.txt。
此時可以用Vimdiff來比較恢復後的文件和恢復前的文件:
:write help.txt.recovered
:edit #
:diffsp help.txt
在沒有文件名的情況下編輯時,在正確目錄下執行vim -r ""。
在合適的目錄下使用vim -r查找swap文件。
使用特定的swap文件 vim -r .help.txt.swp。
swap文件的命名規則:*.s[uvw][a-z]。
swap文件存在的情況下的提醒:O,E,R,Q, A, D。
Clever tricks.
這一節主要介紹如何將多個命令結合起來使用。
命令:%s/\<four\>/4/gc, 全文精準替換單詞four,並每次提示。
C++文件的方法名重構:
vim *.cpp
qq
:%s/\<oldFunctionName\>/newFunctionName/g
:wnext
q
999@q
爲避免不含有oldFunctionName的文件造成錯誤,使用
:%s/\<oldFunctionName\>/newFunctionName/ge
使用:%s/\([^,]*\),\(.*\)/\2 \1/來將Doe, John替換成John。
舉例,Makefile排序:
/^OBJS (找到以OBJS開頭的一句話)
j (移到下一行)
:.,/^$/-1!sort (從當前行到下方第一個空行之前,排序)
反轉所有行序 :g/^/m 0。
反轉從標籤t到當前行的行序 "mt", :'t+1,.g/^/m 't。
計算文件字數 g CTRL-G。
刪除每行末尾的空格和製表符 :%s/\s\+$//。
編輯所有帶有"frame_counter"單詞的c文件 vim 'grep -l frame_counter *.c'。
使用:grep frame_counter *.c,加上:cnext, :cprev, :clist。
vim編輯器的用戶手冊的第一部分終於看完一遍了,雖然只是beginner級別的,但對我來說,內容已經不少,需要花一段時間好好的消化一下了。所以,接下來,不準備立刻開始學習用戶手冊的第二和第三部分,而是在實踐中逐漸熟練掌握學過的vim編輯方法,並積累更多有用的vim編輯技巧。
近期來講,並不準備用vim來代替IDE的功能,一方面我的掌握程度還遠遠不夠。另一方面,每一個工具都有其最高效的作用域,我認爲如果將vim和eclipse結合起來使用,工作效率會更高。
就我這樣半吊子的英語水平,看vim用戶手冊居然非常流利,幾乎沒有什麼生僻的單詞和難以理解的句子。這充分說明了作者將複雜的事情變簡單的能力。在我們平時工作中,也要有這種能力,畢竟,不能將一件事向60歲的文盲老太太解釋清楚,就不能說你充分理解了這件事。