【问题标题】:Selecting such or such Prolog system in Emacs via prolog.el通过 prolog.el 在 Emacs 中选择这样或这样的 Prolog 系统
【发布时间】:2021-01-08 17:37:06
【问题描述】:

Thierry Martinez 更改了 prolog.el (a package that provides a major mode for editing Prolog code in emac) 并提供了 a couple of files,通过它可以获得迷你缓冲区中的 Prolog 系统菜单。有人向我建议(见下文),通过directory local variablesprolog.el,可以将这样或这样的 Prolog 系统的选择与给定目录相关联。不幸的是,我没有成功编写一个 .dir-locals.el 来选择目录中的 SWI Prolog,并选择另一个,例如 Jekejeke Prolog 或 GNU Prolog。因此,我回到了 Martinez 给出的解决方案。但在这种情况下,我很高兴了解directory local variables 如何与prolog.el 一起工作。欢迎帮助。

【问题讨论】:

  • 一个建议:(可选)代替文件名,使用封闭目录名在系统之间进行选择
  • 作为对这个好建议的补充,我刚刚看到了这个网页:endlessparentheses.com/…
  • 你也可以考虑在这里提问:superuser.com

标签: emacs prolog


【解决方案1】:

您的问题不再是蒂埃里·马丁内斯了吗?
对于蒂埃里·马丁内斯,我猜你只需要改变这个:

(setq auto-mode-alist (append '(
                                ("\\.pro$" . prolog-mode)
                                ("\\.pl$" . prolog-or-perl-mode)
                                ("\\.chr$" . chr-mode)
                                )
         auto-mode-alist))

这是一个例子,但我假设我的 Prolog
系统由“jekejeke”而非“jekeprolog”标识:

(defun prolog-mode-jekejeke ()
     "Specific prolog mode which uses Jekejeke Prolog"
     (interactive)
     (prolog-mode 'jekejeke))

(setq auto-mode-alist (append '(
                                ("\\.p$" . prolog-mode-jekejeke)
                                ("\\.pro$" . prolog-mode)
                                ("\\.pl$" . prolog-or-perl-mode)
                                ("\\.chr$" . chr-mode)
                                )
         auto-mode-alist))

我指的是最初来自 Thierry Martinez 的文件:

;; prolog-mode loader
;; Thierry.Martinez@inria.fr
;; under GPLv3

https://gist.github.com/jburse/2d5fd1d3dd8436acceca52fdfc537581#file-prolog-el

警告,我没有测试!

【讨论】:

  • 谢谢。您对我的理解正确:我的问题不再是关于确实运行良好的 Martinez 设置。现在学习emacs中的目录局部变量是一个问题。
【解决方案2】:

如果您想更改每个文件的 prolog 系统,只需在文件开头包含以下行。

%% -*- prolog-system: swi -*-

用任何支持的系统替换 swi

eclipse - Eclipse Prolog
mercury - Mercury
sicstus - SICStus Prolog
swi     - SWI Prolog
gnu     - GNU Prolog

现在在使用多个 prolog 系统时会出现一些问题:

  1. 切换到不同系统后,mode-name 不会改变。因此,如果以前是 Prolog[GNU],即使 prolog-system 的当前缓冲区本地值是 swimode-name不会更改为 Prolog[SWI]
  2. 无论prolog-system 的缓冲区本地值是什么,当您执行run-prolog 或键入C-c C-l 时,启动的prolog 进程似乎是全局prolog-system 值的进程。 这是一个错误(希望得到解决) fixed 现在。
  3. 当前prolog.el 不支持同时运行的不同解释器。要运行gprolog,您必须停止swipl,反之亦然。他们都在为控制*prolog*缓冲区而战。

如果你仍然想要你的原始文件后缀类型的切换,你可以这样做:

(define-derived-mode gnuprolog-mode prolog-mode "GNU-Prolog"
  "This is just `prolog-mode'."
  (setq-local prolog-system 'gnu)
  (prolog-mode-variables))

(add-to-list 'auto-mode-alist '("gnu\\.pl" . gnuprolog-mode))

这里任何带有gnu.pl 后缀的文件都将在我们的gnuprolog-mode 中打开,这只是一个prolog-mode,以您选择的prolog 系统开始。

警告emacs-28

中均已修复
  1. 使用此代码,由于 prolog.el 中的错误(最近是 fixed),语法高亮可能无法(取决于您的 emacs 的最新程度)正常工作。
  2. 由于仍然存在错误,启动的解释器可能不是正确的解释器(现在是 fixed)。

【讨论】:

  • 谢谢。因此,我了解将 prolog.el 与不同的 Prolog 系统一起使用的最方便的选择可能是 Martinez 的。我说的对吗?
  • 目前,Emacs 自己的prolog-mode 将不支持您的用例。所以这可能是你唯一的选择(它看起来像 emacs prolog-mode 的旧变体,所以我不知道它的工作情况如何)。我使用 %-*- prolog-system: swi -*- 并在 swi、gnu 和 gnu-prolog 和 swi-prolog 之间切换,并在同一个 *prolog* 缓冲区中查看我的查询是否适用于它们。
猜你喜欢
  • 2012-03-11
  • 2014-02-03
  • 1970-01-01
  • 2017-06-02
  • 2012-12-08
  • 2015-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多