vim文字編輯器是vi文字編輯器的強化版本,兩者都是運行在文字介面(CLI)上。vim支援多次復原、多窗格、程式碼語法高亮和滑鼠控制等多種功能,經常在Linux和macOS作業系統上被用來查看與編寫程式碼,尤其是透過SSH連線來操作系統的時候更為常用。由於vim是如此常用的文字編輯器,且就算在別台電腦上都有可能會使用SSH連回自己的主機使用vim來編輯文字檔案,以至於替vim設計出一個屬於自己的編輯環境是非常有利於工作效率的。但究竟要怎麼設計出自己的vim編輯環境呢?又能做到怎麼樣的效果呢?本篇文章將會透過.vimrc檔案來一步步打造屬於個人的vim環境。



首先來看看沒設定.vimrc檔案時,開啟Java原始碼檔案的結果。

vimrc

從上圖可以看到顯示出來雖然有程式碼高亮和成對括號標示,但沒有顯示行號和游標行列提示,僅有顯示游標座標,這樣並不利於程式碼的閱讀。然而,加入自己的.vimrc檔案後,就可以顯示出如下圖的效果,使vim的文字配色更能符合自己的喜好,也能顯示行號和游標行列提示(游標十字瞄準線),讓程式閱讀更加迅速!

vimrc

使用.vimrc檔案進行vim環境設定

vim文字編輯器有自己的命令列模式,使用者可以在vim內下達一些指令來完成特定的動作,像是設定環境變數、快速鍵、配色等等,都可以透過vim文字編輯器的命令列模式來完成。vim在開啟的時候會先去讀取使用者家目錄下的.vimrc檔案(~/.vimrc),並且自動執行這個檔案中的所有指令。也就是說,.vimrc檔案可以讓使用者自行決定其vim文字編輯器應該要透過環境變數開啟哪些特定的功能(如行號顯示),也可以讓使用者加入自己的快速鍵來完成指定的工作,最重要、同時也是最常用的就是能事先指定配色了!

讓vim能支援256色

vim的t_Co環境變數決定了vim支援的顏色數量,如果要讓vim顯示出來的效果好看一些,建議將這個環境變數設為256,也就是vim最大能支援的256色。

.vimrc檔案中添加以下指令:

set t_Co=256

透過顏色方案來做好全套配色

vim有顏色方案(colorscheme)的功能,可以讓使用者使用colorscheme或是colo指令來設定vim的配色主題。vim通常會內建幾個顏色方案,存在/usr/share/vim/vimNN/colors(NN是vim的版本號碼)目錄中,副檔名為.vim。以下挑幾個內建的顏色方案來給大家看看:

default

vimrc

koehler

vimrc

darkblue

vimrc

desert

vimrc

shine

vimrc

ron

vimrc

torte

vimrc

筆者覺得內建的幾個顏色方案中,torte是看得最順眼的一個。如果要將torte作為vim的初始顏色方案,可以將以下指令寫入.vimrc檔案中:

colorscheme torte

或是縮寫成:

colo torte

除了官方內建的顏色方案能使用之外,網路上也有很多地方有提供他人製作的vim顏色方案,只要將該顏色方案的.vim檔案放置於~/.vim/colors/目錄中,即可使用colorscheme或是colo指令來套用。例如從vim官方網站找到的lucid.vim就可以放置在那個目錄中,並使用以下指令來套用:

colo lucid

vimrc

顯示游標所在的列

若要顯示游標所在的「列(row)」,也就是標示出游標所在的水平方向,可以使用以下指令來開啟:

set cursorline

vimrc

如果要關閉,可以使用以下指令來關閉:

set nocursorline

如果覺得預設標示列的方式只是用底線,感覺很醜而且又會擋到真正的底線字元的話,可以使用highlight或是hi指令來調整,如下:

hi CursorLine cterm=none ctermbg=DarkMagenta ctermfg=White

以上指令中,cterm用來調整文字上的變化:none表示維持不變;underline表示增加底線;bold可以將文字加粗;reverse會將顏色反白。

