
Estou fazendo uma tarefa repetitiva para a qual defini uma macro em uma das teclas F, mas ainda preciso manter pressionada a tecla Shift para digitar a primeira letra toda vez que executo essa macro. Eu me perguntei se isso também poderia ser incluído na macro, mas minha busca por maneiras de fazer isso foi infrutífera.
Existem várias maneiras de entrar no modo de inserção, relacionadas à posição do cursor no texto. Mas posso definir uma macro que coloque em maiúscula a primeira letra que escrevo após entrar no modo de inserção, e somente isso?
Responder1
Bem, esta é uma solução meio hacky, mas parece funcionar. Não tenho certeza de como você deseja mapeá-lo, então mapeei <leader>i
no meu exemplo. Sinta-se à vontade para alterar isso para o que quiser.
function! Icap()
augroup icap
au InsertLeave * exec "normal! \<C-o>gUlgi\<esc>:augroup icap | au! | augroup END\<cr>"
au InsertEnter * exec "normal! m`"
augroup END
endfunction
nnoremap <leader>i :call Icap()<cr>i
O que isto faz é definir uma função "Icap" (abreviação de 'inserir maiúscula') que configura dois comandos automáticos. O primeiro comando automático é aquele logo antes de entrar no modo de inserção:
- O Vim adiciona a localização atual do cursor aolista de salto.
Então, após chamar foo e imediatamente após sair do modo de inserção, acontecerá o seguinte:
Tipos Vim
<C-o>gUl
. Isso irá para o local anterior na lista de atalhos e converterá o caractere sob o cursor em letras maiúsculas. Depois disso, o vim digitagi<esc>
. Esta é uma maneira hackeada de levar o cursor de volta ao local anterior. Em teoria,<C-i>
deveria funcionar, mas enquanto o testava me deparei com problemas estranhos.O Vim exclui todos os comandos automáticos pertencentes a esta função. Isso evita que futuras alterações no modo de inserção façam edições estranhas que você não deseja.
Você também poderia fazer um mapeamento como este:
nnoremap <leader>i :call Icap()<cr>
o que permitiria que você usasse outros comandos para entrar no modo de inserção ( c
, a
, I
, o
, s
, etc.) e ainda obter os efeitos colaterais da capitalização.