簡體   English   中英

Emacs Lisp中的功能無效

[英]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.

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