Function: vhdl-beginning-of-statement-1
vhdl-beginning-of-statement-1 is a byte-compiled function defined in
vhdl-mode.el.gz.
Signature
(vhdl-beginning-of-statement-1 &optional LIM)
Documentation
Move to the start of the current statement.
If already at the beginning of a statement, move to the start of the previous statement instead.
Source Code
;; Defined in /usr/src/emacs/lisp/progmodes/vhdl-mode.el.gz
(defun vhdl-beginning-of-statement-1 (&optional lim)
"Move to the start of the current statement.
If already at the beginning of a statement, move to the start of
the previous statement instead."
(let ((lim (or lim (point-min)))
(here (point))
(pos (point))
donep)
;; go backwards one balanced expression, but be careful of
;; unbalanced paren being reached
(if (not (vhdl-safe (progn (backward-sexp) t)))
(progn
(backward-up-list 1)
(forward-char)
(vhdl-forward-syntactic-ws here)
(setq donep t)))
(while (and (not donep)
(not (bobp))
;; look backwards for a statement boundary
(progn (forward-char) (re-search-backward vhdl-b-o-s-re lim 'move)))
(if (or (= (preceding-char) ?_)
(vhdl-in-literal))
(backward-char)
(cond
;; If we are looking at an open paren, then stop after it
((eq (following-char) ?\()
(forward-char)
(vhdl-forward-syntactic-ws here)
(setq donep t))
;; If we are looking at a close paren, then skip it
((eq (following-char) ?\))
(forward-char)
(setq pos (point))
(backward-sexp)
(if (< (point) lim)
(progn (goto-char pos)
(vhdl-forward-syntactic-ws here)
(setq donep t))))
;; If we are looking at a semicolon, then stop
((and (eq (following-char) ?\;) (not (vhdl-in-quote-p)))
(progn
(forward-char)
(vhdl-forward-syntactic-ws here)
(setq donep t)))
;; If we are looking at a "begin", then stop
((and (looking-at vhdl-begin-fwd-re)
(or (not (looking-at "\\<use\\>"))
(save-excursion
(back-to-indentation)
(looking-at "\\(\\w+\\s-*:\\s-*\\)?\\<\\(case\\|elsif\\|if\\)\\>")))
(/= (preceding-char) ?_)
(vhdl-begin-p nil))
;; If it's a leader "begin", then find the
;; right place
(if (looking-at vhdl-leader-re)
(save-excursion
;; set a default stop point at the begin
(setq pos (point))
;; is the start point inside the leader area ?
(goto-char (vhdl-end-of-leader))
(vhdl-forward-syntactic-ws here)
(if (< (point) here)
;; start point was not inside leader area
;; set stop point at word after leader
(setq pos (point))))
(unless (looking-at "\\<else\\s-+generate\\>")
(forward-word-strictly 1))
(vhdl-forward-syntactic-ws here)
(setq pos (point)))
(goto-char pos)
(setq donep t))
;; If we are looking at a "statement", then stop
((and (looking-at vhdl-statement-fwd-re)
(/= (preceding-char) ?_)
(vhdl-statement-p nil))
(setq donep t))
;; If we are looking at a case alternative key, then stop
((and (looking-at vhdl-case-alternative-re)
(vhdl-case-alternative-p lim))
(save-excursion
;; set a default stop point at the when
(setq pos (point))
;; is the start point inside the case alternative key ?
(looking-at vhdl-case-alternative-re)
(goto-char (match-end 0))
(vhdl-forward-syntactic-ws here)
(if (< (point) here)
;; start point was not inside the case alternative key
;; set stop point at word after case alternative keyleader
(setq pos (point))))
(goto-char pos)
(setq donep t))
;; Bogus find, continue
(t
(backward-char)))))
))