Wbudowany dosłownie i kod z cytatami w trybie Org

37

W trybie Org mogę otaczać tekst za pomocą =lub, ~aby wstawić tekst w trybie dosłownym lub w trybie kodu.

Nie udaje się to jednak, jeśli w tekście są cytaty, i nie mogłem znaleźć wyjaśnienia ani obejścia w dokumentacji .

Na przykład:

  • =hello= Renderuje się dosłownie
  • ~hello~ Renderuje jako kod
  • =hello'= Nie można renderować jako dosłownie
  • ~hello'~ Nie można renderować jako kod

Jedynym rozwiązaniem, które do tej pory znalazłem, jest wstawianie niewidocznych znaków, np. Pisanie C-x 8 <RET> 200b <RET>, jak wyjaśniono w tym pytaniu .

Dlaczego to jest (czy to błąd?) I jak mogę uniknąć tego problemu bez wstawiania niewidzialnych znaków?

Amelio Vazquez-Reina
źródło

Odpowiedzi:

47

Po pierwsze: To jest Emacs. To nie jest błąd, to ustawienie!

Po drugie, @glucas ma rację mówiąc, że musisz zmodyfikować,org-emphasis-regexp-components aby uzyskać to, czego chcesz. Chciałbym jednak zasugerować dwie modyfikacje jego kodu (@ Malabarba) i podać nieco więcej kontekstu:

  1. Nie musisz kopiować całej wartości org-emphasis-regexp-componentsdo pliku init, aby zmodyfikować pojedynczy komponent. W twoim przypadku użycia wystarczy:

    (setcar (nthcdr 2 org-emphasis-regexp-components) " \t\r\n,\"")
  2. Nie musisz modyfikować org-emphasis-regexp-componentsprzed załadowaniem org-modeza pośrednictwem (require 'org). Po modyfikacji dodaj następujący wiersz:

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

Więcej kontekstu

Jeśli chcesz dostosować inne aspekty działania znaczników wyróżnienia org-mode, wiedz o tym:

Wartością org-emphasis-regexp-componentsjest lista z pięcioma wpisami.

  1. Pierwszy wpis kontroluje, które znaki mogą bezpośrednio poprzedzać znaki znaczników. Jeśli chcesz mieć możliwość why=hello=poprawnego renderowania, musisz zmodyfikować ten wpis.

    (setcar org-emphasis-regexp-components "...")
  2. Drugi wpis kontroluje, które znaki mogą bezpośrednio następować po znakach znaczników. Jeśli chcesz mieć możliwość =hello=therepoprawnego renderowania, musisz zmodyfikować ten wpis.

    (setcar (nthcdr 1 org-emphasis-regexp-components) "...")
  3. Trzeci wpis określa znaki, które nie są dozwolone jako znaki obramowania , tj. Znaki, które następują bezpośrednio po znaku otwierającego znacznika lub poprzedzają znak zamykającego znacznika. Musisz to zmodyfikować, aby ='hello'=poprawnie renderować.

    (setcar (nthcdr 2 org-emphasis-regexp-components) "...")
  4. Czwarty wpis zawiera znaki, które są dozwolone w treści zaznaczonego ciągu, tj. Znaki, które występują między znakami granicznymi. Rzadko będziesz musiał to modyfikować; domyślnie dowolny znak jest dozwolony jako znak treści.

    (setcar (nthcdr 3 org-emphasis-regexp-components) "...")
  5. Piąty wpis określa, ile znaków nowej linii jest dozwolonych w wyrażeniu oznaczonym. Domyślnie org-modezezwala na jedną nową linię. Więc jeśli chcesz mieć możliwość dodawania znaczników do tekstu obejmującego więcej niż dwa kolejne wiersze, musisz zmodyfikować ten wpis.

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

    ... gdzie Njest liczba nowych linii, na które chcesz zezwolić.

Powiązane posty

Wydaje się, że ludzie często napotykają ten problem. Oprócz wspomnianego postu istnieją jeszcze dwa pytania dotyczące StackOverflow, które dotyczą bardzo podobnych problemów:

itsjeyd
źródło
7
Głosowałem za odpowiedzią, ale chciałbym również pochwalić jakość odpowiedzi.
Kaushal Modi
Dzięki @itsjeyd Działa to świetnie Jeśli uruchomię te dwie linie interaktywnie, gdy Emacs zostanie w pełni załadowany z moimi buforami już otwartymi. I, o dziwo, wpadam na to, "Symbol's value as variable is void: org-emphasis-regexp-components"nawet jeśli umieszczam te dwie linie do końca mojego .emacspliku. Masz jakieś przemyślenia na temat tego, dlaczego tak może być?
Amelio Vazquez-Reina,
@ AmelioVazquez-Reina Nie ma za co :) Aby się upewnić: czy jesteś (require 'org)w swoim .emacspliku przed wprowadzeniem jakichkolwiek dostosowań org-emphasis-regexp-components?
itsjeyd
1
@ AmelioVazquez-Reina Cieszę się, że wszystko działa teraz poprawnie dla ciebie :) Twoje obserwacje są prawidłowe - nie musisz tego robić (require 'org)w pliku init, aby móc z niego korzystać. Jeśli tego nie zrobisz, Emacs załaduje go automatycznie, gdy: (a) otworzysz .orgplik po raz pierwszy w bieżącej sesji lub (b) włączysz tryb ręcznie poprzez M-x org-modepierwszy raz w bieżącej sesji, lub (c ), gdy przywraca zapisany pulpit, który zawiera co najmniej jeden .orgplik. (
ciąg dalszy
1
@ AmelioVazquez-Reina (cd.) Chodzi o to, że Emacs nie ładuje się org-modeautomatycznie tylko dlatego, że umieściłeś dla niego pewne dostosowania w pliku inicjującym. Dlatego musisz (require 'org)dostosować swoje zmienne. Bez pełnego załadowania trybu Emacs nie będzie wiedział, co zrobić ze zmiennymi takimi jak org-emphasis-regexp-components; nie są zdefiniowane, gdy Emacs po raz pierwszy je napotyka, stąd Symbol's value as variable is voidwiadomość.
itsjeyd
11

Jest o wiele prostsza opcja: użyj wbudowanych bloków źródłowych :

src_python{hello'}

Działa to bez problemów w przypadku znaków takich jak znaki cudzysłowu i zapewnia podświetlanie składni dla kodu wbudowanego.

Aby podczas eksportowania uwzględnić wbudowany kod źródłowy, należy dodać tę deklarację do nagłówka:

#+PROPERTY: header-args :exports code
Łaskawy
źródło
1
To świetna wskazówka! Bardzo miło jest uzyskać podświetlanie składni kodu wbudowanego!
Shon,
To jest świetne! Przypomina mi lateks (:
Chris.Q
7

Możesz usunąć znaki cudzysłowu org-emphasis-regexp-componentszgodnie z opisem @Malabarba w tym poście na blogu .

Odpowiedni kod z tego postu:

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

Zobacz ciąg dokumentów, aby org-emphasis-regexp-components: domyślnie uwzględniono znaki cudzysłowu:

border - Znaki zabronione jako znaki graniczne.

glucas
źródło