;;; syd-lang-haskell.el -*- lexical-binding: t; -*- (require 'syd-handle-repl) (require 'syd-handle-lookup) (defun syd-haskell-open-repl () "Open a Haskell REPL." (interactive) (require 'inf-haskell) (run-haskell)) (defun syd-haskell-evil-open-above () "Opens a line above the current, following Haskell-mode's indentation" (interactive) (evil-beginning-of-line) (haskell-indentation-newline-and-indent) (evil-previous-line) (haskell-indentation-indent-line) (evil-append-line nil)) (defun syd-haskell-evil-open-below () "Opens a line below the current, following Haskell-mode's indentation" (interactive) (evil-append-line nil) (haskell-indentation-newline-and-indent)) (use-package haskell-mode :mode (("\\.l?hs'" . haskell-literate-mode) ("\\.hs'" . haskell-mode)) :custom (; Show errors in REPL, not popup buffers. (haskell-interactive-popup-errors nil) (haskell-process-suggest-remove-import-line t) (haskell-process-auto-import-loaded-modules t)) :general ;; DEPRECATED: Remove once a `map!' equivalent is implemented. (:keymaps 'haskell-mode-map :states '(normal visual motion emacs insert) :major-modes t :prefix syd-localleader-key :non-normal-prefix syd-alt-localleader-key "c" #'haskell-cabal-visit-file "h s" #'haskell-hoogle-start-server "h q" #'haskell-hoogle-kill-server) (:keymaps 'interactive-haskell-mode-map :states '(normal insert) "C-j" #'haskell-interactive-mode-history-next "C-k" #'haskell-interactive-mode-history-previous) (:keymaps 'haskell-mode-map :states 'normal [remap evil-open-above] #'syd-haskell-evil-open-above [remap evil-open-below] #'syd-haskell-evil-open-below) :config (set-repl-handler! '(haskell-mode haskell-cabal-mode literate-haskell-mode) #'syd-haskell-open-repl ;; Haskell-mode provides IDE features by communicating with a persistent ;; REPL process à la Lisp. :persist t) (add-to-list 'completion-ignored-extensions ".hi") ;; Don't kill REPL popup on ESC/C-g (set-popup-rule! "^\\*haskell\\*" :quit nil) (syd-add-hook 'haskell-mode-local-vars-hook ;; Folding of Haskell sections. #'haskell-collapse-mode #'interactive-haskell-mode)) (use-package lsp-haskell :defer t :init (add-hook 'haskell-mode-local-vars-hook #'lsp 'append) (add-hook 'haskell-literate-mode-local-vars-hook #'lsp 'append)) (provide 'syd-lang-haskell)