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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

VIM 使用技巧(常用提取)

發(fā)布時間:2025/3/18 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VIM 使用技巧(常用提取) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
支持中文: 在用戶主目錄中的.vimrc就加入下面二行 let &termencoding=&encoding set fileencodings=utf-8,gbk,ucs-bom,cp936 正文拷到末行: <c-r><c-w> 把正文光標(biāo)處的狹義單詞拷貝到末行當(dāng)前位置 <c-r><c-a>? 把正文光標(biāo)處的廣義單詞拷貝到末行當(dāng)前位置 <c-r>a???????? 把寄存器a中的內(nèi)容拷貝到末行當(dāng)前位置 # 使用寄存器替換
:s/fred/<c-r>a/g ? ? ? ? : sub "fred" with contents of register "a"
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?用"a"寄存器里的內(nèi)容替換"fred"
:s/fred//=@a/g ? ? ? ? ? ? ?: better alternative as register not displayed
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?更好的方法,不用顯示寄存器內(nèi)容 末行特殊替換:

:4,9s/\d\+/\=submatch(0)+1/

第4到9行的數(shù)字加一

:%s/^\w/\=toupper(submatch(0))/g

首字母大寫

:%s/^/\=line(".").". "/g

加行號

* 跳轉(zhuǎn)

/^abc ??

轉(zhuǎn)到以abc開始的行

//

刪除沒有內(nèi)容的空白行:
g/^$/d

刪除包含有空格組成的空白行:
g/^\s*$/d

除以空格或tab開頭到結(jié)尾的空白行:
g/^[ |\t]*$/d

?

??? (6102, '銅川市'),

替換成

??? (6102, 61, '銅川市'),?

s/(\(\d\{2}\)\(.\+\), '/(\1\2, \1, '/g

?:s//和:g//,:!g//


?  :s是替換操作,:g是查找匹配模式的行,:!g是查找不匹配模式的行。

?

前向匹配示例:

?

120100,天津市

120101,天津市市轄區(qū)和平區(qū)
120102,天津市市轄區(qū)河?xùn)|區(qū)
120103,天津轄區(qū)河西區(qū)

以下匹配將除第一行外的"天津市"三個字刪除

:%s/,.\{-}市\(zhòng)($\)\@!/,/g

?

