diff options
| author | Stefan Monnier | 2004-02-08 23:37:11 +0000 |
|---|---|---|
| committer | Stefan Monnier | 2004-02-08 23:37:11 +0000 |
| commit | 6cfd4f3ad927c5d9534e89e2a2f03edd6b8af881 (patch) | |
| tree | bd86d79917b841f2211ba1d1b0f291ed3bebd57f | |
| parent | c3c6c23cc6fe72083c841b2e296a6dc4fd69f7b4 (diff) | |
| download | emacs-6cfd4f3ad927c5d9534e89e2a2f03edd6b8af881.tar.gz emacs-6cfd4f3ad927c5d9534e89e2a2f03edd6b8af881.zip | |
(prolog-program-name): Use gprolog if available.
(prolog-mode-syntax-table, prolog-mode-abbrev-table, prolog-mode-map):
Bring together declaration and initialization.
(prolog-mode-variables): Don't set the syntax table.
Don't set paragraph-start and comment-indent-function.
Add /*..*/ to the comment regexps.
(prolog-mode-commands): Remove. Do it during init of prolog-mode-map.
(prolog-mode-map): Don't bind TAB.
(prolog-mode): Set the syntax table.
(prolog-comment-indent): Remove.
(inferior-prolog-mode-map): Initialize in the declaration.
(inferior-prolog-mode-syntax-table)
(inferior-prolog-mode-abbrev-table): New vars.
(inferior-prolog-mode): Derive from comint-mode.
(run-prolog): Avoid switch-to-buffer which can fail in dedicated and
minibuffer windows.
| -rw-r--r-- | lisp/progmodes/prolog.el | 88 |
1 files changed, 33 insertions, 55 deletions
diff --git a/lisp/progmodes/prolog.el b/lisp/progmodes/prolog.el index 48ed5a9512f..c5a169d2fa1 100644 --- a/lisp/progmodes/prolog.el +++ b/lisp/progmodes/prolog.el | |||
| @@ -1,6 +1,6 @@ | |||
| 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 |
| @@ -30,16 +30,17 @@ | |||
| 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) |
| @@ -75,8 +76,7 @@ nil means send actual operating system end of file." | |||
| 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) |
| @@ -90,17 +90,14 @@ nil means send actual operating system end of file." | |||
| 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) |
| @@ -110,20 +107,16 @@ nil means send actual operating system end of file." | |||
| 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) | ||
| 117 | (setq comment-indent-function 'prolog-comment-indent)) | ||
| 118 | |||
| 119 | (defun prolog-mode-commands (map) | ||
| 120 | (define-key map "\t" 'prolog-indent-line) | ||
| 121 | (define-key map "\e\C-x" 'prolog-consult-region)) | ||
| 122 | 115 | ||
| 123 | (if prolog-mode-map | 116 | (defvar prolog-mode-map |
| 124 | nil | 117 | (let ((map (make-sparse-keymap))) |
| 125 | (setq prolog-mode-map (make-sparse-keymap)) | 118 | (define-key map "\e\C-x" 'prolog-consult-region) |
| 126 | (prolog-mode-commands prolog-mode-map)) | 119 | map)) |
| 127 | 120 | ||
| 128 | ;;;###autoload | 121 | ;;;###autoload |
| 129 | (defun prolog-mode () | 122 | (defun prolog-mode () |
| @@ -136,6 +129,7 @@ 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) |
| @@ -143,7 +137,7 @@ if that value is non-nil." | |||
| 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. |
| @@ -217,26 +211,20 @@ rigidly along with this one (not yet)." | |||
| 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 |
| 219 | (let ((map (make-sparse-keymap))) | ||
| 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) | ||
| 238 | 226 | ||
| 239 | (defun inferior-prolog-mode () | 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: |
| @@ -260,25 +248,15 @@ 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) |