程序員用 vim 編輯代碼的常用技巧在oschina看到不錯(cuò)的vim技巧文章,讀了之后vi水平大有提高呵呵。 總結(jié)一下寫代碼的常用vi的命令,以后繼續(xù)總結(jié)到這里來吧。大家有什么好的技巧也可以教我一下。
-----------基本動(dòng)作-------------- i 切換到插入模式,在光標(biāo)之前 a 切換到插入模式 在光標(biāo)之后,自己體會(huì)和i的區(qū)別吧 I 切換到插入模式,光標(biāo)在行的開始 A 切換到插入模式 光標(biāo)在行的結(jié)尾 v 進(jìn)入 visual mode ,選擇模式? R 進(jìn)入替換模式,輸入的文字直接覆蓋替換光標(biāo)下的字符。 直到按<Esc>建退出。 <Esc> 退出輸入模式,
:w 保存文件 :w newfilename 文件另存為 :q 退出編輯 :wq 保存并退出 :edit 打開另外一個(gè)文件, 可以用<TAB> 補(bǔ)全 u undo 取消上次修改 ctrl + R redo 重復(fù)上次修改 :help 后面加上某個(gè)命令,查看vim的幫助文檔
--------------編程常用設(shè)置-------------------- :set nowrap / set wrap "禁止自動(dòng)換行/啟用自動(dòng)換行 有時(shí)候不自動(dòng)換行看起來更清楚一些 :set number "顯示行號(hào) :set tabstop=4 "設(shè)置tab的寬度 :set shiftwidth=4 "設(shè)置自動(dòng)縮進(jìn)的的寬度 :syntax on "語法高亮 :set filetype=c "如果文件擴(kuò)展名不是 c,可以用這個(gè)為vim指定文件格式。 :set cindent "啟用 C 的自動(dòng)縮進(jìn) :set colorcolumn=80 "設(shè)置代碼一行最多80字符長度的可視邊界,7.3版本以后可用。 "不大常用的tab相關(guān)設(shè)置 :set softtabstop=4 ,:set smarttabs, :set expandtab 把插入的tab 都轉(zhuǎn)換成空格 , 還有retab等,按照設(shè)置重新轉(zhuǎn)換tab ? (用法 :%retab8 ) , "突出顯示當(dāng)前行 set nocursorline set cursorline " 自動(dòng)切換當(dāng)前目錄為當(dāng)前文件所在的目錄 set autochdir " 允許在有未保存的修改時(shí)切換緩沖區(qū),此時(shí)的修改由 vim負(fù)責(zé)保存 set hidden set nobackup "禁用vim的自動(dòng)備份文件功能 " 搜索時(shí),高亮顯示搜索到的單詞 set hlsearch colorscheme evening "設(shè)置代碼高亮 的 顏色配置方案為 evening "我比較喜歡下面這幾種配色,都可以在網(wǎng)上找到吧 monokai evening twilight vividchalk freya spiderhawk colorscheme monokai "我覺得這個(gè)最好看了 set exrc "設(shè)置vim加載所有目錄下.vimrc文件,這樣每個(gè)工程目錄就可以有自己的自定義設(shè)置了。 set secure '限制上一步設(shè)置里面的目錄下的vimrc不能使用某些不安全的命令 很多配色方案可以到vim網(wǎng)站去找,不過這里也有個(gè)抓屏,查看方便 http://vimcolorschemetest./svn/html/index-c.html 設(shè)置編碼, 參考 正確設(shè)置 Vim 的字符編碼選項(xiàng) http:///vim-gvimvim-on-win32 set encoding=utf-8 這個(gè)設(shè)置了之后會(huì)在文件結(jié)尾加上編碼標(biāo)志,只是gvim內(nèi)部使用的? 我看有問題再設(shè)置這個(gè)選項(xiàng)好了 set fileencoding= 上面的設(shè)置可以直接執(zhí)行也可以放到vimrc文件里面去,以便每次啟動(dòng)時(shí)有效??梢韵旅孢@個(gè)加到vimrc方便使用 編碼設(shè)置相關(guān)設(shè)置的說明: 來自 http://wensuper./blog/1495384 encoding(enc):encoding是Vim的內(nèi)部使用編碼,encoding的設(shè)置會(huì)影響Vim內(nèi)部的Buffer、消息文字等。在Unix環(huán)境下,encoding的默認(rèn)設(shè)置等于locale;Windows環(huán)境下會(huì)和當(dāng)前代碼頁相同。在中文Windows環(huán)境下encoding的默認(rèn)設(shè)置是cp936(GBK)。 |:help encoding-values|列出Vim支持的所有編碼。 設(shè)置gui界面 字體,打開時(shí)自動(dòng)最大化 if has("gui_running") if has("win32") " 設(shè)定 windows 下 gvim 啟動(dòng)時(shí)最大化 autocmd GUIEnter * simalt ~x " 設(shè)定 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 字體,可以用下面這個(gè)設(shè)置 " set guifont=Consolas:h12:cANSI " Bitstream_Vera_Sans_Mono在默認(rèn)的 gvim菜單里面有這個(gè), "下面這個(gè)設(shè)置字體大小為12 set guifont=Bitstream_Vera_Sans_Mono:h12:cANSI else " 設(shè)定 linux 下圖形界面下的字體,該字體 Fedora 7 自帶 set guifont=DejaVu\ LGC\ Sans\ Mono\ 14 endif endif 記錄上次文件打開時(shí)的光標(biāo)的位置,這個(gè)很好,下次打開自動(dòng)把光標(biāo)移到上次修改的地方。 BufReadPost 是文件加載完的時(shí)候的動(dòng)作吧 autocmd BufReadPost * \ if line("'\"")>0&&line("'\"")<=line("$") | \exe "normal g'\"" | \ endif "隱藏gvim的工具欄和菜單,按f1時(shí)才彈出, Toggle Menu and Toolbar 參考 http://vimdoc./htmldoc/gui.html " 這個(gè)比較放到上面的go語言插件的后面才起作用,go那里好像重設(shè)置語法了 " 高亮顯示行尾的空格,和空格和TAB鍵混用的情況 " http://vim./wiki/Highlight_unwanted_spaces " ctermbg 必須用顏色名字,guibg可以用顏色值 highlight default ExtraWhitespace ctermbg=red guibg=#F92672 match ExtraWhitespace /\s\+$\| \+\t/ " 可以用下面這個(gè)刪掉所有的行尾空格 " %s/\s\+$// " 或者像下面這個(gè)map <leader>w git stripspace命令,來刪掉這個(gè) whitespace error " 默認(rèn)的<leader>鍵是 “\ ” 有的是逗號(hào)",” 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 命令等需要打開頭文件的時(shí)候,就要根據(jù)這個(gè)path變量去搜索了。 ------------移動(dòng)光標(biāo)--------------- h j k l 光標(biāo) “左 下 上 右” 移動(dòng) 0 光標(biāo)移動(dòng)到本行的的開始 ^ 光標(biāo)移動(dòng)到本行的第一個(gè)字符 $ 光標(biāo)移動(dòng)到本行末尾 b 光標(biāo)移到單詞的開頭 e 光標(biāo)移到單詞的末尾 w 光標(biāo)移到下一個(gè)單詞 大寫的 E W和小寫的e w類似,不過單詞是以空格作為分界。移動(dòng)光標(biāo)到下一個(gè)空格的的前或者后面一個(gè)字符。 + 光標(biāo)移到下一行的開頭 - 光標(biāo)移到上一行的開頭 % 光標(biāo)在匹配 最近() {} 塊切換,這個(gè)很有用啊,類與visual studio中的ctrl + ] ‘’ 兩次單引號(hào),光標(biāo)移到上次修改的位置。 兩次反引號(hào) ` 才是正式的寫法? 一個(gè)反引號(hào)加上一點(diǎn)(`.)也可以跳到最后一個(gè)修改的位置(參加mark和macro的用法 http://www./vi-vim-tutorial-5.gif) 其實(shí)是反引號(hào)書簽的用法來的, “m + 一個(gè)字母表示的書簽名字” 就在當(dāng)前行設(shè)置一個(gè)書簽。 “反引號(hào) + 一個(gè)字母表示的書簽名字” 就跳到該書簽的位置。 標(biāo)簽的一個(gè) 用法,比如要?jiǎng)h大量內(nèi)容,可以在某個(gè)地方ma ,mz 之類的設(shè)置標(biāo)簽到某行,然后把光標(biāo)移到對(duì)應(yīng)的位置,再 d`a y`z 之類的可以刪除到指定標(biāo)簽位置的所有內(nèi)容。 gvim里面單引號(hào)和反引號(hào)一樣的效果,ma 之后, ‘a(chǎn)可以移動(dòng)到書簽a的位置 G 光標(biāo)移到文件的末尾 gg 光標(biāo)移到文件的開始 行號(hào)+G 或者 行號(hào)+gg 跳轉(zhuǎn)到第幾行 f + 字符 光標(biāo)移到本行的 下一個(gè)指定字符,搜索 F + 字符 光標(biāo)移到本行的 上一個(gè)指定字符,反向搜索 { 段落的開始 } 段落的結(jié)尾 ( 句子的開始 ) 句子的結(jié)尾 g, 最近的修改 g; 最近的修改 gd 移到程序變量的定義 在函數(shù)里面查找 gD 移到程序變量的定義 在文件里面查找 [( 移到光標(biāo)位置到 類似if 的條件判斷的括號(hào)的開始 ]) 移到光標(biāo)位置到 類似if 的條件判斷的括號(hào)的結(jié)尾 [{ 代碼塊的開始(for 循環(huán)if等的大括號(hào)) ]} 代碼塊的結(jié)尾 (for 循環(huán)if等的大括號(hào)) [[ 移到函數(shù)的開始{ ]} 移到函數(shù)的結(jié)尾的} [# ]# 移到外層#if #endif的 [/ 代碼注釋的塊的開始 ]/ 代碼注釋的塊的結(jié)尾 參考 *29.3* Moving through a program http://vimdoc./htmldoc/usr_29.html#29.3
zz 光標(biāo)當(dāng)前位置滾動(dòng)到移到屏幕的中間 zt zb 光標(biāo)當(dāng)前位置滾動(dòng)到屏幕頂端和底部 shitf + M 光標(biāo)滾動(dòng)到移到屏幕的中間, 自己體會(huì) 和zz的區(qū)別 shitf + H 光標(biāo)滾動(dòng)到移到屏幕的頂端 shitf + L 光標(biāo)滾動(dòng)到移到屏幕的底部 ctrl + E 向上滾屏 ctrl + Y 向下滾屏, windows的vim聽說需要重新map一下命令才有效果,否則是redo效果,自己google一下吧 ctrl + F ctrl +B 上下翻頁 ctrl + o ctrl + i 移動(dòng)光標(biāo)到上一次光標(biāo)所在的位置,在光標(biāo)的歷史位置記錄里面前后移動(dòng)。 *CTRL-O* CTRL-O Go to [count] Older cursor position in jump list --------------搜索用法----------------- # 和 * 在文件搜索光標(biāo)當(dāng)前位置的單詞,高亮位置。向前和向后搜索。 非常有用。 g# g* 同# *用法,但搜索的時(shí)候,當(dāng)前單詞如果作為其他的單詞的一部分的時(shí)候,也高亮顯示。# 和 * 要求完整匹配,這個(gè)值要求部分包含就可以了 / 和 ? 進(jìn)入搜索模式,在文檔搜索相應(yīng)的單詞。 向前和向后
n 和 N 上面的兩個(gè)搜索用法之后,向前和反向搜索下一個(gè)
[I 類似# 和 * 用法,不過顯示一個(gè)快速列表。 還有這個(gè)用來搜索c /c++變量定義的,默認(rèn)會(huì)用tags,但如果沒有tags,也會(huì)在include 的頭文件里面也會(huì)搜索,準(zhǔn)確找到該類型的定義。這點(diǎn)和gD gd比較類似。 gD在文件里面搜索變量定義,gd在函數(shù)里面搜索,但這個(gè)[I 會(huì)搜索#include的文件。 include的查找目錄由vim的path變量定義,可以修改vimrc配置文件指定path變量,不然vim會(huì)找不到頭文件的。 數(shù)字 + [ + <TAB> 跳到上面一條命令里面顯示的第幾個(gè) 位置去。 ]I 類似[I 但只列出后面的 ]i 類似[I 但只列出前面的 參考 *29.4* Finding global identifiers http://vimdoc./htmldoc/usr_29.html#29.4 :/buf\c 搜索內(nèi)容時(shí),后面加上 \c 不區(qū)分大小寫 ---顯示搜索命令歷史-- q/ 顯示搜索命令歷史的窗口 q? 顯示搜索命令歷史的窗口 可以選擇重用以前用過的搜索查找命令 在多個(gè)文件里面搜索 :vimgrep /pattern/[j][g] file file2... fileN /joe/e : cursor set to End of match 搜索時(shí)可以移動(dòng)光標(biāo)到相對(duì)單詞結(jié)尾偏移的位置 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 搜索時(shí)可以移動(dòng)光標(biāo)到相對(duì)丹迪開頭偏移的位置 :g/gladiolli/# : 彈出所有的包含gladiolli的行供 類似 [I 但【I使用的是當(dāng)前光標(biāo)下的詞來搜索 /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/要替換的單詞/替換為的內(nèi)容/ 和perl里面的正則一樣啊, :%s/buf_/buf/c 在全文件替換buf_ 為buf,并且詢問是否替換 :127,215 s/foo/bar 替換127行到215之間的foo為bar。 . 表示當(dāng)前行, $表示最后一行, :%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 ---------------刪除、復(fù)制和粘帖-------------------- o 在光標(biāo)位置下面新建一行 O 在光標(biāo)位置上面新建一行 j 合并上下兩行為一行 d 刪除 c change 剪切并進(jìn)入插入模式, 和d的區(qū)別是這個(gè)會(huì)把剪切的記錄也保存到重復(fù)命令 . 的記錄里面去。 C D d$ c$ 刪到行的結(jié)尾 s 刪除當(dāng)前字符并且進(jìn)入插入模式 S 刪掉一整行然后進(jìn)入插入模式 行數(shù)+ dd 刪除指定行數(shù),比如 3dd 刪除3行 行數(shù)+ cc 和 上一個(gè)類似,但會(huì)記錄重復(fù)記錄。 yy 復(fù)制當(dāng)前行內(nèi)容到剪切板 行數(shù)+ yy 復(fù)制多少行, 3yy 復(fù)制3行 p 在光標(biāo)前粘貼 P 在光標(biāo)后粘貼 r 替換當(dāng)前選中內(nèi)容,關(guān)于選擇,參見下面xisual 模式 可以組合使用 y2w 復(fù)制后面連個(gè)單詞 d2w 刪除兩個(gè)單詞 db 刪除到單詞開頭 di( di) da( da) 刪除括號(hào)里面的塊 di> di< di{ di} 同樣有 ce cw c3w 等 d/foo 刪除到后面第一個(gè)出現(xiàn)foo的地方 y?bar 同樣有復(fù)制到前面第一個(gè)出現(xiàn)bar的位置 y2/foo 復(fù)制當(dāng)前光標(biāo)位置到后面第二次出現(xiàn)foo之間的字符。 d/fred/ :delete until fred y/fred/ :yank until fred c/fred/e :change until fred end 利用標(biāo)簽用法,刪除或復(fù)制大塊數(shù)據(jù) 可以在某個(gè)地方ma ,mz 之類的設(shè)置標(biāo)簽到某行,然后把光標(biāo)移到對(duì)應(yīng)的位置,再 d`a c'a y`z 之類的可以刪除或復(fù)制從當(dāng)前光標(biāo)所在wei位置到標(biāo)簽所在位置的所有內(nèi)容。 修阿刪除多行數(shù)據(jù)時(shí)這個(gè)比較方便。 利用visual模式,刪除或復(fù)制大塊數(shù)據(jù)。 按v 或者V 進(jìn)入visual模式后,可以選擇大塊內(nèi)容,用d c y 等進(jìn)行操作。參考某某的 “選擇塊”的介紹。 "* 雙引號(hào)+星號(hào) 再加上復(fù)制或者粘貼命令,把內(nèi)容復(fù)制到系統(tǒng)剪切板, "*yy 把當(dāng)前行復(fù)制到系統(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 等指令操作的內(nèi)容,默認(rèn)保存到 “” 寄存器。但也可以用雙引號(hào)加 一個(gè)字母表示的名字指定26個(gè)寄存器中任意的一個(gè)。 小寫字母表示替換原有寄存器的內(nèi)容,大寫表示追加內(nèi)容到寄存器 "ayy 復(fù)制當(dāng)前行內(nèi)容到 a號(hào)寄存器 “Ayy 把當(dāng)前行內(nèi)容添加到寄存器a里面,如果以前a寄存器已經(jīng)有一行內(nèi)容了,那么這個(gè)做完a寄存器就有兩行內(nèi)容了。 "ap 粘帖寄存器a里面內(nèi)容 "bp 粘帖寄存器b里面內(nèi)容 :reg : display contents of all registers :reg a : display content of register a qqq : empty register "q" 應(yīng)該是記錄 一個(gè)空的宏到寄存器,所以寄存器就被清空了 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 ----------------重復(fù)命令----------------------- . 按 “點(diǎn)” 這個(gè)句號(hào)字符重復(fù)執(zhí)行命令, 從上一個(gè)按 i 進(jìn)入“插入模式”開始到 esc建退出的所有動(dòng)作。 非常有用。不如用了重復(fù)刪除 重復(fù)粘貼等。
-------------選擇塊--------------------------- vim里面的 “visual mode”應(yīng)該也去學(xué)一下。 選擇文字時(shí)用比較方便。就是進(jìn)入這個(gè)模式之后,把當(dāng)前光標(biāo)和你移動(dòng)到的光標(biāo)的內(nèi)容都選擇起來。 v 進(jìn)入 visual 選擇模式,以字符為選擇單位 V 選擇viusal模式,不過以整行為選擇單位 然后就可以用 hjkl鍵選擇區(qū)域。 組合命令: “viB” 選擇當(dāng)前光標(biāo)所在的兩個(gè)大括號(hào)包含的整個(gè)代碼塊,不包含大括號(hào) “vaB” 選擇當(dāng)前光標(biāo)所在的兩個(gè)大括號(hào)包含的整個(gè)代碼塊,包含大括號(hào) 類似的有 vib vab 選擇兩個(gè)括號(hào)里面的一整塊內(nèi)容 viw vaw 選擇一個(gè)單詞
類的的組合有,用于選擇大括號(hào) 尖括號(hào)等里面的內(nèi)容,i不包含,a包含。可以和其他編輯命令組合使用。 ii{ a{ i( a( i< a< i[ a[ 也可以用鼠標(biāo)直接選擇區(qū)域,那就是select mode,后用鼠標(biāo)選取之后,可以用ctrl + O 或者ctrl + G切換到visual mode。 很多命令可以在 visual mode下面操作,參考這里 http://vimdoc./htmldoc/visual.html#visual-operators 比較常用的有,選擇多行之后進(jìn)行刪除復(fù)制,修改代碼縮進(jìn)等。 ---------viusul mode的整塊操作模式----Blockwise operators------------ ctrl + v 開始進(jìn)入viusual mode的整塊操作模式選取。 然后可以用hjkl 鍵選擇塊。 可以I之后修改esc退出后就應(yīng)用到所有的行。 d刪除,p可以粘貼整塊的內(nèi)容等。 windows因?yàn)榭旖萱I默認(rèn)ctrl +v 是粘貼,所以 ctrl + q才是塊操作。 這個(gè)功能可以用來給多行代碼前面加上注釋 // 。 其他的塊模式的操作有 I 在block的前面插入 A 添加字符串到 block的結(jié)尾 c C 修改block的每一行內(nèi)容為指定字符床 < > 整block的縮進(jìn)修改 r 替換 d 刪除整個(gè)選中的block p 粘貼整塊block 參考 http://vimdoc./htmldoc/visual.html#blockwise-operators 其他visual模式說明參考詳細(xì)參見: http://vimdoc./htmldoc/visual.html#Visual -------------代碼縮進(jìn)----------------- < 選擇塊減少縮進(jìn),自己先用visual 模式,viB 選擇塊之后,再做這個(gè)就可以縮進(jìn)一整塊 > 選中塊增加縮進(jìn)。 這個(gè)縮進(jìn)寬度由 set shiftwidth=4 定義 <iB >iB <aB >aB 可以直接使用,不用先選擇代碼塊。 >i{ <a{ 等 >% 也可以直接把光標(biāo)移到塊的前面或者后面的大括號(hào)那里,然后運(yùn)行 >% 命令就可以了,同樣應(yīng)也有 <% >i{ 上面那個(gè)是把大括號(hào)一起移動(dòng)的,這個(gè)縮進(jìn)不包含大括號(hào)。 = 自動(dòng)縮進(jìn)代碼塊,用法,先把光標(biāo)移到一塊的起始括號(hào)那里 { ,然后 執(zhí)行 =% 就可以格式化整個(gè)代碼塊了。 >> 當(dāng)前行減少縮進(jìn), 左移 << 當(dāng)前行增加縮進(jìn),右移 5>> 行數(shù)加縮進(jìn),那么就一共幾行一起調(diào)整縮進(jìn)
組合命令 == 格式化當(dāng)前一行。 =a{ 等號(hào)加上其他選擇塊命令, 格式化 一個(gè) 代碼塊。 1G=G 解釋1G移到文件開始, G移到文件結(jié)束,所以這個(gè)組合就是格式化整個(gè)文件的代碼。 gg=G 和 1G=G 等價(jià) -------------------大小寫轉(zhuǎn)換-------------------------------------- 按 v 進(jìn)入”visual mode “ 模式,然后選中制定的文字, 再 gu ,選中的文字轉(zhuǎn)換為小寫。 gU 選中的文字轉(zhuǎn)換為大寫。 guW guW 等命令可以直接轉(zhuǎn)換一個(gè)單詞的,但我在Windows的 gvim里面好像默認(rèn)沒有這個(gè)用法,只能先到visual選擇模式 gu才可以用??隙髂莻€(gè)是vim或者linux平臺(tái)的默認(rèn)設(shè)置吧。 轉(zhuǎn)換光標(biāo)下面的字符的就是 vgu vgU 啦, 一開始發(fā)現(xiàn)不進(jìn)入 ”visual mode “ 模式不能進(jìn)行大小寫轉(zhuǎn)換,不過后來發(fā)現(xiàn),這些也是可以直接使用的,下面這些更方便一些吧 ~ 將光標(biāo)下的字母大小寫反向轉(zhuǎn)換 guw 將光標(biāo)所在的單詞變?yōu)樾?nbsp; guw 將光標(biāo)所在的單詞變?yōu)樾?nbsp; gUw 將光標(biāo)所在的單詞變?yōu)榇髮?nbsp; guu 光標(biāo)所在的行所有字符變?yōu)樾?nbsp; gUU 光標(biāo)所在的行所有字符變?yōu)榇髮?nbsp; g~~ 光標(biāo)所在的行所有字符大小寫反向轉(zhuǎn)換 同樣有 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 在整個(gè)文件查找 ]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í),在輸入很長的變量名字函數(shù)名字時(shí),可以使用這個(gè)做自動(dòng)補(bǔ)全,就不用完整的敲入整個(gè)變量名字了 ctrl + p 按ctrl + n補(bǔ)全之后,如果不合適,可以用這個(gè)取消補(bǔ)全, ----------------------- 臨時(shí)退出 Vi/Vim、進(jìn)入 shell 環(huán)境后再回來的要求:------------------------------- 方法一:使用 Ctrl-z 以及 fg 這兩個(gè)命令組合。 這一解決方法主要利用了 Linux/Unix 的作業(yè)機(jī)制。具體原理是:Ctrl-z 命令將當(dāng)前的 Vi/Vim 進(jìn)程放到后臺(tái)執(zhí)行,之后 shell 環(huán)境即可為你所用;fg 命令則將位于后臺(tái)的 Vi/Vim 進(jìn)程放到前臺(tái)執(zhí)行,這樣我們就再次進(jìn)入 Vi/Vim 操作界面并恢復(fù)到原先的編輯狀態(tài)。 方法二:使用行命令 :sh。 在 Vi/Vim 的正常模式下輸入 :sh即可進(jìn)入 Linux/Unix shell 環(huán)境。在要返回到 Vi/Vim 編輯環(huán)境時(shí),輸入 exit 命令即可。 這兩種方法實(shí)現(xiàn)機(jī)制不一定,但效果一樣,都非??旖萦行?。 ---------------------------------取得外部輸入-------------------------------------------------------------- : r!<cmd> 將命令 <cmd> 的輸出結(jié)果插入到當(dāng)前光標(biāo)所在位置 :r <file> 將文件 <file> 讀入到當(dāng)前光標(biāo)所在位置 ---------------------把多條命令錄制為宏------------------------------ q 加上 一個(gè)字母表示宏的名字 表示開始宏的錄制 q 再次按q,表示錄制完成 @ 加 一個(gè)字母的表示的宏的名字,表示執(zhí)行對(duì)應(yīng)的宏 比如qa 開始錄制宏a, 然后按q停止,再@a就可以執(zhí)行剛剛錄制的宏a了 @@ 執(zhí)行最后一次執(zhí)行過的宏。 5@@ 重復(fù)執(zhí)行5次最后一次行的宏 多個(gè)組合操作需要重復(fù)執(zhí)行的時(shí)候,使用這個(gè)功能可以方便很多。 參考 10.1*Record and playback commands http://vimdoc./htmldoc/usr_10.html#10.1 http://www./vi-vim-tutorial-5.gif ------------------設(shè)置鍵盤快捷鍵------------------- 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 一個(gè)例子,把ctrl + s 映射為后面保存文件 :map <C-s> :w<cr> 其他常用按鍵表示 <CR> : carriage Return for maps <Space> 空格鍵 <Esc> : Escape <Leader> : normally \ change with :let mapleader = "," <Bar> : | pipe 下面這個(gè)用在按鍵映射里面不錯(cuò),不過肯能只在Linux下面有效,比如下面這個(gè)映射為在當(dāng)前目錄搜索當(dāng)前光標(biāo)所在的單詞 :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í)行過的命令 歷史記錄--------------------------- : 上下鍵 查找和補(bǔ)全 :history 列出所有的歷史記錄 :his c :his s -------------------VIM buffer 窗口------------------------------------------------------- VIM里面一個(gè)buffer對(duì)應(yīng)一個(gè)打開的文件 " 允許在有未保存的修改時(shí)切換緩沖區(qū),此時(shí)的修改由 vim負(fù)責(zé)保存 :set hidden "查看已經(jīng)打開的buffer :ls 或者 :buffers 命令都可以 “在不同的buffer直接切換,這個(gè)很好用 ctrl + 6 "切換到對(duì)應(yīng)的buffer去 比如下面切換到第2個(gè)buffer :buffer 2 "用不同的窗口打開所有的buffer :ball :vertical ball "在垂直分隔的窗口打開所有buffer :sbuffer "split buffer到不同的窗口 前后一個(gè)buffer :bnext :bn :bprevious :bp :bd[elete][!] [N] 可以指定號(hào)碼的buffer,不指定buffer號(hào)碼就關(guān)閉當(dāng)前buffer, 會(huì)關(guān)閉打開這個(gè)buffer的所有windoww,并顯示另外一個(gè)buffer。 不同于 :q[uit] 和 :close的關(guān)閉window命令 另外還可以使用輔助插件 bufexplorer.zip : Buffer Explorer 插件 http://www./scripts/script.php?script_id=42 安裝完 輸入 :BufExplorer , 就會(huì)彈出一個(gè)包含所有buffer列表的窗口供選擇。用鼠標(biāo)或者鍵盤都可以跳轉(zhuǎn)的到對(duì)應(yīng)的buffer去。 或者在normal模式直接輸入下面這個(gè)斜杠開始的命令,都可以打開bufexplorer的窗口。 '\be' (normal open) or '\bs' (force horizontal split open) or '\bv' (force vertical split open) "可以把f9映射為這個(gè)buffer瀏覽的快捷鍵。 noremap <silent> <F9> :BufExplorer<CR> nmap <F10> :bn<CR> nmap <F11> :bp<CR> --------------------------------配置gvim左側(cè)文件瀏覽欄------------------ 安裝 nerdtree 這個(gè)插件 https://github.com/scrooloose/nerdtree 然后就可以,用 :NERDTree 命令啟動(dòng) 左側(cè)瀏覽欄,然后 在左邊點(diǎn)擊 文件名 就自動(dòng)打開,鼠標(biāo)中建點(diǎn)擊,在新的窗口打開文件。 t 鍵 打開一個(gè)新的 tab 窗口里面打開文件。 然后可以在vimrc中加入下面這行代碼讓vim 啟動(dòng)是自動(dòng)打開 文件瀏覽欄。 autocmd vimenter * NERDTree 安裝很簡單,網(wǎng)頁有說明 cd ~/.vim/bundle git clone https://github.com/scrooloose/nerdtree.git 在Windows 平臺(tái),放到vim的安裝目錄就可以了。沒有裝git自己下載對(duì)應(yīng)的插件文件放到對(duì)應(yīng)的目錄去就可以了。 最好也安裝一下這個(gè)插件配合,這樣在gvim里面啟動(dòng)時(shí),自動(dòng)啟動(dòng)NERDTree 的文件瀏覽欄,并且打開新的tab是,這個(gè)文件瀏覽窗口也始終顯示。 不用配置前面的autocmd vimenter * NERDTree 命令了。 他autoload目錄的插件自動(dòng)加載。 https://github.com/jistr/vim-nerdtree-tabs 有很多默認(rèn)選項(xiàng)開關(guān) ,可以參考網(wǎng)頁的說明 let g:nerdtree_tabs_open_on_gui_startup=1 這個(gè)默認(rèn)就是1了, let g:nerdtree_tabs_open_on_console_startup=1 直接在字符終端的的vim里面也默認(rèn)啟動(dòng) NERDTree 不過他這個(gè)插件加載比較慢,需要的時(shí)候再打開比較好 " 把F2映射為顯示左側(cè)目錄瀏覽樹窗口開關(guān) map <F2> :NERDTreeToggle<CR> -----------------------c/c++ 結(jié)構(gòu)解析,函數(shù)快捷查找------------------------------------------- 另外為了瀏覽文件是查看搜索函數(shù)名字,有人還喜歡安裝 cscope ctags taglist 等插件,這樣查看搜索函數(shù)定義之類的方便一點(diǎn)吧。有需要的時(shí)候在網(wǎng)上找一下相關(guān)資料吧 ------------------vim里面搜索目錄下的文件,quickfix模式和grep-------- 在vim里面直接搜索目錄下的文件的內(nèi)容 :grep sendv *.c 使用外部grep程序 :vimgrep /sendv/ *.c 使用內(nèi)部vim 模式的搜索,速度較慢 Vim 需要載入每個(gè)文件,就像編輯它們那樣。如果文件里沒有匹配,相應(yīng) 的緩沖區(qū)又會(huì)被徹底刪除 :vimgrep sendv\c *.c 使用內(nèi)部vim 模式的搜索,速度較慢 :help vimgrep greo 在windows系統(tǒng)默認(rèn)調(diào)用的是findstr /n命令來進(jìn)行搜索的的, 可以通過 :set grepprg 設(shè)置來修改設(shè)置 linux缺省為 "grep -n " 參考 http://vimcdoc./doc/options.html#'grepprg' 我安裝了git 自帶一個(gè)mingw的grep 還是改為用grep好了,比findstr命令好用吧 :set grepprg=c:/git/bin/grep.exe\ -n :grep -i sendv *.c 這樣就可以用grep的各種參數(shù)了 其他的'grepformat'設(shè)置vim怎么解析grep的輸出,一般都不用修改了吧。參考vm的文檔 搜索之后只顯示一行,可以:cc 重復(fù)顯示結(jié)果 或者打開 quickfix窗口 :cw[indow] [height] 當(dāng)存在可以識(shí)別的錯(cuò)誤時(shí),打開窗口。如果該窗口已經(jīng)打開且 沒有可識(shí)別的錯(cuò)誤,則將此窗口關(guān)閉。 :cope[n] [height] 打開一個(gè)窗口顯示當(dāng)前的錯(cuò)誤列表。 :ccl[ose] 關(guān)閉 quickfix 窗口。 :colder 和 :cnewer 合適顯示十個(gè)搜索歷史記錄 在打開的窗口里面可以直接用鼠標(biāo)雙擊和enter鍵可以跳到指定找到的指定位置去。 但以前的窗口緩沖器沒有修改才行? 在quickfix 窗口 ctrl +w 在按enter鍵,可以在新窗口打開。 ctrl + w 在窗口直接切換 在quickfix模式里面常用操作 :cc 顯示詳細(xì)信息 ( :help :cc ) :cp 跳到上一個(gè)結(jié)果 ( :help :cp ) :cn 跳到下一個(gè)結(jié)果 ( :help :cn ) :cl 列出所有結(jié)果 ( :help :cl ) :cw 如果有結(jié)果列表,則打開quickfix窗口 ( :help :cw ) :col 到前一個(gè)舊的結(jié)果列表 ( :help :col ) :cnew 到后一個(gè)較新的結(jié)果列表 ( :help :cnew ) 可以把這些命令映射到快捷建方便使用 ":nmap <F4> :cw<cr> ":nmap <F4> :cclose<cr> :nmap <F5> :cn<cr> :nmap <F6> :cp<cr> "把 f3 按鍵映射為在本目錄下文件里面搜索光標(biāo)下面的單詞 if has("win32") " grep的設(shè)置 :set grepprg=c:/git/bin/grep.exe\ -n "windows平臺(tái)用這個(gè) :nmap <F3> "*yw<cr>:grep <c-v> ./*<cr><esc>:cw<cr> else " linux 平臺(tái)用這個(gè) :nnoremap <F3> :grep <C-R><C-W> *<CR><esc>:cw<cr> endif 可以使用下面這個(gè)顯示和隱藏quickfix窗口的函數(shù),這樣cw 和 cclose功能都映射到同一個(gè)按鍵了 " 彈出和隱藏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內(nèi)部出了grep 還支持make和其他編譯工具的,可以參考vim的文檔 -------------------------------------- vim-multiple-cursors插件 “True Sublime Text style multiple selections for Vim” ====================================================== https://github.com/terryma/vim-multiple-cursors 允許同時(shí)選擇多個(gè)同名變量,同時(shí)修改。 參考上面主頁上面的動(dòng)畫演示。比較有意思的一個(gè)插件, 可以用 git clone https://github.com/terryma/vim-multiple-cursors 把目錄復(fù)制下來,然后把a(bǔ)utoload 和 doc plugin目錄復(fù)制到vim目 錄去使用就可以了。 使用起來很簡單,在normal模式,把光標(biāo)移到一個(gè)變量名字上面,再不停的按 ctrl +n 就把相同名字的變量都選中了。然后使用vim的命令就 可以編輯了。esc退回普通模式。 commentary.vim 快捷注釋代碼插件 ======================== https://github.com/tpope/vim-commentary Commentary 可以幫你注釋代碼。在normal模式輸入gcc 即可將該行注釋(Commentary 會(huì)根據(jù)當(dāng)前的 filetype 使用. 在visual 模式,額可以選擇多行,然后輸入 gc ,注釋掉整個(gè)選中內(nèi)容。 再次敲擊 gcc 即可還原注釋。我把空格鍵作為注釋映射,下面這樣: nmap <space> gcc vmap <space> gc 即在 normal 模式下,敲擊空格鍵可以注釋當(dāng)前行,在 visual 模式下,敲擊空格鍵可以注釋選中的內(nèi)容 參考了 http:///2013/11/my-vim-configuration-plugin/的設(shè)置 NERD Commente 另外一個(gè)輔助注釋代碼的插件 ================================ http://www./scripts/script.php?script_id=1218 vim-expand-region 自動(dòng)擴(kuò)展選擇區(qū)域的插件 ================================== https://github.com/terryma/vim-expand-region 可以通過 + _ 按鍵來擴(kuò)大選擇區(qū)域。比如,比如光標(biāo)在單詞中間,按一下 +,就選中整個(gè)單詞,再+就選中單詞外層的括號(hào)里面內(nèi)容。等等,可以去上面主頁去看動(dòng)畫。我只想在visual模式才使用這個(gè)功能,他插件里面會(huì)自己做一下判斷你是否已經(jīng)映射了快捷鍵的,如果已經(jīng)有了,它就不在做nmap的普通模式的映射了。 " 自動(dòng)擴(kuò)大選擇區(qū)域的插件,讓它只在visual 模式才使用+ _鍵盤映射 vmap + <Plug>(expand_region_expand) vmap _ <Plug>(expand_region_shrink YouCompleteMe =========== c/c++的最好用的自動(dòng)補(bǔ)全插件,基于clang的c/c++語法分析 強(qiáng)烈推薦閱讀下面這篇文章,體會(huì) 重復(fù)命令和 組合命令用法。 http://www.oschina.net/news/25882/why-they-are-using-vi 為什么這些死腦筋們?cè)谟?nbsp;VI ?
翻譯的還好,也許你要原版的。 Why, oh WHY, do those #?@! nutheads use vi?
后來也參考了 技巧:快速提高 Vi/Vim 使用效率的原則與途徑 http://www.ibm.com/developerworks/cn/linux/l-cn-tip-vim/ vim的官方文檔,可以用去看一下。不錯(cuò)的,詳細(xì)的說明。 http://vimdoc./htmldoc/usr_toc.html 不過好像http://www./vim/vimbook-OPL.pdf 這個(gè)更有條理一些,講的很詳細(xì),而且例子也不錯(cuò),也將很多編程相關(guān)的高級(jí)用法等。我也參考了一下這個(gè)書。 之前發(fā)的一個(gè)圖也是很好的參考。 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)站還有很多圖,給出由淺入深的學(xué)習(xí)步驟圖。 不錯(cuò)的參考圖書 Hacking Vim A cookbook to get the most out of the latest Vim editor 這個(gè)帖子提到的幾個(gè)用法也不錯(cuò) 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/ |
|