Vervollständigung von Wörtern auf dem Bildschirm wie in VIM (Bash oder Tmux)

10

Wie kann ich Bash, Zsh oder Tmux so konfigurieren, dass die letzte übereinstimmende Kennung auf dem Bildschirm vervollständigt wird ? Stellen Sie sich dieses häufige Szenario vor:

$ git fetch
remote: Counting objects: 16, done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 9 (delta 4), reused 0 (delta 0)
Unpacking objects: 100% (9/9), done.
From /opt/git/thunder
 * [new branch]      issue540   -> origin/issue547314
   e9204cf..4d42c3f  v2.1       -> origin/v2.1

Wie kann ich Bash / Zsh / Tmux issue547einfach auf der CLI ausführen lassen ? Wenn ich drücke, Tabnachdem $ git checkout isGit hilfreich abgeschlossen issuewurde, muss ich die Ziffern jedoch selbst vervollständigen, da alle vorherigen Ziffern tatsächlich mit vorhandenen Git-Zweigen übereinstimmen .

In VIM wird das Drücken von Ctrl+ Pfür omnicomplete wie bei der vorherigen Übereinstimmung abgeschlossen, sodass in diesem Fall issue547314tatsächlich abgeschlossen wird. Wie kann ich dieses Verhalten in Bash, in Zsh oder in Tmux bekommen ?

Ich verwende derzeit Bash 4.2 und Tmux 1.10 auf Ubuntu Server (normalerweise 12.04 LTS). Ich kann bei Bedarf auf den neuesten Ubuntu Server LTS (14.04) aktualisieren.

EDIT : Ich hätte nichts gegen eine Lösung, die Bash, Zsh oder Tmux verwendet, solange es nicht schwierig ist, zu verwenden. Also Taboder Ctrl+ Poder eine andere solche Verknüpfung wäre in Ordnung, aber nicht Alt+ Meta+ Super+ Shift+ א.

dotancohen
quelle
Ich bin mir ziemlich sicher, dass dies eine ziemlich große Überarbeitung der Bash-Quelle erfordern würde.
Kevin
@ Kevin: Ich dachte mir das auch, aber hoffentlich kann entweder der erstaunliche zsh damit umgehen oder vielleicht tmux.
Dotancohen

Antworten:

4

Ich denke, diese Funktion, nach der OP sucht, heißt in der Emacs-Welt dabbrev-expand :

Erweitern Sie das Wort im Puffer vor dem Punkt als dynamische Abkürzung, indem Sie im Puffer nach Wörtern suchen, die mit dieser Abkürzung beginnen (v-expand).

xtermhat auch eine dabbrev-expandFunktion, ist aber etwas weniger schlau als das Gegenstück von Emacs, aber es ist sehr nützlich für mich und einer der Gründe, zu denen ich gewechselt bin xterm. Innerhalb des xtermFensters kann eine benutzerdefinierte Tastenkombination verwendet werden ~/.Xresources, um dabbrev-expandeine bestimmte Zeichenfolge aufzurufen . Zum Beispiel habe ich den folgenden Eintrag in meinem ~/.Xresources(ich verwende uxtermeine Unicode-Version von xterm):

UXTerm*VT100.Translations: #override \n\
     Meta <Key>/:dabbrev-expand() \n\

Innerhalb des xtermFensters kann ich M-/( ALT + /) zum Aufrufen verwenden dabbrev-expand. xtermsucht nach allen auf dem Bildschirm sichtbaren Zeichenfolgen, die mit den von mir eingegebenen Buchstaben beginnen. Beispiel:

$ echo a_very_long_string bye by
$ a_v

Wenn ich M-/jetzt drückte, xtermwürde sich erweitern a_vzu a_very_long_string. Leider ist, wie gesagt, xtermnicht so schlau und seine dabbrev-expandFunktion funktioniert nur bei vollen Saiten. In Ihrem Fall iswürde also auf erweitert issue540und nicht, issue547314weil dies issue547314ein Teil von ist origin/issue547314(denken Sie daran, wie \bbei regulären Ausdrücken, es ist ein bisschen ähnlich, obwohl die meisten Engines für reguläre Ausdrücke beide Vorkommen von issueZeichenfolgen in abfangen würden \bissue.+\b). Aber können Sie eingeben orund dann pres M-/. xtermwird zunächst erweitern orzu origin/v2.1, dann ist dies nicht das, was wir so drücken Sie M-/wieder und xtermes zu erweitern origin/issue547314. Wenn Sie jetzt Bash verwenden, können Sie Folgendes tun M-b:C-wund Teil C-ezu entfernen origin/. Zusammenfassend lässt sich sagen, dass das dabbrev-expandInnere xtermnicht so gut ist wie bei Emacs (und Vim, denke ich), aber es ist immer noch schneller als das Umschreiben langer Saiten von Hand und weniger anfällig für Tippfehler. In den meisten Fällen wird es direkt auf die gewünschte Zeichenfolge erweitert, ohne dass redundante Teile entfernt werden müssen. Sie müssen sich nur daran gewöhnen - schauen Sie sich die Zeichenfolge an, die Sie am Cursor haben möchten, und prüfen Sie, ob ihr nichts anderes vorangestellt ist und ob es sich um einen vorhergehenden Teil handelt, und entfernen Sie ihn nach der Erweiterung.

