diff options
| -rw-r--r-- | lisp/progmodes/autoconf.el | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/lisp/progmodes/autoconf.el b/lisp/progmodes/autoconf.el new file mode 100644 index 00000000000..a90e9766d61 --- /dev/null +++ b/lisp/progmodes/autoconf.el | |||
| @@ -0,0 +1,111 @@ | |||
| 1 | ;;; autoconf.el --- Mode for editing Autoconf configure.in files. | ||
| 2 | |||
| 3 | ;; Copyright (C) 2000 Free Software Foundation, Inc. | ||
| 4 | |||
| 5 | ;; Author: Dave Love <fx@gnu.org> | ||
| 6 | ;; Keywords: languages | ||
| 7 | ;; $Revision: $ | ||
| 8 | |||
| 9 | ;; This file is part of GNU Emacs. | ||
| 10 | |||
| 11 | ;; GNU Emacs is free software; you can redistribute it and/or modify | ||
| 12 | ;; it under the terms of the GNU General Public License as published by | ||
| 13 | ;; the Free Software Foundation; either version 2, or (at your option) | ||
| 14 | ;; any later version. | ||
| 15 | |||
| 16 | ;; GNU Emacs is distributed in the hope that it will be useful, | ||
| 17 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 18 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 19 | ;; GNU General Public License for more details. | ||
| 20 | |||
| 21 | ;; You should have received a copy of the GNU General Public License | ||
| 22 | ;; along with GNU Emacs; see the file COPYING. If not, write to the | ||
| 23 | ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, | ||
| 24 | ;; Boston, MA 02111-1307, USA. | ||
| 25 | |||
| 26 | ;;; Commentary: | ||
| 27 | |||
| 28 | ;; Provides fairly minimal font-lock, imenu and indentation support | ||
| 29 | ;; for editing configure.in files. Only Autoconf syntax is processed. | ||
| 30 | ;; There is no attempt to deal with shell text -- probably that will | ||
| 31 | ;; always lose. | ||
| 32 | |||
| 33 | ;; This is specialized for configure.in files. It doesn't inherit the | ||
| 34 | ;; general M4 stuff from M4 mode. | ||
| 35 | |||
| 36 | ;; There is also an autoconf-mode.el in existence. That appears to be | ||
| 37 | ;; for editing the Autoconf M4 source, rather than configure.in files. | ||
| 38 | |||
| 39 | ;;; Code: | ||
| 40 | |||
| 41 | (defvar autoconf-mode-map (make-sparse-keymap)) | ||
| 42 | |||
| 43 | (defvar autoconf-mode-hook nil | ||
| 44 | "Hook run by `autoconf-mode'.") | ||
| 45 | |||
| 46 | (defconst autoconf-font-lock-syntactic-keywords | ||
| 47 | '(("\\<dnl\\>" 0 '(11)))) | ||
| 48 | |||
| 49 | (defconst autoconf-definition-regexp | ||
| 50 | "AC_\\(SUBST\\|DEFINE\\(_UNQUOTED\\)?\\)(\\(\\sw+\\)") | ||
| 51 | |||
| 52 | (defvar autoconf-font-lock-keywords | ||
| 53 | `(("A[CM]_\\sw+" . font-lock-keyword-face) | ||
| 54 | (,autoconf-definition-regexp | ||
| 55 | 3 font-lock-function-name-face) | ||
| 56 | ;; Are any other M4 keywords really appropriate for configure.in, | ||
| 57 | ;; given that we do `dnl'? | ||
| 58 | ("changequote" . font-lock-keyword-face))) | ||
| 59 | |||
| 60 | (defvar autoconf-mode-syntax-table | ||
| 61 | (let ((table (make-syntax-table))) | ||
| 62 | (modify-syntax-entry ?\" "." table) | ||
| 63 | (modify-syntax-entry ?\n ">" table) | ||
| 64 | (modify-syntax-entry ?# "<" table) | ||
| 65 | table)) | ||
| 66 | |||
| 67 | (defvar autoconf-imenu-generic-expression | ||
| 68 | (list (list nil autoconf-definition-regexp 3))) | ||
| 69 | |||
| 70 | ;; It's not clear how best to implement this. | ||
| 71 | (defun autoconf-current-defun-function () | ||
| 72 | "Function to use for `add-log-current-defun-function' in Autoconf mode. | ||
| 73 | This version looks back for an AC_DEFINE or AC_SUBST. It will stop | ||
| 74 | searching backwards at another AC_... command." | ||
| 75 | (save-excursion | ||
| 76 | (with-syntax-table autoconf-mode-syntax-table | ||
| 77 | (modify-syntax-entry ?_ "w") | ||
| 78 | (if (re-search-backward autoconf-definition-regexp | ||
| 79 | (save-excursion (beginning-of-defun) (point)) | ||
| 80 | t) | ||
| 81 | (match-string-no-properties 3))))) | ||
| 82 | |||
| 83 | ;;;###autoload | ||
| 84 | (defun autoconf-mode () | ||
| 85 | "Major mode for editing Autoconf configure.in files." | ||
| 86 | (interactive) | ||
| 87 | (kill-all-local-variables) | ||
| 88 | (use-local-map autoconf-mode-map) | ||
| 89 | (setq major-mode 'autoconf-mode) | ||
| 90 | (setq mode-name "Autoconf") | ||
| 91 | (set-syntax-table autoconf-mode-syntax-table) | ||
| 92 | (set (make-local-variable 'parens-require-spaces) nil) ; for M4 arg lists | ||
| 93 | (set (make-local-variable 'defun-prompt-regexp) | ||
| 94 | "^[ \t]*A[CM]_\\(\\sw\\|\\s_\\)+") | ||
| 95 | (set (make-local-variable 'comment-start) "dnl ") | ||
| 96 | (set (make-local-variable 'comment-start-skip) "\\(\\<dnl\\|#\\) +") | ||
| 97 | (set (make-local-variable 'font-lock-syntactic-keywords) | ||
| 98 | autoconf-font-lock-syntactic-keywords) | ||
| 99 | (set (make-local-variable 'font-lock-defaults) | ||
| 100 | `(autoconf-font-lock-keywords nil nil (("_" . "w")))) | ||
| 101 | (set (make-local-variable 'imenu-generic-expression) | ||
| 102 | autoconf-imenu-generic-expression) | ||
| 103 | (set (make-local-variable 'imenu-syntax-alist) '(("_" . "w"))) | ||
| 104 | (set (make-local-variable 'indent-line-function) #'indent-relative) | ||
| 105 | (set (make-local-variable 'add-log-current-defun-function) | ||
| 106 | #'autoconf-current-defun-function) | ||
| 107 | (run-hooks 'autoconf-mode-hook)) | ||
| 108 | |||
| 109 | (provide 'autoconf-mode) | ||
| 110 | |||
| 111 | ;;; autoconf.el ends here | ||