diff lisp/modes/m4-mode.el @ 149:538048ae2ab8 r20-3b1

Import from CVS: tag r20-3b1
author cvs
date Mon, 13 Aug 2007 09:36:16 +0200
parents 6a378aca36af
children 59463afc5666
line wrap: on
line diff
--- a/lisp/modes/m4-mode.el	Mon Aug 13 09:35:15 2007 +0200
+++ b/lisp/modes/m4-mode.el	Mon Aug 13 09:36:16 2007 +0200
@@ -4,7 +4,7 @@
 ;; Maintainer: Andrew Csillag (drew@staff.prodigy.com)
 ;; Keywords: languages, faces
 
-;; This file is (not yet) part of GNU Emacs.
+;; 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
@@ -28,7 +28,7 @@
 ;; It also sets the font-lock syntax stuff for colorization
 
 ;; By Drew Csillag (drew@staff.prodigy.com)
-;; $Id: m4-mode.el,v 1.2 1997/01/23 05:29:30 steve Exp $
+;; $Id: m4-mode.el,v 1.3 1997/05/18 03:39:57 steve Exp $
 
 ;; History:
 
@@ -47,6 +47,16 @@
 ;;                      fixed syntax table so _define_ isn't keywordified
 ;; 10/29/96 1.8     DC  fixed a problem where comments go fontified incorrectly
 ;;                      if they had quotes in them
+;; 11/21/96 1.9     DC  collapsed 4 regexps into 1 and removed a duplicate,
+;;                      removed a duplicate backslash
+;; 05/16/97 1.10    DC  added contributed fixes and enhancements from 
+;;                      Martin Buchholz
+;;                      Can now specify options to m4 via m4-program-options
+;;                      Now terminates m4 processes when the buffer send
+is 
+;;                      done
+;;                      dnl and m4_dnl recognized as comment starters
+ 
 ;; To Do's:
 
 ;; * want to make m4-m4-(buffer|region) look sorta like M-x compile look&feel ?
@@ -62,26 +72,42 @@
 ;;	 (cons '(".*\\.m4$" . m4-mode)
 ;;	       auto-mode-alist))
 
-
 ;;; Thanks: 
 ;;;         to Akim Demaille and Terry Jones for the bug reports
+;;;         to Simon Marshall for the regexp tip
+;;;         to Martin Buchholz for some general fixes
 
 ;;; Code:
 
 ;;path to the m4 program
