comparison lisp/progmodes/prolog.el @ 89909:68c22ea6027c

Sync to HEAD
author Kenichi Handa <handa@m17n.org>
date Fri, 16 Apr 2004 12:51:06 +0000
parents 375f2633d815
children f2ebccfa87d4
comparison
equal deleted inserted replaced
89908:ee1402f7b568 89909:68c22ea6027c
1 ;;; prolog.el --- major mode for editing and running Prolog under Emacs 1 ;;; prolog.el --- major mode for editing and running Prolog under Emacs
2 2
3 ;; Copyright (C) 1986, 1987 Free Software Foundation, Inc. 3 ;; Copyright (C) 1986, 1987, 2003, 2004 Free Software Foundation, Inc.
4 4
5 ;; Author: Masanobu UMEDA <umerin@mse.kyutech.ac.jp> 5 ;; Author: Masanobu UMEDA <umerin@mse.kyutech.ac.jp>
6 ;; Keywords: languages 6 ;; Keywords: languages
7 7
8 ;; This file is part of GNU Emacs. 8 ;; This file is part of GNU Emacs.
28 ;; about Prolog syntax and comments, and can send regions to an inferior 28 ;; about Prolog syntax and comments, and can send regions to an inferior
29 ;; Prolog interpreter process. Font locking is tuned towards GNU Prolog. 29 ;; Prolog interpreter process. Font locking is tuned towards GNU Prolog.
30 30
31 ;;; Code: 31 ;;; Code:
32 32
33 (defvar prolog-mode-syntax-table nil)
34 (defvar prolog-mode-abbrev-table nil)
35 (defvar prolog-mode-map nil)
36
37 (defgroup prolog nil 33 (defgroup prolog nil
38 "Major mode for editing and running Prolog under Emacs" 34 "Major mode for editing and running Prolog under Emacs"
39 :group 'languages) 35 :group 'languages)
40 36
41 37
42 (defcustom prolog-program-name "prolog" 38 (defcustom prolog-program-name
39 (let ((names '("prolog" "gprolog")))
40 (while (and names
41 (not (executable-find (car names))))
42 (setq names (cdr names)))
43 (or (car names) "prolog"))
43 "*Program name for invoking an inferior Prolog with `run-prolog'." 44 "*Program name for invoking an inferior Prolog with `run-prolog'."
44 :type 'string 45 :type 'string
45 :group 'prolog) 46 :group 'prolog)
46 47
47 (defcustom prolog-consult-string "reconsult(user).\n" 48 (defcustom prolog-consult-string "reconsult(user).\n"
73 ("^\\(\\sw+\\)\\s-*\\((\\(.+\\))\\)*" 74 ("^\\(\\sw+\\)\\s-*\\((\\(.+\\))\\)*"
74 (1 font-lock-function-name-face) 75 (1 font-lock-function-name-face)
75 (3 font-lock-variable-name-face))) 76 (3 font-lock-variable-name-face)))
76 "Font-lock keywords for Prolog mode.") 77 "Font-lock keywords for Prolog mode.")
77 78
78 (if prolog-mode-syntax-table 79 (defvar prolog-mode-syntax-table
79 ()
80 (let ((table (make-syntax-table))) 80 (let ((table (make-syntax-table)))
81 (modify-syntax-entry ?_ "w" table) 81 (modify-syntax-entry ?_ "w" table)
82 (modify-syntax-entry ?\\ "\\" table) 82 (modify-syntax-entry ?\\ "\\" table)
83 (modify-syntax-entry ?/ ". 14" table) 83 (modify-syntax-entry ?/ ". 14" table)
84 (modify-syntax-entry ?* ". 23" table) 84 (modify-syntax-entry ?* ". 23" table)
88 (modify-syntax-entry ?% "<" table) 88 (modify-syntax-entry ?% "<" table)
89 (modify-syntax-entry ?\n ">" table) 89 (modify-syntax-entry ?\n ">" table)
90 (modify-syntax-entry ?< "." table) 90 (modify-syntax-entry ?< "." table)
91 (modify-syntax-entry ?> "." table) 91 (modify-syntax-entry ?> "." table)
92 (modify-syntax-entry ?\' "\"" table) 92 (modify-syntax-entry ?\' "\"" table)
93 (setq prolog-mode-syntax-table table))) 93 table))
94 94
95 (defvar prolog-mode-abbrev-table nil)
95 (define-abbrev-table 'prolog-mode-abbrev-table ()) 96 (define-abbrev-table 'prolog-mode-abbrev-table ())
96 97
97 (defun prolog-mode-variables () 98 (defun prolog-mode-variables ()
98 (set-syntax-table prolog-mode-syntax-table)
99 (setq local-abbrev-table prolog-mode-abbrev-table)
100 (make-local-variable 'paragraph-start)
101 (setq paragraph-start (concat "%%\\|$\\|" page-delimiter)) ;'%%..'
102 (make-local-variable 'paragraph-separate) 99 (make-local-variable 'paragraph-separate)
103 (setq paragraph-separate paragraph-start) 100 (setq paragraph-separate (concat "%%\\|$\\|" page-delimiter)) ;'%%..'
104 (make-local-variable 'paragraph-ignore-fill-prefix) 101 (make-local-variable 'paragraph-ignore-fill-prefix)
105 (setq paragraph-ignore-fill-prefix t) 102 (setq paragraph-ignore-fill-prefix t)
106 (make-local-variable 'imenu-generic-expression) 103 (make-local-variable 'imenu-generic-expression)
107 (setq imenu-generic-expression "^[a-z][a-zA-Z0-9_]+") 104 (setq imenu-generic-expression "^[a-z][a-zA-Z0-9_]+")
108 (make-local-variable 'indent-line-function) 105 (make-local-variable 'indent-line-function)
109 (setq indent-line-function 'prolog-indent-line) 106 (setq indent-line-function 'prolog-indent-line)
110 (make-local-variable 'comment-start) 107 (make-local-variable 'comment-start)
111 (setq comment-start "%") 108 (setq comment-start "%")
112 (make-local-variable 'comment-start-skip) 109 (make-local-variable 'comment-start-skip)
113 (setq comment-start-skip "%+ *") 110 (setq comment-start-skip "\\(?:%+\\|/\\*+\\)[ \t]*")
111 (make-local-variable 'comment-end-skip)
112 (setq comment-end-skip "[ \t]*\\(\n\\|\\*+/\\)")
114 (make-local-variable 'comment-column) 113 (make-local-variable 'comment-column)
115 (setq comment-column 48) 114 (setq comment-column 48))
116 (make-local-variable 'comment-indent-function) 115
117 (setq comment-indent-function 'prolog-comment-indent)) 116 (defvar prolog-mode-map
118 117 (let ((map (make-sparse-keymap)))
119 (defun prolog-mode-commands (map) 118 (define-key map "\e\C-x" 'prolog-consult-region)
120 (define-key map "\t" 'prolog-indent-line) 119 map))
121 (define-key map "\e\C-x" 'prolog-consult-region))
122
123 (if prolog-mode-map
124 nil
125 (setq prolog-mode-map (make-sparse-keymap))
126 (prolog-mode-commands prolog-mode-map))
127 120
128 ;;;###autoload 121 ;;;###autoload
129 (defun prolog-mode () 122 (defun prolog-mode ()
130 "Major mode for editing Prolog code for Prologs. 123 "Major mode for editing Prolog code for Prologs.
131 Blank lines and `%%...' separate paragraphs. `%'s start comments. 124 Blank lines and `%%...' separate paragraphs. `%'s start comments.
134 Entry to this mode calls the value of `prolog-mode-hook' 127 Entry to this mode calls the value of `prolog-mode-hook'
135 if that value is non-nil." 128 if that value is non-nil."
136 (interactive) 129 (interactive)
137 (kill-all-local-variables) 130 (kill-all-local-variables)
138 (use-local-map prolog-mode-map) 131 (use-local-map prolog-mode-map)
132 (set-syntax-table prolog-mode-syntax-table)
139 (setq major-mode 'prolog-mode) 133 (setq major-mode 'prolog-mode)
140 (setq mode-name "Prolog") 134 (setq mode-name "Prolog")
141 (prolog-mode-variables) 135 (prolog-mode-variables)
142 ;; font lock 136 ;; font lock
143 (setq font-lock-defaults '(prolog-font-lock-keywords 137 (setq font-lock-defaults '(prolog-font-lock-keywords
144 nil nil nil 138 nil nil nil
145 beginning-of-line)) 139 beginning-of-line))
146 (run-hooks 'prolog-mode-hook)) 140 (run-mode-hooks 'prolog-mode-hook))
147 141
148 (defun prolog-indent-line (&optional whole-exp) 142 (defun prolog-indent-line (&optional whole-exp)
149 "Indent current line as Prolog code. 143 "Indent current line as Prolog code.
150 With argument, indent any additional lines of the same clause 144 With argument, indent any additional lines of the same clause
151 rigidly along with this one (not yet)." 145 rigidly along with this one (not yet)."
215 (beginning-of-line 1) 209 (beginning-of-line 1)
216 (let* ((eolpos (save-excursion (end-of-line) (point)))) 210 (let* ((eolpos (save-excursion (end-of-line) (point))))
217 (if (re-search-forward comment-start-skip eolpos 'move) 211 (if (re-search-forward comment-start-skip eolpos 'move)
218 (goto-char (match-beginning 0))) 212 (goto-char (match-beginning 0)))
219 (skip-chars-backward " \t"))) 213 (skip-chars-backward " \t")))
220
221 (defun prolog-comment-indent ()
222 "Compute prolog comment indentation."
223 (cond ((looking-at "%%%") 0)
224 ((looking-at "%%") (prolog-indent-level))
225 (t
226 (save-excursion
227 (skip-chars-backward " \t")
228 ;; Insert one space at least, except at left margin.
229 (max (+ (current-column) (if (bolp) 0 1))
230 comment-column)))
231 ))
232
233 214
234 ;;; 215 ;;;
235 ;;; Inferior prolog mode 216 ;;; Inferior prolog mode
236 ;;; 217 ;;;
237 (defvar inferior-prolog-mode-map nil) 218 (defvar inferior-prolog-mode-map
238 219 (let ((map (make-sparse-keymap)))
239 (defun inferior-prolog-mode () 220 ;; This map will inherit from `comint-mode-map' when entering
221 ;; inferior-prolog-mode.
222 map))
223
224 (defvar inferior-prolog-mode-syntax-table prolog-mode-syntax-table)
225 (defvar inferior-prolog-mode-abbrev-table prolog-mode-abbrev-table)
226
227 (define-derived-mode inferior-prolog-mode comint-mode "Inferior Prolog"
240 "Major mode for interacting with an inferior Prolog process. 228 "Major mode for interacting with an inferior Prolog process.
241 229
242 The following commands are available: 230 The following commands are available:
243 \\{inferior-prolog-mode-map} 231 \\{inferior-prolog-mode-map}
244 232
258 Return at end of buffer sends line as input. 246 Return at end of buffer sends line as input.
259 Return not at end copies rest of line to end and sends it. 247 Return not at end copies rest of line to end and sends it.
260 \\[comint-kill-input] and \\[backward-kill-word] are kill commands, imitating normal Unix input editing. 248 \\[comint-kill-input] and \\[backward-kill-word] are kill commands, imitating normal Unix input editing.
261 \\[comint-interrupt-subjob] interrupts the shell or its current subjob if any. 249 \\[comint-interrupt-subjob] interrupts the shell or its current subjob if any.
262 \\[comint-stop-subjob] stops. \\[comint-quit-subjob] sends quit signal." 250 \\[comint-stop-subjob] stops. \\[comint-quit-subjob] sends quit signal."
263 (interactive) 251 (setq comint-prompt-regexp "^| [ ?][- ] *")
264 (require 'comint) 252 (prolog-mode-variables))
265 (comint-mode)
266 (setq major-mode 'inferior-prolog-mode
267 mode-name "Inferior Prolog"
268 comint-prompt-regexp "^| [ ?][- ] *")
269 (prolog-mode-variables)
270 (if inferior-prolog-mode-map nil
271 (setq inferior-prolog-mode-map (copy-keymap comint-mode-map))
272 (prolog-mode-commands inferior-prolog-mode-map))
273 (use-local-map inferior-prolog-mode-map)
274 (run-hooks 'prolog-mode-hook))
275 253
276 ;;;###autoload 254 ;;;###autoload
277 (defun run-prolog () 255 (defun run-prolog ()
278 "Run an inferior Prolog process, input and output via buffer *prolog*." 256 "Run an inferior Prolog process, input and output via buffer *prolog*."
279 (interactive) 257 (interactive)
280 (require 'comint) 258 (require 'comint)
281 (switch-to-buffer (make-comint "prolog" prolog-program-name)) 259 (pop-to-buffer (make-comint "prolog" prolog-program-name))
282 (inferior-prolog-mode)) 260 (inferior-prolog-mode))
283 261
284 (defun prolog-consult-region (compile beg end) 262 (defun prolog-consult-region (compile beg end)
285 "Send the region to the Prolog process made by \"M-x run-prolog\". 263 "Send the region to the Prolog process made by \"M-x run-prolog\".
286 If COMPILE (prefix arg) is not nil, use compile mode rather than consult mode." 264 If COMPILE (prefix arg) is not nil, use compile mode rather than consult mode."
302 (prolog-consult-region compile beg end) 280 (prolog-consult-region compile beg end)
303 (switch-to-buffer "*prolog*")) 281 (switch-to-buffer "*prolog*"))
304 282
305 (provide 'prolog) 283 (provide 'prolog)
306 284
285 ;;; arch-tag: f3ec6748-1272-4ab6-8826-c50cb1607636
307 ;;; prolog.el ends here 286 ;;; prolog.el ends here