25 |
|
|
26 |
;;; Commentary: |
;;; Commentary: |
27 |
|
|
28 |
;; A smart editing mode for m4 macro definitions. It seems to have most of the |
;; A smart editing mode for m4 macro definitions. It seems to have most of the |
29 |
;; syntax right (sexp motion commands work, but function motion commands don't). |
;; syntax right (sexp motion commands work, but function motion commands don't). |
30 |
;; It also sets the font-lock syntax stuff for colorization |
;; It also sets the font-lock syntax stuff for colorization |
31 |
|
|
34 |
;; * want to make m4-m4-(buffer|region) look sorta like M-x compile look&feel ? |
;; * want to make m4-m4-(buffer|region) look sorta like M-x compile look&feel ? |
35 |
;; * sexp motion commands don't seem to work right |
;; * sexp motion commands don't seem to work right |
36 |
|
|
37 |
;;; Thanks: |
;;; Thanks: |
38 |
;;; to Akim Demaille and Terry Jones for the bug reports |
;;; to Akim Demaille and Terry Jones for the bug reports |
39 |
;;; to Simon Marshall for the regexp tip |
;;; to Simon Marshall for the regexp tip |
40 |
;;; to Martin Buchholz for some general fixes |
;;; to Martin Buchholz for some general fixes |
46 |
:prefix "m4-" |
:prefix "m4-" |
47 |
:group 'languages) |
:group 'languages) |
48 |
|
|
49 |
(defcustom m4-program |
(defcustom m4-program |
50 |
(cond |
(cond |
51 |
((file-exists-p "/usr/local/bin/m4") "/usr/local/bin/m4") |
((file-exists-p "/usr/local/bin/m4") "/usr/local/bin/m4") |
52 |
((file-exists-p "/usr/bin/m4") "/usr/bin/m4") |
((file-exists-p "/usr/bin/m4") "/usr/bin/m4") |
53 |
((file-exists-p "/bin/m4") "/bin/m4") |
((file-exists-p "/bin/m4") "/bin/m4") |
77 |
("\\\$\\\@" . font-lock-variable-name-face) |
("\\\$\\\@" . font-lock-variable-name-face) |
78 |
("\\\$\\\*" . font-lock-variable-name-face) |
("\\\$\\\*" . font-lock-variable-name-face) |
79 |
("\\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\\(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) |
80 |
("\\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) |
("\\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)) |
81 |
"Default font-lock-keywords for m4 mode.") |
"Default font-lock-keywords for `m4 mode'.") |
|
) |
|
82 |
|
|
83 |
(defcustom m4-mode-hook nil |
(defcustom m4-mode-hook nil |
84 |
"*Hook called by `m4-mode'." |
"*Hook called by `m4-mode'." |
87 |
|
|
88 |
;;this may still need some work |
;;this may still need some work |
89 |
(defvar m4-mode-syntax-table nil |
(defvar m4-mode-syntax-table nil |
90 |
"syntax table used in m4 mode") |
"Syntax table used while in `m4-mode'.") |
91 |
(setq m4-mode-syntax-table (make-syntax-table)) |
(setq m4-mode-syntax-table (make-syntax-table)) |
92 |
(modify-syntax-entry ?` "('" m4-mode-syntax-table) |
(modify-syntax-entry ?` "('" m4-mode-syntax-table) |
93 |
(modify-syntax-entry ?' ")`" m4-mode-syntax-table) |
(modify-syntax-entry ?' ")`" m4-mode-syntax-table) |
108 |
map)) |
map)) |
109 |
|
|
110 |
(defvar m4-mode-abbrev-table nil |
(defvar m4-mode-abbrev-table nil |
111 |
"Abbrev table used while in text mode.") |
"Abbrev table used while in `m4-mode'.") |
112 |
|
|
113 |
(unless m4-mode-abbrev-table |
(unless m4-mode-abbrev-table |
114 |
(define-abbrev-table 'm4-mode-abbrev-table ())) |
(define-abbrev-table 'm4-mode-abbrev-table ())) |
115 |
|
|
116 |
(defun m4-m4-buffer () |
(defun m4-m4-buffer () |
117 |
"send contents of the current buffer to m4" |
"Send contents of the current buffer to m4." |
118 |
(interactive) |
(interactive) |
119 |
(shell-command-on-region (point-min) (point-max) m4-program "*m4-output*" |
(shell-command-on-region (point-min) (point-max) m4-program "*m4-output*" |
120 |
nil) |
nil) |
121 |
(switch-to-buffer-other-window "*m4-output*")) |
(switch-to-buffer-other-window "*m4-output*")) |
122 |
|
|
123 |
(defun m4-m4-region () |
(defun m4-m4-region () |
124 |
"send contents of the current region to m4" |
"Send contents of the current region to m4." |
125 |
(interactive) |
(interactive) |
126 |
(shell-command-on-region (point) (mark) m4-program "*m4-output*" nil) |
(shell-command-on-region (point) (mark) m4-program "*m4-output*" nil) |
127 |
(switch-to-buffer-other-window "*m4-output*")) |
(switch-to-buffer-other-window "*m4-output*")) |
141 |
(setq parse-sexp-ignore-comments t) |
(setq parse-sexp-ignore-comments t) |
142 |
(setq local-abbrev-table m4-mode-abbrev-table) |
(setq local-abbrev-table m4-mode-abbrev-table) |
143 |
|
|
144 |
(make-local-variable 'font-lock-defaults) |
(make-local-variable 'font-lock-defaults) |
145 |
(setq major-mode 'm4-mode |
(setq major-mode 'm4-mode |
146 |
mode-name "m4" |
mode-name "m4" |
147 |
font-lock-defaults '(m4-font-lock-keywords nil) |
font-lock-defaults '(m4-font-lock-keywords nil) |
154 |
;(char-to-string (char-syntax ?`)) |
;(char-to-string (char-syntax ?`)) |
155 |
|
|
156 |
;;;how I generate the nasty looking regexps at the top |
;;;how I generate the nasty looking regexps at the top |
157 |
;;;(make-regexp '("builtin" "changecom" "changequote" "changeword" "debugfile" |
;;;(make-regexp '("builtin" "changecom" "changequote" "changeword" "debugfile" |
158 |
;;; "debugmode" "decr" "define" "defn" "divert" "divnum" "dnl" |
;;; "debugmode" "decr" "define" "defn" "divert" "divnum" "dnl" |
159 |
;;; "dumpdef" "errprint" "esyscmd" "eval" "file" "format" "gnu" |
;;; "dumpdef" "errprint" "esyscmd" "eval" "file" "format" "gnu" |
160 |
;;; "ifdef" "ifelse" "include" "incr" "index" "indir" "len" "line" |
;;; "ifdef" "ifelse" "include" "incr" "index" "indir" "len" "line" |
161 |
;;; "m4exit" "m4wrap" "maketemp" "patsubst" "popdef" "pushdef" "regexp" |
;;; "m4exit" "m4wrap" "maketemp" "patsubst" "popdef" "pushdef" "regexp" |
162 |
;;; "shift" "sinclude" "substr" "syscmd" "sysval" "traceoff" "traceon" |
;;; "shift" "sinclude" "substr" "syscmd" "sysval" "traceoff" "traceon" |
163 |
;;; "translit" "undefine" "undivert" "unix")) |
;;; "translit" "undefine" "undivert" "unix")) |
164 |
;;;(make-regexp '("m4_builtin" "m4_changecom" "m4_changequote" "m4_changeword" |
;;;(make-regexp '("m4_builtin" "m4_changecom" "m4_changequote" "m4_changeword" |
165 |
;;; "m4_debugfile" "m4_debugmode" "m4_decr" "m4_define" "m4_defn" |
;;; "m4_debugfile" "m4_debugmode" "m4_decr" "m4_define" "m4_defn" |
166 |
;;; "m4_divert" "m4_divnum" "m4_dnl" "m4_dumpdef" "m4_errprint" |
;;; "m4_divert" "m4_divnum" "m4_dnl" "m4_dumpdef" "m4_errprint" |
167 |
;;; "m4_esyscmd" "m4_eval" "m4_file" "m4_format" "m4_ifdef" "m4_ifelse" |
;;; "m4_esyscmd" "m4_eval" "m4_file" "m4_format" "m4_ifdef" "m4_ifelse" |
168 |
;;; "m4_include" "m4_incr" "m4_index" "m4_indir" "m4_len" "m4_line" |
;;; "m4_include" "m4_incr" "m4_index" "m4_indir" "m4_len" "m4_line" |
169 |
;;; "m4_m4exit" "m4_m4wrap" "m4_maketemp" "m4_patsubst" "m4_popdef" |
;;; "m4_m4exit" "m4_m4wrap" "m4_maketemp" "m4_patsubst" "m4_popdef" |
170 |
;;; "m4_pushdef" "m4_regexp" "m4_shift" "m4_sinclude" "m4_substr" |
;;; "m4_pushdef" "m4_regexp" "m4_shift" "m4_sinclude" "m4_substr" |
171 |
;;; "m4_syscmd" "m4_sysval" "m4_traceoff" "m4_traceon" "m4_translit" |
;;; "m4_syscmd" "m4_sysval" "m4_traceoff" "m4_traceon" "m4_translit" |
172 |
;;; "m4_m4_undefine" "m4_undivert")) |
;;; "m4_m4_undefine" "m4_undivert")) |
173 |
|
|
174 |
;;; m4-mode.el ends here |
;;; m4-mode.el ends here |