;;; m4-mode.el --- m4 code editing commands for Emacs
-;; Copyright (C) 1996-1997, 2001-2012 Free Software Foundation, Inc.
+;; Copyright (C) 1996-1997, 2001-2014 Free Software Foundation, Inc.
;; Author: Andrew Csillag <drew_csillag@geocities.com>
;; Maintainer: Andrew Csillag <drew_csillag@geocities.com>
:prefix "m4-"
:group 'languages)
-(defcustom m4-program
- (cond
- ((file-exists-p "/usr/local/bin/m4") "/usr/local/bin/m4")
- ((file-exists-p "/usr/bin/m4") "/usr/bin/m4")
- ((file-exists-p "/bin/m4") "/bin/m4")
- ((file-exists-p "/usr/ccs/bin/m4") "/usr/ccs/bin/m4")
- ( t "m4")
- )
- "File name of the m4 executable."
+(defcustom m4-program "m4"
+ "File name of the m4 executable.
+If m4 is not in your PATH, set this to an absolute file name."
+ :version "24.4"
:type 'file
:group 'm4)
:group 'm4)
;;this may still need some work
-(defvar m4-mode-syntax-table nil
+(defvar m4-mode-syntax-table
+ (let ((table (make-syntax-table)))
+ (modify-syntax-entry ?` "('" table)
+ (modify-syntax-entry ?' ")`" table)
+ (modify-syntax-entry ?# "<\n" table)
+ (modify-syntax-entry ?\n ">#" table)
+ (modify-syntax-entry ?{ "_" table)
+ (modify-syntax-entry ?} "_" table)
+ ;; FIXME: This symbol syntax for underscore looks OK on its own, but it's
+ ;; odd that it should have the same syntax as { and } are these really
+ ;; valid in m4 symbols?
+ (modify-syntax-entry ?_ "_" table)
+ ;; FIXME: These three chars with word syntax look wrong.
+ (modify-syntax-entry ?* "w" table)
+ (modify-syntax-entry ?\" "w" table)
+ (modify-syntax-entry ?\" "w" table)
+ table)
"Syntax table used while in `m4-mode'.")
-(setq m4-mode-syntax-table (make-syntax-table))
-(modify-syntax-entry ?` "('" m4-mode-syntax-table)
-(modify-syntax-entry ?' ")`" m4-mode-syntax-table)
-(modify-syntax-entry ?# "<\n" m4-mode-syntax-table)
-(modify-syntax-entry ?\n ">#" m4-mode-syntax-table)
-(modify-syntax-entry ?{ "_" m4-mode-syntax-table)
-(modify-syntax-entry ?} "_" m4-mode-syntax-table)
-(modify-syntax-entry ?* "w" m4-mode-syntax-table)
-(modify-syntax-entry ?_ "w" m4-mode-syntax-table)
-(modify-syntax-entry ?\" "w" m4-mode-syntax-table)
-(modify-syntax-entry ?\" "w" m4-mode-syntax-table)
(defvar m4-mode-map
(let ((map (make-sparse-keymap))
:help "Send contents of the current region to m4"))
map))
-(defvar m4-mode-abbrev-table nil
- "Abbrev table used while in `m4-mode'.")
-
-(unless m4-mode-abbrev-table
- (define-abbrev-table 'm4-mode-abbrev-table ()))
-
(defun m4-m4-buffer ()
"Send contents of the current buffer to m4."
(interactive)
"*m4-output*" nil)
(switch-to-buffer-other-window "*m4-output*"))
+(defun m4-current-defun-name ()
+ "Return the name of the M4 function at point, or nil."
+ (save-excursion
+ (if (re-search-backward
+ "^\\(\\(m4_\\)?define\\|A._DEFUN\\)(\\[?\\([A-Za-z0-9_]+\\)" nil t)
+ (match-string-no-properties 3))))
+
;;;###autoload
(define-derived-mode m4-mode prog-mode "m4"
"A major mode to edit m4 macro files."
- :abbrev-table m4-mode-abbrev-table
- (set (make-local-variable 'comment-start) "#")
- (set (make-local-variable 'parse-sexp-ignore-comments) t)
- (set (make-local-variable 'font-lock-defaults) '(m4-font-lock-keywords nil)))
+ (setq-local comment-start "#")
+ (setq-local parse-sexp-ignore-comments t)
+ (setq-local add-log-current-defun-function #'m4-current-defun-name)
+ (setq font-lock-defaults '(m4-font-lock-keywords nil)))
(provide 'm4-mode)
;;stuff to play with for debugging