Erweiterung des Org-Modus um weitere Markups

26

Ich möchte ein Markup und eine Formatierung für ein solches Markup hinzufügen, dh <kbd>...</kbd>ein Kästchen umgibt ein solches Markup. Ich möchte auch, dass die Markierung mit kompatibel ist (setq org-hide-emphasis-markers t). Das heißt, wenn die Variable auf gesetzt ist, tsollten die Tags <kbd>und </kbd>verschwinden und der Text dazwischen mit der oben angegebenen Formatierung verbleiben.

Die Antwort auf diese Frage gestellt: Wie Text markieren dauerhaft in org-Modus nicht lösen dieses Problem, da es nur für bestehende Markups, nicht Org erstreckt , um mit neuen Markups.

Tu Do
quelle
1
@kaushalmodi Ich fragte, wie man eine Markierung hinzufügt, die, wenn sie von Org gesehen wird, Texteigenschaften entsprechend hinzufügt und so, dass die Markierung ausgeblendet werden kann org-hide-emphasis-markers, und nicht, wie man schnell ein kbdTag einfügt.
Tu Do
1
Genau. Ich habe dies als Kommentar hinzugefügt, da es sich um kbd-Tags handelt.
Kaushal Modi
2
mögliches Duplikat von So markieren Sie Text dauerhaft im
Organisationsmodus
1
@erikstokes Diese Lösung gilt nur für vorhandene Markups, nicht für neue.
Tu Do

Antworten:

25

Ich habe etwas Ähnliches gemacht . Es ist auf Französisch, aber der Code sollte für sich selbst sprechen. Ich verwende für den Marker (ich verwende ein bepo- Layout) und wenn ich das tue, den markierten Text als Druckknopfstil.

Ich spreche nicht fließend Lispeln, so dass möglicherweise Raum für Verbesserungen besteht.

Was ich getan habe, ist, dass der markierte Text , wenn er als Markierung verwendet wird, einen Druckknopfstil hat und beim Exportieren in übersetzt wird<kbd>

Zuerst musste ich ein neues Gesicht definieren:

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

Dann passen Sie an 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

Für den Export, müssen Sie laden ox.elmit (require 'ox).

Jedes Mal, wenn boldoder codein einer Funktion (in ox-org.el) erscheint, habe ich eine ähnliche Funktion erstellt (oder vorhandene geändert):

;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))))))

Als nächstes habe ich ein my-htmlBackend für den Export definiert:

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

Wenn ich es verwende, wird C-c C-e h res korrekt exportiert:

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Wie von OP in Kommentaren vorgeschlagen, müssen Sie möglicherweise Ihren Puffer verwenden org-mode-restart(oder org-reload) oder töten / neu laden.


Bearbeiten: Dies funktioniert im Org-Modus mit Versionen vor 8.3 (dh bis 8.2.10)

Mit Versionen ≥8.3.1 muss ich modifizieren

  • org-element-all-objects
  • möglicherweise org-element-objekt-einschränkungen
  • org-element - set-regexps
  • org-Element - Objekt-Lex

und natürlich noch die funktionen hinzufügen

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

aber

  • org-element-objekt-nachfolger-alist
  • Org-Element-Text-Markup-Nachfolger

sind nun gelöscht.

Vielen Dank an Charles C. Berry für seine Hilfe.

fredtantini
quelle
Ist %marker eingebaut? Ich kann es mit der neuesten Org nicht zum Laufen bringen. Wie bei anderen Markern funktioniert es gut, wenn ich ihre Gesichter ändere. Aber gibt es eine Möglichkeit, unsere eigenen Marker wirklich hinzuzufügen? Trotzdem ist Ihre Antwort nützlich.
Tu Do
%wird derzeit nicht als Marker verwendet. Sie können es genauso verwenden, wie ich es verwendet habe . Ich verstehe Ihre zweite Frage nicht, ist ein neuer Marker.
Fredtantini
Ok, ich konnte den %Marker zum Laufen bringen, musste aber rennen org-reload. Sie sollten die Antwort mit diesem Befehl aktualisieren.
Tu Do
Eigentlich brauchen wir nicht , org-reloadaber org-mode-restart. Die Sache ist, wir müssen den vorherigen Org-Puffer löschen und einen neuen erstellen, damit die Änderung wirksam wird.
Tu Do
Danke für die Tipps. Ich habe meine Antwort aktualisiert. Ich bin froh, dass ich helfen konnte
fredtantini
0

Ich glaube nicht, dass es möglich ist, Marker für neue Markup-Optionen im Organisationsmodus hinzuzufügen.

Laut diesem Beitrag aus dem Jahr 2012 sieht es so aus, als ob die Hervorhebungsmarkierungen von org-mode fest codiert wären. Bei einer schnellen Suche nach org-emph-rein org.elwird kein Code angezeigt, org-emph-reaus dem tatsächlich generiert wird org-emphasis-alist. Auf dieser Basis wird anscheinend org-emph-renicht nach etwas gesucht, das Sie hinzufügen org-emphasis-alist.

Dies steht im Einklang mit meiner Erfahrung (ich kann die vorhandenen Hervorhebungsmarkierungen neu definieren, kann aber den Organisationsmodus nicht erkennen |oder &oder H).

Ich bin hier allerdings kein Experte und würde gerne herausfinden, dass ich falsch liege :)

MikeTheTall
quelle
1
Durch einfaches Bearbeiten org-emphasis-alistwird kein neuer Marker hinzugefügt. Sie müssen zusätzlich mit arbeiten org-font-lock-extra-keywords. Diese Antwort gibt eine funktionierende Lösung.
Dean Seo
Hey, das funktioniert! Zumindest erzielt das den gleichen Effekt! :) Wenn man verwendet das org-font-lock-extra-keywordsdann ein nicht zu ändern braucht org-emphasis-alistüberhaupt, (habe ich den offenbar org-font-lock...Code aber meine nicht ändern org-emphasis-alistund nun die Dinge formatiert)
MikeTheTall