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)會在第一個錯誤時退出。
下面我們來定義一個函數,用來返回兩個數中較小的一個:
https://gist.github.com/yyq123/4c18997ffac9a857d6d0f0b452923df4/raw/af83a90aee964b976e56da7e4b94d5ed21198065/FunctionSmaller.vim
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;
以下範圍函數實例,將在指定範圍行內執行替換操作:
https://gist.github.com/yyq123/e1abcf60f06f92a74995b4c481530f27/raw/69095eade65c61226fd256f54ab123279d3347ce/DeAmperfyAll.vimfunction 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+;)@!,&,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:firstline和a: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++函數名,宏定義和變數的高亮