¿Cómo hacer que shift + flechas y ctrl + flechas funcionen en Vim en tmux?

45

Todo esto está en iTerm2 en OS X.

solía tener

export TERM='xterm-256color'

en mi .bashrc. Esto significaba que Vim en tmux usaba 256 colores.

Y una vez que agregué

set -g xterm-keys on

luego los atajos de teclado con modificadores funcionaron bien en Vim. A saber: shift+left/rightque asigné para cambiar las pestañas de Vim, ctrl+up/downque asigné para mover líneas ("burbujas"), y shift+left/rightque funcionó fuera de la caja para saltar por palabra en el modo de línea de comandos (por ejemplo, al escribir algo como :e foo bar baz).

Sin embargo, esta configuración tenía el problema de que el color de fondo de Vim solo se muestra detrás del texto, como se menciona aquí .

Entonces quité

export TERM='xterm-256color'

de mi .bashrcy en su lugar poner esto en mi .tmux.conf:

set -g default-terminal "screen-256color"

Eso solucionó el color de fondo de Vim, pero rompió los atajos de teclado: en su lugar, hacen cosas inesperadas (mueven el cursor, eliminan texto).

Al usar ctrl+vpara insertar la salida literal de las combinaciones de teclas (como se describe aquí ), pude evitarlo:

map [1;5A <C-Up>
map [1;5B <C-Down>
map [1;2D <S-Left>
map [1;2C <S-Right>
cmap [1;2D <S-Left>
cmap [1;2C <S-Right>

Esto hace que los atajos funcionen, pero no parece la solución correcta. ¿Alguien podría decirme qué está pasando aquí y cómo solucionarlo?

Henrik N
fuente

Respuestas:

69

Debe configurar la opción de ventana tmuxxterm-keys para que tmux pase estas claves a sus terminales. Probablemente quieras poner esto en tu ~/.tmux.conf:

set-window-option -g xterm-keys on

Vim generalmente configurará automáticamente su manejo de estas teclas cuando TERM sea xtermalgo, pero omite esto ya que TERM lo es screen-256color. Puede configurar manualmente estas teclas de la ~/.vimrcsiguiente manera:

if &term =~ '^screen'
    " tmux will send xterm-style keys when its xterm-keys option is on
    execute "set <xUp>=\e[1;*A"
    execute "set <xDown>=\e[1;*B"
    execute "set <xRight>=\e[1;*C"
    execute "set <xLeft>=\e[1;*D"
endif

Al menos de esa manera no tienes que mapear todas las combinaciones.

Chris Johnsen
fuente
¡Gracias! Eso se ve mejor que lo que tenía, y agradezco la explicación. Una cosa que se solucionó por lo que tenía, pero no por sus líneas, fue que las flechas arriba / abajo no funcionaban en el complemento Command-T como se describe aquí: superuser.com/questions/237751/ ... Acabo de agregar map <Esc>[B <Down>uno de las respuestas Parece la razón por la cual hay algunos supuestos erróneos hechos por el complemento en sí.
Henrik N
Para ser claros, su solución más map <Esc>[B <Down>de ese otro hilo significa que ahora todo funciona bien.
Henrik N
@HenrikN ¿Podría aclarar qué map <Esc>[B <Down>hace? No veo ninguna diferencia al agregarlo a mi archivo .vimrc.
Francesco Boccardo
@Francesco Boccardo: Si sigues el enlace en mi comentario anterior, y luego sigues el enlace desde allí, llegas a superuser.com/a/215181 que parece explicarlo con un detalle insoportable :)
Henrik N
@HenrikN Gracias. Por lo tanto, es probable que sea un problema relacionado con OSX, o tal vez se haya resuelto en estos 7 años, porque presionar el comando (control?) + R no estropea las teclas de flecha en vim en tmux para mí (estoy en Linux).
Francesco Boccardo
8

Como se explica aquí , deshabilite el Borrado de color de fondo (BCE) borrando la t_utopción del terminal (ejecute :set t_ut=en Vim y luego presione Control+ Lpara actualizar la pantalla del terminal) para que los esquemas de color funcionen correctamente cuando se usa Vim dentro de la pantalla tmux y GNU.

¡De esta manera, puede mantener su TERMvalor en cuanto xterm-256colora la detección de clave adecuada y al mismo tiempo obtener el esquema de color Vim adecuado! :-)

sunaku
fuente
1
¡Hermosa! Gran trabajo de detective.
Henrik N
2
Esto es lo que cambié exactamente: github.com/henrik/dotfiles/commit/… Los colores y las teclas modificadoras parecen funcionar bien tanto fuera como dentro de tmux.
Henrik N