Download
(defgroup avenue nil
"Major mode for editing avenue code"
:prefix "avenue-"
:group 'languages)
(defvar avenue-mode-map nil
"Keymap used with avenue code")
(defcustom avenue-indent-level 4
"Amount by which avenue subexpressions are indented."
:type 'integer
:group 'avenue)
(defvar avenue-font-lock-keywords
(eval-when-compile
(list
(concat "\\<\\(b\\(reak\\|y\\)\\|continue\\"
"|e\\(ach\\|lse\\(\\|if\\)\\|nd\\|xit\\)\\|"
"for\\|i[fn]\\|return\\|then\\|while\\)\\>")
'("\\<\\(nil\\|true\\false\\)\\>" . font-lock-constant-face))))
(defun avenue-mode ()
"Major mode for editing avenue scripts."
(interactive)
(kill-all-local-variables)
(setq major-mode 'avenue-mode)
(setq mode-name "Avenue")
(set (make-local-variable 'indent-line-function) 'avenue-indent-line)
(set (make-local-variable 'comment-start) "'")
(set (make-local-variable 'comment-start-skip) "'+[ \t]*")
(set (make-local-variable 'font-lock-defaults)
'(avenue-font-lock-keywords nil t nil))
(modify-syntax-entry ?' "<")
(modify-syntax-entry ?\n ">")
(run-hooks 'avenue-mode-hook))
(defun avenue-indent-line ()
"Indent current line as avenue script"
(let ((indent (avenue-calculate-indent))
beg shift-amt
(old-pos (- (point-max) (point))))
(beginning-of-line)
(setq beg (point))
(skip-chars-forward " \t")
(if (looking-at "e\\(nd\\|lse\\(\\|if\\)\\)\\>")
(setq indent (max (- indent avenue-indent-level))))
(message "prev indent: %d" indent)
(setq shift-amt (- indent (current-column)))
(if (not (zerop shift-amt))
(progn
(delete-region beg (point))
(insert-char ? indent)
(if (> (- (point-max) old-pos) (point))
(goto-char (- (point-max) old-pos)))))
shift-amt))
(defun avenue-calculate-indent ()
"Return appropriate indentation for the current line as avenue code."
(save-excursion
(beginning-of-line)
(current-indentation)
(if (bobp)
0
(if (re-search-backward "^[ \t]*[^ \t\n\r]" nil t)
(if (looking-at "[ \t]*\\(else\\(\\|if\\)\\|for\\|if\\|while\\)\\>")
(+ (current-indentation) avenue-indent-level)
(current-indentation))
0))))
(provide 'avenue-mode)