Inline wörtlich und Code mit Anführungszeichen im Org-Modus

37

Im Org-Modus kann ich Text mit =oder umschließen ~, um ihn im Inline -Modus im Wort- oder Codemodus zu platzieren.

Dies schlägt jedoch fehl, wenn der Text Anführungszeichen enthält und ich in der Dokumentation keine Erklärung oder Problemumgehung gefunden habe .

Beispielsweise:

  • =hello= Rendert als wörtlich
  • ~hello~ Rendert als Code
  • =hello'= Kann nicht als wörtlich dargestellt werden
  • ~hello'~ Kann nicht als Code gerendert werden

Die einzige Lösung, die ich bisher gefunden habe, ist das Einfügen unsichtbarer Zeichen, z. B. Tippen C-x 8 <RET> 200b <RET>, wie in dieser Frage erläutert .

Warum ist das so (ist es ein Fehler?) Und wie kann ich dieses Problem vermeiden, ohne unsichtbare Zeichen einzufügen?

Amelio Vazquez-Reina
quelle

Antworten:

47

Zuallererst: Das ist Emacs. Es ist kein Fehler, es ist eine Einstellung!

Zweitens sagt @glucas zu Recht, dass Sie Änderungenorg-emphasis-regexp-components vornehmen müssen, um das zu erhalten, was Sie wollen. Ich möchte jedoch zwei Änderungen an seinem (@ Malabarbas) Code vorschlagen und etwas mehr Kontext bereitstellen:

  1. Sie müssen nicht den gesamten Wert von org-emphasis-regexp-componentsin Ihre Init-Datei kopieren , um eine einzelne Komponente zu ändern. Für Ihren Anwendungsfall ist Folgendes ausreichend:

    (setcar (nthcdr 2 org-emphasis-regexp-components) " \t\r\n,\"")
  2. Sie müssen nicht müssen ändern org-emphasis-regexp-componentsvor dem Laden org-modeüber (require 'org). Fügen Sie nach Ihren Änderungen einfach die folgende Zeile hinzu:

    (org-set-emph-re 'org-emphasis-regexp-components org-emphasis-regexp-components)

Mehr Kontext

Wenn Sie andere Aspekte der Hervorhebungsmarkierung anpassen möchten, gehen Sie folgendermaßen vor org-mode:

Der Wert von org-emphasis-regexp-componentsist eine Liste mit fünf Einträgen.

  1. Der erste Eintrag steuert, welche Zeichen Markup-Zeichen unmittelbar vorangehen dürfen . Wenn Sie in der Lage sein möchten, etwas wie why=hello=korrekt zu rendern, müssen Sie diesen Eintrag ändern.

    (setcar org-emphasis-regexp-components "...")
  2. Der zweite Eintrag steuert, welche Zeichen unmittelbar auf Markup-Zeichen folgen dürfen . Wenn Sie in der Lage sein möchten, etwas wie =hello=therekorrekt zu rendern, müssen Sie diesen Eintrag ändern.

    (setcar (nthcdr 1 org-emphasis-regexp-components) "...")
  3. Der dritte Eintrag gibt die Zeichen an, die nicht als Randzeichen zulässig sind , dh Zeichen, die unmittelbar auf ein öffnendes Markup-Zeichen oder vor einem schließenden Markup-Zeichen folgen. Sie müssen dies ändern, um Dinge wie ='hello'=korrekt rendern zu können.

    (setcar (nthcdr 2 org-emphasis-regexp-components) "...")
  4. Der vierte Eintrag listet Zeichen auf, die im Hauptteil Ihrer markierten Zeichenfolge zulässig sind, dh Zeichen, die zwischen den Randzeichen stehen. Sie müssen dies selten ändern. Standardmäßig ist jedes Zeichen als Körperzeichen zulässig.

    (setcar (nthcdr 3 org-emphasis-regexp-components) "...")
  5. Der fünfte Eintrag gibt an, wie viele Zeilenumbrüche in einem markierten Ausdruck zulässig sind. Standardmäßig ist org-modeeine einzelne Zeile zulässig. Wenn Sie also Text, der mehr als zwei aufeinander folgende Zeilen umfasst, mit einem Markup versehen möchten, müssen Sie diesen Eintrag ändern.

    (setcar (nthcdr 4 org-emphasis-regexp-components) N)

    ... wo Nist die Anzahl der Zeilenumbrüche, die Sie zulassen möchten.

Zusammenhängende Posts

Leute scheinen ziemlich häufig auf dieses Problem zu stoßen. Abgesehen von dem Beitrag, den Sie erwähnt haben , gibt es mindestens zwei weitere Fragen zu StackOverflow, die sich mit sehr ähnlichen Problemen befassen:

itsjeyd
quelle
7
Ich habe Ihre Antwort positiv bewertet, möchte aber auch die Qualität der Antwort loben.
Kaushal Modi
Danke @itsjeyd Das funktioniert super, wenn ich diese beiden Zeilen interaktiv starte, sobald Emacs vollständig geladen ist und meine Puffer bereits geöffnet sind. Seltsamerweise stoße ich jedoch "Symbol's value as variable is void: org-emphasis-regexp-components"auch dann auf diese beiden Zeilen, wenn ich sie ganz unten in meiner .emacsDatei platziere. Irgendwelche Gedanken darüber, warum das der Fall sein könnte?
Amelio Vazquez-Reina
@ AmelioVazquez-Reina Gern geschehen :) Nur um sicherzugehen: Machst du (require 'org)in deiner .emacsDatei noch irgendwelche Anpassungen an org-emphasis-regexp-components?
itsjeyd
1
@ AmelioVazquez-Reina Ich bin froh, dass jetzt alles richtig für dich funktioniert :) Deine Beobachtungen sind korrekt - du musst nicht (require 'org)in deiner Init-Datei sein, um sie verwenden zu können. Andernfalls wird Emacs automatisch geladen, wenn Sie: (a) eine .orgDatei zum ersten Mal in der aktuellen Sitzung öffnen oder (b) den Modus M-x org-modezum ersten Mal in der aktuellen Sitzung manuell über aktivieren oder (c ), wenn ein gespeicherter Desktop wiederhergestellt wird, der mindestens eine .orgDatei enthält. (Forts.)
itsjeyd
1
@ AmelioVazquez-Reina (Forts.) Die Sache ist : Emacs wird nichtorg-mode automatisch geladen , nur weil Sie einige Anpassungen dafür in Ihre Init-Datei geschrieben haben. Aus diesem Grund müssen Sie (require 'org)eine der Variablen anpassen , bevor Sie sie anpassen. Ohne den Modus vollständig zu laden, weiß Emacs nicht, was mit Variablen wie zu tun ist org-emphasis-regexp-components. Sie sind nicht definiert, wenn Emacs sie zum ersten Mal trifft, daher die Symbol's value as variable is voidNachricht.
Itsjeyd
11

Es gibt eine viel einfachere Option: Verwenden Sie Inline-Quellblöcke :

src_python{hello'}

Dies funktioniert problemlos für Zeichen wie Anführungszeichen und bietet Syntaxhervorhebungen für Inline-Code.

Um den Inline-Quellcode beim Export einzuschließen, fügen Sie diese Deklaration in die Kopfzeile ein:

#+PROPERTY: header-args :exports code
Clément
quelle
1
Das ist ein toller Tipp! Sehr schön, Syntax-Hervorhebung für Inline-Code zu bekommen!
Shon
Das ist toll! Es erinnert mich an Latex (:
Chris.Q
7

Sie können die Anführungszeichen entfernen, org-emphasis-regexp-componentswie von @Malabarba in diesem Blog-Beitrag beschrieben .

Der relevante Code aus diesem Beitrag:

;; This HAS to come before (require 'org)
(setq org-emphasis-regexp-components
      '("     ('\"{“”"
        "-   .,!?;''“”\")}/\\“”"
        "    \r\n,"
        "."
        1))

In der Dokumentzeichenfolge finden Sie org-emphasis-regexp-components: Standardmäßig werden die Anführungszeichen berücksichtigt:

border - Die als Border-Zeichen verbotenen Zeichen.

Glucas
quelle