O que o Shift + Enter faz em um terminal, e posso desabilitá-lo no Vim?

3

Todo mundo, de vez em quando, enquanto está no modo de inserção no Vim, eu ficaria feliz em digitar, quando de repente eu seria expulso do modo de inserção e minha última edição seria desfeita após atingir uma certa combinação de teclas. / p>

Hoje percebi que a misteriosa combinação era Shift + Enter. Com certeza, pressionar Shift + Enter é executado, independentemente de estar no modo de inserção.

Eu então tentei pressionar Ctrl + V Shift + Enter para ver qual era o valor literal de Shift + Enter e imprimi-lo:

^[[13;2u

E agora faz sentido - ^ [é escapar, e você no final é desfazer. Os outros personagens não fazem nada quando digitado nesta ordem.

Parece ser um código de controle de algum tipo, mas não consigo encontrar a coisa certa a procurar para saber o que isso significa.

Alguém sabe o que significa esse código de controle e se é possível desabilitá-lo no Vim? Estou assumindo que o meu terminal pode ter algo a ver com isso - estou usando o terminal de estoque do Cygwin para o ssh em uma caixa do Linux e executando o ssh sobre isso.

    
por davidscolgan 15.04.2014 / 22:15

1 resposta

4

Sem entrar nas complexidades das capacidades do terminal e dos códigos de escape, confirmo o que você já descobriu: o terminal está tentando fornecer uma maneira de distinguir entre uma tecla de entrada modificada e não modificada.

Edit: Correção, parece que quando o Vim coloca o terminal Mintty em um modo "raw" ele vê Shift + Digite como um byte nulo e o exibe como ^@ quando você o preceder com Controle + v , mas de outra forma o trata como uma nova linha. p>

Existem várias maneiras de resolver esse problema. Uma é usar o Mintty do Cygwin, que não envia nada de especial com Shift + Enter . Tem outras vantagens sobre o terminal de estoque também.

No entanto, uma solução "rápida e suja" é simplesmente adicionar algo assim ao seu ~/.vimrc na máquina remota:

:imap <esc>[13;2u <CR>

A desvantagem disso é que, a partir desse ponto, toda vez que você pressionar "sair", ele não sairá do modo de inserção até você começar a usar comandos de movimento ou o intervalo de tempo limite do mapa expirar. Veja " :help 'timeout' " e as seguintes entradas relacionadas.

A outra solução pode não ser viável (e pode não resolver o problema de fato), mas é para garantir que sua variável TERM esteja configurada corretamente em seu shell Cygwin antes de você ssh, e no shell remoto depois de ssh, e que eles combinam, ou eles são suficientemente semelhantes. (Você nunca deve ter uma configuração TERM=<anything> incondicional nos arquivos de configuração do shell.)

    
por 15.04.2014 / 22:25