summaryrefslogtreecommitdiff
path: root/lisp/progmodes/cfengine.el
diff options
context:
space:
mode:
authorLeo Liu <sdl.web@gmail.com>2014-10-11 22:11:03 +0800
committerLeo Liu <sdl.web@gmail.com>2014-10-11 22:11:03 +0800
commit217f4eed7b41858c11e4a1aa19159c0d4ba02d4a (patch)
treeaae05e87b0231814ec728d335cb2ad2359db6f70 /lisp/progmodes/cfengine.el
parentb34cba38292e9ac536b99b0b4dabbfc3b61bcab6 (diff)
downloademacs-217f4eed7b41858c11e4a1aa19159c0d4ba02d4a.tar.gz
* progmodes/cfengine.el (cfengine3-defuns, cfengine3-vartypes):
Use strings. (cfengine3-create-imenu-index): New function. (cfengine3-mode): Use it for `imenu-create-index-function'. (cfengine-auto-mode): Improve and prefer cfengine3-mode when buffer is empty.
Diffstat (limited to 'lisp/progmodes/cfengine.el')
-rw-r--r--lisp/progmodes/cfengine.el64
1 files changed, 35 insertions, 29 deletions
diff --git a/lisp/progmodes/cfengine.el b/lisp/progmodes/cfengine.el
index da231918c39..14eb379a709 100644
--- a/lisp/progmodes/cfengine.el
+++ b/lisp/progmodes/cfengine.el
@@ -27,9 +27,6 @@
;; Provides support for editing GNU Cfengine files, including
;; font-locking, Imenu and indentation, but with no special keybindings.
-;; The CFEngine 3.x support doesn't have Imenu support but patches are
-;; welcome.
-
;; By default, CFEngine 3.x syntax is used.
;; You can set it up so either `cfengine2-mode' (2.x and earlier) or
@@ -56,7 +53,6 @@
;;; Code:
(autoload 'json-read "json")
-(autoload 'regexp-opt "regexp-opt")
(defgroup cfengine ()
"Editing CFEngine files."
@@ -815,24 +811,18 @@ bundle agent rcfiles
"List of the action keywords supported by Cfengine.
This includes those for cfservd as well as cfagent.")
- (defconst cfengine3-defuns
- (mapcar
- 'symbol-name
- '(bundle body))
+ (defconst cfengine3-defuns '("bundle" "body")
"List of the CFEngine 3.x defun headings.")
- (defconst cfengine3-defuns-regex
- (regexp-opt cfengine3-defuns t)
+ (defconst cfengine3-defuns-regex (regexp-opt cfengine3-defuns t)
"Regex to match the CFEngine 3.x defuns.")
(defconst cfengine3-class-selector-regex "\\([[:alnum:]_().&|!:]+\\)::")
(defconst cfengine3-category-regex "\\([[:alnum:]_]+\\):")
- (defconst cfengine3-vartypes
- (mapcar
- 'symbol-name
- '(string int real slist ilist rlist irange rrange counter data))
+ (defconst cfengine3-vartypes '("string" "int" "real" "slist" "ilist" "rlist"
+ "irange" "rrange" "counter" "data")
"List of the CFEngine 3.x variable types."))
(defvar cfengine2-font-lock-keywords
@@ -1308,6 +1298,20 @@ Use it by enabling `eldoc-mode'."
("=>" . ?⇒)
("::" . ?∷)))
+(defun cfengine3-create-imenu-index ()
+ "A function for `imenu-create-index-function'."
+ (goto-char (point-min))
+ (let ((re (concat "^\\s-*" cfengine3-defuns-regex
+ "\\s-*\\(\\(?:\\w\\|\\s_\\)+\\)" ;type
+ "\\s-*\\(\\(?:\\w\\|\\s_\\)+\\)" ;id
+ ))
+ (defuns ()))
+ (while (re-search-forward re nil t)
+ (push (cons (mapconcat #'match-string '(1 2 3) ".")
+ (copy-marker (match-beginning 3)))
+ defuns))
+ (nreverse defuns)))
+
;;;###autoload
(define-derived-mode cfengine3-mode prog-mode "CFE3"
"Major mode for editing CFEngine3 input.
@@ -1334,17 +1338,16 @@ to the action header."
(when buffer-file-name
(shell-quote-argument buffer-file-name)))))
- (set (make-local-variable 'eldoc-documentation-function)
- #'cfengine3-documentation-function)
+ (setq-local eldoc-documentation-function #'cfengine3-documentation-function)
(add-hook 'completion-at-point-functions
#'cfengine3-completion-function nil t)
;; Use defuns as the essential syntax block.
- (set (make-local-variable 'beginning-of-defun-function)
- #'cfengine3-beginning-of-defun)
- (set (make-local-variable 'end-of-defun-function)
- #'cfengine3-end-of-defun))
+ (setq-local beginning-of-defun-function #'cfengine3-beginning-of-defun)
+ (setq-local end-of-defun-function #'cfengine3-end-of-defun)
+
+ (setq-local imenu-create-index-function #'cfengine3-create-imenu-index))
;;;###autoload
(define-derived-mode cfengine2-mode prog-mode "CFE2"
@@ -1378,15 +1381,18 @@ to the action header."
;;;###autoload
(defun cfengine-auto-mode ()
- "Choose between `cfengine2-mode' and `cfengine3-mode' depending
-on the buffer contents"
- (let ((v3 nil))
- (save-restriction
- (goto-char (point-min))
- (while (not (or (eobp) v3))
- (setq v3 (looking-at (concat cfengine3-defuns-regex "\\_>")))
- (forward-line)))
- (if v3 (cfengine3-mode) (cfengine2-mode))))
+ "Choose `cfengine2-mode' or `cfengine3-mode' by buffer contents."
+ (interactive)
+ (if (save-excursion
+ (save-restriction
+ (widen)
+ (goto-char (point-min))
+ (forward-comment (point-max))
+ (or (eobp)
+ (re-search-forward
+ (concat "^\\s-*" cfengine3-defuns-regex "\\_>") nil t))))
+ (cfengine3-mode)
+ (cfengine2-mode)))
(defalias 'cfengine-mode 'cfengine3-mode)