;;; 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
+;; 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
;; Free Software Foundation, Inc.
;; Authors: Reto Zimmermann <reto@gnu.org>
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
"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
(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."
(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
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.
(defun vhdl-electric-quote (count) "'' --> \""
(interactive "p")
(if (and vhdl-stutter-mode (= count 1) (not (vhdl-in-literal)))
- (if (= (preceding-char) last-input-char)
+ (if (= (preceding-char) last-input-event)
(progn (delete-backward-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 ": ")
(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 "<= ")))
(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 "=> ")))
(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 "== ")))
(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
(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."
(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 dframe-update-speed)
(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)
;; 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)
(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."
(princ (documentation 'vhdl-mode))
(with-current-buffer standard-output
(help-mode))
- (print-help-return-message)))
+ (help-print-return-message)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;