Fish-shell: support de l'expansion de l'historique (par exemple, bash's !!, bang bang et !$, bang dollar, jetons)

Créé le 20 août 2012  ·  98Commentaires  ·  Source: fish-shell/fish-shell

Il semble que le double-bang ne fonctionne pas et soit en quelque sorte interprété comme un programme que sudo essaie en vain de localiser. Cela se produit sur Ubuntu 12.04 LTS avec fish-shell compilé à partir des sources.

Étapes à reproduire :

  1. Exécutez n'importe quelle commande :

    $ ls

  2. Exécutez la commande précédente en tant que root :

    $ sudo !!
    sudo : !! : commande introuvable

    Comportement attendu:

La commande sudo !! exécute la commande précédemment exécutée ( ls ) en tant que root.

J'ai également vérifié que le problème n'était pas causé par sudo en suivant les étapes de reproduction dans bash, qui se sont comportées comme prévu.

Notez également qu'une version antérieure de fish-shell sur Mac OS X 10.7 n'avait pas ce problème et que sudo !! fonctionnait comme prévu.

duplicate

Commentaire le plus utile

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

sudo !! pour les personnes qui utilisent encore !! pour une raison quelconque.

Tous les 98 commentaires

Il est discuté dans la FAQ de la documentation : http://fishshell.com/docs/current/faq.html#faq -history

Merci pour la clarification.

Je comprends la justification de la suppression des personnages de l'histoire. Cependant, même si je comprends la raison de cela et qu'il est possible d'utiliser Ce et Ca au lieu de End et Home, pour de nombreux utilisateurs, en particulier ceux qui en ont l'habitude !! et ceux sur un ordinateur portable qui n'ont pas de touches Home et End, c'est quand même beaucoup plus facile de taper sudo !! que Up+C-a+sudo.

Envisageriez-vous toujours de restaurer la fonctionnalité des jetons de substitution d'historique ?

Puisque c'est un cas rare où !! est plus confortable à utiliser, essayez la fonction suivante :

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

qui s'appelle juste par "sudo !!".

Ou l'autre possibilité que j'utilise :

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

Ensuite, en appuyant sur MS, j'exécute la ligne de commande actuelle avec sudo juste devant.
Ou en modifiant cet exemple, vous pouvez créer une fonction qui mettra la ligne de commande précédente dans la ligne de commande actuelle et la liera par exemple à '\e!'. Cette approche est meilleure que la simple utilisation de '!!' car cela vous donne la possibilité de voir et de mettre à jour la ligne de commande avant l'exécution.

J'ai fait une légère variation de la dernière commande :

  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"

Il enregistre la position du curseur au lieu de l'exécuter directement.

!$ serait aussi bien d'avoir

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

sudo !! pour les personnes qui utilisent encore !! pour une raison quelconque.

Merci. Il y a un nombre très important de personnes qui utilisent sudo !! donner que cette syntaxe est prise en charge par de nombreux autres shells, y compris bash et zsh. sudo !! est plus facile à taper que d'utiliser les touches d'accueil et de fin, car ces touches sont plus éloignées.

Je suggérerais que la fonction ci-dessus soit incluse avec fish-shell par défaut.

!! est un bon candidat pour une abréviation (#731)

Exprimer son soutien pour !! et les raccourcis associés. Cela ne fait pas de mal de l'ajouter et on a l'impression que le poisson ne fait que pousser la philosophie personnelle de ses utilisateurs.

Ma réflexion actuelle sur la solution idéale est que !! devrait être une abréviation (#731), et nous implémentons des signatures de fonction (#478) pour prendre en charge les sous-commandes (une commande qui prend une commande, comme sudo). Ensuite, les abréviations se développent dans les positions de sous-commande, de sorte que 'sudo !!' va s'étendre.

m'ajoutant

Bien qu'elle soit ancienne, c'est une fonctionnalité qui devrait vraiment venir par défaut dans Fish. Il n'y a aucune raison de ne pas l'avoir - si vous ne voulez pas l'utiliser personnellement, c'est bien, mais avoir une commande supplémentaire ne fait vraiment de mal à personne - les gens aiment faire les choses de différentes manières.

Le chemin !! est implémenté dans la plupart des shells fait du mal aux gens. Par exemple, considérons cette commande :

echo fish is great!!

dans bash / zsh / tcsh, cela fera quelque chose d'inattendu et d'horrible, car le !! est la syntaxe magique. C'est le genre d'interactions étranges que les poissons s'efforcent d'éviter.

Ma suggestion était de mettre en œuvre !! pas comme syntaxe magique, mais comme alias. Cela signifie qu'il ne ferait que quelque chose de spécial en "position de commande" - il ne se développera pas en arguments. Cela réduit également l'ensemble des fonctionnalités du poisson, ce qui est souhaitable.

Pour rendre cela utile, nous aurions besoin d'enseigner à fish les sous-commandes, avec sudo étant l'exemple le plus courant, mais aussi time , strace , etc. fish développerait alors les alias en "position de sous-commande", ce qui est une fonctionnalité intéressante et utile en soi.

La solution que vous proposez s'effondre lorsque vous considérez sudo echo fish is great!! . Le même argument peut être fait pour toutes les syntaxes : echo I really like fish (the shell)! n'est-il pas également source de confusion ? Je crains également qu'une liste de "sous-commandes" ne soit impossible à maintenir et réduise la flexibilité.

Avec les alias, seules les commandes sont développées, et fish saurait quels arguments sont des (sous-)commandes et lesquels ne le sont pas. Ainsi, sudo echo fish is great!! n'effectuerait pas l'expansion de la dernière commande, mais transmettrait à la place un "super !!" littéral. à sudo (et donc à echo). Je prétends que c'est ce que l'utilisateur attendait. Voir la discussion sur les abréviations (#731) et les signatures de fonction (#478) pour la conception et la justification.

SirCmpwn a raison de dire que le fait d'exiger des signatures de fonctions complètes est un inconvénient de l'approche d'alias, et aussi que d'autres éléments syntaxiques prêtent à confusion. Des exemples concrets incluent le désagrément de l'extension des accolades avec git (#434) ou des caractères génériques (#967, entre autres). La syntaxe a un coût élevé, et nous essayons d'éliminer la syntaxe lorsqu'elle est redondante avec d'autres fonctionnalités (par exemple #354).

Quoi qu'il en soit, c'est mon argument pour pourquoi soutenir !! en tant qu'élément syntaxique élémentaire est un no-go. Cependant, je suis prêt à l'introduire d'une manière qui ne nécessite pas de modifier la syntaxe du poisson.

Je pense que la comparaison avec {} est mauvaise. Chez les poissons, les accolades fonctionnent différemment des autres coquilles. Les gens ne trébuchent dessus que lorsqu'ils s'attendent à ce que cela fonctionne comme une fête et des amis. Le !! la syntaxe devrait fonctionner de la même manière que les autres shells courants. Aussi, !! n'est pas quelque chose que je m'attendrais à voir dans les commandes assez souvent pour causer un problème. En fait, je m'attendrais au nombre de fois où les gens ont essayé et échoué à utiliser !! avec des poissons dépasse de loin le nombre de fois où quelqu'un a utilisé un littéral !! dans une commande.

Je prétends que ! est source de confusion dans d'autres shells, et ce serait mieux s'il n'était pas implémenté de cette façon. Par exemple, sur http://codegolf.stackexchange.com/a/17776/3103, j'ai mis un simple "Hello, world!" programme écrit en shell UNIX qui échoue à cause de ! (dans la question Ridiculous Runtime Errors). Il a même obtenu sept votes positifs, donc je peux imaginer que cette fonctionnalité peut être surprenante lorsque vous ne voulez pas l'utiliser.

Cependant, !! en soi devrait convenir, car à quelle fréquence l'utilisateur écrira !! tant que jeton ? Là encore, l'ajout de !! encouragerait l'ajout d'autres modèles de substitution d'historique, dont certains pourraient être ennuyeux.

En m'ajoutant, je viens de rencontrer mon premier week-end avec du poisson. Devrait certainement être pris en charge.

Je m'ajoute - j'en ai besoin.

Pour ceux qui le souhaitent, la fonction et les liaisons mentionnées précédemment dans la discussion m'ont donné un flux de travail plus facile pour ajouter sudo ou exécuter la dernière commande par rapport à la commande typique sudo !! .

Vous devriez leur donner un essai. Cela m'a fait revoir mes configurations readline et zsh pour avoir des liaisons similaires.

Il transforme sept frappes (dont deux décalées) en une seule liaison.

Indépendamment de ce que _vous_ aimez - est-ce qu'il y a vraiment une raison pour ça !! ne pas être soutenu ? Tout le monde a des choses différentes qui fonctionnent pour eux, et bien que certaines personnes puissent aimer utiliser la flèche vers le haut, beaucoup de gens aiment utiliser !!, et honnêtement, pourquoi serait-ce une mauvaise chose ? Ceux qui n'en veulent pas n'ont pas à l'utiliser.

Ce n'est sûrement pas si difficile à mettre en œuvre ?...

Oui, je sais que vous pouvez le pirater avec les scripts fish, mais cela ne fonctionne _pas_ de la même manière que dans bash ou des shells similaires, ce qui était assez pratique la plupart du temps.

Voir mon commentaire ci-dessus pour savoir pourquoi je ne veux pas introduire cela de la manière dont bash et zsh le font (en tant que nouvel élément syntaxique), et ma proposition pour une manière de le faire qui respecte la philosophie du poisson.

L'argument du "poisson d'écho est génial !!" c'est mieux que d'utiliser '!!' pour l'histoire est un peu faible, mais je comprends le point. On dirait qu'un simple "set shell_history advanced" ou quelque chose pourrait le permettre aux personnes prêtes à risquer "echo fish is great !!!" obtenir un message d'erreur.

Néanmoins, mon cas d'utilisation de '!!' est similaire mais pourrait être évité avec une amélioration des fonctionnalités peut-être.

Par exemple sur mon mac avec bash :
$ brew mise à jour
$ infusion périmée
$ récupération de bière !!

J'utilise donc un peu régulièrement la sortie de la commande précédente pour une nouvelle commande.
Avec du poisson je peux faire ça :
$ récupération d'infusion (infusion obsolète)
Maintenant, à un moment donné, ce sera peut-être une suggestion que je pourrai utiliser, mais ce dont j'ai vraiment besoin, c'est de pouvoir rechercher l'historique dans le bloc ().
par exemple:
$ brew chercher (bre)

Malheureusement, même si fish est assez fier d'utiliser () pour les sous-commandes au lieu de "confondre" les backticks et autres, il ne les traite pas vraiment comme tels jusqu'à ce que vous appuyiez sur Entrée. C'est du moins ce que je vois.

Si fish autorisait une recherche d'historique après le premier '(' (alias une sous-commande), je pense qu'il serait plus facile de ne pas avoir de ! manipulation d'historique.

Si je comprends la suggestion, c'est que lorsque vous appuyez sur la flèche vers le haut, il ne devrait effectuer le remplacement de l'historique que dans la sous-commande la plus interne au lieu de toute la ligne de commande.

:-1:

Je supporte toujours la simple implémentation du style bash !! .

Je préférerais :up_arrow:, Ctrl+p et la recherche dans l'historique des commandes fonctionnant dans des positions de sous-commande plutôt que d'introduire !!

L'ensemble de l'API d'historique des autres shells est suffisamment déroutant pour que les gens ne s'en souviennent généralement !! à partir de cela.

Correct. Ce serait pratique et remplacerait assez facilement le '!!' Ou !utilisation du mot-clé.

J'aime vraiment l'idée que !! soit une abréviation.

Il semble que les abréviations dans les versions nocturnes les plus récentes n'autorisent que les abréviations dans la position de commande, j'espère qu'elles seront mises à jour pour pouvoir être utilisées comme arguments pour des cas comme celui-ci.

Cette fonctionnalité est surestimée, utilisez simplement sudo cmd ou eval sudo $cmd .

@bucaran je ne suis pas exactement. Le !! est pour la vitesse, comment faire correspondre la vitesse de !! avec cmd ?

Voulez-vous dire créer une variable appelée $cmd qui est la dernière commande ? Ce n'est pas une variable native.

Merci

@mdsib Oui, je pense que je me souviens qu'il y a eu une discussion dans un autre numéro sur le fait de ne pas autoriser les abréviations dans la position d'argument. À l'époque, il était préférable de ne pas mettre cela en œuvre. Cela changerait certainement cela.

Je pense que le point à retenir de ce fil est que cela ne se produira pas de si tôt, et je devrais me désinscrire de ce problème Github et passer à zsh. Adios !

Non pas parce que !! n'est pas là, mais parce qu'un problème Github pour une fonctionnalité assez simple est ouvert depuis 3 ans sans être implémenté en raison de BS philosophiques.

C'est drôle de voir des gens essayer de convaincre les autres qu'une fonctionnalité n'est pas un gros problème. Bien sûr, vous n'en voulez pas, alors vous vous en fichez. C'est comme si vous essayiez de convaincre les gens de ne pas aimer le vert parce que vous pensez que le bleu est meilleur.
Néanmoins, étant donné qu'une fonctionnalité "simple" ne semble pas pouvoir s'intégrer, quelqu'un devrait peut-être simplement pêcher s'il aime les fonctionnalités existantes mais souhaite en ajouter quelques-unes de plus. On dirait que ça irait quelque part plus vite.

J'ai fait ~/bin/!! ça ressemble à ça :

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

À court terme, cela m'aide à contourner la fonctionnalité manquante et ma tendance à taper !!.
J'ai aussi fait ~/bin/!vi :

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

Pas idéal, mais suffisant pour que ma coquille ait tendance à faire ce que j'attends plus souvent maintenant.

@SirCmpwn N'est-il pas évident pour moi que !! est une fonctionnalité simple. Par exemple, bash prend en charge ceci :

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

Si cette utilisation de !! être soutenu ou non ? Les utilisateurs qui disent "le poisson devrait supporter !!" peut avoir des idées différentes de ce que cela signifie.

Cela vous tient à cœur, alors je vous encourage (ou n'importe qui) à rédiger une proposition pour savoir comment !! fonctionnerait dans fish (la sémantique, pas la mise en œuvre). Quelle syntaxe serait prise en charge exactement ? Comment cette expansion serait-elle liée à d'autres types d'expansion, comme l'expansion variable ou l'expansion de processus ? Comment le fractionnement des arguments se produirait-il dans la chaîne développée ? Pourriez-vous utiliser des échappements pour l'empêcher?

Ceci est une demande sincère. Une fonctionnalité n'est pas définie par un seul cas d'utilisation ; nous avons besoin d'une proposition concrète à discuter.

Si vous dites "Je veux que cette affaire fonctionne, et je me fiche de savoir comment", alors c'est bien et valide. Mais quelqu'un doit régler les détails avant que quoi que ce soit puisse être mis en œuvre.

A court terme, un plan concret est d'implémenter des alias globaux et ensuite de faire !! en un. Une alternative consiste à fusionner le travail docopt, à donner une signature de fonction pour sudo, puis à faire !! dans un alias régulier. Dans quelle direction nous allons dépend de si nous pensons !! devrait s'étendre partout, ou juste en position de commandement.

@ridiculousfish Vous avez tout à fait raison de dire qu'un '!!' la demande de fonctionnalité doit être assez détaillée. Je n'ai jamais utilisé l'exemple particulier que vous avez donné car je fais toujours quelque chose comme ça :
$ ls -l un_fichier_long.txt
$ ^ls-l^chat

Evidemment cela ne fonctionne pas non plus. Ce serait une demande de fonctionnalité distincte pour moi, dont je ne me suis pas soucié puisque je n'ai commencé à tester des poissons que récemment.

"fish : redirection rencontrée lors de l'attente d'un nom de commande. Fish n'autorise pas une opération de redirection avant une commande."

On dirait qu'il serait facile de traiter '^' dans la position de commande comme une substitution car cela n'entre pas en conflit avec les fonctionnalités existantes. Mais c'est un problème distinct, il suffit de le mentionner car vous avez raison de dire qu'il devrait y avoir une définition claire de ce que '!!' (ou simplement la substitution de l'histoire en général) signifie.

Voici quelques exemples que j'utilise :

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

Merci @gillham , des informations comme celles-ci sont très utiles lors de la conception d'une fonctionnalité.

Je note également que @nyarly a une solution de contournement astucieuse pour !! et !$ ici : https://github.com/fish-shell/fish-shell/wiki/Bash-Refugees

Meilleure solution n°5 :
Fish est tellement axé sur l'histoire que lorsque vous avez oublié sudo ou pollué votre historique avec une commande qui ne fonctionne pas, cela peut valoir la peine (à long terme) de l'effacer manuellement de l'historique. Oui, c'est ouvrir un nouveau terminal, exécuter bash et éditer ~/.config/fish/fish_history. Fish m'a conduit sur le mauvais commandement maintes et maintes fois, alors que j'ai lésiné là-dessus.

Quant à l' habitude mkdir …; cd !$ @nyarly, je fais mkcd … :

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

Notez que l'effacement de l'histoire ne nécessite pas de manigances bash :

history --delete --prefix some_command

fish_config history vous permet également de le faire par pointer-et-cliquer.

Cette fonctionnalité peut être assez bien répliquée dans Fish en utilisant https://github.com/fish-shell/fish-shell/wiki/Bash-Style-History-Substitution- (!!-and-!$) -- peut-être le problème doit être fermé ?

:-1: :-1: Sauf si un mode de compatibilité bash complet est implémenté.

Je pense que c'est une pente glissante. Si cela est implémenté dans fish, qu'en est-il des single !s, et qu'en est-il des fonctionnalités d'historique de ksh ? Qu'en est-il de $() ? Le poisson est une coquille de style csh. Si les gens ne peuvent/ne veulent pas s'adapter, il y a zsh...

Ce que j'ai tiré de cette discussion en tant que tl; dr pour les personnes qui trouvent cela. (plus de 3 ans)

  1. L'équipe ne veut pas développer la fonctionnalité, car elle ne l'utilise pas.
  2. Il y a beaucoup de gens qui veulent la fonctionnalité, parce qu'ils l'utilisent.
  3. L'équipe ne semble pas disposée à mettre en œuvre la fonctionnalité telle qu'elle existe, mais est prête à faire quelque chose
    cela fonctionne de la même manière si nous leur donnons suffisamment de données.
  4. Les gens acceptent de ne pas avoir la fonctionnalité, mettent en œuvre une solution de contournement qui fonctionne principalement ou déménagent
    sur un autre projet.

Je suis l'un de ces derniers, même si j'espère que cela sera résolu, je ne peux pas raisonnablement utiliser du poisson et ajouter cette solution de contournement avec le nombre de machines que j'utilise sans effort considérable (j'ai besoin de différentes configurations de configuration dans différentes machines), et j'utilise ! ! assez là où c'est une exigence pour moi. Je vais donc suivre cette discussion dans l'espoir qu'un jour le poisson réponde à mon cas d'utilisation.

@tetra-archos Personne n'a encore avancé de proposition concrète, nous n'avons donc pas une idée précise de ce qu'est "la fonctionnalité". Étant donné que vous êtes manifestement très attaché à cela, si vous étiez si enclin, ce serait d'une grande aide si vous deviez suggérer ce que le comportement devrait être, comme point de départ. A défaut, il serait utile de lister au moins les formulaires de substitution d'historique que vous utilisez.

Notez que le comportement de substitution de l'historique complet de bash est très complexe et également configurable, donc "faire simplement ce que fait bash" est un non-démarreur.

Personne n'a encore avancé de proposition concrète, nous n'avons donc pas une idée précise de ce qu'est « la fonctionnalité ».

@tetra-archos : C'est absolument essentiel. Jusqu'à présent, la plupart de ces messages ont été "Nous voulons" !!!!!!" et peut-être "!$" (qui est "insérer le dernier argument de la dernière commande"). Mais il y a beaucoup de détails qui doivent être clarifiés si cela (ou un substitut) doit être mis en œuvre.

Par example:

  • Quelle partie des substitutions d'historique voulez-vous - est-ce simplement "insérer la dernière commande ici" ("!!") et "insérer le dernier argument de la dernière commande ici" ("!$"), ou toutes les autres choses comme " !!:s/string1/string2" (je préférerais ajouter un mode général "replace" comme "query-replace" d'emacs ou ":s/" de vim afin que vous puissiez également le faire _avant_ d'exécuter la mauvaise commande) ? Que diriez-vous de "insérer la cinquième commande dans mon historique" ("!5") - ce que je n'ai jamais tout à fait compris - ou "insérer la cinquième-dernière commande" ("!-5") ? Qu'en est-il des « désignateurs de mots » et des « modificateurs » ?
  • Voulez-vous que la commande s'exécute tout de suite (c'est-à-dire que vous entrez sudo !! , appuyez sur Entrée et tout s'exécute tout de suite) ou serait-il correct de l'insérer en premier afin que vous puissiez vérifier - c'est comme bash avec l'option "histverify" (je pencherais pour cette dernière) ?
  • Est-ce que ça doit être "!!!" et "!$" ou peut-il être utilisé différemment, c'est-à-dire que la mémoire musculaire est votre problème ? Si c'est le cas, cependant, nous ne serons jamais à 100%, et la substitution de l'histoire _est_ une assez petite partie de bash

S'il ne s'agit que de mémoire musculaire, vous pouvez également mettre ce qui suit dans vos fish_user_key_bindings :

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

(le problème, pourquoi nous ne devrions probablement pas le prendre dans les liaisons par défaut, c'est qu'il attend ensuite que vous ayez entré "!" pour vérifier un deuxième caractère)

Je pense que !! est une mauvaise pratique

La commande sudo !! ne dit à personne ce que le shell va réellement exécuter.
si je veux exécuter la commande p revious avec sudo au ' a nfang' je tape

^p ^a sudo

Je suggère d'ajouter un message pour dire aux gens d'utiliser les commandes d'édition de ligne ^p et ^a au lieu d'utiliser la fonction d'historique.

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

Je déteste !! aussi. Une méthode plus simple pour fish_vi_mode comme alternative à ^p ^a :

^v k I

Parce que vous n'aimez pas une façon de faire quelque chose ne la rend pas moins valable.
Le 10 novembre 2015 à 08h14, "Ivan Tham" [email protected] a écrit :

Je déteste !! trop. Une méthode plus simple pour fish_vi_mode comme alternative à ^p
^a :

^vk je

-
Répondez directement à cet e-mail ou consultez-le sur GitHub
https://github.com/fish-shell/fish-shell/issues/288#issuecomment -155416048
.

L'inverse est vrai aussi.

Les deux côtés de cette question ont des besoins et des préoccupations légitimes. Je pense que le principal problème est de trouver la _bonne_ façon de le faire au lieu de la manière rapide et sale

Je suis d'accord et je n'ai rien contre les autres façons de le faire, ils ne le font tout simplement pas
correspond à mes besoins (et évidemment à ceux des autres).
Le 10 novembre 2015 à 12h19, "Eric Mrak" [email protected] a écrit :

L'inverse est vrai aussi.

Les deux côtés de cette question ont des besoins et des préoccupations légitimes. Je pense que le
principal hold-up est de trouver la _bonne_ façon de le faire au lieu de la rapide et
voie sale

-
Répondez directement à cet e-mail ou consultez-le sur GitHub
https://github.com/fish-shell/fish-shell/issues/288#issuecomment -155494929
.

Pour réitérer les approches mentionnées au début de la discussion et pour les développer un peu : j'ai trouvé que les raccourcis clavier fonctionnent mieux pour moi que " !".

J'ai écrit cette fonction qui peut être liée à une clé (^S pour moi, bind \cs 'prepend_command sudo' ). Si la ligne de commande a du contenu, elle ajoute sudo. S'il n'y a pas de contenu, il ajoute sudo au dernier élément de l'historique. Donc sudo !!<Enter> devient maintenant ^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

Certaines personnes ont dit que configurer quelque chose comme ça est trop compliqué à faire. Une solution possible pourrait être d'inclure quelque chose de fonctionnellement similaire à ma fonction dans les poissons afin que la configuration de cela devienne au moins une ligne unique.

Bien sûr, cela ne répond pas à d'autres demandes comme some_command --with-subshell-param (!!) .

@Ahti C'est en fait un

Ouais, jusqu'à présent, cela bat sudo !! . Être à mi-chemin d'une commande et réaliser qu'elle devrait être sudo m'arrive souvent. ^s , préfixe instantané sudo !

Personnellement, je n'ai jamais utilisé le !! dans un contexte autre que sudo !! donc cela ne me dérange pas.

Par coïncidence, je viens d'essayer fish_vi_mode et je l'aime vraiment. Cependant, en mode Vi, ^s ne semble plus se lier. Suggestions?

D'accord, j'avais le raccourci clavier dans config.fish. J'ai trouvé #2254 puis trouvé https://github.com/faho/fish-shell/commit/f7e8ad632a388d5f1c5eb4cfc33f3cdb1f7fd831 puis trouvé http://stackoverflow.com/a/16675092/292408 qui a confirmé que je devais placer mes fixations dans un fish_user_key_bindings fonction qui n'existait pas encore.

Cela a fonctionné et maintenant, lorsque je suis en mode commande Vi [N] le préfixe fonctionne comme prévu.

Nous avons déjà Alt-P pour exécuter le pipeline actuel dans le pager ; Je me demande si nous devrions également ajouter Alt-S ?

Je pense que @Ahti 's est une solution assez élégante à ce que tout le monde recherche. Directement vers un raccourci clavier sans vous soucier d'une extension aléatoire ou de cas extrêmes étranges. Il place simplement du texte que vous pouvez utiliser ou annuler comme vous le souhaitez.

Je aime à la fois la solution de liaison clé de substitution et de @Ahti '@nyarly.
Personnellement, j'utilise !! uniquement dans le contexte de sudo !!

Oh ! Ce fil a presque quatre ans maintenant. J'ai récemment acheté ǃǃ.com et ǃǃ.net (que Github ne me laisse pas lier d'hyperlien, apparemment, donc copiez-collez) si quelqu'un les veut.

Hey! C'est super! @geoff-codes Comment avez-vous fait cela ?)

Ils ont récemment commencé à autoriser les noms de domaine « internationalisés » .com et .net.
screen shot 2016-05-11 at 4 53 48 am

Cependant, la prise en charge de celui-ci est encore assez boguée pour le moment. Par exemple, ils m'ont laissé enregistrer .com mais pas ⵌǃ.com.

Je ne savais pas qu'on pouvait s'inscrire !!.com, c'est dingue.

La leçon à tirer de ce problème : si vous écrivez un jour un shell Unix, la seule fonctionnalité que vous devez vous assurer d'implémenter est sudo !!, car il semble que les gens ne puissent pas s'en passer.

Sérieusement, j'ai eu des gens disant que cela fonctionnait très bien :

@bucaran Oui, effectivement, cela semble être le cas 😆.

Noms de domaine internationalisés - IDN :

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

edit : trop lent avec ce post, et aussi des inscriptions comme ces @geoff-codes ! Cela doit être un investissement judicieux. Un .com à deux caractères (en quelque sorte) !

#!.com aurait pris le gâteau cependant. Existe-t-il une règle interdisant cela pour le TLD com, ou quelque chose qu'ils devraient résoudre ?

Dans la présentation bash pour Windows, le type qui présentait a tapé quelque chose
comme ça:

$> echo bonjour Windows !!

Et j'espère que vous pouvez tous deviner ce qui s'est passé.
Le 11 mai 2016 à 13 h 57, "Aaron Gyes" [email protected] a écrit :

Noms de domaine internationaux - IDN

Le 11 mai 2016 à 04:44:58 AM, Timophey ([email protected]) a écrit :

Hey! C'est super! @geoff-codes https://github.com/geoff-codes Comment
vous
faire ça ?)

-
Vous recevez ceci parce que vous êtes abonné à ce fil.
Répondez directement à cet e-mail ou consultez-le sur GitHub
<
https://github.com/fish-shell/fish-shell/issues/288#issuecomment -218435761

-
Vous recevez ceci parce que vous avez commenté.
Répondez directement à cet e-mail ou consultez-le sur GitHub
https://github.com/fish-shell/fish-shell/issues/288#issuecomment -218438118

Alors, je devrais passer à bash ?

@ base698 - J'ai fini par sortir un plugin fisherman pour prendre en charge les deux cas d'utilisation les plus courants de la substitution d'historique : !! pour toute la dernière commande et !$ pour le dernier argument. Honnêtement, j'ai surtout rompu mes propres habitudes parce que l'édition en ligne de commande de fish est si bonne. Pourtant, j'aime beaucoup pouvoir

> which tool
> cat (!!)

pour examiner un script par exemple

Vous pouvez installer le plugin avec fisher install nyarly/fish-bang-bang une fois que vous avez installé Fisherman.

par souci d'exhaustivité (et en donnant un exemple correct)
voici une capture d'écran de la vidéo youtube que j'ai mentionnée, c'est l'une des grandes fonctionnalités du '!!' modèle qui est maintenant disponible sur Windows aussi.
bangpatternbash

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

Il veut exécuter git commit -a -m "Rawr!!"

donne git commit -a -m "Rawrclear"

Autant j'aime le poisson, !! est tout simplement trop utile. Pas sûr que sudo !! mais aussi comme moyen de transmettre les informations précédentes à de nouvelles commandes. Par example:

find . -name something | grep "pattern" alors je jouerais avec le motif jusqu'à ce que j'obtienne ce que je veux.
Ensuite, je le passerais à quelque chose comme ça (someCommand !! ). Actuellement, chez les poissons, cela nécessite trop d'étapes. Les solutions de contournement ne fonctionnent pas assez bien pour moi.

zsh se développe !! afin que vous puissiez le modifier. Je vais donc devoir retourner à zsh.

Si vous utilisez fisherman (ce que vous devriez être), vous pouvez installer nyarly/fish-bang-bang et obtenir une extension n'importe où dans la commande de !! et !$

@nyarly Ouais, j'ai essayé ça. Mais je n'aime pas la façon dont il se développe immédiatement après la saisie du deuxième ! . C'était gênant. zsh se sent mieux car il se développe après avoir entré un espace ou appuyé sur Entrée.

EDIT : Tant pis, je n'ai pas pu le faire. J'avais oublié à quel point il était ennuyeux de faire de ZSH ce que je voulais qu'il soit. le plugin de Nyarly devra faire l'affaire.

Je suis tellement content que cela n'ait pas été mis en œuvre! Il viole la loi d'orthogonalité de Fish et la loi de focalisation de l'utilisateur. Le remplacement de l'historique de Bash nécessite trop de réflexion au-delà de !! et !$ et peut-être s^ . C'est pourquoi les gens ne les utilisent que. La solution de Fish est plus interactive, ce qui permet un remplacement plus général des arguments. Il est assez efficace en termes de nombre de coups, et tout aussi efficace avec !! .

Certains utilisateurs manquent !! et !$ et ne veulent pas apprendre d'une manière différente. Fish devrait-il implémenter uniquement ces fonctionnalités en tant que cas limites (voir la loi d'orthogonalité) ? Ou tout le remplacement de l'historique de Bash ? Ou toutes les fonctionnalités d'autres shells ? Toutes les fonctionnalités auxquelles les utilisateurs peuvent penser ?

Voici un correctif pour tous ceux qui souhaitent copier et coller quelque chose :

placez-le dans ~/.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

L' URL https://github.com/fish-shell/fish-shell/issues/288#issuecomment -7869918 est cassée. Pourriez-vous modifier votre commentaire pour le corriger pour les personnes lisant ce problème toujours ouvert ?

J'ai édité son commentaire pour indiquer où nous hébergeons la FAQ maintenant.

Maintenant que le poisson a && et || (https://github.com/fish-shell/fish-shell/issues/4620) C'est presque un remplacement complet de bash !

Je suis vraiment confus --

Ainsi, le shell qui déclare son objectif de conception numéro 1 est :

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

... ne me permet pas d'effectuer l'une des actions les plus couramment utilisées dans tous les autres shells ?

La FAQ sur les poissons dit que les utilisateurs devraient plutôt

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

Mec, quel étirement. Combien d'utilisateurs ont appuyé sur le bouton « Accueil » au cours des six derniers mois pour une raison quelconque ? À cette longueur, je pourrais affirmer que l'analyse automatique des commandes de la page de manuel n'est pas assez orthogonale pour simplement ouvrir le fichu fichier man et le trouver vous-même.

@andysalerno
l'action que vous voulez faire est d'exécuter la commande précédente avec sudo préfixé
et le poisson fournit cette fonctionnalité
bien qu'au lieu d'entrer
First type "sudo ", then press shift+1, then press shift+1
je fais
ctrl+p, ctrl+a, type "sudo "
cela fonctionne de la même manière dans bash
maintenant que vous avez mentionné la faq, je l'ai vérifié à nouveau et quelqu'un a supprimé la partie concernant ce raccourci qui manque maintenant. (j'ai créé https://github.com/fish-shell/fish-shell/pull/3879 pour résoudre ce problème)
La raison pour laquelle ce raccourci fonctionne est qu'il suit la bibliothèque readline qui est largement implémentée ou imitée pour l'édition de ligne.
Si je trouve le temps, je créerai une pull request pour l'ajouter à la faq
Je peux comprendre votre frustration, utiliser la touche Home n'est vraiment pas une option, car cette touche se trouve à un endroit différent sur de nombreux claviers (par exemple, tous mes 3 claviers).

merci d'avoir soulevé cette question à nouveau. Je pense qu'il est important d'avoir une manière simple (seulement des touches de modification et des lettres, pas de touche d'accueil, pas de touches fléchées), rapide (pas trop de frappes) et _documentée_ de le faire.

génial, je n'avais aucune idée de ctrl+p ! Je l'aime encore mieux que !!.

Éditer:
existe-t-il un autre moyen de réévaluer la commande de dernière exécution ? Je me retrouve souvent à faire quelque chose comme ça dans bash :

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

> less $(!!)

Ce n'est pas aussi concis, mais vous pouvez le faire avec eval et la variable history :

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

> less (eval $history[1])

Mais une meilleure façon de le faire est d'utiliser alt-p. Fish dirigera les sorties de commande vers moins si vous appuyez sur alt-p après avoir tapé la commande :

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

Je ne comprends pas toutes les personnes anti-bang.
First press Up, then Home, then type "sudo ".

Les commandes Bang sont magiques une fois que vous vous y êtes habitué. J'espère vraiment que les gars des poissons changeront d'avis et les rajouteront. Au MOINS quelques-uns des bons, comme :

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

Le poisson est plutôt sympa, continuez votre bon travail

Existe-t-il un moyen pris en charge pour exécuter la dernière commande de l'historique ? Cela ne me dérange pas d'avoir à le taper, car j'utilise simplement une macro pour appeler la commande dans mon autre fenêtre tmux. Mais mon cas d'utilisation est que je veux juste pouvoir faire quelque chose comme ça :

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

J'ai essayé eval $history[1] , mais le deuxième appel explose. C'est ce qui est utile avec la commande !! . La seule chose qui n'est pas vraiment acceptable est d'utiliser les touches fléchées. Existe-t-il une commande dans fish qui prend en charge ce cas d'utilisation?

Le mieux auquel je puisse penser en ce moment est d'utiliser un espace de début qui empêche de l'ajouter à l'histoire :

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

ce n'est certainement pas génial je sais. Dans ce cas simple cependant, la liaison history-search-backward semble être suffisante ? Ce sont les touches fléchées par défaut, mais vous pouvez les ajouter ou les modifier.

Oh! C'est une bonne idée, je n'ai pas pensé à utiliser l'espace de départ. Je vais devoir essayer ça.

Mise à jour :
Cela a parfaitement fonctionné pour mon cas d'utilisation. $ eval $history[1] #note extra leading space

C'est probablement la raison pour laquelle je ne peux pas rester avec Fish. Bien qu'il soit élégant et simple, son manque de raccourcis standard pour de nombreuses choses le rend non productif :

Premier élément. Je veux répéter la commande précédente avec sudo :

sudo !!

1) Appuyez sur le bouton Haut
Problème, je dois atteindre le bouton Haut sur plusieurs claviers. Environ un quart du temps, cela me manque et je dois ensuite regarder le clavier pour voir exactement où il se trouve et probablement réparer tout ce qui a été raté. Puis...
2) Appuyez sur Accueil ou Ctrl-A
La maison est un autre tronçon et est située dans tellement d'endroits divers sur différents claviers que je devrai la chercher. Ctrl-A vient plus naturellement, donc cela fonctionne, je suppose.
3) Tapez 'sudo' et appuyez sur retour.
D'accord, cela ne fait que sept frappes, mais l'une d'entre elles est sujette à des erreurs et provoque l'interruption de mon flux de travail dans une grande partie du temps.

Article suivant, je veux catégoriser le dernier argument précédent :

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

Ou avec du poisson :
1) Tapez 'chat'
2) Alt-Up
Ok, encore une fois ce n'est pas très naturel. J'appuie rarement sur la touche Alt et plus que souvent sur la touche Super (Cmd/Windows/whatever) à côté, ce qui change complètement le contexte dans lequel je me trouve.

