Fish-shell: Abkürzungen

Erstellt am 11. Mai 2013  ·  92Kommentare  ·  Quelle: fish-shell/fish-shell

Führen Sie Abkürzungen als Alternative zu Aliasen ein und ersetzen Sie diese möglicherweise.

Abkürzungen sind genau wie Aliase, außer dass sie live in ihre vollständige Form erweitert werden, wenn Sie sie in der Befehlszeile eingeben. Angenommen, Sie haben gc als Abkürzung für git commit ; Wenn Sie jetzt gc -am "did stuff" eingeben, ändert sich die Befehlszeile, wenn Sie das Leerzeichen nach "gc" eingeben, und endet schließlich als git commit -am "did stuff" . Dies sollte nur in Befehlsposition passieren und wenn Sie ein Leerzeichen eingeben oder die Eingabetaste drücken.

_Originaltext folgt:_

Aliasing durch selbsterweiternde Kurzformen ersetzen

Ich weiß nicht, wie ich diese nennen soll, aber trotzdem. Die Idee ist, dass, wenn Sie "g" als Befehl eingeben, es zu "git" erweitert wird, wenn Sie ein Leerzeichen eingeben oder eingeben.

Argumente für:

  • Es löst viele der Probleme mit Vervollständigungen. Da der Alias ​​"live" erweitert wird, funktionieren die Git-Vervollständigungen wie gewohnt und commandline muss nicht lügen oder andere solche Hacks ausführen.
  • Es ist einfach zu implementieren. Ich kann es mit bind und commandline obwohl ich nicht versucht habe, eine vollständige Implementierung zu schreiben. Wir brauchen keine Änderungen an function oder complete usw., wie bei anderen Lösungsvorschlägen.
  • Es ist wohl "fischig": Der Benutzer kann das erweiterte Formular sehen, es ist nicht in einem Alias ​​versteckt; es ist sofort und live, ähnlich wie bei Vervollständigungen, sofortiges Neuzeichnen mit prevd-or-backward-word usw.
  • Wenn Sie eine Befehlszeile kopieren und einfügen, um Anweisungen an andere zu erhalten, ist sie nicht voll von Ihren benutzerdefinierten Aliasen, von denen sie keine Kenntnis haben.
  • Sie können das erweiterte Formular bearbeiten, wenn es nur fast richtig ist.

Argumente gegen:

  • Löst das Problem nicht mit alias git=hub , ein Problem, das derzeit nicht existiert, aber mit einigen Alias-Vervollständigungsvorschlägen wie diesem eingeführt wird. Sie können jedoch stattdessen einfach eine normale Funktion function git; hub $argv; end schreiben, um dieses vorgeschlagene Alias-System zu umgehen.
  • Einige mögen es überraschend finden, dass sich die Befehlszeile während der Eingabe ändert, ohne etwas wie die Tabulatortaste oder ähnliches zu drücken.
  • Der Grund, warum Sie das erweiterte Formular bearbeiten können, ist auch der Grund, warum Sie Ihre Eingaben nicht mit nur zwei Rückschritten löschen können. Selbst STRG-W reicht möglicherweise nicht aus, da Sie beispielsweise gc auf git commit . STRG-U reicht aus, wenn dies der einzige Befehl ist, aber es wird zu viel gelöscht, wenn Sie beispielsweise den Alias ​​für eine Pipe verwenden. Vielleicht könnten wir eine neue Bindung für "Kill aktuellen Befehl, aber nicht ganzen Puffer" einführen.
  • :Frage:

Stand der Technik:

  • :abbreviate in Vim
  • Ich denke, vielleicht Suchmaschinen in Chrome?

Diskutieren.

enhancement

Hilfreichster Kommentar

Wäre schön, wenn Fische Abkürzungen in einer Datei behalten würden...

Von der Manpage: "Abkürzungen werden mit universellen Variablen gespeichert." Das heißt, Sie finden sie in der Datei _~/.config/fish/fishd.macaddr_ unter dem Variablennamen fish_user_abbreviations . Der Befehl abbr manipuliert einfach diese universelle Variable.

Alle 92 Kommentare

Eine andere Idee ist, diese "Abkürzungen" wie in Vim zu benennen und dann zu entscheiden, was mit Aliasen in einer anderen Ausgabe zu tun ist [ich neige dazu, dass sie entfernt werden sollten].

Dachte noch ein Argument dagegen:

  • Diese "Aliasnamen" können nicht in Skripten verwendet werden. Ich bin mir nicht sicher, ob es sowieso eine gute Idee ist, Aliase in Skripten zu verwenden, aber wir könnten eine Funktion zum Erweitern von "Abkürzungen" haben und / oder wir könnten die Abkürzungen von Fischen in Editoren einhängen, damit sie auch dort bei der Eingabe erweitert werden.

Dein Vorschlag gefällt mir, klingt cool und faul :+1:

Das gefällt mir auch.
Es ist eine sehr saubere Lösung für das Problem "Vervollständigungen für Aliase" #393, das ziemlich nervig ist.
Dies in Kombination mit einem ll (Alias) Ausdruck bei einem ll<tab> wäre perfekt.

Da alias heute nur ein Skript-Wrapper um function ist, möchte ich, dass dies ebenfalls geändert wird, sodass es einen deutlichen Unterschied zwischen Funktionen und Aliasen gibt, da sie sich danach in so vieler Hinsicht unterscheiden, z :

  • Syntax
  • Ausdrucksfähigkeit
  • Verwendungszweck

@gustafj Ich denke, es ist wahrscheinlich besser, diese Idee "Abkürzungen" zu nennen und alias durch etwas zu ersetzen, das eine hilfreiche Fehlermeldung anzeigt, die auf function und abbreviate . Die Gedanken?

Noch ein Hinweis:

Ich wollte, dass dies nur den Befehl in einer Befehlszeile betrifft, da es wirklich ärgerlich wäre, wenn g git in der Argumentposition auf sudo (was bedeuten würde, dass Sie sudo mit Abkürzungen verwenden könnten - etwas, das Sie mit Aliasen nicht tun können!) und bestimmten Fällen eindeutiger Vervollständigungen wie B. für gits eigene Aliase oder wenn Sie einen Teil einer langen Option eingeben. Dies richtig zu machen, könnte jedoch schwierig sein und würde nur im Weg stehen, wenn die Fertigstellungen veraltet sind und wenn Sie tatsächlich sudo g nicht sudo git wollten, müssen Sie jetzt etwas wie sudo (echo git) tun sudo "g" sagen. Ich bin mir nicht sicher, ob das zu magisch und überraschend wäre oder tatsächlich genau das ist, was man erwarten und intuitiv erahnen würde. Die Gedanken? :-)

Abkürzungen klingen für mich gut (aber ich bin ein regelmäßiger Vim-Benutzer, daher könnte ich voreingenommen sein ...).
Wenn ich darüber nachdenke, gibt es ziemlich viele "interessante" Dinge, die man damit machen kann, aber (wie Sie bereits betonen) sind auch in diesem Minenfeld Fallen versteckt :/

Ich denke, es könnte problematisch / ärgerlich sein, wenn es vollständig automatisch und an einer beliebigen Stelle in der Befehlszeile erfolgt, vor allem, da das Rückgängigmachen der Abkürzung mühsam sein könnte, wenn sie auf etwas erweitert wird, das Sie nicht möchten, und insbesondere, wenn sie zu einer langen Zeichenfolge erweitert wird.

Ein paar eigene Gedanken:
Soll es automatisch mit space oder durch eine Option über tab ausgelöst werden, oder etwas anderes?
Sollte es nur für einfache Strings sein, ex g für git ?
Sollte es nur für das erste Element auf der Befehlszeile gelten oder irgendwo?
Sollte es möglich sein, String -> Wertkonvertierungen von d für das aktuelle Datum Tue May 14 20:23:03 CEST 2013 durchzuführen?
Sollte es möglich sein, Subshells ex vim (find . -iname '*cfg')<tab> zu erweitern?

foo.cfg bar/poo.cfg foo/bar/more/beer.cfg
> vim

Gedanken zu deinen Gedanken!

Soll es automatisch durch Leerzeichen oder durch eine Option per Tab oder etwas anderes ausgelöst werden?

