È possibile correggere automaticamente l'ortografia "nello spazio"?


10

Stavo per pubblicare la domanda, ma poi l'ho vista su Stack Overflow durante la ricerca di possibilità di correzione automatica. La domanda collegata non ha risposte, quindi ho pensato che avrebbe avuto più fortuna su questo sito. Ecco il testo:

Vorrei che ci fosse un modo in cui quando digito male una parola, flyspell potrebbe correggerla automaticamente alla correzione "più probabile". Quando digito male una parola e poi premo OPTION-TAB per correggerla, flyspell QUASI SEMPRE sceglie la correzione corretta di default come suggerimento principale.

Tuttavia, voglio che il flyspell faccia questo con ogni parola che scrivo male, SENZA che io debba premere OPTION-TAB. Basta colpire la barra dello spazio e passare alla parola successiva.

È possibile?

Quindi, in pratica, qualcosa come la correzione automatica sui telefoni cellulari. Una tale funzione sarebbe utile per modalità come jabbere captureinorg-mode


Modifica :

Preferirei avere questa funzione come modalità secondaria separata piuttosto che sovrascrivere la funzionalità fly-spell predefinita. Potrebbe essere attivato in aggiunta o al posto dell'incantesimo quando necessario


1
Sono certo che sia possibile (e probabilmente non difficile da hackerare), ma mi sento obbligato a dire che IMHO sarebbe una pessima idea.
mbork,

1
@mbork Sarebbe una cattiva idea cambiare il modo in cui funziona il fly-spell, ma cosa c'è di sbagliato nell'avere una modalità secondaria aggiuntiva che può essere attivata / disattivata su richiesta?
Tymric,

Sono costantemente infastidito da una funzione simile sul mio telefono. Non mi piacciono le macchine che fingono di essere più intelligenti di me, soprattutto che non lo sono ;-): il loro vocabolario è molto limitato, soprattutto che a volte voglio digitare non parole (come alcuni nomi propri).
mbork,

@mbork Vero, ma ha anche dei vantaggi, come non doversi preoccupare di digitare ogni '. Uso una tastiera tedesca e i miei mignoli devono fare le divisioni ogni volta che raggiungo quel tasto
Tymric

1
@mbork Per risolvere il problema "non_words", potremmo forse legarci S-SPCa "lasciare solo quella parola"?
Tymric,

Risposte:


6

Lascia che ti rimandi al mio post su questo .


Ho scoperto che gli abbrev sono il modo migliore per eseguire la correzione SPC, devi solo definire le correzioni che desideri. Per questo, prendo il seguente approccio:

  1. Aggiungi il codice qui sotto al tuo file init.
  2. Quando digiti qualcosa di sbagliato, premi C-x C-ie scegli una delle correzioni offerte.
  3. Questo è tutto! La correzione verrà automaticamente sostituita lì e verrà eseguita automaticamente ogni volta che commetti questo errore da ora in poi.

Ecco il codice

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

Manualmente, l'aggiunta delle correzioni può sembrare ingombrante, ma in realtà non lo è. Devi solo premere un paio di chiavi e noterai che alcune correzioni ti porteranno molto lontano.

Inoltre, l'alternativa (lasciando che ispell scelga la correzione per te ogni volta che la parola non esiste) ti farà correggere erroneamente il più delle volte. Quindi è meglio definire il tuo comunque. Risolve anche il problema di quando si desidera effettivamente digitare non parole.


Ho provato ad aggiungere una sostituzione per dontl' don'tutilizzo C-x C-i 1ma ha aggiunto tinvece la lettera ( "dont" now expands to "t" globally). Non penso che gestisca bene gli apostrofi. C'è una soluzione per questo?
Tymric,

@Timmy È in una modalità di programmazione? In modalità testo ciò non accade per me.
Malabarba,

L'ho provato in una conversazione jabber, ma dopo il tuo commento l'ho provato in modalità testo e ha funzionato a livello globale. Grazie
Tymric,

2

Ecco un semplice tentativo:

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

Si comporta in modo strano quando si inserisce più di uno spazio in una riga, e talvolta si divide parte della parola da correggere. Quindi questo post è wiki della comunità; sentiti libero di migliorarlo.


6
Preferirei lasciare sola la chiave spaziale, e invece userei post-self-insert-hookper tracciare l'inserimento degli spazi e agire di conseguenza. È più sicuro ed efficiente.
lunaryorn,

1

Risposta tardiva ispirata a un'altra domanda sulla correzione automatica e la risposta di @ legoscia . Ecco una modalità secondaria rapida che si correggerà automaticamente al volo, usando flyspell. È, in effetti, "globale" in quanto consiglia self-insert-command, ma flyspell-modesi attiva solo nei buffer che si sono attivati.

(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)))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.