intero 错误:错误类型参数 stringp nil

Max*_*xim 6 emacs haskell haskell-stack intero

我正在尝试让 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)
Run Code Online (Sandbox Code Playgroud)

当我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)
Run Code Online (Sandbox Code Playgroud)

由于我在 Mac Os 上,我也尝试添加(如 flycheck 页面上的建议):

(package-install 'exec-path-from-shell)
(exec-path-from-shell-initialize)
Run Code Online (Sandbox Code Playgroud)

但这没什么区别。

以下是已安装的软件包版本:

$ 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/
Run Code Online (Sandbox Code Playgroud)

这是使用 GNU Emacs 26.3。

mik*_*ake 6

TL; 博士

我发现了两个问题和一个(至少是临时的)修复程序。我正在为他们两个提交拉取请求,但与此同时,您可以通过直接编辑 intero.el 文件或(推荐方式)使用伟大的el-patch包为自己解决问题。

1)intero-ghc-version未设置

这是由于在函数(L.2668)intero.el中使用intero-ghc-version局部变量而不是调用函数(intero-ghc-version)intero-ghci-output-flags

修复:修补功能intero-ghci-output-flags:替换

(split-string intero-ghc-version "\\."))))
Run Code Online (Sandbox Code Playgroud)

经过

(split-string (intero-ghc-version) "\\."))))
Run Code Online (Sandbox Code Playgroud)

(注意添加的括号)

2) 误用appendfor 字符串连接intero-start-process-in-buffer

append用于列表,concat用于字符串,这是一个简单的错误,尤其是在 HaskellString中相当于[Char](所以技术上......一个列表!)

修复:修补intero-start-process-in-bufferintero.el的L.2335功能:替换

 (process-send-string process (append ":set " flag "\n")))
Run Code Online (Sandbox Code Playgroud)

经过

 (process-send-string process (concat ":set " flag "\n")))
Run Code Online (Sandbox Code Playgroud)

当前版本源代码的第 2335 行,使用el-patch

完成这些修改后,您应该可以正常运行了!


初步答复


同样的问题在这里。

不是明确的答案,但我有同样的问题,并且可能已将问题归结为intero-ghci-output-flags正在运行的函数,因为intero-ghc-version变量设置不正确。请随时纠正我,因为我可能错过了一些事情。

通过以下的错误信息,我确认它发生在(flycheck-start-current-syntax-check checker)flycheck-buffer功能。
直接从 haskell 缓冲区运行它表明(split-string intero-ghc-version "\\.")intero.el文件中的intero-ghci-output-flags函数调用时发生错误(第 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()
Run Code Online (Sandbox Code Playgroud)

错误消息中的 ASCII 字符序列是“:set -fobject-code”。消息中的“-fobject-code”是intero-ghci-output-flags函数的结果,所以看起来它终于正常工作了,但其余的代码失败了。

注意: 每当 intero 尝试启动会话时,都会重新评估文件这一事实可能会解释为什么我在多次运行这些函数时得到不一致的结果。

PS运行arch linux,系统几分钟前更新,所有emacs包更新。

- - 编辑 - -

因此,在查看更多内容之后,在函数intero-start-process-in-buffer2334-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")
Run Code Online (Sandbox Code Playgroud)

他们使用append而不是concat创建命令。
替换appendconcat修复了第二个错误,并且 intero 正常启动并且似乎正常工作(设置后intero-ghc-version)。

---- 编辑 2 ----

刚刚找出原来的问题:该函数使用变量intero-ghc-version而不是调用具有相同名称的函数。该函数应该充当值的延迟加载器,intero-ghc-version-raw第一次调用,并在随后的时间返回缓存的值。

直接调用变量不允许初始设置值。有关临时修复,请参阅 TL;DR。