
Johan Tibell
It's really unfortunate that this approach doesn't work for .hsc files. When writing low level libraries I often have a couple of these which forces me out of my nice Emacs workflow into an Emacs + terminal + Cabal workflow.
I use the elisp code below to run cabal without leaving emacs, with its output going into a compilation buffer (so that one can jump to the errors). C-c c will find the cabal file nearest to the current buffer and invoke cabal. HTH, jao --8<---------------cut here---------------start------------->8--- (defun jao-locate-dominating-files (regexp &optional file) "Look up the directory hierarchy from FILE for a file matching REGEXP. Stop at the first parent where a matching file is found and return the list of files that that match in this directory." (catch 'found (let ((dir (file-name-as-directory (or file (buffer-file-name)))) files) (while (and dir (not (string-match locate-dominating-stop-dir-regexp dir))) (if (setq files (condition-case nil (directory-files dir 'full regexp 'nosort) (error nil))) (throw 'found files) (if (equal dir (setq dir (file-name-directory (directory-file-name dir)))) (setq dir nil)))) nil))) (defun jao-haskell-locate-cabal-file () "Find the cabal file associated with current buffer." (car (jao-locate-dominating-files ".+\\.cabal"))) (eval-after-load 'haskell-mode '(add-hook 'haskell-mode-hook (lambda () (set (make-local-variable 'compile-command) "cabal build")))) (defun jao-haskell-cabal-build () "Run, in a compilation buffer, a cabal command, after finding the cabal file associated with this buffer." (interactive) (let ((cabal-file (jao-haskell-locate-cabal-file))) (unless cabal-file (error "Couldn't find associated cabal file")) (let ((default-directory (file-name-directory cabal-file))) (call-interactively 'compile)))) (eval-after-load 'haskell-mode '(define-key haskell-mode-map [?\C-c ?c] 'jao-haskell-cabal-build)) --8<---------------cut here---------------end--------------->8---