Szybkie wstawianie bloków źródłowych w trybie org


61

org-mode ma możliwość renderowania kodu źródłowego, z blokami o następującej składni:

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

Czy istnieje istniejące polecenie, aby szybko wstawić te bloki org-mode, czy też muszę użyć zewnętrznego narzędzia, takiego jak yasnippet?


7
Istnieje kilka sposobów: (1) Wbudowane łatwe szablony (2) Korzystanie z hydrapakietu: blogpost (3) Kolejny fragment kodu do łatwego wstawiania bloku źródłowego org.
Kaushal Modi

Jeśli wklejanie z Emacsa Emacs może wypełnić w głównym trybie i wstecznego dla Ciebie: github.com/unhammer/org-rich-yank#org-rich-paste
unhammer

Odpowiedzi:


89

Jak wspomina @kaushalmodi w komentarzach, możesz (org) Easy Templatesprzyspieszyć wstawianie różnego rodzaju bloków.

Ogólna procedura polega na wstawianiu, <a następnie selektorze szablonów (zwykle pojedynczej litery) w innym pustym wierszu i naciśnięciu TAB.

Selektor szablonów dla ogólnego szablonu bloku źródłowego jest staki, więc wpisanie <spo nim TABda ci to:

#+BEGIN_SRC 

#+END_SRC

Punkt zostanie umieszczony na końcu pierwszej linii.

To dobre pierwsze przybliżenie tego, co chcesz osiągnąć, ale to Emacs, więc poprawmy to!

Możesz zdefiniować niestandardowe szablony, dodając jeden lub więcej wpisów do zmiennej o nazwie org-structure-template-alist. Na przykład:

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

Ten kod dodaje #+NAME:szablon do org-structure-template-alist, używając njako selektora szablonów. Po rozwinięciu ten szablon zostanie umieszczony w miejscu ?.

Jeśli zawsze nazywasz swoje bloki kodu, możesz również zastąpić oryginalną wersję szablonu bloku źródłowego rozszerzoną wersją, która zawiera #+NAME:wiersz:

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

Po wpisaniu, <sa TABnastępnie otrzymasz:

#+NAME: 
#+BEGIN_SRC 

#+END_SRC

To tylko wierzchołek góry lodowej; możesz zastosować podobne podejście do zdefiniowania dodatkowych szablonów dla bloków kodu specyficznych dla języka, bloków kodu z określonymi argumentami nagłówka itp.


1
Uwaga: Easy HEAD zostaje zastąpiony niekompatybilnym sposobem w trybie org HEAD. Polecam użyć yasnippet.
lurdan

@lurdan czy nadal tak jest? Właśnie wypróbowałem <s TABEmacsa 25 na Mac OS X i wydawało się, że działa.
Rudolf Olah

1
@RudolfOlah Tak, przynajmniej w przypadku org-mode (git) HEAD. Nawet w emacs26, tryb org w pakiecie nadal ma org-try-structure-completionfunkcję (dla szablonów Easy). Ale i tak w przyszłości zostaną zastąpione szablonami struktur. por. code.orgmode.org/bzg/org-mode/commit/…
lurdan

14

Dlaczego nie napisać tego sam?

(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

Na moim urządzeniu 99% czasu tworzę bloki źródłowe, a 1% czasu robię wszystko inne. Dla 1% łatwe szablony są idealne, a dla 99% mam YaSnippet.

  • Tworzy unikalne NAMEużycie, org-idale to nie ma znaczenia tylko dla nas, a następnie pyta mnie, jakiego języka chcę użyć, ograniczając go do tych, którym powiedziałem Org-Mode Literate Programming (babel)
  • Przedstawia listę typów języków, o których powiedziałeś Org-Mode, że chcesz używać i wybierać, zamiast wpisywać każdy typ (chociaż nie używam wszystkich z nich)
  • Jeśli język musi wygenerować plik, pyta o nazwę pliku wyjściowego

Oto YaSnippet z moim kodem pomocniczym na końcu.

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

Wymaga załadowania myślnika i trybu org.

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

Oto przykład Twojej funkcji id:

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

Prowadzi do

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.