【问题标题】:how to update evaluation result comments of Emacs Lisp forms easilly如何轻松更新 Emacs Lisp 表单的评估结果注释
【发布时间】:2013-08-17 15:27:53
【问题描述】:

假设我有这段代码,它显示了 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)

【问题讨论】:

    标签: emacs elisp


    【解决方案1】:

    好吧,我不确定我是否要鼓励这种事情 ;-),但这会让你更接近你想要做的事情,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 并以交互方式调用命令。直接调用它(或其辅助函数),传递你想要的参数。

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

    【讨论】:

      【解决方案2】:

      您的函数所做的相应事情是在 org-mode 中实现的,即 org-babel。

      参见信息、组织模式、14 使用源代码

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-28
        • 1970-01-01
        • 1970-01-01
        • 2011-06-22
        相关资源
        最近更新 更多