Mapowałem zz
na 1z=
, co jest świetne przez większość czasu, ale od czasu do czasu pierwsza sugestia nie jest właściwa.
Chciałbym więc powtarzać zz
(lub .
), aby przełączać się między innymi sugestiami.
Drugie zz
słowo na tym samym słowie działałoby tak u2z=
, trzecie zz
działało jak u3z=
i tak dalej.
Wszelkie pomysły, jak to zrobić?
Edytować:
Na podstawie niesamowitej odpowiedzi @ nobe4 udało mi się zrobić to, co chcę, ale zostawię to na chwilę na wypadek, gdyby ktoś miał jakieś ulepszenia lub sugestie:
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>
(Zmieniłem mapowanie na z <c-m>
powodu komentarza @ Vitora. To także pozwala mi przytrzymać te klawisze i dość szybko przewijać sugestie. Myślę o tym jak o <c-mistake>
.)
:Correct
polecenia: będziesz w stanie poruszać się koryta słowa poprawne zn
aN
, otwiera się okno podzielone ze wszystkimi sugestiami korekcyjnych może po prostu żeglować przez nichj
ik
i<CR>
będzie zastosuj poprawkę.zz
polecenie szybko naprawiało określone rzeczy.zz
centruje okno wokół bieżącej linii. To prawdopodobnie jeden ze skrótów, których używam częściej. Powinieneś również sprawdzić kasęzb
izt
.scrolloff
dość wysoko, ale nadal wydaje się to przydatne, rozważę inne mapowanie. Dzięki!Odpowiedzi:
Oto, co wymyśliłem:
Obrót zaklęcia
funkcje
'[
I']
znaki towarowe są używane do śledzenia tekstu czym pracował. Dokonanie zmiany w innym miejscu skutecznie „zaakceptuje” sugerowaną zmianę.zp
'<
i'>
oznacza, aby śledzić tekst.:SpellRotateSubAll
zastąpienia całego tekstu pasującego do oryginału bieżącą sugestią.Wtyczka: spellrotate.vim
źródło
Jak sugerował @statox, możesz użyć wtyczki, którą napisałem: vimcorrect .
Wyjaśnię w zasadzie, jak to działa, więc jeśli chcesz ponownie użyć części, możesz.
Aby skupić się na następnym błędnie napisanym słowie, używam go bezpośrednio
]s
i[s
przechodzą one do następnego / poprzedniego dopasowania. Zdefiniowałem niestandardową funkcję dopasowania, aby podświetlić bieżące słowo:Które dodają do grupy dopasowań
error
bieżące słowo w bieżącym wierszu / kolumnie (aby zapobiec wielokrotnemu dopasowaniu w tym samym wierszu).spellbadword()
Funkcja zwróci listę ewentualnej korekty dla słowa pod kursorem.Po prostu wyświetlam tę listę w buforze i mapuję,
<CR>
aby zastąpić błędnie napisane słowo bieżącym wierszem (tj. Możliwe poprawione słowo).Ja również map
n
iN
do]s
i[s
, jak jestem przyzwyczajony do naciśnij je przeszukać.q
jest zamapowany, aby zamknąć wtyczkę, zamknąć podział i usunąć wyróżnienie.Uwaga : wciąż jest bardzo niestabilna, ale planuję wkrótce wprowadzić pewne zmiany. Jeśli czujesz, że możesz / chcesz ulepszyć tę wtyczkę, możesz rozwidlić / otworzyć żądanie ściągnięcia.
źródło
zz
polecenie, więc mogę szybko naprawić rzeczy bez wchodzenia w tryb specjalny. Może możemy to dodać,vimcorrect
jeśli kiedykolwiek to wymyślę. :)Oto funkcja, która powinna działać:
Podstawową ideą jest mapowanie każdego zmienionego słowa na parę linia / kolumna (aby nie działało tylko dla jednego elementu) i sprawdzenie, czy element został już zmodyfikowany.
Aby wykonać zamianę, to właściwie to, co robi moja wtyczka:
Podczas korzystania z niego, jeśli chcesz wrócić do błędnie napisanego słowa, możesz po prostu nacisnąć
u
.LoopConfirm
Funkcja resetowania słownika, więc jeśli zmienisz tekst, można nazwać to, aby uniknąć kolizji.Daj mi znać, jeśli napotkasz jakiś problem / masz pytania.
źródło
z=
część, ale prawdopodobnie mogłabym znaleźć sposób na obejście tego, jeśli reszta zadziałałaby. Jednak zbliża się to do tego, czego chcę. Będę próbował to naprawić. Dzięki!z=
żadnego z nich. Ale dzięki tej metodzie musisz zachować odniesienie do tego, gdzie jesteś. Ale jeśli nie musisz zachować wszystkich odnośników jednocześnie, mogę to uprościć :)Oprócz innych odpowiedzi, nie jest w rzeczywistości sposobem zbudowany w prawo w vim:
<C-x>s
. Użyje to menu zakończenia trybu wstawiania Vima.Naciśnięcie
<C-x>s
z trybu wstawiania powinno poprawić słowo pod kursorem do pierwszej sugestii i wyświetlić menu uzupełniania z dalszymi sugestiami (jeśli istnieją). Możesz użyć tego'completeopt'
ustawienia, aby dostosować niektóre ustawienia menu zakończenia.To trochę irytujące, że działa to tylko z trybu wstawiania, a korzystanie z
<C-x><C-s>
może być problematyczne (patrz uwaga poniżej), więc możesz zdefiniować własne mapowanie:<C-@>
to Control + Space.Zobacz także
:help ins-completion
:help i_CTRL-X_s
Osobiście używam bardziej zaawansowanej wersji, która „zgadnie”, jeśli chcemy albo sprawdzić pisownię pracy, albo użyć regularnego automatycznego uzupełniania kodu:
Sądzę, że istnieją również wtyczki, które robią z grubsza podobne rzeczy (jak SuperTab, która jest dość popularna), ale nigdy nie udało mi się sprawić, by zachowywały się tak, jak chcę.
Zastrzeżenie : Jeśli używasz Vima z terminala,
<C-s>
oznacza to „zatrzymaj wyjście”. Dlatego oba<C-x><C-s>
i<C-x>s
są przypisane domyślnie. Użyj,<C-q>
aby kontynuować drukowanie, jeśli naciśniesz<C-s>
przypadkowo. Możesz także wyłączyć,<C-s>
jeśli go nie używasz (patrz to pytanie ). Jeśli używasz GVim, możesz to zignorować.źródło