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

Reply via email to