自动重新加载ghci&在文件更新上运行hlint

时间:2011-10-09 18:48:10

标签: haskell ghci watchr

我在想我理想的haskell编辑工作流程:

  • 我打开三个终端(使用iterm2拆分)。
  • 终端1运行vim以编辑haskell源文件。
  • 当当前目录或子目录中的文件更新或创建时,终端2会自动在已更改的文件上运行hlint
  • 终端3运行ghci,自动加载/重新加载已更改的文件。

有没有人设置过这样的东西?我们的目标是让hlint不断观察我的代码中的样式问题,并且可以快速更改ghci,而不必在vim中保存文件。

我在考虑使用类似watchr的东西进行自动化。

5 个答案:

答案 0 :(得分:7)

您可以使用BufWrite自动命令:

在vim中运行任意shell命令

例如,将其放在~/.vimrc

au BufWrite *.hs !echo % >> ~/saves.txt 

每次保存haskell文件时都会运行echo <CURRENT FILENAME> >> ~/saves.txt

因此,这是触发外部脚本的简便方法。

现在您可以编写一些iterm scripts来将命令转发到其他终端。类似的东西:

tell my_ghci_terminal
  write text ":r\n"
end tell
tell my_hlint_terminal
  write text "<RUN HLINT ON WHATEVER>"
end tell

因此,您可以使用vim自动命令触发相应的iterm脚本(传递当前文件名,以便脚本可以告诉ghci和hlint要处理哪个文件)。

你可能想要打开和关闭它(你可能不想为每个haskell文件执行此操作),所以考虑将功能包装在vim函数中,让你切换它(以及设置参数为如何找到你的ghci和hlint终端。)

答案 1 :(得分:2)

不确定您是否还在寻找,但自动hlint问题的解决方案是Syntastic,它会自动在您的文件上运行hlint或ghc-mod并突出显示行/列表中的错误列出错误/警告/风格警告。

此外,当您将光标移动到该行时,它会在状态栏中显示消息/注释。

答案 2 :(得分:1)

您可以尝试编写一个链接到ghci的编辑器的脚本,并在您点击":r\n"时发送C-s。我不知道你怎么能这样做,但我很乐观有一种使用vim的方式。

答案 3 :(得分:0)

https://github.com/ndmitchell/ghcid支持在文件更改时自动重新加载GHCi。

例如:ghcid '--command=stack ghci' --test=main

答案 4 :(得分:0)

脚本

这是一个脚本 inotifywait-stack-ghci.hs

#!/bin/sh


$(while inotifywait -e close_write $1; do pkill ghc; done) &

while inotifywait -e close_write $1
do 
    sleep 2
    stack ghci $1    
done

调用脚本

我通常在这样的终端上运行它:

exec ./inotifywait-stack-ghci.hs abc.hs

备注

  • 假设您只有一个 ghc 实例正在运行。
  • 出于某种原因,您必须将文件保存两次才能重新加载。
  • 如果文件是在 vscode 或 nano 中编辑的,则有效。 vim 和 emacs 似乎不适用于脚本。

欢迎提出改进这些问题的建议!