| 配置 | 輸入 Tab 鍵 | 顯示寬度 | 檔案實際內容 | 適用場景 |
ts=4 sw=4 noet | 插入 \t | 4 | 含 Tab 字元 | Makefile、Go、舊專案 |
ts=4 sw=4 et | 插入 4 空白 | 4 | 純空白 | Python、JavaScript、Java、C++(主流) |
ts=8 sw=4 et | 插入 4 空白 | 8(Tab 顯示 8) | 純空白 | 混合 Tab/空白專案 |
ts=2 sw=2 et | 插入 2 空白 | 2 | 純空白 | HTML、CSS、Vue、React |
三、設定方法
1. 臨時生效(當前 Vim 會話)
:set tabstop=4 shiftwidth=4 expandtab
:set ts=4 sw=4 et
2. 永久生效(個人配置)
# 編輯 ~/.vimrc
vim ~/.vimrc
# 加入以下內容
set tabstop=4
set shiftwidth=4
set expandtab
set softtabstop=4
# 可選:顯示不可見字元
set list
set listchars=tab:▸\ ,trail:·,extends:»,precedes:«


3. 專案級配置
# 專案根目錄建立 .vimrc 或 .editorconfig
# .editorconfig(跨編輯器通用)
root = true
[*]
indent_style = space
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[Makefile]
indent_style = tab
4. 檔案類型自動偵測
# ~/.vimrc
filetype plugin indent on
" Python
autocmd FileType python setlocal ts=4 sw=4 et sts=4
" Go
autocmd FileType go setlocal ts=4 sw=4 noet sts=4
" Web 前端
autocmd FileType html,css,javascript,typescript,vue,jsx,tsx setlocal ts=2 sw=2 et sts=2
" Shell
autocmd FileType sh,bash,zsh setlocal ts=4 sw=4 et sts=4
" C/C++
autocmd FileType c,cpp setlocal ts=4 sw=4 et sts=4 cindent
" YAML
autocmd FileType yaml setlocal ts=2 sw=2 et sts=2
四、進階操作技巧
1. 重新縮排整份檔案
gg=G
# gg: 跳到第一行 | =: 縮排 | G: 到最後一行
2. 視覺模式區塊縮排
V 選取區塊 > 或 < # 增加/減少一級縮排
:> 或 :< # 命令列模式
3. Tab 與空白互轉
:retab! # 依目前 ts/et 設定轉換所有 Tab/空白
:set et | :retab # Tab → 空白
:set noet | :retab! # 空白 → Tab(盡可能)
4. 檢測檔案縮排風格
:set list
# Tab 顯示為 ▸ 或 ^I,空白顯示為 ·
五、常見問題排查
| 現象 | 原因 | 解決 |
| Tab 顯示 8 格但設定 ts=4 | 未設定 expandtab,實際含 Tab 字元 | :set et | :retab |
| 複製貼上縮排亂掉 | 自動縮排衝突 | :set paste 貼上後 :set nopaste |
| Python 混合 Tab/空白報錯 | 檔案含真實 Tab 字元 | :set list 確認 → :set et | :retab |
| Makefile 需要真實 Tab | 語法要求 Tab 字元 | :set noet 或專案配置覆蓋 |
六、一鍵套用主流風格
# Google / Python / Java / C++ 風格
set ts=4 sw=4 et sts=4
# Web 前端 / Node.js 風格
set ts=2 sw=2 et sts=2
# Go / Makefile 風格
set ts=4 sw=4 noet sts=4
精確配置 Tab 行為,能避免「混合縮排」導致的語法錯誤、程式碼審查爭議、跨編輯器顯示不一致等問題,是專業開發環境的基礎建設之一。