首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何轻松更新Emacs Lisp表单的评价结果注释

如何轻松更新Emacs Lisp表单的评价结果注释
EN

Stack Overflow用户
提问于 2013-08-17 10:23:56
回答 2查看 166关注 0票数 4

假设我有以下代码,其中显示了mapcar的用法示例

代码语言:javascript
复制
(mapcar #'1+ (list 10 20 30)) ; ⇒ (11 21 31)

(mapcar (lambda (it)
          (* 2 it))
        (list 0 1 2 3))
;; ⇒ (0 2 4 6)

(require cl-lib)
(cl-mapcar #'+
           '(1 2 3)
           '(10 20 30))
;; ⇒ (11 22 33)

我可能会把代码写在某个地方,这样我就可以在教程中使用它,或者每当我忘记mapcar是如何工作的时候,我就可以快速阅读代码。

现在假设我想要更新代码中的一些示例。例如,我可以将第二个示例中的(list 0 1 2 3)更改为其他列表。在我更改示例之后,相应的结果注释就过时了。结果注释也需要更新。因此,我评估表单,复制结果,并将注释中的旧结果替换为新结果。有没有什么包可以帮我轻松轻松地做到这一点?这是一个与litable或ielm包解决的问题不同的问题,因为这只是更新现有的示例代码。

现在我使用的是:

代码语言:javascript
复制
(defun my-insert-eval-last-sexp ()
  (interactive)
  (let ((beg (point)))
    (let ((current-prefix-arg '(4)))
      (call-interactively 'eval-last-sexp))
    (goto-char beg)
    (if (looking-back ")")
        (insert " ; "))
    (insert "⇒ ")
    (move-end-of-line 1)))

这仍然是不够的,因为它只是添加结果注释,而不是更新旧的注释,并且在表单计算为数字时会插入奇怪的东西:

代码语言:javascript
复制
(+ 1 2)
;; ⇒ 3 (#o3, #x3)
EN

回答 2

Stack Overflow用户

发布于 2013-08-17 10:59:29

嗯,我不确定我是否想鼓励这种事情;-),但这会让你离你试图做的事情更近一步,IIUC:

代码语言:javascript
复制
 (defun my-insert-eval-last-sexp ()
   (interactive)
   (let ((this-command  'eval-print-last-sexp))
     (save-excursion (eval-last-sexp-1 t)))
   (when (looking-back ")") (insert " ; "))
   (insert "⇒ ")
   (move-end-of-line 1))

使用save-excursion.

  • You不需要绑定前缀arg,也不需要交互地调用
  1. 。直接调用它(或它的助手函数),传递你想要的参数。
  2. 你需要调整行为,以防止它认为这是该命令的第二次出现,这是导致它打印八进制等数字信息的原因。

let绑定可以做到这一点(但这是一个丑陋的小技巧)。

票数 2
EN

Stack Overflow用户

发布于 2013-08-17 15:27:53

你的函数所做的每件事都是在org-mode中实现的,即org-babel。

请参阅在信息中,组织模式,14使用源代码

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18284497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档