在 emacs 中混合 org-mode 和 c-mode

Posted

技术标签:

【中文标题】在 emacs 中混合 org-mode 和 c-mode【英文标题】:Mixing org-mode and c-mode in emacs 【发布时间】:2012-05-29 12:58:50 【问题描述】:

我想在 Emacs 中混合使用 org-modec-mode。一切都在一个 comment 应该是 org-mode,其余的应该是默认的 major-mode c 模式

/*
Org-mode here
** Section 1
  text
** Section 2
  text
Org-mode should end here
*/

func1()


我试过用nXhtml multi-major-mode,我猜还有其他的模式 也支持多模式。我现在的问题是,如果我输入 TAB 在“第 2 节”上,则“第 2 节”下方的所有内容将被折叠并 变得不可见。但我想包含 org-mode 的区域 折叠/展开到评论部分。 TAB 应该只折叠/展开 直到“*/”。

我想知道我怎样才能做到这一点?

【问题讨论】:

你可以使用babel 不是我想要的:整个文件应该是一个普通的 c 文件。我想要 c-cmets 中的 org-mode 功能。 【参考方案1】:

你可以试试M-x orgstruct-mode RET

【讨论】:

感谢您的提示。我通过修补 org-mode 并使用您的 orgstruct-mode 而不是 multi-major-mode 得到了一个解决方案,它工作得很好。我发布了答案。【参考方案2】:

我找到了解决方案: http://lists.gnu.org/archive/html/emacs-orgmode/2011-01/msg00036.html 列出了 org-mode 的补丁:

--- emacs-23.2/lisp/org/org.el  2010-04-04 00:26:08.000000000 +0200
+++ src/c51/mk/org.el   2011-01-02 20:26:10.266860827 +0100
@@ -5245,6 +5245,8 @@
 (defun org-cycle-internal-local ()
   "Do the local cycling action."
   (org-back-to-heading)
+  (cond 
+   ((not (looking-at (concat outline-regexp "\s*#" )))
   (let ((goal-column 0) eoh eol eos level has-children children-skipped)
     ;; First, some boundaries
     (save-excursion
@@ -5318,7 +5320,7 @@
       (hide-subtree)
       (message "FOLDED")
       (setq org-cycle-subtree-status 'folded)
-      (run-hook-with-args 'org-cycle-hook 'folded)))))
+      (run-hook-with-args 'org-cycle-hook 'folded)))))))

 ;;;###autoload
 (defun org-global-cycle (&optional arg)
--- emacs-23.2/lisp/outline.el  2010-04-04 00:26:04.000000000 +0200
+++ src/c51/mk/outline.el   2011-01-02 20:35:17.303609833 +0100
@@ -913,8 +913,15 @@
       ;; Then unhide the top level headers.
       (outline-map-region
        (lambda ()
-    (if (<= (funcall outline-level) levels)
-        (outline-show-heading)))
+    (if (<= (funcall outline-level) level)
+          (if (looking-at (concat outline-regexp "\s*#" ))
+          (progn
+            (outline-show-heading )
+            (show-entry ))
+        (outline-show-heading))))
+;;       (lambda ()
+;;  (if (<= (funcall outline-level) levels)
+;;      (outline-show-heading)))
        beg end)))
   (run-hooks 'outline-view-change-hook))

@@ -994,7 +1001,11 @@
       (outline-map-region
        (lambda ()
     (if (<= (funcall outline-level) level)
-        (outline-show-heading)))
+          (if (looking-at (concat outline-regexp "\s*#" ))
+          (progn
+            (outline-show-heading )
+            (show-entry ))
+          (outline-show-heading))))
        (point)
        (progn (outline-end-of-subtree)
          (if (eobp) (point-max) (1+ (point)))))))

这个补丁必须手动应用,并不难。 它添加了将打破缩进的标记*#。 @bzg 指出 M-x orgstruct-mode RET 模式,归功于他。现在我可以在后台使用 orgstruct-mode 在 c.mode 中编写(不再需要多主模式了):

/*
Org-mode here
** Section 1
  text
** Section 2
  text
*#
Org-mode should end here
*/

并且我将在 cmets 中使用 org-mode,第 1 部分和第 2 部分将折叠到 *# 标记。

【讨论】:

以上是关于在 emacs 中混合 org-mode 和 c-mode的主要内容,如果未能解决你的问题,请参考以下文章

Emacs Org-mode 2 文档结构

如何在 Emacs Org-Mode 中锁定表字段(使它们只读,常量)?

Emacs,org-mode,evil-mode - TAB键不起作用

在 emacs 中使用 org-mode 表使用 calc 转换单位

用Org-mode管理emacs配置

如何在 emacs org-mode 中配置depend.el?