可定位代码块版本

40 阅读1分钟

十几行的 org-exec 仅仅能够执行整个 buffer 中的代码块, 而且还不包括那些被设置为 :eval no 的块。此版本在其基础上添加精确定位代码块的能力,并无视 :eval no 等某些块配置。

#+name: 2025-08-02-15-04
#+begin_src emacs-lisp :eval yes :lexical t :results none
(defalias 'org-exec
  (let ((timeout 30) (h (make-symbol "hook"))
        (fetch (make-symbol "fetch"))
        (hash (make-hash-table :test #'equal))
        (rcmd (if (executable-find "curl")
                `("curl" "-s" "--ssl-no-revoke")))
        (conf (concat ":eval yes :results none "
                      ":noweb yes :lexical t")))
    (defalias h
      (lambda()(remove-hook'eww-after-render-hook h)))
    (defalias fetch
      (lambda (url)
        (add-hook 'eww-after-render-hook h)
        (let ((eww-retrieve-command
               (or rcmd eww-retrieve-command))
              (st (float-time)))
          (save-window-excursion
            (with-timeout (timeout (error "Timeout"))
              (eww-browse-url url t)
              (while (memq h eww-after-render-hook)
                (sit-for 1)
                (message "%d" (- (float-time) st))))
            (org-mode) (message "done")
            (puthash url (current-buffer) hash)))))
    (lambda (link &optional o)
      (setq
       link (string-trim link "\\[+" "\\]+")
       link (with-temp-buffer
              (org-mode) (insert "file:///" link)
	      (goto-char (point-min))
	      (org-element-link-parser))
       o (org-element-property :search-option link)
       link (org-element-property :path link)
       link (substring link 1))
      (let ((buf (gethash link hash))
            (inhibit-read-only t))
        (with-current-buffer
            (if (buffer-live-p buf) buf
              (funcall fetch link))
          (ignore-errors (xb))
          (if (null o) (org-babel-execute-buffer)
            (eval `(org-sbe ,o ,conf))))))))
#+end_src