¿Cómo descongelar después de presionar accidentalmente Ctrl-S en un terminal?

728

Es una situación que me ha sucedido con bastante frecuencia: después de presionar (con una intención diferente) Ctrl-Sen un terminal, la interacción (entrada o salida) se congela. Probablemente sea una especie de "bloqueo de desplazamiento" o lo que sea.

¿Cómo descongelo el terminal después de esto?

(Esta vez, he estado trabajando apt-shelldentro de un bashinterior, no urxvtestoy seguro de cuál de ellos es responsable del manejo especial de Ctrl-S: estaba buscando el historial de comandos al revés C-r, como de costumbre para readline, pero luego quería volver "atrás" "avanza a través de la historia con lo habitual, al menos en Emacs-- C-s( 1 , 2 , 3 ), pero eso provocó que el terminal se congele. Bueno, el desplazamiento / paginación para ver cosas pasadas todavía funciona en el terminal, pero no hay interacción con los procesos que se ejecutan allí)

imz - Ivan Zakharyaschev
fuente
23
Estaba trabajando vimy presioné Ctrl-S para guardar mis ediciones. Uh-ohXD
ADTC
44
¿Por qué existe eso en primer lugar?
neverMind9

Respuestas:

861

Ctrl-Q

Para deshabilitar esto por completo, pegue stty -ixonun script de inicio. Para permitir que cualquier tecla haga que las cosas vuelvan a fluir, use stty ixany.

ps: No es ni el terminal ni el shell lo que hace esto, sino el controlador de terminal del sistema operativo.

ak2
fuente
8
¡Gracias! Por cierto, allí sugirieron Ctrl-C; ¿Funciona también? (Y en otro lugar , sugirieron Ctrl-Q, igual que tú.)
imz - Ivan Zakharyaschev
23
Ctrl-C funciona, pero también envía una señal de interrupción, que generalmente no se desea. (Por cierto, las teclas que se utilizan para estas cosas son configurables stty)
Ak2
2
Recuerdo haber probado esta combinación en mi Apple] [clon, y funcionó allí también, Ctrl-Sy luego se Ctrl-Qreanudó.
sashoalm
19
GRACIAS A DIOS !! Esto ha sido algo que me está molestando durante años. No estoy seguro de por qué VIM simplemente no ha implementado esto como un acceso directo nativo para guardar en lugar de lo que sea que haga. Es bueno saber que hay un escape de la prisión que es la pantalla VIM congelada debido al uso natural de CTRL + S (guardar acceso directo) que es aplicable en casi todas las aplicaciones, EXCEPTO VIM.
Kraang Prime
8
@SanuelJackson Ctrl-S "guardar acceso directo" es aplicable en casi todas las aplicaciones DESKTOP EXCEPTO vim. Y excepto Emacs. Y nano. Y cualquier otra "aplicación" que pueda ejecutar en un terminal, exactamente porque ya está siendo utilizada por el terminal para el control de flujo. Es la misma razón por la que no encontrarás una aplicación de escritorio de Linux usando los atajos Ctrl-Alt-FN: porque ya los usa el sistema.
gerlos
383

Ctrl- De Qhecho es la respuesta. Pensé en incluir un poco de historia de esto que es demasiado larga para caber en los márgenes de la respuesta correcta de ak2 .

En la Edad Media, un terminal era un gran equipo que se conectaba a un dispositivo remoto (originalmente otro terminal porque los teletipos eran mucho más fáciles de aprender a operar que una tecla telegráfica) a través de un cable largo o mediante líneas telefónicas con módems. Cuando Unix se estaba desarrollando, el código ASCII ya estaba bien establecido (aunque el código EBCDIC de la competencia de IBM todavía era una fuerza a tener en cuenta).

Los primeros terminales mantuvieron un registro impreso de cada personaje recibido. Siempre que los caracteres lleguen no más rápido de lo que el cabezal de impresión podría escribirlos, al menos. Pero tan pronto como los terminales basados ​​en CRT fueron posibles, surgió el problema de que solo unas 25 líneas cabían en el CRT, y 25 líneas de 80 caracteres representaban suficiente RAM que nadie pensó seriamente en proporcionar más RAM para los caracteres que se habían desplazado desde la parte superior de la pantalla.

Por lo tanto, se necesitaba cierta convención para indicar que el final del envío debería detenerse para permitir que el lector se pusiera al día.

El código ASCII de 7 bits tiene 33 puntos de código dedicados a caracteres de control (0 a 31 y 127). Algunos de los que tenían propósitos muy bien establecidos, tales como NUL(guía de la cinta de papel en blanco para roscar, lagunas, y empalmes), DEL( "tachado" personajes en la cinta de papel indicadas por la perforación de los siete agujeros), BEL(ding!), CR, LF, Y TAB. Sin embargo, cuatro fueron definidos explícitamente para controlar el dispositivo terminal de sí mismo ( DC1a DC4aka Ctrl + Q, Ctrl + R, Ctrl + S y Ctrl + T).

Mi mejor conjetura es que algún ingeniero pensó que (a medida que avanza la mnemotecnia), "S" para "Detener" y "Q" para "Continuar" no estaban tan mal, y se les asignó el DC3significado de "por favor, dejen de enviar" y DC1de "ok , continuar enviando ahora ".

Incluso esa convención ya estaba bien establecida cuando Unix estaba dejando el nido en los Laboratorios Bell para salir al mundo.

La convención se conoce como control de flujo de software y es extremadamente común en dispositivos seriales reales. No es fácil de implementar correctamente, ya que evita el uso de cualquiera de esos caracteres para cualquier otro propósito en el canal de comunicaciones, y la señal de Stop debe manejarse antes de los caracteres recibidos pendientes para evitar enviar más de lo que el extremo receptor puede encargarse de.

Si es práctico, se prefiere ampliamente utilizar señales adicionales fuera de banda del flujo de datos en serie para el control de flujo. En las conexiones cableadas directamente que pueden permitirse los cables de señal adicionales, encontrará un apretón de manos de hardware en uso, que libera esos caracteres para otros usos.

Por supuesto, la ventana de terminal de hoy no está utilizando un puerto serie físico real, tiene barras de desplazamiento y realmente no necesita el protocolo de comunicación. Pero la convención persiste.

Recuerdo la afirmación de que Richard Stallman recibió quejas sobre su asignación Ctrl + S a la búsqueda incremental en las primeras versiones de emacs, y que no simpatizaba con ningún usuario que tuviera que depender de una conexión controlada por flujo de software de 7 bits.

RBerteig
fuente
2
Gracias ... muy interesante ... Me he estado preguntando: ¿Por qué demonios alguien elegiría Continuar un proceso con "Q", que se usa comúnmente (ahora) para Salir ... La agrupación QRST lo explica .....
Peter.O
13
Muchas gracias por ese poco de historia. Recientemente deshabilité el control de flujo por defecto en un emulador de terminal que mantengo, pero tuve que restablecerlo bastante rápido después de las protestas de los tradicionalistas de Unix que todavía lo usan. En cambio, configuré el bit ixany, para que al menos las personas que presionan ^ S sin saber acerca de ^ Q no se atasquen.
ak2
3
@RBerteig Me encontré con algo similar al aprender sobre el retroceso y eliminar. Retroceso es oficialmente ^ H y eliminar es ^? Algunas personas, como los desarrolladores de Emacs (¿Stallman de nuevo?) Querían ^ H disponible para fines generales, como accesos directos como Ayuda. La secuencia de escape ^ [[3 ~ o algo así fue creada para reemplazar ^? y retroceso ahora se convirtió en el antiguo carácter de eliminación ^ ?. De hecho, he visto ncurses parcheado específicamente en distribuciones de Linux para reasignar esas claves en terminfo, mientras que ncurses en FreeBSD no tiene parches, lo que causa parte de la molesta confusión que hace que el espacio de retroceso no funcione.
penguin359
23
Solía ​​preguntarme por qué DEL tenía el código 127 en lugar de estar agrupado con los otros caracteres de control, hasta que jugué por primera vez con cinta de papel y un ASR33. Una vez que me di cuenta de que tenía el efecto de perforar todos los agujeros, lo que significaba que podría sobrecargarse a cualquier personaje previamente perforado para eliminarlo, tenía sentido.
RBerteig
3
@SanuelJackson Ha pasado algún tiempo desde que miré de cerca, pero el vimrc predeterminado que se envía con Windows ha asignado <Cs> a ": actualización" durante muchos años. También estoy bastante seguro de que lo he visto en algunas distribuciones para gvim en el pasado también. Sin embargo, si está utilizando vim en una terminal, este historial sigue siendo muy relevante. Los emuladores de terminal modernos aún implementan las teclas de control de flujo, por lo que incluso si vim las mapeó, nunca las vería a menos que cada usuario hiciera todo lo posible para desactivar el control de flujo como se describe en la respuesta aceptada.
Dibujó el