Fish a besoin d'une meilleure expansion de l'histoire comme tous les principaux concurrents. Son manque est une réduction de la productivité pour les utilisateurs haut de gamme.

@wrecklass Parce que je ne pouvais pas sortir sudo !! de mes doigts, j'ai écrit https://github.com/nyarly/fish-bang-bang , que je vais vous suggérer.

De plus, IIRC, fish est livré avec Alt-S pour "prepend sudo" qui fonctionnera pour la dernière entrée de l'historique si votre commande est actuellement vide, de la même manière qu'Alt-P ajoutera | less .

Et juste parce que ça revient sans cesse ("c'est-à-dire pourquoi ça ne marche pas !! ça marche dans le poisson comme ça le fait bash"), je veux raconter : le traitement spécial du caractère ! était l'une des choses qui m'a conduit de bash. En tant qu'utilisateur de poisson de longue date, je serais très déçu si ce comportement était adopté pour apaiser une minorité vocale.

sudo !! est une chose tellement standard. Je comprends que fish essaie très fort de s'éloigner de l'ancienne syntaxe bash, mais en repoussant les fonctionnalités légitimement utiles en faveur de la philosophie personnelle, je pense que nous stoppons le progrès.

@ClickSentinel , pour cette raison même, j'ai arrêté d'utiliser fish et je m'en tiens à bash . :souriant:

