/ / Warum verhindert ein Wert '-' (Bindestrich) im Stil "Tag-Reihenfolge" den Abgleich des Tags "Executables", auch wenn dieses Tag explizit angegeben wird? - zsh

Warum verhindert ein Wert '-' (Bindestrich) im Stil "Tag-Reihenfolge" den Abgleich des Tags "Executables", auch wenn dieses Tag explizit angegeben wird? - zsh

Mit dem folgenden Code funktioniert alles wie erwartet:

  • Wenn ich schreibe c und traf die TAB SchlĂĽssel erhalte ich die entsprechenden Ergänzungen in der richtigen Reihenfolge.

    Bild

  • Wenn ich schreibe ./ und traf die TAB Ich bekomme die Vervollständigung fĂĽr den SchlĂĽssel executables Etikett.

    Bild


# Always use menu selection when using unambiguous completions.
zstyle ":completion:*:*:*:*:*" menu "select"

# Show only completions.
zstyle ":completion:*:*:*:*:*" completer _complete

# Group name becomes the name of the matching tag.
zstyle ":completion:*:*:*:*:*" group-name ""

# Configure the order of tag matching as well as their descriptions.
zstyle -e ":completion:*:*:-command-:*:*" tag-order "
reply=(
"executables:Executables:Executables
builtins:Builtins:Builtins
commands:Commands:Commands
aliases:Aliases:Aliases
functions:Functions:Functions
parameters:Variables:Variables
reserved-words:Keywords:Keywords"
)
"

# Configure the order in which completion groups will be shown.
zstyle ":completion:*:*:-command-:*:*" group-order "Executables" "Builtins" "Commands" "Aliases" "Functions" "Variables" "Keywords"

# Configure the format for each group/tag description.
zstyle ":completion:*:*:*:*:descriptions" format $"%{e[0;38;2;0;0;0;48;2;200;150;0m%}î‚° %d %{e[0;38;2;200;150;0;48;2;0;0;0m%}î‚°%{e[0m%}"

# Initialize completion system.
autoload -Uz compinit && compinit

Wenn die von mir angegebenen Tags jedoch keine Vervollständigung bewirken, werden auch andere Tags ausprobiert.

Der einfachste Weg, dies zu beweisen, besteht darin, das auszuschlieĂźen functions tag von tag-order Stil:

zstyle -e ":completion:*:*:-command-:*:*" tag-order "
reply=(
"executables:Executables:Executables
builtins:Builtins:Builtins
commands:Commands:Commands
aliases:Aliases:Aliases
parameters:Variables:Variables
reserved-words:Keywords:Keywords"
)
"

und erstellen Sie dann 2 Funktionen mit einem eindeutigen Präfix:

function unique_prefix_A() { }
function unique_prefix_B() { }

Jetzt wenn ich schreibe unique_prefix_ und traf die TAB Ich erwarte seitdem nichts mehr functions Tag wurde von entfernt tag-order.
Weil Executables, Builtins, Commands, Aliases, Variables und Keywords hat keine Vervollständigungen angegeben, zsh wird standardmäßig versuchen, mit anderen Tags übereinzustimmen, nämlich mit den ausgeschlossenen functions Tag, um zu versuchen, eine Vervollständigung zu geben.

Aus diesem Grund sind die Funktionen unique_prefix_A und unique_prefix_B wird vorgeschlagen:

Bild

Ich mag dieses Verhalten nicht und möchte die Suche nur auf Tags beschränken, die ich explizit angegeben habe.

Das Handbuch für die Tag-Reihenfolge Stil schlägt eine einfache Lösung vor:

- Wenn ein Wert nur aus einem Bindestrich besteht, dannEs werden nur die Tags generiert, die in den anderen Werten angegeben sind. Normalerweise werden alle nicht explizit ausgewählten Tags als letztes getestet, wenn die angegebenen Tags keine Übereinstimmungen generieren. Dies bedeutet, dass ein einzelner Wert, der nur aus einem einzelnen Bindestrich besteht, die Vervollständigung deaktiviert.

