Escapar símbolos al usar marcado en org-mode

2 minutos de lectura Publicado:

Un caso que puede sonarle a alguien, es usar rutas. Si se escribe en org-mode las palabras /home/drymer/, por ejemplo, pasará que al exportar o en el mismo buffer si tenemos activado org-hide-emphasis-markers, veremos que /home/drymer/ pasa a ser home/drymer, en cursiva y sin la primera y última barra. Por suerte, hay una manera sencilla de escapar estos carácteres usando entidades org (org-entities).

Las entidades de org son parecidas al latex. En vuestro editor con un buffer en org-mode, escribid \ast{}. Se ve igual? De ser así, ejecutad M-x org-toggle-pretty-entities y voila, el \ast{} pasa a ser un ∗.

Ahora, alguien se podría dar cuenta de que cada símbolo que se quiera usar tiene su “código” asociado, por lo que memorizarlo debe ser acojonante. Pero llega al recate el conocimiento en común. Hay un humano que soluciona este problema, cómo se puede ver en Stack Overflow. Cómo ahí se cuenta, hubo un debate de la mejor manera de escapar símbolos y acabó sacando ese par de funciones. Aún así, estaba hecha para funcionar en emacs 25, en las 24.∗ no funcionaba. Pero, después de un intercambio de correos en la lista pudo arreglarlo y actualizo la función que aparece en Stack Overflow. Ahora, es tan sencillo cómo presionar C-u SIMBOLO, siendo SIMBOLO el símbolo que queremos que aparezca. Bien sencillo. Y ahora, el código.

(setq org-pretty-entities t)

(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 (orig-fun &rest args)
"When the universal prefix C-u is used before entering any character,
insert the character's `org-entity' name if javailable."
(let ((pressed-key (char-to-string (elt (this-single-command-keys) 0)))
      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)
                       "."))))
  (when (null entity-name)
    (apply orig-fun args))))

(advice-add 'org-self-insert-command :around #'modi/org-insert-org-entity-maybe)
Cualquier duda o comentario, me puedes contactar en los canales descritos en la página principal