X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=nagios-mode.el;h=c56d58dd914b8a644a335c6f68a92924f16170e5;hb=e8d77bf664c2f1509bc61c618fcc1b82d631c1bc;hp=8482abee94e397159ff728546d5a8d9c39d52d84;hpb=a55f0340c8c83de79772f262ddad72e38b041a79;p=nagios-mode.git diff --git a/nagios-mode.el b/nagios-mode.el index 8482abe..c56d58d 100644 --- a/nagios-mode.el +++ b/nagios-mode.el @@ -41,7 +41,7 @@ ) -(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 @@ -50,7 +50,7 @@ ) ) -(defun end-of-line-pos() +(defun nagios-end-of-line-pos() ;; Return the point position corresponding to the end ;; of the current line. (save-excursion @@ -59,12 +59,12 @@ ) ) -(defun point-offset() +(defun nagios-point-offset() ;; How far are we from the beginning of the line? - (- (point) (beginning-of-line-pos)) + (- (point) (nagios-beginning-of-line-pos)) ) -(defun first-char-offset() +(defun nagios-first-char-offset() ;; How far is the first character on this line ;; from the beginning of the line? (save-excursion @@ -73,9 +73,9 @@ ) ) -(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) @@ -85,57 +85,89 @@ ;; 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. (let ((indent-remaining indent-column)) - (while (< 0 indent-remaining) - (insert " ") - (setq indent-remaining (- indent-remaining 1))) + (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))) - (goto-char (+ orig-point text-delta)) + (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 (< (point-offset) indent-column) - (goto-char (+ (beginning-of-line-pos) 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) + lob + -1) ) ) ) -(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) + lcb + -1) ) ) ) @@ -145,19 +177,21 @@ ;; 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 brace-on-line() +(defun nagios-brace-on-line() ;; Is there a curly brace on this line? (save-excursion - (re-search-forward "[{}]" (end-of-line-pos) t) + (beginning-of-line) + (re-search-forward "[{}]" (nagios-end-of-line-pos) t) ) ) + (defun nagios-calculate-indent() "Calculate the level of indentation." @@ -165,18 +199,18 @@ ;; 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) - ) + nagios-indent-level + 0) + ) ) ;; Set the indentation level to 0 if we find either brace on this - ;; line. - (if (brace-on-line) - (setq indent 0) + ;; line and. + (if (and (nagios-brace-on-line) + (not (nagios-char-is-commented (nagios-brace-on-line)))) + 0 + indent ) - - indent ) ) @@ -200,7 +234,7 @@ (read-kbd-macro "}") 'nagios-insert-right-brace-and-indent) ) - + (defconst nagios-directives @@ -295,6 +329,7 @@ "$HOSTACTIONURL$" "$HOSTADDRESS$" "$HOSTALIAS$" + "$HOSTANDSERVICESIMPORTANCE$" "$HOSTATTEMPT$" "$HOSTCHECKCOMMAND$" "$HOSTCHECKTYPE$" @@ -306,17 +341,22 @@ "$HOSTEXECUTIONTIME$" "$HOSTGROUPACTIONURL$" "$HOSTGROUPALIAS$" + "$HOSTGROUPMEMBERADDRESSES$" "$HOSTGROUPMEMBERS$" "$HOSTGROUPNAME$" "$HOSTGROUPNAMES$" "$HOSTGROUPNOTES$" "$HOSTGROUPNOTESURL$" + "$HOSTIMPORTANCE$" + "$HOSTINFOURL$" "$HOSTLATENCY$" "$HOSTNAME$" "$HOSTNOTES$" "$HOSTNOTESURL$" + "$HOSTNOTIFICATIONENABLED$" "$HOSTNOTIFICATIONID$" "$HOSTNOTIFICATIONNUMBER$" + "$HOSTNOTIFICATIONPERIOD$" "$HOSTOUTPUT$" "$HOSTPERCENTCHANGE$" "$HOSTPERFDATA$" @@ -387,12 +427,16 @@ "$SERVICEGROUPNAMES$" "$SERVICEGROUPNOTES$" "$SERVICEGROUPNOTESURL$" + "$SERVICEIMPORTANCE$" + "$SERVICEINFOURL$" "$SERVICEISVOLATILE$" "$SERVICELATENCY$" "$SERVICENOTES$" "$SERVICENOTESURL$" + "$SERVICENOTIFICATIONENABLED$" "$SERVICENOTIFICATIONID$" "$SERVICENOTIFICATIONNUMBER$" + "$SERVICENOTIFICATIONPERIOD$" "$SERVICEOUTPUT$" "$SERVICEPERCENTCHANGE$" "$SERVICEPERFDATA$" @@ -693,32 +737,31 @@ (concat "^[ \t\r\n]*" - "\\(" ;; Stick parenthesis around whatever comes out - ;; of regexp-opt. We use this to match a - ;; subexpression during font-lock. - (regexp-opt - '("define command" - "define contact" - "define contactgroup" - "define host" - "define hostdependency" - "define hostescalation" - "define hostextinfo" - "define hostgroup" - "define hostgroupescalation" - "define null" - "define service" - "define servicedependency" - "define serviceescalation" - "define serviceextinfo" - "define servicegroup" - "define timeperiod")) - ;; This closes the parentheses that we opened - "\\)" ;; before regexp-opt. - - ;; These can be "terminated" by either an opening curly - ;; brace, or a space. - "\\({\\| \\)") + "\\(" ;; Stick parenthesis around whatever comes out + ;; of regexp-opt. We use this to match a + ;; subexpression during font-lock. + (regexp-opt + '("define command" + "define contact" + "define contactgroup" + "define host" + "define hostdependency" + "define hostescalation" + "define hostextinfo" + "define hostgroup" + "define null" + "define service" + "define servicedependency" + "define serviceescalation" + "define serviceextinfo" + "define servicegroup" + "define timeperiod")) + ;; This closes the parentheses that we opened + "\\)" ;; before regexp-opt. + + ;; These can be "terminated" by either an opening curly + ;; brace, or a space. + "\\({\\| \\)") ) ) @@ -776,20 +819,20 @@ (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 - font-lock-defaults '(nagios-font-lock-keywords) - 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. - syntax-begin-function 'beginning-of-line - ) + major-mode 'nagios-mode + indent-line-function 'nagios-indent-line + font-lock-defaults '(nagios-font-lock-keywords) + 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. + syntax-begin-function 'beginning-of-line + ) ;; Keyboard Mapping (use-local-map nagios-mode-map)