聊聊剛開始讓人想翻桌的 Vim encoding 設定「們」

原理

最近在玩 vim,發現光是 encoding 設定就有很多種。就自己的理解整理如下圖:

vim_encodingVim 內部有自己的編碼方式,透過 encoding 這個設定來表示,通常是 utf-8,也最好是 utf-8。

當 Vim 要將文字輸出到 terminal 時,就會轉換成 terminal 的編碼,而代表 terminal 的編碼就是 termencoding。(不過這個設定在 Vim 7.4.852 已經被移除了。)

Vim 在處理檔案的時候,讀一個檔案,會嘗試自動識別該檔案的編碼,如果識別成功,就會標記該檔案的 fileencoding 為該編碼。之後寫入檔案時,也會將自動從內部 encoding 的編碼方式,轉換成 fileencoding 的編碼方式來存放資料。如果 fileencoding 沒有被設定,像是新檔案,那就會採用 encoding 的設定。

那 Vim 是怎麼做到自動識別編碼的呢?就是利用 fileencoding「s」啦!Vim 可以在讀檔的時候,利用 fileencodings 這個編碼列表,依照順序拿編碼一個一個試試看,如果檔案沒有報編碼錯誤,就是自動採用該編碼。一旦自動識別成功,就會設定檔案的 fileencoding 為該編碼。要特別注意的是,「沒有報編碼錯誤」不代表就一定是正確的編碼,像是 latin-1 這種編碼寬鬆的,就不會報錯,所以通常放在最後面。

 

語法

查詢設定

:set <option>?

ex:

:set encoding?

:set fileencoding?

:set fileencodings?

 

設定

:set <option>=<value>

ex:

:set encoding=utf-8