Fish-shell: Unterstützung der Historienerweiterung (z. B. bash's !!, bang bang und !$, bang dollar, Token)

Erstellt am 20. Aug. 2012  ·  98Kommentare  ·  Quelle: fish-shell/fish-shell

Es scheint, dass der Doppelknall nicht funktioniert und irgendwie als ein Programm interpretiert wird, das sudo erfolglos zu finden versucht. Dies tritt unter Ubuntu 12.04 LTS mit Fischshell auf, die aus dem Quellcode kompiliert wurde.

Schritte zum Repro:

  1. Führen Sie einen beliebigen Befehl aus:

    $ ls

  2. Führen Sie den vorherigen Befehl als root aus:

    $ sudo !!
    sudo: !!: Befehl nicht gefunden

    Erwartetes Verhalten:

Befehl sudo !! führt den zuvor ausgeführten Befehl ( ls ) als Root aus.

Ich habe auch überprüft, dass das Problem nicht durch sudo verursacht wird, indem ich die Repro-Schritte in der bash befolgt habe, die sich wie erwartet verhielten.

Beachten Sie auch, dass eine frühere Version von fish-shell unter Mac OS X 10.7 dieses Problem nicht hatte und sudo !! wie erwartet funktionierte.

duplicate

Hilfreichster Kommentar

function sudo
    if test "$argv" = !!
        eval command sudo $history[1]
    else
        command sudo $argv
    end
end

sudo !! für Leute, die aus irgendeinem Grund immer noch !! .

Alle 98 Kommentare

Es wird in den Dokumentations-FAQs besprochen: http://fishshell.com/docs/current/faq.html#faq -history

Danke für die Klarstellung.

Ich verstehe die Gründe für das Entfernen von Geschichtszeichen. Obwohl ich den Grund dafür verstehe und dass es möglich ist, Ce und Ca anstelle von End und Home zu verwenden, für viele Benutzer, insbesondere für diejenigen, die es gewohnt sind !! und diejenigen auf einem Laptop, die keine Home- und End-Tasten haben, ist es immer noch viel einfacher, sudo einzugeben !! als Up+C-a+sudo.

Würden Sie immer noch in Betracht ziehen, die Funktionalität von Verlaufsersetzungs-Token wiederherzustellen?

Da ist es ein seltener Fall, wo !! komfortabler ist, versuchen Sie die folgende Funktion:

function sudo!!
    eval sudo $history[1]
end

die nur von "sudo!!" aufgerufen wird.

Oder die andere Möglichkeit die ich nutze:

function .runsudo --description 'Run current command line as root'
    commandline -C 0
    commandline -i 'sudo '
    commandline -f execute
end
bind \es .runsudo

Dann führe ich durch Drücken von MS die aktuelle Befehlszeile mit sudo put direkt davor aus.
Oder indem Sie dieses Beispiel modifizieren, können Sie eine Funktion erstellen, die die vorherige Befehlszeile in die aktuelle einfügt und sie beispielsweise an '\e!' bindet. Dieser Ansatz ist besser als die einfache Verwendung von '!!' weil es Ihnen die Möglichkeit gibt, die Befehlszeile vor der Ausführung anzuzeigen und zu aktualisieren.

Ich habe den letzten Befehl leicht abgewandelt:

  function .runsudo --description 'Run current command line as root'
    set cursor_pos (echo (commandline -C) + 5 | bc)
    commandline -C 0
    commandline -i 'sudo '
    commandline -C "$cursor_pos"
  end
  bind \es ".runsudo"

Es speichert die Cursorposition, anstatt sie direkt auszuführen.

!$ wäre auch schön zu haben

function sudo
    if test "$argv" = !!
        eval command sudo $history[1]
    else
        command sudo $argv
    end
end

sudo !! für Leute, die aus irgendeinem Grund immer noch !! .

Danke. Es gibt eine sehr große Anzahl von Leuten, die Sudo verwenden !! Geben Sie an, dass diese Syntax von vielen anderen Shells unterstützt wird, einschließlich bash und zsh. sudo !! ist einfacher zu tippen als die Home- und End-Tasten, da diese weiter entfernt sind.

Ich würde vorschlagen, dass die obige Funktion standardmäßig in fish-shell enthalten ist.

!! ist ein guter Kandidat für eine Abkürzung (#731)

Unterstützung ausdrücken für !! und zugehörige Verknüpfungen. Es schadet nicht, es hinzuzufügen, und es fühlt sich an, als würde Fisch seinen Benutzern nur eine persönliche Philosophie aufdrängen.

Meine derzeitige Vorstellung von der idealen Lösung ist, dass !! sollte eine Abkürzung sein (#731), und wir implementieren Funktionssignaturen (#478), um Unterbefehle zu unterstützen (ein Befehl, der einen Befehl benötigt, wie sudo). Dann werden Abkürzungen in Unterbefehlspositionen erweitert, sodass 'sudo !!' wird erweitern.

Ich füge mich hinzu

Obwohl es alt ist, ist es eine Funktion, die in Fish wirklich als Standard enthalten sein sollte. Es gibt keinen Grund, es nicht zu haben - wenn Sie es nicht persönlich verwenden möchten, ist das in Ordnung, aber ein zusätzliches Kommando schadet niemandem wirklich - Leute mögen es, Dinge anders zu machen.

Der Weg !! in den meisten Shells implementiert ist, tut Menschen weh. Betrachten Sie beispielsweise diesen Befehl:

echo fish is great!!

in bash / zsh / tcsh wird dies etwas Unerwartetes und Schreckliches bewirken, denn das !! ist magische Syntax. Dies ist die Art von seltsamen Interaktionen, die Fische sehr gerne vermeiden.

Mein Vorschlag war umzusetzen !! nicht als magische Syntax, sondern als Alias. Dies bedeutet, dass es nur in "Kommandoposition" etwas Besonderes tun würde - es wird nicht in Argumenten erweitert. Es hält auch den Funktionsumfang von Fischen niedrig, was wünschenswert ist.

Um das nützlich zu machen, müssten wir fish über Unterbefehle beibringen, wobei sudo das häufigste Beispiel ist, aber auch time , strace usw. fish würde dann Aliasse erweitern in "Unterbefehlsposition", was an sich schon eine coole und nützliche Funktion ist.

Ihre vorgeschlagene Lösung fällt auseinander, wenn Sie sudo echo fish is great!! Betracht ziehen. Dasselbe Argument kann für alle Syntax angeführt werden: Ist echo I really like fish (the shell)! auch verwirrend? Ich befürchte auch, dass eine Liste von "Unterbefehlen" unmöglich zu pflegen wäre und die Flexibilität beeinträchtigen würde.

Mit Aliasnamen werden nur Befehle erweitert, und fish würde wissen, welche Argumente (Unter-)Befehle sind und welche nicht. sudo echo fish is great!! würde also keine Erweiterung des letzten Befehls ausführen, sondern stattdessen ein wörtliches "großartig!!" zu sudo (und damit zu echo). Ich behaupte, das hat der Benutzer erwartet. Siehe die Diskussion über Abkürzungen (#731) und Funktionssignaturen (#478) für Design und Begründung.

SirCmpwn hat Recht, dass das Erfordernis umfassender Funktionssignaturen ein Nachteil des Alias-Ansatzes ist und dass auch andere syntaktische Elemente verwirrend sind. Beispiele aus der Praxis sind die Belästigung der Klammererweiterung mit git (#434) oder Wildcards (#967 u.a.). Syntax ist mit hohen Kosten verbunden, und wir versuchen, Syntax zu eliminieren, wenn sie mit anderen Funktionen überflüssig ist (zB #354).

Wie auch immer, das ist mein Argument für die Unterstützung !! als elementares syntaktisches Element ist ein No-Go. Ich bin jedoch offen dafür, es auf eine Weise einzuführen, die keine Änderung der Fischsyntax erfordert.

Ich finde den Vergleich mit {} schlecht. Bei Fischen funktionieren Zahnspangen anders als andere Muscheln. Die Leute stolpern nur darüber, wenn sie erwarten, dass es wie Bash und Freunde funktioniert. Der !! Syntax sollte genauso funktionieren wie andere gängige Shells. Ebenfalls, !! ist nicht etwas, was ich in Befehlen oft genug erwarten würde, um Probleme zu verursachen. Tatsächlich würde ich erwarten, wie oft die Leute versucht haben, es zu verwenden !! mit Fischen hat die Zahl der Male, die jemand ein wörtliches verwendet hat, bei weitem übertroffen !! in einem Befehl.

Ich behaupte, dass ! in anderen Shells verwirrend ist, und es wäre besser, wenn es nicht auf diese Weise implementiert würde. Zum Beispiel habe ich unter http://codegolf.stackexchange.com/a/17776/3103 einfach "Hallo Welt!" in der UNIX-Shell geschriebenes Programm, das aufgrund von ! fehlschlägt (in der Frage zu lächerlichen Laufzeitfehlern). Es hat sogar sieben positive Stimmen erhalten, daher kann ich mir vorstellen, dass diese Funktion überraschend sein kann, wenn Sie sie nicht verwenden möchten.

!! allein sollte jedoch in Ordnung sein, denn wie oft schreibt der Benutzer !! als Token? Andererseits würde das Hinzufügen von !! das Hinzufügen anderer Verlaufsersetzungsmuster fördern, von denen einige ärgerlich sein könnten.

Ich füge mich hinzu - bin gerade an meinem ersten Wochenende mit Fisch gelandet. Sollte auf jeden Fall unterstützt werden.

Ich füge mich hinzu - brauche das.

Für diejenigen, die dies wünschen, haben mir die zuvor in der Diskussion erwähnten Funktionen und Bindungen einen einfacheren Arbeitsablauf für das Voranstellen von sudo oder das Ausführen des letzten Befehls als den typischen sudo !! .

Sie sollten sie ausprobieren. Es hat mich dazu gebracht, meine Readline- und Zsh-Konfigurationen erneut zu besuchen, um ähnliche Bindungen zu haben.

Es verwandelt sieben Tastenanschläge (zwei davon verschoben) in eine einzelne Bindung.

Egal was _du_ magst - gibt es dafür wirklich einen Grund !! nicht unterstützt werden? Jeder hat unterschiedliche Dinge, die für ihn funktionieren, und obwohl einige Leute den Aufwärtspfeil mögen, verwenden viele Leute gerne !!, und ehrlich gesagt, warum sollte es eine schlechte Sache sein? Wer es nicht will, muss es nicht benutzen.

Ist doch nicht so schwer umzusetzen?...

Ja, ich weiß, man kann es zusammen mit Fish Scripting hacken, aber es funktioniert _nicht_ wie in Bash oder ähnlichen Shells, was oft recht praktisch war.

Siehe meinen obigen Kommentar für meine Begründung, warum ich dies nicht so einführen möchte, wie es bash und zsh tun (als neues syntaktisches Element) und meinen Vorschlag für eine Möglichkeit, die der Fischphilosophie entspricht.

Das Argument "Echo-Fisch ist großartig!!" besser sein als '!!' für die Geschichte ist ein bisschen schwach, aber ich verstehe den Punkt. Scheint, als ob ein einfaches "set shell_history advanced" oder etwas es für Leute ermöglichen könnte, die bereit sind, ein Risiko einzugehen "Echo Fish ist großartig!!" eine Fehlermeldung bekommen.

Trotzdem mein Anwendungsfall von '!!' ist ähnlich, könnte aber vielleicht mit einigen Funktionsverbesserungen vermieden werden.

Zum Beispiel auf meinem Mac mit bash:
$ brauen Update
$ brauen veraltet
$ brauen holen !!

Daher verwende ich etwas regelmäßig die Ausgabe des vorherigen Befehls für einen neuen Befehl.
Mit Fisch kann ich das machen:
$ brauen holen (brauen veraltet)
Irgendwann ist das vielleicht ein Vorschlag, den ich verwenden kann, aber was ich wirklich brauche, ist in der Lage zu sein, den Verlauf innerhalb des ()-Blocks zu durchsuchen.
z.B:
$ brauen holen (bre)

Obwohl fish ziemlich stolz darauf ist, () für Unterbefehle anstelle von "verwirrenden" Backticks und dergleichen zu verwenden, werden sie leider nicht wirklich als solche behandelt, bis Sie die Eingabetaste drücken. Das sehe ich zumindest.

Wenn fish eine Verlaufssuche nach dem ersten '(' (auch bekannt als Unterbefehl) zulassen würde, wäre es meiner Meinung nach einfacher, keine !-Verlaufsmanipulation zu haben.

Wenn ich den Vorschlag verstehe, sollte beim Drücken des Pfeils nach oben der Verlauf nur innerhalb des innersten Unterbefehls anstelle der gesamten Befehlszeile ersetzt werden.

:-1:

Ich unterstütze immer noch die einfache Implementierung von !! Bash-Stil.

Ich würde :up_arrow:, Strg+p und die Befehlsverlaufssuche bevorzugen, die in Unterbefehlspositionen arbeiten, als einzuführen !!

Die gesamte History-API anderer Shells ist verwirrend genug, dass sich die Leute normalerweise nur daran erinnern !! davon.

Richtig. Das wäre praktisch und würde das '!!' ziemlich einfach ersetzen. Oder !Schlüsselwortverwendung.

Ich mag die Idee, dass !! eine Abkürzung ist.

Es sieht so aus, als ob Abkürzungen in den neuesten nächtlichen Builds nur Abkürzungen in der Befehlsposition zulassen, hoffentlich wird es aktualisiert, um in Fällen wie diesem als Argumente verwendet werden zu können.

Diese Funktion wird überbewertet, verwenden Sie einfach sudo cmd oder eval sudo $cmd .

@bucaran Ich !! ist für die Geschwindigkeit, wie kann ich die Geschwindigkeit von !! mit cmd abgleichen?

Meinst du eine Variable namens $cmd , die der letzte Befehl ist? Es ist keine native Variable.

Danke

@mdsib Ja, ich glaube, ich erinnere mich, dass es in einem anderen Thema eine Diskussion darüber gab, Abkürzungen in der Argumentposition nicht zuzulassen. Damals wurde es vorgezogen, dies nicht zu implementieren. Das würde das definitiv ändern.

Ich denke, die Erkenntnis aus diesem Thread ist, dass es in absehbarer Zeit nicht passiert, und ich sollte mich von diesem Github-Problem abmelden und zu zsh wechseln. Adios!

Nicht weil !! nicht hier ist, sondern weil ein Github-Problem für ein ziemlich einfaches Feature seit 3 ​​Jahren offen ist, ohne aufgrund philosophischer BS implementiert zu werden.

Es ist lustig zu sehen, wie Leute versuchen, andere davon zu überzeugen, dass ein Feature keine große Sache ist. Sicher, Sie wollen es nicht, also ist es Ihnen egal.. Es ist, als würden Sie versuchen, die Leute davon zu überzeugen, Grün nicht zu mögen, weil Sie denken, Blau sei besser.
Da jedoch ein "einfaches" Feature nicht durchkommt, sollte vielleicht jemand einfach mal Fisch geben, wenn ihm die vorhandenen Features gefallen, aber noch ein paar mehr hinzufügen möchten. Scheint so, als ob das schneller irgendwo hinkommen würde.

Ich habe ~/bin/!! das sieht so aus:

#!/bin/fish
eval $history[1]

Kurzfristig hilft es mir, das fehlende Feature und meine Neigung zum Tippen zu umgehen !!.
Ich habe auch ~/bin/!vi erstellt:

#!/bin/fish
for f in $history
    echo $f | grep '^vi'
    if test "$status" = "0"
        eval $f
        exit $status
    end
end

Nicht ideal, aber genug, dass meine Shell dazu neigt, das zu tun, was ich jetzt häufiger erwarte.

@SirCmpwn Ist mir nicht klar, dass !! eine einfache Funktion ist. Bash unterstützt dies beispielsweise:

ls some_long_file.txt
!!:s/ls -l/cat/

Sollte diese Verwendung von !! unterstützt werden oder nicht? Benutzer, die sagen "Fische sollten unterstützen!!" kann unterschiedliche Vorstellungen davon haben, was das bedeutet.

Ihnen liegt dies sehr am Herzen, also ermutige ich Sie (oder jeden), einen Vorschlag zu verfassen, wie !! würde in Fisch funktionieren (die Semantik, nicht die Implementierung). Welche Syntax würde genau unterstützt werden? Wie würde sich diese Erweiterung zu anderen Erweiterungsarten wie der Variablen- oder Prozesserweiterung verhalten? Wie würde die Aufteilung von Argumenten in der erweiterten Zeichenfolge erfolgen? Könnten Sie Escapes verwenden, um dies zu verhindern?

Dies ist eine aufrichtige Bitte. Ein Feature wird nicht durch einen einzelnen Anwendungsfall definiert; wir brauchen einen konkreten Vorschlag zur Diskussion.

Wenn Sie sagen: "Ich möchte, dass dieser Fall funktioniert, und es ist mir egal, wie", dann ist das in Ordnung und gültig. Aber irgendjemand muss die Details ausarbeiten, bevor etwas umgesetzt werden kann.

Kurzfristig ist ein konkreter Plan, globale Aliase zu implementieren und dann !! in einen. Eine Alternative besteht darin, die docopt-Arbeit zusammenzuführen, eine Funktionssignatur für sudo zu geben und dann !! in einen regulären Alias. In welche Richtung wir gehen, hängt davon ab, ob wir denken !! sollte überall expandieren, oder nur in Kommandoposition.

@ridiculousfish Du hast vollkommen recht, dass ein '!!' Feature-Anfrage muss ziemlich detailliert sein. Ich habe das von Ihnen angegebene Beispiel nie verwendet, da ich immer so etwas mache:
$ ls -l some_long_file.txt
$ ^ls-l^cat

Auch das geht offensichtlich nicht. Das wäre für mich eine separate Funktionsanfrage, mit der ich mich nicht beschäftigt habe, da ich erst vor kurzem angefangen habe, Fische zu testen.

"fish: Beim Erwarten eines Befehlsnamens ist eine Umleitung aufgetreten. Fish lässt keine Umleitungsoperation vor einem Befehl zu."

Es scheint einfach zu sein, '^' in der Befehlsposition als Ersatz zu behandeln, da dies nicht mit der vorhandenen Funktionalität in Konflikt steht. Aber das ist ein separates Thema, es sollte nur erwähnt werden, da Sie Recht haben, dass es eine klare Definition dessen geben sollte, was '!!' (oder einfach nur Geschichtsersetzung im Allgemeinen) bedeutet.

Hier sind ein paar Beispiele, die ich verwende:

$ !!
$ some command `!!`
$ !keyword 
$ !123

Danke @gillham ,

Ich stelle auch fest, dass !! und !$ hat: https://github.com/fish-shell/fish-shell/wiki/Bash-Refugees

Bessere Lösung Nr. 5:
Fish ist so geschichtsorientiert, dass es sich (auf lange Sicht) lohnen kann, es manuell aus dem Verlauf zu löschen, wenn Sie Sudo vergessen oder Ihre Geschichte auf andere Weise mit einem nicht funktionierenden Befehl verunreinigt haben. Ja, das ist ein neues Terminal öffnen, bash ausführen und ~/.config/fish/fish_history bearbeiten. Fish hat mich immer wieder auf das falsche Kommando geführt, wenn ich daran gespart habe.

Was @nyarlys mkdir …; cd !$ Gewohnheit angeht , mache ich mkcd … :

function mkcd --description 'mkdir and cd'
        mkdir $argv[1]
        and cd $argv[1]
end

Beachten Sie, dass das Löschen aus der Geschichte keine Bash-Spielereien erfordert:

history --delete --prefix some_command

fish_config history können Sie dies auch per Point-n-Click tun.

Diese Funktionalität kann in Fish mit https://github.com/fish-shell/fish-shell/wiki/Bash-Style-History-Substitution- (!!-and-!$) recht gut repliziert werden – vielleicht das Problem soll geschlossen werden?

:-1: :-1: Es sei denn, ein vollständiger Bash-Kompatibilitätsmodus ist implementiert.

Ich denke, das ist ein rutschiger Hang. Wenn dies in fish implementiert ist, was ist mit einzelnen !s und was ist mit den Ksh-History-Features? Was ist mit $()? Fisch ist eine Schale im csh-Stil. Wenn sich die Leute nicht anpassen können/wollen, gibt es zsh...

Was ich aus dieser Diskussion als tl; dr für Leute, die das finden, geglänzt habe. (über 3 Jahre drin)

  1. Das Team möchte das Feature nicht entwickeln, weil es es nicht nutzt.
  2. Es gibt viele Leute, die das Feature wollen, weil sie es benutzen.
  3. Das Team scheint nicht bereit zu sein, die Funktion so zu implementieren, wie sie existiert, ist aber bereit, etwas zu machen
    das funktioniert ähnlich, wenn wir ihnen genügend Daten geben.
  4. Die Leute akzeptieren entweder, dass sie die Funktion nicht haben, implementieren eine Problemumgehung, die meistens funktioniert, oder verschieben
    auf ein anderes Projekt.

Ich gehöre zu den letzteren, obwohl ich hoffe, dass dies behoben wird, kann ich Fisch nicht vernünftig verwenden und diese Problemumgehung mit der Anzahl der von mir verwendeten Maschinen ohne erheblichen Aufwand hinzufügen (ich benötige unterschiedliche Konfigurationseinstellungen auf verschiedenen Maschinen), und ich verwende ! ! genug, wo es für mich eine Voraussetzung ist. Daher werde ich diese Diskussion in der Hoffnung verfolgen, dass Fisch eines Tages meinen Anwendungsfall erfüllen wird.

@tetra-archos Niemand hat noch einen konkreten Vorschlag gemacht, daher haben wir keine genaue Vorstellung davon, was "das Feature" ist. Da Ihnen dies offensichtlich sehr am Herzen liegt, wäre es, wenn Sie dazu geneigt wären, eine große Hilfe, wenn Sie als Ausgangspunkt vorschlagen würden, wie das Verhalten aussehen sollte. Andernfalls wäre es sinnvoll, zumindest die von Ihnen verwendeten Formulare zur Ersetzung der Historie aufzulisten.

Beachten Sie, dass das Ersetzungsverhalten der vollständigen Bash-Historie sehr komplex und auch konfigurierbar ist.

Da noch niemand einen konkreten Vorschlag gemacht hat, wissen wir nicht genau, was "das Feature" ist.

@tetra-archos: Das ist absolut kritisch. Bisher war das meiste davon 'Wir wollen "!!!"!' und vielleicht "!$" (was "letztes Argument des letzten Befehls einfügen" bedeutet). Aber es gibt viele Details, die herausgearbeitet werden müssen, wenn es (oder ein Ersatz) implementiert werden soll.

Beispielsweise:

  • Welchen Teil der Verlaufsersetzungen möchten Sie - ist es nur "letzten Befehl hier einfügen" ("!!") und "letztes Argument des letzten Befehls hier einfügen" ("!$") oder all die anderen Sachen wie " !!:s/string1/string2" (ich füge lieber einen allgemeinen "Ersetzen"-Modus wie "query-replace" von emacs oder ":s/" von vim hinzu, damit Sie dies auch tun können, _bevor_ der falsche Befehl ausgeführt wird)? Wie wäre es mit "fünften Befehl in meiner Historie einfügen" ("!5") - was ich nie ganz verstanden habe - oder "fünftletzten Befehl einfügen" ("!-5")? Wie wäre es mit " Wortbezeichnern " und " Modifikatoren "?
  • Möchten Sie, dass der Befehl sofort ausgeführt wird (dh Sie geben sudo !! , drücken die Eingabetaste und das Ganze wird sofort ausgeführt) oder wäre es in Ordnung, ihn zuerst eingefügt zu haben, damit Sie ihn noch einmal überprüfen können - das ist wie Bash mit der Option "histverify" (ich würde zu letzterem tendieren)?
  • Muss es "!!" sein? und "!$" oder kann es anders verwendet werden, dh ist Muskelgedächtnis Ihr Problem? Wenn dies jedoch der Fall ist, werden wir nie 100% sein, und die Ersetzung der Geschichte _ist_ ein eher kleiner Teil der Bash

Wenn es nur Muskelgedächtnis ist, können Sie auch Folgendes in Ihre fish_user_key_bindings einfügen:

bind '!!' 'commandline -i "$history[1]"'
bind '!$' 'history-token-search-backward'

(Das Problem, warum wir es wahrscheinlich nicht in die Standardbindungen aufnehmen sollten, ist, dass es dann wartet, nachdem Sie "!" eingegeben haben, um nach einem zweiten Zeichen zu suchen)

Ich denke, dass !! schlechte Praxis ist

Der Befehl sudo !! sagt niemandem, was die Shell tatsächlich ausführen wird.
wenn ich den p revious Befehl mit sudo am ' a nfang' ausführen möchte, tippe ich ein

^p ^a sudo

Ich schlage vor, eine Nachricht hinzuzufügen, um die Leute anzuweisen, die Zeilenbearbeitungsbefehle ^p und ^a zu verwenden, anstatt die Verlaufsfunktion zu verwenden.

!!: command not found, try 'Ctrl-p Ctrl-a' to prefix the previous command with 'sudo' or any other  prefix

Ich hasse auch !! . Eine einfachere Methode für fish_vi_mode als Alternative zu ^p ^a :

^v k I

Weil Sie eine Art, etwas zu tun, nicht mögen, macht es sie nicht weniger gültig.
Am 10. November 2015, 8:14 Uhr, schrieb "Ivan Tham" [email protected] :

Ich hasse !! auch. Eine einfachere Methode für fish_vi_mode als Alternative zu ^p
^a:

^vk ich


Antworten Sie direkt auf diese E-Mail oder zeigen Sie sie auf GitHub an
https://github.com/fish-shell/fish-shell/issues/288#issuecomment -155416048
.

Das Umgekehrte gilt auch.

Beide Seiten dieses Problems haben berechtigte Bedürfnisse und Bedenken. Ich denke, der Haupthindernis besteht darin, den _richtigen_ Weg zu finden, anstatt den schnellen und schmutzigen Weg

Ich stimme zu und ich habe nichts gegen die anderen Möglichkeiten, sie tun es einfach nicht
meinen (und natürlich anderen) Bedürfnissen entsprechen.
Am 10. November 2015 um 12:19 schrieb "Eric Mrak" [email protected] :

Das Umgekehrte gilt auch.

Beide Seiten dieses Problems haben berechtigte Bedürfnisse und Bedenken. Ich denke der
Hauptproblem besteht darin, den _richtigen_ Weg zu finden, anstatt den schnellen und
schmutziger Weg


Antworten Sie direkt auf diese E-Mail oder zeigen Sie sie auf GitHub an
https://github.com/fish-shell/fish-shell/issues/288#issuecomment -155494929
.

Um die in der ersten Diskussion erwähnten Ansätze zu wiederholen und ein wenig auszubauen: Ich habe festgestellt, dass Tastenbelegungen für mich besser funktionieren als "!!".

Ich habe diese Funktion geschrieben, die an einen Schlüssel gebunden werden kann (^S für mich, bind \cs 'prepend_command sudo' ). Wenn die Befehlszeile Inhalt enthält, wird sudo vorangestellt. Wenn kein Inhalt vorhanden ist, wird sudo dem letzten Element im Verlauf vorangestellt. Also wird aus sudo !!<Enter> jetzt ^S<Enter> .

function prepend_command
  set -l prepend $argv[1]
  if test -z "$prepend"
    echo "prepend_command needs one argument."
    return 1
  end

  set -l cmd (commandline)
  if test -z "$cmd"
    commandline -r $history[1]
  end

  set -l old_cursor (commandline -C)
  commandline -C 0
  commandline -i "$prepend "
  commandline -C (math $old_cursor + (echo $prepend | wc -c))
end

Einige Leute sagten, es sei zu kompliziert, so etwas zu konfigurieren. Eine mögliche Lösung könnte darin bestehen, etwas funktionell Ähnliches wie meine Funktion in Fisch einzufügen, sodass die Konfiguration zumindest zu einem Einzeiler wird.

Dies entspricht natürlich nicht anderen Anforderungen wie some_command --with-subshell-param (!!) .

@Ahti Das ist wirklich knallhart, habe es gerade zum Laufen gebracht, sieht aus, als wäre es ein Genuss, werde in einer Weile wieder berichten!

Ja, bisher schlägt das sudo !! . Einen Befehl zur Hälfte fertig zu haben und zu erkennen, dass er sudo passiert mir oft. ^s , sofortiges sudo Präfix!

Persönlich habe ich das !! nie in einem anderen Kontext als sudo !! , also stört mich das nicht.

Zufällig habe ich fish_vi_mode gerade ausprobiert und mag es sehr. Im Vi-Modus scheint ^s jedoch nicht mehr zu binden. Anregungen?

Okay, ich hatte die Tastenbelegung in config.fish. Ich fand #2254 und dann https://github.com/faho/fish-shell/commit/f7e8ad632a388d5f1c5eb4cfc33f3cdb1f7fd831 und dann http://stackoverflow.com/a/16675092/292408, was bestätigte, dass ich meine Bindungen in einem fish_user_key_bindings platzieren sollte Funktion, die es noch nicht gab.

Das hat funktioniert und jetzt, wenn ich mich im Vi-Befehlsmodus [N] befinde, funktioniert das Präfix wie erwartet.

Wir haben bereits Alt-P, um die aktuelle Pipeline im Pager auszuführen; Ich frage mich, ob wir auch Alt-S hinzufügen sollten?

Ich denke, @Ahti ist eine ziemlich elegante Lösung für das, wonach jeder gesucht hat. Direkt zu einer Tastenkombination, ohne sich um eine zufällige Erweiterung oder seltsame Randfälle sorgen zu müssen. Es platziert einfach Text, den Sie nach Belieben verwenden oder löschen können.

Ich mag sowohl @nyarly 's Substitution und @Ahti Zu den wichtigsten Bindungslösung.
Persönlich verwende ich !! nur im Kontext von sudo !!

Oje! Dieser Thread ist jetzt fast vier Jahre alt. Ich habe vor kurzem ǃǃ.com und ǃǃ.net gekauft (wobei Github anscheinend keine Hyperlinks zulässt, also kopieren und einfügen), falls jemand sie haben möchte.

Hallo! Das ist cool! @geoff-codes Wie hast du das gemacht?)

Sie haben vor kurzem damit begonnen, "internationalisierte" Domänennamen für .com und .net zuzulassen.
screen shot 2016-05-11 at 4 53 48 am

Der Support dafür ist derzeit jedoch noch ziemlich fehlerhaft. Zum Beispiel lassen sie mich ⵌⵑ.com registrieren, aber nicht ⵌǃ.com.

Ich wusste nicht, dass man sich bei !!.com registrieren kann, das ist verrückt.

Die Lehre aus diesem Problem: Wenn Sie jemals eine Unix-Shell schreiben, sollten Sie unbedingt sudo!! implementieren, denn ohne sie können die Leute anscheinend nicht leben.

Aber im Ernst, ich habe eine Nachricht von Leuten bekommen, die sagen, dass dies großartig funktioniert:

@bucaran Ja, das scheint tatsächlich so zu sein 😆.

Internationalisierte Domainnamen - IDNs:

https://en.wikipedia.org/wiki/Internationalized_domain_name

edit: zu langsam mit diesem post, und auch registrierungen wie diese @geoff-codes! Das muss eine kluge Investition sein. Eine zweistellige (sorta) .com!

#!.com hätte aber den Kuchen genommen. Gibt es eine Regel, die das für die com-TLD verbietet, oder sollte sie etwas lösen?

In der Bash für Windows-Präsentation hat der Präsentator etwas getippt
so was:

$> hallo Windows !!

Und ich hoffe, dass ihr alle erraten könnt, was passiert ist.
Am 11. Mai 2016 um 13:57 Uhr schrieb "Aaron Gyes" [email protected] :

Internationale Domainnamen - IDNs

Am 11. Mai 2016 um 4:44:58 Uhr schrieb Timophey ([email protected]):

Hallo! Das ist cool! @geoff-codes https://github.com/geoff-codes Wie ging es?
Sie
TU das?)


Sie erhalten dies, weil Sie diesen Thread abonniert haben.
Antworten Sie direkt auf diese E-Mail oder zeigen Sie sie auf GitHub an
<
https://github.com/fish-shell/fish-shell/issues/288#issuecomment -218435761


Sie erhalten dies, weil Sie einen Kommentar abgegeben haben.
Antworten Sie direkt auf diese E-Mail oder zeigen Sie sie auf GitHub an
https://github.com/fish-shell/fish-shell/issues/288#issuecomment -218438118

Also sollte ich auf Bash umsteigen?

@base698 - Ich habe schließlich ein Fischer-Plugin veröffentlicht, um die beiden häufigsten Anwendungsfälle der Geschichtsersetzung zu unterstützen: !! für den ganzen letzten Befehl und !$ für das letzte Argument. Ehrlich gesagt habe ich meistens meine eigenen Gewohnheiten gebrochen, weil die Befehlszeilenbearbeitung von fish so gut ist. Trotzdem mag ich es sehr

> which tool
> cat (!!)

um zum Beispiel ein Skript zu untersuchen

Sie können das Plugin mit fisher install nyarly/fish-bang-bang installieren, sobald Sie fisherman installiert haben.

Der Vollständigkeit halber (und um ein richtiges Beispiel zu geben)
Hier ist ein Screenshot des YouTube-Videos, das ich erwähnt habe. Dies ist eine der großartigen Funktionen von '!!' Muster, das jetzt auch unter Windows verfügbar ist.
bangpatternbash

https://www.youtube.com/watch?v=2dB0igTfhfg&feature=youtu.be&t=760

Er will git commit -a -m "Rawr!!" hinrichten

ergibt git commit -a -m "Rawrclear"

So sehr ich Fisch liebe, !! ist einfach zu nützlich. Ich bin mir nicht sicher, sudo !! aber auch um vorherige Informationen an neue Befehle weiterzugeben. Beispielsweise:

find . -name something | grep "pattern" dann würde ich mit dem Muster spielen, bis ich bekomme, was ich will.
Dann würde ich es an so etwas weitergeben (someCommand !! ). Derzeit erfordert dies bei Fischen zu viele Schritte. Die Workarounds funktionieren bei mir nicht gut genug.

zsh erweitert !! damit Sie es bearbeiten können. Also muss ich zurück zu zsh.

Wenn Sie fisherman verwenden (was Sie unbedingt sein sollten), können Sie nyarly/fish-bang-bang installieren und erhalten überall im Befehl Erweiterungen von !! und !$

@nyarly Ja, das habe ich versucht. Aber ich mag nicht, wie es sofort nach der Eingabe des zweiten ! wird. Es fühlte sich unangenehm an. zsh fühlt sich besser an, weil es erweitert wird, nachdem Sie ein Leerzeichen eingegeben oder die Eingabetaste gedrückt haben.

EDIT: Egal, ich konnte es nicht. Ich hatte vergessen, wie nervig es war, ZSH so einzustellen, wie ich es haben wollte. Das Plugin von nyarly muss es tun.

Ich bin so froh, dass dies nicht implementiert wurde! Es verstößt gegen das Fish- Gesetz der Orthogonalität und das Gesetz des Benutzerfokus. Bashs History-Ersetzung erfordert zu viel Nachdenken über !! und !$ und vielleicht s^ . Deshalb verwenden die Leute nur diese. Die Lösung von Fish ist interaktiver, was ein allgemeineres Ersetzen von Argumenten ermöglicht. Es ist effizient genug in Bezug auf die Anzahl der Schläge und genauso effizient mit !! .

Einige Benutzer vermissen !! und !$ und möchten nicht anders lernen. Sollte Fish genau diese Merkmale als Randfälle implementieren (siehe Gesetz der Orthogonalität)? Oder die gesamte Bash-Historie ersetzen? Oder alle Features von anderen Shells? Alle Funktionen, die den Benutzern einfallen?

Hier ist eine Lösung für alle, die etwas kopieren und einfügen möchten:

lege dies in ~/.config/fish/functions/fish_user_key_bindings.fish

function bind_bang
  switch (commandline -t)
  case "!"
    commandline -t $history[1]; commandline -f repaint
  case "*"
    commandline -i !
  end
end

function bind_dollar
  switch (commandline -t)
  case "!"
    commandline -t ""
    commandline -f history-token-search-backward
  case "*"
    commandline -i '$'
  end
end

function fish_user_key_bindings
  bind ! bind_bang
  bind '$' bind_dollar
end

Die URL von https://github.com/fish-shell/fish-shell/issues/288#issuecomment -7869918 verlinkt ist, ist defekt. Könnten Sie Ihren Kommentar bearbeiten, um ihn für die Leser dieses noch offenen Problems zu korrigieren?

Ich habe seinen Kommentar bearbeitet, um darauf hinzuweisen, wo wir die FAQ jetzt hosten.

Jetzt hat Fisch && und || (https://github.com/fish-shell/fish-shell/issues/4620) Es ist so nah daran, ein vollständiger Ersatz von bash zu sein!

Ich bin wirklich verwirrt --

Die Schale, die ihr Designziel Nummer 1 erklärt, ist also:

1. Everything that can be done in other shell languages should be possible to do in fish

... erlaubt mir nicht , eine der in jeder anderen Shell häufig verwendeten Aktionen zu tun?

Die Fisch-FAQ sagt, dass Benutzer es stattdessen tun sollten

First press Up, then Home, then type "sudo ".

Mann, was für eine Strecke. Wie viele Benutzer haben in den letzten sechs Monaten aus irgendeinem Grund auf die Schaltfläche "Home" geklickt? Bei dieser Länge könnte ich argumentieren, dass das automatische Parsen von Befehlen aus der Manpage nicht orthogonal genug ist, wenn man einfach die verdammte Man-Datei öffnet und sie selbst findet.

@andysalerno
Die Aktion, die Sie ausführen möchten, besteht darin, den vorherigen Befehl mit vorangestelltem sudo auszuführen
und Fisch bietet diese Funktionalität
obwohl statt eintreten
First type "sudo ", then press shift+1, then press shift+1
ich mache
ctrl+p, ctrl+a, type "sudo "
das funktioniert in bash genauso
Nachdem Sie die FAQ erwähnt haben, habe ich sie noch einmal überprüft und jemand hat den Teil über diese Verknüpfung entfernt, der jetzt fehlt. (Ich habe https://github.com/fish-shell/fish-shell/pull/3879 erstellt, um dies zu beheben)
Der Grund, warum diese Verknüpfung funktioniert, liegt darin, dass sie der readline Bibliothek folgt, die weithin für die Zeilenbearbeitung implementiert oder nachgeahmt wird.
Wenn ich die Zeit finde, werde ich eine Pull-Anfrage erstellen, um dies zu den FAQ hinzuzufügen
Ich kann Ihre Frustration verstehen, die Verwendung der Taste Home wirklich keine Option, da sich diese Taste auf vielen Tastaturen an einer anderen Stelle befindet (zB auf allen meinen 3 Tastaturen).

thx, dass du das nochmal ansprichst. Ich denke, es ist wichtig, eine einfache (nur Modifikator- und Buchstabentasten, keine Home-Taste, keine Pfeiltasten), schnelle (nicht zu viele Tastenanschläge) und _dokumentierte_ Vorgehensweise zu haben.

Super, ich hatte keine Ahnung von Strg+P! Das gefällt mir noch besser als !!.

bearbeiten:
Gibt es eine andere Möglichkeit, den zuletzt ausgeführten Befehl erneut auszuwerten? Ich ertappe mich dabei, dass ich so etwas oft in der Bash mache:

> man -w fish  # prints location of man file for fish
/usr/share/fish/man/man1/fish.1

> less $(!!)

Es ist nicht so prägnant, aber Sie können dies mit eval und der History-Variablen tun:

> man -w fish
/usr/share/fish/man/man1/fish.1

> less (eval $history[1])

Aber ein besserer Weg, dies zu tun, ist die Verwendung von Alt-P. Fish leitet Befehlsausgaben an less weiter, wenn Sie nach der Eingabe des Befehls Alt-P drücken:

> man fish alt-p > man fish ^&1 |less;

Ich verstehe nicht alle Anti-Bang-Leute.. Es gibt so viele Fälle, in denen das Knall-Zeug lächerlich schneller und bequemer ist als solche "Workarounds" wie:
First press Up, then Home, then type "sudo ".

Bang-Befehle sind verdammt magisch, wenn man sich erst einmal daran gewöhnt hat. Ich hoffe wirklich, dass die Fisch-Jungs ihre Meinung ändern und sie wieder hinzufügen. Mindestens ein paar der guten, wie:

!!
!WORD
!WORD:p
!:n
!$
!^
!n:n
!:gs/MISTAKE/FIX
!#
!#^

Fisch ist aber ganz nett, mach weiter so

Gibt es eine unterstützte Möglichkeit, den letzten Befehl im Verlauf auszuführen? Es macht mir nichts aus, es eingeben zu müssen, weil ich nur ein Makro verwende, um den Befehl in meinem anderen tmux-Fenster aufzurufen. Aber mein Anwendungsfall ist, dass ich nur in der Lage sein möchte, so etwas zu tun:

$ echo "hi"
hi
$ x
hi
$ x
hi

Ich habe es mit eval $history[1] versucht, aber der zweite Anruf explodiert. Das ist das Nützliche am Befehl !! . Was nicht wirklich akzeptabel ist, ist die Verwendung der Pfeiltasten. Gibt es einen Befehl in fish, der diesen Anwendungsfall unterstützt?

Das Beste, was mir im Moment einfällt, ist, ein führendes Leerzeichen zu verwenden, das verhindert, dass es zum Verlauf hinzugefügt wird:

$ function x ; eval $history[1] ; end
$ echo "hi"
hi
$  x    # note leading space
hi
$  x
hi

es ist sicherlich nicht großartig, ich weiß. In diesem einfachen Fall scheint die Bindung history-search-backward jedoch ausreichend zu sein? Das sind standardmäßig Pfeiltasten, aber Sie können sie hinzufügen oder ändern.

Oh! Das ist eine gute Idee, ich habe nicht daran gedacht, das führende Leerzeichen zu verwenden. Das muss ich mal versuchen.

Aktualisieren :
Das hat für meinen Anwendungsfall perfekt funktioniert. $ eval $history[1] #note extra leading space

Dies ist wahrscheinlich der Grund, warum ich nicht bei Fish bleiben kann. Obwohl es elegant und einfach ist, macht es das Fehlen von Standard-Shortcuts für viele Dinge unproduktiv:

Erster Gegenstand. Ich möchte den vorherigen Befehl mit sudo wiederholen:

sudo !!

1) Drücken Sie die Up-Taste
Problem, ich muss auf vielen Tastaturen nach der Up-Taste greifen. Ungefähr ein Viertel der Zeit verpasse ich es und muss dann auf die Tastatur hinunterschauen, um genau zu sehen, wo es ist, und wahrscheinlich alles reparieren, was der Fehler durcheinander gebracht hat. Dann...
2) Drücken Sie Home oder Strg-A
Home ist eine andere Strecke und befindet sich an so vielen verschiedenen Orten auf verschiedenen Tastaturen, dass ich danach suchen muss. Strg-A kommt natürlicher, damit das funktioniert, denke ich.
3) Geben Sie 'sudo' ein und drücken Sie die Eingabetaste.
Ok, das sind nur sieben Tastenanschläge, aber einer davon ist fehleranfällig und führt dazu, dass mein Workflow zu einem großen Prozentsatz der Zeit unterbrochen wird.

Als nächstes möchte ich das vorherige letzte Argument aufgreifen:

ls -l /etc/network/iptables
cat !$

Oder mit Fisch:
1) Geben Sie 'Katze' ein
2) Alt-Up
Ok, das ist wieder nicht ganz natürlich. Ich drücke selten die Alt-Taste und mehr als oft die Super-Taste (Cmd / Windows / was auch immer) daneben, was den Kontext ändert, in dem ich mich befinde.

