Como fazer movimentos respeitar camelCase ou snake_case?

20

É comum usar camelCase ou snake_case para separar várias palavras que formam um identificador. Seria bom se os movimentos "palavra" ( b, w, e) seria detectar esses limites interior de identificadores.

Como esse comportamento pode ser alcançado? (Plugin / vimrc / ...?)

Jaspe
fonte
11
Eu também gostaria de saber isso sobresnake_case
Martin Tournoij
Você pode fazer algo com a iskeywordconfiguração, mas temo que isso tenha muitos efeitos colaterais adicionais ... (consulte :help word).
Martin Tournoij 10/02
@Carpetsmoker Eu pensei que funcionava snake_case. Parece que não, incluiu no quesiton.
Jasper
4
O VimWiki cobre você: vim.wikia.com/wiki/Moving_through_camel_case_words Vou escrever uma resposta adequada em algum momento se alguém não me vencer.
Rich
Pessoalmente, vejo uma palavra com letra camalCased como uma palavra inteira e não gosto da idéia de dividir a metade em uma palavra por causa de maiúsculas ou minúsculas. Normalmente, uso as teclas fe tpara gerenciar movimentos internos das palavras.
Sukima

Respostas:

11

O plugin CamelCaseMotion faz o que você deseja. Por padrão, ele mapeia para as teclas ,w, ,b, ,eque são equivalentes ao normal w, b, e. Funciona tanto no CamelCase quanto no snake_case:

Exemplo:

camelCaseWord

Usar d,wremoverá camel; usá-lo novamente removerá Case.

Ou com estojo de cobra:

snake_case_word

d,wserá removido snake_e, na segunda vez, será removido case_.

Movimentos "internos" (como diw) também devem funcionar conforme o esperado (como di,w).

Se preferir, você também pode substituir o padrão w, be ecom:

map <silent> w <Plug>CamelCaseMotion_w
map <silent> b <Plug>CamelCaseMotion_b
map <silent> e <Plug>CamelCaseMotion_e
sunmap w
sunmap b
sunmap e
omap <silent> iw <Plug>CamelCaseMotion_iw
xmap <silent> iw <Plug>CamelCaseMotion_iw
omap <silent> ib <Plug>CamelCaseMotion_ib
xmap <silent> ib <Plug>CamelCaseMotion_ib
omap <silent> ie <Plug>CamelCaseMotion_ie
xmap <silent> ie <Plug>CamelCaseMotion_ie
Jarlax
fonte
2
Observe que os mapeamentos padrão deste plug-in sombreiam o ,comando (repita último f/ t/ F/ Tmotion), ou seja, se você deseja usar esse comando, terá que aguardar um atraso (configurado por 'timeoutlen'). Felizmente, o plug-in permite que você use mapeamentos alternativos de sua escolha.
21415 Tommcdo
Parece haver alguns efeitos colaterais com este plugin, ou seja: dwem , key);quando o cursor está na kparece para remover a linha inteira (incluindo novas linhas), enquanto eu esperava apenas keya ser removido ...
Martin Tournoij
11
Eu achei esse plugin melhor. A combinação de movimento com exclusão funciona corretamente e também para entre parênteses.
Paschalis 5/05
Ponto menor, mas no primeiro exemplo certamente removeria camele depois Case, não Word?
preferência_anon