Notre plan actuel est de mettre en œuvre des abréviations globales, qui peuvent alors également prendre en charge "!!!" et al. Voir #5003 pour cela.

Je ferme cette question en faveur de cela car elle a suivi son cours.

@tukusejssirs et @ClickSentinel , avez-vous essayé d'ajouter le code sur https://github.com/fish-shell/fish-shell/issues/288#issuecomment -306212011 à votre configuration ?

J'en ai une variante depuis plusieurs années (modifiée à partir d'un problème (ce problème, peut-être ?) J'ai dans ma variante pour faire une recherche de jetons vers le haut en utilisant la chaîne avant le !$ , c'est l'une des choses que je suis le plus ennuyé de ne pas avoir lorsque je travaille dans bash.)

Ma variante (ou peut-être que j'ai volé la variation... je ne me souviens pas :man_shruging: ):

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

Merci @scooter-dangle cela fonctionne encore mieux que #228

Il y a des cas où Fish fournira un moyen plus idiomatique d'effectuer certaines actions :

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

Peut-être que !! pourrait aussi, par défaut, générer un tel message suggérant une autre façon plus idiomatique de le faire ?

Cependant, la proposition devrait être tout aussi efficace. Comparer:

  • sudo !!<enter> , le tout à partir de la position de base des mains sur le clavier
  • <up><home>sudo <enter> , comme suggéré dans la FAQ de Fish qui semble nécessiter plus ou moins de mouvements de mains selon l'endroitetsont sur le clavier.
  • <C-p><Ca>sudo <enter> , accessible sans bouger les mains , qui fonctionne également avec les valeurs par défaut de Bash, ZSH et peut-être plus, afin que les utilisateurs puissent adopter une nouvelle habitude qui est portable lorsqu'ils doivent faire face à d'autres shells.

Pour !$ , suggérer <alt-.> semble bien, n'est-ce pas ?

@psychoslave S'il tous les anciens problèmes , en particulier ceux qui sont fermés.

Verrouillage également celui-ci. On y a répondu une cinquantaine de fois.

Cette page vous a été utile?
0 / 5 - 0 notes