emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] master a41eed6: * externals-list: Convert ediprolog to :external


From: Stefan Monnier
Subject: [elpa] master a41eed6: * externals-list: Convert ediprolog to :external
Date: Sun, 29 Nov 2020 16:57:36 -0500 (EST)

branch: master
commit a41eed679cc7e68174039b6440671b4b274bcd68
Author: Stefan Monnier <monnier@iro.umontreal.ca>
Commit: Stefan Monnier <monnier@iro.umontreal.ca>

    * externals-list: Convert ediprolog to :external
---
 externals-list                  |   3 +-
 packages/ediprolog/ediprolog.el | 652 ----------------------------------------
 2 files changed, 2 insertions(+), 653 deletions(-)

diff --git a/externals-list b/externals-list
index b1ee27a..29b7a0b 100644
--- a/externals-list
+++ b/externals-list
@@ -78,6 +78,7 @@
  ("dts-mode"           :external "https://github.com/bgamari/dts-mode.git";)
  ("easy-kill"          :external "https://github.com/leoliu/easy-kill";)
  ("ebdb"                :external "https://github.com/girzel/ebdb.git";)
+ ("ediprolog" :external nil)
  ("eev"                        :external "https://github.com/edrx/eev.git";) 
;branch UTF-8
  ("eglot"               :external "https://github.com/joaotavora/eglot.git";)
  ("eldoc"              :core "lisp/emacs-lisp/eldoc.el")
@@ -86,7 +87,7 @@
  ("emms"               :external "https://git.savannah.gnu.org/git/emms.git";)
  ("enwc"               :external 
"hg::https://hg.savannah.nongnu.org/hgweb/enwc/";)
  ("ergoemacs-mode"     :external 
"https://github.com/ergoemacs/ergoemacs-mode.git";)
- ("excorporate" :external nil)
+ ("excorporate"                :external nil)
  ("expand-region"      :external "https://github.com/magnars/expand-region.el";)
  ("exwm"               :external "https://github.com/ch11ng/exwm.git";)
  ("f90-interface-browser" :external "https://github.com/wence-/f90-iface";)
