Vim 之所以成為純文字編輯器的經典,在於其彈性以及操作流暢度,只要了解如何對待它,能帶給你的方便性可說是近乎無限,我們永遠能夠找到更好的設定以符合自己的需求。但也正因為這種高度客製化的核心,Vim 的預設配置實在是慘不忍睹,又由於 Vim 的操作方式獨樹一格,使得大多數人在第一次關不掉醜不啦嘰的 Vim 之後大概率就放棄它了。
本著分享 Vim 給更多人了解其箇中妙趣之精神,此系列將以最簡單的設定引領大家於 Windows/Mac 平台上入門 Vim。(Linux 跟 Mac 的配置比較接近,但相信 Linux 使用者不需要看本篇文章吧 XD)
Why Vim?
想當初自己開始使用 Vim 的理由就一個字:酷。看起來就很厲害 XD
有看過黑客的螢幕黑畫面游標飛來飛去?
文字突然出現又消失?
文字編輯完全不需要滑鼠?
分割畫面宛如黃金分割?
而這一切皆源自於 Vim 的全鍵盤操作理念。
Installation
- Mac OS
 內建有,但需要在 Terminal 裡執行vim,想要用 GUI 介面的可以下載 MacVim,兩者會使用相同的配置 vimrc 檔案所以不用擔心。
- Windows
 如果有安裝 Git 可以直接在環境變數PATH中加入C:\Program Files\Git\usr\bin路徑,其裡面就有 Vim 執行檔,如果想要 GUI 版本可以安裝 gVim。
現在打開終端機輸入 vim 就可以看到以下畫面(以 Mac OS 為例,gVim 有預設配置長不一樣):

黑白畫面很醜我知道,而且還很難用,所以需要一些基本設定。
vimrc 設定檔
超雷的第一個坑來了,為何我的設定沒有用?
Where is my vimrc?
Vim 會在你的電腦上根據以下順序去找尋設定檔,且注意僅使用第一個命中。
- for Mac OS, or Windows Vim in Git folder
- $HOME/.vimrc(不建議)
 網路上大多推薦這個路徑,但放在這邊有個缺點就是跟 Vim 其他所需檔案分離。
- $HOME/.vim/vimrc
 最推薦此路徑,因為跟其他 Vim 相關檔案放在一起,所以可以方便的利用版本控制工具例如 Git 來管理。
- $HOME/.exrc
- $VIMRUNTIME/defaults.vim
 
- $HOME/.vimrc(不建議)
我有刪掉一些系統路徑,想查看完整列表可以在終端機裡輸入:
$ vim --version最後面就會寫這些設定檔的引入路徑順序。
:version 然後按 Enter,接著按 j 或 d 滾動到最下面,按 q 離開說明文字。如果你使用 gVim
Windows gVim 的大坑,因為他的搜尋路徑不一樣。
- for Windows Vin in gVim folder- $HOME\_vimrc
- $HOME\vimfiles\vimrc
- $HOME\_exrc
 
