Bash-Autovervollständigung mit Platzhalter

Bash-Autovervollständigung mit Platzhalter

Ich möchte im Terminal Folgendes eingeben, wie ich es in Emacs tue:

emacs 2019-*subject*

Wenn ich drücke, Taberhalte ich die erste Übereinstimmung:

2019-08-03-subject.markdown 

Ich möchte, dass mir Optionen angezeigt werden wie:

2019-08-03-subject.markdown 2019-bla-bla-subject-predicate.markdown etc...

Ich habe überall online gesucht und kann nicht glauben, dass dies keine Funktion ist.

Es gibtviele ähnlichgestellte Fragen.Die Antworten funktionieren nicht so, wie ich es möchte (siehe oben). Andere Lösungen, die ich ausprobiert habe:Hier.

PS: Ich verwende Ubuntu 16. Dies ist eine typische Funktion, die ich in Emacs finde, wenn ich Dateien öffne. Das wäre sehr praktisch.

Antwort1

Was danach passiert, Tabhängt von den Abschlussskripten ab.Diese Antwortlässt mich glauben, dass das gewünschte Verhalten für mindestens einen Benutzer im Jahr 2013 vorhanden war, aber im Jahr 2019 ist das Verhalten in meinem Debian 9 so, wie Sie es beschrieben haben; möglicherweise haben sich die Skripte/das Verhalten seitdem geändert.

Außerdem wählt Bash ein Skript entsprechend dem eingegebenen Befehl (erstes Wort in der aktuellen Zeile). Es ist nicht sofort ersichtlich, dass eine einzelne Änderung alle Vervollständigungen beeinflussen kann, um das gewünschte Ergebnis zu erzielen (ich denke, die _filedirFunktion ist ein guter Anfang).


Glücklicherweise können Sie mögliche Erweiterungen auf Anfrage erhalten. Von man 1 bash(unter der READLINEÜberschrift):

glob-complete-word( M-g)
Das Wort vor dem Punkt wird als Muster für die Pfadnamenerweiterung verwendet, wobei implizit ein Sternchen angehängt wird. Dieses Muster wird verwendet, um eine Liste passender Dateinamen für mögliche Vervollständigungen zu generieren.

glob-expand-word( C-x *)
Das Wort vor dem Punkt wird als Muster für die Pfadnamenerweiterung betrachtet und die Liste der passenden Dateinamen wird anstelle des Wortes eingefügt. Wenn ein numerisches Argument angegeben wird, wird vor der Pfadnamenerweiterung ein Sternchen angehängt.

glob-list-expansions( C-x g)
Die Liste der Erweiterungen, die generiert worden wären glob-expand-word, wird angezeigt und die Zeile wird neu gezeichnet. Wenn ein numerisches Argument angegeben wird, wird vor der Pfadnamenerweiterung ein Sternchen angehängt.

M-gund beschreiben C-x *die C-x gStandardtastenbelegungen. In einem benutzerfreundlicheren Format lauten diese:

  • Meta+ g( Alt+ g) für glob-complete-word,
  • Ctrl+ x, (loslassen Ctrl) *für glob-expand-word(Anmerkung: *ist tatsächlich Shift+ 8auf meiner Tastatur),
  • Ctrl+ x, (loslassen Ctrl) gfür glob-list-expansions.

Der folgende Code legt diese Bindungen fest (falls sie aus irgendeinem Grund fehlen):

  • nur für die aktuelle Shell:

    # commands to run in Bash
    bind '"\eg":   glob-complete-word'
    bind '"\C-x*": glob-expand-word'
    bind '"\C-xg": glob-list-expansions'
    
  • oder in Ihrer permanenten Konfiguration ( /etc/inputrcoder ~/.inputrc):

    # lines to add
    "\eg":   glob-complete-word
    "\C-x*": glob-expand-word
    "\C-xg": glob-list-expansions
    

    (beachten Sie, dass dies nur neue Shells betrifft, es sei denn, Sieneu laden).


Sie interessieren sich für glob-complete-wordoder glob-list-expansions. Hauptunterschiede:

  • glob-complete-wordhängt immer einen Asterisk an, während glob-list-expansionsdies bedingt geschieht (siehe das zitierte Handbuch).
  • Wenn es viele Übereinstimmungen gibt, müssen Sie möglicherweise glob-complete-wordzweimal auslösen (d. h. die Tastenkombination zweimal drücken), bevor etwas gedruckt wird. Dies hängt davon ab show-all-if-ambiguous. Vergleichen Sie diebereits erwähnte Antwort.
  • Wenn nur eine Übereinstimmung vorliegt, glob-complete-wordwird eine tatsächliche Zeilenvervollständigung durchgeführt, während glob-list-expansionsweiterhin nur die Übereinstimmung angezeigt wird.

Geben Sie in Ihrem speziellen Fall Folgendes ein:

emacs 2019-*subject*

dann Ctrl+ x, g.

verwandte Informationen