?

  • VIM 對轉(zhuǎn)義字符的處理上有 magic、nomagic、very magic、very nomagic 4種方式,下面提到的是magic下情況。
  • Qt 在貪婪非貪婪是通過額外的選項設(shè)置的,不體現(xiàn)在pattern中
    ?

    Python

    Qt

    VIM

    ?

    字符串開頭

    ^
    \A

    ^

    ^

    vim中,\A代表非字符,與\a即[0-9A-Za-z]對應(yīng)

    字符串結(jié)尾

    $
    \Z

    $

    $

    ?

    單詞邊界

    \b

    \b

    \<
    \>

    vim中\(zhòng)b代表退格,其他[\b]表示退格

    單詞字符

    \w

    \w

    \w

    對于vim,指[0-9A-Za-z_],其他,包含Unicode

    數(shù)字字符

    \d

    \d

    \d

    對vim,指[0-9],其他,包含Unicode數(shù)字字符

    0次或1次

    ?
    ??
    {,1}
    {,1}?
    {0,1}
    {0,1}?

    ?
    {0,1}

    \?
    \=
    \{,1}
    \{-,1}
    \{0,1}
    \{-0,1}

    Python中額外帶問號的是非貪婪模式
    vim中帶負(fù)號的是非貪婪
    ? * +這3種都可以看作{m,n}的特例,后面不再列這么多了

    0次或多次

    *
    *?

    *

    *
    \{}
    \{-}

    ?

    1次或多次

    +
    +?

    +

    \+

    ?

    重復(fù)n次

    {n}

    {n}

    \{n}
    \{-n}

    ?

    n次以上

    {n,}
    {n,}?

    {n,}

    \{n,}
    \{-n,}

    ?

    n到m次

    {n,m}
    {n,m}?

    {n,m}

    \{n,m}
    \{-n,m}

    ?

    子表達(dá)式(分組)

    (...)

    (...)

    \(...\)

    兩種用途,分組以便應(yīng)用重復(fù),回溯引用通過\1\2...

    引用子表達(dá)式

    \number

    \number

    \number

    ?

    只是分組

    (?:...)

    (?:...)

    \%(...\)

    不計算為子表達(dá)式個數(shù),不能回溯

    向前查找(lookahead)

    (?=...)

    (?=...)

    \(...\)\@=
    \&

    比如"zhang(?=800)"找到zhang后要檢查其后是否是800,是則成功。將匹配zhang800而不是zhang801中的zhang

    負(fù)向前查找(negative lookahead)

    (?!...)

    (?!...)

    \(...\)\@!

    同上,只是不是...則成功。"zhang(?=800)"匹配dbzhang801而不是dbzhang800中的zhang

    向后查找(positive lookbehind)

    (?<=...)

    ?

    \(...\)\@<=

    比如"(?<=db)zhang"找到zhang后要檢查其前面是否是db,是則成功。匹配dbzhang而不是debaozhang的zhang.

    負(fù)向后查找(negative lookbehind)

    (?<!...)

    ?

    \(...\)\@<!

    同上,最后,不是...則成功。匹配debaozhang中的zhang

    ?

    //

    Vim中的正則表達(dá)式
    . 匹配任意一個字符 [abc] 匹配方括號中的任意一個字符。可以使用-表示字符范圍,如[a-z0-9]匹配小寫字母和阿拉伯?dāng)?shù)字 [^abc] 在方括號內(nèi)開頭使用^符號,表示匹配除方括號中字符之外的任意字符 \d 匹配阿拉伯?dāng)?shù)字,等同于[0-9] \D 匹配阿拉伯?dāng)?shù)字之外的任意字符,等同于[^0-9] \x 匹配十六進(jìn)制數(shù)字,等同于[0-9A-Fa-f] \X 匹配十六進(jìn)制數(shù)字,等同于[^0-9A-Fa-f] \w 匹配單詞字母,等同于[0-9A-Za-z_] \W 匹配單詞字母之外的任意字符,等同于[^0-9A-Za-z_] \t 匹配<TAB>字符 \s 匹配空白字符,等同于[ \t] \S 匹配非空白字符,等同于[^ \t] \a 所有的字母字符. 等同于[a-zA-Z] \l 小寫字母 [a-z] \L 非小寫字母 [^a-z] \u 大寫字母 [A-Z] \U 非大寫字母 [^A-Z]
    表示數(shù)量的元字符 * 匹配0-任意個 \+ 匹配1-任意個 \? 匹配0-1個 \{n,m} 匹配n-m個 \{n} 匹配n個 \{n,} 匹配n-任意個 \{,m} 匹配0-m個 \_. 匹配包含換行在內(nèi)的所有字符 \{-} 表示前一個字符可出現(xiàn)零次或多次,但在整個正則表達(dá)式可以匹配成功的前提下,匹配的字符數(shù)越少越好(使用“\{-}”來代替“*”,實現(xiàn)非貪婪匹配) \= 匹配一個可有可無的項 \_s 匹配空格或斷行 \_[] \*匹配 * 字符 \.匹配 . 字符 \/匹配 / 字符 \\匹配 \ 字符 \[匹配 [ 字符
    表示位置的符號 $ 匹配行尾 ^ 匹配行首 \< 匹配單詞詞首 \> 匹配單詞詞尾
    替換變量 在正規(guī)表達(dá)式中使用 \( 和 \) 符號括起正規(guī)表達(dá)式,即可在后面使用\1、\2等變量來訪問 \( 和 \) 中的內(nèi)容
    懶惰模式 \{-n,m} 與\{n,m}一樣,盡可能少次數(shù)地重復(fù) \{-} 匹配它前面的項一次或0次, 盡可能地少 \|"或"操作符 \&并列
    函數(shù)式 :s/替換字符串/\=函數(shù)式 在函數(shù)式中可以使用 submatch(1)、submatch(2) 等來引用 \1、\2 等的內(nèi)容,而submatch(0)可以引用匹配的整個內(nèi)容
    與Perl正則表達(dá)式的區(qū)別
    Vim語法 Perl語法 含義 \++1-任意個 \??0-1 \{n,m}{n,m}n-m \(和\)(和)分組
    例如: 1,去掉所有的行尾空 格:“:%s/\s\+$//”。“%”表示在整個文件范圍內(nèi)進(jìn)行替換,“\s”表示空白字符(空格和制表符),“\+”對前面的字符匹配一次或多次(越 多越好),“___FCKpd___0rdquo;匹配行尾(使用“\___FCKpd___0rdquo;表示單純的 “___FCKpd___0rdquo;字符);被替換的內(nèi)容為空;由于一行最多只需替換一次,不需要特殊標(biāo)志。這個還是比較簡單的。 (/<Space><Tab>) 2,去掉所有的空白 行:“:%s/\(\s*\n\)\+/\r/”。這回多了“\(”、“\)”、“\n”、“\r”和 “*”。“*”代表對前面的字符(此處為“\s”)匹配零次或多次(越多越好;使用“\*”表示單純的“*”字符),“\n”代表換行符,“\r”代表回 車符,“\(”和“\)”對表達(dá)式進(jìn)行分組,使其被視作一個不可分割的整體。因此,這個表達(dá)式的完整意義是,把連續(xù)的換行符(包含換行符前面可能有的連續(xù) 空白字符)替換成為一個單個的換行符。唯一很特殊的地方是,在模式中使用的是“\n”,而被替換的內(nèi)容中卻不能使用“\n”,而只能使用“\r”。原因是 歷史造成的,詳情如果有興趣的話可以查看“:help NL-used-for-Nul”。 3,去掉所有的“//”注 釋:“:%s!\ s*//.*!!”。首先可以注意到,這兒分隔符改用了“!”,原因是在模式或字符串部分使用了“/”字符,不換用其他分隔符的話就得在每次使用“/”字 符本身時寫成“\/”,上面的命令得寫成“:%s/\s*\/\/.*//”,可讀性較低。命令本身倒是相當(dāng)簡單,用過正則表達(dá)式的人估計都知道“.”匹 配表示除換行符之外的任何字符吧。 4,去掉所有的“”注 釋:“:%s!\s*/\*\_.\{-}\*/\s*! !g”。這個略有點復(fù)雜了,用到了幾個不太常用的 Vim 正則表達(dá)式特性。“\_.”匹配包含換行在內(nèi)的所有字符;“\{-}”表示前一個字符可出現(xiàn)零次或多次,但在整個正則表達(dá)式可以匹配成功的前提下,匹配的 字符數(shù)越少越好;標(biāo)志“g”表示一行里可以匹配和替換多次。替換的結(jié)果是個空格的目的是保證像“intmain()”這樣的表達(dá)式在替換之后仍然是合法 的。
    :g/^\s*$/d刪除只有空白的行 :s/\(\w\+\)\s\+\(\w\+\)/\2\t\1將 data1 data2 修改為 data2 data1 :%s/\(\w\+\), \(\w\+\)/\2 \1/將 Doe, John 修改為 John Doe :%s/\<id\>/\=line(".")將各行的 id 字符串替換為行號 :%s/\(^\<\w\+\>\)/\=(line(".")-10) .".". submatch(1) 將每行開頭的單詞替換為(行號-10).單詞的格式,如第11行的word替換成1. word

    排序 :/OB/+1,$!sort

    ?

    使用正則表達(dá)式的命令

    使用正則表達(dá)式的命令最常見的就是 / (搜索)命令。其格式如下:

    /正則表達(dá)式

    另一個很有用的命令就是 :s(替換)命令,將第一個//之間的正則表達(dá)式替換成第二個//之間的字符串。

    :s/正則表達(dá)式/替換字符串/選項

    在學(xué)習(xí)正則表達(dá)式時可以利用 / 命令來練習(xí)。

    元字符

    元字符是具有特殊意義的字符。使用元字符可以表達(dá)任意字符行首行尾某幾個字符等意義。

    元字符一覽

    元字符說明
    .匹配任意一個字符
    [abc]匹配方括號中的任意一個字符。可以使用-表示字符范圍,
    [a-z0-9]匹配小寫字母和阿拉伯?dāng)?shù)字。
    [^abc]在方括號內(nèi)開頭使用^符號,表示匹配除方括號中字符之外的任意字符。
    \d匹配阿拉伯?dāng)?shù)字,等同于[0-9]
    \D匹配阿拉伯?dāng)?shù)字之外的任意字符,等同于[^0-9]
    \x匹配十六進(jìn)制數(shù)字,等同于[0-9A-Fa-f]
    \X匹配十六進(jìn)制數(shù)字,等同于[^0-9A-Fa-f]
    \w匹配單詞字母,等同于[0-9A-Za-z_]
    \W匹配單詞字母之外的任意字符,等同于[^0-9A-Za-z_]
    \t匹配<TAB>字符。
    \s匹配空白字符,等同于[ \t]
    \S匹配非空白字符,等同于[^ \t]

    另外,如果要查找字符 *、.、/等,則需要在前面用 \ 符號,表示這不是元字符,而只是普通字符而已。

    元字符說明
    \*匹配 * 字符。
    \.匹配 . 字符。
    \/匹配 / 字符。
    \\匹配 \ 字符。
    \[匹配 [ 字符。

    表示數(shù)量的元字符

    元字符說明
    *匹配0-任意個
    \+匹配1-任意個
    \?匹配0-1個
    \{n,m}匹配n-m個
    \{n}匹配n個
    \{n,}匹配n-任意個
    \{,m}匹配0-m個

    表示位置的符號

    元字符說明
    $匹配行尾
    ^匹配行首
    \<匹配單詞詞首
    \>匹配單詞詞尾

    使用例

    /char\s\+[A-Za-z_]\w*; " 查找所有以char開頭,之后是一個以上的空白," 最后是一個標(biāo)識符和分號 /\d\d:\d\d:\d\d " 查找如 17:37:01 格式的時間字符串 :g/^\s*$/d " 刪除只有空白的行 :s/\<four\>/4/g " 將所有的four替換成4,但是fourteen中的four不替換

    替換變量

    在正規(guī)表達(dá)式中使用 \(\) 符號括起正規(guī)表達(dá)式,即可在后面使用\1\2等變量來訪問\(\) 中的內(nèi)容。

    使用例

    /\(a\+\)[^a]\+\1 " 查找開頭和結(jié)尾處a的個數(shù)相同的字符串," 如 aabbbaa,aaacccaaa,但是不匹配 abbbaa :s/\(http:\/\/[-a-z\._~\+%\/]\+\)/<a href="\1">\1<\/a>/ " 將URL替換為<a href="http://url">http://url</a>的格式 :s/\(\w\+\)\s\+\(\w\+\)/\2\t\1 " 將 data1 data2 修改為 data2 data1

    函數(shù)式

    在替換命令 s/// 中可以使用函數(shù)表達(dá)式來書寫替換內(nèi)容,格式為

    :s/替換字符串/\=函數(shù)式

    在函數(shù)式中可以使用 submatch(1)、submatch(2) 等來引用 \1\2 等的內(nèi)容,而submatch(0)可以引用匹配的整個內(nèi)容。

    使用例

    :%s/\<id\>/\=line(".") " 將各行的 id 字符串替換為行號 :%s/^\<\w\+\>/\=(line(".")-10) .".". submatch(1) " 將每行開頭的單詞替換為 (行號-10).單詞 的格式," 如第11行的 word 替換成 1. word

    與Perl正則表達(dá)式的區(qū)別

    元字符的區(qū)別

    Vim語法Perl語法含義
    \++1-任意個
    \??0-1個
    \{n,m}{n,m}n-m個
    \(和\)(和)分組

    ?

    ?

/ 讀本文之前請注意: 1. 本文的目標(biāo)是提供一些vim的使用技巧,利用這些技巧可以提高vim的操作效率。部分技巧在vi上也可以使用,但是現(xiàn)在基本上都是用vim了。 2. 本文是整理和總結(jié)使用技巧,而非講解vim入門,因此不會涉及最基本的使用,例如如何上移或下移光標(biāo),對此類操作請參閱任何一本vim或者vi教程。 3. 本文閱讀對象是了解了vim的基本操作,而希望高效地利用vim進(jìn)行工作的人。熟練使用vim的人自然不必細(xì)讀,如果能留下您的寶貴意見,本人將感激不盡。 4. 本文由本人搜集整理,轉(zhuǎn)載請注明出處 本文一般情況下用<C-字母>(里邊的字母一般大小寫無所謂,除非特別注明)表示按住ctrl同時按下相關(guān)字母,命令前加一個i表示在插入模式下用這個命令 1. 選定文字 / 拷貝粘貼 v為可視模式,可以選定多行。選定多行之后,可以用yy或者dd等等進(jìn)行拷貝和剪切。
p 是粘貼
y 和d 可以直接拷貝或者剪切選定的內(nèi)容
yw是拷貝一個單詞
如果要復(fù)制整行的最簡單辦法就是V,y,p 就行了
v是可以選定一行任意個字符的,V是行選定的,一次一整行,然后通過向下或向上移動光標(biāo)而選定多行。
對于v選定的,拷貝后就是這么多,選多少就拷貝多少,而V選定的,粘貼的話會自動換到下一行
<C-V>命令模式下,也是塊選定,不過是列塊選定 2. 折疊代碼 可以zf進(jìn)行折疊, 用zo打開折疊,也可以方向鍵向右打開折疊,zc 關(guān)閉折疊(只要在被折疊的塊中的任一個語句就行)
3. 縮進(jìn)代碼
<是左縮進(jìn), >是右縮進(jìn)
按v選定后按=就是自動格式化代碼,自動縮進(jìn),內(nèi)部的遞歸的縮進(jìn)都做到了
行左移<<,行右移>>,該命令用于調(diào)整源碼縮進(jìn)格式簡便快速。
4. 移動光標(biāo) %是從大括號的開始移動到大括號的結(jié)束位置
:后邊加行號就是跳到這一行
<C-O>??? 光標(biāo)返回到以前的位置。相當(dāng)于光標(biāo)移動的“撤銷”
<C-I>??? 光標(biāo)返回到后來的位置。相當(dāng)于光標(biāo)移動的“恢復(fù)”
5. 多文件編輯 / 緩沖區(qū)命令
vim下每一個打開的文件對應(yīng)一個緩沖區(qū)(buffer)。
多文件編輯會有兩種情形,一種是在進(jìn)入 vim 前所用的參數(shù)就是多個文件(這種情形稱為 argument list)。另一種情形是進(jìn)入 vim 后另外再開其它的文件(稱為 buffer list)。不過都可以統(tǒng)稱為buffer。 5.1 打開文件 vi flname1 flname2… flnameN
將多個文件調(diào)入緩沖,是 argument list。
:e filename
這是在進(jìn)入 vim 后,在不離開 vim 的情形下再開其它文件,只要您要編輯的檔案是在目前目錄,Tab 補(bǔ)全鍵還是可以使用。是buffer list。
注意::e 或者:new 或者:split 后邊可以跟目錄,這樣就可以在目錄下慢慢找要打開的文件了
5.2 緩沖區(qū)跳轉(zhuǎn) :n?? 編輯下一個文件。
:2n 編輯下二個文件。
:N?? 編輯前一個文件。注意,這種用法只能用于 argument list 的情形。 :rew 回到首文件
:args 查看當(dāng)前編輯緩沖文件狀態(tài) :e# 或 Ctrl-^?? 編輯前一個檔案,用于兩文件互相編輯時相當(dāng)好用。這種用法不管是 argument list 或buffer list 檔案間皆可使用。 使用Ctrl-^ 命令更便捷,但如終端類型不正確該功能將無效。 用:ls來顯示緩沖區(qū)中的文件,編號后邊有#的代表是前一個文件,可以通過:e#來進(jìn)入,有%a的代表是當(dāng)前文件,什么也沒有的可以通過:bn來進(jìn)入,這里的n代表文件編號。
:b文件名或編號?? 移至該文件。
在 :ls 中就會出示各文件的編號,這個編號在未離開 vim 前是不會變的。這個指令 elvis 也是可以使用。當(dāng)然 :e#編號 也是可以的,這樣的用法則是所有 vi clone 都通用了。 在 buffers 中,減號 - 表示這個 buffer 并未載入,不過,不必?fù)?dān)心,載入相當(dāng)快速的。加號 + 表示這個 buffer 已經(jīng)修改過了。 :bn?? buffer next。這里的n代表字母n
:bl?? buffer last。
以上兩個指令 elvis 不適用。 如果您是使用 vim 的 GUI,那就在菜單上就會有 Buffers 這個選項,可以很容易的知道及移動各buffer 間。 5.3 移除緩沖區(qū) :bd(elete)?? buffer 在未離開 vim 前是不會移除的,可使用這個指令移除。其實移除它干什么呢?vim是您在叫用時才會載入的,因此這些 buffers 并不是像 cache 一般要占內(nèi)存的。
5.4 重新編輯 放棄一修改過的文件,重新編輯。
(1)使用命令 :q!強(qiáng)行退出后再vi flname重新進(jìn)入。
(2)使用命令 :e!強(qiáng)行重編輯更便捷。這樣也是會打開文件,但會放棄目前編輯文件的改變,否則如果文件已有變動,vim 預(yù)設(shè)是不讓您隨便離開的。:e! 后不接什么的話,代表舍棄一切修改,重新載入編輯中文件。 5.5 其他命令
:files 或 :buffers 或 :ls?? 會列出目前 buffer 中的所有文件。
在 elvis 中可使用 :b 來叫出 buffers。
:f 或 Ctrl-g?? 顯示目前編輯的文件名、是否經(jīng)過修改及目前光標(biāo)所在之位置。
:f 文件名?? 改變編輯中的文件名。(file)
:r 文件名?? 在光標(biāo)所在處插入一個文件的內(nèi)容。(read)
:35 r 文件名?? 將文件插入至 35 行之后。
gf?? 這是 vim 的特殊打開文件的方法,會打開光標(biāo)所在處的 word 為名的文件,當(dāng)然,這個文件要在當(dāng)前目錄內(nèi),否則會創(chuàng)建新文件。 6. 查找命令 用/查找單詞后,n可以跳到下一個,N則是上一個,:nohls可以取消高亮
查找時,:set ignorecase”項讓VIM忽略大小寫,“:set noignorecase” 來關(guān)閉這項功能。 7. 修改文字 cw:刪除一個單詞并進(jìn)入插入模式,cc:刪除一行并進(jìn)入插入模式。
r:然后輸入的字母將替換當(dāng)前字母并保持命令模式,R則是不停的替換(一個挨著一個)。
0到行首,$到行尾。 8. 函數(shù)間跳轉(zhuǎn)
ctrl+]和ctrl+T分別是查找函數(shù)的定義和返回,好像需要ctag的支持
<C-W>i?? 跳轉(zhuǎn)到光標(biāo)所指標(biāo)識符的定義行,是打開一個新的小窗口顯示,記住要加個i,最好是找自己項目下的文件,否則找?guī)旌瘮?shù)的話還不如man.
大寫 K??????? 看光標(biāo)所指標(biāo)識符的 man 幫助頁
9. 窗口命令
<C-W> = ctrl+w
:split 文件名 同時在一個頁面顯示多個文件的內(nèi)容,類似多窗口,用<C-W><C-W>切換當(dāng)前窗口
<C-W>f?? 切分顯示光標(biāo)在處的文件名,VIM 會在 path 中搜索該文件名,比如常用它打開 #include 語句中的文件
<C-W>_?? 當(dāng)同時打開幾個文件時,按 <C-W>_ 使當(dāng)前窗口最大化
用Ctrl-W命令指定光標(biāo)移動:
????? Ctrl-W +?????? 擴(kuò)大窗口
????? Ctrl-W -?????? 縮小窗口
????? Ctrl-W h?????? 移動到窗口左邊
????? Ctrl-W j?????? 移動到窗口下邊
????? Ctrl-W k?????? 移動到窗口上邊
????? Ctrl-W l?????? 移動到窗口右邊
等于是<C-W>按下后,松開鍵盤,再按下一個命令就可以了.
如果要關(guān)閉分割窗口可以用:close,剩下只有一個窗口的話就不能關(guān)了。
多窗口是split,像用e打開多個文件是將文件放在緩沖區(qū)中。
10. 自動完成 i<C-P>?? 向上搜索,補(bǔ)全一個詞
i<C-N>?? 向下搜索,補(bǔ)全一個詞
i<C-X><C-L> 補(bǔ)全一行。
比如你寫過一行 for (int i = 0; i < 100; i++),你想再寫一模一樣的一行,只要輸入 for<C-X><C-L>即可。如果補(bǔ)全出來的不是你想要的那一行,你可以按 <C-P> 或 <C-N> 選擇上一個或下一個匹配行i<C-X><C-F>?? 在文件系統(tǒng)中搜索,補(bǔ)全一個文件名
如果按 <C-P> 或 <C-N> 補(bǔ)全一個詞,在當(dāng)前文件中沒有找到匹配,VIM 將搜索 #include 語句中的文件,而文件的位置將在 path 中搜索。
i<C-Y>?? 把上一行對應(yīng)列的字符抄下來
i<C-E>?? 把下一行對應(yīng)列的字符抄上來,這兩個都可以一直按下去,到了行尾自己會停的.
11. 注釋整塊內(nèi)容 注釋塊的方法:
<C-V> 選定要注釋掉的行?? I?? //?? Esc
I之后輸入的東西就是插入到選定的行前邊的,直至Esc.
要去掉注釋的辦法:<C-V>選定注釋符//,然后d
列塊選定后I是在前邊都插入,A是在后邊都插入
<C-V>是按列塊模式的選定,<shift-V>是行選定,v是普通選定 12. 其他命令

