1. 程式人生 > >vim Tab的設定問題

vim Tab的設定問題

VIM 中處理 TAB 異常的方便。

鍵盤上的 TAB 鍵,與檔案中的 TAB 符號一定要區分開,這是兩個概念。

顯示當前檔案中的 Tab

/\t

 

實際上,就是查詢 \t 符號。

VIM 高亮 TAB

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=4
softtabstop=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 個空格。

如圖:

VIM noexpandtab tabstop=8

此時,關閉 PHP 測試檔案。修改 .vimrc 如下:

autocmd FileType php setl shiftwidth=4 tabstop=16 softtabstop=4 noexpandtab

 

再次開啟之前的 PHP 測試檔案。會發現 TAB 符號被顯示成了 16 個空格。而其之後的 space 依舊是4個。

VIM noexpandtab tabstop=16

這說明了什麼?

說明,tabstop 有兩個作用

  • 識別多少個空格形成一個 TAB
  • 顯示既有檔案時,將 TAB 顯示成多個個空格

不同語言的規範並不一致

C 語言在 Linux Kernel 中

tabstop=8 softtabstop=8 shiftwidth=8 noexpandtab

 

從 github 上看原始碼如圖

C 語言在 Linux Kernel 中8格縮排

而 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

 

 

下面是如何設定vim縮排方法的(轉載):

找到/etc/vimrc檔案(路徑或者在/etc/vim/vimrc)在檔案,用vim將其開啟,在此檔案開頭加上如下 1)設定(軟)製表符寬度為4: set tabstop=4 set softtabstop=4 2)設定縮排的空格數為4 set shiftwidth=4 3)設定自動縮排:即每行的縮排值與上一行相等;使用 noautoindent 取消設定: set autoindent 4)設定使用 C/C++ 語言的自動縮排方式: set cindent 5)設定C/C++語言的具體縮排方式(以我的windows風格為例): set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s 6)如果想在左側顯示文字的行號,可以用以下語句: set nu 在此檔案尾部加入如下資訊: 最後,如果沒有下列語句,就加上吧: if &term=="xterm" set t_Co=8 set t_Sb=^[[4%dm set t_Sf=^[[3%dm endif 還有中文顯示問題, 可以新增: let &termencoding=&encoding set fileencodings=utf-8,gbk,ucs-bom,cp936 上面這兩行命令即可