Beachten Sie, dass diese Funktion standardmäßig xtermnicht kompiliert ist dabbrev-expandund Sie sie explizit aktivieren müssen. Die Version von xtermin Ubuntu-Repositorys wird jedoch mit kompiliert dabbrev-expandund Sie können sie sofort verwenden.

Arkadiusz Drabczyk
quelle
Danke Arkadiusz, das scheint nah genug an dem zu sein, was ich brauche. Beachten Sie, dass ich es nicht zum Laufen bringen kann! Vielleicht sind meine xtermund uxtermnicht für dabbrev-expand kompiliert, ich konnte das Feature in nicht erwähnen -help. Wie kann ich die Kompilierungsflags sehen (wie bei vim --version)? Beachten Sie, dass ich auch in die Config - Linie versucht , ~/.Xresourceswie Meta <KeyPress> /: dabbrev-expand() \n\ wie gefunden hier aber das hat nicht geholfen, auch nicht .
Dotancohen
Möglicherweise wurde Ihr xterm ohne dabbrev-expand kompiliert. Wie haben Sie xterm installiert? Nach dem Ändern von ~ / .Xresources xrdb -merge .Xresourcesin xterm.
Arkadiusz Drabczyk
Das hat es mit Sicherheit getan, Arkadiusz! Danke!
Dotancohen
Ich werde die Frage noch ein paar Stunden stellen, bis die Kopfgeldperiode endet, aber ich bin mir ziemlich sicher, dass Sie ein Schuh-in sind. Das einzige Problem ist die Anforderung für xterm, was schrecklich ist! Aber jetzt, da ich den richtigen Namen für die Funktion kenne, kann ich sie für andere Anwendungen googeln . Vielen Dank!
Dotancohen
Danke Arkadiusz! Obwohl ich die xterm-Lösung nicht verwenden werde, haben Sie mich mit Sicherheit in die richtige Richtung gelenkt. Anscheinend zshhat diese Einrichtung.
Dotancohen
1

Bash als ähnliche Einrichtung namens Bash Completion. Sie können davon Gebrauch machen, indem Sie die TabTaste drücken, wenn Sie Befehle für Befehle angeben, wenn Sie diese eingeben.

Beispiel

Wenn ich anfange zu tippen lsund dann Tabzweimal zu drücken, wird Bash eine Liste der übereinstimmenden Dateien (und Befehlszeilenschalter) für jeden Befehl bereitstellen, den Sie verwenden möchten:

$ ls <---- hit Tab x 2
Display all 232 possibilities? (y or n)

Und hier ist das Beispiel mit Schaltern:

$ ls -- <---- hit Tab x 2
--all                 --format=                                  --quote-name
--almost-all          --group-directories-first
....
....

Konfiguration?

Meine Installation enthielt bereits eine Regel für git:

/etc/bash_completion.d/git

Die Installation dieser Datei wurde durchgeführt, als ich das gitPaket installiert habe . Ich bin auf Fedora 19, aber andere Distributionen sollten dies auch tun.

$ rpm -qf /etc/bash_completion.d/git
git-1.8.3.1-1.fc19.x86_64

In der Regeldatei wird erläutert, dass die automatische Vervollständigung in den folgenden Situationen erleichtert wird:

# The contained completion routines provide support for completing:
#
#    *) local and remote branch names
#    *) local and remote tag names
#    *) .git/remotes file names
#    *) git 'subcommands'
#    *) tree paths within 'ref:path/to/file' expressions
#    *) file paths within current working directory and index
#    *) common --long-options
#

Das sollte also "nur funktionieren" für Sie.

slm
quelle
2
Bash-Vervollständigung und Git-Vervollständigung funktionieren (wie ich im OP erwähne). Die Änderung, die ich durchführen möchte, besteht darin, dass sie auf der ersten Registerkarte abgeschlossen wird. Drücken Sie den letzten auf dem Bildschirm angezeigten zulässigen Wert. So funktioniert VIM Omnicompletion.
Dotancohen
@dotancohen - Ich sehe jetzt nicht, dass dies über das hinaus möglich wäre, was ich beschrieben habe.
slm
1

Mit extrakto können Sie so etwas machen :

  • Drücken Sie tmux prefix + tab, um extrakto zu starten
  • Fuzzy finden Sie den Text / Pfad / URL
  • Drücken Sie
    • tab um es in das aktuelle Fenster einzufügen,
    • enter um es in die Zwischenablage zu kopieren,
    • ctrl-o um den Pfad / die URL zu öffnen oder
    • ctrl-e zu bearbeiten mit $EDITOR
Laktak
quelle