Editor de 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ê, eu estou tentando ambos, 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?

movingtype
fonte

Respostas:

4

Devido ao modo 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 pode ser mapeado e Ctrl + letra vs. Ctrl + Mudança + carta não pode ser distinguida. (A menos que o seu terminal envie um termcap código 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. Isto também se aplica a <Tab> / <C-I>, <CR> / <C-M> / <Esc> / <C-[> etc. (a única exceção é <BS> / <C-H>.) Esse é um ponto doloroso conhecido, e o assunto de várias discussões no vim_dev e no 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. http://groups.google.com/group/vim_dev/browse_thread/thread/626e83fa4588b32a/bfbcb22f37a8a1f8

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 do Vim 8.

Ingo Karkat
fonte
4

A solução dependeria do seu terminal e de como ele é configurado. Terminais Unix geralmente enviam meta personagem ou seqüência quando você espera Alt e pressione 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 caracteres 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, em seguida, 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ê acertar Esc no Vim.

Se o seu terminal está configurado para usar o nº 2, você pode 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 set a <A-CR> Código chave e usar isso 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 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 set próprio comando interpreta cordas como <Esc> literalmente (ou seja, não converte 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 quer definir um tempo muito curto ttimeoutlen para que você não acione acidentalmente esse novo mapeamento com Esc Retorna , 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 duravam apenas um décimo de segundo.

Referências :

  1. :h :set-termcap
  2. :h :map-alt-keys
  3. :h 'ttimeout'
echristopherson
fonte
2

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

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

Etan Reisner
fonte
Ok, Ctrl + m é o mesmo que Enter. Essa parte do mistério está resolvida.
movingtype
Isso resolve ambas as partes, se você pensar sobre isso. Se & lt; Enter & gt; é & lt; C-M & gt; então o que seria & lt; C-Enter & gt; estar? Ou & lt; M-Enter & gt ;? Como eu disse, o gvim pode ser capaz de vinculá-los porque ele possui keypress / etc adicional. capacidade de detecção (se essa chave cai no conjunto que o gvim pode manipular, mas não posso, não tenho certeza).
Etan Reisner
Eu não uso gvim, nunca.
movingtype
Então você está dizendo que não é possível?
movingtype
No console vim? Eu não acredito que seja possível. Eu não acredito que seja uma sequência chave geralmente representável. As versões atuais do xterm podem representar isso, mas o vim não pode usar esse formato de representação.
Etan Reisner