學習 vi 編輯器/Vim/VimL 指令碼語言
|
學習 vi 編輯器: 熟悉 — 基本任務 — 簡化工作 — 高階任務 — 細節 — Vi 克隆 (Vim – 基本導航 – 模式 – 技巧和竅門 – 程式設計師必知 – 增強 Vim – Vim 在 Windows 上 – VimL 指令碼語言, Vile, BB vi) — vi 參考 |
Vim 指令碼(也稱為 Vimscript 或 VimL)是一種功能齊全的指令碼語言,這意味著它可以解決幾乎任何文字處理問題。
要設定變數,請使用
let variable = expression
要設定內建設定,您有兩個選擇
set setting = expression " (use the regular command for changing a setting) let &setting = "expression" " (treat the setting as a special kind of variable)
有五種資料型別
一個 32 位有符號整數。
一個以 NULL 結尾的 8 位無符號字元(位元組)字串。字串可以透過 ‘'’ 或 ‘"’ 引號建立。當使用雙引號 ‘"’ 引起來的字串時,文字會被解釋,例如 "\n" 會變成換行符,而用單引號 ‘'’ 引起來的字串則不會被解釋,例如 '\n' 就是一個反斜槓和一個 n。以下兩個字串是相同的
let String_1 = "C:\\WinNT" let String_2 = 'C:\WinNT'
任何其他資料型別都可以使用 string () 函式轉換為字串。
對函式的引用。函式引用可以透過使用 function 函式從字串建立。
let Function_1 = function ("MyFunc")
一個有序的專案序列。
let List_1 = [
\ "a",
\ "b",
\ "c"]
可以使用 split 函式從字串建立列表。
let List_2 = split ("a b c")
一個關聯的無序陣列:每個條目都有一個鍵和一個值。
let Dictionary_1 = {
\ 1: 'one',
\ 2: 'two',
\ 3: 'three'}
VIM 透過將 函式引用 和 字典 結合到一個物件中來支援面向物件程式設計。
let mydict = { \'data': [0, 1, 2, 3]} function mydict.len () dict return len (self.data) endfunction mydict.len
有關更多資訊,請參見 面向物件程式設計
控制結構的存在是 vi 的 ex 命令和 vim 的指令碼語言之間的主要區別。它們使一個簡單的命令集 (vi) 與一個功能齊全的指令碼語言 (vim) 之間有所區別。
if condition operations elseif condition operations else operations endif
while condition operations endwhile
for 迴圈從 vim 7 開始可用。它們遍歷列表或目錄結構。
for var in list operations endfor
try operations catch /pattern/ error handling operations finally clean-up operations endtry
就像大多數 Shell 語言 一樣,所有子程式都儲存在單獨的檔案中,您可以使用 source 或 runtime 命令載入它們。區別在於搜尋路徑的使用。 runtime 使用搜索路徑並允許使用萬用字元來查詢子程式,而 source 需要完整路徑。以下命令執行相同的操作 - 假設“~/vimfiles”是您的執行時搜尋路徑的一部分
runtime setup.vim source ~/vimfiles/setup.vim
對於這兩個命令,都需要新增 .vim 副檔名。由於 runtime 支援搜尋路徑和萬用字元,因此可能存在多個匹配項。如果您希望 runtime 載入所有匹配項 - 而不僅僅是第一個匹配項 - 請使用 runtime!。
function f ( parameter ) operations endfunction
vim 7 中新增了函式的自動載入選項。如果將函式命名為 Filename#Functionname 或 Directory#Filename#Functionname,則該函式將在首次呼叫時自動載入。包含函式的檔案必須放置在“autoload”執行時目錄之一中,並命名為“Filename.vim”或“Directory/Filename.vim”。此選項對於您不始終需要在 面向物件程式設計 中啟用的函式特別有用。
command Command Command
命令通常用作函式和子程式的快捷方式
command C -nargs=* call F ( <f-args> ) command C source ~/vimfiles/s.vim
vim 7 現在允許 面向物件程式設計。但是,為了使其真正實現,您需要組合幾個功能,即 字典、Funcrefs 和新的 函式自動載入。
以下示例類取自 vim 的 gnat 編譯器外掛。實際的函式實現已刪除,因為它們不需要理解該概念。如果您想檢視完整版本,可以從 vim.org 網站 下載該外掛。
我們將新類新增到自動載入指令碼中。這樣,該類僅在需要時可用
if exists ("g:loaded_gnat_autoload") || version < 700 finish else let g:loaded_gnat_autoload=1
我們定義的每個函式都需要使用“dict”屬性定義。除此之外,它們只是正常的指令碼函式。
function gnat#Make () dict ... return endfunction gnat#Make function gnat#Pretty () dict ... return endfunction gnat#Pretty function gnat#Find () dict ... return endfunction gnat#Find function gnat#Tags () dict ... return endfunction gnat#Tags function gnat#Set_Project_File (...) dict ... return endfunction gnat#Set_Project_File function gnat#Get_Command (Command) dict ... return ... endfunction gnat#Get_Command
最重要的步驟是物件的組成。在大多數面嚮物件語言中,這會自動發生 - 但在 vim 中,我們必須自己完成。為了獲得最佳靈活性,建議使用所謂的建構函式。建構函式未用“dict”標記
function gnat#New ()
建構函式建立一個字典,該字典將所有物件函式分配給字典的一個元素
let Retval = { \ 'Make' : function ('gnat#Make'), \ 'Pretty' : function ('gnat#Pretty'), \ 'Find' : function ('gnat#Find'), \ 'Tags' : function ('gnat#Tags'), \ 'Set_Project_File' : function ('gnat#Set_Project_File'), \ 'Get_Command' : function ('gnat#Get_Command'), \ 'Project_File' : '',
我們現在可以可選地將資料條目新增到我們的物件中
\ 'Make_Command' : '"gnat make -P " . self.Project_File . " -F -gnatef "', \ 'Pretty_Command' : '"gnat pretty -P " . self.Project_File . " "', \ 'Find_Program' : '"gnat find -P " . self.Project_File . " -F "', \ 'Tags_Command' : '"gnat xref -P " . self.Project_File . " -v *.AD*"', \ 'Error_Format' : '%f:%l:%c: %trror: %m,' . \ '%f:%l:%c: %tarning: %m,' . \ '%f:%l:%c: (%ttyle) %m'}
如果需要,也可以對物件進行額外的修改。在這個階段,您已經可以使用面向物件的方式
if argc() == 1 && fnamemodify(argv (0), ':e') == 'gpr' call Retval.Set_Project_File(argv(0)) elseif strlen(v:servername) > 0 call Retval.Set_Project_File(v:servername . '.gpr') endif
建構函式的最後一個操作是返回新建立的物件。
return Retval endfunction gnat#New
還可以定義額外的非 dict 函式。這些函式等效於其他面嚮物件語言的“靜態”或“類”方法。
function gnat#Insert_Tags_Header() ... return endfunction gnat#Insert_Tags_Header finish endif
|
學習 vi 編輯器: 熟悉 — 基本任務 — 簡化工作 — 高階任務 — 細節 — Vi 克隆 (Vim – 基本導航 – 模式 – 技巧和竅門 – 程式設計師必知 – 增強 Vim – Vim 在 Windows 上 – VimL 指令碼語言, Vile, BB vi) — vi 參考 |