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