在使用Emacs编辑源文件时评估ghci中的haskell的函数

时间:2012-11-03 21:32:56

标签: haskell emacs ghci

我正在编辑一个haskell源文件。我想在我的inferior-haskell缓冲区(已经在不同的框架中打开)中运行我的main函数并继续编辑我的源文件。要做到这一点,我做

C-c C-l,更改框架,main<ret>,更改回原始框架

这似乎效率很低。我想要一个emacs功能/键,一次性完成。

1 个答案:

答案 0 :(得分:7)

实际上有一个功能可以在inf-haskell.elinferior-haskell-load-and-run中定义。这会加载您当前的文件并运行:main

您可以通过添加钩子将其绑定到Haskell模式中的键:

(defun my-haskell-mode-hook ()
  (local-set-key (kbd "C-x C-r") 'inferior-haskell-load-and-run))
(add-hook 'haskell-mode-hook 'my-haskell-mode-hook)

然而,稍微讨论一下这个问题似乎在我的计算机上有一个奇怪的问题:有时,当它弹出到*haskell*缓冲区时,它不会将点移动到结尾。我觉得这很烦人。您可以通过自己将点移动到最终来轻松修复它:

(defun my-haskell-load-and-run ()
  "Loads and runs the current Haskell file."
  (interactive)
  (inferior-haskell-load-and-run inferior-haskell-run-command)
  (sleep-for 0 100)
  (end-of-buffer))

我相信sleep-for是必要的,因为Haskell命令是异步运行的,需要一点时间才能返回。这一切都是黑客攻击,但它似乎有效。

此外,您可能希望准确自定义inferior-haskell-run-command的内容。默认情况下,它是:main。但是,对我来说,我认为只有main才会更好,因为main:set args ...的影响而:main不在其中。

如果你想留在当前的Haskell缓冲区中,你可以这样做:

(defun my-haskell-load-and-run ()
  "Loads and runs the current Haskell file."
  (interactive)
  (let ((start-buffer (current-buffer)))
    (inferior-haskell-load-and-run inferior-haskell-run-command)
    (sleep-for 0 100)
    (end-of-buffer)
    (pop-to-buffer start-buffer)))