Fügen Sie im Organisationsmodus schnell Quellblöcke ein


61

org-mode kann Quellcode mit Blöcken der folgenden Syntax rendern:

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

Gibt es einen vorhandenen Befehl, um diese Blöcke schnell einzufügen org-mode, oder muss ich ein externes Tool wie verwenden yasnippet?


7
Es gibt mehrere Möglichkeiten: (1) Integrierte einfache Vorlagen (2) Verwenden des hydraPakets: Blogpost (3) Ein weiteres Snippet zum einfachen Einfügen von Org-Quellblöcken.
Kaushal Modi,

Wenn Sie von Emacs
einfügen

Antworten:


89

Wie @kaushalmodi in den Kommentaren erwähnt, können Sie (org) Easy Templatesdas Einfügen verschiedener Arten von Blöcken beschleunigen.

Das allgemeine Verfahren besteht darin, in eine ansonsten leere Zeile <einen Vorlagen-Selektor (normalerweise ein einzelner Buchstabe) einzufügen und zu drücken TAB.

Die Vorlage Selektor für eine generische Quellenblock Vorlage s, so Typisierung <sgefolgt von TABeuch geben wird, folgt aus :

#+BEGIN_SRC 

#+END_SRC

Der Punkt wird am Ende der ersten Linie positioniert.

Dies ist eine gute erste Annäherung an das, was Sie erreichen möchten, aber dies ist Emacs. Machen wir es also besser!

Sie können benutzerdefinierte Vorlagen definieren, indem Sie einer Variablen mit dem Namen einen oder mehrere Einträge hinzufügen org-structure-template-alist. Zum Beispiel:

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

Dieser Code fügt eine #+NAME:Vorlage zu org-structure-template-alistverwenden nals Vorlage Selektor. Nach dem Erweitern wird dieser Schablonenpunkt an der Stelle von positioniert ?.

Wenn Sie Ihre Codeblöcke immer benennen, können Sie auch die Originalversion der Quellblockvorlage mit einer erweiterten Version überschreiben, die die folgende #+NAME:Zeile enthält:

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

Durch Eingabe von <sgefolgt von erhalten TABSie dann:

#+NAME: 
#+BEGIN_SRC 

#+END_SRC

Dies ist nur die Spitze des Eisbergs; Sie können einen ähnlichen Ansatz verwenden, um zusätzliche Vorlagen für sprachspezifische Codeblöcke, Codeblöcke mit bestimmten Header-Argumenten usw. zu definieren.


2
Hinweis: Easy Template wird im org-mode HEAD auf inkompatible Weise ersetzt. Ich empfehle yasnippet zu benutzen.
Lurdan

@lurdan ist das noch der fall? Ich habe es gerade <s TABmit Emacs 25 unter Mac OS X versucht und es schien zu funktionieren.
Rudolf Olah

1
@ RudolfOlah Ja, zumindest für org-mode (git) HEAD. Auch mit emacs26 hat der gebündelte Organisationsmodus noch org-try-structure-completionFunktion (für Easy-Templates). Es wird aber in Zukunft durch Structure-Templates ersetzt. vgl. code.orgmode.org/bzg/org-mode/commit/…
lurdan

14

Warum schreibst du es nicht selbst?

(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

Auf meiner Box erstelle ich 99% der Zeit Quellblöcke und 1% der Zeit mache ich alles andere. Für die 1% sind Easy Templates perfekt und für die 99% habe ich ein YaSnippet.

  • Es schafft eine einzigartige NAMEVerwendung, org-idaber das macht nichts) und dann fragt es mich, welche Sprache ich verwenden möchte, um sie auf die zu beschränken, die ich Org-Mode Literate Programming (babel) gesagt habe.
  • Zeigt eine Liste der Sprachtypen an, die Sie dem Org-Modus mitgeteilt haben und aus denen Sie auswählen möchten, anstatt jeden Typ einzugeben (obwohl ich nicht alle verwende).
  • Wenn die Sprache eine Datei erzeugen muss, fragt sie nach dem Namen der Ausgabedatei

Hier ist der YaSnippet mit meinem unterstützenden Code am Ende.

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

Es erfordert einen geladenen Dash- und Org-Modus.

(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))

Hier ist ein Beispiel für diese ID-Funktion:

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

Ergebnisse in

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.