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:_
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:
commandline
muss nicht lügen oder andere solche Hacks ausführen.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.prevd-or-backward-word
usw.Argumente gegen:
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.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.Stand der Technik:
:abbreviate
in VimDiskutieren.
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:
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 :
@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:):
echo this is a test
beim Einfügen zu _echo this is atest
, wobei _
ein Leerzeichen ist.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 seinSie 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:
fish_user_expansions
klingt für mich ok.gc=git checkout
ist leichtgewichtig, wird aber nirgendwo sonst in fish verwendet.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.
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.
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.abbr gc 'git checkout'
und abbr -e gc
.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.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
alias
Abkürzungen machen zu lassen. Als Bonus würde es die nicht funktionierenden Vervollständigungen bei aktuellen Aliasen beheben.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.
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.
Hilfreichster Kommentar
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 Befehlabbr
manipuliert einfach diese universelle Variable.