- Published on
Vim 客製化:設定與 IDE 整合

Vim 系列文章
- Vim 生存指南:模式與移動
- Vim 編輯基礎:輸入、刪除和複製貼上
- Vim 選取模式:三種 Visual Mode
- Vim 語法系統:動詞 + 量詞 + 名詞
- Vim 搜尋技巧:快速定位與取代
- Vim 效率倍增:重複與自動化
- Vim 客製化:設定與 IDE 整合 (本篇)
經過前六篇的學習,你已經掌握了 Vim 的核心操作。接下來就是 Vim 最有趣的部分:客製化。每個 Vim 使用者的設定都不一樣,都是根據自己的習慣打造的
這篇我們要學習如何設定 vimrc、建立 Key Mapping,以及如何在 IDE (IdeaVim、VSCode) 中享受 Vim 的編輯效率
設定檔位置
| 環境 | 設定檔位置 |
|---|---|
| Linux/macOS | ~/.vimrc |
| Windows | ~/_vimrc 或 %USERPROFILE%\_vimrc |
| Neovim | ~/.config/nvim/init.vim |
| IdeaVim | ~/.ideavimrc |
| VSCode | Settings JSON 中設定 |
建立你的第一個 vimrc
# 用 Vim 建立設定檔
vim ~/.vimrc
重新載入設定
修改 vimrc 後,需要重新載入
:source ~/.vimrc
或是設定一個快捷鍵
nnoremap <leader>r :source ~/.vimrc<CR>
基本設定 (set)
顯示設定
" 行號(強烈建議開啟)
set number " 顯示絕對行號
set relativenumber " 顯示相對行號(方便用 5j, 3k)
" 游標
set cursorline " 高亮游標所在行
set scrolloff=8 " 游標距離螢幕邊緣保持 8 行
" 狀態列
set showcmd " 顯示輸入中的指令
set showmode " 顯示目前模式
為什麼要用 relativenumber?
因為你可以直接看到「要往下幾行」
3 | some code
2 | some code
1 | some code
15 | cursor here <- 絕對行號顯示在這
1 | some code
2 | some code <- 看到 2,就知道按 2j 可以到這
3 | some code
搜尋設定
這些設定可以讓搜尋更方便,關於搜尋的詳細操作請參考搜尋技巧
set hlsearch " 高亮搜尋結果
set incsearch " 即時搜尋(邊輸入邊搜尋)
set ignorecase " 忽略大小寫
set smartcase " 如果有大寫則區分大小寫
smartcase 的行為
- 搜尋
hello→ 不區分大小寫 - 搜尋
Hello→ 區分大小寫(因為你打了大寫)
縮排設定
set expandtab " Tab 轉空格
set tabstop=4 " Tab 顯示寬度
set softtabstop=4 " 編輯時 Tab 寬度
set shiftwidth=4 " 縮排寬度(>> 的寬度)
set autoindent " 自動縮排
set smartindent " 智慧縮排
針對不同檔案類型
autocmd FileType javascript,typescript,json setlocal tabstop=2 shiftwidth=2
autocmd FileType python setlocal tabstop=4 shiftwidth=4
剪貼簿
" 使用系統剪貼簿(推薦,跨平台通用)
set clipboard=unnamed,unnamedplus
設定後,y 和 p 會直接操作系統剪貼簿,可以和其他程式互通
unnamed對應*寄存器,unnamedplus對應+寄存器- macOS 上兩者指向同一個系統剪貼簿,效果相同
- Linux (X11) 上
*是滑鼠選取 (PRIMARY),+是 Ctrl+C 的剪貼簿 (CLIPBOARD),兩者不同 - 兩個一起設定就能跨平台通用,不用針對不同系統分開設定
Key Mapping:客製化快捷鍵
map vs noremap
重要:永遠使用 noremap,不要用 map
" 危險:map 會遞迴展開
nmap j gj
nmap gj j " 會造成無限迴圈!
" 安全:noremap 不會遞迴
nnoremap j gj
nnoremap gj j " 正常運作
Mapping 指令對照
| 使用這個 | 不要用這個 | 模式 |
|---|---|---|
nnoremap | nmap | Normal |
inoremap | imap | Insert |
vnoremap | vmap | Visual |
cnoremap | cmap | Command |
特殊按鍵表示
| 表示 | 按鍵 |
|---|---|
<CR> | Enter |
<Esc> | Escape |
<Tab> | Tab |
<Space> | 空白鍵 |
<C-x> | Ctrl + x |
<A-x> | Alt + x |
<D-x> | Command + x (Mac) |
<leader> | Leader key |
Leader Key:你的專屬前綴
Leader Key 是一個「前綴鍵」,用來建立個人化的快捷鍵,避免和 Vim 內建指令衝突。Vim 的預設 Leader Key 是 \(反斜線),但大多數人會改成更順手的按鍵
設定 Leader Key
let mapleader = " " " 空白鍵(最推薦)
" 或
let mapleader = "," " 逗號(也很常見)
使用 Leader Key
nnoremap <leader>w :w<CR> " 存檔
" 如果 leader 是 空白鍵,則 <leader>w = 空白鍵 + w
nnoremap <leader>q :q<CR> " 離開
nnoremap <leader>e :e ~/.vimrc<CR> " 編輯設定檔
貼上 yank 的內容
nnoremap <leader>p "0p
nnoremap <leader>P "0P
用 Leader+p 貼上最近 yank 的內容,不會被 delete 覆蓋。關於這個問題的來龍去脈,請參考編輯基礎;"0 寄存器的詳細說明,請參考效率倍增
IdeaVim 設定
如果你使用 JetBrains IDE(IntelliJ IDEA、WebStorm、Rider 等),可以安裝 IdeaVim 外掛
設定檔位置
~/.ideavimrc
啟用外掛
IdeaVim 支援很多熱門 Vim 外掛
set surround " vim-surround
set commentary " 註解 (gcc, gc)
set easymotion " EasyMotion
set highlightedyank " yank 高亮
IDE Action Mapping
IdeaVim 可以呼叫 IDE 的功能
inoremap jj <Esc>
nnoremap H ^
nnoremap L $
" 搜尋
nnoremap <leader>ff :action GotoFile<CR>
" 重構
nnoremap <leader>rn :action RenameElement<CR>
" 執行
nnoremap <leader>rr :action Rerun<CR>
VSCode Vim 設定
設定
{
"editor.lineNumbers": "relative"
"vim.easymotion": true,
"vim.surround": true,
"vim.highlightedyank.enable": true,
"vim.normalModeKeyBindings": [
{ "before": ["H"], "after": ["^"] },
{ "before": ["L"], "after": ["$"] }
],
"vim.insertModeKeyBindings": [
{ "before": ["j", "j"], "after": ["<Esc>"] }
],
}
圖片來源:AI 產生