Indentação automática \ if com AUCTeX


12

O AUCTeXcomportamento atual do texcódigo primitivo que envolve instruções if- like é recuar a instrução condicional no mesmo nível da condição circundante. Ou seja, código como

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

aparece como um grande bloco de texto. Gostaria de fazer o AUCTeXrecuo do trecho da seguinte forma:

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

Isso é possível?

Respostas:


7

É possível:

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

Note que eu tive que redefinir LaTeX-indent-level-count. O diff é simplesmente um condramo:

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

Funciona como um encanto!
precisa saber é o seguinte

Tendo o mesmo problema que o OP, copiei seu código e ele funcionou, mas não totalmente satisfatório. Recua apenas até o próximo \else. A posição do \elseestá correta, mas o código a seguir ( \doanotherthin, veja a pergunta) ainda está na primeira coluna, em vez da coluna 3. Alterei sua primeira linha de código, para incorporar também o comando \ ifx e o pensamento, adicionando o comando else ajudaria, mas eu falhei (pelo menos com o recuo depois \else). Então, aqui está o meu código parcialmente funcional: (setq LaTeX-begin-regexp "\\(?:begin\\|if\\|ifx\\|else\\)\\b") Alguma idéia?
Janeiro
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.