我正在编辑一个 haskell 源文件。我想在我的 subior-haskell 缓冲区(已经在不同的框架中打开)中运行我的 main 函数并继续编辑我的源文件。为此,我做
C-c C-l
, 换帧, main<ret>
, 变回原帧
这似乎效率很低。我想要一个一次性完成的emacs功能/键。
实际上已经在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 :main
is 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)))
要使用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)
但我有一个小问题,它总是跳到源缓冲区的末尾......这可能很烦人。