Як я можу уникнути * в org-режимі, щоб запобігти сміливій обробці


12

Якщо я напишу щось на зразок *shrug*в режимі org, воно буде автоматично закріплено як жирний текст . Як я можу запобігти цьому, тобто фактично *shrug*з'являтися дослівно при експорті?

Редагувати:

Я все ще хочу мати змогу використовувати жирне fontification (не змінюючи синтаксис зірки за замовчуванням для жирного тексту), і це не має значення, у який формат файлу експортується мій org файл, наприклад, він повинен працювати для Markdown, а також HTML експорт.

Це деякі важливі речі, тому написано жирним шрифтом. Але для чогось іншого я не маю ідеї * знизаю плечима *.


1
Якщо ви експортуєте це в LaTeX пізніше, ви можете спробувати \ast{}shrug\ast{}або \star{}shrug\star{}, аналогічно, з HTML, ви можете використовувати кодування сутності: &#2a;або якщо додавати пробіли до або після зірочки є опцією, це також працюватиме.
wvxvw

Схоже, відповідь суваю просто загорнути її в дословні маркери - це те, що ти хочеш. Крім того, ви можете змінити орг-наголос-аліст, щоб інший символ використовувався для жирного тексту.
користувач2699

Не зовсім. = * shrug * = призводить до того, що експортований HTML-код слід загортати у code-tag, а в розмітці - зворотні посилання. Я хочу, щоб він взагалі не був відформатований.
timor

Відредаговане запитання, щоб відобразити, що зміна орга-налістів не є насправді варіантом. Я не хочу змінювати все сміливе, що вже існує у моєму файлі .org.
тимор

2
\ast{}shrug\ast{}Згадується wvxvw, ймовірно , ваш кращий варіант. він експортує в html як ∗shrug∗і в латекс, $\ast$shrug$\ast$використовуючи відповідні об'єкти символів. org-toggle-pretty-entitiesвідображає їх як символи UTF8 у буфері org.
mutbuerger

Відповіді:


9

Ця відповідь надихається після колективних пропозицій у списку GNU в режимі emacs-org для використання org-entity( C-h i g (org) Special symbols) \ast{}замість символів пробілу нульової ширини (що я запропонував у своїй іншій відповіді тут ).

Нижче наведено загальне рішення, де користувачеві не потрібно запам’ятовувати сутні органи для різних символів. Він вставляє організацію org (якщо є), коли користувач робить це C-u SYMBOL; працює C-u *, C-u /, C-u =і т.д.

