¿Es posible corregir automáticamente la ortografía "en el espacio"?

10

Estaba a punto de publicar la pregunta, pero luego la vi en Stack Overflow mientras buscaba posibilidades de autocorrección. La pregunta vinculada no tiene respuestas, así que pensé que tendría más suerte en este sitio. Aquí está el texto:

Desearía que hubiera una manera para que cuando escribo mal una palabra, el flyspell pueda autocorregirlo a la corrección "más probable". Cuando escribo mal una palabra y luego presiono OPTION-TAB para corregirla, el flyspell CASI SIEMPRE elige la corrección correcta por defecto como la sugerencia principal.

Sin embargo, quiero que el flyspell haga esto con cada palabra que escribo mal, SIN tener que presionar OPTION-TAB. Solo de golpear la barra espaciadora y pasar a la siguiente palabra.

es posible?

Básicamente, algo así como la corrección automática en teléfonos móviles. Tal característica sería útil para modos como jabbery captureenorg-mode


Editar :

Prefiero tener esta característica como un modo menor separado que sobrescribir la funcionalidad predeterminada de volar-hechizo. Podría activarse además o en lugar de volar-hechizo cuando sea necesario

Tímbrico
fuente
1
Estoy seguro de que es posible (y probablemente no sea difícil de hackear), pero me siento obligado a decir que en mi humilde opinión sería una muy mala idea.
mbork
1
@mbork Sería una mala idea cambiar cómo funciona el hechizo de mosca, pero ¿qué tiene de malo tener un modo menor adicional que se pueda activar / desactivar a pedido?
Tymric
Estoy constantemente molesto por una función similar en mi teléfono. No me gustan las máquinas que fingen que son más inteligentes que yo, especialmente que no lo son ;-): su vocabulario es muy limitado, especialmente porque a veces quiero escribir sin palabras (como algunos nombres propios).
mbork
@mbork Es cierto, pero también tiene ventajas, como no tener que preocuparse por escribir cada uno '. Uso un teclado alemán , y mis meñiques tienen que hacer las divisiones cada vez que
alcanzo
1
@mbork Para resolver el problema de "no palabras", ¿podríamos unirnos S-SPCa "dejar esa palabra sola"?
Tymric

Respuestas:

6

Déjame referirte a mi publicación sobre esto .


Descubrí que las abreviaturas son la mejor manera de corregir SPC, solo necesita definir las correcciones que desea. Para eso, tomo el siguiente enfoque:

  1. Agregue el siguiente código a su archivo de inicio.
  2. Siempre que escriba algo incorrecto, presione C-x C-iy elija una de las correcciones ofrecidas.
  3. ¡Eso es! La corrección se reemplazará automáticamente allí, y se realizará automáticamente cada vez que cometa este error a partir de ahora.

Aquí está el código

(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, agregar las correcciones puede parecer engorroso, pero en realidad no lo es. Solo está presionando un par de teclas, y notará que algunas correcciones lo ayudarán mucho.

Además, la alternativa (dejar que ispell elija la corrección por ti cada vez que la palabra no existe) te dará correcciones incorrectas la mayoría de las veces. Por lo tanto, es mejor definir el suyo de todos modos. Incluso resuelve el problema de cuándo realmente quieres escribir sin palabras.

Malabarba
fuente
He intentado añadir una sustitución de dontal don'tusar C-x C-i 1pero añadí la letra tlugar ( "dont" now expands to "t" globally). No creo que maneje bien los apóstrofes. ¿Hay algún arreglo para eso?
Tymric
@Timmy ¿Está eso en un modo de programación? En modo texto, eso no me sucede.
Malabarba
Lo probé en una conversación jabber, pero después de tu comentario lo probé en modo texto y funcionó a nivel mundial. Gracias
Tymric
2

Aquí hay un intento 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)

Se comporta de manera extraña cuando inserta más de un espacio en una fila y, a veces, divide parte de la palabra que se está corrigiendo. Por lo tanto, esta publicación es wiki comunitaria; siéntase libre de mejorarlo.

legoscia
fuente
66
Prefiero dejar sola la tecla de espacio y, en su lugar, usar post-self-insert-hookpara rastrear la inserción de espacios y actuar en consecuencia. Eso es más seguro y más eficiente.
lunaryorn
1

Respuesta tardía inspirada en otra pregunta sobre autocorrección y la respuesta de @legoscia . Aquí hay un modo menor rápido que se autocorregirá sobre la marcha, usando flyspell. Es, en efecto, "global" en el sentido de que aconseja self-insert-command, pero solo se dispara en los buffers que se han flyspell-modeactivado.

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