branch: externals/tex-parens commit 4dc9191789d2280c6d8c00ce9995e20265321762 Author: Paul Nelson <ultr...@gmail.com> Commit: Paul Nelson <ultr...@gmail.com>
Add commands for adjusting delimiter size * tex-parens.el (tex-parens--left-modifier-regexp) (tex-parens--left-delimiter-regexp): New variables. (tex-parens-setup): Initialization the new variables. (tex-parens-adjust-delimiter-size, tex-parens-decrease-delimiter-size) (tex-parens-increase-delimiter-size): New commands. * README.org (Adjusting Delimiter Size): Document them. --- README.org | 23 +++++++++++++++++++++++ tex-parens.el | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) diff --git a/README.org b/README.org index 2a998497fa..dac9c796a1 100644 --- a/README.org +++ b/README.org @@ -85,3 +85,26 @@ There are additional commands that use Avy to jump to and copy math expressions: - =tex-parens-avy-copy-math=: Copy a math expression selected using Avy. To use these commands, make sure you have Avy installed and loaded, then bind them in your config as described above. + +** Adjusting Delimiter Size +We provide the commands =tex-parens-increase-delimiter-size= and =tex-parens-decrease-delimiter-size= for adjusting delimiter sizes: =(...)= -> =\left(...\right)= -> =\bigl(...\bigr)= -> =...=. These operate on the left delimiter at point. It may be convenient to put them in a [[https://www.gnu.org/software/emacs/manual/html_node/use-package/Binding-to-repeat_002dmaps.html][repeat map]], which can be achieved by adding something like the following to your =use-package= declaration: + +#+begin_src elisp +(use-package tex-parens + ;; ... + :bind + (:map + LaTeX-mode-map + ;; ... + ("C-c p =" . tex-parens-increase-delimiter-size) + ("C-c p -" . tex-parens-decrease-delimiter-size)) + (:repeat-map + tex-parens-delimiter-size-repeat-map + ("=" . tex-parens-increase-delimiter-size) + ("-" . tex-parens-decrease-delimiter-size)) + ;; ... + :config + ;; ... + (repeat-mode 1)) +#+end_src + diff --git a/tex-parens.el b/tex-parens.el index 27af08f483..b77bf43e25 100644 --- a/tex-parens.el +++ b/tex-parens.el @@ -155,6 +155,8 @@ delimiters which are visibly `left'/`opening' or `right'/`closing'." (defvar tex-parens--regexp-close nil) (defvar tex-parens--regexp-reverse nil) (defvar tex-parens--regexp-reverse+ nil) +(defvar tex-parens--left-modifier-regexp nil) +(defvar tex-parens--left-delimiter-regexp nil) (defvar tex-parens--saved-beginning-of-defun-function nil) (defvar tex-parens--saved-end-of-defun-function nil) @@ -226,6 +228,10 @@ delimiters which are visibly `left'/`opening' or `right'/`closing'." (setq tex-parens--regexp-reverse+ (concat "\\][^[]+\\[}[^{]+{nigeb\\\\\\|" tex-parens--regexp-reverse)) + (setq tex-parens--left-modifier-regexp + (regexp-opt (mapcar #'car tex-parens-left-right-modifier-pairs))) + (setq tex-parens--left-delimiter-regexp + (regexp-opt (mapcar #'car tex-parens-left-right-delimiter-pairs))) ;; It would be natural to uncomment the following line, but I had ;; problems with it at some point, perhaps related to the fact that @@ -1155,5 +1161,55 @@ expressions, then copies the selected one to the kill ring." (copy-region-as-kill beg end) (message "Math expression copied"))))) + +(defun tex-parens-adjust-delimiter-size (direction) + "Adjust size of the delimiter at point. +The symbol DIRECTION is either `increase' or `decrease'. Point must be +at the beginning of a left delimiter." + (interactive) + (when (looking-at (concat "\\(" tex-parens--left-modifier-regexp "\\)?\\(" + tex-parens--left-delimiter-regexp "\\)")) + (let* ((start-pos (point)) + (left-modifier (or (match-string-no-properties 1) "")) + (left-modifier-sequence + (cons "" (mapcar #'car tex-parens-left-right-modifier-pairs))) + (index (seq-position left-modifier-sequence left-modifier)) + (next-index + (if (eq direction 'increase) + (min (1+ index) + (1- (length left-modifier-sequence))) + (max (1- index) 0))) + (next-left-modifier (seq-elt left-modifier-sequence next-index)) + (right-modifier + (or (cdr (assoc left-modifier tex-parens-left-right-modifier-pairs)) + "")) + (next-right-modifier + (or (cdr (assoc next-left-modifier + tex-parens-left-right-modifier-pairs)) + ""))) + (save-excursion + (tex-parens-forward-list) + (tex-parens-backward-down-list) + (delete-region (point) (+ (point) (length right-modifier))) + (insert next-right-modifier)) + (delete-region (point) (+ (point) (length left-modifier))) + (insert next-left-modifier) + (goto-char start-pos)))) + +(defun tex-parens-decrease-delimiter-size () + "Decrease the size of the delimiter at point. +Cycles through modifier sizes in reverse: \\Bigl(\\Bigr) → +\\bigl(\\bigr) → () etc. Point should be at the beginning of the +opening delimiter." + (interactive) + (tex-parens-adjust-delimiter-size 'decrease)) + +(defun tex-parens-increase-delimiter-size () + "Increase the size of the delimiter at point. +Cycles through modifier sizes: () → \\bigl(\\bigr) → \\Bigl(\\Bigr) → +etc. Point should be at the beginning of the opening delimiter." + (interactive) + (tex-parens-adjust-delimiter-size 'increase)) + (provide 'tex-parens) ;;; tex-parens.el ends here