Fork me on GitHub

1/08/2012

My Vim Configuration

Title: 我的 vim 進化史 Tags: vim

工具這種東西就是需要用到的時候就去查,然後記錄下來每次要用就看一下,用久了就熟了。分享也順便記錄一下目前 vim 所用到的一些筆記和設定。

vim note

  • Edit

      u           // Undo
      <Cr-R>      // Redo
    
      "dy                     // put this copy into buffer "d"
      Insert mode: <Cr-R>d    // paste from buffer "d"
    
      "ayw        // 複製一個字到 buffer a
      "ap         // 貼上 buffer a 當中的字
      /<Cr-R>a    // 搜尋 buffer a 當中的字
    
      :e          // 在 vim 當中開啟同資料夾下的其他檔案
      :bufdo e!   // refresh all files in buffers
    
      yaw         // yank around word
      ci"         // change inside quote
      ctX         // change till X
    
  • Search

      n           // Find next
      N           // Find previous
    
      *           // Go to next occurrence of word under cursor
      \#          // Go to previous occurrence of word under cursor
    
  • Move

      16G         // 跳到第16行
      1G          // 跳到第1行
      G           // 跳到最後一行
    
      <Cr> E      // 往下捲動一行
      <Cr> Y      // 往上捲動一行
      <Cr> F      // 往下捲動半頁
      <Cr> B      // 往上捲動半頁
    
      <Cr> O      // previous cursor location
      <Cr> I      // next cursor location
    
      gf          // 在當前視窗打開游標下的檔案
      <Cr-W> gf   // 在新的Tab打開游標下的檔案
      gt          // next tab
    
  • Window

      vsp <file.path>     // vertical split window
      :set scrollbind     // set current window scroll bind
    
  • Ctags

      <Cr> ]      // go to definition
      <Cr> t      // previous step
    
  • Cscope

      // 建立 Cscope 資料庫
      find . -name "*.h" -o -name "*.c" -o -name "*.cc" -o -name "*.cpp" -o -name "*.hpp"  > cscope.files
      cscope -Rbkq
    
      :cs find <parameter> <search-item>
    

