Texte en ligne et code avec guillemets en mode Org

37

En mode Org, je peux entourer du texte avec =ou ~pour le placer en mode texte ou code inline .

Toutefois, cela échoue si le texte contient des guillemets et que je ne trouve pas d'explication ou de solution de contournement dans la documentation .

Par exemple:

  • =hello= Rend textuellement
  • ~hello~ Rendus sous forme de code
  • =hello'= Ne réussit pas à rendre un compte rendu textuel
  • ~hello'~ Ne réussit pas à rendre le code

La seule solution que j'ai trouvée jusqu'ici consiste à insérer des caractères invisibles, par exemple en tapant C-x 8 <RET> 200b <RET>, comme expliqué dans cette question .

Pourquoi est-ce (est-ce un bug?) Et comment puis-je éviter ce problème sans insérer de caractères invisibles?

Amelio Vazquez-Reina
la source

Réponses:

47

Tout d'abord: c'est Emacs. Ce n'est pas un bug, c'est un paramètre!

Deuxièmement, @glucas a raison de dire que vous devez modifierorg-emphasis-regexp-components pour obtenir ce que vous voulez. Cependant, je voudrais suggérer deux modifications à son code (@ Malabarba) et fournir un peu plus de contexte:

  1. Vous n'avez pas besoin de copier la valeur entière de org-emphasis-regexp-componentsdans votre fichier init pour modifier un seul composant. Ce qui suit suffit pour votre cas d'utilisation:

    (setcar (nthcdr 2 org-emphasis-regexp-components) " \t\r\n,\"")
  2. Vous n'avez pas à modifier org-emphasis-regexp-componentsavant de charger org-modevia (require 'org). Ajoutez simplement la ligne suivante après vos modifications:

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

Plus de contexte

Si vous souhaitez personnaliser d'autres aspects du fonctionnement du balisage d'emphase org-mode, sachez ceci:

La valeur de org-emphasis-regexp-componentsest une liste de cinq entrées.

  1. La première entrée contrôle les caractères autorisés à précéder immédiatement les caractères de marquage. Si vous voulez pouvoir rendre quelque chose comme why=hello=rendu correctement, vous devrez modifier cette entrée.

    (setcar org-emphasis-regexp-components "...")
  2. La deuxième entrée contrôle quels caractères sont autorisés à suivre immédiatement les caractères de marquage. Si vous voulez pouvoir rendre quelque chose comme =hello=thererendu correctement, vous devrez modifier cette entrée.

    (setcar (nthcdr 1 org-emphasis-regexp-components) "...")
  3. La troisième entrée spécifie les caractères qui ne sont pas autorisés en tant que caractères de bordure , c'est-à-dire les caractères qui suivent immédiatement un caractère de marquage d'ouverture ou précédent un caractère de marquage de fermeture. Vous devrez modifier cela pour rendre les choses comme ='hello'=rendre correctement.

    (setcar (nthcdr 2 org-emphasis-regexp-components) "...")
  4. La quatrième entrée répertorie les caractères autorisés dans le corps de votre chaîne de caractères marquée, c’est-à-dire les caractères qui apparaissent entre les caractères de bordure. Vous aurez rarement besoin de modifier cela. Par défaut, tout caractère est autorisé en tant que caractère du corps.

    (setcar (nthcdr 3 org-emphasis-regexp-components) "...")
  5. La cinquième entrée spécifie le nombre de nouvelles lignes autorisées dans une expression marquée. Par défaut, org-modeautorise une seule nouvelle ligne. Par conséquent, si vous souhaitez pouvoir ajouter du balisage à un texte s'étendant sur plus de deux lignes consécutives, vous devez modifier cette entrée.

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

    ... où Nest le nombre de nouvelles lignes que vous souhaitez autoriser.

Articles Similaires

Les gens semblent se heurter assez fréquemment à ce problème. En plus du message que vous avez mentionné , il y a au moins deux autres questions sur StackOverflow qui traitent de problèmes très similaires:

itsjeyd
la source
7
J'ai voté pour votre réponse, mais je voudrais également faire l'éloge de la qualité de la réponse.
Kaushal Modi
Merci @itsjeyd Cela fonctionne très bien si je lance ces deux lignes de manière interactive une fois que Emacs est complètement chargé avec mes tampons déjà ouverts. Cependant, et assez étrangement, je me heurte "Symbol's value as variable is void: org-emphasis-regexp-components"même si je place ces deux lignes au bas de mon .emacsdossier. Des idées sur pourquoi cela pourrait être le cas?
Amelio Vazquez-Reina
@ AmelioVazquez-Reina Vous êtes les bienvenus :) Juste pour vous assurer: avez-vous (require 'org)dans votre .emacsfichier avant de procéder à des personnalisations org-emphasis-regexp-components?
itsjeyd
1
@ AmelioVazquez-Reina Je suis heureux que tout fonctionne correctement pour vous maintenant :) Vos observations sont correctes - vous n'avez pas besoin de (require 'org)le spécifier dans votre fichier init pour pouvoir l'utiliser. Si vous ne le faites pas, Emacs le chargera automatiquement lorsque vous: (a) ouvrez un .orgfichier pour la première fois de la session en cours, ou (b) activez le mode manuellement via M-x org-modepour la première fois de la session en cours, ou (c ) lorsqu’il restaure un bureau enregistré comprenant au moins un .orgfichier. (suite)
15h15
1
@ AmelioVazquez-Reina (suite) Le problème est le suivant : Emacs ne se charge pasorg-mode automatiquement car vous lui avez attribué des personnalisations dans votre fichier d'initialisation. C'est pourquoi vous devez le faire (require 'org)avant de personnaliser l'une de ses variables. Sans charger complètement le mode, Emacs ne saura pas quoi faire avec des variables telles que org-emphasis-regexp-components; ils ne sont pas définis lors de leur première rencontre par Emacs, d'où le Symbol's value as variable is voidmessage.
Itsjeyd
11

Il existe une option beaucoup plus simple: utilisez des blocs source inline :

src_python{hello'}

Cela fonctionne sans problème pour les caractères tels que les guillemets et fournit une coloration syntaxique pour le code en ligne.

Pour inclure le code source intégré lors de l'exportation, vous souhaitez ajouter cette déclaration à l'en-tête:

#+PROPERTY: header-args :exports code
Clément
la source
1
C'est un bon conseil! Très agréable d'avoir la coloration syntaxique pour le code en ligne!
Shon
C'est bien! Cela me rappelle Latex (:
Chris.Q,
7

Vous pouvez supprimer les caractères de citation org-emphasis-regexp-componentstels que décrits par @Malabarba dans cet article de blog .

Le code pertinent de ce post:

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

Voir la chaîne de documentation pour org-emphasis-regexp-components: par défaut, les guillemets sont pris en compte:

border - Les caractères interdits comme caractères de bordure.

glucas
la source