Ist es möglich, die Rechtschreibung "im Leerzeichen" automatisch zu korrigieren?


10

Ich wollte die Frage gerade posten, habe sie dann aber bei Stack Overflow gesehen, als ich nach Möglichkeiten zur automatischen Korrektur gesucht habe. Die verknüpfte Frage hat keine Antworten, daher dachte ich, dass sie auf dieser Website mehr Glück haben würde. Hier ist der Text:

Ich wünschte, es gäbe eine Möglichkeit, dass Flyspell ein Wort, wenn ich es falsch schreibe, automatisch auf die "wahrscheinlichste" Korrektur korrigiert. Wenn ich ein Wort falsch schreibe und dann OPTION-TAB drücke, um es zu korrigieren, wählt flyspell FAST IMMER standardmäßig die richtige Korrektur als Hauptvorschlag.

Ich möchte jedoch, dass Flyspell dies mit jedem Wort tut, das ich falsch schreibe, ohne dass ich OPTION-TAB drücken muss. Nur vom Drücken der Leertaste bis zum nächsten Wort.

Ist das möglich?

Also im Grunde so etwas wie Autokorrektur auf Handys. Eine solche Funktion wäre nützlich für Modi wie jabberund captureinorg-mode


Bearbeiten :

Ich hätte diese Funktion lieber als separaten Nebenmodus, als die Standardfunktion für Flugzauber zu überschreiben. Es kann bei Bedarf zusätzlich oder anstelle des Fliegenzaubers aktiviert werden


1
Ich bin mir sicher, dass es möglich ist (und wahrscheinlich nicht schwer zu hacken), aber ich fühle mich verpflichtet zu sagen, dass IMHO das eine sehr schlechte Idee wäre.
mbork

1
@mbork Es wäre eine schlechte Idee, die Funktionsweise von Fly-Spell zu ändern, aber was ist falsch daran, einen zusätzlichen Nebenmodus zu haben, der bei Bedarf aktiviert / deaktiviert werden kann?
Tymric

Ich ärgere mich ständig über eine ähnliche Funktion auf meinem Handy. Ich mag keine Maschinen, die so tun, als wären sie schlauer als ich, besonders nicht ;-): Ihr Wortschatz ist sehr begrenzt, insbesondere, dass ich manchmal Nichtwörter eingeben möchte (wie einige Eigennamen).
mbork

@mbork Stimmt, aber es hat auch Vorteile, wie sich nicht um das Tippen kümmern zu müssen '. Ich benutze eine deutsche Tastatur und meine
kleinen Finger

1
@mbork Um das Problem "non_words" zu lösen, könnten wir uns vielleicht S-SPCan "das Wort in Ruhe lassen" binden ?
Tymric

Antworten:


6

Lassen Sie mich auf meinen Beitrag dazu verweisen .


Ich habe festgestellt, dass Abkürzungen der beste Weg sind, um Korrekturen vorzunehmen SPC. Sie müssen nur die gewünschten Korrekturen definieren. Dafür verfolge ich folgenden Ansatz:

  1. Fügen Sie den folgenden Code zu Ihrer Init-Datei hinzu.
  2. Wenn Sie etwas falsch eingeben, drücken Sie C-x C-iund wählen Sie eine der angebotenen Korrekturen.
  3. Das ist es! Die Korrektur wird dort automatisch ersetzt und jedes Mal automatisch durchgeführt, wenn Sie diesen Fehler machen.

Hier ist der 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)

Manuell mag das Hinzufügen der Korrekturen umständlich klingen, ist es aber wirklich nicht. Sie drücken nur ein paar Tasten und werden feststellen, dass ein paar Korrekturen Sie weit bringen werden.

Außerdem führt die Alternative (wenn ispell jedes Mal, wenn das Wort nicht existiert , die Korrektur für Sie auswählt ) häufig zu falschen Korrekturen. Also ist es am besten, deine eigenen zu definieren. Es löst sogar das Problem, wann Sie tatsächlich Nicht-Wörter eingeben möchten .


Ich habe versucht, einen Ersatz für dontdie don'tVerwendung hinzuzufügen , C-x C-i 1aber tstattdessen wurde der Buchstabe hinzugefügt ( "dont" now expands to "t" globally). Ich denke nicht, dass es gut mit Apostrophen umgeht. Gibt es eine Lösung dafür?
Tymric

@Timmy Ist das in einem Programmiermodus? Im Textmodus passiert das bei mir nicht.
Malabarba

Ich habe es in einem Gespräch versucht, aber nach Ihrem Kommentar habe ich es im Textmodus getestet und es hat global funktioniert. Vielen Dank
Tymric

2

Hier ist ein einfacher Versuch:

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

Es verhält sich seltsam, wenn Sie mehr als ein Leerzeichen hintereinander einfügen, und manchmal wird ein Teil des zu korrigierenden Wortes abgespalten. Somit ist dieser Beitrag ein Community-Wiki; Fühlen Sie sich frei, es zu verbessern.


6
Ich lasse lieber die Leertaste in Ruhe und verwende stattdessen post-self-insert-hook, um das Einfügen von Leerzeichen zu verfolgen und entsprechend zu handeln. Das ist sicherer und effizienter.
Mondhorn

1

Späte Antwort inspiriert von einer anderen Frage zur Autokorrektur und der Antwort von @ legoscia . Hier ist ein schneller Nebenmodus, der mithilfe von automatisch automatisch korrigiert wird flyspell. Es ist in der Tat "global", da es empfiehlt self-insert-command, aber nur in aktivierten Puffern flyspell-modeausgelöst wird.

(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)))
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.