Вбудований дословно і код з лапками в Org-режимі


37

У Org-режимі я можу оточувати текст =або ~розміщувати текст у режимі в прямому дословному або кодовому режимі.

Однак це не вдається, якщо в тексті є цитати, і я не зміг знайти пояснення чи рішення в документації .

Наприклад:

  • =hello= Відображається як дослівний
  • ~hello~ Візуалізується як код
  • =hello'= Не вдається відобразити дослівно
  • ~hello'~ Не вдалося відобразити як код

Єдине рішення, яке я знайшов поки що, - це вставлення невидимих ​​символів, наприклад, введення тексту C-x 8 <RET> 200b <RET>, як пояснено в цьому запитанні .

Чому це (помилка?) І як я можу уникнути цієї проблеми, не вставляючи невидимих ​​символів?

Відповіді:


47

Перш за все: це Emacs. Це не помилка, це налаштування!

По-друге, @glucas вірно говорить, що вам потрібно змінити,org-emphasis-regexp-components щоб отримати те, що ви хочете. Однак я хотів би запропонувати дві модифікації його коду (@ Malabarba) та надати трохи більше контексту:

  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?
itsjeyd

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

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

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))

Див. Рядок doc для org-emphasis-regexp-components: за замовчуванням вважаються символи цитати:

межа - символи, заборонені як прикордонні символи, заборонені .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.