Je voudrais exécuter la commande
foo --bar=baz <16 zeroes>
Comment saisir efficacement les 16 zéros *? Si je maintiens la Alttouche enfoncée , 1 6 0cela répétera la prochaine chose 160 fois, ce qui n'est pas ce que je veux. Dans emacs, je peux utiliser Alt-[number]ou Ctrl-u 1 6 Ctrl-u 0, mais dans bash Ctrl-utue la ligne en cours de frappe et le zéro suivant ajoute simplement un 0 à la ligne.
Si je fais
foo --bar=baz $(printf '0%.0s' {1..16})
Ensuite history
montre exactement ce qui précède, et non foo --bar=baz 0000000000000000
; ie bash ne se comporte pas comme je le souhaite. ( Edit : point étant, je veux entrer un certain nombre de zéros sans utiliser la $(...)
substitution de commande)
(*) Je suppose qu'une définition technique de "efficacement" est "avec O (log n) touches", de préférence un nombre de touches égal au nombre de chiffres en 16 (pour toutes les valeurs de 16) plus peut-être une constante; l'exemple emacs est considéré comme efficace par cette définition.
la source
know what you want to do
. Dans une commande imbriquée complexe, comment bash saurait-il quelles parties vous vouliez voir le résultat de l'exécution dans l'historique par opposition à la commande elle-même? Et les variables? En bref bash va toujours avoir lecode
dans l'historique, pas le résultat de l'exécution du code.Alt
en soi, n'envoie aucun caractère, donc presser et relâcher alt n'aura aucun effet en ce quibash
concerne.history
était que je voudrais entrer des chiffres sans utiliser la substitution de commande.Réponses:
Essayer
Cela représente 6 touches (en supposant un clavier QWERTY US / UK au moins) pour insérer ces 16 zéros (vous pouvez les maintenir Altpour 1 et 6).
Vous pouvez également utiliser le
vi
mode standard (set -o vi
) et taper:(également 6 touches).
L'
emacs
équivalent de mode et qui pourrait être utilisé pour répéter plus d'un seul caractère ( ) fonctionne dans , mais pas dans .echo 0Ctrl+WAlt+1Alt+6Ctrl+Y
zsh
bash
Tous ceux qui travailleront également avec
zsh
(et d'tcsh
où cela vient). Aveczsh
, vous pouvez également utiliser des indicateurs d'expansion de variable de remplissage et les développer avec Tab:(Beaucoup plus de touches évidemment).
Avec
bash
, vous pouvez égalementbash
développer votre$(printf '0%.0s' {1..16})
avec Ctrl+Alt+E. Notez cependant qu'il étendra tout (mais pas les globes) sur la ligne.Pour jouer au jeu avec le moins de touches possibles, vous pouvez lier à une touche un widget qui se développe
<some-number>X
àX
des<some-number>
moments répétés . Et ont<some-number>
en base 36 pour le réduire encore plus.Avec
zsh
(lié à F8):Ensuite, pour 16 zéros, vous tapez:
(3 frappes) où
g
est16
en base 36.Maintenant, nous pouvons encore le réduire à une clé qui insère ces 16 zéros, bien que ce serait de la triche. Nous pourrions lier F2à deux
0
s (ou deux$STRING
, 0 par défaut), F3à 30
s, F1F6à 160
s ... jusqu'à 19 ... les possibilités sont infinies lorsque vous pouvez définir des widgets arbitraires.Je devrais peut-être mentionner que si vous maintenez la 0touche enfoncée, vous pouvez insérer autant de zéros que vous le souhaitez avec une seule touche :-)
la source
vi
et d'autres!En supposant que votre émulateur de terminal ne mange pas la touche (par exemple, pour changer d'onglet) - xterm simple fonctionne - vous pouvez appuyer sur Alt-1 6 Ctrl-V 0. Le contrôle-V est nécessaire pour décomposer le nombre et le caractère à répéter (si vous répétiez une lettre, vous n'en auriez pas besoin).
(Il s'agit d'une fonction de ligne de lecture connue sous le nom de
digit-argument
, vous devriez donc pouvoir l'utiliserbind
pour changer les touches de modification impliquées)la source
Dans Emacs, j'utilisais normalement C-qpour séparer l'argument préfixe de l'entrée numérique.
Bash utilise à la Ctrl+vplace de C-q, pour éviter les problèmes de contrôle de flux XON / XOFF.
Vous pouvez donc utiliser Alt+1 Alt+6 Ctrl+v 0.
la source
une autre option consiste à taper quatre zéros, puis à utiliser la souris pour les copier et les coller trois fois de plus. double-cliquez pour sélectionner, cliquez avec le bouton central x 3 pour coller.
la source
Jouer avec des macros:
Liez la touche de fonction F8pour multiplier par deux le dernier mot (en haut de l'espace précédent) (code de touche F8 trouvé en utilisant
Ctrl-V F8
):Cela pourrait être rendu permanent en envoyant le même texte à
~/.inputrc
puis tapez:
pour obtenir 2 ^ 4 fois le zéro. (encore 5 touches).
ou tapez:
pour obtenir 2 ^ 3 mots de livre.
Encore plus rapide:
Multipliez par 4:
3 touches.
Multipliez par 8 (le même nombre que la touche de fonction)
Encore 3 touches.
Tricher?
Trichez en multipliant par 16.
Seulement 2 touches. (et toujours une fonction simple utile)
^^^^^^^^^^^^^^^^^ (base 36? Hah!) :-P
Tricher clairement:
Une seule touche (oui: une ).
Modification de la liaison pour ctrl+U:
Envoyez ceci à
~/.inputrc
:Relisez le
~/.inputrc
fichier:faites-le comme d'habitude dans emacs (comme vous le vouliez):
7 touches (après la "mise en place").
Légèrement plus court:
Utilisez le "multiplier par 4" par défaut de "l'argument universel" et terminez par
Seulement 5 clés.
Utilisation de l' alt+naccès à (arg: n)
C'est 6 clés pour obtenir les 16 zéros.
Ne modifier aucun raccourci clavier:
Si dans votre bash vous en avez
bash C-u kills the currently-being-typed line
.C'est parce que
"\C-u":
c'est lié àunix-line-discard
.Mais cela pourrait aussi aider:
quand, ce qui est avant que le curseur ne soit effacé, il est également placé dans le "kill-ring".
Donc ,
ctrl+u
permet d' effacer etctrl+y
Yanks retour ce qui a été effacé.Sur une ligne propre: tapez
00
effacez-le et tirez-le deux fois pour le faire0000
.Répétez l'opération pour obtenir
00000000
(8 zéros), enfin tapez la commande et tirez deux fois en arrière.Le premier jeu (7 touches ctrlmaintenues enfoncées):
Le deuxième set (5 touches)
Cela obtiendra huit zéros dans l'anneau d'effacement, puis tapez ce que vous voulez:
obtenir:
Après avoir compris l'idée, vous pouvez également taper ce dont vous avez besoin, aller au début de la ligne ( ctrl-Y), faire comme ci-dessus (jusqu'à huit zéros) aller à la fin ( ctrl-E) et tirer deux fois.
C'est 15 touches (à côté de la commande elle-même).
Pas court, je sais, mais cela ne fonctionne qu'avec ce qui était disponible.
C'est un peu plus court:
C'est 11 touches
la source
F<n>
duplication des derniers<n>
temps de mot .^[[19~
). Voir"$(tput kf8)"
pour obtenir les informations de la base de données terminfo (ou du$terminfo
hachagezsh
).ctrl-v F8
Comme variante de la réponse de CAS , tapez
puis utilisez la souris pour le copier et le coller (une fois). On peut dire que c'est O (log n), mais comme c'est (len (str (n)) + 20), vous pourriez le considérer comme inefficace. Mais notez:%.s
semble se comporter comme%.0s
.0000000000000000
comme argument, vous devez le faire une seule fois.glenn jackman souligne que (où nombre est un entier positif) imprimera une chaîne de zéros numériques (et une nouvelle ligne), comme l'astérisque dans le format indique de prendre la largeur du champ des arguments. Plus précisément, imprimera 16 zéros. Mais c'est un cas spécial qui ne gère que . va imprimer , et va imprimer et un message d'erreur. En revanche, les autres commandes de cette réponse produiront des chaînes comme ou (et voir ci-dessous pour ).
printf "%0*d\n" number 0
printf
printf "%0*d" 16 0
0
printf "%0*d" 16 12345
0000000000012345
printf "%0*d" 16 foo
0000000000000000
123451234512345…
foofoofoo…
7%7%7%...
Si vous comptez le faire régulièrement, vous pouvez le rationaliser en définissant une fonction shell:
Remarques:
$(seq 1 "$2")
plutôt que(1.."$2"}
parce que ce dernier ne fonctionnera pas - voyez ceci , ceci , ceci et ceci . Notez que certaines des réponses à ces questions suggèrent d'utilisereval
, mais ce n'est généralement pas recommandé.$1%.0s
) doit être entre guillemets (plutôt que des guillemets simples) car elle contient un paramètre ($1
).--
s'agit de se protéger contre les$1
valeurs commençant par-
."%.0s$1"
au lieu de"$1%.0s"
.$1
valeur contenant%
provoquera son étranglement.Si vous devez être capable de gérer des
$1
valeurs contenant%
, faitesDe plus, une fois qu'une telle fonction est définie, vous pouvez faire des choses comme
qui est un peu moins tapant que
"$(printf '0%.0s' {1..16})"
.la source
printf "%0*d" 16 0
imprimera 16 zéros. L'astérisque dans le format prendra la largeur du champ des arguments