Me gustaría ejecutar el comando
foo --bar=baz <16 zeroes>
¿Cómo escribo los 16 ceros de manera eficiente *? Si lo sostengo Alty lo presiono 1 6 0, se repetirá lo siguiente 160 veces, que no es lo que quiero. En emacs puedo usar Alt-[number]o Ctrl-u 1 6 Ctrl-u 0, pero en bash Ctrl-umata la línea que se está escribiendo actualmente y el siguiente cero simplemente agrega un 0 a la línea.
Si lo hago
foo --bar=baz $(printf '0%.0s' {1..16})
Luego history
muestra exactamente lo anterior, y no foo --bar=baz 0000000000000000
; es decir, bash no se comporta como yo quiero. ( Editar : punto, quiero ingresar un cierto número de ceros sin usar la $(...)
sustitución de comandos)
(*) Supongo que una definición técnica de "eficientemente" es "con O (log n) pulsaciones de teclas", preferiblemente una cantidad de pulsaciones de tecla igual al número de dígitos en 16 (para todos los valores de 16) más quizás una constante; El ejemplo de emacs califica como eficiente por esta definición.
fuente
know what you want to do
. En un comando anidado complejo, ¿cómo sabrá bash qué partes desea ver el resultado de la ejecución en el historial en lugar del comando en sí? ¿Qué pasa con las variables? En resumen, bash siempre va a tenercode
el historial, no el resultado de ejecutar el código.Alt
por sí solo no envía ningún personaje, por lo que presionar y soltar alt no tendrá ningún efecto en lo quebash
respecta.history
es que me gustaría ingresar dígitos sin usar la sustitución de comandos.Respuestas:
Tratar
Son 6 pulsaciones de teclas (suponiendo un teclado QWERTY de EE. UU. / Reino Unido al menos) para insertar esos 16 ceros (puede mantener presionados Alttanto para 1 como para 6).
También puede usar el
vi
modo estándar (set -o vi
) y escribir:(también 6 pulsaciones de teclas).
El
emacs
modo equivalente y que podría usarse para repetir más de un solo carácter ( ) funciona , pero no en .echo 0Ctrl+WAlt+1Alt+6Ctrl+Y
zsh
bash
Todos ellos también funcionarán con
zsh
(y detcsh
dónde viene eso). Conzsh
, también puede usar indicadores de expansión variable de relleno y expandirlos con Tab:(Muchas más pulsaciones de teclas, obviamente).
Con
bash
, también puedebash
expandir su$(printf '0%.0s' {1..16})
con Ctrl+Alt+E. Sin embargo, tenga en cuenta que expandirá todo (no los globos) en la línea.Para jugar el menor número de pulsaciones de teclas, puede vincular a alguna tecla un widget que se expande
<some-number>X
a tiemposX
repetidos<some-number>
. Y tener<some-number>
en la base 36 para reducirlo aún más.Con
zsh
(obligado a F8):Luego, para 16 ceros, escribe:
(3 pulsaciones de teclas) donde
g
está16
en la base 36.Ahora podemos reducirlo aún más a una clave que inserte esos 16 ceros, aunque eso sería trampa. Podríamos vincular F2a dos
0
s (o dos$STRING
, 0 por defecto), F3a 30
s, F1F6a 160
s ... hasta 19 ... las posibilidades son infinitas cuando puede definir widgets arbitrarios.Tal vez debería mencionar que si mantiene presionada la 0tecla, puede insertar tantos ceros como desee con solo presionar una tecla :-)
fuente
vi
y otros!Suponiendo que su emulador de terminal no se coma la pulsación de tecla (p. Ej., Para cambiar de pestaña), simplemente funciona xterm, puede presionar Alt-1 6 Ctrl-V 0. El control-V es necesario para dividir el número y el carácter para repetir (si repitiera una letra, no la necesitaría).
(Esta es una característica de línea de lectura conocida como
digit-argument
, por lo que debería poder usarlabind
para cambiar las teclas modificadoras involucradas)fuente
En Emacs, normalmente lo usaría C-qpara separar el argumento del prefijo de la entrada de dígitos.
Bash utiliza en Ctrl+vlugar de C-q, para evitar problemas con el control de flujo XON / XOFF.
Entonces puedes usar Alt+1 Alt+6 Ctrl+v 0.
fuente
Otra opción es escribir cuatro ceros y luego usar el mouse para copiar y pegar tres veces más. haga doble clic para seleccionar, haga clic en el medio x 3 para pegar.
fuente
Jugando con macros:
Vincula la tecla de función F8para multiplicar por dos la última palabra (hasta el espacio anterior) (código de tecla F8 encontrado usando
Ctrl-V F8
):Eso podría hacerse permanente enviando el mismo texto a
~/.inputrc
luego escriba:
para obtener 2 ^ 4 veces el cero. (Todavía 5 pulsaciones de teclas).
o escriba:
para obtener 2 ^ 3 palabras del libro.
Aún más rápido:
Multiplicar por 4:
3 teclas presionadas.
Multiplique por 8 (el mismo número que la tecla de función)
Todavía 3 pulsaciones de teclas.
¿Engañar?
Haz trampa multiplicando por 16.
Solo 2 pulsaciones de teclas. (y sigue siendo una función simple útil)
^^^^^^^^^^^^^^^^ (base 36? ¡Ja!) :-P
Hacer trampa claramente:
Solo 1 (sí: una ) pulsación de tecla.
Cambiar el enlace para ctrl+U:
Enviar esto a
~/.inputrc
:Vuelva a leer el
~/.inputrc
archivo:hazlo como es habitual en emacs (como quisieras):
7 teclas (después de la "configuración").
Ligeramente más corto:
Utilice el valor predeterminado "multiplicar por 4" de "argumento universal" y terminar
Solo 5 llaves.
Usando el alt+nacceso a (arg: n)
Eso son 6 claves para obtener los 16 ceros.
No cambiar ningún atajo de teclado:
Si en tu fiesta tienes
bash C-u kills the currently-being-typed line
.Eso es porque
"\C-u":
está unido aunix-line-discard
.Pero eso también podría ayudar:
cuando, lo que está antes de que se borre el cursor, también se coloca en el "anillo de la muerte".
Entonces
ctrl+u
borra yctrl+y
retira lo que se borró.En una línea limpia: escriba
00
borrarlo y tirar de él dos veces para hacerlo0000
.Repita para obtener
00000000
(8 ceros), finalmente escriba el comando y tire dos veces hacia atrás.El primer conjunto (7 teclas ctrlpresionadas):
El segundo conjunto (5 teclas)
Obtendrá ocho ceros en el anillo de borrado, luego escriba lo que desee:
Llegar:
Una vez que tenga la idea, también puede escribir lo que necesita, ir al comienzo de la línea ( ctrl-Y), hacer lo anterior (hasta ocho ceros) ir al final ( ctrl-E) y tirar dos veces.
Son 15 teclas (al lado del comando en sí).
No es breve, lo sé, pero eso solo funciona con lo que estaba disponible.
Esto es un poco más corto:
Eso son 11 llaves
fuente
F<n>
dupliques la última palabra<n>
veces.^[[19~
). Consulte"$(tput kf8)"
para obtener la información de la base de datos terminfo (o el$terminfo
hash inzsh
).ctrl-v F8
Como una variación de la respuesta cas , escriba
y luego use el mouse para copiarlo y pegarlo (una vez). Podría decirse que esto es O (log n), pero dado que es (len (str (n)) + 20), puede considerarlo ineficiente. Pero nota:%.s
parece comportarse de la misma manera%.0s
.0000000000000000
un argumento, debe hacerlo solo una vez.Glenn Jackman señala que (donde el número es un entero positivo) imprimirá una cadena de ceros numéricos (y una nueva línea), ya que el asterisco en el formato indica que tome el ancho del campo de los argumentos. Específicamente, imprimirá 16 ceros. Pero este es un caso especial que solo se maneja . se imprimirá e imprimirá un mensaje de error. Por el contrario, los otros comandos en esta respuesta producirán cadenas como o (y ver más abajo para ).
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 va a hacer esto con frecuencia, puede simplificarlo definiendo una función de shell:
Notas:
$(seq 1 "$2")
lugar de(1.."$2"}
porque este último no funcionará: vea esto , esto , esto y esto . Tenga en cuenta que algunas de las respuestas a esas preguntas sugieren usareval
, pero esto generalmente no se recomienda.$1%.0s
) debe estar entre comillas dobles (en lugar de comillas simples) porque contiene un parámetro ($1
).--
es proteger contra$1
valores que comienzan con-
."%.0s$1"
lugar de"$1%.0s"
.$1
valor que contenga%
hará que se ahogue.Si necesita poder manejar
$1
valores que contienen%
, hagaAdemás, una vez que haya definido dicha función, puede hacer cosas como
que es un poco menos escribiendo que
"$(printf '0%.0s' {1..16})"
.fuente
printf "%0*d" 16 0
imprimirá 16 ceros. El asterisco en el formato tomará el ancho del campo de los argumentos