Posso mapear a tecla Alt no Vim?

87

Tentei mapear como adicionando a linha abaixo a .vimrc, mas não funcionou. Verifiquei se o .vimrc é carregado pelo Vim.

map <Alt-D> <C-D>

existe algum erro neste mapeamento?

Thomson
fonte
Você está usando o vim em um terminal ou uma versão gui (gvim, macvim)?
Nick Knowlson
Observe também que, se suas encodingalterações após a execução do mapeamento, o que você obtém com as teclas Alt pode não corresponder ao que você definiu inicialmente.
dash-tom-bang de

Respostas:

133

Para usuários de Mac: para mapear ALT + hjkl, use o caractere real gerado (descubra qual caractere usando a combinação enquanto no modo INSERT), por exemplo, com meu teclado eu obtenho:

<ALT+j> ==> ª
<ALT+k> ==> º

e assim por diante. Solução encontrada aqui no StackOverflow.

Usei isso para mover as linhas para cima e para baixo com ALT + k \ j, usando isso no meu .vimrc:

nnoremap ª :m .+1<CR>==
nnoremap º :m .-2<CR>==

inoremap ª <Esc>:m .+1<CR>==gi
inoremap º <Esc>:m .-2<CR>==gi

vnoremap ª :m '>+1<CR>gv=gv
vnoremap º :m '<-2<CR>gv=gv

conforme explicado aqui .

Espero que seja útil, aproveite o Vim :)

ADENDO DE Dylan_Larkin (2019): Para que funcione em um Mac, " Use Option as Meta Key " deve ser DESLIGADO em Terminal-> Preferences-> Keyboard

