Replace Lisp calls to delete-backward-char by delete-char.
[bpt/emacs.git] / lisp / progmodes / vhdl-mode.el
index 72fda80..4ff9cf9 100644 (file)
@@ -1,7 +1,8 @@
 ;;; vhdl-mode.el --- major mode for editing VHDL code
 
 ;; Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-;;   2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+;;   2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+;;   Free Software Foundation, Inc.
 
 ;; Authors:     Reto Zimmermann <reto@gnu.org>
 ;;              Rodney J. Whitby <software.vhdl-mode@rwhitby.net>
@@ -9,6 +10,11 @@
 ;; Keywords:    languages vhdl
 ;; WWW:         http://www.iis.ee.ethz.ch/~zimmi/emacs/vhdl-mode.html
 
+;; Yoni Rabkin <yoni@rabkins.net> contacted the maintainer of this
+;; file on 18/3/2008, and the maintainer agreed that when a bug is
+;; filed in the Emacs bug reporting system against this file, a copy
+;; of the bug report be sent to the maintainer's email address.
+
 (defconst vhdl-version "3.33.6"
   "VHDL Mode version number.")
 
 
 ;; This file is part of GNU Emacs.
 
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; 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, or (at your option)
-;; any later version.
+;; 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
@@ -28,9 +34,7 @@
 ;; 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., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Commentary:
@@ -195,21 +199,6 @@ Examples:
   "Customizations for modes."
   :group 'vhdl)
 
