如何使用Flyspell有效纠正前一个单词?


18

从我开始使用Flyspell的那一刻起,使用它一直很痛苦。我很少检查整个缓冲区中是否有拼写错误的单词,通常我会键入,一旦看到带下划线的单词,我想立即更正并继续输入。这仅仅是因为我担心以后忘记忘记修改该单词,并且因为当我开始全面检查缓冲区时,iSpell给出了太多的误报。因此,几乎总是在输入时我会尽快纠正单词。

这是我所知道的内置函数以及它们效率不高的原因(对我而言):

  • flyspell-correct-word—绑定鼠标单击。算了,我不会使用鼠标。

  • flyspell-correct-word-before-point-我用了一段时间。它有两个缺点:

    1. 默认情况下,它显示GUI菜单,如果没有鼠标,很难操作,并且当您拥有包含10项以上的更正列表时,这确实很麻烦。

    2. 在要点之前很久都无法使用单词。我会快速键入,当我发现拼写错误的单词时,通常在拼写错误的单词和点之间会有一个或两个单词。我需要移动点,纠正单词,然后返回。哦。

  • flyspell-auto-correct-word —请参阅第2点↑,而且在您有很长的完工清单时(由于循环),它不能很好地工作。

问:如何通过键盘有效地使用Flyspell,能够在不循环的情况下从完成列表中进行选择,并且能够纠正或多或少的远处单词?

可以接受的答案包括可帮助您导航到先前拼写错误的单词,更正单词并返回或类似内容的软件包以及一些小片段(可能来自您自己的配置文件),因为我相信其他人已经找到了与Flyspell进行有效交互的方式。

Answers:


14

内置的flyspell-auto-correct-previous-word作品对我来说就像一种魅力。我已经绑定到它,F12并且我没有回头。对于我来说,始终有正确的单词,无论有多少单词支持不正确的单词。

从功能文档中:

flyspell-auto-correct-previous-word is an interactive compiled Lisp
function in `flyspell.el'.

(flyspell-auto-correct-previous-word POSITION)

For more information check the manuals.

Auto correct the first misspelled word that occurs before point.
But don't look beyond what's visible on the screen.

另外,如果第一次自动更正没有给您正确的词,请继续按绑定键(F12在我的情况下)以循环选择所有选项。

[我的拼写检查配置]


1
我看到您仍然需要循环进行所有可能的更正。ttwo例如,尝试一下,尽管我的菜单上看到了26个建议的更正!
Mark Karpov 2015年

3
ttwotwo在第一次尝试中自动更正为。但是我知道你的意思。根据实际经验,在大约90%的情况下,第一次尝试会得到正确的答案,其余9%可能需要2-3次尝试,最后1%是当flyspell不能解决问题时,我需要走通过5次以上的尝试(或我手动修复)。
考沙尔·莫迪

我知道,您的方法有其自身的优点(简单)。毕竟我可能会切换到它。
Mark Karpov 2015年

2
很好-这是我期望找到的,并且因为我将默认密钥绑定到其他东西而错过了它。C-;默认情况下,这是绑定的,您可以自定义flyspell-auto-correct-binding将其绑定到flyspell映射中的另一个键。(或者,当然,也可以用通常的方式绑定它。)
glucas

6

我很确定其他人会提出不同的解决方案,这些解决方案对将来的读者很有用。但是,这是我目前的处理方式。

我认为这flyspell-correct-word-before-point是一个不错的起点,因为至少可以通过按键调用它并显示可能的更正菜单。为了修复菜单,我编写了使用 Avy作为后端的Ace Popup Menu软件包 。这将使用显示该菜单项的文本弹出菜单替换了使用(称为函数 )的GUI弹出菜单:一个或两个键击就完成了。flyspell-correct-word-before-pointx-popup-menu

为了解决第二个问题(无法纠正“远处”的单词),我编写了此帮助程序:

(defun flyspell-correct-previous (&optional words)
  "Correct word before point, reach distant words.

WORDS words at maximum are traversed backward until misspelled
word is found.  If it's not found, give up.  If argument WORDS is
not specified, traverse 12 words by default.

Return T if misspelled word is found and NIL otherwise.  Never
move point."
  (interactive "P")
  (let* ((Δ (- (point-max) (point)))
         (counter (string-to-number (or words "12")))
         (result
          (catch 'result
            (while (>= counter 0)
              (when (cl-some #'flyspell-overlay-p
                             (overlays-at (point)))
                (flyspell-correct-word-before-point)
                (throw 'result t))
              (backward-word 1)
              (setq counter (1- counter))
              nil))))
    (goto-char (- (point-max) Δ))
    result))

这似乎有效。


5

使用helm-flyspell,您可以有效地从更正列表中进行选择。我使用以下代码跳转到错误并进行纠正,它将点的位置保存到,mark-ring因此您可以跳回到先前开始或更正单词的位置:

(defun flyspell-goto-previous-error (arg)
  "Go to arg previous spelling error."
  (interactive "p")
  (while (not (= 0 arg))
    (let ((pos (point))
          (min (point-min)))
      (if (and (eq (current-buffer) flyspell-old-buffer-error)
               (eq pos flyspell-old-pos-error))
          (progn
            (if (= flyspell-old-pos-error min)
                ;; goto beginning of buffer
                (progn
                  (message "Restarting from end of buffer")
                  (goto-char (point-max)))
              (backward-word 1))
            (setq pos (point))))
      ;; seek the next error
      (while (and (> pos min)
                  (let ((ovs (overlays-at pos))
                        (r '()))
                    (while (and (not r) (consp ovs))
                      (if (flyspell-overlay-p (car ovs))
                          (setq r t)
                        (setq ovs (cdr ovs))))
                    (not r)))
        (backward-word 1)
        (setq pos (point)))
      ;; save the current location for next invocation
      (setq arg (1- arg))
      (setq flyspell-old-pos-error pos)
      (setq flyspell-old-buffer-error (current-buffer))
      (goto-char pos)
      (if (= pos min)
          (progn
            (message "No more miss-spelled word!")
            (setq arg 0))))))


(defun check-previous-spelling-error ()
  "Jump to previous spelling error and correct it"
  (interactive)
  (push-mark-no-activate)
  (flyspell-goto-previous-error 1)
  (call-interactively 'helm-flyspell-correct))

(defun check-next-spelling-error ()
  "Jump to next spelling error and correct it"
  (interactive)
  (push-mark-no-activate)
  (flyspell-goto-next-error)
  (call-interactively 'helm-flyspell-correct))

(defun push-mark-no-activate ()
  "Pushes `point' to `mark-ring' and does not activate the region
 Equivalent to \\[set-mark-command] when \\[transient-mark-mode] is disabled"
  (interactive)
  (push-mark (point) t nil)
  (message "Pushed mark to ring"))
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.