-(defvar m4-program "/usr/bin/m4")
+(defvar 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")
+   )
+)
+
+;;options to m4
+(defconst m4-program-options nil)
+;;to use --prefix-builtins, you can use
+;;(defconst m4-program-options '("-P"))
+;;or
+;;(defconst m4-program-options '("--prefix-builtins"))
 
 ;;thank god for make-regexp.el!
 (defvar m4-font-lock-keywords
   `(
-    ("^\\\#.*" . font-lock-comment-face)
-    ("\\\$\\\*" . font-lock-variable-name-face)
-    ("\\\$[0-9]" . font-lock-variable-name-face)
-    ("\\\$\\\#" . font-lock-variable-name-face)
-    ("\\\$\\\@" . font-lock-variable-name-face)
-    ("\\\$\\\*" . font-lock-variable-name-face)
-    ("\\b\\(builtin\\|change\\(com\\|quote\\|word\\)\\|d\\(e\\(bug\\(file\\|mode\\)\\|cr\\|f\\(ine\\|n\\)\\)\\|iv\\(ert\\|num\\)\\|nl\\|umpdef\\)\\|e\\(rrprint\\|syscmd\\|val\\)\\|f\\(ile\\|ormat\\)\\|gnu\\|i\\(f\\(def\\|else\\)\\|n\\(c\\(lude\\|r\\)\\|d\\(ex\\|ir\\)\\)\\)\\|l\\(en\\|ine\\)\\|m\\(4\\(exit\\|wrap\\)\\|aketemp\\)\\|p\\(atsubst\\|opdef\\|ushdef\\)\\|regexp\\|s\\(hift\\|include\\|ubstr\\|ys\\(cmd\\|val\\)\\)\\|tra\\(ceo\\(ff\\|n\\)\\|nslit\\)\\|un\\(d\\(efine\\|ivert\\)\\|ix\\)\\)\\b" . font-lock-keyword-face)
-    ("\\b\\(m4_\\(builtin\\|change\\(com\\|quote\\|word\\)\\|d\\(e\\(bug\\(file\\|mode\\)\\|cr\\|f\\(ine\\|n\\)\\)\\|iv\\(ert\\|num\\)\\|nl\\|umpdef\\)\\|e\\(rrprint\\|syscmd\\|val\\)\\|f\\(ile\\|ormat\\)\\|i\\(f\\(def\\|else\\)\\|n\\(c\\(lude\\|r\\)\\|d\\(ex\\|ir\\)\\)\\)\\|l\\(en\\|ine\\)\\|m\\(4\\(_undefine\\|exit\\|wrap\\)\\|aketemp\\)\\|p\\(atsubst\\|opdef\\|ushdef\\)\\|regexp\\|s\\(hift\\|include\\|ubstr\\|ys\\(cmd\\|val\\)\\)\\|tra\\(ceo\\(ff\\|n\\)\\|nslit\\)\\|undivert\\)\\)\\b" . font-lock-keyword-face)
+    ("\\(\\bdnl\\b\\|\\bm4_dnl\\b\\|^\\#\\).*$" .
+font-lock-comment-face)
+    ("\\$[*#@0-9]" . font-lock-variable-name-face)
+   
+("\\b\\(builtin\\|change\\(com\\|quote\\|word\\)\\|d\\(e\\(bug\\(file\\|mode\\)\\|cr\\|f\\(ine\\|n\\)\\)\\|iv\\(ert\\|num\\)\\|nl\\|umpdef\\)\\|e\\(rrprint\\|syscmd\\|val\\)\\|f\\(ile\\|ormat\\)\\|gnu\\|i\\(f\\(def\\|else\\)\\|n\\(c\\(lude\\|r\\)\\|d\\(ex\\|ir\\)\\)\\)\\|l\\(en\\|ine\\)\\|m\\(4\\(exit\\|wrap\\)\\|aketemp\\)\\|p\\(atsubst\\|opdef\\|ushdef\\)\\|regexp\\|s\\(hift\\|include\\|ubstr\\|ys\\(cmd\\|val\\)\\)\\|tra\\(ceo\\(ff\\|n\\)\\|nslit\\)\\|un\\(d\\(efine\\|ivert\\)\\|ix\\)\\)\\b"
+. font-lock-keyword-face)
+   
+("\\b\\(m4_\\(builtin\\|change\\(com\\|quote\\|word\\)\\|d\\(e\\(bug\\(file\\|mode\\)\\|cr\\|f\\(ine\\|n\\)\\)\\|iv\\(ert\\|num\\)\\|nl\\|umpdef\\)\\|e\\(rrprint\\|syscmd\\|val\\)\\|f\\(ile\\|ormat\\)\\|i\\(f\\(def\\|else\\)\\|n\\(c\\(lude\\|r\\)\\|d\\(ex\\|ir\\)\\)\\)\\|l\\(en\\|ine\\)\\|m\\(4\\(_undefine\\|exit\\|wrap\\)\\|aketemp\\)\\|p\\(atsubst\\|opdef\\|ushdef\\)\\|regexp\\|s\\(hift\\|include\\|ubstr\\|ys\\(cmd\\|val\\)\\)\\|tra\\(ceo\\(ff\\|n\\)\\|nslit\\)\\|undivert\\)\\)\\b"
+. font-lock-keyword-face)
     "default font-lock-keywords")
 )
 
@@ -106,25 +132,38 @@
     (define-key map "\C-c\C-c" 'comment-region)
     map))
 
+(defun m4-end-m4 (process event)
+  (cond ((equal event "kill\n") (princ "m4 process done"))
+	(t (princ
+	    (format "Process: %s had the event `%s'" process event)))))
+
+(defun m4-start-m4 ()
+  (eval (append (append '(start-process "m4process" "*m4 output*"
+m4-program)
+		m4-program-options) '("-e")))
+  (set-process-sentinel (get-process "m4process") 'm4-end-m4)
+)
+
 (defun m4-m4-buffer ()
   "send contents of the current buffer to m4"
   (interactive)
-  (start-process "m4process" "*m4 output*" m4-program "-e")
+  (m4-start-m4)
   (process-send-region "m4process" (point-min) (point-max))
   (process-send-eof "m4process")
-  (switch-to-buffer "*m4 output*")
+  (switch-to-buffer-other-window "*m4 output*")
+  (delete-process "m4process")
 )
 
+
 (defun m4-m4-region ()
   "send contents of the current region to m4"
   (interactive)
-  (start-process "m4process" "*m4 output*" m4-program "-e")
+  (m4-start-m4)
   (process-send-region "m4process" (point) (mark))
   (process-send-eof "m4process")
-  (switch-to-buffer "*m4 output*")
+  (switch-to-buffer-other-window "*m4 output*")
 )
 
-;;;###autoload
 (defun m4-mode ()
   "A major-mode to edit m4 macro files
 \\{m4-mode-map}
@@ -142,7 +181,7 @@
   (make-local-variable	'font-lock-defaults)  
   (setq major-mode 'm4-mode
 	mode-name "m4"
-	font-lock-defaults `(m4-font-lock-keywords nil)
+	font-lock-defaults '(m4-font-lock-keywords nil)
 	)
   (set-syntax-table m4-mode-syntax-table)
   (run-hooks 'm4-mode-hook))