標籤:

VIM學習筆記 腳本-自定義函數 (Script-User Defined Function)

使用腳本語言,可以更靈活地定製編輯器以完成複雜的任務。

定義函數

Vim編輯器允許用戶自定義函數,語法如下:

function Name(arg1, arg2,...argN) keyword code_to_execute_when_function_is_calledendfunction

view rawFunctionDef.vim hosted with ? by GitHub

Name,函數名稱必須以大寫字母開始,並且只可以包含字母、數字和下劃線。

arg1-argN,調用函數時需要為命名參數(Named Parameters)賦值。如果不需要任何參數,那麼可以將括弧()部分置空。最多可以定義20個參數。

keyword,range關鍵字定義一個範圍函數(:function Count_words() range)會針對範圍內的每一行重複執行操作;abort關鍵字指示函數(:function Do_It() abort)會在第一個錯誤時退出。

下面我們來定義一個函數,用來返回兩個數中較小的一個:

gist.github.com/yyq123/

function Min(num1,num2) if a:num1 < a:num2 let smaller = a:num1 else let smaller = a:num2 endif return smallerendfunction

view rawFunctionSmaller.vim hosted with ? by GitHub

函數內部的變數(例如smaller)均為局部變數,除非使用了g:作為前綴。例如在函數外我們定義了變數var,那麼在函數內部可以使用g:var來調用。前綴a:的變數均為函數參數。

return 語句用於返回結果並結束函數。return語句之後的所有代碼都不會被執行。

如果嘗試定義一個已經存在的函數,那麼將會收到報錯信息。可以使用!來強制重定義同名函數。

:function! Max(num1, num2, num3)

Vim允許在函數中使用「...」來標識個數不定的可變參數(Variadic Parameters)。例如以下代碼定義函數至少有2個參數,最多有20個參數:

function PrintSum(num1, num2,...) let sum = a:num1 + a:num2 let argnum = 1 while argnum <= a:0 let sum += a:{argnum} let argnum+=1 endwhile echo "the sum is " sum return sumendfunction

view rawFunctionPrintSum.vim hosted with ? by GitHub

argnum 計數器,用於記錄num1和num2之後的參數個數;

a:num1 變數,用於訪問指定的參數;

a:0 變數,用於記錄參數總個數;

a:{argnum} 變數,用於訪問每一個參數的值,例如a:1或a:2;

以下範圍函數實例,將在指定範圍行內執行替換操作:

gist.github.com/yyq123/

function DeAmperfyAll() range"Step through each line in the range... for linenum in range(a:firstline, a:lastline) "Replace loose ampersands (as in DeAmperfy())... let curr_line = getline(linenum) let replacement = substitute(curr_line,&(w+;)@!,&amp;,g) call setline(linenum, replacement) endfor "Report what was done... if a:lastline > a:firstline echo "DeAmperfied" (a:lastline - a:firstline + 1) "lines" endifendfunction

view rawDeAmperfyAll.vim hosted with ? by GitHub

當函數被以下命令調用時,變數a:firstlinea:lastline就會被賦值為這個範圍內的第一行和最後一行,然後更新範圍內的每一行。你可以使用:help cmdline-ranges命令,查看關於範圍操作的更多信息。

:1,$call DeAmperfyAll()

調用函數

可以在表達式中調用函數:

:let tiny = Min(10,20)

還可以使用:call命令來調用函數:

:[range]call {function}([parameters])

列示函數

使用以下命令,可以列出所有用戶定義的函數:

:function

使用以下命令,可以查看指定函數的代碼:

:function {name}

使用以下命令,可以查看Vim內置函數的使用說明:

:help functions

刪除函數

使用以下命令,可以刪除指定的函數:

:delfunction {name}

推薦閱讀:

對於非編程的文本編輯,Emacs和Vim各有什麼優勢?
你用vim還是xcode寫iPhone程序代碼?
vim 裡面怎麼清空一行的內容而不刪除一行?
vim如何有效處理制式內容?
Vim C/C++函數名,宏定義和變數的高亮

TAG:Vim | vim腳本 |