autoconf.el 3.75 KB
Newer Older
1
;;; autoconf.el --- mode for editing Autoconf configure.ac files
Dave Love's avatar
Dave Love committed
2

3
;; Copyright (C) 2000-2012  Free Software Foundation, Inc.
Dave Love's avatar
Dave Love committed
4 5 6 7 8 9

;; Author: Dave Love <fx@gnu.org>
;; Keywords: languages

;; This file is part of GNU Emacs.

10
;; GNU Emacs is free software: you can redistribute it and/or modify
Dave Love's avatar
Dave Love committed
11
;; it under the terms of the GNU General Public License as published by
12 13
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
Dave Love's avatar
Dave Love committed
14 15 16 17 18 19 20

;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
21
;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
Dave Love's avatar
Dave Love committed
22 23 24 25

;;; Commentary:

;; Provides fairly minimal font-lock, imenu and indentation support
26
;; for editing configure.ac files.  Only Autoconf syntax is processed.
Dave Love's avatar
Dave Love committed
27 28 29
;; There is no attempt to deal with shell text -- probably that will
;; always lose.

30
;; This is specialized for configure.ac files.  It doesn't inherit the
Dave Love's avatar
Dave Love committed
31 32 33
;; general M4 stuff from M4 mode.

;; There is also an autoconf-mode.el in existence.  That appears to be
34
;; for editing the Autoconf M4 source, rather than configure.ac files.
Dave Love's avatar
Dave Love committed
35 36 37

;;; Code:

38 39
(defvar font-lock-syntactic-keywords)

Dave Love's avatar
Dave Love committed
40 41 42 43 44 45
(defvar autoconf-mode-map (make-sparse-keymap))

(defvar autoconf-mode-hook nil
  "Hook run by `autoconf-mode'.")

(defconst autoconf-definition-regexp
46
  "AC_\\(SUBST\\|DEFINE\\(_UNQUOTED\\)?\\)(\\[*\\(\\sw+\\)\\]*")
Dave Love's avatar
Dave Love committed
47 48

(defvar autoconf-font-lock-keywords
49
  `(("\\_<A[CHMS]_\\sw+" . font-lock-keyword-face)
Dave Love's avatar
Dave Love committed
50 51
    (,autoconf-definition-regexp
     3 font-lock-function-name-face)
52
    ;; Are any other M4 keywords really appropriate for configure.ac,
Dave Love's avatar
Dave Love committed
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
    ;; given that we do `dnl'?
    ("changequote" . font-lock-keyword-face)))

(defvar autoconf-mode-syntax-table
  (let ((table (make-syntax-table)))
    (modify-syntax-entry ?\" "." table)
    (modify-syntax-entry ?\n ">" table)
    (modify-syntax-entry ?# "<" table)
    table))

(defvar autoconf-imenu-generic-expression
  (list (list nil autoconf-definition-regexp 3)))

;; It's not clear how best to implement this.
(defun autoconf-current-defun-function ()
  "Function to use for `add-log-current-defun-function' in Autoconf mode.
This version looks back for an AC_DEFINE or AC_SUBST.  It will stop
searching backwards at another AC_... command."
  (save-excursion
72
    (with-syntax-table (copy-syntax-table autoconf-mode-syntax-table)
Dave Love's avatar
Dave Love committed
73 74 75 76 77 78 79
      (modify-syntax-entry ?_ "w")
      (if (re-search-backward autoconf-definition-regexp
			      (save-excursion (beginning-of-defun) (point))
			      t)
	  (match-string-no-properties 3)))))

;;;###autoload
80
(define-derived-mode autoconf-mode prog-mode "Autoconf"
81
  "Major mode for editing Autoconf configure.ac files."
Dave Love's avatar
Dave Love committed
82 83 84 85
  (set (make-local-variable 'parens-require-spaces) nil) ; for M4 arg lists
  (set (make-local-variable 'defun-prompt-regexp)
       "^[ \t]*A[CM]_\\(\\sw\\|\\s_\\)+")
  (set (make-local-variable 'comment-start) "dnl ")
86 87
  (set (make-local-variable 'comment-start-skip)
       "\\(?:\\(\\W\\|\\`\\)dnl\\|#\\) +")
88 89
  (set (make-local-variable 'syntax-propertize-function)
       (syntax-propertize-rules ("\\<dnl\\>" (0 "<"))))
Dave Love's avatar
Dave Love committed
90 91 92 93 94 95 96
  (set (make-local-variable 'font-lock-defaults)
       `(autoconf-font-lock-keywords nil nil (("_" . "w"))))
  (set (make-local-variable 'imenu-generic-expression)
       autoconf-imenu-generic-expression)
  (set (make-local-variable 'imenu-syntax-alist) '(("_" . "w")))
  (set (make-local-variable 'indent-line-function) #'indent-relative)
  (set (make-local-variable 'add-log-current-defun-function)
97
	#'autoconf-current-defun-function))
Dave Love's avatar
Dave Love committed
98 99

(provide 'autoconf-mode)
100
(provide 'autoconf)
Dave Love's avatar
Dave Love committed
101 102

;;; autoconf.el ends here