Flyspellを使用して前の単語を効率的に修正する方法は?


18

Flyspellを使い始めた瞬間から、使用するのはいつも苦痛でした。スペルミスの単語がないかバッファ全体をチェックすることはめったにありません。通常は入力します。下線の付いた単語が表示されたら、すぐに修正して入力を続けます。これは、単語を後で修正するのを忘れることを恐れているため、およびバッファの包括的なチェックを開始すると、iSpellがあまりにも多くの誤検出を与えるためです。そのため、ほとんどの場合、入力中にできるだけ早く単語を修正します。

ここに、私が知っている組み込み関数と、それらが効率的でない理由(私にとって)があります。

  • flyspell-correct-word—これはマウスクリックにバインドされています。忘れてください、私はマウスを使いません。

  • flyspell-correct-word-before-point—私はしばらくそれを使用しました。これには2つの欠点があります。

    1. デフォルトでは、マウスなしで操作するのが難しいGUIメニューが表示され、10を超える項目の修正リストがある場合は非常に面倒です。

    2. ポイントよりもずっと前の単語では機能しません。私は高速で入力し、つづりの間違った単語を見つけると、通常、つづりの間違った単語とポイントの間に1つまたは2つの単語があります。ポイントを移動し、単語を修正し、戻る必要があります。ああ。

  • flyspell-auto-correct-word —ポイント2↑を参照してください。また、完了リストが長い場合(サイクリングのため)うまく動作しません。

Q:キーボードを使用して、Flyspellを効率的に使用するには、サイクリングせずに補完リストから選択できます。

他の人がFlyspellと効率的にやり取りする方法を見つけたと思うので、受け入れ可能な回答には、以前のスペルミスの単語にナビゲートし、それを修正して戻ってくるなどの小さなスニペットと、おそらくあなた自身の設定ファイルからの小さなスニペットが含まれます

回答:


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個の修正案が表示されています。
マークカルポフ

3
ttwotwo最初の試行でに自動修正されました。しかし、私はあなたの意味を知っています。実際の経験から、約90%のケースで、最初の試行で正しい単語が得られ、残りの9%で2、3回試行する必要があり、最後の1%はflyspellがそれを理解できずに行く必要がある場合です5回以上試行します(または手動で修正します)。
カウシャルモディ

あなたの方法には、独自の利点(シンプルさ)があります。たぶん私はそれに切り替えます。
マークカルポフ

2
非常に素晴らしい-これは私が見つけることを期待していたものであり、デフォルトのキーを他のものにバインドしていたので見逃した。これはC-;デフォルトでバインドされており、カスタマイズflyspell-auto-correct-bindingしてflyspellマップの別のキーにバインドできます。(または、もちろん通常の方法でバインドします。)
glucas

6

他の人々が将来の読者に役立つさまざまなソリューションを思い付くと確信しています。ただし、これを現在どのように処理するかを以下に示します。

flyspell-correct-word-before-point少なくともキーを押すことで呼び出すことができ、可能な修正のメニューが表示されるため、開始するのに適した場所だと思います。メニューを修正するために、Avyをバックエンドとして使用するパッケージ Ace Popup Menuを作成しました 。これにより、使用する(関数が呼び出される )GUIポップアップメニューが、ラベル付きのメニュー項目(1つまたは2つのキーストローク)を表示するテキストポップアップメニューに置き換えられます。flyspell-correct-word-before-pointx-popup-menu

2番目の問題(「距離を置いて」単語を修正できない)を解決するために、このヘルパーを作成しました。

(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

舵-フライスペル(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"))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.