本節所用命令的幫助入口:php
:help usr_03.txt :help motion.txt :help usr_29.txt :help scroll.txt :help folding
上一篇文章中咱們介紹了一些經常使用的移動命令,本篇將繼續介紹更多的命令,使你在文檔中自由穿梭。html
[ 利用跳轉表 ]程序員
在vim中,不少命令能夠引發跳轉,vim會記住把跳轉前光標的位置記錄到跳轉表中,並提供了一些命令來根據跳轉表進行跳轉。要知道哪些命令引發跳轉,參見」:help jump-motions「。vim
使用命令」」「(兩個單引號)和」「「(兩個反引號,在鍵盤上和」~」共用一個鍵)能夠返回到最後跳轉的位置。例如,當前光標位於文件中第1234行,而後我使用」4321G「命令跳轉到第4321行;這時若是我按」」「或」「「,就會跳回到1234行。session
由於這兩個命令也屬於跳轉命令,因此第4321行也被記入跳轉表,若是你再次使用這兩個命令,就會發現本身又跳回第4321行了。wordpress
這兩個命令有一點不一樣,」「「在跳轉時會精確到列,而」」「不會回到跳轉時光標所在的那一列,而是把光標放在第一個非空白字符上。函數
若是想回到更老的跳轉位置,使用命令」CTRL-O「;與它相對應的,是」CTRL-I「,它跳轉到更新的跳轉位置(:help CTRL-O和:help CTRL-I)。這兩個命令前面能夠加數字來表示倍數。post
使用命令」:jumps「能夠查看跳轉表(:help :jumps)。ui
[ 使用標記 ]url
標記(mark)是vim提供的精肯定位技術,其功能至關於GPS技術,只要你知道標記的名字,就可使用命令直接跳轉到該標記所在的位置。
vim中的標記都有一個名字,這個名字用單一的字符表示。大寫和小寫字母(A-Za-z)均可以作爲標記的名字,這些標誌的位置能夠由用戶來設置;而數字標記0-9,以及一些標點符號標記,用戶不能進行設置,由vim來自動設置。
咱們主要講述字母標記的使用,對於數字標記和標點符號標記,請自行參閱幫助手冊(:help mark-motions)。
小寫字母標記侷限於緩衝區,也就是說,每一個緩衝區均可以定義本身的小寫字母標記,各緩衝區間的小寫字母標記彼此不干擾。若是我在文件A中設置一個標記t,而後在文件B中也能夠設置一個標記t。那麼在文件A中,能夠用」‘t「命令跳到文件A的標記t位置 ;在文件B中,能夠用」‘t「命令跳到文件B的標記t位置。若是文件在緩衝區列表中被刪除,小寫字母標記就丟失了。
大寫字母標記是全局的,它在文件間都有效。若是在文件A中定義一個標記T,那麼當使用命令」‘T「時,就會跳到文件A的標記T位置,無論你當前處於哪一個文件中。
設定一個標記很簡單,使用命令」m{a-zA-Z}「就能夠了。例如,命令」mt「在把當前光標位置設定爲標記t;命令」mT「把當前光標位置設定爲標記T。(:help m)
要跳轉到指定的標記,使用命令」‘{a-zA-Z}「或」{a-zA-Z}「。例如,命令」‘t「會跳轉到標記t;命令」‘T「會跳轉到標記T。( :help ‘)
單引號和反引號的區別和上面所講的同樣,」`「在跳轉時會精確到列,而」‘「不會回到跳轉時光標所在的那一列,而是把光標放在第一個非空白字符上。
標記也能夠被刪除,使用命令」:delmarks「能夠刪除指定標記。命令」:marks「列出全部的標記。
關於標記,有兩個很是有用的插件,一個是ShowMarks,另一個叫marks browser。
ShowMarks是我最經常使用的插件之一,它使用vim提供的sign功能以及高亮功能顯示出標記的位置。這樣,你在設定了一個標記後,它就會在你的vim窗口中顯示出標記的名字,並高亮這一行。
在你的$HOME/.vim目錄把它解壓,而後進行簡單設置。 在個人vimrc中,對ShowMarks進行了以下配置:
"""""""""""""""""""""""""""""" " showmarks setting """""""""""""""""""""""""""""" " Enable ShowMarks let showmarks_enable = 1 " Show which marks let showmarks_include = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" " Ignore help, quickfix, non-modifiable buffers let showmarks_ignore_type = "hqm" " Hilight lower & upper marks let showmarks_hlline_lower = 1 let showmarks_hlline_upper = 1
首先,使能showmarks插件,而後定義showmarks只顯示所有的大寫標記和小寫,並高亮這兩種標記;對文件類型爲help、quickfix和不可修改的緩衝區,則不顯示標記的位置。
你能夠定義本身的顏色來高亮標記所在的行,下面是個人定義,我把它放在我本身的colorscheme文件中:
" For showmarks plugin hi ShowMarksHLl ctermbg=Yellow ctermfg=Black guibg=#FFDB72 guifg=Black hi ShowMarksHLu ctermbg=Magenta ctermfg=Black guibg=#FFB3FF guifg=Black
ShowMarks插件中已經定義了一些快捷鍵:
<Leader>mt - 打開/關閉ShowMarks插件
<Leader>mo - 強制打開ShowMarks插件 <Leader>mh - 清除當前行的標記 <Leader>ma - 清除當前緩衝區中全部的標記 <Leader>mm - 在當前行打一個標記,使用下一個可用的標記名
我最常使用的是」<Leader>mm「和」<Leader>mh「,用起來很是方便。在個人vimrc中,把Leader定義爲」,「,因此每次都使用」,mm「和」,mh「來設置和刪除mark。
在vim 7.0中,若是大寫的標記被定義了,那麼函數line()不管在哪一個緩衝區裏都會返回該標記的行號,致使showmarks在每一個緩衝區裏都會把這個大寫標記顯示出來。所以我爲這個插件打了個補丁來修正此問題。
vim 7.0中也能夠真正的刪除一個mark標記,因此也改了showmarks插件的刪除標記功能。原來的功能在刪除標記時,並未真正刪除它,只是把這個標記指向緩衝區的第一行;如今則是真正刪除此標記。
若是想使用我爲showmarks打的補丁,請點擊這裏下載showmarks補丁。
用法:
Marks Browser插件能夠顯示出當前緩衝區中定義的小寫標記的位置,在你沒法對應上標記的名字和其位置時,很是有用。
下載後把它放到你的$HOME/.vim/plugin目錄便可,我爲其定義了一個快捷鍵:
"""""""""""""""""""""""""""""" " markbrowser setting """""""""""""""""""""""""""""" nmap <silent> <leader>mk :MarksBrowser<cr>
這樣,直接使用」,mk「就能夠打開Mark Browser窗口了。
下圖顯示這兩個插件工做時的效果。我在文件中定義了三個標記,一個大寫標記A,兩個小寫標記a和t。最上面的窗口是Mark Browser窗口,主編輯窗口中的高亮行及sign標記是ShowMarks插件放置的。
[ 折行 ]
在文件比較大時,在文件中移動也許會比較費力。這個時候,你能夠根據本身的須要把暫時不會訪問的文本摺疊起來,既減小了對空間的佔用,移動速度也會快不少。
vim提供了多種方法來進行摺疊,既能夠手動摺疊,也能夠根據縮進、語法,或使用表達式來進行摺疊。
程序文件通常都具備良好的結構,因此根據語法進行摺疊是一個不錯的選擇。
要啓用摺疊,首先要使能’foldenable‘選項,這個選項是局部於窗口的選項,所以能夠爲每一個窗口定義不一樣的摺疊。
接下來,設置’foldmethod‘選項,對於程序,咱們能夠選擇根據語法高亮進行摺疊。需注意的,要根據語法高亮進行摺疊,必須打開文件類型檢測和語法高亮功能,請參見我前面的文章。
下面是個人vimrc中的設置,它使用了自動命令,若是發現文件類型爲c或cpp,就啓用摺疊功能,並按語法進行摺疊:
autocmd FileType c,cpp setl fdm=syntax | setl fen
注意,vim的不少命令、選項名都有簡寫形式,在幫助手冊中能夠看到簡寫形式,也能夠按簡寫形式來help,例如,要查看’foldmethod‘選項的幫助,能夠只輸入」:help ‘fdm’「。
摺疊後的效果見下圖:
圖中以黑色背景顯示的行就是被摺疊起來的行,vim會顯示這個fold中被摺疊了多少行,以及起始行的內容。留意一下左下方的」__Tag_List__」窗口,在這個窗口中也存在着摺疊,我把macro, typedef, variable幾項摺疊起來了,而把function的摺疊打開。從該窗口最左邊的摺疊欄(:help fold-foldcolumn)也能夠看出不一樣:被摺疊的文本前顯示了」+「,打開的摺疊前顯示的是」|「。
摺疊的背景色及顯示文字等均可以修改,參閱幫助手冊(:help folding)。
下面的命令用來打開和關閉摺疊:
zo – 打開光標下的摺疊
zO – 循環打開光標下的摺疊,也就是說,若是存在多級摺疊,每一級都會被打開 zc – 關閉光標下的摺疊 zC – 循環關閉光標下的摺疊
更多的命令,請參閱手冊(:help folding)。
vim提供了一些命令在摺疊間快速移動:
[z – 到當前打開摺疊的開始
]z – 到當前打開摺疊的結束 zj – 向下移動到下一個摺疊的開始處 zk – 向上移動到上一個摺疊的結束處
我一般不喜歡把文本摺疊起來,由於我更喜歡一目瞭然的看到所有文本。你能夠根據本身的喜愛來決定是否啓用摺疊。
多說一點,手動建立的摺疊是能夠保存在session文件中的,這樣下次進入vim時能夠載入以前建立的摺疊,參見:help ‘sessionoptions’。
[ 在程序中移動 ]
vim的做者是一個程序員,這就不難理解爲何vim提供了衆多在程序中移動的命令。這裏面既包括咱們前面的文章中介紹過的利用tag文件及cscope在標籤間跳轉,也包括衆多在函數、註釋、預處理指令、程序段,及其它程序元素中移動的命令。
本文再也不詳細介紹這些命令,做爲程序員,必定要熟讀usr_29.txt!這些命令,能夠幫助你在程序中駕輕就熟的移動。
在這裏介紹兩個插件,加強了在程序中移動的功能,一個是a.vim,另一個是matchit。
a.vim的功能很是簡單,它幫助你在源文件和頭文件間進行切換,這個簡單的功能,卻很是實用,至少它爲我節省了不少時間。
下載a.vim後,把它放到你的.vim/plugin目錄就能夠了。
假設你正在瀏覽C語言的源文件,這時想修改它對應的頭文件,只須要輸入」:A「命令,就切換到頭文件了(須要源文件和頭文件在同一目錄中)。a.vim插件還定義了其它一些命令和快捷鍵,參見它的幫助手冊。
在vim中,」%「命令跳轉到與當前項目相匹配的項目。例如,當光標位置在」{「時,按下%,光標就跳轉到對應的」}「( :help %)。
但vim提供的%命令,只能在括號,或者C註釋的開始和結束( /* */),或者C編譯預處理指令間進行跳轉。對於其它程序結構,例如HTML,%命令不能從<html>標記,跳轉到對應的</html>標記。
Matchit插件則擴展了%命令的功能,使%命令能夠對其它程序語言的開始和結束標記間進行跳轉。
下載後,把這個插件放到你的.vim/plugin目錄,你就能夠用%在各類開始/結束標記間跳轉了,目前,它能夠支持Ada, ASP with VBS, Csh, DTD, Essbase, Fortran, HTML, JSP (same as HTML), LaTeX, Lua, Pascal, SGML, Shell, Tcsh, Vim, XML等語言。
[ 插入模式下的移動 ]
上面介紹的移動命令,都是在normal模式下使用的,若是想在insert模式下移動,閱讀:help ins-special-special。
你真的須要在插入模式下移動嗎?我幾乎不會!一般我會先按ESC返回Normal模式,而後再移動,當你習慣了之後,你會發現效率會更高。
[ 小結 ]
你會發現,本文的內容,和usr_03.txt幫助文檔很類似。是的,只要你學會了usr_03.txt中列出的命令,你就掌握了最經常使用最實用的vim移動命令(:help usr_03.txt)。
若是你想了解更多的移動命令,請通篇閱讀motion.txt,記住你最有可能用到的那些鍵。當你的手指可以不假思索的使用這些命令後,你在vim中就能作到指隨意動、移動如飛了。
[參考文檔]
原創文章,請閱讀頁腳的許可方式,轉載請註明:轉載自易水博客 [ http://easwy.com/blog/ ]
本文連接地址: http://easwy.com/blog/archives/advanced-vim-skills-advanced-move-method/
文章的腳註信息由WordPress的wp-posturl插件自動生成