Anwendung der Lösung:

# Configure the order of tag matching as well as their descriptions.
zstyle -e ":completion:*:*:-command-:*:*" tag-order "
reply=(
"executables:Executables:Executables
builtins:Builtins:Builtins
commands:Commands:Commands
aliases:Aliases:Aliases
functions:Functions:Functions
parameters:Variables:Variables
reserved-words:Keywords:Keywords"
"-"
)
"

Aktuelles Verhalten ist:

  • Wenn ich schreibe c und traf die TAB SchlĂĽssel erhalte ich die entsprechenden Ergänzungen in der richtigen Reihenfolge.

    Bild)

  • Wenn ich schreibe ./ und traf die TAB SchlĂĽssel bekomme ich nichts.

    Bild


Warum ist jetzt nur executables Tag funktioniert nicht?

Wie kann ich das Problem beheben und das gewĂĽnschte Verhalten erzielen?

Antworten:

2 fĂĽr Antwort â„– 1

Das executable tag ruft auf _files -g "*(-*) in diesem Fall. Dann _files ruft mehr _tagsEs wäre also notwendig, diese zu spezifizieren implizit angegebene Tags in den Vervollständigungsfunktionen, auch.

zstyle -e ":completion:*:*:-command-:*:*" tag-order "
reply=(
"executables:Executables:Executables
builtins:Builtins:Builtins
commands:Commands:Commands
aliases:Aliases:Aliases
functions:Functions:Functions
parameters:Variables:Variables
reserved-words:Keywords:Keywords
globbed-files directories"
"-"
)
"

Es wäre nützlich hinzuzufügen globbed-files und directories in diesem Fall:

% ls -al
total 80
drwxr-xr-x  3 t    t     4096 May 18 08:27 .
drwxrwxrwt 16 root root 69632 May 18 15:27 ..
drwxr-xr-x  2 t    t     4096 May 18 08:27 directory
-rwxr-xr-x  1 t    t        0 May 18 08:27 executable-file
-rw-r--r--  1 t    t        0 May 18 08:27 test
% ./<TAB>
Executables
directory/        executable-file*

Bei der obigen Einstellung werden Verzeichnisse und lokale ausführbare Dateien in dieselbe Gruppe "Ausführbare Dateien" eingeordnet. Wenn wir "Verzeichnisse" in andere Gruppen einteilen möchten, können wir das angeben file-patterns direkt und benutze es so:

zstyle ":completion:*:*:-command-:*:*" file-patterns 
"*(#q-*):executables:Executables *(-/):directories:Directories"

zstyle -e ":completion:*:*:-command-:*:*" tag-order "
reply=(
"executables:Executables:Executables
builtins:Builtins:Builtins
commands:Commands:Commands
aliases:Aliases:Aliases
functions:Functions:Functions
parameters:Variables:Variables
reserved-words:Keywords:Keywords
directories:Directories"
-
)
"

Im folgenden Beispiel befinden sich "Verzeichnis" und "ausfĂĽhrbare Datei" in getrennten Gruppen:

% ls -al
total 80
drwxr-xr-x  3 t    t     4096 May 18 08:27 .
drwxrwxrwt 15 root root 69632 May 18 15:24 ..
drwxr-xr-x  2 t    t     4096 May 18 08:27 directory
-rwxr-xr-x  1 t    t        0 May 18 08:27 executable-file
-rw-r--r--  1 t    t        0 May 18 08:27 test
% ./<TAB>
Executables
executable-file*
Directories
directory/

Unten sehen Sie das kleinste .zshrc-Beispiel:

autoload -Uz compinit && compinit
zstyle ":completion:*:*:*:*:*" group-name ""
zstyle ":completion:*:descriptions" format "%B%F{black}%d%f%b"
zstyle ":completion:*:*:*:*:*" menu "select"

