From 148e9019f4c155e2774c4ed996b9a5791e6dec5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Madeleine=20Sydney=20=C5=9Alaga?= Date: Thu, 23 Apr 2026 07:37:49 -0600 Subject: [PATCH] feat(emacs): haskell --- .../users/msyds/emacs/lisp/syd/haskell.el | 65 +++++++++++++++++++ .../home/users/msyds/emacs/lisp/syd/lsp.el | 9 ++- 2 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 modules/home/users/msyds/emacs/lisp/syd/haskell.el diff --git a/modules/home/users/msyds/emacs/lisp/syd/haskell.el b/modules/home/users/msyds/emacs/lisp/syd/haskell.el new file mode 100644 index 0000000..81a166b --- /dev/null +++ b/modules/home/users/msyds/emacs/lisp/syd/haskell.el @@ -0,0 +1,65 @@ +;; -*- lexical-binding: t; -*- +(require 'syd/base) +(require 'syd/handle) + +(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)) + +(defun syd-haskell-hoogle-start-server () + (interactive) + (haskell-hoogle-start-server) + (message "Hoogle started on localhost:%d" haskell-hoogle-port-number)) + +(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 + (: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" #'syd-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 + (add-to-list 'completion-ignored-extensions ".hi")) + +(use-package lsp-haskell + :defer t + :custom ((lsp-haskell-server-path "haskell-language-server")) + :init + (add-hook 'haskell-mode-hook #'lsp-deferred 'append) + (add-hook 'haskell-literate-mode-hook #'lsp-deferred 'append)) + +(provide 'syd/haskell) diff --git a/modules/home/users/msyds/emacs/lisp/syd/lsp.el b/modules/home/users/msyds/emacs/lisp/syd/lsp.el index d1432a3..0076661 100644 --- a/modules/home/users/msyds/emacs/lisp/syd/lsp.el +++ b/modules/home/users/msyds/emacs/lisp/syd/lsp.el @@ -2,6 +2,7 @@ (require 'syd/base) (require 'syd/popups) +(require 'syd/handle) (use-package lsp-mode :init @@ -35,6 +36,12 @@ (syd-push shackle-rules `(("*lsp-help*" "*lsp-install*") - ,@syd-help-popup-options))) + :select nil :size 0.42 :popup t :align bottom)) + (defun syd-lsp-handle-docs () + (interactive) + (lsp-describe-thing-at-point) + (get-buffer "*lsp-help*")) + (syd-handle 'lsp-mode + :docs #'syd-lsp-handle-docs))) (provide 'syd/lsp)