是否可以自动更正“在空间上”的拼写?


10

我正要发布问题,但随后在搜索自动更正可能性时在堆栈溢出中看到了。链接的问题没有答案,因此我认为该站点会很幸运。这是文本:

我希望有一种方法,以便当我输入错误的单词时,flyspell可以将其自动更正为“最可能的”更正。当我输错单词然后按OPTION-TAB进行更正时,flyspell ALMOST ALWAYS默认情况下会选择正确的更正作为主要建议。

但是,我希望flyspell可以对我键入的每个单词都执行此操作,而不必点击OPTION-TAB。只需按一下空格键,然后转到下一个单词即可。

这可能吗?

因此基本上就像在手机上自动更正一样。这样的功能对于像jabbercaptureorg-mode


编辑

我宁愿将此功能作为单独的次要模式,也不愿覆盖默认的fly-spell功能。必要时可以附加激活它,也可以代替动态拼写


1
我敢肯定这是有可能的(并且可能并不难破解),但是我不得不说恕我直言,那将是一个非常糟糕的主意。
mbork 2014年

1
@mbork更改fly-spell的工作方式不是一个好主意,但是拥有可以按需激活/停用的其他次要模式怎么办?
蒂姆里克2014年

我一直为手机上的类似功能感到烦恼。我不喜欢假装它们比我聪明的机器,特别是它们不是;-):它们的词汇量非常有限,尤其是我有时键入非单词(例如某些专有名词)。
mbork 2014年

@mbork是的,但它也有优点,例如不必担心键入every '。我使用德语键盘,每次到达该键时,小指都要进行分割
Tymric 2014年

1
@mbork要解决“ non_words”问题,我们是否可以绑定S-SPC到“仅保留单词”?
蒂姆里克2014年

Answers:


6

让我介绍一下我对此的帖子


我发现缩写是对进行校正的最佳方法SPC,您只需定义所需的校正即可。为此,我采用以下方法:

  1. 将以下代码添加到您的init文件中。
  2. 如果您键入错误的内容,请点击C-x C-i并选择提供的更正之一。
  3. 而已!更正将在那里自动替换,并且从现在开始每次您犯此错误将自动执行。

这是代码

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

手动添加校正可能听起来很麻烦,但实际上并非如此。您只需要敲几个键,您就会发现一些更正将使您走得很远。

此外,另一种选择(每次单词不存在让ispell为您选择更正 )通常会为您带来错误更正。所以最好还是定义自己的。它甚至解决了您实际上键入非单词的问题。


我尝试添加一个取代dontdon't使用C-x C-i 1,但它增加了字母t代替("dont" now expands to "t" globally)。我认为它不能很好地处理撇号。有解决办法吗?
蒂姆里克2014年

@Timmy这是在编程模式下吗?在文本模式下,这对我而言不会发生。
马拉巴巴

我在一次闲聊中尝试了它,但是在您发表评论后,我以文本模式对其进行了测试,并且可以在全球范围内使用。谢谢
Tymric

2

这是一个简单的尝试:

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

当您在一行中插入多个空格时,它的行为会很奇怪,有时它会将要纠正的单词的一部分分开。因此,该帖子是社区Wiki;随时进行改进。


6
我宁愿不使用空格键,而是使用它post-self-insert-hook来跟踪空格的插入并采取相应的措施。这样更安全,更有效。
lunaryorn 2014年

1

后来的答案受到另一个有关自动更正的问题@legoscia的答案的启发。这是一个快速的次要模式,可以使用进行实时自动校正flyspell。实际上,它建议使用“ global” self-insert-command,但仅在已flyspell-mode打开的缓冲区中触发。

(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)))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.