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.
fuente
Respuestas:
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:
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.
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-terminal
por ejemplo).Además,
xsel -b
se puede utilizar para canalizar el contenido del portapapeles. Depende de la situación exacta sixsel
la versión de pasta del terminal es más útil. Verman xsel
.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
xsel
la selección primaria, encontrará que las operaciones del portapapeles son lo suficientemente raras como lo suficientemente complejas como para merecer el uso del mouse.fuente
gnome-terminal
tendrí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.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
fuente
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
stty
para enviarSIGINT
e 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
), HagaLuego, 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.
fuente
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:
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.~ $ ls -l
y el emulador de terminal no es consciente de que solo lals -l
parte 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.
fuente
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
micro
editor de texto es el mejor que he visto al emular un editor de texto GUI, similar al DOSedit
pero con características más modernas a la Sublime Text.ne
es 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
libvte
esto 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.fuente
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í.
fuente