在组织模式下快速插入源代码块


61

org-mode 具有呈现源代码的能力,具有以下语法的块:

#+NAME: <name>
#+BEGIN_SRC <language> <switches> <header arguments>
    <body>
#+END_SRC

是否有现有命令可以快速将这些块插入其中org-mode,还是需要使用外部工具yasnippet


7
有两种方法:(1)内置的Easy模板(2)使用hydra软件包:blogpost(3)另一个易于组织源代码块插入的代码段。
Kaushal Modi

如果您是从Emacs粘贴,则Emacs可以为您填写主模式和反向链接:github.com/unhammer/org-rich-yank#org-rich-paste
unhammer

Answers:


89

正如@kaushalmodi在评论中提到的那样,您可以(org) Easy Templates用来加快不同类型块的插入。

的一般方法是插入<后跟一个模板选择器(通常是一个字母)上的其他空行,并按TAB

通用源代码块模板的模板选择器是s,因此键入<s后跟TAB将为您提供:

#+BEGIN_SRC 

#+END_SRC

点将位于第一行的末尾。

这是您想要实现的目标的一个很好的第一近似值,但这是Emacs,所以让我们变得更好!

您可以通过将一个或多个条目添加到名为的变量中来定义自定义模板org-structure-template-alist。例如:

(add-to-list 'org-structure-template-alist '("n" "#+NAME: ?"))

此代码使用作为模板选择器将#+NAME:模板添加到。扩展后,该模板点将位于的位置。org-structure-template-alistn?

如果您始终为代码块命名,则还可以使用包含以下内容的扩展版本覆盖源代码块模板的原始版本#+NAME:

(add-to-list 'org-structure-template-alist
             '("s" "#+NAME: ?\n#+BEGIN_SRC \n\n#+END_SRC"))

打字<s其次是TAB意志然后给你:

#+NAME: 
#+BEGIN_SRC 

#+END_SRC

这只是冰山一角; 您可以使用类似的方法为语言特定的代码块,具有特定标头参数的代码块等定义其他模板。


1
注意:在组织模式HEAD中,Easy Template被替换为不兼容的方式。我建议使用yasnippet。
lurdan

@lurdan还是这样吗?我刚刚<s TAB在Mac OS X上尝试了Emacs 25,它似乎可以工作。
Rudolf Olah '18

1
@RudolfOlah是的,至少对于组织模式(git)HEAD。即使使用emacs26,捆绑的组织模式仍然具有org-try-structure-completion功能(适用于Easy-templates)。但是无论如何,将来它将被Structure-templates取代。cf. code.orgmode.org/bzg/org-mode/commit/…–
lurdan

14

为什么不自己写呢?

(defun org-insert-source-block (name language switches header)
  "Asks name, language, switches, header.
Inserts org-mode source code snippet"
  (interactive "sname? 
slanguage? 
sswitches? 
sheader? ")
  (insert 
   (if (string= name "")
       ""
     (concat "#+NAME: " name) )
   (format "
#+BEGIN_SRC %s %s %s

#+END_SRC" language switches header
)
   )
  (forward-line -1)
  (goto-char (line-end-position))
  )

6

在我的盒子上,有99%的时间我在创建源代码块,而有1%的时间我在做其他所有事情。对于1%的简单模板是完美的,对于99%的模板,我有一个YaSnippet。

  • 它创建了一个独特的NAME使用org-id,但不要紧只是我们什么),然后问我,我想用它限制那些我告诉组织模式编程书籍的那些什么语言(巴贝尔)
  • 呈现您告诉Org-Mode您要使用和选择的语言类型的列表,而不是键入每种类型(尽管我并未全部使用)
  • 如果语言必须生成文件,则要求输出文件名

这是YaSnippet,最后是我的支持代码。

# -*- mode: snippet -*-
# key: sc
# name: Source Block
# group: HELP
# contributor: gcr@wisdomandwonder.com
# expand-env: ((yas-indent-line 'fixed))
# --
#+NAME: ${1:`(help/org-id-new)`}
#+BEGIN_SRC ${2:$$(let ((langs (sort (-map (lambda (x) (symbol-name (car x))) (if (-contains? org-babel-load-languages '(js . t)) (-snoc org-babel-load-languages '(javascript . t)) org-babel-do-load-languages)) 'string<))) (yas-choose-value (if (-contains? langs "shell") (-snoc langs "sh") langs)))}${2:$(when (-contains? '("ditaa" "dot" "plantuml") yas-text) (concat " :file \\"./image/" (yas-field-value 1) ".png\\""))} $3
$0
#+END_SRC

它需要破折号和组织模式加载。

(require 'org-id)
(setq org-id-link-to-org-use-id 'nil)
(setq org-id-prefix (concat "org_" (user-real-login-name) "_" (format-time-string "%Y-%m-%d") "_" (system-name)))
(setq org-id-method 'uuid)
(defun help/org-id-new ()
  "Re-purposing `org-id' hit a snag when colons were forbidden in Source-Block
  names. Adding support for a user-defined Org-Id separator would have fixed
  this but with no benefit to Org-Id. So this function removes the colon
  instead.
 "
  (interactive)
  (let* ((gend (org-id-new))
         (newid (replace-regexp-in-string ":" "_" gend)))
    newid))

这是您可能使用此id函数的示例:

C-u M-:
(insert (help/org-id-new))

结果是

org_gcr_2017-08-06_mara_DD608C9A-33B0-4A8D-9123-298746BE973Anil

2
;;; package --- Summary
;;; Commentary:
;;; Code:
(defvar org-sai-src-default "C++"
 "This is the list used to store the default label for source code section.")

(defun org-insert-src-block ()
  "Insert the source code section in `org-mode'."
  (interactive)
  (let* ((src-code-types
          '("emacs-lisp" "python" "C" "sh" "java" "js" "clojure" "C++" "css"
            "calc" "asymptote" "dot" "gnuplot" "ledger" "lilypond" "mscgen"
            "octave" "oz" "plantuml" "R" "sass" "screen" "sql" "awk" "ditaa"
            "haskell" "latex" "lisp" "matlab" "ocaml" "org" "perl" "ruby"
            "scheme" "sqlite"))
         (src-prompt-str
          (concat "Source code type (default "
                  org-sai-src-default
                  "): "))
         (temp-src-code-types 
          (cons org-sai-src-default src-code-types))
         (src-type-str
          (completing-read src-prompt-str temp-src-code-types
                           nil nil nil nil org-sai-src-default)))
    (setq org-sai-src-default src-type-str))
    (insert (format "#+BEGIN_SRC %s\n" src-type-str))
    (newline)
    (org-indent-line)
    (insert "#+END_SRC\n")
    (forward-line -2))))

(add-hook 'org-mode-hook
          (lambda ()
            ;; keybinding for inserting code blocks
            (local-set-key (kbd "C-c s") 'org-insert-src-block)))

(provide 'orgAuxiliary)
;;; orgAuxiliary.el ends here
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.