Vim 預設使用 Tab 字元(\t)縮排,且預設寬度為 8 空格。PHP 社群標準(PSR-12)要求縮排使用 4 空格,不使用 Tab。若直接修改檔案將 Tab 改為空格,下一行自動縮排仍會插入 Tab,導致「空格與 Tab 混用」,造成程式碼在不同編輯器顯示錯亂。
| 設定指令 | 縮寫 | 說明 | 建議值 |
|---|---|---|---|
autoindent | ai | 新行自動沿用當前行縮排 | set autoindent |
cindent | ci | 類 C 語言智慧縮排(支援 PHP 大括號風格) | set cindent |
smartindent | si | 基於 autoindent 的改進(較 cindent 簡易) | set smartindent(可選) |
tabstop | ts | Tab 字元顯示寬度(空格數) | set tabstop=4 |
shiftwidth | sw | 每層縮排的空格數(>>、<<、自動縮排) | set shiftwidth=4 |
expandtab | et | **關鍵**:將輸入的 Tab 自動展開為空格 | set expandtab |
softtabstop | sts | 編輯時按 Tab/Backspace 的「邏輯寬度」(配合 et 使用) | set softtabstop=4 |
smarttab | sta | 行首按 Tab 插入 shiftwidth 空格,非行首插入 tabstop 空格 | set smarttab |
" PHP 專用縮排設定(放在 .vimrc 或 ~/.vim/ftplugin/php.vim)
setlocal tabstop=4
setlocal shiftwidth=4
setlocal softtabstop=4
setlocal expandtab
setlocal smarttab
setlocal autoindent
setlocal cindent
" 可選:針對 PHP 語法優化的縮排規則
setlocal indentkeys=0{,0},:,0#,!^F,o,O,e
" 顯示不可見字元,方便除錯混用問題
set list
set listchars=tab:▸\ ,trail:·,extends:>,precedes:<
建立 ~/.vim/ftplugin/php.vim,上述設定將僅對 PHP 檔案生效,不影響 Python、Go 等其他語言。
:set expandtab
:retab
:w
:retab 會依目前 tabstop 將現有 Tab 轉換為空格。
:set list
" Tab 顯示為 ▸ ,空格顯示為 · ,一目了然
" 儲存時自動執行 phpcbf 修正縮排(需安裝 phpcbf)
autocmd BufWritePre *.php silent! !phpcbf --standard=PSR12 %
filetype plugin indent on 已在 .vimrc 中啟用。:set paste,貼上後 :set nopaste;或使用 "+p 從系統剪貼簿貼上。.editorconfig,Vim 安裝 editorconfig-vim 外掛即可自動套用專案設定。核心三招:set expandtab(Tab 轉空格)、set shiftwidth=4(縮排寬度)、set tabstop=4(Tab 顯示寬度)。搭配 ftplugin 隔離語言設定、editorconfig 跨編輯器一致性,即可享受乾淨、標準、無混用困擾的 PHP 開發體驗。