Wie werden CSS-Klassennamen, die ein Minuszeichen enthalten, automatisch vervollständigt?

8

Ich habe die folgende CSS-Klassenstruktur

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

und so weiter.

In meinen HTML-Dateien möchte ich diese Klassennamen automatisch vervollständigen.

Aber wenn ich tippe

<span class="mAIcon mA|">

und ich möchte den Rest automatisch vervollständigen. Das einzige, was ich bekomme, ist

<span class="mAIcon mAIcon|">

Um zu bekommen, was ich wirklich will, muss ich ein Extra eingeben -und zum Beispiel edie automatische Vervollständigung erneut verwenden. Aber dann bekomme ich alles, was mit einem beginnt e, sogar die Klasse event. Das ist wirklich ärgerlich und macht die Autovervollständigung in diesem Fall ziemlich nutzlos.

Ich verwende die generische Schlüsselwortvervollständigung von Vim mit dem i_CTRL-NBefehl und habe keine zusätzlichen Vervollständigungs-Plugins installiert.

Ist es möglich, die -zur Erkennung von CSS-Klassennamen für die automatische Vervollständigung einzubeziehen?

Raphael Ahrens
quelle
Sie sagen "Autocomplete". Bedeutet dies, dass Sie YouCompleteMe, Neocomplete oder ähnliches verwenden? Wenn ja, sollte dies in Ihrer Frage erwähnt werden. Wenn nicht, müssen Sie eine Art Abschlussbefehl ausgeben, z. B. <c-x><c-n>der auch in Ihrer Frage angegeben werden sollte.
Karl Yngve Lervåg
@ KarlYngveLervåg danke für deinen Kommentar. Bitte werfen Sie einen Blick auf meine Bearbeitung.
Raphael Ahrens
1
Ihre Bearbeitung bestätigte meinen Verdacht. Erstens sollte die automatische Vervollständigung von IMHO automatisch erfolgen, und als solches besteht das von Ihnen beschriebene Problem nicht in der automatischen Vervollständigung, sondern lediglich in der Vervollständigung. Für die automatische Vervollständigung in Vim empfehle ich Ihnen, sich neocomplete oder YouCompleteMe anzusehen. Zweitens verwenden Sie die generische KEYWORD-Vervollständigung von Vim. Ein Schlüsselwort wird durch die Option definiert 'iskeyword', und obwohl Schlüsselwörter auch für andere Befehle (Nebenwirkungen) verwendet werden, ist dies immer noch der richtige Weg, um das zu erreichen, was Sie wollen, ohne andere Arten der (automatischen) Vervollständigung zu verwenden.
Karl Yngve Lervåg
@ KarlYngveLervåg Zuerst entschuldige ich mich für das Missverständnis. Aber ich dachte, dass Autocompletion der richtige Begriff ist. Zweitens könnten Sie mich dann auf etwas hinweisen, das mein Abschlussproblem löst? Soweit ich sehen kann, ändern YouCompleteMe und neocomplete das Abschlussverhalten der Standardvervollständigung nicht, sondern fügen nur mehr "auto" hinzu, was ich nicht benötige. Ich dachte wirklich, dass dies mit Vim möglich wäre.
Raphael Ahrens
1
Ich könnte mich irren, aber die Tag-Vervollständigung könnte in diesem Fall funktionieren. Ich persönlich mache nicht viel Webentwicklung und bin daher mit Vim für html / css / ... nicht so vertraut, aber ich denke, dass ctagsdies in der Lage sein sollte, Tags für Ihr Projekt zu generieren. Dann können Sie die Tag-Vervollständigung mit durchführen i_CTRL-X_CTRL-]. In den Dokumenten wird jedoch angezeigt, dass die Tag-Vervollständigung auch die iskeywordOption verwendet, sodass ich mich möglicherweise irre. In jedem Fall möchten Sie wahrscheinlich lesen :h ins-completion.
Karl Yngve Lervåg

Antworten:

10

Ja, Sie können mit der 'iskeyword'Option definieren, welche Zeichen als Teil von Schlüsselwörtern betrachtet werden :

setlocal iskeyword+=-

Sie können das folgende Snippet hinzufügen vimrc, um diese Option auf CSS- und HTML-Dateien zu beschränken:

augroup css
    autocmd!
    autocmd FileType css,html setlocal iskeyword+=-
augroup END
romainl
quelle
5
Beachten Sie, dass das Ändern iskeywordviele Nebenwirkungen hat. Zum Beispiel wird dwon some-textjetzt gelöscht some-text, anstatt nur some. Nicht unbedingt eine schlechte Sache, aber etwas, das man beachten muss.
Martin Tournoij
Mhh, das scheint nur innerhalb einer CSS-Datei zu funktionieren. Sobald ich zu einem anderen Puffer (zum Beispiel einer HTML-Datei) wechsle, werden nur Wörter ohne Minuszeichen vervollständigt.
Raphael Ahrens
@ RaphaelAhrens, siehe meine Bearbeitung.
Romainl
@romainl Ich schätze deine schnelle Antwort sehr. Aber es tut mir leid, ich kann diese Antwort nicht akzeptieren, da sie nicht mit mehr Dateitypen skaliert werden kann und außerdem die von Carpetsmoker erwähnten Nebenwirkungen hat. Ich hoffe, Sie verstehen.
Raphael Ahrens
1
Ich benutze dies, aber ich löse auf jsund coffeeDateien auch. Weil ich CSS-Klassen häufig in Javascript absolviere und selten Code habe, der eine Subtraktion ohne Leerzeichen ausführt. In Code, den ich bearbeite, diff = foo - bar;ist häufiger alsdiff=foo-bar;
joeytwiddle
1

Ich habe das Problem gelöst, indem ich ein kleines Python-Skript geschrieben habe, das eine Tag-Datei erstellt. Das Skript sucht nach CSS-Klassen und druckt für jede Klasse eine Tag-Zeile.

Im Moment führe ich das Skript von Hand mit aus

css_tags $file >> tags

Dadurch werden die Dateien zur Tags-Datei hinzugefügt. Dies funktioniert, da die Tag-Vervollständigung nicht durch die iskeywordEinstellung eingeschränkt ist.

Hier ist der Inhalt des Skripts, das auch auf GitHub verfügbar ist .

#!/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
quelle