vi/vim命令大全

2022-03-17 11:23 更新

常用指令收集

  • 系統(tǒng)時(shí)間(在光標(biāo)之后追加當(dāng)前的日期和時(shí)間) :  map <F7> a<C-R>=strftime("%c")<CR><esc>
  • 系統(tǒng)時(shí)間(將__date__替換成當(dāng)前日期,使用strftime函數(shù)):s/__date__/\=strftime("%c")/

基礎(chǔ)命令

  • ctrl+q              可以聯(lián)合復(fù)制,粘貼,替換用 行操作
  • ctrl+w+j ctrl+w+k (:bn :bp :bd)
  • '.                  它移動(dòng)光標(biāo)到上一次的修改行  
  • `.                  它移動(dòng)光標(biāo)到上一次的修改點(diǎn)
  •   .                   重復(fù)上次命令
  •    <C-O> :             依次沿著你的跳轉(zhuǎn)記錄向回跳 (從最近的一次開(kāi)始)
  •  <C-I> :             依次沿著你的跳轉(zhuǎn)記錄向前跳
  • ju(mps) :           列出你跳轉(zhuǎn)的足跡
  • :history :          列出歷史命令記錄
  • :his c :            命令行命令歷史
  • :his s :            搜索命令歷史
  • q/ :                搜索命令歷史的窗口
  • q: :                命令行命令歷史的窗口
  • g ctrl+g            計(jì)算文件字符
  • {,}                 前進(jìn)至上一段落前進(jìn)至后一段落
  • gg,G(2G)            文件首
  • gd dw gf ga(進(jìn)制轉(zhuǎn)化)
  • gg=G 全篇自動(dòng)縮進(jìn) , =G 單行縮進(jìn)
  • * ci[ 刪除一對(duì) [] 中的所有字符并進(jìn)入插入模式
  • * ci( 刪除一對(duì) () 中的所有字符并進(jìn)入插入模式
  • * ci< 刪除一對(duì) <> 中的所有字符并進(jìn)入插入模式
  • * ci{ 刪除一對(duì) {} 中的所有字符并進(jìn)入插入模式
  • * cit 刪除一對(duì) HTML/XML 的標(biāo)簽內(nèi)部的所有字符并進(jìn)入插入模式
  • * ci” ci’ ci` 刪除一對(duì)引號(hào)字符 (” 或 ‘ 或 `) 中所有字符并進(jìn)入插入模式
  • * vi[ 選擇一對(duì) [] 中的所有字符
  • * vi( 選擇一對(duì) () 中的所有字符
  • * vi< 選擇一對(duì) <> 中的所有字符
  • * vi{ 選擇一對(duì) {} 中的所有字符
  • * vit 選擇一對(duì) HTML/XML 的標(biāo)簽內(nèi)部的所有字符
  • * vi” vi’ vi` 選擇一對(duì)引號(hào)字符 (” 或 ‘ 或 `) 中所有字符
  • crl+] 函數(shù)原型處 crl+t 回 ( ctags )
  • ctl+p 自動(dòng)補(bǔ)全( 編輯狀態(tài) )
  • :X 加密保存( 要輸入密碼 )
  • ? /         (N n)
  • f(F,t) 查找字符
  •  w(e) 移動(dòng)光標(biāo)到下一個(gè)單詞.
  • 5fx 表示查找光標(biāo)后第 5 個(gè) x 字符.
  • 5w(e) 移動(dòng)光標(biāo)到下五個(gè)單詞.
  • b 移動(dòng)光標(biāo)到上一個(gè)單詞.
  • 0 移動(dòng)光標(biāo)到本行最開(kāi)頭.
  • ^ 移動(dòng)光標(biāo)到本行最開(kāi)頭的字符處.
  • $ 移動(dòng)光標(biāo)到本行結(jié)尾處.
  • H 移動(dòng)光標(biāo)到屏幕的首行. 
  • M 移動(dòng)光標(biāo)到屏幕的中間一行.
  • L 移動(dòng)光標(biāo)到屏幕的尾行.
  •   c-f (即 ctrl 鍵與 f 鍵一同按下)
  • c-b (即 ctrl 鍵與 b 鍵一同按下) 翻頁(yè)
  • c-d (下半頁(yè)) c-u(上半頁(yè)) c-e (一行滾動(dòng))
  • zz 讓光標(biāo)所在的行居屏幕中央
  • zt 讓光標(biāo)所在的行居屏幕最上一行
  • zb 讓光標(biāo)所在的行居屏幕最下一行
  • 在 vi 中 y 表示拷貝, d 表示刪除, p 表示粘貼. 其中拷貝與刪除是與光標(biāo)移動(dòng)命令
  • 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$(Y) 表示拷貝從當(dāng)前光標(biāo)到光標(biāo)所在行尾的內(nèi)容.
  • d$(D) 表示刪除從當(dāng)前光標(biāo)到光標(biāo)所在行尾的內(nèi)容.
  • yfa 表示拷貝從當(dāng)前光標(biāo)到光標(biāo)后面的第一個(gè)a字符之間的內(nèi)容.
  • dfa 表示刪除從當(dāng)前光標(biāo)到光標(biāo)后面的第一個(gè)a字符之間的內(nèi)容.
  • s(S),a(A),x(X),D
  • yy 表示拷貝光標(biāo)所在行.
  • dd 表示刪除光標(biāo)所在行.
  • 5yy 表示拷貝光標(biāo)以下 5 行.
  • 5dd 表示刪除光標(biāo)以下 5 行.
  • y2fa 表示拷貝從當(dāng)前光標(biāo)到光標(biāo)后面的第二個(gè)a字符之間的內(nèi)容.
  • :12,24y 表示拷貝第12行到第24行之間的內(nèi)容.
  • :12,y 表示拷貝第12行到光標(biāo)所在行之間的內(nèi)容.
  • :,24y 表示拷貝光標(biāo)所在行到第24行之間的內(nèi)容. 刪除類(lèi)似.
  • TAB 就是制表符, 單獨(dú)拿出來(lái)做一節(jié)是因?yàn)檫@個(gè)東西確實(shí)很有用.
  •  << 輸入此命令則光標(biāo)所在行向左移動(dòng)一個(gè) tab.
  • >> 輸入此命令則光標(biāo)所在行向右移動(dòng)一個(gè) tab.
  • 5>> 輸入此命令則光標(biāo)后 5 行向右移動(dòng)一個(gè) tab.
  •  :5>>(>>>) :>>(>>>)5
  • :12,24> 此命令將12行到14行的數(shù)據(jù)都向右移動(dòng)一個(gè) tab.
  • :12,24>> 此命令將12行到14行的數(shù)據(jù)都向右移動(dòng)兩個(gè) tab.
  • :set shiftwidth=4 設(shè)置自動(dòng)縮進(jìn) 4 個(gè)空格, 當(dāng)然要設(shè)自動(dòng)縮進(jìn)先.
  • :set sts=4 即設(shè)置 softtabstop 為 4. 輸入 tab 后就跳了 4 格.
  • :set tabstop=4 實(shí)際的 tab 即為 4 個(gè)空格, 而不是缺省的 8 個(gè).
  • :set expandtab 在輸入 tab 后, vim 用恰當(dāng)?shù)目崭駚?lái)填充這個(gè) tab.
  • :g/^/exec 's/^/'.strpart(line('.').' ', 0, 4) 在行首插入行號(hào)
  •  set ai 設(shè)置自動(dòng)縮進(jìn)
  • 5ia<esc> 重復(fù)插入5個(gè)a字符

  替換命令

  •  替換文字 2009-02-34 ----> 2009-02-34 00:00:00      :%s/\(\d\{4\}-\d\{2\}-\d\{2\}\)/\1 00:00:00/g
  • :%s/^/heaser/     在每一行頭部添加header
  • :%s/$/ender/     在每一行尾部添加ender
  • :s/aa/bb/g              將光標(biāo)所在行出現(xiàn)的所有包含 aa 的字符串中的 aa 替換為 bb
  • :s/\/bb/g               將光標(biāo)所在行出現(xiàn)的所有 aa 替換為 bb, 僅替換 aa 這個(gè)單詞
  • :%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/fred/joe/igc            一個(gè)常見(jiàn)的替換命令,修飾符igc和perl中一樣意思
  • s/dick/joe/igc則        對(duì)于這些滿(mǎn)足條件的行進(jìn)行替換
  • :g/^\s*$/d              空行(空格也不包含)刪除.
  • :%s/\r//g               刪除DOS方式的回車(chē)^M
  • :%s/ *$//               刪除行尾空白(%s/\s*$//g)
  • :g!/^dd/d               刪除不含字符串'dd'開(kāi)頭的行
  • :v/^dd/d                同上,譯釋?zhuān)簐 == g!,就是不匹配!
  • :v/./.,/./-1join        壓縮空行(多行空行合并為一行)
  • :g/^$/,/./-j            壓縮空行(多行空行合并為一行)
  • :g/^/pu _               把文中空行擴(kuò)增一倍 (pu = put),原來(lái)兩行間有一個(gè)空行,現(xiàn)在變成2個(gè)
  •  :g/^/m0                 按行翻轉(zhuǎn)文章 (m = move)
  • :g/fred/,/joe/d         not line based (very powerfull)
  • :g/<input\|<form/p      或者 要用\|
  • :g/fred/t$              拷貝行,從fred到文件末尾(EOF)
  • :%norm jdd              隔行刪除,
譯釋?zhuān)?指明是對(duì)所有行進(jìn)行操作,norm指出后面是normal模式的指令,j是下移一行,dd是刪除行
  •  :'a,'bg/fred/s/dick/joe/igc   ('a,'b指定一個(gè)范圍:mark a ~ mark b)
  • g//用一個(gè)正則表達(dá)式指出了進(jìn)行操作的行必須可以被fred匹配,g//是一個(gè)全局顯示命令
  •  /joe/e                  光標(biāo)停留在匹配單詞最后一個(gè)字母處
  • /joe/e+1                光標(biāo)停留在匹配單詞最后一個(gè)字母的下一個(gè)字母處
  • /joe/s                  光標(biāo)停留在匹配單詞第一個(gè)字母處
  • /^joe.*fred.*bill/      標(biāo)準(zhǔn)正則表達(dá)式
  • /^[A-J]\+/              找一個(gè)以A~J中一個(gè)字母重復(fù)兩次或以上開(kāi)頭的行
  • /forum\(\_.\)*pent      多行匹配
  • /fred\_s*joe/i          中間可以有任何空白,包括換行符\n
  • /fred\|joe              匹配FRED或JOE
  • /\<fred\>/i             匹配fred,fred必須是一個(gè)獨(dú)立的單詞,而不是子串
  • /\<\d\d\d\d\>           匹配4個(gè)數(shù)字 \<\d\{4}\>   列,
  • 替換所有在第三列中的str1     :%s:\(\(\w\+\s\+\)\{2}\)str1:\1str2:
  •   交換第一列和最后一列 (共4列)    :%s:\(\w\+\)\(.*\s\+\)\(\w\+\)$:\3\2\1:
  • 全局(global)顯示命令,就是用 :g+正則表達(dá)式
譯釋?zhuān)?:g/{pattern}/{cmd} 就是全局找到匹配的,然后對(duì)這些行執(zhí)行命令{cmd}
  • :g/\<fred\>/                                顯示所有能夠?yàn)閱卧~fred所匹配的行
  •  :g/<pattern>/z#.5                           顯示內(nèi)容,還有行號(hào)
  • :g/<pattern>/z#.5|echo '=========='         漂亮的顯示


多文檔操作 (基礎(chǔ))

  •  用 :ls! 可以顯示出當(dāng)前所有的buffer
  • :bn                 跳轉(zhuǎn)到下一個(gè)buffer
  • :bp                 跳轉(zhuǎn)到上一個(gè)buffer
  • :wn                 存盤(pán)當(dāng)前文件并跳轉(zhuǎn)到下一個(gè)
  • :wp                 存盤(pán)當(dāng)前文件并跳轉(zhuǎn)到上一個(gè)
  • :bd                 把這個(gè)文件從buffer列表中做掉
  • :b 3                跳到第3個(gè)buffer
  • :b main             跳到一個(gè)名字中包含main的buffer

列復(fù)制

  • 譯注:@#%&^#*^%#$!
  • :%s= [^ ]\+$=&&= : 復(fù)制最后一列
  •  :%s= \f\+$=&&= : 一樣的功能
  • :%s= \S\+$=&& : ft,還是一樣反向引用,或稱(chēng)記憶
  • :s/\(.*\):\(.*\)/\2 : \1/ : 顛倒用:分割的兩個(gè)字段
  • :%s/^\(.*\)\n\1/\1$/ : 刪除重復(fù)行
  • 非貪婪匹配,\{-}
  • :%s/^.\{-}pdf/new.pdf/ : 只是刪除第一個(gè)pdf 跨越可能的多行
  •  :%s/<!--\_.\{-}-->// : 又是刪除多行注釋?zhuān)ㄟ??為什么要說(shuō)「又」呢?)
  • :help /\{-} : 看看關(guān)于 非貪婪數(shù)量符 的幫助
  • :s/fred/<c-r>a/g : 替換fred成register a中的內(nèi)容,呵呵,
  • 寫(xiě)在一行里的復(fù)雜命令   :%s/\f\+\.gif\>/\r&\r/g | v/\.gif$/d | %s/gif/jpg/
譯注:就是用 | 管道啦

大小寫(xiě)轉(zhuǎn)換

  • g~~ : 行翻轉(zhuǎn)
  • vEU : 字大寫(xiě)(廣義字)
  • vE~ : 字翻轉(zhuǎn)(廣義字)
  •  ~   將光標(biāo)下的字母改變大小寫(xiě)
  •  3~  將下3個(gè)字母改變其大小寫(xiě)
  •  g~w 字翻轉(zhuǎn)
  •  U   將可視模式下的字母全改成大寫(xiě)字母
  • gUU 將當(dāng)前行的字母改成大寫(xiě)
  •  u   將可視模式下的字母全改成小寫(xiě)
  •  guu 將當(dāng)前行的字母全改成小寫(xiě)
  • gUw 將光標(biāo)下的單詞改成大寫(xiě)
  • guw 將光標(biāo)下的單詞改成小寫(xiě)。

文件瀏覽

  •  :Ex : 開(kāi)啟目錄瀏覽器,注意首字母E是大寫(xiě)的
  • :Sex : 在一個(gè)分割的窗口中開(kāi)啟目錄瀏覽器
  • :ls : 顯示當(dāng)前buffer的情況
  • :cd .. : 進(jìn)入父目錄
  •  :pwd
  • :args : 顯示目前打開(kāi)的文件
  • :lcd %:p:h : 更改到當(dāng)前文件所在的目錄
譯釋?zhuān)簂cd是僅僅改變當(dāng)前窗口的工作路徑,% 是代表當(dāng)前文件的文件名,加上 :p擴(kuò)展成全名(就是帶了路徑),加上 :h析取出路徑 

以下是一張vim常用命令速查表:685007-20190219103431877-1441653557



以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)