可能你已經厭倦了輸入那些經常用到的命令了。要讓 Vim 用你習慣的設置啟動,你可以把這些設置寫到一個叫 vimrc 的文件中。Vim 會在啟動的時候執(zhí)行這個文件里的命令。如果你已經有 vimrc 文件 (例如,系統(tǒng)管理員已經為你配置好了),可以這樣編輯它:
:edit $MYVIMRC
如果你還沒有 vimrc 文件,請參考 |vimrc| 一節(jié)看看你應該在什么地方創(chuàng)建該文件。另外 ":version" 命令能告訴你 vim 要查找的 "用戶 vimrc 文件" 的名字。對于 Unix 和 Macintosh 系統(tǒng),總是使用而且也推薦使用如下文件: ~/.vimrc
對于 MS-DOS 和 MS-Windows,可以使用下面其中一個文件: $HOME/_vimrc
$VIM/_vimrc
vimrc 文件可以包含任何冒號命令。最簡單的是設置選項命令。例如,如果你想 Vim 啟動的時候始終開啟 'incsearch' 選項,可以在你的 vimrc 文件中加上: set incsearch
要使這個命令生效,你需要重啟動 Vim。后面我們還會學到如何不退出 Vim 就能讓它生效。這一章只解釋最基本的東西。想了解更多關于 Vim 腳本的知識,請參見 |usr_41.txt|。
在第一章中,我們曾經介紹過怎樣用 vimrc 示例文件 (包括在 Vim 發(fā)布中) 使 Vim 以非 vi 兼容模式啟動 (參見 |not-compatible|)。這個文件可以在這里找到: $VIMRUNTIME/vimrc_example.vim
我們在這一節(jié)中介紹這個文件中用到的一些命令。這會對你自行參數設置有一定的幫助。但我們不會介紹所有的內容。你需要用 ":help" 獲得更多的幫助。
set nocompatible
就像第一章所述,本手冊解釋在改進的方式下工作的 Vim,因此與 Vi 不完全兼容。要關閉 'compatible' 選項,'nocompatible' 可以用于完成這個功能。 set backspace=indent,eol,start
這指明在插入模式下在哪里允許 <BS>
刪除光標前面的字符。逗號分隔的三個值分別指:行首的空白字符,換行符和插入模式開始處之前的字符。 set autoindent
這使 Vim 在啟動一個新行的時候使用與前一行一樣的縮進。就是說,新行前面會有同樣多的空白字符。啟動新行是指用 <Enter>
換行,在普通模式下執(zhí)行 "o" 命令等情況。 if has("vms")
set nobackup
else
set backup
endif
這告訴 Vim 當覆蓋一個文件的時候保留一個備份。但 VMS 系統(tǒng)除外,因為 VMS 系統(tǒng)會自動產生備份文件。備份文件的名稱是在原來的文件名上加上 "~" 字符。參見 |07.4| set history=50
這個命令保存 50 個命令和 50 個查找模式的歷史。如果你想 Vim 記住多些或者少些命令,可以把這個數改成其它值。 set ruler
總在 Vim 窗口的右下角顯示當前光標位置。 set showcmd
在 Vim 窗口右下角,標尺的右邊顯示未完成的命令。例如,當你輸入 "2f",Vim 在等你輸入要查找的字符并且顯示 "2f"。當你再輸入 w,"2fw" 命令被執(zhí)行,"2f" 自動消失。+-------------------------------------------------+|text in the Vim window ||~ ||~ ||-- VISUAL -- 2f 43,8 17% |+-------------------------------------------------+^^^^^^^^^^^ ^^^^^^^^ ^^^^^^^^^^'showmode' 'showcmd' 'ruler' set incsearch
在輸入部分查找模式時顯示相應的匹配點。 map Q gq
這定義一個鍵映射。下一節(jié)會介紹更多的相關內容。這將定義 "Q" 命令用來完成與 "gq"操作符相同的功能,這是在 Vim 5.0 版前 "Q" 命令的作用。如果沒有設置這個映射,"Q" 會啟動 Ex 模式,這也許不是你想要的情況。 vnoremap _g y:exe "grep /" . escape(@", '\\/') . "/ *.c *.h"<CR>
這個映射在可視模式下拷貝已選擇的文本并在 C 文件中查找它。這是一個復雜映射。你可以看到該映射可以被用來執(zhí)行相當復雜的操作。但其本質依然是一個命令序列而已,與你直接輸入沒有什么兩樣。 if &t_Co > 2 || has("gui_running")
syntax on
set hlsearch
endif
這激活語法高亮功能,但僅在有色彩的時候才有效。而 'hlsearch' 選項告訴 Vim 高亮上次查找模式匹配的地方。"if" 命令在設置選項的時候非常有用,它使設置命令在某些條件下才執(zhí)行。更多的內容請參見 |usr_41.txt|。*vimrc-filetype* filetype plugin indent on
這啟動三個非常靈巧的機制:1. 文件類型探測當你開始編輯一個文件的時候,Vim 會試圖確定這個文件的類型。當編輯 "main.c"時,Vim 會根據擴展名 ".c" 認為這是一個 C 源文件。當你編輯一個文件前面是"#!/bin/sh" 的文件時,Vim 會把它認作 "sh" 文件。文件類型探測用于語法高亮和以下另兩項。請參見 |filetypes|。2. 使用文件類型相關的插件不同的文件需要不同的選項支持。例如,當你編輯一個 "c" 文件,用 'cindent' 選項來自動縮進就非常有用。這些文件類型相關的選項在 Vim 中是通過文件類型插件來實現的。你也可以加入自己的插件,請參見 |write-filetype-plugin|。3. 使用縮進文件當編輯程序的時候,行縮進通??梢员蛔詣記Q定。Vim 用不同的策略處理不同的文件類型。請參見 |:filetype-indent-on| 和 'indentexpr'。 autocmd FileType text setlocal textwidth=78
這使 Vim 在一行長于 78 個字符的時候自動換行,但僅對純文本文件中有效。這里包括兩個部分。其中 "autocmd FileType text" 定義個自動命令,表示當文件類型被設置為"text" 的時候,后面的命令自動執(zhí)行。"setlocal textwidth=78" 設置 'textwidth' 選項為 78,但僅對本文件有效。*restore-cursor* autocmd BufReadPost *
\ if line("'\"") > 0 && line("'\"") <= line("$") |
\ exe "normal g`\"" |
\ endif
這是又一個自動命令。這回它設置為在讀入任何文件之后自動執(zhí)行。后面那堆復雜的東西檢查 '" 標記是否已被定義,如果是,則跳轉到該標記。行首的反斜杠用于把所有語句連接成一行。這可以避免一行寫得太長,請參見 |line-continuation|。這只在 Vim 腳本文件中有效,在命令行中無效。
*05.3* 簡單鍵盤映射
映射可以使你把一系列 Vim 命令綁定為一個單獨的鍵。假設你要用一個大括號將一個特定的單詞括起來。例如,把 "amount" 變成 "{amount}
"。用 ":map" 命令,就可以讓 F5來完成這個工作。命令如下: :map <F5>
i{<Esc>
ea}<Esc>
備注
:在輸入這個命令時,<F5>
要用四個字符表示。相似地,輸入 <Esc>
不是直接按<Esc>
鍵,而是輸入五個字符。讀這份手冊時請注意
這些區(qū)別!讓我們來分解一下這個命令:<F5>
F5 功能鍵。這是命令的觸發(fā)器。當這個鍵被按下時,相應的命令即被執(zhí)行。i{<Esc>
插入 { 字符。<Esc>
鍵用于退出插入模式。e 移動到詞尾。a}<Esc>
插入 } 到單詞尾。執(zhí)行 ":map" 命令后,要在單詞兩端加上 {}
,只需要移到單詞的第一個字符上并按 F5。在這個例子中,觸發(fā)器是單獨一個鍵;它還可以是任何字符串。但若你使用一個已經存在的 Vim 命令,該命令將不再有效。最好避免出現這種情況。一個可用于映射的鍵是反斜杠。因為你很可能想定義多個映射,那就加上另一個字符。你可以映射 "\p" 為在單詞兩端加圓括號,而映射 "\c" 為加花括號,例如: :map \p i(<Esc>
ea)<Esc>
:map \c i{<Esc>
ea}<Esc>
你需要在敲入 \ 后,立即敲入 p,以便 Vim 知道它們組成一個命令。":map" 命令 (無參數) 列出當前已定義的映射,至少會包括普通模式下的那些。更多的內容參見 |40.1|。
Vim 可以通過插件增強功能。插件其實是一個當 Vim 啟動的時候能被自動執(zhí)行的腳本。簡單地把插件放到你 Vim 的 plugin 目錄中就可以使它生效。{僅當 Vim 編譯時加入 |+eval| 特性時才有效}
Vim 中有兩種插件:全局插件:用于所有類型的文件文件類型插件:僅用于特定類型的文件我們將先討論全局插件,然后涉及文件類型插件 |add-filetype-plugin|。全 局 插 件 *standard-plugin*當你啟動 Vim,它會自動加載一些插件。你不需要為此做任何事。這些插件增加一些很多人想用的,但由 Vim 腳本實現而非編譯進 Vim 中的功能。你可以在幫助索引中找到這些插件:|standard-plugin-list|。還可以參照 |load-plugin
|。*add-global-plugin*你可以加入一個全局插件使得某些功能在你每次使用 Vim 時都被開啟。添加一個全局插件只要兩步:1. 獲得一個插件的拷貝2. 把它塞進合適的目錄獲 得 一 個 全 局 插 件在什么地方可以找到插件?- 有一些與 Vim 一起發(fā)布,你可以在 $VIMRUNTIME/macros 目錄或其子目錄中找到。- 從網上下載,http://www.vim.org 收集了很多。- 在 Vim 的郵件列表中找:|maillist|。- 自己寫一個,參見 |write-plugin|。某些插件被打包在 vimball 中,參見 |vimball|。某些插件可以自動更新,參見 |getscript|。使 用 一 個 全 局 插 件首先閱讀插件包括的說明文字,看看有沒有什么特殊的限制。然后拷貝到你的插件目錄: 系統(tǒng) 插件目錄
Unix ~/.vim/plugin/PC 和 OS/2 $HOME/vimfiles/plugin 或 $VIM/vimfiles/pluginAmiga s:vimfiles/pluginMacintosh $VIM:vimfiles:pluginRISC-OS Choices:vimfiles.plugin以 Unix 系統(tǒng)為例 (假設你還沒有 plugin 目錄): mkdir ~/.vim
mkdir ~/.vim/plugin
cp /usr/local/share/vim/vim60/macros/justify.vim ~/.vim/plugin
就是這樣了!現在你可以用這個插件定義的命令調整文字了。除了把這些插件直接放進 plugin/ 目錄以外,還可以更好地組織一下,把它們放進plugin 的單獨的子目錄中。例如,可以考慮把所有 Perl 插件放置在"~/.vim/plugin/perl/*.vim"文件類型插件 *add-filetype-plugin* *ftplugins*Vim 的發(fā)布中包括一套針對不同文件類型的插件。你可以用如下命令啟用它們: :filetype plugin on
這樣就行了! 參閱 |vimrc-filetype|。如果你缺少某種文件類型的插件,或者你找到一個更好的,你可以自行添加一個。這也只需兩步:1. 獲取一個插件的拷貝2. 塞到合適的目錄。取 得 文 件 類 型 插 件你可以在找全局插件的相同地方找到文件類型插件。注意
一下插件有沒有注明文件類型,據此你可以知道這個插件是全局的還是文件類型相關的。在 $VIMRUNTIME/macros 中的是全局插件;文件類型插件在 $VIMRUNTIME/ftplugin 中。使 用 文 件 類 型 插 件 *ftplugin-name*你可以通過把插件文件放到合適的目錄中來增加一個插件。目錄的名字與前面提過的全局插件的位置一樣,但最后一級目錄是 "ftplugin"。假設你找到一個用于 "stuff" 文件類型的插件,而且你的系統(tǒng)是 Unix。那么,你可以把這個文件用如下命令移入 ftplugin目錄: mv thefile ~/.vim/ftplugin/stuff.vim
如果這個文件已經存在,你可以檢查一下兩個插件有沒有沖突。如果沒有,你可以用另一個名字: mv thefile ~/.vim/ftplugin/stuff_too.vim
這里,下劃線用來分開文件類型和其它部分 (這些部分可以由任意字符組成)。但如果你用 "otherstuff.vim" 就不行了。那是用于 "otherstuff" 類型的文件的。在 MS-DOS 上不能使用長文件名。如果你增加第二個插件,而這個插件超過 6 個字符,你就沒法用了。你可以通過使用另一層目錄來解決這個問題: mkdir $VIM/vimfiles/ftplugin/fortran
copy thefile $VIM/vimfiles/ftplugin/fortran/too.vim
總的來說,一個文件類型相關的插件的名稱是: ftplugin/<filetype>
.vim
ftplugin/<filetype>
_<name>
.vim
ftplugin/<filetype>
/<name>
.vim
這里 "<name>
" 可以是任何你喜歡的名字。例如,在 Unix 上,"stuff" 文件類型的插件可以是: ~/.vim/ftplugin/stuff.vim
~/.vim/ftplugin/stuff_def.vim
~/.vim/ftplugin/stuff/header.vim
這里, <filetype>
部分是相應文件類型的名稱。只有對應文件類型的文件才會用這個插件內的設置。插件的 <name>
部分則不重要,你可以對同一個文件類型使用多個插件。注意
插件必須以 ".vim" 結尾。請進一步閱讀:|filetype-plugins| 文件類型插件的文檔和有關如何避免映射引起的問題。|load-plugins| 全局插件的啟動時間。|ftplugin-overrule| 控制全局文件類型插件的選項。|write-plugin| 如何寫插件。|plugin-details| 關于如何使用插件的信息或者當你的插件不工作的時候如何處理。|new-filetype| 如果檢測新文件類型。
如果幸運的話,你安裝的插件還會包括幫助文件。我們這里解釋如何安裝這個幫助文件,以便你能方便地獲得新插件的幫助。我們以 "matchit.vim" 插件為例 (包括在 Vim 中)。這個插件使 "%" 命令可以在兩個對應的 HTML 標記間,Vim 腳本的 if/else/endif 間等匹配點間跳轉。這非常有用,但它不向后兼容 (這也是為什么默認的情況下它不會被激活)。這個插件有一個文檔:"matchit.txt"。我們先來把該插件拷貝到合適的位置。這次,我們在 Vim 內完成這個工作,以便利用 $VIMRUNTIME。(如果某些目錄已經存在你可以省略一些 "mkdir" 命令) :!mkdir ~/.vim
:!mkdir ~/.vim/plugin
:!cp $VIMRUNTIME/macros/matchit.vim ~/.vim/plugin
"cp" 命令是基于 Unix 的,MS-DOS 上你可以用 "copy"?,F在在某個 'runtimepath' 目錄中建立一個 doc 目錄。 :!mkdir ~/.vim/doc
再把幫助文件拷貝進去: :!cp $VIMRUNTIME/macros/matchit.txt ~/.vim/doc
現在開始玩技巧了,怎樣使 Vim 允許你跳轉到新的主題上?用 |:helptags| 命令產生一個本地的 tags 文件即可: :helptags ~/.vim/doc
現在,你可以用這個命令 :help g%
來獲得 "g%" 的幫助了。在使用如下命令的時候,可以看見一個新的條目: :help local-additions
本地幫助的標題行被自動的加入到該節(jié)了。在那里你可以看到 Vim 添加了那些本地的幫助文件。你還可以從這里跳轉到新的幫助中。要寫一個本地幫助文件,請參考 |write-local-help|。
如果要找一個選項,你可以在這里尋找?guī)椭簗options|。另一個方法是用如下命令: :options
這會打開一個新窗口,其中給出一個選項的列表,并對每個選項提供一行解釋。這些選項根據種類分組。將光標移到一個主題上然后按 <Enter>
就可以跳轉到那里。再按一下<Enter>
或者 CTRL-O
就可以跳回來。你可以通過這個窗口改變一個選項的值。例如,移到 "displaying text" 主題。然后把光標下移到這一行: set wrap nowrap
當你在上面鍵入回車,這行會改變?yōu)椋?code class="section"> set nowrap wrap 現在,這個選項被關閉了。這行的上方是對這個選項的簡要描述。將光標向上移動一行,然后按 <Enter>
,你可以跳轉到 'wrap' 的完整幫助,再用 CTRL-O
可以跳回來。對于那些值為數值或者字符串的選項,你可以編輯它的值,然后按 <Enter>
來啟用該值。例如,把光標移動到下面這行: set so=0
用 $ 移到行尾,再用 "r5" 命令修改為五,然后按 <Enter>
使修改生效?,F在如果你移動一下光標,你會發(fā)現在你的光標移到窗口邊界前,你的文字就開始滾動了。這就是選項'scrolloff' 完成的功能:它指定在距離邊界多遠的地方開始滾動文字。
Vim 中有很多選項。大部分你很少用得上。我們在這個介紹一些常用的。別忘了你可以通過 ":help" 命令獲得更多的幫助。方法是在選項命令前后加上單引號,例如: :help 'wrap'
如果你搞亂了一個選項,你可以通過在選項后加上一個 & 號把它恢復到默認值。例如: :set iskeyword&
禁 止 回 繞 行Vim 通常會對長行自動回繞,以便你可以看見所有的文字。但有時最好還是能讓文字在一行中顯示完。這樣,你需要左右移動才能看到一整行。以下命令可以關閉行的回繞: :set nowrap
當你移動到那些不能顯示的文字上,Vim 會自動向右滾動讓你看到后面的文字,要一次滾動十個字符,這樣就行了: :set sidescroll=10
這個命令不改變文件中的文本,只改變顯示方式。移 動 命 令 換 行很多命令只能在一行中移動。你可以通過 'whichwrap' 選項改變它。如下命令把這個選項設為默認值: :set whichwrap=b,s
這樣,當光標處于行首時用 <BS>
鍵可以回到前一行的結尾;當處于行尾時用 <Space>
鍵可以移動到下一行的行首。要允許 <Left>
和 <Right>
鍵也能這樣,可以用這個命令: set whichwrap=b,s,<,>
這只在普通模式中有效,要在插入模式中使 <Left>
和 <Right>
也有效,可以: :set whichwrap=b,s,<,>
,[,]
還有一些可以用的標志位,參見 'whichwrap'。顯 示 TAB 鍵文件中有 TAB 鍵的時候,你是看不見的。要把它顯示出來: :set list
現在 TAB 鍵顯示為 ^I,而 $顯示在每行的結尾,以便你能找到可能會被你忽略的空白字符在哪里。這樣做的一個缺點是在有很多 TAB 的時候看起來很丑。如果你使用一個有顏色的終端,或者使用 GUI 模式,Vim 可以用高亮顯示空格和 TAB。使用 'listchars' 選項: :set listchars=tab:>-,trail:-
現在,TAB 會被顯示成 ">---" ("-" 的個數不定) 而行尾多余的空白字符顯示成 "-"??雌饋砗枚嗔耍前??關 鍵 字'iskeyword' 選項指定哪些字母可以出現在一個單詞中: :set iskeyword
iskeyword=@,48-57,_,192-255
"@" 表示所有字母。"48-57" 表示 ASCII 字符 48-57 ,即數字 0 到 9。"192-255" 是可顯示的拉丁字符。有時你希望橫線也是關鍵字,以便 "w" 命令會把 "upper-case" 看作是一個單詞。你可以這樣做: :set iskeyword+=-
:set iskeyword
iskeyword=@,48-57,_,192-255,-
看一下新的值,你會發(fā)現 Vim 自動在 "-" 前面加了一個逗號。要從中去掉一個字符,用 "-="。例如要排除下劃線: :set iskeyword-=_
:set iskeyword
iskeyword=@,48-57,192-255,-
這回,逗號又自動被刪除了。顯 示 消 息 的 空 間當 Vim 啟動的時候,在屏幕底部有一行被用于顯示消息。當消息很長的時候,多余的部分會被截斷。這樣你只能看到一部分?;蛘呶淖肿詣訚L動,你要按 <Enter>
來繼續(xù)。你可以給 'cmdheight' 選項賦一個值,用來設定顯示消息所用的行數。例如: :set cmdheight=3
這樣意味著你用于編輯文字的空間少了,所以這實際上是一種折衷。