ctermbgctermfg分別用來調整背景色和前景色,顏色可以使用vim的256色編號(如下圖表),也可以使用以下的16色英文單字:BlackDarkBlueDarkGreenDarkCyanDarkRedDarkMagentaBrown(DarkYellow)、LightGray(LightGreyGrayGrey)、DarkGray(DarkGrey)、Blue(LightBlue)、Green(LightGreen)、Cyan(LightCyan)、Red(LightRed)、Magenta(LightMagenta)、Yellow(LightYellow)、White

vimrc

調整之後的效果如下:

vimrc

注意highlight或是hi指令應寫在colorscheme之後。

顯示游標所在的行

若要顯示游標所在的「行(column)」,也就是標示出游標所在的垂直方向,可以使用以下指令來開啟:

set cursorcolumn

vimrc

如果要關閉,可以使用以下指令來關閉:

set nocursorcolumn

如果覺得預設標示行的方式不好看的話,同樣也可以使用highlight或是hi指令來調整,如下:

hi CursorColumn cterm=none ctermbg=DarkMagenta ctermfg=White

調整之後的效果如下:

vimrc

注意highlight或是hi指令應寫在colorscheme之後。

開啟/關閉vim的程式碼語法高亮支援

使用以下指令可以開啟vim的程式碼語法高亮功能:

syntax enable

使用以下指令可以關閉vim的程式碼語法高亮功能:

syntax off

vimrc

注意syntax指令應寫在highlight之前。

開啟/關閉vim的vi相容模式

使用以下指令可以開啟vim的vi相容模式:

set compatible

開啟了之後,會有許多屬於vim的功能無法被使用。一般都會使用以下指令來關閉vim的vi相容模式:

set nocompatible

建議在一開始就先執行這行指令。

開啟/關閉vim的行號顯示

使用以下指令可以開啟vim的行號顯示:

set number

調整之後的效果如下:

vimrc

使用以下指令可以關閉vim的行號顯示:

set nonumber

開啟/關閉vim的游標座標顯示

使用以下指令可以開啟vim的右下角游標座標顯示:

set ruler

使用以下指令可以關閉vim的右下角游標座標顯示:

set noruler

vimrc

開啟/關閉vim的忽略大小寫搜尋

使用以下指令可以開啟vim的忽略大小寫搜尋:

set ignorecase

ignorecase狀態下,若搜尋the,則THEtHEThe……等子字串都算是符合搜尋條件。

使用以下指令可以關閉vim的忽略大小寫搜尋:

set noignorecase

如果要在noignorecase的狀態下忽略大小寫進行搜尋的話,要在搜尋樣本中加上\c

開啟/關閉vim的智慧大小寫搜尋

使用以下指令可以開啟vim的智慧大小寫搜尋:

set smartcase

如果smartcaseignorecase都被開啟,此時搜尋the,則THEtHEThe……等子字串都算是符合搜尋條件;但搜尋The,則只有The符合搜尋條件。

使用以下指令可以關閉vim的智慧大小寫搜尋:

set nosmartcase

開啟/關閉vim的搜尋結果高亮提示

使用以下指令可以開啟vim的搜尋結果高亮提示:

set hlsearch

調整之後會將搜尋到的所有結果進行高亮顯示,效果如下:

vimrc

使用以下指令可以關閉vim的搜尋結果高亮提示:

set nohlsearch

如果覺得vim預設的高亮提示不好看的話,可以使用highlight或是hi指令來調整,如下:

hi Search cterm=reverse ctermbg=none ctermfg=none

調整之後可以將搜尋結果反白顯示,效果如下:

vimrc

注意highlight或是hi指令應寫在colorscheme之後。

開啟/關閉vim的加強版搜尋功能

使用以下指令可以開啟vim的加強版搜尋功能:

set incsearch

開啟incsearch之後,在輸入搜尋樣本的期間就會開始進行搜尋了,不用等到樣本全部輸入完成。如果有開啟hlsearch,則會在樣本確定輸入完成後(按下Enter)才會把所有符合樣本的結果高亮顯示。

使用以下指令可以關閉vim的加強版搜尋功能:

set noincsearch

開啟/關閉vim的自動縮排功能

