thirdparty/vala-mode.el
author Luke Hoersten <Luke@Hoersten.org>
Mon, 16 May 2011 19:58:15 -0500
changeset 36 d915699fbc26
parent 35 4a9c440b6764
permissions -rw-r--r--
Removed extranious lambda quotes.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
22
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
     1
;;; vala-mode.el --- Vala mode derived mode
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
     2
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
     3
;; Author:     2005 Dylan R. E. Moonfire
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
     4
;;	       2008 Étienne BERSAC
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
     5
;; Maintainer: Étienne BERSAC <[email protected]>
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
     6
;; Created:    2008 May the 4th
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
     7
;; Modified:   May 2008
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
     8
;; Version:    0.1
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
     9
;; Keywords:   vala languages oop
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    10
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    11
;; This program is free software; you can redistribute it and/or modify
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    12
;; it under the terms of the GNU General Public License as published by
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    13
;; the Free Software Foundation; either version 2 of the License, or
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    14
;; (at your option) any later version.
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    15
;; 
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    16
;; This program is distributed in the hope that it will be useful,
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    17
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    18
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    19
;; GNU General Public License for more details.
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    20
;; 
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    21
;; You should have received a copy of the GNU General Public License
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    22
;; along with this program; see the file COPYING.  If not, write to
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    23
;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    24
;; Boston, MA 02111-1307, USA.
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    25
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    26
;;; Commentary:
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    27
;;
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    28
;;    See http://live.gnome.org/Vala for details about Vala language.
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    29
;;
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    30
;;    This is a separate mode to implement the Vala constructs and
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    31
;;    font-locking. It is mostly the csharp-mode from
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    32
;;    http://mfgames.com/linux/csharp-mode with vala specific keywords
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    33
;;    and filename suffixes.
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    34
;;
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    35
;;    Note: The interface used in this file requires CC Mode 5.30 or
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    36
;;    later.
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    37
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    38
;;; .emacs (don't put in (require 'vala-mode))
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    39
;; (autoload 'vala-mode "vala-mode" "Major mode for editing Vala code." t)
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    40
;; (setq auto-mode-alist
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    41
;;    (append '(("\\.vala$" . vala-mode)) auto-mode-alist))
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    42
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    43
;;; Versions:
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    44
;;
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    45
;;	0.1	: Initial version based on csharp-mode
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    46
;;
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    47
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    48
;; This is a copy of the function in cc-mode which is used to handle
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    49
;; the eval-when-compile which is needed during other times.
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    50
(defun c-filter-ops (ops opgroup-filter op-filter &optional xlate)
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    51
  ;; See cc-langs.el, a direct copy.
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    52
  (unless (listp (car-safe ops))
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    53
    (setq ops (list ops)))
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    54
  (cond ((eq opgroup-filter t)
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    55
	 (setq opgroup-filter (lambda (opgroup) t)))
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    56
	((not (functionp opgroup-filter))
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    57
	 (setq opgroup-filter `(lambda (opgroup)
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    58
				 (memq opgroup ',opgroup-filter)))))
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    59
  (cond ((eq op-filter t)
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    60
	 (setq op-filter (lambda (op) t)))
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    61
	((stringp op-filter)
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    62
	 (setq op-filter `(lambda (op)
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    63
			    (string-match ,op-filter op)))))
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    64
  (unless xlate
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    65
    (setq xlate 'identity))
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    66
  (c-with-syntax-table (c-lang-const c-mode-syntax-table)
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    67
    (delete-duplicates
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    68
     (mapcan (lambda (opgroup)
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    69
	       (when (if (symbolp (car opgroup))
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    70
			 (when (funcall opgroup-filter (car opgroup))
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    71
			   (setq opgroup (cdr opgroup))
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    72
			   t)
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    73
		       t)
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    74
		 (mapcan (lambda (op)
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    75
			   (when (funcall op-filter op)
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    76
			     (let ((res (funcall xlate op)))
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    77
			       (if (listp res) res (list res)))))
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    78
			 opgroup)))
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    79
	     ops)
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    80
     :test 'equal)))
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    81
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    82
;; This inserts the bulk of the code.
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    83
(require 'cc-mode)
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    84
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    85
;; These are only required at compile time to get the sources for the
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    86
;; language constants.  (The cc-fonts require and the font-lock
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    87
;; related constants could additionally be put inside an
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    88
;; (eval-after-load "font-lock" ...) but then some trickery is
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    89
;; necessary to get them compiled.)
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    90
(eval-when-compile
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    91
  (let ((load-path
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    92
	 (if (and (boundp 'byte-compile-dest-file)
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    93
		  (stringp byte-compile-dest-file))
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    94
	     (cons (file-name-directory byte-compile-dest-file) load-path)
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    95
	   load-path)))
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    96
    (load "cc-mode" nil t)
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    97
    (load "cc-fonts" nil t)
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    98
    (load "cc-langs" nil t)))
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    99
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   100
(eval-and-compile
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   101
  ;; Make our mode known to the language constant system.  Use Java
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   102
  ;; mode as the fallback for the constants we don't change here.
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   103
  ;; This needs to be done also at compile time since the language
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   104
  ;; constants are evaluated then.
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   105
  (c-add-language 'vala-mode 'java-mode))
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   106
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   107
;; Java uses a series of regexes to change the font-lock for class
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   108
;; references. The problem comes in because Java uses Pascal (leading
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   109
;; space in names, SomeClass) for class and package names, but
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   110
;; Camel-casing (initial lowercase, upper case in words,
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   111
;; i.e. someVariable) for variables.
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   112
;;(error (byte-compile-dest-file))
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   113
;;(error (c-get-current-file))
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   114
(c-lang-defconst c-opt-after-id-concat-key
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   115
  vala (if (c-lang-const c-opt-identifier-concat-key)
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   116
	   (c-lang-const c-symbol-start)))
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   117
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   118
(c-lang-defconst c-basic-matchers-before
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   119
  vala `(
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   120
;;;; Font-lock the attributes by searching for the
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   121
;;;; appropriate regex and marking it as TODO.
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   122
	 ;;,`(,(concat "\\(" vala-attribute-regex "\\)")
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   123
	 ;;   0 font-lock-function-name-face)	   
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   124
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   125
	 ;; Put a warning face on the opener of unclosed strings that
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   126
	 ;; can't span lines.  Later font
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   127
	 ;; lock packages have a `font-lock-syntactic-face-function' for
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   128
	 ;; this, but it doesn't give the control we want since any
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   129
	 ;; fontification done inside the function will be
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   130
	 ;; unconditionally overridden.
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   131
	 ,(c-make-font-lock-search-function
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   132
	   ;; Match a char before the string starter to make
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   133
	   ;; `c-skip-comments-and-strings' work correctly.
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   134
	   (concat ".\\(" c-string-limit-regexp "\\)")
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   135
	   '((c-font-lock-invalid-string)))
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   136
	   
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   137
	 ;; Fontify keyword constants.
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   138
	 ,@(when (c-lang-const c-constant-kwds)
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   139
	     (let ((re (c-make-keywords-re nil
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   140
			 (c-lang-const c-constant-kwds))))
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   141
	       `((eval . (list ,(concat "\\<\\(" re "\\)\\>")
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   142
			       1 c-constant-face-name)))))
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   143
	   
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   144
	 ;; Fontify all keywords except the primitive types.
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   145
	 ,`(,(concat "\\<" (c-lang-const c-regular-keywords-regexp))
a7906973ceb5 Added some old files.
Luke Hoersten <Luke@Hoersten.org>