Tôi đã làm một cái gì đó tương tự . Đó là tiếng Pháp, nhưng mã nên nói cho chính nó. Tôi sử dụng ‰
cho điểm đánh dấu (tôi sử dụng bố cục bepo ) và khi tôi thực hiện, văn bản được đánh dấu là kiểu nhấn nút.
Tôi không thông thạo lisp, vì vậy có thể có chỗ để cải thiện.
Những gì tôi đã làm là, khi sử dụng ‰
để đánh dấu, văn bản được đánh dấu có kiểu nhấn nút và khi xuất ra, nó được dịch thành<kbd>
Đầu tiên, tôi phải xác định một khuôn mặt mới:
(defface my-face-org-keystroke
'((t (:inherit shadow
:box (:line-width -2 ;neg. in order to keep the same size of lines
:color "grey75"
:style pressed-button)))) "Face for keystrokes"
:group 'org-faces)
Sau đó tùy chỉnh org-emphasis-alist
:
(("*" bold)
("/" italic)
("_" underline)
("=" org-code verbatim)
("~" org-verbatim verbatim)
("+"
(:strike-through t))
("‰" my-face-org-keystroke verbatim));This line is what you want to add
Để xuất, bạn có thể cần tải ox.el
với (require 'ox)
.
Sau đó, mỗi lần bold
hoặc code
xuất hiện trong một hàm (in ox-org.el
), tôi đã tạo một hàm tương tự (hoặc sửa đổi các hàm hiện có):
;creation
(defun org-html-keystroke (keystroke contents info)
"Transcode KEYSTROKE from Org to HTML.
CONTENTS is nil. INFO is a plist holding contextual
information."
(format (or (cdr (assq 'my-object-keystroke org-html-text-markup-alist)) "%s")
(org-html-encode-plain-text (org-element-property :value keystroke))))
;creation
(defun org-element-my-object-keystroke-parser ()
"Parse code object at point.
Return a list whose CAR is `my-object-keystroke' and CDR is a plist with
`:value', `:begin', `:end' and `:post-blank' keywords.
Assume point is at the first tilde marker."
(interactive)
(save-excursion
(unless (bolp) (backward-char 1))
(looking-at org-emph-re)
(let ((begin (match-beginning 2))
(value (org-match-string-no-properties 4))
(post-blank (progn (goto-char (match-end 2))
(skip-chars-forward " \t")))
(end (point)))
(list 'my-object-keystroke
(list :value value
:begin begin
:end end
:post-blank post-blank)))))
;creation
(defun org-element-my-object-keystroke-interpreter (keystroke contents)
"Interpret KEYSTROKE object as Org syntax.
CONTENTS is nil."
(format "‰%s‰" (org-element-property :value keystroke)))
;modification
(defconst org-element-object-successor-alist
'((subscript . sub/superscript) (superscript . sub/superscript)
(bold . text-markup) (code . text-markup) (italic . text-markup)
(strike-through . text-markup) (underline . text-markup)
(verbatim . text-markup) (entity . latex-or-entity)
(latex-fragment . latex-or-entity) (my-object-keystroke . text-markup))
"Alist of translations between object type and successor name.
Sharing the same successor comes handy when, for example, the
regexp matching one object can also match the other object.")
;modification
(defconst org-element-all-objects
'(bold code entity export-snippet footnote-reference inline-babel-call
inline-src-block italic line-break latex-fragment link macro
radio-target statistics-cookie strike-through subscript superscript
table-cell target timestamp underline verbatim my-object-keystroke)
"Complete list of object types.")
;modification
(defun org-element-text-markup-successor ()
"Search for the next text-markup object.
Return value is a cons cell whose CAR is a symbol among `bold',
`italic', `underline', `strike-through', `code' and `verbatim'
and CDR is beginning position."
(save-excursion
(unless (bolp) (backward-char))
(when (re-search-forward org-emph-re nil t)
(let ((marker (match-string 3)))
(cons (cond
((equal marker "*") 'bold)
((equal marker "/") 'italic)
((equal marker "_") 'underline)
((equal marker "+") 'strike-through)
((equal marker "~") 'code)
((equal marker "=") 'verbatim)
((equal marker "‰") 'my-object-keystroke)
(t (error "Unknown marker at %d" (match-beginning 3))))
(match-beginning 2))))))
Tiếp theo, tôi đã xác định một my-html
phụ trợ cho xuất khẩu:
(org-export-define-derived-backend 'my-html 'html
:translate-alist '((my-object-keystroke . org-html-keystroke))
:menu-entry ' (?h 1
((?r "my-html" org-html-export-to-my-html))))
(defun org-html-export-to-my-html
(&optional async subtreep visible-only body-only ext-plist)
"Export current buffer to a HTML file.
Return output file's name."
(interactive)
(let* ((extension (concat "." org-html-extension))
(file (org-export-output-file-name extension subtreep))
(org-export-coding-system org-html-coding-system))
(org-export-to-file 'my-html file
async subtreep visible-only body-only ext-plist)))
(defun org-html-publish-to-my-html (plist filename pub-dir)
"Publish an org file to my-html.
Return output file name."
(org-publish-org-to 'my-html filename
(concat "." (or (plist-get plist :html-extension)
org-html-extension "html"))
plist pub-dir))
(defun org-html-convert-region-to-my-html ()
"Assume the current region has org-mode syntax, and convert it to HTML.
This can be used in any buffer. For example, you can write an
itemized list in org-mode syntax in an HTML buffer and use this
command to convert it."
(interactive)
(org-export-replace-region-by 'my-html))
Vì vậy, khi tôi sử dụng, C-c C-e h r
nó được xuất chính xác:
Theo đề xuất của OP trong các bình luận, bạn có thể cần phải sử dụng org-mode-restart
(hoặc org-reload
) hoặc giết / tải lại bộ đệm của mình.
Chỉnh sửa: Điều này hoạt động cho chế độ org với các phiên bản trước 8.3 (tức là đến 8.2.10)
Với phiên bản ≥8.3.1, tôi phải sửa đổi
- org-Element-all-object
- có thể hạn chế org-yếu tố-đối tượng
- phần tử org - set-regexps
- phần tử org - object-lex
và tất nhiên vẫn thêm các chức năng
- org-Element-my-object-keystroke-Parser
- org-Element-my-object-keystroke-phiên dịch
nhưng
- org-Element-object-kế-alist
- org-yếu tố-văn bản-đánh dấu-kế
hiện đang bị xóa.
Cảm ơn Charles C. Berry đã giúp đỡ.