¿Por qué no puedo resaltar texto en un emulador de terminal de Linux con las teclas Mayús + flechas?

19

Estos son los atajos de teclado estándar de edición de texto que uso constantemente cuando edito texto en, literalmente, cualquier aplicación de Linux que no sean emuladores de terminal:

  • flechas izquierda + derecha para mover izquierda + derecha
  • Ctrl + flecha para mover una palabra completa
  • inicio / fin para pasar al inicio / fin de línea
  • ctrl + c / ctrl + v para copiar / pegar [algunos terminales pueden usar shift-ctrl-C / shift-ctrl-V; este es un buen sustituto]
  • Mayús + flecha para resaltar texto
  • shift + ctrl + flecha para resaltar una palabra completa

Nunca he encontrado una combinación de shell más emulador de terminal que permita los dos últimos elementos en esta lista, y me vuelve loco. Obviamente, los emuladores de terminal admiten el resaltado (el mouse puede hacerlo), y admiten el uso de las teclas ctrl y shift como modificadores (se pueden usar para mover el cursor una palabra completa y poner letras en mayúscula, respectivamente; [edit:] incluso se pueden usar juntos para copiar / pegar con shift-ctrl-C y shift-ctrl-V), entonces, ¿cuál es el problema que impide esta funcionalidad? Tengo varias preguntas

  • ¿Es este un problema con mi emulador de terminal o con mi shell (bash, aunque estoy dispuesto a cambiar)?
  • ¿Por qué los emuladores / capas de terminales no se ajustan a este estándar universal?
  • Si hay una razón real, ¿es antigua y obsoleta, o sigue siendo relevante para un número significativo de usuarios de Linux de escritorio ?
  • ¿Hay algún tipo de solución?
  • ¿Hay algún programa oscuro que pueda usar que soporte esto?
  • ¿Es factible modificar la fuente de, por ejemplo, gnome-terminal para soportar esto?

Sé que el texto se puede copiar / pegar con el mouse, eso no es lo que estoy preguntando. Me pregunto por qué no puedo hacer estas cosas con el teclado en un emulador de terminal.

monguin
fuente
Tenga en cuenta que seleccionar texto con el mouse no cambia la posición del cursor. Si combina la selección de texto con la entrada de comandos regulares en el teclado, sería realmente confuso más allá de los límites del comando que acaba de escribir y aún no se ejecuta. ¿Puede seleccionar texto más allá de los límites del cuadro de texto en una página web con el teclado? Tenga en cuenta también que hay programas como la pantalla que permiten ingresar a un modo diferente que tiene selección de texto para todo el terminal, pero por supuesto ya no permite ingresar comandos.
Daniel Beck
1
Daniel: la consola de Matlab, por ejemplo, es una CLI que permite resaltar texto con el teclado. Funciona perfectamente en mi experiencia; permite la selección más allá del comando actual aún no ejecutado si lo desea, personalmente tengo poco uso para eso.
monguin
ver también stackoverflow.com/questions/1536757/…
Nikos Alexandris el
y aquí también stackoverflow.com/q/312213/1172302
Nikos Alexandris

Respuestas:

5

Creo que sería más útil si tomara esto pieza por pieza. El problema general es: ¿para quién está destinada la pulsación de teclas? ¿El terminal o el programa que se ejecuta dentro del terminal?

Como ejemplo, "screen", que es una especie de terminal, usa Ctrl+ Acomo prefijo para sus comandos, para distinguirlos de las cosas que van al programa en ejecución. (Y proporciona una forma de enviar Ctrl+ A).

gnome-terminal tiene varias claves que captura para hacer varias cosas, incluidas algunas de las que pregunta.

También tenga en cuenta que el "resaltado" de un terminal está separado de la posición del cursor del terminal . Algunas terminales no tienen la capacidad de resaltarse en absoluto.

Ahora, tomando estas combinaciones de teclas a la vez:

flechas izquierda + derecha para mover izquierda + derecha Ctrl + flecha para mover una palabra completa inicio / fin para mover al inicio / fin de línea

Mover lo que izquierda y derecha? Bash se puede configurar para hacer esto, y generalmente es por defecto. Típicamente, estos mueven la posición del cursor.

ctrl + c / ctrl + v para copiar / pegar

Primero: ¿tiene sentido copiar / pegar? Si estás en una TV, realmente no tienes un portapapeles, especialmente si X no se está ejecutando.

