Como desativar as teclas de seta no vim?


24

Eu quero me ensinar a usar hjkl mais do que usar as setas do teclado para permanecer na linha inicial. E sim, estou ciente de que não se deve usar o hjkl como as principais teclas de navegação. No entanto, meus hábitos são bastante fortes e eu nem percebi que isso fez o movimento da mão nas teclas de seta e eu quero desaprender.

Para acabar com esse hábito: Como posso desativar as teclas de seta para ser forçado a usar o hjkl ou algum outro método de navegação?

Como bônus, seria útil se ainda houvesse uma mensagem de Dont't use this!que não é obrigatória. Se eles não funcionarem, será confuso o suficiente para eu repensar meus hábitos.


4
Não faz sentido fazer isso; HJKL chupa tanto quanto as flechas.
romainl

6
Eu acho que o @romainl pode estar apontando que é mais importante focar no uso dos movimentos poderosos do vim (como wpara a próxima palavra, }para o próximo parágrafo, npara a próxima correspondência de resultados de pesquisa, fzpara a próxima ocorrência zna linha atual etc.) do que mover mais granularmente por caracteres únicos. Eu definitivamente concordo com isso. No entanto, HJKL é definitivamente melhor do que as setas do teclado, pois você não precisa mover as mãos da linha de casa. Frequentemente, digito algo como jA, que é muito mais rápido do que <Down>Ae não é realmente superável por nenhum movimento.
wchargin

4
@romainl: Acho que tive essa discussão com você antes. Os não-vimmers são usados ​​para setas e não para HJKL. Idealmente, você também não deseja usar; mas as setas de bloqueio (e não o HJKL) farão as pessoas pausarem e refletirem sobre o que estão fazendo (enquanto ainda deixam o HJKL aberto como uma alternativa, caso seja realmente a melhor opção ou caso o usuário fique perplexo sobre como fazê-lo com movimentos mais poderosos.). Ou seja, não se trata de aprender HJKL, mas de bloquear o automatismo aprendido em outros editores.
Amadan

1
@Carpetsmoker O que definitivamente é uma vantagem das teclas hjkl é não ter que sair da linha de casa. Para as setas do teclado, a mão deve se mover pelo teclado.
Kdpernikus

1
@Carpetsmoker Certamente é melhor para mim. ;)
k0pernikus

Respostas:


24

Você pode instalar o plug-in hardmode e no seu .vimrcput in

let g:HardMode_level = 'wannabe'
let g:HardMode_hardmodeMsg = 'Don''t use this!'
autocmd VimEnter,BufNewFile,BufReadPost * silent! call HardMode()

Se você não quiser usar um plug-in, o uso (que pode ser uma escolha melhor, como você começa a personalizar tudo você mesmo!) nnoremap, vnoremapE inoremapem <Left>, <Right>, <Up>, <Down>, <PageUp>e <PageDown>, por exemplo:

nnoremap <Left> :echo "No left for you!"<CR>
vnoremap <Left> :<C-u>echo "No left for you!"<CR>
inoremap <Left> <C-o>:echo "No left for you!"<CR>

1
Há também <nop>se você quiser desativar o mapa de teclado completo: nnoremap h <nop>.
akshay

25

Caso você ou alguém que esteja lendo este tópico, queira apenas desativar os movimentos das teclas sem o aviso de texto, insira as seguintes linhas em .vimrc

noremap <Up> <Nop>
noremap <Down> <Nop>
noremap <Left> <Nop>
noremap <Right> <Nop>

Os comandos desativarão apenas o movimento das teclas no modo normal. Eles ainda funcionam no modo de inserção. Se você usar o inoremap, o movimento da seta também será removido do modo de inserção.

Este tópico bastante popular trata das diferenças entre noremap, nnoremap, inoremap, etc: Remapeando no Vim

A idéia geral do remapeamento é assim:

Choice-of-mode-to-remap <remap this command> <to this action/command instead>

Portanto, nos outros exemplos dados, você remapeará o comando esquerdo para um prompt de texto que, aliás, remove a ação de mover o cursor. O exemplo que dei acima simplesmente refaz as ações para nada, ao invés de outra coisa. Considere remover, em vez de substituir, a funcionalidade vim.


2

Você pode adicionar isso ao seu .vimrcpara desativar as teclas de seta nos modos Comando, Inserir, Normal e Visual:

" Remove newbie crutches in Command Mode
cnoremap <Down> <Nop>
cnoremap <Left> <Nop>
cnoremap <Right> <Nop>
cnoremap <Up> <Nop>

" Remove newbie crutches in Insert Mode
inoremap <Down> <Nop>
inoremap <Left> <Nop>
inoremap <Right> <Nop>
inoremap <Up> <Nop>

" Remove newbie crutches in Normal Mode
nnoremap <Down> <Nop>
nnoremap <Left> <Nop>
nnoremap <Right> <Nop>
nnoremap <Up> <Nop>

" Remove newbie crutches in Visual Mode
vnoremap <Down> <Nop>
vnoremap <Left> <Nop>
vnoremap <Right> <Nop>
vnoremap <Up> <Nop>

Nota: faça o checkout :help map-overviewpara obter mais detalhes sobre os diferentes tipos de mapeamento


1
Você pode reduzir o número de comandos necessários usando noremap ... ...(no modo normal, visual, de seleção e pendente do operador) e noremap! ... ...(no modo de inserção e linha de comando).
Jürgen Krämer

Verdade. Eu pensei que o mais explícito noremapsseria útil para alguém que queira personalizar quais modos são afetados
NonlinearFruit
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.