#+ 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:テンプレート。

それは可能ですか、それともyasnippetsなどの別のパッケージを使用する必要がありますか?

回答:


9

更新:

ことを気づいていない組織モード9.2は、テンプレート展開のメカニズム、変更org-structure-template-alistのみで定義されたブロックのためである"#+BEGIN_"とします"#+END_"。そして、様のエントリー("p" ":PROPERTIES:?:END:")はもはや受け付けられません。

上記のリンクで述べたように、他の「複雑な」テンプレートはfunction tempo-define-templateで定義でき、org-tempoをロードする必要があります((require 'org-tempo))。実際、のエントリはによってviaにorg-structure-template-alist 変換され、デフォルトは次のとおりです。org-tempo-tagstempo-define-templateorg-tempoorg-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より前のOrgモードバージョンでのみ機能します

はい、次のようにエントリを追加できます。

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

次に、orgファイルで「<pand TAB」と入力すると、プロパティに展開され、ポイントがの位置に残ります?

また、変数のドキュメントで詳細を見つけるには、と入力しますC-h v org-structure-template-alist RET


非常に役立つ回答、ありがとうございます。ところで、>記号tempo-define-templateはタイプミスですか?そうでない場合...定義におけるそれの役割は何ですか?
Doxの

1
それが役に立てて嬉しい:)タイプミスではなく、行がインデントされ、tempo-define-template組み込みのdefunであることを意味します。詳細については、docstringを参照してください。
whatacold

2

彼らが組織モードのカスタマイズに互換性のない変更を導入する頻度は、本当に残念です。

次のコードは、バージョン9.2より前のorg-modeの古い構造テンプレートを提供します。この関数org-complete-expand-structure-templateはバージョン9.1からの純粋なコピーであり、9.1のorg-try-structure-completionバージョンのわずかに変更されたバージョンです。(そこに型チェックを追加しました。)

そのコードをインストールしたら、古いテンプレートを
(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.