Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

smart-tabs-mode

6 réponses
Avatar
Benoit Izac
Bonjour,

Je suis assez satisfait de smart-tabs-mode.el que l'on trouve ici :
<https://github.com/jcsalomon/smarttabs/raw/master/smart-tabs-mode.el>
Ça marche très bien avec les paramètres de fonctions mais si je fais :

unsigned int a,
b;

Là il me met systématiquement une tabulation avant « b » alors que je
souhaiterai des espaces comme ci dessus. Est-ce possible ?

Merci.
--
Benoit Izac

6 réponses

Avatar
Damien Wyart
* Benoit Izac in fr.comp.applications.emacs:
Je suis assez satisfait de smart-tabs-mode.el que l'on trouve ici :
<https://github.com/jcsalomon/smarttabs/raw/master/smart-tabs-mode.el>
Ça marche très bien avec les paramètres de fonctions mais si je fais :

unsigned int a,
b;

Là il me met systématiquement une tabulation avant « b » alors que je
souhaiterai des espaces comme ci dessus. Est-ce possible ?



J'ai essayé d'approfondir un peu via le debugguer mais le cc-mode est
vraiment complexe ; les appels s'empilent... Donc je n'ai pas réussi
à voir pourquoi dans le premier cas c'est un aligement alors que dans le
second une indentation...

Une fois repéré ce qui met une tabulation dans le 2e cas, on peut sans
doute adapter le mode pour qu'il tienne compte de ce cas...

Je pense qu'il faut un gourou de cc-mode pour répondre ; peux-tu
essayer, si ça ne donne rien ici, de poser la question dans le groupe
gnu.emacs.help ?

--
DW
Avatar
Damien Wyart
Je pense qu'il faut un gourou de cc-mode pour répondre ; peux-tu
essayer, si ça ne donne rien ici, de poser la question dans le groupe
gnu.emacs.help ?



En parallèle, je pense aussi que ça serait intéressant d'en parler
à l'auteur du mode smart-tabs car ça me semble être un cas assez courant
pour lequel il pourrait souhaiter que ça se comporte comme tu t'y
attendais.

--
DW
Avatar
Damien Wyart
* Benoit Izac in fr.comp.applications.emacs:
> Je suis assez satisfait de smart-tabs-mode.el que l'on trouve ici :
> <https://github.com/jcsalomon/smarttabs/raw/master/smart-tabs-mode.el>
> Ça marche très bien avec les paramètres de fonctions mais si je fais :

> unsigned int a,
> b;

> Là il me met systématiquement une tabulation avant « b » alors que je
> souhaiterai des espaces comme ci dessus. Est-ce possible ?

J'ai essayé d'approfondir un peu via le debugguer mais le cc-mode est
vraiment complexe ; les appels s'empilent... Donc je n'ai pas réussi
à voir pourquoi dans le premier cas c'est un aligement alors que dans
le second une indentation...



Bon, comme ça m'intriguait j'ai quand même approfondi. Et j'ai constaté
que la documentation du cc-mode était très bien faite (bon, j'ai aussi
lu pas mal le code de ce mode...).

Du coup je pense que le comportement observé est conforme au principe de
base du smart-tabs-mode.

En effet, si on (re)lit http://www.emacswiki.org/SmartTabs, l'idée est
que les tabulations marquent le niveau d'intentation et sont situées en
début de ligne uniquement ; tandis que les espaces permettent
d'effectuer des alignements.

Pour une définition de fonction, on est au niveau d'intentation 0, donc
pas de tabulation, et les paramètres sur les lignes suivantes sont
alignés sur la parenthèse ouvrante (pour le cc-mode, il s'agit du
contexte syntaxique "arglist-cont-nonempty", ce que l'on peut voir en
faisant C-c C-s sur la ligne correspondante ; et il est traité par la
fonction c-lineup-arglist). Du coup il n'y a que des espaces, on reste
au niveau d'indentation 0.

