# + BEGIN_ # + END_ 이외의 템플릿을 org-structure-template-alist에 추가 할 수 있습니까?


9

org-structure-template-alist가 (org-mode 버전 9.2를 사용하고 있음)이 (으)로 자동 확장되도록 변경되었습니다 #+BEGIN_<some block tag> #+END_<some block tag>. 다른 종류의 템플릿을 추가 할 수 있는지 궁금합니다. 예를 들어 :PROPERTIES:<some properties>:END:템플릿입니다.

야스 니펫과 같은 다른 패키지를 사용해야합니까?

답변:


9

최신 정보:

조직 모드 9.2 가 템플릿 확장 메커니즘을 변경 했음을 알지 못했습니다 . 여기서 및로 org-structure-template-alist정의 된 블록에만 적용됩니다 . 그리고 같은 항목 은 더 이상 허용되지 않습니다."#+BEGIN_""#+END_"("p" ":PROPERTIES:?:END:")

위 링크에서 언급했듯이 다른 "복잡한"템플릿은 function으로 정의 할 수 있으며 tempo-define-templateorg-tempo를로드해야합니다 ( (require 'org-tempo)). 실제로의 항목은 org-structure-template-alist 에 의해 org-tempo-tagsvia tempo-define-template로 변환 org-tempo되며 org-tempo-tags기본값은 다음 과 같습니다.

(("<i" . tempo-template-org-index)
 ("<A" . tempo-template-org-ascii)
 ("<H" . tempo-template-org-html)
 ("<L" . tempo-template-org-latex)
 ("<v" . tempo-template-org-verse)
 ("<s" . tempo-template-org-src)
 ("<q" . tempo-template-org-quote)
 ("<l" . tempo-template-org-export-latex)
 ("<h" . tempo-template-org-export-html)
 ("<E" . tempo-template-org-export)
 ("<e" . tempo-template-org-example)
 ("<C" . tempo-template-org-comment)
 ("<c" . tempo-template-org-center)
 ("<a" . tempo-template-org-export-ascii)
 ("<I" . tempo-template-org-include))

귀하의 경우 다음을 통해 템플릿을 정의 할 수 있습니다.

(tempo-define-template "my-property"
               '(":PROPERTIES:" p ":END:" >)
               "<p"
               "Insert a property tempate")

아래 답변은 9.2 이전의 조직 모드 버전에서만 작동합니다.

예, 다음과 같이 항목을 추가 할 수 있습니다.

(add-to-list 'org-structure-template-alist '("p" ":PROPERTIES:?:END:"))

그런 다음 org 파일에서 <pand 를 입력 TAB하면 속성으로 확장되어 지점이에 위치 ?합니다.

그리고을 입력하여 변수 문서에서 자세한 내용을 찾을 수 있습니다 C-h v org-structure-template-alist RET.


매우 유용한 답변입니다. 감사합니다. Btw, 오타 의 >상징 tempo-define-template입니까? 그렇지 않다면 ... 정의에서 그 역할은 무엇입니까?
Dox

1
도움이되어 기쁘다 :) 오타가 아니라, 줄이 들여 쓰기되고 tempo-define-template내장 된 재미 가 있다는 것을 의미한다 . 자세한 내용은 docstring 을 참조하십시오.
whatacold 2019 년

2

그들이 org-mode의 커스터마이징에서 호환되지 않는 변화를 일으키는 빈도는 실제로 유감입니다.

다음 코드는 버전 9.2 이전의 org-mode의 이전 구조 템플리트를 제공합니다. 이 기능 org-complete-expand-structure-template은 버전 9.1의 순수한 사본 org-try-structure-completion이며 9.1 버전의 약간 수정 된 버전입니다. (나는 거기에 유형 확인을 추가했습니다.)

해당 코드를 설치 한 후에는 기존 템플릿을
(add-to-list 'org-structure-template-alist '("p" ":PROPERTIES:?:END:"))
다시 사용할 수 있습니다 .

(defvar org-structure-template-alist)

(defun org+-avoid-old-structure-templates (fun &rest args)
  "Call FUN with ARGS with modified `org-structure-template-alist'.
Use a copy of `org-structure-template-alist' with all
old structure templates removed."
  (let ((org-structure-template-alist
     (cl-remove-if
      (lambda (template)
        (null (stringp (cdr template))))
      org-structure-template-alist)))
    (apply fun args)))

(eval-after-load "org"
  '(when (version<= "9.2" (org-version))
     (defun org-try-structure-completion ()
       "Try to complete a structure template before point.
This looks for strings like \"<e\" on an otherwise empty line and
expands them."
       (let ((l (buffer-substring (point-at-bol) (point)))
         a)
     (when (and (looking-at "[ \t]*$")
            (string-match "^[ \t]*<\\([a-zA-Z]+\\)$" l)
            (setq a (assoc (match-string 1 l) org-structure-template-alist))
            (null (stringp (cdr a))))
       (org-complete-expand-structure-template (+ -1 (point-at-bol)
                              (match-beginning 1)) a)
       t)))

     (defun org-complete-expand-structure-template (start cell)
       "Expand a structure template."
       (let ((rpl (nth 1 cell))
         (ind ""))
     (delete-region start (point))
     (when (string-match "\\`[ \t]*#\\+" rpl)
       (cond
        ((bolp))
        ((not (string-match "\\S-" (buffer-substring (point-at-bol) (point))))
         (setq ind (buffer-substring (point-at-bol) (point))))
        (t (newline))))
     (setq start (point))
     (when (string-match "%file" rpl)
       (setq rpl (replace-match
              (concat
               "\""
               (save-match-data
             (abbreviate-file-name (read-file-name "Include file: ")))
               "\"")
              t t rpl)))
     (setq rpl (mapconcat 'identity (split-string rpl "\n")
                  (concat "\n" ind)))
     (insert rpl)
     (when (re-search-backward "\\?" start t) (delete-char 1))))

     (advice-add 'org-tempo-add-templates :around #'org+-avoid-old-structure-templates)

     (add-hook 'org-tab-after-check-for-cycling-hook #'org-try-structure-completion)

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