内部错误:错误类型参数stringp nil

问题描述 投票:5回答:1

我正在尝试使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。

我正在尝试让Intero运行。安装后,从现有堆栈项目中打开Haskell文件将导致:输入调试器-Lisp错误:(错误类型参数stringp nil)信号(错误类型......>)>

TL; DR

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

1)intero-ghc-version未设置

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

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

(split-string intero-ghc-version "\\."))))

作者

(split-string (intero-ghc-version) "\\."))))

(注意添加的括号)

2]滥用append进行intero-start-process-in-buffer中的字符串连接>

[append用于列表,concat用于字符串,这是一个容易犯的错误,尤其是在Haskell中,String等效于[Char](因此从技术上讲是一个列表!)]

fix:

修补功能intero-start-process-in-buffer的功能intero.el的L.2335:替换
 (process-send-string process (append ":set " flag "\n")))

作者

 (process-send-string process (concat ":set " flag "\n")))

source code当前版本的2335行,使用el-patch

一旦进行了这些修改,就应该启动并运行!


初始回答


这里是同一问题。

不是一个明确的答案,但是我有相同的问题,并且可能是由于intero-ghci-output-flags变量未正确设置而使该问题归因于正在运行的函数intero-ghc-version。随时纠正我,因为我可能错过了一些东西。

根据错误消息,我确认它在(flycheck-start-current-syntax-check checker)功能的flycheck-buffer中发生。直接从haskell缓冲区运行此命令,则显示从(split-string intero-ghc-version "\\.")文件(第2671行)中的intero-ghci-output-flags函数调用intero.el时发生错误。

这将尝试拆分内部版本(由文件中上面的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-code”是intero-ghci-output-flags函数的结果,因此看来它终于可以正常工作,但是其余代码失败了。

注意:

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

PS

运行arch linux,系统在几分钟前更新,所有emacs软件包已更新。

----编辑----

因此,在功能intero-start-process-in-buffer中看了更多之后,它使用这些标志在第2334-2337行中开始了内部交互过程:

      (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以获得临时修复。

haskell emacs haskell-stack intero
1个回答
1
投票

TL; DR

© www.soinside.com 2019 - 2024. All rights reserved.