org 怎么实现左源码右渲染

emacs小白,通过ai推荐,最近想开始用emacs做数学笔记了,看了b站上金色飞贼小米的视频,收获颇丰,但是想要实现在右边实时渲染,左边的源码保持不动,这样能看着干净点

eaf markdown previewer

不用org吗

有个叫 eaf org previewer

如果你用tex或typst写笔记的话都有对应的方案. 对于tex, texpresso是一个可用的实时预览工具.

对于typst, tinymist提供了类似的工具, 你可以配合typst-preview.el使用.

我的相关配置是这样的

(use-package typst-ts-mode
  :custom
  (typst-ts-mode-watch-options "--open")
  (typst-ts-indent-offset 2)
  :hook
  (typst-ts-mode . (lambda ()
                     (setq-local typst-preview-default-dir (project-root (project-current))
                                 typst-preview--master-file (buffer-file-name))) ))
(defun my-typst-in-math-p ()
  "如果在 typst-ts-mode 的 math 环境中则返回 non-nil。"
  (interactive)
  (when (derived-mode-p 'typst-ts-mode)
    (let ((node (treesit-node-at (point))))
      ;; 向上查找父节点,直到找到类型为 "math" 的节点
      (treesit-parent-until
       node
       (lambda (n)
         (member (treesit-node-type n) '("math")))))))
(defun myfix/typst-preview--connect-browser (browser hostname)
  "Open browser `BROWSER' at websocket URL `HOSTNAME'."
  (let ((full-url (concat "http://" hostname)))
    (pcase browser
      ("xwidget" (xwidget-webkit-browse-url full-url))
      ("default" (browse-url full-url))
      ("eaf-browser" (eaf-open-browser-other-window full-url))
      ("miniwindow"
       (let* ((browse-url-generic-program (executable-find "chromium"))
              (browse-url-browser-function 'browse-url-generic)
              (browse-url-generic-args `("--new-window" ,(concat "--app=" full-url))))
         (browse-url full-url)))
      (_
       (let* ((browse-url-generic-program (executable-find browser))
	            (browse-url-browser-function 'browse-url-generic))
	       (browse-url full-url))))))
(defun myfix/typst-preview-open-browser ()
  "Open typst-preview browser interactively."
  (interactive)
  (let* ((browser-list '("miniwindow" "default" "xwidget" "safari" "google chrome" "eaf-browser"))
	 (browser (completing-read "Browser: " browser-list nil nil)))
    (typst-preview--connect-browser browser (typst-preview--master-static-host typst-preview--local-master))))
(use-package typst-preview
  :config
  (setopt typst-preview-browser "miniwindow"
          typst-preview-cmd-options '("--features" "html"))
  (advice-add #'typst-preview--connect-browser :override #'myfix/typst-preview--connect-browser)
  (advice-add #'typst-preview-open-browser :override #'myfix/typst-preview-open-browser)
  )
1 个赞

谢谢,但是我还是想用org,这是我入门emacs的关键原因之一

那你给你的输入挂个hook, 每次输入时调用一下export方法, 然后再做下watch的实时更新就行了吧

还能这样吗,谢谢,我研究一下

我理解org就是org啦,还渲染个啥?能说下你为什么想要渲染吗?

我想可能是对 org 语法本身不够熟悉,对于实际 export 后的效果没有概念。

如果是这样,就需要知道想要导出到什么文件类型了。不同的类型,不同的渲染引擎,效果都不一样

数学笔记的话楼主应该主要是想要公式的渲染吧,其实是可以做到的,可惜似乎没看到相关的包来自动化这个过程:

主要思路应该就是用 make-indirect-buffer,两个 buffer 对应相同文字内容,分别使用不同 mode。不知道能不能让 AI 写个包来自动更新 Org-mode 样式,检测在更新 LaTeX 区块时调用 org-latex-preview,再同步一下滚动位置,这样应该就可以用了。

这完全可以的,我鼓励你简单地用 AI 开发一下,因为这个场景其他人未必有。

或许可以试试

左边Emacs编辑,右边浏览器实时预览,支持org,markdown和html

如果想要数学公式预览,有两种方式,一是使用Emacs内置的mathjax解析渲染

(setq maple-preview-render-alist '((org-mode . maple-preview-html-content)
                                      (t . maple-preview-markdown-content)))

不过这种方式的css需要自己定义,否则样式不太好看

二是使用katex解析渲染

(add-to-list 'maple-preview-styles "https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.min.css" t)
(add-to-list 'maple-preview-scripts "https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.min.js" t)
(add-to-list 'maple-preview-scripts "https://cdn.jsdelivr.net/npm/[email protected]/lib/index.umd.min.js" t)
(add-to-list 'maple-preview-scripts
             "<script>
              const markedKatexOptions = {
                throwOnError: false
              };
              marked.use(markedKatex(markedKatexOptions));
              </script>" t)

效果就如截图所示

2 个赞

org mode 本身就是富文本,emacs 对 org 的渲染就足够满足阅读需求,我猜你的需求是渲染数学公式,

这个项目可以看看,如果是嫌弃 org mode界面老土,可以看看

1 个赞

也许能帮上你