Dear Ralf,

I would like to contribute again on LaTeX-mark-environment. I find it
practicle if an  argument <= 0 can be used to count environements from
top downwards.

Here is my contribution (its seems to be more than 11 lines, I can fill
in the GNU form if need be):

Best regards,
   Vincent.

;;---------------------------------------------------------------------
(defun LaTeX-mark-environment (&optional count)
  "Set mark to end of current environment and point to the matching begin.
If prefix argument COUNT is given and positive, mark the
respective number of enclosing environments starting from point
and counting outwards. If prefix argument COUNT is given and
negative or null, then a number 1-COUNT of environment is marked
starting from point-min/point-max and counting inwards.  The
command will not work properly if there are unbalanced begin-end
pairs in comments and verbatim environments."
  (interactive "p")
  (setq count (or count 1))
  (let ((cur (point)) beg end)
    (if (> count 0)
        ;; Only change point and mark after beginning and end were found.
        ;; Point should not end up in the middle of nowhere if the search
        ;; fails.
        (save-excursion
          (dotimes (c count) (LaTeX-find-matching-end))
          (setq end (line-beginning-position 2))
          (goto-char cur)
          (dotimes (c count) (LaTeX-find-matching-begin))
          (setq beg (point)))
      (setq count (- count))
      (let (outest-beg outest-end begs ends env-type env-count)
        (save-excursion
          (goto-char (point-min))
          (while (progn
                   (unless 
                       (re-search-forward (concat (regexp-quote TeX-esc)
                                                "begin"
                                                (regexp-quote TeX-grop)
                                                " *\\([a-zA-Z*]*\\)"
                                                (regexp-quote TeX-grcl))
                                        nil t)
                   (error "Can'tr find outest begin"))
                 (TeX-in-commented-line)))
        (setq outest-beg (match-beginning 0)
              env-type (match-string 1))
        (goto-char (point-max))
        (while (progn
                 (unless 
                     (re-search-backward (concat (regexp-quote TeX-esc)
                                                "end"
                                                (regexp-quote TeX-grop)
                                                " *"
                                                (regexp-quote 
                                                 (concat env-type TeX-grcl)))
                                        nil t)
                   (error "Can'tr find outest end matching outest begin"))
                 (TeX-in-commented-line)))
        (setq outest-end (match-end 0))
        (goto-char cur)
        (while (progn
                 (LaTeX-find-matching-begin)
                 (setq beg (point))
                 (push beg begs)
                 (> beg outest-beg)))
        (goto-char cur)
        (while (progn
                 (LaTeX-find-matching-end)
                 (setq end (line-beginning-position 2))
                 (push end ends)
                 (< end outest-end)))
        (setq env-count (length begs))
        (unless (= env-count (length ends))
          (error "Unbalanced begin/end"))
        (unless (< count env-count)
          (error "Invalid environment count"))
        (setq beg (nth count begs)
              end (nth count  ends)))))
    (set-mark end)
    (goto-char beg)
    (TeX-activate-region)))



_______________________________________________
auctex mailing list
auctex@gnu.org
http://lists.gnu.org/mailman/listinfo/auctex

Reply via email to