Fisch braucht wie alle großen Konkurrenten eine bessere Geschichtserweiterung. Sein Mangel ist eine Verringerung der Produktivität für High-End-Benutzer.

@wrecklass Weil ich sudo !! nicht aus meinen Fingern bekommen konnte, habe ich https://github.com/nyarly/fish-bang-bang geschrieben , was ich dir vorschlagen werde.

Außerdem, IIRC, fische Schiffe mit Alt-S für "prepend sudo", was für den letzten Verlaufseintrag funktioniert, wenn Ihr Befehl derzeit leer ist, genauso wie Alt-P | less anhängt.

Und nur weil es immer wieder auftaucht ("zB warum funktioniert das nicht !! bei Fischen so wie es Bash macht"), möchte ich sagen: Die Sonderbehandlung des Zeichens ! war eines der Dinge, die hat mich von bash vertrieben. Als langjähriger Fischkonsument wäre ich sehr enttäuscht, wenn dieses Verhalten übertragen würde, um eine lautstarke Minderheit zu besänftigen.

sudo !! ist so eine Standardsache. Ich verstehe, dass Fish sich sehr bemüht, von der alten Bash-Syntax wegzukommen, aber indem wir legitim nützliche Funktionen zugunsten der persönlichen Philosophie verdrängen, denke ich, dass wir den Fortschritt stoppen.

