조직 모드에서 소스 블록을 빠르게 삽입


61

org-mode 다음 구문의 블록으로 소스 코드를 렌더링 할 수 있습니다.

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

이러한 블록을 빠르게 삽입하는 기존 명령이 있습니까? 아니면 org-mode같은 외부 도구를 사용해야 yasnippet합니까?


7
(1) 내장 된 쉬운 템플릿 (2) hydra패키지 사용 : blogpost (3) 쉬운 조직 소스 블록 삽입을위한 또 다른 스 니펫 .
Kaushal Modi 2016 년

Emacs에서 붙여 넣을 경우, Emacs는 주요 모드를 채우고 뒤로 링크 할 수 있습니다. github.com/unhammer/org-rich-yank#org-rich-paste
unhammer

답변:


89

주석에서 @kaushalmodi가 언급했듯이 (org) Easy Templates다른 유형의 블록을 빠르게 삽입 하는 데 사용할 수 있습니다 .

일반적인 절차는 빈 줄에 템플릿 선택기 (보통 단일 문자) 를 삽입 <하고을 누르는 것 입니다.TAB

일반 소스 블록 템플릿의 템플릿 선택기는입니다. 다음에 s입력하면 <s다음 과 같이됩니다 TAB.

#+BEGIN_SRC 

#+END_SRC

첫 번째 선의 끝에 점이 위치합니다.

이것은 당신이 달성하고자하는 것에 대한 첫 번째 근사치이지만, 이맥스입니다. 더 좋게 만들어 봅시다!

라는 변수에 하나 이상의 항목을 추가하여 사용자 정의 템플릿을 정의 할 수 있습니다 org-structure-template-alist. 예를 들면 다음과 같습니다.

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

이 코드는 템플릿 선택기로 사용하여에 #+NAME:템플릿을 추가합니다 . 확장 후이 템플릿 포인트는의 위치에 배치됩니다 .org-structure-template-alistn?

항상 코드 블록의 이름을 지정하면 원본 블록 템플릿의 원래 버전을 다음 #+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-mode HEAD에서는 Easy Template이 호환되지 않는 방식으로 대체되었습니다. yasnippet을 사용하는 것이 좋습니다.
lurdan

@lurdan이 여전히 그렇습니까? <s TABMac OS X에서 Emacs 25를 사용해 보았지만 작동하는 것 같습니다.
Rudolf Olah

1
@RudolfOlah 네, 적어도 org-mode (git) HEAD의 경우입니다. emacs26에서도 번들로 제공되는 org-mode는 여전히 org-try-structure-completion쉬운 템플릿을위한 기능을 가지고 있습니다. 그러나 어쨌든 앞으로는 템플릿으로 대체 될 것입니다. cf. 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)에 말한 언어를 제한하고 싶은 언어를 묻습니다.
  • 모든 유형을 입력하지 않고 조직 모드에 사용하고 선택하려는 언어 유형 목록을 제공합니다 (모두 사용하지는 않지만).
  • 언어가 파일을 생성해야하는 경우 출력 파일 이름을 요청합니다.

여기에 지원 코드가있는 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

대시 및 조직 모드가 필요합니다.

(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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.