emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 05bffa1: Add new commands for environment movement in .texi files


From: Lars Ingebrigtsen
Subject: master 05bffa1: Add new commands for environment movement in .texi files
Date: Tue, 11 Aug 2020 10:37:10 -0400 (EDT)

branch: master
commit 05bffa1f0e3e04a501801d8e7417b623ac78a584
Author: Robert Weiner <rsw@gnu.org>
Commit: Lars Ingebrigtsen <larsi@gnus.org>

    Add new commands for environment movement in .texi files
    
    * lisp/textmodes/texinfo.el (texinfo-mode-map): New keystrokes for
    environment movement commands (bug#23985).
---
 etc/NEWS                  |  8 ++++++
 lisp/textmodes/texinfo.el | 71 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 79 insertions(+)

diff --git a/etc/NEWS b/etc/NEWS
index 271a190..f914e1b 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -522,6 +522,14 @@ with a newline.
 *** New user option 'texinfo-texi2dvi-options'.
 This is used when invoking 'texi2dvi' from 'texinfo-tex-buffer'.
 
+---
+*** New commands for moving in and between environments.
+An "environment" is something that ends with @end.  The commands are
+'C-c C-c C-f' (next end), 'C-c C-c C-b' (previous end),
+'C-c C-c C-n' (next start) and 'C-c C-c C-p' (previous start), as well
+as 'C-c .', which will alternate between the start end the end of the
+current environment.
+
 ** Rmail
 
 ---
diff --git a/lisp/textmodes/texinfo.el b/lisp/textmodes/texinfo.el
index 66378cb..b3bc634 100644
--- a/lisp/textmodes/texinfo.el
+++ b/lisp/textmodes/texinfo.el
@@ -482,6 +482,13 @@ Subexpression 1 is what goes into the corresponding `@end' 
statement.")
     (define-key map "\C-c\C-ce"    'texinfo-insert-@end)
     (define-key map "\C-c\C-cd"    'texinfo-insert-@dfn)
     (define-key map "\C-c\C-cc"    'texinfo-insert-@code)
+
+    ;; bindings for environment movement
+    (define-key map "\C-c."        'texinfo-to-environment-bounds)
+    (define-key map "\C-c\C-c\C-f" 'texinfo-next-environment-end)
+    (define-key map "\C-c\C-c\C-b" 'texinfo-previous-environment-end)
+    (define-key map "\C-c\C-c\C-n" 'texinfo-next-environment-start)
+    (define-key map "\C-c\C-c\C-p" 'texinfo-previous-environment-start)
     map))
 
 (easy-menu-define texinfo-mode-menu
@@ -1072,6 +1079,70 @@ You are prompted for the job number (use a number shown 
by a previous
   ;;               job-number"\n"))
   (tex-recenter-output-buffer nil))
 
+(defun texinfo-to-environment-bounds ()
+  "Move point alternately to the start and end of a Texinfo environment.
+Do nothing when outside of an environment.  This command does not
+handle nested environments."
+  (interactive)
+  (cond ((save-excursion
+          (forward-line 0)
+          (looking-at texinfo-environment-regexp))
+        (if (save-excursion
+              (forward-line 0)
+              (looking-at "^@end"))
+            (texinfo-previous-environment-start)
+          (texinfo-next-environment-end)))
+       ((save-excursion
+          (and (re-search-backward texinfo-environment-regexp nil t)
+               (not (looking-at "^@end"))))
+        (texinfo-previous-environment-start))
+       ;; Otherwise, point is outside of an environment, so do nothing.
+       ))
+
+(defun texinfo-next-environment-start ()
+  "Move forward to the beginning of a Texinfo environment."
+  (interactive)
+  (if (looking-at texinfo-environment-regexp)
+      (forward-line 1))
+  (while (and (re-search-forward texinfo-environment-regexp nil t)
+             (save-excursion
+               (goto-char (match-beginning 0))
+               (looking-at "@end"))))
+  (if (save-excursion
+       (forward-line 0)
+       (looking-at texinfo-environment-regexp))
+      (forward-line 0)))
+
+(defun texinfo-previous-environment-start ()
+  "Move back to the beginning of the previous Texinfo environment."
+  (interactive)
+  (while (and (re-search-backward texinfo-environment-regexp nil t)
+             (save-excursion
+               (goto-char (match-beginning 0))
+               (looking-at "@end")))))
+
+(defun texinfo-next-environment-end ()
+  "Move forward to the beginning of the next @end line of an environment."
+  (interactive)
+  (if (looking-at "^@end")
+      (forward-line 1))
+  (while (and (re-search-forward texinfo-environment-regexp nil t)
+             (save-excursion
+               (goto-char (match-beginning 0))
+               (not (looking-at "^@end")))))
+  (if (save-excursion
+       (forward-line 0)
+       (looking-at "^@end"))
+      (forward-line 0)))
+
+(defun texinfo-previous-environment-end ()
+  "Move backward to the beginning of the next @end line of an environment."
+  (interactive)
+  (while (and (re-search-backward texinfo-environment-regexp nil t)
+             (save-excursion
+               (goto-char (match-beginning 0))
+               (not (looking-at "@end"))))))
+
 (provide 'texinfo)
 
 ;;; texinfo.el ends here



reply via email to

[Prev in Thread] Current Thread [Next in Thread]