Algunos terminales pueden copiar texto en la salida, y algunos también "pegarán" simulando que escribe los contenidos del portapapeles. Ctrl+ Shift+ V, por ejemplo, es pegar gnome-terminal, lo que puede ayudar. (Y Ctrl+ Shift+ Ces copia). Como se discutió anteriormente, el gran problema con Ctrl+ Cy Ctrl+ Ves que se superponen con comandos comunes de terminal / programa. ( Ctrl+ Ces enviar interrupción (SIGINT) y Ctrl+ Ves textualmente).

Algunos terminales también admiten dos modos de copia de datos: una "copia simple" más normal, y lo que se conoce como "selección de bloque" o "copia de bloque". (Mantenga presionado Ctrly luego arrastre, gnome-terminalpor ejemplo).

Además, xsel -bse puede utilizar para canalizar el contenido del portapapeles. Depende de la situación exacta si xsella versión de pasta del terminal es más útil. Ver man xsel.

shift + flecha para resaltar texto shift + ctrl + flecha para resaltar una palabra completa

El resaltado de su terminal (si tiene esta capacidad) está separado de la posición del cursor. Nuevamente, la falta de combinaciones de teclas disponibles es probablemente un factor. Tenga en cuenta que un resaltado tiene dos posiciones: el inicio y el final, o las esquinas superior izquierda e inferior derecha. ¿Cómo manejas ambos?

Finalmente, tenga en cuenta que muchos terminales GUI, al hacer doble clic en una palabra, la resaltará. (Y en X, copie a la selección primaria).

screen, como ejemplo, tiene teclas para cambiar a un modo para moverse por el búfer (salida anterior) y copiar / pegar.

Creo que si hace un uso adecuado de xsella selección primaria, encontrará que las operaciones del portapapeles son lo suficientemente raras como lo suficientemente complejas como para merecer el uso del mouse.

Thanatos
fuente
55
Aprecio el tiempo que tomó para escribir su respuesta, pero de alguna manera no siento que entienda mejor por qué esta no es una característica disponible en los emuladores de terminal. Usted me señaló una nueva idea: que un emulador de terminal es único porque puede ejecutar otros programas, pero no entiendo por qué solo un subconjunto selecto de combinaciones de teclas es imposible de poner a disposición del usuario.
monguin
2
Los emuladores de terminal emulan terminales físicos . No se crearon desde cero para proporcionar una interfaz de línea de comandos. Cosas como Control-C habían establecido significados mucho antes de que Microsoft decidiera cooptarlos como atajos de teclado, y los emuladores de terminal deben adherirse a ellos.
chepner
2
Creo que el diablo está en los detalles aquí. No es imposible: creo que la pantalla tiene un modo para hacer lo que quieras. Pero para lograrlo, debe cambiar al modo "Quiero seleccionar cosas". gnome-terminaltendrían problemas similares: probablemente no lo implementaron porque no es exactamente algo que estás haciendo. Tenga en cuenta que el shell no es el único programa en ejecución: cualquier programa podría estar ejecutándose, y podría querer usar cualquier secuencia de teclas que pueda usar para copiar / pegar para sus propios fines. La pantalla tiene formas de enviar las claves que anula, y gnome-terminal intenta no pisar los dedos de los pies.
Thanatos
1
La selección de bloque es un medio para seleccionar un rectángulo: mantenga presionado el control y arrastre en gnome-terminal, y debería ver de inmediato cómo es diferente. La mayoría de los emuladores de terminal GUI tienen esta capacidad, y los editores de texto más avanzados también. (Ver Bloque visual en vim, por ejemplo.)
Thanatos
1
Ah, entonces estoy familiarizado con la selección de bloque, pero no estaba al tanto del nombre. Tampoco conozco un atajo de teclado GUI para esa acción, por lo que parece innecesario inventar uno por el simple hecho de responder a mi pregunta. Agradezco los comentarios de todos aquí, pero como todavía estoy insatisfecho, supongo que todo lo que puedo hacer ahora es indagar en el origen mismo ...
monguin
1

No soy un experto en emuladores de terminal pero ...

Las aplicaciones como bash (readline) que se ejecutan en un emulador de terminal no saben nada sobre el sistema X Window en ejecución y la ventana X en la que se encuentran, conocen stdin y stdout en un dispositivo terminal (ttyS / ttyUSB / tty / pts en linux).

