[英]Invalid function in Emacs Lisp
我正在Emacs Lisp中創建一個函數,如果沒有活動區域,它將大聲讀取整個緩沖區。 否則,它將讀取活動區域。
(defun speak-my-text () "Speaks text in buffer."
(interactive)
(if (equal mark-active t)
(
(kill-ring-save (point-min) (point-max))
(start-process-shell-command "speakbuffvar" nil
"bash -c \"killall espeak;xsel --clipboard|espeak -s 290\"")
)
(
(kill-ring-save (region-beginning) (region-end))
(start-process-shell-command "speakbuffvar" nil
"bash -c \"killall espeak;xsel --clipboard|espeak -s 290\"")
)))
(global-set-key (kbd "C-z") 'speak-my-text)
我在else子句的第一行遇到問題:
(kill-ring-save (region-beginning) (region-end))
當我定義函數,綁定它並運行時,我得到“無效函數”,它指向該行。 我正在運行Linux Mint。
使用Ch f progn
順序評估多個表達式。
您當前正在嘗試調用一個名為(kill-ring-save (region-beginning) (region-end))
的函數,並將參數傳遞給它(start-process-shell-command ...)
自然,Emacs告訴您(kill-ring-save (region-beginning) (region-end))
不是函數的名稱。
除了phils的答案:
在這種情況下, mark-active
是不可靠的,因為如果區域沒有擴展,它也可能為非零。
功能region-active-p
將可用,但是取決於主動transient-mark-mode
,該transient-mark-mode
可能不相關-在大多數情況下,它是有用的且足夠的BTW。
這是一個示例,如何檢查大於零的有效區域並超過transient-mark-mode
問題:
(defun ar-region-active-p ()
"Check for and existing region of some extend.
Don't mix up that question with transient-mark-mode "
(interactive)
(and (ignore-errors (region-beginning))(region-end) (< (region-beginning)(region-end))))
基於此,您的命令可能會稍有不同:
(defun my-command-on-region ()
"If a region of some extend exists, use on it.
Otherwise use whole buffer.
Doesn't require `transient-mark-mode' being active"
(interactive)
(let ((beg (or (and (ignore-errors (region-beginning))(region-end) (< (region-beginning)(region-end))(region-beginning))
(point-min)))
(end (or (and (ignore-errors (region-beginning))(region-end) (< (region-beginning)(region-end))(region-end))
(point-max))))
(DO-SOMETHING beg end)))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.