我想为这种标记添加标记和格式,即<kbd>...</kbd>
用方框包围这种标记。我还希望该标记与兼容(setq org-hide-emphasis-markers t)
。也就是说,当变量被设置为t
,在<kbd>
和</kbd>
标签应消失,留下具有指定上述格式化的文本。
张贴在这个问题的答案:如何永久地突出显示文本的组织模式 不解决这个问题,因为它仅适用于现有的标记,不延长组织新的标记。
org-hide-emphasis-markers
,而不是如何快速插入kbd
标记。
我想为这种标记添加标记和格式,即<kbd>...</kbd>
用方框包围这种标记。我还希望该标记与兼容(setq org-hide-emphasis-markers t)
。也就是说,当变量被设置为t
,在<kbd>
和</kbd>
标签应消失,留下具有指定上述格式化的文本。
张贴在这个问题的答案:如何永久地突出显示文本的组织模式 不解决这个问题,因为它仅适用于现有的标记,不延长组织新的标记。
org-hide-emphasis-markers
,而不是如何快速插入kbd
标记。
Answers:
我做了类似的事情。它是法文,但代码应能说明一切。我使用‰
标记(我使用bepo布局),然后使用标记的文本作为按钮样式。
我的口语不流利,所以可能还有改进的余地。
我所做的是,当‰
用于标记时,标记的文本具有按钮式的样式,并且在导出时将其翻译为<kbd>
首先,我必须定义一张新面孔:
(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)
然后自定义 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
对于出口,你可能需要载入ox.el
用(require 'ox)
。
然后,每次bold
或code
出现在一个函数中(ox-org.el
),我都创建了一个类似的函数(或修改了现有函数):
;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))))))
接下来,我my-html
为导出定义了一个后端:
(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))
因此,当我使用C-c C-e h r
它时,可以正确导出:
如OP在注释中所建议,您可能需要使用org-mode-restart
(或org-reload
)或杀死/重新加载缓冲区。
编辑:这适用于8.3之前的组织模式(到8.2.10为止)
对于版本≥8.3.1,我必须进行修改
并且当然仍然添加功能
但
现在已删除。
感谢Charles C. Berry的帮助。
%
标记内置一个?我无法使其与最新的组织一起使用。至于其他标记,如果我换了脸,效果很好。但是,有没有一种方法可以真正添加我们自己的标记?尽管如此,您的答案还是有用的。
%
当前不用作标记。您可以像以前一样使用它‰
。不过,我不明白您的第二个问题‰
是一个新的标记。
%
标记器工作,但是我必须跑步org-reload
。您应该使用该命令更新答案。
org-reload
,但org-mode-restart
。关键是,我们必须杀死以前的Org缓冲区并创建一个新缓冲区,以使更改生效。
我认为不可能为新的组织模式标记选项添加标记。
根据这份2012年的帖子,看起来组织模式的“重点标记将被硬编码”。快速搜索org-emph-re
in org.el
不会显示任何实际org-emph-re
从中生成的代码org-emphasis-alist
。基于此,似乎org-emph-re
不会搜索您添加到的任何内容org-emphasis-alist
。
这与我的经验是一致的(我可以重新定义现有的重点标记,但无法通过组织模式来识别|
或&
或H
)。
我不是这里的专家,但很想知道我错了:)
org-font-lock-extra-keywords
一个人根本不需要更改org-emphasis-alist
,显然(我添加了org-font-lock...
代码,但没有更改我的org-emphasis-alist
东西,现在东西已经格式化了)