簡體   English   中英

如何將參數傳遞給Elisp函數?

[英]How to pass arguments to Elisp function?

我有這個鍵盤映射來刷新像這樣的空行:

(global-set-key (kbd "M-T") (lambda () (interactive) (flush-lines "^[[:space:]]*$")))

但這在某個地區不起作用。 區域之外無關的行將被合並。 但是,當我選擇一個區域並手動嘗試使用Mx刷新線RET ^ [[:space:]] * $ RET時,它可以按預期工作。 我究竟做錯了什么 ?

可以交互式或非交互式地調用一個函數(實際上稍微復雜一點,但這足夠好了)。 交互式調用模式用於綁定當前環境中的某些函數自變量或與用戶進行交互。 當您使用Emacs Lisp編寫時,非交互模式是正常的調用模式。

通常,交互式行為是在文檔字符串之后使用(interactive ...)形式聲明的,但是在flush-lines的特定情況下,該行為部分由interactive規范自動實現,並且部分由硬編碼(對於區域部分)組成。 您可以通過調用call called-interactively-p來詢問Emacs當前代碼是否以交互方式執行,但是正如文檔所說,鼓勵使用另一個可選參數來指示調用是否是交互式的。

函數簽名為:

(flush-lines REGEXP &optional RSTART REND INTERACTIVE)

RSTARTREND是當前區域的開始和結束位置,以整數表示。 他們也可以是nil 最后一個參數指示呼叫是否是交互式的。

當您從匿名函數調用flush-lines ,您是在非交互方式下調用它,這意味着您需要將參數顯式傳遞給函數。

對於此功能,您可以簡單地按如下方式調用它:

(flush-lines "^[[:space:]]*$" nil nil t)

這使得該函數的行為就像是被交互調用一樣,在這種情況下,由於start和end參數為nil,因此會自動計算區域。

在一般情況下,您要做的是擁有自己的(interactive "r")聲明,並向匿名函數添加兩個參數。 例如,在*scratch*緩沖區中,您可以對以下表達式求值:

(call-interactively
  (lambda (beg end)
    (interactive "r")
    (list beg end)))

然后,結果是代表您所在地區的光標位置列表。 例如,在您的情況下,您將調用(flush-lines "^[[:space:]]*$" beg end)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM