在组织模式文件中,使用如下代码:
#+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模式下的缓冲区一样。
我需要的是:
Org已经可以根据模式突出显示src块语法,并且TAB挂钩就在那里。这看起来很可行。
答案 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)))