星期二, 2月 19, 2008

VIM Notes

* What is Vi

    * Vi 是一個文字編輯器 (plain text editor)
    * Vi = "Vi"sual Editor
    * Vi 是 POSIX 定義的標準編輯器,Emacs 則不是。
    * Vim = "Vi"sual editor i"m"proved,是 vi 的加強版
    * Vi 加強版有 Vim, Nvi, Elvis, Vile 等
    * Nvi 最接近 Vi,BSD 內建的 Vi 即 Nvi
    * Gvim = GUI version of Vim 是 Vim for Windows 的 Porting


* Why Vim

    * Vim 是最多人用的 Vi 加強版,功能也最多。
    * Vim 是完全免費的,是 FreeWare 也是 CharityWare(慈善軟體)。
    * 支援各式主流平台,如 Unix, BSD, Linux, DOS/Windows, Mac 等等。
    * 中文編碼支援完善。
    * 自定功能強大,也有許多現成的 Scripts 可以用。


* Where to get

    下載:
    ------------
    # 可以到以下這幾個站點 Download 各平台的 Porting。
    http://www.vim.org/download.php
    http://vim.sourceforge.net/download.php
    ftp://ftp.vim.org/pub/vim/


* Color Scheme

    設定配色:
    ------------
    :colorscheme darkblue
    # 配色檔在 /usr/share/vim/vim71/colors 下面。

    測試配色:
    ------------
    :so $VIMRUNTIME/syntax/hitest.vim


* 基本操作

    輸入模式:
    ------------
    a       在游標的前一字元進入輸入模式 (append)
    i       在游標的後一字元進入輸入模式 (insert)
    o       在游標的下一行插入新行並進入輸入模式
    O       在游標的上一行插入新行並進入輸入模式

    移動:
    ------------
    h       上
    j       下
    k       上
    l       右

    移動速記圖示:
    ------------
    +-------+
    |   k   |
    | h   l |
    |  j    |
    +-------+

    字與行移動:
    ------------
    0       移到行首
    ^       移到該行第一個非白字的的字元
    $       移到行尾
    w       移到後一字首 (word)
    e       移到後一字尾 (end of word)
    b       移到前一字首 (before word)
    Note: 移到行首行尾的 ^ 和 $ 用 Regular Expression.

    頁與檔移動:
    ------------
    Ctrl-f  向下一頁  (forward)
    Ctrl-b  向上移一頁  (back)
    1G, gg  移到檔首 (go)
    [n]G    移到第 n 行 (number go)
    G       移到檔尾
    M       移到營幕中間 (middle)
    H       移到營幕開頭 (head)

    刪除:
    ------------
    x           刪除該字元
    X           刪除該字元前一字
    D, d$       刪至行尾
    dd          刪除整行
    [n]D, d[n]d 刪除 n 行

    複製:
    ------------
    y{字元}     複製 (yank)
    yy          複製整行
    [n]Y, y[n]y 複製 n 行
    p           貼上 (put)
    :reg        查看複製暫存區 (register)

    其他:
    ------------
    u       回上一動 (undo)
    J       合併下一行 (join)
    gJ      合併下一行但不加空白

    檔案:
    ------------
    :q      結束 (quit)
    :q!     強制結束不儲存
    :x      有修改時才儲存並結束
    :w      儲存 (write)
    :wq     儲存並結束
    ZZ      等於 :q!
    ZQ      等於 :x

    C語言程式:
    ----------------
    [[      尋找上一個 function
    ]]      尋找下一個 function
    %       尋找對應的 bracer

    視窗:
    ------------
    :split [file]   分割視窗(有加檔名時開啟檔案為新視窗 )
    :new            開新檔視窗
    :close          關畢現行視窗
    :only           只留下現行視窗
    :vsplit [file]  分割為垂直視窗
    :vnew           開新檔垂直視窗
    :qall           結束全部
    :wall           寫入全部
    :wqall          寫入並結束全部
    :qall!          結束全部不詢問
    Note: vim [-o|-O] one.txt two.txt three.txt (-o 水平, -O 垂直)

    CTRL-w o        同 :only
    CTRL-w c        同 :close
    CTRL-w s        同 :split
    CTRL-w n        同 :new
    Ctrl-w w        循環切換視窗

    CTRL-W h        切換到左邊那個視窗
    CTRL-W j        切換到下面那個視窗
    CTRL-W k        切換到上面那個視窗
    CTRL-W l        切換到右邊那個視窗

    CTRL-W t        切換到第一個視窗
    CTRL-W b        切換到最後個視窗

    CTRL-W H        把現行視窗設到左邊
    CTRL-W J        把現行視窗設到下面
    Ctrl-w K        把現行視窗設到上面
    CTRL-W L        把現行視窗設到右邊

    Ctrl-w +        增大視窗(一行)
    Ctrl-w -        縮小視窗

    分頁(tab browsing):
    ------------
    :tabedit [file]
    :tab split [file]
    :tab new
    :tabo[nly]
    :tabc[lose]
    :tabn[ext]
    :tabp[revious]
    :tabfir[st]
    :tabl[ast]
    :tabr[rewind]
    :tabs
    ctrl + pageup   上一分頁
    ctrl + pagedown 下一分頁

    書籤:
    ------------
    m[a-z][A-Z]     設定書籤 (mark)
    '[a-z][A-Z]     跳到書籤

    搜尋:
    ------------
    /[regular expression pattern]   往下尋找
    ?[regular expression pattern]   往上尋找(與 / 相反)
    n       跳至下一個符合
    N       跳至上一個符合
    :set ignorecase     搜尋忽略大小寫 
    :set ic             同上
    :set noignorecase   搜尋不忽略大小寫
    :set noic           同上

    搜尋取代:
    ------------
    %s/[RE pattern]/[to replace string]/
     * 可以加 modifier 如 g 表示替換全部 (global)


