Có thể thêm các mẫu khác ngoài # + BEGIN_ # + END_ vào org-architecture-template-alist không?


9

Tôi đã nhận thấy rằng org-architecture-template-alist đã thay đổi (Tôi đang sử dụng phiên bản org-mode 9.2) để tự động mở rộng sang #+BEGIN_<some block tag> #+END_<some block tag>. Tôi tự hỏi nếu nó có thể thêm các loại mẫu khác nhau. Ví dụ một :PROPERTIES:<some properties>:END:mẫu.

Có thể hay tôi nên chuyển sang gói khác như yasnippets?

Câu trả lời:


9

CẬP NHẬT:

Không nhận thấy rằng Chế độ Org 9.2 đã thay đổi cơ chế mở rộng mẫu, trong đó org-structure-template-alistchỉ dành cho các khối được xác định bởi "#+BEGIN_""#+END_". Và nhập như thế ("p" ":PROPERTIES:?:END:")không còn được chấp nhận.

Như đã đề cập trong liên kết trên, mẫu "phức tạp" khác có thể được xác định bởi hàm tempo-define-templatevà org-tempo phải được tải ( (require 'org-tempo)). Trên thực tế, các mục nhập org-structure-template-alist được chuyển đổi org-tempo-tagsqua tempo-define-templatebởi org-tempoorg-tempo-tagsmặc định là:

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

Đối với trường hợp của bạn, bạn có thể xác định một mẫu bằng cách:

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

Câu trả lời dưới đây chỉ hoạt động cho phiên bản chế độ Org trước 9.2

Có, bạn có thể thêm một mục vào nó như thế này:

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

Sau đó, trong tệp org, bạn nhập <pTAB, nó sẽ mở rộng sang thuộc tính và để lại điểm tại vị trí của ?.

Và bạn có thể tìm thêm chi tiết trong tài liệu về biến bằng cách gõ C-h v org-structure-template-alist RET.


Câu trả lời rất hữu ích, cảm ơn. Btw, Là >biểu tượng trên tempo-define-templatemột lỗi đánh máy? Nếu không .... vai trò của nó trong định nghĩa là gì?
Dox

1
Vui mừng nó giúp :) Không phải là một lỗi đánh máy, nó có nghĩa là dòng sẽ được thụt vào, tempo-define-templateđược xây dựng-in defun, xem docstring để biết chi tiết.
whatacold

2

Tần suất mà họ đưa ra các thay đổi không tương thích trong việc tùy chỉnh chế độ org thực sự đáng tiếc.

Đoạn mã sau cung cấp cho bạn các mẫu cấu trúc cũ của chế độ org trước phiên bản 9.2 trở lại. Chức năng org-complete-expand-structure-templatenày là một bản sao thuần túy từ phiên bản 9.1 và org-try-structure-completionlà phiên bản sửa đổi một chút của phiên bản 9.1 đó. (Tôi đã thêm một kiểm tra loại ở đó.)

Sau khi cài đặt mã đó, bạn có thể sử dụng lại mẫu cũ của mình
(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)
     ))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.