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

45

Isso tudo está 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 eu adicionei

set -g xterm-keys on

depois, os atalhos de teclado com modificadores funcionaram bem no Vim. Ou seja: shift+left/rightque eu mapeei para alternar as guias do Vim, ctrl+up/downque mapeei para mover as linhas ("bolha") e shift+left/rightque funcionou fora da caixa para pular por palavra no modo de linha de comando (por exemplo, ao digitar algo parecido :e foo bar baz).

No entanto, essa configuração teve o problema de que a cor de fundo do Vim é exibida apenas atrás do texto, conforme mencionado aqui .

Então eu removi

export TERM='xterm-256color'

do meu .bashrce, 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 do teclado - eles fazem coisas inesperadas (movem o cursor, excluem texto).

Usando ctrl+vpara inserir a saída literal 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 corrigi-lo?

Henrik N
fonte

Respostas:

69

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

set-window-option -g xterm-keys on

O Vim normalmente configura automaticamente o manuseio dessas chaves quando TERM é xtermalgo, mas ignora isso porque TERM é screen-256color. Você pode configurar manualmente essas chaves da ~/.vimrcseguinte maneira:

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.

Chris Johnsen
fonte
Obrigado! Parece melhor do que eu tinha, e agradeço a explicação. Uma coisa que foi corrigida pelo que eu tinha, mas não pelas suas linhas, foi que as setas para cima / para baixo não funcionavam no plug-in Command-T, conforme descrito aqui: superuser.com/questions/237751/… Acabei de adicionar map <Esc>[B <Down>uma das respostas. Parece o motivo de algumas suposições ruins feitas pelo próprio plugin.
Henrik N
Só para esclarecer, sua solução, além map <Esc>[B <Down>desse outro segmento, significa que tudo agora funciona bem.
Henrik N
@HenrikN Você poderia esclarecer o que map <Esc>[B <Down>faz? Não vejo diferença ao adicioná-lo ao meu arquivo .vimrc.
Francesco Boccardo 10/04
@Francesco Boccardo: Se você segue o link no meu comentário anterior e segue o link novamente a partir daí, você acessa superuser.com/a/215181, que parece explicar isso em detalhes excruciantes :)
Henrik N
@HenrikN Thanks. Portanto, provavelmente é um problema relacionado ao OSX, ou talvez tenha sido resolvido nesses 7 anos, porque pressionar command (control?) + R não atrapalha as teclas de seta no vim no tmux para mim (estou no Linux).
Francesco Boccardo 11/04
8

Como explicado aqui , desative Apagamento de cor de fundo (BCE) limpando a t_utopção do terminal (execute :set t_ut=no Vim e pressione Control+ Lpara atualizar a exibição do terminal) para que os esquemas de cores funcionem corretamente quando o Vim for usado nas telas do tmux e GNU.

Dessa forma, você pode manter seu TERMvalor quanto xterm-256colorà detecção adequada das chaves e também obter a renderização adequada do esquema de cores do Vim! :-)

sunaku
fonte
1
Lindo! Ótimo trabalho de detetive.
Henrik N
2
Foi isso que mudei exatamente: github.com/henrik/dotfiles/commit/… As teclas de cores e modificadoras parecem funcionar bem tanto fora quanto dentro do tmux.
Henrik N