unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: "Adrian Robert" <adrian.b.robert@gmail.com>
To: emacs-devel@gnu.org
Subject: cc-mode enhancement for Objective-C
Date: Sat, 13 Oct 2007 09:43:30 +0300	[thread overview]
Message-ID: <55f7df060710122343j6cc17fc8qa73ef5964fc4068a@mail.gmail.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 1515 bytes --]

Hi,

This patch, against emacs-unicode-2/lisp/progmodes, enhances cc-mode's
handling of Objective-C:

- auto-indent method calls by colons (like XCode)
- syntax highlighting for method calls
- add more constants for font-lock highlighting

The original version was written by Michael Weber, and I updated it
for GNU emacs-21+.  I'd be interested in getting it into the emacs
distribution as it would provide a better out-of-box environment for
Objective-C developers.  I'm unsure if that means it needs to go into
cc-mode's own tree?  I sent a couple of messages a while ago to
cc-mode's own list but they may have been drowned in spam.
(http://article.gmane.org/gmane.emacs.cc-mode-general/2692)

(If there are any Obj-C devs using emacs on this list, perhaps they
could try the patch -- it's also built-in to the Emacs.app
distribution at http://emacs-app.sf.net/ )


Changed files:

cc-align.el (c-lineup-ObjC-method-call-colons): New function to indent
	method calls.

cc-fonts.el (c-complex-decl-matchers: c-font-lock-objc-methods): Add code to
	highlight method calls.

cc-langs.el (c-constant-kwds): Add constant keywords for ObjC boolean types,
	exception macros, and GNUstep ref-counting macros.

cc-menus.el (cc-imenu-objc-function): Drop obsolete calls to
	imenu-progress-message.

cc-vars.el (objc-method-arg-min-delta-to-bracket,
	objc-method-arg-unfinished-offset, objc-method-parameter-offset): New
	variables for customizing (c-lineup-ObjC-method-call).
	(c-offsets-alist): Add ObjC-specific rules.

[-- Attachment #2: objc-enhance_v3.patch --]
[-- Type: application/octet-stream, Size: 5958 bytes --]

Index: cc-align.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/progmodes/cc-align.el,v
retrieving revision 1.20.2.13
diff -r1.20.2.13 cc-align.el
910a911,953
> (defun c-lineup-ObjC-method-call-colons (langelem)
>   "Line up selector args as Project Builder / XCode: colons of first
>    selector portions on successive lines are aligned.  If no decision can
>    be made return NIL, so that other lineup methods can be tried.  This is
>    typically chained with `c-lineup-ObjC-method-call'.
> 
> Works with: objc-method-call-cont."
>   (save-excursion
>     (catch 'no-idea
>       (let* ((method-arg-len (progn
> 			       (back-to-indentation)
> 			       (if (search-forward ":" (c-point 'eol) 'move)
> 				   (- (point) (c-point 'boi))
> 				 ; no complete argument to indent yet
> 				 (throw 'no-idea nil))))
> 
> 	     (extra (save-excursion 
>                       ; indent parameter to argument if needed
> 		      (back-to-indentation)
> 		      (c-backward-syntactic-ws (cdr langelem))
> 		      (if (eq ?: (char-before))
> 			  (c-get-offset '(objc-method-parameter-offset . nil))
> 			0)))
> 
> 	     (open-bracket-col (c-langelem-col langelem))
> 
> 	     (arg-ralign-colon-ofs (progn
> 			(forward-char) ; skip over '['
> 			; skip over object/class name
> 			; and first argument
> 			(c-forward-sexp 2)
> 			(if (search-forward ":" (c-point 'eol) 'move)
> 			    (- (current-column) open-bracket-col
> 			       method-arg-len extra)
> 			  ; previous arg has no param
>   			  (c-get-offset
> 			   '(objc-method-arg-unfinished-offset . nil))))))
> 
> 	(if (>= arg-ralign-colon-ofs
> 		(c-get-offset '(objc-method-arg-min-delta-to-bracket . nil)))
> 	    (+ arg-ralign-colon-ofs extra)
> 	  (throw 'no-idea nil))))))
> 
912c955
<   "Line up the colons that separate args.
---
>   "Line up the colons that separate args in a method declaration.
936c979
<   "Line up the colons that separate args.
---
>   "Line up the colons that separate args in a method declaration.
Index: cc-fonts.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/progmodes/cc-fonts.el,v
retrieving revision 1.2.2.17
diff -r1.2.2.17 cc-fonts.el
1322c1322,1350
< 	      c-font-lock-objc-methods))
---
> 
> 	      c-font-lock-objc-methods
> 
> 	      ;; Parts of selector name in messages
> 	      ;; PENDING: perhaps should change to only pick up inside brackets
> 	      ("\\sw*:" 0 font-lock-function-name-face keep t)
> 
> 	      ;; get argument-less selectors' highlighting right
> 	      ;; [[foo _bar_] _baz_] -> bar, baz are highlighted
> 	      ("\\(\\sw+\\)[ \t]*[]]"
> 		(1 (let ((non-ws-before-match (char-before 
> 			      (save-excursion
> 				(goto-char (match-beginning 1))
> 				;; expensive!
> 				(c-backward-syntactic-ws (c-point 'bol))
> 				(point)
> 				))))
> 		      (unless (or (eq ?:  non-ws-before-match)
> 				  (eq ?\[ non-ws-before-match)
> 				  (eq ?> non-ws-before-match))
> 			font-lock-function-name-face)))))
> 	  ;; PENDING: unsure if c-nonlabel-token-key or c-opt-extra-label-key
> 	  ;;          should be used here
> 	  (when (c-lang-const c-opt-extra-label-key)
> 	    `(,(c-make-font-lock-search-function
> 		(c-lang-const c-opt-extra-label-key)
> 		'((c-put-char-property (1- (match-end 0))
> 				       'c-type 'c-decl-end)))))
> 	  )
Index: cc-langs.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/progmodes/cc-langs.el,v
retrieving revision 1.25.2.19
diff -r1.25.2.19 cc-langs.el
2065c2065
<   objc    '("nil" "Nil")
---
>   objc    '("nil" "Nil" "YES" "NO" "NS_DURING" "NS_HANDLER" "NS_ENDHANDLER" "ASSIGN" "RELEASE" "AUTORELEASE" "RETAIN" "DESTROY" "CREATE_AUTORELEASE_POOL" "RECREATE_AUTORELEASE_POOL")
Index: cc-menus.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/progmodes/cc-menus.el,v
retrieving revision 1.25.2.9
diff -r1.25.2.9 cc-menus.el
332d331
<     (imenu-progress-message stupid 0)
335d333
<       (imenu-progress-message stupid)
387d384
<     (imenu-progress-message stupid 100)
Index: cc-vars.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/progmodes/cc-vars.el,v
retrieving revision 1.31.2.17
diff -r1.31.2.17 cc-vars.el
914a915,953
> (defcustom-c-stylevar objc-method-arg-min-delta-to-bracket 2
>   "*Minimum number of chars to the opening bracket.
> 
> Consider this ObjC snippet:
> 
> 	[foo blahBlah: fred
> 	|<-x->|barBaz: barney
> 
> If `x' is less than this number then `c-lineup-ObjC-method-call-colons'
> will defer the indentation decision to the next function.  By default
> this is `c-lineup-ObjC-method-call', which would align it like:
> 
> 	[foo blahBlahBlah: fred
> 	     thisIsTooDamnLong: barney
> 
> This behaviour can be overridden by customizing the indentation of
> `objc-method-call-cont' in the \"objc\" style."
>   :type 'integer
>   :group 'c)
> 
> (defcustom-c-stylevar objc-method-arg-unfinished-offset 4
>   "*Offset relative to bracket if first selector is on a new line.
> 
>     [aaaaaaaaa
>     |<-x->|bbbbbbb:  cccccc
>              ddddd: eeee];"
>   :type 'integer
>   :group 'c)
> 
> (defcustom-c-stylevar objc-method-parameter-offset 4
>   "*Offset for selector parameter on a new line (relative to first selector.
> 
>     [aaaaaaa bbbbbbbbbb:
> 	     |<-x->|cccccccc
>                     ddd: eeee
>                    ffff: ggg];"
>   :type 'integer
>   :group 'c)
> 
1100c1139,1144
<        (objc-method-call-cont . c-lineup-ObjC-method-call)
---
>        (objc-method-call-cont . (c-lineup-ObjC-method-call-colons
> 			        c-lineup-ObjC-method-call +))
>        ;; Anchor pos: (used by c-lineup-method-call-colons)
>        (objc-method-arg-min-delta-to-bracket	. *)
>        (objc-method-arg-unfinished-offset	. +)
>        (objc-method-parameter-offset		. +)

[-- Attachment #3: Type: text/plain, Size: 142 bytes --]

_______________________________________________
Emacs-devel mailing list
Emacs-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-devel

             reply	other threads:[~2007-10-13  6:43 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-10-13  6:43 Adrian Robert [this message]
2007-10-13 19:48 ` cc-mode enhancement for Objective-C Richard Stallman
2007-10-14  5:49   ` Adrian Robert
2007-10-15  1:36     ` Richard Stallman
2007-10-15 15:35       ` Adrian Robert
2007-10-17 11:12       ` Adrian Robert
2007-10-17 20:49         ` Richard Stallman
2007-10-23  6:33           ` Adrian Robert
     [not found]             ` <55f7df060711230243i27c14a3fj44cce23ec26d76e8@mail.gmail.com>
2008-03-05  5:01               ` Adrian Robert
2007-10-13 21:13 ` Alan Mackenzie
2007-10-14  6:08   ` Adrian Robert
2007-10-14  6:10     ` Adrian Robert
2007-10-14  8:29     ` Alan Mackenzie

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=55f7df060710122343j6cc17fc8qa73ef5964fc4068a@mail.gmail.com \
    --to=adrian.b.robert@gmail.com \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

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).