Je cartographié zz
à 1z=
, qui est grande la plupart du temps, mais de temps en temps la première suggestion n'est pas la bonne.
Je voudrais donc continuer à répéter zz
(ou .
) pour parcourir les autres suggestions.
Une seconde zz
sur le même mot fonctionnerait donc comme u2z=
, une troisième zz
fonctionnerait comme u3z=
et ainsi de suite.
Des idées sur la façon de procéder?
Éditer:
Sur la base de la réponse impressionnante de @ nobe4, j'ai réussi à faire ce que je veux, mais je vais le laisser ici pendant un moment au cas où quelqu'un aurait des améliorations ou des suggestions:
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>
(J'ai changé le mappage en <c-m>
raison du commentaire de @ Vitor. Cela me permet également de maintenir ces touches enfoncées et de faire défiler les suggestions très rapidement. J'y pense comme <c-mistake>
.)
:Correct
commande: vous serez en mesure de naviguer creux les mots correcte avecn
etN
, une fenêtre divisée en deux ouvre toutes les suggestions de correction , vous pouvez simplement naviguer à travers eux avecj
etk
et<CR>
sera appliquer la correction.zz
commande corrige rapidement des choses spécifiques.zz
centre la fenêtre autour de la ligne actuelle. C'est probablement l'un des raccourcis que j'utilise le plus souvent. Vous devriez également commanderzb
etzt
.scrolloff
assez haut, mais cela semble toujours utile, je vais envisager une autre cartographie. Merci!Réponses:
Voici ce que j'ai trouvé:
Rotation des sorts
traits
'[
et']
sont utilisées pour garder une trace du texte en cours de traitement. Faire un changement ailleurs "acceptera" effectivement le changement suggéré.zp
'<
et'>
marque pour garder une trace du texte.:SpellRotateSubAll
pour remplacer tout le texte correspondant à l'original par la suggestion actuelle.Plugin: spellrotate.vim
la source
Comme l'a suggéré @statox, vous pouvez utiliser le plugin que j'ai écrit: vimcorrect .
Je vais expliquer en gros comment cela fonctionne, donc si vous voulez en réutiliser une partie, vous pouvez.
Pour me concentrer sur le prochain mot mal orthographié, j'utilise directement
]s
et au[s
fur et à mesure qu'ils passent au match suivant / précédent. J'ai défini une fonction de correspondance personnalisée pour mettre en surbrillance le mot actuel:Qui ajoutent au groupe de correspondance
error
le mot actuel à la ligne / colonne actuelle (pour empêcher plusieurs correspondances sur la même ligne).La
spellbadword()
fonction renvoie une liste de corrections possibles pour le mot sous le curseur.J'affiche simplement cette liste dans un tampon, et je mappe
<CR>
pour remplacer le mot mal orthographié par la ligne courante (c'est-à-dire un mot corrigé possible).Je mappe également
n
etN
vers]s
et[s
, comme j'ai l'habitude de les appuyer pour rechercher.q
est mappé pour quitter le plugin, fermer la division et supprimer la surbrillance.Remarque : il est toujours très instable, mais je prévois de faire des changements bientôt. Si vous sentez que vous pouvez / voulez améliorer ce plugin, n'hésitez pas à bifurquer / ouvrir une demande de pull.
la source
zz
commande, donc je peux réparer les choses rapidement sans entrer dans un mode spécial. Peut-être que nous pouvons ajouter cela àvimcorrect
si jamais je le découvre. :)Voici une fonction qui devrait fonctionner:
L'idée de base est de mapper chaque mot modifié sur une paire ligne / colonne (afin qu'il ne fonctionne pas uniquement pour un élément) et de vérifier si l'élément a déjà été modifié.
Pour faire le remplacement, c'est à peu près ce que fait mon plugin:
Lorsque vous utilisez cela, si vous souhaitez revenir au mot mal orthographié, vous pouvez simplement appuyer sur
u
.La
LoopConfirm
fonction réinitialise le dictionnaire, donc si vous changez votre texte, vous pouvez l'appeler pour éviter les collisions.Faites-moi savoir si vous rencontrez un problème / si vous avez des questions.
la source
z=
partie supplémentaire , mais je pourrais probablement trouver un moyen de contourner cela moi-même si le reste fonctionnait. Cependant, cela se rapproche beaucoup de ce que je veux. Je continuerai d'essayer de le réparer. Merci!z=
plus. Mais avec cette méthode, vous devez garder une référence de l'endroit où vous vous trouvez. Mais si vous n'avez pas besoin de garder toutes les références en même temps, je peux simplifier cela :)Mis à part les autres réponses, il est en fait un moyen construit juste pour Vim:
<C-x>s
. Cela utilisera le menu de fin du mode d'insertion de Vim.Appuyez sur
<C-x>s
depuis le mode d'insertion pour corriger le mot sous le curseur à la première suggestion et afficher le menu de fin avec d'autres suggestions (le cas échéant). Vous pouvez utiliser le'completeopt'
paramètre pour personnaliser certains paramètres du menu d'achèvement.C'est un peu ennuyeux que cela ne fonctionne que depuis le mode insertion et l'utilisation de l'aide
<C-x><C-s>
peut être problématique (voir la note ci-dessous), vous pouvez donc définir votre propre mappage pour cela:<C-@>
est Control + Space.Regarde aussi
:help ins-completion
:help i_CTRL-X_s
J'utilise personnellement une version plus avancée qui "devinera" si nous voulons soit vérifier l'orthographe du travail, soit utiliser l'auto-complétion régulière pour le code:
Je pense qu'il existe également des plugins qui font des choses à peu près similaires (comme SuperTab, qui est assez populaire), mais je ne pourrais jamais les faire se comporter comme je le veux.
Mise en garde : Si vous utilisez Vim à partir d'un terminal,
<C-s>
cela signifiera "arrêter la sortie". C'est pourquoi les deux<C-x><C-s>
et<C-x>s
sont mappés par défaut. Utilisez<C-q>
pour continuer la sortie si vous appuyez<C-s>
par accident. Vous pouvez également désactiver<C-s>
si vous ne l'utilisez pas (voir cette question ). Si vous utilisez GVim, vous pouvez ignorer cela.la source