程序員用 vim 編輯代碼的常用技巧在oschina看到不錯的vim技巧文章,讀了之后vi水平大有提高呵呵。 總結一下寫代碼的常用vi的命令,以后繼續(xù)總結到這里來吧。大家有什么好的技巧也可以教我一下。
-----------基本動作-------------- i 切換到插入模式,在光標之前 a 切換到插入模式 在光標之后,自己體會和i的區(qū)別吧 I 切換到插入模式,光標在行的開始 A 切換到插入模式 光標在行的結尾 v 進入 visual mode ,選擇模式? R 進入替換模式,輸入的文字直接覆蓋替換光標下的字符。 直到按<Esc>建退出。 <Esc> 退出輸入模式,
:w 保存文件 :w newfilename 文件另存為 :q 退出編輯 :wq 保存并退出 :edit 打開另外一個文件, 可以用<TAB> 補全 u undo 取消上次修改 ctrl + R redo 重復上次修改 :help 后面加上某個命令,查看vim的幫助文檔
--------------編程常用設置-------------------- :set nowrap / set wrap "禁止自動換行/啟用自動換行 有時候不自動換行看起來更清楚一些 :set number "顯示行號 :set tabstop=4 "設置tab的寬度 :set shiftwidth=4 "設置自動縮進的的寬度 :syntax on "語法高亮 :set filetype=c "如果文件擴展名不是 c,可以用這個為vim指定文件格式。 :set cindent "啟用 C 的自動縮進 :set colorcolumn=80 "設置代碼一行最多80字符長度的可視邊界,7.3版本以后可用。 "不大常用的tab相關設置 :set softtabstop=4 ,:set smarttabs, :set expandtab 把插入的tab 都轉換成空格 , 還有retab等,按照設置重新轉換tab ? (用法 :%retab8 ) , "突出顯示當前行 set nocursorline set cursorline " 自動切換當前目錄為當前文件所在的目錄 set autochdir " 允許在有未保存的修改時切換緩沖區(qū),此時的修改由 vim負責保存 set hidden set nobackup "禁用vim的自動備份文件功能 " 搜索時,高亮顯示搜索到的單詞 set hlsearch colorscheme evening "設置代碼高亮 的 顏色配置方案為 evening "我比較喜歡下面這幾種配色,都可以在網(wǎng)上找到吧 monokai evening twilight vividchalk freya spiderhawk colorscheme monokai "我覺得這個最好看了 set exrc "設置vim加載所有目錄下.vimrc文件,這樣每個工程目錄就可以有自己的自定義設置了。 set secure '限制上一步設置里面的目錄下的vimrc不能使用某些不安全的命令 很多配色方案可以到vim網(wǎng)站去找,不過這里也有個抓屏,查看方便 http://vimcolorschemetest./svn/html/index-c.html 設置編碼, 參考 正確設置 Vim 的字符編碼選項 http:///vim-gvimvim-on-win32 set encoding=utf-8 這個設置了之后會在文件結尾加上編碼標志,只是gvim內部使用的? 我看有問題再設置這個選項好了 set fileencoding= 上面的設置可以直接執(zhí)行也可以放到vimrc文件里面去,以便每次啟動時有效??梢韵旅孢@個加到vimrc方便使用 編碼設置相關設置的說明: 來自 http://wensuper./blog/1495384 encoding(enc):encoding是Vim的內部使用編碼,encoding的設置會影響Vim內部的Buffer、消息文字等。在Unix環(huán)境下,encoding的默認設置等于locale;Windows環(huán)境下會和當前代碼頁相同。在中文Windows環(huán)境下encoding的默認設置是cp936(GBK)。 |:help encoding-values|列出Vim支持的所有編碼。 設置gui界面 字體,打開時自動最大化 if has("gui_running") if has("win32") " 設定 windows 下 gvim 啟動時最大化 autocmd GUIEnter * simalt ~x " 設定 windows 下圖形界面下的字體。該字體需要自己下載安裝,下載地址: "好像程序員比較喜歡的字體有 "1. Bitstream Vera Sans Mono "http://www-old./fonts/ "http://ftp./pub/GNOME/sources/ttf-bitstream-vera/1.10/ "2. 微軟visual stuido 自帶的 Consolas字體 "http://www.microsoft.com/en-us/download/details.aspx?id=17879 " 下載安裝完,gvim的菜單里面又有了Consolas 字體,可以用下面這個設置 " set guifont=Consolas:h12:cANSI " Bitstream_Vera_Sans_Mono在默認的 gvim菜單里面有這個, "下面這個設置字體大小為12 set guifont=Bitstream_Vera_Sans_Mono:h12:cANSI else " 設定 linux 下圖形界面下的字體,該字體 Fedora 7 自帶 set guifont=DejaVu\ LGC\ Sans\ Mono\ 14 endif endif 記錄上次文件打開時的光標的位置,這個很好,下次打開自動把光標移到上次修改的地方。 BufReadPost 是文件加載完的時候的動作吧 autocmd BufReadPost * \ if line("'\"")>0&&line("'\"")<=line("$") | \exe "normal g'\"" | \ endif "隱藏gvim的工具欄和菜單,按f1時才彈出, Toggle Menu and Toolbar 參考 http://vimdoc./htmldoc/gui.html " 這個比較放到上面的go語言插件的后面才起作用,go那里好像重設置語法了 " 高亮顯示行尾的空格,和空格和TAB鍵混用的情況 " http://vim./wiki/Highlight_unwanted_spaces " ctermbg 必須用顏色名字,guibg可以用顏色值 highlight default ExtraWhitespace ctermbg=red guibg=#F92672 match ExtraWhitespace /\s\+$\| \+\t/ " 可以用下面這個刪掉所有的行尾空格 " %s/\s\+$// " 或者像下面這個map <leader>w git stripspace命令,來刪掉這個 whitespace error " 默認的<leader>鍵是 “\ ” 有的是逗號",” function! Preserve(command) " Preparation: save last search, and cursor position. let _s=@/ let l = line(".") let c = col(".") " Do the business: execute a:command " Clean up: restore previous search history, and cursor position let @/=_s call cursor(l, c) endfunction " delete all trailing whitespace in current file if has ("win32") map <leader>w :call Preserve(":%!c:/git/bin/git.exe stripspace")<CR> else map <leader>w :call Preserve(":%!git stripspace")<CR> endif set path="" vim搜索c的+include文件的路徑,比如下面 [I gf 命令等需要打開頭文件的時候,就要根據(jù)這個path變量去搜索了。 ------------移動光標--------------- h j k l 光標 “左 下 上 右” 移動 0 光標移動到本行的的開始 ^ 光標移動到本行的第一個字符 $ 光標移動到本行末尾 b 光標移到單詞的開頭 e 光標移到單詞的末尾 w 光標移到下一個單詞 大寫的 E W和小寫的e w類似,不過單詞是以空格作為分界。移動光標到下一個空格的的前或者后面一個字符。 + 光標移到下一行的開頭 - 光標移到上一行的開頭 % 光標在匹配 最近() {} 塊切換,這個很有用啊,類與visual studio中的ctrl + ] ‘’ 兩次單引號,光標移到上次修改的位置。 兩次反引號 ` 才是正式的寫法? 一個反引號加上一點(`.)也可以跳到最后一個修改的位置(參加mark和macro的用法 http://www./vi-vim-tutorial-5.gif) 其實是反引號書簽的用法來的, “m + 一個字母表示的書簽名字” 就在當前行設置一個書簽。 “反引號 + 一個字母表示的書簽名字” 就跳到該書簽的位置。 標簽的一個 用法,比如要刪大量內容,可以在某個地方ma ,mz 之類的設置標簽到某行,然后把光標移到對應的位置,再 d`a y`z 之類的可以刪除到指定標簽位置的所有內容。 gvim里面單引號和反引號一樣的效果,ma 之后, ‘a可以移動到書簽a的位置 G 光標移到文件的末尾 gg 光標移到文件的開始 行號+G 或者 行號+gg 跳轉到第幾行 f + 字符 光標移到本行的 下一個指定字符,搜索 F + 字符 光標移到本行的 上一個指定字符,反向搜索 { 段落的開始 } 段落的結尾 ( 句子的開始 ) 句子的結尾 g, 最近的修改 g; 最近的修改 gd 移到程序變量的定義 在函數(shù)里面查找 gD 移到程序變量的定義 在文件里面查找 [( 移到光標位置到 類似if 的條件判斷的括號的開始 ]) 移到光標位置到 類似if 的條件判斷的括號的結尾 [{ 代碼塊的開始(for 循環(huán)if等的大括號) ]} 代碼塊的結尾 (for 循環(huán)if等的大括號) [[ 移到函數(shù)的開始{ ]} 移到函數(shù)的結尾的} [# ]# 移到外層#if #endif的 [/ 代碼注釋的塊的開始 ]/ 代碼注釋的塊的結尾 參考 *29.3* Moving through a program http://vimdoc./htmldoc/usr_29.html#29.3
zz 光標當前位置滾動到移到屏幕的中間 zt zb 光標當前位置滾動到屏幕頂端和底部 shitf + M 光標滾動到移到屏幕的中間, 自己體會 和zz的區(qū)別 shitf + H 光標滾動到移到屏幕的頂端 shitf + L 光標滾動到移到屏幕的底部 ctrl + E 向上滾屏 ctrl + Y 向下滾屏, windows的vim聽說需要重新map一下命令才有效果,否則是redo效果,自己google一下吧 ctrl + F ctrl +B 上下翻頁 ctrl + o ctrl + i 移動光標到上一次光標所在的位置,在光標的歷史位置記錄里面前后移動。 *CTRL-O* CTRL-O Go to [count] Older cursor position in jump list --------------搜索用法----------------- # 和 * 在文件搜索光標當前位置的單詞,高亮位置。向前和向后搜索。 非常有用。 g# g* 同# *用法,但搜索的時候,當前單詞如果作為其他的單詞的一部分的時候,也高亮顯示。# 和 * 要求完整匹配,這個值要求部分包含就可以了 / 和 ? 進入搜索模式,在文檔搜索相應的單詞。 向前和向后
n 和 N 上面的兩個搜索用法之后,向前和反向搜索下一個
[I 類似# 和 * 用法,不過顯示一個快速列表。 還有這個用來搜索c /c++變量定義的,默認會用tags,但如果沒有tags,也會在include 的頭文件里面也會搜索,準確找到該類型的定義。這點和gD gd比較類似。 gD在文件里面搜索變量定義,gd在函數(shù)里面搜索,但這個[I 會搜索#include的文件。 include的查找目錄由vim的path變量定義,可以修改vimrc配置文件指定path變量,不然vim會找不到頭文件的。 數(shù)字 + [ + <TAB> 跳到上面一條命令里面顯示的第幾個 位置去。 ]I 類似[I 但只列出后面的 ]i 類似[I 但只列出前面的 參考 *29.4* Finding global identifiers http://vimdoc./htmldoc/usr_29.html#29.4 :/buf\c 搜索內容時,后面加上 \c 不區(qū)分大小寫 ---顯示搜索命令歷史-- q/ 顯示搜索命令歷史的窗口 q? 顯示搜索命令歷史的窗口 可以選擇重用以前用過的搜索查找命令 在多個文件里面搜索 :vimgrep /pattern/[j][g] file file2... fileN /joe/e : cursor set to End of match 搜索時可以移動光標到相對單詞結尾偏移的位置 3/joe/e+1 : find 3rd joe cursor set to End of match plus 1 [C] /joe/s-2 : cursor set to Start of match minus 2 搜索時可以移動光標到相對丹迪開頭偏移的位置 :g/gladiolli/# : 彈出所有的包含gladiolli的行供 類似 [I 但【I使用的是當前光標下的詞來搜索 /jo[ha]n Search john or joan /\< the Search the, theatre or then /the\> Search the or breathe /\< the\> Search the /fred\|joe Search fred or joe /\<\d\d\d\d\> Search exactly 4 digits /^\n\{3} Find 3 empty lines ------------替換操作------------------------------ :s/要替換的單詞/替換為的內容/ 和perl里面的正則一樣啊, :%s/buf_/buf/c 在全文件替換buf_ 為buf,并且詢問是否替換 :127,215 s/foo/bar 替換127行到215之間的foo為bar。 . 表示當前行, $表示最后一行, :%s/\%Vold/new/g : Do a substitute on last visual area [N] . or $ for current and last lines respectively. One could also use relative prefixes + and - to refer to offsets after or before the curent line, respectively. Thus: :.,$j meaning "from the current line to the last line, join them all into one line". :% is synonymous with :1,$ (all the lines). The :... g and :... v commands bear some explanation as they are incredibly powerful. :... gis a prefix for "globally" applying a subsequent command to all lines which match a pattern (regular expression) while :... v applies such a command to all lines which do NOT match the given pattern ("v" from "conVerse"). As with other ex commands these can be prefixed by addressing/range references. Thus:.,+21g/foo/d means "delete any lines containing the string "foo" from the current one through the next 21 lines" while :.,$v/bar/d means "from here to the end of the file, delete any lines which DON'T contain the string "bar." 參考文檔 |10.2| Substitution http://vimdoc./htmldoc/usr_10.html#10.2 :%s/old/new/g Replace all occurences of old by new in file :%s/old/new/gw Replace all occurences with confirmation :2,35s/old/new/g Replace all occurences between lines 2 and 35 :5,$s/old/new/g Replace all occurences from line 5 to EOF :%s/^/hello/g Replace the begining of each line by hello :%s/$/Harry/g Replace the end of each line by Harry :%s/onward/forward/gi Replace onward by forward, case unsensitive ---------------刪除、復制和粘帖-------------------- o 在光標位置下面新建一行 O 在光標位置上面新建一行 j 合并上下兩行為一行 d 刪除 c change 剪切并進入插入模式, 和d的區(qū)別是這個會把剪切的記錄也保存到重復命令 . 的記錄里面去。 C D d$ c$ 刪到行的結尾 s 刪除當前字符并且進入插入模式 S 刪掉一整行然后進入插入模式 行數(shù)+ dd 刪除指定行數(shù),比如 3dd 刪除3行 行數(shù)+ cc 和 上一個類似,但會記錄重復記錄。 yy 復制當前行內容到剪切板 行數(shù)+ yy 復制多少行, 3yy 復制3行 p 在光標前粘貼 P 在光標后粘貼 r 替換當前選中內容,關于選擇,參見下面xisual 模式 可以組合使用 y2w 復制后面連個單詞 d2w 刪除兩個單詞 db 刪除到單詞開頭 di( di) da( da) 刪除括號里面的塊 di> di< di{ di} 同樣有 ce cw c3w 等 d/foo 刪除到后面第一個出現(xiàn)foo的地方 y?bar 同樣有復制到前面第一個出現(xiàn)bar的位置 y2/foo 復制當前光標位置到后面第二次出現(xiàn)foo之間的字符。 d/fred/ :delete until fred y/fred/ :yank until fred c/fred/e :change until fred end 利用標簽用法,刪除或復制大塊數(shù)據(jù) 可以在某個地方ma ,mz 之類的設置標簽到某行,然后把光標移到對應的位置,再 d`a c'a y`z 之類的可以刪除或復制從當前光標所在wei位置到標簽所在位置的所有內容。 修阿刪除多行數(shù)據(jù)時這個比較方便。 利用visual模式,刪除或復制大塊數(shù)據(jù)。 按v 或者V 進入visual模式后,可以選擇大塊內容,用d c y 等進行操作。參考某某的 “選擇塊”的介紹。 "* 雙引號+星號 再加上復制或者粘貼命令,把內容復制到系統(tǒng)剪切板, "*yy 把當前行復制到系統(tǒng)剪切板 "*p 從系統(tǒng)剪切板粘帖出來
:%s/ *$//g Delete all white spaces :g/string/d Delete all lines containing string :v/string/d Delete all lines containing which didn’t contain string :s/Bill/Steve/ Replace the first occurence of Bill by Steve in current line :s/Bill/Steve/g Replace Bill by Steve in current line :%s/Bill/Steve/g Replace Bill by Steve in all the file :%s/\r//g Delete DOS carriage returns (^M) :%s/\r/\r/g Transform DOS carriage returns in returns :%s#<[^>]\+>##g Delete HTML tags but keeps text :%s/^\(.*\)\n\1$/\1/ Delete lines which appears twice ggVGg? Change text to Rot13 --------------------------------- 指定寄存器 d c s y p 等指令操作的內容,默認保存到 “” 寄存器。但也可以用雙引號加 一個字母表示的名字指定26個寄存器中任意的一個。 小寫字母表示替換原有寄存器的內容,大寫表示追加內容到寄存器 "ayy 復制當前行內容到 a號寄存器 “Ayy 把當前行內容添加到寄存器a里面,如果以前a寄存器已經有一行內容了,那么這個做完a寄存器就有兩行內容了。 "ap 粘帖寄存器a里面內容 "bp 粘帖寄存器b里面內容 :reg : display contents of all registers :reg a : display content of register a qqq : empty register "q" 應該是記錄 一個空的宏到寄存器,所以寄存器就被清空了 qaq : empty register "a" 其他的還有 0 到9好等寄存器,只讀寄存器等,參考文檔 registers http://vimdoc./htmldoc/change.html#registers :g/^\s*$/d : delete all blank lines :g!/^dd/d : delete lines not containing string :v/^dd/d : delete lines not containing string :g/joe/,/fred/d : not line based (very powerfull) :g/fred/,/joe/j : Join Lines [N] :g/^/t. : duplicate every line ----------------重復命令----------------------- . 按 “點” 這個句號字符重復執(zhí)行命令, 從上一個按 i 進入“插入模式”開始到 esc建退出的所有動作。 非常有用。不如用了重復刪除 重復粘貼等。
-------------選擇塊--------------------------- vim里面的 “visual mode”應該也去學一下。 選擇文字時用比較方便。就是進入這個模式之后,把當前光標和你移動到的光標的內容都選擇起來。 v 進入 visual 選擇模式,以字符為選擇單位 V 選擇viusal模式,不過以整行為選擇單位 然后就可以用 hjkl鍵選擇區(qū)域。 組合命令: “viB” 選擇當前光標所在的兩個大括號包含的整個代碼塊,不包含大括號 “vaB” 選擇當前光標所在的兩個大括號包含的整個代碼塊,包含大括號 類似的有 vib vab 選擇兩個括號里面的一整塊內容 viw vaw 選擇一個單詞
類的的組合有,用于選擇大括號 尖括號等里面的內容,i不包含,a包含??梢院推渌庉嬅罱M合使用。 ii{ a{ i( a( i< a< i[ a[ 也可以用鼠標直接選擇區(qū)域,那就是select mode,后用鼠標選取之后,可以用ctrl + O 或者ctrl + G切換到visual mode。 很多命令可以在 visual mode下面操作,參考這里 http://vimdoc./htmldoc/visual.html#visual-operators 比較常用的有,選擇多行之后進行刪除復制,修改代碼縮進等。 ---------viusul mode的整塊操作模式----Blockwise operators------------ ctrl + v 開始進入viusual mode的整塊操作模式選取。 然后可以用hjkl 鍵選擇塊。 可以I之后修改esc退出后就應用到所有的行。 d刪除,p可以粘貼整塊的內容等。 windows因為快捷鍵默認ctrl +v 是粘貼,所以 ctrl + q才是塊操作。 這個功能可以用來給多行代碼前面加上注釋 // 。 其他的塊模式的操作有 I 在block的前面插入 A 添加字符串到 block的結尾 c C 修改block的每一行內容為指定字符床 < > 整block的縮進修改 r 替換 d 刪除整個選中的block p 粘貼整塊block 參考 http://vimdoc./htmldoc/visual.html#blockwise-operators 其他visual模式說明參考詳細參見: http://vimdoc./htmldoc/visual.html#Visual -------------代碼縮進----------------- < 選擇塊減少縮進,自己先用visual 模式,viB 選擇塊之后,再做這個就可以縮進一整塊 > 選中塊增加縮進。 這個縮進寬度由 set shiftwidth=4 定義 <iB >iB <aB >aB 可以直接使用,不用先選擇代碼塊。 >i{ <a{ 等 >% 也可以直接把光標移到塊的前面或者后面的大括號那里,然后運行 >% 命令就可以了,同樣應也有 <% >i{ 上面那個是把大括號一起移動的,這個縮進不包含大括號。 = 自動縮進代碼塊,用法,先把光標移到一塊的起始括號那里 { ,然后 執(zhí)行 =% 就可以格式化整個代碼塊了。 >> 當前行減少縮進, 左移 << 當前行增加縮進,右移 5>> 行數(shù)加縮進,那么就一共幾行一起調整縮進
組合命令 == 格式化當前一行。 =a{ 等號加上其他選擇塊命令, 格式化 一個 代碼塊。 1G=G 解釋1G移到文件開始, G移到文件結束,所以這個組合就是格式化整個文件的代碼。 gg=G 和 1G=G 等價 -------------------大小寫轉換-------------------------------------- 按 v 進入”visual mode “ 模式,然后選中制定的文字, 再 gu ,選中的文字轉換為小寫。 gU 選中的文字轉換為大寫。 guW guW 等命令可以直接轉換一個單詞的,但我在Windows的 gvim里面好像默認沒有這個用法,只能先到visual選擇模式 gu才可以用??隙髂莻€是vim或者linux平臺的默認設置吧。 轉換光標下面的字符的就是 vgu vgU 啦, 一開始發(fā)現(xiàn)不進入 ”visual mode “ 模式不能進行大小寫轉換,不過后來發(fā)現(xiàn),這些也是可以直接使用的,下面這些更方便一些吧 ~ 將光標下的字母大小寫反向轉換 guw 將光標所在的單詞變?yōu)樾?nbsp; guw 將光標所在的單詞變?yōu)樾?nbsp; gUw 將光標所在的單詞變?yōu)榇髮?nbsp; guu 光標所在的行所有字符變?yōu)樾?nbsp; gUU 光標所在的行所有字符變?yōu)榇髮?nbsp; g~~ 光標所在的行所有字符大小寫反向轉換 同樣有 gU2w 等組合 ------------------ 其他輔助編程用法----------------------- [CTRL-I, ]CTRL-I Search for a word under the cursor in the current file and any brought in by #include directives. gd, Search for the definition of a variable 在函數(shù)里面查找 gD Search for the definition of a variable 在整個文件查找 ]CTRL-D, [CTRL-D Jump to a macro definition. ]d, [d, ]D, [D Display macro definitions CTRL-A,CTRL-X : increment, decrement next number on same line as the cursor 只在Linux下面起作用。Windows可能需要重新做一下按鍵映射 ctrl + n insert模式時,在輸入很長的變量名字函數(shù)名字時,可以使用這個做自動補全,就不用完整的敲入整個變量名字了 ctrl + p 按ctrl + n補全之后,如果不合適,可以用這個取消補全, ----------------------- 臨時退出 Vi/Vim、進入 shell 環(huán)境后再回來的要求:------------------------------- 方法一:使用 Ctrl-z 以及 fg 這兩個命令組合。 這一解決方法主要利用了 Linux/Unix 的作業(yè)機制。具體原理是:Ctrl-z 命令將當前的 Vi/Vim 進程放到后臺執(zhí)行,之后 shell 環(huán)境即可為你所用;fg 命令則將位于后臺的 Vi/Vim 進程放到前臺執(zhí)行,這樣我們就再次進入 Vi/Vim 操作界面并恢復到原先的編輯狀態(tài)。 方法二:使用行命令 :sh。 在 Vi/Vim 的正常模式下輸入 :sh即可進入 Linux/Unix shell 環(huán)境。在要返回到 Vi/Vim 編輯環(huán)境時,輸入 exit 命令即可。 這兩種方法實現(xiàn)機制不一定,但效果一樣,都非??旖萦行?。 ---------------------------------取得外部輸入-------------------------------------------------------------- : r!<cmd> 將命令 <cmd> 的輸出結果插入到當前光標所在位置 :r <file> 將文件 <file> 讀入到當前光標所在位置 ---------------------把多條命令錄制為宏------------------------------ q 加上 一個字母表示宏的名字 表示開始宏的錄制 q 再次按q,表示錄制完成 @ 加 一個字母的表示的宏的名字,表示執(zhí)行對應的宏 比如qa 開始錄制宏a, 然后按q停止,再@a就可以執(zhí)行剛剛錄制的宏a了 @@ 執(zhí)行最后一次執(zhí)行過的宏。 5@@ 重復執(zhí)行5次最后一次行的宏 多個組合操作需要重復執(zhí)行的時候,使用這個功能可以方便很多。 參考 10.1*Record and playback commands http://vimdoc./htmldoc/usr_10.html#10.1 http://www./vi-vim-tutorial-5.gif ------------------設置鍵盤快捷鍵------------------- The main commands to know when dealing with key bindings are: :map for the modes Normal, Insert, Visual and Command-line 所有模式都起作用 :imap for Insert mode only 只在insert模式起作用 :cmap for Command-line mode only :nmap for Normal mode only :vmap for Visual mode only 一個例子,把ctrl + s 映射為后面保存文件 :map <C-s> :w<cr> 其他常用按鍵表示 <CR> : carriage Return for maps <Space> 空格鍵 <Esc> : Escape <Leader> : normally \ change with :let mapleader = "," <Bar> : | pipe 下面這個用在按鍵映射里面不錯,不過肯能只在Linux下面有效,比如下面這個映射為在當前目錄搜索當前光標所在的單詞 :nnoremap <F3> :grep <C-R><C-W> *<CR><esc>:cw<cr> CTRL-R CTRL-W : pull word under the cursor into a command line or search CTRL-R CTRL-A : pull whole word including punctuation CTRL-R - : pull small register CTRL-R [0-9a-z] : pull named registers CTRL-R % : pull file name (also #) 參考 http://vimdoc./htmldoc/map.html ------------------------查看執(zhí)行過的命令 歷史記錄--------------------------- : 上下鍵 查找和補全 :history 列出所有的歷史記錄 :his c :his s -------------------VIM buffer 窗口------------------------------------------------------- VIM里面一個buffer對應一個打開的文件 " 允許在有未保存的修改時切換緩沖區(qū),此時的修改由 vim負責保存 :set hidden "查看已經打開的buffer :ls 或者 :buffers 命令都可以 “在不同的buffer直接切換,這個很好用 ctrl + 6 "切換到對應的buffer去 比如下面切換到第2個buffer :buffer 2 "用不同的窗口打開所有的buffer :ball :vertical ball "在垂直分隔的窗口打開所有buffer :sbuffer "split buffer到不同的窗口 前后一個buffer :bnext :bn :bprevious :bp :bd[elete][!] [N] 可以指定號碼的buffer,不指定buffer號碼就關閉當前buffer, 會關閉打開這個buffer的所有windoww,并顯示另外一個buffer。 不同于 :q[uit] 和 :close的關閉window命令 另外還可以使用輔助插件 bufexplorer.zip : Buffer Explorer 插件 http://www./scripts/script.php?script_id=42 安裝完 輸入 :BufExplorer , 就會彈出一個包含所有buffer列表的窗口供選擇。用鼠標或者鍵盤都可以跳轉的到對應的buffer去。 或者在normal模式直接輸入下面這個斜杠開始的命令,都可以打開bufexplorer的窗口。 '\be' (normal open) or '\bs' (force horizontal split open) or '\bv' (force vertical split open) "可以把f9映射為這個buffer瀏覽的快捷鍵。 noremap <silent> <F9> :BufExplorer<CR> nmap <F10> :bn<CR> nmap <F11> :bp<CR> --------------------------------配置gvim左側文件瀏覽欄------------------ 安裝 nerdtree 這個插件 https://github.com/scrooloose/nerdtree 然后就可以,用 :NERDTree 命令啟動 左側瀏覽欄,然后 在左邊點擊 文件名 就自動打開,鼠標中建點擊,在新的窗口打開文件。 t 鍵 打開一個新的 tab 窗口里面打開文件。 然后可以在vimrc中加入下面這行代碼讓vim 啟動是自動打開 文件瀏覽欄。 autocmd vimenter * NERDTree 安裝很簡單,網(wǎng)頁有說明 cd ~/.vim/bundle git clone https://github.com/scrooloose/nerdtree.git 在Windows 平臺,放到vim的安裝目錄就可以了。沒有裝git自己下載對應的插件文件放到對應的目錄去就可以了。 最好也安裝一下這個插件配合,這樣在gvim里面啟動時,自動啟動NERDTree 的文件瀏覽欄,并且打開新的tab是,這個文件瀏覽窗口也始終顯示。 不用配置前面的autocmd vimenter * NERDTree 命令了。 他autoload目錄的插件自動加載。 https://github.com/jistr/vim-nerdtree-tabs 有很多默認選項開關 ,可以參考網(wǎng)頁的說明 let g:nerdtree_tabs_open_on_gui_startup=1 這個默認就是1了, let g:nerdtree_tabs_open_on_console_startup=1 直接在字符終端的的vim里面也默認啟動 NERDTree 不過他這個插件加載比較慢,需要的時候再打開比較好 " 把F2映射為顯示左側目錄瀏覽樹窗口開關 map <F2> :NERDTreeToggle<CR> -----------------------c/c++ 結構解析,函數(shù)快捷查找------------------------------------------- 另外為了瀏覽文件是查看搜索函數(shù)名字,有人還喜歡安裝 cscope ctags taglist 等插件,這樣查看搜索函數(shù)定義之類的方便一點吧。有需要的時候在網(wǎng)上找一下相關資料吧 ------------------vim里面搜索目錄下的文件,quickfix模式和grep-------- 在vim里面直接搜索目錄下的文件的內容 :grep sendv *.c 使用外部grep程序 :vimgrep /sendv/ *.c 使用內部vim 模式的搜索,速度較慢 Vim 需要載入每個文件,就像編輯它們那樣。如果文件里沒有匹配,相應 的緩沖區(qū)又會被徹底刪除 :vimgrep sendv\c *.c 使用內部vim 模式的搜索,速度較慢 :help vimgrep greo 在windows系統(tǒng)默認調用的是findstr /n命令來進行搜索的的, 可以通過 :set grepprg 設置來修改設置 linux缺省為 "grep -n " 參考 http://vimcdoc./doc/options.html#'grepprg' 我安裝了git 自帶一個mingw的grep 還是改為用grep好了,比findstr命令好用吧 :set grepprg=c:/git/bin/grep.exe\ -n :grep -i sendv *.c 這樣就可以用grep的各種參數(shù)了 其他的'grepformat'設置vim怎么解析grep的輸出,一般都不用修改了吧。參考vm的文檔 搜索之后只顯示一行,可以:cc 重復顯示結果 或者打開 quickfix窗口 :cw[indow] [height] 當存在可以識別的錯誤時,打開窗口。如果該窗口已經打開且 沒有可識別的錯誤,則將此窗口關閉。 :cope[n] [height] 打開一個窗口顯示當前的錯誤列表。 :ccl[ose] 關閉 quickfix 窗口。 :colder 和 :cnewer 合適顯示十個搜索歷史記錄 在打開的窗口里面可以直接用鼠標雙擊和enter鍵可以跳到指定找到的指定位置去。 但以前的窗口緩沖器沒有修改才行? 在quickfix 窗口 ctrl +w 在按enter鍵,可以在新窗口打開。 ctrl + w 在窗口直接切換 在quickfix模式里面常用操作 :cc 顯示詳細信息 ( :help :cc ) :cp 跳到上一個結果 ( :help :cp ) :cn 跳到下一個結果 ( :help :cn ) :cl 列出所有結果 ( :help :cl ) :cw 如果有結果列表,則打開quickfix窗口 ( :help :cw ) :col 到前一個舊的結果列表 ( :help :col ) :cnew 到后一個較新的結果列表 ( :help :cnew ) 可以把這些命令映射到快捷建方便使用 ":nmap <F4> :cw<cr> ":nmap <F4> :cclose<cr> :nmap <F5> :cn<cr> :nmap <F6> :cp<cr> "把 f3 按鍵映射為在本目錄下文件里面搜索光標下面的單詞 if has("win32") " grep的設置 :set grepprg=c:/git/bin/grep.exe\ -n "windows平臺用這個 :nmap <F3> "*yw<cr>:grep <c-v> ./*<cr><esc>:cw<cr> else " linux 平臺用這個 :nnoremap <F3> :grep <C-R><C-W> *<CR><esc>:cw<cr> endif 可以使用下面這個顯示和隱藏quickfix窗口的函數(shù),這樣cw 和 cclose功能都映射到同一個按鍵了 " 彈出和隱藏quickfix窗口 " 來自http://vim./wiki/Toggle_to_open_or_close_the_quickfix_window function! QFixToggle() if exists("g:qfix_win") cclose unlet g:qfix_win else " copen 10 cw let g:qfix_win = bufnr("$") endif endfunction let g:qfix_win = 1 nmap <script> <silent> <F4> :call QFixToggle()<CR> 參考http://vimcdoc./doc/quickfix.html 這種quickfix的用法,vim內部出了grep 還支持make和其他編譯工具的,可以參考vim的文檔 -------------------------------------- vim-multiple-cursors插件 “True Sublime Text style multiple selections for Vim” ====================================================== https://github.com/terryma/vim-multiple-cursors 允許同時選擇多個同名變量,同時修改。 參考上面主頁上面的動畫演示。比較有意思的一個插件, 可以用 git clone https://github.com/terryma/vim-multiple-cursors 把目錄復制下來,然后把autoload 和 doc plugin目錄復制到vim目 錄去使用就可以了。 使用起來很簡單,在normal模式,把光標移到一個變量名字上面,再不停的按 ctrl +n 就把相同名字的變量都選中了。然后使用vim的命令就 可以編輯了。esc退回普通模式。 commentary.vim 快捷注釋代碼插件 ======================== https://github.com/tpope/vim-commentary Commentary 可以幫你注釋代碼。在normal模式輸入gcc 即可將該行注釋(Commentary 會根據(jù)當前的 filetype 使用. 在visual 模式,額可以選擇多行,然后輸入 gc ,注釋掉整個選中內容。 再次敲擊 gcc 即可還原注釋。我把空格鍵作為注釋映射,下面這樣: nmap <space> gcc vmap <space> gc 即在 normal 模式下,敲擊空格鍵可以注釋當前行,在 visual 模式下,敲擊空格鍵可以注釋選中的內容 參考了 http:///2013/11/my-vim-configuration-plugin/的設置 NERD Commente 另外一個輔助注釋代碼的插件 ================================ http://www./scripts/script.php?script_id=1218 vim-expand-region 自動擴展選擇區(qū)域的插件 ================================== https://github.com/terryma/vim-expand-region 可以通過 + _ 按鍵來擴大選擇區(qū)域。比如,比如光標在單詞中間,按一下 +,就選中整個單詞,再+就選中單詞外層的括號里面內容。等等,可以去上面主頁去看動畫。我只想在visual模式才使用這個功能,他插件里面會自己做一下判斷你是否已經映射了快捷鍵的,如果已經有了,它就不在做nmap的普通模式的映射了。 " 自動擴大選擇區(qū)域的插件,讓它只在visual 模式才使用+ _鍵盤映射 vmap + <Plug>(expand_region_expand) vmap _ <Plug>(expand_region_shrink YouCompleteMe =========== c/c++的最好用的自動補全插件,基于clang的c/c++語法分析 強烈推薦閱讀下面這篇文章,體會 重復命令和 組合命令用法。 http://www.oschina.net/news/25882/why-they-are-using-vi 為什么這些死腦筋們在用 VI ?
翻譯的還好,也許你要原版的。 Why, oh WHY, do those #?@! nutheads use vi?
后來也參考了 技巧:快速提高 Vi/Vim 使用效率的原則與途徑 http://www.ibm.com/developerworks/cn/linux/l-cn-tip-vim/ vim的官方文檔,可以用去看一下。不錯的,詳細的說明。 http://vimdoc./htmldoc/usr_toc.html 不過好像http://www./vim/vimbook-OPL.pdf 這個更有條理一些,講的很詳細,而且例子也不錯,也將很多編程相關的高級用法等。我也參考了一下這個書。 之前發(fā)的一個圖也是很好的參考。 http://hiphotos.baidu.com/widebright/pic/item/5d880d241eb39b40c89559a6.jpg 原來圖是來自這里的啊 Graphical vi-vim Cheat Sheet and Tutorial http://www./a_vi_vim_graphical_cheat_sheet_tutorial.html 這網(wǎng)站還有很多圖,給出由淺入深的學習步驟圖。 不錯的參考圖書 Hacking Vim A cookbook to get the most out of the latest Vim editor 這個帖子提到的幾個用法也不錯 http:///questions/1218390/what-is-your-most-productive-shortcut-with-vim/1220118#1220118 Best of Vim Tips Using vim as C/C++ IDE http://www./2014/using-vim-as-c-cpp-ide/ |
|
來自: herowuking > 《VIM》