本基本介紹翻譯自 Emacs 高手 Xah Lee 的介紹文章,予以中文化!
函數
其基本結構如下:(defun ‹function name› (‹param1› ‹param2› …) "‹doc string›" ‹body›)
(defun myFunction () "testing" (message "Yay!") )
與 Perl 類似,函數並不需要一個 return。最後一個句子的值將被返回。在一個 elisp 檔案中寫的函數,並不能透過 M-x 直接呼叫。它必須先向 emacs 定義(註冊)
參考:
Emacs Lisp Functions Optional Parameters
Emacs Function's Inline Doc String Markups.
定義命令
若要讓一個命令可以被交互的使用,在命令的註解列(doc string)後添加 (interactive)。
底下是個例子。求值(執行)後,可以透過 M-x yay 執行它。
(defun yay ()
"Insert “Yay!” at cursor position."
(interactive)
(insert "Yay!"))
底下則是一個需要一個引數的函數,其引數來源是 C-u。透過類似 C-u 7 M-x myFunction 這樣的呼叫調用。
(defun myFunction (myArg)
"Prints the argument"
(interactive "p")
(message "Your argument is: %d" myArg)
)
底下的函數以一個區域作爲引數。注意 (interactive "r"),"r" 會知會 emacs 這個函數將以一段 buffer/region 作爲輸入
(defun myFunction (myStart myEnd)
"Prints region start and end positions"
(interactive "r")
(message "Region begin at: %d, end at: %d" myStart myEnd)
)
關於 (interactive)
(interactive ...) 使函數可以被交互式的使用。透過定義它,來控制引數來源。擁有 (interactive) 的函數才能被 M-x 呼叫
(interactive) 擁有自己的參數,意義如下所列。有 30 多種,但最常用的是下面那些:
1. (interactive), 無引數函數
2. (interactive "n"), 引數是數字。 ("n" 可至於提示字串開頭,如 (interactive "nWhat is your age?"))
3. (interactive "s"), 引數是文字
4. (interactive "r"), 引數是一段文字,來自 buffer/region。實際上傳入的是這段 buffer/region 的 begin / end
(defun myCommand ()
"One sentence summary of what this command do.
More detailed documentation here."
(interactive)
(let (localVar1 localVar2 …)
; do something here …
; …
; last expression is returned
)
)
對了,推薦下,我寫的 yf-stardict 可以作爲一個關於 (interactive) 很好的例子,不妨參考看看。
詳情可見:
(info "(elisp) Defining Functions")
(info "(elisp) Defining Commands")