Fish-shell: admite la expansión del historial (por ejemplo, bash's !!, bang bang y! $, bang dollar, tokens)

Creado en 20 ago. 2012  ·  98Comentarios  ·  Fuente: fish-shell/fish-shell

Parece que la doble explosión no funciona y de alguna manera se interpreta como un programa que sudo intenta localizar sin éxito. Esto ocurre en Ubuntu 12.04 LTS con fish-shell compilado desde la fuente.

Pasos para reproducir:

  1. Ejecute cualquier comando:

    $ ls

  2. Ejecute el comando anterior como root:

    $ sudo !!
    sudo: !!: comando no encontrado

    Comportamiento esperado:

El comando sudo !! ejecuta el comando ejecutado previamente ( ls ) como root.

También verifiqué que el problema no sea causado por sudo siguiendo los pasos de reproducción en bash, que se comportaron como se esperaba.

Además, tenga en cuenta que una versión anterior de fish-shell en Mac OS X 10.7 no tenía este problema y sudo !! funcionó como se esperaba.

duplicate

Comentario más útil

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

sudo !! para personas que todavía usan !! por alguna razón.

Todos 98 comentarios

Se trata en las preguntas frecuentes sobre la documentación: http://fishshell.com/docs/current/faq.html#faq -history

Gracias por la aclaración.

Entiendo la razón fundamental para eliminar los personajes históricos. Sin embargo, aunque entiendo la razón de ser de esto y que es posible usar Ce y Ca en lugar de End and Home, para muchos usuarios, ¡especialmente para los que solían hacerlo! y aquellos en una computadora portátil que no tienen teclas de Inicio y Fin, ¡aún es mucho más fácil escribir sudo! que Up + C-a + sudo.

¿Seguiría considerando restaurar la funcionalidad de los tokens de sustitución del historial?

Ya que es un caso raro donde !! es más cómodo de usar, pruebe la siguiente función:

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

que se llama simplemente por "sudo !!".

O la otra posibilidad que utilizo:

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

Luego, presionando MS, ejecuto la línea de comando actual con sudo justo enfrente.
O modificando este ejemplo, puede crear una función que coloque la línea de comando anterior en la actual y la vincule, por ejemplo, a '\ e!'. Este enfoque es mejor que el simple uso de '!!' porque le da la oportunidad de ver y actualizar la línea de comandos antes de la ejecución.

Hice una ligera variación del último comando:

  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"

Guarda la posición del cursor en lugar de ejecutarlo directamente.

! $ también sería bueno tener

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

sudo !! para personas que todavía usan !! por alguna razón.

Gracias. ¡Hay una gran cantidad de personas que usan sudo! dado que esta sintaxis es compatible con muchos otros shells, incluidos bash y zsh. sudo !! es más fácil de escribir que usar las teclas de inicio y final, ya que esas teclas están más lejos.

Sugeriría que la función anterior se incluya con fish-shell de forma predeterminada.

!! es un buen candidato para una abreviatura (# 731)

Expresando apoyo a !! y atajos relacionados. No está de más agregarlo y se siente como si el pescado simplemente estuviera imponiendo una filosofía personal a sus usuarios.

¡¡Mi pensamiento actual de la solución ideal es eso !! debería ser una abreviatura (# 731), e implementamos firmas de función (# 478) para admitir subcomandos (un comando que toma un comando, como sudo). Luego, las abreviaturas se expanden en posiciones de subcomando, de modo que 'sudo !!' se expandirá.

Añadiéndome a mí mismo

A pesar de ser antigua, es una función que debería venir por defecto en Fish. No hay razón para no tenerlo; si no quiere usarlo personalmente, está bien, pero tener un comando adicional no le hace daño a nadie; a la gente le gusta hacer las cosas de diferentes maneras.

El camino !! se implementa en la mayoría de los proyectiles hace daño a las personas. Por ejemplo, considere este comando:

echo fish is great!!

en bash / zsh / tcsh, esto hará algo inesperado y horrible, porque el !! es sintaxis mágica. Este es el tipo de interacciones extrañas que los peces se esfuerzan por evitar.

Mi sugerencia fue implementar !! no como sintaxis mágica, sino como un alias. Esto significa que solo haría algo especial en 'posición de comando', no se expandirá en argumentos. También mantiene el conjunto de características de pescado bajo, lo cual es deseable.

Para que esto sea útil, necesitaríamos enseñarle a fish acerca de los subcomandos, siendo sudo el ejemplo más común, pero también time , strace , etc. fish luego expandiría los alias en "posición de subcomando", que es una característica interesante y útil por derecho propio.

Su solución propuesta se desmorona cuando considera sudo echo fish is great!! . Se puede hacer el mismo argumento con toda la sintaxis: ¿no es echo I really like fish (the shell)! también confuso? También me preocupa que una lista de "subcomandos" sería imposible de mantener y reduciría la flexibilidad.

Con los alias, solo los comandos se expanden y Fish sabría qué argumentos son (sub) comandos y cuáles no. Entonces sudo echo fish is great!! no realizaría la expansión del último comando, sino que pasaría un literal "¡genial!" sudo (y por lo tanto hacer eco). Afirmo que eso es lo que esperaba el usuario. Vea la discusión sobre abreviaturas (# 731) y firmas de funciones (# 478) para el diseño y la justificación.

SirCmpwn tiene razón en que requerir firmas de funciones completas es una desventaja del enfoque de alias, y también que otros elementos sintácticos son confusos. Los ejemplos de la vida real incluyen la molestia de la expansión de llaves con git (# 434) o comodines (# 967, entre otros). La sintaxis tiene un alto costo e intentamos eliminar la sintaxis cuando es redundante con otras características (por ejemplo, # 354).

De todos modos ese es mi argumento de por qué apoyar !! como elemento sintáctico elemental es un no-go. Sin embargo, estoy abierto a presentarlo de formas que no requieran modificar la sintaxis de pescado.

Creo que la comparación con {} es pobre. En los peces, los frenillos funcionan de manera diferente a otras conchas. Las personas solo se tropiezan con él cuando esperan que funcione como bash y amigos. El !! la sintaxis debería funcionar igual que otros shells comunes. También, !! no es algo que esperaría ver en los comandos con la suficiente frecuencia como para causar problemas. ¡De hecho, esperaría la cantidad de veces que la gente lo ha intentado y no ha podido usarlo! con pescado supera con creces el número de veces que alguien ha usado un literal !! en un comando.

Afirmo que ! es confuso en otros shells, y sería mejor si no se implementara de esta manera. Por ejemplo, en http://codegolf.stackexchange.com/a/17776/3103 pongo simple "¡Hola, mundo!" programa escrito en el shell de UNIX que falla debido a ! (en la pregunta sobre errores ridículos en tiempo de ejecución). Incluso obtuvo siete votos a favor, por lo que puedo imaginar que esta función puede ser sorprendente cuando no quieres usarla.

Sin embargo, !! por sí solo debería estar bien, porque ¿con qué frecuencia el usuario escribirá !! como un token? Por otra parte, agregar !! alentaría a agregar otros patrones de sustitución de historial, algunos de los cuales podrían ser molestos.

Añadiéndome a mí mismo, acabo de encontrarme con este mi primer fin de semana con pescado. Definitivamente debería ser compatible.

Añadiéndome a mí mismo, necesito esto.

Para aquellos que deseen esto, la función y los enlaces mencionados anteriormente en la discusión me han brindado un flujo de trabajo más fácil para anteponer sudo o sudo del último comando que el típico sudo !! uno.

Deberías probarlos. Me hizo volver a visitar mis configuraciones readline y zsh para tener enlaces similares.

Convierte siete pulsaciones de tecla (dos de las que se han desplazado) en una sola combinación.

Independientemente de lo que te guste, ¿realmente hay alguna razón para ello? no ser apoyado? Todo el mundo tiene cosas diferentes que funcionan para ellos, y aunque algunas personas pueden disfrutar usando la flecha hacia arriba, ¡muchas personas disfrutan usándolas! Y, honestamente, ¿por qué sería algo malo? Aquellos que no lo quieren, no tienen que usarlo.

¿Seguramente no es tan difícil de implementar? ...

Sí, sé que puedes hackearlo junto con scripts de peces, pero _no_ funciona de la misma manera que en bash o shells similares, lo cual fue bastante conveniente la mayor parte del tiempo.

Consulte mi comentario anterior para conocer la razón fundamental de por qué no quiero presentar esto de la forma en que bash y zsh lo hacen (como un nuevo elemento sintáctico), y mi propuesta de una forma en que podría hacerse que se mantenga con la filosofía del pez.

El argumento de "echo fish es genial !!" ser mejor que usar '!!' porque la historia es un poco débil, pero entiendo el punto. Parece un simple "set shell_history advanced" o algo que podría permitírselo a las personas que estén dispuestas a arriesgarse "¡echo fish es genial!" obteniendo un mensaje de error.

Sin embargo, mi caso de uso de '!!' es similar, pero quizás podría evitarse con alguna mejora de funciones.

Por ejemplo en mi mac con bash:
actualización de $ brew
$ brew desactualizado
$ buscar cerveza !!

Por lo tanto, utilizo con cierta regularidad la salida del comando anterior para un nuevo comando.
Con pescado puedo hacer esto:
$ brew fetch (elaboración desactualizada)
Ahora, en algún momento, quizás esa sea una sugerencia que pueda usar, pero lo que realmente necesito es poder buscar en el historial dentro del bloque ().
p.ej:
$ brew fetch (bre)

Desafortunadamente, aunque fish se enorgullece de usar () para los subcomandos en lugar de las comillas invertidas "confusas" y demás, en realidad no los trata como tales hasta que presiona enter. Al menos eso es lo que veo.

Si fish permitiera una búsqueda en el historial después del primer '(' (también conocido como un subcomando), creo que sería más fácil de manejar no tener! Manipulación del historial.

Si entiendo la sugerencia, es que cuando presiona la flecha hacia arriba, debería realizar el reemplazo del historial solo dentro del subcomando más interno en lugar de toda la línea de comando.

: -1:

Sigo apoyando simplemente la implementación del estilo bash !! .

Preferiría: up_arrow :, Ctrl + py la búsqueda del historial de comandos trabajando en posiciones de subcomando en lugar de introducir !!

¡Toda la API de historial de otros shells es lo suficientemente confusa como para que la gente solo recuerde! de eso.

Correcto. Eso sería conveniente y reemplazaría fácilmente el '!!' O! Uso de palabras clave.

Realmente me gusta la idea de que !! sea ​​una abreviatura.

Parece que las abreviaturas en las compilaciones nocturnas más recientes solo permiten abreviaturas en la posición de comando, con suerte se actualizará para poder usarse como argumentos en casos como este.

Esta función está sobrevalorada, solo use sudo cmd o eval sudo $cmd .

@bucaran No estoy siguiendo exactamente. El !! es para la velocidad, ¿cómo hago coincidir la velocidad de !! con cmd ?

¿Quiere decir hacer una variable llamada $cmd que sea el último comando? No es una variable nativa.

Gracias

@mdsib Sí, creo que recuerdo que hubo una discusión en otro número sobre no permitir abreviaturas en la posición del argumento. En ese momento se prefirió no implementar eso. Esto definitivamente cambiaría eso.

Creo que la conclusión de este hilo es que no sucederá pronto, y debería cancelar la suscripción a este problema de Github y cambiar a zsh. ¡Adiós!

No porque !! no esté aquí, sino porque un problema de Github para una característica bastante simple ha estado abierto durante 3 años sin implementarse debido a BS filosóficas.

Es divertido ver a la gente tratando de convencer a otros de que una característica no es gran cosa. Claro, no lo quieres, así que no te importa ... Es como si estuvieras tratando de convencer a la gente de que no le guste el verde porque piensas que el azul es mejor.
Sin embargo, dado que una característica "simple" no parece funcionar, tal vez alguien debería simplemente pescar si le gustan las características existentes, pero le gustaría agregar algunas más. Parece que llegaría a algún lugar más rápido.

Hice ~ / bin / !! que se ve así:

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

¡A corto plazo, me ayuda a solucionar la característica que falta y mi tendencia a escribir!
También hice ~ / bin /! Vi:

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

No es lo ideal, pero lo suficiente como para que mi caparazón tienda a hacer lo que espero con más frecuencia ahora.

@SirCmpwn ¿No me resulta obvio que !! es una característica simple? Por ejemplo, bash admite esto:

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

¿Debería este uso de !! ser apoyado o no? Los usuarios que dicen "¡los peces deberían apoyar!" puede tener diferentes ideas de lo que eso significa.

¡Te sientes muy bien con esto, así que te animo a ti (oa cualquiera) a que escribas una propuesta sobre cómo! funcionaría en peces (la semántica, no la implementación). ¿Qué sintaxis sería compatible exactamente? ¿Cómo se relacionaría esta expansión con otros tipos de expansión, como la expansión de variables o de procesos? ¿Cómo ocurriría la división de argumentos en la cadena expandida? ¿Podrías usar escapes para prevenirlo?

Esta es una solicitud sincera. Una característica no está definida por un solo caso de uso; necesitamos una propuesta concreta para discutir.

Si dice "Quiero que este caso funcione, y no me importa cómo", entonces está bien y es válido. Pero alguien tiene que resolver los detalles antes de que se pueda implementar algo.

A corto plazo, un plan concreto es implementar alias globales y luego hacer !! en uno. Una alternativa es fusionar el trabajo de docopt, dar una firma de función para sudo y luego hacer !! en un alias regular. ¡La dirección en la que vayamos depende de si pensamos! debería expandirse por todas partes, o simplemente en la posición de mando.

@ridiculousfish Tienes toda la razón en que un '!!' la solicitud de función debe ser bastante detallada. Nunca he usado el ejemplo particular que diste, ya que siempre hago algo como esto:
$ ls -l algún_archivo_largo.txt
$ ^ ls-l ^ gato

Obviamente, esto tampoco funciona. Esa sería una solicitud de función separada para mí, con la que no me he preocupado desde que comencé a probar peces recientemente.

"Fish: Se encontró una redirección cuando se esperaba un nombre de comando. Fish no permite una operación de redirección antes de un comando".

Parece que sería fácil tratar '^' en la posición de comando como una sustitución, ya que no entra en conflicto con la funcionalidad existente. Pero ese es un tema aparte, solo lo menciono ya que tienes razón en que debería haber una definición clara de qué '!!' (o simplemente sustitución de historia en general) significa.

Aquí hay un par de ejemplos que utilizo:

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

Gracias @gillham , información como esa es muy útil al diseñar una función.

También noto que @nyarly tiene una solución inteligente para !! y !$ aquí: https://github.com/fish-shell/fish-shell/wiki/Bash-Refugees

Mejor solución n. ° 5:
Fish está tan impulsado por la historia, que cuando haya olvidado sudo o haya contaminado su historial con un comando que no funciona, puede valer la pena su tiempo (a largo plazo) para borrarlo manualmente del historial. Sí, eso es abrir una nueva terminal, ejecutar bash y editar ~ / .config / fish / fish_history. Fish me ha llevado al comando equivocado una y otra vez, cuando he escatimado en esto.

En cuanto al hábito de mkdir …; cd !$ @nyarly, estoy haciendo mkcd … :

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

Tenga en cuenta que borrar del historial no requiere travesuras de bash:

history --delete --prefix some_command

fish_config history también te permite hacerlo apuntar y hacer clic.

Esta funcionalidad se puede replicar bastante bien dentro de Fish usando https://github.com/fish-shell/fish-shell/wiki/Bash-Style-History-Substitution- (!! - y -! $) - quizás el problema debería estar cerrado?

: -1:: -1: A menos que se implemente un modo de compatibilidad total con bash.

Creo que esta es una pendiente resbaladiza. Si esto se implementa en fish, ¿qué pasa con los single! S y las características del historial de ksh? ¿Qué pasa con $ ()? El pescado es una concha estilo csh. Si la gente no puede / no quiere adaptarse, hay zsh ...

Lo que he deducido de esta discusión como tl; dr para las personas que encuentran esto. (más de 3 años en)

  1. El equipo no quiere desarrollar la función porque no la usa.
  2. Hay muchas personas que quieren la función porque la usan.
  3. El equipo parece no estar dispuesto a implementar la función tal como existe, pero está dispuesto a hacer algo
    que funciona de manera similar si les damos suficientes datos.
  4. Las personas aceptan no tener la función, implementan una solución alternativa que funciona en su mayoría o se mueven
    a otro proyecto.

Soy uno de los últimos, aunque espero que esto se resuelva, no puedo usar fish de manera razonable y agregar esa solución con la cantidad de máquinas que uso sin una cantidad considerable de esfuerzo (necesito configuraciones de configuración diferentes en diferentes máquinas), ¡y lo uso! ! suficiente donde es un requisito para mí. Así que seguiré esta discusión con la esperanza de que algún día los peces satisfagan mi caso de uso.

@ tetra-archos Nadie ha presentado una propuesta concreta todavía, por lo que no tenemos una idea clara de qué es "la característica". Dado que obviamente se siente muy atraído por esto, si así lo deseara, sería de gran ayuda que sugiriera cuál debería ser el comportamiento, como punto de partida. De lo contrario, sería útil al menos enumerar los formularios de sustitución de historial que utiliza.

Tenga en cuenta que el comportamiento completo de sustitución del historial de bash es muy complejo y también configurable, por lo que "simplemente haga lo que hace bash" no es un principio.

Nadie ha presentado una propuesta concreta todavía, por lo que no tenemos una idea clara de qué es "la característica".

@ tetra-archos: Esto es absolutamente crítico. Hasta ahora, la mayor parte de esto ha sido '¡¡Queremos "!!" !!' y tal vez "! $" (que es "insertar el último argumento del último comando"). Pero hay muchos detalles que deben ser eliminados si se va a implementar (o un sustituto).

Por ejemplo:

  • ¿Qué parte de las sustituciones del historial desea? ¿Es simplemente "inserte el último comando aquí" ("!!") e "inserte el último argumento del último comando aquí" ("! $"), O todas las demás cosas como " !!: s / string1 / string2 "(prefiero agregar un modo general de" reemplazo "como" consulta-reemplazo "de emacs o": s / "de vim para que también pueda hacerlo _antes_ de ejecutar el comando incorrecto)? ¿Qué tal "insertar el quinto comando en mi historial" ("! 5"), que nunca obtuve del todo, o "insertar el quinto y último comando" ("! -5")? ¿Qué hay de los " designadores de palabras " y los " modificadores "?
  • ¿Desea que el comando se ejecute de inmediato (es decir, ingresa sudo !! , presiona enter y todo se ejecuta de inmediato) o estaría bien insertarlo primero para que pueda verificarlo dos veces? Esto es como bash con la opción "histverify" (me inclinaría hacia la última)?
  • ¿Tiene que ser "!!" y "! $" o puede usarse de manera diferente, es decir, ¿es la memoria muscular su problema? Sin embargo, si ese es el caso, nunca estaremos al 100%, y la sustitución del historial _es_ una parte bastante pequeña de bash

Si es solo memoria muscular, también puedes poner lo siguiente en tus fish_user_key_bindings:

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

(El problema que tiene esto, por qué probablemente no deberíamos tomarlo en los enlaces predeterminados, es que luego espera después de haber ingresado "!" para buscar un segundo carácter)

Creo que !! es una mala práctica

El comando sudo !! no le dice a nadie qué ejecutará realmente el shell.
si quiero ejecutar el comando p revious con sudo en el ' a nfang' escribo

^p ^a sudo

Sugiero agregar un mensaje para decirle a la gente que use los comandos de edición de línea ^ py ^ a en lugar de usar la función de historial.

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

Yo también odio !! . Un método más fácil para fish_vi_mode como alternativa a ^p ^a :

^v k I

El hecho de que no te guste una forma de hacer algo no lo hace menos válido.
El 10 de noviembre de 2015 a las 8:14 a. M., "Ivan Tham" [email protected] escribió:

Odio !! también. Un método más fácil para fish_vi_mode como alternativa a ^ p
^ a:

^ vk I

-
Responda a este correo electrónico directamente o véalo en GitHub
https://github.com/fish-shell/fish-shell/issues/288#issuecomment -155416048
.

Lo contrario también es cierto.

Ambos lados de este problema tienen necesidades e inquietudes legítimas. Creo que el principal obstáculo es encontrar la forma correcta de hacerlo en lugar de la forma rápida y sucia.

Estoy de acuerdo y no tengo nada en contra de las otras formas de hacerlo, simplemente no
se ajusta a mis necesidades (y obviamente a las de otras personas).
El 10 de noviembre de 2015 a las 12:19 p. M., "Eric Mrak" [email protected] escribió:

Lo contrario también es cierto.

Ambos lados de este problema tienen necesidades e inquietudes legítimas. creo que el
principal atraco es encontrar la manera _correcta_ de hacerlo en lugar de la rápida y
camino sucio

-
Responda a este correo electrónico directamente o véalo en GitHub
https://github.com/fish-shell/fish-shell/issues/288#issuecomment -155494929
.

Para reiterar los enfoques mencionados en la discusión inicial y ampliarlos un poco: he descubierto que las combinaciones de teclas funcionan mejor para mí que "!!".

Escribí esta función que puede estar vinculada a alguna tecla (^ S para mí, bind \cs 'prepend_command sudo' ). Si la línea de comando tiene contenido, antepone sudo. Si no hay contenido, antepone sudo al último elemento del historial. Entonces sudo !!<Enter> ahora se convierte en ^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

Algunas personas dijeron que configurar algo como esto es demasiado complicado de hacer. Una posible solución podría ser incluir algo funcionalmente similar a mi función en fish, por lo que configurar esto se convierte al menos en una línea.

Por supuesto, esto no responde a otras demandas como some_command --with-subshell-param (!!) .

@Ahti Eso es realmente rudo, lo acabo de hacer funcionar, parece que será un placer usarlo, ¡informaré en un tiempo!

Sí, hasta ahora esto es mejor que sudo !! . Estar a la mitad de un comando y darme cuenta de que debería ser sudo me pasa mucho. ^s , prefijo sudo instantáneo!

Personalmente, nunca usé !! en ningún contexto que no sea sudo !! así que eso no me molesta.

Casualmente probé fish_vi_mode y realmente me gustó. Sin embargo, en el modo Vi ^s ya no parece vincularse. Sugerencias?

De acuerdo, tenía el enlace de claves en config.fish. Encontré # 2254 y luego encontré https://github.com/faho/fish-shell/commit/f7e8ad632a388d5f1c5eb4cfc33f3cdb1f7fd831 y luego encontré http://stackoverflow.com/a/16675092/292408 que confirmó que debería colocar mis enlaces en un fish_user_key_bindings función que aún no existía.

Eso funcionó y ahora, cuando estoy en el modo de comando Vi [N] el prefijo funciona como se esperaba.

Ya tenemos Alt-P para ejecutar la canalización actual en el localizador; Me pregunto si deberíamos agregar Alt-S también.

Creo que @Ahti 's es una solución bastante elegante para lo que todo el mundo ha estado buscando. Directo a una combinación de teclas sin preocuparse por una expansión aleatoria o casos extremos extraños. Simplemente coloca texto para que lo use o cancele como desee.

Me gusta tanto 's sustitución y @Ahti' s solución asociación de teclas @nyarly.
Personalmente, uso !! solo en el contexto de sudo !!

¡Oy! Este hilo ya tiene casi cuatro años. Recientemente compré ǃǃ.com y ǃǃ.net (que Github no me deja hipervínculo, aparentemente, así que copie y pegue) si alguien los quiere.

¡Oye! ¡Eso es genial! @ geoff-codes ¿Cómo hiciste eso?)

Recientemente, han comenzado a permitir nombres de dominio "internacionalizados" .com y .net.
screen shot 2016-05-11 at 4 53 48 am

Sin embargo, el soporte todavía tiene bastantes errores en este momento. Por ejemplo, me dejaron registrar ⵌⵑ. Com pero no ⵌ ǃ.com.

¡¡No sabía que podías registrarte !!. Com, eso es una locura.

La lección aprendida de este problema: si alguna vez escribe un shell de Unix, la única característica que debe asegurarse de implementar es sudo !!, porque parece que la gente no puede vivir sin él.

Sin embargo, en serio, recibí noticias de personas que dicen que esto está funcionando muy bien:

@bucaran Sí, de hecho, ese parece ser el caso 😆.

Nombres de dominio internacionalizados - IDN:

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

editar: demasiado lento con esta publicación, ¡y también registros como esos @ geoff-codes! Debe ser una buena inversión. ¡Un .com de dos caracteres (sorta)!

#!.com embargo,

En la presentación de bash para Windows, el tipo que presentaba escribió algo
como esto:

$> echo hola Windows !!

Y espero que todos puedan adivinar lo que pasó.
El 11 de mayo de 2016 a las 13:57, "Aaron Gyes" [email protected] escribió:

Nombres de dominio internacionales: IDN

El 11 de mayo de 2016 a las 4:44:58 a.m., Timophey ([email protected]) escribió:

¡Oye! ¡Eso es genial! @ geoff-codes https://github.com/geoff-codes ¿Cómo
Uds
¿Haz eso?)

-
Estás recibiendo esto porque estás suscrito a este hilo.
Responda a este correo electrónico directamente o véalo en GitHub
<
https://github.com/fish-shell/fish-shell/issues/288#issuecomment -218435761

-
Estás recibiendo esto porque comentaste.
Responda a este correo electrónico directamente o véalo en GitHub
https://github.com/fish-shell/fish-shell/issues/288#issuecomment -218438118

Entonces, ¿debería cambiar a bash?

@ base698 - Terminé

> which tool
> cat (!!)

para examinar un guión, por ejemplo

Puede instalar el complemento con fisher install nyarly/fish-bang-bang una vez que haya instalado Fisherman.

en aras de la integridad (y dando un ejemplo correcto)
aquí hay una captura de pantalla del video de youtube que mencioné, esta es una de las grandes características del '!!' patrón que ahora también está disponible en Windows.
bangpatternbash

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

Quiere ejecutar git commit -a -m "Rawr!!"

resultados en git commit -a -m "Rawrclear"

¡¡Por mucho que me guste el pescado !! es demasiado útil. No estoy seguro sudo !! pero también como una forma de pasar información previa a nuevos comandos. Por ejemplo:

find . -name something | grep "pattern" entonces jugaría con el patrón hasta conseguir lo que quiero.
Luego lo pasaría a algo así (someCommand !! ). Actualmente, en el pescado, esto requiere demasiados pasos. Las soluciones alternativas no me funcionan lo suficientemente bien.

zsh se expande !! para que pueda editarlo. Así que tendré que volver a Zsh.

Si está usando Fisherman (lo que debería ser), puede instalar nyarly/fish-bang-bang y obtener la expansión en cualquier lugar del comando de !! y !$

@nyarly Sí, lo intenté. Pero no me gusta cómo se expande inmediatamente después de escribir el segundo ! . Se sintió incómodo. zsh se siente mejor porque se expande después de ingresar un espacio o presionar enter.

EDITAR: No importa, no pude hacerlo. Había olvidado lo molesto que era configurar ZSH para que fuera lo que yo quería que fuera. El complemento de nyarly tendrá que funcionar.

¡Estoy tan contento de que esto no se haya implementado! Viola la Ley de ortogonalidad de Fish y la Ley de enfoque del usuario. El reemplazo del historial de Bash requiere pensar demasiado más allá de !! y !$ y tal vez s^ . Es por eso que la gente solo usa esos. La solución de Fish es más interactiva, lo que permite un reemplazo de argumentos más general. Es lo suficientemente eficiente en términos de número de golpes e igualmente eficiente con !! .

Algunos usuarios pierden !! y !$ y no quieren aprender de otra manera. ¿Debería Fish implementar solo estas características como casos extremos (ver Ley de ortogonalidad)? ¿O todo el reemplazo del historial de Bash? ¿O todas las características de otros proyectiles? ¿Todas las funciones que los usuarios pueden pensar?

Aquí hay una solución para cualquiera que quiera copiar y pegar algo:

poner esto en ~ / .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

La URL de https://github.com/fish-shell/fish-shell/issues/288#issuecomment -7869918 está rota. ¿Podrías editar tu comentario para solucionarlo para las personas que lean este problema aún abierto?

Edité su comentario para señalar dónde alojamos ahora las preguntas frecuentes.

Ahora que pescado tiene && y || (https://github.com/fish-shell/fish-shell/issues/4620) ¡Está tan cerca de ser un reemplazo completo de bash!

Estoy realmente confundido --

Entonces, el caparazón que declara su objetivo de diseño número 1 es:

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

... no me permite hacer una de las acciones más utilizadas en cualquier otro shell?

Las preguntas frecuentes sobre peces dicen que los usuarios deberían

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

Hombre, qué tramo. ¿Cuántos usuarios han pulsado el botón "Inicio" en los últimos seis meses por algún motivo? Con ese tiempo, podría argumentar que analizar automáticamente los comandos de la página de manual no es lo suficientemente ortogonal con solo abrir el maldito archivo de hombre y encontrarlo usted mismo.

@andysalerno
la acción que desea hacer es ejecutar el comando anterior con sudo antepuesto
y el pescado proporciona esta funcionalidad
aunque en lugar de entrar
First type "sudo ", then press shift+1, then press shift+1
hago
ctrl+p, ctrl+a, type "sudo "
esto funciona de la misma manera en bash
ahora que mencionaste las preguntas frecuentes, lo revisé nuevamente y alguien eliminó la parte sobre este acceso directo que ahora falta. (Creé https://github.com/fish-shell/fish-shell/pull/3879 para solucionar esto)
La razón por la que este atajo funciona es porque sigue la biblioteca readline que está ampliamente implementada o imitada para la edición de líneas.
Si encuentro el tiempo, crearé una solicitud de extracción para agregar esto a las preguntas frecuentes
Puedo entender tu frustración, usar la tecla Home realmente no es una opción, ya que esa tecla está en un lugar diferente en muchos teclados (por ejemplo, en mis 3 teclados).

gracias por traer esto a colación de nuevo. Creo que es importante tener una manera fácil (solo modificadores y teclas de letras, sin tecla de inicio, sin teclas de flecha), rápida (sin demasiadas pulsaciones) y _documentada_ de hacer esto.

genial, no tenía ni idea de ctrl + p! ¡¡Me gusta esto incluso más que !!.

editar:
¿Hay alguna otra forma de reevaluar el comando de última ejecución? Me encuentro haciendo mucho algo como esto en bash:

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

> less $(!!)

No es tan conciso, pero puede hacer esto con eval y la variable de historial:

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

> less (eval $history[1])

Pero una mejor manera de hacer esto es usando alt-p. Fish canalizará las salidas de los comandos a menos si presiona alt-p después de escribir el comando:

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

No entiendo a toda la gente anti-bang ... hay tantos casos en los que las cosas de bang son ridículamente más rápidas y más convenientes que esas "soluciones" como:
First press Up, then Home, then type "sudo ".

Los comandos Bang son jodidamente mágicos una vez que te acostumbras a ellos ... Realmente espero que los tipos de los peces cambien de opinión y los vuelvan a agregar. Al MENOS algunos de los buenos, como:

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

Sin embargo, el pescado es bastante bueno, sigue así

¿Existe una forma compatible de ejecutar el último comando del historial? No me importa tener que escribirlo, porque solo estoy usando una macro para llamar al comando en mi otra ventana tmux. Pero mi caso de uso es que solo quiero poder hacer algo como esto:

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

Intenté eval $history[1] , pero la segunda llamada explota. Eso es lo útil del comando !! . Lo único que no es realmente aceptable es usar las teclas de flecha. ¿Hay algún comando en Fish que admita este caso de uso?

Lo mejor que puedo pensar en este momento es usar un espacio inicial que evite agregarlo al historial:

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

ciertamente no es genial, lo sé. Sin embargo, en este caso simple, ¿parece que el enlace history-search-backward debería ser suficiente? Esas son las teclas de flecha por defecto, pero puede agregarlas o cambiarlas.

¡Oh! Esa es una buena idea, no pensé en usar el espacio principal. Tendré que intentarlo.

Actualización :
Eso funcionó perfectamente para mi caso de uso. $ eval $history[1] #note extra leading space

Es probable que esta sea la razón por la que no puedo quedarme con Fish. Si bien es elegante y simple, la falta de atajos estándar para muchas cosas lo hace no productivo:

Primer elemento. Quiero repetir el comando anterior con sudo:

sudo !!

1) Presiona el botón Arriba
Problema, tengo que alcanzar el botón Arriba en muchos teclados. Aproximadamente una cuarta parte de las veces lo pierdo y luego debo mirar hacia abajo en el teclado para ver exactamente dónde está y probablemente arreglar lo que haya fallado. Entonces...
2) Presiona Inicio o Ctrl-A
El hogar es otro tramo y está ubicado en tantas ubicaciones diversas en diferentes teclados que tendré que buscarlo. Ctrl-A es más natural, así que supongo que funciona.
3) Escriba 'sudo' y presione regresar.
Ok, son solo siete pulsaciones de teclas, pero una de ellas es propensa a errores y hace que mi flujo de trabajo se interrumpa en un gran porcentaje del tiempo.

Siguiente elemento, quiero ver el último argumento anterior:

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

O con pescado:
1) Escriba 'gato'
2) Alt-Arriba
Ok, de nuevo, esto no es muy natural. Rara vez presiono la tecla Alt y la mayoría de las veces presiono la tecla Super (Cmd / Windows / lo que sea) al lado, lo que cambia el contexto en el que estoy por completo.

