X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/2c239c80615a03573fde06a8f189e8c5ae666686..ad96a7efde9759ef7046173e73f3f439a2f1ff58:/lisp/progmodes/prolog.el diff --git a/lisp/progmodes/prolog.el b/lisp/progmodes/prolog.el index 593d3a8de3..c5a169d2fa 100644 --- a/lisp/progmodes/prolog.el +++ b/lisp/progmodes/prolog.el @@ -1,6 +1,6 @@ ;;; prolog.el --- major mode for editing and running Prolog under Emacs -;; Copyright (C) 1986, 1987 Free Software Foundation, Inc. +;; Copyright (C) 1986, 1987, 2003, 2004 Free Software Foundation, Inc. ;; Author: Masanobu UMEDA ;; Keywords: languages @@ -26,20 +26,21 @@ ;; 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. +;; Prolog interpreter process. Font locking is tuned towards GNU Prolog. ;;; Code: -(defvar prolog-mode-syntax-table nil) -(defvar prolog-mode-abbrev-table nil) -(defvar prolog-mode-map nil) - (defgroup prolog nil "Major mode for editing and running Prolog under Emacs" :group 'languages) - -(defcustom prolog-program-name "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) @@ -65,13 +66,22 @@ nil means send actual operating system end of file." :type 'integer :group 'prolog) -(if prolog-mode-syntax-table - () +(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.") + +(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) @@ -80,17 +90,14 @@ nil means send actual operating system end of file." (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) @@ -100,20 +107,16 @@ nil means send actual operating system end of file." (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-function) - (setq comment-indent-function 'prolog-comment-indent)) - -(defun prolog-mode-commands (map) - (define-key map "\t" 'prolog-indent-line) - (define-key map "\e\C-x" 'prolog-consult-region)) + (setq comment-column 48)) -(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 () @@ -126,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. @@ -203,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: @@ -246,25 +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) @@ -290,4 +282,5 @@ If COMPILE (prefix arg) is not nil, use compile mode rather than consult mode." (provide 'prolog) +;;; arch-tag: f3ec6748-1272-4ab6-8826-c50cb1607636 ;;; prolog.el ends here