Texto e código inline com aspas no modo de organização

37

No modo Org, eu posso colocar texto com =ou ~para colocar texto no modo literal ou código embutido .

No entanto, isso falhará se o texto tiver aspas e não foi possível encontrar uma explicação ou solução alternativa na documentação .

Por exemplo:

  • =hello= Renderiza como literalmente
  • ~hello~ Renderiza como código
  • =hello'= Falha ao renderizar como literalmente
  • ~hello'~ Falha ao renderizar como código

A única solução que encontrei até agora é a inserção de caracteres invisíveis C-x 8 <RET> 200b <RET>, como digitação , conforme explicado nesta pergunta .

Por que isso é (é um bug?) E como posso evitar esse problema sem inserir caracteres invisíveis?

Amelio Vazquez-Reina
fonte

Respostas:

47

Primeiro de tudo: Este é o Emacs. Não é um bug, é uma configuração!

Em segundo lugar, @glucas está correto ao dizer que você precisa modificarorg-emphasis-regexp-components para obter o que deseja. No entanto, gostaria de sugerir duas modificações no código dele (@ Malabarba) e fornecer um pouco mais de contexto:

  1. Você não precisa copiar o valor inteiro do org-emphasis-regexp-componentsarquivo init para modificar um único componente. Para o seu caso de uso, o seguinte é suficiente:

    (setcar (nthcdr 2 org-emphasis-regexp-components) " \t\r\n,\"")
  2. Você não precisa modificar org-emphasis-regexp-componentsantes de carregar org-modevia (require 'org). Basta adicionar a seguinte linha após as modificações:

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

Mais contexto

Caso você queira personalizar outros aspectos de como a marcação de ênfase funciona org-mode, saiba o seguinte:

O valor de org-emphasis-regexp-componentsé uma lista com cinco entradas.

  1. A primeira entrada controla quais caracteres têm permissão para preceder imediatamente os caracteres de marcação. Se você quiser ter algo como why=hello=renderizar corretamente, precisará modificar esta entrada.

    (setcar org-emphasis-regexp-components "...")
  2. A segunda entrada controla quais caracteres têm permissão para seguir imediatamente os caracteres de marcação. Se você quiser ter algo como =hello=thererenderizar corretamente, precisará modificar esta entrada.

    (setcar (nthcdr 1 org-emphasis-regexp-components) "...")
  3. A terceira entrada especifica os caracteres que não são permitidos como caracteres de borda , ou seja, caracteres que seguem imediatamente um caractere de marcação de abertura ou precedem um caractere de marcação de fechamento. Você precisará modificar isso para tornar as coisas como ='hello'=renderizadas corretamente.

    (setcar (nthcdr 2 org-emphasis-regexp-components) "...")
  4. A quarta entrada lista os caracteres permitidos no corpo da sua sequência marcada, ou seja, caracteres que aparecem entre os caracteres da borda. Você raramente precisará modificar isso; por padrão, qualquer caractere é permitido como um caractere do corpo.

    (setcar (nthcdr 3 org-emphasis-regexp-components) "...")
  5. A quinta entrada especifica quantas novas linhas são permitidas dentro de uma expressão marcada. Por padrão, org-modepermite uma única nova linha. Portanto, se você deseja adicionar marcações ao texto que abrange mais de duas linhas consecutivas, será necessário modificar essa entrada.

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

    ... onde Nestá o número de novas linhas que você deseja permitir.

Publicações relacionadas

As pessoas parecem se deparar com esse problema com bastante frequência. Além da postagem que você mencionou , há pelo menos mais duas perguntas no StackOverflow que lidam com problemas muito semelhantes:

itsjeyd
fonte
7
Votei na sua resposta, mas também gostaria de elogiar a qualidade da resposta.
Kaushal Modi
Obrigado @itsjeyd Isso funciona muito bem Se eu executar essas duas linhas interativamente quando o Emacs estiver totalmente carregado com meus buffers já abertos. No entanto, e por incrível que pareça, eu encontro "Symbol's value as variable is void: org-emphasis-regexp-components"mesmo que eu coloque essas duas linhas na parte inferior do meu .emacsarquivo. Alguma idéia de por que esse poderia ser o caso?
Amelio Vazquez-Reina
@ AmelioVazquez-Reina De nada :) Só para ter certeza: Você está (require 'org)no seu .emacsarquivo antes de fazer alguma personalização org-emphasis-regexp-components?
itsjeyd
11
@ AmelioVazquez-Reina Estou feliz que tudo esteja funcionando corretamente para você agora :) Suas observações estão corretas - você não precisa (require 'org)no seu arquivo init para poder usá-lo. Caso contrário, o Emacs o carregará automaticamente quando você: (a) abrir um .orgarquivo pela primeira vez na sessão atual ou (b) ativar o modo manualmente via M-x org-modepela primeira vez na sessão atual, ou (c) ) quando restaura uma área de trabalho salva que inclui pelo menos um .orgarquivo. (continuação)
itsjeyd
11
@ AmelioVazquez-Reina (continuação) A questão é : o Emacs não será carregado org-modeautomaticamente só porque você colocou algumas personalizações no seu arquivo init. É por isso que você precisa (require 'org)antes de personalizar qualquer uma de suas variáveis. Sem carregar completamente o modo, o Emacs não saberá o que fazer com variáveis ​​como org-emphasis-regexp-components; eles não são definidos quando o Emacs os encontra pela primeira vez, daí a Symbol's value as variable is voidmensagem.
itsjeyd
11

Há uma opção muito mais simples: use blocos de origem embutidos :

src_python{hello'}

Isso funciona sem problemas para caracteres como aspas e fornece destaque de sintaxe para código embutido.

Para incluir o código-fonte embutido ao exportar, adicione esta declaração ao cabeçalho:

#+PROPERTY: header-args :exports code
Clemente
fonte
11
Esta é uma ótima dica! Muito bom obter destaque de sintaxe para código embutido!
Shon
Isso é ótimo! Isso me lembra Latex (:
Chris.Q
7

Você pode remover os caracteres de citação org-emphasis-regexp-componentsconforme descrito por @Malabarba nesta postagem do blog .

O código relevante dessa postagem:

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

Consulte a sequência de documentos para org-emphasis-regexp-components: por padrão, os caracteres de citação são considerados:

border - Os caracteres proibidos como caracteres de borda.

glucas
fonte