Comment puis-je rappeler une commande d'historique numérotée à modifier?

17

Je recherche fréquemment des changements avec history | grep 'string'

Je reçois une liste de commandes dans mon historique, avec le numéro de la ligne d'historique), par exemple

history | grep 'git'

  755  git status
 1535  git push origin master
 1570  git merge origin/one-146
 1667  git reset --hard origin/master

Je peux maintenant rappeler et exécuter une commande en une seule fois avec !nnn, par exemple:

!755
git status
# On branch master
nothing to commit, working directory clean

Ma question est la suivante: comment puis-je rappeler une commande d'historique numérotée et rester sur la ligne de commandes pour la modifier et ne pas l' exécuter immédiatement `` telle quelle '', de cette façon !, afin de pouvoir changer quelques éléments après le retour de la présélection?

Michael Durrant
la source

Réponses:

12

J'ai depuis adopté une autre approche à ce sujet - en utilisant ![line-number]:p

Cela imprime l'instruction et l'ajoute à l'historique mais ne l'exécute pas réellement. Je fais ensuite une flèche vers le haut et je la change comme je le souhaite.

Je combine cela avec mon hgalias ( alias hg='history | grep ') pour rappeler les commandes d'historique basées sur du texte.

Exemple:

$ hg checkout

17140   git checkout README.rdoc
17143   git checkout master
17201   git checkout README.rdoc
17204   git checkout master
17923   git checkout .bashrc
18151   git checkout v311

J'utilise ceci en plus de ctrl- r(recherche d'historique inversé) parce que parfois je préfère voir une liste immédiate de toutes les possibilités pour une chaîne donnée plutôt que juste la sortie sur 1 ligne qui ctrl- rs'affiche. Après, hg [string]je ferais ![line-number]search_stringcomme dans le hg checkoutschéma ci-dessus.

Michael Durrant
la source
8

Si vous définissez l' histverify option , par exemple

shopt -s histverify

toutes les substitutions d'historique sont alors éditées au lieu d'être exécutées immédiatement. Vous devrez ensuite appuyer Enterdeux fois au lieu d'une fois après avoir tapé !755pour exécuter la commande.

Vous pouvez insérer du texte arbitraire dans la liste d'historique avec history -s. Combinez cela avec fc -nlpour répertorier une entrée d'historique spécifique.

history -s "$(fc -nl 755 755)"

puis appuyez sur Uppour rappeler ce qui est maintenant la dernière entrée de l'historique.

Gilles 'SO- arrête d'être méchant'
la source
6

Vous pouvez effectuer une recherche dans l'historique en utilisant Ctrl+ R. Si l'entrée d'historique est longue, utilisez la souris (pas le clavier, cela arrête la recherche) pour copier et coller une partie de la commande à modifier.

Comme l'a commenté @rijsg, vous pouvez ensuite utiliser les flèches (gauche et droite) ou des touches équivalentes pour arrêter la recherche et commencer l'édition.

Zelda
la source
2
Toute touche fléchée ou commande équivalente ( Ctrl-apar exemple) arrêtera la recherche en laissant l'entrée d'historique actuelle dans l'invite de commande, sans l'exécuter. Cela peut être suffisant ou non, selon ce que @Michael veut.
njsg
2

Si vous configurez votre fichier .bashrc pour utiliser l'éditeur vi sur la ligne de commande, cela rendra les modifications de ligne de commande beaucoup moins complexes.

1er, une fois que "set -o vi" est activé, vous pouvez simplement appuyer sur "<esc> k" , puis continuer à appuyer sur "k" pour remonter le fichier d'historique tel qu'il était, si vous dépassez une entrée, utilisez "j" descendre .

REMARQUE: lorsque vous utilisez vi, il existe deux modes: commande et modification pour entrer dans le mode de commande, appuyez une fois sur la touche Échap, puis sur a, A, i, I, etc. pour insérer.

Curseur simple en vi: gauche = h, bas = j, haut = k, droite = l http://linuxmeister.net/vi/vi-Summary.jpg

J'ai ajouté toutes les entrées nécessaires pour que cela fonctionne à: http://linuxmeister.net/Notes/bashrc-simple.html

Ainsi, sur la base des informations très utiles ci-dessus, j'ai pu utiliser "historique" et RAPPELER une ligne de "historique", SANS l'exécuter. (MERCI POUR CE POST!)

si shopt est listé et histverify est "off" a! EXÉCUTERA immédiatement,

si vous avez ajouté à votre .bashrc, ou tapé: shopt -s histverify , alors a! permet une modification, par exemple:

history
    1  more .bashrc
    2  history
    3  shopt
    4  . ./.bashrc
    5  shopt | grep hist
    6  history
    7  alias
    8  history
    9  shopt
   10  history

->! 5

quand je frappe! 5 la commande suivante apparaît, mais ne s'exécute PAS

### si histverify est "activé".

shopt | grep hist
cmdhist         on
histappend      on
histreedit      off
histverify      on
lithist         off

N'oubliez pas que Linus et Richard ont créé des outils Linux et GNU pour tirer parti d'UNIX. L'éditeur vi (créé par Bill Joy) est l'un des meilleurs outils à maîtriser car il est sur CHAQUE distribution d'UNIX et Linux.

Tous les autres éditeurs de ligne de commande doivent être chargés et nécessitent un logiciel supplémentaire. Utiliser une interface graphique sous Linux (autre que Firefox, Thunderbird et OpenOffice), c'est comme remorquer votre 4x4 Diesel avec une VW Beetle de 1968 ... cela fonctionnera, mais cela n'a aucun sens.

Rappelez-vous ce que Kernigan a dit à propos d'une interface graphique, "ce que vous voyez est tout ce que vous obtenez".

LinuxMeister
la source
-1
echo !number

puis appuyez sur la flèche vers le haut, supprimez le mot echoet modifiez le reste; appuyez sur entrée pour exécuter.

Andrzej
la source