以下為求一致性,建議在 $HOME\vimfiles\vimrc 檔案中加入以下文字:
set encoding=utf-8              " encoding correction, or will warn with invalid characters for some settings
set runtimepath+=$HOME/.vim     " let vim also search vim files located in $HOME/.vim
source $HOME/.vim/vimrc         " source all settings from $HOME/.vim/vimrc此後就可以共用 $HOME/.vim/vimrc 設定檔。
Minimal vimrc
本篇重點其實就以下這幾行,然後終於可以開始玩轉 Vim(苦笑。
filetype plugin indent on       " enable filetype detection
syntax on                       " enable syntax detection
set backspace=indent,eol,start  " let backspace key work at those positions
set hidden                      " allow unsaved file buffers
set noswapfile                  " disable .swp file for current file backup during editing
set hlsearch incsearch          " highlight & search when typing
set path=.,**                   " add file finding path to all recursive subfolders基本操作
開啟一個檔案。
$ vim a_file.txt超雷的第二個坑來了,打開 Vim 之後竟然不能輸入文字?
這是因為 Vim 預設為 Normal Mode(一般模式),狀態列竟然還沒有任何顯示?!此模式下的鍵盤主要功能為:
- 移動游標- h、- j、- k、- l分別代表 ←、↓、↑、→,當然你也可以用真正的方向鍵,但熟悉- hjkl可以減少手腕的移動。
 
- 文本操作- 輸入文字:按 i進入 Insert Mode(插入模式),這也是一般文字編輯器僅有的模式,按Esc回到 Normal Mode。
- 輸入 dd(delete) 刪除整行,yy(yank) 複製整行,p(paste) 貼上至後方,P貼上至前方(這些操作都是在 Normal Mode)。
- 輸入 u(undo) 復原上一步。
 
- 輸入文字:按 
- 執行指令(冒號開頭,輸入到一半可按 <C-c>放棄)- 輸入 :w(或:write)然後Enter存檔。
- 輸入 :q(或:quit)然後Enter離開 Vim,如果檔案有變更還沒保存要加驚嘆號:q!(或:quit!)強制離開 Vim。- 以上指令可以合併,例如 :wq(或:write | quit)為存檔並離開。
 
- 以上指令可以合併,例如 
 
- 輸入 
也許有人想吐槽:也太多要記,但其實字母多半有對應英文意思,接著你發現有些動作會切換模式有些不會,初學者在搞不清楚模式的情況下使用 Vim 一律建議狂按 Esc 先回到 Normal Mode。
Display Mode in Status Line
如果想知道現在處於哪個 Mode,可以在 vimrc 設定檔中加入以下設定以顯示當前模式。
" Status Line show Mode
" modified from https://gist.github.com/meskarune/57b613907ebd1df67eb7bdb83c6e6641
let g:currentmode={
    \ 'n'  : 'Normal',
    \ 'v'  : 'Visual',
    \ 'V'  : 'V·Line',
    \ '^V' : 'V·Block',
    \ 'i'  : 'Insert',
    \ 'R'  : 'Replace',
    \ 'Rv' : 'V·Replace',
    \ 'c'  : 'Command',
    \ 'cv' : 'Vim Ex',
    \ 'ce' : 'Ex',
    \ 'rm' : 'More',
    \}
set laststatus=2                           " always show statusline
set noshowmode                             " disable default '-- Insert --', etc line
set statusline=
set statusline+=%{get(g:currentmode,\ mode(),\ mode())}\   " The current mode
set statusline+=%1*\ %<%F%m%r%h%w\         " File path, modified, readonly, helpfile, preview
重啟 Vim(或是在 Normal Mode 下輸入 :source $HOME/.vim/vimrc 然後按 Enter)以套用設定,此時左下角就會顯示目前模式。
按看看就對了
建議大家先用以上 Vim 指令動作玩看看,開始體會這種「有模式」的編輯器,下一篇再來正式介紹 Vim 主要的幾個模式和常用指令動作。(喂!!一點都不簡單好嗎!!
References
- welcome home : vim online
- Leeren – Vim: Vim as an IDE (VimConf 2020 Talk)
- Vim 的哲学(一) – SegmentFault 思否
Useful for basic vimrc configuration
Using Vim in VS Code/Sublime
題外話,如果只是玩看看 Vim 的操作又不想花時間弄上面的那些設定,主流的編輯器都有套件可以模擬。
- VS Code
- Sublime Text- 開啟偏好設定,找到 "ignored_packages"設定,註解掉或移除"Vintage"即啟用 Vim 模擬功能。
 
- 開啟偏好設定,找到 
但以上的玩法有些就不吃 vimrc 這套而變成另一種設定方式,或者操作上跟 Vim 多少有出入,不在本文的範疇,儘供有興趣的人作為參考。
What is Vim?
1976 年美國計算機科學家 Bill Joy 編寫並發布了一個名為 vi 的文字編輯器,1988 年荷蘭程式設計師 Bram Moolenaar 基於 vi 開發了一套改良版文字編輯器 Vim,1992 年 Vim 移植到了 UNIX 和 MS-DOS 作業系統上,自此 Vim 逐漸成為各大系統的預載軟體。2015年 Vim 的一個 fork 分支名為 Neovim 正式發布了第一個版本,加入了更多的功能並改進初始設定。
後記
有些介紹 Vim 的網路文章劈頭就開始介紹外掛,但個人認為初學者不應該仰賴外掛,反而應該先對 Vim 有所認識,在這之上再來思考自己需要哪些外掛,而不是一昧的照單全收神人的 vimrc(vgod、amix)。
- Vim: you don’t need NERDtree or (maybe) netrw | George Ornbo
- thoughtbot – How to Do 90% of What Plugins Do (With Just Vim)
也由於外掛會有 Vim 版本相依性的問題,例如有些外掛只能用於 Neovim 而不適用於 Vim,所以也更加希望大家都能從了解基本操作——所有版本共通的 Vim 語言——開始學習。