diff options
| author | Dan Nicolaescu | 2007-06-20 15:22:59 +0000 |
|---|---|---|
| committer | Dan Nicolaescu | 2007-06-20 15:22:59 +0000 |
| commit | 5fd6ff96085082b7ff81cb0ab93bb7618d88a840 (patch) | |
| tree | 63c36cc6b4b1e8a4fad45ec32020d13153d7f3af | |
| parent | 72a75b41db354b0846da2c728d3c09f48fb24fc8 (diff) | |
| download | emacs-5fd6ff96085082b7ff81cb0ab93bb7618d88a840.tar.gz emacs-5fd6ff96085082b7ff81cb0ab93bb7618d88a840.zip | |
progmodes/vera-mode.el: New file.
| -rw-r--r-- | lisp/ChangeLog | 4 | ||||
| -rw-r--r-- | lisp/progmodes/vera-mode.el | 1506 |
2 files changed, 1510 insertions, 0 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 38f8794f862..3668a5a8c09 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog | |||
| @@ -1,3 +1,7 @@ | |||
| 1 | 2007-06-20 Reto Zimmermann <reto@gnu.org> | ||
| 2 | |||
| 3 | * progmodes/vera-mode.el: New file. | ||
| 4 | |||
| 1 | 2007-06-20 Juanma Barranquero <lekktu@gmail.com> | 5 | 2007-06-20 Juanma Barranquero <lekktu@gmail.com> |
| 2 | 6 | ||
| 3 | * ido.el (ido-find-file-in-dir): Don't signal an error for | 7 | * ido.el (ido-find-file-in-dir): Don't signal an error for |
diff --git a/lisp/progmodes/vera-mode.el b/lisp/progmodes/vera-mode.el new file mode 100644 index 00000000000..67d881030db --- /dev/null +++ b/lisp/progmodes/vera-mode.el | |||
| @@ -0,0 +1,1506 @@ | |||
| 1 | ;;; vera-mode.el --- major mode for editing Vera files. | ||
| 2 | |||
| 3 | ;; Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, | ||
| 4 | ;; 2006, 2007 Free Software Foundation, Inc. | ||
| 5 | |||
| 6 | ;; Author: Reto Zimmermann <reto@gnu.org> | ||
| 7 | ;; Maintainer: Reto Zimmermann <reto@gnu.org> | ||
| 8 | ;; Version: 2.26 | ||
| 9 | ;; Keywords: languages vera | ||
| 10 | ;; WWW: http://www.iis.ee.ethz.ch/~zimmi/emacs/vera-mode.html | ||
| 11 | |||
| 12 | (defconst vera-version "2.18" | ||
| 13 | "Vera Mode version number.") | ||
| 14 | |||
| 15 | (defconst vera-time-stamp "2007-06-11" | ||
| 16 | "Vera Mode time stamp for last update.") | ||
| 17 | |||
| 18 | ;; This file is not part of GNU Emacs. | ||
| 19 | |||
| 20 | ;; GNU Emacs is free software; you can redistribute it and/or modify | ||
| 21 | ;; it under the terms of the GNU General Public License as published by | ||
| 22 | ;; the Free Software Foundation; either version 2, or (at your option) | ||
| 23 | ;; any later version. | ||
| 24 | |||
| 25 | ;; GNU Emacs is distributed in the hope that it will be useful, | ||
| 26 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 27 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 28 | ;; GNU General Public License for more details. | ||
| 29 | |||
| 30 | ;; You should have received a copy of the GNU General Public License | ||
| 31 | ;; along with GNU Emacs; see the file COPYING. If not, write to the | ||
| 32 | ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, | ||
| 33 | ;; Boston, MA 02111-1307, USA. | ||
| 34 | |||
| 35 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 36 | ;;; Commentary: | ||
| 37 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 38 | |||
| 39 | ;; This package provides a simple Emacs major mode for editing Vera code. | ||
| 40 | ;; It includes the following features: | ||
| 41 | |||
| 42 | ;; - Syntax highlighting | ||
| 43 | ;; - Indentation | ||
| 44 | ;; - Word/keyword completion | ||
| 45 | ;; - Block commenting | ||
| 46 | ;; - Works under GNU Emacs and XEmacs | ||
| 47 | |||
| 48 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 49 | ;; Documentation | ||
| 50 | |||
| 51 | ;; See comment string of function `vera-mode' or type `C-c C-h' in Emacs. | ||
| 52 | |||
| 53 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 54 | ;; Installation | ||
| 55 | |||
| 56 | ;; Prerequisites: GNU Emacs 20.X/21.X, XEmacs 20.X/21.X | ||
| 57 | |||
| 58 | ;; Put `vera-mode.el' into the `site-lisp' directory of your Emacs installation | ||
| 59 | ;; or into an arbitrary directory that is added to the load path by the | ||
| 60 | ;; following line in your Emacs start-up file (`.emacs'): | ||
| 61 | |||
| 62 | ;; (setq load-path (cons (expand-file-name "<directory-name>") load-path)) | ||
| 63 | |||
| 64 | ;; If you already have the compiled `vera-mode.elc' file, put it in the same | ||
| 65 | ;; directory. Otherwise, byte-compile the source file: | ||
| 66 | ;; Emacs: M-x byte-compile-file -> vera-mode.el | ||
| 67 | ;; Unix: emacs -batch -q -no-site-file -f batch-byte-compile vera-mode.el | ||
| 68 | |||
| 69 | ;; Add the following lines to the `site-start.el' file in the `site-lisp' | ||
| 70 | ;; directory of your Emacs installation or to your Emacs start-up file | ||
| 71 | ;; (`.emacs'): | ||
| 72 | |||
| 73 | ;; (autoload 'vera-mode "vera-mode" "Vera Mode" t) | ||
| 74 | ;; (setq auto-mode-alist (cons '("\\.vr[hi]?\\'" . vera-mode) auto-mode-alist)) | ||
| 75 | |||
| 76 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 77 | |||
| 78 | ;;; Code: | ||
| 79 | |||
| 80 | ;; XEmacs handling | ||
| 81 | (defconst vera-xemacs (string-match "XEmacs" emacs-version) | ||
| 82 | "Non-nil if XEmacs is used.") | ||
| 83 | |||
| 84 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 85 | ;;; Variables | ||
| 86 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 87 | |||
| 88 | (defgroup vera nil | ||
| 89 | "Customizations for Vera Mode." | ||
| 90 | :prefix "vera-" | ||
| 91 | :version "22.2" | ||
| 92 | :group 'languages) | ||
| 93 | |||
| 94 | (defcustom vera-basic-offset 2 | ||
| 95 | "*Amount of basic offset used for indentation." | ||
| 96 | :type 'integer | ||
| 97 | :group 'vera) | ||
| 98 | |||
| 99 | (defcustom vera-underscore-is-part-of-word nil | ||
| 100 | "*Non-nil means consider the underscore character `_' as part of word. | ||
| 101 | An identifier containing underscores is then treated as a single word in | ||
| 102 | select and move operations. All parts of an identifier separated by underscore | ||
| 103 | are treated as single words otherwise." | ||
| 104 | :type 'boolean | ||
| 105 | :group 'vera) | ||
| 106 | |||
| 107 | (defcustom vera-intelligent-tab t | ||
| 108 | "*Non-nil means `TAB' does indentation, word completion and tab insertion. | ||
| 109 | That is, if preceeding character is part of a word then complete word, | ||
| 110 | else if not at beginning of line then insert tab, | ||
| 111 | else if last command was a `TAB' or `RET' then dedent one step, | ||
| 112 | else indent current line. | ||
| 113 | If nil, TAB always indents current line." | ||
| 114 | :type 'boolean | ||
| 115 | :group 'vera) | ||
| 116 | |||
| 117 | |||
| 118 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 119 | ;;; Mode definitions | ||
| 120 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 121 | |||
| 122 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 123 | ;; Key bindings | ||
| 124 | |||
| 125 | (defvar vera-mode-map () | ||
| 126 | "Keymap for Vera Mode.") | ||
| 127 | |||
| 128 | (setq vera-mode-map (make-sparse-keymap)) | ||
| 129 | ;; backspace/delete key bindings | ||
| 130 | (define-key vera-mode-map [backspace] 'backward-delete-char-untabify) | ||
| 131 | (unless (boundp 'delete-key-deletes-forward) ; XEmacs variable | ||
| 132 | (define-key vera-mode-map [delete] 'delete-char) | ||
| 133 | (define-key vera-mode-map [(meta delete)] 'kill-word)) | ||
| 134 | ;; standard key bindings | ||
| 135 | (define-key vera-mode-map "\M-e" 'vera-forward-statement) | ||
| 136 | (define-key vera-mode-map "\M-a" 'vera-backward-statement) | ||
| 137 | (define-key vera-mode-map "\M-\C-e" 'vera-forward-same-indent) | ||
| 138 | (define-key vera-mode-map "\M-\C-a" 'vera-backward-same-indent) | ||
| 139 | ;; mode specific key bindings | ||
| 140 | (define-key vera-mode-map "\C-c\t" 'indent-according-to-mode) | ||
| 141 | (define-key vera-mode-map "\M-\C-\\" 'vera-indent-region) | ||
| 142 | (define-key vera-mode-map "\C-c\C-c" 'vera-comment-uncomment-region) | ||
| 143 | (define-key vera-mode-map "\C-c\C-f" 'vera-fontify-buffer) | ||
| 144 | (define-key vera-mode-map "\C-c\C-v" 'vera-version) | ||
| 145 | (define-key vera-mode-map "\M-\t" 'tab-to-tab-stop) | ||
| 146 | ;; electric key bindings | ||
| 147 | (define-key vera-mode-map "\t" 'vera-electric-tab) | ||
| 148 | (define-key vera-mode-map "\r" 'vera-electric-return) | ||
| 149 | (define-key vera-mode-map " " 'vera-electric-space) | ||
| 150 | (define-key vera-mode-map "{" 'vera-electric-opening-brace) | ||
| 151 | (define-key vera-mode-map "}" 'vera-electric-closing-brace) | ||
| 152 | (define-key vera-mode-map "#" 'vera-electric-pound) | ||
| 153 | (define-key vera-mode-map "*" 'vera-electric-star) | ||
| 154 | (define-key vera-mode-map "/" 'vera-electric-slash) | ||
| 155 | |||
| 156 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 157 | ;; Menu | ||
| 158 | |||
| 159 | (require 'easymenu) | ||
| 160 | |||
| 161 | (easy-menu-define vera-mode-menu vera-mode-map | ||
| 162 | "Menu keymap for Vera Mode." | ||
| 163 | '("Vera" | ||
| 164 | ["(Un)Comment Out Region" vera-comment-uncomment-region (mark)] | ||
| 165 | "--" | ||
| 166 | ["Move Forward Statement" vera-forward-statement t] | ||
| 167 | ["Move Backward Statement" vera-backward-statement t] | ||
| 168 | ["Move Forward Same Indent" vera-forward-same-indent t] | ||
| 169 | ["Move Backward Same Indent" vera-backward-same-indent t] | ||
| 170 | "--" | ||
| 171 | ["Indent Line" indent-according-to-mode t] | ||
| 172 | ["Indent Region" vera-indent-region (mark)] | ||
| 173 | ["Indent Buffer" vera-indent-buffer t] | ||
| 174 | "--" | ||
| 175 | ["Fontify Buffer" vera-fontify-buffer t] | ||
| 176 | "--" | ||
| 177 | ["Documentation" describe-mode] | ||
| 178 | ["Version" vera-version t] | ||
| 179 | ["Bug Report..." vera-submit-bug-report t] | ||
| 180 | "--" | ||
| 181 | ("Options" | ||
| 182 | ["Indentation Offset..." (customize-option 'vera-basic-offset) t] | ||
| 183 | ["Underscore is Part of Word" | ||
| 184 | (customize-set-variable 'vera-underscore-is-part-of-word | ||
| 185 | (not vera-underscore-is-part-of-word)) | ||
| 186 | :style toggle :selected vera-underscore-is-part-of-word] | ||
| 187 | ["Use Intelligent Tab" | ||
| 188 | (customize-set-variable 'vera-intelligent-tab | ||
| 189 | (not vera-intelligent-tab)) | ||
| 190 | :style toggle :selected vera-intelligent-tab] | ||
| 191 | "--" | ||
| 192 | ["Save Options" customize-save-customized t] | ||
| 193 | "--" | ||
| 194 | ["Customize..." vera-customize t]))) | ||
| 195 | |||
| 196 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 197 | ;; Syntax table | ||
| 198 | |||
| 199 | (defvar vera-mode-syntax-table | ||
| 200 | (let ((syntax-table (make-syntax-table))) | ||
| 201 | ;; punctuation | ||
| 202 | (modify-syntax-entry ?\# "." syntax-table) | ||
| 203 | (modify-syntax-entry ?\$ "." syntax-table) | ||
| 204 | (modify-syntax-entry ?\% "." syntax-table) | ||
| 205 | (modify-syntax-entry ?\& "." syntax-table) | ||
| 206 | (modify-syntax-entry ?\' "." syntax-table) | ||
| 207 | (modify-syntax-entry ?\* "." syntax-table) | ||
| 208 | (modify-syntax-entry ?\- "." syntax-table) | ||
| 209 | (modify-syntax-entry ?\+ "." syntax-table) | ||
| 210 | (modify-syntax-entry ?\. "." syntax-table) | ||
| 211 | (modify-syntax-entry ?\/ "." syntax-table) | ||
| 212 | (modify-syntax-entry ?\: "." syntax-table) | ||
| 213 | (modify-syntax-entry ?\; "." syntax-table) | ||
| 214 | (modify-syntax-entry ?\< "." syntax-table) | ||
| 215 | (modify-syntax-entry ?\= "." syntax-table) | ||
| 216 | (modify-syntax-entry ?\> "." syntax-table) | ||
| 217 | (modify-syntax-entry ?\\ "." syntax-table) | ||
| 218 | (modify-syntax-entry ?\| "." syntax-table) | ||
| 219 | ;; string | ||
| 220 | (modify-syntax-entry ?\" "\"" syntax-table) | ||
| 221 | ;; underscore | ||
| 222 | (when vera-underscore-is-part-of-word | ||
| 223 | (modify-syntax-entry ?\_ "w" syntax-table)) | ||
| 224 | ;; escape | ||
| 225 | (modify-syntax-entry ?\\ "\\" syntax-table) | ||
| 226 | ;; parentheses to match | ||
| 227 | (modify-syntax-entry ?\( "()" syntax-table) | ||
| 228 | (modify-syntax-entry ?\) ")(" syntax-table) | ||
| 229 | (modify-syntax-entry ?\[ "(]" syntax-table) | ||
| 230 | (modify-syntax-entry ?\] ")[" syntax-table) | ||
| 231 | (modify-syntax-entry ?\{ "(}" syntax-table) | ||
| 232 | (modify-syntax-entry ?\} "){" syntax-table) | ||
| 233 | ;; comment | ||
| 234 | (if vera-xemacs | ||
| 235 | (modify-syntax-entry ?\/ ". 1456" syntax-table) ; XEmacs | ||
| 236 | (modify-syntax-entry ?\/ ". 124b" syntax-table)) ; Emacs | ||
| 237 | (modify-syntax-entry ?\* ". 23" syntax-table) | ||
| 238 | ;; newline and CR | ||
| 239 | (modify-syntax-entry ?\n "> b" syntax-table) | ||
| 240 | (modify-syntax-entry ?\^M "> b" syntax-table) | ||
| 241 | syntax-table) | ||
| 242 | "Syntax table used in `vera-mode' buffers.") | ||
| 243 | |||
| 244 | (defvar vera-mode-ext-syntax-table | ||
| 245 | (let ((syntax-table (copy-syntax-table vera-mode-syntax-table))) | ||
| 246 | ;; extended syntax table including '_' (for simpler search regexps) | ||
| 247 | (modify-syntax-entry ?_ "w" syntax-table) | ||
| 248 | syntax-table) | ||
| 249 | "Syntax table extended by `_' used in `vera-mode' buffers.") | ||
| 250 | |||
| 251 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 252 | ;; Mode definition | ||
| 253 | |||
| 254 | ;;;###autoload (add-to-list 'auto-mode-alist '("\\.vr[hi]?\\'" . vera-mode)) | ||
| 255 | |||
| 256 | ;;;###autoload | ||
| 257 | (defun vera-mode () | ||
| 258 | "Major mode for editing Vera code. | ||
| 259 | |||
| 260 | Usage: | ||
| 261 | ------ | ||
| 262 | |||
| 263 | INDENTATION: Typing `TAB' at the beginning of a line indents the line. | ||
| 264 | The amount of indentation is specified by option `vera-basic-offset'. | ||
| 265 | Indentation can be done for an entire region \(`M-C-\\') or buffer (menu). | ||
| 266 | `TAB' always indents the line if option `vera-intelligent-tab' is nil. | ||
| 267 | |||
| 268 | WORD/COMMAND COMPLETION: Typing `TAB' after a (not completed) word looks | ||
| 269 | for a word in the buffer or a Vera keyword that starts alike, inserts it | ||
| 270 | and adjusts case. Re-typing `TAB' toggles through alternative word | ||
| 271 | completions. | ||
| 272 | |||
| 273 | Typing `TAB' after a non-word character inserts a tabulator stop (if not | ||
| 274 | at the beginning of a line). `M-TAB' always inserts a tabulator stop. | ||
| 275 | |||
| 276 | COMMENTS: `C-c C-c' comments out a region if not commented out, and | ||
| 277 | uncomments a region if already commented out. | ||
| 278 | |||
| 279 | HIGHLIGHTING (fontification): Vera keywords, predefined types and | ||
| 280 | constants, function names, declaration names, directives, as well as | ||
| 281 | comments and strings are highlighted using different colors. | ||
| 282 | |||
| 283 | VERA VERSION: OpenVera 1.4 and Vera version 6.2.8. | ||
| 284 | |||
| 285 | |||
| 286 | Maintenance: | ||
| 287 | ------------ | ||
| 288 | |||
| 289 | To submit a bug report, use the corresponding menu entry within Vera Mode. | ||
| 290 | Add a description of the problem and include a reproducible test case. | ||
| 291 | |||
| 292 | Feel free to send questions and enhancement requests to <reto@gnu.org>. | ||
| 293 | |||
| 294 | Official distribution is at | ||
| 295 | <http://www.iis.ee.ethz.ch/~zimmi/emacs/vera-mode.html>. | ||
| 296 | |||
| 297 | |||
| 298 | The Vera Mode Maintainer | ||
| 299 | Reto Zimmermann <reto@gnu.org> | ||
| 300 | |||
| 301 | Key bindings: | ||
| 302 | ------------- | ||
| 303 | |||
| 304 | \\{vera-mode-map}" | ||
| 305 | (interactive) | ||
| 306 | (kill-all-local-variables) | ||
| 307 | (setq major-mode 'vera-mode) | ||
| 308 | (setq mode-name "Vera") | ||
| 309 | ;; set maps and tables | ||
| 310 | (use-local-map vera-mode-map) | ||
| 311 | (set-syntax-table vera-mode-syntax-table) | ||
| 312 | ;; set local variables | ||
| 313 | (require 'cc-cmds) | ||
| 314 | (set (make-local-variable 'comment-start) "//") | ||
| 315 | (set (make-local-variable 'comment-end) "") | ||
| 316 | (set (make-local-variable 'comment-column) 40) | ||
| 317 | (set (make-local-variable 'comment-start-skip) "/\\*+ *\\|//+ *") | ||
| 318 | (set (make-local-variable 'comment-end-skip) " *\\*+/\\| *//+") | ||
| 319 | (set (make-local-variable 'comment-indent-function) 'c-comment-indent) | ||
| 320 | (set (make-local-variable 'paragraph-start) "^$") | ||
| 321 | (set (make-local-variable 'paragraph-separate) paragraph-start) | ||
| 322 | (set (make-local-variable 'require-final-newline) t) | ||
| 323 | (set (make-local-variable 'indent-tabs-mode) nil) | ||
| 324 | (set (make-local-variable 'indent-line-function) 'vera-indent-line) | ||
| 325 | (set (make-local-variable 'parse-sexp-ignore-comments) t) | ||
| 326 | ;; initialize font locking | ||
| 327 | (set (make-local-variable 'font-lock-defaults) | ||
| 328 | '(vera-font-lock-keywords nil nil ((?\_ . "w")))) | ||
| 329 | ;; add menu (XEmacs) | ||
| 330 | (easy-menu-add vera-mode-menu) | ||
| 331 | ;; miscellaneous | ||
| 332 | (message "Vera Mode %s. Type C-c C-h for documentation." vera-version) | ||
| 333 | ;; run hooks | ||
| 334 | (run-hooks 'vera-mode-hook)) | ||
| 335 | |||
| 336 | |||
| 337 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 338 | ;;; Vera definitions | ||
| 339 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 340 | |||
| 341 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 342 | ;;; Keywords | ||
| 343 | |||
| 344 | (defconst vera-keywords | ||
| 345 | '( | ||
| 346 | "after" "all" "any" "around" "assoc_index" "assoc_size" "async" | ||
| 347 | "bad_state" "bad_trans" "before" "begin" "big_endian" "bind" | ||
| 348 | "bin_activation" "bit_normal" "bit_reverse" "break" "breakpoint" | ||
| 349 | "case" "casex" "casez" "class" "constraint" "continue" | ||
| 350 | "coverage" "coverage_block" "coverage_def" "coverage_depth" | ||
| 351 | "coverage_goal" "coverage_group" "coverage_option" "coverage_val" | ||
| 352 | "cross_num_print_missing" "cross_auto_bin_max" "cov_comment" | ||
| 353 | "default" "depth" "dist" "do" | ||
| 354 | "else" "end" "enum" "exhaustive" "export" "extends" "extern" | ||
| 355 | "for" "foreach" "fork" "function" | ||
| 356 | "hdl_task" "hdl_node" "hide" | ||
| 357 | "if" "illegal_self_transition" "illegal_state" "illegal_transition" | ||
| 358 | "in" "interface" "invisible" | ||
| 359 | "join" | ||
| 360 | "little_endian" "local" | ||
| 361 | "m_bad_state" "m_bad_trans" "m_state" "m_trans" | ||
| 362 | "negedge" "new" "newcov" "non_rand" "none" "not" "null" | ||
| 363 | "or" "ordered" | ||
| 364 | "packed" "port" "posedge" "proceed" "prod" "prodget" "prodset" | ||
| 365 | "program" "protected" "public" | ||
| 366 | "rand" "randc" "randcase" "randseq" "repeat" "return" "rules" | ||
| 367 | "sample" "sample_event" "shadow" "soft" "state" "static" "super" | ||
| 368 | "task" "terminate" "this" "trans" "typedef" | ||
| 369 | "unpacked" | ||
| 370 | "var" "vca" "vector" "verilog_node" "verilog_task" | ||
| 371 | "vhdl_node" "vhdl_task" "virtual" "virtuals" "visible" "void" | ||
| 372 | "while" "wildcard" "with" | ||
| 373 | ) | ||
| 374 | "List of Vera keywords.") | ||
| 375 | |||
| 376 | (defconst vera-types | ||
| 377 | '( | ||
| 378 | "integer" "bit" "reg" "string" "bind_var" "event" | ||
| 379 | "inout" "input" "output" | ||
| 380 | "ASYNC" "CLOCK" | ||
| 381 | "NDRIVE" "NHOLD" "NRX" "NRZ" "NR0" "NR1" "NSAMPLE" | ||
| 382 | "PDRIVE" "PHOLD" "PRX" "PRZ" "PR0" "PR1" "PSAMPLE" | ||
| 383 | ) | ||
| 384 | "List of Vera predefined types.") | ||
| 385 | |||
| 386 | (defconst vera-q-values | ||
| 387 | '( | ||
| 388 | "gnr" "grx" "grz" "gr0" "gr1" | ||
| 389 | "nr" "rx" "rz" "r0" "r1" | ||
| 390 | "snr" "srx" "srz" "sr0" "sr1" | ||
| 391 | ) | ||
| 392 | "List of Vera predefined VCA q_values.") | ||
| 393 | |||
| 394 | (defconst vera-functions | ||
| 395 | '( | ||
| 396 | ;; system functions and tasks | ||
| 397 | "alloc" | ||
| 398 | "call_func" "call_task" "cast_assign" "close_conn" "cm_coverage" | ||
| 399 | "cm_get_coverage" "cm_get_limit" | ||
| 400 | "coverage_backup_database_file" "coverage_save_database" | ||
| 401 | "delay" | ||
| 402 | "error" "error_mode" "error_wait" "exit" | ||
| 403 | "fclose" "feof" "ferror" "fflush" "flag" "fopen" "fprintf" "freadb" | ||
| 404 | "freadb" "freadh" "freadstr" | ||
| 405 | "get_bind" "get_bind_id" "get_conn_err" "get_cycle" "get_env" | ||
| 406 | "get_memsize" "get_plus_arg" "get_systime" "get_time" "get_time_unit" | ||
| 407 | "getstate" | ||
| 408 | "initstate" | ||
| 409 | "lock_file" | ||
| 410 | "mailbox_get" "mailbox_put" "mailbox_receive" "mailbox_send" | ||
| 411 | "make_client" "make_server" | ||
| 412 | "os_command" | ||
| 413 | "printf" "psprintf" | ||
| 414 | "query" "query_str" "query_x" | ||
| 415 | "rand48" "random" "region_enter" "region_exit" "rewind" | ||
| 416 | "semaphore_get" "semaphore_put" "setstate" "signal_connect" "simwave_plot" | ||
| 417 | "srandom" "sprintf" "sscanf" "stop" "suspend_thread" "sync" | ||
| 418 | "timeout" "trace" "trigger" | ||
| 419 | "unit_delay" "unlock_file" "up_connections" | ||
| 420 | "urand48" "urandom" "urandom_range" | ||
| 421 | "vera_bit_reverse" "vera_crc" "vera_pack" "vera_pack_big_endian" | ||
| 422 | "vera_plot" "vera_report_profile" "vera_unpack" "vera_unpack_big_endian" | ||
| 423 | "vsv_call_func" "vsv_call_task" "vsv_close_conn" "vsv_get_conn_err" | ||
| 424 | "vsv_make_client" "vsv_make_server" "vsv_up_connections" | ||
| 425 | "vsv_wait_for_done" "vsv_wait_for_input" | ||
| 426 | "wait_child" "wait_var" | ||
| 427 | ;; class methods | ||
| 428 | "Configure" "DisableTrigger" "DoAction" "EnableCount" "EnableTrigger" | ||
| 429 | "Event" "GetAssert" "GetCount" "GetFirstAssert" "GetName" "GetNextAssert" | ||
| 430 | "Wait" | ||
| 431 | "atobin" "atohex" "atoi" "atooct" | ||
| 432 | "backref" "bittostr" "capacity" "compare" "constraint_mode" | ||
| 433 | "delete" | ||
| 434 | "empty" | ||
| 435 | "find" "find_index" "first" "first_index" | ||
| 436 | "get_at_least" "get_auto_bin" "get_cov_weight" "get_coverage_goal" | ||
| 437 | "get_cross_bin_max" "get_status" "get_status_msg" "getc" | ||
| 438 | "hash" | ||
| 439 | "icompare" "insert" "inst_get_at_least" "inst_get_auto_bin_max" | ||
| 440 | "inst_get_collect" "inst_get_cov_weight" "inst_get_coverage_goal" | ||
| 441 | "inst_getcross_bin_max" "inst_query" "inst_set_at_least" | ||
| 442 | "inst_set_auto_bin_max" "inst_set_bin_activiation" "inst_set_collect" | ||
| 443 | "inst_set_cov_weight" "inst_set_coverage_goal" "inst_set_cross_bin_max" | ||
| 444 | "itoa" | ||
| 445 | "last" "last_index" "len" "load" | ||
| 446 | "match" "max" "max_index" "min" "min_index" | ||
| 447 | "object_compare" "object_copy" "object_print" | ||
| 448 | "pack" "pick_index" "pop_back" "pop_front" "post_pack" "post_randomize" | ||
| 449 | "post_unpack" "postmatch" "pre_pack" "pre_randomize" "prematch" "push_back" | ||
| 450 | "push_front" "putc" | ||
| 451 | "query" "query_str" | ||
| 452 | "rand_mode" "randomize" "reserve" "reverse" "rsort" | ||
| 453 | "search" "set_at_least" "set_auto_bin_max" "set_bin_activiation" | ||
| 454 | "set_cov_weight" "set_coverage_goal" "set_cross_bin_max" "set_name" "size" | ||
| 455 | "sort" "substr" "sum" | ||
| 456 | "thismatch" "tolower" "toupper" | ||
| 457 | "unique_index" "unpack" | ||
| 458 | ;; empty methods | ||
| 459 | "new" "object_compare" | ||
| 460 | "post_boundary" "post_pack" "post_randomize" "post_unpack" "pre-randomize" | ||
| 461 | "pre_boundary" "pre_pack" "pre_unpack" | ||
| 462 | ) | ||
| 463 | "List of Vera predefined system functions, tasks and class methods.") | ||
| 464 | |||
| 465 | (defconst vera-constants | ||
| 466 | '( | ||
| 467 | "ALL" "ANY" | ||
| 468 | "BAD_STATE" "BAD_TRANS" | ||
| 469 | "CALL" "CHECK" "CHGEDGE" "CLEAR" "COPY_NO_WAIT" "COPY_WAIT" | ||
| 470 | "CROSS" "CROSS_TRANS" | ||
| 471 | "DEBUG" "DELETE" | ||
| 472 | "EC_ARRAYX" "EC_CODE_END" "EC_CONFLICT" "EC_EVNTIMOUT" "EC_EXPECT" | ||
| 473 | "EC_FULLEXPECT" "EC_MBXTMOUT" "EC_NEXPECT" "EC_RETURN" "EC_RGNTMOUT" | ||
| 474 | "EC_SCONFLICT" "EC_SEMTMOUT" "EC_SEXPECT" "EC_SFULLEXPECT" "EC_SNEXTPECT" | ||
| 475 | "EC_USERSET" "EQ" "EVENT" | ||
| 476 | "FAIL" "FIRST" "FORK" | ||
| 477 | "GE" "GOAL" "GT" "HAND_SHAKE" "HI" "HIGH" "HNUM" | ||
| 478 | "LE" "LIC_EXIT" "LIC_PRERR" "LIC_PRWARN" "LIC_WAIT" "LO" "LOAD" "LOW" "LT" | ||
| 479 | "MAILBOX" "MAX_COM" | ||
| 480 | "NAME" "NE" "NEGEDGE" "NEXT" "NO_OVERLAP" "NO_OVERLAP_STATE" | ||
| 481 | "NO_OVERLAP_TRANS" "NO_VARS" "NO_WAIT" "NUM" "NUM_BIN" "NUM_DET" | ||
| 482 | "OFF" "OK" "OK_LAST" "ON" "ONE_BLAST" "ONE_SHOT" "ORDER" | ||
| 483 | "PAST_IT" "PERCENT" "POSEDGE" "PROGRAM" | ||
| 484 | "RAWIN" "REGION" "REPORT" | ||
| 485 | "SAMPLE" "SAVE" "SEMAPHORE" "SET" "SILENT" "STATE" "STR" | ||
| 486 | "STR_ERR_OUT_OF_RANGE" "STR_ERR_REGEXP_SYNTAX" "SUM" | ||
| 487 | "TRANS" | ||
| 488 | "VERBOSE" | ||
| 489 | "WAIT" | ||
| 490 | "stderr" "stdin" "stdout" | ||
| 491 | ) | ||
| 492 | "List of Vera predefined constants.") | ||
| 493 | |||
| 494 | (defconst vera-rvm-types | ||
| 495 | '( | ||
| 496 | "VeraListIterator_VeraListIterator_rvm_log" | ||
| 497 | "VeraListIterator_rvm_data" "VeraListIterator_rvm_log" | ||
| 498 | "VeraListNodeVeraListIterator_rvm_log" "VeraListNodervm_data" | ||
| 499 | "VeraListNodervm_log" "VeraList_VeraListIterator_rvm_log" | ||
| 500 | "VeraList_rvm_data" "VeraList_rvm_log" | ||
| 501 | "rvm_broadcast" "rvm_channel_class" "rvm_data" "rvm_data" "rvm_env" | ||
| 502 | "rvm_log" "rvm_log_modifier" "rvm_log_msg" "rvm_log_msg" "rvm_log_msg_info" | ||
| 503 | "rvm_log_watchpoint" "rvm_notify" "rvm_notify_event" | ||
| 504 | "rvm_notify_event_config" "rvm_scheduler" "rvm_scheduler_election" | ||
| 505 | "rvm_watchdog" "rvm_watchdog_port" "rvm_xactor" "rvm_xactor_callbacks" | ||
| 506 | ) | ||
| 507 | "List of Vera-RVM keywords.") | ||
| 508 | |||
| 509 | (defconst vera-rvm-functions | ||
| 510 | '( | ||
| 511 | "extern_rvm_atomic_gen" "extern_rvm_channel" "extern_rvm_scenario_gen" | ||
| 512 | "rvm_OO_callback" "rvm_atomic_gen" "rvm_atomic_gen_callbacks_decl" | ||
| 513 | "rvm_atomic_gen_decl" "rvm_atomic_scenario_decl" "rvm_channel" | ||
| 514 | "rvm_channel_" "rvm_channel_decl" "rvm_command" "rvm_cycle" "rvm_debug" | ||
| 515 | "rvm_error" "rvm_fatal" "rvm_note" "rvm_protocol" "rvm_report" | ||
| 516 | "rvm_scenario_decl" "rvm_scenario_election_decl" "rvm_scenario_gen" | ||
| 517 | "rvm_scenario_gen_callbacks_decl" "rvm_scenario_gen_decl" | ||
| 518 | "rvm_trace" "rvm_transaction" "rvm_user" "rvm_verbose" "rvm_warning" | ||
| 519 | ) | ||
| 520 | "List of Vera-RVM functions.") | ||
| 521 | |||
| 522 | (defconst vera-rvm-constants | ||
| 523 | '( | ||
| 524 | "RVM_NUMERIC_VERSION_MACROS" "RVM_VERSION" "RVM_MINOR" "RVM_PATCH" | ||
| 525 | "rvm_channel__SOURCE" "rvm_channel__SINK" "rvm_channel__NO_ACTIVE" | ||
| 526 | "rvm_channel__ACT_PENDING" "rvm_channel__ACT_STARTED" | ||
| 527 | "rvm_channel__ACT_COMPLETED" "rvm_channel__FULL" "rvm_channel__EMPTY" | ||
| 528 | "rvm_channel__PUT" "rvm_channel__GOT" "rvm_channel__PEEKED" | ||
| 529 | "rvm_channel__ACTIVATED" "rvm_channel__STARTED" "rvm_channel__COMPLETED" | ||
| 530 | "rvm_channel__REMOVED" "rvm_channel__LOCKED" "rvm_channel__UNLOCKED" | ||
| 531 | "rvm_data__EXECUTE" "rvm_data__STARTED" "rvm_data__ENDED" | ||
| 532 | "rvm_env__CFG_GENED" "rvm_env__BUILT" "rvm_env__DUT_CFGED" | ||
| 533 | "rvm_env__STARTED" "rvm_env__RESTARTED" "rvm_env__ENDED" "rvm_env__STOPPED" | ||
| 534 | "rvm_env__CLEANED" "rvm_env__DONE" "rvm_log__DEFAULT" "rvm_log__UNCHANGED" | ||
| 535 | "rvm_log__FAILURE_TYP" "rvm_log__NOTE_TYP" "rvm_log__DEBUG_TYP" | ||
| 536 | "rvm_log__REPORT_TYP" "rvm_log__NOTIFY_TYP" "rvm_log__TIMING_TYP" | ||
| 537 | "rvm_log__XHANDLING_TYP" "rvm_log__PROTOCOL_TYP" "rvm_log__TRANSACTION_TYP" | ||
| 538 | "rvm_log__COMMAND_TYP" "rvm_log__CYCLE_TYP" "rvm_log__USER_TYP_0" | ||
| 539 | "rvm_log__USER_TYP_1" "rvm_log__USER_TYP_2" "rvm_log__USER_TYP_3" | ||
| 540 | "rvm_log__DEFAULT_TYP" "rvm_log__ALL_TYPES" "rvm_log__FATAL_SEV" | ||
| 541 | "rvm_log__ERROR_SEV" "rvm_log__WARNING_SEV" "rvm_log__NORMAL_SEV" | ||
| 542 | "rvm_log__TRACE_SEV" "rvm_log__DEBUG_SEV" "rvm_log__VERBOSE_SEV" | ||
| 543 | "rvm_log__HIDDEN_SEV" "rvm_log__IGNORE_SEV" "rvm_log__DEFAULT_SEV" | ||
| 544 | "rvm_log__ALL_SEVERITIES" "rvm_log__CONTINUE" "rvm_log__COUNT_AS_ERROR" | ||
| 545 | "rvm_log__DEBUGGER" "rvm_log__DUMP" "rvm_log__STOP" "rvm_log__ABORT" | ||
| 546 | "rvm_notify__ONE_SHOT_TRIGGER" "rvm_notify__ONE_BLAST_TRIGGER" | ||
| 547 | "rvm_notify__HAND_SHAKE_TRIGGER" "rvm_notify__ON_OFF_TRIGGER" | ||
| 548 | "rvm_xactor__XACTOR_IDLE" "rvm_xactor__XACTOR_BUSY" | ||
| 549 | "rvm_xactor__XACTOR_STARTED" "rvm_xactor__XACTOR_STOPPED" | ||
| 550 | "rvm_xactor__XACTOR_RESET" "rvm_xactor__XACTOR_SOFT_RST" | ||
| 551 | "rvm_xactor__XACTOR_FIRM_RST" "rvm_xactor__XACTOR_HARD_RST" | ||
| 552 | "rvm_xactor__XACTOR_PROTOCOL_RST" "rvm_broadcast__AFAP" | ||
| 553 | "rvm_broadcast__ALAP" "rvm_watchdog__TIMEOUT" | ||
| 554 | "rvm_env__DUT_RESET" "rvm_log__INTERNAL_TYP" | ||
| 555 | "RVM_SCHEDULER_IS_XACTOR" "RVM_BROADCAST_IS_XACTOR" | ||
| 556 | ) | ||
| 557 | "List of Vera-RVM predefined constants.") | ||
| 558 | |||
| 559 | ;; `regexp-opt' undefined (`xemacs-devel' not installed) | ||
| 560 | (unless (fboundp 'regexp-opt) | ||
| 561 | (defun regexp-opt (strings &optional paren) | ||
| 562 | (let ((open (if paren "\\(" "")) (close (if paren "\\)" ""))) | ||
| 563 | (concat open (mapconcat 'regexp-quote strings "\\|") close)))) | ||
| 564 | |||
| 565 | (defconst vera-keywords-regexp | ||
| 566 | (concat "\\<\\(" (regexp-opt vera-keywords) "\\)\\>") | ||
| 567 | "Regexp for Vera keywords.") | ||
| 568 | |||
| 569 | (defconst vera-types-regexp | ||
| 570 | (concat "\\<\\(" (regexp-opt vera-types) "\\)\\>") | ||
| 571 | "Regexp for Vera predefined types.") | ||
| 572 | |||
| 573 | (defconst vera-q-values-regexp | ||
| 574 | (concat "\\<\\(" (regexp-opt vera-q-values) "\\)\\>") | ||
| 575 | "Regexp for Vera predefined VCA q_values.") | ||
| 576 | |||
| 577 | (defconst vera-functions-regexp | ||
| 578 | (concat "\\<\\(" (regexp-opt vera-functions) "\\)\\>") | ||
| 579 | "Regexp for Vera predefined system functions, tasks and class methods.") | ||
| 580 | |||
| 581 | (defconst vera-constants-regexp | ||
| 582 | (concat "\\<\\(" (regexp-opt vera-constants) "\\)\\>") | ||
| 583 | "Regexp for Vera predefined constants.") | ||
| 584 | |||
| 585 | (defconst vera-rvm-types-regexp | ||
| 586 | (concat "\\<\\(" (regexp-opt vera-rvm-types) "\\)\\>") | ||
| 587 | "Regexp for Vera-RVM keywords.") | ||
| 588 | |||
| 589 | (defconst vera-rvm-functions-regexp | ||
| 590 | (concat "\\<\\(" (regexp-opt vera-rvm-functions) "\\)\\>") | ||
| 591 | "Regexp for Vera-RVM predefined system functions, tasks and class methods.") | ||
| 592 | |||
| 593 | (defconst vera-rvm-constants-regexp | ||
| 594 | (concat "\\<\\(" (regexp-opt vera-rvm-constants) "\\)\\>") | ||
| 595 | "Regexp for Vera-RVM predefined constants.") | ||
| 596 | |||
| 597 | |||
| 598 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 599 | ;;; Font locking | ||
| 600 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 601 | |||
| 602 | ;; XEmacs compatibility | ||
| 603 | (when vera-xemacs | ||
| 604 | (require 'font-lock) | ||
| 605 | (copy-face 'font-lock-reference-face 'font-lock-constant-face) | ||
| 606 | (copy-face 'font-lock-preprocessor-face 'font-lock-builtin-face)) | ||
| 607 | |||
| 608 | (defun vera-font-lock-match-item (limit) | ||
| 609 | "Match, and move over, any declaration item after point. Adapted from | ||
| 610 | `font-lock-match-c-style-declaration-item-and-skip-to-next'." | ||
| 611 | (condition-case nil | ||
| 612 | (save-restriction | ||
| 613 | (narrow-to-region (point-min) limit) | ||
| 614 | ;; match item | ||
| 615 | (when (looking-at "\\s-*\\(\\w+\\)") | ||
| 616 | (save-match-data | ||
| 617 | (goto-char (match-end 1)) | ||
| 618 | ;; move to next item | ||
| 619 | (if (looking-at "\\(\\s-*\\(\\[[^]]*\\]\\s-*\\)?,\\)") | ||
| 620 | (goto-char (match-end 1)) | ||
| 621 | (end-of-line) t)))) | ||
| 622 | (error t))) | ||
| 623 | |||
| 624 | (defvar vera-font-lock-keywords | ||
| 625 | (list | ||
| 626 | ;; highlight keywords | ||
| 627 | (list vera-keywords-regexp 1 'font-lock-keyword-face) | ||
| 628 | ;; highlight types | ||
| 629 | (list vera-types-regexp 1 'font-lock-type-face) | ||
| 630 | ;; highlight RVM types | ||
| 631 | (list vera-rvm-types-regexp 1 'font-lock-type-face) | ||
| 632 | ;; highlight constants | ||
| 633 | (list vera-constants-regexp 1 'font-lock-constant-face) | ||
| 634 | ;; highlight RVM constants | ||
| 635 | (list vera-rvm-constants-regexp 1 'font-lock-constant-face) | ||
| 636 | ;; highlight q_values | ||
| 637 | (list vera-q-values-regexp 1 'font-lock-constant-face) | ||
| 638 | ;; highlight predefined functions, tasks and methods | ||
| 639 | (list vera-functions-regexp 1 'vera-font-lock-function) | ||
| 640 | ;; highlight predefined RVM functions | ||
| 641 | (list vera-rvm-functions-regexp 1 'vera-font-lock-function) | ||
| 642 | ;; highlight functions | ||
| 643 | '("\\<\\(\\w+\\)\\s-*(" 1 font-lock-function-name-face) | ||
| 644 | ;; highlight various declaration names | ||
| 645 | '("^\\s-*\\(port\\|program\\|task\\)\\s-+\\(\\w+\\)\\>" | ||
| 646 | 2 font-lock-function-name-face) | ||
| 647 | '("^\\s-*bind\\s-+\\(\\w+\\)\\s-+\\(\\w+\\)\\>" | ||
| 648 | (1 font-lock-function-name-face) (2 font-lock-function-name-face)) | ||
| 649 | ;; highlight interface declaration names | ||
| 650 | '("^\\s-*\\(class\\|interface\\)\\s-+\\(\\w+\\)\\>" | ||
| 651 | 2 vera-font-lock-interface) | ||
| 652 | ;; highlight variable name definitions | ||
| 653 | (list (concat "^\\s-*" vera-types-regexp "\\s-*\\(\\[[^]]+\\]\\s-+\\)?") | ||
| 654 | '(vera-font-lock-match-item nil nil (1 font-lock-variable-name-face))) | ||
| 655 | (list (concat "^\\s-*" vera-rvm-types-regexp "\\s-*\\(\\[[^]]+\\]\\s-+\\)?") | ||
| 656 | '(vera-font-lock-match-item nil nil (1 font-lock-variable-name-face))) | ||
| 657 | ;; highlight numbers | ||
| 658 | '("\\([0-9]*'[bdoh][0-9a-fA-FxXzZ_]+\\)" 1 vera-font-lock-number) | ||
| 659 | ;; highlight filenames in #include directives | ||
| 660 | '("^#\\s-*include\\s-*\\(<[^>\"\n]*>?\\)" | ||
| 661 | 1 font-lock-string-face) | ||
| 662 | ;; highlight directives and directive names | ||
| 663 | '("^#\\s-*\\(\\w+\\)\\>[ \t!]*\\(\\w+\\)?" | ||
| 664 | (1 font-lock-builtin-face) (2 font-lock-variable-name-face nil t)) | ||
| 665 | ;; highlight `@', `$' and `#' | ||
| 666 | '("\\([@$#]\\)" 1 font-lock-keyword-face) | ||
| 667 | ;; highlight @ and # definitions | ||
| 668 | '("@\\s-*\\(\\w*\\)\\(\\s-*,\\s-*\\(\\w+\\)\\)?\\>[^.]" | ||
| 669 | (1 vera-font-lock-number) (3 vera-font-lock-number nil t)) | ||
| 670 | ;; highlight interface signal name | ||
| 671 | '("\\(\\w+\\)\\.\\w+" 1 vera-font-lock-interface) | ||
| 672 | ) | ||
| 673 | "Regular expressions to highlight in Vera Mode.") | ||
| 674 | |||
| 675 | (defvar vera-font-lock-number 'vera-font-lock-number | ||
| 676 | "Face name to use for @ definitions.") | ||
| 677 | |||
| 678 | (defvar vera-font-lock-function 'vera-font-lock-function | ||
| 679 | "Face name to use for predefined functions and tasks.") | ||
| 680 | |||
| 681 | (defvar vera-font-lock-interface 'vera-font-lock-interface | ||
| 682 | "Face name to use for interface names.") | ||
| 683 | |||
| 684 | (defface vera-font-lock-number | ||
| 685 | '((((class color) (background light)) (:foreground "Gold4")) | ||
| 686 | (((class color) (background dark)) (:foreground "BurlyWood1")) | ||
| 687 | (t (:italic t :bold t))) | ||
| 688 | "Font lock mode face used to highlight @ definitions." | ||
| 689 | :group 'font-lock-highlighting-faces) | ||
| 690 | (put 'vera-font-lock-number-face 'face-alias 'vera-font-lock-number) | ||
| 691 | |||
| 692 | (defface vera-font-lock-function | ||
| 693 | '((((class color) (background light)) (:foreground "DarkCyan")) | ||
| 694 | (((class color) (background dark)) (:foreground "Orchid1")) | ||
| 695 | (t (:italic t :bold t))) | ||
| 696 | "Font lock mode face used to highlight predefined functions and tasks." | ||
| 697 | :group 'font-lock-highlighting-faces) | ||
| 698 | (put 'vera-font-lock-function-face 'face-alias 'vera-font-lock-function) | ||
| 699 | |||
| 700 | (defface vera-font-lock-interface | ||
| 701 | '((((class color) (background light)) (:foreground "Grey40")) | ||
| 702 | (((class color) (background dark)) (:foreground "Grey80")) | ||
| 703 | (t (:italic t :bold t))) | ||
| 704 | "Font lock mode face used to highlight interface names." | ||
| 705 | :group 'font-lock-highlighting-faces) | ||
| 706 | (put 'vera-font-lock-interface-face 'face-alias 'vera-font-lock-interface) | ||
| 707 | |||
| 708 | (defun vera-fontify-buffer () | ||
| 709 | "Fontify buffer." | ||
| 710 | (interactive) | ||
| 711 | (font-lock-fontify-buffer)) | ||
| 712 | |||
| 713 | |||
| 714 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 715 | ;;; Indentation | ||
| 716 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 717 | |||
| 718 | (defvar vera-echo-syntactic-information-p nil | ||
| 719 | "If non-nil, syntactic info is echoed when the line is indented.") | ||
| 720 | |||
| 721 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 722 | ;; offset functions | ||
| 723 | |||
| 724 | (defconst vera-offsets-alist | ||
| 725 | '((comment . vera-lineup-C-comments) | ||
| 726 | (comment-intro . vera-lineup-comment) | ||
| 727 | (string . -1000) | ||
| 728 | (directive . -1000) | ||
| 729 | (block-open . 0) | ||
| 730 | (block-intro . +) | ||
| 731 | (block-close . 0) | ||
| 732 | (arglist-intro . +) | ||
| 733 | (arglist-cont . +) | ||
| 734 | (arglist-cont-nonempty . 0) | ||
| 735 | (arglist-close . 0) | ||
| 736 | (statement . 0) | ||
| 737 | (statement-cont . +) | ||
| 738 | (substatement . +) | ||
| 739 | (else-clause . 0)) | ||
| 740 | "Association list of syntactic element symbols and indentation offsets. | ||
| 741 | Adapted from `c-offsets-alist'.") | ||
| 742 | |||
| 743 | (defun vera-evaluate-offset (offset langelem symbol) | ||
| 744 | "OFFSET can be a number, a function, a variable, a list, or one of | ||
| 745 | the symbols + or -." | ||
| 746 | (cond | ||
| 747 | ((eq offset '+) (setq offset vera-basic-offset)) | ||
| 748 | ((eq offset '-) (setq offset (- vera-basic-offset))) | ||
| 749 | ((eq offset '++) (setq offset (* 2 vera-basic-offset))) | ||
| 750 | ((eq offset '--) (setq offset (* 2 (- vera-basic-offset)))) | ||
| 751 | ((eq offset '*) (setq offset (/ vera-basic-offset 2))) | ||
| 752 | ((eq offset '/) (setq offset (/ (- vera-basic-offset) 2))) | ||
| 753 | ((functionp offset) (setq offset (funcall offset langelem))) | ||
| 754 | ((listp offset) | ||
| 755 | (setq offset | ||
| 756 | (let (done) | ||
| 757 | (while (and (not done) offset) | ||
| 758 | (setq done (vera-evaluate-offset (car offset) langelem symbol) | ||
| 759 | offset (cdr offset))) | ||
| 760 | (if (not done) | ||
| 761 | 0 | ||
| 762 | done)))) | ||
| 763 | ((not (numberp offset)) (setq offset (symbol-value offset)))) | ||
| 764 | offset) | ||
| 765 | |||
| 766 | (defun vera-get-offset (langelem) | ||
| 767 | "Get offset from LANGELEM which is a cons cell of the form: | ||
| 768 | \(SYMBOL . RELPOS). The symbol is matched against | ||
| 769 | vera-offsets-alist and the offset found there is either returned, | ||
| 770 | or added to the indentation at RELPOS. If RELPOS is nil, then | ||
| 771 | the offset is simply returned." | ||
| 772 | (let* ((symbol (car langelem)) | ||
| 773 | (relpos (cdr langelem)) | ||
| 774 | (match (assq symbol vera-offsets-alist)) | ||
| 775 | (offset (cdr-safe match))) | ||
| 776 | (if (not match) | ||
| 777 | (setq offset 0 | ||
| 778 | relpos 0) | ||
| 779 | (setq offset (vera-evaluate-offset offset langelem symbol))) | ||
| 780 | (+ (if (and relpos | ||
| 781 | (< relpos (save-excursion (beginning-of-line) (point)))) | ||
| 782 | (save-excursion | ||
| 783 | (goto-char relpos) | ||
| 784 | (current-column)) | ||
| 785 | 0) | ||
| 786 | (vera-evaluate-offset offset langelem symbol)))) | ||
| 787 | |||
| 788 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 789 | ;; help functions | ||
| 790 | |||
| 791 | (defsubst vera-point (position) | ||
| 792 | "Returns the value of point at certain commonly referenced POSITIONs. | ||
| 793 | POSITION can be one of the following symbols: | ||
| 794 | bol -- beginning of line | ||
| 795 | eol -- end of line | ||
| 796 | boi -- back to indentation | ||
| 797 | ionl -- indentation of next line | ||
| 798 | iopl -- indentation of previous line | ||
| 799 | bonl -- beginning of next line | ||
| 800 | bopl -- beginning of previous line | ||
| 801 | This function does not modify point or mark." | ||
| 802 | (save-excursion | ||
| 803 | (cond | ||
| 804 | ((eq position 'bol) (beginning-of-line)) | ||
| 805 | ((eq position 'eol) (end-of-line)) | ||
| 806 | ((eq position 'boi) (back-to-indentation)) | ||
| 807 | ((eq position 'bonl) (forward-line 1)) | ||
| 808 | ((eq position 'bopl) (forward-line -1)) | ||
| 809 | ((eq position 'iopl) (forward-line -1) (back-to-indentation)) | ||
| 810 | ((eq position 'ionl) (forward-line 1) (back-to-indentation)) | ||
| 811 | (t (error "Unknown buffer position requested: %s" position))) | ||
| 812 | (point))) | ||
| 813 | |||
| 814 | (defun vera-in-literal (&optional lim) | ||
| 815 | "Determine if point is in a Vera literal." | ||
| 816 | (save-excursion | ||
| 817 | (let ((state (parse-partial-sexp (or lim (point-min)) (point)))) | ||
| 818 | (cond | ||
| 819 | ((nth 3 state) 'string) | ||
| 820 | ((nth 4 state) 'comment) | ||
| 821 | (t nil))))) | ||
| 822 | |||
| 823 | (defun vera-in-comment-p () | ||
| 824 | "Determine if point is in a Vera comment." | ||
| 825 | (save-excursion | ||
| 826 | (re-search-backward "\\(/\\*\\)\\|\\(\\*/\\)" nil t) | ||
| 827 | (match-string 1))) | ||
| 828 | |||
| 829 | (defun vera-skip-forward-literal () | ||
| 830 | "Skip forward literal and return t if within one." | ||
| 831 | (let ((state (save-excursion (parse-partial-sexp (point-min) (point))))) | ||
| 832 | (cond | ||
| 833 | ((nth 3 state) (search-forward "\"") t) ; inside string | ||
| 834 | ((nth 7 state) (forward-line 1) t) ; inside // comment | ||
| 835 | ((nth 4 state) (search-forward "*/") t) ; inside /* */ comment | ||
| 836 | (t nil)))) | ||
| 837 | |||
| 838 | (defun vera-skip-backward-literal () | ||
| 839 | "Skip backward literal and return t if within one." | ||
| 840 | (let ((state (save-excursion (parse-partial-sexp (point-min) (point))))) | ||
| 841 | (cond | ||
| 842 | ((nth 3 state) (search-backward "\"") t) ; inside string | ||
| 843 | ((nth 7 state) (search-backward "//") t) ; inside // comment | ||
| 844 | ((nth 4 state) (search-backward "/*") t) ; inside /* */ comment | ||
| 845 | (t nil)))) | ||
| 846 | |||
| 847 | (defsubst vera-re-search-forward (regexp &optional bound noerror) | ||
| 848 | "Like `re-search-forward', but skips over matches in literals." | ||
| 849 | (store-match-data '(nil nil)) | ||
| 850 | (while (and (re-search-forward regexp bound noerror) | ||
| 851 | (vera-skip-forward-literal) | ||
| 852 | (progn (store-match-data '(nil nil)) | ||
| 853 | (if bound (< (point) bound) t)))) | ||
| 854 | (match-end 0)) | ||
| 855 | |||
| 856 | (defsubst vera-re-search-backward (regexp &optional bound noerror) | ||
| 857 | "Like `re-search-backward', but skips over matches in literals." | ||
| 858 | (store-match-data '(nil nil)) | ||
| 859 | (while (and (re-search-backward regexp bound noerror) | ||
| 860 | (vera-skip-backward-literal) | ||
| 861 | (progn (store-match-data '(nil nil)) | ||
| 862 | (if bound (> (point) bound) t)))) | ||
| 863 | (match-end 0)) | ||
| 864 | |||
| 865 | (defun vera-forward-syntactic-ws (&optional lim skip-directive) | ||
| 866 | "Forward skip of syntactic whitespace." | ||
| 867 | (save-restriction | ||
| 868 | (let* ((lim (or lim (point-max))) | ||
| 869 | (here lim) | ||
| 870 | (hugenum (point-max))) | ||
| 871 | (narrow-to-region lim (point)) | ||
| 872 | (while (/= here (point)) | ||
| 873 | (setq here (point)) | ||
| 874 | (forward-comment hugenum) | ||
| 875 | (when (and skip-directive (looking-at "^\\s-*#")) | ||
| 876 | (end-of-line)))))) | ||
| 877 | |||
| 878 | (defun vera-backward-syntactic-ws (&optional lim skip-directive) | ||
| 879 | "Backward skip over syntactic whitespace." | ||
| 880 | (save-restriction | ||
| 881 | (let* ((lim (or lim (point-min))) | ||
| 882 | (here lim) | ||
| 883 | (hugenum (- (point-max)))) | ||
| 884 | (when (< lim (point)) | ||
| 885 | (narrow-to-region lim (point)) | ||
| 886 | (while (/= here (point)) | ||
| 887 | (setq here (point)) | ||
| 888 | (forward-comment hugenum) | ||
| 889 | (when (and skip-directive | ||
| 890 | (save-excursion (back-to-indentation) | ||
| 891 | (= (following-char) ?\#))) | ||
| 892 | (beginning-of-line))))))) | ||
| 893 | |||
| 894 | (defmacro vera-prepare-search (&rest body) | ||
| 895 | "Switch to syntax table that includes '_', then execute BODY, and finally | ||
| 896 | restore the old environment. Used for consistent searching." | ||
| 897 | `(let ((current-syntax-table (syntax-table)) | ||
| 898 | result | ||
| 899 | (restore-prog ; program to restore enviroment | ||
| 900 | '(progn | ||
| 901 | ;; restore syntax table | ||
| 902 | (set-syntax-table current-syntax-table)))) | ||
| 903 | ;; use extended syntax table | ||
| 904 | (set-syntax-table vera-mode-ext-syntax-table) | ||
| 905 | ;; execute BODY safely | ||
| 906 | (setq result | ||
| 907 | (condition-case info | ||
| 908 | (progn ,@body) | ||
| 909 | (error (eval restore-prog) ; restore environment on error | ||
| 910 | (error (cadr info))))) ; pass error up | ||
| 911 | ;; restore environment | ||
| 912 | (eval restore-prog) | ||
| 913 | result)) | ||
| 914 | |||
| 915 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 916 | ;; comment indentation functions | ||
| 917 | |||
| 918 | (defsubst vera-langelem-col (langelem &optional preserve-point) | ||
| 919 | "Convenience routine to return the column of LANGELEM's relpos. | ||
| 920 | Leaves point at the relpos unless PRESERVE-POINT is non-nil." | ||
| 921 | (let ((here (point))) | ||
| 922 | (goto-char (cdr langelem)) | ||
| 923 | (prog1 (current-column) | ||
| 924 | (if preserve-point | ||
| 925 | (goto-char here))))) | ||
| 926 | |||
| 927 | (defun vera-lineup-C-comments (langelem) | ||
| 928 | "Line up C block comment continuation lines. | ||
| 929 | Nicked from `c-lineup-C-comments'." | ||
| 930 | (save-excursion | ||
| 931 | (let ((here (point)) | ||
| 932 | (stars (progn (back-to-indentation) | ||
| 933 | (skip-chars-forward "*"))) | ||
| 934 | (langelem-col (vera-langelem-col langelem))) | ||
| 935 | (back-to-indentation) | ||
| 936 | (if (not (re-search-forward "/\\([*]+\\)" (vera-point 'eol) t)) | ||
| 937 | (progn | ||
| 938 | (if (not (looking-at "[*]+")) | ||
| 939 | (progn | ||
| 940 | ;; we now have to figure out where this comment begins. | ||
| 941 | (goto-char here) | ||
| 942 | (back-to-indentation) | ||
| 943 | (if (looking-at "[*]+/") | ||
| 944 | (progn (goto-char (match-end 0)) | ||
| 945 | (forward-comment -1)) | ||
| 946 | (goto-char (cdr langelem)) | ||
| 947 | (back-to-indentation)))) | ||
| 948 | (- (current-column) langelem-col)) | ||
| 949 | (if (zerop stars) | ||
| 950 | (progn | ||
| 951 | (skip-chars-forward " \t") | ||
| 952 | (- (current-column) langelem-col)) | ||
| 953 | ;; how many stars on comment opening line? if greater than | ||
| 954 | ;; on current line, align left. if less than or equal, | ||
| 955 | ;; align right. this should also pick up Javadoc style | ||
| 956 | ;; comments. | ||
| 957 | (if (> (length (match-string 1)) stars) | ||
| 958 | (progn | ||
| 959 | (back-to-indentation) | ||
| 960 | (- (current-column) -1 langelem-col)) | ||
| 961 | (- (current-column) stars langelem-col))))))) | ||
| 962 | |||
| 963 | (defun vera-lineup-comment (langelem) | ||
| 964 | "Line up a comment start." | ||
| 965 | (save-excursion | ||
| 966 | (back-to-indentation) | ||
| 967 | (if (bolp) | ||
| 968 | ;; not indent if at beginning of line | ||
| 969 | -1000 | ||
| 970 | ;; otherwise indent accordingly | ||
| 971 | (goto-char (cdr langelem)) | ||
| 972 | (current-column)))) | ||
| 973 | |||
| 974 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 975 | ;; move functions | ||
| 976 | |||
| 977 | (defconst vera-beg-block-re "{\\|\\<\\(begin\\|fork\\)\\>") | ||
| 978 | |||
| 979 | (defconst vera-end-block-re "}\\|\\<\\(end\\|join\\(\\s-+\\(all\\|any\\|none\\)\\)?\\)\\>") | ||
| 980 | |||
| 981 | (defconst vera-beg-substatement-re "\\<\\(else\\|for\\|if\\|repeat\\|while\\)\\>") | ||
| 982 | |||
| 983 | (defun vera-corresponding-begin (&optional recursive) | ||
| 984 | "Find corresponding block begin if cursor is at a block end." | ||
| 985 | (while (and (vera-re-search-backward | ||
| 986 | (concat "\\(" vera-end-block-re "\\)\\|" vera-beg-block-re) | ||
| 987 | nil t) | ||
| 988 | (match-string 1)) | ||
| 989 | (vera-corresponding-begin t)) | ||
| 990 | (unless recursive (vera-beginning-of-substatement))) | ||
| 991 | |||
| 992 | (defun vera-corresponding-if () | ||
| 993 | "Find corresponding `if' if cursor is at `else'." | ||
| 994 | (while (and (vera-re-search-backward "}\\|\\<\\(if\\|else\\)\\>" nil t) | ||
| 995 | (not (equal (match-string 0) "if"))) | ||
| 996 | (if (equal (match-string 0) "else") | ||
| 997 | (vera-corresponding-if) | ||
| 998 | (forward-char) | ||
| 999 | (backward-sexp)))) | ||
| 1000 | |||
| 1001 | (defun vera-beginning-of-statement () | ||
| 1002 | "Go to beginning of current statement." | ||
| 1003 | (let (pos) | ||
| 1004 | (while | ||
| 1005 | (progn | ||
| 1006 | ;; search for end of previous statement | ||
| 1007 | (while | ||
| 1008 | (and (vera-re-search-backward | ||
| 1009 | (concat "[);]\\|" vera-beg-block-re | ||
| 1010 | "\\|" vera-end-block-re) nil t) | ||
| 1011 | (equal (match-string 0) ")")) | ||
| 1012 | (forward-char) | ||
| 1013 | (backward-sexp)) | ||
| 1014 | (setq pos (match-beginning 0)) | ||
| 1015 | ;; go back to beginning of current statement | ||
| 1016 | (goto-char (or (match-end 0) 0)) | ||
| 1017 | (vera-forward-syntactic-ws nil t) | ||
| 1018 | (when (looking-at "(") | ||
| 1019 | (forward-sexp) | ||
| 1020 | (vera-forward-syntactic-ws nil t)) | ||
| 1021 | ;; if "else" found, go to "if" and search again | ||
| 1022 | (when (looking-at "\\<else\\>") | ||
| 1023 | (vera-corresponding-if) | ||
| 1024 | (setq pos (point)) | ||
| 1025 | t)) | ||
| 1026 | ;; if search is repeated, go to beginning of last search | ||
| 1027 | (goto-char pos)))) | ||
| 1028 | |||
| 1029 | (defun vera-beginning-of-substatement () | ||
| 1030 | "Go to beginning of current substatement." | ||
| 1031 | (let ((lim (point)) | ||
| 1032 | pos) | ||
| 1033 | ;; go to beginning of statement | ||
| 1034 | (vera-beginning-of-statement) | ||
| 1035 | (setq pos (point)) | ||
| 1036 | ;; go forward all substatement opening statements until at LIM | ||
| 1037 | (while (and (< (point) lim) | ||
| 1038 | (vera-re-search-forward vera-beg-substatement-re lim t)) | ||
| 1039 | (setq pos (match-beginning 0))) | ||
| 1040 | (vera-forward-syntactic-ws nil t) | ||
| 1041 | (when (looking-at "(") | ||
| 1042 | (forward-sexp) | ||
| 1043 | (vera-forward-syntactic-ws nil t)) | ||
| 1044 | (when (< (point) lim) | ||
| 1045 | (setq pos (point))) | ||
| 1046 | (goto-char pos))) | ||
| 1047 | |||
| 1048 | (defun vera-forward-statement () | ||
| 1049 | "Move forward one statement." | ||
| 1050 | (interactive) | ||
| 1051 | (vera-prepare-search | ||
| 1052 | (while (and (vera-re-search-forward | ||
| 1053 | (concat "[(;]\\|" vera-beg-block-re "\\|" vera-end-block-re) | ||
| 1054 | nil t) | ||
| 1055 | (equal (match-string 0) "(")) | ||
| 1056 | (backward-char) | ||
| 1057 | (forward-sexp)) | ||
| 1058 | (vera-beginning-of-substatement))) | ||
| 1059 | |||
| 1060 | (defun vera-backward-statement () | ||
| 1061 | "Move backward one statement." | ||
| 1062 | (interactive) | ||
| 1063 | (vera-prepare-search | ||
| 1064 | (vera-backward-syntactic-ws nil t) | ||
| 1065 | (unless (= (preceding-char) ?\)) | ||
| 1066 | (backward-char)) | ||
| 1067 | (vera-beginning-of-substatement))) | ||
| 1068 | |||
| 1069 | (defun vera-forward-same-indent () | ||
| 1070 | "Move forward to next line with same indent." | ||
| 1071 | (interactive) | ||
| 1072 | (let ((pos (point)) | ||
| 1073 | (indent (current-indentation))) | ||
| 1074 | (beginning-of-line 2) | ||
| 1075 | (while (and (not (eobp)) | ||
| 1076 | (or (looking-at "^\\s-*$") | ||
| 1077 | (> (current-indentation) indent))) | ||
| 1078 | (beginning-of-line 2)) | ||
| 1079 | (if (= (current-indentation) indent) | ||
| 1080 | (back-to-indentation) | ||
| 1081 | (message "No following line with same indent found in this block") | ||
| 1082 | (goto-char pos)))) | ||
| 1083 | |||
| 1084 | (defun vera-backward-same-indent () | ||
| 1085 | "Move backward to previous line with same indent." | ||
| 1086 | (interactive) | ||
| 1087 | (let ((pos (point)) | ||
| 1088 | (indent (current-indentation))) | ||
| 1089 | (beginning-of-line -0) | ||
| 1090 | (while (and (not (bobp)) | ||
| 1091 | (or (looking-at "^\\s-*$") | ||
| 1092 | (> (current-indentation) indent))) | ||
| 1093 | (beginning-of-line -0)) | ||
| 1094 | (if (= (current-indentation) indent) | ||
| 1095 | (back-to-indentation) | ||
| 1096 | (message "No preceding line with same indent found in this block") | ||
| 1097 | (goto-char pos)))) | ||
| 1098 | |||
| 1099 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1100 | ;; syntax analysis | ||
| 1101 | |||
| 1102 | (defmacro vera-add-syntax (symbol &optional relpos) | ||
| 1103 | "A simple macro to append the syntax in SYMBOL to the syntax list. | ||
| 1104 | try to increase performance by using this macro." | ||
| 1105 | `(setq syntax (cons (cons ,symbol ,(or relpos 0)) syntax))) | ||
| 1106 | |||
| 1107 | (defun vera-guess-basic-syntax () | ||
| 1108 | "Determine syntactic context of current line of code." | ||
| 1109 | (save-excursion | ||
| 1110 | (beginning-of-line) | ||
| 1111 | (let ((indent-point (point)) | ||
| 1112 | syntax state placeholder pos) | ||
| 1113 | ;; determine syntax state | ||
| 1114 | (setq state (parse-partial-sexp (point-min) (point))) | ||
| 1115 | (cond | ||
| 1116 | ;; CASE 1: in a comment? | ||
| 1117 | ((nth 4 state) | ||
| 1118 | ;; skip empty lines | ||
| 1119 | (while (and (zerop (forward-line -1)) | ||
| 1120 | (looking-at "^\\s-*$"))) | ||
| 1121 | (vera-add-syntax 'comment (vera-point 'boi))) | ||
| 1122 | ;; CASE 2: in a string? | ||
| 1123 | ((nth 3 state) | ||
| 1124 | (vera-add-syntax 'string)) | ||
| 1125 | ;; CASE 3: at a directive? | ||
| 1126 | ((save-excursion (back-to-indentation) (= (following-char) ?\#)) | ||
| 1127 | (vera-add-syntax 'directive (point))) | ||
| 1128 | ;; CASE 4: after an opening parenthesis (argument list continuation)? | ||
| 1129 | ((and (nth 1 state) | ||
| 1130 | (or (= (char-after (nth 1 state)) ?\() | ||
| 1131 | ;; also for concatenation (opening '{' and ',' on eol/eopl) | ||
| 1132 | (and (= (char-after (nth 1 state)) ?\{) | ||
| 1133 | (or (save-excursion | ||
| 1134 | (vera-backward-syntactic-ws) (= (char-before) ?,)) | ||
| 1135 | (save-excursion | ||
| 1136 | (end-of-line) (= (char-before) ?,)))))) | ||
| 1137 | (goto-char (1+ (nth 1 state))) | ||
| 1138 | ;; is there code after the opening parenthesis on the same line? | ||
| 1139 | (if (looking-at "\\s-*$") | ||
| 1140 | (vera-add-syntax 'arglist-cont (vera-point 'boi)) | ||
| 1141 | (vera-add-syntax 'arglist-cont-nonempty (point)))) | ||
| 1142 | ;; CASE 5: at a block closing? | ||
| 1143 | ((save-excursion (back-to-indentation) (looking-at vera-end-block-re)) | ||
| 1144 | ;; look for the corresponding begin | ||
| 1145 | (vera-corresponding-begin) | ||
| 1146 | (vera-add-syntax 'block-close (vera-point 'boi))) | ||
| 1147 | ;; CASE 6: at a block intro (the first line after a block opening)? | ||
| 1148 | ((and (save-excursion | ||
| 1149 | (vera-backward-syntactic-ws nil t) | ||
| 1150 | ;; previous line ends with a block opening? | ||
| 1151 | (or (/= (skip-chars-backward "{") 0) (backward-word 1)) | ||
| 1152 | (when (looking-at vera-beg-block-re) | ||
| 1153 | ;; go to beginning of substatement | ||
| 1154 | (vera-beginning-of-substatement) | ||
| 1155 | (setq placeholder (point)))) | ||
| 1156 | ;; not if "fork" is followed by "{" | ||
| 1157 | (save-excursion | ||
| 1158 | (not (and (progn (back-to-indentation) (looking-at "{")) | ||
| 1159 | (progn (goto-char placeholder) | ||
| 1160 | (looking-at "\\<fork\\>")))))) | ||
| 1161 | (goto-char placeholder) | ||
| 1162 | (vera-add-syntax 'block-intro (vera-point 'boi))) | ||
| 1163 | ;; CASE 7: at the beginning of an else clause? | ||
| 1164 | ((save-excursion (back-to-indentation) (looking-at "\\<else\\>")) | ||
| 1165 | ;; find corresponding if | ||
| 1166 | (vera-corresponding-if) | ||
| 1167 | (vera-add-syntax 'else-clause (vera-point 'boi))) | ||
| 1168 | ;; CASE 8: at the beginning of a statement? | ||
| 1169 | ;; is the previous command completed? | ||
| 1170 | ((or (save-excursion | ||
| 1171 | (vera-backward-syntactic-ws nil t) | ||
| 1172 | (setq placeholder (point)) | ||
| 1173 | ;; at the beginning of the buffer? | ||
| 1174 | (or (bobp) | ||
| 1175 | ;; previous line ends with a semicolon or | ||
| 1176 | ;; is a block opening or closing? | ||
| 1177 | (when (or (/= (skip-chars-backward "{};") 0) | ||
| 1178 | (progn (back-to-indentation) | ||
| 1179 | (looking-at (concat vera-beg-block-re "\\|" | ||
| 1180 | vera-end-block-re)))) | ||
| 1181 | ;; if at a block closing, go to beginning | ||
| 1182 | (when (looking-at vera-end-block-re) | ||
| 1183 | (vera-corresponding-begin)) | ||
| 1184 | ;; go to beginning of the statement | ||
| 1185 | (vera-beginning-of-statement) | ||
| 1186 | (setq placeholder (point))) | ||
| 1187 | ;; at a directive? | ||
| 1188 | (when (progn (back-to-indentation) (looking-at "#")) | ||
| 1189 | ;; go to previous statement | ||
| 1190 | (vera-beginning-of-statement) | ||
| 1191 | (setq placeholder (point))))) | ||
| 1192 | ;; at a block opening? | ||
| 1193 | (when (save-excursion (back-to-indentation) | ||
| 1194 | (looking-at vera-beg-block-re)) | ||
| 1195 | ;; go to beginning of the substatement | ||
| 1196 | (vera-beginning-of-substatement) | ||
| 1197 | (setq placeholder (point)))) | ||
| 1198 | (goto-char placeholder) | ||
| 1199 | (vera-add-syntax 'statement (vera-point 'boi))) | ||
| 1200 | ;; CASE 9: at the beginning of a substatement? | ||
| 1201 | ;; is this line preceeded by a substatement opening statement? | ||
| 1202 | ((save-excursion (vera-backward-syntactic-ws nil t) | ||
| 1203 | (when (= (preceding-char) ?\)) (backward-sexp)) | ||
| 1204 | (backward-word 1) | ||
| 1205 | (setq placeholder (point)) | ||
| 1206 | (looking-at vera-beg-substatement-re)) | ||
| 1207 | (goto-char placeholder) | ||
| 1208 | (vera-add-syntax 'substatement (vera-point 'boi))) | ||
| 1209 | ;; CASE 10: it must be a statement continuation! | ||
| 1210 | (t | ||
| 1211 | ;; go to beginning of statement | ||
| 1212 | (vera-beginning-of-substatement) | ||
| 1213 | (vera-add-syntax 'statement-cont (vera-point 'boi)))) | ||
| 1214 | ;; special case: look for a comment start | ||
| 1215 | (goto-char indent-point) | ||
| 1216 | (skip-chars-forward " \t") | ||
| 1217 | (when (looking-at comment-start) | ||
| 1218 | (vera-add-syntax 'comment-intro)) | ||
| 1219 | ;; return syntax | ||
| 1220 | syntax))) | ||
| 1221 | |||
| 1222 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1223 | ;; indentation functions | ||
| 1224 | |||
| 1225 | (defun vera-indent-line () | ||
| 1226 | "Indent the current line as Vera code. Optional SYNTAX is the | ||
| 1227 | syntactic information for the current line. Returns the amount of | ||
| 1228 | indentation change (in columns)." | ||
| 1229 | (interactive) | ||
| 1230 | (vera-prepare-search | ||
| 1231 | (let* ((syntax (vera-guess-basic-syntax)) | ||
| 1232 | (pos (- (point-max) (point))) | ||
| 1233 | (indent (apply '+ (mapcar 'vera-get-offset syntax))) | ||
| 1234 | (shift-amt (- (current-indentation) indent))) | ||
| 1235 | (when vera-echo-syntactic-information-p | ||
| 1236 | (message "syntax: %s, indent= %d" syntax indent)) | ||
| 1237 | (unless (zerop shift-amt) | ||
| 1238 | (beginning-of-line) | ||
| 1239 | (delete-region (point) (vera-point 'boi)) | ||
| 1240 | (indent-to indent)) | ||
| 1241 | (if (< (point) (vera-point 'boi)) | ||
| 1242 | (back-to-indentation) | ||
| 1243 | ;; If initial point was within line's indentation, position after | ||
| 1244 | ;; the indentation. Else stay at same point in text. | ||
| 1245 | (when (> (- (point-max) pos) (point)) | ||
| 1246 | (goto-char (- (point-max) pos)))) | ||
| 1247 | shift-amt))) | ||
| 1248 | |||
| 1249 | (defun vera-indent-buffer () | ||
| 1250 | "Indent whole buffer as Vera code. | ||
| 1251 | Calls `indent-region' for whole buffer." | ||
| 1252 | (interactive) | ||
| 1253 | (message "Indenting buffer...") | ||
| 1254 | (indent-region (point-min) (point-max) nil) | ||
| 1255 | (message "Indenting buffer...done")) | ||
| 1256 | |||
| 1257 | (defun vera-indent-region (start end column) | ||
| 1258 | "Indent region as Vera code." | ||
| 1259 | (interactive "r\nP") | ||
| 1260 | (message "Indenting region...") | ||
| 1261 | (indent-region start end column) | ||
| 1262 | (message "Indenting region...done")) | ||
| 1263 | |||
| 1264 | (defsubst vera-indent-block-closing () | ||
| 1265 | "If previous word is a block closing or `else', indent line again." | ||
| 1266 | (when (= (char-syntax (preceding-char)) ?w) | ||
| 1267 | (save-excursion | ||
| 1268 | (backward-word 1) | ||
| 1269 | (when (and (not (vera-in-literal)) | ||
| 1270 | (looking-at (concat vera-end-block-re "\\|\\<else\\>"))) | ||
| 1271 | (indent-according-to-mode))))) | ||
| 1272 | |||
| 1273 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1274 | ;; electrifications | ||
| 1275 | |||
| 1276 | (defun vera-electric-tab (&optional prefix-arg) | ||
| 1277 | "If preceeding character is part of a word or a paren then hippie-expand, | ||
| 1278 | else if right of non whitespace on line then tab-to-tab-stop, | ||
| 1279 | else if last command was a tab or return then dedent one step or if a comment | ||
| 1280 | toggle between normal indent and inline comment indent, | ||
| 1281 | else indent `correctly'. | ||
| 1282 | If `vera-intelligent-tab' is nil, always indent line." | ||
| 1283 | (interactive "*P") | ||
| 1284 | (if vera-intelligent-tab | ||
| 1285 | (progn | ||
| 1286 | (cond ((memq (char-syntax (preceding-char)) '(?w ?_)) | ||
| 1287 | (let ((case-fold-search t) | ||
| 1288 | (case-replace nil) | ||
| 1289 | (hippie-expand-only-buffers | ||
| 1290 | (or (and (boundp 'hippie-expand-only-buffers) | ||
| 1291 | hippie-expand-only-buffers) | ||
| 1292 | '(vera-mode)))) | ||
| 1293 | (vera-expand-abbrev prefix-arg))) | ||
| 1294 | ((> (current-column) (current-indentation)) | ||
| 1295 | (tab-to-tab-stop)) | ||
| 1296 | ((and (or (eq last-command 'vera-electric-tab) | ||
| 1297 | (eq last-command 'vera-electric-return)) | ||
| 1298 | (/= 0 (current-indentation))) | ||
| 1299 | (backward-delete-char-untabify vera-basic-offset nil)) | ||
| 1300 | (t (indent-according-to-mode))) | ||
| 1301 | (setq this-command 'vera-electric-tab)) | ||
| 1302 | (indent-according-to-mode))) | ||
| 1303 | |||
| 1304 | (defun vera-electric-return () | ||
| 1305 | "Insert newline and indent. Indent current line if it is a block closing." | ||
| 1306 | (interactive) | ||
| 1307 | (vera-indent-block-closing) | ||
| 1308 | (newline-and-indent)) | ||
| 1309 | |||
| 1310 | (defun vera-electric-space (arg) | ||
| 1311 | "Insert a space. Indent current line if it is a block closing." | ||
| 1312 | (interactive "*P") | ||
| 1313 | (unless arg | ||
| 1314 | (vera-indent-block-closing)) | ||
| 1315 | (self-insert-command (prefix-numeric-value arg))) | ||
| 1316 | |||
| 1317 | (defun vera-electric-opening-brace (arg) | ||
| 1318 | "Outdent opening brace." | ||
| 1319 | (interactive "*P") | ||
| 1320 | (self-insert-command (prefix-numeric-value arg)) | ||
| 1321 | (unless arg | ||
| 1322 | (indent-according-to-mode))) | ||
| 1323 | |||
| 1324 | (defun vera-electric-closing-brace (arg) | ||
| 1325 | "Outdent closing brace." | ||
| 1326 | (interactive "*P") | ||
| 1327 | (self-insert-command (prefix-numeric-value arg)) | ||
| 1328 | (unless arg | ||
| 1329 | (indent-according-to-mode))) | ||
| 1330 | |||
| 1331 | (defun vera-electric-pound (arg) | ||
| 1332 | "Insert `#' and indent as directive it first character of line." | ||
| 1333 | (interactive "*P") | ||
| 1334 | (self-insert-command (prefix-numeric-value arg)) | ||
| 1335 | (unless arg | ||
| 1336 | (save-excursion | ||
| 1337 | (backward-char) | ||
| 1338 | (skip-chars-backward " \t") | ||
| 1339 | (when (bolp) | ||
| 1340 | (delete-horizontal-space))))) | ||
| 1341 | |||
| 1342 | (defun vera-electric-star (arg) | ||
| 1343 | "Insert a star character. Nicked from `c-electric-star'." | ||
| 1344 | (interactive "*P") | ||
| 1345 | (self-insert-command (prefix-numeric-value arg)) | ||
| 1346 | (if (and (not arg) | ||
| 1347 | (memq (vera-in-literal) '(comment)) | ||
| 1348 | (eq (char-before) ?*) | ||
| 1349 | (save-excursion | ||
| 1350 | (forward-char -1) | ||
| 1351 | (skip-chars-backward "*") | ||
| 1352 | (if (eq (char-before) ?/) | ||
| 1353 | (forward-char -1)) | ||
| 1354 | (skip-chars-backward " \t") | ||
| 1355 | (bolp))) | ||
| 1356 | (indent-according-to-mode))) | ||
| 1357 | |||
| 1358 | (defun vera-electric-slash (arg) | ||
| 1359 | "Insert a slash character. Nicked from `c-electric-slash'." | ||
| 1360 | (interactive "*P") | ||
| 1361 | (let* ((ch (char-before)) | ||
| 1362 | (indentp (and (not arg) | ||
| 1363 | (eq last-command-char ?/) | ||
| 1364 | (or (and (eq ch ?/) | ||
| 1365 | (not (vera-in-literal))) | ||
| 1366 | (and (eq ch ?*) | ||
| 1367 | (vera-in-literal)))))) | ||
| 1368 | (self-insert-command (prefix-numeric-value arg)) | ||
| 1369 | (when indentp | ||
| 1370 | (indent-according-to-mode)))) | ||
| 1371 | |||
| 1372 | |||
| 1373 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1374 | ;;; Miscellaneous | ||
| 1375 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1376 | |||
| 1377 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1378 | ;; Hippie expand customization (for expansion of Vera commands) | ||
| 1379 | |||
| 1380 | (defvar vera-abbrev-list | ||
| 1381 | (append (list nil) vera-keywords | ||
| 1382 | (list nil) vera-types | ||
| 1383 | (list nil) vera-functions | ||
| 1384 | (list nil) vera-constants | ||
| 1385 | (list nil) vera-rvm-types | ||
| 1386 | (list nil) vera-rvm-functions | ||
| 1387 | (list nil) vera-rvm-constants) | ||
| 1388 | "Predefined abbreviations for Vera.") | ||
| 1389 | |||
| 1390 | (defvar vera-expand-upper-case nil) | ||
| 1391 | |||
| 1392 | (eval-when-compile (require 'hippie-exp)) | ||
| 1393 | |||
| 1394 | (defun vera-try-expand-abbrev (old) | ||
| 1395 | "Try expanding abbreviations from `vera-abbrev-list'." | ||
| 1396 | (unless old | ||
| 1397 | (he-init-string (he-dabbrev-beg) (point)) | ||
| 1398 | (setq he-expand-list | ||
| 1399 | (let ((abbrev-list vera-abbrev-list) | ||
| 1400 | (sel-abbrev-list '())) | ||
| 1401 | (while abbrev-list | ||
| 1402 | (when (or (not (stringp (car abbrev-list))) | ||
| 1403 | (string-match | ||
| 1404 | (concat "^" he-search-string) (car abbrev-list))) | ||
| 1405 | (setq sel-abbrev-list | ||
| 1406 | (cons (car abbrev-list) sel-abbrev-list))) | ||
| 1407 | (setq abbrev-list (cdr abbrev-list))) | ||
| 1408 | (nreverse sel-abbrev-list)))) | ||
| 1409 | (while (and he-expand-list | ||
| 1410 | (or (not (stringp (car he-expand-list))) | ||
| 1411 | (he-string-member (car he-expand-list) he-tried-table t))) | ||
| 1412 | (unless (stringp (car he-expand-list)) | ||
| 1413 | (setq vera-expand-upper-case (car he-expand-list))) | ||
| 1414 | (setq he-expand-list (cdr he-expand-list))) | ||
| 1415 | (if (null he-expand-list) | ||
| 1416 | (progn (when old (he-reset-string)) | ||
| 1417 | nil) | ||
| 1418 | (he-substitute-string | ||
| 1419 | (if vera-expand-upper-case | ||
| 1420 | (upcase (car he-expand-list)) | ||
| 1421 | (car he-expand-list)) | ||
| 1422 | t) | ||
| 1423 | (setq he-expand-list (cdr he-expand-list)) | ||
| 1424 | t)) | ||
| 1425 | |||
| 1426 | ;; function for expanding abbrevs and dabbrevs | ||
| 1427 | (defun vera-expand-abbrev (arg)) | ||
| 1428 | (fset 'vera-expand-abbrev (make-hippie-expand-function | ||
| 1429 | '(try-expand-dabbrev | ||
| 1430 | try-expand-dabbrev-all-buffers | ||
| 1431 | vera-try-expand-abbrev))) | ||
| 1432 | |||
| 1433 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1434 | ;; Comments | ||
| 1435 | |||
| 1436 | (defun vera-comment-uncomment-region (beg end &optional arg) | ||
| 1437 | "Comment region if not commented, uncomment region if already commented." | ||
| 1438 | (interactive "r\nP") | ||
| 1439 | (goto-char beg) | ||
| 1440 | (if (looking-at (regexp-quote comment-start)) | ||
| 1441 | (comment-region beg end '(4)) | ||
| 1442 | (comment-region beg end))) | ||
| 1443 | |||
| 1444 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1445 | ;; Help functions | ||
| 1446 | |||
| 1447 | (defun vera-customize () | ||
| 1448 | "Call the customize function with `vera' as argument." | ||
| 1449 | (interactive) | ||
| 1450 | (customize-group 'vera)) | ||
| 1451 | |||
| 1452 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1453 | ;; Other | ||
| 1454 | |||
| 1455 | ;; remove ".vr" from `completion-ignored-extensions' | ||
| 1456 | (setq completion-ignored-extensions | ||
| 1457 | (delete ".vr" completion-ignored-extensions)) | ||
| 1458 | |||
| 1459 | |||
| 1460 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1461 | ;;; Bug reports | ||
| 1462 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1463 | |||
| 1464 | (defconst vera-mode-help-address "Reto Zimmermann <reto@gnu.org>" | ||
| 1465 | "Address for Vera Mode bug reports.") | ||
| 1466 | |||
| 1467 | ;; get reporter-submit-bug-report when byte-compiling | ||
| 1468 | (eval-when-compile | ||
| 1469 | (require 'reporter)) | ||
| 1470 | |||
| 1471 | (defun vera-submit-bug-report () | ||
| 1472 | "Submit via mail a bug report on Vera Mode." | ||
| 1473 | (interactive) | ||
| 1474 | ;; load in reporter | ||
| 1475 | (and | ||
| 1476 | (y-or-n-p "Do you want to submit a report on Vera Mode? ") | ||
| 1477 | (require 'reporter) | ||
| 1478 | (let ((reporter-prompt-for-summary-p t)) | ||
| 1479 | (reporter-submit-bug-report | ||
| 1480 | vera-mode-help-address | ||
| 1481 | (concat "Vera Mode " vera-version) | ||
| 1482 | (list | ||
| 1483 | ;; report all important variables | ||
| 1484 | 'vera-basic-offset | ||
| 1485 | 'vera-underscore-is-part-of-word | ||
| 1486 | 'vera-intelligent-tab | ||
| 1487 | ) | ||
| 1488 | nil nil | ||
| 1489 | "Hi Reto,")))) | ||
| 1490 | |||
| 1491 | |||
| 1492 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1493 | ;;; Documentation | ||
| 1494 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1495 | |||
| 1496 | (defun vera-version () | ||
| 1497 | "Echo the current version of Vera Mode in the minibuffer." | ||
| 1498 | (interactive) | ||
| 1499 | (message "Vera Mode %s (%s)" vera-version vera-time-stamp)) | ||
| 1500 | |||
| 1501 | |||
| 1502 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1503 | |||
| 1504 | (provide 'vera-mode) | ||
| 1505 | |||
| 1506 | ;;; vera-mode.el ends here | ||