| 1 | ;;; autoconf.el --- mode for editing Autoconf configure.ac files |
| 2 | |
| 3 | ;; Copyright (C) 2000-2014 Free Software Foundation, Inc. |
| 4 | |
| 5 | ;; Author: Dave Love <fx@gnu.org> |
| 6 | ;; Keywords: languages |
| 7 | |
| 8 | ;; This file is part of GNU Emacs. |
| 9 | |
| 10 | ;; GNU Emacs is free software: you can redistribute it and/or modify |
| 11 | ;; it under the terms of the GNU General Public License as published by |
| 12 | ;; the Free Software Foundation, either version 3 of the License, or |
| 13 | ;; (at your option) any later version. |
| 14 | |
| 15 | ;; GNU Emacs is distributed in the hope that it will be useful, |
| 16 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 17 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 18 | ;; GNU General Public License for more details. |
| 19 | |
| 20 | ;; 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/>. |
| 22 | |
| 23 | ;;; Commentary: |
| 24 | |
| 25 | ;; Provides fairly minimal font-lock, imenu and indentation support |
| 26 | ;; for editing configure.ac files. Only Autoconf syntax is processed. |
| 27 | ;; There is no attempt to deal with shell text -- probably that will |
| 28 | ;; always lose. |
| 29 | |
| 30 | ;; This is specialized for configure.ac files. It doesn't inherit the |
| 31 | ;; general M4 stuff from M4 mode. |
| 32 | |
| 33 | ;; 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. |
| 35 | |
| 36 | ;;; Code: |
| 37 | |
| 38 | (defvar autoconf-mode-map (make-sparse-keymap)) |
| 39 | |
| 40 | (defvar autoconf-mode-hook nil |
| 41 | "Hook run by `autoconf-mode'.") |
| 42 | |
| 43 | (defconst autoconf-definition-regexp |
| 44 | "A\\(?:H_TEMPLATE\\|C_\\(?:SUBST\\|DEFINE\\(?:_UNQUOTED\\)?\\)\\)(\\[*\\(\\(?:\\sw\\|\\s_\\)+\\)\\]*") |
| 45 | |
| 46 | (defvar autoconf-font-lock-keywords |
| 47 | `(("\\_<A[CHMS]_\\(?:\\sw\\|\\s_\\)+" . font-lock-keyword-face) |
| 48 | (,autoconf-definition-regexp |
| 49 | 1 font-lock-function-name-face) |
| 50 | ;; Are any other M4 keywords really appropriate for configure.ac, |
| 51 | ;; given that we do `dnl'? |
| 52 | ("changequote" . font-lock-keyword-face))) |
| 53 | |
| 54 | (defvar autoconf-mode-syntax-table |
| 55 | (let ((table (make-syntax-table))) |
| 56 | (modify-syntax-entry ?\" "." table) |
| 57 | (modify-syntax-entry ?\n ">" table) |
| 58 | (modify-syntax-entry ?# "<" table) |
| 59 | table)) |
| 60 | |
| 61 | (defvar autoconf-imenu-generic-expression |
| 62 | (list (list nil autoconf-definition-regexp 1))) |
| 63 | |
| 64 | ;; It's not clear how best to implement this. |
| 65 | (defun autoconf-current-defun-function () |
| 66 | "Function to use for `add-log-current-defun-function' in Autoconf mode. |
| 67 | This version looks back for an AC_DEFINE or AC_SUBST. It will stop |
| 68 | searching backwards at another AC_... command." |
| 69 | (save-excursion |
| 70 | (skip-syntax-forward "w_" (line-end-position)) |
| 71 | (if (re-search-backward autoconf-definition-regexp |
| 72 | (save-excursion (beginning-of-defun) (point)) |
| 73 | t) |
| 74 | (match-string-no-properties 1)))) |
| 75 | |
| 76 | ;;;###autoload |
| 77 | (define-derived-mode autoconf-mode prog-mode "Autoconf" |
| 78 | "Major mode for editing Autoconf configure.ac files." |
| 79 | (setq-local parens-require-spaces nil) ; for M4 arg lists |
| 80 | (setq-local defun-prompt-regexp "^[ \t]*A[CM]_\\(\\sw\\|\\s_\\)+") |
| 81 | (setq-local comment-start "dnl ") |
| 82 | ;; We want to avoid matching "dnl" in other text. |
| 83 | (setq-local comment-start-skip "\\(?:\\(\\W\\|^\\)dnl\\|#\\) +") |
| 84 | (setq-local syntax-propertize-function |
| 85 | (syntax-propertize-rules ("\\<dnl\\>" (0 "<")))) |
| 86 | (setq-local font-lock-defaults |
| 87 | `(autoconf-font-lock-keywords nil nil)) |
| 88 | (setq-local imenu-generic-expression autoconf-imenu-generic-expression) |
| 89 | (setq-local indent-line-function #'indent-relative) |
| 90 | (setq-local add-log-current-defun-function |
| 91 | #'autoconf-current-defun-function)) |
| 92 | |
| 93 | (provide 'autoconf-mode) |
| 94 | (provide 'autoconf) |
| 95 | |
| 96 | ;;; autoconf.el ends here |