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?keyword(跳轉到與“keyword”匹配的標記處)
:tselect [keyword](顯示與“keyword”匹配的標記列表,輸入數字跳轉到指定的標記)
:tjump [keyword](類似于“:tselect”,但當匹配項僅僅有一個時直接跳轉至標記處而不再顯
示列表)
:tn(跳轉到下一個匹配的標記處)
:tp(跳轉到上一個匹配的標記處)
Ctrl-](跳轉到與光標下的keyword匹配的標記處。除“keyword”直接從光標位置自己主動獲得外,功
能與“: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
轉載于:https://www.cnblogs.com/hrhguanli/p/5048543.html
總結
以上是生活随笔為你收集整理的Vim文本编辑器 指令簿(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 命令tf,Linux文件管理
- 下一篇: 排错“未能封送类型,因为嵌入数组实例的长