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

发布于 2024-12-09 11:11:11 字数 381 浏览 3 评论 0原文

我正在考虑我理想的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

于我来说 2024-12-16 11:11:11

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

例如,将其放入 ~/.vimrc 中:

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

这将运行 echo; >>>每次保存 haskell 文件时都使用 ~/saves.txt

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

现在您可以编写一些 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 终端)。

You can run arbitrary shell commands in vim using the BufWrite autocommand:

For example, put this in your ~/.vimrc:

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

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:

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

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).

離殇 2024-12-16 11:11:11

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

始终不够 2024-12-16 11:11:11

不确定您是否仍在寻找,但自动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.

剧终人散尽 2024-12-16 11:11:11

您可以尝试为您的编辑器编写一个脚本,该脚本挂钩到 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 hit C-s. I don't know how you could do that, but I am quite optimistic that there's a way using vim.

忆梦 2024-12-16 11:11:11

脚本

这是一个脚本 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 似乎不太适合该脚本。

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

Script

Here's a script 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

Invoking the script

I usually run it at a terminal like this:

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

Notes

  • It assumes that you only have one instance of ghc running.
  • For some reason, you have to save the file twice for the reload to happen.
  • Works if the file is edited in vscode or nano. vim and emacs seem to not work well with the script.

Suggestions on improving these issues are welcome!

药祭#氼 2024-12-16 11:11:11

我设法使用 neovimstack 完成此设置。

  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 打开终端窗口 ex 中打开主项目文件夹
  2. :vsplit term://zsh (我已将其映射到 F5)
  3. 在终端窗口中 stack repl
  4. 现在保存它应该的 .hs 文件发送 :r 到终端窗口。

这并不理想,就好像您打开了两个终端窗口,一个使用 stack repl ,第二个使用其他东西,后者将获得 :r 所以您只需了解这一点并在 nvim 中保持一个终端打开。

I managed to get this setup with neovim and stack.

  1. In vim config (I have it under 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. Open your main project folder in neovim
  2. Open Terminal window ex. :vsplit term://zsh (I have it mapped to F5)
  3. In Terminal Window stack repl
  4. Now on save for .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 your nvim.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文