(defun nagios-indent-line(&optional flag)
"Indents a line, taking nesting into account."
+ (interactive)
(nagios-indent-to (nagios-calculate-indent))
)
)
)
-(defun pos-offset()
+(defun end-of-line-pos()
+ ;; Return the point position corresponding to the end
+ ;; of the current line.
+ (save-excursion
+ (end-of-line)
+ (point)
+ )
+)
+
+(defun point-offset()
;; How far are we from the beginning of the line?
(- (point) (beginning-of-line-pos))
- )
)
(defun first-char-offset()
;; How far is the first character on this line
;; from the beginning of the line?
(save-excursion
- (+ (pos-offset) (skip-chars-forward " \t"))
+ (beginning-of-line)
+ (skip-chars-forward " \t")
)
)
(defun nagios-indent-to(indent-column)
"Indent the current line to column indent-column."
-
;; Store the point in orig-pos.
- (let ((orig-pos (point)))
+ (let ((orig-point (point)))
;; And store the offset of the first character (with respect to the
;; beginning of the line) in orig-first-char-offset.
(beginning-of-line)
;; Now insert indent-column spaces.
- (while (< 0 indent-column)
- (insert " ")
- (setq indent-column (- indent-column 1)))
+ (let ((indent-remaining indent-column))
+ (while (< 0 indent-remaining)
+ (insert " ")
+ (setq indent-remaining (- indent-remaining 1)))
+ )
;; The text on the current line just moved left/right some amount;
;; call it text-delta. We want to move the point that same distance.
- (let ((text-delta ((first-char-offset) - orig-first-char-offset)))
+ (let ((text-delta (- (first-char-offset) orig-first-char-offset)))
(goto-char (+ orig-point text-delta))
)
+
+ ;; The point should never wind up to the left of indent-column, so
+ ;; if it's there, move it over to indent-column.
+ (if (< (point-offset) indent-column)
+ (goto-char (+ (beginning-of-line-pos) indent-column))
+ )
)
)
)
+(defun char-is-commented(pos)
+ "True if the character at position pos is commented, nil otherwise."
+ (save-excursion
+ (goto-char pos)
+ (re-search-backward "#" (beginning-of-line-pos) t)
+ )
+)
+
+(defun char-is-commented-and-valid(pos)
+ "True if the character at position pos is commented and non-nil.
+ Nil otherwise."
+ (if (eq nil pos)
+ nil
+ (char-is-commented pos)
+ )
+)
+
(defun last-opening-brace()
- ;; Get the position of the last opening brace, with
- ;; respect to the current point.
+ "Returns the position of the last opening brace, with
+ respect to the current point. Ignores braces which
+ are commented out."
(save-excursion
(let ((lob (re-search-backward "{" nil t)))
+
+ (while (char-is-commented-and-valid lob)
+ (goto-char lob)
+ (setq lob (re-search-backward "{" nil t))
+ )
+
(if lob
lob
-1)
)
)
+
(defun last-closing-brace()
- ;; Get the position of the last closing brace, with
- ;; respect to the current point.
+ "Get the position of the last closing brace, with
+ respect to the current point. Ignores braces which
+ are commented out."
(save-excursion
(let ((lcb (re-search-backward "}" nil t)))
+
+ (while (char-is-commented-and-valid lcb)
+ (goto-char lcb)
+ (setq lcb (re-search-backward "}" nil t))
+ )
+
(if lcb
lcb
-1)
)
+(defun brace-on-line()
+ ;; Is there a curly brace on this line?
+ (save-excursion
+ (beginning-of-line)
+ (re-search-forward "[{}]" (end-of-line-pos) t)
+ )
+)
+
(defun nagios-calculate-indent()
"Calculate the level of indentation."
- ;; We're either inside a block, or we aren't.
- (setq indent 0)
-
- (if (nagios-in-block)
- (setq indent nagios-indent-level))
-
- (setq pos (point))
- (end-of-line)
- (setq eol (point))
- (beginning-of-line)
- (setq bol (point))
-
- ;; Set the indentation level to 0 if we find either brace on this
- ;; line.
- (if (re-search-forward "[{}]" eol t)
- (setq indent 0))
-
- (goto-char pos)
+ ;; We're either inside a block, or we aren't.
+ ;; Initialize the indent variable to either nagios-indent-level
+ ;; or 0 depending on whether or not we're in a block.
+ (let ((indent (if (nagios-in-block)
+ nagios-indent-level
+ 0)
+ )
+ )
- indent
+ ;; Set the indentation level to 0 if we find either brace on this
+ ;; line and.
+ (if (and (brace-on-line) (not (char-is-commented (brace-on-line))))
+ 0
+ indent
+ )
)
-
+)
;; Keymaps