Встроенный дословно и код с кавычками в режиме Org


37

В режиме Org я могу окружать текст =или ~помещать текст в режиме inline или inline .

Однако это не удается, если в тексте есть кавычки, и я не смог найти объяснения или обходного пути в документации .

Например:

  • =hello= Отображается как дословно
  • ~hello~ Отображается как код
  • =hello'= Не выводится как дословно
  • ~hello'~ Не в состоянии отобразить как код

Единственное решение, которое я нашел до сих пор, это вставка невидимых символов, например, ввод текста C-x 8 <RET> 200b <RET>, как объяснено в этом вопросе .

Почему это (это ошибка?) И как я могу избежать этой проблемы, не вставляя невидимые символы?

Ответы:


47

Прежде всего: это Emacs. Это не ошибка, это настройка!

Во-вторых, @glucas правильно говорит, что вам нужно изменить,org-emphasis-regexp-components чтобы получить то, что вы хотите. Тем не менее, я хотел бы предложить две модификации его (@ Malabarba's) кода и предоставить немного больше контекста:

  1. Вам не нужно копировать все значение org-emphasis-regexp-componentsв ваш init-файл, чтобы изменить один компонент. Для вашего случая использования достаточно:

    (setcar (nthcdr 2 org-emphasis-regexp-components) " \t\r\n,\"")
  2. Вам не нужно изменять org-emphasis-regexp-componentsперед загрузкой org-modeчерез (require 'org). Просто добавьте следующую строку после ваших изменений:

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

Больше контекста

Если вы хотите настроить другие аспекты работы разметки выделения org-mode, знайте это:

Значение org-emphasis-regexp-componentsпредставляет собой список с пятью записями.

  1. Первая запись определяет, какие символы могут непосредственно предшествовать символам разметки. Если вы хотите, чтобы что-то вроде why=hello=рендера было правильно, вам нужно изменить эту запись.

    (setcar org-emphasis-regexp-components "...")
  2. Вторая запись определяет, каким символам разрешено следовать сразу за символами разметки. Если вы хотите, чтобы что-то вроде =hello=thereрендера было правильно, вам нужно изменить эту запись.

    (setcar (nthcdr 1 org-emphasis-regexp-components) "...")
  3. Третья запись определяет символы, которые не допускаются в качестве пограничных символов , то есть символы, которые следуют сразу за открывающим символом разметки или предшествуют закрывающему символу разметки. Вам нужно будет изменить это, чтобы сделать такие вещи, как ='hello'=рендер правильно.

    (setcar (nthcdr 2 org-emphasis-regexp-components) "...")
  4. Четвертая запись перечисляет символы, которые разрешены в теле размеченной строки, то есть символы, которые появляются между символами границы. Вам редко понадобится изменить это; по умолчанию любой символ допускается как символ тела.

    (setcar (nthcdr 3 org-emphasis-regexp-components) "...")
  5. Пятая запись указывает, сколько новых строк разрешено внутри размеченного выражения. По умолчанию org-modeдопускается один перевод строки. Поэтому, если вы хотите иметь возможность добавлять разметку к тексту, который занимает более двух последовательных строк, вам нужно изменить эту запись.

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

    ... где Nколичество строк, которые вы хотите разрешить.

Похожие сообщения

Люди, кажется, сталкиваются с этой проблемой довольно часто. Помимо упомянутого вами поста , в StackOverflow есть еще как минимум два вопроса, которые касаются очень похожих проблем:


7
Я проголосовал за ваш ответ, но также хотел бы отметить качество ответа.
Каушал Моди

Спасибо @itsjeyd. Это прекрасно работает, если я запускаю эти две строки в интерактивном режиме, когда Emacs полностью загружен с уже открытыми буферами. Тем не менее, как ни странно, я сталкиваюсь, "Symbol's value as variable is void: org-emphasis-regexp-components"даже если помещаю эти две строки полностью внизу моего .emacsфайла. Любые мысли о том, почему это может иметь место?
Амелио Васкес-Рейна

@ AmelioVazquez-Reina Добро пожаловать :) Просто чтобы убедиться: Вы (require 'org)в своем .emacsфайле, прежде чем делать какие-либо настройки org-emphasis-regexp-components?
itjeyd

1
@ AmelioVazquez-Reina Я рад, что сейчас у вас все работает нормально :) Ваши наблюдения верны - вам не нужно (require 'org)в вашем init-файле, чтобы иметь возможность его использовать. Если вы этого не сделаете, Emacs загрузит его автоматически, когда вы: (а) впервые откроете .orgфайл в текущем сеансе или (б) включите режим вручную через M-x org-modeпервый раз в текущем сеансе, или (с ) при восстановлении сохраненного рабочего стола, который содержит хотя бы один .orgфайл. (продолжение)
itsjeyd

1
@ AmelioVazquez-Reina (продолжение). Дело в том, что Emacs не загружается org-modeавтоматически только потому, что вы добавили некоторые настройки для него в свой init-файл. Вот почему вам нужно (require 'org)перед настройкой любой из его переменных. Без полной загрузки режима Emacs не будет знать, что делать с такими переменными, как org-emphasis-regexp-components; они не определены, когда Emacs впервые сталкивается с ними, отсюда и Symbol's value as variable is voidсообщение.
itjeyd

11

Есть гораздо более простой вариант: использовать встроенные исходные блоки :

src_python{hello'}

Это работает без проблем для символов, таких как кавычки, и обеспечивает подсветку синтаксиса для встроенного кода.

Чтобы включить встроенный исходный код при экспорте, вам нужно добавить это объявление в заголовок:

#+PROPERTY: header-args :exports code

1
Это отличный совет! Очень приятно получить подсветку синтаксиса для встроенного кода!
Шон

Это здорово! Это напоминает мне латекс (:
Chris.Q

7

Вы можете удалить символы кавычек, org-emphasis-regexp-componentsкак описано @Malabarba в этом блоге .

Соответствующий код из этого поста:

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

См. Строку документа для org-emphasis-regexp-components: по умолчанию символы кавычек считаются:

border - символы, запрещенные в качестве пограничных символов.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.