Merge dotemacs project as our subdirectory
This commit is contained in:
commit
7c4787a7f4
13 changed files with 24995 additions and 0 deletions
82
dotemacs/.emacs
Normal file
82
dotemacs/.emacs
Normal file
|
@ -0,0 +1,82 @@
|
|||
(add-to-list 'load-path "~/.emacs.d")
|
||||
|
||||
;; Requires
|
||||
(require 'paren)
|
||||
(require 'uniquify)
|
||||
(require 'autopair)
|
||||
(require 'color-theme)
|
||||
|
||||
;; Autoloads
|
||||
(autoload 'vala-mode
|
||||
"vala-mode.el" "A Major mode for editing Vala files" t)
|
||||
(autoload 'csharp-mode
|
||||
"csharp-mode.el" "A Major mode for editing C# files" t)
|
||||
(autoload 'javascript-mode
|
||||
"javascript.el" "A Major mode for editing JavaScript files" t)
|
||||
(autoload 'sqlplus-mode
|
||||
"sqlplus,el" "A Major mode for communicating with Oracle" t)
|
||||
(autoload 'batch-mode
|
||||
"batch-mode.el" "A Major mode for editing Batch files" t)
|
||||
(autoload 'rainbow-mode
|
||||
"rainbow-mode.el" "A Minor mode for showing colors inline" t)
|
||||
|
||||
;; Functions
|
||||
(defun what-face (pos)
|
||||
"Find out which face the current position uses"
|
||||
(interactive "d")
|
||||
(let ((face (or (get-char-property (point) 'read-face-name)
|
||||
(get-char-property (point) 'face))))
|
||||
(if face (message "Face: %s" face) (message "No face at %d" pos))))
|
||||
|
||||
(defun my-comp-finish-function (buf str)
|
||||
(if (string-match "exited abnormally" str)
|
||||
;; there were errors
|
||||
(message "compilation errors, press C-x ` to visit")
|
||||
;; no errors, make the compilation window go away in 0.5 seconds
|
||||
(run-at-time 0.5 nil 'delete-windwos-on buf)
|
||||
(message "NO COMPILATION ERRORS!")))
|
||||
|
||||
;; Platform specifics
|
||||
(if (eq system-type 'gnu/linux) ; if we're running linux
|
||||
(set-default-font "-xos4-terminus-medium-*-*-*-14-*-*-*-*-*-*-*"))
|
||||
|
||||
;; Variables
|
||||
(setq
|
||||
inhibit-startup-message t ; don't show welcom screen
|
||||
require-final-newline t ; always append a newline to a file, if it doesn't have one
|
||||
font-lock-maximum-decoration t ; denotes my interest in maximum possible fontification
|
||||
uniquify-buffer-name-style 'reverse ; reverse uniquify file names
|
||||
backup-directory-alist `((".*" . ,temporary-file-directory)) ; backup filelocation
|
||||
auto-save-file-name-transforms `((".*" ,temporary-file-directory t)) ; autosave file location
|
||||
compilation-finish-function 'my-comp-finish-function) ; show short message after compilation
|
||||
|
||||
(setq-default indent-tabs-mode nil) ; spaces, no tabs
|
||||
|
||||
(fset 'yes-or-no-p 'y-or-n-p) ; switch yes or no answers to y or n answers
|
||||
|
||||
;; Mode settings
|
||||
( tool-bar-mode -1) ; no toolbar
|
||||
( menu-bar-mode -1) ; no menu
|
||||
( line-number-mode -1) ; don't show line numbers in splitter
|
||||
( global-linum-mode t) ; show line numbers in gutter
|
||||
( column-number-mode t) ; show column numbers in splitter
|
||||
(global-font-lock-mode t) ; show syntax highlighting
|
||||
( show-paren-mode t) ; show matching parens
|
||||
( autopair-global-mode) ; enable autopair mode
|
||||
(delete-selection-mode t) ; delete selection upon typing
|
||||
|
||||
;; Keybindings
|
||||
(global-set-key "\C-m" 'newline-and-indent) ; Automatically indent on newline
|
||||
|
||||
;; File associations
|
||||
(add-to-list 'auto-mode-alist '("\\.vala$" . vala-mode))
|
||||
(add-to-list 'auto-mode-alist '("\\.vapi$" . vala-mode))
|
||||
(add-to-list 'auto-mode-alist '("\\.cs$" . csharp-mode))
|
||||
(add-to-list 'auto-mode-alist '("\\.bat$" . batch-mode))
|
||||
|
||||
(add-to-list 'file-coding-system-alist '("\\.vala$" . utf-8))
|
||||
(add-to-list 'file-coding-system-alist '("\\.vapi$" . utf-8))
|
||||
|
||||
;; Color theme
|
||||
(require 'color-theme-weirdness)
|
||||
(color-theme-weirdness)
|
1036
dotemacs/.emacs.d/autopair.el
Normal file
1036
dotemacs/.emacs.d/autopair.el
Normal file
File diff suppressed because it is too large
Load diff
156
dotemacs/.emacs.d/batch-mode.el
Normal file
156
dotemacs/.emacs.d/batch-mode.el
Normal file
|
@ -0,0 +1,156 @@
|
|||
;;; batch-mode.el --- major mode for editing ESRI batch scrips
|
||||
;;; Copyright (C) 2002, Agnar Renolen <agnar.renolen@emap.no>
|
||||
;;; Modified (c) 2009, Matthew Fidler <matthew.fidler at gmail.com>
|
||||
;;; Fixed indents (and labels)
|
||||
|
||||
;; batch-mode.el is free software; you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation; either version 2 of the License, or
|
||||
;; (at your option) any later version.
|
||||
|
||||
;; This program is distributed in the hope that it will be useful,
|
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;; GNU General Public License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with this program; if not, write to the Free Software
|
||||
;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
;; This is version 1.0 of 21 August 2002.
|
||||
|
||||
;;; Comentary:
|
||||
|
||||
;; The batch-mode provides syntax hilighting and auto-indentation for
|
||||
;; DOS batch files (.bat). and auto-idendation.
|
||||
|
||||
;; Agnar Renolen, <agnar.renolen@emap.no>
|
||||
|
||||
;;; Code:
|
||||
|
||||
(defgroup batch nil
|
||||
"Major mode for editing batch code"
|
||||
:prefix "batch-"
|
||||
:group 'languages)
|
||||
|
||||
; (defvar batch-mode-hook nil
|
||||
; "Hooks called when batch mode fires up."
|
||||
; :type 'hook
|
||||
; :group 'batch)
|
||||
|
||||
(defvar batch-mode-map nil
|
||||
"Keymap used with batch code")
|
||||
|
||||
(defcustom batch-indent-level 4
|
||||
"Amount by which batch subexpressions are indented."
|
||||
:type 'integer
|
||||
:group 'batch)
|
||||
|
||||
(defvar batch-font-lock-keywords
|
||||
(eval-when-compile
|
||||
(list
|
||||
; since we can't specify batch comments through the syntax table,
|
||||
; we have to specify it here, and override whatever is highlighted
|
||||
'( "^[ \t]*rem\\>.*" (0 font-lock-comment-face t))
|
||||
|
||||
; since the argument to the echo command is a string, we format it
|
||||
; as a string
|
||||
'( "\\<echo\\>[ \t]*\\(.*\\)" (1 font-lock-string-face t))
|
||||
|
||||
; the argument of the goto statement is a label
|
||||
'( "\\<goto\\>[ \t]*\\([a-zA-Z0-9_]+\\)" (1
|
||||
font-lock-constant-face))
|
||||
|
||||
; the keywords of batch (which are not built-in commands)
|
||||
(concat "\\<\\(cmdextversion\\|"
|
||||
"d\\(efined\\|isableextensions\\|o\\)\\|"
|
||||
"e\\(lse\\|n\\(ableextensions\\|dlocal\\)"
|
||||
"\\|qu\\|rrorlevel\\|xist\\)\\|for\\|"
|
||||
"goto\\|i[fn]\\|n\\(eq\\|ot\\)\\|setlocal\\)\\>")
|
||||
|
||||
; built-in DOS commands
|
||||
(cons (concat "\\<\\(a\\(ssoc\\|t\\(\\|trib\\)\\)\\|break\\|"
|
||||
"c\\(a\\(cls\\|ll\\)\\|d\\|h\\(cp\\|dir\\|k\\("
|
||||
"dsk\\|ntfs\\)\\)\\|ls\\|md\\|o\\(lor\\|mp\\(\\|act\\)"
|
||||
"\\|nvert\\|py\\)\\)\\|d\\(ate\\|el\\|i\\("
|
||||
"r\\|skco\\(mp\\|py\\)\\)\\|oskey\\)\\|"
|
||||
"e\\(cho\\|rase\\|xit\\)\\|"
|
||||
"f\\(c\\|ind\\(\\|str\\)\\|for\\(\\|mot\\)\\|type\\)\\|"
|
||||
"graftabl\\|help\\|label\\|"
|
||||
"m\\(d\\|mkdir\\|o[dvr]e\\)\\|p\\(a\\(th\\|use\\)"
|
||||
"\\|opd\\|r\\(int\\|opmt\\)\\|ushd\\)\\|"
|
||||
"r\\(d\\|e\\(cover\\|n\\(\\|ame\\)\\|place\\)\\|mdir\\)\\|"
|
||||
"s\\(et\\|hift\\|ort\\|tart\\|ubst\\)\\|"
|
||||
"t\\(i\\(me\\|tle\\)\\|ree\\|ype\\)\\|"
|
||||
"v\\(er\\(\\|ify\\)\\|ol\\)\\|xcopy\\)\\>")
|
||||
'font-lock-builtin-face)
|
||||
|
||||
; variables are embeded in percent chars
|
||||
'( "%[a-zA-Z0-9_]+%?" . font-lock-variable-name-face)
|
||||
; labels are formatted as constants
|
||||
'( ":[a-zA-Z0-9_]+" . font-lock-constant-face)
|
||||
|
||||
; command line switches are hilighted as type-face
|
||||
'( "[-/][a-zA-Z0-9_]+" . font-lock-type-face)
|
||||
|
||||
; variables set should also be hilighted with variable-name-face
|
||||
'( "\\<set\\>[ \t]*\\([a-zA-Z0-9_]+\\)" (1 font-lock-variable-name-face))
|
||||
)))
|
||||
|
||||
|
||||
;;;###autoload
|
||||
(defun batch-mode ()
|
||||
"Major mode for editing batch scripts."
|
||||
(interactive)
|
||||
(kill-all-local-variables)
|
||||
(setq major-mode 'batch-mode)
|
||||
(setq mode-name "Avenue")
|
||||
(set (make-local-variable 'indent-line-function) 'batch-indent-line)
|
||||
(set (make-local-variable 'comment-start) "rem")
|
||||
(set (make-local-variable 'comment-start-skip) "rem[ \t]*")
|
||||
(set (make-local-variable 'font-lock-defaults)
|
||||
'(batch-font-lock-keywords nil t nil))
|
||||
(run-hooks 'batch-mode-hook))
|
||||
|
||||
(defun batch-indent-line ()
|
||||
"Indent current line as batch script"
|
||||
(let ((indent (batch-calculate-indent))
|
||||
beg shift-amt
|
||||
(old-pos (- (point-max) (point))))
|
||||
(beginning-of-line)
|
||||
(setq beg (point))
|
||||
(skip-chars-forward " \t")
|
||||
(if (looking-at ")")
|
||||
(setq indent (max (- indent batch-indent-level))))
|
||||
(message "prev indent: %d" indent)
|
||||
(setq shift-amt (- indent (current-column)))
|
||||
(if (not (zerop shift-amt))
|
||||
(progn
|
||||
(delete-region beg (point))
|
||||
; ArcView replaces tabs with single spaces, so we only insert
|
||||
; spaces to make indentation correct in ArcView.
|
||||
(insert-char ? indent)
|
||||
(if (> (- (point-max) old-pos) (point))
|
||||
(goto-char (- (point-max) old-pos)))))
|
||||
shift-amt))
|
||||
|
||||
(defun batch-calculate-indent ()
|
||||
"Return appropriate indentation for the current line as batch code."
|
||||
(save-excursion
|
||||
(beginning-of-line)
|
||||
(current-indentation)
|
||||
(if (bobp)
|
||||
0
|
||||
(if (re-search-backward "^[ \t]*[^ \t\n\r]" nil t)
|
||||
(if (looking-at "[ \t]*\\()[ \t]*else\\|for\\|if\\)\\>[^(\n]*([^)\n]*")
|
||||
(+ (current-indentation) batch-indent-level)
|
||||
(if (looking-at "[ \t]*[^(]*)[ \t]*")
|
||||
(- (current-indentation) batch-indent-level)
|
||||
(current-indentation)))
|
||||
0))))
|
||||
|
||||
(add-to-list 'auto-mode-alist '("\\.bat\\'" . batch-mode))
|
||||
|
||||
(provide 'batch-mode)
|
||||
|
||||
;;; batch-mode.el ends here
|
18
dotemacs/.emacs.d/color-theme-vibrant-ink.el
Normal file
18
dotemacs/.emacs.d/color-theme-vibrant-ink.el
Normal file
|
@ -0,0 +1,18 @@
|
|||
(require 'color-theme)
|
||||
|
||||
;; vibrant-ink color theme
|
||||
(defun color-theme-vibrant-ink ()
|
||||
(interactive)
|
||||
(color-theme-install
|
||||
'(color-theme-ryrobes
|
||||
((background-color . "#000000")
|
||||
(background-mode . dark)
|
||||
(border-color . "#000000")
|
||||
(cursor-color . "#FFFFFF")
|
||||
(foreground-color . "#FFFFFF")
|
||||
(mouse-color . "#FFFFFF"))
|
||||
(font-lock-comment-face ((t (:foreground "#9933CC" :italic t))))
|
||||
(font-lock-keyword-face ((t (:foreground "#FF6600"))))
|
||||
(font-lock-type-face ((t (:foreground "#FFCC00"))))
|
||||
(font-lock-string-face ((t (:foreground "#66FF00")))))))
|
||||
(provide 'color-theme-vibrant-ink)
|
37
dotemacs/.emacs.d/color-theme-weirdness.el
Normal file
37
dotemacs/.emacs.d/color-theme-weirdness.el
Normal file
|
@ -0,0 +1,37 @@
|
|||
(require 'color-theme)
|
||||
|
||||
;; weirdness color-theme
|
||||
(defun color-theme-weirdness ()
|
||||
(interactive)
|
||||
(color-theme-install
|
||||
'(color-theme-weirdness
|
||||
((background-color . "#000000")
|
||||
(background-mode . dark)
|
||||
(border-color . "#000000")
|
||||
(cursor-color . "#FFFFFF")
|
||||
(foreground-color . "#FFFFFF")
|
||||
(mouse-color . "#000000"))
|
||||
(org-level-1 ((t (:foreground "#5BFD5B" :weight normal))))
|
||||
(org-level-2 ((t (:foreground "#379A37" :weight normal))))
|
||||
(org-level-3 ((t (:foreground "#757575" :weight normal))))
|
||||
(org-level-4 ((t (:foreground "#778899" :weight normal))))
|
||||
(org-level-5 ((t (:foreground "#9898FF" :weight normal))))
|
||||
(org-level-6 ((t (:foreground "#0000B0" :weight normal))))
|
||||
(org-level-7 ((t (:foreground "#740091" :weight normal))))
|
||||
(org-level-8 ((t (:foreground "#B275C1" :weight normal))))
|
||||
(fringe ((t (:background "#000000"))))
|
||||
(mode-line ((t (:foreground "#B3B3B3" :background "#43527A" :background "#000000" :box nil))))
|
||||
(region ((t (:background "#3D3D3D"))))
|
||||
(minibuffer-prompt ((t (:foreground "#72F3FF" :bold t))))
|
||||
(flymake-warnline ((t (:background "#000060"))))
|
||||
(flymake-errline ((t (:background "#600000"))))
|
||||
(font-lock-builtin-face ((t (:foreground "#C436C4"))))
|
||||
(font-lock-comment-face ((t (:foreground "#00AC00" :background "#004000" :bold t :box (:line-width 1 :color "#006000" :style nil)))))
|
||||
(font-lock-comment-delimiter-face ((t (:inherit 'font-lock-comment-face))))
|
||||
(font-lock-function-name-face ((t (:foreground "#0FFF28"))))
|
||||
(font-lock-keyword-face ((t (:foreground "#4E61BB" :bold t))))
|
||||
(font-lock-string-face ((t (:foreground "#E00900"))))
|
||||
(font-lock-type-face ((t (:foreground "#8522DD"))))
|
||||
(font-lock-variable-name-face ((t (:foreground "#18EFF2"))))
|
||||
(font-lock-warning-face ((t (:foreground "#FF0000" :bold t)))))))
|
||||
(provide 'color-theme-weirdness)
|
1668
dotemacs/.emacs.d/color-theme.el
Normal file
1668
dotemacs/.emacs.d/color-theme.el
Normal file
File diff suppressed because it is too large
Load diff
1977
dotemacs/.emacs.d/csharp-mode.el
Normal file
1977
dotemacs/.emacs.d/csharp-mode.el
Normal file
File diff suppressed because it is too large
Load diff
707
dotemacs/.emacs.d/javascript.el
Normal file
707
dotemacs/.emacs.d/javascript.el
Normal file
|
@ -0,0 +1,707 @@
|
|||
;;; javascript.el --- Major mode for editing JavaScript source text
|
||||
|
||||
;; Copyright (C) 2006 Karl Landström
|
||||
|
||||
;; Author: Karl Landström <kland@comhem.se>
|
||||
;; Maintainer: Karl Landström <kland@comhem.se>
|
||||
;; Version: 2.0 Beta 8
|
||||
;; Date: 2006-12-26
|
||||
;; Keywords: languages, oop
|
||||
|
||||
;; This file is free software; you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation; either version 2, or (at your option)
|
||||
;; any later version.
|
||||
|
||||
;; This file is distributed in the hope that it will be useful,
|
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;; GNU General Public License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with GNU Emacs; see the file COPYING. If not, write to
|
||||
;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
;; Boston, MA 02111-1307, USA.
|
||||
|
||||
;;; Commentary:
|
||||
;;
|
||||
;; The main features of this JavaScript mode are syntactic
|
||||
;; highlighting (enabled with `font-lock-mode' or
|
||||
;; `global-font-lock-mode'), automatic indentation and filling of
|
||||
;; comments.
|
||||
;;
|
||||
;; This package has (only) been tested with GNU Emacs 21.4 (the latest
|
||||
;; stable release).
|
||||
;;
|
||||
;; Installation:
|
||||
;;
|
||||
;; Put this file in a directory where Emacs can find it (`C-h v
|
||||
;; load-path' for more info). Then add the following lines to your
|
||||
;; Emacs initialization file:
|
||||
;;
|
||||
;; (add-to-list 'auto-mode-alist '("\\.js\\'" . javascript-mode))
|
||||
;; (autoload 'javascript-mode "javascript" nil t)
|
||||
;;
|
||||
;; General Remarks:
|
||||
;;
|
||||
;; This mode assumes that block comments are not nested inside block
|
||||
;; comments and that strings do not contain line breaks.
|
||||
;;
|
||||
;; Exported names start with "javascript-" whereas private names start
|
||||
;; with "js-".
|
||||
;;
|
||||
;; Changes:
|
||||
;;
|
||||
;; See javascript.el.changelog.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'cc-mode)
|
||||
(require 'font-lock)
|
||||
(require 'newcomment)
|
||||
|
||||
(defgroup javascript nil
|
||||
"Customization variables for `javascript-mode'."
|
||||
:tag "JavaScript"
|
||||
:group 'languages)
|
||||
|
||||
(defcustom javascript-indent-level 4
|
||||
"Number of spaces for each indentation step."
|
||||
:type 'integer
|
||||
:group 'javascript)
|
||||
|
||||
(defcustom javascript-auto-indent-flag t
|
||||
"Automatic indentation with punctuation characters. If non-nil, the
|
||||
current line is indented when certain punctuations are inserted."
|
||||
:type 'boolean
|
||||
:group 'javascript)
|
||||
|
||||
|
||||
;; --- Keymap ---
|
||||
|
||||
(defvar javascript-mode-map nil
|
||||
"Keymap used in JavaScript mode.")
|
||||
|
||||
(unless javascript-mode-map
|
||||
(setq javascript-mode-map (make-sparse-keymap)))
|
||||
|
||||
(when javascript-auto-indent-flag
|
||||
(mapc (lambda (key)
|
||||
(define-key javascript-mode-map key 'javascript-insert-and-indent))
|
||||
'("{" "}" "(" ")" ":" ";" ",")))
|
||||
|
||||
(defun javascript-insert-and-indent (key)
|
||||
"Run command bound to key and indent current line. Runs the command
|
||||
bound to KEY in the global keymap and indents the current line."
|
||||
(interactive (list (this-command-keys)))
|
||||
(call-interactively (lookup-key (current-global-map) key))
|
||||
(indent-according-to-mode))
|
||||
|
||||
|
||||
;; --- Syntax Table And Parsing ---
|
||||
|
||||
(defvar javascript-mode-syntax-table
|
||||
(let ((table (make-syntax-table)))
|
||||
(c-populate-syntax-table table)
|
||||
|
||||
;; The syntax class of underscore should really be `symbol' ("_")
|
||||
;; but that makes matching of tokens much more complex as e.g.
|
||||
;; "\\<xyz\\>" matches part of e.g. "_xyz" and "xyz_abc". Defines
|
||||
;; it as word constituent for now.
|
||||
(modify-syntax-entry ?_ "w" table)
|
||||
|
||||
table)
|
||||
"Syntax table used in JavaScript mode.")
|
||||
|
||||
|
||||
(defun js-re-search-forward-inner (regexp &optional bound count)
|
||||
"Auxiliary function for `js-re-search-forward'."
|
||||
(let ((parse)
|
||||
(saved-point (point-min)))
|
||||
(while (> count 0)
|
||||
(re-search-forward regexp bound)
|
||||
(setq parse (parse-partial-sexp saved-point (point)))
|
||||
(cond ((nth 3 parse)
|
||||
(re-search-forward
|
||||
(concat "\\([^\\]\\|^\\)" (string (nth 3 parse)))
|
||||
(save-excursion (end-of-line) (point)) t))
|
||||
((nth 7 parse)
|
||||
(forward-line))
|
||||
((or (nth 4 parse)
|
||||
(and (eq (char-before) ?\/) (eq (char-after) ?\*)))
|
||||
(re-search-forward "\\*/"))
|
||||
(t
|
||||
(setq count (1- count))))
|
||||
(setq saved-point (point))))
|
||||
(point))
|
||||
|
||||
|
||||
(defun js-re-search-forward (regexp &optional bound noerror count)
|
||||
"Search forward but ignore strings and comments. Invokes
|
||||
`re-search-forward' but treats the buffer as if strings and
|
||||
comments have been removed."
|
||||
(let ((saved-point (point))
|
||||
(search-expr
|
||||
(cond ((null count)
|
||||
'(js-re-search-forward-inner regexp bound 1))
|
||||
((< count 0)
|
||||
'(js-re-search-backward-inner regexp bound (- count)))
|
||||
((> count 0)
|
||||
'(js-re-search-forward-inner regexp bound count)))))
|
||||
(condition-case err
|
||||
(eval search-expr)
|
||||
(search-failed
|
||||
(goto-char saved-point)
|
||||
(unless noerror
|
||||
(error (error-message-string err)))))))
|
||||
|
||||
|
||||
(defun js-re-search-backward-inner (regexp &optional bound count)
|
||||
"Auxiliary function for `js-re-search-backward'."
|
||||
(let ((parse)
|
||||
(saved-point (point-min)))
|
||||
(while (> count 0)
|
||||
(re-search-backward regexp bound)
|
||||
(when (and (> (point) (point-min))
|
||||
(save-excursion (backward-char) (looking-at "/[/*]")))
|
||||
(forward-char))
|
||||
(setq parse (parse-partial-sexp saved-point (point)))
|
||||
(cond ((nth 3 parse)
|
||||
(re-search-backward
|
||||
(concat "\\([^\\]\\|^\\)" (string (nth 3 parse)))
|
||||
(save-excursion (beginning-of-line) (point)) t))
|
||||
((nth 7 parse)
|
||||
(goto-char (nth 8 parse)))
|
||||
((or (nth 4 parse)
|
||||
(and (eq (char-before) ?/) (eq (char-after) ?*)))
|
||||
(re-search-backward "/\\*"))
|
||||
(t
|
||||
(setq count (1- count))))))
|
||||
(point))
|
||||
|
||||
|
||||
(defun js-re-search-backward (regexp &optional bound noerror count)
|
||||
"Search backward but ignore strings and comments. Invokes
|
||||
`re-search-backward' but treats the buffer as if strings and
|
||||
comments have been removed."
|
||||
(let ((saved-point (point))
|
||||
(search-expr
|
||||
(cond ((null count)
|
||||
'(js-re-search-backward-inner regexp bound 1))
|
||||
((< count 0)
|
||||
'(js-re-search-forward-inner regexp bound (- count)))
|
||||
((> count 0)
|
||||
'(js-re-search-backward-inner regexp bound count)))))
|
||||
(condition-case err
|
||||
(eval search-expr)
|
||||
(search-failed
|
||||
(goto-char saved-point)
|
||||
(unless noerror
|
||||
(error (error-message-string err)))))))
|
||||
|
||||
|
||||
(defun js-continued-var-decl-list-p ()
|
||||
"Return non-nil if point is inside a continued variable declaration
|
||||
list."
|
||||
(interactive)
|
||||
(let ((start (save-excursion (js-re-search-backward "\\<var\\>" nil t))))
|
||||
(and start
|
||||
(save-excursion (re-search-backward "\n" start t))
|
||||
(not (save-excursion
|
||||
(js-re-search-backward
|
||||
";\\|[^, \t][ \t]*\\(/[/*]\\|$\\)" start t))))))
|
||||
|
||||
|
||||
;; --- Font Lock ---
|
||||
|
||||
(defun js-inside-param-list-p ()
|
||||
"Return non-nil if point is inside a function parameter list."
|
||||
(condition-case err
|
||||
(save-excursion
|
||||
(up-list -1)
|
||||
(and (looking-at "(")
|
||||
(progn (backward-word 1)
|
||||
(or (looking-at "function")
|
||||
(progn (backward-word 1) (looking-at "function"))))))
|
||||
(error nil)))
|
||||
|
||||
|
||||
(defconst js-function-heading-1-re
|
||||
"^[ \t]*function[ \t]+\\(\\w+\\)"
|
||||
"Regular expression matching the start of a function header.")
|
||||
|
||||
(defconst js-function-heading-2-re
|
||||
"^[ \t]*\\(\\w+\\)[ \t]*:[ \t]*function\\>"
|
||||
"Regular expression matching the start of a function entry in
|
||||
an associative array.")
|
||||
|
||||
(defconst js-keyword-re
|
||||
(regexp-opt '("abstract" "break" "case" "catch" "class" "const"
|
||||
"continue" "debugger" "default" "delete" "do" "else"
|
||||
"enum" "export" "extends" "final" "finally" "for"
|
||||
"function" "goto" "if" "implements" "import" "in"
|
||||
"instanceof" "interface" "native" "new" "package"
|
||||
"private" "protected" "public" "return" "static"
|
||||
"super" "switch" "synchronized" "this" "throw"
|
||||
"throws" "transient" "try" "typeof" "var" "void"
|
||||
"volatile" "while" "with"
|
||||
"let") 'words)
|
||||
"Regular expression matching any JavaScript keyword.")
|
||||
|
||||
(defconst js-basic-type-re
|
||||
(regexp-opt '("boolean" "byte" "char" "double" "float" "int" "long"
|
||||
"short" "void") 'words)
|
||||
"Regular expression matching any predefined type in JavaScript.")
|
||||
|
||||
(defconst js-constant-re
|
||||
(regexp-opt '("false" "null" "true") 'words)
|
||||
"Regular expression matching any future reserved words in JavaScript.")
|
||||
|
||||
|
||||
(defconst js-font-lock-keywords-1
|
||||
(list
|
||||
"\\<import\\>"
|
||||
(list js-function-heading-1-re 1 font-lock-function-name-face)
|
||||
(list js-function-heading-2-re 1 font-lock-function-name-face)
|
||||
(list "[=(][ \t]*\\(/.*?[^\\]/\\w*\\)" 1 font-lock-string-face))
|
||||
"Level one font lock.")
|
||||
|
||||
(defconst js-font-lock-keywords-2
|
||||
(append js-font-lock-keywords-1
|
||||
(list (list js-keyword-re 1 font-lock-keyword-face)
|
||||
(cons js-basic-type-re font-lock-type-face)
|
||||
(cons js-constant-re font-lock-constant-face)))
|
||||
"Level two font lock.")
|
||||
|
||||
|
||||
;; Limitations with variable declarations: There seems to be no
|
||||
;; sensible way to highlight variables occuring after an initialized
|
||||
;; variable in a variable list. For instance, in
|
||||
;;
|
||||
;; var x, y = f(a, b), z
|
||||
;;
|
||||
;; z will not be highlighted.
|
||||
|
||||
(defconst js-font-lock-keywords-3
|
||||
(append
|
||||
js-font-lock-keywords-2
|
||||
(list
|
||||
|
||||
;; variable declarations
|
||||
(list
|
||||
(concat "\\<\\(const\\|var\\)\\>\\|" js-basic-type-re)
|
||||
(list "\\(\\w+\\)[ \t]*\\([=;].*\\|,\\|/[/*]\\|$\\)"
|
||||
nil
|
||||
nil
|
||||
'(1 font-lock-variable-name-face)))
|
||||
|
||||
;; continued variable declaration list
|
||||
(list
|
||||
(concat "^[ \t]*\\w+[ \t]*\\([,;=]\\|/[/*]\\|$\\)")
|
||||
(list "\\(\\w+\\)[ \t]*\\([=;].*\\|,\\|/[/*]\\|$\\)"
|
||||
'(if (save-excursion (backward-char) (js-continued-var-decl-list-p))
|
||||
(backward-word 1)
|
||||
(end-of-line))
|
||||
'(end-of-line)
|
||||
'(1 font-lock-variable-name-face)))
|
||||
|
||||
;; formal parameters
|
||||
(list
|
||||
(concat "\\<function\\>\\([ \t]+\\w+\\)?[ \t]*([ \t]*\\w")
|
||||
(list "\\(\\w+\\)\\([ \t]*).*\\)?"
|
||||
'(backward-char)
|
||||
'(end-of-line)
|
||||
'(1 font-lock-variable-name-face)))
|
||||
|
||||
;; continued formal parameter list
|
||||
(list
|
||||
(concat "^[ \t]*\\w+[ \t]*[,)]")
|
||||
(list "\\w+"
|
||||
'(if (save-excursion (backward-char) (js-inside-param-list-p))
|
||||
(backward-word 1)
|
||||
(end-of-line))
|
||||
'(end-of-line)
|
||||
'(0 font-lock-variable-name-face)))))
|
||||
"Level three font lock.")
|
||||
|
||||
(defconst js-font-lock-keywords
|
||||
'(js-font-lock-keywords-3 js-font-lock-keywords-1 js-font-lock-keywords-2
|
||||
js-font-lock-keywords-3)
|
||||
"See `font-lock-keywords'.")
|
||||
|
||||
|
||||
;; --- Indentation ---
|
||||
|
||||
(defconst js-possibly-braceless-keyword-re
|
||||
(regexp-opt
|
||||
'("catch" "do" "else" "finally" "for" "if" "try" "while" "with" "let")
|
||||
'words)
|
||||
"Regular expression matching keywords that are optionally
|
||||
followed by an opening brace.")
|
||||
|
||||
(defconst js-indent-operator-re
|
||||
(concat "[-+*/%<>=&^|?:.]\\([^-+*/]\\|$\\)\\|"
|
||||
(regexp-opt '("in" "instanceof") 'words))
|
||||
"Regular expression matching operators that affect indentation
|
||||
of continued expressions.")
|
||||
|
||||
|
||||
(defun js-looking-at-operator-p ()
|
||||
"Return non-nil if text after point is an operator (that is not
|
||||
a comma)."
|
||||
(save-match-data
|
||||
(and (looking-at js-indent-operator-re)
|
||||
(or (not (looking-at ":"))
|
||||
(save-excursion
|
||||
(and (js-re-search-backward "[?:{]\\|\\<case\\>" nil t)
|
||||
(looking-at "?")))))))
|
||||
|
||||
|
||||
(defun js-continued-expression-p ()
|
||||
"Returns non-nil if the current line continues an expression."
|
||||
(save-excursion
|
||||
(back-to-indentation)
|
||||
(or (js-looking-at-operator-p)
|
||||
(and (js-re-search-backward "\n" nil t)
|
||||
(progn
|
||||
(skip-chars-backward " \t")
|
||||
(backward-char)
|
||||
(and (> (point) (point-min))
|
||||
(save-excursion (backward-char) (not (looking-at "[/*]/")))
|
||||
(js-looking-at-operator-p)
|
||||
(and (progn (backward-char)
|
||||
(not (looking-at "++\\|--\\|/[/*]"))))))))))
|
||||
|
||||
|
||||
(defun js-end-of-do-while-loop-p ()
|
||||
"Returns non-nil if word after point is `while' of a do-while
|
||||
statement, else returns nil. A braceless do-while statement
|
||||
spanning several lines requires that the start of the loop is
|
||||
indented to the same column as the current line."
|
||||
(interactive)
|
||||
(save-excursion
|
||||
(save-match-data
|
||||
(when (looking-at "\\s-*\\<while\\>")
|
||||
(if (save-excursion
|
||||
(skip-chars-backward "[ \t\n]*}")
|
||||
(looking-at "[ \t\n]*}"))
|
||||
(save-excursion
|
||||
(backward-list) (backward-word 1) (looking-at "\\<do\\>"))
|
||||
(js-re-search-backward "\\<do\\>" (point-at-bol) t)
|
||||
(or (looking-at "\\<do\\>")
|
||||
(let ((saved-indent (current-indentation)))
|
||||
(while (and (js-re-search-backward "^[ \t]*\\<" nil t)
|
||||
(/= (current-indentation) saved-indent)))
|
||||
(and (looking-at "[ \t]*\\<do\\>")
|
||||
(not (js-re-search-forward
|
||||
"\\<while\\>" (point-at-eol) t))
|
||||
(= (current-indentation) saved-indent)))))))))
|
||||
|
||||
|
||||
(defun js-ctrl-statement-indentation ()
|
||||
"Returns the proper indentation of the current line if it
|
||||
starts the body of a control statement without braces, else
|
||||
returns nil."
|
||||
(save-excursion
|
||||
(back-to-indentation)
|
||||
(when (save-excursion
|
||||
(and (not (looking-at "[{]"))
|
||||
(progn
|
||||
(js-re-search-backward "[[:graph:]]" nil t)
|
||||
(forward-char)
|
||||
(when (= (char-before) ?\)) (backward-list))
|
||||
(skip-syntax-backward " ")
|
||||
(skip-syntax-backward "w")
|
||||
(looking-at js-possibly-braceless-keyword-re))
|
||||
(not (js-end-of-do-while-loop-p))))
|
||||
(save-excursion
|
||||
(goto-char (match-beginning 0))
|
||||
(+ (current-indentation) javascript-indent-level)))))
|
||||
|
||||
|
||||
(defun js-proper-indentation (parse-status)
|
||||
"Return the proper indentation for the current line."
|
||||
(save-excursion
|
||||
(back-to-indentation)
|
||||
(let ((ctrl-stmt-indent (js-ctrl-statement-indentation))
|
||||
(same-indent-p (looking-at "[]})]\\|\\<case\\>\\|\\<default\\>"))
|
||||
(continued-expr-p (js-continued-expression-p)))
|
||||
(cond (ctrl-stmt-indent)
|
||||
((js-continued-var-decl-list-p)
|
||||
(js-re-search-backward "\\<var\\>" nil t)
|
||||
(+ (current-indentation) javascript-indent-level))
|
||||
((nth 1 parse-status)
|
||||
(goto-char (nth 1 parse-status))
|
||||
(if (looking-at "[({[][ \t]*\\(/[/*]\\|$\\)")
|
||||
(progn
|
||||
(skip-syntax-backward " ")
|
||||
(when (= (char-before) ?\)) (backward-list))
|
||||
(back-to-indentation)
|
||||
(cond (same-indent-p
|
||||
(current-column))
|
||||
(continued-expr-p
|
||||
(+ (current-column) (* 2 javascript-indent-level)))
|
||||
(t
|
||||
(+ (current-column) javascript-indent-level))))
|
||||
(unless same-indent-p
|
||||
(forward-char)
|
||||
(skip-chars-forward " \t"))
|
||||
(current-column)))
|
||||
(continued-expr-p javascript-indent-level)
|
||||
(t 0)))))
|
||||
|
||||
|
||||
(defun javascript-indent-line ()
|
||||
"Indent the current line as JavaScript source text."
|
||||
(interactive)
|
||||
(let ((parse-status
|
||||
(save-excursion (parse-partial-sexp (point-min) (point-at-bol))))
|
||||
(offset (- (current-column) (current-indentation))))
|
||||
(when (not (nth 8 parse-status))
|
||||
(indent-line-to (js-proper-indentation parse-status))
|
||||
(when (> offset 0) (forward-char offset)))))
|
||||
|
||||
|
||||
;; --- Filling ---
|
||||
|
||||
;; FIXME: It should be possible to use the more sofisticated function
|
||||
;; `c-fill-paragraph' in `cc-cmds.el' instead. However, just setting
|
||||
;; `fill-paragraph-function' to `c-fill-paragraph' does not work;
|
||||
;; inside `c-fill-paragraph', `fill-paragraph-function' evaluates to
|
||||
;; nil!?
|
||||
|
||||
(defun js-backward-paragraph ()
|
||||
"Move backward to start of paragraph. Postcondition: Point is at
|
||||
beginning of buffer or the previous line contains only whitespace."
|
||||
(forward-line -1)
|
||||
(while (not (or (bobp) (looking-at "^[ \t]*$")))
|
||||
(forward-line -1))
|
||||
(when (not (bobp)) (forward-line 1)))
|
||||
|
||||
|
||||
(defun js-forward-paragraph ()
|
||||
"Move forward to end of paragraph. Postcondition: Point is at
|
||||
end of buffer or the next line contains only whitespace."
|
||||
(forward-line 1)
|
||||
(while (not (or (eobp) (looking-at "^[ \t]*$")))
|
||||
(forward-line 1))
|
||||
(when (not (eobp)) (backward-char 1)))
|
||||
|
||||
|
||||
(defun js-fill-block-comment-paragraph (parse-status justify)
|
||||
"Fill current paragraph as a block comment. PARSE-STATUS is the
|
||||
result of `parse-partial-regexp' from beginning of buffer to
|
||||
point. JUSTIFY has the same meaning as in `fill-paragraph'."
|
||||
(let ((offset (save-excursion
|
||||
(goto-char (nth 8 parse-status)) (current-indentation))))
|
||||
(save-excursion
|
||||
(save-restriction
|
||||
(narrow-to-region (save-excursion
|
||||
(goto-char (nth 8 parse-status)) (point-at-bol))
|
||||
(save-excursion
|
||||
(goto-char (nth 8 parse-status))
|
||||
(re-search-forward "*/")))
|
||||
(narrow-to-region (save-excursion
|
||||
(js-backward-paragraph)
|
||||
(when (looking-at "^[ \t]*$") (forward-line 1))
|
||||
(point))
|
||||
(save-excursion
|
||||
(js-forward-paragraph)
|
||||
(when (looking-at "^[ \t]*$") (backward-char))
|
||||
(point)))
|
||||
(goto-char (point-min))
|
||||
(while (not (eobp))
|
||||
(delete-horizontal-space)
|
||||
(forward-line 1))
|
||||
(let ((fill-column (- fill-column offset))
|
||||
(fill-paragraph-function nil))
|
||||
(fill-paragraph justify))
|
||||
|
||||
;; In Emacs 21.4 as opposed to CVS Emacs 22,
|
||||
;; `fill-paragraph' seems toadd a newline at the end of the
|
||||
;; paragraph. Remove it!
|
||||
(goto-char (point-max))
|
||||
(when (looking-at "^$") (backward-delete-char 1))
|
||||
|
||||
(goto-char (point-min))
|
||||
(while (not (eobp))
|
||||
(indent-to offset)
|
||||
(forward-line 1))))))
|
||||
|
||||
|
||||
(defun js-sline-comment-par-start ()
|
||||
"Return point at the beginning of the line where the current
|
||||
single-line comment paragraph starts."
|
||||
(save-excursion
|
||||
(beginning-of-line)
|
||||
(while (and (not (bobp))
|
||||
(looking-at "^[ \t]*//[ \t]*[[:graph:]]"))
|
||||
(forward-line -1))
|
||||
(unless (bobp) (forward-line 1))
|
||||
(point)))
|
||||
|
||||
|
||||
(defun js-sline-comment-par-end ()
|
||||
"Return point at end of current single-line comment paragraph."
|
||||
(save-excursion
|
||||
(beginning-of-line)
|
||||
(while (and (not (eobp))
|
||||
(looking-at "^[ \t]*//[ \t]*[[:graph:]]"))
|
||||
(forward-line 1))
|
||||
(unless (bobp) (backward-char))
|
||||
(point)))
|
||||
|
||||
|
||||
(defun js-sline-comment-offset (line)
|
||||
"Return the column at the start of the current single-line
|
||||
comment paragraph."
|
||||
(save-excursion
|
||||
(goto-line line)
|
||||
(re-search-forward "//" (point-at-eol))
|
||||
(goto-char (match-beginning 0))
|
||||
(current-column)))
|
||||
|
||||
|
||||
(defun js-sline-comment-text-offset (line)
|
||||
"Return the column at the start of the text of the current
|
||||
single-line comment paragraph."
|
||||
(save-excursion
|
||||
(goto-line line)
|
||||
(re-search-forward "//[ \t]*" (point-at-eol))
|
||||
(current-column)))
|
||||
|
||||
|
||||
(defun js-at-empty-sline-comment-p ()
|
||||
"Return non-nil if inside an empty single-line comment."
|
||||
(and (save-excursion
|
||||
(beginning-of-line)
|
||||
(not (looking-at "^.*//.*[[:graph:]]")))
|
||||
(save-excursion
|
||||
(re-search-backward "//" (point-at-bol) t))))
|
||||
|
||||
|
||||
(defun js-fill-sline-comments (parse-status justify)
|
||||
"Fill current paragraph as a sequence of single-line comments.
|
||||
PARSE-STATUS is the result of `parse-partial-regexp' from
|
||||
beginning of buffer to point. JUSTIFY has the same meaning as in
|
||||
`fill-paragraph'."
|
||||
(when (not (js-at-empty-sline-comment-p))
|
||||
(let* ((start (js-sline-comment-par-start))
|
||||
(start-line (1+ (count-lines (point-min) start)))
|
||||
(end (js-sline-comment-par-end))
|
||||
(offset (js-sline-comment-offset start-line))
|
||||
(text-offset (js-sline-comment-text-offset start-line)))
|
||||
(save-excursion
|
||||
(save-restriction
|
||||
(narrow-to-region start end)
|
||||
(goto-char (point-min))
|
||||
(while (re-search-forward "^[ \t]*//[ \t]*" nil t)
|
||||
(replace-match "")
|
||||
(forward-line 1))
|
||||
(let ((fill-paragraph-function nil)
|
||||
(fill-column (- fill-column text-offset)))
|
||||
(fill-paragraph justify))
|
||||
|
||||
;; In Emacs 21.4 as opposed to CVS Emacs 22,
|
||||
;; `fill-paragraph' seems toadd a newline at the end of the
|
||||
;; paragraph. Remove it!
|
||||
(goto-char (point-max))
|
||||
(when (looking-at "^$") (backward-delete-char 1))
|
||||
|
||||
(goto-char (point-min))
|
||||
(while (not (eobp))
|
||||
(indent-to offset)
|
||||
(insert "//")
|
||||
(indent-to text-offset)
|
||||
(forward-line 1)))))))
|
||||
|
||||
|
||||
(defun js-trailing-comment-p (parse-status)
|
||||
"Return non-nil if inside a trailing comment. PARSE-STATUS is
|
||||
the result of `parse-partial-regexp' from beginning of buffer to
|
||||
point."
|
||||
(save-excursion
|
||||
(when (nth 4 parse-status)
|
||||
(goto-char (nth 8 parse-status))
|
||||
(skip-chars-backward " \t")
|
||||
(not (bolp)))))
|
||||
|
||||
|
||||
(defun js-block-comment-p (parse-status)
|
||||
"Return non-nil if inside a block comment. PARSE-STATUS is the
|
||||
result of `parse-partial-regexp' from beginning of buffer to
|
||||
point."
|
||||
(save-excursion
|
||||
(save-match-data
|
||||
(when (nth 4 parse-status)
|
||||
(goto-char (nth 8 parse-status))
|
||||
(looking-at "/\\*")))))
|
||||
|
||||
|
||||
(defun javascript-fill-paragraph (&optional justify)
|
||||
"If inside a comment, fill the current comment paragraph.
|
||||
Trailing comments are ignored."
|
||||
(interactive)
|
||||
(let ((parse-status (parse-partial-sexp (point-min) (point))))
|
||||
(when (and (nth 4 parse-status)
|
||||
(not (js-trailing-comment-p parse-status)))
|
||||
(if (js-block-comment-p parse-status)
|
||||
(js-fill-block-comment-paragraph parse-status justify)
|
||||
(js-fill-sline-comments parse-status justify))))
|
||||
t)
|
||||
|
||||
|
||||
;; --- Imenu ---
|
||||
|
||||
(defconst js-imenu-generic-expression
|
||||
(list
|
||||
(list
|
||||
nil
|
||||
"function\\s-+\\(\\w+\\)\\s-*("
|
||||
1))
|
||||
"Regular expression matching top level procedures. Used by imenu.")
|
||||
|
||||
|
||||
;; --- Main Function ---
|
||||
|
||||
;;;###autoload
|
||||
(defun javascript-mode ()
|
||||
"Major mode for editing JavaScript source text.
|
||||
|
||||
Key bindings:
|
||||
|
||||
\\{javascript-mode-map}"
|
||||
(interactive)
|
||||
(kill-all-local-variables)
|
||||
|
||||
(use-local-map javascript-mode-map)
|
||||
(set-syntax-table javascript-mode-syntax-table)
|
||||
(set (make-local-variable 'indent-line-function) 'javascript-indent-line)
|
||||
(set (make-local-variable 'font-lock-defaults) (list js-font-lock-keywords))
|
||||
|
||||
(set (make-local-variable 'parse-sexp-ignore-comments) t)
|
||||
|
||||
;; Comments
|
||||
(setq comment-start "// ")
|
||||
(setq comment-end "")
|
||||
(set (make-local-variable 'fill-paragraph-function)
|
||||
'javascript-fill-paragraph)
|
||||
|
||||
;; Make c-mark-function work
|
||||
(setq c-nonsymbol-token-regexp "!=\\|%=\\|&[&=]\\|\\*[/=]\\|\\+[+=]\\|-[=-]\\|/[*/=]\\|<\\(?:<=\\|[<=]\\)\\|==\\|>\\(?:>\\(?:>=\\|[=>]\\)\\|[=>]\\)\\|\\^=\\||[=|]\\|[]!%&(-,./:-?[{-~^-]"
|
||||
c-stmt-delim-chars "^;{}?:"
|
||||
c-syntactic-ws-end "[ \n
\f/]"
|
||||
c-syntactic-eol "\\(\\s \\|/\\*\\([^*\n
]\\|\\*[^/\n
]\\)*\\*/\\)*\\(\\(/\\*\\([^*\n
]\\|\\*[^/\n
]\\)*\\|\\\\\\)?$\\|//\\)")
|
||||
|
||||
;; Imenu
|
||||
(setq imenu-case-fold-search nil)
|
||||
(set (make-local-variable 'imenu-generic-expression)
|
||||
js-imenu-generic-expression)
|
||||
|
||||
(setq major-mode 'javascript-mode)
|
||||
(setq mode-name "JavaScript")
|
||||
(run-hooks 'javascript-mode-hook))
|
||||
|
||||
|
||||
(provide 'javascript-mode)
|
||||
;;; javascript.el ends here
|
207
dotemacs/.emacs.d/rainbow-mode.el
Normal file
207
dotemacs/.emacs.d/rainbow-mode.el
Normal file
|
@ -0,0 +1,207 @@
|
|||
;;; rainbow-mode.el --- prints color strings with colored background
|
||||
|
||||
;; Copyright (C) 2010 Julien Danjou
|
||||
|
||||
;; Author: Julien Danjou <julien@danjou.info>
|
||||
;; Keywords: strings, faces
|
||||
|
||||
;; This file is NOT part of GNU Emacs.
|
||||
|
||||
;; GNU Emacs is free software: you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation, either version 3 of the License, or
|
||||
;; (at your option) any later version.
|
||||
|
||||
;; GNU Emacs is distributed in the hope that it will be useful,
|
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;; GNU General Public License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
;; This minor mode will add background to strings that matches color names.
|
||||
;; i.e.
|
||||
;; #0000ff
|
||||
;; Will be printed in white with a blue background.
|
||||
;;
|
||||
|
||||
;;; Code:
|
||||
|
||||
(eval-when-compile
|
||||
(require 'cl))
|
||||
|
||||
(require 'regexp-opt)
|
||||
(require 'faces)
|
||||
|
||||
(defgroup rainbow nil
|
||||
"Show color strings with a background color."
|
||||
:tag "Rainbow"
|
||||
:group 'help)
|
||||
|
||||
;; Hexadecimal colors
|
||||
(defvar rainbow-hexadecimal-colors-font-lock-keywords
|
||||
'("#[0-9a-fA-F]\\{3\\}[0-9a-fA-F]\\{3\\}?"
|
||||
(0 (rainbow-colorize-itself)))
|
||||
"Font-lock keywords to add for hexadecimal colors.")
|
||||
|
||||
;; rgb() colors
|
||||
(defvar rainbow-html-rgb-colors-font-lock-keywords
|
||||
'(("rgb(\s*\\([0-9]\\{1,3\\}\\(?:\s*%\\)?\\)\s*,\s*\\([0-9]\\{1,3\\}\\(?:\s*%\\)?\\)\s*,\s*\\([0-9]\\{1,3\\}\\(?:\s*%\\)?\\)\s*)"
|
||||
(0 (rainbow-colorize-rgb)))
|
||||
("rgba(\s*\\([0-9]\\{1,3\\}\\(?:\s*%\\)?\\)\s*,\s*\\([0-9]\\{1,3\\}\\(?:\s*%\\)?\\)\s*,\s*\\([0-9]\\{1,3\\}\\(?:\s*%\\)?\\)\s*,\s*[0-9]\\{1,3\\}\s*%?\s*)"
|
||||
(0 (rainbow-colorize-rgb))))
|
||||
"Font-lock keywords to add for RGB colors.")
|
||||
|
||||
;; HTML colors name
|
||||
(defvar rainbow-html-colors-font-lock-keywords nil
|
||||
"Font-lock keywords to add for HTML colors.")
|
||||
(make-variable-buffer-local 'rainbow-html-colors-font-lock-keywords)
|
||||
|
||||
(defcustom rainbow-html-colors-alist
|
||||
'(("black" . "#000000")
|
||||
("silver" . "#C0C0C0")
|
||||
("gray" . "#808080")
|
||||
("white" . "#FFFFFF")
|
||||
("maroon" . "#800000")
|
||||
("red" . "#FF0000")
|
||||
("purple" . "#800080")
|
||||
("fuchsia" . "#FF00FF")
|
||||
("green" . "#008000")
|
||||
("lime" . "#00FF00")
|
||||
("olive" . "#808000")
|
||||
("yellow" . "#FFFF00")
|
||||
("navy" . "#000080")
|
||||
("blue" . "#0000FF")
|
||||
("teal" . "#008080")
|
||||
("aqua" . "#00FFFF"))
|
||||
"Alist of HTML colors.
|
||||
Each entry should have the form (COLOR-NAME . HEXADECIMAL-COLOR)."
|
||||
:group 'rainbow)
|
||||
|
||||
(defcustom rainbow-html-colors-major-mode-list
|
||||
'(html-mode css-mode php-mode nxml-mode xml-mode)
|
||||
"List of major mode where HTML colors are enabled when
|
||||
`rainbow-html-colors' is set to auto."
|
||||
:group 'rainbow)
|
||||
|
||||
(defcustom rainbow-html-colors 'auto
|
||||
"When to enable HTML colors.
|
||||
If set to t, the HTML colors will be enabled. If set to nil, the
|
||||
HTML colors will not be enabled. If set to auto, the HTML colors
|
||||
will be enabled if a major mode has been detected from the
|
||||
`rainbow-html-colors-major-mode-list'."
|
||||
:group 'rainbow)
|
||||
|
||||
;; X colors
|
||||
(defvar rainbow-x-colors-font-lock-keywords
|
||||
`(,(regexp-opt (x-defined-colors) 'words)
|
||||
(0 (rainbow-colorize-itself)))
|
||||
"Font-lock keywords to add for X colors.")
|
||||
|
||||
(defcustom rainbow-x-colors-major-mode-list
|
||||
'(emacs-lisp-mode lisp-interaction-mode c-mode c++-mode java-mode)
|
||||
"List of major mode where X colors are enabled when
|
||||
`rainbow-x-colors' is set to auto."
|
||||
:group 'rainbow)
|
||||
|
||||
(defcustom rainbow-x-colors 'auto
|
||||
"When to enable X colors.
|
||||
If set to t, the X colors will be enabled. If set to nil, the
|
||||
X colors will not be enabled. If set to auto, the X colors
|
||||
will be enabled if a major mode has been detected from the
|
||||
`rainbow-x-colors-major-mode-list'."
|
||||
:group 'rainbow)
|
||||
|
||||
;; Functions
|
||||
(defun rainbow-colorize-match (color)
|
||||
"Return a matched string propertized with a face whose
|
||||
background is COLOR. The foreground is computed using
|
||||
`rainbow-color-luminance', and is either white or black."
|
||||
(put-text-property
|
||||
(match-beginning 0) (match-end 0)
|
||||
'face `((:foreground ,(if (> 128.0 (rainbow-x-color-luminance color))
|
||||
"white" "black"))
|
||||
(:background ,color))))
|
||||
|
||||
(defun rainbow-colorize-itself ()
|
||||
"Colorize a match with itself."
|
||||
(rainbow-colorize-match (match-string-no-properties 0)))
|
||||
|
||||
(defun rainbow-colorize-by-assoc (assoc-list)
|
||||
"Colorize a match with its association from ASSOC-LIST."
|
||||
(rainbow-colorize-match (cdr (assoc (match-string-no-properties 0) assoc-list))))
|
||||
|
||||
(defun rainbow-rgb-relative-to-absolute (number)
|
||||
"Convert a relative NUMBER to absolute. If NUMBER is absolute, return NUMBER.
|
||||
This will convert \"80 %\" to 204, \"100 %\" to 255 but \"123\" to \"123\""
|
||||
(let ((string-length (- (length number) 1)))
|
||||
;; Is this a number with %?
|
||||
(if (eq (elt number string-length) ?%)
|
||||
(/ (* (string-to-number (substring number 0 string-length)) 255) 100)
|
||||
(string-to-number number))))
|
||||
|
||||
(defun rainbow-colorize-rgb ()
|
||||
"Colorize a match with itself."
|
||||
(let ((r (rainbow-rgb-relative-to-absolute (match-string-no-properties 1)))
|
||||
(g (rainbow-rgb-relative-to-absolute (match-string-no-properties 2)))
|
||||
(b (rainbow-rgb-relative-to-absolute (match-string-no-properties 3))))
|
||||
(rainbow-colorize-match (format "#%02X%02X%02X" r g b))))
|
||||
|
||||
(defun rainbow-color-luminance (red green blue)
|
||||
"Calculate the luminance of color composed of RED, BLUE and GREEN."
|
||||
(floor (+ (* .2126 red) (* .7152 green) (* .0722 blue)) 256))
|
||||
|
||||
(defun rainbow-x-color-luminance (color)
|
||||
"Calculate the luminance of a color string (e.g. \"#ffaa00\", \"blue\")."
|
||||
(let* ((values (x-color-values color))
|
||||
(r (car values))
|
||||
(g (cadr values))
|
||||
(b (caddr values)))
|
||||
(rainbow-color-luminance r g b)))
|
||||
|
||||
(defun rainbow-turn-on ()
|
||||
"Turn on raibow-mode."
|
||||
(font-lock-add-keywords nil
|
||||
(list rainbow-hexadecimal-colors-font-lock-keywords))
|
||||
;; Activate X colors?
|
||||
(when (or (eq rainbow-x-colors t)
|
||||
(and (eq rainbow-x-colors 'auto)
|
||||
(memq major-mode rainbow-x-colors-major-mode-list)))
|
||||
(font-lock-add-keywords nil
|
||||
(list rainbow-x-colors-font-lock-keywords)))
|
||||
;; Activate HTML colors?
|
||||
(when (or (eq rainbow-html-colors t)
|
||||
(and (eq rainbow-html-colors 'auto)
|
||||
(memq major-mode rainbow-html-colors-major-mode-list)))
|
||||
(setq rainbow-html-colors-font-lock-keywords
|
||||
`(,(regexp-opt (mapcar 'car rainbow-html-colors-alist) 'words)
|
||||
(0 (rainbow-colorize-by-assoc rainbow-html-colors-alist))))
|
||||
(font-lock-add-keywords nil
|
||||
`(,rainbow-html-colors-font-lock-keywords
|
||||
,@rainbow-html-rgb-colors-font-lock-keywords))))
|
||||
|
||||
(defun rainbow-turn-off ()
|
||||
"Turn off rainbow-mode."
|
||||
(font-lock-remove-keywords
|
||||
nil
|
||||
(list
|
||||
rainbow-hexadecimal-colors-font-lock-keywords
|
||||
rainbow-html-colors-font-lock-keywords
|
||||
rainbow-x-colors-font-lock-keywords
|
||||
rainbow-html-rgb-colors-font-lock-keywords)))
|
||||
|
||||
;;;###autoload
|
||||
(define-minor-mode rainbow-mode
|
||||
"Colorize strings that represent colors.
|
||||
This will fontify with colors the string like \"#aabbcc\" or \"blue\""
|
||||
:lighter " Rbow"
|
||||
(progn
|
||||
(if rainbow-mode
|
||||
(rainbow-turn-on)
|
||||
(rainbow-turn-off))
|
||||
;; Turn on font lock
|
||||
(font-lock-mode 1)))
|
||||
|
||||
(provide 'rainbow-mode)
|
5151
dotemacs/.emacs.d/sqlplus.el
Normal file
5151
dotemacs/.emacs.d/sqlplus.el
Normal file
File diff suppressed because it is too large
Load diff
22
dotemacs/.emacs.d/themes/color-theme-example.el
Normal file
22
dotemacs/.emacs.d/themes/color-theme-example.el
Normal file
|
@ -0,0 +1,22 @@
|
|||
(eval-when-compile
|
||||
(require 'color-theme))
|
||||
|
||||
(defun color-theme-example ()
|
||||
"Example theme. Carbon copy of color-theme-gnome contributed by Jonadab."
|
||||
(interactive)
|
||||
(color-theme-install
|
||||
'(color-theme-example
|
||||
((foreground-color . "wheat")
|
||||
(background-color . "darkslategrey")
|
||||
(background-mode . dark))
|
||||
(default ((t (nil))))
|
||||
(region ((t (:foreground "cyan" :background "dark cyan"))))
|
||||
(underline ((t (:foreground "yellow" :underline t))))
|
||||
(modeline ((t (:foreground "dark cyan" :background "wheat"))))
|
||||
(modeline-buffer-id ((t (:foreground "dark cyan" :background "wheat"))))
|
||||
(modeline-mousable ((t (:foreground "dark cyan" :background "wheat"))))
|
||||
(modeline-mousable-minor-mode ((t (:foreground "dark cyan" :background "wheat"))))
|
||||
(italic ((t (:foreground "dark red" :italic t))))
|
||||
(bold-italic ((t (:foreground "dark red" :bold t :italic t))))
|
||||
(font-lock-comment-face ((t (:foreground "Firebrick"))))
|
||||
(bold ((t (:bold)))))))
|
13539
dotemacs/.emacs.d/themes/color-theme-library.el
Normal file
13539
dotemacs/.emacs.d/themes/color-theme-library.el
Normal file
File diff suppressed because it is too large
Load diff
395
dotemacs/.emacs.d/vala-mode.el
Normal file
395
dotemacs/.emacs.d/vala-mode.el
Normal file
|
@ -0,0 +1,395 @@
|
|||
;;; vala-mode.el --- Vala mode derived mode
|
||||
|
||||
;; Author: 2005 Dylan R. E. Moonfire
|
||||
;; 2008 Étienne BERSAC
|
||||
;; Maintainer: Étienne BERSAC <bersace03@laposte.net>
|
||||
;; Created: 2008 May the 4th
|
||||
;; Modified: May 2008
|
||||
;; Version: 0.1
|
||||
;; Keywords: vala languages oop
|
||||
|
||||
;; This program is free software; you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation; either version 2 of the License, or
|
||||
;; (at your option) any later version.
|
||||
;;
|
||||
;; This program is distributed in the hope that it will be useful,
|
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;; GNU General Public License for more details.
|
||||
;;
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with this program; see the file COPYING. If not, write to
|
||||
;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
;; Boston, MA 02111-1307, USA.
|
||||
|
||||
;;; Commentary:
|
||||
;;
|
||||
;; See http://live.gnome.org/Vala for details about Vala language.
|
||||
;;
|
||||
;; This is a separate mode to implement the Vala constructs and
|
||||
;; font-locking. It is mostly the csharp-mode from
|
||||
;; http://mfgames.com/linux/csharp-mode with vala specific keywords
|
||||
;; and filename suffixes.
|
||||
;;
|
||||
;; Note: The interface used in this file requires CC Mode 5.30 or
|
||||
;; later.
|
||||
|
||||
;;; .emacs (don't put in (require 'vala-mode))
|
||||
;; (autoload 'vala-mode "vala-mode" "Major mode for editing Vala code." t)
|
||||
;; (setq auto-mode-alist
|
||||
;; (append '(("\\.vala$" . vala-mode)) auto-mode-alist))
|
||||
|
||||
;;; Versions:
|
||||
;;
|
||||
;; 0.1 : Initial version based on csharp-mode
|
||||
;;
|
||||
|
||||
;; This is a copy of the function in cc-mode which is used to handle
|
||||
;; the eval-when-compile which is needed during other times.
|
||||
(defun c-filter-ops (ops opgroup-filter op-filter &optional xlate)
|
||||
;; See cc-langs.el, a direct copy.
|
||||
(unless (listp (car-safe ops))
|
||||
(setq ops (list ops)))
|
||||
(cond ((eq opgroup-filter t)
|
||||
(setq opgroup-filter (lambda (opgroup) t)))
|
||||
((not (functionp opgroup-filter))
|
||||
(setq opgroup-filter `(lambda (opgroup)
|
||||
(memq opgroup ',opgroup-filter)))))
|
||||
(cond ((eq op-filter t)
|
||||
(setq op-filter (lambda (op) t)))
|
||||
((stringp op-filter)
|
||||
(setq op-filter `(lambda (op)
|
||||
(string-match ,op-filter op)))))
|
||||
(unless xlate
|
||||
(setq xlate 'identity))
|
||||
(c-with-syntax-table (c-lang-const c-mode-syntax-table)
|
||||
(delete-duplicates
|
||||
(mapcan (lambda (opgroup)
|
||||
(when (if (symbolp (car opgroup))
|
||||
(when (funcall opgroup-filter (car opgroup))
|
||||
(setq opgroup (cdr opgroup))
|
||||
t)
|
||||
t)
|
||||
(mapcan (lambda (op)
|
||||
(when (funcall op-filter op)
|
||||
(let ((res (funcall xlate op)))
|
||||
(if (listp res) res (list res)))))
|
||||
opgroup)))
|
||||
ops)
|
||||
:test 'equal)))
|
||||
|
||||
;; This inserts the bulk of the code.
|
||||
(require 'cc-mode)
|
||||
|
||||
;; These are only required at compile time to get the sources for the
|
||||
;; language constants. (The cc-fonts require and the font-lock
|
||||
;; related constants could additionally be put inside an
|
||||
;; (eval-after-load "font-lock" ...) but then some trickery is
|
||||
;; necessary to get them compiled.)
|
||||
(eval-when-compile
|
||||
(let ((load-path
|
||||
(if (and (boundp 'byte-compile-dest-file)
|
||||
(stringp byte-compile-dest-file))
|
||||
(cons (file-name-directory byte-compile-dest-file) load-path)
|
||||
load-path)))
|
||||
(load "cc-mode" nil t)
|
||||
(load "cc-fonts" nil t)
|
||||
(load "cc-langs" nil t)))
|
||||
|
||||
(eval-and-compile
|
||||
;; Make our mode known to the language constant system. Use Java
|
||||
;; mode as the fallback for the constants we don't change here.
|
||||
;; This needs to be done also at compile time since the language
|
||||
;; constants are evaluated then.
|
||||
(c-add-language 'vala-mode 'java-mode))
|
||||
|
||||
;; Java uses a series of regexes to change the font-lock for class
|
||||
;; references. The problem comes in because Java uses Pascal (leading
|
||||
;; space in names, SomeClass) for class and package names, but
|
||||
;; Camel-casing (initial lowercase, upper case in words,
|
||||
;; i.e. someVariable) for variables.
|
||||
;;(error (byte-compile-dest-file))
|
||||
;;(error (c-get-current-file))
|
||||
(c-lang-defconst c-opt-after-id-concat-key
|
||||
vala (if (c-lang-const c-opt-identifier-concat-key)
|
||||
(c-lang-const c-symbol-start)))
|
||||
|
||||
(c-lang-defconst c-basic-matchers-before
|
||||
vala `(
|
||||
;;;; Font-lock the attributes by searching for the
|
||||
;;;; appropriate regex and marking it as TODO.
|
||||
;;,`(,(concat "\\(" vala-attribute-regex "\\)")
|
||||
;; 0 font-lock-function-name-face)
|
||||
|
||||
;; Put a warning face on the opener of unclosed strings that
|
||||
;; can't span lines. Later font
|
||||
;; lock packages have a `font-lock-syntactic-face-function' for
|
||||
;; this, but it doesn't give the control we want since any
|
||||
;; fontification done inside the function will be
|
||||
;; unconditionally overridden.
|
||||
,(c-make-font-lock-search-function
|
||||
;; Match a char before the string starter to make
|
||||
;; `c-skip-comments-and-strings' work correctly.
|
||||
(concat ".\\(" c-string-limit-regexp "\\)")
|
||||
'((c-font-lock-invalid-string)))
|
||||
|
||||
;; Fontify keyword constants.
|
||||
,@(when (c-lang-const c-constant-kwds)
|
||||
(let ((re (c-make-keywords-re nil
|
||||
(c-lang-const c-constant-kwds))))
|
||||
`((eval . (list ,(concat "\\<\\(" re "\\)\\>")
|
||||
1 c-constant-face-name)))))
|
||||
|
||||
;; Fontify all keywords except the primitive types.
|
||||
,`(,(concat "\\<" (c-lang-const c-regular-keywords-regexp))
|
||||
1 font-lock-keyword-face)
|
||||
|
||||
;; Fontify leading identifiers in fully
|
||||
;; qualified names like "Foo.Bar".
|
||||
,@(when (c-lang-const c-opt-identifier-concat-key)
|
||||
`((,(byte-compile
|
||||
`(lambda (limit)
|
||||
(while (re-search-forward
|
||||
,(concat "\\(\\<" ; 1
|
||||
"\\(" (c-lang-const c-symbol-key)
|
||||
"\\)" ; 2
|
||||
"[ \t\n\r\f\v]*"
|
||||
(c-lang-const
|
||||
c-opt-identifier-concat-key)
|
||||
"[ \t\n\r\f\v]*"
|
||||
"\\)"
|
||||
"\\("
|
||||
(c-lang-const
|
||||
c-opt-after-id-concat-key)
|
||||
"\\)")
|
||||
limit t)
|
||||
(unless (progn
|
||||
(goto-char (match-beginning 0))
|
||||
(c-skip-comments-and-strings limit))
|
||||
(or (get-text-property (match-beginning 2) 'face)
|
||||
(c-put-font-lock-face (match-beginning 2)
|
||||
(match-end 2)
|
||||
c-reference-face-name))
|
||||
(goto-char (match-end 1)))))))))
|
||||
))
|
||||
|
||||
;; Vala does not allow a leading qualifier operator. It also doesn't
|
||||
;; allow the ".*" construct of Java. So, we redo this regex without
|
||||
;; the "\\|\\*" regex.
|
||||
(c-lang-defconst c-identifier-key
|
||||
vala (concat "\\(" (c-lang-const c-symbol-key) "\\)" ; 1
|
||||
(concat "\\("
|
||||
"[ \t\n\r\f\v]*"
|
||||
(c-lang-const c-opt-identifier-concat-key)
|
||||
"[ \t\n\r\f\v]*"
|
||||
(concat "\\("
|
||||
"\\(" (c-lang-const c-symbol-key) "\\)"
|
||||
"\\)")
|
||||
"\\)*")))
|
||||
|
||||
;; Vala has a few rules that are slightly different than Java for
|
||||
;; operators. This also removed the Java's "super" and replaces it
|
||||
;; with the Vala's "base".
|
||||
(c-lang-defconst c-operators
|
||||
vala `((prefix "base")))
|
||||
|
||||
;; Vala directives ?
|
||||
;; (c-lang-defconst c-opt-cpp-prefix
|
||||
;; csharp "^\\s *#.*")
|
||||
|
||||
|
||||
;; Vala uses the following assignment operators
|
||||
(c-lang-defconst c-assignment-operators
|
||||
vala '("=" "*=" "/=" "%=" "+=" "-=" ">>=" "<<="
|
||||
"&=" "^=" "|=" "++" "--"))
|
||||
|
||||
;; This defines the primative types for Vala
|
||||
(c-lang-defconst c-primitive-type-kwds
|
||||
vala '("void" "char" "int" "float" "double" "string"))
|
||||
|
||||
;; The keywords that define that the following is a type, such as a
|
||||
;; class definition.
|
||||
(c-lang-defconst c-type-prefix-kwds
|
||||
vala '("class" "interface" "struct" "enum" "signal"))
|
||||
|
||||
;; Type modifier keywords. They appear anywhere in types, but modifiy
|
||||
;; instead create one.
|
||||
(c-lang-defconst c-type-modifier-kwds
|
||||
vala '("const"))
|
||||
|
||||
;; Structures that are similiar to classes.
|
||||
(c-lang-defconst c-class-decl-kwds
|
||||
vala '("class" "interface"))
|
||||
|
||||
;; The various modifiers used for class and method descriptions.
|
||||
(c-lang-defconst c-modifier-kwds
|
||||
vala '("public" "partial" "private" "const" "abstract"
|
||||
"protected" "ref" "in" "out" "static" "virtual"
|
||||
"override" "params" "internal" "weak" "owned"
|
||||
"unowned"))
|
||||
|
||||
;; We don't use the protection level stuff because it breaks the
|
||||
;; method indenting. Not sure why, though.
|
||||
(c-lang-defconst c-protection-kwds
|
||||
vala nil)
|
||||
|
||||
;; Define the keywords that can have something following after them.
|
||||
(c-lang-defconst c-type-list-kwds
|
||||
vala '("struct" "class" "interface" "is" "as"
|
||||
"delegate" "event" "set" "get" "add" "remove"
|
||||
"callback" "signal" "var" "default"))
|
||||
|
||||
;; This allows the classes after the : in the class declartion to be
|
||||
;; fontified.
|
||||
(c-lang-defconst c-typeless-decl-kwds
|
||||
vala '(":"))
|
||||
|
||||
;; Sets up the enum to handle the list properly
|
||||
(c-lang-defconst c-brace-list-decl-kwds
|
||||
vala '("enum" "errordomain"))
|
||||
|
||||
;; We need to remove Java's package keyword
|
||||
(c-lang-defconst c-ref-list-kwds
|
||||
vala '("using" "namespace" "construct"))
|
||||
|
||||
;; Follow-on blocks that don't require a brace
|
||||
(c-lang-defconst c-block-stmt-2-kwds
|
||||
vala '("for" "if" "switch" "while" "catch" "foreach" "lock"))
|
||||
|
||||
;; Statements that break out of braces
|
||||
(c-lang-defconst c-simple-stmt-kwds
|
||||
vala '("return" "continue" "break" "throw"))
|
||||
|
||||
;; Statements that allow a label
|
||||
;; TODO?
|
||||
(c-lang-defconst c-before-label-kwds
|
||||
vala nil)
|
||||
|
||||
;; Constant keywords
|
||||
(c-lang-defconst c-constant-kwds
|
||||
vala '("true" "false" "null"))
|
||||
|
||||
;; Keywords that start "primary expressions."
|
||||
(c-lang-defconst c-primary-expr-kwds
|
||||
vala '("this" "base"))
|
||||
|
||||
;; We need to treat namespace as an outer block to class indenting
|
||||
;; works properly.
|
||||
(c-lang-defconst c-other-block-decl-kwds
|
||||
vala '("namespace"))
|
||||
|
||||
;; We need to include the "in" for the foreach
|
||||
(c-lang-defconst c-other-kwds
|
||||
vala '("in" "sizeof" "typeof"))
|
||||
|
||||
(require 'cc-awk)
|
||||
|
||||
(c-lang-defconst c-at-vsemi-p-fn
|
||||
vala 'c-awk-at-vsemi-p)
|
||||
|
||||
|
||||
(defcustom vala-font-lock-extra-types nil
|
||||
"*List of extra types (aside from the type keywords) to recognize in Vala mode.
|
||||
Each list item should be a regexp matching a single identifier.")
|
||||
|
||||
(defconst vala-font-lock-keywords-1 (c-lang-const c-matchers-1 vala)
|
||||
"Minimal highlighting for Vala mode.")
|
||||
|
||||
(defconst vala-font-lock-keywords-2 (c-lang-const c-matchers-2 vala)
|
||||
"Fast normal highlighting for Vala mode.")
|
||||
|
||||
(defconst vala-font-lock-keywords-3 (c-lang-const c-matchers-3 vala)
|
||||
"Accurate normal highlighting for Vala mode.")
|
||||
|
||||
(defvar vala-font-lock-keywords vala-font-lock-keywords-3
|
||||
"Default expressions to highlight in Vala mode.")
|
||||
|
||||
(defvar vala-mode-syntax-table
|
||||
nil
|
||||
"Syntax table used in vala-mode buffers.")
|
||||
(or vala-mode-syntax-table
|
||||
(setq vala-mode-syntax-table
|
||||
(funcall (c-lang-const c-make-mode-syntax-table vala))))
|
||||
|
||||
(defvar vala-mode-abbrev-table nil
|
||||
"Abbreviation table used in vala-mode buffers.")
|
||||
(c-define-abbrev-table 'vala-mode-abbrev-table
|
||||
;; Keywords that if they occur first on a line
|
||||
;; might alter the syntactic context, and which
|
||||
;; therefore should trig reindentation when
|
||||
;; they are completed.
|
||||
'(("else" "else" c-electric-continued-statement 0)
|
||||
("while" "while" c-electric-continued-statement 0)
|
||||
("catch" "catch" c-electric-continued-statement 0)
|
||||
("finally" "finally" c-electric-continued-statement 0)))
|
||||
|
||||
(defvar vala-mode-map (let ((map (c-make-inherited-keymap)))
|
||||
;; Add bindings which are only useful for Vala
|
||||
map)
|
||||
"Keymap used in vala-mode buffers.")
|
||||
|
||||
;;(easy-menu-define vala-menu vala-mode-map "Vala Mode Commands"
|
||||
;; ;; Can use `vala' as the language for `c-mode-menu'
|
||||
;; ;; since its definition covers any language. In
|
||||
;; ;; this case the language is used to adapt to the
|
||||
;; ;; nonexistence of a cpp pass and thus removing some
|
||||
;; ;; irrelevant menu alternatives.
|
||||
;; (cons "Vala" (c-lang-const c-mode-menu vala)))
|
||||
|
||||
;;; Autoload mode trigger
|
||||
(add-to-list 'auto-mode-alist '("\\.vala$" . vala-mode))
|
||||
(add-to-list 'auto-mode-alist '("\\.vapi$" . vala-mode))
|
||||
|
||||
;; Custom variables
|
||||
(defcustom vala-mode-hook nil
|
||||
"*Hook called by `vala-mode'."
|
||||
:type 'hook
|
||||
:group 'c)
|
||||
|
||||
;;; The entry point into the mode
|
||||
;;;###autoload
|
||||
(defun vala-mode ()
|
||||
"Major mode for editing Vala code.
|
||||
This is a simple example of a separate mode derived from CC Mode
|
||||
to support a language with syntax similar to
|
||||
C#/C/C++/ObjC/Java/IDL/Pike.
|
||||
|
||||
The hook `c-mode-common-hook' is run with no args at mode
|
||||
initialization, then `vala-mode-hook'.
|
||||
|
||||
Key bindings:
|
||||
\\{vala-mode-map}"
|
||||
(interactive)
|
||||
(kill-all-local-variables)
|
||||
(c-initialize-cc-mode t)
|
||||
(set-syntax-table vala-mode-syntax-table)
|
||||
(setq major-mode 'vala-mode
|
||||
mode-name "Vala"
|
||||
local-abbrev-table vala-mode-abbrev-table
|
||||
abbrev-mode t)
|
||||
(use-local-map c-mode-map)
|
||||
;; `c-init-language-vars' is a macro that is expanded at compile
|
||||
;; time to a large `setq' with all the language variables and their
|
||||
;; customized values for our language.
|
||||
(c-init-language-vars vala-mode)
|
||||
;; `c-common-init' initializes most of the components of a CC Mode
|
||||
;; buffer, including setup of the mode menu, font-lock, etc.
|
||||
;; There's also a lower level routine `c-basic-common-init' that
|
||||
;; only makes the necessary initialization to get the syntactic
|
||||
;; analysis and similar things working.
|
||||
(c-common-init 'vala-mode)
|
||||
;;(easy-menu-add vala-menu)
|
||||
(c-set-style "linux")
|
||||
(setq indent-tabs-mode t)
|
||||
(setq c-basic-offset 4)
|
||||
(setq tab-width 4)
|
||||
(c-toggle-auto-newline -1)
|
||||
(c-toggle-hungry-state -1)
|
||||
(run-hooks 'c-mode-common-hook)
|
||||
(run-hooks 'vala-mode-hook)
|
||||
(c-update-modeline))
|
||||
|
||||
(provide 'vala-mode)
|
||||
|
||||
;;; vala-mode.el ends here
|
Loading…
Reference in a new issue