Mercurial > emacs
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 |