Arreglando CTRL- * en vim bajo la pantalla GNU

10

Cuando ejecuto vim en la pantalla GNU, encuentro que las combinaciones CTRLcon las teclas de flecha y Pg * no funcionan como se esperaba.

Estoy usando el vim-gnomepaquete Ubuntu 10.10 .

En una máquina diferente, que también ejecuta Ubuntu, esto funcionó sin problemas; desafortunadamente no tengo esa configuración disponible para mí ahora.

Aquí hay una pregunta relacionada: ¿Cómo arreglar Ctrl + flechas en Vim?

Sin embargo, la solución sugerida es reasignar las combinaciones de teclas de vim para que funcionen con el emulador de terminal, en ese caso PuTTY. No recuerdo haber hecho nada por el estilo, y sospecho que hay una opción de configuración de pantalla que resolverá este problema.

También hay un hilo en la lista de correo gnu-screen que sugiere que ejecutar vim via $ TERM=xterm vimes una solución o solución adecuada. Esto funciona, pero estoy un poco preocupado de que pueda haber efectos secundarios. Tampoco suena lo suficientemente familiar como para ser la solución que configuré en la otra máquina (si fuera necesaria una solución).

intuido
fuente
+1: estaba teniendo el mismo problema y, como usted sugirió, agregarlo term xterma mi ~/.screenrcarchivo lo solucionó por mí. ¡Gracias de nuevo!
Justin Ethier

Respuestas:

4

Como intuyó en su actualización, agregar term xtermal ~/.screenrcarchivo parece solucionar este problema.

Justin Ethier
fuente
Bueno ... sí, pero estoy esperando algún tipo de explicación de por qué screenno solo propaga la $TERMvariable de entorno en lugar de anularla "screen". Presumiblemente hay algunas circunstancias en las que es importante tener $TERM == screen.
intuido
3
@intuited: la razón por la que Screen establece TERM=screenes que las aplicaciones que se ejecutan en el interior se comunican dentro de un terminal de Screen: las secuencias de control que envían y reciben son las de Screen, no las de cualquier terminal que se muestre. Como puede separar una sesión de pantalla y volver a conectarla a un tipo diferente de terminal, esta capa de indirección es necesaria.
Gilles 'SO- deja de ser malvado'
@Gilles: Gracias, sospeché algo así. ¿Qué tipo de problemas podrían surgir al restablecerlo xterm?
intuido
1
No mucho, porque xterm y la pantalla son en su mayoría compatibles. Pero cada uno tiene algunas capacidades que el otro no tiene, y si mientes a las aplicaciones, podrían usar una capacidad que en realidad no funciona. Compare la salida de infocmp screeny infocmp xterm, y las secuencias de escape de pantalla con las secuencias de escape xterm . No tengo un desglose que ofrecer; a la mayoría de las aplicaciones no les importará, pero algunas podrían comportarse de manera molesta.
Gilles 'SO- deja de ser malvado'
2

Hay un par de otras formas de configurar el terminal que funcionan en los procesos en ejecución:

  • En un ejemplo de la pantalla en funcionamiento, presionando ^A- :y ejecutando el comando term xtermhará que recién abiertos pantallas bajo esa instancia para comenzar con su $TERMvariable de entorno conjunto a xterm; esto a su vez se propagará a viminstancias invocadas . Estas instancias de vim mostrarán un comportamiento adecuado con respecto a CTRL-combos; Todavía no he descubierto ningún efecto secundario de esta estrategia. Este comando no afecta a las pantallas existentes. Por supuesto, este comando se puede usar en un ~/.screenrcarchivo, por lo que es posible que este método se haya usado en la otra máquina.

  • En una instancia de vim en ejecución, el comando set term=xtermhará que CTRL-combos funcione en esa instancia de vim. Esto tiene el efecto secundario de desconectar el portapapeles X (es decir, @*y @+) por razones que aún no entiendo. Curiosamente, el efecto secundario del portapapeles también ocurre cuando el comando :set term=screense ejecuta en una instancia de vim iniciada con $TERM=xterm.

phunehehe
fuente
Esta respuesta fue tomada de las actualizaciones del OP. Todo lo que hice fue reformatear y reformular un poco.
phunehehe
2

El problema subyacente es que la asignación realizada screenentre el terminal real (identificado por la TERMvariable de entorno externa screen) y la emulación interna screenestá incompleta.

Si por casualidad lo prueba (usando vttest o tack ), puede notar deficiencias para

  • colores
  • llaves especiales

Intenta solucionar estos problemas configurando term de .screenrctiene el inconveniente de que sólo funciona para un determinado terminal real, y no es portable a otras implementaciones de terminales. Las notas de documentación

Se desaconseja el uso del término comando para fines no predeterminados.

Hay otra solución (con un inconveniente diferente), utilizando esta función de screen documentación :

Cuando la pantalla intenta averiguar un nombre de terminal por sí mismo, primero busca una entrada llamada pantalla. término , donde término es el contenido de su $TERMvariable. Si no existe tal entrada, la pantalla intentascreen (o screen-w, si el terminal es ancho (132 cols o más)). Si incluso esta entrada no se puede encontrar, vt100se utiliza como sustituto.

ncurses proporciona varias descripciones de terminales alternativas útiles para este caso, por ejemplo, screen.xterm-new , para reparar problemas en el mapeo de la pantalla. En la práctica, uso TERM=xterm-new, y cuando ejecuto la pantalla, obtengo una asignación utilizable de las teclas de función.

Refiriéndose de nuevo a la pantalla de termconfiguración, en la prueba se puede notar que hay todavía problemas con la asignación, que se abordan en estas alternativas. Si fuera posible obtener una descripción precisa del terminal usando term, estas alternativas serían simples alias screen. No son.

ncurses no proporciona screen.xterm(sic) porque:

  • TERM=xtermse usa mucho para emuladores de terminal que difieren de xterm; agregar esta asignación solo agravaría esa situación (ver, por ejemplo, ¿ por qué no solo usar TERM configurado en "xterm"? en las preguntas frecuentes de ncurses)
  • screen.xtermes menos probable que el nombre alternativo se instale en sistemas remotos (consulte el comentario de cambio de junio de 2015 en la base de datos del terminal).

En general, sin embargo, usar los nombres alternativos es una mejora sobre el uso termen su .screenrc: resuelve más problemas de los que crea. Lo contrario es cierto de la termconfiguración.

Thomas Dickey
fuente