El problema no es mostrar texto resaltado, sino cómo informar a la aplicación de la ventana X (el emulador de terminal) que el texto ha sido seleccionado, a través de estos dispositivos terminales.

Yo supongo que la aplicación de terminales X uno abierto de esos dispositivos en entrada y salida y luego traducir los eventos clave a X adecuadamente de salida (de lado) X de entrada (de un lado bash). Viceversa, el flujo de salida de bash al terminal X como entrada , aquí el terminal X procesa esta entrada para mover el cursor, rellena el fondo con algo de color, de acuerdo con el resultado de la aplicación de bash.

Para mis códigos de escape de conocimiento se pueden utilizar para controlar los comportamientos especiales, como clara, rellenar el fondo, mover el cursor, y tal vez un poco de costumbre se podría añadir código de escape para dar a conocer el terminal X que un texto de fila, columna de la fila, col ha sido seleccionado, solo un ejemplo, tal vez el texto seleccionado podría ser devuelto (un detalle de implementación).

Yo supongo no ser una definición estándar que tendrá que conectar cada aplicación que desea apoyar a saber acerca de la combinación de teclas ha presionado y la salida el código de escape apropiado, el readline si lo desea en el bash, el emulador de terminal en X el otro lado para procesar correctamente el código de escape (y finalmente enviar la información al portapapeles). Probablemente, implementar esto como una capacidad de terminal lo salvaría de parchear cada aplicación. Espero (y supongo) que los controladores de dispositivos terminales en el kernel quieran saber lo menos posible sobre los códigos de escape, por lo que si tiene suerte no se requerirá ningún parche.

El terminal X dibuja la salida, para que sepa fácilmente, cuando usa el mouse, qué texto / caracteres está seleccionando.

Un widget de texto gráfico sabe todo acerca de su ventana X, por eso es tan fácil implementar seleccionar y copiar.

EDITAR

Aquí este parche de visualización de imagen urxvt-9.16 podría ser un buen punto de partida para comprender lo que se necesita para admitir nuevos códigos de escape. http://lists.schmorp.de/pipermail/rxvt-unicode/2013q1/001736.html

Alex
fuente
1

Las respuestas que se dan son buenas explicaciones de por qué hacer esto es difícil. Aquí hay algo que puede hacer en gnome-terminal para configurar ctrl-cy ctrl-vcopiar y pegar, mientras vuelve a vincular otras teclas en la disciplina de terminal sttypara enviar SIGINTe insertar un carácter literalmente. Esta no es una solución completa porque algunos programas deshabilitan la disciplina del terminal y no podrá enviarlos '^ C' y '^ V'. Más información aquí .

En su script de inicio de shell (p. Ej. ~/.bashrc . . ~/.zshrc, ~/.rcrc), Haga

stty intr '^Q' 2>/dev/null  # To send SIGINT I will use ctrl-q
stty lnext '^A' 2>/dev/null # To insert a character verbatim I will use ctrl-a

Luego, en gnome-terminal Edición> Preferencias> Accesos directos, puede vincular Copiar y Pegar a ctrl-c y ctrl-v. Tenga en cuenta que el terminal obtendrá los eventos clave antes de que se envíe algo al dispositivo terminal, por lo que a partir de ese momento no podrá enviar '^ C' y '^ V' a ningún proceso que se ejecute en el terminal.

Acabo de hacer esto y veré cómo va, y qué problemas causa. Hice los stty condicionalmente para aplicarlos solo cuando ejecuto X.

spelufo
fuente
1
Gracias por la respuesta. Mientras tanto, me he acostumbrado a los enlaces de OSX y Emacs, y también he renunciado al sueño de ctrl + shift + flecha en una terminal ...
monguin
1

Como mencionó Thanatos, hay que hacer una distinción entre el emulador de terminal (que se ejecuta en X Windows o Wayland) y los programas que se ejecutan dentro del terminal (llamémosle "shell", aunque podría no serlo); Estas dos cosas están aisladas unas de otras (ver detalles técnicos ).

Los primeros elementos de su lista (teclas de flecha, Inicio / Fin, etc.) son manejados directamente por el programa dentro del terminal, y así posición cursor es controlada por el programa dentro del terminal.

