Vim 自己寫語法高亮腳本
分類
說明
這是一篇分享如何快速上手寫自己的語法高亮腳本,俗語說『萬事起頭難』,知道怎麼寫就成功一半,本篇將帶大家實作出簡單的語法高亮功能。
自訂副檔名
本篇將使用 .enjoy 副檔名做為範例,所以我會有一個 hello.enjoy 檔案如下
hello.enjoy
Hello Enjoy.
enjoy everyday.
建立語法腳本
我們需要建立一個專門給 .enjoy 用的語法腳本,當 Vim 打開 .enjoy 時就會自動執行該腳本。以此範例,我們需要建立 enjoy.vim 並將腳本存放在 $HOME/.vim/syntax 目錄。
$HOME/.vim/syntax/enjoy.vim
syntax case ignore
syntax keyword Identifier enjoy
註: $HOME/.vim/syntax/enjoy.vim 的 $HOME 是家目錄的變數,.vim 是 Unix 系統的 vim 設定專案的目錄,syntax 是處理語法的目錄。
建立偵測檔案類型腳本
vim 會檢查 runtimepath 的 ftdetect 目錄,你可以在 ftdetect 目錄寫一些定義檔案類型的腳本,關於 runtimepath 你可以參考底下相關文章。
vim 不知道 .enjoy 副檔名的檔案類型為 enjoy,所以必須寫腳本讓它自動將 *.enjoy 設定檔案類型為 enjoy。
在 $HOME/.vim/ftdetect 目錄建立 enjoy.vim。
$HOME/.vim/ftdetect/enjoy.vim
au BufRead,BufNewFile *.enjoy set filetype=enjoy
打開 .enjoy 檔

可以看出 enjoy 不區分大小寫,都變成關鍵字變數名,呈現藍色。
後面的內容,我將簡單介紹語法要如何使用。
設定語法
定義大小寫敏感
查看文件 :syn-case
:sy[ntax] case [match | ignore]
要求其後的 :syntax 命令在本設定為 match 時必須匹配大小寫,本設定為 ignore 時則可以忽略大小寫。請注意,它不影響先前的項目,而只影響其後直到下一個 :syntax case 命令為止的所有項目。
:sy[ntax] case
顯示 “syntax case match” 或 “syntax case ignore” 之一。
定義關鍵字
:sy[ntax] keyword {group-name} [{options}] {keyword} .. [{options}]
查看文件 :syn-keyword
定義一系列關鍵字。
{group-name} 是語法組名,例如 “Comment”,參考 語法群組名。
[{options}] 參考 語法參數。
{keyword} .. 是關鍵字列表,這些關鍵字成為該群組的成員。
{options} 可以在該行的任何位置給出。它們應用於所有的關鍵字,包括選項之前的關鍵字。以下例子完全相同:
:syntax keyword Type contained int long char
:syntax keyword Type int long contained char
:syntax keyword Type int long char contained
其中 contained 是 {options}。
範例
:syntax keyword Type int long char
Type是group-name。int long char是{keyword} ..。
語法群組名
查看文件 :group-name
以下是部分建議的群組名:
| Type | ? | 描述 |
|---|---|---|
| *Comment | v | 任何註解 |
| Type | ? | 描述 |
|---|---|---|
| *Identifier | v | 任何變數名 |
| Function | v | 函數名 (也包括: 類別的方法名) |
詳細的建議的群組名請參考文件 :group-name。
* 標記的名字是主群組,其它是子群組。對主群組而言,syntax.vim 文件包含預設的高亮設定。 子群組則連結到主群組。
v 看不懂是什麼意思,照著官方文件寫上去的。
語法參數
查看說明 :syn-arguments
定義語法項目的 :syntax 命令接受多個參數。
contained
查看說明 :syn-contained
如果給予 contained 參數,本項目在頂層不會被辨識。只有包含在另外一個項目才可以,而且那個項目必須給予 contains 參數且其中包含本項目。
範例
:syntax keyword Todo TODO contained
:syntax match Comment "//.*" contains=Todo
結論
透過本篇簡單地示範 .enjoy 語法高亮後,若有興趣想了解更多,建議可以參考 vim 的文件說明。
相關文章:
一杯咖啡的力量,勝過千言萬語的感謝。
支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!