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

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

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.