Czy można automatycznie poprawić pisownię „w przestrzeni”?

10

Już miałem opublikować pytanie, ale potem zobaczyłem je w przepełnieniu stosu , szukając możliwości automatycznej korekty. Połączone pytanie nie ma odpowiedzi, więc pomyślałem, że będzie miał więcej szczęścia na tej stronie. Oto tekst:

Chciałbym, żeby istniał sposób, aby kiedy pomyliłem słowo, Flyspell mógł autokorektywać je do „najbardziej prawdopodobnej” korekty. Kiedy błędnie wpisuję słowo, a następnie naciśnij klawisz OPTION-TAB, aby je poprawić, flyspell PRAWIE ZAWSZE wybiera domyślną poprawną poprawkę jako główną sugestię.

Chcę jednak, aby flyspell robił to z każdym błędnym słowem, BEZ konieczności naciskania klawisza OPTION-TAB. Wystarczy dotknięcie paska SPACJA i przejście do następnego słowa.

czy to możliwe?

Zasadniczo coś takiego jak autokorekta na telefonach komórkowych. Takie dysponują byłoby przydatne dla trybów, jak jabberi capturenaorg-mode


Edytuj :

Wolę tę funkcję jako osobny tryb pomocniczy niż nadpisywanie domyślnej funkcji latania. W razie potrzeby można go aktywować dodatkowo lub zamiast latać

Tymric
źródło
1
Jestem pewien, że jest to możliwe (i prawdopodobnie nie trudne do zhakowania), ale czuję się zobowiązany powiedzieć, że IMHO byłby to bardzo zły pomysł.
mbork
1
@mork Byłoby złym pomysłem, aby zmienić sposób działania Fly-Spell, ale co jest złego w tym, że ma dodatkowy drobny tryb, który można aktywować / dezaktywować na żądanie?
Tymric
Ciągle denerwuje mnie podobna funkcja w moim telefonie. Nie lubię maszyn udających, że są mądrzejsze ode mnie, zwłaszcza, że ​​nie są ;-): ich słownictwo jest bardzo ograniczone, szczególnie, że czasami chcę pisać nie-słowa (jak niektóre rzeczowniki właściwe).
mbork
@mork Prawda, ale ma również zalety, takie jak nie martwienie się o pisanie każdego '. Używam niemieckiej klawiatury , a moje pinkies muszą rozdzielać za każdym razem, gdy sięgam po ten klawisz
Tymric
1
@mbork Aby rozwiązać problem „non_words”, czy moglibyśmy powiązać się S-SPCz „zostaw to słowo” w spokoju?
Tymric

Odpowiedzi:

6

Pozwól, że odsyłam cię do mojego postu na ten temat .


Przekonałem się, że skróty są najlepszym sposobem korekcji SPC, wystarczy zdefiniować poprawki, które chcesz. W tym celu stosuję następujące podejście:

  1. Dodaj poniższy kod do pliku inicjującego.
  2. Ilekroć wpiszesz coś złego, naciśnij C-x C-ii wybierz jedną z oferowanych poprawek.
  3. Otóż ​​to! Korekta zostanie tam automatycznie zastąpiona i będzie automatycznie wykonywana za każdym razem, gdy popełnisz ten błąd.

Oto kod

(define-key ctl-x-map "\C-i" 'endless/ispell-word-then-abbrev)

(defun endless/ispell-word-then-abbrev (p)
  "Call `ispell-word'. Then create an abbrev for the correction made.
With prefix P, create local abbrev. Otherwise it will be global."
  (interactive "P")
  (let ((bef (downcase (or (thing-at-point 'word) ""))) aft)
    (call-interactively 'ispell-word)
    (setq aft (downcase (or (thing-at-point 'word) "")))
    (unless (string= aft bef)
      (message "\"%s\" now expands to \"%s\" %sally"
               bef aft (if p "loc" "glob"))
      (define-abbrev
        (if p local-abbrev-table global-abbrev-table)
        bef aft))))

(setq save-abbrevs t)
(setq-default abbrev-mode t)

Ręczne dodawanie poprawek może wydawać się uciążliwe, ale tak naprawdę nie jest. Naciskasz tylko kilka klawiszy, a zauważysz, że kilka poprawek da ci długą drogę.

Poza tym alternatywa (pozwolenie ispell na wybranie korekty za każdym razem, gdy słowo nie istnieje) spowoduje częstsze błędne poprawki. Tak czy inaczej najlepiej zdefiniować własne. To nawet rozwiązuje problem, kiedy naprawdę chcesz pisać nie-słowa.

Malabarba
źródło
Próbowałem dodanie podstawienie dontdo don'tkorzystania C-x C-i 1, ale to dodaje literę tzamiast ( "dont" now expands to "t" globally). Nie sądzę, żeby dobrze radził sobie z apostrofami. Czy można to naprawić?
Tymric
@ Timmy Czy to jest w trybie programowania? W trybie tekstowym tak się nie dzieje.
Malabarba
Próbowałem w rozmowie żabber, ale po twoim komentarzu przetestowałem go w trybie tekstowym i działał globalnie. Dziękuję
Tymric
2

Oto prosta próba:

(defun my-flyspell-correct-on-space ()
  (interactive)
  (when flyspell-mode
    (flyspell-auto-correct-word))
  (self-insert-command 1))
(local-set-key " " 'my-flyspell-correct-on-space)

Dziwnie się zachowuje, gdy wstawiasz więcej niż jedną spację w rzędzie, a czasem oddziela część poprawianego słowa. Tak więc ten post jest wiki społeczności; możesz to poprawić.

legoscia
źródło
6
Wolę zostawić klawisz spacji w spokoju i zamiast tego użyć post-self-insert-hookdo śledzenia wstawiania spacji i działać odpowiednio. To bezpieczniejsze i bardziej wydajne.
lunaryorn
1

Późna odpowiedź zainspirowana innym pytaniem o autokorekty i odpowiedzią @ legoscia . Oto szybki drobny tryb, który będzie autokorekty w locie, przy użyciu flyspell. W rzeczywistości jest „globalny”, ponieważ doradza self-insert-command, ale strzela tylko w buforach, które zostały flyspell-modewłączone.

(defun flyspell-ac-word (&optional arg)
  "Autocorrect a word when entering a non-word character."
  (when flyspell-mode
    (unless (eq ?w (char-syntax (string-to-char (this-command-keys))))
      (when (or (bobp)
                (eq ?w (char-syntax (char-before))))
        (flyspell-auto-correct-word)))))

(define-minor-mode flyspell-autocorrect-mode
  "Toggle `flyspell-autocorrect-mode'.  Fires flyspell on a
just-completed word.  Only operates when `flyspell-mode' is on."
  :init-value nil
  :lighter (" AC")
  (if flyspell-autocorrect-mode
      (progn 
        (require 'flyspell)
        (advice-add #'self-insert-command :before #'flyspell-ac-word))
    (advice-remove #'self-insert-command #'flyspell-ac-word)))
Dan
źródło