Auto-Indenting \ if-Anweisungen mit AUCTeX

12

Das derzeitige AUCTeXVerhalten für primitiven texCode mit if- like-Anweisungen besteht darin, die bedingte Anweisung auf derselben Ebene wie die umgebende Bedingung einzurücken. Dh Code wie

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

erscheint als großer Textblock. Ich möchte AUCTeXdas Snippet wie folgt einrücken:

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

Ist das möglich?

elemakil
quelle

Antworten:

7

Es ist möglich:

(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))))

Beachten Sie, dass ich neu definieren musste LaTeX-indent-level-count. Das Diff ist einfach ein condZweig:

((looking-at "else\\b"))
abo-abo
quelle
Klappt wunderbar!
Elemakil
Da ich das gleiche Problem wie das OP hatte, habe ich Ihren Code kopiert und es hat funktioniert, aber nicht ganz zufriedenstellend. Es wird nur bis zum nächsten eingerückt \else. Die Position von \elseist korrekt, aber der folgende Code ( \doanotherthinsiehe Frage) befindet sich immer noch in der ersten Spalte anstelle von Spalte 3. Ich habe Ihre erste Codezeile geändert, um auch den \ ifx-Befehl und den Gedanken einzubeziehen und den else-Befehl hinzuzufügen würde helfen, aber ich bin gescheitert (zumindest mit erneutem Einrücken danach \else). Also hier ist mein teilweise funktionierender Code: (setq LaTeX-begin-regexp "\\(?:begin\\|if\\|ifx\\|else\\)\\b") Irgendwelche Ideen?
Jan