diff --git a/packages/ediprolog/ediprolog.el b/packages/ediprolog/ediprolog.el
deleted file mode 100644
index d88d30e..0000000
--- a/packages/ediprolog/ediprolog.el
+++ /dev/null
@@ -1,652 +0,0 @@
-;;; ediprolog.el --- Emacs Does Interactive Prolog
-
-;; Copyright (C) 2006-2009, 2012-2013, 2016-2017, 2020  Free Software 
Foundation, Inc.
-
-;; Author: Markus Triska <triska@metalevel.at>
-;; Keywords: languages, processes
-;; Version: 2.1
-;; Homepage: https://www.metalevel.at/ediprolog/
-
-;; This file 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 3, or (at your option)
-;; any later version.
-
-;; This file is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; These definitions let you interact with Prolog in all buffers.
-;; You can consult Prolog programs and evaluate embedded queries.
-
-;; Installation
-;; ============
-;;
-;; Copy ediprolog.el to your load-path and add to your .emacs:
-;;
-;;     (require 'ediprolog)
-;;     (global-set-key [f10] 'ediprolog-dwim)
-;;
-;; Restart Emacs and customize ediprolog with
-;;
-;;     M-x customize-group RET ediprolog RET
-;;
-;; The two most important configuration options are:
-;;
-;;    - `ediprolog-system', either 'scryer or 'swi
-;;    - `ediprolog-program', the path of the Prolog executable.
-
-;; Usage
-;; =====
-;;
-;; The central function is `ediprolog-dwim' (Do What I Mean), which is
-;; bound to F10 by the snippet above. Depending on the content at
-;; point, `ediprolog-dwim' does the "appropriate" thing: If point is
-;; on a query, F10 sends the query to a Prolog process, and you
-;; interact with the process in the current buffer as on a terminal.
-;; Queries start with "?-" or ":-", possibly preceded by "%" and
-;; whitespace. An example of a query is (without leading ";;"):
-;;
-;;   %?- member(X, [a,b,c]).
-;;
-;; If you press F10 when point is on that query, you get:
-;;
-;;   %?- member(X, [a,b,c]).
-;;   %@    X = a
-;;   %@ ;  X = b
-;;   %@ ;  X = c
-;;   %@ ;  false.
-;;
-;; When waiting for output of the Prolog process, you can press C-g to
-;; unblock Emacs and continue with other work. To resume interaction
-;; with the Prolog process, use M-x ediprolog-toplevel RET.
-
-;; If you press F10 when point is *not* on a query, the buffer content
-;; is consulted in the Prolog process, and point is moved to the first
-;; error (if any).  In transient mark mode, if the region is active,
-;; only the text in the region is consulted.
-
-;; For convenience, the most recent interactions with the Prolog
-;; process are logged in the buffer "*ediprolog-history*".
-
-;; Use M-x ediprolog-localize RET to make any Prolog process started
-;; in the current buffer buffer-local. This way, you can run distinct
-;; processes simultaneously. Revert with M-x ediprolog-unlocalize RET.
-
-;; `ediprolog-dwim' with prefix arguments has special meanings:
-;;
-;;   C-0 F10       kill Prolog process
-;;   C-1 F10       always consult buffer (even when point is on a query)
-;;   C-2 F10       always consult buffer, using a new process
-;;   C-7 F10       equivalent to `ediprolog-toplevel'
-;;   C-u F10       first consult buffer, then evaluate query (if any)
-;;   C-u C-u F10   like C-u F10, with a new process
-
-;; Tested with Scryer Prolog 0.8.119 and SWI-Prolog 8.1.24,
-;; using Emacs versions 26.1 and 27.0.50.
-
-;;; Code:
-
-(defconst ediprolog-version "2.1")
-
-(defgroup ediprolog nil
-  "Transparent interaction with Prolog."
-  :group 'languages
-  :group 'processes)
-
-
-(defcustom ediprolog-system 'scryer
-  "Prolog system that is used for interaction."
-  :group 'ediprolog
-  :type '(choice (const :tag "Scryer Prolog" :value scryer)
-                 (const :tag "SWI Prolog" :value swi)))
-
-(defcustom ediprolog-program
-  (or
-   (executable-find "scryer-prolog")
-   (executable-find "swipl")
-   "scryer-prolog")
-  "Program name of the Prolog executable."
-  :group 'ediprolog
-  :type 'string)
-
-(defcustom ediprolog-program-switches nil
-  "List of switches passed to the Prolog process. Example:
-'(\"-G128M\" \"-O\")"
-  :group 'ediprolog
-  :type '(repeat string))
-
-(defcustom ediprolog-prefix "%@ "
-  "String to prepend when inserting output from the Prolog
-process into the buffer."
-  :group 'ediprolog
-  :type 'string)
-
-(defcustom ediprolog-max-history 80000
-  "Maximal size of history buffers storing recent interactions, or
-nil to never truncate the history."
-  :group 'ediprolog
-  :type 'sexp)
-
-(defvar ediprolog-process               nil "A Prolog process.")
-
-(defvar ediprolog-temp-buffer           nil
-  "Buffer that temporarily saves process output ")
-
-(defvar ediprolog-seen-prompt           nil
-  "Whether a prompt was (recently) emitted by the Prolog process.")
-
-(defvar ediprolog-read-term             nil
-  "Whether the Prolog process waits for the user to enter a term.")
-
-(defvar ediprolog-indent-prefix         ""
-  "Any whitespace occurring before the most recently executed query.")
-
-(defvar ediprolog-temp-file             nil
-  "File name of a temporary file used for consulting the buffer.")
-
-(defvar ediprolog-consult-buffer "*ediprolog-consult*"
-  "Buffer used to display consult output.")
-
-(defvar ediprolog-consult-window        nil
-  "Window used to show consult output.")
-
-(defvar ediprolog-history-buffer        nil
-  "Buffer that stores recent interactions.")
-
-(defvar ediprolog-interrupted           nil
-  "True iff waiting for the previous query was interrupted with C-g.")
-
-(defun ediprolog-prompt ()
-  "Prompt used in the Prolog session."
-  (cond ((eq ediprolog-system 'swi) "?ediprolog- ")
-         (t "?- ")))
-
-(defmacro ediprolog-wait-for-prompt-after (&rest forms)
-  "Evaluate FORMS and wait for prompt."
-  `(progn
-     (setq ediprolog-seen-prompt nil)
-     (ediprolog-ensure-buffer "temp")
-     (with-current-buffer ediprolog-temp-buffer
-       (let (buffer-read-only)
-         (erase-buffer)))
-     ;; execute forms with default-directory etc. from invocation buffer
-     ,@forms
-     (while (not ediprolog-seen-prompt)
-       ;; Wait for output/sentinel and update consult window, if any.
-       ;; As `accept-process-output' does not run the sentinel in
-       ;; Emacs <= 23.1, we use `sit-for' to do both. However,
-       ;; `sit-for' returns immediately if keyboard input is
-       ;; available, so we must discard input.
-       (discard-input)
-       (sit-for 0.1))))
-
-(defmacro ediprolog-remember-interruption (form)
-  "Set `ediprolog-interrupted' if evaluation of FORM was interrupted."
-  `(condition-case nil
-       ,form
-     (quit (setq ediprolog-interrupted t))))
-
-;; Only the sentinel can reliably detect if no more output follows -
-;; even if process-status is 'exit, further output can still follow.
-(defun ediprolog-sentinel (proc str)
-  (when (buffer-live-p (process-buffer proc))
-    (with-current-buffer (process-buffer proc)
-      (let ((status (with-temp-buffer
-                      (insert str)
-                      (while (search-backward "\n" nil t)
-                        (replace-match ""))
-                      (buffer-string))))
-        (ediprolog-log
-         (format "%s: %s.\n"
-                 (substring (current-time-string) 4 -5) status) "green" t))
-      (when (string-match "^\\(?:finished\n\\|exited abnormally\\|killed\n\\)"
-                          str)
-        (setq ediprolog-seen-prompt t)))))
-
-(defun ediprolog-ensure-buffer (name)
-  (let ((str (format "*ediprolog-%s*" name))
-        (var (intern (format "ediprolog-%s-buffer" name))))
-    (unless (buffer-live-p (symbol-value var))
-      (set var (generate-new-buffer str))
-      (with-current-buffer (symbol-value var)
-        (buffer-disable-undo)
-        (setq buffer-read-only t)))))
-
-(defun ediprolog-log (str &optional col nl)
-  (ediprolog-ensure-buffer "history")
-  (with-current-buffer ediprolog-history-buffer
-    (let (buffer-read-only)
-      (goto-char (point-max))
-      (let ((s (format "%s%s" (if (and nl (not (bolp))) "\n" "") str)))
-        (insert (if col (propertize s 'face `(:background ,col)) s)))
-      (let ((size (- (point-max) (point-min))))
-        (when (and ediprolog-max-history
-                   (> size ediprolog-max-history))
-          ;; delete older half of the (possibly narrowed) history
-          (delete-region (point-min) (+ (point-min) (/ size 2))))))))
-
-(defun ediprolog-run-prolog ()
-  "Start a Prolog process."
-  (let ((args (cons ediprolog-program ediprolog-program-switches)))
-    (ediprolog-log (format "%s: starting: %S\n"
-                           (substring (current-time-string) 4 -5) args)
-                   "green" t)
-    (condition-case nil
-        (ediprolog-wait-for-prompt-after
-         (setq ediprolog-process
-               (apply #'start-file-process "ediprolog" (current-buffer) args))
-         (set-process-sentinel ediprolog-process 'ediprolog-sentinel)
-         (set-process-filter ediprolog-process
-                             'ediprolog-wait-for-prompt-filter)
-         (when (eq ediprolog-system 'swi)
-           (ediprolog-send-string
-            (format "set_prolog_flag(color_term, false), \
-set_prolog_flag(toplevel_prompt, '%s').\n" (ediprolog-prompt)))))
-      ((error quit)
-       (ediprolog-log "No prompt found." "red" t)
-       (error "No prompt from: %s" ediprolog-program)))))
-
-(defun ediprolog-kill-prolog ()
-  "Kill the Prolog process and run the process sentinel."
-  (when (ediprolog-running)
-    (delete-process ediprolog-process)))
-
-(defun ediprolog-show-consult-output (str)
-  (with-current-buffer (get-buffer-create ediprolog-consult-buffer)
-    (setq buffer-read-only t)
-    (let (buffer-read-only)
-      (erase-buffer)
-      (insert str)
-      (goto-char (point-min))
-      ;; remove normal consult status lines, which start with "%"
-      (while (re-search-forward "^[\t ]*%.*\n" nil t)
-        (delete-region (match-beginning 0) (match-end 0))))
-    (setq str (buffer-string)))
-  ;; show consult output in a separate window unless it is a prefix of
-  ;; success (i.e., consulted without errors), or still an incomplete
-  ;; line that starts with a comment character
-  (unless (or (string-match "^[\t ]*\\(?:%.*\\)?\\'" str)
-              (let ((success "true."))
-                (and (<= (length str) (length success))
-                     (string= str (substring success 0 (length str))))))
-    (setq ediprolog-consult-window (display-buffer ediprolog-consult-buffer))
-    (set-window-dedicated-p ediprolog-consult-window t)
-    (fit-window-to-buffer ediprolog-consult-window (/ (frame-height) 2))))
-
-(defun ediprolog-consult-filter (proc str)
-  "Filter used when consulting a file, showing consult output."
-  (with-current-buffer (ediprolog-temp-buffer proc)
-    (goto-char (point-max))
-    (let (buffer-read-only)
-      (insert str))
-    (with-current-buffer (process-buffer proc)
-      (ediprolog-log str))
-    (when (re-search-backward
-           (format "^%s" (regexp-quote (ediprolog-prompt))) nil t)
-      (with-current-buffer (process-buffer proc)
-        (setq ediprolog-seen-prompt t)))
-    (skip-chars-backward "\n")
-    (ediprolog-show-consult-output (buffer-substring (point-min) (point)))))
-
-(defun ediprolog-wait-for-prompt-filter (proc str)
-  "Filter that only waits until prompt appears."
-  (with-current-buffer (ediprolog-temp-buffer proc)
-    (goto-char (point-max))
-    (let (buffer-read-only)
-      (insert str))
-    (with-current-buffer (process-buffer proc)
-      (ediprolog-log str))
-    (when (re-search-backward
-           (format "^%s" (regexp-quote (ediprolog-prompt))) nil t)
-      (with-current-buffer (process-buffer proc)
-        (setq ediprolog-seen-prompt t)))))
-
-
-;;;###autoload
-(defun ediprolog-dwim (&optional arg)
-  "Load current buffer into Prolog or post query (Do What I Mean).
-If invoked on a line starting with `:-' or `?-', possibly
-preceded by `%' and whitespace, call `ediprolog-interact' with
-the query as argument. Otherwise, call `ediprolog-consult'.
-
-With prefix argument 0, kill the Prolog process. With prefix 1,
-equivalent to `ediprolog-consult'. With prefix 2, equivalent to
-`ediprolog-consult' with a new Prolog process. With prefix 7,
-equivalent to `ediprolog-toplevel'. With just C-u, first call
-`ediprolog-consult' and then, if point is on a query, call
-`ediprolog-interact' with it as argument. Analogously, C-u C-u
-for `ediprolog-consult' with a new process. With other prefix
-arguments, equivalent to `ediprolog-remove-interactions'."
-  (interactive "P")
-  (cond ((eq arg 0)
-         (unless (ediprolog-running)
-           (error "No Prolog process running"))
-         (ediprolog-kill-prolog)
-         (message "Prolog process killed."))
-        ((eq arg 1) (ediprolog-consult))
-        ((eq arg 2) (ediprolog-consult t))
-        ((eq arg 7)
-         (unless (ediprolog-more-solutions)
-           (error "No query in progress"))
-         (ediprolog-toplevel))
-        ((equal arg '(4)) (ediprolog-consult) (ediprolog-query))
-        ((equal arg '(16)) (ediprolog-consult t) (ediprolog-query))
-        ((null arg) (unless (ediprolog-query) (ediprolog-consult)))
-        (t (ediprolog-remove-interactions))))
-
-(defun ediprolog-process-ready ()
-  "Error if the previous query is still in progress."
-  (when (and ediprolog-interrupted
-             (ediprolog-running)
-             (ediprolog-more-solutions))
-    (error "Previous query still in progress, see `ediprolog-toplevel'"))
-  (setq ediprolog-interrupted nil))
-
-(defun ediprolog-query ()
-  "If point is on a query, send it to the process and start interaction."
-  (ediprolog-process-ready)
-  (when (and (not (and transient-mark-mode mark-active))
-             (save-excursion
-               (beginning-of-line)
-               (looking-at "\\([\t ]*\\)%*[\t ]*[:?]- *")))
-    ;; whitespace preceding the query is the indentation level
-    (setq ediprolog-indent-prefix (match-string 1))
-    (let* ((from (goto-char (match-end 0)))
-           (to (if (re-search-forward "\\.[\t ]*\\(?:%.*\\)?$" nil t)
-                   ;; omit trailing whitespace
-                   (+ (point) (skip-chars-backward "\t "))
-                 (error "Missing `.' at the end of this query")))
-           (query (buffer-substring-no-properties from to))
-           (handle (and (fboundp 'prepare-change-group)
-                        (fboundp 'undo-amalgamate-change-group)
-                        (cons t (prepare-change-group)))))
-      (end-of-line)
-      (insert "\n" ediprolog-indent-prefix ediprolog-prefix)
-      (ediprolog-interact
-       (format "%s\n" (mapconcat #'identity
-                                 ;; `%' can precede each query line
-                                 (split-string query "\n[ \t%]*") " ")))
-      (when handle
-        (undo-amalgamate-change-group (cdr handle))))
-    t))
-
-;;;###autoload
-(defun ediprolog-interact (query)
-  "Send QUERY to Prolog process and interact as on a terminal.
-
-You can use \\[keyboard-quit] to unblock Emacs in the case of
-longer-running queries. When the query completes and the toplevel
-asks for input, use \\[ediprolog-toplevel] to resume interaction
-with the Prolog process."
-  (unless (ediprolog-running)
-    (ediprolog-run-prolog))
-  (set-marker (process-mark ediprolog-process) (point))
-  (set-process-buffer ediprolog-process (current-buffer))
-  (set-process-filter ediprolog-process 'ediprolog-interact-filter)
-  (ediprolog-ensure-buffer "temp")
-  (with-current-buffer ediprolog-temp-buffer
-    (let (buffer-read-only)
-      (erase-buffer)))
-  (setq ediprolog-seen-prompt nil
-        ediprolog-read-term nil)
-  (ediprolog-send-string query)
-  (ediprolog-toplevel))
-
-(defun ediprolog-send-string (str)
-  "Send string to Prolog process and log it."
-  (ediprolog-log str "cyan")
-  (process-send-string ediprolog-process str))
-
-(defun ediprolog-toplevel ()
-  "Start or resume Prolog toplevel interaction in the buffer.
-
-You can use this function if you have previously quit (with
-\\[keyboard-quit]) waiting for a longer-running query and now
-want to resume interaction with the toplevel."
-  (interactive)
-  (when ediprolog-process
-    (select-window (display-buffer (process-buffer ediprolog-process))))
-  (ediprolog-remember-interruption
-   (while (ediprolog-more-solutions)
-     (let (str
-           char)
-       ;; poll for user input; meanwhile, process output can arrive
-       (while (and (ediprolog-more-solutions) (null str))
-         (goto-char (process-mark ediprolog-process))
-         (if ediprolog-read-term
-             (progn
-               (setq str (concat (read-string "Input: ") "\n"))
-               (ediprolog-insert-at-marker
-                str ediprolog-indent-prefix ediprolog-prefix)
-               (setq ediprolog-read-term nil))
-           (condition-case nil
-               (when (setq char (if (>= emacs-major-version 22)
-                                    (read-char nil nil 0.1)
-                                  (with-timeout (0.1 nil)
-                                    (read-char))))
-                 ;; char-to-string might still yield an error (C-0 etc.)
-                 (setq str (char-to-string char)))
-             (error
-              (message "Non-character key")
-              ;; non-character keys must not remain in the input
-              ;; buffer, lest `read-char' return immediately
-              (discard-input)))))
-       (when (ediprolog-more-solutions)
-         (if (eq char ?\C-c)            ; char can be nil too
-             ;; sending C-c directly yields strange SWI buffering
-             (interrupt-process ediprolog-process)
-           (ediprolog-send-string str)))))))
-
-;;;###autoload
-(defun ediprolog-remove-interactions ()
-  "Remove all lines starting with `ediprolog-prefix' from buffer.
-
-In transient mark mode, if the region is active, the function
-operates on the region."
-  (interactive)
-  (save-excursion
-    (save-restriction
-      (when (and transient-mark-mode mark-active)
-        (narrow-to-region (region-beginning) (region-end)))
-      (goto-char (point-min))
-      (flush-lines (concat "^[\t ]*" (regexp-quote ediprolog-prefix)))))
-  (message "Interactions removed."))
-
-
-;;;###autoload
-(defun ediprolog-consult (&optional new-process)
-  "Buffer is loaded into a Prolog process. If NEW-PROCESS is
-non-nil, start a new process. Otherwise use the existing process,
-if any. In case of errors, point is moved to the position of the
-first error, and the mark is left at the previous position.
-
-In transient mark mode, if the region is active, the function
-operates on the region."
-  (interactive)
-  (when (string= (buffer-name) ediprolog-consult-buffer)
-    (error "Cannot consult the consult buffer"))
-  (when (window-live-p ediprolog-consult-window)
-    (condition-case nil
-        ;; deleting the window can still raise an error, if the window
-        ;; was the only window in the frame and the consult buffer was
-        ;; killed (and it thus displays a different buffer now)
-        (delete-window ediprolog-consult-window)
-      (error nil)))
-  (when (buffer-live-p ediprolog-consult-buffer)
-    (bury-buffer ediprolog-consult-buffer))
-  (when new-process
-    (ediprolog-kill-prolog))
-  (unless (ediprolog-running)
-    (ediprolog-run-prolog))
-  (ediprolog-process-ready)
-  (set-process-buffer ediprolog-process (current-buffer))
-  (when (or (null ediprolog-temp-file)
-            (and buffer-file-name
-                 (not (equal (file-remote-p ediprolog-temp-file)
-                             (file-remote-p buffer-file-name)))))
-    (setq ediprolog-temp-file (make-nearby-temp-file "ediprolog")))
-  (let ((start (if (and transient-mark-mode mark-active)
-                   (region-beginning) (point-min)))
-        (end (if (and transient-mark-mode mark-active)
-                 (region-end) (point-max))))
-    (write-region start end ediprolog-temp-file nil 'silent))
-  (set-process-filter ediprolog-process 'ediprolog-consult-filter)
-  (ediprolog-remember-interruption
-   (ediprolog-wait-for-prompt-after
-    (ediprolog-send-string (format "['%s'].\n"
-                                   (if (fboundp 'file-local-name)
-                                       (file-local-name ediprolog-temp-file)
-                                     ediprolog-temp-file)))))
-  (message "%s consulted." (if (and transient-mark-mode mark-active)
-                               "Region" "Buffer"))
-  ;; go to line of the first error, if any
-  (let ((line (with-current-buffer ediprolog-temp-buffer
-                (when (save-excursion
-                        (goto-char (point-min))
-                        (re-search-forward "^ERROR.*?:\\([0-9]+\\)" nil t))
-                  (string-to-number (match-string 1))))))
-    (when line
-      (let ((p (point)))
-        (goto-char (if (and transient-mark-mode mark-active)
-                       (region-beginning)
-                     (point-min)))
-        ;; doing this first would affect (region-beginning)
-        (push-mark p))
-      (forward-line (1- line)))))
-
-(defun ediprolog-running ()
-  "True iff `ediprolog-process' is a running process."
-  (and (processp ediprolog-process)
-       (eq (process-status ediprolog-process) 'run)))
-
-(defun ediprolog-more-solutions ()
-  "True iff there could be more solutions from the process."
-  (not ediprolog-seen-prompt))
-
-(defun ediprolog-interact-filter (proc string)
-  "Insert output from the process and update the state."
-  (when (and (buffer-live-p (ediprolog-temp-buffer proc))
-             (buffer-live-p (process-buffer proc)))
-    (let (str)
-      (with-current-buffer (ediprolog-temp-buffer proc)
-        (goto-char (point-max))
-        (let (buffer-read-only)
-          (insert string))
-        (with-current-buffer (process-buffer proc)
-          (ediprolog-log string))
-        ;; read a term from the user?
-        (when (re-search-backward "^|: $" nil t)
-          (with-current-buffer (process-buffer proc)
-            (setq ediprolog-read-term t))
-          (setq str (buffer-string))
-          (let (buffer-read-only)
-            (erase-buffer)))
-        ;; check for prompt
-        (goto-char (point-max))
-        (when (re-search-backward
-               (format "^%s" (regexp-quote (ediprolog-prompt))) nil t)
-          (with-current-buffer (process-buffer proc)
-            (setq ediprolog-seen-prompt t))
-          ;; ignore further output due to accidental user input (C-j,
-          ;; C-m, etc.) while the query was running
-          (set-process-filter proc 'ediprolog-ignore-filter)
-          (skip-chars-backward "\n")
-          (setq str (buffer-substring (point-min) (point))))
-        (unless str
-          (goto-char (point-max))
-          ;; delay final line if it can still be completed to prompt
-          (let ((l (buffer-substring (line-beginning-position) (point))))
-            (when (and (<= (length l) (length (ediprolog-prompt)))
-                       (string= l (substring (ediprolog-prompt) 0 (length l))))
-              (goto-char (line-beginning-position))))
-          ;; delay emitting newlines until we are sure no prompt
-          ;; follows; one or two newlines can precede a prompt
-          (let ((d (abs (skip-chars-backward "\n"))))
-            (when (> d 2)
-              (forward-char (- d 2))))
-          (setq str (buffer-substring (point-min) (point)))
-          (let (buffer-read-only)
-            (delete-region (point-min) (point))))
-        (when str
-          (with-temp-buffer
-            ;; precede each line with ediprolog prefices
-            (insert str)
-            (goto-char (point-min))
-            (while (search-forward "\n" nil t)
-              (replace-match
-               (format "\n%s%s"
-                       (buffer-local-value 'ediprolog-indent-prefix
-                                           (process-buffer proc))
-                       (buffer-local-value 'ediprolog-prefix
-                                           (process-buffer proc)))))
-            (setq str (buffer-string)))
-          (with-current-buffer (process-buffer proc)
-            (let ((near (<= (abs (- (point) (process-mark proc))) 1)))
-              (ediprolog-insert-at-marker str)
-              (when near
-                ;; catch up with output if point was reasonably close
-                (goto-char (process-mark proc))))))))))
-
-
-(defun ediprolog-insert-at-marker (&rest args)
-  "Insert strings ARGS at marker and update the marker."
-  (save-excursion
-    (goto-char (process-mark ediprolog-process))
-    (end-of-line)
-    (apply #'insert args)
-    (set-marker (process-mark ediprolog-process) (point))))
-
-(defun ediprolog-ignore-filter (proc str)
-  "Log and then ignore all process output."
-  (with-current-buffer (process-buffer proc)
-    (ediprolog-log str "gray")))
-
-(defun ediprolog-temp-buffer (proc)
-  (with-current-buffer (process-buffer proc)
-    ;; temp buffer can be buffer local
-    ediprolog-temp-buffer))
-
-(defun ediprolog-map-variables (func)
-  "Call FUNC with all ediprolog variables that can become buffer-local."
-  (mapc func '(ediprolog-process
-               ediprolog-system
-               ediprolog-program
-               ediprolog-program-switches
-               ediprolog-temp-buffer
-               ediprolog-history-buffer
-               ediprolog-seen-prompt
-               ediprolog-interrupted
-               ediprolog-read-term
-               ediprolog-indent-prefix
-               ediprolog-prefix
-               ediprolog-temp-file)))
-
-;;;###autoload
-(defun ediprolog-localize ()
-  "After `ediprolog-localize', any Prolog process started from
-this buffer becomes buffer-local."
-  (interactive)
-  (unless (local-variable-p 'ediprolog-process)
-    (ediprolog-map-variables #'make-local-variable)
-    (setq ediprolog-temp-file nil
-          ediprolog-process nil
-          ediprolog-history-buffer nil
-          ediprolog-temp-buffer nil)))
-
-(defun ediprolog-unlocalize ()
-  "Revert the effect of `ediprolog-localize'."
-  (interactive)
-  (when (local-variable-p 'ediprolog-process)
-    (ediprolog-kill-prolog)
-    (ediprolog-map-variables #'kill-local-variable)))
-
-(provide 'ediprolog)
-
-;;; ediprolog.el ends here



reply via email to

[Prev in Thread] Current Thread [Next in Thread]