Bruno Belotti
fonte
10
É exatamente para isso que vim aqui (Alt + HJKL para mover divisões)! Obrigado!
Jamie Schembri
6
Uma maneira fácil de descobrir qual é o caractere é usando cat. Basta digitar cate dentro da janela do gato a combinação de teclas que você deseja. Descobri que alt + colchetes é 'e “no meu mac.
dvcrn
4
Isso funciona muito bem como Alt + HJKL para mover entre as divisões, meus dedos adoram !! nmap ˙ <C-w><Left> nmap ¬ <C-w><Right> nmap ˚ <C-w><Up> nmap ∆ <C-w><Down>
John Morales
3
Esses mapeamentos exatos podem não funcionar como esperado em versões futuras do OSX. Use sed -n lpara ver a saída de <Ak> e <Aj> antes de configurar o mapeamento. No meu caso, <Aj> é e <Ak> é˚
luk3thomas
4
No macOS, ao configurar Use Option as Meta Keyou no perfil do iTerm ⌥ key to Esc+irá se comportar da maneira tradicional (como no Linux / Unix). Então você não precisa definir no Vim o mapa para <^[j>, apenas mapeá-lo para <A+j>ou <M+j>e ele funciona.
goetzc
40

:help key-notationdescreve qual formato precisa ser usado para mapear diferentes chaves. No caso de alt, você pode usar <A-ou <M-. Portanto, seu mapeamento seria

map <M-d> <C-d>

Eu também recomendo usar a norevariante de :map(por exemplo, noremap) a menos que você queira permitir explicitamente que o lado direito seja reavaliado para mapeamentos.

Jamessan
fonte
1
Isso ainda não surtiu efeito. A entrada Alt + D ainda insere alguns caracteres estranhos no Vim.
Thomson
9
Esse é um problema separado. Seu terminal está enviando um caractere multibyte para o Vim e o Vim não sabe interpretar isso como <A-d>. Você provavelmente precisará alterar as configurações do seu terminal para que ele envie <A-d>como <Esc>d.
Jamessan
1
@jamessan como fazer no iterm2?
Finn
32

Não tenho mais certeza se é "possível". Por favor, leia a atualização abaixo.

Sim, você pode até mesmo no vim terminal, mas não há nenhuma verdadeira captura toda resposta. Basicamente, você deve seguir duas etapas:

  1. Certifique-se de que a <M-d>notação existe e mapeie exatamente as entradas do seu terminal ( ^[é o caractere de escape):

    $ cat
    ^[d
    $
    
    " in your .vimrc
    execute "set <M-d>=\ed"
    " you have to use double quotes!
    
  2. Mapeie algo para sua combinação recém-"criada":

    noremap <M-d> :echo "m-d works!"<cr>
    

Entendendo como funciona, você pode expandir esse "truque" para outras combinações "estranhas", por exemplo, estou usando cupim, e o vim não reconhece <S-F1>, usando cat I get ^[[1;2P. Então, no meu vimrc eu faço:, execute "set <S-F1>=\e[1;2P"e então posso mapeá-lo para qualquer coisa.

Nota: Não sei por que, mas para algumas pessoas usando \<Esc>obras em vez de \e.


Atualização (fevereiro de 2016)

Dependendo do terminfo que seu terminal executa, talvez você possa ... na maioria dos terminais, "alt + h", por exemplo, é mapeado ^[h, que é: "escape + h". Portanto, ele pode substituir as chaves. Acabei de tentar (novamente) e parece funcionar, mas acredito que é uma implementação com muitos bugs e propensa a erros.

No entanto, para os corajosos, aqui está um plugin experimental:

Pablo Olmos de Aguilera C.
fonte
Em vez das execute "set...coisas, você pode apenas usar diretamente set <M-d>=^[d. O ^[é na verdade um caractere de escape inserido com C-v-Esc. Isso era necessário no rxvt / urxvt, mas o xterm não deveria precisar de tratamento especial. Mais informações sobre este tópico no wiki do vim .
Micah Elliott de
Existe uma abordagem análoga para isso que funcionaria com tmux de forma que, ou seja, Md poderia ser vinculado?
George
2
Para mim, <Esc>então dagora faz a mesma coisa como <Alt>+ d. Além disso, você pode fazer isso em uma linha com Ctrl-v, <Esc>conforme aqui .
Sparhawk de
24

Tecla Alt do mapa no Vim no Mac OSx:

Comece visualizando o código-chave que seu terminal está enviando para o vim:

$ sed -n l
^[[1;9D 

No exemplo acima, executei o comando e pressionei Alt + Left.

A ^[[1;9Dé a sequência de escape enviada ao vim, para que possamos utilizá-la para nosso mapeamento.

map <Esc>[1;9D 
lfender6445
fonte
3
Se você estiver usando o aplicativo iTerm2, é bom verificar como as chaves estão mapeadas em Perfil> Chaves.
fikovnik de
1
Com a Optiontecla esquerda ( ) configurada como Esc+em iTerm2, eu poderia mapear alt+qpara sair do vim: nnoremap <silent> <Esc>q :qa!<cr>
ryenus
Você também pode configurar o iTerm2 para trabalhar com esse remapeamento se for em Preferências> Perfis, selecione seu perfil atual, vá para a guia "teclas" desse perfil e altere a opção que diz "Tecla esquerda Left" para "Esc +" (disponível as opções são "Normal", "Meta" e "Esc +").
Giovanni Benussi
11

Usar:

map <A-D> <C-D>

Veja :help key-notation.

Benoit
fonte
1
Parece que ainda não funciona. Alt + d irá inserir um caractere estranho no Vim, que é o mesmo com o caso não mapeado.
Thomson
Funciona para mim (estou usando gvimno Windows)
Deqing
8

Seu terminal pode não transmitir "corretamente" o Alt-D. Você pode usar CV para realmente obter a sequência de escape real enviada ao Vim e usá-la para criar seu mapeamento. Ou seja, edite seu .vimrc e substitua o real digitando a seguinte sequência "CV Alt-D" para que você tenha a sequência de escape correta em seu vimrc. Isso não funcionará se o seu terminal não enviar nada para o vim.

mb14
fonte
8

Meu terminal produziria ^[xcomandos (por exemplo, para alt-x). O que o fez funcionar dentro do Vim foi este pequeno script de 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 a .vimrc para corrigir todos os mapeamentos de teclas alt.

Laktak
fonte
1

seguindo a resposta de Bruno para usuários de Mac, tente certificar-se de que sua chave de opção esteja mapeada para Esc+.

Isso lhe dará o comportamento "normal" da Atecla option ( ) no Vim.

Por exemplo, em iterm2, esta opção pode ser encontrada em Preferences > Profiles > Keys:

captura de tela das preferências do iterm2

Axelyung
fonte
Eu também tive que alterar a configuração para nnoremap <Esc>j :m .+1<CR>==e semelhante ...
mihaipopescu
0

Olá, após nenhuma boa solução depois de anos testando todos os itens acima no mac, continuei pesquisando.

Aqui está minha solução:

Para criar uma combinação de teclas incluindo Alt, você deve declarar a combinação no teclado de preferência e usar essa combinação no arquivo de configuração do vim (marque a opção de usar como tecla meta).

A saída deve ser um caractere incomum (não, apor exemplo) para que você não substitua um caractere regular.

No exemplo abaixo você deve ser capaz de vim com ALT-Up.

configuração vim: configuração vim

configuração mac: configuração mac

MC F
fonte