|
|
1.1 root 1: ;; Major mode for editing Prolog, and for running Prolog under Emacs
2: ;; Copyright (C) 1986, 1987 Free Software Foundation, Inc.
3: ;; Author Masanobu UMEDA ([email protected])
4:
5: ;; This file is part of GNU Emacs.
6:
7: ;; GNU Emacs is free software; you can redistribute it and/or modify
8: ;; it under the terms of the GNU General Public License as published by
9: ;; the Free Software Foundation; either version 1, or (at your option)
10: ;; any later version.
11:
12: ;; GNU Emacs is distributed in the hope that it will be useful,
13: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
14: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15: ;; GNU General Public License for more details.
16:
17: ;; You should have received a copy of the GNU General Public License
18: ;; along with GNU Emacs; see the file COPYING. If not, write to
19: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
20:
21: (defvar prolog-mode-syntax-table nil)
22: (defvar prolog-mode-abbrev-table nil)
23: (defvar prolog-mode-map nil)
24:
25: (defvar prolog-consult-string "reconsult(user).\n"
26: "*(Re)Consult mode (for C-Prolog and Quintus Prolog). ")
27:
28: (defvar prolog-compile-string "compile(user).\n"
29: "*Compile mode (for Quintus Prolog).")
30:
31: (defvar prolog-eof-string "end_of_file.\n"
32: "*String that represents end of file for prolog.
33: nil means send actual operaing system end of file.")
34:
35: (defvar prolog-indent-width 4)
36:
37: (if prolog-mode-syntax-table
38: ()
39: (let ((table (make-syntax-table)))
40: (modify-syntax-entry ?_ "w" table)
41: (modify-syntax-entry ?\\ "\\" table)
42: (modify-syntax-entry ?/ "." table)
43: (modify-syntax-entry ?* "." table)
44: (modify-syntax-entry ?+ "." table)
45: (modify-syntax-entry ?- "." table)
46: (modify-syntax-entry ?= "." table)
47: (modify-syntax-entry ?% "<" table)
48: (modify-syntax-entry ?< "." table)
49: (modify-syntax-entry ?> "." table)
50: (modify-syntax-entry ?\' "\"" table)
51: (setq prolog-mode-syntax-table table)))
52:
53: (define-abbrev-table 'prolog-mode-abbrev-table ())
54:
55: (defun prolog-mode-variables ()
56: (set-syntax-table prolog-mode-syntax-table)
57: (setq local-abbrev-table prolog-mode-abbrev-table)
58: (make-local-variable 'paragraph-start)
59: (setq paragraph-start (concat "^%%\\|^$\\|" page-delimiter)) ;'%%..'
60: (make-local-variable 'paragraph-separate)
61: (setq paragraph-separate paragraph-start)
62: (make-local-variable 'paragraph-ignore-fill-prefix)
63: (setq paragraph-ignore-fill-prefix t)
64: (make-local-variable 'indent-line-function)
65: (setq indent-line-function 'prolog-indent-line)
66: (make-local-variable 'comment-start)
67: (setq comment-start "%")
68: (make-local-variable 'comment-start-skip)
69: (setq comment-start-skip "%+ *")
70: (make-local-variable 'comment-column)
71: (setq comment-column 48)
72: (make-local-variable 'comment-indent-hook)
73: (setq comment-indent-hook 'prolog-comment-indent))
74:
75: (defun prolog-mode-commands (map)
76: (define-key map "\t" 'prolog-indent-line)
77: (define-key map "\e\C-x" 'prolog-consult-region))
78:
79: (if prolog-mode-map
80: nil
81: (setq prolog-mode-map (make-sparse-keymap))
82: (prolog-mode-commands prolog-mode-map))
83:
84: (defun prolog-mode ()
85: "Major mode for editing Prolog code for Prologs.
86: Blank lines and `%%...' separate paragraphs. `%'s start comments.
87: Commands:
88: \\{prolog-mode-map}
89: Entry to this mode calls the value of prolog-mode-hook
90: if that value is non-nil."
91: (interactive)
92: (kill-all-local-variables)
93: (use-local-map prolog-mode-map)
94: (setq major-mode 'prolog-mode)
95: (setq mode-name "Prolog")
96: (prolog-mode-variables)
97: (run-hooks 'prolog-mode-hook))
98:
99: (defun prolog-indent-line (&optional whole-exp)
100: "Indent current line as Prolog code.
101: With argument, indent any additional lines of the same clause
102: rigidly along with this one (not yet)."
103: (interactive "p")
104: (let ((indent (prolog-indent-level))
105: (pos (- (point-max) (point))) beg)
106: (beginning-of-line)
107: (setq beg (point))
108: (skip-chars-forward " \t")
109: (if (zerop (- indent (current-column)))
110: nil
111: (delete-region beg (point))
112: (indent-to indent))
113: (if (> (- (point-max) pos) (point))
114: (goto-char (- (point-max) pos)))
115: ))
116:
117: (defun prolog-indent-level ()
118: "Compute prolog indentation level."
119: (save-excursion
120: (beginning-of-line)
121: (skip-chars-forward " \t")
122: (cond
123: ((looking-at "%%%") 0) ;Large comment starts
124: ((looking-at "%[^%]") comment-column) ;Small comment starts
125: ((bobp) 0) ;Beginning of buffer
126: (t
127: (let ((empty t) ind more less)
128: (if (looking-at ")")
129: (setq less t) ;Find close
130: (setq less nil))
131: ;; See previous indentation
132: (while empty
133: (forward-line -1)
134: (beginning-of-line)
135: (if (bobp)
136: (setq empty nil)
137: (skip-chars-forward " \t")
138: (if (not (or (looking-at "%[^%]") (looking-at "\n")))
139: (setq empty nil))))
140: (if (bobp)
141: (setq ind 0) ;Beginning of buffer
142: (setq ind (current-column))) ;Beginning of clause
143: ;; See its beginning
144: (if (looking-at "%%[^%]")
145: ind
146: ;; Real prolog code
147: (if (looking-at "(")
148: (setq more t) ;Find open
149: (setq more nil))
150: ;; See its tail
151: (end-of-prolog-clause)
152: (or (bobp) (forward-char -1))
153: (cond ((looking-at "[,(;>]")
154: (if (and more (looking-at "[^,]"))
155: (+ ind prolog-indent-width) ;More indentation
156: (max tab-width ind))) ;Same indentation
157: ((looking-at "-") tab-width) ;TAB
158: ((or less (looking-at "[^.]"))
159: (max (- ind prolog-indent-width) 0)) ;Less indentation
160: (t 0)) ;No indentation
161: )))
162: )))
163:
164: (defun end-of-prolog-clause ()
165: "Go to end of clause in this line."
166: (beginning-of-line 1)
167: (let* ((eolpos (save-excursion (end-of-line) (point))))
168: (if (re-search-forward comment-start-skip eolpos 'move)
169: (goto-char (match-beginning 0)))
170: (skip-chars-backward " \t")))
171:
172: (defun prolog-comment-indent ()
173: "Compute prolog comment indentation."
174: (cond ((looking-at "%%%") 0)
175: ((looking-at "%%") (prolog-indent-level))
176: (t
177: (save-excursion
178: (skip-chars-backward " \t")
179: (max (1+ (current-column)) ;Insert one space at least
180: comment-column)))
181: ))
182:
183:
184: ;;;
185: ;;; Inferior prolog mode
186: ;;;
187: (defvar inferior-prolog-mode-map nil)
188:
189: ;; Moved into inferior-prolog-mode
190: ;;(if inferior-prolog-mode-map
191: ;; nil
192: ;; (setq inferior-prolog-mode-map (copy-alist shell-mode-map))
193: ;; (prolog-mode-commands inferior-prolog-mode-map))
194:
195: (defun inferior-prolog-mode ()
196: "Major mode for interacting with an inferior Prolog process.
197:
198: The following commands are available:
199: \\{inferior-prolog-mode-map}
200:
201: Entry to this mode calls the value of prolog-mode-hook with no arguments,
202: if that value is non-nil. Likewise with the value of shell-mode-hook.
203: prolog-mode-hook is called after shell-mode-hook.
204:
205: You can send text to the inferior Prolog from other buffers
206: using the commands send-region, send-string and \\[prolog-consult-region].
207:
208: Commands:
209: Tab indents for Prolog; with argument, shifts rest
210: of expression rigidly with the current line.
211: Paragraphs are separated only by blank lines and '%%'. '%'s start comments.
212:
213: Return at end of buffer sends line as input.
214: Return not at end copies rest of line to end and sends it.
215: \\[shell-send-eof] sends end-of-file as input.
216: \\[kill-shell-input] and \\[backward-kill-word] are kill commands, imitating normal Unix input editing.
217: \\[interrupt-shell-subjob] interrupts the shell or its current subjob if any.
218: \\[stop-shell-subjob] stops, likewise. \\[quit-shell-subjob] sends quit signal, likewise."
219: (interactive)
220: (kill-all-local-variables)
221: (setq major-mode 'inferior-prolog-mode)
222: (setq mode-name "Inferior Prolog")
223: (setq mode-line-process '(": %s"))
224: (prolog-mode-variables)
225: (require 'shell)
226: (if inferior-prolog-mode-map
227: nil
228: (setq inferior-prolog-mode-map (copy-alist shell-mode-map))
229: (prolog-mode-commands inferior-prolog-mode-map))
230: (use-local-map inferior-prolog-mode-map)
231: (make-local-variable 'last-input-start)
232: (setq last-input-start (make-marker))
233: (make-local-variable 'last-input-end)
234: (setq last-input-end (make-marker))
235: (make-variable-buffer-local 'shell-prompt-pattern)
236: (setq shell-prompt-pattern "^| [ ?][- ] *") ;Set prolog prompt pattern
237: (run-hooks 'shell-mode-hook 'prolog-mode-hook))
238:
239: (defun run-prolog ()
240: "Run an inferior Prolog process, input and output via buffer *prolog*."
241: (interactive)
242: (require 'shell)
243: (switch-to-buffer (make-shell "prolog" "prolog"))
244: (inferior-prolog-mode))
245:
246: (defun prolog-consult-region (compile beg end)
247: "Send the region to the Prolog process made by M-x run-prolog.
248: If COMPILE (prefix arg) is not nil,
249: use compile mode rather than consult mode."
250: (interactive "P\nr")
251: (save-excursion
252: (if compile
253: (send-string "prolog" prolog-compile-string)
254: (send-string "prolog" prolog-consult-string))
255: (send-region "prolog" beg end)
256: (send-string "prolog" "\n") ;May be unnecessary
257: (if prolog-eof-string
258: (send-string "prolog" prolog-eof-string)
259: (process-send-eof "prolog")))) ;Send eof to prolog process.
260:
261: (defun prolog-consult-region-and-go (compile beg end)
262: "Send the region to the inferior Prolog, and switch to *prolog* buffer.
263: If COMPILE (prefix arg) is not nil,
264: use compile mode rather than consult mode."
265: (interactive "P\nr")
266: (prolog-consult-region compile beg end)
267: (switch-to-buffer "*prolog*"))
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.