This project is no longer maintained.I have no success for a fast enough implementation in Emacs Lisp.
Fortunately, there’s a parinfer-rust-mode!
Parinfer is a proof-of-concept editor mode for Lisp programming languages. It will infer some changes to keep Parens and Indentation inline with one another. Parinfer consists of two modes:
To learn more about Parinfer, please take a look at its home page.
And the parinfer-mode is the implementation on Emacs with parinfer-elisp.
Parinfer is available on MELPA(and MELPA Stable) now, I recommend to install with use-package.
Add following code to your .emacs
or init.el
.
(use-package parinfer :ensure t :bind (("C-," . parinfer-toggle-mode)) :init (progn (setq parinfer-extensions '(defaults ; should be included. pretty-parens ; different paren styles for different modes. evil ; If you use Evil. lispy ; If you use Lispy. With this extension, you should install Lispy and do not enable lispy-mode directly. paredit ; Introduce some paredit commands. smart-tab ; C-b & C-f jump positions and smart shift with tab & S-tab. smart-yank)) ; Yank behavior depend on mode. (add-hook 'clojure-mode-hook #'parinfer-mode) (add-hook 'emacs-lisp-mode-hook #'parinfer-mode) (add-hook 'common-lisp-mode-hook #'parinfer-mode) (add-hook 'scheme-mode-hook #'parinfer-mode) (add-hook 'lisp-mode-hook #'parinfer-mode)))
Toggle Indent Mode and Paren Mode with command parinfer-toggle-mode
.
Whenever you switch to Indent Mode, parinfer-mode will correct all parens of current buffer.
After opening a file, the parinfer-mode enable Indent Mode if it won’t make any changes. Otherwise, Paren Mode will be enabled, you can switch to Indent Mode manually later.
Alternatively, you can use parinfer-diff
command to see how will Indent Mode modify the buffer with Ediff
.
And there are some keybindings in Ediff:
Key Descriptionq
Quit diff. b
B->A in Ediff, this can apply change to your origin code. ra
Restore A in Ediff, this can revert change. n
Move to next difference. p
Move to previous difference.
Also, There’s a command parinfer-auto-fix
to fix wrong indentation for whole buffer. (Only works with balanced parens)
(setq parinfer-auto-switch-indent-mode nil) ;; default
t
for enable, Parinfer will auto switch to Indent Mode whenever parens are balance in Paren Mode.
(setq parinfer-auto-switch-indent-mode-when-closing nil) ;; default
t
for enable, Parinfer will auto switch to Indent Mode when the inserted close parens ()
, ]
, }
) balance the parens of current sexp.
(setq parinfer-delay-invoke-threshold 6000) ;; default
When the length of text for processing is longer than this, Parinfer will process text after a idle delay instead of process immediately.
parinfer-delay-invoke-idle(setq parinfer-delay-invoke-idle 0.3) ;; default
The idle seconds before Parinfer processing text on large sexp.
(setq parinfer-extensions '(defaults pretty-parens smart-yank))
The extensions that will be enabled. The list could contain followings:
Extension Function defaults Should be enabled, basic compatibility pretty-parens Use dim style for Indent Mode, rainbow delimiters for Paren Mode smart-yank Yank will preserve indentation in Indent Mode, will preserve parens in Paren Mode smart-tabC-f
& C-b
on empty line will goto next/previous import indentation. paredit Introduce some paredit commands from paredit-mode. lispy Integration with Lispy. evil Integration with Evil. one Experimental on fuzz Indent Mode and Paren Mode. Not recommanded.
(setq parinfer-lighters '(" Parinfer:Indent" . "Parinfer:Paren"))
If Parinfer seems to be indenting incorrectly, ensure indent-tabs-mode
is set to nil
via (setq-default indent-tabs-mode nil)
. While Parinfer’s theoretical model is able to correctly handle indentation with tabs, parinfer-mode
can currently only handle indentation using spaces.
Please open an issue if there’s any bug or suggestion, and PR is welcomed!
parinferlib.el from parinfer-elisp, is licensed under the ISC.
Rest part licensed under the GPLv3.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4