Fish necesita una mejor expansión de la historia como todos los principales contendientes. Su falta es una reducción de la productividad para los usuarios de alto nivel.

@wrecklass Debido a que no podía sacar sudo !! de mis dedos, escribí https://github.com/nyarly/fish-bang-bang , que les sugeriré.

Además, IIRC, fish se envía con Alt-S para "anteponer sudo" que funcionará para la última entrada del historial si su comando está actualmente vacío, de la misma manera que Alt-P agregará | less .

Y solo porque sigue apareciendo, ("es decir, ¿por qué no funciona en fish de la forma en que lo hace bash") quiero relacionarme: el tratamiento especial del carácter ! fue una de las cosas que me sacó de bash. Como usuario de pescado desde hace mucho tiempo, me decepcionaría mucho si ese comportamiento se aplicara para apaciguar a una minoría vocal.

sudo !! es algo tan estándar. Entiendo que Fish se está esforzando mucho por alejarse de la antigua sintaxis de bash, pero al alejar características legítimamente útiles a favor de la filosofía personal, creo que detenemos el progreso.

@ClickSentinel , por esta misma razón dejé de usar fish y me quedo con bash . : smiley:

Nuestro plan actual es implementar abreviaturas globales, que luego también pueden admitir "!!" et al. Vea el n. ° 5003 para eso.

