X-Git-Url: http://gitweb.michael.orlitzky.com/?p=nagios-mode.git;a=blobdiff_plain;f=nagios-mode.el;h=71cc5a008f9480cbdf11a33ce0970e4198008284;hp=7ae478dee6b7c8ed532104c1e6ba0e6d08e5fc26;hb=05efadf89278ffc7a715fcd77e38babcd4ccac64;hpb=823c37d1da15133dc49060b55798922fda346842 diff --git a/nagios-mode.el b/nagios-mode.el index 7ae478d..71cc5a0 100644 --- a/nagios-mode.el +++ b/nagios-mode.el @@ -36,11 +36,12 @@ (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() +(defun nagios-beginning-of-line-pos() ;; Return the point position corresponding to the beginning ;; of the current line. (save-excursion @@ -49,61 +50,101 @@ ) ) -(defun pos-offset() - ;; How far are we from the beginning of the line? - (- (point) (beginning-of-line-pos)) +(defun nagios-end-of-line-pos() + ;; Return the point position corresponding to the end + ;; of the current line. + (save-excursion + (end-of-line) + (point) ) ) -(defun first-char-offset() +(defun nagios-point-offset() + ;; How far are we from the beginning of the line? + (- (point) (nagios-beginning-of-line-pos)) +) + +(defun nagios-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 first-char-pos() +(defun nagios-first-char-pos() ;; What's the position of the first character on this line? - (+ (beginning-of-line-pos) (first-char-offset)) + (+ (nagios-beginning-of-line-pos) (nagios-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-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. - (let ((orig-first-char-offset (first-char-offset))) + (let ((orig-first-char-offset (nagios-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)) + (delete-region (nagios-beginning-of-line-pos) (nagios-first-char-pos)) (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 (- (nagios-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 (< (nagios-point-offset) indent-column) + (goto-char (+ (nagios-beginning-of-line-pos) indent-column)) + ) ) ) ) +(defun nagios-char-is-commented(pos) + "True if the character at position pos is commented, nil otherwise." + (save-excursion + (goto-char pos) + (re-search-backward "#" (nagios-beginning-of-line-pos) t) + ) +) + +(defun nagios-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 + (nagios-char-is-commented pos) + ) +) + -(defun last-opening-brace() - ;; Get the position of the last opening brace, with - ;; respect to the current point. +(defun nagios-last-opening-brace() + "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 (nagios-char-is-commented-and-valid lob) + (goto-char lob) + (setq lob (re-search-backward "{" nil t)) + ) + (if lob lob -1) @@ -111,11 +152,19 @@ ) ) -(defun last-closing-brace() - ;; Get the position of the last closing brace, with - ;; respect to the current point. + +(defun nagios-last-closing-brace() + "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 (nagios-char-is-commented-and-valid lcb) + (goto-char lcb) + (setq lcb (re-search-backward "}" nil t)) + ) + (if lcb lcb -1) @@ -128,38 +177,42 @@ ;; If the last brace seen in the buffer is an opening brace, we're ;; in a block. Otherwise, we aren't. - (if (>= (last-closing-brace) (last-opening-brace)) + (if (>= (nagios-last-closing-brace) (nagios-last-opening-brace)) nil t) ) +(defun nagios-brace-on-line() + ;; Is there a curly brace on this line? + (save-excursion + (beginning-of-line) + (re-search-forward "[{}]" (nagios-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) - - indent + ;; 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) + ) + ) + + ;; Set the indentation level to 0 if we find either brace on this + ;; line and. + (if (and (nagios-brace-on-line) + (not (nagios-char-is-commented (nagios-brace-on-line)))) + 0 + indent + ) ) - +) ;; Keymaps @@ -181,7 +234,7 @@ (read-kbd-macro "}") 'nagios-insert-right-brace-and-indent) ) - + (defconst nagios-directives @@ -757,7 +810,7 @@ (make-local-variable 'syntax-begin-function) (set-syntax-table nagios-mode-syntax-table) - + (setq mode-name "nagios" major-mode 'nagios-mode indent-line-function 'nagios-indent-line @@ -765,7 +818,7 @@ comment-start "#" comment-start-skip "#\|; +" comment-end "" - + ;; Since comments and strings do not span multiple lines, ;; the syntax parser can safely start parsing at the beginning ;; of any line.