Jak korzystać z Flyspell, aby skutecznie korygować poprzednie słowo?

18

Od momentu, gdy zacząłem używać Flyspell, zawsze było bolesne w użyciu. Rzadko sprawdzam cały bufor pod kątem błędnie napisanych słów, zwykle piszę, a kiedy widzę podkreślone słowo, chcę je natychmiast poprawić i kontynuować pisanie. Jest tak po prostu dlatego, że boję się zapomnieć o poprawieniu tego słowa później i ponieważ kiedy zaczynam kompleksowe sprawdzanie bufora, iSpell podaje zbyt wiele fałszywych trafień. Tak więc prawie zawsze poprawiam słowa tak szybko, jak to możliwe podczas pisania.

Oto wbudowane funkcje, o których wiem i powody, dla których nie są one wydajne (dla mnie):

  • flyspell-correct-word- Jest to związane z kliknięciem myszy. Zapomnij, nie zamierzam używać myszy.

  • flyspell-correct-word-before-point- Używałem tego przez jakiś czas. Ma dwie wady:

    1. Domyślnie pokazuje menu GUI, które jest trudne w obsłudze bez myszy i jest naprawdę kłopotliwe, gdy masz listę poprawek zawierających więcej niż 10 elementów.

    2. To nie działa na słowo na długo przed punktem. Piszę szybko, a kiedy zauważam błędnie napisane słowo, zwykle mam jedno lub dwa słowa między błędnie napisanym słowem a punktem. Muszę przesunąć punkt, poprawić słowo, wrócić. O.

  • flyspell-auto-correct-word - Patrz punkt 2 ↑ plus nie działa dobrze, gdy masz długą listę ukończeń (z powodu jazdy rowerem).

P: Jak mogę efektywnie korzystać z Flyspell, korzystając z klawiatury, mając możliwość wyboru z listy ukończeń bez jazdy na rowerze oraz z możliwością korygowania jeszcze mniej lub bardziej odległych słów?

Dopuszczalne odpowiedzi obejmują pakiety, które pomagają nawigować do poprzedniego błędnie napisanego słowa, poprawić go i wrócić lub coś w tym rodzaju, a także małe fragmenty, prawdopodobnie z własnego pliku konfiguracyjnego, ponieważ uważam, że inni ludzie wymyślili sposoby efektywnej interakcji z Flyspell.

Mark Karpov
źródło

Odpowiedzi:

14

Wbudowane flyspell-auto-correct-previous-worddziała dla mnie jak urok. Związałem to F12i nie oglądałem się za siebie. Ma konsekwentnie poprawne słowa dla mnie, bez względu na to, ile słów zawierało nieprawidłowe słowo.

Z dokumentacji funkcji:

