一、關於Vim
Emacs和Vim都是程序員專用編輯器,Emacs被稱為神的編輯器,Vim則是編輯器之神。至於兩者到底哪個更好用,網絡上兩大派系至今還爭論不休。不過,相比之下,Emacs更加復雜,已經不能算是一個編輯器了,有人這么說:Emacs是偽裝成編輯器的操作系統。與之相反,Vim的定位很明確,就是要做一個強大的編輯器。由於筆者精力有限,決定還是選擇自己認為相對簡單點的Vim來學習。因此,筆者將會在本文跟大家介紹Mac下Vim的安裝以及簡單使用。
首先,Mac系統默認已經安裝了Vim。打開終端,輸入vim,回車。可看到如下界面,即表示Vim已經安裝了。在vim里輸入":q"
在終端上,界面非常之簡潔,如果你需要更加復雜的界面以及使用Vim更多的特性,需要下載客戶端安裝。在Mac上目前存在兩個版本的Vim客戶端:
1、MacVim。使用Cocoa GUI,這是Mac上更新還很活躍的版本,也是Mac上最多人使用的版本。下載地址:http://code.google.com/p/macvim/
2、使用Carbon GUI的版本,但是這個版本目前基本上不再更新。下載地址:http://sourceforge.net/projects/macosxvim/files/
本文主要介紹MacVim,MacVim支持多窗口標簽編輯以及全屏等新特性。下載了相應MacVim壓縮包,解壓以后將MacVim.app拖入/Applications目錄下。啟動MacVim,輸入":h mvim", 按照提示,需要將mvim腳本文件拷貝到"/usr/local/bin"目錄下。打開終端,輸入命令 "cd /usr/local"以及"sudo mkdir bin",最后輸入"sudo cp -f /Users/ericli/SoftWare/MacVim-snapshot-66/mvim /usr/local/bin/",這樣就可以在終端輸入命令"mvim"來快速啟動MacVim 。如果你不想將MacVim.app放到/Applications目錄下,只需要在終端設置VIM_APP_DIR變量為你想放置MacVim.app的目錄並導入到$HOME/.bash_profile中即可,比如:export VIM_APP_DIR=$HOME/SoftWare/MacVim-snapshot-66/。在MacVim輸入":h macvim",可以查看MacVim的使用幫助介紹文檔。
現在MacVime的界面還是很簡陋,下面開始介紹如何簡單配置MacVim:
二、創建~/.bashrc文件
在終端鍵入"cd $HOME" 和“touch .bashrc”,即創建成功。打開文件,輸入“alias vim=mvim”,並保存別名變量。然后再在終端鍵入“source .bashrc”使.bashrc文件生效。這樣,在終端輸入vim和mvim都可以啟動MacVim.app了。
在這里稍微解釋下幾個文件的作用,/etc/bashrc、/etc/profile是系統全局環境變量設置,給所有用戶使用,~/.bashrc、~/.bash_profile、~/.bash_login、~/.profile是用戶目錄下的私有變量設置。當進入系統運行一個bash shell進程時,讀取環境設定過程如下:1、讀取全局環境變量設置/etc/profile,然后根據其內容讀取/etc/profile.d、/etc/bashrc等設定,但是注意/etc/profile只在第一次運行bash shell時讀取一次,而/etc/bashrc在每次運行bash shell都讀取;2、然后讀取當前用戶目錄下的~/.bash_profile、~/.bash_login或~/.profile三個中的其中一個文件的局部變量設置,而且只在第一次運行bash shell時讀取,只有讀取~/.bash_profile失敗才會讀取~/.bash_login,如果前邊兩文件讀取失敗才會讀取~/.profile;3、最后根據~/.bash_profile的內容讀取當前用戶目錄下的~/.bashrc文件中的局部環境變量設置,~/.bashrc文件在每次打開新的bash shell都讀取一次。總結一下,/etc/bashrc、/etc/profile、~/.bashrc、~/.bash_profile、~/.bash_login、~/.profile都能設置環境變量,而/etc/profile、~/.bash_profile、~/.bash_login、~/.profile可以設定路徑、環境變量等,只能登入的時候執行一次;/etc/bashrc、~/.bashrc保存路徑、命令別名等,每次打開新的bash shell都會執行一次,通常前者/etc/profile、~/.bash_profile調用后者/etc/bashrc、~/.bashrc。更詳細的資料可以參考該鏈接:http://blog.chinaunix.net/uid-24591881-id-2124780.html 。
三.配置~/.vimrc和~/.gvimrc
首先,在MacVim編輯器中輸入“:version”,看到如下圖示信息:
從上圖可以看出一些MacVim的配置信息:
$VIM系統變量的路徑為:"/Applications/MacVim.app/Contents/Resources/vim"
MacVim的系統配置文件vimrc的路徑:“$VIM/vimrc”
用戶配置文件vimrc的路徑:"$HOME/.vimrc"
MacVim編輯器的用戶初始化配置文件的路徑:"$HOME/.exrc" (默認不存在,如果需要使用則在終端輸入 “touch $HOME/.vimrc”創建)
MacVim的系統配置文件gvimrc的路徑:"$VIM/gvimrc"
用戶配置文件gvimrc的路徑:"$HOME/.gvimrc"
MacVim的菜單文件的路徑:"$VIMRUNTIME/menu.vim"
另外解釋下, $HOME為當前用戶目錄的路徑,$VIMRUNTIME路徑為"/Applications/MacVim.app/Contents/Resources/vim" . 可以在MacVim中輸入”:echo $VIMRUNTIME“來查看這些系統變量的路徑。
其次,從系統文件vimrc_example.vim和gvimrc_example.vim中copy標准的內容,保存到用戶的配置文件~/.vimrc和~/.gvimrc中。在MacVim中輸入如下命令:
:e $VIMRUNTIME/vimrc_example.vim :saveas ~/.vimrc :e $VIMRUNTIME/gvimrc_example.vim :saveas ~/.gvimrc
四、添加插件
通常有如下兩種方式添加插件:
其一:拷貝該 plugin_name.vim插件到你個人插件目錄~/.vim/plugin/下,拷貝plugin_help.txt到你個人文檔目錄~/.vim/doc/下,若存在該插件syntax的vim支持文件則放到~/.vim/syntax/目錄下,如果以上目錄不存在到終端輸入如下命令創建:
cd $HOME mkdir .vim mkdir .vim/plugin mkdir .vim/doc mkdir .vim/syntax
比如,拷貝matchit.txt到~/.vim/doc/下,拷貝matchit.vim到目錄~/.vim/plugin/下,
其二,在你的vimrc配置文件最后加一行命令:
source $VIMRUNTIME/macros/matchit.vim0
最后,還有一種不常用的方式可以安裝插件,將插件、文檔、syntax支持文件分別放到$VIMRUNTIME/plugin/ 、$VIMRUNTIME/doc/、$VIMRUNTIME/syntax/三個目錄下,或者/usr/share/vim/vim73/plugin/、/usr/share/vim/vim73/doc/、/usr/share/vim/vim73/syntax三個目錄下都可以使MacVim自動加載插件。
以上安裝插件的方法都比較麻煩,並且每個插件的文件分散到幾個文件夾去,不方便管理。在這里給各位推薦一個很方便管理插件的Vim插件vundle:https://github.com/gmarik/vundle。vundle可以使得安裝的插件的文件都放到同一個目錄下,並且簡單設置就可使用。安裝方法如下:
首先,在終端輸入如下命令:
set nocompatible " be iMproved filetype off " required! set rtp+=~/.vim/bundle/vundle/ call vundle#rc() " let Vundle manage Vundle " required! "這是vundle本身的設置 Bundle 'gmarik/vundle' " My Bundles here: "這里是設置你自己自定義的插件的設置vundle設置,注意:下載的插件git為:https://github.com/godlygeek/tabular.git,則設置為Bundle 'godlygeek/tabular';https://github.com/gmarik/vundle.git設置則為 Bundle 'gmarik/vundle' " original repos on github Bundle 'godlygeek/tabular' " vim-scripts repos,vim-scripts的訪問地址,格式則如下: Bundle 'L9' Bundle 'FuzzyFinder' " non github repos ,非git的訪問地址的,格式如下: Bundle 'git://git.wincent.com/command-t.git' " ... filetype plugin indent on " required! " " Brief help " :BundleList - list configured bundles " :BundleInstall(!) - install(update) bundles " :BundleSearch(!) foo - search(or refresh cache first) for foo " :BundleClean(!) - confirm(or auto-approve) removal of unused bundles " " see :h vundle for more details or wiki for FAQ " NOTE: comments after Bundle command are not allowed..
最后,登陸MacVim,運行:BundleInstall命令。這樣,Vundle.vim管理插件就安裝成功。接下來繼續簡單介紹下,Vundle插件的使用:
搜索新的插件:
:BundleSearch matchit
安裝新的插件:
:BundleInstall matchit.zip
最后在~/.vimrc中的注釋" vim-scripts repos下,加入如下命令並保存.vimrc文件,這樣一個插件就安裝成功了:
Bundle 'matchit.zip'
更新所有安裝的插件(這個命令會根據~/.vimrc的Bundle 設置來更新插件):
:BundleInstall
列出所有安裝的插件列表:
:BundleList
清除插件命名(這個命令我測試有些插件刪除不了,手動刪除~/.vim/bundle的相關插件的目錄,並將~/.vimrc中的相關配置去掉即可):
:BundleClean
上述中的Tabular插件是用於編碼中的字符對齊的,關於其具體用法見鏈接:https://github.com/godlygeek/tabular用法是選定一段文本,然后輸入相應的命令來根據相應的字符對齊。幾個常用的命令如下:
:Tab /= :Tab /: :Tab /:\zs :Tab /|
分別是選定文本按=、:、:\zs、|等符號對齊。
推薦一些插件:
NERD_tree : 一個文件管理插件,一些常用命令: 打開一個目錄樹( :NERDTree <啟動目錄> | <bookmark> ) 關閉目錄樹欄(:NERDTreeClose);切換目錄樹欄(:NERDTreeToggle); 定義標簽(:Bookmark <name>);定義Root標簽(:BookmarkToRoot <bookmark>)。。。。。。更多命令和用法見 :help NERD_tree。
word_complete :代碼自動補全
SuperTab :省去Ctrl-n或Ctrl-p快捷鍵,通過按tab鍵快速顯示補全代碼.
xptemplate: 快速自動完成一些if、switch、for、while結構模板代碼,支持c、c++、Lua、Ruby、PHP、html、css、JavaScript等多種語言。一般是輸入結構體的關鍵字后
,再按Ctrl-\組合鍵即可完成代碼補全,然后按Tab鍵跳轉到不同的位置替換模板內容。比如:輸入for后按Ctrl-\組合鍵即可快速完成for結構的模板代碼。
ctags : 一個掃描記錄代碼的語法元素,並記錄為tag,方便代碼定位跳轉等操作,MacVim自帶,但是據說有點問題,筆者用Vundle安裝的貌似也有問題,推薦用MacPorts安裝,然后在 ~/.gvimrc配置中加入: let Tlist_Ctags_Cmd="/opt/local/bin/ctags"。用法:在終端 cd 進入到你的項目根目錄,輸入語句即可將項目所有代碼文件打上tag:
ctags -R --c++-kinds=+px --fields=+iaS --extra=+q .
taglist : 可以用Vundle安裝,在編輯代碼文件時,輸入命令":TlistToggle"在右邊就會出現當前類的函數或變量列表。輸入命令“:tag <函數名或變量、類>”,如果只有一個文件定義了該
函數或變量、類,vim打開該文件並將光標定位到對應的位置;如果多個文件有這個函數名或變量、類的tag,將給提示,並可輸入“:tselect” ,顯示可選的文件。快捷鍵跳轉Ctrl+],Ctrl-o。
Cscope :功能跟ctags差不多,不過更加強大,MacVim默認已經支持,輸入“:version”命令查看.
OmniCppComplete : 功能跟taglist差不多。
a.vim :在.cpp文件和.h頭文件間快速切換的插件。
grep.vim : 在工程中查找詞匯的插件。
minibufexplorerpp : 操作緩存buffer窗口。
quickfix :MacVim內置安裝好了,不需要重新安裝。顯示一些命令查詢結果以及編譯錯誤等信息。
Command-t :用Commad-t命令快速查找切換文件。如果是用Vundle安裝的話,還不能使用,在MacVim中輸入“:CommandT”命令會報錯。用Vundle安裝好打開終端,輸入如下命令,等待 編譯完畢后就可以使用了:
cd ~/.vim/bundle/Command-T/ruby/command-t
ruby extconf.rb
make
NERD_commenter.vim : 注釋插件。
DoxygenToolkit.vim : 用於快速生成注釋,並由注釋生成文檔。
winmanager : 可以用Vundle安裝,管理窗口的插件,可以跟NERD_tree、Taglist插件結合,打造一個類似IDE的界面。只需要在NERD_tree.vim中加入如下代碼:
let g:NERDTree_title = "NERDTree" function! NERDTree_Start() exec 'NERDTree' endfunction function! NERDTree_IsValid() return 1 endfunction
並且在winmanager.vim的找到下面代碼,增加一句代碼:
" toggle showing the explorer plugins. function! <SID>ToggleWindowsManager() if IsWinManagerVisible() call s:CloseWindowsManager() else call s:StartWindowsManager() "NERDTree 打開的時候有一個空白窗口,需要關閉 exec 'q' end endfunction
最后在~/.gvimrc中加入如下配置:
"在vim左側顯示窗口Taglist和文件列表窗口 "let g:winManagerWindowLayout='FileExplorer,BufExplorer|TagList' let g:winManagerWindowLayout='NERDTree, BufExplorer|TagList' "打開vim時自動打開winmanager let g:AutoOpenWinManager = 1 "定義打開關閉winmanager的快捷鍵為 wt組合鍵命令 nmap wt :WMToggle<cr>
重啟,即可看到一個類似IDE的Vim界面:
五、Vim的模式與一些常用命令
i、Vim的模式:
Vim有三種模式,Normal 、Insert 、 Visual。在Normal模式下,可以輸入運行命令;在Insert模式下,可以輸入編輯文本;在Visual模式下,可以對選定的文本運行命令操作並該命令僅僅作用於選定文本。啟動Vim的默認模式是Normal模式,輸入 i、I、a、A、o、O、s、S、r、R可以進入Insert模式,其中區別在於:
命令 | 區別 |
---|---|
i | 在光標之前插入字符 |
I | 在光標所在行的所有字符開頭之前插入字符 |
a | 在光標之后插入字符 |
A | 在光標所在行的所有字符之后插入字符 |
o | 在當前光標的下面打開新的一行 |
O | 在當前光標的上面打開新的一行 |
s | 刪除當前光標下的字符 |
S | 刪除當前光標所在行的所有字符 |
r | 用新輸入的字符替換當前光標所在字符,然后立即返回Normal模式 |
R | 在當前光標位置所在字符開始往后一直用新輸入的字符替換所有原有字符 |
在Nomal模式中輸入v進入Visual模式。 在Insert模式或Visual模式中按Esc鍵即返回Normal模式。
ii、VIm的常用命令(不做特殊注釋的話,下面的命令一般在Normal模式生效,一般對文本操作的命令在Visual模式下也同樣生效)
(1)、光標的移動:
h(左)、j(下)、k(上)、l(右)移動光標。還可以在命令之前輸入數字,指定要移動多少行。比如:7h表示左移7個光標,6j表示光標下移6行。
光標向前跳多個詞到達詞首,比如5個詞,輸入5w;光標向后跳7個詞到達詞首,輸入7b。跳到3個單詞后的詞末,輸入3e;跳到3個單詞前的詞末,輸入3ge。
移動到行首第一個非空字符,輸入"^"或按Home鍵;移動到光標所在行的第一個字符(包括空格);移動到行尾,輸入"$"或按End鍵。注意,這個只有"$"或按End鍵之前加數字會生效。
向前移動到某個指定的字符,比如向前找第三個“h”,輸入”3fh“;向前把光標移動到第四個"b"字符的前一個字符上,輸入”4tb“。向后移動到某個指定的字符,比如向后查找第三個”h“,輸入”3Fh“; 向后把光標移動到第四個”b“的后一個字符上,輸入”4Tb“。這四個命令都可以使用”;“命令重復,","命令反向重復。光標不會移出當前行。
"%"命令可以將當前光標所在的括弧移動到匹配的括弧的位置,比如:從”)“移動到”(“,反之亦然。
gd命令到達光標所在處函數或變量定義之處。
”*“和”#“命令匹配當前光標所在單詞, ”*“移動光標的下一個匹配單詞,而”#“命令是移動光標到上一個匹配單詞。
移動到指定行,比如想移動到第30行,輸入30G或輸入30gg。沒有數字限制的話,G命令將光標移動到文件的尾部,gg命令移動光標到文件開始。
移動都某部分,比如到文件大約10%的行位置,輸入”10%“。
H命令移動光標到視野內的第一行,M移動到視野內的中部,L移動光標到視野內的最后一行。
確定光標的位置,輸入Ctrl-G命令。
Ctrl-u命令光標向上移動半屏,Ctrl-d光標向下移動半屏。
Ctrl-e上滾一行,Ctrl-y下滾一行。
Ctrl-f光標向前移動一整屏,Ctrl-b光標向后移動一整屏。
”zt“命令將光標所在行移動到屏幕的頂部,”zz“命令將光標所在行移動到屏幕的中部,”zb“將光標移動到屏幕的底部。
(2)、刪除字符:
刪除某個字符,移動光標到所在字符,然后輸入x或dl(光標下的字符)、X或dh(光標簽的字符);刪除多個字符,可以在x之前加數字;
刪除從當前光標到所在行上指定的某個字符之間的所有字符(包括該指定字符)
刪除某行,移動光標到所在行,然后輸入dd;
刪除換行符將兩行連起來,光標移動到要合並的兩行的第一行,然后輸入J。
利用命令組合模式,操作符-動作。d命令后跟一個光標移動動作,將刪除從當前位置到光標移動到的目標位置的全部內容。例如:刪除從當前光標向前的5個單詞,命令為d5w;刪除
從當前光標位置到行尾的字符,命令為d$。
db表示從當前位置刪除到前一個單詞的開頭。diw表示刪除光標上的單詞(不包括空格)。daw表示刪除光標上的單詞(包括空格)。
從當前光標位置上的字符一直刪除到指定的字符(包括指定字符),用df命令,比如,刪除到r,命令為dfr。從當前光標位置刪除到指定字符的前一個字符,用dt命令,比如:dtr。
dG 表示從當前光標位置一直刪除到文件的末尾。dgg表示從當前光標位置一直刪除到文件的開始。
(3)、修改字符:
修改字符的操作命令是c。作用是刪除字符后自動切換到Insert模式,比刪除操作命令多了一個切換到Insert模式的功能。
修改光標下的 字符,cl.
修改光標前的字符,ch.
修改當前光標后的3個詞,組合命令是c3w。
修改當前光標之前的單詞,cb.
修改光標上的單詞,不包括空格,ciw。
修改光標上的單詞,包括空格,caw。
修改到指定字符(包括指定字符),比如修改到e,命令為cfe。
修改到指定字符之前一個字符,比如,修改到e之前的字符,cte.
修改光標所在行一整行,cc。
從當前光標位置修改到行尾,c$。
cG,修改到文件的末尾。
cgg,修改到文件的開頭。
(4)、替換字符:
r命令是進入Insert模式的命令之一,進入Insert模式等待你輸入一個字符替換當前光標上的字符后自動返回Normal模式。
在r命令之前加入數字前綴,可以用一個字符替換當前光標后的多個字符。比如:3rp。但是例外的是,如果替換的字符是回車鍵,則只會用一個換行符替換多個字符。
使用R命令啟動Replace模式, 這個模式下在當前光標位置所在字符開始往后一直可以持續用新輸入的字符替換所有原有字符,直到你退出Replace模式。在這個模式下,使用退格
鍵Backspace,原來被替換的字符會恢復。
(5)、查詢字符:
從當前光標位置向前查找當前行上的某個指定字符的第一個字符,命令是f。比如: 查找w,fw。F也和f命令一樣,但是查找方向相反。
從當前光標位置向前查找當前行上的某個指定字符的前一個字符,命令是t。比如: 查找o之前的字符,to。T也和t命令一樣,但是查找方向相反。
向前查找字符單詞命令, ”/“后加上想查找的字符單詞。比如:”/a“ 就是查找字符”a“。想要向前查找當前光標后第三個匹配的a,還需要輸入”3n“命令。向后第三個則輸入”3N“。
向后查找字符,”?“后加上想查找的字符。想要向前查找光標后第三個匹配的字符,還需輸入”3N“。向后第三個則輸入”3n“。
查找字符通常區分大小寫的,如果不想區分大小寫,可在~/.vimrc文件中加入命令"set ignorecase"命令。
還可以將光標移動要查找的單詞上,然后輸入”*“命令,這樣將取得當前光標上的單詞並向前查找該單詞。想要向前查找光標后第2個單詞,可以輸入"2*"。
向后查找當前光標上的單詞,則可以輸入”#“。想要向后查找當前光標的第2個單詞,可以輸入”2#“。
輸入”/di“,也可能查找到單詞”media“。如果想限定di只匹配單詞開頭,可以輸入”/<di“。如果只想查找以di結尾的單詞,則可以輸入”/di>“。如果只想查找完整
的單詞"di",輸入”/<di>“。注意,”*“和”#“命令也是匹配整個單詞查找的,如果想要部分匹配,輸入”g*“和”g#“。
"/^di",只匹配行首。"/di$"只匹配行未。”/^di$“僅僅匹配包括”di“的行並不帶空格。
”/d.i“只匹配第一個字符是”d“,第二個字符是任意字符,第三個字符是”i“的字符串。
”/di/.“匹配帶特殊字符”.“的字符串”di.“。
(6)、復制字符:
使用d、x或其它命令刪除文本的時候,這些被刪除的文字將會被Vim緩存起來。可以使用p命令將該被刪除的文本在當前光標的前面(比如前一行)重新粘貼出來。
使用y(yank:抽出)操作符命令可直接把文字拷貝到寄存器中,然后用p命令粘貼到其他地方。比如:拷貝4個單詞,4yw(包括了單詞后面的空格,用ye則不包括單詞后的空格)。
yl拷貝當前光標下的字符,yh拷貝當前光標之前的字符。
yw拷貝當前光標到下一個單詞的開頭,yb拷貝當前光標到上一個單詞的開頭。yiw,拷貝光標上的單詞(不包括空格)。yaw,拷貝光標上的單詞(包括空格)。
y$拷貝到行尾。
yy命令拷貝一整行,快捷方式為Y。
yG,拷貝到文件的末尾。
ygg,拷貝到文件的開頭。
(7)、文本對象:
當處於某個單詞或句子的中間,而又想刪除整個單詞或句子時,可以使用文本對象。比如:diw可以刪除一整個單詞(iw表示Inner word,不包括單詞后的空格),如果想要包
含單詞后的空格也刪除,可用命令daw。同樣地,cis表示修改一整個句子(is表示Inner Sentence,不包括句子后的空格),如果想要包含句子后的空格也修改,則用命令cas。
同樣地,在Visual模式下,也可以用文本對象命令來選中更多的文本。比如使用aw選中當前的整個單詞,再次使用則選中多一個單詞。
文本對象的表達式:<操作命令>a<文本對象>或<操作命令>i<文本對象>,操作命令可以是任何命令,如d,y,c;文本對象可以是一個單詞w,一個句子s,一個
段落p,也可以是一個特殊的字符:"、'、)、}、]。
使用 :help text-objects 可以在幫助里查看更多的文本對象的更多命令內容。
使用:help operator 可以在幫助里查看更多的操作符命令內容。
(8)、撤銷與重做:
撤銷上一個編輯操作,輸入u;撤銷所有在前一個編輯行上的操作,輸入U;重做,輸入Ctrl+r。
"."命令表示重復最后一次除u命令、Ctrl-r命令和冒號命令之外的任何操作命令。
(9)、查找命令:
輸入"/"、”?“、”:"后,按方向鍵上箭頭或下箭頭,可以查找同樣的歷史命令記錄。
(10)、命令次數:
可以在很多命令之前加上數字,表示執行該命令的次數。
在組合命令的中,數字可以放在不同的地方。比如:修改5個單詞,5cw和c5w都一樣;刪除10個單詞,可以寫成10cw、c10w,或者2c5w、5c2w。其中的
差別在於數字修飾的命令不一樣,但是作用是一樣的。
(11)、退出:
保存文件並退出,輸入ZZ或":wq"或“:x”;放棄修改並退出,輸入“:q!”;強制退出所有打開的文件,輸入“:qa!”
(12)、放棄執行命令:
Esc按鍵可以終止大部分命令。
(13)、幫助:
輸入“:help”進入幫助窗口;輸入ZZ,退出幫助窗口。
要獲得具體的幫助,比如關於u命令的幫助,輸入類似“:help u”。
默認顯示Normal模式的幫助,要顯示其他模式的命令,可以使用“i_”前綴。
獲取命令參數的幫助,比如:“:help -e”.
使用“:helptags ~/.vim/doc” 命令產生插件的本地tags文件,從而可以在幫助中查詢插件的文檔。
(14)、標簽跳轉:
被 [ ]包起來的文字是一個標簽鏈接,光標移動到 [ ]之間,按Ctrl+]組合鍵跳轉到標簽鏈接的地方。Ctrl+t或 Ctrl + O跳回前一個標簽。
使用G命令或者”n“命令或者查找”/“命令跳到其他行后,Vim會記錄下你跳過來的地方,使用兩個單引號('')即可跳回原來的地方;或者使用Ctrl-o命令跳到較舊的地方;
Ctrl-i命令或Tab鍵跳到較新的地方。輸入":jumps"命令可以看到光標跳轉的位置列表信息。
使用”m“命令標記當前光標的位置,位置的名稱只能為a~z的單個字母(區分大小寫)。比如:定義當前光標的位置為”E“,命令為"mE"。設置后可以通過單引號'+光標名稱,或者
上句號`+光標名稱可以跳到指定的光標位置,區別是單引號 ’E命令跳轉到標記光標位置所在行的首個非空字符(列的位置跟標記的時候不同),而上句號 `E跳轉到標記
的光標原來位置(包括行和列的位置都跟標記的時候一樣)。輸入”:marks“命令可以查看所有帶名稱的標記信息列表,其中有幾個特殊的標記。比如:單引號 ' ,表示跳轉前的
位置。雙引號 "表示Normal模式最后編輯的位置。中括號 [表示文件第一行的第一列。中括號 ]表示文件最后一行的第一列。 ^表示Insert模式下最后修改的位置。 . 表示無論
是Insert模式或Normal模式最后修改的位置的開頭。
(15)、顯示Vim相關的文件路徑:
:scriptnames命令可以查找~/.vimrc或~/.gvimrc或插件等文件的路徑。
(16)、在vim中打開編輯文件命令:
:e! ~/.vimrc
保存文件:
:w
另存為:
:saveas pathFile
當同時打開多個文件,在多個文件間切換命令:
:bn //下一個文件
:bp //前一個文件
(17)、Visual模式:
之前介紹過,在Normal模式下,輸入v,進入Visual模式。這樣,你對光標作任何移動操作,從當前光標位置到移動到的位置之間的文本都會高亮,此時輸入
操作命令,比如刪除命令d,則高亮部分文本會被刪除。
在Visual模式下光標的移動操作跟Normal模式差不多。注意,在Visual模式下,"o"命令表示返回到選中文字的另一端,這跟Normal模式不同。
(18)、快捷鍵與一些常用的命令:
一些經常使用的組合命令,存在等價的快捷單字符命令:
dl 的等價快捷鍵為 x,作用刪除當前光標下的字符。
dh的等價快捷鍵為 X,作用刪除光標左邊的字符。
d$的等價快捷鍵為D,作用刪除到行尾。
cl的等價快捷鍵為s,作用修改當前光標的字符。
cc的等價快捷鍵為S,作用修改一整行。
c$的等價快捷鍵為C, 作用修改到行尾。
yy的等價快捷鍵為Y,作用拷貝一整行。
一些常用的命令的如下:
c 修改操作命令
d 刪除操作命令
y 復制到寄存器的操作命令
~ 修改選中的字符的大小寫,原來大寫的轉換成小寫,原來小寫的轉成大寫。在Visual模式和Normal模式下都能生效。 注意,
只有tiledeop設置后,這個才能成為一個操作命令,才可用該命令與其他光標移動的命令組合使用。
g~ 修改選中的字符的大小寫操作命令,原來大寫的轉換成小寫,原來小寫的轉成大寫。
gu 修改選中的字符為小寫操作命令。
gU 修改選中的字符為大寫操作命令。
! 過濾警告操作命令
gq 選中文本格式化,文本拼接組合成句子或段落命令。在Normal模式和Visual模式下都能生效。
> 選中文本向右Tab縮進。在Normal模式和Visual模式下都能生效。
< 選中文本向左Tab縮進。在Normal模式和Visual模式下都能生效。
gd 到達光標所在處函數或變量定義之處。
塊操作命令過程: 移動到想要進行操作的位置,比如行首或行尾;按組合鍵Ctrl-v,進入塊操作模式;移動光標到任何地方,選定塊操作的范圍,比
如:hjkl命令;最后輸入I(在塊的每一行首插入字符)或A(塊的每一行尾部插入)進入Insert模式,然后輸入想要插入的字符,按Esc鍵使塊的每一行同樣的位置生效。
自動補全功能:在Insert模式下,輸入一個詞的開頭,然后按組合鍵Ctrl-n或Ctrl-p,就出現自動補全的提示。
宏錄制:q + <宏> + 操作隊列 + q ,@<宏> , @@。<宏> 可以是任意單個字母(區分大小寫)或任意單個數字, q<宏> 進入recording模式,該模式下你的操作
記錄會保存到寄存器<宏> 中;然后輸入@<宏>操作命令將重新執行被記錄到寄存器<宏>中的命令;@@命令跟@<宏>的作用一樣。
可視化選擇:v,V,Ctrl-v. v,V都可以進入Visual模式,而Ctrl-v可以進入Visual Block模式(即塊操作模式),在這兩個模式下,都可以移動光標選定編輯文本。對選
定文本執行c,y,d等操作,下面有幾個常用的對選定文本的操作:
- J:把所有行連起來變成一行。
- >或<操作,文本向左右Tab縮進。
- =操作:選中文本自動縮進。
自己配置不同的語言函數自動補全的步驟:
編輯菜單:
Undo 快捷鍵 command+z
Redo 快捷鍵 shift+command+z
Cut 快捷鍵 command+x (剪切的文本可以粘貼於其他程序或vim)
Copy 快捷鍵 command+c (復制的文本可以粘貼於其他程序或vim)
Paste 快捷鍵 command+v
Select All 快捷鍵 command+a
文件菜單:
New window 快捷鍵 Command+n
New Tab 快捷鍵 Command+t
Open New File 快捷鍵愛你 Command+o
Save 快捷鍵 Command+s
Save as 快捷鍵 shifit+Command+s
Close window 快捷鍵 Shift+Command+w
Close 快捷鍵 Command+w
六、最后貼出本人的~/.vimrc和~/.gvimrc配置:
~/.vimrc配置如下:
" An example for a vimrc file.一般設置cli相關設置,即命令行相關設置,插件相關設置。原因加載順序是先讀取vimrc配置,然后讀取plugin插件,然后加載GUI,最后再讀取gvimrc配置文件。所以,GUI以及快捷鍵一般放到gvimrc里設置,有時候在vimrc設置跟界面顯示相關的沒作用,要在gvimrc里設置才有用。vimrc配置是vim,gvimrc配置文件是gvim,如果想要vim也有配色等,可以將界面相關的設置放在vimrc文件里重新設置一下。 "------------------------------------------------------------------------------- " 基本設置 "------------------------------------------------------------------------------- " When started as "evim", evim.vim will already have done these settings. if v:progname =~? "evim" finish endif "啟用Vim的特性,而不是Vi的(必須放到配置的最前邊) set nocompatible " 設置編碼 set encoding=utf-8 set fenc=utf-8 set fileencodings=ucs-bom,utf-8,cp936,gb2312,gb18030,big5 "顯示行號 set number "設置默認打開窗口大小 set lines=70 columns=100 "設置窗口透明度 set transparency=10 "設置背景色 "set bg=dark "用 koehler 調色板 colorscheme koehler "隱藏工具欄和滑動條 set guioptions=aAce "設置標簽欄 "最多30個標簽 set tabpagemax=30 "顯示標簽欄 set showtabline=2 "設定文件瀏覽器目錄為當前目錄 "set bsdir=buffer "set autochdir "保存100條命令歷史記錄 set history=100 "總是在窗口右下角顯示光標的位置 set ruler "在Vim窗口右下角顯示未完成的命令 set showcmd " 啟用鼠標 if has('mouse') set mouse=a endif "設置語法高亮 if &t_Co > 2 || has("gui_running") syntax on endif "------------------------------------------------------------------------------- " 文本操作設置 "------------------------------------------------------------------------------- "設置字體 set gfn=Courier:h15 "設置自動縮進 "設置智能縮進 set tabstop=4 set shiftwidth=4 set softtabstop=4 set expandtab set smarttab "設置Tab鍵跟行尾符顯示出來 set list lcs=tab:>-,trail:- "設置自動換行 set wrap "設置Insert模式和Normal模式下Left和Right箭頭鍵左右移動可以超出當前行 set whichwrap=b,s,<,>,[,] "設置光標移動到屏幕之外時,自動向右滾動10個字符 set sidescroll=10 "設置使~命令成為操作符命令,從而使~命令可以跟光標移動命令組合使用 set tildeop "在Insert模式下,設置Backspace鍵如何刪除光標前邊的字符。這里三個值分別表示空白字符,分行符和插入模式之前的字符。 set backspace=indent,eol,start "定義鍵映射,不使用Q命令啟動Ex模式,令Q命令完成gq命令的功能---即文本格式化。 map Q gq " CTRL-U 在Insert模式下可以刪除當前光標所在行所在列之前的所有字符. Insert模式下,在Enter換行之后,可以立即使用CTRL-U命令刪除換行符。 inoremap <C-U> <C-G>u<C-U> "使 "p" 命令在Visual模式下用拷貝的字符覆蓋被選中的字符。 vnoremap p <Esc>:let current_reg = @"<CR>gvs<C-R>=current_reg<CR><Esc> "------------------------------------------------------------------------------- " 搜索設置 "------------------------------------------------------------------------------- "打開搜索高亮 set hlsearch "忽略大小寫 set ignorecase "在查找時輸入字符過程中就高亮顯示匹配點。然后回車跳到該匹配點。 set incsearch "設置查找到文件尾部后折返開頭或查找到開頭后折返尾部。 set wrapscan "------------------------------------------------------------------------------- " 文件設置 "------------------------------------------------------------------------------- "設置當Vim覆蓋一個文件的時候保持一個備份文件,但vms除外(vms會自動備份。備份文件的名稱是在原來的文件名上加上 "~" 字符 if has("vms") set nobackup else set backup endif if has("autocmd") "啟用文件類型檢測並啟用文件類型相關插件,不同類型的文件需要不同的插件支持,同時加載縮進設置文件, 用於自動根據語言特點自動縮進. filetype plugin indent on "將下面腳本命令放到自動命令分組里,這樣可以很方便地刪除這些命令. augroup vimrcEx au! "刪除原來組的自動命令 "對於所有文件類型,設置textwidth為78個字符. autocmd FileType text setlocal textwidth=78 //vim啟動后自動打開NerdTree autocmd vimenter * NERDTree autocmd vimenter * if !argc() | NERDTree | endif "設置關閉vim NerdTree窗口 autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") && b:NERDTreeType == "primary") | q | endif "當打開編輯文件時總是自動執行該腳本,跳轉到最后一個有效的光標位置Mark標記。當一個事件正在處理時,不執行該腳本命令。 "行首的反斜杠用於把所有語句連接成一行,避免一行寫得太長. autocmd BufReadPost * \ if line("'\"") > 1 && line("'\"") <= line("$") | \ exe "normal! g`\"" | \ endif augroup END else "Enter換行時總是使用與前一行的縮進等自動縮進。 set autoindent "設置智能縮進 set smartindent endif "編輯一個文件時,你所編輯的內容沒保存的情況下,可以把現在的文件內容與編輯之前的文件內容進行對比,不同的內容將高亮顯示 if !exists(":DiffOrig") command DiffOrig vert new | set bt=nofile | r ++edit # | 0d_ | diffthis \ | wincmd p | diffthis endif "------------------------------------------------------------------------------- " 插件設置 "------------------------------------------------------------------------------- "插件相關的設置 "matchit 的字符匹配自定義設置 let b:match_words = '\<if\>:\<endif\>,' \ . '\<while\>:\<continue\>:\<break\>:\<endwhile\>' "Vundle 的配置 filetype off " required! set rtp+=~/.vim/bundle/vundle/ call vundle#rc() " let Vundle manage Vundle " required! "管理Vim插件 Bundle 'gmarik/vundle' " My Bundles here: " original repos on github "文本按字符對齊 Bundle 'godlygeek/tabular' " vim-scripts repos "實現“begin”/“end”類似地匹配,~/.vimrc文件中添加自定義的設置:let b:match_words = '\<if\>:\<endif\>,' \ . '\<while\>:\<continue\>:\<break\>:\<endwhile\>' Bundle 'matchit.zip' Bundle 'moria' Bundle 'word_complete.vim' Bundle 'SuperTab' Bundle 'xptemplate' Bundle 'ctags.vim' Bundle 'taglist.vim' Bundle 'winmanager' Bundle 'Command-T' " non github repos "Bundle 'git://git.wincent.com/command-t.git' " ... Bundle 'https://github.com/scrooloose/nerdtree.git' filetype plugin indent on " required! " " Brief help " :BundleList - list configured bundles " :BundleInstall(!) - install(update) bundles " :BundleSearch(!) foo - search(or refresh cache first) for foo " :BundleClean(!) - confirm(or auto-approve) removal of unused bundles " " see :h vundle for more details or wiki for FAQ " NOTE: comments after Bundle command are not allowed..
~/.gvimrc配置如下:
" An example for a gvimrc file.一般設置GUI和快捷鍵等 "------------------------------------------------------------------------------- " gvimrc導入的默認設置 "------------------------------------------------------------------------------- " 設置窗口底部命令有兩行 set ch=2 " 輸入文本時隱藏鼠標 set mousehide "鍵位映射,使shift-insert快捷鍵像在 Xterm程序中一樣工作 map <S-Insert> <MiddleMouse> "鼠標中鍵代表快捷粘貼 map! <S-Insert> <MiddleMouse> " Vim版本5.0或以上下面腳本工作. if version >= 500 "高亮C注釋字符串 let c_comment_strings=1 "如果沒啟動語法高亮,啟動語法高亮 if !exists("syntax_on") syntax on endif "啟動搜索高亮. set hlsearch " 設置顏色 " 文本背景為淺灰色 " 文本的最后一行為深灰色 " 光標設置成綠色, C當 ":lmap"映射激活時變成青色 " 常量設置為沒有底線,但常量的背景顏色淺一些 highlight Normal guibg=grey90 highlight Cursor guibg=Green guifg=NONE highlight lCursor guibg=Cyan guifg=NONE highlight NonText guibg=grey80 highlight Constant gui=NONE guibg=grey95 highlight Special gui=NONE guibg=grey95 endif "------------------------------------------------------------------------------- " 基本設置 "------------------------------------------------------------------------------- " When started as "evim", evim.vim will already have done these settings. " 設置編碼 set encoding=utf-8 set fenc=utf-8 set fileencodings=ucs-bom,utf-8,cp936,gb2312,gb18030,big5 "顯示行號 set number "設置默認打開窗口大小 set lines=70 columns=100 "設置窗口透明度 set transparency=10 "設置背景色 "set bg=dark "用 koehler 調色板 colorscheme koehler "隱藏工具欄和滑動條 set guioptions=aAce "開啟自帶的tab欄 set showtabline=2 "總是在窗口右下角顯示光標的位置 set ruler "在Vim窗口右下角顯示未完成的命令 set showcmd "設置語法高亮 if &t_Co > 2 || has("gui_running") syntax on endif "------------------------------------------------------------------------------- " 文本操作設置 "------------------------------------------------------------------------------- "設置字體 set gfn=Courier:h15 "設置自動縮進 set tabstop=4 set shiftwidth=4 set softtabstop=4 set noexpandtab "設置Tab鍵跟行尾符顯示出來 set list lcs=tab:>-,trail:- "設置自動換行 set wrap "設置光標移動到屏幕之外時,自動向右滾動10個字符 set sidescroll=10 "------------------------------------------------------------------------------- " 搜索設置 "------------------------------------------------------------------------------- "打開搜索高亮 set hlsearch "忽略大小寫 set ignorecase "在查找時輸入字符過程中就高亮顯示匹配點。然后回車跳到該匹配點。 set incsearch "設置查找到文件尾部后折返開頭或查找到開頭后折返尾部。 set wrapscan "------------------------------------------------------------------------------- " 文件設置 "------------------------------------------------------------------------------- "------------------------------------------------------------------------------- " 插件界面設置 "------------------------------------------------------------------------------- "ctags的設置,這里的ctags是用MacPorts安裝的,用Vundle安裝的'ctags.vim'有問題,系統自帶的ctags也有點問題 let Tlist_Ctags_Cmd="/opt/local/bin/ctags" let Tlist_Exist_OnlyWindow=1 " 如果taglist窗口是最后一個窗口,則退出vim let Tlist_Auto_Update " Update the tag list automatically "在vim左側顯示窗口Taglist和文件列表窗口 "let g:winManagerWindowLayout='FileExplorer,BufExplorer|TagList' let g:winManagerWindowLayout='NERDTree, BufExplorer|TagList' "打開vim時自動打開winmanager let g:AutoOpenWinManager = 1 "定義打開關閉winmanager的快捷鍵 nmap wt :WMToggle<cr>
本文走馬觀花地帶領大家快速瀏覽了MacVIm的一些基本功能,也相當於筆者的一個學習總結。實際上,上邊談到的每一個內容都可以獨立寫成一篇博客來介紹,對於Vim的更多具體用法還需要去進行更深入的學習。寫這篇文章,筆者參考了很多資料,在這里羅列一些出來供讀者參考。
原地址:http://blog.csdn.net/forlong401/article/details/42340883