Function: tcl-indent-exp
tcl-indent-exp is an interactive and byte-compiled function defined in
tcl.el.gz.
Signature
(tcl-indent-exp)
Documentation
Indent each line of the Tcl grouping following point.
Key Bindings
Aliases
indent-tcl-exp (obsolete since 28.1)
Source Code
;; Defined in /usr/src/emacs/lisp/progmodes/tcl.el.gz
(defun tcl-indent-exp ()
"Indent each line of the Tcl grouping following point."
(interactive)
(let ((indent-stack (list nil))
(contain-stack (list (point)))
(case-fold-search nil)
outer-loop-done inner-loop-done state ostate
this-indent continued-line
(next-depth 0)
last-depth)
(save-excursion
(forward-sexp 1))
(save-excursion
(setq outer-loop-done nil)
(while (and (not (eobp)) (not outer-loop-done))
(setq last-depth next-depth)
;; Compute how depth changes over this line
;; plus enough other lines to get to one that
;; does not end inside a comment or string.
;; Meanwhile, do appropriate indentation on comment lines.
(setq inner-loop-done nil)
(while (and (not inner-loop-done)
(not (and (eobp) (setq outer-loop-done t))))
(setq ostate state)
(setq state (parse-partial-sexp (point) (progn (end-of-line) (point))
nil nil state))
(setq next-depth (car state))
(if (or (nth 4 ostate))
(tcl-indent-line))
(if (or (nth 3 state))
(forward-line 1)
(setq inner-loop-done t)))
(if (<= next-depth 0)
(setq outer-loop-done t))
(if outer-loop-done
nil
;; If this line had ..))) (((.. in it, pop out of the levels
;; that ended anywhere in this line, even if the final depth
;; doesn't indicate that they ended.
(while (> last-depth (nth 6 state))
(setq indent-stack (cdr indent-stack)
contain-stack (cdr contain-stack)
last-depth (1- last-depth)))
;; Add levels for any parens that were started in this line.
(while (< last-depth next-depth)
(setq indent-stack (cons nil indent-stack)
contain-stack (cons nil contain-stack)
last-depth (1+ last-depth)))
(if (null (car contain-stack))
(setcar contain-stack
(or (car (cdr state))
(save-excursion
(forward-sexp -1)
(point)))))
(forward-line 1)
(setq continued-line
(save-excursion
(backward-char)
(= (preceding-char) ?\\)))
(skip-chars-forward " \t")
(if (eolp)
nil
(if (and (car indent-stack)
(>= (car indent-stack) 0))
;; Line is on an existing nesting level.
(setq this-indent (car indent-stack))
;; Just started a new nesting level.
;; Compute the standard indent for this level.
(let ((val (tcl-calculate-indent
(if (car indent-stack)
(- (car indent-stack))))))
(setcar indent-stack
(setq this-indent val))
(setq continued-line nil)))
(cond ((not (numberp this-indent)))
((= (following-char) ?})
(setq this-indent (- this-indent tcl-indent-level)))
((= (following-char) ?\])
(setq this-indent (- this-indent 1))))
;; Put chosen indentation into effect.
(or (null this-indent)
(= (current-column)
(if continued-line
(+ this-indent tcl-indent-level)
this-indent))
(progn
(delete-region (point) (progn (beginning-of-line) (point)))
(indent-to
(if continued-line
(+ this-indent tcl-indent-level)
this-indent)))))))))
)