* Visual Mode

    操作方式:
    ------------
    1. 按 v, V 或 Ctrl-v 進入 Visual Mode。
    2. 按 hjkl 或方向鍵標記。
    3. 按操作鍵如 y, d, v 等等...

    基本指令:
    ------------
    v       字元選取
    V       行選取
    Ctrl-v  區塊選取

    gv      最後一次選取
       結束 Visual Mode
    Ctrl-C  結束 Visual Mode

    o       到區塊開頭
    O       到區塊結尾

    ~       切換大小寫
    d, x    刪除
    r       修改 (填滿為某字)
    c       修改
    y       複製
    >       左平移(4)
    <       右平移(4)


* 排版相關:

    整行平移
    --------
    >>      整行向右移一個 shiftwidth
    <<      整行向左移一個 shiftwidth

    設定平移單位
    ------------
    * shiftwidth 簡寫為 sw,如 :set sw?
    :set shiftwidth?    得知目前的設定值
    :set shiftwidth=4   設定 shiftwidth = 4 個字元

    文字對齊
    --------
    :ce(nter) 整行以 textwidth 為基準置中
    :ri(ght) 整行以 textwidth 為基準靠右
    :le(ft)     整行以 textwidth 為基準靠左

    設定行寬
    --------
    * textwidth 簡寫為 tw,試試 :set tw?
    :set textwidth=80   設定 textwidth

    排版指令
    --------
    * gq 是只有 vim 才提供的指令
    gq          重排 visual mode 標記起來的部份
    gqq         本行重排
    gqap     整段重排(或 gqip)
    gqG         全文重排(游標所在處的段落開始重排至檔尾)

    排版指令變化形
    --------------
    gq3q   重排三行
    gq6ap  重排六個段落
    gq9j  重排九行

    中文相容
    --------
    李果正前輩(http://info.sayya.org/~edt1023/)
    有提到一個與中文相容的 macro:
    http://info.sayya.org/~edt1023/vim/format.vim


* 設定檔

    Unix:
    ~/.vimrc
    --------

    Windows:
    [GVIM安裝目錄]\_vimrc
    ---------------------

    "加強 vim 但某部份會與 vi 不相容
    set nocompatible

    "自動縮排
    "set cindent
    "set autoindent
    "set smartindent

    "顯示 bracer 配對
    set showmatch
    set foldmethod=marker

    "檔案編碼
    set fileencodings=utf-8,big5
    set fileencoding=big5

    "終端機編碼
    if has("gui_running")
      set termencoding=utf-8
    else
      set termencoding=big5
    endif

    "換行字元
    set fileformats=unix,dos
    set fileformat=unix

    "行號
    set number
    set numberwidth=3

    "尺標
    set ruler

    "備份
    set history=100
    "set backup
    "set backupdir=~/.bak
    "set backupdir=D:\bak

    "tab 定位鍵設定,每次跳四格,
    set softtabstop=4
    set shiftwidth=4
    set tabstop=4

    "空白取代tab碼
    set expandtab

    "開啟語法高亮
    syntax on
    "搜尋關鍵字高亮
    set hlsearch
    "搜尋不分大小寫
    set ignorecase

    "配色方案
    " blue darkblue default delek desert elflord evening koehler morning
    " murphy pablo peachpuff ron shine slate torte zellner
    colorscheme darkblue

    "狀態列
    set statusline=%F%m%r%h%w\ [%{&ff}]\ [%Y]\ LEN[%L]\ [%3p%%]\ LOC[%l,%v]%=ASC[%03b]\ HEX[%02B]
    set laststatus=2

    "顯示游標行
    set cursorline
    highlight CursorLine guibg=#000033 ctermbg=black

    "色彩設定
    highlight Comment guifg=cyan ctermfg=cyan
    highlight Search term=reverse guibg=darkmagenta guifg=white ctermbg=darkmagenta ctermfg=white
    highlight Normal guibg=black guifg=gray ctermbg=black ctermfg=gray
    highlight Visual gui=reverse guifg=blue guibg=white
    highlight VisualNOS gui=reverse,underline guifg=blue guibg=white

    ""_gvimrc (以下設定為 Windows 版本專用)
    ""------------
    "啟動後最大化視窗
    set lines=999999
    set columns=999999

    "字型 font=Dina, size=10 (Dina 是自己抓的字型檔)
    "set guifont=Dina:h10

    "字型 font=Courier New, size=11
    "set guifont=Courier_New:h11 "版本 7.1 以後的空白改成 underline
    "set guifont=Courier New:h11 "for Version 7.1

    "字型 font=Consolas, size=12
    set guifont=Consolas:h12

    "tab browsing 設定
    set tabpagemax=15
    "set showtabline=2

    "修改 key-mapping 讓 vim7 的 tab browsing 功能更好用
    "map  -> normal mode
    "imap -> insert mode
    "vmap -> visual mode
    "lmap -> line mode

    "VIM7 預設是  
    "仿 UltraEdit 可設成  
    "用終端機跑 VIM 可以設成  
    "Ctrl-DOWN goes to next tab
    map <c-down> :tabnext
    imap <c-down> :tabnext
    vmap <c-down> :tabnext 

    "Ctrl-UP goes to previous tab
    imap <c-up> :tabprev
    map <c-up> :tabprev
    vmap <c-up> :tabprev

    "Ctrl-t makes a new tab
    " Ctrl-t 原本是用來跳回標簽的
    "vmap <c-t> :tabnew
    "imap <c-t> :tabnew
    "map <c-t> :tabnew 

    "Ctrl-x closes the tab
    map <c-x> :tabclose
    imap <c-x> :tabclose
    vmap <c-x> :tabclose

* 小技巧

    tab 很好用,但是每次要手工打開 tab 很麻煩,使用下面的命令就可以在當前 vim 裡開啟新的 tab。
    "C:\Program Files\Vim\vim71\gvim.exe" -p --remote-tab-silent "%1" "%*"

    Total Commander 的 external editor 設定:
    C:\Program Files\Vim\vim71\gvim.exe -p --remote-tab-silent
    
    如果一次開啟多個檔案如 vim a.c b.c 時,會開成 buffer,可用 :tab ball 轉成 tabs。

    搜尋忽略大小寫的方法:
    :set ignorecase 或 :set ic
    不忽略大小寫:
    :set noignorecase 或 :set noic

    在 terminal 中輸入 ^M 的方法:
    如把 DOS 的 CR(0x0d) 移除的指令 :%s/^M//g
    這個 ^M 按 ctrl+v ctrl+m
    其實也可以用 :%s/\r//g 

沒有留言: