From: Alan Mackenzie Date: Thu, 30 Apr 2009 10:36:24 +0000 (+0000) Subject: Enhancements for Objective-C: X-Git-Tag: emacs-pretest-23.0.93~12 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=f0e4b2f240536ea8bc5aa66e559d62083c33e209;p=emacs.git Enhancements for Objective-C: cc-vars.el (c-objc-method-arg-min-delta-to-bracket, c-objc-method-arg-unfinished-offset, c-objc-method-parameter-offset): New variables. (c-offsets-alist): Use c-lineup-ObjC-method-call-colons in entry for objc-method-call-cont. cc-langs.el (c-constant-kwds): New ObjC keywords "YES", "NO", "NS_DURING", "NS_HANDLER", "NS_ENDHANDLER". cc-align.el (c-lineup-ObjC-method-call-colons): New function. --- diff --git a/lisp/progmodes/cc-align.el b/lisp/progmodes/cc-align.el index ff22eba0c33..c9dd92f46b2 100644 --- a/lisp/progmodes/cc-align.el +++ b/lisp/progmodes/cc-align.el @@ -907,8 +907,48 @@ Works with: objc-method-call-cont." ) (- target-col open-bracket-col extra)))) +(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 (c-langelem-pos langelem)) + (if (eq ?: (char-before)) + c-objc-method-parameter-offset 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-objc-method-arg-unfinished-offset)))) + + (if (>= arg-ralign-colon-ofs c-objc-method-arg-min-delta-to-bracket) + (+ arg-ralign-colon-ofs extra) + (throw 'no-idea nil)))))) + (defun c-lineup-ObjC-method-args (langelem) - "Line up the colons that separate args. + "Line up the colons that separate args in a method declaration. The colon on the current line is aligned with the one on the first line. @@ -932,7 +972,7 @@ Works with: objc-method-args-cont." c-basic-offset))))) (defun c-lineup-ObjC-method-args-2 (langelem) - "Line up the colons that separate args. + "Line up the colons that separate args in a method declaration. The colon on the current line is aligned with the one on the previous line. diff --git a/lisp/progmodes/cc-langs.el b/lisp/progmodes/cc-langs.el index 1a4fba2c8a1..cc35daa02ff 100644 --- a/lisp/progmodes/cc-langs.el +++ b/lisp/progmodes/cc-langs.el @@ -2149,7 +2149,7 @@ This construct is \" :\"." t nil (c c++) '("NULL" ;; Not a keyword, but practically works as one. "false" "true") ; Defined in C99. - objc '("nil" "Nil") + objc '("nil" "Nil" "YES" "NO" "NS_DURING" "NS_HANDLER" "NS_ENDHANDLER") idl '("TRUE" "FALSE") java '("true" "false" "null") ; technically "literals", not keywords pike '("UNDEFINED")) ;; Not a keyword, but practically works as one. diff --git a/lisp/progmodes/cc-vars.el b/lisp/progmodes/cc-vars.el index fa5aa538d72..a1f7d3ad3f2 100644 --- a/lisp/progmodes/cc-vars.el +++ b/lisp/progmodes/cc-vars.el @@ -936,6 +936,45 @@ this variable to nil." :type 'integer :group 'c) +(defcustom c-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-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-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) + (defcustom c-default-style '((java-mode . "java") (awk-mode . "awk") (other . "gnu")) "*Style which gets installed by default when a file is visited. @@ -1121,7 +1160,8 @@ can always override the use of `c-default-style' by making calls to ;; Anchor pos: Boi. (objc-method-args-cont . c-lineup-ObjC-method-args) ;; Anchor pos: At the method start (always at boi). - (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: At the open bracket. (extern-lang-open . 0) (namespace-open . 0)