Rientro automatico \ if istruzioni con AUCTeX


12

L'attuale AUCTeXcomportamento del texcodice primitivo che coinvolge istruzioni if- like è di indentare l'istruzione condizionale allo stesso livello della condizione circostante. Cioè codice come

\if@sometoggle%
\dosomething%
\else%
\doanotherthing%
\fi%

appare come un grande blocco di testo. Vorrei fare AUCTeXrientrare lo snippet come segue:

\if@sometoggle%
  \dosomething%
\else%
  \doanotherthing%
\fi%

È possibile?

Risposte:


7

È possibile:

(setq LaTeX-begin-regexp "\\(?:begin\\|if@\\)\\b")
(setq LaTeX-end-regexp "\\(?:end\\|else\\|fi\\)\\b")
(defun LaTeX-indent-level-count ()
  "Count indentation change caused by all \\left, \\right, \\begin, and
\\end commands in the current line."
  (save-excursion
    (save-restriction
      (let ((count 0))
        (narrow-to-region (point)
                          (save-excursion
                            (re-search-forward
                             (concat "[^" TeX-esc "]"
                                     "\\(" LaTeX-indent-comment-start-regexp
                                     "\\)\\|\n\\|\\'"))
                            (backward-char)
                            (point)))
        (while (search-forward TeX-esc nil t)
          (cond
            ((looking-at "left\\b")
             (setq count (+ count LaTeX-left-right-indent-level)))
            ((looking-at "right\\b")
             (setq count (- count LaTeX-left-right-indent-level)))
            ((looking-at LaTeX-begin-regexp)
             (setq count (+ count LaTeX-indent-level)))
            ((looking-at "else\\b"))
            ((looking-at LaTeX-end-regexp)
             (setq count (- count LaTeX-indent-level)))
            ((looking-at (regexp-quote TeX-esc))
             (forward-char 1))))
        count))))

Nota che ho dovuto ridefinire LaTeX-indent-level-count. Il diff è semplicemente un condramo:

((looking-at "else\\b"))

Funziona come un fascino!
elemakil,

Avendo lo stesso problema dell'OP, ho copiato il tuo codice e ha funzionato, ma non del tutto soddisfacente. Indenta solo fino al prossimo \else. La posizione di \elseè corretta, ma il seguente codice ( \doanotherthin, vedi domanda) è ancora nella prima colonna, anziché nella colonna 3. Ho cambiato la tua prima riga di codice, per incorporare anche il comando \ ifx e il pensiero, aggiungendo il comando else sarebbe d'aiuto, ma ho fallito (almeno con il rientro successivo \else). Quindi ecco il mio codice parzialmente funzionante: (setq LaTeX-begin-regexp "\\(?:begin\\|if\\|ifx\\|else\\)\\b") qualche idea?
Jan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.