# HG changeset patch # User Pranshu Sharma # Date 1734010195 -36000 # Node ID 9272314a1c65caad30d88ef730e0752359a85c63 # Parent 27f2627e9f2fd8ec81d48cfe3cabacade3f47f53 Fixed up readme and some typos, and added .elpaignore .elpaignore: Added the file README.org: Formatting changes haskell-ts-mode.el: Remvoed eglot support by default diff -r 27f2627e9f2f -r 9272314a1c65 .elpaignore --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.elpaignore Thu Dec 12 23:29:55 2024 +1000 @@ -0,0 +1,3 @@ +ss.png +README.org +LICENSE \ No newline at end of file diff -r 27f2627e9f2f -r 9272314a1c65 README.org --- a/README.org Thu Dec 12 23:05:57 2024 +1000 +++ b/README.org Thu Dec 12 23:29:55 2024 +1000 @@ -1,3 +1,5 @@ +#+title: haskell-ts-mode +#+author: Pranshu Sharma * haskell-ts-mode @@ -7,16 +9,21 @@ [[./ss.png]] -The above screenshot is indented coloured using haskell-ts-mode, with -prettify-symbols-mode enabled. +The above screenshot is indented and coloured using haskell-ts-mode, +with =prettify-symbols-mode= enabled. * Usage =C-c C-r= to open REPL =C-c C-c= to send code to repl -=C-M-q= Indent paragraph +=C-M-q= Indent the function * Features + +say it with me: indentation does not change the syntax-tree. This +means that the indenation is a lot more predictable, but sometimes you +must manually press M-i to indent. + an overview of the features are: - Syntax highliting - Indentation @@ -28,19 +35,13 @@ The more interesting features are: - Logical syntax highlighting: - Only arguments that can be used in functions are highlighted, eg - in `f (_:(a:[])) only 'a' is highlighted, as it is the only + in =f (_:(a:[]))= only =a= is highlighted, as it is the only variable that is captured that can be used in body of function - The return type of a function is highlighted - All new variabels are(or should be) highlighted, this includes generators, lambda args. - highlighting the '=' operaotr in guarded matches correctly, this would be stupidly hard in regexp based syntax -- Unlike haskell-mode, quasi quotes are understood and do not confuse - the mode, thanks to treesitter -- Predictable (but less powerful) indentation: haskell-mode's - indentation works in a cyclical way, it cycles through where you - might want indentation. haskell-ts-mode, meanwhile relies on you to - set the concrete syntax tree changing whitespace. - More perfomant, this is especially seen in longer files - Much much less code, haskell mode has accumlated 30,000 lines of features to do with all things haskell related, this mode just keeps @@ -49,12 +50,12 @@ * Motivation -haskell-mode contains nearly 30k lines of code, and is +=haskell-mode= contains nearly 30k lines of code, and is about 30 years old. Therefore, a lot of stuff emacs has gained the ability to do in those years, haskell-mode already has implemented them. -In 2018, a mode called haskell-tng-mode was made to solve some of +In 2018, a mode called =haskell-tng-mode= was made to solve some of these problems. However because of haskell's syntax, it too became very complex and required a web of dependencies. @@ -74,7 +75,7 @@ * Customization If colour is too much or too less for you, adjust -treesit-font-lock-level accordingly. +=treesit-font-lock-level= accordingly. If you want to highlight signature declarations (disabled by default), add the following to your init file: @@ -89,7 +90,7 @@ #+end_src ** Pretify symbols mode -prettify symbols mode can be used to replace common symbols with +=prettify-symbols-mode= can be used to replace common symbols with unicode alternatives. #+begin_src emacs-lisp @@ -97,23 +98,26 @@ #+end_src ** Adjusting font lock level -set haskell-ts-font-lock-level accordingly. +set =haskell-ts-font-lock-level= accordingly. Default value is 4, so if +you suffer from contagious dehydration, you can lower it. ** Language server -haskell-ts-mode is compatiable with lsp-haskell. +=haskell-ts-mode= now works with =lsp-mode=, however =lsp-haskell= still requires on =haskell-mode=. + +To add =eglot= support, add the following code to you init.el: -To enable eglot support, use the following code in your init.el: #+begin_src emacs-lisp -(with-eval-after-load 'eglot (haskell-ts-setup-eglot)) + (with-eval-after-load 'eglot + (defvar eglot-server-programs) + (add-to-list 'eglot-server-programs + '(haskell-ts-mode . ("haskell-language-server-wrapper" "--lsp")))) #+end_src -* TODO and limitations +* TODO - Imenu support for functions with multiple definitions - -Limitations: _Proper indenting of multiline signatures_: the -treesitter grammer does not flatten the signautes, rather leaves them -to the standard infix interpretatoin. This makes indentation hard, as -it will mean the only way to check if the the signature node is an -ancestor of node at point is to perfom a recursive ascent, which is -horrible for perfomance. +- _Proper indenting of multiline signatures_: the treesitter grammer + does not flatten the signautes, rather leaves them to the standard + infix interpretatoin. This makes indentation hard, as it will mean + the only way to check if the the signature node is an ancestor of + node at point is to perfom a recursive ascent. diff -r 27f2627e9f2f -r 9272314a1c65 haskell-ts-mode.el --- a/haskell-ts-mode.el Thu Dec 12 23:05:57 2024 +1000 +++ b/haskell-ts-mode.el Thu Dec 12 23:29:55 2024 +1000 @@ -358,10 +358,10 @@ (setq-local comment-start "-- ") (setq-local comment-use-syntax t) (setq-local comment-start-skip "\\(?: \\|^\\)-+") - ;; Elecric + ;; Electric (setq-local electric-pair-pairs '((?` . ?`) (?\( . ?\)) (?{ . ?}) (?\" . ?\") (?\[ . ?\]))) - ;; Nav + ;; Navigation (setq-local treesit-defun-name-function 'haskell-ts-defun-name) (setq-local treesit-defun-type-regexp ;; Since haskell is strict functional, any 2nd level @@ -438,13 +438,6 @@ (defun haskell-ts-haskell-session () (get-buffer-process "*haskell*")) -(defvar eglot-server-programs) - -(defun haskell-ts-setup-eglot() - (interactive) - (add-to-list 'eglot-server-programs - '(haskell-ts-mode . ("haskell-language-server-wrapper" "--lsp")))) - (when (treesit-ready-p 'haskell) (add-to-list 'auto-mode-alist '("\\.hs\\'" . haskell-ts-mode)))