Pour la déclaration de variables, *le choix fait dans le cc-mode* est
d'augmenter le niveau d'indentation pour les lignes qui suivent la
première ligne (sauf si on sépare les types des noms). Du coup,
smart-tabs insère une tabulation et pas d'espace puisqu'il ne s'agit pas
d'une continuation (contexte "topmost-intro-cont", traité par la
fonction c-lineup-topmost-intro-cont, qui, en général, indente juste de
c-basic-offset et ne tient donc pas du tout compte d'un point
d'alignement comme dans le cas de la définition de fonction).

Du coup, il n'y a pas de solution directe pour ton problème, à moins de
redéfinir comment se comporte le cc-mode sur topmost-intro-cont, ce qui
est assez complexe
(http://cc-mode.sourceforge.net/html-manual/Custom-Line_002dUp.html ou
http://cc-mode.sourceforge.net/html-manual/Other-Indentation.html)
ou alors lui associer une indentation nulle mais c'est une question de
goût (ou de "style" C) plus que de comportement des modes...

En espérant que ces infos seront utiles...
--
DW
Avatar
Benoit Izac
Bonjour,

le 21/09/2012 à 21:32, Damien Wyart a écrit dans le message
<505cc0ea$0$1989$ :

> Je suis assez satisfait de smart-tabs-mode.el que l'on trouve ici :
> <https://github.com/jcsalomon/smarttabs/raw/master/smart-tabs-mode.el>
> Ça marche très bien avec les paramètres de fonctions mais si je fais :



> unsigned int a,
> b;



> Là il me met systématiquement une tabulation avant « b » alors que je
> souhaiterai des espaces comme ci dessus. Est-ce possible ?



J'ai essayé d'approfondir un peu via le debugguer mais le cc-mode est
vraiment complexe ; les appels s'empilent... Donc je n'ai pas réussi
à voir pourquoi dans le premier cas c'est un aligement alors que dans
le second une indentation...



Bon, comme ça m'intriguait j'ai quand même approfondi. Et j'ai constaté
que la documentation du cc-mode était très bien faite (bon, j'ai aussi
lu pas mal le code de ce mode...).

Du coup je pense que le comportement observé est conforme au principe de
base du smart-tabs-mode.

En effet, si on (re)lit http://www.emacswiki.org/SmartTabs, l'idée est
que les tabulations marquent le niveau d'intentation et sont situées en
début de ligne uniquement ; tandis que les espaces permettent
d'effectuer des alignements.

Pour une définition de fonction, on est au niveau d'intentation 0, donc
pas de tabulation, et les paramètres sur les lignes suivantes sont
alignés sur la parenthèse ouvrante (pour le cc-mode, il s'agit du
contexte syntaxique "arglist-cont-nonempty", ce que l'on peut voir en
faisant C-c C-s sur la ligne correspondante ; et il est traité par la
fonction c-lineup-arglist). Du coup il n'y a que des espaces, on reste
au niveau d'indentation 0.

Pour la déclaration de variables, *le choix fait dans le cc-mode* est
d'augmenter le niveau d'indentation pour les lignes qui suivent la
première ligne (sauf si on sépare les types des noms). Du coup,
smart-tabs insère une tabulation et pas d'espace puisqu'il ne s'agit pas
d'une continuation (contexte "topmost-intro-cont", traité par la
fonction c-lineup-topmost-intro-cont, qui, en général, indente juste de
c-basic-offset et ne tient donc pas du tout compte d'un point
d'alignement comme dans le cas de la définition de fonction).

Du coup, il n'y a pas de solution directe pour ton problème, à moins de
redéfinir comment se comporte le cc-mode sur topmost-intro-cont, ce qui
est assez complexe
(http://cc-mode.sourceforge.net/html-manual/Custom-Line_002dUp.html ou
http://cc-mode.sourceforge.net/html-manual/Other-Indentation.html)
ou alors lui associer une indentation nulle mais c'est une question de
goût (ou de "style" C) plus que de comportement des modes...

En espérant que ces infos seront utiles...



Merci pour avoir passé de ton temps sur ce "problème", je me doutais un
peu que cela vienne de cc-mode mais je pensais que la solution serait
plus simple à mettre en oeuvre que d'écrire du code ; j'avais joué avec
cc-mode il y déjà quelques années et je me souviens qu'il y avait la
possibilité de configurer assez finement la manière dont il se comporte.
J'ai posté un message dans gnu.emacs.help comme tu me l'as conseillé,
peut-être existe-t-il une solution plus triviale (en tout cas, je n'ai
plus le temps aujourd'hui pour essayer de coder cela).

Après, ce n'est pas un besoin, je me posais juste la question suite
à l'expérimentation de divers essais pour tester smart-tabs-mode. Pour
la petite anecdote, il y a quelques jours, voulant m'initier à java
histoire de ne pas mourir idiot, je suis tombé sur les conventions java
de Sun, enfin Oracle, quoique non puisqu'elles date de 1997 :
<http://www.oracle.com/technetwork/java/codeconventions-150003.pdf> où
l'on peut lire en 6.1 qu'il est déconseillé de faire plusieurs
déclarations sur la même ligne. Donc, dans le cas à l'origine de ma
question, il est préférable d'écrire :

unsigned int a;
unsigned int b;

Et le problème est réglé. ;-)

Étape suivante : regarder comment smart-tabs-mode se comporte avec du
Perl sur des classiques comme :
open my $fh, "<", $filename
or die "can't open $filename: $!";
^^

Sinon, je trouve ça plutôt bien smart-tabs-mode car ça permet à chacun
d'indenter le code comme il le souhaite juste en changeant tab-width (ou
tabstop pour les vilains ;-)).

