Gibt es einen Fuzzy-Matching-Modus für die zsh-Shell?

22

Ich habe mich kürzlich in effiziente Textvervollständigungssysteme verliebt. Eine meiner Lieblingsarten der Vervollständigung ist die sogenannte Fuzzy-Vervollständigung. In diesem Modus vervollständigt das Programm die Benutzereingabe auf der Grundlage von nur wenigen Zeichen, die (fast) überall im Dateinamen oder Pfad vorkommen können. Diese Funktion gibt es zumindest für diese Programme:

Anwendungsbeispiel für diesen Modus in einem Texteditor:

Der Benutzer versucht, das Wort longWordNameThatTheyDontWantToWriteByHand zu vervollständigen, und kann dazu z. B. den ersten Buchstaben und einige Großbuchstaben eingeben. Wenn Sie also lwnt eingeben, kann dies das ganze Wort vervollständigen.

Meine Frage ist: gibt es einen Modus oder etwas ähnliches, das ich mit der zsh-Shell verwenden könnte?

sp3ctum
quelle

Antworten:

27

Ich habe das in meinem .zshrc

# 0 -- vanilla completion (abc => abc)
# 1 -- smart case completion (abc => Abc)
# 2 -- word flex completion (abc => A-big-Car)
# 3 -- full flex completion (abc => ABraCadabra)
zstyle ':completion:*' matcher-list '' \
  'm:{a-z\-}={A-Z\_}' \
  'r:[^[:alpha:]]||[[:alpha:]]=** r:|=* m:{a-z\-}={A-Z\_}' \
  'r:|?=** m:{a-z\-}={A-Z\_}'

Es fügt der zshCompletion Engine eine vollständige Fuzzy-Anpassung hinzu . Es fehlt die Super-Intelligenz von erhabenem Text, aber, ja, es wird vervollständigt lwnt -> longWordNameThatTheyDontWantToWriteByHand.

PythonNut
quelle
1
Ich habe gerade einen Fehler: funktioniert nicht für Dateinamen mit Leerzeichen, da Sie schreiben etwas nach dem Raum ☹ Ie stack install && vlc ~/Music/erfnicht vollständig stack install && vlc ~/Music/FGFC820\ -\ Perfect\ War.mp3.
Hi-Angel
5
@Hi-Angel hey, danke für das Anstoßen. Ich benutze 'r:|?=** m:{a-z\-}={A-Z\_}'jetzt tatsächlich etwas Einfacheres und leide nicht unter dem von Ihnen beschriebenen Problem.
PythonNut
Das ist großartig! Vielleicht könntest du ein Plugin mit diesem Code machen. Nur damit es leichter zu finden ist.
26.
15

Schauen Sie sich mein Projekt FZF .

Es ist ein Fuzzy-Finder für allgemeine Zwecke, der in Golang geschrieben wurde und mit jeder Liste von Dingen verwendet werden kann: Dateien, Prozesse, Befehlsverlauf, Git-Zweige usw.

Für zsh werden die folgenden Schlüsselbindungen bereitgestellt:

  • CTRL-T - Fügen Sie die ausgewählten Dateipfade in die Befehlszeile ein
  • CTRL-R - Fügen Sie den ausgewählten Befehl aus dem Verlauf in die Befehlszeile ein
  • ALT-C - CD in das ausgewählte Verzeichnis

und Fuzzy-Abschlussmodus:

# Files under current directory
# - You can select multiple items with TAB key
vim **<TAB>

# Files under parent directory
vim ../**<TAB>

# Files under parent directory that match `fzf`
vim ../fzf**<TAB>

# Files under your home directory
vim ~/**<TAB>

# Directories under current directory (single-selection)
cd **<TAB>

# Directories under ~/github that match `fzf`
cd ~/github/fzf**<TAB>

# Process IDs. Can select multiple processes with TAB or Shift-TAB
kill -9 <TAB>

# Host names
ssh **<TAB>
telnet **<TAB>

# Environment variables / aliases
unset **<TAB>
export **<TAB>
unalias **<TAB>
Junegunn Choi
quelle
4
Wie kann ich die Registerkarte damit standardmäßig vervollständigen? Ohne tippen zu müssen**
theonlygusti