feat(emacs): haskell
This commit is contained in:
65
modules/home/users/msyds/emacs/lisp/syd/haskell.el
Normal file
65
modules/home/users/msyds/emacs/lisp/syd/haskell.el
Normal file
@@ -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)
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
(require 'syd/base)
|
(require 'syd/base)
|
||||||
(require 'syd/popups)
|
(require 'syd/popups)
|
||||||
|
(require 'syd/handle)
|
||||||
|
|
||||||
(use-package lsp-mode
|
(use-package lsp-mode
|
||||||
:init
|
:init
|
||||||
@@ -35,6 +36,12 @@
|
|||||||
(syd-push
|
(syd-push
|
||||||
shackle-rules
|
shackle-rules
|
||||||
`(("*lsp-help*" "*lsp-install*")
|
`(("*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)
|
(provide 'syd/lsp)
|
||||||
|
|||||||
Reference in New Issue
Block a user