Logo
Published on

Vim 客製化:設定與 IDE 整合

Vim 系列文章

  1. Vim 生存指南:模式與移動
  2. Vim 編輯基礎:輸入、刪除和複製貼上
  3. Vim 選取模式:三種 Visual Mode
  4. Vim 語法系統:動詞 + 量詞 + 名詞
  5. Vim 搜尋技巧:快速定位與取代
  6. Vim 效率倍增:重複與自動化
  7. 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
VSCodeSettings 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

設定後,yp 會直接操作系統剪貼簿,可以和其他程式互通

  • 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 指令對照

使用這個不要用這個模式
nnoremapnmapNormal
inoremapimapInsert
vnoremapvmapVisual
cnoremapcmapCommand

特殊按鍵表示

表示按鍵
<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 產生