emacs - 如何轻松更新 Emacs Lisp 表单的评估结果注释

标签 emacs elisp

假设我有这段代码,它显示了 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))
  • 您不需要保存点然后显式返回它 --- 使用 save-excursion .
  • 您不需要绑定(bind)前缀 arg 并以交互方式调用命令。只需直接调用它(或其辅助函数),传递您想要的 arg。
  • 您需要调整行为以防止它认为这是该命令的第二次出现,这就是导致它打印八进制等数字信息的原因。 let绑定(bind)可以做到这一点(但这是一个丑陋的小技巧)。
  • 关于emacs - 如何轻松更新 Emacs Lisp 表单的评估结果注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18284497/

    相关文章:

    emacs - 单元格中行数的组织模式电子表格公式

    macos - 仅当从 emacs 调用时才会出现 Imagemagick(转换)错误

    emacs - 推送标记在 Emacs 中无法正常工作

    emacs - 在 Emacs 中禁用包键绑定(bind)覆盖

    go - go 语言的 emacs 自动完成

    emacs - 如何使用 emacs 缩进一个 block ?

    emacs - Emacs Lisp 的 REPL

    Emacs 中的 Python 模式 : No such file or directory, pdb

    emacs - 如何在 Windows 上为 Emacs 23.1.50 编译 CEDET 1.0pre7 编译?

    regex - 如何编写排除而不是匹配的正则表达式,例如,不包括(this | string)?