Швидко вставляйте вихідні блоки в режим org


61

org-mode має можливість візуалізації вихідного коду з блоками наступного синтаксису:

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

Чи існує існуюча команда для швидкого вставки цих блоків у org-modeмені, чи мені потрібно використовувати зовнішній інструмент, як-от yasnippet?


7
Є кілька способів: (1) Вбудовані прості шаблони (2) Використання hydraпакету: blogpost (3) Ще один фрагмент для легкої вставки джерельного блоку org.
Каушал Моді

Якщо ви вставляєте з Emacs, Emacs може заповнити основний режим і зворотну
unhammer

Відповіді:


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-alist, використовуючи nяк селектор шаблонів. Після розгортання цього шаблону точка буде розміщена за адресою ?.

Якщо ви завжди називаєте кодові блоки, ви також можете перезаписати оригінальну версію шаблону вихідного блоку з розширеною версією, що включає #+NAME:рядок:

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

Введення тексту з <sподальшими даними TAB:

#+NAME: 
#+BEGIN_SRC 

#+END_SRC

Це лише верхівка айсберга; ви можете використовувати аналогічний підхід для визначення додаткових шаблонів для кодових блоків коду, блоків коду з конкретними аргументами заголовка тощо.


2
Примітка: Легкий шаблон замінюється несумісним способом в org-режимі HEAD. Рекомендую використовувати ясніппет.
лурдан

@lurdan це все ще так? Я просто спробував <s TABна Emacs 25 на Mac OS X і, здавалося, спрацює.
Рудольф Олах

1
@RudolfOlah Так, принаймні для org-mode (git) HEAD. Навіть із emacs26, в комплектному органічному режимі все ще org-try-structure-completionфункціонує (для Easy-шаблонів). Але в будь-якому випадку його в майбутньому замінять структури-шаблони. пор. 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 Literate Programming (babel)
  • Представляє список типів мови, якими ви сказали 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

Він вимагає завантаження тире та 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))

Ось приклад, яким ви можете скористатися цією функцією 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.