关于emacs奇怪行为的ediprolog

时间:2017-02-07 08:06:24

标签: emacs prolog swi-prolog

我很擅长使用emacs并自定义它。

我正在尝试安装ediprolog

我的.emacs文件是:

custom-set-variables
 ;; custom-set-variables was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 '(inhibit-startup-screen t))
(custom-set-faces
 ;; custom-set-faces was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 )

(global-set-key [f10] 'ediprolog-dwim)

(setq load-path (cons "/home/sam/Documents/emacs/prolog" load-path))
(autoload 'run-prolog "prolog" "Start a Prolog sub-process." t)
(autoload 'prolog-mode "prolog" "Major mode for editing Prolog programs." t)
(autoload 'mercury-mode "prolog" "Major mode for editing Mercury programs." t)
(setq prolog-system 'swi)
(setq auto-mode-alist (append '(("\\.pl\\'" . prolog-mode)
                                ("\\.m\\'" . mercury-mode))
                               auto-mode-alist))

我使用M-x package-install RET ediprolog RET

安装了ediprolog

我已使用%?- member(X,[a,b,c]).创建了一个测试文件如果我在此查询时按F10space space space,我会得到以下输出:

%?- member(X,[a,b,c]).
%@  member(X,[a,b,c]^H^H^H^H^H^H^H[a,b,c])^H^H^H^H^H^H^H^H^H^H^H(X,[a,b,c]).^M
%@ X = a ;^M
%@ X = b ;^M
%@ X = c.^M
%@^M

这显然不正确,因为我有所有这些额外的^H^M个字符。

此外,如果我按照指示将行(require 'ediprolog)添加到.emacs,我会在启动emacs时遇到以下错误:

Warning (initialization): An error occurred while loading `/home/sam/.emacs':

File error: Cannot open load file, no such file or directory, ediprolog

To ensure normal operation, you should investigate and remove the
cause of the error in your initialization file.  Start Emacs with
the `--debug-init' option to view a complete error backtrace.

我也按照https://bruda.ca/emacs/prolog-mode_installation_guide的说明安装了prolog-mode,如果相关的话。

2 个答案:

答案 0 :(得分:2)

这是由SWI-Prolog最近切换到 editline 库造成的,而以前默认使用 readline

现在问题已解决。

SWI-Prolog 7.5.1及更高版本包含change,可使ediprolog再次运行,无需对Emacs或ediprolog进行任何升级或配置更改。

SWI-Prolog的即将推出的稳定版本(7.4)也随之改变。

因此,此问题仅影响极少数版本(特别是7.5.0和7.4-rc1)。

如果您使用的是SWI-Prolog版本,则会出现此问题,以下是可能的解决方法:

解决此问题的一种方法是将以下内容放在~/.swiplrc初始化文件中:

:- set_prolog_flag(readline, readline).

假设您安装了ediprolog,这应该会产生readline

或者,你也可以把:

:- set_prolog_flag(readline, false).

~/.swiplrc初始化文件中。但是,如果您在系统终端上调用它,则完全也会禁用 SWI-Prolog的行编辑功能。在这种情况下,您当然可以使用-f none忽略初始化文件。

或者,您也可以在.emacs

中添加以下内容
(setq ediprolog-program-switches '("-g" "set_prolog_flag(readline, false)"))

如果您的SWI-Prolog版本足够新,则不再需要这些解决方法。

答案 1 :(得分:1)

对于(require 'ediprolog)的问题,您只需在(package-initialize)中添加~/.emacs(最近Emacsen将为您执行此操作)。但是,既然您是从ELPA安装的,那么您就不应该明确require它:ediprolog-dwim无论如何应该为您自动加载。