Bezogen auf Bash-like partielle Tab-Complete für Dateinamen in Vim
Eine der wirklich fantastischen Funktionen von zsh
ist, dass Sie beispielsweise tippen ls /u/s/m/m/who.1
, drücken Tabund vervollständigen können
ls /usr/share/man/man1/who.1.gz
. Wenn Sie sich erst einmal daran gewöhnt haben, ist es sehr ärgerlich, zurück zu gehen /u<tab>/s<tab>/m<tab>/m<tab>...
, insbesondere wenn der gesamte Teilpfad nur in einen tatsächlichen Pfad aufgelöst werden kann, aber jede einzelne Komponente möglicherweise mehrere Vervollständigungen aufweist. Kann dies in Vim beispielsweise bei Verwendung von :e
oder erreicht werden :cd
?
Es gibt andere nützliche pfadbezogene Funktionen in zsh, z. B. die Verwendung cd foo bar
zum Verschieben zu einem äquivalenten Pfad, der foo
durch bar
(dh /blah/foo/baz/yada
wird /blah/bar/baz/yada
) ersetzt wird . Wenn es eine Lösung gibt, die auch diese einbringt (im Wesentlichen Shell-bezogene Aufgaben an eine Shell zu übergeben, die diese sehr gut erledigt), wäre es großartig.
Antworten:
Ich habe CtrlP und andere verwandte Plugins viel früher verwendet, bis ich die nativen Fähigkeiten von vim wirklich entdeckt habe. Lassen Sie mich einige Möglichkeiten erklären, ohne ein externes Plugin zu benötigen:
:e
, das Schöne an: e ist, dass du so etwas machen kannst:e /u*/s*/m*/m*/<Tab>
und vim wird das automatisch für dich erweitern:e /usr/share/man/man
. Das ist viel kürzer und einfacher als das, was Sie gepostet haben, aber ein noch besserer Weg ist es:e /usr/**/man<Tab>
, es wird rekursiv unter angezeigt/usr
und listet alle übereinstimmenden Pfade auf. Dies kann jedoch einige Zeit dauern, abhängig davon, wie groß das Set ist, aber in a Projekt dies wirkt Wunder, weil Sie so etwas tun können:e ap**/jav**/user<Tab>
und es alle unvollständigen Pfade vervollständigt und Ihnen eine Liste von übereinstimmenden Pfaden gibt und super gut funktioniert.:b
, Um vorhandene Puffer zu öffnen. Dies ist sehr leistungsfähig, da standardmäßig Teiltöne akzeptiert werden, sodass Sie einfach so etwas tun können,:b usr*man<Tab>
und der Dateiname vervollständigt wird, wenn er bereits in die Pufferliste geladen wurde. Dies ist besonders gut, weil es fast augenblicklich und sehr schnell ist. Außerdem verwende ich VIM-Sitzungen häufig mit Hilfe von tpope / vim-obsession und dhruvasagar / vim-prosession , wodurch alle von mir geöffneten Dateien in der Pufferliste gespeichert bleiben und auch dann verfügbar sind, wenn ich vim existiere und von dort zurückkomme Projektverzeichnis.quelle
/u*/s*/m*/m*/<Tab>
So habe ich Bash umgangen. Es ist kein Ersatz für zsh um eine Meile./usr/**/man<Tab>
ist schrecklich langsam, wenn Sie das gesamte Dateisystem geöffnet haben, kann aber für kleine Projekte nützlich sein. Wenn ich:b
es nicht falsch verstehe , dient es nicht zum Öffnen neuer Dateien.**
ist in der Tat schrecklich langsam, funktioniert aber gut für reguläre Projekte.:b
ist für vorhandenen offenen Puffer, deshalb hilft die Verwendung von Sitzungen.vim-zsh-path-vervollständigung gibt vor, genau das zu tun, wonach Sie fragen (zumindest der erste Teil), aber ich habe es nie versucht. (Ich hatte noch nicht einmal davon gehört, bis Romainl mit einer SO-Antwort des Autors verknüpft war , obwohl in der Dokumentation auch einige Einschränkungen erwähnt werden.
Darüber hinaus gibt es verschiedene Fuzzy-File-Finder, die beim Öffnen von Dateien etwas Ähnliches erreichen.
Mein bevorzugtes Plugin dafür ist CtrlP . Wenn zum Öffnen von Dateien verwendet, ist es für alle Dateien , deren vollständige Pfade sucht die Zeichen , dass Sie in der richtigen Typ auftrags Sie nicht haben , um in Teilen jeder Komponente des Pfades zu geben (und alle den Weg Separatoren) , wie Sie haben in Ihrem Beispiel, aber es funktioniert perfekt, wenn Sie dies tun. Dieselbe Schnittstelle wird auch zum Öffnen kürzlich verwendeter Dateien und aktuell geöffneter Puffer und mehr verwendet.
Standardmäßig wird
<c-p>
im normalen Modus die CtrlP-Eingabeaufforderung geöffnet. Die Eingabeaufforderung zeigt eine Liste von Dateien an, die beim Eingeben von Zeichen eingegrenzt wird. Sie können Enterjederzeit drücken , um die aktuell ausgewählte Datei zu öffnen, oder die Auswahl verwenden<c-k>
und<c-j>
nach oben und unten durch die Liste der aktuell übereinstimmenden Dateien verschieben.Eine andere beliebte Alternative ist Command-T , aber ich bevorzuge CtrlP, weil es in VimScript implementiert ist. Command-T hat eine Ruby-Komponente.
quelle