Skip to content

Latest commit

 

History

History
128 lines (103 loc) · 5.07 KB

ome-haskell.org

File metadata and controls

128 lines (103 loc) · 5.07 KB

Oh My Emacs Haskell

This is part of oh-my-emacs.

Prerequisites

PackageWindowsUbuntu/Debian/MintArchLinuxFedoraMac OS XMandatory?
GHCghcYes

El-get packages

PackageStatusDescription
haskell-modeRequiredThis is a package for developing haskell in Emacs

About Haskell

You can find all the necessary information about haskell in the official site.

haskell-mode

haskell-mode features a wide a range of tooling, from basic editing to building packages and interactive evaluation. The package customization defined in the ome-haskell-mode-setup function mostly come from this example file with some minor teaks according personal preferences.

(defun ome-haskell-mode-setup ()
  (add-to-list 'load-path ".")
  ;; Always load via this. If you contribute you should run `make all`
  ;; to regenerate this.
  (load "haskell-mode-autoloads")

  ;; Customization
  (custom-set-variables
   ;; Use cabal-dev for the GHCi session. Ensures our dependencies are in scope.
   ;;'(haskell-process-type 'cabal-dev)

   ;; Use notify.el (if you have it installed) at the end of running
   ;; Cabal commands or generally things worth notifying.
   '(haskell-notify-p t)

   ;; To enable tags generation on save.
   '(haskell-tags-on-save t)

   ;; To enable stylish on save.
   '(haskell-stylish-on-save t))

  (add-hook 'haskell-mode-hook 'haskell-hook)
  (add-hook 'haskell-mode-hook 'interactive-haskell-mode)
  (add-hook 'haskell-mode-hook 'haskell-indent-mode)
  (add-hook 'haskell-cabal-mode-hook 'haskell-cabal-hook)

  ;; Haskell main editing mode key bindings.
  (defun haskell-hook ()
    ;; Use simple indentation.
    (turn-on-haskell-simple-indent)
    (define-key haskell-mode-map (kbd "<return>") 'haskell-simple-indent-newline-same-col)
    (define-key haskell-mode-map (kbd "C-<return>") 'haskell-simple-indent-newline-indent)

    ;; Load the current file (and make a session if not already made).
    (define-key haskell-mode-map [?\C-c ?\C-l] 'haskell-process-load-file)
    (define-key haskell-mode-map [f5] 'haskell-process-load-file)

    ;; Switch to the REPL.
    (define-key haskell-mode-map [?\C-c ?\C-z] 'haskell-interactive-switch)
    ;; “Bring” the REPL, hiding all other windows apart from the source
    ;; and the REPL.
    (define-key haskell-mode-map (kbd "C-`") 'haskell-interactive-bring)

    ;; Build the Cabal project.
    (define-key haskell-mode-map (kbd "C-c C-c") 'haskell-process-cabal-build)
    ;; Interactively choose the Cabal command to run.
    (define-key haskell-mode-map (kbd "C-c c") 'haskell-process-cabal)

    ;; Get the type and info of the symbol at point, print it in the
    ;; message buffer.
    (define-key haskell-mode-map (kbd "C-c C-t") 'haskell-process-do-type)
    (define-key haskell-mode-map (kbd "C-c C-i") 'haskell-process-do-info)

    ;; Contextually do clever things on the space key, in particular:
    ;;   1. Complete imports, letting you choose the module name.
    ;;   2. Show the type of the symbol after the space.
    (define-key haskell-mode-map (kbd "SPC") 'haskell-mode-contextual-space)

    ;; Jump to the imports. Keep tapping to jump between import
    ;; groups. C-u f8 to jump back again.
    (define-key haskell-mode-map [f8] 'haskell-navigate-imports)

    ;; Jump to the definition of the current symbol.
    (define-key haskell-mode-map (kbd "M-.") 'haskell-mode-tag-find)

    ;; Indent the below lines on columns after the current column.
    (define-key haskell-mode-map (kbd "C-<right>")
      (lambda ()
        (interactive)
        (haskell-move-nested 1)))
    ;; Same as above but backwards.
    (define-key haskell-mode-map (kbd "C-<left>")
      (lambda ()
        (interactive)
        (haskell-move-nested -1))))

  ;; Useful to have these keybindings for .cabal files, too.
  (defun haskell-cabal-hook ()
    (define-key haskell-cabal-mode-map (kbd "C-c C-c") 'haskell-process-cabal-build)
    (define-key haskell-cabal-mode-map (kbd "C-c c") 'haskell-process-cabal)
    (define-key haskell-cabal-mode-map (kbd "C-`") 'haskell-interactive-bring)
    (define-key haskell-cabal-mode-map [?\C-c ?\C-z] 'haskell-interactive-switch)))

(when (executable-find "ghc")
  (ome-install 'haskell-mode))