Est-il possible de corriger automatiquement l'orthographe «sur l'espace»?

10

J'étais sur le point de poster la question mais je l'ai vue sur Stack Overflow lors de la recherche de possibilités de correction automatique. La question liée n'a pas de réponse, j'ai donc pensé qu'elle aurait plus de chance sur ce site. Voici le texte:

Je souhaite qu'il y ait un moyen pour que lorsque je frappe mal un mot, flyspell puisse le corriger automatiquement avec la correction "la plus probable". Lorsque je saisis un mot par erreur, puis que je tape OPTION-TAB pour le corriger, flyspell ALMOST ALWAYS choisit la correction correcte par défaut comme suggestion principale.

Cependant, je veux que flyspell le fasse avec chaque mot que je saisis, SANS avoir à appuyer sur OPTION-TAB. Juste en appuyant sur la barre d'espace et en passant au mot suivant.

Est-ce possible?

Donc, fondamentalement, quelque chose comme la correction automatique sur les téléphones mobiles. Fonction d'un tel serait utile d'avoir des modes tels que jabberet capturedansorg-mode


Modifier :

Je préférerais que cette fonctionnalité soit un mode mineur distinct plutôt que d'écraser la fonctionnalité de sort de mouche par défaut. Il pourrait être activé en plus ou à la place du sort de mouche si nécessaire

Tymric
la source
1
Je suis certain que c'est possible (et probablement pas difficile à pirater), mais je me sens obligé de dire que mon humble avis ce serait une très mauvaise idée.
mbork
1
@mbork Ce serait une mauvaise idée de changer le fonctionnement du sort de mouche, mais qu'est-ce qui ne va pas avec un mode mineur supplémentaire qui peut être activé / désactivé à la demande?
Tymric
Je suis constamment ennuyé par une fonctionnalité similaire sur mon téléphone. Je n'aime pas les machines prétendant qu'elles sont plus intelligentes que moi, surtout qu'elles ne le sont pas ;-): leur vocabulaire est très limité, surtout que je veux parfois taper des non-mots (comme certains noms propres).
mbork
@mbork True, mais il a aussi des avantages, comme ne pas avoir à se soucier de taper tous '. J'utilise un clavier allemand et mes pinkies doivent faire le grand écart chaque fois que j'atteins cette touche
Tymric
1
@mbork Pour résoudre le problème "non_words", pourrions-nous peut-être nous lier S-SPCà "laisser-ce-mot-seul"?
Tymric

Réponses:

6

Permettez-moi de vous référer à mon message à ce sujet .


J'ai trouvé que les abréviations sont la meilleure façon de faire la correction SPC, il vous suffit de définir les corrections que vous souhaitez. Pour cela, je prends l'approche suivante:

  1. Ajoutez le code ci-dessous à votre fichier init.
  2. Lorsque vous tapez quelque chose de mal, appuyez sur C-x C-iet choisissez l'une des corrections proposées.
  3. C'est ça! La correction y sera automatiquement remplacée et sera automatiquement effectuée à chaque fois que vous ferez cette erreur.

Voici le code

(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)

Manuellement, l'ajout des corrections peut sembler lourd, mais ce n'est vraiment pas le cas. Vous frappez juste quelques touches, et vous remarquerez que quelques corrections vous permettront de faire du chemin.

En outre, l'alternative (en laissant ispell choisir la correction pour vous chaque fois que le mot n'existe pas) vous obtiendra le plus souvent des corrections erronées. Il est donc préférable de définir le vôtre de toute façon. Il résout même le problème du moment où vous voulez réellement taper des non-mots.

Malabarba
la source
J'ai essayé d'ajouter une substitution pour dontà l' don'taide C-x C-i 1mais il a ajouté la lettre à la tplace ( "dont" now expands to "t" globally). Je ne pense pas qu'il gère bien les apostrophes. Y a-t-il une solution à cela?
Tymric
@Timmy Est-ce en mode de programmation? En mode texte, cela ne m'arrive pas.
Malabarba
Je l'ai essayé dans une conversation jabber, mais après votre commentaire, je l'ai testé en mode texte et cela a fonctionné globalement. Merci
Tymric
2

Voici une tentative simple:

(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)

Il se comporte étrangement lorsque vous insérez plusieurs espaces de suite, et parfois il sépare une partie du mot à corriger. Ainsi, ce message est un wiki communautaire; n'hésitez pas à l'améliorer.

legoscia
la source
6
Je préfère laisser la touche espace seule, et plutôt utiliser post-self-insert-hookpour suivre l'insertion d'espaces et agir en conséquence. C'est plus sûr et plus efficace.
lunaryorn
1

Réponse tardive inspirée par une autre question au sujet de la correction automatique et @ la réponse de legoscia . Voici un mode mineur rapide qui se corrigera automatiquement à la volée, en utilisant flyspell. Il est, en effet, «global» en ce qu'il conseille self-insert-command, mais ne se déclenche que dans des tampons qui se sont flyspell-modeactivés.

(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
la source