Warum verhindert ein Wert '-' (Bindestrich) im Stil "Tag-Reihenfolge" das Abgleichen des Tags "Executables", selbst wenn dieses Tag explizit angegeben wird?

488
Iskustvo

Mit dem folgenden Code funktioniert alles wie erwartet:

  • Wenn ich schreibe cund die TABTaste drücke, erhalte ich die entsprechenden Abschlüsse in der richtigen Reihenfolge.

    Bild

  • Wenn ich schreibe ./und die TABTaste drücke, erhalte ich den Abschluss des executablesTags.

    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 keinen Abschluss ergeben, werden auch andere Tags versucht.

Der einfachste Weg, dies zu beweisen, besteht darin, das functionsTag vom tag-orderStil auszuschließen :

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 erstelle dann 2 Funktionen mit einem eindeutigen Präfix:

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

Wenn ich jetzt schreibe unique_prefix_und die TABTaste drücke, rechne ich nicht damit, etwas zu sehen, seit der functionsTag entfernt wurde tag-order.
Da jedoch Executables, Builtins, Commands, Aliases, Variablesund Keywordsbieten konnte keine Fertigstellungen, zshwird standardmäßig versuchen, andere Tags zu entsprechen, nämlich den ausgeschlossenen functionsTag, um zu versuchen, jeden Abschluss zu geben.

Aus diesem Grund werden die Funktionen unique_prefix_Aund unique_prefix_Bvorgeschlagen:

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 den Tag-Bestellstil schlägt eine einfache Lösung vor:

- Wenn ein Wert nur aus einem Bindestrich besteht, werden nur die in den anderen Werten angegebenen Tags generiert. Normalerweise werden alle nicht explizit ausgewählten Tags zuletzt versucht, wenn die angegebenen Tags keine Übereinstimmungen generieren. Das bedeutet, dass ein einzelner Wert, der nur aus einem einzelnen Bindestrich besteht, die Fertigstellung 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" "-" ) ' 

Derzeitiges Verhalten ist:

  • Wenn ich schreibe cund die TABTaste drücke, erhalte ich die entsprechenden Abschlüsse in der richtigen Reihenfolge.

    Bild)

  • Wenn ich schreibe ./und die TABTaste drücke, bekomme ich nichts.

    Bild


Warum executablesfunktioniert jetzt nur Tag nicht?

Wie kann ich das Problem beheben und das gewünschte Verhalten erhalten?

3
Ich verstehe den Text "Wenn ein Wert nur aus einem Bindestrich besteht, werden nur die in den anderen Werten angegebenen Tags generiert". Dies bedeutet, dass der Bindestrich Sie auf die Werte in der Liste beschränkt. Da `. /` Nicht in der Liste steht, erhalten Sie nichts. harrymc vor 5 Jahren 0
Ich habe versucht, Ihren Code zu verwenden, konnte Ihr Problem jedoch nicht replizieren (mit `zsh 4.3.17`). Haben Sie eine Chance, `. /` In einem Ordner zu beenden, der keine ausführbaren Dateien enthält? Können Sie ein Beispiel für das unerwünschte Verhalten geben? JRI vor 5 Jahren 0
@ harrymc Ja, ich verstehe es auch so. Ich verstehe jedoch nicht Ihren Standpunkt zu `. /`, Wie sollte er in der Liste stehen? `executables` 'Tag ist für die Vervollständigung von`. / `verantwortlich oder irre ich mich? Iskustvo vor 5 Jahren 0
@JRI Das ist merkwürdig. Ich verwende `zsh 5.5.1`, glauben Sie, dass dies eine Rückbildung im` zsh`-Quellcode sein könnte? Leider gibt es ausführbare Dateien und Verzeichnisse. Ich habe die Frage für jeden Fall mit Bildern aktualisiert. Das letzte Bild zeigt offensichtlich das unerwünschte Verhalten: D Iskustvo vor 5 Jahren 0
@JRI und Iskustvo: Auf welchen Linux-Versionen arbeiten Sie? JRI: Haben Sie die gleichen Befehle wie oben ohne Zusätze ausprobiert? harrymc vor 5 Jahren 0
@ harrymc `Linux Arch 4.16.4-1-ARCH # 1 SMP PREEMPT Do 24.04 13:21:29 UTC 2018 x86_64 GNU / Linux`. Spielt die Linux-Version wirklich eine Rolle dabei, wie `zsh` Vervollständigungen verwendet? Iskustvo vor 5 Jahren 0
Es kann Quellunterschiede zwischen Linux-Distributionen geben. harrymc vor 5 Jahren 0
Sie sollten sich bei Unix & Linux Stackexchange fragen, da gibt es einige sehr gute Leute mit Zsh. Kiwy vor 5 Jahren 0
Vielen Dank, zuerst habe ich StackOverflow getestet. Dann erfuhr ich von dieser Site und stellte dieselbe Frage hier und wenn auf keiner dieser Sites eine einzige Antwort vorhanden war, habe ich die Frage auch auf Unix und Linux gepostet. Ich habe auf allen drei Seiten Kopfgeld gegeben, und dies ist das einzige, wo jemand tatsächlich etwas relevantes kommentiert. Andere werden einfach ignoriert ... Iskustvo vor 5 Jahren 0

1 Antwort auf die Frage

1
hchbaw

Das executableTag ruft _files -g '*(-*)in diesem Fall auf. Dann _filesruft mehr _tags, so dass es notwendig wäre, diese zu spezifizieren implizit angegebenen Tags in den Abschluss - Funktionen 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, Folgendes hinzuzufügen globbed-filesund directoriesin 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 jedoch in derselben Gruppe "Ausführbare Dateien" gespeichert. Wenn wir möchten, dass "Verzeichnisse" in andere Gruppen aufgenommen werden, können wir das file-patternsdirekt angeben und so verwenden:

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/ 

Im Folgenden ist das kleinste .zshrc-Beispiel dargestellt:

autoload -Uz compinit && compinit zstyle ':completion:*:*:*:*:*' group-name '' zstyle ':completion:*:descriptions' format '%B%F%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.

Ich habe meine ursprüngliche Antwort kopiert. https://stackoverflow.com/a/50403671/4387039 hchbaw vor 5 Jahren 0