Add new commands for environment movement in .texi files

* lisp/textmodes/texinfo.el (texinfo-mode-map): New keystrokes for
environment movement commands (bug#23985).
This commit is contained in:
Robert Weiner 2020-08-11 16:37:01 +02:00 committed by Lars Ingebrigtsen
parent be0fecf819
commit 05bffa1f0e
2 changed files with 79 additions and 0 deletions

View file

@ -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
---

View file

@ -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