)
-(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
)
)
-(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
)
)
-(defun pos-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
- (+ (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-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)))
- (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 (< (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)
)
)
)
;; 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."
- ;; We're either inside a block, or we aren't.
+ ;; 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)
- (setq indent 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
)
)
(read-kbd-macro "}")
'nagios-insert-right-brace-and-indent)
)
-
+
(defconst nagios-directives
(concat "^[ \t\r\n]*"
(regexp-opt
- '("active_checks_enabled" "address" "alias" "check_command"
- "check_freshness" "check_interval" "check_period" "checks_enabled"
- "command_line" "command_name" "contactgroups" "contact_groups"
- "contactgroup_members" "contact_name" "contactgroup_name" "contacts"
- "dependent_host_name" "dependent_service_description" "email"
- "event_handler" "event_handler_enabled" "execution_failure_criteria"
- "failure_prediction_enabled" "first_notification"
- "first_notification_delay" "flap_detection_enabled" "freshness_threshold"
- "friday" "high_flap_threshold" "host_name" "host_notification_commands"
- "host_notification_options" "host_notification_period"
- "host_notifications_enabled" "hostgroup_name" "hostgroups"
- "is_volatile" "last_notification" "low_flap_threshold"
- "max_check_attempts" "members" "monday" "normal_check_interval"
- "notes" "notification_failure_criteria"
- "notification_interval" "notification_options"
- "notification_period" "notifications_enabled"
- "obsess_over_service" "pager" "parallelize_check"
- "parents" "passive_checks_enabled"
- "process_perf_data" "retain_nonstatus_information"
- "retain_status_information" "retry_check_interval"
- "retry_interval" "saturday" "service_description"
- "service_notification_commands" "service_notification_options"
- "service_notification_period" "service_notifications_enabled"
- "servicegroup_name" "stalking_options"
- "sunday" "thursday" "timeperiod_name" "tuesday" "wednesday") t)
+ '("active_checks_enabled"
+ "address"
+ "alias"
+ "check_command"
+ "check_freshness"
+ "check_interval"
+ "check_period"
+ "checks_enabled"
+ "command_line"
+ "command_name"
+ "contactgroups"
+ "contact_groups"
+ "contactgroup_members"
+ "contact_name"
+ "contactgroup_name"
+ "contacts"
+ "dependent_host_name"
+ "dependent_service_description"
+ "email"
+ "event_handler"
+ "event_handler_enabled"
+ "execution_failure_criteria"
+ "failure_prediction_enabled"
+ "first_notification"
+ "first_notification_delay"
+ "flap_detection_enabled"
+ "freshness_threshold"
+ "friday"
+ "high_flap_threshold"
+ "host_name"
+ "host_notification_commands"
+ "host_notification_options"
+ "host_notification_period"
+ "host_notifications_enabled"
+ "hostgroup_name"
+ "hostgroups"
+ "is_volatile"
+ "last_notification"
+ "low_flap_threshold"
+ "max_check_attempts"
+ "members"
+ "monday"
+ "normal_check_interval"
+ "notes"
+ "notification_failure_criteria"
+ "notification_interval"
+ "notification_options"
+ "notification_period"
+ "notifications_enabled"
+ "obsess_over_service"
+ "pager"
+ "parallelize_check"
+ "parents"
+ "passive_checks_enabled"
+ "process_perf_data"
+ "retain_nonstatus_information"
+ "retain_status_information"
+ "retry_check_interval"
+ "retry_interval"
+ "saturday"
+ "service_description"
+ "service_notification_commands"
+ "service_notification_options"
+ "service_notification_period"
+ "service_notifications_enabled"
+ "servicegroup_name"
+ "stalking_options"
+ "sunday"
+ "thursday"
+ "timeperiod_name"
+ "tuesday"
+ "wednesday") t)
"[ \r\n\t]+")
)
"$HOSTACTIONURL$"
"$HOSTADDRESS$"
"$HOSTALIAS$"
+ "$HOSTANDSERVICESIMPORTANCE$"
"$HOSTATTEMPT$"
"$HOSTCHECKCOMMAND$"
"$HOSTCHECKTYPE$"
"$HOSTEXECUTIONTIME$"
"$HOSTGROUPACTIONURL$"
"$HOSTGROUPALIAS$"
+ "$HOSTGROUPMEMBERADDRESSES$"
"$HOSTGROUPMEMBERS$"
"$HOSTGROUPNAME$"
"$HOSTGROUPNAMES$"
"$HOSTGROUPNOTES$"
"$HOSTGROUPNOTESURL$"
+ "$HOSTIMPORTANCE$"
+ "$HOSTINFOURL$"
"$HOSTLATENCY$"
"$HOSTNAME$"
"$HOSTNOTES$"
"$HOSTNOTESURL$"
+ "$HOSTNOTIFICATIONENABLED$"
"$HOSTNOTIFICATIONID$"
"$HOSTNOTIFICATIONNUMBER$"
+ "$HOSTNOTIFICATIONPERIOD$"
"$HOSTOUTPUT$"
"$HOSTPERCENTCHANGE$"
"$HOSTPERFDATA$"
"$SERVICEGROUPNAMES$"
"$SERVICEGROUPNOTES$"
"$SERVICEGROUPNOTESURL$"
+ "$SERVICEIMPORTANCE$"
+ "$SERVICEINFOURL$"
"$SERVICEISVOLATILE$"
"$SERVICELATENCY$"
"$SERVICENOTES$"
"$SERVICENOTESURL$"
+ "$SERVICENOTIFICATIONENABLED$"
"$SERVICENOTIFICATIONID$"
"$SERVICENOTIFICATIONNUMBER$"
+ "$SERVICENOTIFICATIONPERIOD$"
"$SERVICEOUTPUT$"
"$SERVICEPERCENTCHANGE$"
"$SERVICEPERFDATA$"
(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.
+ "\\({\\| \\)")
)
)
(make-local-variable 'comment-start-skip)
(make-local-variable 'comment-end)
(make-local-variable 'indent-line-function)
- (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 ""
+ )
;; Keyboard Mapping
(use-local-map nagios-mode-map)