如何方便地更新Emacs Lisp表单的评估结果注释



假设我有这个代码,它显示了mapcar 的使用示例

(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包解决的问题不同,因为这只是更新现有的示例代码。

现在我使用的是:

(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)))

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

(+ 1 2)
;; ⇒ 3 (#o3, #x3)

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

 (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))
  1. 您不需要保存点,然后显式返回到它——使用save-excursion

  2. 您不需要绑定前缀arg并以交互方式调用该命令。只需直接调用它(或其辅助函数),传递所需的arg即可。

  3. 你需要调整行为,防止它认为这是命令的第二次出现,这就是它打印八进制等数字信息的原因。let绑定可以做到这一点(但这是一个丑陋的小破解)。

您的函数所做的每一件事都是在组织模式中实现的,即组织babel。

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

最新更新