Comment compléter automatiquement les noms de classe CSS qui incluent un caractère moins?

8

J'ai la structure de classe CSS suivante

.mAIcon
.mAIcon-reject
.mAIcon-edit
.mAIcon-accept
.event

etc.

Dans mes fichiers HTML, je veux compléter automatiquement ces noms de classe.

Mais quand je tape

<span class="mAIcon mA|">

et je veux compléter automatiquement le reste, la seule chose que je reçois est

<span class="mAIcon mAIcon|">

Pour obtenir ce que je veux vraiment, je dois taper un extra -et par exemple eet utiliser à nouveau la saisie semi-automatique. Mais ensuite, je reçois tout ce qui commence par un e, même la classe event. C'est vraiment ennuyeux et rend l'auto-complétion plutôt inutile dans ce cas.

J'utilise le mot clé générique de Vim avec la i_CTRL-Ncommande et je n'ai pas de plugins de complétion supplémentaires installés.

Est-il possible d'inclure la -détection des noms de classe CSS pour l'auto-complétion?

Raphael Ahrens
la source
Vous dites "saisie semi-automatique", cela signifie-t-il que vous utilisez YouCompleteMe, neocomplete ou quelque chose de similaire? Si oui, cela devrait être mentionné dans votre question. Sinon, vous devez émettre une sorte de commande d'achèvement, telle que <c-x><c-n>, qui doit également être spécifiée dans votre question.
Karl Yngve Lervåg
@ KarlYngveLervåg merci pour votre commentaire. Veuillez jeter un œil à mon montage.
Raphael Ahrens
1
Votre montage a confirmé mes soupçons. Premièrement, l'auto-complétion à mon humble avis devrait être automatique, et en tant que tel, le problème que vous décrivez n'est pas lié à l'auto-complétion, mais simplement à l'achèvement. Pour l'auto-complétion dans Vim, je vous recommande de regarder neocomplete ou YouCompleteMe. Deuxièmement, vous utilisez la complétion générique de MOT-CLÉ de Vim. Un mot-clé est défini par l'option 'iskeyword', et même si les mots-clés sont également utilisés pour d'autres commandes (effets secondaires), c'est toujours la bonne façon de réaliser ce que vous voulez sans utiliser d'autres types de complétion (automatique).
Karl Yngve Lervåg
@ KarlYngveLervåg Tout d'abord, je suis désolé pour ce malentendu. Mais je pensais que l'auto-complétion était le bon terme. Deuxièmement, pourriez-vous m'indiquer quelque chose qui résout mon problème d'achèvement? Pour autant que je puisse voir YouCompleteMe et neocomplete ne modifient pas le comportement de complétion de la complétion standard, ils ajoutent seulement plus "auto", dont je n'ai pas besoin. Je pensais vraiment que ce serait possible avec Vim.
Raphael Ahrens
1
Je peux me tromper, mais l'achèvement de la balise pourrait fonctionner dans ce cas. Personnellement, je ne fais pas beaucoup de développement web, et donc je ne connais pas très bien Vim pour html / css / ..., mais je pense que cela ctagsdevrait être capable de générer des tags pour votre projet. Ensuite, vous pouvez compléter la balise avec i_CTRL-X_CTRL-]. Cependant, je vois dans les documents que la complétion de balise utilise également l' iskeywordoption, donc je peux me tromper. Dans tous les cas, vous voudrez probablement lire :h ins-completion.
Karl Yngve Lervåg

Réponses:

10

Oui, vous pouvez définir quels caractères sont considérés comme faisant partie des mots clés avec l' 'iskeyword'option:

setlocal iskeyword+=-

Vous pouvez ajouter l'extrait suivant à votre vimrcpour limiter cette option aux fichiers CSS et HTML:

augroup css
    autocmd!
    autocmd FileType css,html setlocal iskeyword+=-
augroup END
romainl
la source
5
Notez que la modification iskeyworda beaucoup d'effets secondaires. Par exemple, dwon some-textsupprimera maintenant some-text, au lieu de seulement some. Pas nécessairement une mauvaise chose, mais quelque chose dont il faut être conscient.
Martin Tournoij du
Mhh, cela ne semble fonctionner qu'à l'intérieur d'un fichier CSS, dès que je passe à un tampon différent (par exemple un fichier HTML), il ne complète que les mots sans le signe moins.
Raphael Ahrens
@RaphaelAhrens, voir ma modification.
romainl
@romainl J'apprécie vraiment votre réponse rapide. Mais je suis désolé, je ne peux pas accepter cette réponse car elle ne sera pas mise à l'échelle avec plus de types de fichiers et en plus elle a les effets secondaires mentionnés par Carpetsmoker. J'espère que tu comprends.
Raphael Ahrens
1
J'utilise ceci mais je déclenche jset les coffeefichiers aussi. Parce que je me retrouve à terminer des cours CSS souvent en Javascript, et j'ai rarement du code qui effectue une soustraction sans espace. Dans le code que je modifie, diff = foo - bar;est plus courant quediff=foo-bar;
joeytwiddle
1

J'ai résolu le problème en écrivant un petit script python qui crée un fichier de balises. Le script recherche les classes CSS et imprime un slogan pour chaque classe.

En ce moment, je lance le script à la main avec

css_tags $file >> tags

qui ajoute les fichiers au fichier de balises. Cela fonctionne car l'achèvement des balises n'est pas limité par le iskeywordparamètre.

Voici le contenu du script qui est également disponible sur GitHub .

#!/usr/bin/env python3

import argparse
import re

parser = argparse.ArgumentParser(description='CSStags.')
parser.add_argument('css_file', type=argparse.FileType('r'))


def create_tag(tag_name, filename, line):
    """
    Create a ctag line for the CSS class
    """
    print('%s\t%s\t/^%s$/;"\tc' % (tag_name, filename, line))


def main():
    args = parser.parse_args()

    class_regex = re.compile('^\.([\w-]+)\s*{')

    for line in args.css_file:
        class_match = class_regex.match(line)
        if class_match:
            create_tag(class_match.group(1), args.css_file.name, class_match.group(0))


if __name__ == '__main__':
    main()
Raphael Ahrens
la source