From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: bojohan+news@dd.chalmers.se (Johan =?utf-8?Q?Bockg=C3=A5rd?=) Newsgroups: gmane.emacs.help Subject: Re: Is there any elisp functions to tell whether the cursor is in a comment block? Date: Sun, 13 Jul 2008 21:03:13 +0200 Message-ID: References: <87tzetis7w.fsf@DEBLAP1.BeNet> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: ger.gmane.org 1215978042 4215 80.91.229.12 (13 Jul 2008 19:40:42 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sun, 13 Jul 2008 19:40:42 +0000 (UTC) To: help-gnu-emacs@gnu.org Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Sun Jul 13 21:41:30 2008 Return-path: Envelope-to: geh-help-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1KI7Rp-0000d0-42 for geh-help-gnu-emacs@m.gmane.org; Sun, 13 Jul 2008 21:41:29 +0200 Original-Received: from localhost ([127.0.0.1]:49937 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KI7Qw-0004az-RO for geh-help-gnu-emacs@m.gmane.org; Sun, 13 Jul 2008 15:40:34 -0400 Original-Path: news.stanford.edu!newsfeed.stanford.edu!goblin1!goblin.stu.neva.ru!newsfeed.straub-nv.de!npeer.de.kpn-eurorings.net!npeer-ng2.kpn.DE!rz.uni-karlsruhe.de!news.belwue.de!LF.net!quimby.gnus.org!not-for-mail Original-Newsgroups: gnu.emacs.help Original-Lines: 53 Original-NNTP-Posting-Host: remote5.student.chalmers.se Original-X-Trace: quimby.gnus.org 1215975814 7464 129.16.29.83 (13 Jul 2008 19:03:34 GMT) Original-X-Complaints-To: usenet@quimby.gnus.org Original-NNTP-Posting-Date: Sun, 13 Jul 2008 19:03:34 +0000 (UTC) Mail-Copies-To: never User-Agent: Gnus/5.110009 (No Gnus v0.9) Emacs/23.0.60 (gnu/linux) Cancel-Lock: sha1:S47zrvIBjGZt8HtjCDewaVrOdRY= Original-Xref: news.stanford.edu gnu.emacs.help:160169 X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Users list for the GNU Emacs text editor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Errors-To: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.help:55516 Archived-At: Joe Bloggs writes: > bojohan+news@dd.chalmers.se (Johan Bockgård) writes: > >> sunway writes: >> >>> for example, if the cursor is in a normal c code block, I want 'if ' >>> to be expanded to 'if () {}', if it is in the comment block, I prefer >>> 'if ' not be expanded. >> >> ;; Non-nil when inside comment or string >> (nth 8 (syntax-ppss (point))) >> >> -- >> Johan Bockgård > > I want to do that too, how do I do a conditional abbrev? > Currently I have: > > (define-abbrev c-mode-abbrev-table "for" > "" 'c-style-for-loop) > (define-abbrev c++-mode-abbrev-table "for" > "" 'c-style-for-loop) > > how would I make it only expand in uncommented code? ;; Emacs 22 has `looking-back' and `syntax-ppss'. ;; Emacs 23 has much more powerful abbrevs; we could simply use the ;; `:enable-function' property. (defmacro define-expander (name predicate expander) `(progn (put ',name 'no-self-insert t) (defun ,name () (when (and ,predicate (re-search-backward "\\<\\w+\\=" nil t)) (delete-region (match-beginning 0) (match-end 0)) ,expander t)))) (define-expander FOR-LOOP (not (nth 8 (parse-partial-sexp (save-excursion (beginning-of-defun) (point)) (point)))) (c-style-for-loop)) (define-abbrev c-mode-abbrev-table "for" t 'FOR-LOOP) -- Johan Bockgård