Como mapear a tecla Alt?

37

Estou tentando mapear a Altchave da seguinte maneira:

:map <A-j> j
:map <A-k> k

mas não funciona (a campainha está ativada Alt + j/ Alt + k).

O que estou perdendo?

Estou usando o Terminal no OSX, o mesmo acontece no Linux remoto.


Em Ctrl + v, Alt + jeu tenho: ?~H~F( quando encoding=utf-8).

Em Ctrl + v, Alt + keu tenho: ?~Z( ˚quando encoding=utf-8).

A execução do vim sem plugins ( -u NONE) não faz nenhuma diferença.

kenorb
fonte
11
Funciona Alt(pressione, não segure) e jfunciona? Com xtermpelo menos eu preciso definir metaSendsEscapepara true que essas seqüências funcionem ... Não sei se você tem o mesmo problema e não uso o OSX, portanto não posso testar ...
Martin Tournoij
@Carpetsmoker Pressionar Alt, soltar jou qualquer outra tecla funciona normalmente. Eu verifiquei e encontrei a opção 'Usar opção como meta-chave' , habilitei e ele funciona agora. Então, a configuração metaSendsEscapefez o truque, obrigado.
kenorb
3
Esta questão foi respondida anteriormente (com uma resposta melhor) aqui: stackoverflow.com/questions/6778961/…
user3751385 5/16

Respostas:

35

É assim que eu faço no Linux ou Cygwin:

Primeiro verifique quais caracteres são enviados pelo seu terminal quando você pressiona ALT+ J:

Para fazer isso, eu vou para o console e execute sed -n l(você também pode usá cat-lo). Então eu pressiono ALT+ Je vejo que os caracteres na tela são ^[j.

Eu substituo ^[por \e(porque é isso que é enviado pelo meu terminal quando pressiono esc) e a string final para mim é \ej.

Então eu escrevo para o meu .vimrc:

execute "set <M-j>=\ej"
nnoremap <M-j> j

E o mapeamento funciona.

Kossak
fonte
4
Não consigo encontrar a documentação da :set <M-j>=\ejpeça. O que devo procurar?
Evgeni Sergeev
11
Obrigado pela resposta, esta foi a única solução que funcionou para mim com o Iterm + vim
newUserNameHere
Nah, isso não funciona. Às vezes ESC-J atuará como ALT-J
user3751385
11
@EvgeniSergeev See:help :set-termcap
Rich
9

Com a ajuda do Carpetsmoker , parece que o Terminal não foi configurado para 'Usar Alt / opção como meta-chave' (isso é especialmente comum nos Terminais da GUI).

Para o Terminal no OSX, está em Preferências -> Configurações -> guia Teclado -> 'Usar opção como meta-chave' . Verificação: Como posso alterar o Terminal para usar a opção como meta-chave? ( Mavericks ).

Para o XTerm, verifique: Configurando o XTerm como Padrão para o Meta Sends Escape, que diz:

Adicione esta linha em qualquer lugar do seu arquivo .Xdefaults pessoal ( ~/.Xdefaults):

xterm*metaSendsEscape: true

Em seguida, recarregue a configuração com xrdb. Sem essa etapa, as alterações .Xdefaultsnão terão efeito até o próximo reinício do X:

xrdb -l ~/.Xdefaults

Em seguida, mapeamentos padrão com Altchave como:

:map <A-j> j
:map <A-k> k

funciona bem.

Para obter ajuda, consulte: :h :map-alt-keys.

kenorb
fonte
4
Pode também querer olhar para :h :map-alt-keyscomo outra fonte de informações
Peter Rincker
4

Semelhante à resposta de Kossak, mas um pouco mais simples, mapeando o pressionamento de teclas literais.

No modo normal, depois de pressionar :ou inserido no seu .vimrc, mapeie a entrada diretamente iniciando o mapeamento:

nnoremap 

depois pressionando Ctrl+ Ve a tecla para gravar, por exemplo, Alt+ . Isso será exibido como algo assim:

nnoremap ^[[1;3D

mas cada ^[um é um caractere de escape único e literal e o destaque da sintaxe deve mostrar isso. Substitua o escape literal (s) pelo texto <Esc>e acrescente o comando que você deseja usar:

nnoremap <Esc>[1;3D <C-w>h

Eu sei que o OP estava mapeando Alt+ letras, mas usei setas para mostrar como fazer isso para algo que pode não ser mapeado por padrão.

Walf
fonte
Funcionou como um encanto, muito obrigado!
aryndin 24/10
2

Isso funciona para mim no Ubuntu 16.04 xfce terminal (e alacritty rust terminal)

Defina o gatilho do ultisnip snippet para Meta-/(assim como o snippet do emacs)

let g:UltiSnipsExpandTrigger="^[/"

Aqui está agora, eu digito ^[/no vim

No modo de inserção Ctrl-V Alt-/

( Metaé a Alttecla do teclado do meu PC)

user178047
fonte
1

Se Control+Vseguido por ALT-xshows ^[x(digite o terminal), você pode corrigi-lo com este pequeno script em vim.wikia.com :

for i in range(97,122)
  let c = nr2char(i)
  exec "map \e".c." <M-".c.">"
  exec "map! \e".c." <M-".c.">"
endfor

Adicione ao .vimrc para todos os mapeamentos de teclas alt.

Laktak
fonte