日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Vim文本编辑器 指令簿(二)

發布時間:2023/12/10 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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文本编辑器 指令簿(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。