É possível corrigir automaticamente a ortografia "no espaço"?

10

Eu estava prestes a postar a pergunta, mas a vi no Stack Overflow enquanto procurava possibilidades de correção automática. A pergunta vinculada não tem respostas, então pensei que teria mais sorte neste site. Aqui está o texto:

Eu gostaria que houvesse uma maneira de, quando eu digitar uma palavra incorretamente, o flyspell pudesse corrigi-la automaticamente para a correção "mais provável". Quando digito uma palavra incorretamente e pressiono OPTION-TAB para corrigi-la, o flyspell SEMPRE SEMPRE seleciona a correção correta por padrão como sugestão principal.

No entanto, eu quero que o flyspell faça isso com cada palavra que eu digitar incorretamente, sem precisar pressionar OPTION-TAB. Apenas pressionando a barra ESPAÇO e passando para a próxima palavra.

Isso é possível?

Então, basicamente, algo como correção automática em telefones celulares. Esse recurso seria útil para modos como jabbere captureemorg-mode


Editar :

Prefiro ter esse recurso como um modo secundário separado do que sobrescrever a funcionalidade padrão de fly-spell. Pode ser ativado em adição ou em vez de voar quando necessário

Tymric
fonte
11
Estou certo de que é possível (e provavelmente não é difícil de hackear), mas sinto-me obrigado a dizer que IMHO seria uma péssima ideia.
mbork
11
@mbork Seria uma má ideia alterar o funcionamento da mosca, mas o que há de errado em ter um modo secundário adicional que pode ser ativado / desativado sob demanda?
Tymric
Estou constantemente irritado com um recurso semelhante no meu telefone. Não gosto de máquinas que fingem ser mais espertas do que eu, principalmente porque não são ;-): o vocabulário é muito limitado, principalmente porque às vezes quero digitar não-palavras (como alguns nomes próprios).
mbork
@mbork É verdade, mas também tem vantagens, como não ter que se preocupar em digitar todos '. Eu uso um teclado alemão , e os meus dedos mínimos tem que fazer as separações cada vez que eu chegar para essa chave
Tymric
11
@mbork Para resolver o problema "non_words", talvez possamos vincular S-SPCa "deixar essa palavra em paz"?
Tymric

Respostas:

6

Deixe-me encaminhá-lo para o meu post sobre isso .


Descobri que as abreviações são a melhor maneira de fazer correções SPC; você só precisa definir as correções que deseja. Para isso, adoto a seguinte abordagem:

  1. Adicione o código abaixo ao seu arquivo init.
  2. Sempre que você digitar algo errado, pressione C-x C-ie escolha uma das correções oferecidas.
  3. É isso aí! A correção será substituída automaticamente e será executada toda vez que você cometer esse erro a partir de agora.

Aqui está o 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, adicionar as correções pode parecer complicado, mas na verdade não é. Você está apenas pressionando algumas teclas e perceberá que algumas correções o ajudarão a percorrer um longo caminho.

Além disso, a alternativa (deixar o ispell escolher a correção sempre que a palavra não existir) fará com que você faça correções erradas com mais frequência. Portanto, é melhor definir o seu de qualquer maneira. Ele até resolve o problema de quando você realmente deseja digitar não palavras.

Malabarba
fonte
Eu tentei adicionar uma substituição para donta don'tusar C-x C-i 1, mas acrescentou a letra tem vez ( "dont" now expands to "t" globally). Eu não acho que ele lida bem com apóstrofos. Existe uma correção para isso?
Tymric
@ Timmy Isso está no modo de programação? No modo de texto, isso não acontece para mim.
Malabarba 30/10
Eu tentei em uma conversa tagarela, mas depois do seu comentário eu testei no modo de texto e funcionou globalmente. Obrigado
Tymric
2

Aqui está uma tentativa simples:

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

Ele se comporta de maneira estranha quando você insere mais de um espaço em uma linha e, às vezes, divide parte da palavra que está sendo corrigida. Portanto, este post é um wiki da comunidade; sinta-se livre para melhorá-lo.

legoscia
fonte
6
Prefiro deixar a chave de espaço em paz e, em vez disso, usar post-self-insert-hookpara rastrear a inserção de espaços e agir em conformidade. Isso é mais seguro e mais eficiente.
lunaryorn
1

Resposta tardia inspirada em outra pergunta sobre autocorreção e resposta de @ legoscia . Aqui está um modo secundário rápido que será corrigido automaticamente em tempo real, usando flyspell. Com efeito, é "global" no que aconselha self-insert-command, mas apenas é acionado nos buffers flyspell-modeativados.

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