我正在试着让intero运行。安装后,从现有堆栈项目中打开Haskell文件将产生以下结果:
Debugger entered--Lisp error: (wrong-type-argument stringp nil)
signal(wrong-type-argument (stringp nil))
flycheck-buffer()
flycheck-buffer-automatically()
flycheck-perform-deferred-syntax-check()
set-window-buffer(#<window 1 on Lib.hs> #<buffer Lib.hs>)
window--display-buffer(#<buffer Lib.hs> #<window 1 on Lib.hs> reuse ((inhibit-same-window)))
display-buffer-same-window(#<buffer Lib.hs> ((inhibit-same-window)))
display-buffer(#<buffer Lib.hs> (display-buffer-same-window (inhibit-same-window)))
pop-to-buffer(#<buffer Lib.hs> (display-buffer-same-window (inhibit-same-window)) nil)
pop-to-buffer-same-window(#<buffer Lib.hs>)
find-file("~/test/src/Lib.hs" t)
funcall-interactively(find-file "~/test/src/Lib.hs" t)
call-interactively(find-file nil nil)
command-execute(find-file)当我在同一个缓冲区中运行flycheck-buffer时,即使源代码中有错误,也不会发生任何事情。
下面是我的.emacs文件的内容:
(setq debug-on-error t)
(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/") t)
(package-initialize)
(package-refresh-contents)
(package-install 'intero)
(add-hook 'haskell-mode-hook 'intero-mode)由于我使用的是Mac Os,所以我也尝试添加(就像在flycheck页面中建议的那样):
(package-install 'exec-path-from-shell)
(exec-path-from-shell-initialize)但这没什么区别。
以下是已安装的包版本:
$ ls ~/.emacs.d/elpa/
archives/
company-20191114.1356/
dash-20191109.1327/
epl-20180205.2049/
flycheck-20191126.1329/
haskell-mode-20191120.1923/
intero-20191103.1239/
pkg-info-20150517.1143/这是使用GNU Emacs 26.3。
发布于 2019-12-22 21:31:10
TL;博士
我发现了两个问题,每个问题都有一个(至少是暂时的)修复。我正在为它们提交拉请求,但同时您可以通过直接编辑intero.el文件或(推荐的方式)使用伟大的艾尔贴片包来解决问题。
1) intero-ghc-version未设置
这是因为使用intero-ghc-version局部变量而不是在intero-ghci-output-flags函数(L.2668) intero.el中调用函数(intero-ghc-version)。
修补程序:修补程序函数intero-ghci-output-flags:替换
(split-string intero-ghc-version "\\."))))通过
(split-string (intero-ghc-version) "\\."))))(请注意添加的括号)
2)在append中误用append进行字符串连接
append代表列表,concat代表字符串,这是一个很容易出错的错误,尤其是在Haskell String等同于[Char]的情况下(所以从技术上讲……一份名单!)
修复:修补函数intero-start-process-in-buffer,L.2335的intero.el:替换
(process-send-string process (append ":set " flag "\n")))通过
(process-send-string process (concat ":set " flag "\n")))一旦进行了这些修改,您就可以启动并运行了!
初始答案
这里也有同样的问题。
不是一个明确的答案,但我也有同样的问题,我可能已经将这个问题固定在运行的函数intero-ghci-output-flags上,因为intero-ghc-version变量没有被正确设置。请尽管纠正我,因为我可能错过了一些事情。
通过跟踪错误消息,我确认它发生在(flycheck-start-current-syntax-check checker)中的flycheck-buffer函数中。
直接从haskell缓冲区运行此操作表明,从(split-string intero-ghc-version "\\.")文件中的intero-ghci-output-flags函数调用intero.el函数时会发生错误(第2671行)。
这将尝试拆分intero版本(正如上面的intero-ghc-version函数在文件中设置的那样)。
正如运行nil所证实的那样,变量的值似乎是M-x describe-variable -> intero-ghc-version。
在我的测试中,我从(intero-ghc-version)中获得了看不见的结果。有时(至少在第一次跑?)它返回"8.4.4",
有时它会在"Wrong type argument: stringp, (58 115 101 116 32 45 102 111 98 106 ...)中失败
我能够手动运行函数intero-ghci-output-flags并获得正确的输出一次,如果我第二次运行它,它就会失败。
然而,函数(intero-ghc-version-raw)始终返回"8.4.4“。
在对自发出现的错误消息进行实验之后,将其转换为:
Debugger entered--Lisp error: (wrong-type-argument stringp (58 115 101 116 32 45 102 111 98 106 101 99 116 45 99 111 100 101 . "\n"))
process-send-string(#<process stack> (58 115 101 116 32 45 102 111 98 106 101 99 116 45 99 111 100 101 . "\n"))
#f(compiled-function (flag) #<bytecode 0x1785fe9>)("-fobject-code")
mapc(#f(compiled-function (flag) #<bytecode 0x1785fe9>) ("-fobject-code"))
intero-start-process-in-buffer(#<buffer intero:backend:pubiber /home/mika/programmation/haskell/pubiber> nil #<buffer Lib.hs> nil)
intero-get-worker-create(backend nil #<buffer Lib.hs> nil)
intero-buffer(backend)
intero-eldoc()错误消息中的ASCII字符序列是":set -fobject-code“。消息中的“-fobject”是intero-ghci-output-flags函数的结果,因此它似乎最终正常工作,但其余代码失败了。
注意:每当intero试图启动会话时,文件都会重新评估,这可能是为了解释为什么我在多次运行函数时得到了不一致的结果。
PS运行arch linux,系统几分钟前更新,所有emacs包更新。
--编辑--
因此,在进一步查看之后,在函数intero-start-process-in-buffer中,使用标志在2334-2337行中启动intero进程:
(set-process-query-on-exit-flag process nil)
(mapc
(lambda (flag)
(process-send-string process (append ":set " flag "\n")))
(intero-ghci-output-flags))
(process-send-string process ":set -fdefer-type-errors\n")他们使用append而不是concat来创建命令。
将append替换为concat修复了第二个错误,并且intero引导正常,并且似乎正常工作(在设置intero-ghc-version之后)。
--编辑2-
刚刚解决了最初的问题:函数使用变量intero-ghc-version,而不是用相同的名称调用函数。函数应该充当值的延迟加载器,第一次调用intero-ghc-version-raw,并在随后的时间返回缓存的值。
直接调用变量不允许最初设置值。关于临时修复,请参见TL;DR。
https://stackoverflow.com/questions/59058854
复制相似问题