In linea testuale e codice con virgolette in modalità Org


37

In modalità Org posso circondare il testo con =o ~per posizionare il testo in modalità testuale o di codice in linea .

Tuttavia, ciò non riesce se il testo ha virgolette e non sono riuscito a trovare una spiegazione o una soluzione nella documentazione .

Per esempio:

  • =hello= Rende letteralmente
  • ~hello~ Rendering come codice
  • =hello'= Non riesce a renderlo letteralmente
  • ~hello'~ Non riesce a eseguire il rendering come codice

L'unica soluzione che ho trovato finora è l'inserimento di caratteri invisibili, ad esempio la digitazione C-x 8 <RET> 200b <RET>, come spiegato in questa domanda .

Perché è questo (è un bug?) E come posso evitare questo problema senza inserire caratteri invisibili?

Risposte:


47

Prima di tutto: questo è Emacs. Non è un bug, è un'impostazione!

In secondo luogo, @glucas ha ragione nel dire che è necessario modificareorg-emphasis-regexp-components per ottenere ciò che si desidera. Tuttavia, vorrei suggerire due modifiche al suo codice (@ Malabarba) e fornire un po 'più di contesto:

  1. Non è necessario copiare l'intero valore di org-emphasis-regexp-componentsnel file init per modificare un singolo componente. Per il tuo caso d'uso è sufficiente:

    (setcar (nthcdr 2 org-emphasis-regexp-components) " \t\r\n,\"")
  2. Non è necessario modificare org-emphasis-regexp-componentsprima di caricare org-modetramite (require 'org). Aggiungi la seguente riga dopo le modifiche:

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

Più contesto

Nel caso in cui desideri personalizzare altri aspetti di come funziona il markup dell'enfasi org-mode, sappi questo:

Il valore di org-emphasis-regexp-componentsè un elenco con cinque voci.

  1. La prima voce controlla quali caratteri possono precedere immediatamente i caratteri di markup. Se vuoi essere in grado di avere qualcosa di simile al why=hello=rendering correttamente, dovrai modificare questa voce.

    (setcar org-emphasis-regexp-components "...")
  2. La seconda voce controlla quali caratteri sono autorizzati a seguire immediatamente i caratteri di markup. Se vuoi essere in grado di avere qualcosa di simile al =hello=thererendering correttamente, dovrai modificare questa voce.

    (setcar (nthcdr 1 org-emphasis-regexp-components) "...")
  3. La terza voce specifica i caratteri che non sono ammessi come caratteri di bordo , ovvero caratteri che seguono immediatamente un carattere di marcatura iniziale o precedono un carattere di marcatura finale. Dovrai modificarlo per rendere le cose simili='hello'= rendering corretto.

    (setcar (nthcdr 2 org-emphasis-regexp-components) "...")
  4. La quarta voce elenca i caratteri consentiti nel corpo della stringa contrassegnata, ovvero i caratteri che appaiono tra i caratteri del bordo. Raramente dovrai modificarlo; per impostazione predefinita, qualsiasi personaggio è consentito come personaggio del corpo.

    (setcar (nthcdr 3 org-emphasis-regexp-components) "...")
  5. La quinta voce specifica quante nuove righe sono consentite all'interno di un'espressione contrassegnata. Per impostazione predefinita, org-modeconsente una nuova riga. Quindi, se vuoi essere in grado di aggiungere markup al testo che si estende su più di due righe consecutive, dovrai modificare questa voce.

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

    ... dov'è Nil numero di newline che vuoi consentire.

Post correlati

Le persone sembrano imbattersi in questo problema abbastanza frequentemente. A parte il post che hai citato , ci sono almeno altre due domande su StackOverflow che trattano problemi molto simili:


7
Ho votato a favore della tua risposta, ma vorrei anche lodare la qualità della risposta.
Kaushal Modi,

Grazie @itsjeyd Funziona alla grande se eseguo queste due righe in modo interattivo una volta che Emacs ha caricato completamente con i miei buffer già aperti. Tuttavia, e stranamente, mi imbatto "Symbol's value as variable is void: org-emphasis-regexp-components"anche se inserisco queste due linee in fondo al mio .emacsfile. Qualche idea sul perché potrebbe essere così?
Amelio Vazquez-Reina,

@ AmelioVazquez-Reina Prego :) Solo per essere sicuro: sei (require 'org)nel tuo .emacsfile prima di effettuare qualsiasi personalizzazione org-emphasis-regexp-components?
itsjeyd

1
@ AmelioVazquez-Reina Sono contento che tutto funzioni correttamente per te ora :) Le tue osservazioni sono corrette - non è necessario (require 'org)nel file init per poterlo utilizzare. In caso contrario, Emacs lo caricherà automaticamente quando: (a) si apre un .orgfile per la prima volta nella sessione corrente o (b) si abilita la modalità manualmente tramite M-x org-modeper la prima volta nella sessione corrente oppure (c ) quando ripristina un desktop salvato che include almeno un .orgfile. (cont.)
itsjeyd

1
@ AmelioVazquez-Reina (cont.) Il fatto è : Emacs non verrà caricato org-modeautomaticamente solo perché hai inserito alcune personalizzazioni nel file init. Ecco perché è necessario (require 'org)prima di personalizzare qualsiasi delle sue variabili. Senza caricare completamente la modalità, Emacs non saprà cosa fare con variabili come org-emphasis-regexp-components; non sono definiti quando Emacs li incontra per la prima volta, quindi il Symbol's value as variable is voidmessaggio.
È il

11

C'è un'opzione molto più semplice: usa i blocchi sorgente inline :

src_python{hello'}

Funziona senza problemi per caratteri come virgolette e fornisce l'evidenziazione della sintassi per il codice incorporato.

Per includere il codice sorgente inline durante l'esportazione, ti consigliamo di aggiungere questa dichiarazione all'intestazione:

#+PROPERTY: header-args :exports code

1
Questo è un ottimo consiglio! Molto bello ottenere l'evidenziazione della sintassi per il codice inline!
Shon

Questo è fantastico! Mi ricorda Latex (:
Chris.Q,

7

Puoi rimuovere i caratteri di citazione org-emphasis-regexp-componentscome descritto da @Malabarba in questo post del blog .

Il codice pertinente da quel post:

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

Vedi la stringa del documento per org-emphasis-regexp-components: per impostazione predefinita i caratteri di citazione sono considerati:

border - I caratteri vietati come caratteri border.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.