-(defcustom vhdl-electric-mode t
-  "*Non-nil enables electrification (automatic template generation).
-If nil, template generators can still be invoked through key bindings and
-menu.  Is indicated in the modeline by \"/e\" after the mode name and can be
-toggled by `\\[vhdl-electric-mode]'."
-  :type 'boolean
-  :group 'vhdl-mode)
-
-(defcustom vhdl-stutter-mode t
-  "*Non-nil enables stuttering.
-Is indicated in the modeline by \"/s\" after the mode name and can be toggled
-by `\\[vhdl-stutter-mode]'."
-  :type 'boolean
-  :group 'vhdl-mode)
-
 (defcustom vhdl-indent-tabs-mode nil
   "*Non-nil means indentation can insert tabs.
 Overrides local variable `indent-tabs-mode'."
@@ -929,7 +918,7 @@ if the header needs to be version controlled.
 The following keywords for template generation are supported:
   <filename>    : replaced by the name of the buffer
   <author>      : replaced by the user name and email address
-                  \(`user-full-name',`mail-host-address', `user-mail-address')
+                  \(`user-full-name', `mail-host-address', `user-mail-address')
   <login>       : replaced by user login name (`user-login-name')
   <company>     : replaced by contents of option `vhdl-company-name'
   <date>        : replaced by the current date
@@ -2324,42 +2313,19 @@ current buffer if no project is defined."
   "Enable case insensitive search and switch to syntax table that includes '_',
 then execute BODY, and finally restore the old environment.  Used for
 consistent searching."
-  `(let ((case-fold-search t)          ; case insensitive search
-        (current-syntax-table (syntax-table))
-        result
-        (restore-prog                  ; program to restore enviroment
-         '(progn
-            ;; restore syntax table
-            (set-syntax-table current-syntax-table))))
+  `(let ((case-fold-search t))         ; case insensitive search
      ;; use extended syntax table
-     (set-syntax-table vhdl-mode-ext-syntax-table)
-     ;; execute BODY safely
-     (setq result
-          (condition-case info
-              (progn ,@body)
-            (error (eval restore-prog) ; restore environment on error
-                   (error (cadr info))))) ; pass error up
-     ;; restore environment
-     (eval restore-prog)
-     result))
+     (with-syntax-table vhdl-mode-ext-syntax-table
+       ,@body)))
 
 (defmacro vhdl-prepare-search-2 (&rest body)
   "Enable case insensitive search, switch to syntax table that includes '_',
 and remove `intangible' overlays, then execute BODY, and finally restore the
 old environment.  Used for consistent searching."
+  ;; FIXME: Why not just let-bind `inhibit-point-motion-hooks'?  --Stef
   `(let ((case-fold-search t)          ; case insensitive search
         (current-syntax-table (syntax-table))
-        result overlay-all-list overlay-intangible-list overlay
-        (restore-prog                  ; program to restore enviroment
-         '(progn
-            ;; restore syntax table
-            (set-syntax-table current-syntax-table)
-            ;; restore `intangible' overlays
-            (when (fboundp 'overlay-lists)
-              (while overlay-intangible-list
-                (overlay-put (car overlay-intangible-list) 'intangible t)
-                (setq overlay-intangible-list
-                      (cdr overlay-intangible-list)))))))
+        overlay-all-list overlay-intangible-list overlay)
      ;; use extended syntax table
      (set-syntax-table vhdl-mode-ext-syntax-table)
      ;; remove `intangible' overlays
@@ -2375,14 +2341,16 @@ old environment.  Used for consistent searching."
           (overlay-put overlay 'intangible nil))
         (setq overlay-all-list (cdr overlay-all-list))))
      ;; execute BODY safely
-     (setq result
-          (condition-case info
-              (progn ,@body)
-            (error (eval restore-prog) ; restore environment on error
-                   (error (cadr info))))) ; pass error up
-     ;; restore environment
-     (eval restore-prog)
-     result))
+     (unwind-protect
+         (progn ,@body)
+       ;; restore syntax table
+       (set-syntax-table current-syntax-table)
+       ;; restore `intangible' overlays
+       (when (fboundp 'overlay-lists)
+         (while overlay-intangible-list
+           (overlay-put (car overlay-intangible-list) 'intangible t)
+           (setq overlay-intangible-list
+                 (cdr overlay-intangible-list)))))))
 
 (defmacro vhdl-visit-file (file-name issue-error &rest body)
   "Visit file FILE-NAME and execute BODY."
@@ -2723,12 +2691,12 @@ STRING are replaced by `-' and substrings are converted to lower case."
   (define-key vhdl-mode-map "\C-c\C-s\C-b" 'vhdl-subprog-paste-body)
   (define-key vhdl-mode-map "\C-c\C-s\C-c" 'vhdl-subprog-paste-call)
   (define-key vhdl-mode-map "\C-c\C-s\C-f" 'vhdl-subprog-flatten)
-  (define-key vhdl-mode-map "\C-c\C-c\C-n" 'vhdl-compose-new-component)
-  (define-key vhdl-mode-map "\C-c\C-c\C-p" 'vhdl-compose-place-component)
-  (define-key vhdl-mode-map "\C-c\C-c\C-w" 'vhdl-compose-wire-components)
-  (define-key vhdl-mode-map "\C-c\C-c\C-f" 'vhdl-compose-configuration)
-  (define-key vhdl-mode-map "\C-c\C-c\C-k" 'vhdl-compose-components-package)
-  (define-key vhdl-mode-map "\C-cc"       'vhdl-comment-uncomment-region)
+  (define-key vhdl-mode-map "\C-c\C-m\C-n" 'vhdl-compose-new-component)
+  (define-key vhdl-mode-map "\C-c\C-m\C-p" 'vhdl-compose-place-component)
+  (define-key vhdl-mode-map "\C-c\C-m\C-w" 'vhdl-compose-wire-components)
+  (define-key vhdl-mode-map "\C-c\C-m\C-f" 'vhdl-compose-configuration)
+  (define-key vhdl-mode-map "\C-c\C-m\C-k" 'vhdl-compose-components-package)
+  (define-key vhdl-mode-map "\C-c\C-c"    'vhdl-comment-uncomment-region)
   (define-key vhdl-mode-map "\C-c-"       'vhdl-comment-append-inline)
   (define-key vhdl-mode-map "\C-c\M--"    'vhdl-comment-display-line)
   (define-key vhdl-mode-map "\C-c\C-i\C-l" 'indent-according-to-mode)
@@ -2767,8 +2735,8 @@ STRING are replaced by `-' and substrings are converted to lower case."
   (define-key vhdl-mode-map "\C-c\C-b"    'vhdl-beautify-buffer)
   (define-key vhdl-mode-map "\C-c\C-u\C-s" 'vhdl-update-sensitivity-list-process)
   (define-key vhdl-mode-map "\C-c\C-u\M-s" 'vhdl-update-sensitivity-list-buffer)
-  (define-key vhdl-mode-map "\C-cf"       'vhdl-fontify-buffer)
-  (define-key vhdl-mode-map "\C-cs"       'vhdl-statistics-buffer)
+  (define-key vhdl-mode-map "\C-c\C-i\C-f" 'vhdl-fontify-buffer)
+  (define-key vhdl-mode-map "\C-c\C-i\C-s" 'vhdl-statistics-buffer)
   (define-key vhdl-mode-map "\C-c\M-m"    'vhdl-show-messages)
   (define-key vhdl-mode-map "\C-c\C-h"    'vhdl-doc-mode)
   (define-key vhdl-mode-map "\C-c\C-v"    'vhdl-version)
@@ -2894,149 +2862,148 @@ STRING are replaced by `-' and substrings are converted to lower case."
     (append
      (when (memq 'vhdl vhdl-electric-keywords)
        ;; VHDL'93 keywords
-       '(
-        ("--"            "" vhdl-template-display-comment-hook 0)
-        ("abs"           "" vhdl-template-default-hook 0)
-        ("access"        "" vhdl-template-default-hook 0)
-        ("after"         "" vhdl-template-default-hook 0)
-        ("alias"         "" vhdl-template-alias-hook 0)
-        ("all"           "" vhdl-template-default-hook 0)
-        ("and"           "" vhdl-template-default-hook 0)
-        ("arch"          "" vhdl-template-architecture-hook 0)
-        ("architecture"  "" vhdl-template-architecture-hook 0)
-        ("array"         "" vhdl-template-default-hook 0)
-        ("assert"        "" vhdl-template-assert-hook 0)
-        ("attr"          "" vhdl-template-attribute-hook 0)
-        ("attribute"     "" vhdl-template-attribute-hook 0)
-        ("begin"         "" vhdl-template-default-indent-hook 0)
-        ("block"         "" vhdl-template-block-hook 0)
-        ("body"          "" vhdl-template-default-hook 0)
-        ("buffer"        "" vhdl-template-default-hook 0)
-        ("bus"           "" vhdl-template-default-hook 0)
-        ("case"          "" vhdl-template-case-hook 0)
-        ("comp"          "" vhdl-template-component-hook 0)
-        ("component"     "" vhdl-template-component-hook 0)
-        ("cond"          "" vhdl-template-conditional-signal-asst-hook 0)
-        ("conditional"   "" vhdl-template-conditional-signal-asst-hook 0)
-        ("conf"          "" vhdl-template-configuration-hook 0)
-        ("configuration" "" vhdl-template-configuration-hook 0)
-        ("cons"          "" vhdl-template-constant-hook 0)
-        ("constant"      "" vhdl-template-constant-hook 0)
-        ("disconnect"    "" vhdl-template-disconnect-hook 0)
-        ("downto"        "" vhdl-template-default-hook 0)
-        ("else"          "" vhdl-template-else-hook 0)
-        ("elseif"        "" vhdl-template-elsif-hook 0)
-        ("elsif"         "" vhdl-template-elsif-hook 0)
-        ("end"           "" vhdl-template-default-indent-hook 0)
-        ("entity"        "" vhdl-template-entity-hook 0)
-        ("exit"          "" vhdl-template-exit-hook 0)
-        ("file"          "" vhdl-template-file-hook 0)
-        ("for"           "" vhdl-template-for-hook 0)
-        ("func"          "" vhdl-template-function-hook 0)
-        ("function"      "" vhdl-template-function-hook 0)
-        ("generic"       "" vhdl-template-generic-hook 0)
-        ("group"         "" vhdl-template-group-hook 0)
-        ("guarded"       "" vhdl-template-default-hook 0)
-        ("if"            "" vhdl-template-if-hook 0)
-        ("impure"        "" vhdl-template-default-hook 0)
-        ("in"            "" vhdl-template-default-hook 0)
-        ("inertial"      "" vhdl-template-default-hook 0)
-        ("inout"         "" vhdl-template-default-hook 0)
-        ("inst"          "" vhdl-template-instance-hook 0)
-        ("instance"      "" vhdl-template-instance-hook 0)
-        ("is"            "" vhdl-template-default-hook 0)
-        ("label"         "" vhdl-template-default-hook 0)
-        ("library"       "" vhdl-template-library-hook 0)
-        ("linkage"       "" vhdl-template-default-hook 0)
-        ("literal"       "" vhdl-template-default-hook 0)
-        ("loop"          "" vhdl-template-bare-loop-hook 0)
-        ("map"           "" vhdl-template-map-hook 0)
-        ("mod"           "" vhdl-template-default-hook 0)
-        ("nand"          "" vhdl-template-default-hook 0)
-        ("new"           "" vhdl-template-default-hook 0)
-        ("next"          "" vhdl-template-next-hook 0)
-        ("nor"           "" vhdl-template-default-hook 0)
-        ("not"           "" vhdl-template-default-hook 0)
-        ("null"          "" vhdl-template-default-hook 0)
-        ("of"            "" vhdl-template-default-hook 0)
-        ("on"            "" vhdl-template-default-hook 0)
-        ("open"          "" vhdl-template-default-hook 0)
-        ("or"            "" vhdl-template-default-hook 0)
-        ("others"        "" vhdl-template-others-hook 0)
-        ("out"           "" vhdl-template-default-hook 0)
-        ("pack"          "" vhdl-template-package-hook 0)
-        ("package"       "" vhdl-template-package-hook 0)
-        ("port"          "" vhdl-template-port-hook 0)
-        ("postponed"     "" vhdl-template-default-hook 0)
-        ("procedure"     "" vhdl-template-procedure-hook 0)
-        ("process"       "" vhdl-template-process-hook 0)
-        ("pure"          "" vhdl-template-default-hook 0)
-        ("range"         "" vhdl-template-default-hook 0)
-        ("record"        "" vhdl-template-default-hook 0)
-        ("register"      "" vhdl-template-default-hook 0)
-        ("reject"        "" vhdl-template-default-hook 0)
-        ("rem"           "" vhdl-template-default-hook 0)
-        ("report"        "" vhdl-template-report-hook 0)
-        ("return"        "" vhdl-template-return-hook 0)
-        ("rol"           "" vhdl-template-default-hook 0)
-        ("ror"           "" vhdl-template-default-hook 0)
-        ("select"        "" vhdl-template-selected-signal-asst-hook 0)
-        ("severity"      "" vhdl-template-default-hook 0)
-        ("shared"        "" vhdl-template-default-hook 0)
-        ("sig"           "" vhdl-template-signal-hook 0)
-        ("signal"        "" vhdl-template-signal-hook 0)
-        ("sla"           "" vhdl-template-default-hook 0)
-        ("sll"           "" vhdl-template-default-hook 0)
-        ("sra"           "" vhdl-template-default-hook 0)
-        ("srl"           "" vhdl-template-default-hook 0)
-        ("subtype"       "" vhdl-template-subtype-hook 0)
-        ("then"          "" vhdl-template-default-hook 0)
-        ("to"            "" vhdl-template-default-hook 0)
-        ("transport"     "" vhdl-template-default-hook 0)
-        ("type"          "" vhdl-template-type-hook 0)
-        ("unaffected"    "" vhdl-template-default-hook 0)
-        ("units"         "" vhdl-template-default-hook 0)
-        ("until"         "" vhdl-template-default-hook 0)
-        ("use"           "" vhdl-template-use-hook 0)
-        ("var"           "" vhdl-template-variable-hook 0)
-        ("variable"      "" vhdl-template-variable-hook 0)
-        ("wait"          "" vhdl-template-wait-hook 0)
-        ("when"          "" vhdl-template-when-hook 0)
-        ("while"         "" vhdl-template-while-loop-hook 0)
-        ("with"          "" vhdl-template-with-hook 0)
-        ("xnor"          "" vhdl-template-default-hook 0)
-        ("xor"           "" vhdl-template-default-hook 0)
-        ))
+       (mapcar (lambda (x) (list (car x) "" (cdr x) 0 'system))
+               '(
+                 ("--"           . vhdl-template-display-comment-hook)
+                 ("abs"                  . vhdl-template-default-hook)
+                 ("access"       . vhdl-template-default-hook)
+                 ("after"        . vhdl-template-default-hook)
+                 ("alias"        . vhdl-template-alias-hook)
+                 ("all"                  . vhdl-template-default-hook)
+                 ("and"                  . vhdl-template-default-hook)
+                 ("arch"         . vhdl-template-architecture-hook)
+                 ("architecture"  . vhdl-template-architecture-hook)
+                 ("array"        . vhdl-template-default-hook)
+                 ("assert"       . vhdl-template-assert-hook)
+                 ("attr"         . vhdl-template-attribute-hook)
+                 ("attribute"    . vhdl-template-attribute-hook)
+                 ("begin"        . vhdl-template-default-indent-hook)
+                 ("block"        . vhdl-template-block-hook)
+                 ("body"         . vhdl-template-default-hook)
+                 ("buffer"       . vhdl-template-default-hook)
+                 ("bus"                  . vhdl-template-default-hook)
+                 ("case"         . vhdl-template-case-hook)
+                 ("comp"         . vhdl-template-component-hook)
+                 ("component"    . vhdl-template-component-hook)
+                 ("cond"         . vhdl-template-conditional-signal-asst-hook)
+                 ("conditional"          . vhdl-template-conditional-signal-asst-hook)
+                 ("conf"         . vhdl-template-configuration-hook)
+                 ("configuration" . vhdl-template-configuration-hook)
+                 ("cons"         . vhdl-template-constant-hook)
+                 ("constant"     . vhdl-template-constant-hook)
+                 ("disconnect"   . vhdl-template-disconnect-hook)
+                 ("downto"       . vhdl-template-default-hook)
+                 ("else"         . vhdl-template-else-hook)
+                 ("elseif"       . vhdl-template-elsif-hook)
+                 ("elsif"        . vhdl-template-elsif-hook)
+                 ("end"                  . vhdl-template-default-indent-hook)
+                 ("entity"       . vhdl-template-entity-hook)
+                 ("exit"         . vhdl-template-exit-hook)
+                 ("file"         . vhdl-template-file-hook)
+                 ("for"                  . vhdl-template-for-hook)
+                 ("func"         . vhdl-template-function-hook)
+                 ("function"     . vhdl-template-function-hook)
+                 ("generic"      . vhdl-template-generic-hook)
+                 ("group"        . vhdl-template-group-hook)
+                 ("guarded"      . vhdl-template-default-hook)
+                 ("if"           . vhdl-template-if-hook)
+                 ("impure"       . vhdl-template-default-hook)
+                 ("in"           . vhdl-template-default-hook)
+                 ("inertial"     . vhdl-template-default-hook)
+                 ("inout"        . vhdl-template-default-hook)
+                 ("inst"         . vhdl-template-instance-hook)
+                 ("instance"     . vhdl-template-instance-hook)
+                 ("is"           . vhdl-template-default-hook)
+                 ("label"        . vhdl-template-default-hook)
+                 ("library"      . vhdl-template-library-hook)
+                 ("linkage"      . vhdl-template-default-hook)
+                 ("literal"      . vhdl-template-default-hook)
+                 ("loop"         . vhdl-template-bare-loop-hook)
+                 ("map"                  . vhdl-template-map-hook)
+                 ("mod"                  . vhdl-template-default-hook)
+                 ("nand"         . vhdl-template-default-hook)
+                 ("new"                  . vhdl-template-default-hook)
+                 ("next"         . vhdl-template-next-hook)
+                 ("nor"                  . vhdl-template-default-hook)
+                 ("not"                  . vhdl-template-default-hook)
+                 ("null"         . vhdl-template-default-hook)
+                 ("of"           . vhdl-template-default-hook)
+                 ("on"           . vhdl-template-default-hook)
+                 ("open"         . vhdl-template-default-hook)
+                 ("or"           . vhdl-template-default-hook)
+                 ("others"       . vhdl-template-others-hook)
+                 ("out"                  . vhdl-template-default-hook)
+                 ("pack"         . vhdl-template-package-hook)
+                 ("package"      . vhdl-template-package-hook)
+                 ("port"         . vhdl-template-port-hook)
+                 ("postponed"    . vhdl-template-default-hook)
+                 ("procedure"    . vhdl-template-procedure-hook)
+                 ("process"      . vhdl-template-process-hook)
+                 ("pure"         . vhdl-template-default-hook)
+                 ("range"        . vhdl-template-default-hook)
+                 ("record"       . vhdl-template-default-hook)
+                 ("register"     . vhdl-template-default-hook)
+                 ("reject"       . vhdl-template-default-hook)
+                 ("rem"                  . vhdl-template-default-hook)
+                 ("report"       . vhdl-template-report-hook)
+                 ("return"       . vhdl-template-return-hook)
+                 ("rol"                  . vhdl-template-default-hook)
+                 ("ror"                  . vhdl-template-default-hook)
+                 ("select"       . vhdl-template-selected-signal-asst-hook)
+                 ("severity"     . vhdl-template-default-hook)
+                 ("shared"       . vhdl-template-default-hook)
+                 ("sig"                  . vhdl-template-signal-hook)
+                 ("signal"       . vhdl-template-signal-hook)
+                 ("sla"                  . vhdl-template-default-hook)
+                 ("sll"                  . vhdl-template-default-hook)
+                 ("sra"                  . vhdl-template-default-hook)
+                 ("srl"                  . vhdl-template-default-hook)
+                 ("subtype"      . vhdl-template-subtype-hook)
+                 ("then"         . vhdl-template-default-hook)
+                 ("to"           . vhdl-template-default-hook)
+                 ("transport"    . vhdl-template-default-hook)
+                 ("type"         . vhdl-template-type-hook)
+                 ("unaffected"   . vhdl-template-default-hook)
+                 ("units"        . vhdl-template-default-hook)
+                 ("until"        . vhdl-template-default-hook)
+                 ("use"                  . vhdl-template-use-hook)
+                 ("var"                  . vhdl-template-variable-hook)
+                 ("variable"     . vhdl-template-variable-hook)
+                 ("wait"         . vhdl-template-wait-hook)
+                 ("when"         . vhdl-template-when-hook)
+                 ("while"        . vhdl-template-while-loop-hook)
+                 ("with"         . vhdl-template-with-hook)
+                 ("xnor"         . vhdl-template-default-hook)
+                 ("xor"                  . vhdl-template-default-hook)
+                 )))
      ;; VHDL-AMS keywords
      (when (and (memq 'vhdl vhdl-electric-keywords) (vhdl-standard-p 'ams))
-       '(
-        ("across"     "" vhdl-template-default-hook 0)
-        ("break"      "" vhdl-template-break-hook 0)
-        ("limit"      "" vhdl-template-limit-hook 0)
-        ("nature"     "" vhdl-template-nature-hook 0)
-        ("noise"      "" vhdl-template-default-hook 0)
-        ("procedural" "" vhdl-template-procedural-hook 0)
-        ("quantity"   "" vhdl-template-quantity-hook 0)
-        ("reference"  "" vhdl-template-default-hook 0)
-        ("spectrum"   "" vhdl-template-default-hook 0)
-        ("subnature"  "" vhdl-template-subnature-hook 0)
-        ("terminal"   "" vhdl-template-terminal-hook 0)
-        ("through"    "" vhdl-template-default-hook 0)
-        ("tolerance"  "" vhdl-template-default-hook 0)
-        ))
+       (mapcar (lambda (x) (list (car x) "" (cdr x) 0 'system))
+               '(
+                 ("across"     . vhdl-template-default-hook)
+                 ("break"      . vhdl-template-break-hook)
+                 ("limit"      . vhdl-template-limit-hook)
+                 ("nature"     . vhdl-template-nature-hook)
+                 ("noise"      . vhdl-template-default-hook)
+                 ("procedural" . vhdl-template-procedural-hook)
+                 ("quantity"   . vhdl-template-quantity-hook)
+                 ("reference"  . vhdl-template-default-hook)
+                 ("spectrum"   . vhdl-template-default-hook)
+                 ("subnature"  . vhdl-template-subnature-hook)
+                 ("terminal"   . vhdl-template-terminal-hook)
+                 ("through"    . vhdl-template-default-hook)
+                 ("tolerance"  . vhdl-template-default-hook)
+                 )))
      ;; user model keywords
      (when (memq 'user vhdl-electric-keywords)
-       (let ((alist vhdl-model-alist)
-            abbrev-list keyword)
-        (while alist
-          (setq keyword (nth 3 (car alist)))
+       (let (abbrev-list keyword)
+         (dolist (elem vhdl-model-alist)
+          (setq keyword (nth 3 elem))
           (unless (equal keyword "")
-            (setq abbrev-list
-                  (cons (list keyword ""
-                              (vhdl-function-name
-                               "vhdl-model" (nth 0 (car alist)) "hook") 0)
-                        abbrev-list)))
-          (setq alist (cdr alist)))
+             (push (list keyword ""
+                         (vhdl-function-name
+                          "vhdl-model" (nth 0 elem) "hook") 0 'system)
+                   abbrev-list)))
         abbrev-list)))))
 
 ;; initialize abbrev table for VHDL Mode
@@ -3484,13 +3451,11 @@ STRING are replaced by `-' and substrings are converted to lower case."
      ("Mode"
       ["Electric Mode"
        (progn (customize-set-variable 'vhdl-electric-mode
-                                     (not vhdl-electric-mode))
-             (vhdl-mode-line-update))
+                                     (not vhdl-electric-mode)))
        :style toggle :selected vhdl-electric-mode :keys "C-c C-m C-e"]
       ["Stutter Mode"
        (progn (customize-set-variable 'vhdl-stutter-mode
-                                     (not vhdl-stutter-mode))
-             (vhdl-mode-line-update))
+                                     (not vhdl-stutter-mode)))
        :style toggle :selected vhdl-stutter-mode :keys "C-c C-m C-s"]
       ["Indent Tabs Mode"
        (progn (customize-set-variable 'vhdl-indent-tabs-mode
@@ -4666,7 +4631,7 @@ releases.  You are kindly invited to participate in beta testing.  Subscribe
 to above mailing lists by sending an email to <reto@gnu.org>.
 
 VHDL Mode is officially distributed at
-http://opensource.ethz.ch/emacs/vhdl-mode.html
+URL `http://opensource.ethz.ch/emacs/vhdl-mode.html'
 where the latest version can be found.
 
 
@@ -4688,7 +4653,10 @@ Key bindings:
   (interactive)
   (kill-all-local-variables)
   (setq major-mode 'vhdl-mode)
-  (setq mode-name "VHDL")
+  (setq mode-name '("VHDL"
+                    (vhdl-electric-mode "/" (vhdl-stutter-mode "/"))
+                    (vhdl-electric-mode "e")
+                    (vhdl-stutter-mode "s")))
 
   ;; set maps and tables
   (use-local-map vhdl-mode-map)
@@ -4755,7 +4723,6 @@ Key bindings:
   ;; miscellaneous
   (vhdl-ps-print-init)
   (vhdl-write-file-hooks-init)
-  (vhdl-mode-line-update)
   (message "VHDL Mode %s.%s" vhdl-version
           (if noninteractive "" "  See menu for documentation and release notes."))
 
@@ -4775,8 +4742,7 @@ Key bindings:
   (vhdl-write-file-hooks-init)
   (vhdl-update-mode-menu)
   (vhdl-hideshow-init)
-  (run-hooks 'menu-bar-update-hook)
-  (vhdl-mode-line-update))
+  (run-hooks 'menu-bar-update-hook))
 
 (defun vhdl-write-file-hooks-init ()
   "Add/remove hooks when buffer is saved."
@@ -7000,6 +6966,9 @@ else indent `correctly'."
   (interactive "*P")
   (vhdl-prepare-search-2
    (cond
+    ;; indent region if region is active
+    ((and (not (featurep 'xemacs)) (use-region-p))
+     (vhdl-indent-region (region-beginning) (region-end) nil))
     ;; expand word
     ((= (char-syntax (preceding-char)) ?w)
      (let ((case-fold-search (not vhdl-word-completion-case-sensitive))
@@ -8025,7 +7994,7 @@ buffer."
                       (condition-case () (forward-sexp)
                         (error (goto-char (point-max))))
                       (< (point) end))
-          (delete-backward-char 1))
+          (delete-char -1))
         ;; add closing parenthesis
         (when (> (point) end)
           (goto-char end)
@@ -8070,31 +8039,15 @@ project is defined."
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;  Enabling/disabling
 
-(defun vhdl-mode-line-update ()
-  "Update the modeline string for VHDL major mode."
-  (setq mode-name (concat "VHDL"
-                         (and (or vhdl-electric-mode vhdl-stutter-mode) "/")
-                         (and vhdl-electric-mode "e")
-                         (and vhdl-stutter-mode "s")))
-  (force-mode-line-update t))
-
-(defun vhdl-electric-mode (arg)
+(define-minor-mode vhdl-electric-mode
   "Toggle VHDL electric mode.
 Turn on if ARG positive, turn off if ARG negative, toggle if ARG zero or nil."
-  (interactive "P")
-  (setq vhdl-electric-mode
-       (cond ((or (not arg) (zerop arg)) (not vhdl-electric-mode))
-             ((> arg 0) t) (t nil)))
-  (vhdl-mode-line-update))
+  :global t)
 
-(defun vhdl-stutter-mode (arg)
+(define-minor-mode vhdl-stutter-mode
   "Toggle VHDL stuttering mode.
 Turn on if ARG positive, turn off if ARG negative, toggle if ARG zero or nil."
-  (interactive "P")
-  (setq vhdl-stutter-mode
-       (cond ((or (not arg) (zerop arg)) (not vhdl-stutter-mode))
-             ((> arg 0) t) (t nil)))
-  (vhdl-mode-line-update))
+  :global t)
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Stuttering
@@ -8151,15 +8104,15 @@ Turn on if ARG positive, turn off if ARG negative, toggle if ARG zero or nil."
 (defun vhdl-electric-quote (count) "'' --> \""
   (interactive "p")
   (if (and vhdl-stutter-mode (= count 1) (not (vhdl-in-literal)))
-      (if (= (preceding-char) last-input-char)
-         (progn (delete-backward-char 1) (insert-char ?\" 1))
+      (if (= (preceding-char) last-input-event)
+         (progn (delete-char -1) (insert-char ?\" 1))
        (insert-char ?\' 1))
     (self-insert-command count)))
 
 (defun vhdl-electric-semicolon (count) "';;' --> ' : ', ': ;' --> ' := '"
   (interactive "p")
   (if (and vhdl-stutter-mode (= count 1) (not (vhdl-in-literal)))
-      (cond ((= (preceding-char) last-input-char)
+      (cond ((= (preceding-char) last-input-event)
             (progn (delete-char -1)
                    (unless (eq (preceding-char) ? ) (insert " "))
                    (insert ": ")
@@ -8173,7 +8126,7 @@ Turn on if ARG positive, turn off if ARG negative, toggle if ARG zero or nil."
 (defun vhdl-electric-comma (count) "',,' --> ' <= '"
   (interactive "p")
   (if (and vhdl-stutter-mode (= count 1) (not (vhdl-in-literal)))
-      (cond ((= (preceding-char) last-input-char)
+      (cond ((= (preceding-char) last-input-event)
             (progn (delete-char -1)
                    (unless (eq (preceding-char) ? ) (insert " "))
                    (insert "<= ")))
@@ -8183,7 +8136,7 @@ Turn on if ARG positive, turn off if ARG negative, toggle if ARG zero or nil."
 (defun vhdl-electric-period (count) "'..' --> ' => '"
   (interactive "p")
   (if (and vhdl-stutter-mode (= count 1) (not (vhdl-in-literal)))
-      (cond ((= (preceding-char) last-input-char)
+      (cond ((= (preceding-char) last-input-event)
             (progn (delete-char -1)
                    (unless (eq (preceding-char) ? ) (insert " "))
                    (insert "=> ")))
@@ -8193,7 +8146,7 @@ Turn on if ARG positive, turn off if ARG negative, toggle if ARG zero or nil."
 (defun vhdl-electric-equal (count) "'==' --> ' == '"
   (interactive "p")
   (if (and vhdl-stutter-mode (= count 1) (not (vhdl-in-literal)))
-      (cond ((= (preceding-char) last-input-char)
+      (cond ((= (preceding-char) last-input-event)
             (progn (delete-char -1)
                    (unless (eq (preceding-char) ? ) (insert " "))
                    (insert "== ")))
@@ -8219,7 +8172,7 @@ Turn on if ARG positive, turn off if ARG negative, toggle if ARG zero or nil."
       (unless (vhdl-template-field
               (concat "[type" (and (vhdl-standard-p 'ams) " or nature") "]")
               nil t)
-       (delete-backward-char 3))
+       (delete-char -3))
       (vhdl-insert-keyword " IS ")
       (vhdl-template-field "name" ";")
       (vhdl-comment-insert-inline))))
@@ -8583,7 +8536,7 @@ a configuration declaration if not within a design unit."
               (vhdl-template-field "library name" "." nil nil nil nil
                                    (vhdl-work-library))
               (vhdl-template-field "configuration name" ";"))
-             (t (delete-backward-char 1) (insert ";") t))))))
+             (t (delete-char -1) (insert ";") t))))))
 
 
 (defun vhdl-template-configuration-decl ()
@@ -8750,7 +8703,7 @@ a configuration declaration if not within a design unit."
        (vhdl-insert-keyword " OPEN ")
        (unless (vhdl-template-field "[READ_MODE | WRITE_MODE | APPEND_MODE]"
                                     nil t)
-         (delete-backward-char 6)))
+         (delete-char -6)))
       (vhdl-insert-keyword " IS ")
       (when (vhdl-standard-p '87)
        (vhdl-template-field "[IN | OUT]" " " t))
@@ -9078,7 +9031,7 @@ otherwise."
              (insert "\n")
              (indent-to margin))
            (delete-region end-pos (point))
-           (delete-backward-char 1)
+           (delete-char -1)
            (insert ")")
            (when vhdl-auto-align (vhdl-align-region-groups start (point) 1))
            t)
@@ -9452,7 +9405,7 @@ otherwise."
     (vhdl-insert-keyword "REPORT ")
     (if (equal "\"\"" (vhdl-template-field
                       "string expression" nil t start (point) t))
-       (delete-backward-char 2)
+       (delete-char -2)
       (setq start (point))
       (vhdl-insert-keyword " SEVERITY ")
       (unless (vhdl-template-field "[NOTE | WARNING | ERROR | FAILURE]" nil t)
@@ -9600,7 +9553,7 @@ otherwise."
                    "[scalar type | ARRAY | RECORD | ACCESS | FILE]" nil t)
                   ""))))
        (cond ((equal definition "")
-              (delete-backward-char 4)
+              (delete-char -4)
               (insert ";"))
              ((equal definition "ARRAY")
               (delete-region (point) (progn (forward-word -1) (point)))
@@ -10100,13 +10053,13 @@ If starting after end-comment-column, start a new line."
       (if (not (or (and string (progn (insert string) t))
                   (vhdl-template-field "[comment]" nil t)))
          (delete-region position (point))
-       (while (= (preceding-char) ? ) (delete-backward-char 1))
-;      (when (> (current-column) end-comment-column)
-;        (setq position (point-marker))
-;        (re-search-backward "-- ")
-;        (insert "\n")
-;        (indent-to comment-column)
-;        (goto-char position))
+       (while (= (preceding-char) ?\ ) (delete-char -1))
+       ;; (when (> (current-column) end-comment-column)
+       ;;   (setq position (point-marker))
+       ;;   (re-search-backward "-- ")
+       ;;   (insert "\n")
+       ;;   (indent-to comment-column)
+       ;;   (goto-char position))
        ))))
 
 (defun vhdl-comment-block ()
@@ -10239,7 +10192,7 @@ Point is left between them."
     (when semicolon-pos (goto-char semicolon-pos))
     (if not-empty
        (progn (delete-char 1) (insert ")"))
-      (delete-backward-char 2))))
+      (delete-char -2))))
 
 (defun vhdl-template-generic-list (optional &optional no-value)
   "Read from user a generic spec argument list."
@@ -10605,7 +10558,7 @@ but not if inside a comment or quote."
          (backward-word 1)
          (vhdl-case-word 1)
          (delete-char 1))
-      (let ((invoke-char last-command-char)
+      (let ((invoke-char last-command-event)
            (abbrev-mode -1)
            (vhdl-template-invoked-by-hook t))
        (let ((caught (catch 'abort
@@ -12157,7 +12110,7 @@ options vhdl-upper-case-{keywords,types,attributes,enum-values}."
     (widen)
     (save-excursion
       (beginning-of-line)
-      (1+ (count-lines 1 (point))))))
+      (1+ (count-lines (point-min) (point))))))
 
 (defun vhdl-line-kill-entire (&optional arg)
   "Delete entire line."
@@ -12548,7 +12501,7 @@ File statistics: \"%s\"\n\
        (add-hook 'hs-minor-mode-hook 'hs-hide-all)
       (remove-hook 'hs-minor-mode-hook 'hs-hide-all))
     (hs-minor-mode arg)
-    (vhdl-mode-line-update)))          ; hack to update menu bar
+    (force-mode-line-update)))         ; hack to update menu bar
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -15167,10 +15120,11 @@ is already shown in a buffer."
     (let ((buffer (get-file-buffer (car token))))
       (speedbar-find-file-in-frame (car token))
       (when (or vhdl-speedbar-jump-to-unit buffer)
-       (goto-line (cdr token))
+       (goto-char (point-min))
+       (forward-line (1- (cdr token)))
        (recenter))
       (vhdl-speedbar-update-current-unit t t)
-      (speedbar-set-timer speedbar-update-speed)
+      (speedbar-set-timer dframe-update-speed)
       (speedbar-maybee-jump-to-attached-frame))))
 
 (defun vhdl-speedbar-port-copy ()
@@ -15185,7 +15139,8 @@ is already shown in a buffer."
              (let ((token (get-text-property
                            (match-beginning 3) 'speedbar-token)))
                (vhdl-visit-file (car token) t
-                                (progn (goto-line (cdr token))
+                                (progn (goto-char (point-min))
+                                       (forward-line (1- (cdr token)))
                                        (end-of-line)
                                        (if is-entity
                                            (vhdl-port-copy)
@@ -15934,7 +15889,8 @@ current project/directory."
     ;; insert component declarations
     (while ent-alist
       (vhdl-visit-file (nth 2 (car ent-alist)) nil
-                      (progn (goto-line (nth 3 (car ent-alist)))
+                      (progn (goto-char (point-min))
+                             (forward-line (1- (nth 3 (car ent-alist))))
                              (end-of-line)
                              (vhdl-port-copy)))
       (goto-char component-pos)
@@ -16994,7 +16950,7 @@ to visually support naming conventions.")
     (princ (documentation-property variable 'variable-documentation))
     (with-current-buffer standard-output
       (help-mode))
-    (print-help-return-message)))
+    (help-print-return-message)))
 
 (defun vhdl-doc-mode ()
   "Display VHDL Mode documentation in *Help* buffer."
@@ -17008,7 +16964,7 @@ to visually support naming conventions.")
     (princ (documentation 'vhdl-mode))
     (with-current-buffer standard-output
       (help-mode))
-    (print-help-return-message)))
+    (help-print-return-message)))
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;