[Top][All Lists]

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

Re: abbrevs, skeletons, and comments

From: Andreas Roehler
Subject: Re: abbrevs, skeletons, and comments
Date: Sun, 03 Jun 2007 13:43:09 +0200
User-agent: Thunderbird (X11/20070221)

address@hidden schrieb:
Tim X wrote:
address@hidden writes:

In a module I'm writing, I'd like to bind abbrevs to code skeletons,
similar to what is done e.g. by sml-mode.  But expanding the abbrevs
makes no sense when the point is inside a comment (or a string
literal).  So I'd like to conditionally stop expansion.  The main
opportunity for that seems to be pre-abbrev-expand-hook, but there are
only two ways it can stop an expansion: 1, throw an error, 2, change
the abbrev bindings (either by making changes in the current table or
by swapping in a whole new table). 1 is unacceptable - how many errors
before user gets mad and disables abbrevs altogether? 2, how to undo
the changes when the point leaves the comment or string?

maybe use an error handler that catches that specific error and ignores it?

Well, there's no point where I get control, that's the problem.
Abbrev expansion can be triggered just by the user typing a space or
period, if they have Abbrev minor mode on.

I see a way to do what I want.  It involves hooking both pre-abbrev-
expand-hook and post-command-hook.  I can restore the abbrev bindings
in the latter.  But I am afraid what this could do to Emacs speed or
even stability.

What I've decided on so far is I won't do anything by default (so
users who avoid Abbrev minor mode are not penalized) and have a
customize flag that turns on the above solution.

Other suggestions still welcome.

You could write

(unless (in-string-p)

Concerning comments, you may use

| (defun comment-beginning ()
|   "Find the beginning of the enclosing comment.
| Returns nil if not inside a comment, else moves point and returns
| the same as `comment-search-backward'."

If `font-lock' at point is reliable, another (probably faster)
approach could be

(get-text-property (point) 'face)

to determine if inside a comment.

reply via email to

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