unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
* multi-line highlighting
@ 2021-02-28 10:01 Colin Baxter
  2021-02-28 10:13 ` Colin Baxter
  2021-02-28 16:00 ` Stefan Monnier
  0 siblings, 2 replies; 5+ messages in thread
From: Colin Baxter @ 2021-02-28 10:01 UTC (permalink / raw)
  To: help-gnu-emacs

Hello,

I have in an org-mode file a need to color the face of the string
between 'Alpha:' and a period. To achieve this I have

#+begin_src elisp
(add-hook 'org-mode-hook (lambda ()
   (font-lock-add-keywords nil
     '(("\\(Alpha:\\)\\([^\n\r\t]+\\)\\(.\\)"
      (1 font-lock-builtin-face) ;; Face for 'Alpha:'.
      (2 font-lock-doc-face) ;; Subsequent face)))))
#+end_src

This works well. 'Alpha:' is in font-lock-builtin-face and the rest of
the line until the period is in font-lock-doc-face. Occasionally,
unfortunately, the line runs over to a "new line" - and of course the
face locking 2 is lost on the new line.

How can I maintain the font locking 2 for two or maybe three lines? I
have tried inserting a '\n' in the regexp and a

#+begin_src elisp
eval: (set (make-local-variable 'font-lock-multiline) t)
#+end_src

as a local variable, but to no avail. I have searched online, but all
the examples I've found are based on adding keywords, which is not what
I want. I'm probably overlooking something simple.

I would be grateful for pointers as to where to look.

Best wishes,

Colin Baxter.




^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: multi-line highlighting
  2021-02-28 10:01 multi-line highlighting Colin Baxter
@ 2021-02-28 10:13 ` Colin Baxter
  2021-02-28 12:34   ` Colin Baxter
  2021-02-28 16:00 ` Stefan Monnier
  1 sibling, 1 reply; 5+ messages in thread
From: Colin Baxter @ 2021-02-28 10:13 UTC (permalink / raw)
  To: help-gnu-emacs

Typo! Should be

#+begin_src elisp
(add-hook 'org-mode-hook (lambda ()
   (font-lock-add-keywords nil
     '(("\\(Alpha:\\)\\([^\n\r\t]+\\)\\(.\\)"
      (1 font-lock-builtin-face) ;; Face for 'Alpha:'
      (2 font-lock-doc-face) ;; Subsequent face
      )))))
#+end_src

Bets wishes,






^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: multi-line highlighting
  2021-02-28 10:13 ` Colin Baxter
@ 2021-02-28 12:34   ` Colin Baxter
  0 siblings, 0 replies; 5+ messages in thread
From: Colin Baxter @ 2021-02-28 12:34 UTC (permalink / raw)
  To: help-gnu-emacs

Solution is easier than I thought. This works.

#+begin_src elisp
(add-hook 'org-mode-hook (lambda ()
   (font-lock-add-keywords nil
     '( ("<alpha>\\|</alpha>" . font-lock-warning-face)
      ("<alpha>\\([^<]+?\\)</alpha>" . (1 font-lock-constant-face))
))))
#+end_src

and then put

eval: (set (make-local-variable 'font-lock-multiline) t)

as a local variable.

Sorry for answering my own question!

Best wishes,




^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: multi-line highlighting
  2021-02-28 10:01 multi-line highlighting Colin Baxter
  2021-02-28 10:13 ` Colin Baxter
@ 2021-02-28 16:00 ` Stefan Monnier
  2021-02-28 17:57   ` Colin Baxter
  1 sibling, 1 reply; 5+ messages in thread
From: Stefan Monnier @ 2021-02-28 16:00 UTC (permalink / raw)
  To: help-gnu-emacs

> I have in an org-mode file a need to color the face of the string
> between 'Alpha:' and a period. To achieve this I have
>
> #+begin_src elisp
> (add-hook 'org-mode-hook (lambda ()
>    (font-lock-add-keywords nil
>      '(("\\(Alpha:\\)\\([^\n\r\t]+\\)\\(.\\)"
                                         ^^^
This is not the regexp for a "period".

Also this regexp will clearly not match multiple lines since you
explicitly exclude \n from the matched chars.

> as a local variable, but to no avail. I have searched online, but all
> the examples I've found are based on adding keywords, which is not what
> I want. I'm probably overlooking something simple.

Have you looked at the ELisp reference manual that comes with your Emacs?
It has a section called "Font Lock Multiline".


        Stefan




^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: multi-line highlighting
  2021-02-28 16:00 ` Stefan Monnier
@ 2021-02-28 17:57   ` Colin Baxter
  0 siblings, 0 replies; 5+ messages in thread
From: Colin Baxter @ 2021-02-28 17:57 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: help-gnu-emacs

>>>>> Stefan Monnier <monnier@iro.umontreal.ca> writes:

    >> I have in an org-mode file a need to color the face of the string
    >> between 'Alpha:' and a period. To achieve this I have
    >> 
    >> #+begin_src elisp (add-hook 'org-mode-hook (lambda ()
    >> (font-lock-add-keywords nil
    >> '(("\\(Alpha:\\)\\([^\n\r\t]+\\)\\(.\\)"
    >                                          ^^^ This is not the
    > regexp for a "period".

Yes, I discovered that fact.

I now have what I want working with this:

#+begin_src elisp
(add-hook 'org-mode-hook (lambda ()
   (font-lock-add-keywords nil
               '(("Alpha:\\|." . font-lock-warning-face)
                 ("Alpha:\\([^<]+?\\)." . (1 font-lock-constant-face))
                 ("Beta:\\|." . font-lock-doc-face)
                 ("Beta:\\([^<]+?\\)." .  (1 font-lock-comment-face))))))
#+end_src

My end marker is the FULLWIDTH FULL STOP character. It may not be the
most rigorous solution but it works.

    > Have you looked at the ELisp reference manual that comes with your
    > Emacs?  It has a section called "Font Lock Multiline".

Yes, I did.

Thanks.

Best wishes



^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2021-02-28 17:57 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-02-28 10:01 multi-line highlighting Colin Baxter
2021-02-28 10:13 ` Colin Baxter
2021-02-28 12:34   ` Colin Baxter
2021-02-28 16:00 ` Stefan Monnier
2021-02-28 17:57   ` Colin Baxter

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).