天天看點

VIM總結VIM

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
    :wviminfo [filename]  手動建立一個viminfo檔案
    :rviminfo [filename]  導入viminfo 檔案
               
    在VIM退出時,每次都會儲存一個 .viminfo檔案在使用者的主目錄。'viminfo' 選項決定 ':wviminfo'指令儲存哪些内容,以及儲存的數目

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
    set encoding=utf-8
    set langmenu=zh_CN.UTF-8
    language message zh_CN.UTF-8
               
    encoding是 VIM内部使用的字元編碼方式, VIM内部所有的buffer 、寄存器、腳本中的字元串都使用這個編碼。 Vim 在工作的時候,如果編碼方式與它的内部編碼不一緻,它會先把編碼轉換成内部編碼。如果工作用的編碼中含有無法轉換為内部編碼的字元,在這些字元就會丢失。
  • termencoding

    termencoding 是 Vim 用于螢幕顯示的編碼,在顯示的時候, Vim 會把内部編碼轉換為螢幕編碼,再用于輸出。内部編碼中含有無法轉換為螢幕編碼的字元時,該字元會變成問号,但不會影響對它的編輯操作。如果 termencoding 沒有設定,則直接使用 encoding 不進行轉換。

  • fileencoding

    當 Vim 從磁盤上讀取檔案的時候,會對檔案的編碼進行探測。如果檔案的編碼方式和 Vim 的内部編碼方式不同,Vim 就會對編碼進行轉換。轉換完畢後, Vim 會将 fileencoding 選項設定為檔案的編碼。當 Vim 存盤的時候,如果 encoding 和 fileencoding 不一樣, Vim 就會進行編碼轉換。

  • fileencodings

    編碼的自動識别是通過設定 fileencodings 實作的,注意是複數形式。 fileencodings 是一個用逗号分隔的清單,清單中的每一項是一種編碼的名稱。當我們打開檔案的時候, VIM 按順序使用 fileencodings 中的編碼進行嘗試解碼,如果成功的話,就使用該編碼方式進行解碼,并将 fileencoding 設定為這個值,如果失敗的話,就繼續試驗下一個編碼。

    set fileencodings=utf-8, gb2312
               
    如果編碼被誤判了,就會産生亂碼。如果你知道這個檔案的正确編碼的話,可以在打開檔案的時候使用 ++enc=encoding 的方式來打開檔案:e ++enc=utf-8 myfile.txt
  • fileformat

    unix格式的換行符為 0A(ascii 碼)也就是 ,dos 格式的換行符為 0D 0A(也就是) ,其實就顯示為 ^M,Mac 把回車作為換行符,文本中既有unix 的換行符,又有 dos的換行符,那麼vim會認為你打開的是 unix的,是以,那些dos的換行符就會出現 ^M,辦法是:

    1. 若你的 vim版本大于7.1 ,并想用 dos顯示和儲存,如下語句:
      :e ++ff=dos
                 
    2. 若你的 vim版本小于等于7.1,又想把文章按照 dos格式顯示和儲存,如下語句:
      :set ff=dos
      :%s/\r\+$//e
                 
    3. 若你的 vim版本小于等于7.1,又想把文章按照 unix格式顯示和儲存,如下語句:
      :set ff=unix
      :%s/\r\+$//e
                 

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           

繼續閱讀