@ClickSentinel , aus höre ich auf, fish und bleibe bei bash . :smiley:

Unser derzeitiger Plan ist es, globale Abkürzungen zu implementieren, die dann auch "!!" unterstützen können. et al. Siehe dazu #5003.

Dafür schließe ich dieses Thema, da es seinen Lauf genommen hat.

@tukusejssirs und @ClickSentinel , haben Sie versucht, den Code unter https://github.com/fish-shell/fish-shell/issues/288#issuecomment -306212011 zu Ihrer Konfiguration hinzuzufügen?

Ich habe seit mehreren Jahren eine Variante davon (modifiziert von einem Problem (dieses Problem vielleicht?) Ich muss in meiner Variante eine Aufwärts-Token-Suche mit der Zeichenfolge vor dem !$ . Dies ist eines der Dinge, die ich am meisten ärgere, wenn ich in Bash arbeite.)

Meine Variante (oder vielleicht habe ich die Variante geklaut...kann mich nicht erinnern :man_shrugging: ):

function bind_bang
    switch (commandline --current-token)[-1]
    case "!"
        # Without the `--`, the functionality can break when completing
        # flags used in the history (since, in certain edge cases
        # `commandline` will assume that *it* should try to interpret
        # the flag)
        commandline --current-token -- $history[1]
        commandline --function repaint
    case "*"
        commandline --insert !
    end
