如何始终显示嵌入式图像?

时间:2019-01-19 17:03:51

标签: image emacs org-mode

我正在尝试使用嵌入式图像(例如,用于通过gnuplot绘制数据),并且有一个问题:图像始终默认为 links 插入。我需要做一些按键操作,以“强制” emacs内嵌显示实际图像,而不仅仅是文件链接。

例如我从gnuplot代码开始:

#+BEGIN_SRC gnuplot :file plot.png
plot sin(x)
#+END_SRC

当我在此代码块上按C-c C-c时,它将运行,并显示结果作为指向图像文件的链接:

#+RESULTS:
[[file:plot.png]]
  • 如果我按两次C-c C-x C-v(org-toggle-inline-images),则链接会被替换为内嵌图像
  • 如果我再次运行M-x org-redisplay-inline-images,则链接确实被图片替换了
  • 如果我再次运行(org-display-inline-images t t),则会显示图像

,依此类推(这些选项来自Emacs org-display-inline-imagesInline images in org-mode问题)

但是我不想按任何特殊的操作:默认情况下,我希望图像以嵌入式方式显示。我发现并尝试了以下变量:

  • (setq org-startup-with-inline-images t).emacs配置中
  • #+STARTUP: inlineimages标头
  • (setq org-display-inline-images t)

但是没有一个让我得到我想要的行为。我很困惑-我想要一些不自然的东西吗?

P.S。我想在MacOS X上使用GNU Emacs v26.1,组织模式为v9.1.9-65

P.P.S。尽管这似乎是我的emacs / orgmode版本中的一个错误,并且尚未报告,但与此同时,我发现了以下技巧:(add-hook 'org-babel-after-execute-hook 'org-display-inline-images 'append)(感谢ob-ipython作者)–它已修复现在为我发行。也许对其他人有用

2 个答案:

答案 0 :(得分:1)

@Tobias 是最好的答案。我已经调整了@Tobias 代码以通过将重新显示绑定到当前子树并将 REFRESH 参数设置为 t 以仅在必要时重新显示来进一步优化。

  (require 'subr-x)
  (defun org+-babel-after-execute ()
    "Redisplay inline images in subtree if cursor in source block with :result graphics."

    (when (org-in-src-block-p)
      (let (beg end)
        (save-excursion
          (org-mark-subtree)
          (setq beg (point))
          (setq end (mark)))
        (when-let ((info (org-babel-get-src-block-info t))
                   (params (org-babel-process-params (nth 2 info)))
                   (result-params (cdr (assq :result-params params)))
                   ((member "graphics" result-params)))
          (org-display-inline-images nil t beg end)))))

  (add-hook 'org-babel-after-execute-hook #'org+-babel-after-execute)

答案 1 :(得分:0)

我可以通过以下方式重现该问题:

Org mode version 9.1.9 (release_9.1.9-65-g5e4542 @ /home/xyz/.emacs.d/elpa/org-plus-contrib-20190415/)

复制:

  1. 使用emacs -Q启动Emacs 26.3。
  2. M-x load-library RET org RET
  3. 通过 M-x Gnuplotorg-babel-load-languages添加到customize-option
  4. 加载gnuplot.el
  5. 打开具有以下内容的Org文件,然后在源代码块上按 C-c C-c
#+STARTUP: inlineimages
Some text.

#+BEGIN_SRC gnuplot :file plot.png :results graphics
plot sin(x)
#+END_SRC

我有与您在问题中建议的解决方案类似的解决方案,但有更多区别。

在大型组织文档中重新显示图像可能需要一些时间。因此,只有在源块具有结果参数graphics时,我才这样做:

(require 'subr-x)
(defun org+-babel-after-execute ()
  "Redisplay inline images after executing source blocks with graphics results."
  (when-let ((info (org-babel-get-src-block-info t))
         (params (org-babel-process-params (nth 2 info)))
         (result-params (cdr (assq :result-params params)))
         ((member "graphics" result-params)))
    (org-display-inline-images)))

(add-hook 'org-babel-after-execute-hook #'org+-babel-after-execute)