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 語言——開始學習。