The code below is working fine as long as I stay in `org-mode`. But it shows its limitations when I do `M-x org-publish-all`, at which time, instead of having the text with style verbatim, I get the text within backticks.
Is there any improvement you could think of that would fix that? Thanks, Chris On Saturday, March 19, 2022 3:17:10 AM UTC you wrote: > > George Mauer writes: > >> is there a straightforward way to extend the org parser to do this? > > > > I don't think so. It seems the emphasis markers are hard-coded > > in various places. > > > > From a quick look at the code, you'd have to customize > > `org-emphasis-alist` and redefine `org-set-emph-re` and > > `org-do-emphasis-faces`. Maybe that'd be enough. > > I did just what you said, and I've inserted what's bellow, somewhere in my > `init.org` / `init.el`, before anything `org-mode` related (save for two > `hook`): (Note it is an almost exact copy from `org.el`, I've only changed > a few characters. And added the `advice-add override`.) > > #+begin_src emacs-lisp > (defun org-set-emph-re-fixed (var val) > "Set variable and compute the emphasis regular expression." > (set var val) > (when (and (boundp 'org-emphasis-alist) > (boundp 'org-emphasis-regexp-components) > org-emphasis-alist org-emphasis-regexp-components) > (pcase-let* > ((`(,pre ,post ,border ,body ,nl) org-emphasis-regexp-components) > (body (if (<= nl 0) body > (format "%s*?\\(?:\n%s*?\\)\\{0,%d\\}" body body nl))) > (template > (format (concat "\\([%s]\\|^\\)" ;before markers > "\\(\\([%%s]\\)\\([^%s]\\|[^%s]%s[^%s]\\)\\3\\)" > "\\([%s]\\|$\\)") ;after markers > pre border border body border post))) > (setq org-emph-re (format template "*/_+")) > (setq org-verbatim-re (format template "=~`"))))) > > (advice-add 'org-set-emph-re :override #'org-set-emph-re-fixed) > #+end_src > > #+begin_src emacs-lisp > (defun org-do-emphasis-faces-fixed (limit) > "Run through the buffer and emphasize strings." > (let ((quick-re (format "\\([%s]\\|^\\)\\([~`=*/_+]\\)" > (car org-emphasis-regexp-components)))) > (catch :exit > (while (re-search-forward quick-re limit t) > (let* ((marker (match-string 2)) > (verbatim? (member marker '("~" "`" "=")))) > (when (save-excursion > (goto-char (match-beginning 0)) > (and > ;; Do not match table hlines. > (not (and (equal marker "+") > (org-match-line > "[ \t]*\\(|[-+]+|?\\|\\+[-+]+\\+\\)[ > \t]*$"))) ;; Do not match headline stars. Do not consider ;; stars of a > headline as closing marker for bold ;; markup either. > (not (and (equal marker "*") > (save-excursion > (forward-char) > (skip-chars-backward "*") > (looking-at-p org-outline-regexp-bol)))) > ;; Match full emphasis markup regexp. > (looking-at (if verbatim? org-verbatim-re org-emph-re)) > ;; Do not span over paragraph boundaries. > (not (string-match-p org-element-paragraph-separate > (match-string 2))) > ;; Do not span over cells in table rows. > (not (and (save-match-data (org-match-line "[ \t]*|")) > (string-match-p "|" (match-string 4)))))) > (pcase-let ((`(,_ ,face ,_) (assoc marker org-emphasis-alist)) > (m (if org-hide-emphasis-markers 4 2))) > (font-lock-prepend-text-property > (match-beginning m) (match-end m) 'face face) > (when verbatim? > (org-remove-flyspell-overlays-in > (match-beginning 0) (match-end 0)) > (remove-text-properties (match-beginning 2) (match-end 2) > '(display t invisible t intangible > t))) (add-text-properties (match-beginning 2) (match-end 2) > '(font-lock-multiline t org-emphasis t)) (when (and > org-hide-emphasis-markers > (not (org-at-comment-p))) > (add-text-properties (match-end 4) (match-beginning 5) > '(invisible t)) > (add-text-properties (match-beginning 3) (match-end 3) > '(invisible t))) > (throw :exit t))))))))