vim入門,進(jìn)階與折騰入門個(gè)人習(xí)慣編譯選項(xiàng) ./configure -with-features=huge -enable-cscope -enable-fontset -enable-multibyte -enable-perlinterp -enable-rubyinterp -enable-pythoninterp 工作目錄 :pw[d] 顯示當(dāng)前工作目錄 移動(dòng): h j k l 0 ^ $ e E b B w W f F t T ; , % gg G [ ] 在vim中還存在如x,s等編輯命令,這些命令只是 編輯命令 + 移動(dòng)命令 的簡(jiǎn)答組合,如x X D C s S Y 簡(jiǎn)單總結(jié)大小寫操作命令的區(qū)別: 作用于行首: I 關(guān)于編輯命令,需要說明一點(diǎn): x,d,c這些命令會(huì)把臟數(shù)據(jù)置入vim的粘貼板(所謂臟數(shù)據(jù),也就是被命令刪除或改變的那部分?jǐn)?shù)據(jù)). 利用vim的這個(gè)特性,我們可以輕易的實(shí)現(xiàn)文本剪切,如交換兩個(gè)字符,交換兩行文本,甚至是交換兩段文本: 16進(jìn)制編輯,碼農(nóng)必備,lol :%!xxd 16進(jìn)制編輯 保存會(huì)話 Session可以忠實(shí)地記錄vim當(dāng)前的視圖,如windows和tabs,甚至是高亮.真是誰用誰知道. :mks[!] [file] 把當(dāng)前視圖保存到file,如file未指定,則缺省為Session.vim 可視化編輯 v: charwise Ctrl-V: blockwise,后文介紹. gv 重選上次選中的區(qū)域,誰用誰知道 區(qū)域 % 作用于當(dāng)前打開的整個(gè)文件 內(nèi)置命令 . 當(dāng)前行,比如說,想要作用于從當(dāng)前行開始的總共8行文本,則可以8:, :[range] substitute/from/to/[flags] 替換文本 :[range] copy {num1} {num2} 復(fù)制文本 :[range] Tabluarize /{char1} 對(duì)齊文本 甚至可以是: 查找: / ? * # :help pattern / 向前查找keyword n 重做最后一次/或? \c 查找時(shí)忽略大小寫 \< 表示一個(gè)詞的開始 tabs :help tabpage :tabnew 新建tab gt 切換到下一tab 為了方便,我的vimrc配置如下: 536 map <A-1> 1gt 盡管很dirty,好歹能工作. windows :sp {file} 橫向(horizontally)切割窗口,并在新窗口打開file 如果對(duì)所有vimer的配置做統(tǒng)計(jì),下面這段配置絕對(duì)是出現(xiàn)頻率最高的: 577 map <C-h> <C-w>h 省下的絕對(duì)不僅是一次w按鍵,vimer你懂的. 關(guān)于窗口的擴(kuò)大縮小, :help window-resize marks :help marks 我用得最多的marks操作是: ‘[ 跳到上一次被改變(changed)或者復(fù)制的文本段的第一個(gè)字符 縮進(jìn)與對(duì)齊 :help indent.txt > 向右縮進(jìn)shiftwidth個(gè)字符大小 >,<.=這三個(gè)命令的作用域既可以是選中的一段文本,也可以是一個(gè)文本對(duì)象(后文進(jìn)階部門會(huì)解釋). 進(jìn)階[N]<command> 執(zhí)行<command>N次 NOTE: [N]<command><range>和<command>[N]<range>是不一樣的,如:d3w和3dw兩個(gè)操作雖然看似一樣,但實(shí)際上它們?cè)趘im內(nèi)部的行為是有本質(zhì)區(qū)別的: [start pos]<command>[end pos] 從start pos開始執(zhí)行<command>到end pos,[]表示其內(nèi)部的命令不是必須的,也就是說,start pos和end pos都不是必須的. gg=G和^y$是兩個(gè)極好的例子: gg=G 對(duì)齊整個(gè)文件(gg跳到第一行,=對(duì)齊,G最后一行) NOTE: start pos和end pos僅僅表示一個(gè)位置(黑話叫錨點(diǎn)),至于如何從光標(biāo)移動(dòng)到start pos或者end pos,vim并沒有做出要求.于是,我們可以輕松地敲出如下命令,大大提高文本編輯的效率: df=, yf=, cf=, vf= 從當(dāng)前字符開始刪除(復(fù)制,改變,選中),直到遇到=之后 text object :help text-objects <action>i<object> 作用于對(duì)象內(nèi)部(i: inner) 其中,action可以是v,d,c,y,甚至可以是>,<等 有了文本對(duì)象,寫起代碼來更是得心應(yīng)手,如: 向右縮進(jìn)一段代碼: >i{ visual block 塊操作可以一次編輯多行文本,對(duì)有規(guī)律的編輯需要實(shí)在是一大利器.如: 宏 所謂宏,就是一段錄制好的操作. q${register}<commands>q 錄制commands到寄存器register 看起來,宏和塊操作的區(qū)別非常明顯: 宏“可以認(rèn)為”是linewise,而塊操作是blockwise,也就是說,宏對(duì)應(yīng)的是幾行文本,塊操作對(duì)應(yīng)的則是選中的block. 從這明顯的區(qū)別中我們可以推出一個(gè)重要的結(jié)論: 宏中的錨點(diǎn)有相對(duì)的概念,而塊操作是絕對(duì)的.比如說,行尾就是一個(gè)最簡(jiǎn)單的相對(duì)概念,每一行的行尾所在的錨點(diǎn)可能都不一樣,但這絲毫不影響宏正確的在所有行行尾插入一段文本.而在塊操作中,命令A(yù)(在行尾插入)對(duì)應(yīng)的語義卻變成了block的尾部,顯然,”block的尾部”這一概念對(duì)block中的所有行都是相同的,也就是所謂絕對(duì)的位置. 折騰配色 :help syntax vim自帶了許多配色方案(在這里有各種預(yù)覽),可以用colorscheme命令選擇,如: colorscheme desertEx 哪怕再性感的配色,看久了也會(huì)生煩,所幸vim自帶了synIDattr函數(shù),在vimrc中加入如下腳本: 215 nmap <C-S-P> :call <SID>SynStack()<CR> :so %安裝后就可以通過Ctrl-Shift-P組合鍵方便地查看某段文本的ID了. 得到文本ID之后,需要通過指定顏色來實(shí)現(xiàn)自定義.vim支持rgb配色(#445599之流),可是,身為毫無藝術(shù)感的二逼后臺(tái)開發(fā),我自然更偏愛skyblue這類見其名即可知其意的配色方案了:).為了讓生活容易些,可以:runtime syntax/colortest.vim直接預(yù)覽,誰用誰知道. vim的強(qiáng)大總是讓人愛不釋手,我們甚至可以自定義ID,比如說,我的代碼中TODO橫行,為了更直觀的顯示TODO項(xiàng),于是便有了這段配置: 60 highlight RipGroup ctermbg=yellow cterm=none ctermfg=black btw,在終端下切記要打開256色: set t_Co=256 再次btw,簡(jiǎn)單回答一個(gè)可以很好的區(qū)分vim新手和老鳥的問題,對(duì)Alt鍵的map為何在終端模式下如此虐心? 因?yàn)榻K端他媽的自動(dòng)在Alt前面加了Esc前綴,這該讓人多胸悶啊. 代碼折疊 :help fold.txt vim支持多種折疊方法(fold methods),如indent,expr,marker,syntax等.我偏向于按syntax折疊,配置如下: 716 set foldenable " enable folden 其中,.表示當(dāng)前行,zo表示展開,zc表示折疊,整行配置的意思就是通過空格鍵折疊代碼,效果如下: vim默認(rèn)在搜索和undo時(shí)會(huì)展開你辛辛苦苦設(shè)置好的折疊,這是讓人非常難受的,所以我會(huì)追加這么一段配置: 726 set foldopen-=search " dont open folds when I search into thm 編碼 249 set encoding=utf-8 gui設(shè)置 簡(jiǎn)單介紹一下gvim的設(shè)置,首先是字體,我的配置如下: 229 set guifont=Courier_New:h9:cANSI guifont對(duì)應(yīng)的應(yīng)為字體,guifontwide對(duì)應(yīng)所謂的寬字節(jié)字體,中文就是寬字節(jié). 我個(gè)人傾向于隱藏gvim菜單欄,工具欄,滾動(dòng)條等,以最大化代碼可視面積: 237 if has("gui_running") 我要吐槽的是,即便設(shè)置了set guioptions-=l,當(dāng)切割了橫向窗口時(shí),左側(cè)的滾動(dòng)條還是會(huì)如幽靈般出現(xiàn).各種不解后查了手冊(cè)才明白,原來還要set guioptions-=L,但是,右側(cè)滾動(dòng)條卻沒有這個(gè)坑,簡(jiǎn)直坑爹. tags :help tags tags是什么,程序員都懂.通過ctags程序可以很方便的為C++/C項(xiàng)目生成tags: ctags -R -c++-kinds=+p -fields=+iaS -extra=+q . -c++-kinds=+p 生成函數(shù)原型,該選項(xiàng)默認(rèn)關(guān)閉.同樣默認(rèn)關(guān)閉的選項(xiàng)還有l(wèi)(局部變量)和x(外部變量). 這行命令敲起來太累了,不如按一下F5來的痛快: 492 map <F5> :!ctags -R -c++-kinds=+p -fields=+iaS -extra=+q .<CR> 該命令生成的文件為當(dāng)前目錄下的tags. 作為后臺(tái)開發(fā)程序員,查閱系統(tǒng)源碼是常有的事,不妨為/usr/include目錄生成tags,然后配置vimrc,以便每次啟動(dòng)vim時(shí)自動(dòng)加載(即便有再多的autoload,即便vim啟動(dòng)速度再慢,也足以秒殺emacs了…這算是降維攻擊不?): 274 if has("win32") 需要說明的是,我偶爾需要在windows上寫代碼,所以我把linux下的/usr/include目錄拷貝到了windows上,然后用ctags windows版生成了tags,于是在windows上寫代碼也舒適了許多. 插件 vim什么都硬,只是有一點(diǎn)比較短: 擴(kuò)展性,vim在這一點(diǎn)被咖啡機(jī)emacs拉下遠(yuǎn)遠(yuǎn)不止一條街,但是對(duì)于普通青年我,卻也算是差強(qiáng)人意了.”Do one thing and do it well”,這恐怕是不少vim擁躉自我解脫的說辭. 下面是個(gè)人最喜歡的一些插件,排名不分先后: :help quickfix Quickfix是vim的標(biāo)準(zhǔn)插件,它是一個(gè)典型的plumber: 只要輸入符合error format(efm),則vim可以正確理解和識(shí)別”錯(cuò)誤列表”,并跳轉(zhuǎn)到對(duì)應(yīng)行. 我們通過gcc和grep的輸出來更好地理解error format: Error: Unclassifiable statement at hello-world.f90:9.4 gcc編譯器的錯(cuò)誤提示 可以看到,它們的格式是非常類似的. 雖然Quickfix插件原意是為了更方便地調(diào)試代碼,可是借用error format實(shí)現(xiàn)文本的匹配也是非常拉轟的: 505 " search word under cursor like source insight 簡(jiǎn)單說明一下這段配置, btw,vim在匹配時(shí)默認(rèn)使用自帶的vimgrep插件,如果覺得不方便,可以顯示指定使用grep: set grepprg=grep A.vim插件可以方便地切換源文件和頭文件,還是那句話,誰用誰知道啊. :A 在同一tab切換源文件/頭文件 NERDTree插件可以清楚地展示目錄樹,而且支持許多快捷鍵.個(gè)人最喜歡的快捷鍵是t: 在新建的tab打開光標(biāo)所對(duì)應(yīng)的文件.可惜的是,NERDTree原版插件對(duì)所新建的tab的命名看起來沒什么具體的含義,于是我用上了二手版,配置如下: 378 map <F6> <plug>NERDTreeTabsToggle<CR> OmniCppComplete借助于tags實(shí)現(xiàn)智能補(bǔ)全,Ctrl-X Ctrl-O彈出待選擇tags菜單,Ctrl-N切換至下一選項(xiàng),Ctrl-P切換至上一選項(xiàng). 個(gè)人配置如下: 318 " :help omnicppcomplete 在智能補(bǔ)全時(shí),OmniCppComplete會(huì)在當(dāng)前工作窗口上方橫向切割出一個(gè)preview窗口,preview窗口包含當(dāng)前待選項(xiàng)的各種說明.杯具的是,當(dāng)通過Ctrl-N或者Ctrl-P切換待選tags時(shí),該preview窗口將會(huì)隨著待選說明的變化而增大縮小,如果切換速度較快,則preview窗口看起來就像抖動(dòng)一般.這也讓人很難受,我們可以如下配置,關(guān)閉preview特性. 319 set completeopt=longest,menu " I really HATE the preview window!!! 另外,不要被插件名字欺騙了,OmniCppCompelete同樣支持其他語言,如python,xml等.配置如下: 331 autocmd FileType python set omnifunc=pythoncomplete#Complete 關(guān)于autocmd,找manual: help autocmd vim在插入模式下支持13種補(bǔ)全方式(:help ins-completion),普通青年記不住,于是有了Supertab插件,配置如下: 312 let g:SuperTabRetainCOmpletionType=2 " 2: remember last autocomplete type, unless I use ESC to exit insert mode 該插件展示當(dāng)前文件對(duì)應(yīng)的tags列表.配置如下: 299 if has("win32") 這是一款高亮插件.<leader>m高亮當(dāng)前光標(biāo)所對(duì)應(yīng)的單詞,再次<leader>m清除高亮.<leader>n清除所有高亮. mark.vim默認(rèn)只有下面這6種高亮顏色.如果覺得太少,可以自由地在mark.vim中添加. 68 " default colors/groups 最后推薦兩大暗爽已久的神器,一是vimperator,在firefox上高度仿真了vim.一是hhkb,其驚艷的鍵位布局徹底釋放了我被壓抑多時(shí)的小拇指(碼農(nóng)你懂的),而奢侈的電容鍵盤更讓人概嘆“RealForce的素質(zhì),那僅僅是HHKB的起點(diǎn)而已”.當(dāng)然,如果拿hhkb來碼中文,那就是另一回事了… |
|