tex-parens
- Description
- like lisp.el but for tex
- Latest
- tex-parens-0.2.tar (.sig), 2024-Jun-18, 60.0 KiB
- Maintainer
- Paul D. Nelson <nelson.paul.david@gmail.com>
- Website
- https://github.com/ultronozm/tex-parens.el
- Browse ELPA's repository
- CGit or Gitweb
- Badge
To install this package from Emacs, use package-install
or list-packages
.
Full description
1. Overview
Emacs comes with the following useful commands for working with lists, sexps and defuns (see the info nodes Expressions and Defuns):
bind | command | docstring |
---|---|---|
C-M-@ | mark-sexp | Set mark ARG sexps from point or move mark one sexp. |
C-M-a | beginning-of-defun | Move backward to the beginning of a defun. |
C-M-b | backward-sexp | Move backward across one balanced expression (sexp). |
C-M-d | down-list | Move forward down one level of parentheses. |
C-M-e | end-of-defun | Move forward to next end of defun. |
C-M-f | forward-sexp | Move forward across one balanced expression (sexp). |
C-M-h | mark-defun | Put mark at end of this defun, point at beginning. |
C-M-k | kill-sexp | Kill the sexp (balanced expression) following point. |
C-M-n | forward-list | Move forward across one balanced group of parentheses. |
C-M-p | backward-list | Move backward across one balanced group of parentheses. |
C-M-t | transpose-sexps | Like C-t (‘transpose-chars’), but applies to sexps. |
C-M-u | backward-up-list | Move backward out of one level of parentheses. |
C-M-<backspace> | backward-kill-sexp | Kill the sexp (balanced expression) preceding point. |
- | up-list | Move forward out of one level of parentheses. |
- | delete-pair | Delete a pair of characters enclosing ARG sexps that follow point. |
- | raise-sexp | Raise N sexps one level higher up the tree. |
This package provides analogous commands adapted for tex buffers, with the class of parenthesis-like delimiters (namely, parentheses ()
, brackets []
and braces {}
) expanded to include the following:
\begin{...}
-\end{...}
pairs- math environment delimiters
$...$
,\(...\)
,\[...\]
,$$...$$
- mathematical delimiters: parentheses, brackets, braces,
\langle
-\rangle
,\lvert
-\rvert
, etc., and compositions of these with modifiers such as\left
-\right
,\Bigg
, etc. SeeM-x customize-group tex-parens
for details.
There is some support in this direction in the built-in tex-mode, in AUCTeX and in latex-extra. There are many packages, such as paredit and lispy, that add further useful commands and bindings to lisp modes, and many other packages, such as smartparens, puni and paredit-everywhere, that aim to give consistent parenthesis-based commands across all modes. There's also the evil-tex package for those that prefer a modal setup. I was unable to get these packages to behave in the desired manner. Smartparens comes close, but doesn't seem to support arbitrary begin/end pairs, and has some issues when one delimiter is a prefix of another (https://github.com/Fuco1/smartparens/issues/1193). This package should work out-of-the-box and behave in tex buffers just like stock Emacs does in lisp buffers.
2. Configuration
Download this repository, install using M-x package-install-file
(or package-vc-install, straight, elpaca, …), and add something like the following to your init file, adjusting the binds according to preference (and replacing LaTeX-mode
with latex-mode
or tex-mode
or plain-tex-mode
, whichever is appropriate, if you don't use AUCTeX):
(use-package tex-parens :bind (:map LaTeX-mode-map ([remap forward-sexp] . tex-parens-forward-sexp) ([remap backward-sexp] . tex-parens-backward-sexp) ([remap forward-list] . tex-parens-forward-list) ([remap backward-list] . tex-parens-backward-list) ([remap backward-up-list] . tex-parens-backward-up-list) ([remap up-list] . tex-parens-up-list) ([remap down-list] . tex-parens-down-list) ([remap delete-pair] . tex-parens-delete-pair) ([remap mark-sexp] . tex-parens-mark-sexp) ([remap kill-sexp] . tex-parens-kill-sexp) ([remap transpose-sexps] . transpose-sexps) ([remap backward-kill-sexp] . tex-parens-backward-kill-sexp) ([remap raise-sexp] . tex-parens-raise-sexp)) :hook (LaTeX-mode . tex-parens-setup))
With this setup, whatever binds you generally use for the indicated list commands will be forwarded to tex-parens
in LaTeX-mode
. If you want to specify the keys more directly, use instead something like the following:
(use-package tex-parens :bind (:map LaTeX-mode-map ("C-M-f" . tex-parens-forward-sexp) ("C-M-b" . tex-parens-backward-sexp) ("C-M-n" . tex-parens-forward-list) ("C-M-p" . tex-parens-backward-list) ("C-M-u" . tex-parens-backward-up-list) ("M-u" . tex-parens-up-list) ("C-M-g" . tex-parens-down-list) ("M-_" . tex-parens-delete-pair) ("C-M-SPC" . tex-parens-mark-sexp) ("C-M-k" . tex-parens-kill-sexp) ("C-M-t" . transpose-sexps) ("C-M-<backspace>" . tex-parens-backward-kill-sexp) ("M-+" . tex-parens-raise-sexp)) :hook (LaTeX-mode . tex-parens-setup))
The precise use-package declaration that I use may be found in the LaTeX part of my config (elpaca branch).
Use M-x customize-group tex-parens
to configure further. If you tweak the customization variables concerning delimiters and modifiers, then you'll need to reload your tex file or M-: (tex-parens-setup)
for the changes to take effect.
3. Variants
This package contains the additional functions tex-parens-burp-left
, tex-parens-burp-right
, tex-parens-mark-inner
, tex-parens-beginning-of-list
and tex-parens-end-of-list
, which are defined in terms of the sexp/list primitives; see the C-h f
documentation for details.