5

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

C-c C-l, 换帧, main<ret>, 变回原帧

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

4

2 回答 2

7

实际上已经在inf-haskell.el:中定义了一个函数来执行此操作inferior-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 ...where :mainis not 的影响。

如果你想留在你当前的 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)))
于 2012-11-03T21:50:38.597 回答
0

要使用interactive-haskell-mode,我发现了与其他答案类似的设置:

(defun my-haskell-load-and-run ()
  "Loads and runs the current Haskell file main function."
  (interactive)
  (haskell-process-load-file)
  (haskell-interactive-mode-run-expr "main"))
(defun my-haskell-mode-hook ()
  (local-set-key (kbd "C-x C-r") 'my-haskell-load-and-run))
(add-hook 'haskell-mode-hook 'my-haskell-mode-hook)

但我有一个小问题,它总是跳到源缓冲区的末尾......这可能很烦人。

于 2022-02-21T19:58:40.613 回答