From f0f51a22cb5dad5105ef2660aef6738bcf0a4cdc Mon Sep 17 00:00:00 2001 From: Abdelhak Bougouffa Date: Tue, 16 Aug 2022 15:34:03 +0200 Subject: [PATCH 1/8] feat(grammar): add `+lsp` to provide `lsp-ltex` --- modules/checkers/grammar/config.el | 57 ++++++++++++++++++++++++++++ modules/checkers/grammar/doctor.el | 6 +++ modules/checkers/grammar/packages.el | 6 ++- 3 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 modules/checkers/grammar/doctor.el diff --git a/modules/checkers/grammar/config.el b/modules/checkers/grammar/config.el index 9f987c17d26..60475fbb724 100644 --- a/modules/checkers/grammar/config.el +++ b/modules/checkers/grammar/config.el @@ -1,6 +1,7 @@ ;;; checkers/grammar/config.el -*- lexical-binding: t; -*- (use-package! langtool + :unless (modulep! +lsp) :commands (langtool-check langtool-check-done langtool-show-message-at-point @@ -26,6 +27,62 @@ (setq langtool-java-classpath "/usr/share/languagetool:/usr/share/java/languagetool/*"))))) +(use-package! lsp-ltex + :when (modulep! +lsp) + :unless (modulep! :tools lsp +eglot) + :commands (+lsp-ltex-toggle + +lsp-ltex-enable + +lsp-ltex-disable + +lsp-ltex-setup) + :hook ((text-mode latex-mode org-mode markdown-mode) . #'+lsp-ltex-setup) + :init + (setq lsp-ltex-check-frequency "save" ;; Less overhead than the default "edit" + lsp-ltex-log-level "warning" ;; No need to log everything + ;; Path in which, interactively added words and rules will be stored. + lsp-ltex-user-rules-path (expand-file-name "lsp-ltex" doom-data-dir)) + + ;; When n-gram data sets are available, use them to detect errors with words + ;; that are often confused (like their and there). + (when (file-directory-p "/usr/share/ngrams") + (setq lsp-ltex-additional-rules-language-model "/usr/share/ngrams")) + + (defun +lsp-ltex-setup () + "Load LTeX LSP server." + (interactive) + (require 'lsp-ltex) + (lsp-deferred)) + + (defun +lsp-ltex--enabled-p () + (not (memq 'ltex-ls lsp-disabled-clients))) + + (defun +lsp-ltex-enable () + "Enable LTeX LSP for the current buffer." + (interactive) + (unless (+lsp-ltex--enabled-p) + (delq! 'ltex-ls lsp-disabled-clients) + (message "Enabled ltex-ls")) + (+lsp-ltex-setup)) + + (defun +lsp-ltex-disable () + "Disable LTeX LSP for the current buffer." + (interactive) + (when (+lsp-ltex--enabled-p) + (add-to-list 'lsp-disabled-clients 'ltex-ls) + (lsp-disconnect) + (message "Disabled ltex-ls"))) + + (defun +lsp-ltex-toggle () + "Toggle LTeX LSP for the current buffer." + (interactive) + (if (+lsp-ltex--enabled-p) + (+lsp-ltex-disable) + (+lsp-ltex-enable))) + + (map! :localleader + :map (text-mode-map latex-mode-map org-mode-map markdown-mode-map) + :desc "Toggle grammar check" "G" #'+lsp-ltex-toggle)) + + ;; Detects weasel words, passive voice and duplicates. Proselint would be a ;; better choice. (use-package! writegood-mode diff --git a/modules/checkers/grammar/doctor.el b/modules/checkers/grammar/doctor.el new file mode 100644 index 00000000000..46d2c732877 --- /dev/null +++ b/modules/checkers/grammar/doctor.el @@ -0,0 +1,6 @@ +;; -*- lexical-binding: t; no-byte-compile: t; -*- +;;; checkers/grammar/doctor.el + +(assert! (or (not (modulep! +lsp)) + (modulep! :tools lsp)) + "This module requires (:tools lsp)") diff --git a/modules/checkers/grammar/packages.el b/modules/checkers/grammar/packages.el index 39da67b3b10..6a2bed1596a 100644 --- a/modules/checkers/grammar/packages.el +++ b/modules/checkers/grammar/packages.el @@ -1,5 +1,9 @@ ;; -*- no-byte-compile: t; -*- ;;; checkers/grammar/packages.el -(package! langtool :pin "8276eccc5587bc12fd205ee58a7a982f0a136e41") +(when (and (modulep! +lsp) + (not (modulep! :tools lsp +eglot))) + (package! lsp-ltex :pin "18b0e8608408f9e913d89075e78c2b4e3f69cf1c")) +(unless (modulep! +lsp) + (package! langtool :pin "8276eccc5587bc12fd205ee58a7a982f0a136e41")) (package! writegood-mode :pin "ed42d918d98826ad88928b7af9f2597502afc6b0") From bed44b1a473ffb041d1286f52519e179fdd04885 Mon Sep 17 00:00:00 2001 From: Abdelhak Bougouffa Date: Tue, 16 Aug 2022 15:35:20 +0200 Subject: [PATCH 2/8] docs(grammar): include `lsp-ltex` related doc --- modules/checkers/grammar/README.org | 49 +++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/modules/checkers/grammar/README.org b/modules/checkers/grammar/README.org index d392ebda8cc..300bd2277c4 100644 --- a/modules/checkers/grammar/README.org +++ b/modules/checkers/grammar/README.org @@ -11,11 +11,15 @@ This module adds grammar checking to Emacs to aid your writing by combining /This module has no dedicated maintainers./ [[doom-contrib-maintainer:][Become a maintainer?]] ** Module flags -/This module has no flags./ +- +lsp :: + Use [[doom-package:][lsp-ltex]] to provide on the fly corrections via [[https://valentjn.github.io/ltex/index.html][LTeX LS]]. ** Packages -- [[doom-package:][langtool]] - [[doom-package:][writegood-mode]] +- if [[doom-module:][+lsp]] + - [[doom-package:][lsp-ltex]] +- else + - [[doom-package:][langtool]] ** Hacks /No hacks documented for this module./ @@ -27,7 +31,8 @@ This module adds grammar checking to Emacs to aid your writing by combining * Installation [[id:01cffea4-3329-45e2-a892-95a384ab2338][Enable this module in your ~doom!~ block.]] -This module requires [[https://languagetool.org/][LanguageTool]] (which requires =Java 1.8+=). +When using [[doom-package:][langtool]], this module requires [[https://languagetool.org/][LanguageTool]] (which requires =Java +1.8+=). It is available from either https://languagetool.org/ or your OS's package manager. E.g. @@ -38,6 +43,10 @@ This module tries to guess the location of =languagetool-commandline.jar=. If you get a warning that Doom ~couldn't find languagetool-commandline.jar~, you will need to set ~langtool-language-tool-jar~ to its location. +When configured with the [[doom-module:][+lsp]] flag, the [[doom-package:][lsp-ltex]] package will automatically +install the LSP server which comes with bundled with LanguageTool and a Java +distribution. + * TODO Usage #+begin_quote 🔨 /This module's usage documentation is incomplete./ [[doom-contrib-module:][Complete it?]] @@ -52,9 +61,17 @@ stylistic issues in your writing. This requires Java 1.8+. #+end_quote *** Commands +**** For [[doom-package:][langtool]] users - ~M-x langtool-check~ - ~M-x langtool-correct-buffer~ +**** For [[doom-package:][lsp-ltex]] users +Doom automatically enables ~lsp-ltex~ for ~text-mode~, ~latex-mode~, ~org-mode~, and +~markdown-mode~. + +- Use ~M-x +lsp-ltex-toggle~ or ~SPC localleadr G~ to enable or disable ~lsp-ltex~ in the current +buffer. + ** writegood-mode This minor mode highlights weasel words, duplication and passive voice. @@ -63,6 +80,32 @@ This minor mode highlights weasel words, duplication and passive voice. 🔨 This module has no configuration documentation yet. [[doom-contrib-module:][Write some?]] #+end_quote + +** For [[doom-package:][lsp-ltex]] users +You can enhance your LanguageTool experience by customizing ~lsp-ltex~. + +#+begin_src emacs-lisp +(setq lsp-ltex-language "fr" ;; Set your default (most used) language + lsp-ltex-mother-tongue "ar") ;; Set your mother longue +#+end_src + +LanguageTool can make use of large n-gram data sets to detect errors with words +that are often confused, like /their/ and /there/. The n-gram data set is huge and +thus not part of the LanguageTool package. To make use of it, you have two +choices: + +- Download it form [[https://languagetool.org/download/ngram-data/][languagetool.org]] +- Install it from your distribution package manager + - For Arch-based distros, there is AUR packages (~languagetool-ngrams-~ + for languages: en, fr, de, es, he, it, nl, ru or zh. + +Doom will automatically use n-grams if found in =/usr/share/ngrams=, however, if +you downloaded them to another directory, you can set the following variable: + +#+begin_src emacs-lisp +(setq lsp-ltex-additional-rules-language-model "path/to/ngrams") +#+end_src + * Troubleshooting /There are no known problems with this module./ [[doom-report:][Report one?]] From 044853c4dd17cc11070ba69035522d4719a2d876 Mon Sep 17 00:00:00 2001 From: Abdelhak Bougouffa Date: Tue, 16 Aug 2022 16:41:01 +0200 Subject: [PATCH 3/8] fix(grammar): respect `lsp-disabled-clients` When the user adds `lsp-ltex` to `lsp-disabled-clients`, or call `+lsp-ltex-disable` in his config to disable `lsp-ltex` by default, this predicate ensures loading `lsp-ltex` only if enabled. --- modules/checkers/grammar/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/checkers/grammar/config.el b/modules/checkers/grammar/config.el index 60475fbb724..ee3e0ba1513 100644 --- a/modules/checkers/grammar/config.el +++ b/modules/checkers/grammar/config.el @@ -50,7 +50,8 @@ "Load LTeX LSP server." (interactive) (require 'lsp-ltex) - (lsp-deferred)) + (when (+lsp-ltex--enabled-p) + (lsp-deferred))) (defun +lsp-ltex--enabled-p () (not (memq 'ltex-ls lsp-disabled-clients))) From 8d66193a8878bed44cc0cdd0b9a4f4d3b66ac13c Mon Sep 17 00:00:00 2001 From: Abdelhak Bougouffa Date: Mon, 22 Aug 2022 12:17:33 +0200 Subject: [PATCH 4/8] fix(grammar): enable `lsp-ltex` locally First, this makes the function documentation matches the desired behavior "Enable for the current buffer", and also, fixes some issues when firing LSP automatically in some modes (as `org-msg-mode`). --- modules/checkers/grammar/config.el | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/modules/checkers/grammar/config.el b/modules/checkers/grammar/config.el index ee3e0ba1513..9faf03c38fd 100644 --- a/modules/checkers/grammar/config.el +++ b/modules/checkers/grammar/config.el @@ -35,6 +35,11 @@ +lsp-ltex-disable +lsp-ltex-setup) :hook ((text-mode latex-mode org-mode markdown-mode) . #'+lsp-ltex-setup) + :config + ;; Disable by default, can be enabled in a ber buffer basis, + ;; Currentrly, launching LSP in some buffers (like org-msg-mode) can cause + ;; annoying messages, as LSP tries to guess the project root. + (add-to-list 'lsp-disabled-clients 'ltex-ls) :init (setq lsp-ltex-check-frequency "save" ;; Less overhead than the default "edit" lsp-ltex-log-level "warning" ;; No need to log everything @@ -60,7 +65,7 @@ "Enable LTeX LSP for the current buffer." (interactive) (unless (+lsp-ltex--enabled-p) - (delq! 'ltex-ls lsp-disabled-clients) + (setq-local lsp-disabled-clients (delq 'ltex-ls lsp-disabled-clients)) (message "Enabled ltex-ls")) (+lsp-ltex-setup)) @@ -68,7 +73,7 @@ "Disable LTeX LSP for the current buffer." (interactive) (when (+lsp-ltex--enabled-p) - (add-to-list 'lsp-disabled-clients 'ltex-ls) + (setq-local lsp-disabled-clients (cons 'ltex-ls lsp-disabled-clients)) (lsp-disconnect) (message "Disabled ltex-ls"))) From 7924d9d4938a7b88913cf6ae2c778150b495abee Mon Sep 17 00:00:00 2001 From: Abdelhak Bougouffa Date: Sat, 3 Sep 2022 16:19:54 +0200 Subject: [PATCH 5/8] tweak(grammar): hook `lsp-ltex` on `LaTeX-mode` --- modules/checkers/grammar/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/checkers/grammar/config.el b/modules/checkers/grammar/config.el index 9faf03c38fd..9144a1723f0 100644 --- a/modules/checkers/grammar/config.el +++ b/modules/checkers/grammar/config.el @@ -34,7 +34,7 @@ +lsp-ltex-enable +lsp-ltex-disable +lsp-ltex-setup) - :hook ((text-mode latex-mode org-mode markdown-mode) . #'+lsp-ltex-setup) + :hook ((text-mode latex-mode LaTeX-mode org-mode markdown-mode) . #'+lsp-ltex-setup) :config ;; Disable by default, can be enabled in a ber buffer basis, ;; Currentrly, launching LSP in some buffers (like org-msg-mode) can cause @@ -85,7 +85,7 @@ (+lsp-ltex-enable))) (map! :localleader - :map (text-mode-map latex-mode-map org-mode-map markdown-mode-map) + :map (text-mode-map latex-mode-map LaTeX-mode-map org-mode-map markdown-mode-map) :desc "Toggle grammar check" "G" #'+lsp-ltex-toggle)) From 149853b97283aeb6835d9a77d71f662e60beb869 Mon Sep 17 00:00:00 2001 From: Abdelhak Bougouffa Date: Thu, 8 Sep 2022 13:00:07 +0200 Subject: [PATCH 6/8] fix(grammar): add `github-tags` dependency --- modules/checkers/grammar/packages.el | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/checkers/grammar/packages.el b/modules/checkers/grammar/packages.el index 6a2bed1596a..fa2baaf59b3 100644 --- a/modules/checkers/grammar/packages.el +++ b/modules/checkers/grammar/packages.el @@ -3,7 +3,12 @@ (when (and (modulep! +lsp) (not (modulep! :tools lsp +eglot))) - (package! lsp-ltex :pin "18b0e8608408f9e913d89075e78c2b4e3f69cf1c")) + (package! lsp-ltex :pin "18b0e8608408f9e913d89075e78c2b4e3f69cf1c") + ;; Optional dependency of lsp-ltex, needed for installing/updating ltex-ls LSP server + (package! github-tags + :recipe (:host github + :repo "jcs-elpa/github-tags") + :pin "7b02d6e883ac3d766106de30c60b22609c4515f9")) (unless (modulep! +lsp) (package! langtool :pin "8276eccc5587bc12fd205ee58a7a982f0a136e41")) (package! writegood-mode :pin "ed42d918d98826ad88928b7af9f2597502afc6b0") From 82633f45bf806fa0edc2dad36618be9cf890fbda Mon Sep 17 00:00:00 2001 From: Abdelhak Bougouffa Date: Thu, 8 Sep 2022 13:00:46 +0200 Subject: [PATCH 7/8] fix(grammar): handle problematic modes --- modules/checkers/grammar/config.el | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/modules/checkers/grammar/config.el b/modules/checkers/grammar/config.el index 9144a1723f0..a5fc1fe033e 100644 --- a/modules/checkers/grammar/config.el +++ b/modules/checkers/grammar/config.el @@ -34,12 +34,13 @@ +lsp-ltex-enable +lsp-ltex-disable +lsp-ltex-setup) - :hook ((text-mode latex-mode LaTeX-mode org-mode markdown-mode) . #'+lsp-ltex-setup) + :hook ((latex-mode LaTeX-mode org-mode markdown-mode) . #'+lsp-ltex-setup) + :init + ;; There is some problematic modes when it comes to enabling LSP + (defvar +lsp-ltex-disabled-modes '(org-msg-edit-mode)) :config - ;; Disable by default, can be enabled in a ber buffer basis, - ;; Currentrly, launching LSP in some buffers (like org-msg-mode) can cause - ;; annoying messages, as LSP tries to guess the project root. - (add-to-list 'lsp-disabled-clients 'ltex-ls) + ;; Add doom-docs-mode to LSP language IDs + (add-to-list 'lsp-language-id-configuration '(doom-docs-org-mode . "org")) :init (setq lsp-ltex-check-frequency "save" ;; Less overhead than the default "edit" lsp-ltex-log-level "warning" ;; No need to log everything @@ -55,7 +56,8 @@ "Load LTeX LSP server." (interactive) (require 'lsp-ltex) - (when (+lsp-ltex--enabled-p) + (when (and (+lsp-ltex--enabled-p) + (not (memq major-mode +lsp-ltex-disabled-modes))) (lsp-deferred))) (defun +lsp-ltex--enabled-p () From 97977537205f7a517caca199ead9b7d0a1ea5fea Mon Sep 17 00:00:00 2001 From: Abdelhak Bougouffa Date: Thu, 8 Sep 2022 13:01:05 +0200 Subject: [PATCH 8/8] tweak(grammar): tweak `lsp-ltex` defaults --- modules/checkers/grammar/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/checkers/grammar/config.el b/modules/checkers/grammar/config.el index a5fc1fe033e..91281004de2 100644 --- a/modules/checkers/grammar/config.el +++ b/modules/checkers/grammar/config.el @@ -42,8 +42,9 @@ ;; Add doom-docs-mode to LSP language IDs (add-to-list 'lsp-language-id-configuration '(doom-docs-org-mode . "org")) :init - (setq lsp-ltex-check-frequency "save" ;; Less overhead than the default "edit" + (setq lsp-ltex-check-frequency "edit" lsp-ltex-log-level "warning" ;; No need to log everything + lsp-ltex-diagnostic-severity "warning" ;; Path in which, interactively added words and rules will be stored. lsp-ltex-user-rules-path (expand-file-name "lsp-ltex" doom-data-dir))