Vim 快捷指令與常用設定

模式切換

按鍵 說明
i 在游標前插入
I 在行首插入
a 在游標後插入
A 在行尾插入
o 在下方新增一行並插入
O 在上方新增一行並插入
Esc 回到 Normal 模式
v 進入 Visual 模式(字元選取)
V 進入 Visual Line 模式(整行選取)
Ctrl + v 進入 Visual Block 模式(區塊選取)
: 進入 Command 模式
R 進入取代模式(持續覆蓋)

移動(Normal 模式)

基本移動

按鍵 說明
h / j / k / l 左 / 下 / 上 / 右
w 跳到下一個字的開頭
b 跳到上一個字的開頭
e 跳到目前字的結尾
W / B / E 同上,但以空白為分隔(忽略標點)

行內移動

按鍵 說明
0 跳到行首
^ 跳到行首第一個非空白字元
$ 跳到行尾
f{char} 跳到本行下一個 {char}
F{char} 跳到本行上一個 {char}
t{char} 跳到 {char} 前一格
; / , 重複 / 反向重複上次 f/F/t/T

跨行移動

按鍵 說明
gg 跳到檔案開頭
G 跳到檔案結尾
{n}G:{n} 跳到第 n 行
Ctrl + d 向下半頁
Ctrl + u 向上半頁
Ctrl + f 向下一整頁
Ctrl + b 向上一整頁
{ / } 跳到上一個 / 下一個空行(段落)
% 跳到對應的括號 () {} []
H / M / L 跳到畫面 頂部 / 中間 / 底部

編輯(Normal 模式)

刪除

按鍵 說明
x 刪除游標下的字元
dd 刪除整行
D 刪除到行尾
dw 刪除到下一個字開頭
d$ 刪除到行尾(同 D
d0 刪除到行首
dgg 刪除到檔案開頭
dG 刪除到檔案結尾

修改(刪除並進入 Insert)

按鍵 說明
cc 修改整行
C 修改到行尾
cw 修改到字尾
ci" 修改雙引號內的內容
ci( 修改括號內的內容
ci{ 修改大括號內的內容
s 刪除一個字元並進入 Insert

複製與貼上

按鍵 說明
yy 複製整行
yw 複製一個字
y$ 複製到行尾
p 貼在游標後
P 貼在游標前
"0p 貼上最近一次 yank(不受 delete 影響)
"+y 複製到系統剪貼簿
"+p 從系統剪貼簿貼上

其他編輯

按鍵 說明
u 復原 (undo)
Ctrl + r 重做 (redo)
. 重複上一次操作
>> / << 增加 / 減少縮排
J 將下一行接到本行結尾
~ 切換大小寫
r{char} 取代游標下的字元為 {char}

文字物件(Text Objects)

搭配 d(刪除)、c(修改)、y(複製)、v(選取)使用:

按鍵 說明
iw / aw 內部字 / 含周圍空白的字
i" / a" 雙引號內 / 含引號
i' / a' 單引號內 / 含引號
i( / a( 小括號內 / 含括號
i{ / a{ 大括號內 / 含括號
i[ / a[ 中括號內 / 含括號
it / at HTML tag 內 / 含 tag
ip / ap 段落內 / 含周圍空行

範例:ci" = 修改引號內容、dap = 刪除整個段落、yi{ = 複製大括號內容


搜尋與取代

按鍵/指令 說明
/keyword 向下搜尋
?keyword 向上搜尋
n / N 下一個 / 上一個搜尋結果
* 搜尋游標下的字(向下)
# 搜尋游標下的字(向上)
:%s/old/new/g 全檔取代
:%s/old/new/gc 全檔取代(逐一確認)
:s/old/new/g 只取代目前行
:10,20s/old/new/g 取代第 10~20 行

多檔案與分割視窗

指令 說明
:e filename 開啟檔案
:w 存檔
:q 離開
:wqZZ 存檔並離開
:q! 強制離開不存檔
:sp filename 水平分割開啟檔案
:vsp filename 垂直分割開啟檔案
Ctrl+w h/j/k/l 切換分割視窗
Ctrl+w = 平均分配視窗大小
Ctrl+w _ 最大化目前視窗(水平)
Ctrl+w \| 最大化目前視窗(垂直)
:tabnew filename 開新分頁
gt / gT 下一個 / 上一個分頁
:bn / :bp 下一個 / 上一個 buffer
:ls 列出所有 buffer

標記(Marks)

按鍵 說明
ma 在目前位置設標記 a
'a 跳到標記 a 所在行
`a 跳到標記 a 的精確位置
'' 跳回上次跳轉前的位置
:marks 列出所有標記

巨集(Macros)

按鍵 說明
qa 開始錄製巨集到暫存器 a
q 停止錄製
@a 執行巨集 a
@@ 重複執行上一次巨集
10@a 執行巨集 a 10 次

常用 .vimrc 設定

" === 基本設定 ===
set nocompatible          " 不相容 vi 模式
set encoding=utf-8        " 編碼
set fileencoding=utf-8

" === 顯示 ===
set number                " 顯示行號
set relativenumber        " 相對行號(方便跳行)
set cursorline            " 高亮目前行
set showmatch             " 顯示配對括號
set laststatus=2          " 總是顯示狀態列
set scrolloff=5           " 游標距離頂/底至少 5set wrap                  " 自動折行
syntax on                 " 語法高亮

" === 縮排 ===
set tabstop=4             " Tab 顯示寬度
set shiftwidth=4          " 自動縮排寬度
set expandtab             " Tab 轉空格
set autoindent            " 自動縮排
set smartindent           " 智慧縮排

" === 搜尋 ===
set hlsearch              " 高亮搜尋結果
set incsearch             " 即時搜尋
set ignorecase            " 忽略大小寫
set smartcase             " 有大寫時區分大小寫

" === 操作體驗 ===
set mouse=a               " 啟用滑鼠
set clipboard=unnamedplus " 與系統剪貼簿共用
set wildmenu              " 指令補全選單
set history=1000          " 指令歷史數量
set undofile              " 持久化 undo(關檔再開還能 undoset undodir=~/.vim/undodir

" === 按鍵映射 ===
let mapleader = " "       " Leader 鍵設為空白鍵

" 快速存檔
nnoremap <leader>w :w<CR>

" 快速離開
nnoremap <leader>q :q<CR>

" 清除搜尋高亮
nnoremap <leader>h :nohlsearch<CR>

" 分割視窗快速切換
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l

" Visual 模式下移動整段
vnoremap J :m '>+1<CR>gv=gv
vnoremap K :m '<-2<CR>gv=gv

" 保持搜尋結果在畫面中間
nnoremap n nzzzv
nnoremap N Nzzzv

設定檔位置

  • ~/.vimrc — 全域設定
  • 套用設定:重新開 vim,或在 vim 內執行 :source ~/.vimrc

建議的 undodir 初始化

mkdir -p ~/.vim/undodir

Search

    Table of Contents