|
From: | Andreas Roehler |
Subject: | Re: abbrevs, skeletons, and comments |
Date: | Sun, 03 Jun 2007 13:43:09 +0200 |
User-agent: | Thunderbird 1.5.0.10 (X11/20070221) |
nobrowser@gmail.com schrieb:
Tim X wrote:nobrowser@gmail.com 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) (expand-abbrev 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.
[Prev in Thread] | Current Thread | [Next in Thread] |