# Configuring the Emacs plugin

After installing the Emacs plugin for quick-lint-js, you need to configure it.

Choose the plugin you want to use with quick-lint-js:

- Eglot (recommended)
- Flycheck
- Flymake
- LSP Mode

## Eglot

In your init file (e.g. `~/.emacs`), load the `eglot-quicklintjs` library:

    (require 'eglot-quicklintjs)

To speed up JavaScript linting, configure Eglot to send changes to quick-lint-js immediately without delay by adding the following to your init file:

    (defun my-eglot-quicklintjs-setup ()
      "Configure eglot-quicklintjs for better experience."
      ;; Optional: Remove the time to wait after last change before automatically
      ;; checking buffer. The default is 0.5 (500ms)
      (setq-local eglot-send-changes-idle-time 0)

      ;; Optional: Make Eglot run automatically when `js-mode' is loaded
      (eglot-ensure))
    (add-hook 'js-mode-hook #'my-eglot-quicklintjs-setup)

## Flycheck

In your init file (e.g. `~/.emacs`), load the `flycheck-quicklintjs` library and enable Flycheck for JavaScript buffers:

    (require 'flycheck-quicklintjs)

    (defun my-flycheck-quicklintjs-setup ()
      "Configure flycheck-quicklintjs for better experience."

      ;; Enable Flycheck
      (unless (bound-and-true-p flycheck-mode)
        (flycheck-mode))

      ;; Use quick-lint-js by default when in 'js-mode`
      (flycheck-select-checker 'javascript-quicklintjs)

      ;; Optional: Remove any delay after a change in buffer to run checkers.
      ;; The default is 0.5 (500ms)
      (setq-local flycheck-idle-change-delay 0)

      ;; Optional: Run quick-lint-js program when the buffer is changed and when
      ;; 'js-mode` is loaded
      (setq-local flycheck-check-syntax-automatically '(mode-enabled idle-change new-line)))
    (add-hook 'js-mode-hook #'my-flycheck-quicklintjs-setup)

## Flymake

In your init file (e.g. `~/.emacs`), load the `flymake-quicklintjs` library and enable Flymake for JavaScript buffers:

    (require 'flymake-quicklintjs)

    (defun my-flymake-quicklintjs-setup ()
      "Configure flymake-quicklintjs for better experience."

      ;; Enable Flymake
      (unless (bound-and-true-p flymake-mode)
        (flymake-mode))
      (add-hook 'flymake-diagnostic-functions #'flymake-quicklintjs nil t)

      ;; Optional: Remove the time to wait after last change before automatically
      ;; checking buffer. The default is 0.5 (500ms)
      (setq-local flymake-no-changes-timeout 0))
    (add-hook 'js-mode-hook #'my-flymake-quicklintjs-setup)

    ;; Optional: Enable TypeScript support. Requires quick-lint-js version
    ;; 2.17.0 or newer.
    ;; EXPERIMENTAL. Subject to change in future versions of
    ;; quick-lint-js.
    (add-hook 'typescript-mode-hook #'my-flymake-quicklintjs-setup)
    (setq flymake-quicklintjs-experimental-typescript t)

## LSP Mode

In your init file (e.g. `~/.emacs`), load the `lsp-quicklintjs` library:

    (require 'lsp-quicklintjs)

Then, open a JavaScript buffer and type ``M-x` lsp `RET``.

To speed up JavaScript linting, configure LSP Mode to send changes to quick-lint-js immediately without delay by adding the following to your init file:

    (defun my-lsp-quicklintjs-setup ()
      "Configure lsp-quicklintjs for better experience."
      ;; Optional: Remove the time to wait after last change before automatically
      ;; checking buffer. The default is 0.5 (500ms)
      (setq-local lsp-idle-delay 0))
    (add-hook 'js-mode-hook #'my-lsp-quicklintjs-setup)