# This comment out block is just for a reminder of my answer"s first half.
# zstyle -e ":completion:*:*:-command-:*:*" tag-order "
#       reply=(
#                    "executables:Executables:Executables
#                       builtins:Builtins:Builtins
#                       commands:Commands:Commands
#                       aliases:Aliases:Aliases
#                       functions:Functions:Functions
#                       parameters:Variables:Variables
#                       reserved-words:Keywords:Keywords
#                       globbed-files directories"
#                    "-"
#                   )
# "

zstyle ":completion:*:*:-command-:*:*" file-patterns 
"*(#q-*):executables:Executables *(-/):directories:Directories"

zstyle -e ":completion:*:*:-command-:*:*" tag-order "
reply=(
"executables:Executables:Executables
builtins:Builtins:Builtins
commands:Commands:Commands
aliases:Aliases:Aliases
functions:Functions:Functions
parameters:Variables:Variables
reserved-words:Keywords:Keywords
directories:Directories"
-
)
"

Aktualisiert: Kommentieren Sie den nicht benötigten Block aus.


1 fĂĽr Antwort â„– 2

Ich denke, das Problem ist nicht nur der (Bindestrich), sondern wie genau Sie die Regeln für die automatische Vervollständigung kennen.

Ich habe einige Tests durchgefĂĽhrt, zum Beispiel das Entfernen "Variablen" vom Auftragstag und Erstellen (TEST, LOLO) in der Shell.

Danach habe ich versucht, die automatische Vervollständigung durchzuführen, ohne zu erwarten, dass etwas angezeigt wird. Stattdessen wurden sie unter "Variablen" als "Parameter" aufgeführt.

Dieses Verhalten lieĂź mich ĂĽber UDEV nachdenken und darĂĽber, wie bestimmte Systeme fĂĽr bestimmte Verhalten ganz bestimmte Regeln erfordern.

Ihre Tag-Matching-Gruppe ist in Ordnung und funktioniert wie beabsichtigt (im Szenario ./). Eine Sache ist jedoch, Folgendes auszufĂĽhren:

./<TAB>

und eine ganz andere Sache ist es, etwas zu vervollständigen:

unique_prefix<TAB>

Es spielt also keine Rolle, wie viele Bindestriche Sie fĂĽr diese Gruppe hinzufĂĽgen, es funktioniert nicht, da es sich um eine andere RegelausfĂĽhrung handelt.

Anstatt mich damit zu befassen, habe ich nach einem Beispiel gesucht, um bestimmte Funktionen zu vermeiden, und dieses Snippet hat ganz gut funktioniert (Quelle ĂĽberprĂĽfen):

Eine Verwendung dieser Funktionen besteht darin, ein Tag mehr auszuprobierenals einmal einstellen andere Stile unterschiedlich bei jedem Versuch, aber immer noch alle zu verwenden andere Tags, ohne sie alle zu wiederholen. Zum Beispiel zu machen Die Vervollständigung von Funktionsnamen an der Befehlsposition ignoriert alle Abschlussfunktionen, die beim ersten Mal mit einem Unterstrich beginnen Fertigstellung wird versucht:

(Ich habe dies geändert, um allen Funktionen zu entsprechen):

ignored-patterns ’_*’

dafĂĽr:

ignored-patterns ’*’

In diesen Regeln:

zstyle ’:completion:*:*:-command-:*:*’ tag-order 
’functions:-non-comp *’ functions
zstyle ’:completion:*:functions-non-comp’ 
ignored-patterns ’*’

Und als ich versucht habe, automatisch zu vervollständigen: unique_prefix (nichts ist passiert) und die ./ Ausführung hat gut funktioniert.

Die Antwort lautet also: Sie benötigen für jedes Szenario spezifische Regeln, wobei zu berücksichtigen ist, dass jedes Muster entsprechend den von Ihnen definierten Regeln unterschiedlich interpretiert werden kann.