(defun modi/org-entity-get-name (char)
  "Return the entity name for CHAR. For example, return \"ast\" for *."
  (let ((ll (append org-entities-user
                    org-entities))
        e name utf8)
    (catch 'break
      (while ll
        (setq e (pop ll))
        (when (not (stringp e))
          (setq utf8 (nth 6 e))
          (when (string= char utf8)
            (setq name (car e))
            (throw 'break name)))))))

(defun modi/org-insert-org-entity-maybe (&rest args)
  "When the universal prefix C-u is used before entering any character,
    insert the character's `org-entity' name if available.

    If C-u prefix is not used and if `org-entity' name is not available, the
    returned value `entity-name' will be nil."
  ;; It would be fine to use just (this-command-keys) instead of
  ;; (substring (this-command-keys) -1) below in emacs 25+.
  ;; But if the user pressed "C-u *", then
  ;;  - in emacs 24.5, (this-command-keys) would return "^U*", and
  ;;  - in emacs 25.x, (this-command-keys) would return "*".
  ;; But in both versions, (substring (this-command-keys) -1) will return
  ;; "*", which is what we want.
  ;; http://thread.gmane.org/gmane.emacs.orgmode/106974/focus=106996
  (let ((pressed-key (substring (this-command-keys) -1))
        entity-name)
    (when (and (listp args) (eq 4 (car args)))
      (setq entity-name (modi/org-entity-get-name pressed-key))
      (when entity-name
        (setq entity-name (concat "\\" entity-name "{}"))
        (insert entity-name)
        (message (concat "Inserted `org-entity' "
                         (propertize entity-name
                                     'face 'font-lock-function-name-face)
                         " for the symbol "
                         (propertize pressed-key
                                     'face 'font-lock-function-name-face)
                         "."))))
    entity-name))

;; Run `org-self-insert-command' only if `modi/org-insert-org-entity-maybe'
;; returns nil.
(advice-add 'org-self-insert-command :before-until #'modi/org-insert-org-entity-maybe)

Отже, коли користувач вводить C-u *, \ast{}вставляється і в області ехо відображається повідомлення нижче,

Вставлено 'org-сутність' \ ast {} для символу *.

Якщо org-pretty-entitiesвстановлено tвище, вставлений \ast{}буде відображатися як *.

Якщо org-entityдля символу X не існує і якщо користувач робить C-u X , X просто вставляється 4 рази (як C-uце зазвичай робиться).


1
Це виглядає дійсно зручно. Єдиний недолік (на мою думку), який залишається, - це те, що файл .org, який поки не містить будь-яких конструкцій LaTeX, тепер має біти синтаксису неорганічного режиму (LaTeX), розпорошеного по файлу. До речі, чи є причина, що не \*thisisnotbold\*існує такої конструкції ?
timor

1
Це теж синтаксис org. Ознайомтеся з org-entitiesдокументацією.
Каушал Моді

8

Використання знака Unicode ZERO WIDTH SPACE

Ви можете провалити сміливий аналіз наголосів, додавши символ простору нульової ширини (вказаний [ZWS] у фрагментах нижче) перед першою зірочкою або після другої зірочки.

Обидва наведені нижче фрагменти експортували добре в HTML під час мого тестування:

  • [ZWS] перед першою зірочкою

    This is some *bold* test and this is ​[ZWS]*not bold*.
    
  • [ZWS] після другої зірочки

    This is some *bold* test and this is *not bold*​[ZWS].
    

Ви можете ввести ZERO WIDTH SPACE (ім'я Unicode), зробивши це C-x 8 RET 200b RET.
Я цим дуже часто користуюся, тому я зв'язав цеC-x 8 0 .


Оновлення

Відповідно до обговорення у списку розсилки emacs-org у режимі emacs-org , використання символів, що не належать до ASCII, для втечі не рекомендується; натомість org-entitiesслід використовувати, якщо це застосовується. Я теж погодився з цим і придумав це ще одне рішення, яке робить вставку org-entitiesдійсно легкою ( C-u *в даному випадку).


Технічно це досить швидкий спосіб вирішити проблему. Чи покладається він на режим org, який не інтерпретує ZWS як пробіл? Крім того, я побоююся, що рішення не заборонено для інших людей, що редагують файл org ...
timor

@timor Я вивів цю дискусію в emacs-orgmode@gnu.orgсписок розсилки. Якщо ви зацікавлені, ви можете слідкувати / додавати до дискусії тут .
Каушал Моді

@timor, це не очевидно, але з усіх наведених тут рішень це єдине, що працює без зміни конфігурації emacs, тому це найбільш очевидно, якщо ви хочете поділитися своїми файлами.
користувач2699

@ user2699 FWIW, використання org об'єктів у файлах буде працювати відразу без будь-якої конфігурації користувача. Це просто використання простого \ast{}файлу ascii у файлах. Моє інше рішення просто робить вхід \ast{}швидшим і легшим запам'ятовувати.
Каушал Моді

3

Дослівно, якщо ви дійсно маєте на увазі використовувати деяку розмітку в експортованому LaTeX, то ви можете просто використовувати =*shrug*=. Однак якщо ви просто хочете, щоб його експортували як *shrug*, і ви хочете робити це постійно, я рекомендую фільтри . Якщо вам це потрібно лише для деяких примірників *shrug*, ви повинні використовувати альтернативу, запропоновану @wvxvw. Ви можете це зробити чисто, використовуючи макроси . Деякі приклади випливають.

Фільтри

(defun my-bold (contents backend info)
  (when (org-export-derived-backend-p backend 'latex)
    (replace-regexp-in-string "\\`\\\\textbf{\\(.+\\)}"
                              "\\\\ast{}\\1\\\\ast{}" contents)))

(add-to-list 'org-export-filter-bold-functions 'my-bold)

По суті, наведений вище фільтр шукає \textbf{..}розмітку в перекодованому рядку і замінює його \ast{}..\ast{}, не змінюючи того, що було загорнуто всередину {..}. Я не перевіряв регулярний вираз і рядок заміни, тому можуть бути помилки, але ви розумієте. Так само, як і для інших програм, можна включити додаткові фрагменти на зразок цього:

(when (org-export-derived-backend-p backend 'html)
   (replace-regexp-in-string "<b>\\(.+\\)</b>" "\&#2a;\\1\&#2a;" contents))

Це ж застереження справедливо для регулярного виразу вище.

Макроси

Джерело органу:

#+macro: nobold @@latex:\ast{}$1\ast{}@@ @@html:&#2a;$1&#2a;@@

This text is *bold* this is nobold{{{not}}}

експорт до LaTeX як:

This text is \textbf{bold} this is \ast{}not\ast{}

і в HTML як:

This text is <b>bold</b> this is  &#2a;not&#2a;

Звичайно, ви можете додати до макросу стільки програм, скільки бажаєте.

Редагувати: як в коментарях вказує Каушал, фрагмент експорту для латексу в цьому випадку необов’язковий. Однак я вважаю за краще використовувати їх щоразу, коли бере участь голий латекс, оскільки мені важко відслідковувати список org-entitiesта конкретні правила, що стоять за ідентифікацією голого латексу у джерелі Org.

Примітка:

  • приклади фільтрів не перевірені,
  • Я не знаю жодної HTML, тому у відповідних бітах можуть бути помилки.

Чи не повинно бути цього визначення макросу #+macro: nobold \ast{}$1\ast{}:? astє одним із членів org-entitiesсписку, який визначає, як повинен виглядати експорт латексу, html, ascii тощо ("ast" "\\ast" t "&lowast;" "*" "*" "*"). Порядок елементів у цьому списку - "ім'я, заміна LaTeX, математика LaTeX, заміна HTML, заміна ASCII, заміна Latin1, заміна utf-8".
Каушал Моді

@kaushalmodi Так, це було б, однак, оскільки ми вже знаємо, що це LaTeX, немає шкоди, якщо вкласти його в фрагмент латексу. На мій досвід використання фрагментів набагато надійніше через її однозначність.
Quarky

-1

Це контролюється змінним органом-наголосом і може легко змінюватися.

  • Поставте крапку над жирним текстом, використовуйте команду what-cursor-position, C-u C-x =щоб знайти обличчя, зауважте, що воно має властивість org-emphasis.
  • Зателефонуйте customize-groupта шукайте орг-наголос
  • Орган-наголос-аліст повинен з'являтися з різними варіантами маркування тексту.
  • Видаліть запис, що відповідає *
  • Застосуйте зміни та перезапустіть org-режим або emacs
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.