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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Vim文本编辑器 指令大全(二)

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

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