Ich kartiert zz
auf 1z=
, die die meiste Zeit ist groß, aber ab und zu dem ersten Vorschlag ist nicht die richtige.
Also möchte ich immer wieder wiederholen zz
(oder .
), um die anderen Vorschläge durchzugehen.
Eine Sekunde zz
für dasselbe Wort würde also funktionieren u2z=
, eine dritte zz
würde funktionieren u3z=
und so weiter.
Irgendwelche Ideen, wie man das macht?
Bearbeiten:
Basierend auf der fantastischen Antwort von @nobe4 habe ich es geschafft, das zu tun, was ich will, aber ich werde es hier für eine Weile belassen, falls jemand irgendwelche Verbesserungen oder Vorschläge hat:
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>
(Ich habe die Zuordnung <c-m>
aufgrund von @ Vitors Kommentar in geändert . Dadurch kann ich auch diese Tasten gedrückt halten und sozusagen schnell durch die Vorschläge scrollen. Ich denke, dass dies so ist <c-mistake>
.)
:Correct
Befehl: Sie werden in der Lage sein , mit den Worten richtig zu navigieren Trogn
undN
ein zweigeteiltes Fenster mit allen Korrekturvorschläge können Sie einfach durch sie navigieren mitj
undk
und<CR>
wird Wenden Sie die Korrektur an.zz
Befehl bestimmte Dinge schnell behebt.zz
das Fenster ursprünglich um die aktuelle Zeile zentriert ist. Es ist wahrscheinlich eine der Abkürzungen, die ich häufiger benutze. Sie sollten auch zur Kassezb
undzt
.scrolloff
ziemlich hohes Niveau, aber das scheint immer noch nützlich zu sein. Ich werde ein anderes Mapping in Betracht ziehen. Vielen Dank!Antworten:
Folgendes habe ich mir ausgedacht:
Zauber drehen
Eigenschaften
'[
und']
werden verwendet, um den Text zu verfolgen, an dem gearbeitet wird. Wenn Sie eine Änderung an einer anderen Stelle vornehmen, wird die vorgeschlagene Änderung effektiv "akzeptiert".zp
'<
und'>
markiert, um den Text zu verfolgen.:SpellRotateSubAll
, um den gesamten mit dem Original übereinstimmenden Text durch den aktuellen Vorschlag zu ersetzen.Plugin: spellrotate.vim
quelle
Wie @statox vorschlug, können Sie das Plugin verwenden, das ich geschrieben habe: vimcorrect .
Ich werde im Grunde erklären, wie es funktioniert. Wenn Sie einen Teil davon wiederverwenden möchten, können Sie dies tun.
Um mich auf das nächste falsch geschriebene Wort zu konzentrieren, verwende ich direkt
]s
und[s
während sie zum nächsten / vorherigen Treffer springen. Ich habe eine benutzerdefinierte Übereinstimmungsfunktion definiert, um das aktuelle Wort hervorzuheben:Womit der Übereinstimmungsgruppe
error
das aktuelle Wort in der aktuellen Zeile / Spalte hinzugefügt wird (um eine Mehrfachübereinstimmung in derselben Zeile zu verhindern).Die
spellbadword()
Funktion gibt eine Liste möglicher Korrekturen für das Wort unter dem Cursor zurück.Ich zeige diese Liste einfach in einem Puffer an und ordne
<CR>
zu, dass das falsch geschriebene Wort durch die aktuelle Zeile (dh ein möglicherweise korrigiertes Wort) ersetzt wird.Ich kartiere auch
n
undN
zu]s
und[s
, wie ich es gewohnt bin, sie zum Suchen zu drücken.q
wird gemappt, um das Plugin zu beenden, den Split zu schließen und die Markierung zu entfernen.Hinweis : Es ist immer noch sehr instabil, aber ich plane, bald einige Änderungen vorzunehmen. Wenn Sie das Plugin verbessern möchten oder können, können Sie eine Pull-Anfrage stellen.
quelle
zz
Befehl, damit ich die Probleme schnell beheben kann, ohne in einen speziellen Modus zu wechseln. Vielleicht können wir das hinzufügen,vimcorrect
wenn ich es jemals herausfinde. :)Hier ist eine Funktion, die funktionieren sollte:
Die Grundidee ist, jedes geänderte Wort einem Zeilen- / Spaltenpaar zuzuordnen (damit es nicht nur für ein Element funktioniert) und zu prüfen, ob das Element bereits geändert wurde.
Um das zu ersetzen, ist es ziemlich genau das, was mein Plugin macht:
Wenn Sie in diesem Fall zum falsch geschriebenen Wort zurückkehren möchten, drücken Sie einfach
u
.Die
LoopConfirm
Funktion setzt das Wörterbuch zurück. Wenn Sie also Ihren Text ändern, können Sie ihn aufrufen, um Kollisionen zu vermeiden.Lassen Sie mich wissen, wenn Sie auf ein Problem stoßen oder Fragen haben.
quelle
z=
Teil nicht, aber ich könnte wahrscheinlich einen Weg finden, das selbst zu umgehen, wenn der Rest funktioniert. Dies kommt jedoch dem sehr nahe, was ich will. Ich werde weiter versuchen, es zu beheben. Vielen Dank!z=
. Bei dieser Methode müssen Sie jedoch einen Verweis darauf aufbewahren, wo Sie sich befinden. Aber wenn Sie nicht alle Referenzen gleichzeitig behalten müssen, kann ich das vereinfachen :)Abgesehen von den anderen Antworten, ist es tatsächlich ein Weg nach rechts in Vim gebaut:
<C-x>s
. Dadurch wird das Einfügemodus-Abschlussmenü von Vim verwendet.Durch Drücken von
<C-x>s
aus dem Einfügemodus sollte das Wort unter dem Cursor auf den ersten Vorschlag korrigiert und das Abschlussmenü mit weiteren Vorschlägen (falls vorhanden) angezeigt werden. Mit dieser'completeopt'
Einstellung können Sie einige Einstellungen für das Abschlussmenü anpassen.Es ist etwas ärgerlich, dass dies nur im Einfügemodus funktioniert und die Verwendung von
<C-x><C-s>
problematisch sein kann (siehe Hinweis unten). Sie können daher Ihr eigenes Mapping dafür definieren:<C-@>
ist Kontrolle + Leertaste.Siehe auch
:help ins-completion
:help i_CTRL-X_s
Ich persönlich verwende eine fortgeschrittenere Version, die "erraten" wird, ob wir entweder die Arbeit auf Rechtschreibprüfung überprüfen oder die reguläre automatische Vervollständigung für Code verwenden möchten:
Ich glaube, dass es auch einige Plugins gibt, die ungefähr ähnliche Dinge tun (wie SuperTab, das ziemlich beliebt ist), aber ich könnte sie niemals dazu bringen, sich so zu verhalten, wie ich es möchte.
Vorsichtsmaßnahme : Wenn Sie Vim von einem Terminal aus verwenden,
<C-s>
bedeutet dies "Ausgabe stoppen". Aus diesem Grund sind beide<C-x><C-s>
und<C-x>s
standardmäßig zugeordnet. Verwenden<C-q>
Sie diese Taste , um die Ausgabe fortzusetzen, wenn Sie versehentlich drücken<C-s>
. Sie können es auch deaktivieren,<C-s>
wenn Sie es nicht verwenden (siehe diese Frage ). Wenn Sie GVim verwenden, können Sie dies ignorieren.quelle