Los accesos directos de copiar y pegar (Ctrl + Shift + C y Ctrl + Shift + V), por otro lado, son manejados por el emulador de terminal, que comprende el mouse (para que pueda seleccionar texto con el mouse), sabe lo que es en la pantalla (para que pueda copiar), y puede enviar pulsaciones de teclas al programa dentro (para que pueda pegar).

Para admitir Mayús + Izquierda y Mayús + Derecha, el emulador de terminal o el shell deberían manejar la pulsación de tecla. De cualquier manera tenemos un problema:

  1. El shell no puede manejar fácilmente estas teclas porque eventualmente querrá copiar el texto seleccionado en el portapapeles, y el portapapeles es un concepto de X Windows al que el shell no necesariamente tiene acceso (pero vea xclip). Y hasta donde yo sé, si el shell admite la selección de texto, Linux no define ningún mecanismo para notificar al emulador de terminal sobre lo que está seleccionado.
  2. Mientras tanto, el emulador de terminal no se encarga de la ubicación del cursor. Incluso si el emulador de terminal pudiera cambiar la ubicación del cursor, probablemente no sepa dónde comienza y termina la línea de texto actual. Por ejemplo, el terminal puede contener texto como ~ $ ls -ly el emulador de terminal no es consciente de que solo la ls -lparte pertenece al usuario.

No es difícil imaginar un emulador de terminal que admita la selección con Mayús + Flechas, pero supongo que tendría que ocultar el cursor del shell e introducir su propio "cursor falso" que existe temporalmente para ayudarlo a seleccionar algo, y luego podría presionar Ctrl + C / Ctrl + Shift + C / Ctrl + Ins para copiar (o Esc para cancelar) y mostrar el cursor real una vez más. Por supuesto, esto no tendría todas las capacidades de una selección normal: notablemente cortar y eliminar no existiría.

Qwertie
fuente
Gracias, leeré ese artículo de TTY, pero aún no lo he hecho. Eso podría explicar la brecha en mi comprensión de la diferencia entre "emuladores de terminal" y "aplicaciones de escritorio que manejan programas de texto". Mi ejemplo anterior, la consola Matlab, se comporta exactamente como yo quiero. No entiendo por qué no puede haber una aplicación de escritorio con ese comportamiento, donde el programa de texto que se ejecuta dentro es algo además de Matlab. Digamos que quería usar solo los comandos de shell más básicos: ls, cd, cp, mv, entonces no veo ningún conflicto. Entiendo que programas como screen o tmux podrían complicar las cosas.
monguin
1

Estos son los enlaces de teclado CUA que usted describe, un estándar de IBM a mediados de los 80:

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

Por lo general, se implementan en todos los entornos de escritorio creados desde entonces. Las herramientas de DOS, Windows, Motif e incluso Netware convergieron en este estándar. Una excepción es la Mac, que utiliza un conjunto bastante similar pero diferente (Cmd en lugar de Ctrl) del mismo período de tiempo.

Sin embargo, los terminales Unix son anteriores a este estándar y, en su mayoría, lo ignoraron. Además, si implementaron estos enlaces de teclas, podría interferir con los programas TUI que ya los usan para otras funciones. Entonces, aunque técnicamente es factible, también es problemático.

Aplicaciones:

El microeditor de texto es el mejor que he visto al emular un editor de texto GUI, similar al DOS  editpero con características más modernas a la Sublime Text. nees una versión anterior en repositorios de Debian, e inclusonano versión anterior en repositorios de se puede configurar con combinaciones de teclas sensatas. Pero el terminal / shell desnudo, no.

Con libvteesto podría ser fácil construir una terminal virtual rudimentaria que maneje estas combinaciones de teclas usted mismo. Sin embargo, mucho trabajo por una pequeña ganancia.

Gringo Suave
fuente
0

Simplemente ayudé a un amigo a resolver un problema similar a este y descubrí que el administrador del portapapeles era el culpable.

sudo apt-get remove clipit

fue capaz de hacer que todo volviera a funcionar perfectamente para él. Espero que pueda ayudar a alguien más por ahí.

Mandela afectada
fuente
¿Respondiste la pregunta equivocada? Esta fue una pregunta general sobre las capacidades de todos los emuladores de terminal. Está bastante claro que no hay una "solución". Ahora no, ni he tenido Clipit instalado en ninguna máquina.
monguin