2014-02-05 7 views
6

Ich änderte Shell von Bash zu Zsh und ich fragte mich, ob dies möglich war, komplette Befehle wie in der Sublime Text Palette zu verschwimmen. Ich denke, dass dieses Konzept des Suchens, Komplettierens überall sein muss. Es ist eine enorme Zeitersparnis.Wie fuzzy Vervollständigung (wie Sublime Text-Palette) zu ZSH

Beispiel:

cd dcmts -> cd Documents

cd dwnls/mnf -> cd Downloads/MyNewFolder

sah ich folgendes Projekt und es ist nicht wirklich überzeugend.

zsh-fuzzy-match

Und es ist möglich zu sein scheint einige Einstellungen oder Algorithmen zu definieren, um das Verhalten von zsh nach Abschluss zu konfigurieren.

zstyle ':completion:*' completer _complete _match _approximate

zstyle ':completion:*:match:*' original only

zstyle ':completion:*:approximate:*' max-errors 10 numeric

Das Problem der beiden bisherigen Lösungen ist, dass Ordner nicht oben auf der Liste erscheint, wenn abgeschlossen, während es oft ist, was der Nutzer will.

Wenn Sie irgendeine interessante .zshrc haben, die unscharfe Suche statiffy, würde es interessant sein.

Danke für Ihre Hilfe.

Antwort

3

Können Sie ein Beispiel für Ordner geben erscheint nicht an der Spitze der Liste bei der Fertigstellung? Es scheint Sie haben etwas in Ihrer Konfiguration, Dinge für Sie zu brechen. Zsh wird standardmäßig nur vollständige cd mit Verzeichnissen:

zsh -f # new Zsh with only default configs 
% zstyle ':completion:*' completer _complete _match _approximate 
% zstyle ':completion:*:approximate:*' max-errors 3 numeric 
% mkdir test && cd test 
% mkdir etc && touch et0 
% autoload -U compinit && compinit 
% cd et0[TAB] # removes the 'et0' and replaces it with 'etc'. 

FWIW, für "die Suche und das Abschließen von überall" prüfen, versuchen predicthttps://stackoverflow.com/a/17230878/766289 (ich finde es ein wenig verrückt ...)

Auch in Zsh Sie Dinge tun können wie:

setopt auto_cd 
alias -d build=/home/foo/very/long/path/build # dir alias 
build # <-- changes into /home/foo/very/long/path/build 

Oder nur

zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' # match upper from lower case 
cd d/m[TAB] # just type the initial letter of each dir 
cd Downloads/MyNewFolder 

I cd d/m bedeuten erfordert weniger tippen als cd dwnls/mnf ;-)

+0

In der Tat, Ordner nicht oben angezeigt, weil ich nicht den Befehl cd, sondern nur den Namen des Ordners eintippte. Das ist also normal. Ihr habt Recht, dass 'cd d/m' viel schneller ist als 'cd dwnls/mnf'. Ich werde versuchen, es zu benutzen. Und die Vorhersage-Lösung ist einfach SO ERSTAUNLICH. Ich liebe es, danke;) –

5

Ich schlage vor, Sie fzf Check-out, ein Allzweck-Fuzzy-Finder, die Linien von der Standardeingabe verarbeiten kann. Es ist in Ruby geschrieben und nicht ein Zsh-Skript, also ist es vielleicht nicht das, wonach Sie suchen, aber genau wie zsh-fuzzy-match stellt es CTRL-T Bindung für Ihre Shell und es ist ziemlich einfach, sein Verhalten anzupassen.

Das GIF unten zeigt, wie es funktioniert.

EDIT:

fzf vollständig in Go neu geschrieben wurde und nun kommt mit fuzzy completion support für zsh und bash.

+0

Es ist eine gute Arbeit. Ich warte darauf, dass das Modul für zsh entwickelt wird. Der Entwickler scheint auf Pull-Requests zu warten. Danke für diesen Zweck. –

4

Versuchen Sie, diese

zstyle ':completion:*' matcher-list 'r:[[:ascii:]]||[[:ascii:]]=** r:|=* m:{a-z\-}={A-Z\_}' 

In deine zshrc setzen. Es tut genau, was Sie wollen, und es tut es zu zsh eigenen Completion-System, nicht zu einem externen Abschlusssystem.

+0

arbeitete wie ein Charme! TY – schurpf

+0

Können Sie das Argument nach "Matcher-Liste" etwas genauer erklären? Es scheint nach einem kurzen Test (mit "ls") zu funktionieren, hat aber einige Störungen: Absolute Pfade sind nicht abgeschlossen, und Übereinstimmungen in Unterverzeichnissen werden in der Vervollständigungsliste angezeigt, aber von der Befehlszeile entfernt, z. 'cd /' dann 'ls etc/p ' listet einige Dateien in/etc auf, die ein p in ihrem Namen haben, aber meine Kommandozeile ist auf 'ls etc /' gesetzt. – Lucas