Commentaires
Je pense en partie le problème que vous avez de l'expérience, c'est que lorsque vous instanciez modèles, emacs CC mode de vues avec le même template-args-cont
de la structure. Donc, en prenant cela en compte, j'ai élargi sur votre idée de départ et essayé de faire en fonction de mon goût; j'ai fait le code détaillé, dans l'espoir que tout le monde peut comprendre mon intention. :) Cela ne devrait pas causer des problèmes lorsque vous instanciez, et il apparaît également à travailler pour modèle les paramètres de modèle! Essayez ceci jusqu'à ce que quelqu'un avec plus d'Elisp compétences peuvent fournir une meilleure solution!
Si vous rencontrez un 'combat' (c'est à dire en alternance ou cassé indentation), essayez de recharger le fichier cpp , C-xC-v à l'Entrée et à la mise en retrait de nouveau. Parfois avec modèle de paramètres de modèle emacs montre l'intérieur des arguments arglist-cont-nonempty
, et même de suppléants en arrière avec template-args-const
, mais le reload toujours l'état restauré.
L'utilisation de la
Pour faire ce que vous voulez faire un essai en utilisant le code ci-dessous et de les ajouter à votre c-offsets-alist
une entrée:
(template-args-cont . brian-c-lineup-template-args)
et définissez la variable
(setq brian-c-lineup-template-closebracket t)
Je préfère un alignement légèrement différent:
(setq brian-c-lineup-template-closebracket 'under)
Code
(defvar brian-c-lineup-template-closebracket 'under
"Control the indentation of the closing template bracket, >.
Possible values and consequences:
'under : Align directly under (same column) the opening bracket.
t : Align at the beginning of the line (or current indentation level.
nil : Align at the same column of previous types (e.g. col of class T).")
(defun brian-c-lineup-template--closebracket-p ()
"Return t if the line contains only a template close bracket, >."
(save-excursion
(beginning-of-line)
;; Check if this line is empty except for the trailing bracket, >
(looking-at (rx (zero-or-more blank)
">"
(zero-or-more blank)))))
(defun brian-c-lineup-template--pos-to-col (pos)
(save-excursion
(goto-char pos)
(current-column)))
(defun brian-c-lineup-template--calc-open-bracket-pos (langelem)
"Calculate the position of a template declaration opening bracket via LANGELEM."
(save-excursion
(c-with-syntax-table c++-template-syntax-table
(goto-char (c-langelem-pos langelem))
(1- (re-search-forward "<" (point-max) 'move)))))
(defun brian-c-lineup-template--calc-indent-offset (ob-pos)
"Calculate the indentation offset for lining up types given the opening
bracket position, OB-POS."
(save-excursion
(c-with-syntax-table c++-template-syntax-table
;; Move past the opening bracket, and check for types (basically not space)
;; if types are on the same line, use their starting column for indentation.
(goto-char (1+ ob-pos))
(cond ((re-search-forward (rx
(or "class"
"typename"
(one-or-more (not blank))))
(c-point 'eol)
'move)
(goto-char (match-beginning 0))
(current-column))
(t
(back-to-indentation)
(+ c-basic-offset (current-column)))))))
(defun brian-c-lineup-template-args (langelem)
"Align template arguments and the closing bracket in a semi-custom manner."
(let* ((ob-pos (brian-c-lineup-template--calc-open-bracket-pos langelem))
(ob-col (brian-c-lineup-template--pos-to-col ob-pos))
(offset (brian-c-lineup-template--calc-indent-offset ob-pos)))
;; Optional check for a line consisting of only a closebracket and
;; line it up either at the start of indentation, or underneath the
;; column of the opening bracket
(cond ((and brian-c-lineup-template-closebracket
(brian-c-lineup-template--closebracket-p))
(cond ((eq brian-c-lineup-template-closebracket 'under)
(vector ob-col))
(t
0)))
(t
(vector offset)))))