Haskell ソース ファイルを編集しています。Inferior-haskell バッファー (既に別のフレームで開かれている) でメイン関数を実行し、ソース ファイルの編集を続けたいと考えています。これを行うために、私は
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 ...
: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)))