首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >intero错误:错误类型-参数字符串为零

intero错误:错误类型-参数字符串为零
EN

Stack Overflow用户
提问于 2019-11-26 20:26:13
回答 1查看 1.3K关注 0票数 5

我正在试着让intero运行。安装后,从现有堆栈项目中打开Haskell文件将产生以下结果:

代码语言:javascript
复制
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文件的内容:

代码语言:javascript
复制
(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页面中建议的那样):

代码语言:javascript
复制
(package-install 'exec-path-from-shell)
(exec-path-from-shell-initialize)

但这没什么区别。

以下是已安装的包版本:

代码语言:javascript
复制
$ 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。

EN

回答 1

Stack Overflow用户

发布于 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:替换

代码语言:javascript
复制
(split-string intero-ghc-version "\\."))))

通过

代码语言:javascript
复制
(split-string (intero-ghc-version) "\\."))))

(请注意添加的括号)

2)在append中误用append进行字符串连接

append代表列表,concat代表字符串,这是一个很容易出错的错误,尤其是在Haskell String等同于[Char]的情况下(所以从技术上讲……一份名单!)

修复:修补函数intero-start-process-in-buffer,L.2335的intero.el:替换

代码语言:javascript
复制
 (process-send-string process (append ":set " flag "\n")))

通过

代码语言:javascript
复制
 (process-send-string process (concat ":set " flag "\n")))

源代码当前版本的第2335行,使用艾尔贴片)

一旦进行了这些修改,您就可以启动并运行了!

初始答案

这里也有同样的问题。

不是一个明确的答案,但我也有同样的问题,我可能已经将这个问题固定在运行的函数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“。

在对自发出现的错误消息进行实验之后,将其转换为:

代码语言:javascript
复制
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进程:

代码语言:javascript
复制
      (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。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59058854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档