vim的自動縮排有autoindentsmartindentcindent三種。autoindent是最基本的縮牌方式,會在建立出新的一行的同時,自動對齊上一行的縮排。smartindent則是會在autoindent的基礎上,針對{(左大括號)後所產生的新行,再多往內縮排一次,且若新行的開頭是}(右大括號),則會取消往內縮多排一次的動作。而cindent則是會在smartindent的基礎上,加入簡單的C/C++、Java等程式語法結構的判斷,如果{是發生在註解之內,就不會進行縮排,並且也不是根據新行的上一行來決定新行的縮排,而是會根據新行所在的程式區塊(block)來決定,另外也會根據其他符號進行縮排。

使用以下指令可以開啟vim的cindent自動縮排功能:

set cindent

使用以下指令可以關閉vim的cindent自動縮排功能:

set nocindent

vim的TAB和空格處理

使用以下指令可以開啟vim的TAB擴展功能:

set expandtab

將TAB擴展功能開啟之後,在vim插入的TAB字元就可以被擴展成一個或是多個空格(space)。如果要插入原本的TAB字元,可以先按下Ctrl + v,再按下Tab鍵。

使用以下指令可以關閉vim的TAB擴展功能:

set noexpandtab

如果要設定vim將一個TAB擴展成多個空格的空格數量,可以設定tabstopsofttabstop這兩個環境變數。例如要將一個TAB擴展成四個空格的話,可以使用以下指令將tabstopsofttabstop設為4

set tabstop=4
set softtabstop=4

tabstopsofttabstop的功能略有差異,簡單來說,tabstop是vim對於TAB字元本身的寬度定義,如果有開啟TAB擴展功能,則這個寬度就等於是空格字元的數量。而softtabstop是vim對於「虛擬TAB」字元的寬度定義,這個「虛擬TAB」字元表示的寬度會儘量以TAB字元來做填滿,沒有填滿的部份會以空格字元來取代。舉例來說,如果將tabstop設為3softtabstop設為8,在使用鍵盤按鍵插入TAB字元時(實際上會是一個「虛擬TAB」字元),會產生兩個TAB字元(共六個字元的寬度)和兩個空格字元來補足八個字元的寬度。若有開啟TAB擴展功能,兩個TAB字元會被擴展成六個空格字元,也就會變成是八個空格字元。

如果要設定原本自動縮排產生的字元寬度,則需要使用shiftwidth這個環境變數來決定其TAB字元和用來擴展的空格字元所組合而成的字元寬度。可以使用以下指令將shiftwidth設為4

set shiftwidth=4

如果將tabstop設為3shiftwidth設為4,自動縮排的時候會產生一個TAB字元(三個字元的寬度)和一個空格字元來補足四個字元的寬度。若有開啟TAB擴展功能,一個TAB字元會被擴展成三個空格字元,也就會變成是四個空格字元。

另外,雖然vim有自動縮排功能,但有時候我們還是會手動在一行的最前面,使用鍵盤的TAB按鍵來進行縮排。前面有提到過,鍵盤TAB按鍵的寬度是基於softtabstop變數所形成的「虛擬TAB」字元,而不是自動縮排時所使用的shiftwidth環境變數。如果要在行首插入縮排字元時,也能使用shiftwidth環境變數所定義的寬度,那麼可以開啟vim的智慧TAB功能。

使用以下指令可以開啟vim的智慧TAB功能:

set smarttab

使用以下指令可以關閉vim的智慧TAB功能:

set nosmarttab

開啟/關閉vim的確認功能

使用以下指令可以開啟vim的確認功能:

set confirm

開啟vim的確認功能之後,遇到需要進行確認的動作時(例如要不儲存文件內容改變而關閉vim時),vim會出現確認訊息,要求使用者回答,而不是直接阻擋使用者進行該項動作。

vimrc

使用以下指令可以關閉vim的確認功能:

set noconfirm

設定backspace鍵的功能

vim可以透過backspace環境變數,設定其在編輯模式下,鍵盤上backspace鍵的功能。可以使用以下指令來開啟backspace鍵的所有功能:

set backspace=indent,eol,start

或是:

set backspace=2

indent表示允許使用backspace鍵來刪除縮排;eol表示允許使用backspace來刪除換行字元,使其可以退回至上一行;start表示允許使用Ctrl + wCtrl + u快速鍵來刪除獨立詞語和同類字元(縮排、非縮排字元)。

設定vim記錄已執行指令的數量上限

vim可以透過laststatus環境變數,設定其所能記錄的已執行指令之數量上限。可以將數量上限設多一點,以利查找。若要讓vim儲存500筆指令,可以使用以下指令:

set history=500

開啟/關閉vim的狀態列

vim可以透過laststatus環境變數,設定其狀態列的顯示方式。

使用以下指令可以開啟vim的狀態列:

set laststatus=2

調整之後的效果如下:

vimrc

使用以下指令可以關閉vim的狀態列:

set laststatus=1

修改vim的狀態列

vim可以透過statusline環境變數,設定其狀態列的文字格式。其中,%t代表檔案名稱;%F代表檔案路徑;%y代表檔案類型;%=代表左右分隔;%c代表目前游標所在的行號;%l代表目前游標所在的列號;%L代表總列數;%p代表目前瀏覽位置的進度百分比。

.vimrc檔案中添加以下指令配置:

set statusline=[%{expand('%:p')}][%{strlen(&fenc)?&fenc:&enc},\ %{&ff},\ %{strlen(&filetype)?&filetype:'plain'}]%{FileSize()}%{IsBinary()}%=%c,%l/%L\ [%3p%%]

function IsBinary()
    if (&binary == 0)
        return ""
    else
        return "[Binary]"
    endif
endfunction

function FileSize()
    let bytes = getfsize(expand("%:p"))
    if bytes <= 0
        return "[Empty]"
    endif
    if bytes < 1024
        return "[" . bytes . "B]"
    elseif bytes < 1048576
        return "[" . (bytes / 1024) . "KB]"
    else
        return "[" . (bytes / 1048576) . "MB]"
    endif
endfunction

調整之後的效果如下:

vimrc

還能顯示檔案大小呢!

若要修改配色,可以在文字格式加上%*(切換回預設配色)和%#配色名稱#,並配合highlight或是hi指令來調整。可以將以上指令配置修改如下:

set statusline=%#filepath#[%{expand('%:p')}]%#filetype#[%{strlen(&fenc)?&fenc:&enc},\ %{&ff},\ %{strlen(&filetype)?&filetype:'plain'}]%#filesize#%{FileSize()}%{IsBinary()}%=%#position#%c,%l/%L\ [%3p%%]

hi filepath cterm=none ctermbg=238 ctermfg=40
hi filetype cterm=none ctermbg=238 ctermfg=45
hi filesize cterm=none ctermbg=238 ctermfg=225
hi position cterm=none ctermbg=238 ctermfg=228

調整之後的效果如下:

vimrc

注意highlight或是hi指令應寫在colorscheme之後。

開啟/關閉vim的指令暫存提示

使用以下指令可以開啟vim的指令暫存提示:

set showcmd

開啟指令暫存提示之後,vim就可以在右下角顯示使用者之前輸入的指令,如下圖:

vimrc

如此以來就可以有效提醒使用者目前指令輸入到哪裡了。

使用以下指令可以關閉vim的指令暫存提示:

set noshowcmd

開啟/關閉vim的模式提示

使用以下指令可以開啟vim的模式提示:

set showmode

開啟指令暫存提示之後,vim才可以在底部顯示目前使用的操作模式是一般、插入、取代還是選取模式。

使用以下指令可以關閉vim的模式提示:

set noshowmode

開啟/關閉vim的自動換行

使用以下指令可以開啟vim的自動換行:

set wrap

開啟自動換行之後,若一行的文字長度超過vim所能顯示的範圍,就會換行顯示。建議與顯示行號功能一起使用。

使用以下指令可以關閉vim的自動換行:

set nowrap

開啟/關閉vim的自動存檔

使用以下指令可以開啟vim的自動存檔:

set autowrite

開啟自動存檔之後,當vim編輯器失去焦點,就會自動存檔。

使用以下指令可以關閉vim的自動存檔:

set noautowrite

開啟/關閉vim的滑鼠控制功能

vim可以透過mouse環境變數,設定其滑鼠在哪些模式下可以被用來操作編輯器。n為一般模式;v為視覺模式;i為插入模式;c為命令列模式;a為所有模式。

使用以下指令可以在所有模式下開啟vim的滑鼠控制功能:

set mouse=a

開啟滑鼠控制功能之後,就可以使用滑鼠來控制vim的游標了!

使用以下指令可以關閉vim的滑鼠控制功能:

set mouse=

vim的多國語系編碼判斷

在開啟文字檔案的時候,偶爾會因為解碼時所用的字元編碼方式(字元集)不符合正確的字元編碼,而出現亂碼的情形。如下圖:

vimrc

vim可以透過fileencodings環境變數,設定其在開啟文字檔時要優先使用什麼字元編碼方式來開啟。但前提是它在編譯前要先設定好有支援multi_byte功能。可以在.vimrc檔案中撰寫以下判斷式來判斷vim有無支援multi_byte功能:

if has("multi_byte")
    
else
    echoerr "If +multi_byte is not included, you should compile Vim with big features."
endif

我們可以依照自己經常接觸的字元編碼和它們個別涵蓋的字元範圍及嚴謹程度來排列出嘗試解碼的順序,並設定給fileencodings環境變數儲存。如下:

set fileencodings=utf-8,utf-16,big5,gb2312,gbk,gb18030,euc-jp,euc-kr,latin1

萬國碼「UTF」是涵蓋率最高,同時也是最常用的字元編碼,而且編碼方式都很嚴謹。其中UTF-8又較UTF-16更嚴格一點,因此排在首位來嘗試解碼。由於筆者是正體中文使用者,因此再來是以正體中文為主的big5和以簡體中文為主的gb2312,這兩種編碼方式相對不嚴謹,但會頻繁遇到。接著是涵蓋更多中文及其它字元的gbkgb18030編碼。中文嘗試結束之後,再來嘗試日文所使用的euc-jp和韓文使用的euc-kr。最後使用最不嚴謹的latin1來墊底。

設定完fileencodings環境變數之後,就比較不會開到亂碼檔案了!

vimrc

為了確保vim內部有辦法使用使用所有的字元,也建議將encoding環境變數固定為utf-8。指令如下:

set encoding=utf-8

這是為了避免encoding若是設為big5,而讀取了big5範圍之外的字元,就算fileencodings有命中,並且可以成功解碼,但在內部進行編碼轉換時還是會無法將該字元轉成big5而發生問題。

如果使用者的終端機並不是使用與vim所在的主機一樣的文字編碼,則需要修改termencoding環境變數,將其設定成屬於自己終端環境的編碼方式,若編碼不合的話會有亂碼的問題發生。

加入自訂的快速鍵

vim的mapnmapvmapomapmap!imapcmap指令可以在不同vim操作模式下建立快速鍵。其中,map涵蓋了一般模式和視覺模式;map!涵蓋了map沒包含的模式;imap只涵蓋插入模式;cmap只涵蓋命令列模式。

map指令家族的用法都一樣,格式如下:

map 快速鍵 對應的按鍵和指令

例如在.vimrc設定檔加入:

map <C-t> :echo &shiftwidth<CR>

即可在vim的一般模式和視覺模式下,按下快速鍵Ctrl + t來顯示自動縮排的寬度。由於vim內建的快速鍵以及終端機軟體內建的快速鍵已經有很多,所以要找到能夠自訂的快速鍵也不太容易,這是需要不斷嘗試的部份哦!

使用Ctrl + n來切換滑鼠模式

當vim開啟了滑鼠模式之後,終端機原本需要使用滑鼠進行的功能(如右鍵選單)可能就會無法使用,因此筆者將著個功能做成快速鍵來切換。在.vimrc設定檔加入以下片段,就能用Ctrl + n快速鍵來進行滑鼠模式的切換了!

map <C-n> :call SwitchMouseMode()<CR>
map! <C-n> <Esc>:call SwitchMouseMode()<CR>
function SwitchMouseMode()
    if (&mouse == "a")
        let &mouse = ""
        echo "Mouse is disabled."
    else
        let &mouse = "a"
        echo "Mouse is enabled."
    endif
endfunction
使用Ctrl + b來切換文字/二進制模式

在特殊的情況下,我們需要使用二進制模式來編輯文字檔案,單純地將字元寫入至檔案中,防止vim文字編輯器雞婆地對其加入EOL字元(End of Line),而讓檔案莫名其妙多出了一個位元組的資料。在.vimrc設定檔加入以下片段,就能用Ctrl + b快速鍵來進行文字及二進制模式的切換了!

map <C-b> :call SwitchTextBinaryMode()<CR>
map! <C-b> <Esc>:call SwitchTextBinaryMode()<CR>
function SwitchTextBinaryMode()
    if (&binary == 0)
        set binary
        set noeol
        echo "Switch to binary mode."
    else
        set nobinary
        set eol
        echo "Switch to text mode."
    endif
endfunction
使用Ctrl + j強制將目前開啟的文件轉成UTF-8編碼

由於跨平台、國際化的問題,將文件使用最普遍的UTF-8編碼來儲存是最方便、保險的。在.vimrc設定檔加入以下片段,就能用Ctrl + j快速鍵來對該文件進行UTF-8編碼的強制轉換!

map <C-j> :call ToUTF8()<CR>
map! <C-j> <Esc>:call ToUTF8()<CR>
function ToUTF8()
    if (&fileencoding == "utf-8")
        echo "It is already UTF-8."
    else
        let &fileencoding="utf-8"
        echo "Convert to UTF-8."
    endif
    let &ff="unix"
endfunction

利用修改fileencoding環境變數的方式來轉換文件的編碼。順便修改ff環境變數,使文件變成unix相容的格式。

使用Ctrl + t將所有TAB字元轉成空格字元

一個文件的縮排字元如果混雜著TAB字元和空格字元,有時會十分不便。在.vimrc設定檔加入以下片段,就能用Ctrl + t快速鍵來將該文件中的TAB字元擴展成空格字元!

map <C-t> :call TabToSpaces()<CR>
map! <C-t> <Esc>:call TabToSpaces()<CR>
function TabToSpaces()
    retab
    echo "Convert tab to spaces."
endfunction

使用retab指令來轉換TAB字元。

使用Ctrl + l來切換自動斷行模式

在不同需求下,我們有時會需要自動斷行功能,有時不需要自動斷行功能。在.vimrc設定檔加入以下片段,就能用Ctrl + l快速鍵來進行自動斷行模式的切換了!

map <C-l> :call SwitchLineBreakingMode()<CR>
map! <C-l> <Esc>:call SwitchLineBreakingMode()<CR>
function SwitchLineBreakingMode()
    if (&wrap == 0)
        set wrap
        echo "Switch to line breaking mode."
    else
        set nowrap
        echo "Switch to one line mode."
    endif
endfunction
使用Ctrl + f來切換完整/簡單模式

筆者習慣使用滑鼠來選取終端機內的文字進行快速鍵或是右鍵複製,再至指定位置使用快速鍵或是右鍵貼上。如果vim有設置滑鼠模式、顯示行號且無自動斷行的話,複製文字時將會遇到一些困難。再來是如果vim有開啟自動縮排功能的話,貼上文字時,原先的排版也會亂掉。所以特別開了一個快速鍵來切換完整和簡單模式,在簡單模式下可以照原本的終端機使用習慣,在vim內進行選取和複製貼上。

map <C-f> :call SwitchFullSimpleMode()<CR>
map! <C-f> <Esc>:call SwitchFullSimpleMode()<CR>
function SwitchFullSimpleMode()
    if (&mouse == "a")
        let &mouse = ""
        set nocindent
        set nonumber
        set wrap
        echo "Switch to simple mode.(nomouse, nonumber, nocindent, wrap)"
    else
        let &mouse = "a"
        set cindent
        set number
        set nowrap
        echo "Switch to full mode.(mouse, number, cindent, nowrap)"
    endif
endfunction

完整的.vimrc檔案

以上對於vim指令及.vimrc檔案的介紹因為東西很雜很多,可能會讓各位看得霧煞煞,因此筆者在文章最後釋出已撰寫完成的.vimrc檔案。檔案內容如下:

"################### Magic vimrc ###################
" ctrl+n Enable/disable mouse
" ctrl+b Switch to text/binary
" ctrl+j To utf-8 file
" ctrl+t Convert tab to spaces
" ctrl+l Toggle line breaking
" ctrl+f Switch to full/simple

"#######################################################
set nocompatible

"#######################################################
syntax enable
set number
set noruler
set ignorecase
set smartcase
set incsearch
set cindent
set expandtab
set tabstop=4
set softtabstop=4
set shiftwidth=4
set smarttab
set confirm
set backspace=indent,eol,start
set history=500
set showcmd
set showmode
set nowrap
set autowrite
set mouse=a

"#######################################################
" Color
set t_Co=256
colo torte
set cursorline
set cursorcolumn
set hlsearch
hi CursorLine cterm=none ctermbg=DarkMagenta ctermfg=White
hi CursorColumn cterm=none ctermbg=DarkMagenta ctermfg=White
hi Search cterm=reverse ctermbg=none ctermfg=none

"#######################################################
" statusline
set laststatus=2
set statusline=%#filepath#[%{expand('%:p')}]%#filetype#[%{strlen(&fenc)?&fenc:&enc},\ %{&ff},\ %{strlen(&filetype)?&filetype:'plain'}]%#filesize#%{FileSize()}%{IsBinary()}%=%#position#%c,%l/%L\ [%3p%%]
hi filepath cterm=none ctermbg=238 ctermfg=40
hi filetype cterm=none ctermbg=238 ctermfg=45
hi filesize cterm=none ctermbg=238 ctermfg=225
hi position cterm=none ctermbg=238 ctermfg=228
function IsBinary()
    if (&binary == 0)
        return ""
    else
        return "[Binary]"
    endif
endfunction
function FileSize()
    let bytes = getfsize(expand("%:p"))
    if bytes <= 0
        return "[Empty]"
    endif
    if bytes < 1024
        return "[" . bytes . "B]"
    elseif bytes < 1048576
        return "[" . (bytes / 1024) . "KB]"
    else
        return "[" . (bytes / 1048576) . "MB]"
    endif
endfunction

"#######################################################
" encode
if has("multi_byte")
    set fileencodings=utf-8,utf-16,big5,gb2312,gbk,gb18030,euc-jp,euc-kr,latin1
else
    echoerr "If +multi_byte is not included, you should compile Vim with big features."
endif

"#######################################################
" shortcut
" Toggle mouse
map <C-n> :call SwitchMouseMode()<CR>
map! <C-n> <Esc>:call SwitchMouseMode()<CR>
function SwitchMouseMode()
    if (&mouse == "a")
        let &mouse = ""
        echo "Mouse is disabled."
    else
        let &mouse = "a"
        echo "Mouse is enabled."
    endif
endfunction
" Toggle text/binary
map <C-b> :call SwitchTextBinaryMode()<CR>
map! <C-b> <Esc>:call SwitchTextBinaryMode()<CR>
function SwitchTextBinaryMode()
    if (&binary == 0)
        set binary
        set noeol
        echo "Switch to binary mode."
    else
        set nobinary
        set eol
        echo "Switch to text mode."
    endif
endfunction
" To utf-8 file
map <C-j> :call ToUTF8()<CR>
map! <C-j> <Esc>:call ToUTF8()<CR>
function ToUTF8()
    if (&fileencoding == "utf-8")
        echo "It is already UTF-8."
    else
        let &fileencoding="utf-8"
        echo "Convert to UTF-8."
    endif
    let &ff="unix"
endfunction
" Convert tab to spaces
map <C-t> :call TabToSpaces()<CR>
map! <C-t> <Esc>:call TabToSpaces()<CR>
function TabToSpaces()
    retab
    echo "Convert tab to spaces."
endfunction
" Toggle line breaking
map <C-l> :call SwitchLineBreakingMode()<CR>
map! <C-l> <Esc>:call SwitchLineBreakingMode()<CR>
function SwitchLineBreakingMode()
    if (&wrap == 0)
        set wrap
        echo "Switch to line breaking mode."
    else
        set nowrap
        echo "Switch to one line mode."
    endif
endfunction
" Switch to full/simple
map <C-f> :call SwitchFullSimpleMode()<CR>
map! <C-f> <Esc>:call SwitchFullSimpleMode()<CR>
function SwitchFullSimpleMode()
    if (&mouse == "a")
        let &mouse = ""
        set nocindent
        set nonumber
        set wrap
        echo "Switch to simple mode.(nomouse, nonumber, nocindent, wrap)"
    else
        let &mouse = "a"
        set cindent
        set number
        set nowrap
        echo "Switch to full mode.(mouse, number, cindent, nowrap)"
    endif
endfunction