Mapeei zz
para 1z=
, o que é ótimo na maioria das vezes, mas de vez em quando a primeira sugestão não é a correta.
Então, eu gostaria de continuar repetindo zz
(ou .
) para percorrer as outras sugestões.
Um segundo zz
na mesma palavra, então, funcionaria como u2z=
, um terceiro zz
funcionaria como u3z=
e assim por diante.
Alguma ideia de como fazer isto?
Editar:
Com base na incrível resposta de @ nobe4, consegui fazer o que quero, mas deixarei aqui por um tempo, caso alguém tenha alguma melhoria ou sugestão:
let s:spell_position = []
let s:spell_count = 0
let s:spell_word = ""
function! LoopSpell()
if s:spell_position != getpos('.') ||
\ (s:spell_count > 0 && s:spell_word !~ expand("<cword>"))
let s:spell_count = 0
let s:spell_position = getpos('.')
endif
if s:spell_count > 0
silent execute "normal! u"
endif
let s:current_word = expand("<cword>")
if len(s:current_word) <= 0
return
endif
let s:spell_suggestions = spellsuggest(expand(s:current_word))
if len(s:spell_suggestions) <= 0
return
endif
if s:spell_count >= len(s:spell_suggestions)
let s:spell_word = s:current_word
let s:spell_count = 0
else
let s:spell_word = s:spell_suggestions[s:spell_count]
let s:spell_count += 1
endif
silent execute "normal! ciw" . s:spell_word
let s:spell_position = getpos('.')
endfunction
nnoremap <c-m> :call LoopSpell()<CR>
(Alterei o mapeamento para <c-m>
por causa do comentário do @ Vitor. Isso também me permite manter essas teclas pressionadas e meio que rolar as sugestões muito rapidamente. Estou pensando nisso <c-mistake>
.)
:Correct
comando: você será capaz de navegar através das palavras para corrigir comn
eN
, uma janela de divisão abre com todas as sugestões de correção você pode simplesmente navegar por eles comj
ek
e<CR>
vontade aplique a correção.zz
comando conserte coisas específicas rapidamente.zz
centraliza a janela em torno da linha atual. Provavelmente é um dos atalhos que eu uso com mais frequência. Você também deve fazer o checkoutzb
ezt
.scrolloff
alto, mas isso ainda parece útil, vou considerar outro mapeamento. Obrigado!Respostas:
Aqui está o que eu vim com:
Rodar feitiço
Recursos
'[
e']
são usadas para acompanhar o texto que está sendo trabalhado. Fazer uma alteração em outro lugar efetivamente "aceitará" a alteração sugerida.zp
'<
e'>
marca para acompanhar o texto.:SpellRotateSubAll
para substituir todo o texto correspondente ao original pela sugestão atual.Plugin: spellrotate.vim
fonte
Como o @statox sugeriu, você pode usar o plugin que escrevi: vimcorrect .
Vou explicar basicamente como funciona, então, se você quiser reutilizar parte dela, pode.
Para focar na próxima palavra com erro ortográfico, eu uso diretamente
]s
e[s
conforme eles pulam para a próxima correspondência / anterior. Eu defini uma função de correspondência personalizada para destacar a palavra atual:Que adicionam ao grupo de correspondências
error
a palavra atual na linha / coluna atual (para impedir a correspondência múltipla na mesma linha).A
spellbadword()
função retorna uma lista de possíveis correções para a palavra sob o cursor.Simplesmente mostro essa lista em um buffer e mapeio
<CR>
para substituir a palavra com erro de ortografia pela linha atual (ou seja, uma possível palavra corrigida).Também mapeio
n
eN
para]s
e[s
, como estou acostumado a pressioná-los para pesquisar.q
está mapeado para sair do plug-in, feche a divisão e remova o destaque.Nota : ainda é altamente instável, mas pretendo fazer algumas alterações em breve. Se você sente que pode / deseja melhorar este plugin, fique à vontade para abrir / abrir uma solicitação de recebimento.
fonte
zz
comando, para que eu possa consertar as coisas rapidamente sem entrar em um modo especial. Talvez possamos acrescentar issovimcorrect
se eu descobrir. :)Aqui está uma função que deve funcionar:
A idéia básica é mapear cada palavra alterada para um par de linhas / colunas (para que não funcione apenas para um elemento) e verificar se o elemento já foi modificado.
Para fazer a substituição, é basicamente o que meu plug-in faz:
Ao usar isso, se você quiser voltar para a palavra incorreta, basta pressionar
u
.A
LoopConfirm
função redefine o dicionário; portanto, se você alterar seu texto, poderá chamá-lo para evitar colisões.Informe-me se você encontrar algum problema / se tiver alguma dúvida.
fonte
z=
parte extra , mas provavelmente poderia encontrar uma maneira de contornar isso se o resto funcionasse. Isso está chegando muito perto do que eu quero, no entanto. Vou continuar tentando consertar. Obrigado!z=
. Mas com esse método, você precisa manter uma referência de onde você está. Mas se você não precisa manter todas as referências ao mesmo tempo eu posso simplificar isso :)Além de outras respostas, não é realmente uma maneira construído na direita para Vim:
<C-x>s
. Isso usará o menu de conclusão do modo de inserção do Vim.Pressionar
<C-x>s
no modo de inserção deve corrigir a palavra sob o cursor até a primeira sugestão e mostrar o menu de conclusão com mais sugestões (se houver). Você pode usar a'completeopt'
configuração para personalizar algumas configurações para o menu de conclusão.É um pouco chato que isso funcione apenas no modo de inserção e o uso de
<C-x><C-s>
pode ser problemático (veja a nota abaixo), para que você possa definir seu próprio mapeamento para isso:<C-@>
é Control + Space.Veja também
:help ins-completion
:help i_CTRL-X_s
Pessoalmente, uso uma versão mais avançada que "adivinhará" se quisermos fazer a verificação ortográfica do trabalho ou usar o preenchimento automático regular para código:
Acredito que também existem alguns plugins que fazem coisas semelhantes (como o SuperTab, que é bastante popular), mas eu nunca consegui fazê-los se comportar como eu quero.
Advertência : Se você estiver usando o Vim em um terminal,
<C-s>
significa "parar a saída". É por isso que ambos<C-x><C-s>
e<C-x>s
são mapeados por padrão. Use<C-q>
para continuar a saída se pressionar<C-s>
por acidente. Você também pode desativar<C-s>
se não o usar (consulte esta pergunta ). Se você estiver usando o GVim, poderá ignorar isso.fonte