Estoy cerrando este tema a favor de eso, ya que ha seguido su curso.

@tukusejssirs y @ClickSentinel , ¿ha intentado agregar el código en https://github.com/fish-shell/fish-shell/issues/288#issuecomment -306212011 a su configuración?

He tenido una variante de eso durante varios años (modificado a partir de un problema (¿este problema, tal vez?) En mi configuración, y es una de las piezas de ergonomía de la carcasa en la que más confío (también, especialmente con el caso adicional Tengo en mi variante hacer una búsqueda de token ascendente usando la cadena antes de !$ , es una de las cosas que más me molesta no tener cuando trabajo en bash).

Mi variante (o tal vez robé la variación ... no recuerdo: 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

Gracias @ scooter-dangle, esto funciona incluso mejor que el # 228

Hay casos en los que Fish proporcionará una forma más idiomática de realizar alguna acción:

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

¿Quizás !! también podría, por defecto, generar tal mensaje sugiriendo una forma alternativa más idiomática de hacerlo?

Sin embargo, la propuesta debería ser igualmente eficaz. Comparar:

  • sudo !!<enter> , todo desde la posición base de las manos en el teclado
  • <up><home>sudo <enter> , como se sugiere en las preguntas frecuentes de Fish, que parece requerir más o menos movimientos de manos dependiendo de dóndeyestán en el teclado.
  • <C-p><Ca>sudo <enter> , accesible sin mover las manos, que también funciona con valores predeterminados de Bash, ZSH y tal vez más, por lo que los usuarios pueden adoptar un nuevo hábito que es portátil cuando tienen que lidiar con otros shells.

Por !$ , sugerir <alt-.> parece estar bien, ¿no?

@psychoslave Por favor, deje de comentar sobre todos los temas antiguos , especialmente los cerrados.

También bloqueando este. Ha sido respondida unas cincuenta veces.

¿Fue útil esta página
0 / 5 - 0 calificaciones