14

在 org-mode 文件中,代码如下:

#+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

4 回答 4

42

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

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

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

于 2014-12-01T20:23:39.230 回答
18

只需将点移动到代码块中并按 Cc '

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

于 2013-06-11T06:45:36.240 回答
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 代码,这是错误的)似乎可以使它们起作用并且会产生最大的影响。

于 2013-04-04T19:31:49.967 回答
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)))
于 2014-12-01T14:30:03.560 回答