Jak mogę uciec z * w trybie org, aby zapobiec pogrubieniu czcionek

12

Jeśli napiszę coś *shrug*w trybie org, zostanie automatycznie czcionka pogrubiona . Jak mogę temu zapobiec, tzn. Faktycznie *shrug*wyświetlać się dosłownie po wyeksportowaniu?

Edytować:

Nadal chcę mieć możliwość korzystania z pogrubionej czcionki (bez konieczności zmiany domyślnej składni gwiazdki dla pogrubionego tekstu) i nie powinno mieć znaczenia, do jakiego formatu pliku eksportowany jest mój plik org, np. Powinien on działać zarówno dla Markdown, jak i HTML eksport.

To kilka ważnych rzeczy, dlatego napisano pogrubioną czcionką. Ale w przypadku czegoś innego nie mam pomysłu * wzruszenie ramion *.

timor
źródło
1
Jeśli eksportujesz to później do LaTeXa, możesz spróbować, \ast{}shrug\ast{}lub \star{}shrug\star{}podobnie, używając HTML, możesz użyć kodowania encji: &#2a;lub, jeśli dodawanie spacji przed gwiazdką lub po niej jest opcją, to też by działało.
wvxvw,
Wygląda na to, że odpowiedź suvayu polegająca na owinięciu go dosłownie markerami jest tym, czego chcesz. Alternatywnie, możesz zmodyfikować org-emphasis-alist, aby do pogrubionego tekstu użyto innego znaku.
user2699,
Nie dokładnie. = * wzruszenie ramion * = powoduje, że wyeksportowany kod HTML zostanie zawinięty w code-tag, a w markdown ma backtyki. Chcę, żeby nie był w żaden sposób sformatowany.
timor
Edytowane pytanie, aby odzwierciedlić, że zmiana org-emphasis-alist nie jest tak naprawdę opcją. Nie chcę zmieniać pogrubionego tekstu, który już istnieje w moim pliku .org.
timor
2
\ast{}shrug\ast{}Wspomniał wvxvw jest chyba najlepszym rozwiązaniem. eksportuje do html as ∗shrug∗i do lateksu as $\ast$shrug$\ast$przy użyciu odpowiednich jednostek znaków. org-toggle-pretty-entitieswyświetla je jako znaki UTF8 w buforze organizacji.
mutbuerger,

Odpowiedzi:

9

Ta odpowiedź jest inspirowana po zbiorowych sugestii na liście GNU Emacs-org-mode używać org-entity( C-h i g (org) Special symbols) \ast{}zamiast zerowej szerokości spacji znaków (które sugerowane w inny moją odpowiedź tutaj ).

Poniżej znajduje się ogólne rozwiązanie, w którym użytkownik nie musi pamiętać jednostek organizacyjnych dla różnych symboli. Wstawia jednostkę organizacyjną (jeśli jest dostępna), gdy robi to użytkownik C-u SYMBOL; pracuje C-u *, C-u /, C-u =, itd.

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

Gdy więc użytkownik wpisze C-u *, \ast{}zostanie wstawiony i w obszarze echa wyświetlony zostanie poniższy komunikat,

Wstawiono „org-entity” \ ast {} dla symbolu *.

Jeśli org-pretty-entitiesjest ustawiony tpowyżej, wstawiony \ast{}zostanie wyświetlony jako *.

Jeśli an org-entitynie istnieje dla znaku X, a użytkownik używa C-u X , X jest po prostu wstawiane 4 razy (jak C-uzwykle by to zrobiło).

Kaushal Modi
źródło
1
To wygląda naprawdę wygodnie. Jedynym drwabackiem (moim zdaniem), który pozostaje, jest to, że plik .org, który do tej pory nie zawiera żadnych konstrukcji LaTeX, ma teraz fragmenty składni innej niż org-mode (LaTeX). Nawiasem mówiąc, czy istnieje powód, dla którego nie \*thisisnotbold\*istnieje żaden taki konstrukt ?
timor
1
To także jest składnia org. Sprawdź org-entitiesdokumentację.
Kaushal Modi,
8

Korzystanie ze znaku Unicode ZERO WIDTH SPACE

Możesz pogrubić pogrubienie wyróżnienia, dodając znak spacji o zerowej szerokości (oznaczony [ZWS] w poniższych fragmentach) przed pierwszą gwiazdką lub po drugiej gwiazdce.

Oba poniższe fragmenty wyeksportowały się dobrze do HTML w moich testach:

  • [ZWS] przed pierwszą gwiazdką

    This is some *bold* test and this is ​[ZWS]*not bold*.
    
  • [ZWS] po drugiej gwiazdce

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

Możesz wprowadzić ZERO WIDTH SPACE (nazwa Unicode) C-x 8 RET 200b RET.
Używam tego bardzo często, więc związałem się z tymC-x 8 0 .


