X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/573f9b32b9337b57289b77e3dfe8c447e023d9d6..ad96a7efde9759ef7046173e73f3f439a2f1ff58:/lisp/progmodes/prolog.el diff --git a/lisp/progmodes/prolog.el b/lisp/progmodes/prolog.el index 90058595b4..c5a169d2fa 100644 --- a/lisp/progmodes/prolog.el +++ b/lisp/progmodes/prolog.el @@ -1,12 +1,15 @@ -;; Major mode for editing Prolog, and for running Prolog under Emacs -;; Copyright (C) 1986, 1987 Free Software Foundation, Inc. -;; Author Masanobu UMEDA (umerin@flab.flab.fujitsu.junet) +;;; prolog.el --- major mode for editing and running Prolog under Emacs + +;; Copyright (C) 1986, 1987, 2003, 2004 Free Software Foundation, Inc. + +;; Author: Masanobu UMEDA +;; Keywords: languages ;; This file is part of GNU Emacs. ;; GNU Emacs is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 1, or (at your option) +;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; GNU Emacs is distributed in the hope that it will be useful, @@ -15,75 +18,107 @@ ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to -;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. -(defvar prolog-mode-syntax-table nil) -(defvar prolog-mode-abbrev-table nil) -(defvar prolog-mode-map nil) - -(defvar prolog-program-name "prolog" - "*Program name for invoking an inferior Prolog with `run-prolog'.") +;;; Commentary: + +;; This package provides a major mode for editing Prolog. It knows +;; about Prolog syntax and comments, and can send regions to an inferior +;; Prolog interpreter process. Font locking is tuned towards GNU Prolog. + +;;; Code: + +(defgroup prolog nil + "Major mode for editing and running Prolog under Emacs" + :group 'languages) -(defvar prolog-consult-string "reconsult(user).\n" - "*(Re)Consult mode (for C-Prolog and Quintus Prolog). ") -(defvar prolog-compile-string "compile(user).\n" - "*Compile mode (for Quintus Prolog).") +(defcustom prolog-program-name + (let ((names '("prolog" "gprolog"))) + (while (and names + (not (executable-find (car names)))) + (setq names (cdr names))) + (or (car names) "prolog")) + "*Program name for invoking an inferior Prolog with `run-prolog'." + :type 'string + :group 'prolog) -(defvar prolog-eof-string "end_of_file.\n" +(defcustom prolog-consult-string "reconsult(user).\n" + "*(Re)Consult mode (for C-Prolog and Quintus Prolog). " + :type 'string + :group 'prolog) + +(defcustom prolog-compile-string "compile(user).\n" + "*Compile mode (for Quintus Prolog)." + :type 'string + :group 'prolog) + +(defcustom prolog-eof-string "end_of_file.\n" "*String that represents end of file for prolog. -nil means send actual operating system end of file.") +nil means send actual operating system end of file." + :type 'string + :group 'prolog) + +(defcustom prolog-indent-width 4 + "Level of indentation in Prolog buffers." + :type 'integer + :group 'prolog) -(defvar prolog-indent-width 4) +(defvar prolog-font-lock-keywords + '(("\\(#[<=]=>\\|:-\\)\\|\\(#=\\)\\|\\(#[#<>\\/][=\\/]*\\|!\\)" + 0 font-lock-keyword-face) + ("\\<\\(is\\|write\\|nl\\|read_\\sw+\\)\\>" + 1 font-lock-keyword-face) + ("^\\(\\sw+\\)\\s-*\\((\\(.+\\))\\)*" + (1 font-lock-function-name-face) + (3 font-lock-variable-name-face))) + "Font-lock keywords for Prolog mode.") -(if prolog-mode-syntax-table - () +(defvar prolog-mode-syntax-table (let ((table (make-syntax-table))) (modify-syntax-entry ?_ "w" table) (modify-syntax-entry ?\\ "\\" table) - (modify-syntax-entry ?/ "." table) - (modify-syntax-entry ?* "." table) + (modify-syntax-entry ?/ ". 14" table) + (modify-syntax-entry ?* ". 23" table) (modify-syntax-entry ?+ "." table) (modify-syntax-entry ?- "." table) (modify-syntax-entry ?= "." table) (modify-syntax-entry ?% "<" table) + (modify-syntax-entry ?\n ">" table) (modify-syntax-entry ?< "." table) (modify-syntax-entry ?> "." table) (modify-syntax-entry ?\' "\"" table) - (setq prolog-mode-syntax-table table))) + table)) +(defvar prolog-mode-abbrev-table nil) (define-abbrev-table 'prolog-mode-abbrev-table ()) (defun prolog-mode-variables () - (set-syntax-table prolog-mode-syntax-table) - (setq local-abbrev-table prolog-mode-abbrev-table) - (make-local-variable 'paragraph-start) - (setq paragraph-start (concat "^%%\\|^$\\|" page-delimiter)) ;'%%..' (make-local-variable 'paragraph-separate) - (setq paragraph-separate paragraph-start) + (setq paragraph-separate (concat "%%\\|$\\|" page-delimiter)) ;'%%..' (make-local-variable 'paragraph-ignore-fill-prefix) (setq paragraph-ignore-fill-prefix t) + (make-local-variable 'imenu-generic-expression) + (setq imenu-generic-expression "^[a-z][a-zA-Z0-9_]+") (make-local-variable 'indent-line-function) (setq indent-line-function 'prolog-indent-line) (make-local-variable 'comment-start) (setq comment-start "%") (make-local-variable 'comment-start-skip) - (setq comment-start-skip "%+ *") + (setq comment-start-skip "\\(?:%+\\|/\\*+\\)[ \t]*") + (make-local-variable 'comment-end-skip) + (setq comment-end-skip "[ \t]*\\(\n\\|\\*+/\\)") (make-local-variable 'comment-column) - (setq comment-column 48) - (make-local-variable 'comment-indent-hook) - (setq comment-indent-hook 'prolog-comment-indent)) + (setq comment-column 48)) -(defun prolog-mode-commands (map) - (define-key map "\t" 'prolog-indent-line) - (define-key map "\e\C-x" 'prolog-consult-region)) - -(if prolog-mode-map - nil - (setq prolog-mode-map (make-sparse-keymap)) - (prolog-mode-commands prolog-mode-map)) +(defvar prolog-mode-map + (let ((map (make-sparse-keymap))) + (define-key map "\e\C-x" 'prolog-consult-region) + map)) +;;;###autoload (defun prolog-mode () "Major mode for editing Prolog code for Prologs. Blank lines and `%%...' separate paragraphs. `%'s start comments. @@ -94,10 +129,15 @@ if that value is non-nil." (interactive) (kill-all-local-variables) (use-local-map prolog-mode-map) + (set-syntax-table prolog-mode-syntax-table) (setq major-mode 'prolog-mode) (setq mode-name "Prolog") (prolog-mode-variables) - (run-hooks 'prolog-mode-hook)) + ;; font lock + (setq font-lock-defaults '(prolog-font-lock-keywords + nil nil nil + beginning-of-line)) + (run-mode-hooks 'prolog-mode-hook)) (defun prolog-indent-line (&optional whole-exp) "Indent current line as Prolog code. @@ -171,26 +211,20 @@ rigidly along with this one (not yet)." (if (re-search-forward comment-start-skip eolpos 'move) (goto-char (match-beginning 0))) (skip-chars-backward " \t"))) - -(defun prolog-comment-indent () - "Compute prolog comment indentation." - (cond ((looking-at "%%%") 0) - ((looking-at "%%") (prolog-indent-level)) - (t - (save-excursion - (skip-chars-backward " \t") - ;; Insert one space at least, except at left margin. - (max (+ (current-column) (if (bolp) 0 1)) - comment-column))) - )) - ;;; ;;; Inferior prolog mode ;;; -(defvar inferior-prolog-mode-map nil) +(defvar inferior-prolog-mode-map + (let ((map (make-sparse-keymap))) + ;; This map will inherit from `comint-mode-map' when entering + ;; inferior-prolog-mode. + map)) + +(defvar inferior-prolog-mode-syntax-table prolog-mode-syntax-table) +(defvar inferior-prolog-mode-abbrev-table prolog-mode-abbrev-table) -(defun inferior-prolog-mode () +(define-derived-mode inferior-prolog-mode comint-mode "Inferior Prolog" "Major mode for interacting with an inferior Prolog process. The following commands are available: @@ -214,24 +248,15 @@ Return not at end copies rest of line to end and sends it. \\[comint-kill-input] and \\[backward-kill-word] are kill commands, imitating normal Unix input editing. \\[comint-interrupt-subjob] interrupts the shell or its current subjob if any. \\[comint-stop-subjob] stops. \\[comint-quit-subjob] sends quit signal." - (interactive) - (require 'comint) - (comint-mode) - (setq major-mode 'inferior-prolog-mode - mode-name "Inferior Prolog" - comint-prompt-regexp "^| [ ?][- ] *") - (prolog-mode-variables) - (if inferior-prolog-mode-map nil - (setq inferior-prolog-mode-map (copy-keymap comint-mode-map)) - (prolog-mode-commands inferior-prolog-mode-map)) - (use-local-map inferior-prolog-mode-map) - (run-hooks 'prolog-mode-hook)) + (setq comint-prompt-regexp "^| [ ?][- ] *") + (prolog-mode-variables)) +;;;###autoload (defun run-prolog () "Run an inferior Prolog process, input and output via buffer *prolog*." (interactive) (require 'comint) - (switch-to-buffer (make-comint "prolog" prolog-program-name)) + (pop-to-buffer (make-comint "prolog" prolog-program-name)) (inferior-prolog-mode)) (defun prolog-consult-region (compile beg end) @@ -254,3 +279,8 @@ If COMPILE (prefix arg) is not nil, use compile mode rather than consult mode." (interactive "P\nr") (prolog-consult-region compile beg end) (switch-to-buffer "*prolog*")) + +(provide 'prolog) + +;;; arch-tag: f3ec6748-1272-4ab6-8826-c50cb1607636 +;;; prolog.el ends here