vim Tab的設定問題
VIM 中處理 TAB 異常的方便。
鍵盤上的 TAB 鍵,與檔案中的 TAB 符號一定要區分開,這是兩個概念。
顯示當前檔案中的 Tab
/\t
實際上,就是查詢 \t 符號。
shiftwidth
用於設定
- 換行時的自動縮排列數
- 行選擇後,使用 < 或者 > 做縮排時,縮排的列數
疑問來了!
shiftwidth 引入的縮排,是 Tab 還是 Space?
從測試來看
- 如果 expandtab 開啟是 Space
- noexpandtab 且 softtabstop 與 tabstop 一致時,是 TAB 符號。
那就是說,如果在 PHP 程式碼檔案中,不對 Tab 做自動轉換,那麼程式碼中的縮排就是 Space 與 Tab 混用的。
PHP 程式碼規範是如何規定縮排的
PSR 是PHP Standard Recommendations 的簡寫。
PSR-2: 即編碼規範 http://www.php-fig.org/psr/psr-2/
Code MUST use 4 spaces for indenting, not tabs.
所以對於 PHP,使用如下配置即可
autocmd FileType php setl shiftwidth=4 tabstop=4softtabstop=4 expandtab
expandtab 設定之後,insert 模式下按下 TAB 鍵就會變成 softtabstop 設定的數個 space。
實踐出真知:tabstop 與 softtabstop 的區別
softtabstop 很好理解,即在 insert 模式下,一個 tab 鍵按下後,展示成幾個空格。 而 tabstop 就不好理解了,需要動手測試一下
autocmd FileType php setl shiftwidth=4 tabstop=4 softtabstop=4 expandtab
這種配置下,自己編輯不會引入 tab, 但是如果是開啟別人的 php 檔案,雖然看上去縮排是一樣的,但是如果用
/\t
檢視,會看到,還是存在 TAB 符號。
再測試一下這個配置
autocmd FileType php setl shiftwidth=4 tabstop=8 softtabstop=4 noexpandtab
- insert 模式下,按 TAB,依然是 4 個 space。
- 但是 insert 模式下連按兩個 TAB 鍵,就變成了一個 TAB 符號。
- 連續按下3個 TAB 鍵,就變成了一個 TAB 符號,加上 4 個空格。
如圖:
此時,關閉 PHP 測試檔案。修改 .vimrc 如下:
autocmd FileType php setl shiftwidth=4 tabstop=16 softtabstop=4 noexpandtab
再次開啟之前的 PHP 測試檔案。會發現 TAB 符號被顯示成了 16 個空格。而其之後的 space 依舊是4個。
這說明了什麼?
說明,tabstop 有兩個作用
- 識別多少個空格形成一個 TAB
- 顯示既有檔案時,將 TAB 顯示成多個個空格
不同語言的規範並不一致
C 語言在 Linux Kernel 中
tabstop=8 softtabstop=8 shiftwidth=8 noexpandtab
從 github 上看原始碼如圖
而 PHP PSR-2 則是推薦 4 空格縮排。
當然 Python 最極端,不是 4 個空格的縮排,直接報錯;並且不允許使用 TAB 作為縮排。
將既有檔案中的 TAB 符號替換為 Space
:set expandtab
:retab
注意,這個操作存在風險,其不但會把縮排使用的 tab 符號替換為 space。非縮排使用的 TAB 符號也會被替換。
轉載自:https://www.sunzhongwei.com/difference-between-vim-tabstop-and-softtabstop-shiftwidth