Wie kann zsh so konfiguriert werden, dass der Verzeichnisname mit Camelcase Matching automatisch vervollständigt wird?

9

Eclipse und Resharper bieten eine gute Möglichkeit zum Navigieren in Dateien.

Wenn ich die folgenden Ordner (oder Dateien) in meinem aktuellen Verzeichnis habe

MyReallyLongName
MyReallyLongAndFunName
MyReallyLongAndNotReallyFunName

In Eclipse kann ich zu ihnen navigieren, indem ich nur die Großbuchstaben verwende. Entsprechend möchte ich in zsh tippen können:

cd MRLAFN (Tab) (Enter)

In MyReallyLongAndFunNameeinem Schritt einsteigen

Wenn ich das jetzt mit zsh machen will, muss ich tippen My(Tab)Fun(Tab)(Enter)

Rohit Manokaran
quelle

Antworten:

6

Das funktioniert bei mir:

zstyle ':completion:*' matcher-list 'r:[^A-Z0-9]||[A-Z0-9]=** r:|=*' 

Dann kann ich das in einem Testverzeichnis machen:

touch MyReallyLongName MyReallyLongAndFunName MyReallyLongAndNotReallyFunName
ls MRLANRFN<TAB>
ls MyReallyLongAndNotReallyFunName

Ich habe es anhand der Tipps im Zshell-Benutzerhandbuch zusammengeschustert .

Phord
quelle
Können Sie bitte beschreiben, wo ich diese Erweiterung (Datei, Ordner) platzieren muss? Sie könnten auch daran interessiert sein, es dem zsh-vervollständigungsprojekt hinzuzufügen .
JJD
füge es deinem ~ / .zshrc hinzu
Cody
Dies funktioniert nicht ganz wie erwartet, mit AbcAde AdFg HlAkAd, wird ls AA<TAB>abgeschlossen Ad, während ich AbcAde erwarten würde.
Arekolek
@arekolek "Anzeige" ist eine teilweise Fertigstellung. Wenn Sie erneut auf TAB klicken (abhängig von Ihrer zsh-Konfiguration), werden alle übereinstimmenden Dateien angezeigt. Es sollte alle drei Dateien enthalten. Dann können Sie einen mit der Menüauswahl auswählen oder einen weiteren Dateinamen eingeben, um den Vervollständiger zu führen.
Phord
@arekolek Sorry - ich habe das falsch gelesen. Ich bin mir nicht sicher, wie Sie von dort zu Ad gekommen sind. Ich dachte, es sei ein teilweise mehrdeutiges Spiel, aber anhand Ihres Beispiels ist es schwer zu sagen. Erzeugt ein 2. TAB weitere Ergebnisse?
Phord
2

Ich habe dies "ganz gut" zum Laufen gebracht, indem _camel_caseich meiner persönlichen Datei ~/.zsh/functions folder(nimm einen beliebigen Ordner in deiner $fpathVariablen) eine Datei mit folgendem Inhalt hinzugefügt habe :

#autoload

[[ -z "$PREFIX" ]] && return 1

relpath=$(dirname $PREFIX)

[[ -e $relpath ]] || return 1

files=$(ls $relpath)

regex=$(echo $(basename $PREFIX) | sed -e 's/\([A-Z][^A-Z]*\)/\1[^A-Z]+/g')

correctedfiles=($(echo $files | grep -P $regex | sed -e :a -e '$!N;s/\n/ /;ta'))

results=($(for file in $correctedfiles; do echo "$relpath/$file"; done))

compadd -U -f -- $results

Dann habe ich die folgende Zeile zu meinem ~ / .zshrc hinzugefügt

zstyle ':completion:*' completer _complete _correct _path_files _camel_case

Beachten Sie, dass dies höchstwahrscheinlich keine "gute" Lösung ist, da ich nicht zu viel Wissen über das Vervollständigungssystem von zsh habe (nur wenige Leute haben es wirklich, denke ich), aber es macht genau das, was Sie in Ihrer Frage beschrieben haben.

tobi_p
quelle
Dies funktioniert nur etwas .. mkdir AaBbCcDd cd ABCD (tab) => cd ./ ie. Autocomplete schlägt fehl
Rohit Manokaran