跳轉至內容

學習 vi 編輯器/Vim/VimL 指令碼語言

來自華夏公益教科書,開放書籍,開放世界

學習 vi 編輯器: 熟悉基本任務簡化工作高階任務細節Vi 克隆 (Vim基本導航模式技巧和竅門程式設計師必知增強 VimVim 在 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 語言 一樣,所有子程式都儲存在單獨的檔案中,您可以使用 sourceruntime 命令載入它們。區別在於搜尋路徑的使用。 runtime 使用搜索路徑並允許使用萬用字元來查詢子程式,而 source 需要完整路徑。以下命令執行相同的操作 - 假設“~/vimfiles”是您的執行時搜尋路徑的一部分

runtime setup.vim
source  ~/vimfiles/setup.vim

對於這兩個命令,都需要新增 .vim 副檔名。由於 runtime 支援搜尋路徑和萬用字元,因此可能存在多個匹配項。如果您希望 runtime 載入所有匹配項 - 而不僅僅是第一個匹配項 - 請使用 runtime!

function f ( parameter )
    operations
endfunction

vim 7 中新增了函式的自動載入選項。如果將函式命名為 Filename#FunctionnameDirectory#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基本導航模式技巧和竅門程式設計師必知增強 VimVim 在 Windows 上VimL 指令碼語言, Vile, BB vi)vi 參考

華夏公益教科書