Function: vhdl-forward-sexp
vhdl-forward-sexp is an interactive and byte-compiled function defined
in vhdl-mode.el.gz.
Signature
(vhdl-forward-sexp &optional COUNT LIM)
Documentation
Move forward across one balanced expression (sexp).
With COUNT, do it that many times.
Key Bindings
Source Code
;; Defined in /usr/src/emacs/lisp/progmodes/vhdl-mode.el.gz
(defun vhdl-forward-sexp (&optional count lim)
"Move forward across one balanced expression (sexp).
With COUNT, do it that many times."
(interactive "p")
(let ((count (or count 1))
(case-fold-search t)
end-vec target)
(save-excursion
(while (> count 0)
;; skip whitespace
(skip-chars-forward " \t\n\r\f")
;; Check for an unbalanced "end" keyword
(if (and (looking-at vhdl-end-fwd-re)
(/= (preceding-char) ?_)
(not (vhdl-in-literal))
(vhdl-end-p lim)
(not (looking-at "else")))
(error
"ERROR: Containing expression ends prematurely in vhdl-forward-sexp"))
;; If the current keyword is a "begin" keyword, then find the
;; corresponding "end" keyword.
(if (setq end-vec (vhdl-corresponding-end lim))
(let (
;; end-re is the statement keyword to search for
(end-re
(concat "\\b\\(" (aref end-vec 0) "\\)\\b\\([^_]\\|\\'\\)"))
;; column is either the statement keyword target column
;; or nil
(column (aref end-vec 1))
(eol (vhdl-point 'eol))
foundp literal placeholder)
;; Look for the statement keyword.
(while (and (not foundp)
(re-search-forward end-re nil t)
(setq placeholder (match-end 1))
(goto-char (match-beginning 0)))
;; If we are in a literal, or not in the right target
;; column and not on the same line as the begin, then
;; try again.
(if (or (and column
(/= (current-indentation) column)
(> (point) eol))
(= (preceding-char) ?_)
(setq literal (vhdl-in-literal)))
(if (eq literal 'comment)
(end-of-line)
(forward-char))
;; An "else" keyword corresponds to both the opening brace
;; of the following sexp and the closing brace of the
;; previous sexp.
(if (not (looking-at "else"))
(goto-char placeholder))
(setq foundp t))
)
(if (not foundp)
(error "ERROR: Unbalanced keywords in vhdl-forward-sexp"))
)
;; If the current keyword is not a "begin" keyword, then just
;; perform the normal forward-sexp.
(forward-sexp)
)
(setq count (1- count))
)
(setq target (point)))
(goto-char target)
nil))