跳到主內容

Vim 個人化設定

BUBU 因在 Linux 環境下比較常用 Vim 這個編輯文字,因此有在網路上看到別人有設定好的環境直接拿來使用,個人覺得還ok 的外加該作者使用方式都有說明下來。我也把這一篇給記錄下來。

使用「.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

shot-16.png

koehler

shot-17.png

darkblue

shot-18.png

desert

shot-19.png

shine

shot-20.png

ron

shot-21.png

torte

shot-22.png

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

colorscheme torte

  • 或是縮寫成:

colo torte

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

colo lucid

shot-23.png

顯示游標所在的列


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

set cursorline

shot-24.png

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

set nocursorline

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

hi CursorLine cterm=none ctermbg=DarkMagenta ctermfg=White

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

「ctermbg」和「ctermfg」分別用來調整背景色和前景色,顏色可以使用vim的256色編號(如下圖表),也可以使用以下的16色英文單字:Black、DarkBlue、DarkGreen、DarkCyan、DarkRed、DarkMagenta、Brown(DarkYellow)、LightGray(LightGrey、Gray、Grey)、DarkGray(DarkGrey)、Blue(LightBlue)、Green(LightGreen)、Cyan(LightCyan)、Red(LightRed)、Magenta(LightMagenta)、Yellow(LightYellow)、White。

xterm-256.png

  • 調整之後的效果如下:

shot-25.png

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

顯示游標所在的行


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

set cursorcolumn

shot-26.png

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

set nocursorcolumn

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

hi CursorColumn cterm=none ctermbg=DarkMagenta ctermfg=White

  • 調整之後的效果如下:

shot-27.png

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

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


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

syntax enable

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

syntax off

shot-28.png

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

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


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

set compatible

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

set nocompatible

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

開啟/關閉vim的行號顯示


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

set number

  • 調整之後的效果如下:

shot-29.png

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

set nonumber

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


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

set ruler

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

set noruler

shot-30.png

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


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

set ignorecase

  • 在「ignorecase」狀態下,若搜尋「the」,則「THE」、「tHE」、「The」...等子字串都算是符合搜尋條件。
  • 使用以下指令可以關閉vim的忽略大小寫搜尋:

set noignorecase

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

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


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

set smartcase

  • 如果「smartcase」和「ignorecase」都被開啟,此時搜尋「the」,則「THE」、「tHE」、「The」...等子字串都算是符合搜尋條件;但搜尋「The」,則只有「The」符合搜尋條件。

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

set nosmartcase

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


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

set hlsearch

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

shot-31.png

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

set nohlsearch

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

hi Search cterm=reverse ctermbg=none ctermfg=none

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

shot-32.png

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

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


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

set incsearch

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

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

set noincsearch

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


vim的自動縮排有「autoindent」、「smartindent」和「cindent」三種。「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擴展成多個空格的空格數量,可以設定「tabstop」和「softtabstop」這兩個環境變數。例如要將一個TAB擴展成四個空格的話,可以使用以下指令將「tabstop」和「softtabstop」設為「4」:

set tabstop=4
set softtabstop=4

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


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

set shiftwidth=4

如果將「tabstop」設為「3」,「shiftwidth」設為「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會出現確認訊息,要求使用者回答,而不是直接阻擋使用者進行該項動作。

shot-33.png

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

set noconfirm

設定「backspace」鍵的功能


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

set backspace=indent,eol,start

或是

set backspace=2

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

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


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

set history=500

開啟/關閉vim的狀態列


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

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

set laststatus=2

  • 調整之後的效果如下:

shot-34.png

  • 使用以下指令可以關閉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
  • 調整之後的效果如下:

shot-35.png

還能顯示檔案大小呢!

  • 若要修改配色,可以在文字格式加上「%*」(切換回預設配色)和「%#配色名稱#」,並配合「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
  • 調整之後的效果如下:

shot-36.png

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

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


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

set showcmd

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

shot-37.png

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

  • 使用以下指令可以關閉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的多國語系編碼判斷


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

shot-38.png

  • 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」,這兩種編碼方式相對不嚴謹,但會頻繁遇到。接著是涵蓋更多中文及其它字元的「gbk」與「gb18030」編碼。中文嘗試結束之後,再來嘗試日文所使用的「euc-jp」和韓文使用的「euc-kr」。最後使用最不嚴謹的「latin1」來墊底。

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

shot-39.png

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

set encoding=utf-8

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

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

加入自訂的快速鍵


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

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

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

即可在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」檔案。檔案內容如下:
.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



以上都是原者的記錄,下面是我有修改過,不顯示目前行列的狀態,滑鼠判斷

"################### 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
if has('mouse')
  set mouse=a
endif
"#######################################################
" Color
set t_Co=256
colo torte
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



參考相關網頁