Ich glaube nicht, dass dies mit etwas _außer_ Leerzeichen (und Eingabe) funktioniert, weil der springende Punkt darin besteht, die nahtlose Erfahrung zu erzielen, die Sie mit Aliasen erhalten, bei denen Sie nicht darüber nachdenken müssen, ob etwas ein Alias ​​ist oder nicht, und Tab nicht funktionieren entweder, weil g<Tab> Befehle vervollständigen sollte, die mit einem g . Wenn wir eine neue Bindung hinzufügen, sagen wir STRG-X, haben wir jetzt drei Arten von Vervollständigungen: normale, Autosuggestionen und Abkürzungen. Ich denke wirklich, dass dies mit Platz oder überhaupt nicht gemacht werden muss.

Sollte es nur für einfache Strings ex g für git sein?

In Befehlsposition sollte es möglich sein, Argumente in eine Abkürzung aufzunehmen. Zum Beispiel gc , das auf git commit --all oder was auch immer. Grundsätzlich halte ich Abkürzungen für genau wie Aliase, außer dass sie live auf der Befehlszeile erweitert werden.

Sollte es nur für das erste Element auf der Befehlszeile gelten oder irgendwo?

Nur in Kommandoposition ist wahrscheinlich ein guter Anfang. Dann können wir _vielleicht_ mit den Anwendungsfällen der Argumentposition experimentieren, die ich zuvor vorgeschlagen habe.

Sollte es möglich sein, String -> Wertkonvertierungen ex d für das aktuelle Datum Di 14. Mai 20:23:03 CEST 2013 durchzuführen?

Du meinst in Streitposition? echo d Erweitern, um das Datum wiederzugeben? Ich denke wirklich, wenn wir überhaupt Abkürzungen für Argumentpositionen verwenden, müssen sie sehr konservativ und _nur_ verwendet werden, wenn das Argument entweder ein Befehl ist (wie im Fall von sudo ) oder wenn der Befehl ein eigenes Alias-System hat (wie im Fall von git ) und Erweitern hätte genau den gleichen Effekt wie Nicht-Erweitern (also erweitern wir nur aus Gründen der Benutzerfreundlichkeit).

Sollte es möglich sein, Subshells ex vim (find . -iname '*cfg')<tab> zu erweitern?

Ich denke, das ist eine Frage für Vervollständigungen und nicht für Abkürzungen, da ich Abkürzungen nicht so halte, dass Tabulatoren und das Erweitern von Unterschalen im Weltraum wahrscheinlich eine schlechte Idee sind. Ich bin mir jedoch nicht sicher, ob es auch für Vervollständigungen funktionieren kann, da Sie Variablennamen bereits vervollständigen können, ohne sie zu erweitern.

Es könnte aber nützlich sein. Wie ich mir vorstelle, rm *.png tun, den Platzhalter zu erweitern und einige der Dateien aus der Liste zu entfernen.

Wie wäre es damit: Wir haben ein generisches "Erweiterungs-" oder "Abkürzung"-System ähnlich dem Vervollständigungssystem; wir binden STRG-X oder etwas zum Erweitern von Token; und in Kommandoposition erweitern wir auch Abkürzungen automatisch. Das könnte auch dazu führen, dass die Anwendungsfälle sudo und git weniger aufdringlich wirken, indem diese Erweiterungen explizit gemacht werden.

Es ist jedoch ein viel größerer Vorschlag als meine ursprüngliche Idee. :zwinkern:

Space als Trigger klingt für mich gut, bietet wahrscheinlich die beste Benutzererfahrung.
Das Erweitern von *.png klingt interessant ;)
Ich selbst mag nicht viele verschiedene Bindungen für verschiedene Dinge, vielleicht könnte "double tab" anstelle einer neuen Bindung verwendet werden.
Ex ....*.png<tab> ergibt press <tab> again to expand *.png (das gleiche gilt für Unterschalen).

Aber es könnte besser sein, diesen Vorschlag zu beschränken auf: Abkürzungen für die Befehlsposition, Erweiterung mit Leerzeichen.
Und haben "subshells/wildcards erweitern" & Sudo-Unterstützung als separates?

Ich bin mir nicht sicher, ob die doppelte Registerkarte funktionieren würde, da dies derzeit zwischen den Fertigstellungen wechselt. Vim scheint STRG+] zu haben, um Abkürzungen zu erweitern, ohne ein Leerzeichen einzugeben ...

Ich denke, wenn wir überhaupt Live-Erweiterungen machen, dann sollten Abkürzungen irgendwie damit implementiert werden, damit die Ideen verwandt sind. Aber wenn wir keine Live-Erweiterungen machen, sollten Abkürzungen trotzdem für sich betrachtet werden. Also nicht sicher, was Sie hier tun sollen. :-)

Ja, du hast Recht mit <tab> , dachte nur an Subshells (wo es derzeit nichts tut).
Es könnte möglich sein, das aktuelle Verhalten von <anything><space><tab> zu ändern, das derzeit alle verfügbaren Dateien im aktuellen Verzeichnis durchläuft (zuerst alle drucken).
Ex

> ls <tab>
a.cfg  b.cfg  c.cfg  d.cfg
> ls <tab>
> ls a.cfg<tab>
> ls b.cfg<tab>

