From 5b2216a62e646e2f6fa977363fdf25be0ca6abed Mon Sep 17 00:00:00 2001 From: Zedhugh Chen Date: Sat, 29 Oct 2022 00:08:31 +0800 Subject: [PATCH] add eslint checker for flymake --- .gitmodules | 6 +++ init.el | 1 + lisp/init-flymake.el | 76 +++++++++++++++++++++++++++++++++++ lisp/init-which-key.el | 3 -- site-lisp/eslint-disable-rule | 1 + site-lisp/flymake-eslint | 1 + 6 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 lisp/init-flymake.el create mode 160000 site-lisp/eslint-disable-rule create mode 160000 site-lisp/flymake-eslint diff --git a/.gitmodules b/.gitmodules index 6c6db99..5820d9e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -118,3 +118,9 @@ [submodule "site-lisp/emmet-mode"] path = site-lisp/emmet-mode url = https://github.com/smihica/emmet-mode.git +[submodule "site-lisp/flymake-eslint"] + path = site-lisp/flymake-eslint + url = https://github.com/orzechowskid/flymake-eslint.git +[submodule "site-lisp/eslint-disable-rule"] + path = site-lisp/eslint-disable-rule + url = https://github.com/DamienCassou/eslint-disable-rule.git diff --git a/init.el b/init.el index a29ee76..62465d0 100644 --- a/init.el +++ b/init.el @@ -121,6 +121,7 @@ If freezing sometimes, decrease it. If stuttering, increase it.") (require 'init-eglot) (require 'init-prettier) (require 'init-emmet) +(require 'init-flymake) (setq custom-file (expand-file-name "custom.el" creature/cache-dir)) diff --git a/lisp/init-flymake.el b/lisp/init-flymake.el new file mode 100644 index 0000000..6ef9301 --- /dev/null +++ b/lisp/init-flymake.el @@ -0,0 +1,76 @@ +;; -*- coding: utf-8; lexical-binding: t; -*- + +(defun creature/flymake-show-diagnostics-buffer-and-jump () + (interactive) + (flymake-show-diagnostics-buffer) + (select-window + (get-buffer-window (flymake--diagnostics-buffer-name)))) + +(with-eval-after-load 'flymake + (add-hook 'flymake-mode-hook #'creature/flymake-add-eslint-backend) + + (lazy-load-set-keys + '(("C-c C-n" . flymake-goto-next-error) + ("C-c C-p" . flymake-goto-prev-error)) + flymake-mode-map) + + (lazy-load-set-keys + '(("ex" . flymake-show-diagnostic) + ("el" . creature/flymake-show-diagnostics-buffer-and-jump)) + flymake-mode-map creature/prefix-key) + + (with-eval-after-load 'which-key + (which-key-add-keymap-based-replacements + flymake-mode-map + "e" "errors" + "el" "lines" + "ex" "error message" + ))) + + +(autoload 'eslint-disable-rule-disable-next-line "eslint-disable-rule" "" t) +(autoload 'eslint-disable-rule-flymake "eslint-disable-rule-flymake") +(autoload 'eslint-disable-rule-flycheck "eslint-disable-rule-flycheck") + + +(defvar creature/eslint-inited nil) + +(autoload 'flymake-eslint-enable "flymake-eslint" "" t) +(defun creature/flymake-add-eslint-backend () + (make-local-variable 'creature/eslint-inited) + + (when (and flymake-mode + (not creature/eslint-inited) + (derived-mode-p 'js-mode 'typescript-mode 'web-mode)) + + ;; flymake-eslint-enable 内部会再次调用 (flymake-mode 1) ,为防止无限 + ;; 循环调用,用 ‘creature/eslint-inited’ 记录该函数调用状态避免多次调用 + (setq creature/eslint-inited t) + + (flymake-eslint-enable) + (setq flymake-eslint-project-root + (creature/flymake-eslint-find-work-dir)))) + +(defun creature/flymake-eslint-find-work-dir () + (let ((max-len 0) + (curr-len 0) + (temp-dir nil) + (work-dir nil)) + (dolist (filename '(".eslintrc" + ".eslintrc.js" + ".eslintrc.cjs" + ".eslintrc.yaml" + ".eslintrc.yml" + ".eslintrc.json" + "package.json")) + (setq temp-dir (locate-dominating-file buffer-file-name filename)) + (when (stringp temp-dir) + (setq curr-len (string-bytes (file-truename temp-dir))) + + (when (> curr-len max-len) + (setq max-len curr-len + work-dir temp-dir)))) + work-dir)) + + +(provide 'init-flymake) diff --git a/lisp/init-which-key.el b/lisp/init-which-key.el index e04e60f..e248b47 100644 --- a/lisp/init-which-key.el +++ b/lisp/init-which-key.el @@ -10,9 +10,6 @@ creature/map "b" "buffer" "c" "comments" - "e" "errors" - "el" "lines" - "ex" "error message" "f" "files" "g" "magit" "gf" "magit files" diff --git a/site-lisp/eslint-disable-rule b/site-lisp/eslint-disable-rule new file mode 160000 index 0000000..642ead1 --- /dev/null +++ b/site-lisp/eslint-disable-rule @@ -0,0 +1 @@ +Subproject commit 642ead124172dd470e8ab59fd0645597dc9d8e66 diff --git a/site-lisp/flymake-eslint b/site-lisp/flymake-eslint new file mode 160000 index 0000000..efbf9e1 --- /dev/null +++ b/site-lisp/flymake-eslint @@ -0,0 +1 @@ +Subproject commit efbf9e1fcc6ba4959c4ad0435742c96099f4f96f