--
Benoit Izac
Avatar
Damien Wyart
Pour la déclaration de variables, *le choix fait dans le cc-mode* est
d'augmenter le niveau d'indentation pour les lignes qui suivent la
première ligne (sauf si on sépare les types des noms). Du coup,
smart-tabs insère une tabulation et pas d'espace puisqu'il ne s'agit pas
d'une continuation (contexte "topmost-intro-cont", traité par la



Enfin, si c'est une continuation (comme l'indique le nom du contexte),
mais pas de type alignement sur un point précis de la première ligne...

Donc j'aurais du écrire "il ne s'agit pas d'un alignement".

fonction c-lineup-topmost-intro-cont, qui, en général, indente juste
de c-basic-offset et ne tient donc pas du tout compte d'un point
d'alignement comme dans le cas de la définition de fonction).



--
DW
Avatar
Damien Wyart
Merci pour avoir passé de ton temps sur ce "problème", je me doutais
un peu que cela vienne de cc-mode mais je pensais que la solution
serait plus simple à mettre en oeuvre que d'écrire du code ; j'avais
joué avec cc-mode il y déjà quelques années et je me souviens qu'il
y avait la possibilité de configurer assez finement la manière dont il
se comporte.



En effet, il y a énormément de paramétrages possibles.

J'ai posté un message dans gnu.emacs.help comme tu me l'as conseillé,
peut-être existe-t-il une solution plus triviale (en tout cas, je n'ai
plus le temps aujourd'hui pour essayer de coder cela).



C'est toujours intéressant d'avoir plusieurs avis. Et sur sur ce groupe,
il y a de sacrés "hackers" (dans le sens noble du terme)...

[...] Donc, dans le cas à l'origine de ma question, il est préférable
d'écrire :

unsigned int a;
unsigned int b;

Et le problème est réglé. ;-)



:)

Sinon, je trouve ça plutôt bien smart-tabs-mode car ça permet à chacun
d'indenter le code comme il le souhaite juste en changeant tab-width
(ou tabstop pour les vilains ;-)).



Oui, même si je suis plutôt partisan du "space only" (notamment pour
Python), j'avoue que ça m'a bien intéressé (l'algo de base est
astucieux) et je pense que je le testerai un peu aussi à l'occasion...

--
DW