end

function bind_dollar
    switch (commandline --current-token)[-1]
    # This case lets us still type a literal `!$` if we need to (by
    # typing `!\$`). Probably overkill.
    case "*!\\"
        # Without the `--`, the functionality can break when completing
        # flags used in the history (since, in certain edge cases
        # `commandline` will assume that *it* should try to interpret
        # the flag)
        commandline --current-token -- (echo -ns (commandline --current-token)[-1] | head -c '-1')
        commandline --insert '$'
    case "!"
        commandline --current-token ""
        commandline --function history-token-search-backward


    # Main difference from referenced version is this `*!` case
    # =========================================================
    #
    # If the `!$` is preceded by any text, search backward for tokens
    # that contain that text as a substring. E.g., if we'd previously
    # run
    #
    #   git checkout -b a_feature_branch
    #   git checkout master
    #
    # then the `fea!$` in the following would be replaced with
    # `a_feature_branch`
    #
    #   git branch -d fea!$
    #
    # and our command line would look like
    #
    #   git branch -d a_feature_branch
    #
    case "*!"
        # Without the `--`, the functionality can break when completing
        # flags used in the history (since, in certain edge cases
        # `commandline` will assume that *it* should try to interpret
        # the flag)
        commandline --current-token -- (echo -ns (commandline --current-token)[-1] | head -c '-1')
        commandline --function history-token-search-backward
    case "*"
        commandline --insert '$'
    end