Aktualizacja

Zgodnie z dyskusją na liście mailingowej trybu emacs-org , używanie znaków spoza ASCII do zmiany znaczenia nie jest zalecane; zamiast tego org-entitiesnależy zastosować, jeśli dotyczy. Ja również się z tym zgodziłem i wymyśliłem inne rozwiązanie, które sprawia, że ​​wstawianie jest org-entitiesnaprawdę łatwe ( C-u *w tym przypadku).

Kaushal Modi
źródło
Technicznie jest to dość szybki sposób na rozwiązanie problemu. Czy polega na tym, że tryb org nie interpretuje ZWS jako białych znaków? Obawiam się też, że rozwiązaniem nie jest obvius dla innych osób edytujących plik org ...
timor
@timor Podniosłem tę dyskusję na [email protected]liście mailingowej. Jeśli jesteś zainteresowany, możesz śledzić / dodawać do dyskusji tutaj .
Kaushal Modi
@timor, nie jest to oczywiste, ale spośród wszystkich podanych tutaj rozwiązań jest to jedyne, które działa bez modyfikowania konfiguracji emacsa, więc jest to najbardziej oczywiste, jeśli chcesz udostępnić swoje pliki.
user2699,
@ user2699 FWIW, użycie podmiotów org w plikach będzie działać od razu bez żadnej konfiguracji użytkownika .. to po prostu użycie zwykłego ascii \ast{}w plikach. Moje inne rozwiązanie sprawia, że ​​wchodzenie jest \ast{}szybsze i łatwiejsze do zapamiętania.
Kaushal Modi
3

Mówiąc dosłownie, jeśli naprawdę masz na myśli użycie znaczników w eksportowanym LaTeX, możesz po prostu użyć =*shrug*=. Jeśli jednak chcesz go wyeksportować jako *shrug*i chcesz to robić cały czas, polecam filtry . Jeśli jednak potrzebujesz tego tylko w niektórych przypadkach *shrug*, powinieneś użyć alternatywy sugerowanej przez @wvxvw. Możesz to zrobić czysto za pomocą makr . Oto kilka przykładów.

Filtry

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

Zasadniczo powyższy filtr szuka \textbf{..}znaczników w transkodowanym łańcuchu i zastępuje go \ast{}..\ast{}, nie zmieniając tego, co było w środku {..}. Nie przetestowałem wyrażenia regularnego i ciągu zastępującego, więc mogą wystąpić błędy, ale masz pomysł. Podobnie jak w przypadku innych backendów, można dołączyć dodatkowe fragmenty takie jak to:

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

To samo zastrzeżenie dotyczy powyższego wyrażenia regularnego.

Makra

Źródło organizacji:

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

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

eksportuje do LaTeX jako:

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

i do HTML jako:

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

Możesz oczywiście dodać tyle makr, ile chcesz.

Edycja: jak wskazuje Kaushal w komentarzach, fragment eksportu lateksu jest w tym przypadku opcjonalny. Wolę jednak używać ich zawsze, gdy w grę wchodzi nagi lateks, ponieważ trudno mi śledzić listę org-entitiesi szczegółowe zasady identyfikowania goły lateksu w źródle org.

Uwaga:

  • przykłady filtrów są nieprzetestowane,
  • Nie znam żadnych HTML, więc mogą występować błędy w odpowiednich bitach.
Quarky
źródło
Jeżeli nie jest to definicja makra wystarczyć: #+macro: nobold \ast{}$1\ast{}? astjest jednym z członków org-entitieslisty, który określa, jak powinien wyglądać eksport lateksu, html, ascii itp ("ast" "\\ast" t "&lowast;" "*" "*" "*"). Kolejność elementów na tej liście to „nazwa, zamiennik LaTeX, matematyczny LaTeX, zamiennik HTML, zamiennik ASCII, zamiennik Latin1, zamiennik utf-8”.
Kaushal Modi
@kaushalmodi Tak, tak, ale skoro już wiemy, że jest to LaTeX, umieszczenie go wewnątrz fragmentu lateksu nie jest szkodliwe. Z mojego doświadczenia wynika, że ​​stosowanie urywków jest o wiele bardziej niezawodne ze względu na jednoznaczność.
Quarky
-1

Jest to kontrolowane przez zmienną org-emphasis-alist i może być łatwo modyfikowane.

  • Umieść punkt nad pogrubionym tekstem, użyj polecenia what-kursor-pozycja, C-u C-x =aby znaleźć twarz, zauważ, że ma ona właściwość org-emphasis.
  • Zadzwoń customize-groupi wyszukaj org-Nacisk
  • org-emphasis-alist powinien się pojawić z różnymi opcjami oznaczania tekstu.
  • Usuń wpis odpowiadający *
  • Zastosuj zmiany i uruchom ponownie tryb org lub emacs
użytkownik2699
źródło