Vim文本编辑器 指令大全(二)
經常處理文本以及經常需要寫代碼的人,都會有自己比較常用的編輯器,本人喜歡用Vim,理由就是Vim編輯器靈活,并且可以達到純鍵盤操作,使用純熟情況下,根本不需要鼠標操作,聽起來是不是很酷的?不過別高興太早,想達到那個境界必須的指令是需要學習+記憶+練習的。總結指令如下:
高級正則表達式
1./\s*\<\(return\|else\)\@!\w\+\s\+\w\+\s*([^)]*)\s*;\@!\s*$?查找多由c語言中的函數
\<?零長度匹配,表示單詞的開始
\@!?零長度匹配?表示要求他前面的內容不存在
2.要求是將
?
?
?
?
變成
?
?
?
?
方法一:
第一步,增加id="":
:g/^$/ id="">/g
第二步,增加數字:
:let i=0 | g/^$/\=i/| let i=i+1
這是用|號(邏輯或的符號,不是字母)連接的三個語句,
前后兩個就是給i賦初值和遞增,
id="\zs\ze">$ \zs?和\ze?是"零長度匹配",在這兩個中間的才作為匹配內容,
這個語句就是只匹配雙引號中間的內容,
這樣不會把其他有用的地方替換掉了
\=i \=是把后面的字符串當成表達式來對待,在這里就是i?的值
方法二:
這是用一步解決的方法:
:let i=0 | g/^$/\=substitute(" id = \"0\">", "0", i,"")/| let i = i+1
和上面的方法基本相同,就是替換右尖括號,不過這次是替換為substitute(" id = \"0\">", "0", i,"")
這是一個替換函數,就是在id=0中查找第一個0,并替換為i?的值,最后一個參數是{flag},一般為空.
08.08.19?我自己也寫了一個,和上面的基本一樣,就是不用substitute函數而已
:let i = 1 | g/^$/\=" id = " . i . ">"/ | let i += 1
其中\=表示后面是個表達式,小數點用以連接字符串的幾個部分,中間用了i?的值
3.?每行前面加上行號
法一:
:g/^/exec "s/^/".strpart(line(".")." ", 0, 4)
法二:
:%s/^/\=strpart(line(".")." ", 0, 4)/g
line()返回一個行數,特別的,
line(".")返回當前光標所在行的行數,其他的參數見:h line()
g/^/exec是對所有行執行一個或多個命令,具體可以:h exec?來查看,
每個命令必須用字符串,也就是要放在雙引號里面,多個命令間用空格分割.
在上面的例子中,后面只有一個命令,但是這個命令是用小數點連起來的一個字符串
4.如下的賦值
firstline=1 //comment line 1
secondline=2
thirdline = 3//comment line 2
forthline= 4
fifthline =5
希望整理成
firstline = 1 //comment line 1
secondline = 2
thirdline = 3 //comment line 2
forthline = 4
fifthline = 5
下面是我寫的語句,比較長,應該還有更好的寫法,以后有改進再補充
:g/=/s#\v(.*)\=\s*(((//|/\*)@!.)*)\ze(//|/\*)?#\=strpart(submatch(1) . " ",0,13) . "= " .
strpart(submatch(2) . " ",0,10)# | s/\s*$//
前面紫色部分,查找所有包含等號的行,然后執行后面兩個命令,
第一個命令是橘黃色的部分,第二個命令是藍綠色部分,
第二個命令就是去掉行末的空格,這個不需要多解釋,重點解釋第一個命令
s#a#b#是一個替換的命令,這里用#做分隔符,是因為后面的表達式中有斜桿/,
如果用斜桿作為分隔符,則表達式中的斜桿需要轉義,稍顯累贅
\v表示后面的正則表達式中,除了字母和數字和下劃線和斜桿,其他的都作為特殊字符對待,
有這個設置的好處,是后面可以省掉好幾個用來轉義的反斜桿,
像\(\)\+這些都可以簡寫成()+
\=?匹配一個等號
\s*?匹配0個或0個以上的空白符
加粗的部分是一個比較重要的地方,一共三層括號,最外層括號使這個括號內部的內容成為一個子匹配,
在后文中的submatch(2)就是指的這一部分,
后面的一個*號,表示第二個括號內的內容可以匹配0?次或0?次以上.
第二個括號內部,@!是個"零長度匹配",表示前面第三層括號內的內容不能出現,
小數點匹配除了換行符外的任意字符,
第三層括號里面,就是c語言注釋的兩種形式,//和*.txt
而:argdo %s/hate/love/gc | update
是將參數列表中的所有文件的hate提換成love,并寫入硬盤(如果沒有|update,就不
會寫入,但相應的替換也會被中斷)
最后強調一點,使用替換命令的時候,一定記得備份,因為替換是直接寫入硬盤滴哦……
?
?
?
專題:
1.模式行
:help modeline
:help 'modeline'
:help 'modelines'
?
模式一
// vim:ft=cpp tabstop=4
模式二
vim:set tw=78 ts=8 ft=help norl:sdfasdfasdgs
?
第一種形式中最后一設置項后的冒號或空格是可有可無的。
而第二種形式中最后一設置項后一定要有冒號——不管冒號后有沒有文字。
在設置項中如果要使用空格、制表符或冒號可以在前面加上轉義符-`\‘。
其他需要轉義符的情況見`:help option-backslash‘。
2.折疊
:help folding
:help foldmethod
:help fold-methods
:help
:set foldmethod=manual
:3,8fo
折疊方式:
1)`manual‘?手工規則
手工規則下,折疊層級由折疊區域的嵌套關系計算。當我們手工指定一個折疊的區域后,Vim
對這個區域的開始行和結束行做記號,多個區域的開始行和結束行形成了嵌套關系。如果一
個折疊區域不包含在其他區域之中,則其折疊層級為1;當這個區域直接包含于另一個區域
時則其為折疊層級為另一個區域的層級加1;依些類推。
2)`marker‘?標記規則
當使用標記規則折疊時,層級的計算跟手工規則相似。除了它是根據文件中的標記來劃分一
個折疊區域而不是手工指定。然后根據這些區域間的嵌套關系計算折疊層級。具體使用的標
記通過`foldmarker‘設置。默認是使用'{{{,}}}'。
?
手工和標記類似
:set foldmethod=manual
:3,8fo?或著高亮選擇第三至8行?后?輸入指令zf
?
使用manual一般是臨時性的折疊。如果每次編輯特定文件都需要做同樣折疊時時建議結合modeline使用其他折疊
規則。如果不得不使用manual方式時,你可以用:mksession保存包括折疊在內的一切當前編輯設置或者
用:mkview保存當前窗口
?
3)`indent‘?縮進規則
行的縮進寬度除以`shiftwidth‘,并向下取整得到每一行的折疊層級。同一折疊層級及更高折
疊層級的連續行形成折疊。而其中的更高折疊層級的行——如果有的話,形成嵌套的折疊。
?
4)`syntax‘?語法規則
跟`marker‘差不多,只是所用的標記是在語法文件中定義的,而不是通過`foldmarker‘設置。
5)`diff‘?差異規則
除了差異行及其前?后三行1外,其余行折疊(層級為1)。
6)`expr‘?表達式規則
由用戶指定折疊層級的計算方式。方法是對`foldexpr‘進行設置。具體用法稍后說明。
:set foldmethod=expr
:set foldexpr=1
所有的行都被折疊?foldexpr將每行的折疊層級設置為1
v:lnum>=8&&v:lnum<=20?1:0
v:lnum>=8\ &&\ v:lnum<=20\ ?\ 1:0
三個在折疊的表達式比較常用幾點:
v:lnum?內置變量,表示是“當前行的行號”。:help v:var?查看更多內置變量。
getline()?函數用以返回指定行的內容。
?:?三元條件語句。見:help expr1
?
v:lnum>=8&&v:lnum<=20?1:0
v:lnum>=8\ &&\ v:lnum<=20\ ?\ 1:0
?
:set foldexpr=(v:lnum>=8&&v:lnum<=20?1:0)
?
如果一行以@samp{#}開始,折疊。
:set foldexpr=getline(v:lnum)=~/^#/?1:0
?
以每5行為一組折疊
set v:lnum%5-1?1:'>1'
?
用正則表達式@samp{.}判斷當前行是否含有文字。
set foldexpr=getline(v:lnum)=~'.'?1:0
?
在文章的末尾加入
vim: ro: fdm=expr: fde=getline(v\:lnum)=~'.'?1\:0:
foldtext=foldtext().v\:folddashes.getline(v\:folds
tart+1): foldcolumn=2
則每次打開文件會折疊(方式是空行之間的折疊在一起)
?
導出折疊的部分到筆記.txt
:folddoclosed .w! >>筆記.txt
如果folddoclosed?只對當前關閉的折疊有效,要導出所有的折疊先使用指令zR
刪除所有的marker用?:g/{{{/norm zD
?
在'.vimrc'(windows中是'_vimrc')中加入,下面的內容:
"?根據郵件的后綴名進行相關的設置。如果打開的文件后綴名是
'.eml',則當成郵件處理。
autocmd! BufReadPre *.eml se fdm=expr
fde=v:lnum==1?1:getline(v:lnum)=~'^$'?0:'='
fdt=Mailfdt(v:foldstart,v:foldend) ft=mail | syn on
"?定義函數,用來返回折疊的標題。
"?以折疊的第一和最后一行的行號為參數
func! Mailfdt(fst,fen)
let fst=a:fst
"?保存郵件的標題和發信人
let hfrom=''
let hsub=''
let tline=''
while a:fen!=fst
let tline=getline(fst)
"?判斷當前行是否是我們感興趣的行
"?如果是則保存
if tline=~'^From: '
let hfrom=tline
elseif tline=~'^Subject: '
let hsub=tline
endif
let fst=fst+1
endwhile
"?返回相關信息
if strlen(hfrom) || strlen(hsub)
return hsub . "\t\t\t" . hfrom
else
return getline(a:fst)
endif
endfunc
在加入上面的內容后,我們現在用Vim打開郵件(實際是以.eml作后綴名的文件)
看看,是不是清爽多了!
?
這是比較不常用但又可能比較有用的內容。使用:help查看相關信息。
v:foldstart?內置變量只讀變量記錄只前所在折疊的起始行號
v:foldend?內置變量結束行號,其余同上
foldlevel()?函數返回指定行的折疊層級
'foldlevel'?設置項只有高于這個值的折疊層級才會進行折疊
'foldnestmax'?設置項指定最深的嵌套數
'foldignore'?設置項在?indent規則中以這個值開始的行的將根據前后行的值來設定折疊層級
:folddoclose?命令?對當前閉合的行運行命令
:folddoopen?命令?對未折疊的行或定義了折疊但未閉合的行運行命令
?
更多內容參考`:help vim-script‘
:help :folddoopen
:help :folddoclosed
3.
高效
1.移動速度
set hlsearch
*
使用fold?先全部關閉?移動到制定fold后再打開
2.Don't type it twice
使用CTR+n?自動填充?如果不對?則?CTR+p?回到起點?敲入新的字符 再?CTR+n時
?
3.Fix it when it's wrong
:iabbrev teh the
:syntax keyword WordError teh
4.A file seldom comes alone
:!ctags -R .
:tag init
:tnext
:grep “\” **/*.h
:cnext
:make
gf goto file
?
?
?
語法高亮幫助文檔
:help syntax.txt
:help 'tags'
:help tags-file-format
:help tags-and-searches
?
:tag?關鍵字(跳轉到與“關鍵字”匹配的標記處)
:tselect [關鍵字](顯示與“關鍵字”匹配的標記列表,輸入數字跳轉到指定的標記)
:tjump [關鍵字](類似于“:tselect”,但當匹配項只有一個時直接跳轉至標記處而不再顯
示列表)
:tn(跳轉到下一個匹配的標記處)
:tp(跳轉到上一個匹配的標記處)
Ctrl-](跳轉到與光標下的關鍵字匹配的標記處;除“關鍵字”直接從光標位置自動獲得外,功
能與“:tags”相同)
g](與“Ctrl-]”功能類似,但使用的命令是“:tselect”)
g Ctrl-](與“Ctrl-]”功能類似,但使用的命令是“:tjump”)
Ctrl-T(跳轉回上次使用以上命令跳轉前的位置)
?
gf?打開光標處的文件名(必須將當前文件保存后才行)
1.vim?啟動的時候使用?-o?或者?-O?選項,如:?vim [-O|-o] file1 file2 file3
-o?水平分割
-O?垂直分割
會自動根據文件的個數分成幾行或者幾列.
使用?"Ctrl + W"?鍵在多個窗口之間切換.
gi - incredibly handy
goes to Insert mode where you left it last time
總結
以上是生活随笔為你收集整理的Vim文本编辑器 指令大全(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习总结之数据挖掘三大类六分项
- 下一篇: PPT快捷键大全(作分析报告的人有福了)