より多くのマークアップで組織モードを拡張する


26

マークアップを追加し、そのようなマークアップの書式設定を<kbd>...</kbd>行います。つまり、そのようなマークアップを囲むボックスを使用します。また、マークアップとの互換性が必要(setq org-hide-emphasis-markers t)です。つまり、変数がに設定されているt場合、<kbd>および</kbd>タグは消え、上記の指定された書式設定の間にテキストが残ります。

この質問に投稿された回答:組織モードでテキストを永続的に強調表示する方法 は、既存のマークアップにのみ適用され、新しいマークアップで組織を拡張しないため、この問題を解決しません



1
@kaushalmodi私は、Orgがそれを見て、それに応じて、そしてタグorg-hide-emphasis-markersをすばやく挿入する方法ではなく、マークアップをで隠すことができるような方法でテキストプロパティを追加するマークアップを追加する方法を尋ねましたkbd
火ドゥ

1
同意する。これはkbdタグに関連していたため、コメントとして追加しました。
カウ


1
@erikstokesは、このソリューションは既存のマークアップにのみ適用可能であり、新しいマークアップには適用できないと述べています。
火ドゥ

回答:


25

私はたようなことをしました。それはフランス語ですが、コードはそれ自体を語るべきです。私が使用したマーカー(私が使用するためにベポのレイアウト)を、そして私が行うとき、押されたボタンのスタイルとしてマークされたテキスト。

私はLispに堪能ではないので、改善の余地があるかもしれません。

私がやったことは、マーカーに使用する場合、マークされたテキストにはボタンが押されたスタイルがあり、エクスポートされるとそれが<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以上では、変更する必要があります

  • org-element-all-objects
  • おそらくorg-element-object-restrictions
  • org-element--set-regexps
  • org-element--object-lex

そしてもちろん、まだ機能を追加します

  • org-element-my-object-keystroke-parser
  • org-element-my-object-keystroke-interpreter

しかし

  • org-element-object-successor-alist
  • org-element-text-markup-successor

削除されました。

助けてくれたCharles C. Berryに感謝します。


ある%マーカーは、内蔵の1?最新のOrgで動作させることはできません。他のマーカーについては、顔を変更してもうまく機能します。しかし、実際に独自のマーカーを追加する方法はありますか?それでも、あなたの答えは役に立ちます。
火ドゥ

%現在、マーカーとして使用されていません。あなたは私が使用したのと同じ方法でそれを使用できます。2番目の質問はわかりませんが、これ 新しいマーカーです。
fredtantini

OK、%マーカーを機能させることはできましたが、を実行する必要がありましたorg-reload。そのコマンドで答えを更新する必要があります。
火ドゥ

実際には必要ありませんorg-reloadorg-mode-restart。重要なのは、変更を有効にするには、以前のOrgバッファーを削除し、新しいバッファーを作成する必要があるということです。
火ドゥ

ヒントをありがとう。回答を更新しました。私が助けることができてうれしい
-fredtantini

0

新しい組織モードマークアップオプションのマーカーを追加することはできないと思います。

この2012年の投稿によると、 org-modeの「エンファシスマーカーはハードコーディングされる」ようです。org-emph-reinをすばやく検索しても、org.el実際にorg-emph-reから生成されるコードは明らかになりませんorg-emphasis-alist。それに基づいて、org-emph-reあなたが追加したものを検索しないように見えますorg-emphasis-alist

これは私の経験で(私は既存の強調マーカーを再定義することができますが、ORG-modeは認識することができませんでした一貫性のある|または&またはH)。

私はここの専門家ではありませんが、私が間違っていることを知りたいです:)


1
単に編集してorg-emphasis-alistも新しいマーカーは追加されません。あなたも追加で作業する必要がありorg-font-lock-extra-keywordsます。この答えは、実用的なソリューションを提供します。
ディーン・ソ

ねえ、それは動作します!少なくとも、それは同じ効果を達成します!:)を使用する場合、明らかorg-font-lock-extra-keywordsに変更する必要はまったくありませんorg-emphasis-alistorg-font-lock...コードを追加しましたがorg-emphasis-alist、現在の形式は変更されていません)
MikeTheTall
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.