end

function fish_user_key_bindings
    bind ! bind_bang
    bind '$' bind_dollar
end

Danke @scooter-dangle das funktioniert noch besser als #228

Es gibt Fälle, in denen Fish eine idiomatischere Möglichkeit bietet, einige Maßnahmen zu ergreifen:

LANG=C :
fish: Unsupported use of '='. To run ':' with a modified environment, please use 'env LANG=C :…'

Vielleicht könnte !! auch standardmäßig eine solche Nachricht generieren, die einen alternativen, idiomatischeren Weg vorschlägt?

Der Vorschlag sollte jedoch genauso effizient sein. Vergleichen:

  • sudo !!<enter> , alles aus der Grundposition der Hände auf der Tastatur
  • <up><home>sudo <enter> , wie in Fishs FAQ vorgeschlagen, was je nach Position mehr oder weniger Handbewegungen zu erfordern scheintundsind auf der Tastatur.
  • <C-p><Ca>sudo <enter> , zugänglich ohne die Hände zu bewegen , das auch mit den Standardeinstellungen von Bash, ZSH und vielleicht mehr funktioniert, sodass Benutzer neue Gewohnheiten annehmen können, die portabel sind, wenn sie mit anderen Shells umgehen müssen.

Für !$ <alt-.> scheint es in Ordnung zu sein,

@psychoslave Bitte alle alten Probleme zu kommentieren, insbesondere geschlossene.

Schließe auch dieses ab. Es wurde ungefähr fünfzigmal beantwortet.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen