Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

new major mode doubts

13 views
Skip to first unread message

Luca Ferrari

unread,
Jan 17, 2013, 3:07:34 AM1/17/13
to help-gnu-emacs
Hi all,
as an exercise I'm trying to implement my own major mode for a
programming language (dataflex, for what it matters). I'm following
the Mode Tutorial http://emacswiki.org/emacs/ModeTutorial and so far
I've the skeleton of the mode to work for me.
However, I've got a couple of doubts:

1) in the keyword list I specified a regexp for uppercase keywords as follows:

(defconst dataflex-font-lock-keywords-minimal
(list
'("\\<\\(BEGIN\\|E\\(?:LSE\\|ND\\)\\|FOR\\|IF\\|LOOP\\|MOVE\\|||T\\(?:HEN\\|O\\)\\|WHILE\\)\\>"
. font-lock-builtin-face )
'("\\('\\w*'\\)" . font-lock-variable-name-face) )
"Main (and minimal) highlighting for the Dataflex mode keywords" )

however my keywords could be camel case (therefore BEGIN, begin, bEgin
are all the same). Do I have to specify upper and lower case words
individually (avoiding the mess of the camel case) or is there a
smarter way to do it (e.g., checking the font lock against lowercased
words)?

2) the commenting is behaving in a strange manner: I've c++ comments,
therefore // .... and so I've defined the following:
(defun dataflex-comment-dwim (arg)
"Comment (in/out) a Dataflex piece of source code. It is based on comment-dwin
of newcomment.el"
(interactive "*P")
(require 'newcomment)
(let ( (comment-start "//") (comment-end "") )
(comment-dwim arg)))

but while it works for M-; comment, commenting out awhole region
causes each line to be included into a couple of // as

a line of code

becoming

// a line of code //

it seems as it comments out the region and for each line places an
empty comment at the end. Any idea on what I'm missing?

Thanks,
Luca

Luca Ferrari

unread,
Jan 17, 2013, 3:14:36 AM1/17/13
to help-gnu-emacs
> 2) the commenting is behaving in a strange manner: I've c++ comments,
> therefore // .... and so I've defined the following:
> (defun dataflex-comment-dwim (arg)
> "Comment (in/out) a Dataflex piece of source code. It is based on comment-dwin
> of newcomment.el"
> (interactive "*P")
> (require 'newcomment)
> (let ( (comment-start "//") (comment-end "") )
> (comment-dwim arg)))

I found a problem with another assignment to comment-start and
comment-end that clashes with the above, so now this problem is fixed!

Luca

Doug Lewan

unread,
Jan 17, 2013, 9:53:26 AM1/17/13
to Luca Ferrari, help-gnu-emacs
WRT Possible camel case: RE-matching in emacs is generally case-insensitive unless you make case-fold-search nil. So, you should get what you want for free.

,Douglas
Douglas Lewan
Shubert Ticketing
(201) 489-8600 ext 224

When I do good, I feel good. When I do bad, I feel bad and that's my religion. - Abraham Lincoln
> 2) the commenting is behaving in a strange manner: I've c++ comments,
> therefore // .... and so I've defined the following:
> (defun dataflex-comment-dwim (arg)
> "Comment (in/out) a Dataflex piece of source code. It is based on
> comment-dwin
> of newcomment.el"
> (interactive "*P")
> (require 'newcomment)
> (let ( (comment-start "//") (comment-end "") )
> (comment-dwim arg)))
>

Aurélien Aptel

unread,
Jan 17, 2013, 10:52:30 AM1/17/13
to Luca Ferrari, help-gnu-emacs
On Thu, Jan 17, 2013 at 9:07 AM, Luca Ferrari <fluc...@infinito.it> wrote:
> (list
> '("\\<\\(BEGIN\\|E\\(?:LSE\\|ND\\)\\|FOR\\|IF\\|LOOP\\|MOVE\\|||T\\(?:HEN\\|O\\)\\|WHILE\\)\\>"
> . font-lock-builtin-face )
> '("\\('\\w*'\\)" . font-lock-variable-name-face) )
> "Main (and minimal) highlighting for the Dataflex mode keywords" )

I don't know much about writing modes but I think you should use
either `rx' or `regexp-opt` for this kind of regex.

Dmitry Gutov

unread,
Jan 17, 2013, 10:03:43 PM1/17/13
to Luca Ferrari, help-gnu-emacs
Luca Ferrari <fluc...@infinito.it> writes:

> Hi all,
> as an exercise I'm trying to implement my own major mode for a
> programming language (dataflex, for what it matters). I'm following
> the Mode Tutorial http://emacswiki.org/emacs/ModeTutorial and so far
> I've the skeleton of the mode to work for me.
> However, I've got a couple of doubts:
>
> 1) in the keyword list I specified a regexp for uppercase keywords as follows:
>
> (defconst dataflex-font-lock-keywords-minimal
> (list
> '("\\<\\(BEGIN\\|E\\(?:LSE\\|ND\\)\\|FOR\\|IF\\|LOOP\\|MOVE\\|||T\\(?:HEN\\|O\\)\\|WHILE\\)\\>"
> . font-lock-builtin-face )
> '("\\('\\w*'\\)" . font-lock-variable-name-face) )
> "Main (and minimal) highlighting for the Dataflex mode keywords" )
>
> however my keywords could be camel case (therefore BEGIN, begin, bEgin
> are all the same). Do I have to specify upper and lower case words
> individually (avoiding the mess of the camel case) or is there a
> smarter way to do it (e.g., checking the font lock against lowercased
> words)?

See the `font-lock-defaults' doc. The third element is CASE-FOLD, and
this value is assigned to `font-lock-keywords-case-fold-search', which
also see.

Luca Ferrari

unread,
Jan 19, 2013, 4:40:00 AM1/19/13
to help-gnu-emacs
> See the `font-lock-defaults' doc. The third element is CASE-FOLD, and
> this value is assigned to `font-lock-keywords-case-fold-search', which
> also see.

Thanks, I missed it.

Luca

0 new messages