I am using prolog-mode in Emacs 25.2. The following code shows that the inferior prolog process is not available when prolog-inferior-mode-hook is run: (add-hook 'prolog-inferior-mode-hook (lambda () (unless (get-buffer-process (current-buffer)) (warn "NO PROCESS!")))) When I have above in my ~/.emacs, and when I start the Prolog REPL using M-x run-prolog, the warning "NO PROCESS!" will appear, showing that the inferior prolog process in not available when the hook is run. I don't get this problem with the inferior mode hooks of other programming languages (e.g. inferior-python-mode-hook, inferior-lisp-mode-hook, inferior-scheme-mode-hook, etc.); their process is available when their hook is run. I assume that there is problem with prolog-mode.
Is it a requirement for a buffer in a inferior-mode to always have a process? When you call run-prolog or prolog-consult-buffer, if a prolog process is not running, a *prolog* buffer is created, prolog-inferior-mode is activated in the buffer and THEN the process itself is run. Relevant code from prolog-ensure-process function. (with-current-buffer (get-buffer-create "*prolog*") (prolog-inferior-mode) ... (apply 'make-comint-in-buffer "prolog" (current-buffer) (prolog-program-name) nil (prolog-program-switches))) I assume this was required because (prolog-inferior-mode) sets up the variables required for (prolog-program-name) and (prolog-program-switches). If the relevant variables are inherited from the buffer from which run-prolog is called then, this bug fix[1] will remove this dependency and prolog-inferior-mode can be activated after the process is created. [1]: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=45795
k3tu0isui@gmail.com writes: > I assume this was required because (prolog-inferior-mode) sets up the > variables required for (prolog-program-name) and (prolog-program-switches). Those are computed before we enter prolog-inferior-mode, though... Oh, because you've fixed that in an earlier applied patch. > If the relevant variables are inherited from the buffer from which > run-prolog is called then, this bug fix[1] will remove this dependency > and prolog-inferior-mode can be activated after the process is > created. > > [1]: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=45795 OK, then I'm applying this patch to Emacs 29, which should fix this bug report: diff --git a/lisp/progmodes/prolog.el b/lisp/progmodes/prolog.el index 8382c4bd09..9598209f5e 100644 --- a/lisp/progmodes/prolog.el +++ b/lisp/progmodes/prolog.el @@ -1355,8 +1355,6 @@ prolog-ensure-process (error "This Prolog system has defined no interpreter")) (unless (comint-check-proc "*prolog*") (with-current-buffer (get-buffer-create "*prolog*") - (prolog-inferior-mode) - ;; The "INFERIOR=yes" hack is for SWI-Prolog 7.2.3 and earlier, ;; which assumes it is running under Emacs if either INFERIOR=yes or ;; if EMACS is set to a nonempty value. The EMACS setting is @@ -1369,6 +1367,7 @@ prolog-ensure-process (cons "INFERIOR=yes" process-environment)))) (apply 'make-comint-in-buffer "prolog" (current-buffer) pname nil pswitches)) + (prolog-inferior-mode) (unless prolog-system ;; Setup auto-detection. -- (domestic pets only, the antidote for overdose, milk.) bloggy blog: http://lars.ingebrigtsen.no