使用更多标记扩展组织模式


26

我想为这种标记添加标记和格式,即<kbd>...</kbd>用方框包围这种标记。我还希望该标记与兼容(setq org-hide-emphasis-markers t)。也就是说,当变量被设置为t,在<kbd></kbd>标签应消失,留下具有指定上述格式化的文本。

张贴在这个问题的答案:如何永久地突出显示文本的组织模式 解决这个问题,因为它仅适用于现有的标记,不延长组织新的标记。



1
@kaushalmodi我问过如何添加标记,当组织看到它时,它会相应地添加文本属性,并以某种方式使标记可以被隐藏org-hide-emphasis-markers,而不是如何快速插入kbd标记。
Tu Do

1
我同意。我将其作为注释,因为它与kbd标签有关。
2015年


1
@erikstokes,该解决方案仅适用于现有的标记,不适用于新的标记。
Tu Do

Answers:


25

我做了类似的事情。它是法文,但代码应能说明一切。我使用标记(我使用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)

然后,每次boldcode出现在一个函数中(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,我必须进行修改

  • 组织元素所有对象
  • 可能是组织元素对象限制
  • org-element--set-regexps
  • 组织元素-对象词法

并且当然仍然添加功能

  • 组织元素我的对象击键解析器
  • 组织元素我的对象击键解释器

  • 组织元素对象继任者
  • org-element-text-markup-successor

现在已删除。

感谢Charles C. Berry的帮助。


%标记内置一个?我无法使其与最新的组织一起使用。至于其他标记,如果我换了脸,效果很好。但是,有没有一种方法可以真正添加我们自己的标记?尽管如此,您的答案还是有用的。
2015年

%当前不用作标记。您可以像以前一样使用它。不过,我不明白您的第二个问题 一个新的标记。
fredtantini

好的,我能够使%标记器工作,但是我必须跑步org-reload。您应该使用该命令更新答案。
涂杜(Do Do)

其实,我们并不需要org-reload,但org-mode-restart。关键是,我们必须杀死以前的Org缓冲区并创建一个新缓冲区,以使更改生效。
Tu Do Do

感谢您的提示。我已经更新了答案。很高兴能为您提供帮助
fredtantini 2015年

0

我认为不可能为新的组织模式标记选项添加标记。

根据这份2012年的帖子,看起来组织模式的“重点标记将被硬编码”。快速搜索org-emph-rein org.el不会显示任何实际org-emph-re从中生成的代码org-emphasis-alist。基于此,似乎org-emph-re不会搜索您添加到的任何内容org-emphasis-alist

这与我的经验是一致的(我可以重新定义现有的重点标记,但无法通过组织模式来识别|&H)。

我不是这里的专家,但很想知道我错了:)


1
只需编辑org-emphasis-alist就不会添加新标记。您还必须另外与之合作org-font-lock-extra-keywords这个答案给出了一个可行的解决方案。
院长徐

嘿,行得通!至少,达到相同的效果!:)当一个人使用时,org-font-lock-extra-keywords一个人根本不需要更改org-emphasis-alist,显然(我添加了org-font-lock...代码,但没有更改我的org-emphasis-alist东西,现在东西已经格式化了)
MikeTheTall
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.