u可以撤銷上一步操作, ctrl+r可以恢復(fù)
i<C-O>命令執(zhí)行一個普通模式的命令,執(zhí)行完畢后回到插入模式,不用多次Esc
i<C-V>后續(xù)字符?? 輸入特殊的 ASCII 字符或鍵。
.??????? 在光標(biāo)當(dāng)前位置處重復(fù)上一次操作
:!命令行???????? 執(zhí)行一條外部命令
***********************************************************************************
我是 vim 粉絲, 用了許久, 有一些自己的感受, 又到處挖到一些別人的技巧. 感覺對 vim 粉絲比較有用, 就把它記在這兒. 希望借此文套出大家自己的巧活, 就正應(yīng)了拋磚引玉的古話了.

先稍為介紹一下 vim. vi 是 unix/linux 下極為普遍的一種文本編輯器, 大部分機(jī)器上都有. vi 有各種變種, 在不同的機(jī)器上常用不同的變種軟件. 其中 vim 比較好用也用得比較廣泛. vim 是 Vi IMproved 的縮寫, 表示更好的 vi. 我個人覺得它是非常好的編輯器(為了避免 Emacs 粉絲挑眼, 就不說最好了). 沒用過的也建議試試看, 當(dāng)然 vim 對編寫文本文件很方便好用, 比如編寫程序, html文檔等等, 卻不能用來編寫 word 文檔.

