在org-babel src块中缩进代码

时间:2013-04-02 20:05:52

标签: emacs org-mode org-babel

在组织模式文件中,使用如下代码:

#+begin_src emacs-lisp
(add-to-list 'org-tab-before-tab-emulation-hook
             (lambda ()
               (when (within-the-body-of-a-begin-src-block)
                 (indent-for-tab-command--as-if-in-lisp-mode))))
#+end_src

我希望TAB键缩进代码,就像在lisp模式下的缓冲区一样。

我需要的是:

  • 一种判断光标是否在src块内的方法。它不需要在标题行本身时触发,因为在这种情况下应该进行默认的组织折叠。
  • 根据标题中指定的模式(在本例中为emacs-lisp)缩进代码的方法。

Org已经可以根据模式突出显示src块语法,并且TAB挂钩就在那里。这看起来很可行。

4 个答案:

答案 0 :(得分:30)

从Emacs 24.1开始,您现在可以设置以下选项:

(setq org-src-tab-acts-natively t)

...那应该处理所有src块。

答案 1 :(得分:12)

将点移动到代码块并按C-c'

这将在elisp模式下弹出一个缓冲区,语法高亮显示所有...

答案 2 :(得分:2)

这是一个粗略的解决方案:

(defun indent-org-src-block-line ()
  "Indent the current line of emacs lisp code."
  (interactive)
  (let ((info (org-babel-get-src-block-info 'light)))
    (when info
      (let ((lang (nth 0 info)))
        (when (string= lang "emacs-lisp")
          (let ((indent-line-function 'lisp-indent-line))
            (indent-for-tab-command)))))))

(add-to-list 'org-tab-before-tab-emulation-hook
             'indent-org-src-block-line)

它只处理emacs-lisp块。我只测试了src块的非缩进(不是org默认值)。

一般来说,让一种模式在另一种模式下工作很困难 - 很多键盘命令都会发生冲突。但是一些更基本的笔画,比如缩进,换行,评论的标签(org会用#来评论lisp代码,这是错误的)似乎可以使它们起作用并且会产生最大的影响。

答案 3 :(得分:1)

(defun my/org-cleanup ()
  (interactive)
  (org-edit-special)
  (indent-buffer)
  (org-edit-src-exit))

应该这样做,其中`indent-buffer'定义为:

(defun indent-buffer ()
  (interactive)
  (indent-region (point-min) (point-max)))