15

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

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

有没有人设置过这样的东西?目标是让 hlint 不断观察我的代码是否存在样式问题,并让 ghci 可用于快速更改,而无需执行任何操作,只需将文件保存在 vim 中即可。

我正在考虑使用类似watchr的东西来实现自动化。

4

6 回答 6

7

BufWrite您可以使用自动命令在 vim 中运行任意 shell 命令:

例如,把它放在你的~/.vimrc

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

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

所以这是一种触发外部脚本的简单方法。

现在您可以编写一些iterm 脚本来将命令中继到您的其他终端。就像是:

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 函数中,以便您切换它(以及设置 iterm 应该如何使用的参数找到你的 ghci 和 hlint 终端)。

于 2011-10-10T19:27:01.490 回答
4

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

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

于 2018-01-16T12:09:19.823 回答
2

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

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

于 2013-07-28T08:44:54.463 回答
1

您可以尝试为您的编辑器编写一个脚本,该脚本会ghci":r\n"您点击C-s. 我不知道你怎么能做到这一点,但我非常乐观地认为有一种使用 vim 的方法。

于 2011-10-09T19:32:21.013 回答
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 似乎不适用于脚本。

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

于 2021-07-25T17:57:51.180 回答
0

我设法用neovimand完成了这个设置stack

  1. 在 vim 配置中(我有它ftplugin/haskell.vim
augroup Terminal
  au!
  au TermOpen * let g:last_terminal_chan_id = b:terminal_job_id
augroup END

function ReloadGhci()
   let ghc_running = system("pgrep ghc")
   if ghc_running && get(g:, 'last_terminal_chan_id', 0)
      :silent! :call chansend(g:last_terminal_chan_id, ":r\<cr>")
   endif
endfunction

augroup reload_ghci
au!
au BufWritePost *.hs :call ReloadGhci()
augroup END

  1. 在 neovim 中打开你的主项目文件夹
  2. 打开终端窗口前。:vsplit term://zsh(我已将其映射到 F5)
  3. 在终端窗口中stack repl
  4. 现在保存.hs文件,它应该发送:r到终端窗口。

这并不理想,因为如果您打开了两个终端窗口,一个是打开的stack repl,第二个是其他的,后者会得到,:r所以您只需要注意它并保持一个终端在您的nvim.

于 2021-12-18T21:31:14.873 回答