「スペース内」でスペルを自動修正することは可能ですか?


10

質問を投稿しようとしていましたが、自動修正の可能性を検索しているときにStack Overflowに表示されました。リンクされた質問には答えがないので、このサイトではもっと運がいいと思いました。ここにテキストがあります:

私が単語を誤って入力したときにflyspellがその単語を「最も可能性の高い」修正に自動修正できる方法があったらいいのにと思います。単語を誤って入力し、OPTION-TABを押して修正すると、flyspellは常にデフォルトで正しい修正をメインの候補として選択します。

ただし、入力ミスがあるたびに、OPTIONS-TABを押す必要なしにflyspellでこれを実行したいと思います。スペースバーを押して次の単語に進むだけです。

これは可能ですか?

つまり、基本的には携帯電話の自動修正のようなものです。このような特徴は以下のようなモードを持っているために有用であろうjabbercaptureorg-mode


編集

この機能は、デフォルトのフライスペル機能を上書きするのではなく、別のマイナーモードとして使用したいと思います。必要に応じて、フライスペルの追加または代わりにアクティブ化できます


1
私はそれが可能であると確信しています(おそらくハッキングすることは難しくありません)。
mbork 2014年

1
@mbork fly-spellの動作を変更することは悪い考えですが、オンデマンドでアクティブ化/非アクティブ化できる追加のマイナーモードがあることの何が問題になっていますか?
Tymric 2014年

携帯電話の同様の機能に常に悩まされています。これらの語彙は非常に限られている、私は時々 、特にこと:私は、彼らがいない、特にこと;-)、私より賢くあることをふり機械好きではないしたい(いくつかの固有名詞のような)非単語を入力します。
mbork 2014年

@mbork Trueですが、すべての入力を心配する必要がないなどの利点もあります'。私はドイツ語のキーボードを使用しています。小指はそのキーに到達するたびに分割を行わなければなりません
Tymric

1
@mbork「non_words」の問題を解決するために、「S-SPCleave-that-word-alone」にバインドできるでしょうか?
Tymric 2014年

回答:


6

これに関する私の投稿を紹介させてください。


で修正を行うには、略語が最善の方法であることがわかりましたSPC。必要な修正を定義するだけで済みます。そのために、私は次のアプローチをとります:

  1. 以下のコードをinitファイルに追加します。
  2. 何か間違って入力した場合でも、ヒットC-x C-iして、提供されている修正の1つを選択します。
  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)。アポストロフィはうまく扱えないと思います。その修正はありますか?
Tymric 2014年

@ティミーそれはプログラミングモードですか?テキストモードでは私には起こりません。
Malabarba 2014年

私はジャバー会話でそれを試しました、しかしあなたのコメントの後、私はテキストモードでそれをテストしました、そしてそれは世界的に働きました。ありがとう
Tymric 2014年

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。実際には、それはアドバイスするという点で「グローバル」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)))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.