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