X-Git-Url: http://gitweb.michael.orlitzky.com/?p=nagios-mode.git;a=blobdiff_plain;f=nagios-mode.el;h=33a5742dce47478b8105706afbc9fa866e16b676;hp=e486edc5b4f93e290a418926017b03976e2e3278;hb=5fa275977e46b64c6336523696558049a8a7157d;hpb=36e47cd9620f76fe2b69b0e2604e5448353b0047 diff --git a/nagios-mode.el b/nagios-mode.el index e486edc..33a5742 100644 --- a/nagios-mode.el +++ b/nagios-mode.el @@ -36,41 +36,81 @@ (defun nagios-indent-line(&optional flag) "Indents a line, taking nesting into account." + (interactive) (nagios-indent-to (nagios-calculate-indent)) ) +(defun beginning-of-line-pos() + ;; Return the point position corresponding to the beginning + ;; of the current line. + (save-excursion + (beginning-of-line) + (point) + ) +) -(defun nagios-indent-to(indent-column) - "Indent the current line to column indent-column." - (setq pos (point)) - (beginning-of-line) - (setq bol (point)) - (setq pos-offset (- pos bol)) - - (setq first-char-offset - (skip-chars-forward " \t")) - - (setq first-char-pos - (+ bol first-char-offset)) - - (delete-region bol first-char-pos) - - (beginning-of-line) +(defun end-of-line-pos() + ;; Return the point position corresponding to the end + ;; of the current line. + (save-excursion + (end-of-line) + (point) + ) +) - (setq pos-change (- indent-column first-char-offset)) - (setq pos-offset (+ pos-offset pos-change)) +(defun point-offset() + ;; How far are we from the beginning of the line? + (- (point) (beginning-of-line-pos)) +) - (if (<= pos-offset indent-column) - (setq pos-offset indent-column)) - - (while (< 0 indent-column) - (insert " ") - (setq indent-column (- indent-column 1))) +(defun first-char-offset() + ;; How far is the first character on this line + ;; from the beginning of the line? + (save-excursion + (beginning-of-line) + (skip-chars-forward " \t") + ) +) - (goto-char (+ bol pos-offset)) +(defun first-char-pos() + ;; What's the position of the first character on this line? + (+ (beginning-of-line-pos) (first-char-offset)) +) +(defun nagios-indent-to(indent-column) + "Indent the current line to column indent-column." + ;; Store the point in orig-pos. + (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. + (let ((orig-first-char-offset (first-char-offset))) + + ;; Delete any leading whitespace, and move the point to the + ;; beginning of the line. + (delete-region (beginning-of-line-pos) (first-char-pos)) + (beginning-of-line) + + ;; Now insert indent-column spaces. + (while (< 0 indent-column) + (insert " ") + (setq indent-column (- indent-column 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))) + (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 indent-column) + ) + ) ) +) @@ -109,32 +149,34 @@ ) +(defun brace-on-line() + ;; Is there a curly brace on this line? + (save-excursion + (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. + ;; 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) + ) + ) - (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) + ;; Set the indentation level to 0 if we find either brace on this + ;; line. + (if (brace-on-line) + (setq indent 0) + ) - indent + indent ) - +) ;; Keymaps