自动重新加载ghci &在文件更新上运行 hlint
我正在考虑我理想的 haskell 编辑工作流程:
- 我打开三个终端(使用 iterm2 分割)。
- 终端 1 运行 vim 来编辑 haskell 源文件。
- 当当前目录或子目录中的文件更新或创建时,终端 2 会自动对更改的文件运行 hlint
- 。 终端 3 运行 ghci,自动加载/重新加载更改的文件。
有人设置过类似的东西吗?目标是让 hlint 不断监视我的代码是否存在样式问题,并且让 ghci 可以快速更改,除了将文件保存在 vim 中之外,无需执行任何操作。
我正在考虑使用 watchr 之类的东西来实现自动化。
I was thinking about my ideal haskell editing workflow:
- I open three terminals (split using iterm2).
- Terminal 1 runs vim for editing the haskell source files.
- Terminal 2 automatically runs hlint on the changed files whenenver a file in the current directory or subdirectory updates or is created
- Terminal 3 runs ghci, automatically loading/reloading the changed files.
Has anyone set up anything like this? The goal is to have hlint constantly watch my code for styling problems and for ghci be available for quick changes, without having to do anything other than saving the file in vim.
I was thinking of using something like watchr for the automation.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
您可以使用
BufWrite
自动命令在 vim 中运行任意 shell 命令:例如,将其放入
~/.vimrc
中:这将运行
echo; >>>每次保存 haskell 文件时都使用 ~/saves.txt
。所以这是触发外部脚本的简单方法。
现在您可以编写一些 iterm 脚本 将命令转发到其他终端。例如:
因此您可以使用 vim 自动命令来触发适当的 iterm 脚本(传递当前文件名,以便脚本可以告诉 ghci 和 hlint 要处理哪个文件)。
你可能想要打开和关闭它(你可能不想对每个 haskell 文件都这样做),所以考虑将功能包装在一个 vim 函数中,让你可以切换它(以及设置 iterm 应该如何设置参数)找到您的 ghci 和 hlint 终端)。
You can run arbitrary shell commands in vim using the
BufWrite
autocommand:For example, put this in your
~/.vimrc
:This will run
echo <CURRENT FILENAME> >> ~/saves.txt
every time you save a haskell file.So this is an easy way to trigger external scripts.
Now you can write some iterm scripts to relay commands to your other terminals. Something like:
So you can use the vim autocommand to trigger the appropriate iterm script (passing the current file name so the script can tell ghci and hlint which file to process).
You'll probably want to toggle this on and off (you may not want to do this for EVERY haskell file), so think about wrapping the functionality in a vim function that lets you toggle it (as well as set arguments for how iterm should find your ghci and hlint terminals).
https://github.com/ndmitchell/ghcid 支持在文件更改时自动重新加载 GHCi。
例如:ghcid '--command=stack ghci' --test=main
https://github.com/ndmitchell/ghcid supports auto reloading GHCi upon file changes.
For example:
ghcid '--command=stack ghci' --test=main
不确定您是否仍在寻找,但自动hlint问题的解决方案是 Syntastic,它会自动在您的文件上运行 hlint 或 ghc-mod 并突出显示错误/警告/样式警告的位置中的行/内容。
此外,当您将光标移动到该行时,它会在状态栏中显示消息/注释。
Not sure if you're still looking, but the solution to your auto-hlint problem is Syntastic, which automatically runs hlint or ghc-mod on your file and highlights lines/puts up in locations list the error/warnings/style warnings.
In addition, when you move your cursor onto that line, it displays the message/comment in the status bar.
您可以尝试为您的编辑器编写一个脚本,该脚本挂钩到
ghci
并在您点击Cs
时发送":r\n"
。我不知道你怎么能做到这一点,但我非常乐观地认为有一种使用 vim 的方法。You could try to write a script for your editor that hooks into
ghci
and send":r\n"
whenever you hitC-s
. I don't know how you could do that, but I am quite optimistic that there's a way using vim.脚本
这是一个脚本
inotifywait-stack-ghci.hs
:调用该脚本
我通常在这样的终端上运行它:
注意
欢迎提出改进这些问题的建议!
Script
Here's a script
inotifywait-stack-ghci.hs
:Invoking the script
I usually run it at a terminal like this:
Notes
Suggestions on improving these issues are welcome!
我设法使用
neovim
和stack
完成此设置。:vsplit term://zsh
(我已将其映射到 F5)stack repl
.hs
文件发送:r
到终端窗口。这并不理想,就好像您打开了两个终端窗口,一个使用
stack repl
,第二个使用其他东西,后者将获得:r
所以您只需了解这一点并在nvim
中保持一个终端打开。I managed to get this setup with
neovim
andstack
.ftplugin/haskell.vim
):vsplit term://zsh
(I have it mapped to F5)stack repl
.hs
files it should send:r
to terminal window.This is not ideal as if you have opened two terminal windows one with
stack repl
and second one with something else, the latter will get the:r
so you just have to be aware of it and keep one terminal opened in yournvim
.