add objective-j support for emacs
This commit is contained in:
parent
5fe5323355
commit
4dd7470dda
3 changed files with 322 additions and 0 deletions
7
emacs
7
emacs
|
|
@ -155,6 +155,13 @@
|
||||||
(add-hook 'js2-mode-hook 'c-subword-mode)
|
(add-hook 'js2-mode-hook 'c-subword-mode)
|
||||||
|
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;
|
||||||
|
;; objective j ;;
|
||||||
|
;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
(require 'objj-mode)
|
||||||
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;
|
||||||
;; mojo (webOS) ;;
|
;; mojo (webOS) ;;
|
||||||
;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;
|
||||||
|
|
|
||||||
284
emacs.d/objc-c-mode.el
Normal file
284
emacs.d/objc-c-mode.el
Normal file
|
|
@ -0,0 +1,284 @@
|
||||||
|
;;; objc-c-mode.el --- improvements for the XEmacs Objective-C mode
|
||||||
|
|
||||||
|
;; Author: Michael Weber <michaelw@foldr.org>
|
||||||
|
;; 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
|
||||||
31
emacs.d/objj-mode.el
Normal file
31
emacs.d/objj-mode.el
Normal file
|
|
@ -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)
|
||||||
|
|
||||||
Loading…
Reference in a new issue