Annotation of GNUtools/emacs/lisp/prolog.el, revision 1.1.1.1

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*"))

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.