EMACS折叠/展开R代码

16
是否有一种 Emacs minor-mode(或 elisp 代码)可以在 Sweave 中选择性隐藏/显示环境?
例如,我想移动到代码块的开头 (<<>>),按下一个按键,然后使环境的内容隐藏不可见。
这种情况可能吗?我刚试了 hs-minor-mode、allout-mode 和 outline-minor-mode,但大多数都不能识别 R 环境。
我也尝试了很久使用 org-mode,它非常适用于折叠/展开,但是不支持像 \cite{}; \ref{}; \ce{} 这样的 LaTeX 高亮代码。
最好 Riccardo
--编辑--
我尝试使用 emacs-folding-mode 已经有几天了,但是因为我正在处理一个非常长的代码(超过 2000 行),所以折叠模式会“疯狂”,例如误解某些特殊字符(即 $),这些字符在 R 和 LaTeX 中的用途非常不同。我认为问题在于 Sweave 本身,因为在同一个缓冲区中,我同时有 R 代码和 LaTeX 代码。
现在,我正在测试 emacs outline minor mode。但是当我在 LaTeX 和 R 之间移动时,所有轮廓部分都会展开,尽管我已经在我的 .emacs 文件中写入了:
(defun turn-on-outline-minor-mode ()
 (outline-minor-mode 1))
  (add-hook 'ess-mode-hook 'turn-on-outline-minor-mode)
  (add-hook 'LaTeX-mode-hook 'turn-on-outline-minor-mode)
  (add-hook 'latex-mode-hook 'turn-on-outline-minor-mode)
(setq outline-minor-mode-prefix "\C-c\C-o")

你有什么建议吗?

问候

--编辑2--

看起来它能够工作:

(load "folding" 'nomessage 'noerror)
(folding-mode-add-find-file-hook)
(add-hook 'LaTeX-mode-hook 'folding-mode) 
(add-hook 'ess-mode-hook 'folding-mode) 
(folding-add-to-marks-list 'ess-mode "#{{{ " "#}}}" " ")

我不确定是否正确,当你离开代码块时,它会自动展开。


1
这是Rnw模式的实现给你带来了麻烦。我也尝试过hideshow。但由于Rnw在你离开/进入代码块时重置模式,所有内容都被重置了。ESS中有一些讨论,计划基于更好的noweb.el重写Rnw。 - VitoshKa
嗨,我使用折叠模式部分解决了这个问题。我重新编辑了帖子并附上了我的解决方案。 - Riccardo
2个回答

1

你遇到了什么“麻烦”? - snim2
这段代码 (folding-add-to-marks-list 'Rnw-mode "#{{{" "#}}}" nil t) 是我所做的,但是 Emacs 没有检测到折叠标记。 - Riccardo
“Rnw-mode” 是一个真正的 Emacs 模式吗? - snim2
不,这就是问题所在……我想。在.emacs文件中,我定义了Rnw-mode:(defun Rnw-mode () (require 'ess-noweb) (noweb-mode) (if (fboundp 'R-mode) (setq noweb-default-code-mode 'R-mode)))。要在.Rnw文件中调用R块,我键入<<>> my R code @`。 - Riccardo
3
对于遇到相同问题的人,正确的语法是:(add-hook 'LaTeX-mode-hook 'folding-mode)。 - Riccardo
显示剩余6条评论

1

我在~/.emacs.d/init.el中使用以下代码以启用hideshow hs-minor-mode,取得了非常好的效果:

(add-hook 'ess-mode-hook 'hs-minor-mode)

(eval-after-load 'hideshow
 '(progn
   (global-set-key (kbd "C-+") 'hs-toggle-hiding)))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接