emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] trunk r118091: * progmodes/cfengine.el (cfengine3-defuns,


From: Leo Liu
Subject: [Emacs-diffs] trunk r118091: * progmodes/cfengine.el (cfengine3-defuns, cfengine3-vartypes):
Date: Sat, 11 Oct 2014 14:13:27 +0000
User-agent: Bazaar (2.6b2)

------------------------------------------------------------
revno: 118091
revision-id: address@hidden
parent: address@hidden
committer: Leo Liu <address@hidden>
branch nick: trunk
timestamp: Sat 2014-10-11 22:11:03 +0800
message:
  * 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.
modified:
  lisp/ChangeLog                 changelog-20091113204419-o5vbwnq5f7feedwu-1432
  lisp/progmodes/cfengine.el     
cfengine.el-20091113204419-o5vbwnq5f7feedwu-2944
=== modified file 'lisp/ChangeLog'
--- a/lisp/ChangeLog    2014-10-11 08:28:11 +0000
+++ b/lisp/ChangeLog    2014-10-11 14:11:03 +0000
@@ -1,3 +1,12 @@
+2014-10-11  Leo Liu  <address@hidden>
+
+       * 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.
+
 2014-10-11  Jan Djärv  <address@hidden>
 
        * cus-start.el (all): Add ns-use-fullscreen-animation.

=== modified file 'lisp/progmodes/cfengine.el'
--- a/lisp/progmodes/cfengine.el        2014-10-08 15:34:58 +0000
+++ b/lisp/progmodes/cfengine.el        2014-10-11 14:11:03 +0000
@@ -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 @@
     "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 @@
     ("=>"  . ?⇒)
     ("::" . ?∷)))
 
+(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 @@
                  (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 @@
 
 ;;;###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)
 


reply via email to

[Prev in Thread] Current Thread [Next in Thread]