Aber ich hätte lieber "Live-Erweiterungen" mit einer neuen Tastenkombination, als ohne sie zu leben ;)
Das Erweitern von *.cfg auf a.cfg b.cfg c.cfg d.cfg fühlt sich wirklich nützlich an.
Aber dann sollten alle Formen möglicher Erweiterungen erweiterbar sein, nicht nur Wildcards, Ex-Brace-Vervollständigung (die ich lieber entfernt sehen würde ... aber das ist ein anderes Thema # 354)

Aber dann sollten alle Formen möglicher Erweiterungen erweiterbar sein, nicht nur Wildcards, Ex-Brace-Vervollständigung (die ich lieber entfernt sehen würde ... aber das ist ein anderes Thema # 354)

Einverstanden auf beiden Konten. Ich frage mich, ob doppelte Anführungszeichen auch erweiterbar sein sollten... echo "hello $USER" -> echo "hello dag" .

Ich denke, wovon wir hier sprechen, ist eigentlich mehr "Evaluation" als "Expansion", während es bei Abkürzungen nicht um Evaluation geht, also sind diese Ideen wahrscheinlich getrennt und ich werde eine neue Ausgabe für die andere machen und bearbeiten dieser ein bisschen.

Hier ist ein grundlegender funktionierender Prototyp:

function __fish_expand_abbreviation
    if test (count (commandline -poc)) -eq 0
        switch (commandline -t)
            case g
                commandline -t git
            case gc
                commandline -t 'git commit'
        end
    end
end

bind \  '__fish_expand_abbreviation; commandline -i " "'
bind \n '__fish_expand_abbreviation; commandline -f execute'

Ein Problem, das mir aufgefallen ist, ist, dass, wenn Sie die Eingabetaste drücken, um eine abgekürzte Befehlszeile auszuführen, das erweiterte Formular als Fehler (unbekannter Befehl) hervorgehoben wird, sogar einschließlich der Argumente.

Das hat mir so gut gefallen, dass ich eine Möglichkeit implementiert habe, diese Abkürzungen zu verwalten.

Letztendlich denke ich, dass diese genauso behandelt werden sollten wie Vervollständigungen und Funktionen. Mit einem eigenen Abkürzungsordner, in dem es gespeichert werden kann.

Dies ist die aktuelle Implementierung:

function __fish_expand_abbreviation
  if test (count (commandline -poc)) -eq 0
    set -l token (commandline -t)

    if abbreviations -q $token
      commandline -t (abbreviations $token)
    end
  end
end
function abbreviations --description 'List, show and query abbreviations'
  if test (count $argv) = 0
    printf '%s\n' $fish_abbreviations
    return
  end

  set -l abbreviation_index 0
  set -l expanded_abbreviation

  for i in $fish_abbreviations
    set abbreviation_index (math $abbreviation_index + 1)
    echo $i | read -l abbreviation command

    if test $abbreviation = $argv[-1]
      set expanded_abbreviation $command
      break
    end
  end

  if test -n "$expanded_abbreviation"
    switch $argv[1]
      case -q --query
        return 0
      case -e --erase
        set -e fish_abbreviations[$abbreviation_index]
      case '*'
        echo $expanded_abbreviation
      end
  else
    return 1
  end
end
function abbreviate --description 'Define a new abbreviation'
  if test (count $argv) -lt 2
    echo 'abbreviate: Takes two arguments. First abbreviation and then expanded command'
    return 1
  end

  echo $argv | read -l abbreviation command

  eval "function $abbreviation; $command \$argv; end"
  abbreviations -e $abbreviation

  set -U fish_abbreviations $fish_abbreviations "$argv"
  return 0
end

Dann machst du sowas:

abbreviate !    'sudo'
abbreviate tf   'tail -f'
abbreviate l    'ls -la'
abbreviate l.   'ls -d .*'
abbreviate g    'git'
abbreviate gs   'git status'

Update 1: Möglichkeit hinzugefügt, Abkürzungen zu entfernen und in einer universellen Variablen zu speichern.
Update 2: Erstellen Sie auch Funktionen für Abkürzungen

Wenn wir uns ansehen, wie Funktionen funktionieren, könnten wir Folgendes vorstellen:

  • abbred
  • abbrsave

Was im Grunde wäre, diese Funktionen zu klonen.

Schön! Ich bin jedoch nicht _ganz_ überzeugt, dass wir ein ~/.config/fish/abbreviations Verzeichnis und das dazugehörige abbr{ed,save} brauchen. Im Gegensatz zu Funktionen und Vervollständigungen werden sie einzeln nicht wirklich langsam geladen und benötigen nur eine einzige Zeile, um definiert zu werden. Ich denke, sie sind eher wie bind , vielleicht könnten wir eine fish_[user_]abbreviations Funktion wie die fish_user_key_bindings Funktion haben, die lädt, wenn Fish zum ersten Mal versucht, eine Abkürzung zu erweitern? ( [user_] aus Gründen der Konsistenz, aber ich bin mir nicht sicher, ob wir Standardabkürzungen versenden sollten?)

Der einzige Grund, den ich mir für mehrere Dateien für Abkürzungen vorstellen kann, ist, wenn Sie für jeden existierenden Git-Befehl und einige mit Argumenten eine Abkürzung sagen, also möchten Sie diese von allen anderen trennen. Aber so funktionieren Lazy-Loading-Funktionen und Vervollständigungen nicht: Sie werden basierend auf dem Befehlsnamen geladen. Wenn wir dies für Abkürzungen tun würden, würden wir am Ende eine Datei für jede Abkürzung erhalten, wobei jede Datei nur eine einzige Codezeile enthält !

Eine andere Idee ist, so etwas wie die universellen Variablen zu tun, vielleicht sogar durch die Verwendung von universellen Variablen (wie set -U fish_abbreviations ). Vielleicht gibt es einen Anwendungsfall für host-lokale Abkürzungen? Nicht sicher.

Sie haben einige gute Punkte und ich tendiere zum fish_user_abbreviations Weg.

Der andere Ansatz besteht darin, ähnliche Vervollständigungen zu verwenden, bei denen Sie alle zugehörigen Abkürzungen in einer Datei ablegen, aber das ist möglicherweise schwieriger zuzuordnen.

Ich hatte ursprünglich vor, set -U fish_abbreviations zu verwenden, aber ich möchte die Konfiguration von git pflegen lassen, also ziehe es vor, sie irgendwo einzustellen, wie eine Konfiguration. Aber das Schöne an einer universellen Variablen wäre, dass Sie Vervollständigungen im Handumdrehen hinzufügen können, wie ( abbred , abbrsave ). Mach einfach ein abbreviate .

Eine Lösung wäre, den Befehl sicherstellen zu lassen, dass Abkürzungen eindeutig hinzugefügt werden und vorhandene überschrieben werden. Dann wird es mit fish_user_abbreviations gebootet und Benutzer können der universellen Variablen benutzerdefinierte Variablen hinzufügen, wenn sie möchten.

Das habe ich gerade:
set -q fish_abbreviations ; or fish_user_abbreviations

Aber das wird nicht funktionieren, wenn ich die Datei weiter pflege.

Ich habe meine vorherigen Funktionen aktualisiert, um universelle Variablen zu verwenden, und die Möglichkeit hinzugefügt, sie zu löschen und vor dem Hinzufügen neuer Funktionen zu überprüfen, ob sie vorhanden sind.

Ich habe darüber nachgedacht, es interaktiver zu gestalten, zum Beispiel zu fragen, ob es die aktuelle Abkürzung ersetzen soll. Da es aber auch gescriptet sein könnte, wollte ich das nicht. Ich werde in die Bestimmung des interaktiven Modus schauen.

Bei Vervollständigungen ist zu sehen, dass auch sie für einen einzigen Befehl geladen werden. Wenn der aktuelle Befehlszeilenprozess git ist, wird completions/git.fish geladen. Wenn Sie separate Befehlsnamen haben, müssen Sie separate Dateien erstellen, siehe zum Beispiel die Vervollständigungen für [ef]grep die sich tatsächlich in einer Funktion befinden, die von jeder dieser drei Vervollständigungsdateien aufgerufen wird.

Bei Abkürzungen sehe ich keine Möglichkeit, anhand der Abkürzung zu erkennen, welche Datei geladen werden soll, es sei denn, der Dateiname _ist_ die Abkürzung. Und dann können Sie nicht mehrere Abkürzungen in einer Datei haben. Ich denke, wir könnten alle Abkürzungsdateien beim Start oder beim ersten Versuch, Abkürzungen zu erweitern, laden, aber das unterscheidet sich vom Laden von Funktionen und Vervollständigungen und könnte möglicherweise langsam sein, wenn Sie viele Abkürzungsdateien haben.

Neue Idee: abbreviate -U um eine universelle Abkürzung zu erstellen und abbreviate -g oder einfach nur abbreviate um eine globale Abkürzung zu erstellen? Wenn wir das tun, sollten wir es vielleicht auch für bind tun...

Außerdem denke ich, dass abbreviate einfach jede vorhandene Abkürzung überschreiben sollte, genau wie bind und function und set ...

Alle sind gültige Punkte. Ich denke, es macht Sinn, einfach wie alle anderen Funktionen zu überschreiben.

Ich mag auch den Vorschlag mit universell und global, der Ihnen Flexibilität bietet, wie Sie mit Ihren Abkürzungen / Bindungen umgehen möchten. Ich bin mir jedoch nicht ganz sicher, wie ich das implementieren soll, und ich denke, dies sollte vielleicht eine eingebaute Option sein, um die Leistung zu verbessern?

Ja, ich habe es nur in Fish Scripting als Prototyp erstellt, um es auszuprobieren. Wahrscheinlich möchten Sie nicht, dass langsames Skripting jedes Mal ausgelöst wird, wenn Sie ein Leerzeichen eingeben. :zwinkern:

Ja, funktioniert immer noch super. Ich benutze es jetzt seit ca. 1 Tag und kann mir ein Leben ohne es nicht mehr vorstellen, haha ​​:grin:

:erröten:

Ein weiteres Problem, das mir aufgefallen ist, ist, dass, wenn Sie C-a auf einer nicht leeren Befehlszeile ausführen und eine Abkürzung eingeben, diese nicht auf Platz erweitert wird, da Sie sich mitten in einem Wort befinden. Sagen Sie also, Sie tun make install oops brauchen root C-a ! jetzt haben Sie ![cursor]make install und das Eingeben des Leerzeichens erweitert nicht die Abkürzung ! . Ich werde versuchen, das mit commandline -C .

Ein drittes Problem, das möglicherweise ein Feature ist, ist, dass es nur erweitert wird, wenn Sie ein Leerzeichen eingeben oder nach einer Abkürzung eingeben. Also nicht zum Beispiel, wenn Sie ein Leerzeichen eingeben, dann C-a ! C-e . Dies könnte ein Feature sein, weil es es ermöglicht, Abkürzungserweiterungen zu vermeiden, aber ich denke, es ist ein bisschen unanständig und wir sollten stattdessen einen Befehl haben, um eine Befehlszeile buchstäblich auszuführen, ein bisschen wie der command Befehl, aber auch Buchhaltung für Shell-Funktionen und Builtins. Oder eine spezielle Syntax wie \g in der Befehlsposition wird als g interpretiert und nicht erweitert. Die spezielle Syntax ist auch nicht wirklich faul, aber wir haben bereits Platz vor dem Befehl special case, um "keine Anmeldung im Verlauf" zu bedeuten, also zucken Sie mit den Schultern.

Viertens, und dies ist ein obskures, wenn Sie wie im vorherigen Absatz eine nicht erweiterte Abkürzung gefolgt von einem Leerzeichen haben, dann tun Sie C-a und ein Leerzeichen, die Abkürzung wird erweitert und ein zusätzliches Leerzeichen wird eingefügt Danach! Auch hier müssen Sie möglicherweise die Cursorposition mit commandline -C überprüfen.

Oh, und das erste Problem, das ich in einem früheren Kommentar erwähnt habe, tritt nur auf, wenn die nicht erweiterte Abkürzung ein unbekannter Befehl ist. Also wird eine gc Abkürzung zu git commit und das Ganze wird als Fehler hervorgehoben, wenn man die Eingabetaste (ohne Leerzeichen) drückt, aber eine gs Abkürzung erweitert sich zu git status und Highlights richtig, denn anscheinend habe ich Ghostscript installiert:

> which gs
/usr/bin/gs

Ich frage mich auch, ob Abkürzungen vielleicht als bekannte "Befehle" hervorgehoben werden sollten, noch bevor Sie die Leertaste drücken ... Wenn ich derzeit g tippe, ist es rot, bis ich ein Leerzeichen tippe, aber wenn ich git es hebt wie bekannt noch vor einem Leerzeichen hervor.

All diese Probleme könnten wahrscheinlich besser gelöst werden, wenn wir dies in den C++-Teilen tun.

Alberner Workaround für Syntax-Highlighting-Probleme: Erstellen Sie einen Alias/eine Funktion für jede Abkürzung. :Lachen:

Eigentlich ist das sowieso eine gute Idee, hm... Das heißt Abkürzungen funktionieren in Skripten, in eval , mit type ... Nicht sicher.

Ihre Problemumgehung ist das, was ich derzeit verwende, aber ich bin mir nicht sicher, ob dies am Ende der Fall ist oder ob sie in eval oder type . Für mich sollten sie nur eine Eingabesache sein. Aber ich denke, es kann nicht schaden, sie auch laufen zu lassen, um einfache Unterstützung für say sudo zu erhalten.

Ich nutze also schon seit einiger Zeit die aktuelle Implementierung und das sind die bisher bei dieser Lösung entdeckten Probleme (sie haben nichts mit dem Ansatz zu tun :+1:):

  1. Beim Einfügen von Text wird das letzte Leerzeichen am Anfang der Zeile eingefügt, zB wird echo this is a test beim Einfügen zu _echo this is atest , wobei _ ein Leerzeichen ist.
  2. Bei Verwendung von read gelten die Bindings auf enter und space auch dort. Wenn ich zum Beispiel einen Nicht-Befehl zum Lesen eingeben möchte, wird er erweitert. Ich denke, in der endgültigen Implementierung sollte dies standardmäßig deaktiviert und von read -s enabled aktiviert sein
  3. Es ist ein bisschen langsam (~0,25-0,5 Sekunden)

Sie können 1. umgehen, indem Sie mit C-y .

Für mich fügt C-y nur in Fisch ein (von dem, was in Fisch geschnitten wurde) und nicht aus meiner Systemzwischenablage. Kopieren zwischen Terminals oder anderen Apps.

Abkürzungen finde ich eine coole Idee.

Ich möchte es den Leuten ermöglichen, mit Abkürzungen zu experimentieren, um zu verfeinern, was das richtige Verhalten sein sollte. Ich habe die anfängliche Unterstützung für Abkürzungen in Master als 92099c7af23d0cebf52f89de4f9d829825e53ac8 und f9c2a77c67754324f3036ec79501c6131d19562b überprüft.

Ein Beispiel für die Verwendung:

set -U fish_user_abbreviations 'gc=git checkout'
gc

gc wird bei Leerzeichen oder Rückkehr zu "git checkout" erweitert.

Abkürzungen sind eine Liste, also um eine neue hinzuzufügen:

set fish_user_abbreviations $fish_user_abbreviations 'grh=git reset --hard'

Abkürzungen werden in "Befehlspositionen" erweitert (z. B. in Subshells oder als Argumente zu if), aber nicht als Argumente. Abkürzungen werden auch in Skripten nicht erweitert.

Hier sind einige ungelöste Fragen zur Diskussion:

  1. "Abkürzung" ist lang und schwer zu buchstabieren - können wir einen besseren Namen finden? "Alias" wäre gut, wenn es nicht schon für andere Dinge verwendet würde. Eine Möglichkeit besteht darin, es invertieren, zB "Expansion". fish_user_expansions klingt für mich ok.
  2. Wie sollten Abkürzungen angegeben werden? Die Syntax gc=git checkout ist leichtgewichtig, wird aber nirgendwo sonst in fish verwendet.
  3. Wir möchten vielleicht nicht bei Eingabe erweitern, sondern nur Leerzeichen. Das Erweitern von enter hat den Nachteil, dass der Benutzer nicht sieht, welchen Befehl er ausgeführt hat, bis er sich dazu verpflichtet hat, ihn auszuführen. Wenn wir nur auf Leerzeichen erweitern, könnten Benutzer die Abkürzung eingeben, gefolgt von Leerzeichen, gefolgt von Eingabe, was nicht allzu mühsam erscheint. Eine zweite Möglichkeit besteht darin, dass die erste Eingabe die Erweiterung auslöst und die zweite Eingabe sie tatsächlich ausführt.

Auf der anderen Seite, wenn alle Abkürzungen vom Benutzer angegeben werden, ist die Wahrscheinlichkeit, dass der Benutzer versehentlich etwas ausführt, gering, so dass die Erweiterung bei der Eingabe in Ordnung sein kann.

  1. Die erweiterte Form einer Abkürzung ist nur eine textuelle Ersetzung und muss selbst kein gültiger Befehl sein. Sie können beispielsweise eine Abkürzung verwenden, die zu nicht übereinstimmenden Anführungszeichen oder Klammern führt. Ich denke, dies ist eine potenziell nützliche Funktion, aber es bedeutet, dass fish keine Syntaxprüfung für Code mit Abkürzungen durchführen kann, was bedeutet, dass wir sie möglicherweise nie in Skripten verwenden können.
  2. Sollte die Abkürzungsexpansion selbst vor der Substitution einer Subshell- und Variablenexpansion unterzogen werden? Ich denke ja, denn das würde sie immens flexibel machen. Abkürzungen könnten dann beliebigen Fischcode ausführen.
  3. Wenn ich die Leertaste drücke und die Abkürzung erweitert wird und ich meine Meinung geändert habe, sollte ich vielleicht in der Lage sein, die Löschtaste zu drücken und die Erweiterung aufzuheben.

Nachdem wir eine Weile davon gelebt haben, wissen wir hoffentlich, was sich richtig anfühlt.

Danke, ich fahre es jetzt und es scheint bis jetzt wirklich gut zu funktionieren.

  1. Wir könnten kurz die Abkürzung abbr . Was alias , wenn wir das für besser halten, könnte es vielleicht durch dieses Verhalten ersetzt werden. Wenn Leute Aliase in ihren Skripten verwenden möchten, können sie einfach die Funktion Wrapping durchführen. Abkürzungen scheinen mir genau das zu sein, wofür die Leute normalerweise Aliasse verwenden.
  2. Ich denke, es wäre schön, einige Hilfsfunktionen zu haben, um Abkürzungen zu definieren und auch zu entfernen.
    Beispiel: abbr gc 'git checkout' und abbr -e gc .
    Es ist meiner Meinung nach etwas umständlich, diese Manipulation über die Variable vorzunehmen. Außerdem wäre es schön, sicherzustellen, dass die Abkürzungen eindeutig sind. Sie müssen also nur eine neue definieren, um sie zu aktualisieren.
  3. Ich bevorzuge das Verhalten, das jetzt ist, viele meiner Abkürzungen wie gs für git status wären nicht so nützlich, wenn Sie die Leertaste drücken müssten. Ich wäre jedoch mit einer doppelten Eingabe einverstanden, um sie tatsächlich auszuführen, wie Sie es erwähnt haben.
  4. Persönlich bin ich damit einverstanden, sie nicht in Skripten zu verwenden.
  5. Ja, das wäre cool. Mir fällt jedoch keine Abkürzung ein, um das auf meinem Kopf zu verwenden.
  6. Das ist auch eine gute Idee, wenn ich zum Beispiel für eine Abkürzung zu früh Leerzeichen gedrückt habe. Dies würde auch gut mit dem Vorschlag der Nummer 3 als Doppeleingabe zusammenpassen (ich bin mir aber immer noch nicht sicher, ob ich diese zusätzliche Eingabe möchte).

alias ist sowieso POSIX-Kompatibilitätswrapper. Ich habe kein Problem damit, Abkürzungen zu machen. Wenn Sie abbr gc 'git checkout' oder ähnliches schreiben, möchten Sie sowieso Vervollständigungen für git checkout .

Ich habe die letzten Wochen die Skriptimplementierung von Terlar verwendet und bin heute auf die neue native Version umgestiegen, hier also meine zwei Cent zu den offenen Punkten

  1. Ich denke, es wäre eine großartige Idee, jetzt nur alias Abkürzungen machen zu lassen. Als Bonus würde es die nicht funktionierenden Vervollständigungen bei aktuellen Aliasen beheben.
  2. was terlar gesagt hat hört sich gut an
  3. Es würde mich wirklich ärgern, wenn ich bei Abkürzungen die Eingabetaste doppelt drücken müsste, um sie auszuführen. Es wäre irgendwie in Ordnung, wenn sie mit einem einzigen Drücken der Eingabetaste auch nicht erweitert wie Aliase funktionieren, aber dann habe ich nicht erweiterte Abkürzungen in meiner Historie
  4. --
  5. würde die Variablenerweiterung nicht bedeuten, dass der Inhalt der Variablen in den Befehl und damit in Ihre Historie übernommen wird? Dies würde die Wiederverwendbarkeit solcher Befehle aus der Historie erheblich verringern, da sie nicht mehr die Variable, sondern nur ihren früheren Inhalt enthalten. Oder habe ich diesen Punkt falsch verstanden?
  6. Ich sehe mich nicht, wie ich die Funktion zum Erweitern verwende, da ich abbreviation länger als 3 Zeichen verwende, was bedeutet, dass sie sich im Grunde genommen alle im Muskelgedächtnis befinden und es schneller wäre, nur die aktuelle Zeile zu löschen. Dies mag jetzt anders sein, da die native Implementierung überall und nicht nur am Anfang der Zeile verwendet werden kann. Aber wahrscheinlich eine gute Idee, wenn das nicht bedeutet, dass ich immer die Leertaste drücken oder zweimal die Eingabetaste drücken muss, um sie zu erweitern.

"Abkürzung" ist lang und schwer zu buchstabieren - können wir einen besseren Namen finden? "Alias" wäre gut, wenn es nicht schon für andere Dinge verwendet würde. Eine Möglichkeit besteht darin, es invertieren, zB "Expansion". fish_user_expansions klingt für mich in Ordnung.

Vereinbart, aber nicht auf "Ausbau" verkauft.

Wie sollten Abkürzungen angegeben werden? Die gc=git checkout-Syntax ist leichtgewichtig, wird aber nirgendwo sonst in fish verwendet.

Es sollte einfach ein neues Builtin sein, genau wie complete und bind oder auch function , das der Benutzer aufrufen kann, dessen zugrundeliegender Speicher jedoch undurchsichtig ist.

Wir möchten vielleicht nicht bei Eingabe erweitern, sondern nur Leerzeichen. Das Erweitern von enter hat den Nachteil, dass der Benutzer nicht sieht, welchen Befehl er ausgeführt hat, bis er sich dazu verpflichtet hat, ihn auszuführen. Wenn wir nur auf Leerzeichen erweitern, könnten Benutzer die Abkürzung eingeben, gefolgt von Leerzeichen, gefolgt von Eingabe, was nicht allzu mühsam erscheint. Eine zweite Möglichkeit besteht darin, dass die erste Eingabe die Erweiterung auslöst und die zweite Eingabe sie tatsächlich ausführt.

Ich glaube wirklich, dass wir Enter erweitern wollen. Ich stelle mir vor, dass ich viele frustrierende fish: Unknown command “gc” und ich kann mir nicht vorstellen, dass ich damit allein wäre. Die Erweiterung sollte jedoch in der Befehlszeile erfolgen, bevor sie ausgeführt wird, sodass Sie die Erweiterung im Scrollback sehen und die erweiterte Form im Verlauf landet.

Sollte die Abkürzungsexpansion selbst vor der Substitution einer Subshell- und Variablenexpansion unterzogen werden? Ich denke ja, denn das würde sie immens flexibel machen. Abkürzungen könnten dann beliebigen Fischcode ausführen.

Ich denke, es sollte nicht. Es wäre normalerweise vorzuziehen, diese zum Zeitpunkt der Ausführung der Befehlszeile zu erweitern. Angenommen, ich habe eine Abkürzung für das Erstellen von Notizen mit Zeitstempel. Ich tippe die Abkürzung und ein Leerzeichen ein, und es wird zu etwa vim 12:34:56.txt . Jetzt führe ich diesen Befehl einige Sekunden lang nicht aus, und der Zeitstempel wird falsch sein. Es wäre besser, wenn die Abkürzung auf vim (time +%T).txt . Das ist richtig und bedeutet auch, dass ich die Befehlszeile vor der Ausführung bearbeiten kann, um beispielsweise ein anderes Zeitformat zu verwenden. Es macht es auch wiederholbar; zum Beispiel kann kill %firefox aus der Historie abgerufen und erneut ausgeführt werden, selbst wenn sich die PID geändert hat. Schließlich würde ich argumentieren, dass es mit dem Rest von fish konsistenter ist, wo die Token auf der Befehlszeile nur zur Ausführungszeit ausgewertet werden.

Auf der anderen Seite ist die Auswertung zur Expansionszeit strenger, da wir sie beispielsweise mit Escapes deaktivieren können, aber ohne sie können wir uns nicht wirklich _opt-in_. Ich denke, dies wäre jedoch mit #751 besser gelöst, da der Benutzer die Kontrolle über die Auswertung hat. Das bietet jedoch immer noch keine Möglichkeit, den _exakten_ Moment der Abkürzungserweiterung zu erhalten; es wäre der Moment, in dem der Benutzer den einzelnen Token erweitert. Dennoch denke ich, dass es nützlicher und konsistenter wäre, da es nicht nur mit Abkürzungen funktioniert, sondern mit jedem Token auf der Befehlszeile, das ausgewertet werden kann, unabhängig davon, ob es der Befehlszeile hinzugefügt wurde.

Wenn ich die Leertaste drücke und die Abkürzung erweitert wird und ich meine Meinung geändert habe, sollte ich vielleicht in der Lage sein, die Löschtaste zu drücken und die Erweiterung aufzuheben.

Ich denke, dies sollte nicht mit Löschen oder Rücktaste geschehen, da ein Teil meiner Motivation für Abkürzungen die Möglichkeit ist, _Teile_ der Erweiterung vor der Ausführung nachzubearbeiten. Vielleicht wäre es eine bessere Idee, eine Bindung für "rückwärts vom Cursor zum aktuellen Prozess löschen" hinzuzufügen, wie in commandline -p . Dies würde das Problem mit Abkürzungen lösen (da sie nur in Befehlsposition expandieren), aber gleichzeitig ohne Abkürzungen wirklich nützlich sein. Dies würde im Grunde wie Strg-U funktionieren, aber am Anfang des aktuellen "Prozesses" stoppen. Eine Variante, die Strg-K entspricht , die am _Ende_ des aktuellen Prozesses stoppt, könnte aus Konsistenzgründen hinzugefügt werden und könnte auch nützlich sein.

Dies mag jetzt anders sein, da die native Implementierung überall und nicht nur am Anfang der Zeile verwendet werden kann.

Ich habe die Implementierung von @terlar nicht ausprobiert, aber sie basiert auf meiner, wo Erweiterungen tatsächlich in _jeder_ Befehlsposition ordnungsgemäß funktionieren, nicht nur am Zeilenanfang, Kudos commandline -p . Ich bin wirklich beeindruckt, wie gut mein grober Proof-of-Concept-Code funktioniert! :fisch: :herz:

hmm, ich glaube, ich habe nie versucht, Abkürzungen in anderen Befehlspositionen zu verwenden.
Ja, die Prototypen funktionierten großartig, nur das erwähnte Problem beim Einfügen war eine Unannehmlichkeit, aber die Funktion war zu gut, um sie nicht zu verwenden.

@sch1zo Einfügen sollte funktionieren, wenn Sie Strg-Y verwenden .

das könnte der Fall sein, aber die meiste Zeit habe ich per Auswahl- / Mittelklick kopiert / eingefügt und dort war das Problem vorhanden. Aber die native Implementierung hat dieses Problem nicht mehr und ich habe bereits alle meine Maschinen aktualisiert, um diese zu verwenden.

Nach ~10 Tagen der Verwendung der nativen Abkürzungen habe ich eine Sache gefunden, die mich irgendwie nervt. Wenn Sie bereits einen Befehl eingegeben haben und dann zum Anfang der Zeile springen, um ihm eine Abkürzung voranzustellen, wird er nicht erweitert und funktioniert nicht im nicht erweiterten Zustand. Eine häufige Situation bei mir ist folgende:
Eine meiner Abkürzungen ist !=sudo Wenn ich also jetzt eine Systemkonfigurationsdatei wie in vim /path/to/some/file/I/am/not/allowed/to/write bearbeiten möchte, merke ich oft spät, dass ich Sudo brauche, also springe ich normalerweise einfach an den Anfang und stelle ! voran command not found Nachricht zurücklassen.
Meine derzeitige Problemumgehung dafür besteht darin, nur einen Alias ​​für die Abkürzung hinzuzufügen, aber es wäre natürlich schöner, wenn sie richtig erweitert würde.

Einverstanden; wir müssen bei der Eingabe von Leerzeichen auf die Cursorposition achten, nicht nur auf "das erste Token". Alternativ können Sie zuerst das Leerzeichen einfügen und dann die Befehlszeile erneut analysieren und die Abkürzung erweitern.

Commit b6f495d1077b7627ea851da33936c77b2d594bb2 sollte das von @sch1zo identifizierte Problem

Eine weitere Sache, die wir hinzufügen sollten: Wir sollten wahrscheinlich ll , la und ähnliche Aliase anstelle von Funktionen standardmäßig machen.

Ich richte dies auf next-minor da diese Funktion wahrscheinlich mit der nächsten Version ausgeliefert wird.

Die nächste Veröffentlichung wird voraussichtlich sehr bald erfolgen, dh bis Ende nächster Woche. Ich räume gerade die Dokumentation auf.

Abkürzungen werden in ihrem aktuellen, unvollständigen Zustand aufgenommen. Ich möchte sie nicht veröffentlichen oder dokumentieren, bis wir den Befehl abbrev (oder alias umfunktionieren). Aus diesem Grund schiebe ich dies auf das nächste Major zurück.

Ich glaube nicht, dass alias ein guter Begriff ist. Für mich ist ein alias ein alternativer Name... nicht etwas, das erweitert werden muss.

Ich mag abbr aus dem gleichen Grund auch nicht.

Ich dachte an expand foo "foobar" ... aber es scheint, dass der Befehl expand bereits existiert :/ Schade, ich denke, dass expand der beste Begriff gewesen wäre.

Wie wäre es, Aliasse und Abkürzungen zu vereinheitlichen? Anstatt eine neue Funktion einzuführen oder alias zu veralten, führen Sie eine Konfigurationsoption zum "Erweitern von Aliasen" ein. Der Nachteil dabei ist, dass wir Konfigurationsoptionen in fish nicht mögen (aber wir könnten die Konfigurationsoption möglicherweise überspringen) und (vielleicht eine gute Sache) bedeutet dies, dass wir die beiden Verhaltensweisen nicht mischen können, obwohl Sie immer noch normale Funktionen schreiben können, um die alten zu erhalten Alias-Verhalten ... Der Vorteil ist, dass wir nicht zwei Möglichkeiten haben, ähnliche Dinge zu tun, es ist einfach zu erklären ("Aliases erweitern sich in Fischen") und Abkürzungen funktionieren tatsächlich in Skripten (weil sie auch Aliase sind), was auch bedeutet, dass sie auch im Syntax-Highlighter nicht in Sonderbuchstaben geschrieben werden müssen. Und indem wir die Alias-Maschinerie in den C++-Code verlagern, können wir die Langsamkeit der aktuellen Alias-Implementierung vermeiden. Sie müssen jedoch noch herausfinden, wie Vervollständigungen für nicht erweiterte Aliase funktionieren.

Eine Funktionsanfrage...

Ich habe zuvor Funktionen verwendet, um häufig verwendete Befehlskombinationen in einem einzigen Befehl auszugeben, wie z. B. git add, git commit und git push in einem Vorgang.

Ich liebe die neue Abkürzungsfunktion. Ich finde es riesig und versuche, darauf umzusteigen. Ich bin damit einverstanden, dass es auf eine einzelne Befehlserweiterung beschränkt ist. Ich möchte jedoch immer noch mehrere Befehle auf einmal ausführen. Jetzt kann ich einfach eine Abkürzung für den ersten Befehl verwenden, gefolgt von einem Semikolon, dann die Abkürzung für den zweiten Befehl usw. Es funktioniert gut, tatsächlich denke ich, dass es so besser ist.

Meine Bitte ist, dass die Erweiterung nicht nur durch Leerzeichen oder Enter, sondern auch durch Semikolon ausgelöst wird. Da das Semikolon im Grunde einer verzögerten Eingabe entspricht, wird dies vermutlich auch für Sie alle Sinn machen.

Ich kann es kaum erwarten, dass diese Funktion in einer offiziellen Veröffentlichung veröffentlicht wird!

Für mich ergibt das Sinn.

1a7b33e8fb75dd702730ca9637d760fbd23a4000 erweitert Abkürzungen auf Semikolons.

Vielen Dank!

Wo werden fish_user_abbreviations gespeichert? Ich möchte sie zu meinem dotfiles-Repository hinzufügen.

Es ist derzeit eine universelle Variable und wird daher in ~/.config/fish/config.fish gespeichert. Aber dies ist nur ein vorübergehender Hack, bis wir herausfinden, wie wir sie richtig speichern. Rückmeldungen sind hier willkommen.

Wenn Sie möchten, können Sie config.fish einfach eine Zeile wie set -g fish_user_abbreviations... hinzufügen, um sie manuell einzustellen.

Hrm, ich sehe diese Variable dort nicht.

Ich habe set -U fish_user_abbreviations 'g=git' . Ist das der richtige Weg, um es in config.fish zu bekommen?

Entschuldigung, ich meinte, es würde in ~/.config/fish/fishd.[mac_address] gespeichert werden. Offensichtlich funktioniert das Synchronisieren nicht (absichtlich), da es vom MAC abgetastet ist.

Um es in config.fish einzufügen, würden Sie `set -g fish_user_abbreviations 'g=git' schreiben. -g für global, da Sie es jedes Mal festlegen.

Ich denke, die universelle Variable ist einigermaßen ordentlich, sie braucht nur eine bessere Benutzeroberfläche.

Wenn wir es als Array verwenden, entweder mit = zum Aufteilen von Schlüsseln und Werten oder ASCII FS ( \x1c ), dann eine Fischfunktion, um es zu verwalten ( abbr ) + /- eine Webinterface-Seite wäre nützlich.

Es müsste daran gedacht werden, einen geeigneten Output für den Export/Transfer zu produzieren.

@ridiculousfish Ahh, danke, das ist sehr hilfreich! Ich werde das vorerst tun, bis es einen Prozess für den Export gibt.

Übrigens, ich bin neutral, wenn es darum geht, entweder A) eine einzelne Datei mit allen Abkürzungen oder B) eine separate Datei für jede Abkürzung zu haben. Vielleicht in Richtung A geneigt, aber nicht stark.

Ich habe eine grundlegende Benutzeroberfläche um die vorhandene Implementierung als abbr hinzugefügt. Verwenden Sie abbr -h , um mehr zu sehen. Ich habe der Weboberfläche auch eine schreibgeschützte Benutzeroberfläche hinzugefügt, aber es wäre gut, wenn diese mehr tun würde.

Anstatt = als Trennzeichen zu verwenden, könnten wir einfach das erste Token (durch Leerzeichen getrennt?) jedes Array-Elements verwenden - dies würde die Implementierung vereinfachen.

Die universelle Variable ist ordentlich, aber wenn wir sie nicht direkt verfügbar machen, ist es vielleicht besser, sie nach __fish_user_abbreviations (und möglicherweise davor zu warnen, sie auf lokaler oder globaler Ebene zu setzen).

Ich würde space-separated bevorzugen, anstatt = als Trennzeichen zu verwenden. Zumal dieser Stil nirgendwo sonst in fish .

Ich stimme zu, dass dies durch Leerzeichen getrennt sein sollte. Es macht ein bisschen mehr Sinn und bedeutet, dass = auf Wunsch tatsächlich Teil der Abkürzung sein könnte. Der Befehl abbr sollte wahrscheinlich geändert werden, um das Flag --add löschen und stattdessen nur zwei Argumente zu verwenden.

In Bezug auf $__fish_user_abbreviations kann ich diesen Vorschlag nachvollziehen, aber es ist plausibel, dass Benutzer $fish_user_abbreviations selbst ändern möchten, ohne den Befehl abbr , und ich würde es eher nicht ermutigen jeder, der eine $__fish_* Variable direkt ändern kann. Ebenso ist es vollkommen legitim, sie auf lokaler oder globaler Ebene festzulegen; Nicht jeder möchte universelle Variablen für solche Dinge verwenden.

In einem verwandten Hinweis sollte read wahrscheinlich Abkürzungen bei interaktiver Eingabe erweitern, wenn das --shell Flag verwendet wird.

Meine Sorge, die Änderung der Variablen außerhalb des Befehls abbr zu ermutigen, ist, dass die Erweiterung des Befehls zur Unterstützung des Bereichs seine Komplexität in Bezug auf die Benutzeroberfläche erhöht, dies jedoch zu möglicherweise irreführenden Ergebnissen führt. Es gibt derzeit keine Zusammenführung der Variablenbereiche, was verwirrend sein könnte - wenn Sie eine universelle Erweiterung und eine (unterschiedliche) globale Erweiterung festlegen, sollten beide funktionieren? Wie setzt man dann eine universelle Expansion im globalen Rahmen auf? Ist das etwas, was die Leute jemals tun wollen?

Raumtrennung klingt nach einer guten Idee. Um Verwirrung zu vermeiden, sollte das Hinzufügen einer neuen Abkürzung wahrscheinlich eine unbegrenzte Anzahl von Argumenten erfordern, wobei das erste zum "Wort" und die restlichen zur "Phrase" zusammengefügt werden.

Es gibt keine Notwendigkeit, etwas zu tun, um das "Scoping" zu unterstützen. Wenn abbr einfach $fish_user_abbreviations , wird die globale Variable verwendet, falls vorhanden, oder ansonsten die universelle Variable. Genau so funktioniert der Reader. Der einzige Nachteil ist, dass der Leser dies auch sehen wird, wenn der Benutzer $fish_user_abbreviations als lokale Variable auf der obersten Ebene festlegt. Und die einfache Lösung besteht darin, das -S Flag der abbr Funktionsdeklaration hinzuzufügen, wodurch sie lokale Variablen sehen kann, die in ihren Eltern definiert sind. Aber es besteht definitiv keine Notwendigkeit, Abkürzungen zusammenzuführen (und dies auch nicht, außer die Variable in anderen Bereichen vorübergehend zu löschen).

Nachdem ich davon gelebt habe, möchte ich, dass Abkürzungen entweder unterstrichen oder anders hervorgehoben werden, bevor sie erweitert werden. Dies gibt mir ein gewisses Vertrauen, dass ich sie richtig eingegeben habe. Die Gedanken?

Unterstützung für Leerzeichentrennzeichen befindet sich in fbade198b942a666d3fc1110804a7da2c47918f1

Wenn Sie die Leertaste drücken und es nicht erweitert wird, wissen Sie, dass Sie es nicht richtig eingegeben haben. Ich bin nicht gegen das Unterstreichen oder Hervorheben (es wäre sicherlich ein zusätzliches Stichwort, den Benutzer wissen zu lassen, warum sich seine Befehlszeile gerade geändert hat), aber ich bin mir nicht sicher, ob ich verstehe, warum Sie Vertrauen haben müssen, bevor Sie das Leerzeichen treffen.

@ridiculousfish In Bezug auf fbade198b942a666d3fc1110804a7da2c47918f1 sind Abkürzungen neu genug (und bis zum letzten Master undokumentiert), dass wir einfach die = Unterstützung entfernen sollten.

Ich denke an den Vor-Rückkehr-Fall, nicht den Vor-Raum-Fall

Klingt gut für mich. Ich nehme an, es _ist_ möglich, mit Hervorhebungen zu übertreiben, was zu Trägheit und verwirrender Informationsüberflutung führt, aber ich glaube nicht, dass dies hier der Fall ist. Außerdem nehme ich an, dass es eine $fish_color_abbr-or-whatever Variable verwenden würde, damit es von denen, die dies wünschen, aus irgendeinem Grund leicht deaktiviert werden könnte.

Zuerst wollte ich anmerken, dass ich es nicht intuitiv fand, dass das Hervorhebungsverhalten bei Abkürzungen anders ist als bei normalen Befehlen, bis ich merkte, dass ich falsch lag und dass es konsistent ist.

Meine Verwirrung kam von der Tatsache, dass ich Hervorhebung und die vorgeschlagene Vervollständigung verwechselte.

Wenn ich zum Beispiel "echo" eingebe, ist die Hervorhebung rot, bis ich den vollständigen Befehl eingebe, was so sein sollte. Die vorgeschlagene Vervollständigung nimmt jedoch erfolgreich vorweg, was ich gerade tippen wollte, und gibt mir die Gewissheit, dass ich in die beabsichtigte Richtung gehe.

Bei Abkürzungen erhalte ich kein solches Feedback, was bedauerlich ist, da ich mir oft nicht einprägsame Kürzungen von Befehlen einfallen lassen kann, insbesondere solche, die sich zu komplexen Befehlen ausdehnen.

Tatsächlich ist das Ziel für mich, eine breite Palette von Befehlen in einen kleinen Namensraum zu packen (ich fotografiere nach ~5-stelligen Abkürzungen und habe Hunderte davon). Aus diesem Grund verlasse ich mich noch stärker auf die Shell-Anleitung, um einen gültigen Befehl einzugeben. Etwas, das die Rolle erfüllt, die die vorgeschlagene Vervollständigung einnimmt, aber für Abkürzungen anstelle von regulären Befehlen, wäre wirklich hilfreich, sogar für mich mehr als für Standardbefehle.

Ich kann die Schwierigkeit bei vorgeschlagenen Vervollständigungen durch Abkürzungen sehen. Es wäre nicht intuitiv, die Abkürzung in die eigentlichen Befehle zu erweitern, da sie nicht mehr mit Ihrer Eingabe zusammenhängen würde. Trotzdem habe ich das Gefühl, dass es besser sein könnte, als es jetzt ist.

Zumindest für mich würde es mich kratzen, die Abkürzung selbst (nicht die Erweiterung) in die vorgeschlagenen Vervollständigungen aufzunehmen. Ich möchte nur sehen, dass ich ein Präfix einer definierten Abkürzung richtig eingebe. Das ist genug, um mir zu sagen, dass ich nicht umsonst tippe, weil ich meine Abkürzung falsch erinnert oder falsch geschrieben habe.

Ich habe versucht, abbr.fish zu erweitern, um sowohl Leerzeichen als auch = Trennzeichen zu verarbeiten, aber ich hatte nicht viel Erfolg bei der Entwicklung einer robusten Lösung, ohne externe Tools zu verwenden.

Ich dachte, der Plan war, die = Unterstützung zu entfernen? Ich dachte daran, es einfach zu tun und dann eine Nachricht mit einem Skript an die Fisch-Mailingliste zu senden, das $fish_user_abbreviations munget, die die Leute ausführen können, um in Leerzeichen zu wechseln.

Hallo Leute,

Ich wollte mir eine Notiz machen, nachdem ich schon seit einiger Zeit Abkürzungen verwendet habe.

Ich bin ein großer Fan und sie machen mein Leben viel einfacher. Besonders gut gefällt mir, dass andere Leute in gewohnter Form sehen können, welche Befehle ich gebe.

Meine einzige Abneigung ist, dass es keine Geschichte für Abkürzungen gibt. Da ich für fast jeden Befehl Abkürzungen verwende, hat dies dazu geführt, dass ich die Verlaufsfunktionalität größtenteils verloren habe. Während Sie vielleicht denken, dass Abkürzungen kurz genug sein sollten, um keine Verlaufsfunktionalität zu benötigen, vermisse ich sie ziemlich. Ich habe über 200 Abkürzungen definiert, und einige davon unterscheiden sich nur geringfügig. Wenn mir die Geschichte beispielsweise die von mir gestern herausgegebene zeigen würde, wäre das für die komplizierteren und weniger häufig verwendeten Abkürzungen immens nützlich. Da ich praktisch mit Abkürzungen lebe, musste ich stattdessen auf Funktionen zurückgreifen, wo ich History-Unterstützung benötige, da ich sonst wirklich keine History habe.

Danke nochmal für die Funktion.

@binaryphile Sehr interessant. Es klingt, als hätten Sie eine Vorstellung davon, wie dies aussehen sollte (dh die Benutzeroberfläche). Möchten Sie es genauer beschreiben?

Gute Frage. Ich denke, ich würde es einfach mögen, wenn die Abkürzung in die Verlaufsliste aufgenommen wird, wenn eine Erweiterung ausgelöst wird. Wenn ich also meine Abkürzung "gclon" für "git clone" wäre, dann würde "gclon" meinem Verlauf hinzugefügt, wenn ich Leerzeichen (oder Semikolon) drücke. Ich würde das normale Verhalten beim Speichern des erweiterten Befehls im Verlauf nicht ändern, sodass beide verfügbar wären.

Danach, als ich anfing, ein Präfix der Abkürzung einzugeben (wie "gcl"), würde ich erwarten, dass "gclon" die erste Option für die automatische Vervollständigung ist, die auftaucht.

Im Idealfall könnte ich zu diesem Zeitpunkt Alt-f drücken und beides automatisch zur erweiterten Version vervollständigen und außerdem eine neue automatische Vervollständigung dieses erweiterten Befehls aus dem Verlauf anbieten. Ich würde das wollen, weil ich nach der Erweiterung möglicherweise weitere Argumente eingegeben habe und diese mit so wenigen Tastenanschlägen wie möglich über den gleichen Weg verfügbar haben möchte, auf dem ich es ursprünglich eingegeben habe (Abkürzung dann Argumente). Da die Abkürzung in der History nicht die Argumente hätte, wäre Alt-f die natürlichste Methode für mich, die Vervollständigung Argument für Argument weiterzuverfolgen.

Ich denke, ctrl-f würde sich nicht ändern und würde nur zum Ende der Abkürzung vorrücken, nicht zur erweiterten Version, da es keinen visuellen Hinweis darauf geben würde, worauf Sie expandieren würden.

Ich habe gerade einen nächtlichen Aufbau und Lauf bekommen, um dies endlich zu testen! Ich mag diese Funktion wirklich und liebe die Tatsache, dass es den abbr Befehl gibt, der mitgeliefert wird.

Mein Feedback ist, dass wir eine gute Möglichkeit zum Exportieren für das Dotfile-Backup benötigen. Ich denke, diese sollten alle in eine Datei im Format abbr --show ausgegeben werden. abbr --show ist gut genug für mich, ich werde sie vorerst nur in eine Punktdatei überführen. Aber ich möchte eine einfache Möglichkeit, sie zu diesem Zeitpunkt wieder zu importieren. Wenn Fish dieses Format jetzt importieren könnte, wäre das ein guter nächster Schritt.

Das Befolgen des Befehls in der Hilfe zum Hinzufügen einer neuen Abkürzung schlägt mit diesem Fehler fehl.

selection_235

Derzeit müssen Sie abbr -a "gco git checkout" eingeben, aber ich denke, es wäre sinnvoller, den im Handbuch beschriebenen Fall zu unterstützen.

Ahh, danke!

48d3536 nimmt diese Änderung vor.

Ich denke, wir sollten entweder die Unterstützung für das Trennzeichen '=' in der nächsten Nebenversion beibehalten und sie danach deaktivieren oder (still?) fish_user_abbreviations Leuten aktualisieren.

Ich werde dies als behoben schließen; Ich habe #2051 eingereicht, um die Migration zu verfolgen. Vielen Dank an @dag für das Konzept und alle die es getestet haben - freue mich auf die baldige Veröffentlichung!

W00t, danke an alle, ich LIEBE dieses Feature wirklich!!

Ich liebe Abkürzungen, es ist eine viel freundlichere Erfahrung als Decknamen. Vielen Dank!

Ich bin auf diesen Thread gestoßen , als ich nachgesehen habe 1 , 2 speichert.
Wenn hier jemand aus dem gleichen Grund stolpert, können Sie abbr -s/--show . Zum Beispiel

abbr --show >> ~/.config/fish/config.fish

@dideler Ich verwende etwas Ähnliches für die automatische Sicherung, ich empfehle auch, auf sort leiten .

abbr --show | sort > fish_abbreviation_backup;

Ich lege alles in eine fish_abbreviation_backup-Datei und füge diese dann zu Homeshick zur Sicherung hinzu. Es ist jedoch alles automatisiert und läuft auf Cron. Nachdem ich ein Backup erstellt habe, gehe ich source fish_abbreviation_backup damit der Fisch bei einem abbr --show alphabetischer Reihenfolge angezeigt wird.

Wäre schön, wenn fish Abkürzungen in einer Datei behalten würde, ähnlich wie es mit Funktionen umgeht.

Update: Problem beim Sortieren von Abkürzungen beim Speichern -> https://github.com/fish-shell/fish-shell/issues/2156

Wäre schön, wenn Fische Abkürzungen in einer Datei behalten würden...

Von der Manpage: "Abkürzungen werden mit universellen Variablen gespeichert." Das heißt, Sie finden sie in der Datei _~/.config/fish/fishd.macaddr_ unter dem Variablennamen fish_user_abbreviations . Der Befehl abbr manipuliert einfach diese universelle Variable.

Danke, wäre es in Ordnung, sie in ~/.config/fish/abbreviations.fish zu behalten, damit wir sie einfach zu unseren Punktdateien hinzufügen können?

@ElijahLynn : Ich habe eine Datei namens "abbrs.fish" in ~/.config/fish/conf.d/ mit folgendem Inhalt:

if not set -q fish_initialized
    abbr -a alsamixer alsamixer -c0
    abbr -a e emacs -nw
    abbr -a \$PAGER less
    abbr -a mu4e emacs --eval "\(mu4e\)"
    abbr -a pm pulsemixer
    abbr -a rm rm -I
    abbr -a sc systemctl
    abbr -a upo upower -i /org/freedesktop/UPower/devices/battery_BAT0
    abbr -a usc systemctl --user
    # Double-escaping needed
    abbr -a d2 env WINEPREFIX=/home/alfa/.wine32/ wine ~/.wine/drive_c/Program\\ Files\\ \\(x86\\)/Diablo\\ II/Diablo\\ II.exe
    abbr -a c curl -LO -C -
    set -U  fish_user_paths ~alfa/.local/bin $GOPATH/bin
    set -U fish_initialized
end

Ich habe dies in meinen Dotfiles und kann es einfach auf jedem Computer set -e fish_user_abbreviations; set -e fish_initialized ) und Fisch neu starten.

Danke, vielleicht fehlt mir das, aber das sieht so aus, als müssten Sie das manuell pflegen und können sie nicht einfach mit dem Befehl abbr hinzufügen und verwalten.

Dort fügen Sie den Befehl abbr hinzu. Dies kann sogar die Ausgabe eines abbr --show Aufrufs sein.

Nur in Kommandoposition ist wahrscheinlich ein guter Anfang. Dann können wir vielleicht mit den Anwendungsfällen der Argumentposition experimentieren, die ich zuvor vorgeschlagen habe.

Ich denke, nicht nur eine Position am Anfang wäre eine Handvoll, Beispiel: s für sudo und n für nano die von s n bis sudo nano , jedoch nicht in der aktuellen Implementierung.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

pluckytree picture pluckytree  ·  3Kommentare

Limeth picture Limeth  ·  3Kommentare

zx8 picture zx8  ·  3Kommentare

spacekookie picture spacekookie  ·  3Kommentare

luc-j-bourhis picture luc-j-bourhis  ·  3Kommentare