關(guān)于 vim 的安裝, 基本使用方法等網(wǎng)絡(luò)上能搜出許多, 就不在這里羅嗦了, 要是對 vim 有興趣, 那就看看這里(中文文檔): http://vcd.gro.clinux.org/

本文就說些其中比較有用, 比較常用的命令, 若能熟練運用這些命令, 那么會發(fā)現(xiàn)編輯文件很舒服.

說明:
以下的例子中 xxx 表示在命令模式下輸入 xxx 并回車
以下的例子中 :xxx 表示在擴(kuò)展模式下輸入 xxx 并回車
小括號中的命令表示相關(guān)命令.
在編輯模式或可視模式下輸入的命令會另外注明.

1. 查找

?? /xxx(?xxx)?????? 表示在整篇文檔中搜索匹配xxx的字符串, / 表示向下查找, ? 表示
?????????????????? 向上查找.其中xxx可以是正規(guī)表達(dá)式,關(guān)于正規(guī)式就不多說了.
?????????????????? 一般來說是區(qū)分大小寫的, 要想不區(qū)分大小寫, 那得先輸入
?????????????????? :set ignorecase
?????????????????? 查找到以后, 再輸入 n 查找下一個匹配處, 輸入 N 反方向查找.

?? *(#)???????????? 當(dāng)光標(biāo)停留在某個單詞上時, 輸入這條命令表示查找與該單詞匹配的
?????????????????? 下(上)一個單詞. 同樣, 再輸入 n 查找下一個匹配處, 輸入 N 反方
?????????????????? 向查找.

?? g*(g#)?????????? 此命令與上條命令相似, 只不過它不完全匹配光標(biāo)所在處的單詞, 而
?????????????????? 是匹配包含該單詞的所有字符串.

?? gd?????????????? 本命令查找與光標(biāo)所在單詞相匹配的單詞, 并將光標(biāo)停留在文檔的非
?????????????????? 注釋段中第一次出現(xiàn)這個單詞的地方.

?? %??????????????? 本命令查找與光標(biāo)所在處相匹配的反括號, 包括 () [] {}

?? f(F)x??????????? 本命令表示在光標(biāo)所在行進(jìn)行查找, 查找光標(biāo)右(左)方第一個x字符.
?????????????????? 找到后:
?????????????????? 輸入 ; 表示繼續(xù)往下找
?????????????????? 輸入 , 表示反方向查找

2. 快速移動光標(biāo)
??? 在 vi 中, 移動光標(biāo)和編輯是兩件事, 正因為區(qū)分開來, 所以可以很方便的進(jìn)行光標(biāo)定
位和編輯. 因此能更快一點移動光標(biāo)是很有用的.

?? w(e)???????????? 移動光標(biāo)到下一個單詞.
?? b??????????????? 移動光標(biāo)到上一個單詞.

?? 0??????????????? 移動光標(biāo)到本行最開頭.
?? ^??????????????? 移動光標(biāo)到本行最開頭的字符處.
?? $??????????????? 移動光標(biāo)到本行結(jié)尾處.

?? H??????????????? 移動光標(biāo)到屏幕的首行.
?? M??????????????? 移動光標(biāo)到屏幕的中間一行.
?? L??????????????? 移動光標(biāo)到屏幕的尾行.
?? gg?????????????? 移動光標(biāo)到文檔首行.
?? G??????????????? 移動光標(biāo)到文檔尾行.
?? c-f????????????? (即 ctrl 鍵與 f 鍵一同按下) 本命令即 page down.
?? c-b????????????? (即 ctrl 鍵與 b 鍵一同按下, 后同) 本命令即 page up.

?? ''?????????????? 此命令相當(dāng)有用, 它移動光標(biāo)到上一個標(biāo)記處, 比如用 gd, * 等查
?????????????????? 找到某個單詞后, 再輸入此命令則回到上次停留的位置.

?? '.?????????????? 此命令相當(dāng)好使, 它移動光標(biāo)到上一次的修改行.

?? `.?????????????? 此命令相當(dāng)強(qiáng)大, 它移動光標(biāo)到上一次的修改點.

3. 拷貝, 刪除與粘貼
??? 在 vi 中 y 表示拷貝, d 表示刪除, p 表示粘貼. 其中拷貝與刪除是與光標(biāo)移動命令
結(jié)合的, 看幾個例子就能夠明白了.

?? yw?????????????? 表示拷貝從當(dāng)前光標(biāo)到光標(biāo)所在單詞結(jié)尾的內(nèi)容.
?? dw?????????????? 表示刪除從當(dāng)前光標(biāo)到光標(biāo)所在單詞結(jié)尾的內(nèi)容.
?? y0?????????????? 表示拷貝從當(dāng)前光標(biāo)到光標(biāo)所在行首的內(nèi)容.
?? d0?????????????? 表示刪除從當(dāng)前光標(biāo)到光標(biāo)所在行首的內(nèi)容.
?? y$?????????????? 表示拷貝從當(dāng)前光標(biāo)到光標(biāo)所在行尾的內(nèi)容.
?? d$?????????????? 表示刪除從當(dāng)前光標(biāo)到光標(biāo)所在行尾的內(nèi)容.
?? yfa????????????? 表示拷貝從當(dāng)前光標(biāo)到光標(biāo)后面的第一個a字符之間的內(nèi)容.
?? dfa????????????? 表示刪除從當(dāng)前光標(biāo)到光標(biāo)后面的第一個a字符之間的內(nèi)容.

?? 特殊地:
?? yy?????????????? 表示拷貝光標(biāo)所在行.
?? dd?????????????? 表示刪除光標(biāo)所在行.
?? D??????????????? 表示刪除從當(dāng)前光標(biāo)到光標(biāo)所在行尾的內(nèi)容.

?? 關(guān)于拷貝, 刪除和粘貼的復(fù)雜用法與寄存器有關(guān), 可以自行查詢.

4. 數(shù)字與命令
??? 在 vi 中數(shù)字與命令結(jié)合往往表示重復(fù)進(jìn)行此命令, 若在擴(kuò)展模式的開頭出現(xiàn)則表示行
號定位. 如:

?? 5fx????????????? 表示查找光標(biāo)后第 5 個 x 字符.

?? 5w(e)??????????? 移動光標(biāo)到下五個單詞.

?? 5yy????????????? 表示拷貝光標(biāo)以下 5 行.
?? 5dd????????????? 表示刪除光標(biāo)以下 5 行.

?? y2fa???????????? 表示拷貝從當(dāng)前光標(biāo)到光標(biāo)后面的第二個a字符之間的內(nèi)容.

?? :12,24y????????? 表示拷貝第12行到第24行之間的內(nèi)容.
?? :12,y??????????? 表示拷貝第12行到光標(biāo)所在行之間的內(nèi)容.
?? :,24y??????????? 表示拷貝光標(biāo)所在行到第24行之間的內(nèi)容. 刪除類似.

5. 快速輸入字符
??? 在 vi 中, 不要求你輸入每一個字符, 可以有很多種方法快速輸入一些字符.
??? 使用 linux/unix 的同學(xué)一定有一個經(jīng)驗, 在命令行下輸入命令時敲入頭幾個字符再按
TAB 系統(tǒng)就會自動將剩下的字符補(bǔ)齊, 假如有多個匹配則會打印出來. 這就是著名的命令
補(bǔ)齊(其實windows中也有文件名補(bǔ)齊功能). vi 中有許多的字符串補(bǔ)齊命令, 非常方便.

?? c-p(c-n)???????? 在編輯模式中, 輸入幾個字符后再輸入此命令則 vi 開始向上(下)搜
?????????????????? 索開頭與其匹配的單詞并補(bǔ)齊, 不斷輸入此命令則循環(huán)查找. 此命令
?????????????????? 會在所有在這個 vim 程序中打開的文件中進(jìn)行匹配.

?? c-x-l??????????? 在編輯模式中, 此命令快速補(bǔ)齊整行內(nèi)容, 但是僅在本窗口中出現(xiàn)的
?????????????????? 文檔中進(jìn)行匹配.

?? c-x-f??????????? 在編輯模式中, 這個命令表示補(bǔ)齊文件名. 如輸入:
?????????????????? /usr/local/tom 后再輸入此命令則它會自動匹配出:
?????????????????? /usr/local/tomcat/

?? abbr???????????? 即縮寫. 這是一個宏操作, 可以在編輯模式中用一個縮寫代替另一個
?????????????????? 字符串. 比如編寫java文件的常常輸入 System.out.println, 這很
?????????????????? 是麻煩, 所以應(yīng)該用縮寫來減少敲字. 可以這么做:
?????????????????? :abbr sprt System.out.println
?????????????????? 以后在輸入sprt后再輸入其他非字母符號, 它就會自動擴(kuò)展為System.
?????????????????? out.println

6. 替換
??? 替換是 vi 的強(qiáng)項, 因為可以用正規(guī)表達(dá)式來匹配字符串.以下提供幾個例子.

?? :s/aa/bb/g?????? 將光標(biāo)所在行出現(xiàn)的所有包含 aa 的字符串中的 aa 替換為 bb
?? :s//<aa/>/bb/g?? 將光標(biāo)所在行出現(xiàn)的所有 aa 替換為 bb, 僅替換 aa 這個單詞
?? :%s/aa/bb/g????? 將文檔中出現(xiàn)的所有包含 aa 的字符串中的 aa 替換為 bb
?? :12,23s/aa/bb/g 將從12行到23行中出現(xiàn)的所有包含 aa 的字符串中的 aa 替換為 bb
?? :12,23s/^/#/???? 將從12行到23行的行首加入 # 字符
?? :%s= *$==??????? 將所有行尾多余的空格刪除
?? :g/^/s*$/d??????? 將所有不包含字符(空格也不包含)的空行刪除.

7. 多文件編輯
??? 在一個 vim 程序中打開很多文件進(jìn)行編輯是挺方便的.

?? :sp(:vsp) 文件名???? vim 將分割出一個橫(縱)向窗口, 并在該窗口中打開新文件.
?????????????????????? 從 vim6.0 開始, 文件名可以是一個目錄的名稱, 這樣, vim 會
?????????????????????? 把該目錄打開并顯示文件列表, 在文件名上按回車則在本窗口打
?????????????????????? 開該文件, 若輸入 O 則在新窗口中打開該文件, 輸入 ? 可以看
?????????????????????? 到幫助信息.

?? :e 文件名??????????? vim 將在原窗口中打開新的文件, 若舊文件編輯過, 會要求保存.

?? c-w-w??????????????? vim 分割了好幾個窗口怎么辦? 輸入此命令可以將光標(biāo)循環(huán)定位
?????????????????????? 到各個窗口之中.

?? :ls????????????????? 此命令查看本 vim 程序已經(jīng)打開了多少個文件, 在屏幕的最下方
?????????????????????? 會顯示出如下數(shù)據(jù):
?????????????????????? 1??? %a?????? "usevim.html"????????? 行 162
?????????????????????? 2??? #??????? "xxxxxx.html"????????? 行 0

?????????????????????? 其中:
?????????????????????? 1??????????????? 表示打開的文件序號, 這個序號很有用處.
?????????????????????? %a?????????????? 表示文件代號, % 表示當(dāng)前編輯的文件,
?????????????????????????????????????? # 表示上次編輯的文件
?????????????????????? "usevim.html"??? 表示文件名.
?????????????????????? 行 162?????????? 表示光標(biāo)位置.

?? :b 序號(代號)??????? 此命令將指定序號(代號)的文件在本窗口打開, 其中的序號(代號)
?????????????????????? 就是用 :ls 命令看到的.

?? :set diff??????????? 此命令用于比較兩個文件, 可以用
?????????????????????? :vsp filename
?????????????????????? 命令打開另一個文件, 然后在每個文件窗口中輸入此命令,就能看
?????????????????????? 到效果了.

8. 宏替換
??? vi 不僅可以用 abbr 來替換文字, 也可以進(jìn)行命令的宏定義. 有些命令輸起來很費勁,
因此我把它們定義到 <F1>-<F12> 上, 這樣就很方便了.這些配置可以預(yù)先寫到 ~/.vimrc
(windows 下為 $VIM/_vimrc) 中, 寫進(jìn)去的時候不用寫前面的冒號.

?? :nmap <F2> :nohls<cr>?????????????? 取消被搜索字串的高亮
?? :nmap <F9> <C-W>w?????????????????? 命令模式下轉(zhuǎn)移光標(biāo)到不同窗口
?? :imap <F9> <ESC><F9>??????????????? 輸入模式下運行<F9>
?? :nmap <F12> :%s= *$==<cr>?????????? 刪除所有行尾多余的空格.
?? :imap <F12> <ESC><F12>????????????? 同上

?? :java 中: (注, 這里為什么說 java 中, 因為以下定義對其他文件格式不起作用, 下文
???????????? 會說到如何實現(xiàn)這一點)
?? :nmap <F3> :comp javac<CR>:mak -d . %<CR>
??????? 此命令用 javac 編譯 java 文件, 它會自動將光標(biāo)定位到出錯點. 不過這需要定
??????? 義一個 javac.vim 文件在 $VIM/compiler 下, 在 javac.vim 里面只有兩行字:
?????????? setlocal makeprg=javac
?????????? setlocal errorformat=%A%f:%l:/ %m,%-Z%p^,%-C%.%#

?? :nmap <F4> :comp ant<CR>:mak<CR>
??????? 此命令用 ant 編譯 java 文件, 它會自動將光標(biāo)定位到出錯點. 一般來說, 安裝
??????? vim 后已經(jīng)有了compiler/ant.vim文件, 因此這個命令可以直接使用. 但是需要
??????? 在當(dāng)前目錄下有 build.xml 文件, 當(dāng)然還必須安裝 ant 才行.

?? :nmap <F5> :cl<CR>????????????????? 此命令用于查看所有的編譯錯誤.
?? :imap <F5> <ESC><F5>

?? :nmap <F6> :cc<CR>????????????????? 此命令用于查看當(dāng)前的編譯錯誤.
?? :imap <F6> <ESC><F6>

?? :nmap <F7> :cn<CR>????????????????? 此命令用于跳到下一個出錯位置.
?? :imap <F7> <ESC><F7>

?? :nmap <F8> :cp<CR>????????????????? 此命令用于跳到上一個出錯位置.
?? :imap <F8> <ESC><F8>

?? :nmap <F11> :JavaBrowser<cr>
??????? 此命令用于在窗口左部分割出一個新窗口, 里面的內(nèi)容是 java 的資源樹, 包括
??????? 本文件中出現(xiàn)的類, 類的成員變量及成員方法, 就好像 JCreator 表現(xiàn)的那樣.
??????? 在這個窗口中輸入 ? 會看到幫助. 嘿嘿, 很好用, 不過需要 ctags 支持.
?? :imap <F11> <ESC><F11>

9. TAB
??? TAB 就是制表符, 單獨拿出來做一節(jié)是因為這個東西確實很有用.

??? <<?????????????????? 輸入此命令則光標(biāo)所在行向左移動一個 tab.
??? >>?????????????????? 輸入此命令則光標(biāo)所在行向右移動一個 tab.
??? 5>>????????????????? 輸入此命令則光標(biāo)后 5 行向右移動一個 tab.
??? :12,24>????????????? 此命令將12行到14行的數(shù)據(jù)都向右移動一個 tab.
??? :12,24>>???????????? 此命令將12行到14行的數(shù)據(jù)都向右移動兩個 tab.

??? 那么如何定義 tab 的大小呢? 有人愿意使用 8 個空格位, 有人用4個, 有的用2個.
??? 有的人希望 tab 完全用空格代替, 也有的人希望 tab 就是 tab. 沒關(guān)系, vim 能
??? 幫助你.以下的設(shè)置一般也都先寫入配置文件中, 免得老敲.

??? :set shiftwidth=4??? 設(shè)置自動縮進(jìn) 4 個空格, 當(dāng)然要設(shè)自動縮進(jìn)先.
??? :set sts=4?????????? 即設(shè)置 softtabstop 為 4. 輸入 tab 后就跳了 4 格.
??? :set tabstop=4?????? 實際的 tab 即為 4 個空格, 而不是缺省的 8 個.
??? :set expandtab?????? 在輸入 tab 后, vim 用恰當(dāng)?shù)目崭駚硖畛溥@個 tab.

10. autocmd
???? 這個命令十分的強(qiáng)大, 可以用這個命令實現(xiàn)對不同的文件格式應(yīng)用不同的配置; 可以
在新建文件時自動添加上版權(quán)聲明等等. 這些命令一般定義在 ~/.vimrc 這樣的配置文件
里面. 由于他很強(qiáng)大, 所以我不能給出很具體的說明, 只能舉幾個例子, 詳細(xì)的請看幫助.

?? :autocmd!??????????????? 刪除所有之前的自動命令.
?? autocmd FileType???????? java?? source ~/.vim/files/java.vim
?? autocmd FileType???????? java?? source ~/.vim/files/jcommenter.vim
???? 以上兩條命令讓我在打開 java 文件時才應(yīng)用后面提到的兩個配置文件.
?? autocmd BufNewFile?????? *.java?? 0r ~/.vim/files/skeletons/java.skel
???? 以上這條命令讓我在新建 java 文件時自動加入 java.skel 文件的內(nèi)容.
?? autocmd BufNewFile?????? *.java?? normal gnp
???? 以上這條命令讓我在新建 java 文件時自動運行 gnp 命令, 這個命令進(jìn)行一些特殊化
???? 處理, 比如將新 java 文件中的 __date__ 替換成今天的日期什么的.

11. 常用腳本
???? 在 vim.sf.net 你可以發(fā)現(xiàn)很多腳本(script), 這些腳本常常有讓你意想不到的作用.
我常用的有:

???? jcommenter.vim???????? 自動加入 javadoc 風(fēng)格的注釋.
???? JBrowser.vim?????????? 類資源瀏覽. C, C++ 等可以用 Tlist

???? 還有許多有用的, 比如 checkstyle.vim 可以檢驗?zāi)愕木幊田L(fēng)格, jad.vim 可以直接
???? 反編譯 .class 文件等等.

12. 常用配置
???? 在~/.vimrc 配置文件中你常常需要一些個性化配置. 比如上面寫的一些宏定義, 一些
autocmd 定義等等. 比如:

???? set suffixes=.bak,~,.o,.h,.info,.swp,.aux,.bbl,.blg,.dvi,.lof,.log,.lot,.ps,.toc
???????? 這樣在vim中打開文件時, 按 tab 鍵補(bǔ)齊文件名時它會忽略上述文件.

???? set nu?????????? 顯示行號
???? set ai?????????? 設(shè)置自動縮進(jìn)
???? map Y y$???????? 讓 Y 和 D 一樣, 要不然 Y 的本意和 yy 一樣.

13. 其他
???? 還有許多有意思的命令, 記錄在這里免得忘記.

???? .??????????????????????????????????????????????? 重復(fù)上次編輯命令.
???? :g/^/exec "s/^/".strpart(line(".")." ", 0, 4)??? 在行首插入行號
???? :runtime! syntax/2html.vim?????????????????????? 轉(zhuǎn)換 txt 成 html, 會按照你的顏色配置來轉(zhuǎn)

?

轉(zhuǎn)自:http://school.cfan.com.cn/system/unix/2009-07-01/1246421436d214852.shtml

總結(jié)

以上是生活随笔為你收集整理的VIM 使用技巧(常用提取)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。