在GNU Emacs中,我想在当前选定的文本上运行一个程序figlet。然后我想评论生产的区域。
我已经找到了如何使用标准的Emacs命令来做到这一点:
但是,我没有弄清楚如何编写Emacs lisp程序来完成所有这些工作。这是我的尝试:
(defun figlet-region ()
(interactive)
(push-mark)
(shell-command-on-region "figlet")
(comment-region (mark) (point))
(pop-mark)
)
(global-set-key "\C-c\C-f" 'figlet-region)
然后C-<space>; M-x figlet-region
产生垃圾:
figlet-region: Wrong number of arguments: #[(start end command &optional output-buffer replace error-buffer display-error-buffer) "ÆÇÈ \"!É 'jÊ!j;j 0Wb ?Ë`Ì\"Í ÎQÎDRÎÉ!\"& ffÏ )ãÐqÑ!#Ò#p=¬É$]d|e^|Íed Î ÎD¡ÎÉ!\"&â%&#qÉ$Á&%Ó *Í ÉØ#DÚ#É!\"&*#Ô!#ÕÖ×!8WrÐ!qd`Z'o ØcÙÉ\"d'Zb)(Úp!)Û!*" [error-buffer small-temporary-file-directory temporary-file-directory exit-status error-file replace make-temp-file expand-file-name "scor" nil ...] 9 1945557 (let (string) (unless (mark) (error "The mark is not set now, so there is no region")) (setq string (read-from-minibuffer "Shell command on region: " nil nil nil (quote shell-command-history))) (list (region-beginning) (region-end) string current-prefix-arg current-prefix-arg shell-command-default-error-buffer t))], 1
(defun figlet-region (&optional b e)
(interactive "r")
(shell-command-on-region b e "figlet" (current-buffer) t)
(comment-region (mark) (point)))
(这是基于Trey Jackson的回答。)
;; _ _ _
;; | |_| |__ __ _ _ __ | | _____
;; | __| '_ \ / _` | '_ \| |/ / __|
;; | |_| | | | (_| | | | | <\__ \
;; \__|_| |_|\__,_|_| |_|_|\_\___/
# _ _ _
# | |_| |__ __ _ _ __ | | _____
# | __| '_ \ / _` | '_ \| |/ / __|
# | |_| | | | (_| | | | | <\__ \
# \__|_| |_|\__,_|_| |_|_|\_\___/
答案 0 :(得分:21)
我不确定你想要通过推动和弹出标记来完成什么,我相信你会通过这样做获得相同的功能:
(defun figlet-region (&optional b e)
(interactive "r")
(shell-command-on-region b e "figlet")
(comment-region b e))
interactive的参数告诉Emacs将区域(point和mark)作为命令的前两个参数传递。
答案 1 :(得分:6)
在lisp程序中使用shell-command-on-region
之类的交互式命令并不是一个好主意。您应该使用call-process-region
代替:
(defun figlet-region (&optional b e)
(interactive "r")
(call-process-region b e "figlet" t t)
(comment-region (mark) (point)))
它应该对各种用户选项更具弹性。
答案 2 :(得分:4)
嗯,我不确定垃圾来自哪里,但错误本身来自shell-command-region
。在elisp
中使用时,它至少需要3个参数,START
END
和COMMAND
。
另外,一般来说,在功能中弄乱标记是不好的做法。以下是关于该主题的推文文档:
新手Emacs Lisp程序员经常 尝试将标记用于错误 目的。请参阅文档 `set-mark'获取更多信息。