"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" User configuration
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" turn off nice effect on status bar title
let performance_mode=0
let use_plugins_i_donot_use=0
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => General
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"我們對Vim的描述都假設它是在增強模式下, 所以並不能完全與Vi兼容
"所以首先確保關閉了 "compatible" 選項
set nocompatible
"定義當前的操作系統, 使用不同的系統時, 需要手動修改返回值
"返回值可以為 "win32" / "unix"/ "mac"
function! MySys()
return "win32"
endfunction
"在Vim中執行一些過濾操作需要知道一些shell的有關情況
"如果在使用過濾程序時遇到問題, 可以考慮檢查下面一些選項的設置:
" "shell" 指定Vim用於運行過濾程序的shell
" "shellcmdflag" 該shell的參數
" "shellquote" 用於分隔shell與過濾程序時成對包圍起過濾程序
" 的字符
" "shellxquote" 用於分隔shell與過濾程序和重定向符號時成對包
" 圍起過濾程序和重定向符號的字符
" "shelltype" shell的類型(只對Amiga有用
" "shellslash" 在命令中使用反斜杠(只對MS-Windows)這樣的
" 系統有用
" "shellredir" 用於將命令輸出重定向到文件的字符串
"
"在Unix上使用過濾程序很少會碰到問題, 因為有兩種shell: 'sh'派和
"'csh'派. Vim會檢查 "shell" 選項看是否包含了'csh'並自動設置相關的
"選項.
"但在windows上,有很多不同的shell,所以你要手工調整這些選項來讓過濾
"功能正常動作.請查看上面這些相關選項的幫助以了解更多信息
if MySys() == "unix" || MySys() == "mac"
"在Unix和類Unix操作系統中使用 "bash" 作為 "shell"
set shell=bash
else
"如果是在windows下使用cygwin, 則修改為cynwin的路徑
"set shell=E:cygwininsh
endif
"設置冒號命令和搜索命令的命令歷史列表的長度
"歷史記錄的基本思想是可以用上下箭頭鍵來找回用過的命令.
"
"實際上有四個歷史記錄, 這里將要提到的是冒號命令歷史記錄和 "/"
"及 "?" 的搜索命令歷史記錄, "/" 和 "?"都是搜索命令,所以它們共享
"同一個歷史記錄, 另外的兩類歷史記錄分別是關於表達式和input()
"函數的輸入內容的
"
"假設你用過一次 ":set" 命令, 接着用過10次其他的冒號命令之后又
"想要重復這個 ":set" 命令,你可以按下 ':' 然后按10次上箭頭鍵<Up>,
"更快的辦法是:
" ":set<Up>"
"Vim會回到上一次你以'se'開頭的命令去,這樣你離':set'命令就更
"近了一些,至少一不用按10次上箭頭<Up>了(除非這中間的10個冒號
"也都是':set'命令).
"
"上箭頭鍵<Up>會根據目前的鍵入的命令部分去跟歷史記錄進行比較,
"只有符合的才會被列出來.如果沒有找到,你還可以用下箭頭<Down>
"回到剛才輸入的部分命令進行修改,或者用Ctrl-U命令全部刪除后
"重來.
"
"要查看所有的歷史記錄,用命令:
" ":history"
"列出的是冒號的歷史記錄,要查看搜索命令的歷史記錄,用:
" ":history /"
"
"Ctrl-P效果如同<Up>,唯一的不同是它不會根據你已經鍵入的部分區
"遍歷歷史,類似地,<Down>對應物事Ctrl-N"和下箭頭鍵.Ctrl-P代表
"previous,Ctrl-N代表Next
set history=400
"這段命令開啟了Vim的三種職能:
"
"1. 自動識別文件類型
"你開始編輯一個文件時,Vim就會自動識別它是何種類型的文件,比
"如說你打開了'main.c',Vim就會根據它的'.c'擴展名知道它是一個
"類型為 "c" 的C語言源程序文件,當你編輯一個文件其第一行是
"'#!bin/sh'時,Vim又可以據此判斷它是一個類型為 "sh" 的shell腳
"本文件
"
"2. 用文件類型plugin腳本
"不同的文件類型需要搭配適合它的編輯選項.比如說你在編輯一個
" "c" 文件,那么打開 "cindent" 新非常有用,這些對某種文件類型來
"說最常用的選項可以放在一個Vim中交文件類型plugin的腳本里.
"你還可以加上你自己寫的,請參考 "write-filetype-plain".
"
"3. 使用縮進定義文件
"編輯程序的時候,語句的縮進可以讓它自動完成.Vim為眾多不同的
"文件類型提供了相應的縮進方案.請參考 "filetype-indent-on" 和
" "indentexpr" 選項
filetype on
if has("eval") && v:version>=600
filetype plugin on
filetype indent on
endif
"設置當正在編輯的文件被外部的其它程序所修改后自動在Vim加載
if exists("&autoread")
set autoread
endif
"可以為不同模式分別打開鼠標:
" "n" 普通模式
" "v" 可視模式
" "i" 插入模式
" "c" 命令行模式
" "h" 編輯幫助文件時,所有前面的模式
" "a" 所有前面的模式
" "r" hit-enter 和 more-prompt 提示時
if exists("&mouse")
set mouse=a
endif
"定義 "mapleader"變量
"要定義一個使用 "mapleader" 變量的映射,可以使用特殊字串
" "<Leader>".它會被 "mapleader" 的字符串所替代.如果
" "mapleader" 未設置或為空,則用反斜杠代替,例如:
" ":map <Leader>A oanother line<Esc>"
"和下面一樣:
" :map \A oanother line<Esc>
"但是當:
" :let mapleader = ","
"時,又相當於:
" :map ,A oanother line<Esc>
"
"注意: "mapleader" 的值僅當定義映射時被使用.后來改變的
" "mapleader" 不會影響到已定義的映射
let mapleader = ","
let g:mapleader = ","
"設置快速保存
"
" "nmap"表示普通模式下的映射定義,
" ":map" 和 ":map!" 命令為多個模式定義和回顯映射.在 Vim 中你可
"以使用 ":nmap", ":vmap", ":omap", ":cmap" 和 ":imap" 命令來對每
"個不同的模式分別定義映射.
"當列出映射時,前面兩欄的字符表示 (可有多個):
" 字 符 模 式
" "<Space>" 普通、可視、選擇和操作符等待
" "n" 普通
" "v" 可視和選擇
" "s" 選擇
" "x" 可視
" "o" 操作符等待
" "!" 插入和命令行
" "i" 插入
" "l" 插入、命令行和 Lang-Arg 模式的 ":lmap" 映射
" "c" 命令行
"
" ":xa!" 保存所有修改過的緩沖區,甚至包括只讀的,但后退出Vim.不過,
"如果有無名或者其它元嬰寫入失敗的緩沖區,Vim仍然不會退出.
"
" ":w!" 和 ":w" 類似,但即使 "readonly" 已置位或者有其他原因寫入被拒
"絕,還是強制寫入.
"注意:這可能會改變文件的權限和所有者,或者破壞(符號)連接.但在
" "cpoptions" 里加上 "W" 標志位可以避免這一點.
nmap <leader>x :xa!<cr>
nmap <leader>w :w!<cr>
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Colors and Font
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"打開語法高亮:
" ":syntax enable"
"實際上,它只是執行如下命令:
" ":source $VIMRUNTIME/syntax/syntax.vim"
"
" ":syntax enable" 命令會保持你當前的色彩設置.這樣,不管在使用此
"命令的前后,你都可以用 ":highlight" 命令設置你喜歡的顏色.如果你
"希望Vim用缺省值覆蓋你自己的,只要用:
" ":syntax on"
if MySys()=="unix"
if v:version<600
if filereadable(expand("$VIM/syntax/syntax.vim"))
syntax on
endif
else
syntax on
endif
else
syntax on
endif
"國際化設置
" "multi_byte" 指韓國語和其他多字節語言支持
if has("multi_byte")
" "fileencodings" 缺省為 "ucs-bom",這是一個字符編碼的列表,開始
"編輯已存在的文件時,參考此選項.如果文件被讀入,Vim嘗試使用本
"列表第一個字符編碼.如果檢測到錯誤,使用列表的下一個.如果找
"到一個能用的編碼,設置 "fileencoding" 為該值.如果全部失敗,
" "fileencoding" 設為空字符串,這意味着使用 "encoding" 的值.
"
"警告:轉換可能導致信息的丟失!如果 "encoding" 為 "utf-8" (或者某
"個其它的Unicode變種),那么轉換的結果通過逆轉換很有可能產生
"相同的文本.相反,如果 "encoding" 不是 "utf-8",一些非ASCII的字符
"可能會丟失.
set fileencodings=ucs-bom,utf-8,cp936,big5,euc-jp,euc-kr,latin1
" "v:lang" 運行環境當前的消息locale設置.它使得Vim腳本能得到當
"前使用的語言.技術細節:這就是LC_MESSAGES的值.該值和系統有關.
"
" "=~" 為匹配正則表達式,詳細介紹如下表:
" 使用 "ignorecase" 匹配大小寫 忽略大小寫 ~
"等於 "==" "==#" "==?"
"不等於 "!=" "!=#" "!=?"
"大於 ">" ">#" ">?"
"大於等於 ">=" ">=#" ">=?"
"小於 "<" "<#" "<?"
"小於等於 "<=" "<=#" "<=?"
"匹配正規表達式 "=~" "=~#" "=~?"
"不匹配正規表達式 "!~" "!~#" "!~?"
"相同實例 "is"
"不同實例 "isnot"
"
"設置CJK環境的編碼選擇
if v:lang =~ "^zh_CN"
set encoding=cp936
set termencoding=cp936
set fileencoding=cp936
elseif v:lang =~ "^zh_TW"
set encoding=big5
set termencoding=big5
set fileencoding=big5
elseif v:lang =~ "^ko"
set encoding=euc-kr
set termencoding=euc-kr
set fileencoding=euc-kr
elseif v:lang =~ "^ja_JP"
set encoding=euc-jp
set termencoding=euc-jp
set fileencoding=euc-jp
endif
"在必要的時候,使用utf-8替代CJK的設置
if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
set encoding=utf-8
set termencoding=utf-8
set fileencoding=utf-8
endif
endif
if has('gui_running')
set guifont=InConsolata:h14
endif
" "ambiwidth" 缺省為 "single"
"只有在 "encoding" 和 "utf-8" 或別的Unicode編碼時才有效.告訴Vim怎
"么處理東亞二義性寬度字符類(East Asian Width Class Ambiguous)(例
"如歐元符號,注冊記號,版權記號,希臘字母,西里爾字母等等)
"
"目前有兩個可能的選擇:
" "single": 使用和US-ASCII字符相同的寬度.多數用戶希望如此.
" "double": 使用US-ASCII字符兩倍的寬度
"
"在一些 CJK 字體里,這些字符的字形寬度完全由它們在傳統的CJK編碼
"里占據字節的數目決定.那些編碼中,歐元,注冊記號,希臘/西里爾字母
"等占據兩個字節,因而它們在這些字體里用'寬'字形顯示.這也包括文本
"文件里制表用的一些畫線字符.因此如果GUI Vim使用CJK字體,或者在使
"用CJK字體的終端(模擬器)(包括帶有 "-cjkwidth" 選項的xterm)里運
"行Vim,應把該選項設為 "double",這樣可以匹配這些字體里Vim實際看
"到相關字形的寬度.在Windows 9x/ME 或 Windows 2k/XP 上,如果系統
"locale 為 CJK locale,也應把本選項設為 "double"
if exists("&ambiwidth")
set ambiwidth=double
endif
" "guioptions" 選項只有在 Vim 的 GUI 版本才有效.它是字母的序
" 列,分別描述 GUI 應該使用的部件和選項.
" 建議使用 ":set" 的 "+=" 和 "-=" 特性,這可以避免未來版本增加
" 新的標志位時出現的問題.
"下面是合法的標志位字母:
" "a" 自動選擇: 如果存在,無論什么時候啟動可視模式或者擴展可
" 視區域,Vim 都試圖成為窗口系統全局選擇區的擁有者.這意
" 味着可以粘貼高亮的可視文本到其它應用程序甚至 Vim 自身.
" 如果因為在文本之上進行了操作,或者應用程序需要粘貼選擇
" 區等原因使得可視區域被終止,高亮文本會被自動抽出到 "*"
" 選擇寄存器里.這樣,即使在可視模式結束以后,選擇區仍然可
" 以被粘貼到別的應用程序.
" 如果不存在,Vim 不會成為窗口系統的全局選擇區,除非使用
" "*" 寄存器進行抽出和刪除操作,這時該選擇區被顯式地占有.
" 同樣適用無模式的選擇.
"
" "A" 自動選擇無模式的選擇.類似於 "a",但僅限於無模式的選擇.
" "guioptions" 自動選擇可視 自動選擇無模式
" "" -- --
" "a" 是 是
" "A" -- 是
" "aA" 是 是
"
" "c" 簡單的選擇使用控制台對話框而不是彈出式對話框.
"
" "e" "showtabline" 要求時,加入標簽頁.
" "guitablabel" 可用來改變標簽文本.
" 如果沒有 "e",可能使用非 GUI 標簽頁行.
" 只有一些系統支持 GUI 標簽頁,現在包括 GTK, Motif,
" Mac OS/X 和 MS-Windows.
"
" "f" 前台: 不用 fork() 從啟動外殼分叉出本 GUI 進程.用於
" 需要等待編輯器完成的程序 (例如,e-mail 程序).你也可
" 以用 "gvim -f" 或 ":gui -f" 來在前台啟動 GUI.
" 注意: 在 vimrc 文件里設置本選項.讀入 gvimrc 文件時
" 分叉操作可能已經發生.
"
" "i" 使用 Vim 圖標.GTK 和 KDE 上它出現在窗口的左上角.在
" 非 GTK 的環境上,因為 X11 的限制,它是黑白的.要得到
" 彩色圖標,見 "X11-icon"
"
" "m" 使用菜單欄
"
" "M" 不執行系統菜單腳本 "$VIMRUNTIME/menu.vim".
" 注意:本標志位必須在 ".vimrc" 文件里加入,在打開語法
" 或文件類型識別之前 (執行 "gvimrc" 文件時,系統菜單
" 已經載入;而 ":syntax on" 和 ":filetype on" 命令同
" 樣會載入菜單).
"
" "g" 灰色菜單項: 使得不活動的菜單項變灰.如果沒有包含 "g",
" 不活動的菜單項完全不顯示.
" 特例: Athena 總會使用灰色的菜單項.
"
" "t" 包含可撕下的菜單項.目前只用於 Win32, GTK+ 和
" Motif 1.2 GUI.
"
" "T" 包含工具欄.目前只用於 Win32, GTK+, Motif, Photon
" 和 Athena GUI.
"
" "r" 右邊的滾動條總是存在.
"
" "R" 如有垂直分割的窗口,右邊的滾動條總是存在.
"
" "l" 左邊的滾動條總是存在.
"
" "L" 如有垂直分割的窗口,左邊的滾動條總是存在.
"
" "b" 底部的 (水平) 滾動條總是存在.它的大小取決於最長的可
" 見行,或者如果包含 'h' 標志位的話,光標所在的行.詳情
" 可見 "gui-horiz-scroll"
"
" "h" 限制水平滾動條的大小為光標所在行的長度,以減少計算量.
" 是的,如果你真的想要,左右兩邊都可以有滾動條.詳情可見
" "gui-scrollbars"
"
" "v" 對話框使用垂直的按鈕布局.如果不包含,傾向使用水平布
" 局,但如果空間不夠,還是用垂直的布局.
"
" "p" 使用 X11 GUI 的指針回調.有些窗口管理器需要.如果光標
" 不閃爍或者在一定場合下變空,考慮增加此標志位.必須在
" 啟動GUI 之前完成.在你的 "gvimrc" 里設置.在 GUI 啟動
" 后增加或刪除不會有任何效果.
"
" "F" 增加信息頁腳.只適用於 Motif.見 "gui-footer".
if has("gui_running")
set guioptions-=m " 關閉菜單欄
set guioptions-=T " 關閉工具欄
set guioptions-=l " 關閉左邊滾動條
set guioptions-=L " 關閉垂直分隔窗口左邊滾動條
set guioptions-=r " 關閉右邊滾動條
set guioptions-=R " 關閉垂直分隔窗口右邊滾動條
if MySys()=="win32"
" "autocmd" / "au" 定義自動命令
"注意: ":autocmd" 命令不能有其他命令緊跟其后,因為"|"
"命令是該命令的一個組成部分.
"
" ":au[tocmd] [group] {event} {pat} [nested] {cmd}"
"把 {cmd} 加到 Vim 在匹配 {pat} 模式的文件執行 {event}
"事件時自動執行的命令列表.Vim 把 {cmd} 加到已有的自動
"命令之后,從而使自動命令的執行順序與其定義的順序相同.
"關於 [nested],參見 "autocmd-nested".
"注意 ":autocmd" 的參數里的特殊字符 (例如, "%", "<cword>")
"在定義時不會被擴展,而是在事件發生並執行 {cmd} 的時候才
"進行.唯一的例外是 "<sfile>" 在定義時擴展.
"
" "GUIEnter" 成功啟動 GUI 並打開窗口后自動命令事件.用
" gvim 的時候,它在 VimEnter 之前發生.在 .gvimrc 里可用
" 它來定位窗口:
" ":autocmd GUIEnter * winpos 100 50"
"
" "si" / "simalt" 模擬 Alt-{key} 組合鍵.
" ":si[malt] {key}"
" {僅適用 Win32 版本}
"
"正常情況下,為了增加鍵映射 (map) 的數量,Vim 控制所有
"Alt-{key} 組合鍵.但是這樣做可能與用 Alt-{key} 訪問菜單
"的標准方法沖突.一個快速的解決辦法是:設置 "winaltkeys"
"選項的值為 "yes".但是這樣阻止了所有與Alt 鍵有關的映射.
"另一個辦法是:設置 "winaltkeys" 選項為 "menu".這樣與菜
"單有關的快捷鍵有 Windows 管理,其余的與 Alt 相關的映射
"仍然好用.但這樣又產生了對當前狀態的依賴性.
"要解決這個問題,就要用 ":simalt" 命令告訴 Vim
"( "winaltkeys" 不要設置為 "yes") 虛擬一個 Windows 風
"格的 Alt 按鍵行為.你可以用它來映射 Alt 組合鍵 (或者任
"何其它鍵) 來產生標准的 Windows 操作.下面是一些例子:
" ":map <M-f> :simalt f<CR>"
"這個命令通過把 Alt-F 映射為模擬按鍵的 Alt 和 F,使你按
"下 Alt-F 時彈出 "文件" 菜單 (對於缺省的 Menu.vim 而言)
" ":map <M-Space> :simalt ~<CR>"
"這個命令通過映射 Alt-Space 彈出 Vim 窗口的系統菜單.
"注意: ~ 在 simalt 命令里代表 <Space> (空格).
" ":map <C-n> :simalt ~n<CR>"
"把 CTRL-N 映射成 Alt-Space + N.也就是打開窗口的系統菜
"單,然后按 N,最小化 Vim窗口
"
"這個選項是模擬彈出菜單中使用最大化的快捷鍵 "x"
if has("autocmd")
au GUIEnter * simalt ~x
endif
endif
" "colorscheme" / "colo" 載入色彩方案
" ":colo[rscheme] {name}"
"載入色彩方案 {name}.
"它會在 'runtimepath' 里搜索 "colors/{name}.vim",載入第一
"個找到的文件.
"要看到當前激活的色彩方案的名字 (如果有的話):
" ":echo g:colors_name"
"它不能遞歸調用,所以你不能在色彩方案腳本里使用 ":colorscheme"
"色彩方案載入后"激活 "ColorScheme" 自動命令事件.關於如何
"編寫色彩方案文件的信息:
" ":edit $VIMRUNTIME/colors/README.txt"
if v:version > 601
colorscheme torte
endif
else
if v:version > 601
colorscheme torte
endif
endif
"當打開的文檔中含有多種語言的時候,單一使用某一種文件類型的高亮
"方式必然會非常難看,比如說一個介紹J2EE的文件,里面必然有Java的代
"碼,也會存在很多XML的代碼,這個時候需要隨時切換不同的高亮方案
map <Leader>1 :set syntax=java<CR>
map <Leader>2 :set syntax=c<CR>
map <Leader>3 :set syntax=xhtml<CR>
map <Leader>4 :set syntax=python<CR>
map <Leader>5 :set ft=javascript<CR>
map <Leader>0 :syntax sync fromstart<CR>
"用 "cursorline" 高亮光標所在的屏幕行.用於方便定位光標.屏幕刷新
"會變慢.
"激活可視模式時,為了容易看到選擇的文本,不使用此高亮.
if has("gui_running")
if exists("&cursorline")
set cursorline
endif
endif
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Fileformat
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" "fileformats" / "ffs"
"給出換行符(<EOL>)的格式,開始編輯新緩沖區或者讀入文件到已有的緩
"沖區時,嘗試這些格式:
" - 如果為空,總是使用 "fileformat"定義的格式.不自動設置該選項.
" - 如果設為一個名字,總是為打開的新緩沖區使用該格式,也為該緩
" 沖區相應地設置 "fileformat".文件讀入已有的緩沖區時,使用
" "fileformats" 給出的名字,不管該緩沖區設定的 "fileformat"
" 是什么.
" - 如果給出多於一個以逗號分隔的名字,讀入文件時會進行自動
" <EOL>檢測.
" 開始編輯文件時,這樣檢查 <EOL>:
" 1. 如果所有行都以 <CR><NL> 結尾,而 "fileformats" 包含
" "dos" 的話, "fileformat" 設為 "dos".
" 2. 如果找到一個<NL>而 "fileformats" 包含 "unix"的話,
" "fileformat"設為 "unix".注意 如果找到的 <NL> 沒有前
" 導 <CR>, "unix" 比 "dos" 優先.
" 3. 如果 "fileformats" 包含 "mac". "fileformat" 設為 "mac".
" 這意味着 "mac" 只有在沒有給出 "unix" 或者在文件里沒有
" 找到 <NL>,並且沒有給出 "dos" 或者沒有在文件里找到
" <CR><NL> 時才會使用.如果先選擇 "unix",但第一個 <CR> 出
" 現在第一個 <NL> 之前,而文件里的 <CR> 比 <NL> 多的話,
" "fileformat" 也設為 "mac".
" 4. 如果還是不能設置 "fileformat",使用 "fileformats" 的第
" 一個名字.
" 讀入文件到已有的緩沖區時,完成相同的步驟,但如同 "fileformat"
" 已經為該文件合適地設置過,不改變該選項.
"如果置位 "binary",不使用 "fileformats" 的值.
"
" 對於使用 DOS 類型的 <EOL> (<CR><NL>) 的系統來說,讀入待執行的腳本
"( ":source" ) 或者 vimrc 文件時,可能進行自動 <EOL> 的檢測:
" - 如果 "fileformats" 為空,沒有自動檢測.使用 DOS 格式.
" - 如果 "fileformats" 設為一到多個名字,進行自動檢測.它基於文
" 件中的第一個 <NL>: 如果在它之前有一個 <CR>,使用 DOS 格式,
" 不然,使用 Unix格式.
" 另見 |file-formats|.
"為了后向兼容: 如果設置此選項為空字符串或者單一格式 (沒有包含逗號),
"復位 "textauto",否則置位 "textauto".
"注意: 如果置位 "compatible",本選項被設為 Vi 的缺省值.相反,如果復位
" "compatible",本選項被設為 Vim 的缺省值.
set fileformats=unix,dos,mac
"給出當前緩沖區的 <EOL> 格式,用於從文件讀入緩沖區和把緩沖區寫回文件:
" "dos" <CR> <NL>
" "unix" <NL>
" "mac" <CR>
"
"MS-DOS,MS-Windows,OS/2 的缺省: "dos",
"Unix 缺省: "unix",
"Macintosh 缺省: "mac"
"
"如果使用 "dos",文件尾的 CTRL-Z 被忽略.
"見 "file-formats" 和 "file-read|"
"文件使用的字符編碼見 "fileencoding".
"如果設置 "binary",忽略 "fileformat" 的值.文件輸入/輸出如同它被設為
" "unix" 那樣.
"文件開始編輯時,如果 'fileformats' 非空而 'binary' 關閉,本選項被
"自動設置.
"開始編輯文件后,如果設置該選項, "modified" 選項被置位,因為文件被認為
"和當初寫入時已經不同.
"本選項在 "modifiable" 關閉時不能改變.
"
"為了后向兼容: 如果本選項設為 "dos",置位 "textmode",否則,復位之.
"
"這里的意思是定義快速轉換文件格式的快捷鍵映射
nmap <leader>fd :set ff=dos<cr>
nmap <leader>fu :set ff=unix<cr>
nmap <leader>fm :set fm=unix<cr>
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => VIM userinterface
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" "scrolloff" / "so" (缺省為 0) 光標上下兩側最少保留的屏幕行數
"這使你工作時總有一些可見的上下文.我們這里設置的主要用處其實是
"可以用鼠標單擊屏幕的前N行或者后N行來直接進行屏幕的上下滾動.對
"於習慣了鼠標操作的用戶來說將會非常的方便.
"
"如果你設置此選項為很大的值 (比如 999),光標所在的行將總定位在
"窗口的中間位置 (除非你非常靠近文件開始或者結束的地方,或者有長
"行回繞).
"水平滾動見 'sidescrolloff'.
"注意: 如果置位 'compatible',該選項被設為 0.
set so=0
" "wildmenu" / "wmnu" (缺省關閉) 命令行補全以增強模式運行
" {僅當編譯時加入 "+wildmenu" 特性才有效}
" "wildmenu" 打開時,命令行補全以增強模式運行,按下 "wildchar"
" (通常是 <Tab>) 啟動補全.這時,在命令行的上方顯示可能的匹配,
" 然后高亮首個匹配 (如果有狀態行,覆蓋之).顯示前項/后項匹配的
" 熱鍵,如 <Tab> 或 CTRL-P/CTRL-N,移動高亮到合適的匹配上.
"
" 使用 "wildmode" 時,指定 "full" 會啟用 "wildmenu" 模式.
" "longest" 和 "list" 則不會啟動 "wildmenu" 模式.
"
" 如果多個匹配超過一行,在右側顯示 ">" 和/或在左側顯示 "<".需
" 要的話,滾動狀態行.
"按下不用於選擇補全項的鍵時,放棄 "wildmenu" 模式.
"
" "wildmenu" 激活時,下面的鍵有特殊含義:
" "<Left>" / "<Right>" 選擇前項/后項匹配 (類似於
" CTRL-P/CTRL-N)
" "<Down>" 文件名/菜單名補全中: 移進子目錄
" 和子菜單.
" "<CR>" 菜單補全中,如果光標在句號之后:
" 移進子菜單.
" "<Up>" 文件名/菜單名補全中: 上移到父目
" 錄或父菜單.
"
"這使得控制台上有菜單可用 "console-menus"
"如果你喜歡 <Left> 和 <Right> 鍵移動光標而不是選擇不同的匹
"配,用:
" ":cnoremap <Left> <Space><BS><Left>"
" ":cnoremap <Right> <Space><BS><Right>"
"
" "WildMenu" 高亮用於顯示當前匹配 "hl-WildMenu".
set wildmenu
" "ruler" / "ru" (缺省關閉) 標尺
" {僅當編譯時加入 "+cmdline_info" 特性才有效}
"顯示光標位置的行號和列號,逗號分隔.如果還有空間,在最右端顯
"示文本在文件中的相對位置:
" "Top" 首行可見
" "Bot" 末行可見
" "All" 首末兩行都可見
" "45%" 文件中的相對位置
"如果設置 "rulerformat",它決定標尺的內容.
"每個窗口都有自己的標尺.如果窗口有狀態行,標尺在那里顯示.否
"則,它顯示在屏幕的最后一行上.如果通過 "statusline" 給出狀
"態行 (亦即,非空),該選項優先於 "ruler" 和 "rulerformat".
"如果顯示的字符數不同於文本的字節數 (比如,TAB 或者多字節字
"符),同時顯示文本列號 (字節數) 和屏幕列號,以連字符分隔.
"空行顯示 "0-1"
"空緩沖區的行號也為零: "0,0-1"
"如果置位 "paste" 選項,本選項被復位.
"如果你不想一直看到標尺但想知道現在在哪里,使用 "g CTRL-G"
"注意: 如果置位 "compatible",該選項被復位
set ruler
" "cmdheight" / "ch" (缺省為 1) 命令行使用的屏幕行數
"有助於避免 "hit-enter" 提示.
"此選項值保存在每個標簽頁里,從而每個標簽頁可有不同的值.
set cmdheight=2
" ":nu" / ":number" 顯示行號
" ":[range]nu[mber] [count] [flags]"
"和 ":print" 相同,但每行之前顯示行號 (也參見 "highlight"
"和 "numberwidth" 選項).
set nu
" "lazyredraw" / "lz" (缺省關閉)
"如果置位本選項,執行宏,寄存器和其它不通過輸入的命令時屏
"幕不會重畫.另外,窗口標題的刷新也被推遲.要強迫刷新,使用
" ":redraw".
set lz
" "hidden" / "hid" (缺省關閉)
"如果關閉, "abandon" 放棄時卸載緩沖區.如果打開, "abandon"
"放棄時隱藏緩沖區.當然,如果緩沖區仍然在別的窗口里顯示,
"它不會被隱藏.
"在緩沖區列表里移動的命令有時會隱藏緩沖區,即使關閉 "hidden"
"選項也是如此,條件是: 緩沖區被修改過, "autowrite" 關閉
"或者不能寫入,並且使用 "!" 標志位.另見 "windows.txt".
"
"如果只想隱藏一個緩沖區,使用 "bufhidden" 選項.
" ":hide {command}" 為單個命令關閉本選項 ":hide".
"警告: 對隱藏緩沖區的修改很容易忘記. ":q!" 或 ":qa!" 時
"三思而后行!
set hid
" "backspace" / "bs" (缺省為 "")
"影響 <BS>,<Del>,CTRL-W 和 CTRL-U 在插入模式下的工作方
"式.它是逗號分隔的項目列表.每個項目允許一種退格刪除的內
"容:
" 值 效果
" "indent" 允許在自動縮進上退格
" "eol" 允許在換行符上退格 (連接行)
" "start" 允許在插入開始的位置上退格;CTRL-W 和
" CTRL-U 到達插入開始的位置時停留一次.
"
"如果該值為空,使用 Vi 兼容的退格方式.
"
"為了和 5.4 及更早的版本后向兼容:
" 值 效果
" "0" 等同於 ":set backspace=" (Vi 兼容)
" "1" 等同於 ":set backspace=indent,eol"
" "2" 等同於 ":set backspace=indent,eol,start"
"
"如果你的 <BS> 或 <Del> 鍵不合你的期望,見 ":fixdel".
"注意: 如果置位 "compatible",該選項被設為 "".
set backspace=eol,start,indent
" "whichwrap" / "ww" (Vim 缺省: "b,s",Vi 缺省: "")
"使指定的左右移動光標的鍵在行首或行尾可以移到前一行
"或者后一行.連接這些字符,可以讓所有指定的鍵都有此功能:
" 字符 鍵 模式
" "b" <BS> 普通和可視
" "s" <Space> 普通和可視
" "h" "h" 普通和可視 (不建議)
" "l" "l" 普通和可視 (不建議)
" "<" <Left> 普通和可視
" ">" <Right> 普通和可視
" "~" "~" 普通
" "[" <Left> 插入和替換
" "]" <Right> 插入和替換
"只允許光標鍵進行回繞.
"如果移動鍵和刪除和改變操作符一起使用時,<EOL> 也被看作一個
"字符.這使得光標跨過行尾時, "3h" 和 "3dh" 效果不同."這也適
"用於 "x" 和 "X",因為它們分別和 "dl" 以及 "dh" 相同.如果這
"么用,你可能想用映射 ":map <BS> X"來使退格"鍵刪除光標之前的
"字符.
"如果包含 'l',位於行尾時如果在操作符之后使用它,不會移動到下
"一行.這樣 "dl", "cl", "yl" 等都能正常工作.
"注意: 如果置位 "compatible",本選項被設為 Vi 的缺省值.相反,
"如果復位 "compatible",本選項被設為 Vim 的缺省值.
set whichwrap+=<,>,h,l
" "incsearch" / "is" (缺省關閉)
"{僅當編譯時加入 "+extra_search" 特性才有效}
"輸入搜索命令時,顯示目前輸入的模式的匹配位置.
"匹配的字符串被高亮.如果該模式不合法或者沒有匹配,不顯示任何
"東西.屏幕會經常刷新,所以只有對快速終端,這才有意義.
"注意:會顯示匹配,但如果找不到匹配和按 <Esc> 的時候,光標會回
"到原來的位置.你仍然需要用 <Enter> 完成搜索命令才會移動光標
"到匹配位置.
"編譯時加入 "+reltime" 特性時,Vim 只會搜索大概半秒鍾.如果模
"式太過復雜和/或有很多文本存在,不一定能找到匹配.這是為了避免
"Vim 在輸入模式的時候掛起.
"
"可以用 "highlight" 的 "i" 標志位設置高亮.另見: "hlsearch".
" "CTRL-L" 可用來在命令行上給當前匹配之后增加一個字符.
" "CTRL-R" / "CTRL-W" 可用來在當前匹配的尾部增加單詞,排除
" 已經輸入的部分.
"注意: 如果置位 "compatible",該選項被復位.
set incsearch
"某些字符在模式中是按本義出現的.它們匹配自身.然而,當前面有一
"個反斜杠時,這些字符具有特殊的含義.
"
"另外一些字符即使沒有反斜杠也代表特殊的意思,它們反而需要一個
"反斜杠來匹配按本義出現的自身.
"
"一個字符是否按本義出現取決於 "magic" 選項以及下面將解釋的條
"目.
"使用 "\m" 會使得其后的模式的解釋方式就如同設定了 "magic" 選
"項一樣.而且將忽略 "magic" 選項的實際值.
"使用 "\M" 會使得其后的模式的解釋方式就如同設定了 "nomagic"
"選項一樣.
"
"使用 "\v" 會使得其后的模式中所有 '0'-'9','a'-'z','A'-'Z'
"和 '_' 之外的字符都當作特殊字符解釋.
"使用 "\V" 會使得其后的模式中只有反斜杠有特殊的意義.
"
"示例:
"在這之后: \v \m \M \V 匹配
" 'magic' 'nomagic'
" $ $ $ \$ 匹配行尾
" . . \. \. 匹配任何字符
" * * \* \* 前面匹配原的任意次重復
" () \(\) \(\) \(\) 組成為單個匹配原
" | \| \| \| 分隔可選分支
" \a \a \a \a 字母字符
" \\ \\ \\ \\ 反斜杠 (按本義)
" \. \. . . 英文句號 (按本義)
" \{ { { { '{' (按本義)
" a a a a 'a' (按本義)
"
"{僅 Vim 支持 \m,\M,\v 和 \V}
"
"建議始終將 "magic"選項保持在缺省值 - "magic".這可以避免移
"植性的麻煩.要使模式不受該選項值的影響,在模式前面加上 "\m"
"或 "\M".
set magic
"設置Vim靜音
" "errorbells" / "eb" (缺省關閉)
"錯誤信息響鈴 (鳴叫或屏幕閃爍).只有對錯誤信息有意義.很多沒有消息的錯誤
"也會使用該響鈴 (比如,普通模式里按 <Esc>).
"
" "visualbell" / "vb" (缺省關閉)
"使用可視響鈴代替鳴叫.顯示可視響鈴的終端代碼由 "t_vb" 給出.如果既不想
"要響鈴也不想要閃爍,使用 ":set vb t_vb=".
"注意: GUI 啟動時,'t_vb' 復位為缺省值.你可能想在 |gvimrc| 里再次設置之.
"在 GUI 里, "t_vb" 缺省為 "<Esc>|f",反轉顯示 20 毫秒.如果你想使用別的
"時間,可設 "<Esc>|40f",其中 40 是毫秒計的時間.
"在 Amiga 上沒有用,你總會得到屏幕閃爍.
set noerrorbells
set novisualbell
set t_vb=
" "showmatch" / "sm" (缺省關閉)
"插入括號時,短暫地跳轉到匹配的對應括號.只有在屏幕上能看到匹配時才會進
"行跳轉.顯示匹配的時間用 "matchtime" 設置.
"如果沒有匹配會響鈴 (和匹配能否看到無關).置位 "paste" 時,復位本選項.
"如果 "cpoptions" 里沒有 "m" 標志位,接着輸入字符會立即把光標移動到它應
"該在的位置.
" "guicursor" 的 "sm" 域說明顯示匹配時,如何設置光標形狀和閃爍.
" "matchpairs" 選項可指定顯示匹配所用的字符.用 "rightleft" 和 "revins"
"查找反方向的匹配.
"移動時要高亮匹配,另見 matchparen 插件 "pi_paren.txt".
set showmatch
" "matchtime" / "mat" (缺省為 5)
"如果置位 'showmatch',顯示配對括號的十分之一秒數.
"注意 這不是毫秒數.
set mat=4
" "hlsearch" / "hls" (缺省關閉)
"{僅當編譯時加入 "+extra_search" 特性才有效}
"如果有上一個搜索模式,高亮它的所有匹配.使用高亮的類型可以用 "highlight"
"選項的 "l" 位設置.缺省,使用 "Search" 高亮組.
"注意: 只有匹配的文本被高亮,位移此處不予考慮.
"另見: "incsearch" 和 ":match".
"
"如果你厭倦總是看到高亮匹配,用 ":nohlsearch" 或者 ":noh" 可以暫時關閉.
"一旦使用搜索命令,高亮會重新出現.
"
" "redrawtime" 指定尋找匹配會花費的最大時間.
"如果搜索模式可以匹配換行符,Vim 會試圖高亮所有的匹配文本.不過,這依賴
"於搜索從哪里開始.如果是窗口的第一行,或者關閉折疊之下的第一行,那么從
"它們不會顯示的上一行開始的匹配不會在新顯示的行上繼續.
"注意: 如果置位 "compatible",該選項被復位.
set hlsearch
""""""""""""""""""""""""""""""
" => Statusline
""""""""""""""""""""""""""""""
"格式化狀態欄
if performance_mode
else
" "laststatus" / "ls" (缺省為 1)
"本選項的值影響最后一個窗口何時有狀態行:
" "0" 永不
" "1" 只有在有至少兩個窗口時
" "2" 總是
"如果你有多個窗口,有狀態行會使屏幕看起來好一些,但它會占據一個屏幕行.
set laststatus=2
" "statusline" / "stl" (缺省為空)
"{僅當編譯時加入 "+statusline" 特性才有效}"
"如果非空,本選項決定狀態行的內容.另見 "status-line"
"
"此選項包含 printf 風格的 '%' 項目,中間可以間雜普通文本.每個狀態行項
"目有如下形式:
" "%-0{minwid}.{maxwid}{item}"
"除了 {item} 以外,每個字段都是可選的.單個百分號可以用 "%%" 給出.最多
"可給出 80 個項目.
"
"如果此選項以 "%!" 開始,它用作表達式.計算此表達式的結果用作選項值.例
"如:
" ":set statusline=%!MyStatusLine()"
"返回值可以包含 %{} 項目,它還會被繼續計算下去.
"
"如果計算選項時有錯誤,會把它清空以防將來繼續出錯.否則屏幕更新會陷入循
"環.
"
"注意 如果設置本選項 (並且 "laststatus" 為 2 的話), "ruler" 的唯一效
"果是控制 "CTRL-G" 的輸出.
"
" 域 含義
" "-" 左對齊項目.如果 minwid 大於項目的長度,缺省是右對齊.
" "0" 數值項目前面用零填補. '-' 更優先.
" "minwid" 項目的最小寬度,以 '-' 和 '0' 補空.該值不能超過 50.
" "maxwid" 項目的最大寬度.如果超過,在文本項目的左側截短,以'<'代
" 替.數值項目則往下移到 maxwid-2 個數位,然后跟 '>'number,
" 其中的 number 是丟失的數位,這非常類似於指數記法.
" "item" 單個字符的代碼,下面給出描述.
"
"下面是可能狀態行項目的描述.其中,"項目" 的第二個字符代表類型:
" "N" 代表數值型
" "S" 代表字符串型
" "F" 代表下面描述的標志位
" "-" 不適用
"
"項目 含義
"f S 緩沖區的文件路徑,保持輸入的形式或相對於當前目錄.
"F S 緩沖區的文件完整路徑.
"t S 緩沖區的文件的文件名 (尾部).
"m F 修改標志位,文本是 "[+]";若 "modifiable" 關閉則是 "[-]".
"M F 修改標志位,文本是 ",+" 或 ",-".
"r F 只讀標志位,文本是 "[RO]".
"R F 只讀標志位,文本是 ",RO".
"h F 幫助緩沖區標志位,文本是 "[help]".
"H F 幫助緩沖區標志位,文本是 ",HLP".
"w F 預覽窗口標志位,文本是 "[Preview]".
"W F 預覽窗口標志位,文本是 ",PRV".
"y F 緩沖區的文件類型,如 "[vim]".見 "filetype".
"Y F 緩沖區的文件類型,如 ",VIM".見 "filetype'".
" {僅當編譯時加入 "+autocmd" 特性才有效}
"k S "b:keymap_name" 的值或使用 ":lmap" 映射時的 "keymap":
" "<keymap>".
"n N 緩沖區號.
"b N 光標所在字節的值.
"B N 同上,以十六進制表示.
"o N 光標所在字節在文件中的字節偏移,第一個字節為 1.
" 助記: 從文件開始的偏移 (Offset) (加上 1)
" {僅當編譯時加入 "+byte_offset" 特性才有效}
"O N 同上,以十六進制表示.
"N N 打印機頁號.(只用於 'printheader" 選項.)
"l N 行號.
"L N 緩沖區里的行數.
"c N 列號.
"v N 虛擬列號.
"V N 虛擬列號,表示為 -{num}.如果等於 "c" 的值,不顯示.
"p N 行數計算在文件位置的百分比,如同 "CTRL-G" 給出的那樣.
"P S 顯示窗口在文件位置的百分比,類似於 "ruler" 描述的百分比.長度
" 總是為 3.
"a S 參數列表狀態,就像缺省標題里的那樣.({current} of {max})
" 如果參數列表里的文件數為零或一,空字符串.
"{ NF 計算 "%{" 和 "}" 之間的表達式,並返回其結果替代.注意 結束的
" "}" 之前沒有 "%".
"( - 項目組的開始.可以用來為某組項目設置寬度和對齊.后面某處必須有
" "%)".
") - 項目組的結束.不能指定寬度域.
"T N 用於 'tabline': 標簽頁 N 標簽的開始.最后一個標簽之后用 "%T".
" 鼠標點擊時用此信息.
"X N 用於 "tabline": 關閉標簽頁 N 標簽的開始.最后一個標簽之后用
" "%T".
" 例如: "%3Xclose%X",用 "%999X" 來代表 "關閉當前標簽頁" 那個符
" 號.鼠標點擊時用此信息.
"< - 如果行過長,在什么地方截短.缺省是在開頭.不能指定寬度域.
"= - 左對齊和右對齊項目之間的分割點.不能指定寬度域.
"# - 設置高亮組.必須后面跟名字,然后又是 "#".這樣, "%#HLname#" 代
" 表高亮組 HLname.包括非當前窗口的狀態行都使用相同的高亮組.
"* - 設置高亮組為 User{N},其中的 {N} 取自 minwid 域,比如 %1*.用
" %* 或者 %*0 可以恢復 normal 高亮.User{N} 和 StatusLine 的區
" 別也會應用到非當前窗口的狀態行使用的 StatusLineNC 上.
" 數字 N 必須從 1 到 9.見 "hl-User1..9"
"
"顯示標志位時,如果它緊跟在普通文本之后,Vim 刪除之前的前導逗號.這使得
"下面例子里使用的標志位顯示看起來很舒服.
"
"如果組內的所有項目都是空字符串 (比如,標志位沒有設置) 而該組沒有設置
"minwid,整個組成為空字符串.這使得下面這樣的組完全從狀態行上消失,如果
"沒有標志位被置位的話.
" ":set statusline=...%(\ [%M%R%H]%)..."
"要小心,每次顯示狀態行時都要計算此表達式.當前緩沖區和當前窗口會臨時設
"為目前要顯示的狀態行所屬的窗口 (緩沖區),而表達式會使用此上下文計算.
"變量 "actual_curbuf" 被設為實際的當前緩沖區的 "bufnr()" 號.
"
"可能在沙盤 "sandbox" 里計算 "statusline" 選項.見 "sandbox-option".
"
"計算 "statusline" 時不允許修改文本或者跳到其它窗口 "textlock".
"
"如果狀態行在你希望時沒有更新 (如在設置完表達式里使用的某變量之后),設
"置選項可以強制進行更新而無須更改其值.例如:
" ":let &ro = &ro"
"
"如果結果全是數字,用作顯示時把它作為數值處理.否則結果作為文本,並應用
"上面描述的規則.
"
"小心表達式里的錯誤.它們可能使 Vim 不可用!
"如果你被困住,按住 ':' 或 'Q' 來得到提示,然后退出並用 "vim -u NONE"
"來編輯 .vimrc 或者別的什么地方,以修正問題.
"
"示例:
"模擬 "ruler" 設置的標准狀態行
" ":set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P"
"類似,但加上光標所在字符的 ASCII 值 (類似於 "ga")
" ":set statusline=%<%f%h%m%r%=%b\ 0x%B\ \ %l,%c%V\ %P"
"顯示字節偏移和字節值,用紅色標記已修改標志位.
" ":set statusline=%<%f%=\ [%1*%M%*%n%R%H]\ %-19(%3l,%02c%03V%)%O'%02b'"
" ":hi User1 term=inverse,bold cterm=inverse,bold ctermfg=red"
"如果載入的是壓縮文件,顯示 ,GZ 標志
" ":set statusline=...%r%{VarExists('b:gzflag','\ [GZ]')}%h..."
"並在 |:autocmd| 里:
" ":let b:gzflag = 1"
"或:
" ":unlet b:gzflag"
"還要定義此函數:
" ":function VarExists(var, val)"
" ": if exists(a:var) | return a:val | else | return '' | endif"
" ":endfunction"
set statusline=
set statusline+=%2*%-3.3n%0*\ "緩沖器名
set statusline+=%f\ "文件名
set statusline+=%h%1*%m%r%w%0* "標記符
set statusline+=[
if v:version >= 600
set statusline+=%{strlen(&ft)?&ft:'none'}, "文件類型
set statusline+=%{&encoding}, "編碼類型
endif
set statusline+=%{&fileformat}] "文件格式
if filereadable(expand("$VIM/vimfiles/plugin/vimbuddy.vim"))
set statusline+=\ %{VimBuddy()} "添加VimBuddy插件
"這個插件會在狀態欄上加一個笑臉,鼻子會隨着光標移動而改變
endif
set statusline+=%= "左右對齊的分割點
set statusline+=%F\ "文件的完整路徑
set statusline+=%2*0x%-8B\ "16進制表示當前字符
set statusline+=%-14.(%l,%c%V%)\ %<%P "偏移量
" special statusbar for special windows
if has("autocmd")
au FileType qf
\ if &buftype == "quickfix" |
\ setlocal statusline=%2*%-3.3n%0* |
\ setlocal statusline+=\ \[Compiler\ Messages\] |
\ setlocal statusline+=%=%2*\ %<%P |
\ endif
fun! FixMiniBufExplorerTitle()
if "-MiniBufExplorer-" == bufname("%")
setlocal statusline=%2*%-3.3n%0*
setlocal statusline+=\[Buffers\]
setlocal statusline+=%=%2*\ %<%P
endif
endfun
if v:version>=600
au BufWinEnter *
\ let oldwinnr=winnr() |
\ windo call FixMiniBufExplorerTitle() |
\ exec oldwinnr . " wincmd w"
endif
endif
" "titlestring" (缺省為 "") 設置窗口標題欄
"{僅當編譯時加入 "+title" 特性才有效}
"如果此選項不為空,用來設置窗口的標題.只有在 "title" 選項打開時才會發
"生.
"只有終端支持設置窗口標題時才可用 (目前有 Amiga 控制台,Win32 控制台,
"所有的 GUI 版本和帶有非空的 "t_ts" 選項的終端).
"如果 Vim 編譯時定義 HAVE_X11,在可能的情況下恢復原來的標題 "X11".
"如果本選項包含 printf 風格的 "%" 項目,依照 "statusline" 使用的規則
"進行擴展.
"例如:
" ":auto BufEnter * let &titlestring = hostname() . "/" . expand("%:p")"
" ":set title titlestring=%<%F%=%l/%L-%P titlelen=70"
" "titlelen" 的值用來在可用空間的中間或右側對齊項目.
"有的人喜歡文件名放在前面:
" ":set titlestring=%t%(\ %M%)%(\ (%{expand(\"%:~:.:h\")})%)%(\ %a%)"
"注意 "%{ }" 的使用,以及用於得到不含文件名的文件名路徑的表達式.只有在
"必要時, "%( %)" 構造才會加入分隔的空格.
"注意: "titlestring" 使用特殊字符可能會使顯示引起混亂 (比如,如果它包含
"CR 或者 NL 字符的話).
"{僅當編譯時加入 "+statusline" 特性才有效}
if has('title') && (has('gui_running') || &title)
set titlestring=
set titlestring+=%f\ "文件名
set titlestring+=%h%m%r%w "標記符
set titlestring+=\ -\ %{v:progname} "程序名
endif
endif
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Moving around and tab
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Map space to /
map <space> /
"為窗口跳轉重新定義鍵映射
map <C-j> <C-W>j
map <C-k> <C-W>k
map <C-h> <C-W>h
map <C-l> <C-W>l
"Tab configuration
map <leader>tn :tabnew %<cr>
map <leader>tc :tabclose<cr>
map <leader>tm :tabmove
if v:version>=700
set switchbuf=usetab
endif
if exists("&showtabline")
set stal=2
endif
"Moving fast to front, back and 2 sides ;)
imap <m-$> <esc>$a
imap <m-0> <esc>0i
imap <D-$> <esc>$a
imap <D-0> <esc>0i
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => General Autocommand
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Switch to current dir
map <leader>cd :cd %:p:h<cr>
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Parenthesis/bracket expanding
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
vnoremap $1 <esc>`>a)<esc>`<i(<esc>
")
vnoremap $2 <esc>`>a]<esc>`<i[<esc>
vnoremap $3 <esc>`>a}<esc>`<i{<esc>
vnoremap $$ <esc>`>a"<esc>`<i"<esc>
vnoremap $q <esc>`>a'<esc>`<i'<esc>
vnoremap $w <esc>`>a"<esc>`<i"<esc>
"Map auto complete of (, ", ', [
"http://www.vim.org/tips/tip.php?tip_id=153
"
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => General Abbrev
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Comment for C like language
if has("autocmd")
au BufNewFile,BufRead *.js,*.htc,*.c,*.tmpl,*.css ino $c /**<cr> **/<esc>O
endif
"My information
ia xdate <c-r>=strftime("%d/%m/%y %H:%M:%S")<cr>
"iab xname Amir Salihefendic
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Editing mappings etc.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Remap VIM 0
map 0 ^
"Move a line of text using control
nmap <M-j> mz:m+<cr>`z
nmap <M-k> mz:m-2<cr>`z
vmap <M-j> :m'>+<cr>`<my`>mzgv`yo`z
vmap <M-k> :m'<-2<cr>`>my`<mzgv`yo`z
if MySys() == "mac"
nmap <D-j> <M-j>
nmap <D-k> <M-k>
vmap <D-j> <M-j>
vmap <D-k> <M-k>
endif
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Buffer realted
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Fast open a buffer by search for a name
"map <c-q> :sb
"Open a dummy buffer for paste
map <leader>q :e ~/buffer<cr>
"Restore cursor to file position in previous editing session
set viminfo='10,"100,:20,%,n~/.viminfo
"用 "rot13" 編碼整個文件
" "gg" 到文件首行首字符, "V" 進入Visual-Line模式, "G"到文件末行首字符,
"這樣就選中了整篇文章,然后 "g?" 就是用 "rot13" 編碼整個文件
"
"關於 "rot13":
" "ROT13" 是一種簡單的編碼,它把字母分成前后兩組,每組13個,編碼和譯碼的
" 算法相同,僅僅交換字母的這兩個部分,即:
" [a..m] --> [n..z] 和 [n..z] --> [a..m]
" "ROT13" 用簡易的手段使得信件不能直接被識別和閱讀,也不會被搜索匹配程
" 序用通常的方法直接找到.經常用於 USENET 中發表一些攻擊性或令人不快的
" 言論或有簡單保密需要的文章.
" 由於 "ROT13" 是自逆算法,所以,譯碼和編碼是同一個過程.
map <F9> ggVGg?
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Files and backup
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" "backup" / "bk" (缺省關閉) 覆蓋文件前創建一個備份.
"文件成功寫入后保留該備份.如果你不想保留備份文件,但希望寫入期間能有備
"份,復位該選項並置位 "writebackup" 選項(這是缺省行為).如果你完全不想
"要備份文件,同時復位兩個選項 (如果你的文件系統差不多滿了,這會有用).更
"多的解釋可見 "backup-table".
"如果匹配 "backupskip" 模式,無論如何都不會建立備份.
"如果設置 "patchmode",備份文件會換名成為文件的舊版本.
"注意: 如果置位 "compatible",該選項被復位.
"
" "writebackup" / "wb" (有 "+writebackup" 特性時缺省打開,否則缺省關閉)
"覆蓋文件前建立備份.文件成功寫入后,除非 "backup" 選項也被打開,刪除該備
"份.如果你的文件系統幾乎已滿,復位此選項. "backup-table" 還有相關的解釋.
"如果 "backupskip" 模式匹配,無論如何都不會建立備份.
"注意: 如果置位 "compatible", 該選項被設為缺省值.
set nobackup
set nowritebackup
" "swapfile" / "swf" (缺省打開)
"緩沖區使用交換文件.如果不想為特定緩沖區使用交換文件,可以復位本選項.
"例如,包含即使 root 也不應得到的機密信息.要小心: 所有的文本都在內存:
" - 不要在大文件里使用.
" - 無法恢復!
"交換文件只有在 "updatecount" 不為零並且置位 "swapfile" 時才會存在.
"復位 "swapfile" 時,立即刪除當前緩沖區的交換文件.如果置位 "swapfile"
"並且 "updatecount" 非零,立即建立交換文件.
"另見 "swap-file"和 "swapsync".
"
"此選項可以和 "bufhidden" 和 "buftype" 一起使用,指定特殊類型的緩沖區.
"見 "special-buffers"
set noswapfile
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Folding
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" "foldenable" / "fen" (缺省打開)
"{僅當編譯時加入 "+folding" 特性才有效}
"如果關閉,所有的折疊都被打開.本選項用於在文本顯示的完全打開折疊和保留
"折疊之間 (包括手動打開或關閉的折疊) 快速切換."zi" 命令切換本選項.
"如果 "foldenable" 關閉, "foldcolumn" 會保持空白.
"建立新折疊或者關閉折疊的命令置位本選項.見 "folding".
"
"折疊方法
"可用選項 "foldmethod" 來設定折疊方法.
"設置選項 "foldmethod" 為非 "manual" 的其它值時,所有的折疊都會被刪除並
"且創建新的.如果設置成 "manual",將不去除已有的折疊.可以利用這一點來先
"自動定義折疊,然后手工調整.
"
"有 6 種方法來選定折疊:
" "manual" 手工定義折疊
" "indent" 更多的縮進表示更高級別的折疊
" "expr" 用表達式來定義折疊
" "syntax" 用語法高亮來定義折疊
" "diff" 對沒有更改的文本進行折疊
" "marker" 對文中的標志折疊
"
"選取了折疊方式后,我們就可以對某些代碼實施我們需要的折疊了,由於我使用
" "indent" 稍微多一些,故以它的使用為例:
"如果使用了 "indent"方式,vim會自動的對大括號的中間部分進行折疊,我們可
"以直接使用這些現成的折疊成果.
"在可折疊處(大括號中間):
" "zc" 折疊
" "zC" 對所在范圍內所有嵌套的折疊點進行折疊
" "zo" 展開折疊
" "zO" 對所在范圍內所有嵌套的折疊點展開
" "[z" 到當前打開的折疊的開始處
" "]z" 到當前打開的折疊的末尾處
" "zj" 向下移動.到達下一個折疊的開始處.關閉的折疊也被計入.
" "zk" 向上移動到前一折疊的結束處.關閉的折疊也被計入."
if exists("&foldenable")
set fen
set foldmethod=indent
endif
" "foldlevel" / "fdl" (缺省: 0) 設置代碼折疊級別
"{僅當編譯時加入 "+folding" 特性才有效}
"設置折疊級別: 高於此級別的折疊會被關閉.
"設置此選項為零關閉所有的折疊.更高的數字關閉更少的折疊.
" "zm", "zM" 和 "zR" 等命令設置此選項.
"見 "fold-foldlevel".
if exists("&foldlevel")
set fdl=0
endif
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Text option
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" "expandtab" / "et" (缺省關閉)
"插入模式里: 插入 <Tab> 時使用合適數量的空格.如果 "autoindent" 打開,
" ">" 和 "<" 命令使用空格進行縮進. "expandtab" 打開時,要插入實際的制
"表,可用 CTRL-V<Tab>.另見 ":retab" 和 "ins-expandtab".
"注意: 如果置位 "compatible",該選項被復位.
set expandtab
" "shiftwidth" / "sw" (缺省為 8)
"(自動) 縮進每一步使用的空白數目.用於 "cindent", ">>", "<<" 等.
set shiftwidth=4
" "softtabstop" / "sts" (缺省為 0)
"執行編輯操作,如插入 <Tab> 或者使用 <BS> 時,把 <Tab> 算作空格的數目.
"感覺上,你就像使用單個 <Tab> 一樣,而實際上使用的是空格和 <Tab> 的混
"合.這可以用來維持 "ts" 的設置為標准值 8 不變,但編輯時感覺就像它被設
"為 "sts" 那樣.不過, "x" 這樣的命令仍然會在實際的字符上操作.
"如果 "sts" 為零,關閉此特性.
"
"如果置位 "paste" 選項, "softtabstop" 被設為 0.
"另見 "ins-expandtab". 如果沒有置位 "expandtab",通過使用 <Tab>,使空
"格數目減到最小.
" "cpoptions" 里的 "L" 標志位改變制表在 "list" 置位時的使用方式.
"注意: 如果置位 "compatible",該選項被設為 0.
set softtabstop=4
" "tabstop" / "ts" (缺省為 8)
"文件里的 <Tab> 代表的空格數.另見 ":retab" 命令和 "softtabstop" 選項.
"
"注意: 設置 "tabstop" 為不同於 8 的值可能使你的文件在很多地方看起來不
"正確 (比如,打印時).
"
"Vim 里有四個主要的使用制表的方法:
"1. 總是保持 "tabstop" 為 8,設置 "softtabstop" 和 "shiftwidth" 為 4
" (或 3 或任何你想要的) 然后用 "noexpandtab".這時,Vim 使用制表和空
" 格的混合,但輸入 <Tab> 或 <BS> 鍵就像每個制表占用 4 (或 3) 個字符
" 一樣.
"2. 設置 "tabstop" 和 "shiftwidth" 為想要的任何值,然后用 "expandtab".
" 這樣,你總是插入空格.改變 "tabstop" 時絕不會影響排版.
"3. 設置 "tabstop" 和 "shiftwidth" 為想要的任何值,然后用 "modeline",
" 再次編輯時就會重新設置這些值.這只適用於總是使用 Vim 進行文件編輯
" 的情況.
"4. 永遠把 "tabstop" 和 "shiftwidth" 設為相同的值,並用 "noexpandtab".
" 這樣,就可以 (只適用於行首的縮進) 使用任何別人的制表位設置.不過,
" 如果你這么做,最好在第一個非空白字符之后想插入制表時以空格代替.否
" 則,改變 "tabstop" 時,注釋等的對齊會不正確.
set tabstop=4
" "smarttab" / "sta" (缺省關閉)
"如果打開,行首的 <Tab> 根據 "shiftwidth" 插入空白. "tabstop" 或
" "softtabstop" 用在別的地方.<BS> 刪除行首 "shiftwidth" 那么多的空白.
" 如果關閉,<Tab> 總是根據 "tabstop" 或 "softtabstop" 決定插入空白的數\
" 目. "shiftwidth" 只用於文本左移或右移 "shift-left-right".
" 插入空白的具體方式 (制表還是空格) 取決於 "expandtab" 選項.另見
" "ins-expandtab".如果沒有置位 "expandtab",通過使用 <Tab>,使空格數目
" 減到最小.
" 注意: 如果置位 "compatible",該選項被復位.
set smarttab
" "linebreak" / "lbr" (缺省關閉)
"{僅當編譯時加入 "+linebreak" 特性才有效}
"如果打開,Vim 會在 "breakat" 里的字符上,而不是在屏幕上可以顯示的最后
"一個字符上回繞長行.和 "wrapmargin" 和 "textwidth" 不同,此處不會插入
"<EOL>,它只影響文件的顯示方式,而不是其內容. "showbreak" 的值會出現在
"回繞行的前面.
"
"如果 "wrap" 選項關閉或 "list" 打開,不使用本選項.
"注意 <EOL> (屏幕上的) 之后的 <Tab> 字符在多數情況下.不會顯示正確數量
"的空格.
set lbr
""""""""""""""""""""""""""""""
" => Indent
""""""""""""""""""""""""""""""
" "autoindent" / "ai" (缺省關閉) 啟用自動縮進
"開啟新行時 (插入模式下輸入 <CR>,或者使用 "o" 或 "O" 命令),從當前行復
"制縮進距離.如果你在新行除了 <BS> 或 CTRL-D 以外不輸入任何東西,然后輸
"入 <Esc>,CTRL-O 或 <CR>,縮進又被刪除.移動光標到其它行也有同樣的效果,
"除非 "cpoptions" 里包含 'I' 標志位.
"如果打開自動縮進,排版 (用 "gq" 命令或者插入模式下到達了 "textwidth")
"使用第一行的縮進距離.
"打開 "smartindent" 或 "cindent" 時,縮進的修改方式有所不同.
"置位 "paste" 選項時, "autoindent" 選項被復位.
"{Vi 稍有不同: Vim 里輸入 <Esc> 或 <CR> 刪除縮進后,上下移動把光標放在
"刪除的縮進之后;Vi 則把光標放在已刪除的縮進的某處}.
set autoindent
" "smartindent" / "si" (缺省關閉) 開啟新行的自動縮進
"{僅當編譯時加入 "+smartindent" 特性才有效}
"開啟新行時使用智能自動縮進.適用於 C 這樣的程序,但或許也能用於其它語
"言. "cindent" 類似,它多數情況下更好,但更嚴格,見 "C-indenting".如果
"打開 "cindent", 置位 "si" 沒有效果.
" "indentexpr" 是更高級的替代方案.
"通常,使用 "smartindent" 時也應該打開 "autoindent".
"
"在這些情況下自動插入縮進:
" - "{" 結束的行后.
" - "cinwords" 中的某個關鍵字開始的行后.
" - "}" 開始的行前 (只有使用 "O" 命令才會).
"在新行第一個輸入的字符如果是 "}",該行使用匹配的 "{" 相同的縮進.
"在新行第一個輸入的字符如果是 "#",該行的縮進被刪除, "#" 被放到第一列.
"下一行上,恢復原來縮進.如果你不想這么做,使用下面的映射:
" ":inoremap # X^H#"
"其中的 ^H 用 CTRL-V CTRL-H 輸入.
"使用 ">>" 命令時,'#' 開始的行不右移.
"注意: 如果置位 "compatible",復位 "smartindent".如果置位 "paste",關
"閉這里的智能縮進功能.
set si
" "cindent" / "cin" (缺省關閉) 打開自動 C 程序的縮進
"{僅當編譯時加入 "+cindent" 特性才有效}
" "cinkeys" 說明如何設置插入模式下啟動重新縮進的熱鍵, "cinoptions"
"說明如何設置你喜歡的縮進風格.
"如果 "indentexpr" 非空,它否決 "cindent" 的設置.
"如果沒有打開 "lisp",而 "indentexpr" 和 "equalprg" 都為空, "=" 操作
"符使用本算法縮進,而不調用外部程序.
"見 "C-indenting".
"
"如果你不喜歡 'cindent' 的工作方式,可以試試 "smartindent" 選項或者
" "indentexpr".
" 如果置位 "paste",不使用本選項.
" 注意: 如果置位 "compatible",本選項被復位.
if has("cindent")
set cindent
endif
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Spell checking
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
map <leader>sn ]
map <leader>sp [
map <leader>sa zg
map <leader>s? z=
""""""""""""""""""""""""""""""
" => VIM
""""""""""""""""""""""""""""""
if has("autocmd") && v:version>600
au BufRead,BufNew *.vim map <buffer> <leader><space> :w!<cr>:source %<cr>
endif
""""""""""""""""""""""""""""""
" => HTML related
""""""""""""""""""""""""""""""
" HTML entities - used by xml edit plugin
let xml_use_xhtml = 1
"let xml_no_auto_nesting = 1
"To HTML
let html_use_css = 0
let html_number_lines = 0
let use_xhtml = 1
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => MISC
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Windows系統的換行符為\r\n,而Linux/Unix系統則為\n.因此,在Windows里編輯
"過的文本文件到了Linux/Unix里,每一行都會多出一個^M.
"命令中的 "^M" 是通過鍵入 <ctrl-v><enter> 或 <ctrl-v><ctrl-m> 生成的.
"可以在用以下命令清除該字符:
"noremap <leader>m :%s/\r//g<CR>
"設置 'omnifunc' 選項。如:
if has("autocmd")
au Filetype java setlocal omnifunc=javacomplete#Complete
au Filetype html setlocal omnifunc=htmlcomplete#CompleteTags
au FileType css setlocal omnifunc=csscomplete#CompleteCSS
au FileType c setlocal omnifunc=ccomplete#Complete
au FileType php setlocal omnifunc=phpcomplete#CompletePHP
au FileType javascript setlocal omnifunc=javascriptcomplete#CompleteJS
endif
"進行Tlist的設置
"TlistUpdate可以更新tags
map <F3> :silent! Tlist<CR>
let Tlist_Ctags_Cmd="\"C:\\Program Files (x86)\\Vim\\vim74\\ctags.exe\""
let Tlist_Use_Right_Window=1
let Tlist_Show_One_File=0
let Tlist_File_Fold_Auto_Close=1
let Tlist_Exit_OnlyWindow=1
let Tlist_Process_File_Always=1
let Tlist_Inc_Winwidth=0
let g:showfuncctagsbin = "\"C:\\Program Files (x86)\\Vim\\vim74\\ctags.exe\""
"進行NerdTree的設置
map <F4> :silent! NERDTree<CR>
" 按F8按鈕,在窗口的左側出現taglist的窗口,像vc的左側的workpace
"nnoremap <silent> <F8> :TlistToggle<CR><CR>
nnoremap <F10> :silent! TlistToggle<CR>
" :Tlist 調用TagList
let Tlist_Show_One_File=0 " 只顯示當前文件的tags
let Tlist_Exit_OnlyWindow=1 " 如果Taglist窗口是最后一個窗口則退出Vim
let Tlist_Use_Right_Window=1 " 在右側窗口中顯示
let Tlist_File_Fold_Auto_Close=1 " 自動折疊
"Paste toggle - when pasting something in, don't indent.
"set pastetoggle=<F3>
"移除空行的縮進
map <F2> :%s/s*$//g<cr>:noh<cr>''
"Super paste
ino <C-v> <esc>:set paste<cr>mui<C-R>+<esc>mv'uV'v=:set nopaste<cr>
"To hex modle 轉化為16進制方式顯示
let s:hexModle = "N"
function! ToHexModle()
if s:hexModle == "Y"
%!xxd -r
let s:hexModle = "N"
else
%!xxd
let s:hexModle = "Y"
endif
endfunction
map <leader>h :call ToHexModle()<CR>
"Fast reloading of the _vimrc 快速重load配置文件
map <silent> <leader>ss :source c:\Program Files (x86)\Vim\_vimrc<CR>
"Fast editing of the _vimrc 快速打開編譯配置文件
map <silent> <leader>ee :e c:\Program Files (x86)\Vim\_vimrc<CR>
"When _vimrc is edited, reload it
autocmd! bufwritepost _vimrc source c:\Program Files (x86)\Vim\_vimrc
"matchit 匹配%操作
:source C:\Program Files (x86)\Vim\vim74\macros\matchit.vim
"可視化的buffer操作
let g:bufExplorerDefaultHelp=1
let g:bufExplorerDetailedHelp=1
map <leader>be :BufExplorer <CR>
map <leader>bs :BufExplorerHorizontalSplit <CR>
map <leader>bv :BufExplorerVerticalSplit <CR>
"html.vim設置
:let g:html_indent_script1 = "inc"
:let g:html_indent_style1 = "inc"
:let g:html_indent_inctags="html,body,head,tbody,p"
"mapping 全能補全
"如果下拉菜單彈出,回車映射為接受當前所選項目,否則,仍映射為回車
"inoremap <expr> <CR> pumvisible()? "<C-Y>":"<CR>"
"如果下拉菜單彈出,CTRL-J映射為在下拉菜單中向下翻頁,否則映射為CTRL-X CTRL-O
"inoremap <expr> <C-J> pumvisible()? "<PageDown><C-N><C-P>":"<C-X><C-O>"
"如果下拉菜單彈出,CTRL-K映射為在下拉菜單中向上翻頁,否則不變
"inoremap <expr> <C-K> pumvisible()? "<PageUp><C-P><C-N>":"<C-K>"
set completeopt=longest,menu,preview
"SuperTab插件設置
let g:SuperTabDefaultCompletionType="<C-X><C-O>"
"vundle設置 這是一個用於自動下載、安裝、管理、清除vim插件的工具
set nocompatible " be iMproved
filetype off " required!
set rtp+=~/vimfiles/bundle/vundle
let path='~/vimfiles/bundle'
call vundle#rc(path)
"let Vundle manage Vundle
"required! <br>
Bundle 'gmarik/vundle'
"original repos on github<br>Bundle 'mattn/zencoding-vim'
"vim-scritps repos
Bundle 'L9'
Bundle 'FuzzyFinder'
Bundle 'Mark'
Bundle 'bufexplorer.zip'
Bundle 'The-NERD-tree'
Bundle 'taglist.vim'
Bundle 'matrix.vim'
Bundle 'The-NERD-Commenter'
Bundle 'matchit.zip'
"Bundle 'AutoComplPop'
Bundle 'jsbeautify'
Bundle 'YankRing.vim'
Bundle 'autoclose'
"Bundle 'supertab'
Bundle 'csharp.vim'
Bundle 'sharp-Plugin-Added'
Bundle 'sharp-Indent'
Bundle 'python.vim'
Bundle 'Pydiction'
filetype plugin indent on "required!
"save session file
set sessionoptions-=curdir
set sessionoptions+=sesdir
noremap <F7> :mks! WorkingSession.vim<CR>:wviminfo Working.viminfo<CR>
noremap <F6> :source WorkingSession.vim<CR>:rviminfo Working.viminfo<CR>
"對搜索的設置
"map ft :call Search_Word()<CR>:cw<CR>
"function Search_Word()
"let w = expand("<cword>") " 在當前光標位置抓詞
"execute "vimgrep " w " **"
"endfunction
"
"for Pydiction
let g:pydiction_location = '~/vimfiles/bundle/Pydiction/complete-dict'