1. 程式人生 > >vim製表符空格替換配置及注意事項

vim製表符空格替換配置及注意事項

在.vimrc中新增以下程式碼後,重啟vim即可實現按TAB產生4個空格:
set ts=4  (注:ts是tabstop的縮寫,設TAB寬4個空格)
set expandtab

對於已儲存的檔案,可以使用下面的方法進行空格和TAB的替換:
TAB替換為空格:
:set ts=4
:set expandtab
:%retab!

空格替換為TAB:
:set ts=4
:set noexpandtab
:%retab!

加!是用於處理非空白字元之後的TAB,即所有的TAB,若不加!,則只處理行首的TAB。

---------------------------------------------------------------------------------------------------------

一個程式設計師的心路歷程

2010-09-07

一個關於Vim擴充套件TAB鍵的問題 - [技術前沿]

Tag:技術前沿 VIM

今天遇到一個奇怪的問題:明明我在.vimrc中開啟了expandtab選項,但是當我編輯Makefile檔案時,敲入的TAB就是無法被VIM自動轉換為四個空格(已經設定tabstop=4,shiftwidth=4),通過":set expandtab?"檢視該選項值也居然是"noexpandtab";編輯其他檔案(如.c、.h檔案甚至是無副檔名的檔案)時expandtab卻都是開啟的,TAB也可被自動轉換,百思不得其解!

最初懷疑是compatible的設定對expandtab產生了影響。開啟我的.vimrc,發現我設定的是“set nocompatible”,“compatible”已經被關掉,不會對expandtab產生影響。又想了想,假設受影響,那麼所有檔案都應該受到影響才對,不應該只有Makefile這類檔案受影響。

想到這裡,突然開了竅!是不是我開啟的檔案型別檢測導致的呢?我在.vimrc設定了"filetype plugin on"。又看了一下這個設定的相關Manual,雖然沒有直接給出答案,但是順藤摸瓜,我也找到了原因。

因為開啟了檔案型別檢測,Vim在開啟或新建一個檔案時會自動判斷檔案的副檔名以確定檔案型別,在$VIMRUNTIME/filetype.vim中搜索"Makefile",可看到如下指令碼語句:
" Makefile
au BufNewFile,BufRead *[mM]akefile,*.mk,*.mak,*.dsp setf make

Vim將Makefile劃歸為"make"型別(setf make)。在$VIMRUNTIME/ftplugin下有一堆xxx.vim檔案,我們從中可以找到make.vim,這個檔案就是VIM針對make型別檔案的設定,在開啟或新建make型別檔案時被VIM自動載入。

這個make.vim檔案中有一行設定如下:
" Make sure a hard TAB is used, required for most make programs
setlocal noexpandtab softtabstop=0

見文知義!果不其然,就是這個問題。又試驗了一下,將.vimrc中的“filetype plugin on”註釋掉,再開啟Makefile檔案,TAB就可以被自動轉換為四個空格了。

回頭一想,VIM針對make型別檔案設定了noexpandtab也不無道理,編寫過Makefile的朋友都知道,Makefile的基本組成結構就是:
target ... : prerequisites ...
    command
    ...
    ...
其中Makefile語法要求command前面必須放置一個TAB!否則解析失敗!

這回真相大白了^_^