[Haskell-cafe] Re: Using Cabal during development
Jose A. Ortega Ruiz
jao at gnu.org
Tue Feb 9 13:41:47 EST 2010
Johan Tibell <johan.tibell at gmail.com> writes:
> 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---
More information about the Haskell-Cafe
mailing list