From 4dd7470dda9b98ef9ab0b4b99ff5481853eb895c Mon Sep 17 00:00:00 2001 From: Sami Samhuri Date: Sat, 27 Feb 2010 11:46:09 -0800 Subject: [PATCH] add objective-j support for emacs --- emacs | 7 + emacs.d/objc-c-mode.el | 284 +++++++++++++++++++++++++++++++++++++++++ emacs.d/objj-mode.el | 31 +++++ 3 files changed, 322 insertions(+) create mode 100644 emacs.d/objc-c-mode.el create mode 100644 emacs.d/objj-mode.el diff --git a/emacs b/emacs index cd476ba..fe30892 100644 --- a/emacs +++ b/emacs @@ -155,6 +155,13 @@ (add-hook 'js2-mode-hook 'c-subword-mode) +;;;;;;;;;;;;;;;;; +;; objective j ;; +;;;;;;;;;;;;;;;;; + +(require 'objj-mode) + + ;;;;;;;;;;;;;;;;;; ;; mojo (webOS) ;; ;;;;;;;;;;;;;;;;;; diff --git a/emacs.d/objc-c-mode.el b/emacs.d/objc-c-mode.el new file mode 100644 index 0000000..8fc0787 --- /dev/null +++ b/emacs.d/objc-c-mode.el @@ -0,0 +1,284 @@ +;;; objc-c-mode.el --- improvements for the XEmacs Objective-C mode + +;; Author: Michael Weber +;; Version: 20020527 +;; Keywords: Objective-C, ObjC +;; Depends: cc-mode, font-lock +;; Tested with: XEmacs 21.4 (patch 6) "Common Lisp" [Lucid] + +;;; Documentation: +;;; ============== +;;; To use this style for your Objective-C buffers, just add +;;; (require 'objc-c-mode) +;;; +;;; to your XEmacs dot-file. It creates a new style `objc', +;;; which is set as default for all objc-mode buffers. +;;; +;;; To further customize, try this: + +;;; (defconst my-c-style +;;; '("objc" +;;; (c-indent-comments-syntactically-p . t) +;;; (c-comment-only-line-offset . 0) +;;; ;;; whatever else here... +;;; +;;; (c-cleanup-list . (brace-else-brace +;;; brace-elseif-brace +;;; empty-defun-braces +;;; defun-close-semi +;;; compact-empty-funcall +;;; ))) +;;; "My C Programming style") +;;; +;;; (defun my-c-mode-common-hook () +;;; (c-add-style "PERSONAL" my-c-style t) +;;; (setq comment-column 40 +;;; tab-width 4 +;;; c-basic-offset tab-width) +;;; +;;; (c-toggle-auto-state 1)) +;;; +;;; ;; activate customizations for all cc-mode derived modes +;;; (add-hook 'c-mode-common-hook 'my-c-mode-common-hook) + +;;; If you want to specifically change the "objc" style, +;;; probably use something like: + +;;; (defconst my-objc-style +;;; '(("objc" +;;; (...) +;;; "My ObjC style"))) +;;; (defun my-objc-mode-hook () +;;; (c-add-style "objc" my-objc-style)) +;;; (add-hook 'objc-mode-hook 'my-objc-mode-hook) + + +;;; Code: +;;; ===== + +(require 'cc-mode) + +;;; Default values. Do not change them here, instead change them like +;;; any other style variable in your customized style. +;;; NOTE: These numbers are ignored anyway, below they are set based on +;;; `c-basic-offset' which is usually what one wants anyway... +(defcustom-c-stylevar objc-method-arg-min-delta-to-bracket 2 + "*Minimun 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." + :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];" + :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];" + :group 'c) + +;; These are the real defaults (set here, because otherwise the +;; indentation whines about them not being defined... *shrug* +(setq c-style-variables (append + '(objc-method-arg-min-delta-to-bracket + objc-method-arg-unfinished-offset + objc-method-parameter-offset) + c-style-variables) + + c-offsets-alist (append + '((objc-method-arg-min-delta-to-bracket . *) + (objc-method-arg-unfinished-offset . +) + (objc-method-parameter-offset . +)) + c-offsets-alist)) + + +(defun c-lineup-ObjC-method-call-colons (langelem) + "Line up the colons of selector args with the first selector. + +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'." + + (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) + ))))) + + +;;; create and add style +(c-add-style "objc" + '("gnu" + (c-offsets-alist . ((objc-method-call-cont . + (c-lineup-ObjC-method-call-colons + c-lineup-ObjC-method-call + +)) + )) + )) + +(setq c-default-style (cons '(objc-mode . "objc") + c-default-style)) + + +;; +;; Now for the font-locking part... :) +;; +(require 'font-lock) + +(put 'objc-mode 'font-lock-defaults + '((objc-font-lock-keywords + objc-font-lock-keywords-1 + objc-font-lock-keywords-2 + objc-font-lock-keywords-3) + ;; TODO: ?_ is not a good idea in ObjC specifiers... + nil nil ((?_ . "w")) beginning-of-defun)) + +(let* ((ctoken "\\(?:\\sw\\|\\s_\\|[:~*&]\\)+") + (objc-keywords "YES\\|NO\\|[Nn]il\\|self\\|super") + (objc-type-types "id\\|Class\\|SEL\\|IMP\\|BOOL") + (addon-objc-font-lock-keywords-1 + (list ;; nothing to do here... + )) + (addon-objc-font-lock-keywords-2 + (append addon-objc-font-lock-keywords-1 + (list + ;; first part of selector (in a declaration) + (list (concat "^[+-][ \t]*" + "\\((" ctoken "[ \t]*[*]*)\\)?[ \t]*" + "\\(\\sw+\\)" + ) + '(2 font-lock-function-name-face)) + ;; part of a selector + '("\\sw*:" 0 font-lock-function-name-face t) + ;; Fontify all type specifiers. + (cons (concat "\\<\\(" objc-type-types "\\)\\>") + 'font-lock-type-face) + ;; Fontify all builtin keywords + (cons (concat "\\<\\(" objc-keywords "\\)\\>") + 'font-lock-keyword-face) + ;; Fontify specific keywords + (cons (concat "^" (regexp-opt (list + "@implementation" "@interface" + "@protocol" "@end" "@public" + "@private" "@protected" + ) t)) + 'font-lock-keyword-face) + + (list (concat "\\(" + (regexp-opt (list + "@class" "@defs" "@encode" "@selector" + "@protocol" + )) + "\\)[ \t]*(") + 1 'font-lock-keyword-face) + + '("^#[ \t]*import[ \t]+\\(<[^>\"\n]+>\\)" + 1 font-lock-string-face) + ) + )) + (addon-objc-font-lock-keywords-3 + (append addon-objc-font-lock-keywords-2 + (list + ;; get argument-less selectors' highlighting right + ;; [[foo _bar_] _baz_] -> bar, baz are highlighted + (cons (concat "\\(\\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)) + )))) + (unless (or (eq ?: non-ws-before-match) + (eq ?\[ non-ws-before-match)) + 'font-lock-function-name-face)))) + + (cons (concat "\\<\\(" objc-type-types "\\)\\>" + "\\([ \t*&]+\\sw+\\>\\)*") + ;; taken verbatim from font-lock.el + '(font-lock-match-c++-style-declaration-item-and-skip-to-next + (goto-char (or (match-beginning 8) (match-end 1))) + (goto-char (match-end 1)) + (1 (if (match-beginning 4) + font-lock-function-name-face + font-lock-variable-name-face)))) + (cons (concat "\\<" + (regexp-opt (list + "NS_DURING" "NS_HANDLER" "NS_ENDHANDLER" + "RECREATE_AUTORELEASE_POOL" + "CREATE_AUTORELEASE_POOL" + "ASSIGNCOPY" "ASSIGN" "RETAIN" + "DESTROY" "AUTORELEASE" "RELEASE" + ) t) + "\\>") + 'font-lock-preprocessor-face) + ))) + ) + + (setq objc-font-lock-keywords-1 (append c-font-lock-keywords-1 + addon-objc-font-lock-keywords-1) + + objc-font-lock-keywords-2 (append c-font-lock-keywords-2 + addon-objc-font-lock-keywords-2) + + objc-font-lock-keywords-3 (append c-font-lock-keywords-3 + addon-objc-font-lock-keywords-3) + )) + + +(defvar objc-font-lock-keywords objc-font-lock-keywords-1 + "Default expressions to highlight in ObjC mode.") + + +(provide 'objc-c-mode) + +;;; objc-c-mode.el ends here diff --git a/emacs.d/objj-mode.el b/emacs.d/objj-mode.el new file mode 100644 index 0000000..6ffea6d --- /dev/null +++ b/emacs.d/objj-mode.el @@ -0,0 +1,31 @@ +;;; objj-mode.el --- Major mode for editing Objective-J (Cappuccino) files +;;; Written by Geoffrey Grosenbach http://peepcode.com + +;;; Builds on the excellent objc-mode from http://www.foldr.org/~michaelw/objective-c/objc-c-mode.el + +;;; To install, save this somewhere and add the following to your .emacs file: +;;; +;;; (add-to-list 'load-path "/path/to/objc-c-mode.el") +;;; (add-to-list 'load-path "/path/to/objj-mode.el") +;;; (require 'objj-mode) +;;; +;;; Features: +;;; * Syntax highlighting +;;; * Indentation (minimal adherence to Obj-J coding style guidelines) + +(require 'objc-c-mode) + +(define-derived-mode objj-mode objc-mode + "Objective-J" + "Major mode for editing Objective-J files." + (setq c-basic-offset 4) ;; 4 spaces for tab + (setq indent-tabs-mode nil) ;; Spaces, not tabs + (c-set-offset 'substatement-open 0) ;; Curly brace on next line + ) + +;; TODO: Define more syntax settings to comply with http://cappuccino.org/contribute/coding-style.php + +(add-to-list 'auto-mode-alist '("\\.j$" . objj-mode)) + +(provide 'objj-mode) +