vimrc

  • General (一般設定)

      syntax on
      filetype on
    
      set nu
      set confirm
      set modeline
      set showcmd
      set nobackup    
      set hlsearch
      set autoindent
      set noswapfile
      set smartindent
      set nocompatible
    
      set ls=2
      set tabstop=4
      set backspace=2
      set shiftwidth=4
      set encoding=utf-8
      set fileencodings=utf-8,cp950
    
  • Appearance (外觀設定)

      "set textwidth=90
      "set expandtab
      colorscheme desert
    
      " status line appearance (狀態列的設定)
      set statusline=
      set statusline +=\ %n\             "buffer number
      set statusline +=%{&ff}            "file format
      set statusline +=%y%*              "file type
      set statusline +=\ %<%F            "full path
      set statusline +=%m                "modified flag
      set statusline +=%=%5l             "current line
      set statusline +=/%L               "total lines
      set statusline +=%4c\              "column number
      set statusline +=0x%04B\           "character under cursor
    
  • Keys Mapping (快捷鍵設定)

    • Split window (分割視窗)
      用法:按 vv 垂直分割,ss 水平分割

        nnoremap <silent> vv <C-w>v
        nnoremap <silent> ss <C-w>s
      
    • Toggle cursorline/cursorcolumn or center line
      功能:trace code 的時候如果有開輔助線,比較容易跟上游標
      用法:按 F12 一次顯示底線,兩次顯示垂直線,三次兩者都顯示

          nmap <F12> zz
          if version >= 700 " NONE turns off underlining
              highlight CursorLine NONE ctermbg=Yellow
              highlight CursorColumn NONE ctermbg=Yellow
              let s:lico=0
              function LiCo()
                  let s:lico=s:lico>2 ?0 :s:lico+1
                  let &cursorline=s:lico % 2
                  let &cursorcolumn=s:lico / 2
              endfun
              nmap <silent> <F12> :call LiCo()<cr>
          endif
          imap <F12> <c-o><F12>
          vmap <F12> <c-c><F12>gv
      
    • Insert blank line without into insert mode
      功能:每次要新增一個空行,要按 o 再按 Esc 還蠻麻煩的
      用法:按 Enter 在下方新增一個空行, Shift+Enter 則在上方

        map <S-Enter> O<Esc>
        map <CR> o<ESc>k
      
    • Copy/Paste cross session
      功能:在多個開啟的 vim 視窗間複製貼上
      用法:Ctrl+V 選取欲複製之區段, Shift+Y 複製, 跳到另外一個 session 按 Shift+P貼上

        "custom copy'n'paste
        "copy the current visual selection to ~/.vbuf
        vmap <S-y> :w! ~/.vbuf<CR>
        "copy the current line to the buffer file if no visual selection
        nmap <S-y> :.w! ~/.vbuf<CR>
        "paste the contents of the buffer file
        nmap <S-p> :r ~/.vbuf<CR>
      
    • Mark redundant spaces
      功能:移除多餘的 trailing space
      用法:按 F3 標示出多餘空白, 持續按 N 向下搜尋, 按 X 刪除

        function ShowSpaces(...)
            let @/='\v(\s+$)|( +\ze\t)'
            let oldhlsearch=&hlsearch
            if !a:0
            let &hlsearch=!&hlsearch
            else
            let &hlsearch=a:1
            end
            return oldhlsearch
        endfunction
      
        function TrimSpaces() range
            let oldhlsearch=ShowSpaces(1)
            execute a:firstline.",".a:lastline."substitute ///gec"
            let &hlsearch=oldhlsearch
        endfunction
      
        command -bar -nargs=? ShowSpaces call ShowSpaces(<args>)
        command -bar -nargs=0 -range=% TrimSpaces <line1>,<line2>call TrimSpaces()
        nnoremap <F3>     :ShowSpaces 1<CR>
      
    • Show function name
      功能:函數 body 有時候太過龐大,可以不用按 [+{ 就看到函數名稱
      用法:按 , + f 顯示游標所在函數名稱

        fun! ShowFuncName()
          let lnum = line(".")
          let col = col(".")
          echohl ModeMsg
          echo getline(search("^[^ \t#/]\\{2}.*[^:]\s*$", 'bW'))
          echohl None
          call search("\\%" . lnum . "l" . "\\%" . col . "c")
        endfun
        map f :call ShowFuncName() <CR>
      

Plugin

  • Pathogen: 管理套件的套件

    如果你的工作環境會切換不同的電腦的話,那麼實現 vim 套件同步就是一個大問題了,因為總不能每換一次電腦就要重新安裝所有套件吧,那實在太累了。

    概念很簡單,想到同步,那麼會想到利用 git 來管理 .vim 目錄,那麼只要把你的 .vim 放到 github,在不同電腦上就可以 sync 同樣的設定。

    一般安裝許多 plugin 後,檔案會散落在各處,造成 .vim 目錄看起來一團混亂,這時候就是 Pathogen 派上用場的時刻了。

    利用 git submodule 搭配 Pathogen 套件,將每一個套件當做 submodule 管理,在 vim 啟動時透過 Pathogen 將套件載入,乾淨俐落。更詳細的作法可以參閱 Synchronizing plugins with git submodules and pathogen

  • SuperTab: 不需要什麼設定,也不用產生 tags 檔案,裝好即用的自動補完套件

    SuperTab 補齊所使用的關鍵字是藉由搜尋所有被開啟檔案的內容,所以不需先建立 tags 檔。當你打字打到一半需要它幫你補齊時就按下 Tab 鍵,它就幫你把剩下的字補齊。

    因為,一般需要補齊的東西蠻多都是 local 變數的,所以這個套件相當好用。如果你的意圖是真的要一個 indent 而不是自動補齊,那麼就用 Ctrl+V 再按 Tab。

    另外,如果需要更強大的補齊套件,C/C++ 語言的話,可以參考 OmniCppComplete

  • MinibufExplorer: 簡單好用的 vim 分頁套件

    如果每用 vim 開一個檔案就要占一個 terminal,那實在太浪費空間啦。所以,有沒有類似瀏覽器分頁效果的套件呢!有的,MinibufExplorer 就是你要的!

    在開啟的 vim 檔案中,使用方式:

      :e <要開啟的檔案路徑>   // 開啟檔案於新分頁
      :b <number>             // 跳到第 <num> 個分頁
      :bd                         // 關閉現在所在的分頁
    
  • Align: 對齊愛好者必裝套件

    有時候利用 tab 來對齊其實還蠻繁瑣的,如果有這個套件輔助,對齊會變的相當簡單俐落。

    使用前:

      int a = 12;
      int blogNum = 3;
      int day = 5;
    

    使用後:

      int a       = 12;
      int blogNum = 3;
      int day     = 5;
    

    安裝方式:

      vim Align.vba.gz    // 用 vim 開啟 Align.vba.gz
      :so %
      :q
    

    使用方式

      :10,20Align =   // 從第10行到第20行,以 = 符號進行對齊
    
  • Ctags, Cscope: C/C++ 開發必裝套件

    這兩套就不用多說了,要實現類似 IDE 強大的 go to definition 的功能,這兩個套件是不可或缺的!

    Ubuntu 下直接安裝方式:

      sudo apt-get install ctags cscope global
    

References

  1. Learn to speak vim – verbs, nouns, and modifiers!: 了解 vim 指令的文法,可以更快速的舉一反三喔!

  2. Writing Vim Plugins

  3. Learn Vimscript the Hard Way

No comments:

Post a Comment