在 vim 中,tab 字符默認的顯示寬度是 8 個空格。在終端打開 vim,多按幾回 Tab 鍵,很容易就超出終端的顯示寬度。爲了良好的編碼體驗,須要調整 tab 字符的顯示寬度。若是不想插入 tab 字符,還須要把 tab 字符替換成空格。vim
能夠經過配置 tabstop 選項、softtabstop 選項、expandtab 選項來修改 tab 字符的顯示和按 Tab 鍵的行爲:app
在 vim 中,使用 :help tabstop
命令查看 tabstop 選項的說明以下:測試
'tabstop' 'ts' number (default 8)
Number of spaces that a <Tab> in the file counts for.
Note: Setting 'tabstop' to any other value than 8 can make your file appear wrong in many places (e.g., when printing it).
即,tabstop 選項設置 tab 字符的顯示寬度爲多少個空格,默認值是 8。可使用下面命令修改這個選項值爲 4:this
:set tabstop=4
tabstop 選項能夠簡寫爲 ts,:set tabstop=4
命令和 :set ts=4
命令是等效的。編碼
上面說明提到,若是設置 tabstop 選項爲 8 以外的值,可能會使文件在許多地方(例如,在打印時)顯示錯誤。spa
例如,設置 tabstop 選項值爲 4,在 vim 中使用 tab 字符進行列對齊,看起來排版正常,保存文件。可是在其餘顯示 tab 字符爲 8 個空格的軟件上查看這個文件,本來對齊的列可能就會錯亂,沒對齊。code
在 vim 幫助文檔的各個小節中,如 :help usr_30
的 Tabs and spaces 小節、:help usr_25
的 Indents and tabs 小節,都屢次建議要保持 tabstop 選項值爲 8 不變。orm
在 :help tabstop
命令的說明中,只有設置了 expandtab 選項,把 tab 字符替換爲空格的狀況下,才建議修改 tabstop 選項爲其餘值。此時,在 vim 的插入模式下,按下 Tab 鍵,插入的是空格,而不是 tab 字符,保存文件後,用其餘軟件打開這個文件,看不到 tab 字符,天然不會由於 tab 字符的顯示寬度不一樣而致使排版異常。文檔
注意:tabstop 選項只修改 tab 字符在 vim 中的顯示寬度,不修改插入模式下按 Tab 鍵,vim 插入的是 tab 字符,仍是插入特定數目的空格。it
在 vim 中,使用 :help softtabstop
命令查看 softtabstop 選項的說明以下:
'softtabstop' 'sts' number (default 0)
Number of spaces that a <Tab> counts for while performing editing operations, like inserting a <Tab> or using <BS>. It "feels" like <Tab>s are being inserted, while in fact a mix of spaces and <Tab>s is used.
When 'sts' is zero, this feature is off.
When 'sts' is negative, the value of 'shiftwidth' is used.
即,softtabstop 選項(能夠簡寫爲 sts)會影響 vim 在插入模式下按 Tab 鍵所實際獲得的字符,多是插入特定數目的空格,也多是插入一個 tab 字符。
具體使用時,會受到 tabstop 選項和 expandtab 選項的影響。可使用下面命令修改這個選項值爲 4:
:set softtabstop=4
設置以後,在 tabstop 選項值爲 8,且沒有設置 expandtab 選項的狀況下,第一次按 Tab 鍵,vim 會插入 4 個空格,而不是插入一個 tab 字符。
以後,第二次按 Tab 鍵,vim 會刪除前面的 4 個空格,而後插入一個 tab 字符。因爲 tabstop 選項值是 8,界面上會看到光標繼續往前移動了 4 個空白字符,像是又插入了 4 個空格,但實際上兩次按 Tab 鍵,只插入一個 tab 字符。
從寫入文件的字符和字節數來講,第一個按 Tab 鍵,寫入 4 個空格,也就是四個字節,第二次按 Tab 鍵,會刪掉以前寫入的 4 個空格,再寫入一個 tab 字符,只有一個字節,寫入文件的字節數變少了。
雖然從界面上看,顯示了 8 個空白字符,但這只是一個 tab 字符的顯示寬度。能夠執行下面命令讓空格和 tab 字符可見,再進行測試,就能清楚地看到這一點:
:set list :set listchars=tab:>~,space=.
另外,softtabstop 選項也會影響 Backspace 鍵刪除連續多個空格和刪除 tab 字符的行爲。
在上面的場景中,第一次按 Tab 鍵,vim 會插入 4 個空格,此時能夠用 Backspace 鍵一次性刪除這 4 個空格。即,只按一次 Backspace 鍵,就能刪除這 4 個空格。
當按下兩次 Tab 鍵,插入一個 tab 字符後,按下 Backspace 鍵,實際上是把這個 tab 字符替換成 4 個空格。
從界面上看,光標往前移動了 4 個空白字符,可是文件的字節數實際上變多了。
比較特別的是,在插入模式下,手動輸入 4 個空格,此時按 Backspace 鍵只能刪除一個空格。可是手動輸入 4 個空格後,退出插入模式,再進入插入模式,就能用 Backspace 鍵一次性刪除這 4 個空格。
當 tabstop 選項值是 4,softtabstop 選項值是 4,且沒有設置 expandtab 選項時,每次按 Tab 鍵,都是插入一個 tab 字符,不會再插入任何空格。
如前面說明,vim 建議不要進行這樣的設置,避免用 Tab 鍵插入 tab 字符進行對齊縮進時,在其餘軟件上查看文件可能會出現排版異常。
當 softtabstop 選項值小於 0 時,其真實值會被設置成 shiftwidth 選項的值。這個特性有助於保持和自動縮進的排版一致。後面會具體說明。
注意:softtabstop 選項影響 vim 在插入模式下按 Tab 鍵所實際獲得的字符,不改變 vim 中 tab 字符的顯示寬度,tab 字符始終顯示爲 tabstop 指定的寬度。
當 softtabstop 選項值小於 tabstop 選項值時,第一次按 Tab 鍵,會插入 softtabstop 選項值對應的多個空格,當插入的空格個數到達 tabstop 指定的寬度時,會刪除插入的空格,替換成一個 tab 字符。
在 vim 中,使用 :help expandtab
命令查看 expandtab 選項的說明以下:
'expandtab' 'et' boolean (default off)
In Insert mode: Use the appropriate number of spaces to insert a <Tab>.
To insert a real tab when 'expandtab' is on, use CTRL-V<Tab>.
即,設置 expandtab 選項後,在插入模式下,會把按 Tab 鍵所插入的 tab 字符替換爲合適數目的空格。若是確實要插入 tab 字符,須要按 CTRL-V 鍵,再按 Tab 鍵。
可使用下面命令來開啓這個選項:
:set expandtab
設置以後,會把一個 tab 字符替換成 tabstop 選項值對應的多個空格。例如,tabstop 選項值爲 8,那麼插入一個 tab 字符,會被替換成 8 個空格。
須要注意的是,對於 softtabstop 選項值爲 4,tabstop 選項值爲 8,且沒有設置 expandtab 選項的場景來講,第一次按 Tab 鍵,插入的是 4 個空格,並無插入 tab 字符,沒有發生替換 tab 字符爲空格的狀況,並非說設置 softtabstop 選項值爲 4,expandtab 選項會基於 softtabstop 選項值來把 tab 字符替換成 4 個空格。
當按兩次 Tab 鍵,插入一個 tab 字符後,expandtab 選項仍是基於 tabstop 選項值把 tab 字符替換成 8 個空格。
注意:設置 expandtab 選項只能把新插入的 tab 字符替換成特定數目的空格,不影響文件中已有的 tab 字符。即,文件已有的 tab 字符會保持不變。
基於前面的說明,若是要把插入的 tab 字符自動替換成空格,能夠在 ~/.vimrc
文件中添加下面的配置:
" 自動縮進時,縮進長度爲4 set shiftwidth=4 " 輸入Tab字符時,自動替換成空格 set expandtab " softtabstop的值爲負數,會使用shiftwidth的值,二者保持一致,方便統一縮進. set softtabstop=-1
這裏沒有配置 tabstop 選項值,保持這個值爲默認的 8 不變。配置了 expandtab 選項,按 Tab 鍵所插入的 tab 字符會被替換成 8 個空格。
上面配置 shiftwidth 選項值爲 4,該選項設置自動縮進的空格個數。同時配置 softtabstop 選項值爲 -1,那麼該選項值會等於 shiftwidth 選項值,也是 4。
第一次按 Tab 鍵,會插入 4 個空格,和自動縮進的空格個數保持一致,方便統一縮進,不會出現自動縮進插入 8 個空格,而手動按 Tab 鍵只插入 4 個空格,縮進沒有對齊的狀況。
即,爲了保持對齊縮進一致,手動按 Tab 鍵所插入的空格個數要跟自動縮進的空格個數相同,也就是 softtabstop 選項值要跟 shiftwidth 選項值相等。
設置 softtabstop 選項值爲負數就能夠知足這個需求,後續若是要調整縮進的空格個數,只修改 shiftwidth 選項值便可。
按照 :help tabstop
命令的說明,設置 expandtab 選項後,能夠修改 tabstop 選項值爲 4,那麼按 Tab 鍵插入 tab 字符後,也能夠被替換成 4 個空格。
這裏沒有采用這個方案,而是選擇配置 softtabstop 選項值,目的在於配置 softtabstop 選項值後,能夠用 Backspace 鍵一次性刪除 4 個空格,比較方便。並且配置 softtabstop 選項值爲負數,能夠自動保持跟 shiftwidth 選項值一致,便於修改。
能夠查看 :help usr_30
的 Tabs and spaces 小節 和 :help usr_25
的 Indents and tabs 小節來獲取更多的幫助信息。