VIM
光标移動
- 基本
h j k l
- 詞
b 向前移動,光标停在第一個字元 (backward) w 向後移動,光标停在第一個字元 (word) e 向後移動,光标停在最後一個字元 (end of word)
- 行首或行尾
$ 移動到行尾 ^ 移動到行首,非空白字元 0 移動到行首,第一個字元
- 指定字元
f 單行搜尋下一個單個字元 (find) F 單行搜尋上一個單個字元 t 單行搜尋下一個單個字元,光标停在前一個字元 (to) T 單行搜尋上一個單個字元,光标停在前一個字元
- 比對括号
% 移動到比對的括号或移動到括号
- 移動到指定行
G 移動到最後一行 33G 移動到第 33行 gg 移動到第一行 40% 移動到40% H 移動到螢幕内第一行 (home) M 移動到螢幕内中間 (middle) L 移動到螢幕内最後一行 (last)
- 滾屏
<c-u> 向上滾動半屏 (up) <c-d> 向下滾動半屏 (down) <c-f> 向下滾動一屏 (forward) <c-b> 向上滾動一屏 (backward)
- 簡單查找
/string 向下查找包含 string的詞 ?string 向上查找包含 string的詞 /\<string\> 向下查找 string ?\<string\> 向上查找 string n 重複前一次查找 N 重複前一次相反的查找 /<up> 之前的查找 * 向下查找光标所在處的詞,全詞比對 # 向上查找光标所在處的詞,全詞比對 g* 向下查找包含光标所在處的詞 g# 向上查找包含光标所在處的詞
- 标記:
m{mark} 講此處标記為 mark,mark 為一個字母 `{mark} 跳到标記 mark處,` 是1左邊那個鍵 '{mark} 跳到标記 mark處所在行行首,'是單引号 特殊的mark ' 此次跳轉之前的起跳點 " 上次編輯該檔案時光标最後停留的位置 [ 最後一次修改的起始位置 ] 最後一次修改的結束位置
- 其他指令
:set number 顯示行号,左邊 (se nu) :set nonumber 不顯示行号(se nonu) :set ruler 顯示光标位置,右下角 (se ru) :set noruler 不顯示光标位置 (se noru) :set ignorecase 查找忽略大小寫 :set noignorecase 查找不忽略大小寫 :set hlsearch 查找高亮 (se hls) :set nohlserch 關閉查找 (se nohls) :set incsearch 鍵入目标字元串時就開始查找 :set nowrapscan 搜尋過程在檔案結束時就停止
簡單修改
- 插入
i 在目前光标處插入 I 在目前行第一個非空白字元前插入 a 在目前光标之後插入 A 在目前行尾插入 o 在目前行之下插入 O 在目前行之上插入
- 删除
d 删除操作符 (delete) c 修改操作符,删除之後自動進入插入 (change) dd 删除一行 cc 修改一行 x dl ,删除光标處字元 X dh ,删除光标左邊的字元 D d$ ,删除到行尾 C c$ ,修改到行尾 s cl ,修改光标字元 S cc ,修改一整行 r 替換(删除之後插入并回到 Normal) . 執行上一次所執行的更改指令
- 複制
y 複制操作符 (yanking) yy 複制一行 yw 複制word,包含之後空白字元 ye 複制word,不包含之後空白字元 yaw 複制word,包含之後空白字元 yiw 複制word,不包含之後空白字元 yab 複制一個小括号裡面的内容,包括括号本身 yib 複制一個小括号裡面的内容,不包括括号本身 ya{ 複制一個大括号裡面的内容,包括括号本身 yi{ 複制一個大括号裡面的内容,不包括括号本身 p 粘貼(put)
- 對齊
= 對齊操作符 == 對齊一行 n== 對齊n行 =a{ 對齊一個大括号裡面的内容
- 大小寫替換
~ 大小寫替換 g~ 大小寫替換操作 g~iw 改變光标處單詞大小寫 guiw 光标處單詞變成小寫 gUiw 光标處單詞變成大寫
- 指令計數器 n+指令
一個指令重複執行 如:4x删除 4個字元
- 操作指令符 +位移指令符
操作如:删除 d,複制y ;位移如:詞語 w,$ 行尾 d$ 删除到句尾 4yy 複制4行 3dw 3次删除一個單詞 d3w 一次删除 3個單詞 3d2w 3次删除 2個單詞
- 常用删除指令
x(dl), X(dh), D(d$), dw, db, diw, daw, dG, dgg
- visual 模式(主要功能就是選擇)
v 進入visual模式,移動光标選擇操作文本範圍 V 進入visual行模式,選擇以行為機關 <c-v> 進入visual塊模式,選擇塊
查找替換
- 查找指令
/, ?, n, N, #, *, g#, g*, gd, gD
- 替換指令
:[n,m]s/[src]/[dst]/[g][c] [n,m] 表示一個範圍,從 n~m行中查找替換,[n,$]表示從第 n行之後 % 表示整個檔案 [src] 要查找的詞, [dst]要替換的詞 [g] 替換所有的比對,若沒有,隻比對第一個 [c] 替換前詢問 / 為分隔符,也可以用 +或# 來分隔 :s/src/dst/ 替換目前行第一個 src為dst :s/src/dst/g 替換目前行所有 src為dst :n,ms/src/dst/ 替換n~m行第一個 src為dst :n,$s/src/dst/g 替換第n行到最後一行中所有 src為dst :%s/src/dst/g 替換整個檔案中所有 src為dst :%s/src/dst/gc 替換整個檔案中所有 src為dst 并詢問是否替換 :%s/\<src\>/dst/gc 與:%s/src/dst/gc一樣(全詞比對)
- 正則比對
* 比對0以上之前的字元 \+ 比對1個以上之前字元 \= 比對0個或 1個之前字元 \? 比對0個或 1個之前字元 . 比對任何單個字元 \< 比對一個單詞的開始 \> 比對一個單詞的結束 \s 比對空白字元 <space>和<tab> \S 比對非空白字元 \d 數字[0-9] \D 非數字[^0-9] \x 十六進制數字 [0-9A-Fa-f] \X 費十六進制數字 [^0-9A-Fa-f] \l 小寫字元 [a-z] \L 非小寫字元 [^a-z] \u 大寫字元 [A-Z] \U 非大寫字元 [^A-Z] \a 字元[A-Za-z] \A 非字元[^A-Za-z] [] 任何[]中的字元
-
更多
:help pattern
折疊
- 折疊方式
manual 手工定義折疊 indent 更多的縮進表示更進階的折疊 expr 用表達式來定義折疊 syntax 用文法高亮來定義折疊 diff 對沒有更改的文本進行折疊 marker 對文中的标志折疊 set foldmethod=**** 設定折疊方式 marker方式,需要用标記來辨別代碼的折疊,系統預設是 {{{和}}}
- 折疊指令
zc 折疊 zC 對所在範圍内所有嵌套的折疊點進行折疊 zo 展開 zO 對所在範圍内所有嵌套的折疊點展開 zr, zR 折疊所有 zm, zM 展開所有 za, zA 折疊/打開目前折疊 zi 折疊/展開所有 [z 到目前打開的折疊開始處 ]z 到目前打開的折疊末尾處 zj 向下移動到下一個折疊開始處 zk 向上移動到前一折疊的結束處 zf 建立折疊 zf56G 建立從目前行起到 56行的代碼折疊 10zf 建立從目前行起後 10行的代碼折疊 10zf- 建立從目前行起到之前 10行的代碼折疊 zf% 建立從目前行起到對應比對的括号 zd 删除光标下的折疊,僅當 manual或marker 方式有效 zD 嵌套地删除光标下的折疊,僅當 manual或marker 方式有效 zE 除去視窗裡的所有折疊,僅當 manual或marker 方式有效
- foldlevel
'foldlevel' 是個數值選項:數字越大則打開的折疊更多 當 'foldlevel' 為 0 時,所有的折疊關閉 當 'foldlevel' 為正數時,一些折疊關閉 當 'foldlevel' 很大時,所有的折疊打開 'foldlevel' 的改變後立即生效。之後,折疊可以被手動地打開和關閉
檔案
- 檔案操作
:w 儲存 :w! 強制儲存 :w filename 将目前緩沖區的内容儲存成檔案 filename :n1, n2, filename 将n1到 n2的内容儲存為檔案filename :q 退出目前視窗,若改動,提示失敗 :q! 強制退出,放棄改動 :wq 儲存後退出 :wa 儲存所有 :qa 退出所有 :wqa 儲存所有後退出 ZZ 相當于:wq
- 編輯另一個檔案
:edit file
- 多檔案編輯
vim filename1 filename2 ... :bn 跳轉至下一緩沖區 (檔案)( 最後一個 ->第一個) :bN 跳轉到上一緩沖區 (檔案)( 第一個->最後一個 ) :bd 關閉目前緩沖區 (檔案) :n 跳轉至下一檔案 ,如目前檔案為最後一個,提示錯誤 :N 跳轉至上一檔案 ,如目前檔案為第一個,提示錯誤 :next, :previous 跳轉至下 /上一檔案 :wnext, :wprevious 儲存目前檔案并跳轉至下 /上一檔案 :last, :first 跳轉至最後一個 /第一個檔案 :files 列出目前已打開檔案 :args 給出進入 vim時指令行參數;目前正在編輯檔案名用 "[]"列出
- 視窗分隔
<c-w>s 水準分割視窗 <c-w>v 垂直分割視窗 <c-w>w 切換至另一視窗 <c-w>h 切換至左側視窗 <c-w>j 切換至下方視窗 <c-w>k 切換至上方視窗 <c-w>l 切換至右側視窗 <c-w>H 移動目前視窗到左邊 <c-w>J 移動目前視窗到下面 <c-w>K 移動目前視窗到上面 <c-w>L 移動目前視窗到右邊 :split filename 水準分隔視窗打開 filename :vsplit filename 垂直分割視窗打開 filename
- 标簽式編輯
:tabnew filename 在新标簽中打開 gt, :tabnext 切換至下一個标簽 gT, :tabprevious 切換至上一個标簽 :tabc 關閉目前标簽 :tabl 切換至最後一個标簽 :tabmove n 切換到第 n個标簽,預設标簽編号從 0開始
-
目錄
netrw 插件
打開目錄netrw 插件是vim的标準插件,在 .vimrc中隻要設定了 set nocp " 不與vi相容 filetype plugin on " 允許插件 就可以使用 netrw插件了
目錄操作Ex[plore] 打開目前目錄或指定目錄 Se[xplore] 水準分割并打開目前目錄或指定目錄 Ve[xplore] 垂直分割并打開目前目錄或指定目錄 Te[xplore] 建立标簽并打開目前目錄或指定目錄
<cr> 進入目錄 <del> 試圖删除檔案 /目錄 - 上一級目錄 a 在正常顯示,隐藏和顯示三種方式間切換 c 使浏覽中的目錄成為目前目錄 d 建立目錄 D 試圖删除目錄 i 在瘦、長、寬、和樹形的各種清單中切換 <c-l> 重新整理目錄清單 o 打開新浏覽視窗,進入光标所在目錄,使用水準分割 p 預覽檔案 P 在前一次使用的視窗裡預覽 r 反轉排序順序 R 給指定檔案 /目錄換名 s 選擇排序方式:按名字、時間、檔案大小排序 S 指定按名字排序的字尾優先級 t 在新标簽頁裡打開光标所在檔案 /目錄 v 打開新浏覽視窗,進入光标所在目錄,使用垂直分割
宏
- 建立宏
q + <register> + [一系列指令] + q <register> 指使用者自定義的 a-z中的一個寄存器 如:qa...q
- 運作宏
@ + <register> 運作寄存器中的宏 @@ 重複運作上一次宏 [email protected] 重複運作寄存器 a中的宏10 次
MAP
- 映射模式
普通模式 可視模式 操作符等待模式 插入模式 指令行模式
- 映射模式代号
<space> 普通、可視和選擇、操作符等待 n 普通 v 可視和選擇 s 選擇 x 可視 o 操作符等待 ! 插入和指令行 i 插入 l 插入、指令行和 Lang-Arg模式的":lmap" 映射 c 指令行
- 指令
map {lhs} {rhs} 把普通、可視和選擇、操作符等待模式下的 lhs指令映射成rhs,如:map tn :tabnew noremap noremap對rhs不會重新掃描映射 unmap {lhs} 取消對lhs的映射 mapclear 取消所有 map映射 nmap 隻作用于普通模式下的映射 imap 隻作用于插入模式下的映射 nnoremap 隻作用于普通模式下的 noremap nunmap 隻作用于普通模式下的 unmap nmapclear 隻作用于普通模式下的 mapclear
- 特殊參數
<buffer>, <slient>, <special>, <script>, <expr>, <unique> <silent> 是指執行鍵綁定時不在指令行上回顯 <unique> 如果該映射或者縮寫已經存在,則該指令會失敗
- mapleader
mapleader 變量對所有 map映射指令起效 它的作用是将參數 <leader>替換成mapleader 變量的值
- 鍵表
<k0>-<k9> 小鍵盤0-9 <s-c> shift + c <c-c> ctrl + c <m-c> alt + c 或 meta + c <a-c> 同<m-c> <t_xx> termcap 裡的"xx"入口鍵 <cr> 回車 <space> 空格 <tab> tab 鍵 <up> 方向鍵上 <down> 方向鍵下 <left> 方向鍵左 <right> 方向鍵右
DIFF
-
基本用法
VIM 的diff模式是依賴于 diff指令
# vimdiff FILE_LEFT FILE_RIGHT # vim -d FILE_LEFT FILE_RIGHT
- 分割視窗啟動 diff
:diffsplit FILE_TOP 水準分割視窗比較檔案 :vertical diffsplit FILE_RIGHT 垂直分割視窗比較檔案
- 指令
]c 跳轉到下一差異點 [c 跳轉到上一差異點 dp, :diffput 把目前檔案内容複制到另一檔案 do, :diffget 把另一檔案内容複制到目前檔案 :diffupdate 重新整理比較結果
會話
-
session 和viminfo
session中儲存了所有視窗的視圖和全局設定
viminfo中儲存了指令行曆史、搜尋字元串曆史、輸入行曆史、非空的寄存器内容、檔案的位置标記、最近搜尋 /替換的模式、緩沖區清單、全局變量等資訊
- session
:mksession [filename] 建立一個 session檔案,省略檔案名會自動建立一個名為 Session.vim檔案 :source [filename] 導入 session檔案
'sessionoptions'選項記錄 session中儲存的資訊。預設的'sessionoptions' 選項包括 "blank,buffers,curdir,folds,help,options,tabpages,winsize" ,意為session檔案會恢複目前編輯環境的空視窗、所有的緩沖區、目前目錄、折疊相關的資訊、幫助視窗、所有的選項和映射、所有的标簽頁、視窗大小。
如果你不希望在session中儲存目前路徑,而是希望 session檔案所在的目錄自動成為目前工作目錄,那麼,需要在 'sessionoptions' 去掉'curdir' , 加入'sesdir' ,這樣每次載入 session檔案時,這個檔案所在的目錄,就被設為 VIM的目前工作目錄。
- viminfo
在VIM退出時,每次都會儲存一個 .viminfo檔案在使用者的主目錄。'viminfo' 選項決定 ':wviminfo'指令儲存哪些内容,以及儲存的數目:wviminfo [filename] 手動建立一個viminfo檔案 :rviminfo [filename] 導入viminfo 檔案
TAB
- 指令
set expandtab 在插入時, <tab>鍵以一定數量的<space>代替 set tabstop=4 <tab> 被當做的 <space>的數量 set shiftwidth=4 每次縮進插入的 <space>的數量 set smarttab 在行前插入 <tab>根據shiftwidth 空格 set softtabstop=4 輸入tab 時插入<tab>和 <space>的混合 set list 顯示<tab>和行尾字元 $ set listchars=tab:>-,eol:$ <tab> 顯示為>-,行尾顯示為 $
- 替換為
加!處理所有的 ,若不加隻處理行首的:set expandtab :retab! 或 :retab
- 替換為
:set noexpandtab :retab! 或 :retab
編碼
- encoding
encoding是 VIM内部使用的字元編碼方式, VIM内部所有的buffer 、寄存器、腳本中的字元串都使用這個編碼。 Vim 在工作的時候,如果編碼方式與它的内部編碼不一緻,它會先把編碼轉換成内部編碼。如果工作用的編碼中含有無法轉換為内部編碼的字元,在這些字元就會丢失。set encoding=utf-8 set langmenu=zh_CN.UTF-8 language message zh_CN.UTF-8
-
termencoding
termencoding 是 Vim 用于螢幕顯示的編碼,在顯示的時候, Vim 會把内部編碼轉換為螢幕編碼,再用于輸出。内部編碼中含有無法轉換為螢幕編碼的字元時,該字元會變成問号,但不會影響對它的編輯操作。如果 termencoding 沒有設定,則直接使用 encoding 不進行轉換。
-
fileencoding
當 Vim 從磁盤上讀取檔案的時候,會對檔案的編碼進行探測。如果檔案的編碼方式和 Vim 的内部編碼方式不同,Vim 就會對編碼進行轉換。轉換完畢後, Vim 會将 fileencoding 選項設定為檔案的編碼。當 Vim 存盤的時候,如果 encoding 和 fileencoding 不一樣, Vim 就會進行編碼轉換。
-
fileencodings
編碼的自動識别是通過設定 fileencodings 實作的,注意是複數形式。 fileencodings 是一個用逗号分隔的清單,清單中的每一項是一種編碼的名稱。當我們打開檔案的時候, VIM 按順序使用 fileencodings 中的編碼進行嘗試解碼,如果成功的話,就使用該編碼方式進行解碼,并将 fileencoding 設定為這個值,如果失敗的話,就繼續試驗下一個編碼。
如果編碼被誤判了,就會産生亂碼。如果你知道這個檔案的正确編碼的話,可以在打開檔案的時候使用 ++enc=encoding 的方式來打開檔案:e ++enc=utf-8 myfile.txtset fileencodings=utf-8, gb2312
-
fileformat
unix格式的換行符為 0A(ascii 碼)也就是 ,dos 格式的換行符為 0D 0A(也就是) ,其實就顯示為 ^M,Mac 把回車作為換行符,文本中既有unix 的換行符,又有 dos的換行符,那麼vim會認為你打開的是 unix的,是以,那些dos的換行符就會出現 ^M,辦法是:
- 若你的 vim版本大于7.1 ,并想用 dos顯示和儲存,如下語句:
:e ++ff=dos
- 若你的 vim版本小于等于7.1,又想把文章按照 dos格式顯示和儲存,如下語句:
:set ff=dos :%s/\r\+$//e
- 若你的 vim版本小于等于7.1,又想把文章按照 unix格式顯示和儲存,如下語句:
:set ff=unix :%s/\r\+$//e
- 若你的 vim版本大于7.1 ,并想用 dos顯示和儲存,如下語句:
VIMRC
"""""""""""""""""""""""""""""""""""""""""
" windows版本gvim
" 最後一次修改: 2013/1/23
"""""""""""""""""""""""""""""""""""""""""
set nocompatible
source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
behave mswin
"""""""""""""""""""""""""""""""""""""""""
" 基本設定
"""""""""""""""""""""""""""""""""""""""""
set number "顯示行号
set nobackup "不備份
colorscheme delek "配色方案
set tabstop=4 "TAB設定
set softtabstop=4
set shiftwidth=4
set foldmethod=marker "折疊設定
"set foldmethod=syntax
"set foldmethod=indent
set foldlevel=100
set foldclose=all "關閉所有折疊
set autoindent "縮進設定
set smartindent
set cindent
set fileformats=dos,unix "設定檔案格式
"""""""""""""""""""""""""""""""""""""""""
" 編碼和字型
"""""""""""""""""""""""""""""""""""""""""
set fileencodings=gb2312,utf-8
set termencoding=gb2312
set fileencoding=gb2312
set guifont=Consolas:h11:cANSI
"""""""""""""""""""""""""""""""""""""""""
" 常用映射
"""""""""""""""""""""""""""""""""""""""""
let mapleader=","
"标簽
nnoremap L :tabnext<cr>
nnoremap H :tabprevious<cr>
nnoremap tn :tabnew
"視窗分隔
nnoremap <c-h> <c-w>h
nnoremap <c-j> <c-w>j
nnoremap <c-k> <c-w>k
nnoremap <c-l> <c-w>l
"注釋
nnoremap <leader>/ I/*<space><esc>A<space>*/<esc>j
nnoremap <leader>; ^xxx$xxxj
inoremap <leader>/ /*<space><space>*/<left><left><left>
"替換
nnoremap <leader>r :%s/\<\>//gc<left><left><left><left><left><left>
nnoremap <c-f> /\<\><left><left>
"折疊
nnoremap <space> @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo')<cr>
nmap <leader>cs O#if 0 /* comment by hl at <c-r>=strftime("%y/%m/%d %H:%M")<cr> {{{ */<esc>
nmap <leader>ce o#endif /* comment by hl at <c-r>=strftime("%y/%m/%d %H:%M")<cr> }}} */<esc>
"插入模式下方向鍵
imap <a-j> <down>
imap <a-k> <up>
imap <a-h> <right>
imap <a-l> <left>
"""""""""""""""""""""""""""""""""""""""""
" ctags 插件
"""""""""""""""""""""""""""""""""""""""""
set tags=tags;
set autochdir
nmap <c-[> <c-t>
"""""""""""""""""""""""""""""""""""""""""
" taglist 插件
"""""""""""""""""""""""""""""""""""""""""
let Tlist_Ctags_Cmd = 'ctags.exe'
let Tlist_Show_One_File = 1 "同時顯示多個檔案函數清單
let Tlist_show_Exit_OnlyWindow = 1 "當taglist 是最後一個視窗時,自動退出 vim
let Tlist_Use_Right_Window = 0 "讓視窗顯示在左邊
let Tlist_Process_File_Always = 0 "不要一直處理tags
let Tlist_Auto_Close = 1 " 非目前檔案,函數清單折疊隐藏
"""""""""""""""""""""""""""""""""""""""""
" DoxygenToolkit 插件
"""""""""""""""""""""""""""""""""""""""""
let g:DoxygenToolkit_authorName = "hl - ssdlut"
let g:DoxygenToolkit_briefTag_funcName = "yes"
let g:DoxygenToolkit_emailString = "[email protected]"
let g:DoxygenToolkit_versionString = "1.0"
"let g:DoxygenToolkit_briefTag_pre = "@brief "
"let g:DoxygenToolkit_templateParamTag_pre = "@tparam "
"let g:DoxygenToolkit_paramTag_pre = "@param "
"let g:DoxygenToolkit_returnTag = "@return "
"let g:DoxygenToolkit_throwTag_pre = "@throw "
"let g:DoxygenToolkit_fileTag = "@file "
"let g:DoxygenToolkit_authorTag = "@author "
"let g:DoxygenToolkit_emailTag = "@e-mail "
"let g:DoxygenToolkit_dateTag = "@date "
"let g:DoxygenToolkit_versionTag = "@version "
"let g:DoxygenToolkit_blockTag = "@name "
"let g:DoxygenToolkit_classTag = "@class "
"let g:DoxygenToolkit_commentType = "C"
nnoremap <leader>da :DoxAuthor<cr>
nnoremap <leader>df :Dox<cr>
nnoremap <leader>db :DoxBlock<cr>
"""""""""""""""""""""""""""""""""""""""""
" omnicppcomplete 插件
"
" <c-x> 進入補全模式
" <c-d> 宏定義
" <c-f> 檔案名
" <c-k> 字典
" <c-i> 目前檔案以及由#include包含進來的檔案
" <c-l> 整個行
" <c-]> 标記(tags)
" <c-p> 向前查找, 與沒有<c-x>指令時相同
" <c-n> 向後查找, 與沒有<c-x>指令時相同
" <c-o> 萬能補全
" <c-f> 檔案名補全
" <c-v> VIM指令補全
" <c-u> 使用者定義補全
"""""""""""""""""""""""""""""""""""""""""
imap <leader>s <c-x><c-n>
imap <leader>d <c-x><c-p>
imap <leader>f <c-x><c-o>
"""""""""""""""""""""""""""""""""""""""""
" 功能鍵映射
"""""""""""""""""""""""""""""""""""""""""
"nmap <F2> :tabnew %:h<cr>
"在新标簽中打開目前目錄
nmap <F2> :Texplore<cr>
"生成 tags檔案
nmap <F3> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<cr>
"打開 taglist,不支援中文路徑
nmap <F4> :TlistToggle<cr>
"make需要自己編寫 Makefile
nmap <F6> :!nmake<cr>
nmap <F8> :!nmake clean<cr>
nmap <F7> :!nmake run<cr>
"""""""""""""""""""""""""""""""""""""""""
" 對齊
"""""""""""""""""""""""""""""""""""""""""
nnoremap <leader>ch :call SetColorColumn()<cr>
function! SetColorColumn()
let col_num = virtcol(".")
let cc_list = split(&cc, ',')
if count(cc_list, string(col_num)) <= 0
execute "set cc+=".col_num
else
execute "set cc-=".col_num
endif
endfunction
"""""""""""""""""""""""""""""""""""""""""
" Linux版本gvim
" 最後一次修改: 2013/1/23
"""""""""""""""""""""""""""""""""""""""""
set nocompatible
filetype on
"""""""""""""""""""""""""""""""""""""""""
" 基本設定
"""""""""""""""""""""""""""""""""""""""""
set number " 顯示行号
set nobackup " 不備份
colorscheme delek "配色方案
set tabstop=4 "TAB 設定
set softtabstop=4
set shiftwidth=4
set foldmethod=marker "折疊設定
"set foldmethod=syntax
"set foldmethod=indent
set foldlevel=100
set foldclose=all "關閉所有折疊
set autoindent "縮進設定
set smartindent
set cindent
set fileformats=dos,unix "設定檔案格式
"""""""""""""""""""""""""""""""""""""""""
" 編碼和字型設定
"""""""""""""""""""""""""""""""""""""""""
set termencoding=utf-8
set fileencoding=utf-8
set fileencodings=utf-8,gbk
set guifont=Monospace\ Bold\ 10
"set guifont=Consolas\ Regular\ 12
"""""""""""""""""""""""""""""""""""""""""
" 常用映射
"""""""""""""""""""""""""""""""""""""""""
let mapleader=","
"标簽
nnoremap L :tabnext<cr>
nnoremap H :tabprevious<cr>
nnoremap tn :tabnew
nnoremap ts :tab split<cr>
"視窗分隔
nnoremap <c-h> <c-w>h
nnoremap <c-j> <c-w>j
nnoremap <c-k> <c-w>k
nnoremap <c-l> <c-w>l
"注釋
nnoremap <leader>/ I/*<space><esc>A<space>*/<esc>j
nnoremap <leader>; ^xxx$xxxj
inoremap <leader>/ /*<space><space>*/<left><left><left>
"替換
nnoremap <leader>r :%s/\<\>//gc<left><left><left><left><left><left>
nnoremap <c-f> /\<\><left><left>
"折疊
nnoremap <space> @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo')<cr>
nmap <leader>cs O#if 0 /* comment by hl at <c-r>=strftime("%y/%m/%d %H:%M")<cr> {{{ */<esc>
nmap <leader>ce o#endif /* comment by hl at <c-r>=strftime("%y/%m/%d %H:%M")<cr> }}} */<esc>
"插入模式下方向鍵
imap <a-j> <down>
imap <a-k> <up>
imap <a-h> <right>
imap <a-l> <left>
"make
nnoremap cp :cp<cr>
nnoremap cn :cn<cr>
"""""""""""""""""""""""""""""""""""""""""
" ctags 插件
"""""""""""""""""""""""""""""""""""""""""
set tags=tags;
set autochdir
nmap <c-[> <c-t>
"""""""""""""""""""""""""""""""""""""""""
" taglist 插件
"""""""""""""""""""""""""""""""""""""""""
"let Tlist_Ctags_Cmd = 'ctags.exe'
let Tlist_Show_One_File = 1 " 同時顯示多個檔案函數清單
let Tlist_Exit_OnlyWindow = 1 "當taglist 是最後一個視窗時,自動退出 vim
let Tlist_Use_Right_Window = 0 "讓視窗顯示在左邊
let Tlist_Process_File_Always = 0 "不要一直處理tags
let Tlist_Auto_Close = 0 " 非目前檔案,函數清單折疊隐藏
"""""""""""""""""""""""""""""""""""""""""
" DoxygenToolkit 插件
"""""""""""""""""""""""""""""""""""""""""
let g:DoxygenToolkit_authorName = "hl - ssdlut"
let g:DoxygenToolkit_briefTag_funcName = "no"
let g:DoxygenToolkit_emailString = "[email protected]"
let g:DoxygenToolkit_versionString = "1.0"
"let g:DoxygenToolkit_briefTag_pre = "@brief "
"let g:DoxygenToolkit_templateParamTag_pre = "@tparam "
"let g:DoxygenToolkit_paramTag_pre = "@param "
"let g:DoxygenToolkit_returnTag = "@return "
"let g:DoxygenToolkit_throwTag_pre = "@throw "
"let g:DoxygenToolkit_fileTag = "@file "
"let g:DoxygenToolkit_authorTag = "@author "
"let g:DoxygenToolkit_emailTag = "@e-mail "
"let g:DoxygenToolkit_dateTag = "@date "
"let g:DoxygenToolkit_versionTag = "@version "
"let g:DoxygenToolkit_blockTag = "@name "
"let g:DoxygenToolkit_classTag = "@class "
"let g:DoxygenToolkit_commentType = "C"
nnoremap <leader>da :DoxAuthor<cr>
nnoremap <leader>df :Dox<cr>
nnoremap <leader>db :DoxBlock<cr>
"""""""""""""""""""""""""""""""""""""""""
" omnicppcomplete 插件
"
" <c-x> 進入補全模式
" <c-d> 宏定義
" <c-f> 檔案名
" <c-k> 字典
" <c-i> 目前檔案以及由#include包含進來的檔案
" <c-l> 整個行
" <c-]> 标記(tags)
" <c-p> 向前查找, 與沒有<c-x>指令時相同
" <c-n> 向後查找, 與沒有<c-x>指令時相同
" <c-o> 萬能補全
" <c-f> 檔案名補全
" <c-v> VIM指令補全
" <c-u> 使用者定義補全
"""""""""""""""""""""""""""""""""""""""""
imap <leader>s <c-x><c-n>
imap <leader>d <c-x><c-p>
imap <leader>f <c-x><c-o>
filetype plugin on
set completeopt=menu,menuone
let g:OmniCpp_SelectFirstItem = 0 "是否自動選擇第一個比對項
let g:OmniCpp_ShowAccess = 1 " 顯示通路控制資訊
let g:OmniCpp_GlobalScopeSearch = 1 "全局查找控制。0:禁止; 1:允許( 預設)
let g:OmniCpp_NamespaceSearch = 1 " 0 , 1 or 2
let g:OmniCpp_DisplayMode = 1
let g:OmniCpp_ShowScopeInAbbr = 0
let g:OmniCpp_ShowPrototypeInAbbr = 1
let g:OmniCpp_MayCompleteDot = 1
let g:OmniCpp_MayCompleteArrow = 1
let g:OmniCpp_MayCompleteScope = 1
"""""""""""""""""""""""""""""""""""""""""
" 功能鍵映射
"""""""""""""""""""""""""""""""""""""""""
"nmap <F2> :tabnew %:h<cr>
"在新标簽中打開目前目錄
nmap <F2> :Texplore<cr>
"生成 tags檔案
nmap <F3> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<cr>
"nmap <F3> :!ctags -R --fields=+lS .<cr>
"打開 taglist,不支援中文路徑
nmap <F4> :TlistToggle<cr>
"make需要自己編寫 Makefile
nmap <F6> :!make<cr>
nmap <F7> :!make run<cr>
nmap <F8> :!make clean<cr>
"""""""""""""""""""""""""""""""""""""""""
" 對齊
"""""""""""""""""""""""""""""""""""""""""
nnoremap <leader>ch :call SetColorColumn()<cr>
function! SetColorColumn()
let col_num = virtcol(".")
let cc_list = split(&cc, ',')
if count(cc_list, string(col_num)) <= 0
execute "set cc+=".col_num
else
execute "set cc-=".col_num
endif
endfunction