Como obter shift + arrows e ctrl + arrows trabalhando no Vim no tmux?

38

Isso é tudo no iTerm2 no OS X.

Eu costumava ter

export TERM='xterm-256color'

no meu .bashrc . Isso significava que o Vim no tmux usava 256 cores.

E uma vez que adicionei

set -g xterm-keys on

os atalhos de teclado com modificadores funcionavam bem no Vim. Ou seja: shift+left/right que mapeei para alternar as guias do Vim, ctrl+up/down que mapeei para mover linhas ("bolha") e shift+left/right que funcionou fora da caixa para saltar por palavra no modo de linha de comando ao digitar algo como :e foo bar baz ).

No entanto, essa configuração tinha o problema de a cor de fundo do Vim aparecer apenas atrás do texto, como mencionado aqui .

Então eu removi

export TERM='xterm-256color'

do meu .bashrc e, em vez disso, coloque isso no meu .tmux.conf :

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

Isso corrigiu a cor de fundo do Vim, mas quebrou os atalhos de teclado - eles fazem coisas inesperadas (mova o cursor, exclua o texto).

Usando ctrl+v para inserir a saída textual das combinações de teclas (conforme descrito aqui ), eu pude contornar isso:

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>

Isso faz com que os atalhos funcionem, mas não parece a solução certa. Alguém poderia me dizer o que está acontecendo aqui e como consertar isso?

    
por Henrik N 17.03.2012 / 23:13

2 respostas

61

Você precisa definir a opção da janela tmux xterm-keys para que tmux passe essas chaves para seus terminais. Você provavelmente quer colocar isso no seu ~/.tmux.conf :

set-window-option -g xterm-keys on
O

Vim normalmente irá configurar automaticamente o seu manuseio dessas chaves quando TERM for xterm -alguma coisa, mas pulará isto, uma vez que TERM é screen-256color . Você pode configurar manualmente estas chaves no seu ~/.vimrc assim:

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

Pelo menos dessa forma, você não precisa mapear todas as várias combinações.

    
por 18.03.2012 / 13:18
7

Conforme explicado aqui , desative Apagar cor de fundo (BCE ) limpando a opção t_ut terminal (execute :set t_ut= no Vim e depois pressione Controlar + L para atualizar a exibição do terminal) para que os esquemas de cores funcionem corretamente quando o Vim é usado dentro do tmux e da tela GNU.

Dessa forma, você pode manter seu valor de TERM como xterm-256color para a detecção de chaves adequada, enquanto também obtém a renderização adequada do esquema de cores Vim também! : -)

    
por 07.03.2013 / 20:09