Inserte rápidamente bloques fuente en modo org


61

org-mode tiene la capacidad de representar el código fuente, con bloques de la siguiente sintaxis:

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

¿Existe un comando existente para insertar rápidamente estos bloques org-mode, o necesito usar una herramienta externa como yasnippet?


77
Hay un par de formas: (1) Plantillas fáciles incorporadas (2) Uso del hydrapaquete: blogpost (3) Otro fragmento para una fácil inserción del bloque fuente de la organización.
Kaushal Modi

Si está pegando desde Emacs, Emacs puede completar el modo principal y el vínculo de retroceso para usted: github.com/unhammer/org-rich-yank#org-rich-paste
unhammer

Respuestas:


89

Como @kaushalmodi menciona en los comentarios que puede usar (org) Easy Templatespara acelerar la inserción de diferentes tipos de bloques.

El procedimiento general es insertar <seguido de un selector de plantilla (generalmente una sola letra) en una línea vacía y presionar TAB.

El selector de plantilla para una plantilla de bloque fuente genérico es s, por lo que escribir <sseguido TABle dará esto:

#+BEGIN_SRC 

#+END_SRC

El punto se colocará al final de la primera línea.

Esta es una buena primera aproximación de lo que quieres lograr, pero esto es Emacs, ¡así que hagámoslo mejor!

Puede definir plantillas personalizadas agregando una o más entradas a una variable llamada org-structure-template-alist. Por ejemplo:

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

Este código agrega una #+NAME:plantilla a org-structure-template-alist, utilizando ncomo un selector de plantilla. Después de expandir esta plantilla, el punto se colocará en la ubicación de ?.

Si siempre nombra sus bloques de código, también puede sobrescribir la versión original de la plantilla de bloque de origen con una versión extendida que incluya la #+NAME:línea:

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

Escribir <sseguido de TABentonces te dará:

#+NAME: 
#+BEGIN_SRC 

#+END_SRC

Esto es sólo la punta del iceberg; puede usar un enfoque similar para definir plantillas adicionales para bloques de código específicos del idioma, bloques de código con argumentos de encabezado específicos, etc.


2
Nota: Easy Template se reemplaza por una forma incompatible en HEAD de modo org. Recomiendo usar yasnippet.
lurdan

@lurdan, ¿sigue siendo así? Acabo de probar <s TABEmacs 25 en Mac OS X y parecía funcionar.
Rudolf Olah

1
@RudolfOlah Sí, al menos para el modo org (git) HEAD. Incluso con emacs26, el modo org integrado todavía tiene org-try-structure-completionfunción (para Easy-templates). Pero de todos modos, será reemplazado por Template-templates en el futuro. cf. code.orgmode.org/bzg/org-mode/commit/…
lurdan

14

¿Por qué no lo escribes tú mismo?

(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

En mi caja, el 99% del tiempo estoy creando bloques fuente y el 1% del tiempo estoy haciendo todo lo demás. Para el 1%, las plantillas fáciles son perfectas y para el 99% tengo un YaSnippet.

  • Crea un NAMEuso único, org-idpero eso no nos importa nada a nosotros) y luego me pregunta qué idioma quiero usar limitándolo a los que le dije a Org-Mode Literate Programming (babel)
  • Presenta una lista de tipos de idiomas que le dijo al Modo Org que desea usar y elegir, en lugar de escribir cada tipo (aunque no los uso todos)
  • Si el idioma tiene que generar un archivo, solicita el nombre del archivo de salida

Aquí está el YaSnippet con mi código de respaldo al final.

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

Requiere tablero y modo org cargado.

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

Aquí hay un ejemplo de cómo podría funcionar esta identificación:

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

Resultados en

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.