/ / Erweitern Sie nicht das Platzhalterzeichen beim Vervollständigen von Registerkarten - zsh, Platzhalterzeichen, Vervollständigen von Registerkarten

Erweitern Sie nicht den Platzhalter beim Vervollständigen von Tabs - zsh, Platzhalter, Tab-Vervollständigung

Zsh

Ich frage mich, wie ich konfigurieren kann zsh zu nicht Erweitern Sie den Platzhalter in einem Dateinamen. Zum Beispiel habe ich ein Verzeichnis von ein paar hundert Dateien mit den folgenden Namen:

a.foo-bar a.foo b.foo-bar b.foo c.foo-bar c.foo

Ich möchte in der Lage sein, einen Abgleich der Registerkartenvervollständigung durchzuführen nach eine Wildcard, also

cat *.foo-< tab > => cat *.foo-bar

Das bekomme ich stattdessen:

$ cat * .foo- => Katze a.foo-bar
Datei
a.foo-bar b.foo-bar c.foo-bar

Antworten:

6 für Antwort № 1

Eine Möglichkeit besteht darin, dass Sie die Standardschlüsselbindung für die ersetzen TAB Schlüssel

bindkey "^I" expand-or-complete

mit

bindkey "^I" complete-word

die nicht erweitern a * auf alle passenden Dateien, lässt aber den Stern unberührt. Auf diese Weise werden Sie die endlose Liste los, aber sie wird den glühenden Ausdruck immer noch nicht vervollständigen.

Dies zu lösen ist viel schwieriger. Du musst deine eigene schreiben Vervollständigungs-Widget (sehen man zshcompwid).

  1. Beginnen wir mit der Definition:

    zle -C complete-glob menu-complete compglob
    

    Dies führt das neue Widget ein Komplett-Glob, was sich so verhält menü-komplett und nutzt die Shell-Funktion compglob um die Übereinstimmungen zu generieren.

    [Hinweis: Wenn Sie die Vervollständigung des Menüs nicht wünschen, verwenden Sie die wesentlich rudimentäreren Optionen vollständiges Wort oder Listenauswahl ]

  2. Binden Sie dieses neue Widget an eine praktische Verknüpfung wie CTRL+K:

    bindkey "^K" complete-glob
    

    Binden Sie dies nicht an TAB, da das Widget in seiner aktuellen Form nur Dateien vervollständigt!

  3. Definieren Sie die Shell-Funktion compglob wie folgt, was die eigentliche Arbeit macht:

    compglob () {
    setopt localoptions globsubst
    compset -P "*"
    files=(${IPREFIX}*)
    display=(${files/${IPREFIX}/${(q)IPREFIX}})
    glob=(${files/${IPREFIX}/})
    compadd -d display -- $glob
    }
    
  4. Demonstration:

    $ touch a.foo-bar a.foo b.foo-bar b.foo c.foo-bar c.foo
    $ cat *.f<CTRL+K>
    $ cat *.foo
    *.foo      *.foo-bar
    

    Der einzige Fehler, den ich sehe, ist der vor dem stern in der präsentierten liste. Dies ist jedoch nur ein optischer Fehler, da die Vervollständigung korrekt ist: *.foo oder *.foo-bar.


0 für Antwort № 2

Ich glaube nicht, dass das möglich ist. Sie möchten, dass die Shell nicht nur herausfindet, welche Dateien Sie bearbeiten und welche nicht entsprechend Ihrer Platzhaltererweiterung gültig sind, sondern dass die Shell auch den "besten" Platzhalterausdruck ermittelt, der erweitert wird diesen Weg. Ich würde erwarten, dass der zweite Teil NP-vollständig ist.


0 für Antwort № 3

Ich sehe noch keinen Weg, wie Sie das erreichen können, wonach Sie suchen, aber Sie können eine Modifikation (die für Sie hilfreich sein kann oder nicht) über erhalten setopt GLOB_COMPLETE (dies gibt Ihnen nur eine Erweiterung, und dann können Sie sie durchlaufen ... oder nur diese bearbeiten, um eine zu sein * wieder, was zumindest eine kleine Verbesserung sein kann).

Sie könnten auch in graben man zshoptions, man zshcompctl, man zshcompwid und / oder ähnlich. Das Vervollständigungsmaterial für zsh ist ziemlich komplex, daher schätze ich, dass es eine Möglichkeit gibt, dies zu tun.

Beachten Sie auch eine etwas verwandte Frage:

Wie kann ich zsh automatisch vervollständigen lassen, um Platzhalter wie bei bash zu vervollständigen?


Verwandte Fragen
Bemerkungen
Einen Kommentar hinzufügen