如何在 emacs 中使用 org-edit-special 编辑 markdown 代码块

How to edit a markdown code block using org-edit-special in emacs

我想像 org-edit-special 那样从 RMarkdown 文件编辑我的 R 块。我发现 generic-edit-special from jonathan leech-pepin 对 html 文件中的 js、css 和 ruby 做了类似的事情。我想我可以按照作者的建议对其进行调整,使其适用于我的情况,但我无法使其以其原始形式工作。

我能够从带有 js 脚本块的 html 文件中 运行 函数 ges/org-edit-special,但什么也没发生(没有错误,也没有新缓冲区)。我将 Internal Script example from here 用作此测试的 html 文件。

这是我为测试制作的init.el:

(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/"))
(setq package-list
    '(js2))

; activate all the packages
(package-initialize)
(load "~/.emacs.d/lisp/generic-edit-special")

; Org setup (telling org-mode to edit javascript with js2)
(push (cons "javascript" 'js2) org-src-lang-modes)
;; For html-mode

(require 'generic-edit-special)
(eval-after-load "sgml-mode" '(define-key sgml-mode-map [(control c) ?'] 'ges/org-edit-special))

我对 emacs 很陌生,通常使用 spacemacs,所以我想这只是我无法正确配置,但我现在显然迷路了。

我也知道 polymode 用于编辑 RMarkdown 文件,但不喜欢使用它。我更喜欢 "external code buffer" 方法。而且我也不能使用纯组织模式,因为我必须与不使用 Emacs 的人协作。

和你一样,我更喜欢 "external code buffer" 但经常需要共享 .Rmd 或其他格式。幸运的是,knitrrmarkdown 都支持 R 代码缓冲区中的标记。有关 "spinning" 您的 R 代码的(过时的)介绍,请参阅 here

无论如何,格式基本上只是 ##' 注释(带引号的双散列)之后的降价以及一些 yaml header 信息,如 Rmd 文件中,例如。以下可以 运行 作为纯 R 代码,

##' ---
##' title: "Foo"
##' output:
##'   html_document:
##'     toc: TRUE
##' author: Me
##' ---

##- r setup, include=FALSE -------------------------------------------------
library(ggplot2)
knitr::opts_chunk$set(echo = TRUE)
## /* end r setup */

##' # A header
##' a code block
##- blk1 -------------------------------------------------------------------
dat <- data.frame(x=sample(10, 10), y=runif(10))
## /* end blk1 */

##' # Another section
##' A code block w/ image
##- img,  fig.width=9, fig.height=4 ----------------------------------------
plot(y ~ x, data=dat, type='l')
## /* end sem */

##' # Next section
##' etc.

并使用 knitr::spin("<filename.R>", knit=FALSE) 转换为 Rmd,或使用 rmarkdown::render("<file.R>").

渲染为 HTML(如上所述)

就我个人而言,我会使用 Makefile 来简化文件生成(确保它们是制表符),例如。渲染和创建 Rmd,

foo.html: foo.R
    rscript -e "knitr::spin(\"$^\", knit=FALSE); \
    rmarkdown::render(\"$^\", \"all\")"

或者,可以使用 Emacs 中的命令进行编译等。

我刚刚发现降价模式中的 markdown-edit-code-block 函数完全符合我的要求。

我将 .Rmd 文件的主要模式设置为 markdown-mode 并在 R 块内执行它会打开一个间接缓冲区,其中 ess-r-mode 作为主要模式。 (在 doom emacs 中,默认的键绑定是 , '