Inserisci rapidamente blocchi sorgente in modalità org


61

org-mode ha la capacità di rendere il codice sorgente, con blocchi della seguente sintassi:

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

Esiste un comando esistente per inserire rapidamente questi blocchi org-modeo devo usare uno strumento esterno come yasnippet?


7
Ci sono un paio di modi: (1) Modelli facili incorporati (2) Utilizzo del hydrapacchetto: blogpost (3) Un altro frammento per un facile inserimento del blocco del codice sorgente dell'organizzazione.
Kaushal Modi,

Se stai incollando da Emacs, Emacs può compilare la modalità principale e il backlink per te: github.com/unhammer/org-rich-yank#org-rich-paste
unhammer

Risposte:


89

Come menziona @kaushalmodi nei commenti, è possibile utilizzare (org) Easy Templatesper accelerare l'inserimento di diversi tipi di blocchi.

La procedura generale consiste nell'inserire <seguita da un selettore di modelli (di solito una singola lettera) su una riga altrimenti vuota e premere TAB.

Il selettore di modello per un modello di blocco di origine generico è s, quindi digitare <sseguito da TABti darà questo:

#+BEGIN_SRC 

#+END_SRC

Il punto verrà posizionato alla fine della prima riga.

Questa è una buona prima approssimazione di ciò che vuoi ottenere, ma questo è Emacs, quindi cerchiamo di migliorarlo!

È possibile definire modelli personalizzati aggiungendo una o più voci a una variabile chiamata org-structure-template-alist. Per esempio:

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

Questo codice aggiunge un #+NAME:modello a org-structure-template-alist, usando ncome selettore di modelli. Dopo l'espansione questo punto modello verrà posizionato nella posizione di ?.

Se assegni sempre un nome ai blocchi di codice, puoi anche sovrascrivere la versione originale del modello di blocco di origine con una versione estesa che include la #+NAME:riga:

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

Digitando <sseguito da TABti darà quindi:

#+NAME: 
#+BEGIN_SRC 

#+END_SRC

Questa è solo la punta dell'iceberg; puoi utilizzare un approccio simile per definire modelli aggiuntivi per blocchi di codice specifici della lingua, blocchi di codice con argomenti di intestazione specifici, ecc.


2
Nota: Easy Template viene sostituito con un modo incompatibile in HEAD in modalità org. Consiglio di usare yasnippet.
Lurdan,

@lurdan è ancora così? Ho appena provato <s TABEmacs 25 su Mac OS X e sembrava funzionare.
Rudolf Olah,

1
@RudolfOlah Sì, almeno per la modalità org (git) HEAD. Anche con emacs26, la modalità org in bundle ha ancora una org-try-structure-completionfunzione (per i modelli Easy). Tuttavia, in futuro verrà sostituito da modelli di strutture. cf. code.orgmode.org/bzg/org-mode/commit/…
lurdan

14

Perché non scriverlo tu stesso?

(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

Nella mia scatola il 99% delle volte sto creando blocchi sorgente e l'1% delle volte sto facendo tutto il resto. Per l'1% i modelli facili sono perfetti e per il 99% ho uno YaSnippet.

  • Crea un NAMEuso unico org-idma non importa nulla di noi) e poi mi chiede quale linguaggio voglio usare limitandolo a quelli che ho detto alla programmazione letterale in modalità Org (babel)
  • Presenta un elenco di tipi di lingua che hai detto a Org-Mode che vuoi usare e da cui scegliere, invece di digitare ogni tipo (anche se non li uso tutti)
  • Se la lingua deve generare un file, richiede il nome del file di output

Ecco YaSnippet con il mio codice di supporto alla fine.

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

Richiede dash e modalità org caricati.

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

Ecco un esempio di te potrebbe questa funzione id:

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

Risultati 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.