Editor Vim: selecione a palavra com Alt + Return

0

Eu usei um certo editor por muitos anos e me acostumei a selecionar palavras com Alt + Return. Eu não posso perder esse hábito e ainda tentar fazer isso no Vim com muita frequência, sempre sem sucesso.

Então eu tento estes:

noremap     <M-Return>  viw
noremap     <C-Return>  viw

Você vê, estou tentando os dois, Alt + Return e Ctrl + Return. Mas nem funciona.

Isso funciona:

noremap     <C-M>   viw

Eu pressiono Ctrl + m e a palavra é selecionada. Mas vem com um efeito colateral estranho: Return / Enter sozinho também seleciona palavras! E eu não quero isso.

Então, é uma questão dupla:

1) Como posso fazer Alt + Enter selecionar a palavra atual (sob o cursor)?

2) Por que o Return / Enter age como Ctrl + m?

    
por movingtype 10.07.2013 / 19:18

3 respostas

4

Devido à forma como a entrada do teclado é tratada internamente, isso infelizmente não é geralmente possível hoje, mesmo no GVIM. Algumas combinações de teclas, como Ctrl + não-alfabético, não podem ser mapeadas e Ctrl + letra vs. Ctrl + Shift + letra não pode ser distinguida. (A menos que o seu terminal envie um código termcap para ele, o que a maioria não faz.) No modo de inserção ou de linha de comando, tente digitar a combinação de teclas. Se nada acontecer / for inserido, você não poderá usar essa combinação de teclas. Isso também se aplica a <Tab> / <C-I> , <CR> / <C-M> / <Esc> / <C-[> etc. (somente a exceção é <BS> / <C-H> .) Esse é um ponto problemático conhecido e o assunto de várias discussões sobre vim_dev e o canal de IRC #vim.

Algumas pessoas (principalmente Paul LeoNerd Evans) querem consertar isso (mesmo para o console Vim em terminais que apóiam isso), e lançaram várias propostas, cp. link

Mas a partir de hoje, nenhum patch ou voluntário ainda se apresentou, embora muitos tenham expressado o desejo de ter isso em um futuro lançamento importante do Vim 8.

    
por 12.07.2013 / 09:18
4

A solução dependerá do seu terminal e de como ela está configurada. Os terminais Unix geralmente enviam um caractere ou sequência meta quando você mantém Alt e pressiona outra tecla. Existem duas formas tradicionais de enviar meta-caracteres para programas de terminal:

  1. Pegue o valor ASCII da outra tecla pressionada (ou seja, a que não é Alt ) e OR com 128 (definindo o bit 7 alto). Isso é desencorajado nos dias de hoje porque o código de caractere de 8 bits resultante não é compatível com codificações UTF-8 ou mesmo de 8 bits, como o Latin-1.

  2. Envie um caractere de escape, ASCII 27, e depois o código ASCII para a outra chave. Isso funciona bem com uma variedade de codificações, mas pode complicar o tratamento de casos em que você realmente pretendia enviar um caractere de escape explícito, por exemplo, quando você apertar Esc no Vim.

Se o seu terminal estiver configurado para usar o número 2, você poderá ficar tentado a fazer noremap <Esc><CR> viw . No entanto, isso fará com que o Vim pause sempre que receber uma fuga. Para evitar isso, você pode usar set an <A-CR> código-chave e usá-lo no map ; isso faz com que o Vim possa tratar a sequência como diferente de uma seqüência de escape + caractere (em particular, a sequência pode ter um tempo de espera muito menor do que o usado por outros mapeamentos; já que os terminais enviam o caractere de escape e o caractere seguinte simultaneamente, isso pode proteger contra o acionamento acidental de um código de tecla quando você não está tentando).

O comando set interpreta strings como <Esc> literalmente (ou seja, não converte isso em ASCII 27), então você tem que envolvê-lo em um exec :

exec "set <A-CR>=\<Esc>\<CR>"

Depois disso, você pode finalmente fazer um mapeamento:

noremap <A-CR> viw

Você provavelmente também deseja definir um ttimeoutlen muito curto, para não acionar acidentalmente esse novo mapeamento com Esc Retornar , por exemplo

:set timeout timeoutlen=3000 ttimeoutlen=100

faria com que os mapeamentos "normais" esperassem 3 segundos completos entre as teclas, mas os mapeamentos de código de chave fossem apenas um décimo de segundo.

Referências :

  1. :h :set-termcap
  2. :h :map-alt-keys
  3. :h 'ttimeout'
por 10.07.2013 / 22:38
2

Abra um terminal ou coloque-se no modo de inserção no vim e depois pressione <c-v>Return e você verá porque sua <C-M> binding tem esse efeito.

Isso também deve explicar por que você não pode vincular <C-Return> ou <M-Return> no console vim (você pode conseguir no gvim, mas não tenho certeza).

    
por 10.07.2013 / 19:29