emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Using backticks for the inline code delimeter?


From: chris
Subject: Re: Using backticks for the inline code delimeter?
Date: Sat, 19 Mar 2022 04:17:10 +0100

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



  (advice-add 'org-do-emphasis-faces :override #'org-do-emphasis-faces-fixed)

#+end_src


#+begin_src emacs-lisp

  (custom-set-variables '(org-emphasis-alist

                           '(("*" bold)

                             ("/" italic)

                             ("_" underline)

                             ("=" org-verbatim verbatim)

                             ("`" org-code verbatim)

                             ("~" org-code verbatim)

                             ("+" (:strike-through t)))))

#+end_src


Just before:


#+begin_src emacs-lisp

  (straight-use-package 'org)

#+end_src


And it seems it works.


I've tried the "cosmetic" version from bellow, but it wasn't working so well, with either `visual-fill-colum` or `org-indent-mode`?

Well, it wasn't working well. I don't know if the hack above is playing more nicely. Because I've only tested it on one example.

Chris


>

> For the cosmetic part, there's this  piece of code from

> https://archive.casouri.cat/note/2020/better-looking-verbatim-markup-in-org-mode/index.html

> that displays org's `=` and `~` markers as ```.

>

> --

> Sébastien Miquel



reply via email to

[Prev in Thread] Current Thread [Next in Thread]