branch: externals/tex-parens
commit 84b9b5e76eef08af4c98f8756d878eebc5cc9a75
Author: Paul Nelson <[email protected]>
Commit: Paul Nelson <[email protected]>

    added sexp stuff
---
 tex-parens.el | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 55 insertions(+), 5 deletions(-)

diff --git a/tex-parens.el b/tex-parens.el
index d183ff1c8f..19ea5811be 100644
--- a/tex-parens.el
+++ b/tex-parens.el
@@ -24,27 +24,77 @@
 ;; tailored to my use cases
 ;; (cf. https://github.com/Fuco1/smartparens/issues/1193).
 ;;
-;; Work in progress.  TODO: sexp commands
+;; Work in progress, I guess
 
 ;;; Code:
 
 (defun tex-parens-setup ()
+  "Hook function for LaTeX-mode that sets up tex-parens."
   (setq
    preview-auto-reveal
    '(eval (preview-arrived-via (key-binding [left])
                                (key-binding [right])
                                #'backward-char #'forward-char 
#'tex-parens-down)))
-  (setq-local beginning-of-defun-function #'tex-parens-beginning-of-defun)
-  (setq-local end-of-defun-function #'tex-parens-end-of-defun))
+  (setq-local beginning-of-defun-function #'tex-parens--beginning-of-defun)
+  (setq-local end-of-defun-function #'tex-parens--end-of-defun)
+  (setq-local forward-sexp-function #'tex-parens--forward-sexp-with-arg))
 
-(defun tex-parens-beginning-of-defun ()
+(defun tex-parens--beginning-of-defun ()
   (interactive)
   (re-search-backward "^\\\\begin{[^}]+}" nil t))
 
-(defun tex-parens-end-of-defun ()
+(defun tex-parens--end-of-defun ()
   (interactive)
   (re-search-forward "^\\\\end{[^}]+}\n" nil t))
 
+(defun tex-parens--forward-sexp-with-arg (&optional arg)
+  "Function to use as `forward-sexp-function' in LaTeX-mode."
+  (interactive "^p")
+  (or arg (setq arg 1))
+  (while (> arg 0)
+    (tex-parens--forward-sexp)
+    (setq arg (1- arg)))
+  (while (< arg 0)
+    (tex-parens--backward-sexp)
+    (setq arg (1+ arg))))
+
+(defun tex-parens--forward-sexp ()
+  "Internal forward-sexp function.
+This function is a wrapper around `forward-sexp' that uses
+tex-parens to identify the next delimiter.  If `forward-sexp'
+does not take us past the starting point of the next delimiter, then
+do that.  Otherwise, do `tex-parens-forward'."
+  (let ((delim-beg (save-excursion
+                     (tex-parens-basic-forward)
+                     (match-beginning 0)))
+        (vanilla (save-excursion
+                   (let ((forward-sexp-function nil))
+                     (forward-sexp)
+                     (point)))))
+    (if (and delim-beg
+             (>= vanilla delim-beg))
+        (tex-parens-forward)
+      (goto-char vanilla))))
+
+(defun tex-parens--backward-sexp ()
+  "Internal `backward-sexp' function.
+This function is a wrapper around `backward-sexp' that uses
+tex-parens to identify the previous delimiter.  If `backward-sexp'
+does not take us beyond the ending point of the previous
+delimiter, then do that.  Otherwise, do `tex-parens-backward'."
+  (let ((delim-end (save-excursion
+                     (when-let ((delim (tex-parens-basic-backward)))
+                       (forward-char (length delim))
+                       (point))))
+        (vanilla (save-excursion
+                   (let ((forward-sexp-function nil))
+                     (backward-sexp)
+                     (point)))))
+    (if (and delim-end
+             (<= vanilla delim-end))
+        (tex-parens-backward)
+      (goto-char vanilla))))
+
 (defvar tex-parens-pairs
   '(("(" . ")")
     ("\\Big(" . "\\Big)")

Reply via email to