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
--- /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
--- 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.
--- 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)))