From: martin rudalics <rudalics@gmx.at>
To: Chirok Han <chirok.han@gmail.com>
Cc: 954@emacsbugs.donarmstrong.com
Subject: bug#954: indentation in latex-mode in emacs-23
Date: Wed, 24 Sep 2008 10:18:19 +0200 [thread overview]
Message-ID: <48D9F7CB.2010900@gmx.at> (raw)
In-Reply-To: <221cda020809230545o111a51ffje05f4e2fae972876@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 325 bytes --]
> It's not something I can convince you about. And I don't think there
> is any correct or incorrect formatting style. It's just from my 10
> years experience. As I get older, it gets harder to accommodate new
> things no matter how small they are....
... sounds convincing. What about the attached patch?
martin
[-- Attachment #2: 954.diff --]
[-- Type: text/plain, Size: 11418 bytes --]
*** textmodes/tex-mode.el.~1.218.~ 2008-09-23 10:17:14.531250000 +0200
--- textmodes/tex-mode.el 2008-09-24 09:57:17.203125000 +0200
***************
*** 1482,1487 ****
--- 1482,1489 ----
(push-mark)
(goto-char spot)))
+ (defvar latex-handle-escaped-parens t)
+
;; Don't think this one actually _needs_ (for the purposes of
;; tex-mode) to handle escaped parens.
(defun latex-backward-sexp-1 ()
***************
*** 1489,1499 ****
(let ((pos (point))
(forward-sexp-function))
(backward-sexp 1)
! (cond ((looking-at "\\\\\\(begin\\>\\|[[({]\\)")
(signal 'scan-error
(list "Containing expression ends prematurely"
(point) (prog1 (point) (goto-char pos)))))
! ((looking-at "\\\\\\([])}]\\)")
(tex-last-unended-eparen (match-string 1)))
((eq (char-after) ?{)
(let ((newpos (point)))
--- 1491,1505 ----
(let ((pos (point))
(forward-sexp-function))
(backward-sexp 1)
! (cond ((looking-at
! (if latex-handle-escaped-parens
! "\\\\\\(begin\\>\\|[[({]\\)"
! "\\\\begin\\>"))
(signal 'scan-error
(list "Containing expression ends prematurely"
(point) (prog1 (point) (goto-char pos)))))
! ((and latex-handle-escaped-parens
! (looking-at "\\\\\\([])}]\\)"))
(tex-last-unended-eparen (match-string 1)))
((eq (char-after) ?{)
(let ((newpos (point)))
***************
*** 1528,1539 ****
(tex-next-unmatched-end))
;; A better way to handle this, \( .. \) etc, is probably to
;; temporarily change the syntax of the \ in \( to punctuation.
! ((looking-back "\\\\[])}]")
(signal 'scan-error
(list "Containing expression ends prematurely"
(- (point) 2) (prog1 (point)
(goto-char pos)))))
! ((looking-back "\\\\\\([({[]\\)")
(tex-next-unmatched-eparen (match-string 1)))
(t (goto-char newpos))))))
--- 1534,1547 ----
(tex-next-unmatched-end))
;; A better way to handle this, \( .. \) etc, is probably to
;; temporarily change the syntax of the \ in \( to punctuation.
! ((and latex-handle-escaped-parens
! (looking-back "\\\\[])}]"))
(signal 'scan-error
(list "Containing expression ends prematurely"
(- (point) 2) (prog1 (point)
(goto-char pos)))))
! ((and latex-handle-escaped-parens
! (looking-back "\\\\\\([({[]\\)"))
(tex-next-unmatched-eparen (match-string 1)))
(t (goto-char newpos))))))
***************
*** 2568,2670 ****
(indent-line-to indent)
(save-excursion (indent-line-to indent)))))))
(defun latex-find-indent (&optional virtual)
"Find the proper indentation of text after point.
VIRTUAL if non-nil indicates that we're only trying to find the indentation
in order to determine the indentation of something else.
There might be text before point."
! (save-excursion
! (skip-chars-forward " \t")
! (or
! ;; Stick the first line at column 0.
! (and (= (point-min) (line-beginning-position)) 0)
! ;; Trust the current indentation, if such info is applicable.
! (and virtual (save-excursion (skip-chars-backward " \t&") (bolp))
! (current-column))
! ;; Stick verbatim environments to the left margin.
! (and (looking-at "\\\\\\(begin\\|end\\) *{\\([^\n}]+\\)")
! (member (match-string 2) tex-verbatim-environments)
! 0)
! ;; Put leading close-paren where the matching open paren would be.
! (let (escaped)
! (and (or (eq (latex-syntax-after) ?\))
! ;; Try to handle escaped close parens but keep original
! ;; position if it doesn't work out.
! (setq escaped (looking-at "\\\\\\([])}]\\)")))
! (ignore-errors
! (save-excursion
! (when escaped
! (goto-char (match-beginning 1)))
! (latex-skip-close-parens)
(latex-backward-sexp-1)
! (latex-find-indent 'virtual)))))
! ;; Default (maybe an argument)
! (let ((pos (point))
! ;; Outdent \item if necessary.
! (indent (if (looking-at tex-indent-item-re) (- tex-indent-item) 0))
! up-list-pos)
! ;; Find the previous point which determines our current indentation.
! (condition-case err
! (progn
! (latex-backward-sexp-1)
! (while (> (current-column) (current-indentation))
! (latex-backward-sexp-1)))
! (scan-error
! (setq up-list-pos (nth 2 err))))
! (cond
! ((= (point-min) pos) 0) ; We're really just indenting the first line.
! ((integerp up-list-pos)
! ;; Have to indent relative to the open-paren.
! (goto-char up-list-pos)
! (if (and (not tex-indent-allhanging)
! (save-excursion
! ;; Make sure we're an argument to a macro and
! ;; that the macro is at the beginning of a line.
! (condition-case nil
! (progn
! (while (eq (char-syntax (char-after)) ?\()
! (forward-sexp -1))
! (and (eq (char-syntax (char-after)) ?/)
! (progn (skip-chars-backward " \t&")
! (bolp))))
! (scan-error nil)))
! (> pos (progn (latex-down-list)
! (forward-comment (point-max))
! (point))))
! ;; Align with the first element after the open-paren.
! (current-column)
! ;; We're the first element after a hanging brace.
(goto-char up-list-pos)
! (+ (if (and (looking-at "\\\\begin *{\\([^\n}]+\\)")
! (member (match-string 1)
! latex-noindent-environments))
! 0 tex-indent-basic)
! indent (latex-find-indent 'virtual))))
! ;; We're now at the "beginning" of a line.
! ((not (and (not virtual) (eq (char-after) ?\\)))
! ;; Nothing particular here: just keep the same indentation.
! (+ indent (current-column)))
! ;; We're now looking at a macro call.
! ((looking-at tex-indent-item-re)
! ;; Indenting relative to an item, have to re-add the outdenting.
! (+ indent (current-column) tex-indent-item))
! (t
! (let ((col (current-column)))
! (if (or (not (eq (char-syntax (or (char-after pos) ?\s)) ?\())
! ;; Can't be an arg if there's an empty line inbetween.
! (save-excursion (re-search-forward "^[ \t]*$" pos t)))
! ;; If the first char was not an open-paren, there's
! ;; a risk that this is really not an argument to the
! ;; macro at all.
! (+ indent col)
! (forward-sexp 1)
! (if (< (line-end-position)
! (save-excursion (forward-comment (point-max))
! (point)))
! ;; we're indenting the first argument.
! (min (current-column) (+ tex-indent-arg col))
! (skip-syntax-forward " ")
! (current-column))))))))))
;;; DocTeX support
(defun doctex-font-lock-^^A ()
--- 2576,2690 ----
(indent-line-to indent)
(save-excursion (indent-line-to indent)))))))
+ (defcustom latex-indent-within-escaped-parens nil
+ "Non-nil means add extra indent to text within escaped parens.
+ When this is non-nil, text within matching pairs of escaped
+ parens is indented at the column following the open paren. The
+ default value does not add any extra indent thus providing the
+ behavior of Emacs 22 and earlier."
+ :type 'boolean
+ :group 'tex
+ :version "23.1")
+
(defun latex-find-indent (&optional virtual)
"Find the proper indentation of text after point.
VIRTUAL if non-nil indicates that we're only trying to find the indentation
in order to determine the indentation of something else.
There might be text before point."
! (let ((latex-handle-escaped-parens latex-indent-within-escaped-parens))
! (save-excursion
! (skip-chars-forward " \t")
! (or
! ;; Stick the first line at column 0.
! (and (= (point-min) (line-beginning-position)) 0)
! ;; Trust the current indentation, if such info is applicable.
! (and virtual (save-excursion (skip-chars-backward " \t&") (bolp))
! (current-column))
! ;; Stick verbatim environments to the left margin.
! (and (looking-at "\\\\\\(begin\\|end\\) *{\\([^\n}]+\\)")
! (member (match-string 2) tex-verbatim-environments)
! 0)
! ;; Put leading close-paren where the matching open paren would be.
! (let (escaped)
! (and (or (eq (latex-syntax-after) ?\))
! ;; Try to handle escaped close parens but keep
! ;; original position if it doesn't work out.
! (and latex-handle-escaped-parens
! (setq escaped (looking-at "\\\\\\([])}]\\)"))))
! (ignore-errors
! (save-excursion
! (when escaped
! (goto-char (match-beginning 1)))
! (latex-skip-close-parens)
! (latex-backward-sexp-1)
! (latex-find-indent 'virtual)))))
! ;; Default (maybe an argument)
! (let ((pos (point))
! ;; Outdent \item if necessary.
! (indent (if (looking-at tex-indent-item-re) (- tex-indent-item) 0))
! up-list-pos)
! ;; Find the previous point which determines our current indentation.
! (condition-case err
! (progn
(latex-backward-sexp-1)
! (while (> (current-column) (current-indentation))
! (latex-backward-sexp-1)))
! (scan-error
! (setq up-list-pos (nth 2 err))))
! (cond
! ((= (point-min) pos) 0) ; We're really just indenting the first line.
! ((integerp up-list-pos)
! ;; Have to indent relative to the open-paren.
(goto-char up-list-pos)
! (if (and (not tex-indent-allhanging)
! (save-excursion
! ;; Make sure we're an argument to a macro and
! ;; that the macro is at the beginning of a line.
! (condition-case nil
! (progn
! (while (eq (char-syntax (char-after)) ?\()
! (forward-sexp -1))
! (and (eq (char-syntax (char-after)) ?/)
! (progn (skip-chars-backward " \t&")
! (bolp))))
! (scan-error nil)))
! (> pos (progn (latex-down-list)
! (forward-comment (point-max))
! (point))))
! ;; Align with the first element after the open-paren.
! (current-column)
! ;; We're the first element after a hanging brace.
! (goto-char up-list-pos)
! (+ (if (and (looking-at "\\\\begin *{\\([^\n}]+\\)")
! (member (match-string 1)
! latex-noindent-environments))
! 0 tex-indent-basic)
! indent (latex-find-indent 'virtual))))
! ;; We're now at the "beginning" of a line.
! ((not (and (not virtual) (eq (char-after) ?\\)))
! ;; Nothing particular here: just keep the same indentation.
! (+ indent (current-column)))
! ;; We're now looking at a macro call.
! ((looking-at tex-indent-item-re)
! ;; Indenting relative to an item, have to re-add the outdenting.
! (+ indent (current-column) tex-indent-item))
! (t
! (let ((col (current-column)))
! (if (or (not (eq (char-syntax (or (char-after pos) ?\s)) ?\())
! ;; Can't be an arg if there's an empty line inbetween.
! (save-excursion (re-search-forward "^[ \t]*$" pos t)))
! ;; If the first char was not an open-paren, there's
! ;; a risk that this is really not an argument to the
! ;; macro at all.
! (+ indent col)
! (forward-sexp 1)
! (if (< (line-end-position)
! (save-excursion (forward-comment (point-max))
! (point)))
! ;; we're indenting the first argument.
! (min (current-column) (+ tex-indent-arg col))
! (skip-syntax-forward " ")
! (current-column)))))))))))
;;; DocTeX support
(defun doctex-font-lock-^^A ()
next prev parent reply other threads:[~2008-09-24 8:18 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-09-23 6:33 bug#954: indentation in latex-mode in emacs-23 martin rudalics
2008-09-23 11:13 ` Chirok Han
2008-09-23 12:28 ` martin rudalics
2008-09-23 12:35 ` Leslie Lamport
2008-09-23 12:45 ` Chirok Han
2008-09-24 8:18 ` martin rudalics [this message]
2008-09-24 16:48 ` Glenn Morris
2008-09-24 17:01 ` martin rudalics
2008-09-24 20:31 ` Stefan Monnier
2008-09-25 1:07 ` Chirok Han
-- strict thread matches above, loose matches on Subject: below --
2008-09-10 7:46 Chirok Han
2008-09-10 16:41 ` Stefan Monnier
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=48D9F7CB.2010900@gmx.at \
--to=rudalics@gmx.at \
--cc=954@emacsbugs.donarmstrong.com \
--cc=chirok.han@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.