iT邦幫忙

DAY 11
0

EMACS 新思維系列 第 11

[EMACS新思維 第十四天] Elisp 入門(四): defun,函數的定義

本基本介紹翻譯自 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")


上一篇
[EMACS新思維 第十三天] Elisp 入門(三): elisp 語法入門 (二)
下一篇
[EMACS新思維 第十五天] Elisp 入門(五): add-hook 與 set-key
系列文
EMACS 新思維27

尚未有邦友留言

立即登入留言