flyspell-auto-correct-previous-word is an interactive compiled Lisp
function in `flyspell.el'.

(flyspell-auto-correct-previous-word POSITION)

For more information check the manuals.

Auto correct the first misspelled word that occurs before point.
But don't look beyond what's visible on the screen.

Ponadto, jeśli autokorekta po raz pierwszy nie podała właściwego słowa, naciskaj klawisz związany ( F12w moim przypadku), aby przełączać wszystkie opcje.

[Moja konfiguracja sprawdzania pisowni]

Kaushal Modi
źródło
1
Widzę, że nadal trzeba cyklicznie wprowadzać wszystkie możliwe korekty. Wypróbuj na ttwoprzykład, chociaż w moim menu widzę 26 proponowanych poprawek!
Mark Karpov,
3
ttwoautomatycznie poprawione twoprzy pierwszej próbie. Ale wiem o co ci chodzi. Z praktycznego doświadczenia, w około 90% przypadków, pierwsza próba dostaje właściwe słowo, prawdopodobnie pozostałe 9% wymaga 2-3 prób, a ten ostatni 1% ma miejsce, gdy flyspell po prostu tego nie rozumie i muszę iść przez ponad 5 prób (lub ręcznie to naprawię).
Kaushal Modi,
Rozumiem, twoja metoda ma swoje zalety (prostota). Może mimo wszystko przejdę na to.
Mark Karpov,
2
Bardzo fajnie - tego się spodziewałem i spóźniłem się, ponieważ wiązałem domyślny klucz z czymś innym. Jest to C-;domyślnie powiązane i można dostosować, flyspell-auto-correct-bindingaby powiązać go z innym kluczem na mapie Flyspell. (Lub po prostu związać to normalnie, oczywiście.)
glucas
6

Jestem pewien, że inni ludzie wymyślą różne rozwiązania, które będą przydatne dla przyszłych czytelników. Oto, jak obecnie sobie z tym poradzić.

Myślę, że flyspell-correct-word-before-pointjest to dobre miejsce na rozpoczęcie, ponieważ przynajmniej można je wywołać za pomocą naciśnięcia klawisza i wyświetla menu możliwych korekt. Aby naprawić menu, napisałem pakiet Ace Popup Menu, który używa Avy jako backendu. Zastępuje to wyskakujące menu GUI flyspell-correct-word-before-point(funkcja nazywa się x-popup-menu) wyskakującym menu tekstowym przedstawiającym elementy menu oznaczone etykietą: jedno lub dwa naciśnięcia klawiszy i gotowe.

Aby rozwiązać drugi problem (niemożność poprawienia słów „na odległość”) napisałem tego pomocnika:

(defun flyspell-correct-previous (&optional words)
  "Correct word before point, reach distant words.

WORDS words at maximum are traversed backward until misspelled
word is found.  If it's not found, give up.  If argument WORDS is
not specified, traverse 12 words by default.

Return T if misspelled word is found and NIL otherwise.  Never
move point."
  (interactive "P")
  (let* ((Δ (- (point-max) (point)))
         (counter (string-to-number (or words "12")))
         (result
          (catch 'result
            (while (>= counter 0)
              (when (cl-some #'flyspell-overlay-p
                             (overlays-at (point)))
                (flyspell-correct-word-before-point)
                (throw 'result t))
              (backward-word 1)
              (setq counter (1- counter))
              nil))))
    (goto-char (- (point-max) Δ))
    result))

To wydaje się działać.

Mark Karpov
źródło
5

Dzięki Helm-Flyspell możesz efektywnie wybierać z listy poprawek. Używam następującego kodu, aby przejść do błędów i poprawić je za pomocą tego, zapisuje pozycję punktu do mark-ring, abyś mógł wrócić do pozycji, w której wcześniej zacząłeś lub poprawiałeś słowa:

(defun flyspell-goto-previous-error (arg)
  "Go to arg previous spelling error."
  (interactive "p")
  (while (not (= 0 arg))
    (let ((pos (point))
          (min (point-min)))
      (if (and (eq (current-buffer) flyspell-old-buffer-error)
               (eq pos flyspell-old-pos-error))
          (progn
            (if (= flyspell-old-pos-error min)
                ;; goto beginning of buffer
                (progn
                  (message "Restarting from end of buffer")
                  (goto-char (point-max)))
              (backward-word 1))
            (setq pos (point))))
      ;; seek the next error
      (while (and (> pos min)
                  (let ((ovs (overlays-at pos))
                        (r '()))
                    (while (and (not r) (consp ovs))
                      (if (flyspell-overlay-p (car ovs))
                          (setq r t)
                        (setq ovs (cdr ovs))))
                    (not r)))
        (backward-word 1)
        (setq pos (point)))
      ;; save the current location for next invocation
      (setq arg (1- arg))
      (setq flyspell-old-pos-error pos)
      (setq flyspell-old-buffer-error (current-buffer))
      (goto-char pos)
      (if (= pos min)
          (progn
            (message "No more miss-spelled word!")
            (setq arg 0))))))


(defun check-previous-spelling-error ()
  "Jump to previous spelling error and correct it"
  (interactive)
  (push-mark-no-activate)
  (flyspell-goto-previous-error 1)
  (call-interactively 'helm-flyspell-correct))

(defun check-next-spelling-error ()
  "Jump to next spelling error and correct it"
  (interactive)
  (push-mark-no-activate)
  (flyspell-goto-next-error)
  (call-interactively 'helm-flyspell-correct))

(defun push-mark-no-activate ()
  "Pushes `point' to `mark-ring' and does not activate the region
 Equivalent to \\[set-mark-command] when \\[transient-mark-mode] is disabled"
  (interactive)
  (push-mark (point) t nil)
  (message "Pushed mark to ring"))
Clemera
źródło