;;; autoconf.el --- mode for editing Autoconf configure.ac files ;; Copyright (C) 2000-2017 Free Software Foundation, Inc. ;; Author: Dave Love ;; Keywords: languages ;; This file is part of GNU Emacs. ;; GNU Emacs is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; (at your option) any later version. ;; 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 ;; along with GNU Emacs. If not, see . ;;; Commentary: ;; Provides fairly minimal font-lock, imenu and indentation support ;; for editing configure.ac files. Only Autoconf syntax is processed. ;; There is no attempt to deal with shell text -- probably that will ;; always lose. ;; This is specialized for configure.ac files. It doesn't inherit the ;; general M4 stuff from M4 mode. ;; There is also an autoconf-mode.el in existence. That appears to be ;; for editing the Autoconf M4 source, rather than configure.ac files. ;;; Code: (require 'info-look) (defvar autoconf-mode-map (make-sparse-keymap)) (defvar autoconf-mode-hook nil "Hook run by `autoconf-mode'.") (defconst autoconf-definition-regexp "A\\(?:H_TEMPLATE\\|C_\\(?:SUBST\\|DEFINE\\(?:_UNQUOTED\\)?\\)\\)(\\[*\\(\\(?:\\sw\\|\\s_\\)+\\)\\]*") (defvar autoconf-font-lock-keywords `(("\\_" table) (modify-syntax-entry ?# "<" table) table)) (defvar autoconf-imenu-generic-expression (list (list nil autoconf-definition-regexp 1))) ;; 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 (skip-syntax-forward "w_" (line-end-position)) (if (re-search-backward autoconf-definition-regexp (save-excursion (beginning-of-defun) (point)) t) (match-string-no-properties 1)))) (info-lookup-maybe-add-help :mode 'autoconf-mode :regexp "A[CM]_[_A-Z0-9]+" :doc-spec '(;; Autoconf Macro Index entries are without an "AC_" prefix, ;; but with "AH_" or "AU_" for those. So add "AC_" if there ;; isn't already an "A._". ("(autoconf)Autoconf Macro Index" (lambda (item) (if (string-match "^A._" item) item (concat "AC_" item))) "^[ \t]+-+ \\(Macro\\|Variable\\): .*\\<" "\\>") ;; M4 Macro Index entries are without "AS_" prefixes, and ;; mostly without "m4_" prefixes. "dnl" is an exception, not ;; wanting any prefix. So AS_ is added back to upper-case ;; names (if needed), m4_ to others which don't already an m4_. ("(autoconf)M4 Macro Index" (lambda (item) (let ((case-fold-search nil)) (cond ((or (string-equal item "dnl") (string-match "^m4_" item) ;; Autoconf 2.62 index includes some macros ;; (e.g., AS_HELP_STRING), so avoid prefixing. (string-match "^AS_" item)) item) ((string-match "^[A-Z0-9_]+$" item) (concat "AS_" item)) (t (concat "m4_" item))))) "^[ \t]+-+ Macro: .*\\<" "\\>") ;; Autotest Macro Index entries are without "AT_". ("(autoconf)Autotest Macro Index" "AT_" "^[ \t]+-+ Macro: .*\\<" "\\>") ;; This is for older versions (probably pre autoconf 2.5x): ("(autoconf)Macro Index" "AC_" "^[ \t]+-+ \\(Macro\\|Variable\\): .*\\<" "\\>") ;; Automake has index entries for its notes on various autoconf ;; macros (eg. AC_PROG_CC). Ensure this is after the autoconf ;; index, so as to prefer the autoconf docs. ("(automake)Macro and Variable Index" nil "^[ \t]*['`‘]" "['’]")) ;; Autoconf symbols are M4 macros. Thus use M4's parser. :parse-rule 'ignore :other-modes '(m4-mode)) ;;;###autoload (define-derived-mode autoconf-mode prog-mode "Autoconf" "Major mode for editing Autoconf configure.ac files." (setq-local parens-require-spaces nil) ; for M4 arg lists (setq-local defun-prompt-regexp "^[ \t]*A[CM]_\\(\\sw\\|\\s_\\)+") (setq-local comment-start "dnl ") ;; We want to avoid matching "dnl" in other text. (setq-local comment-start-skip "\\(?:\\(\\W\\|^\\)dnl\\|#\\) +") (setq-local syntax-propertize-function (syntax-propertize-rules ("\\" (0 "<")))) (setq-local font-lock-defaults `(autoconf-font-lock-keywords nil nil)) (setq-local imenu-generic-expression autoconf-imenu-generic-expression) (setq-local indent-line-function #'indent-relative) (setq-local add-log-current-defun-function #'autoconf-current-defun-function)) (provide 'autoconf-mode) (provide 'autoconf) ;;; autoconf.el ends here