Apakah mungkin untuk mengoreksi ejaan "di ruang"?

10

Saya hendak memposting pertanyaan tapi kemudian saya melihatnya di Stack Overflow sambil mencari kemungkinan koreksi otomatis. Pertanyaan yang ditautkan tidak memiliki jawaban, jadi saya pikir itu akan lebih beruntung di situs ini. Ini teksnya:

Saya berharap ada cara agar ketika saya salah mengetik sebuah kata, flyspell dapat mengoreksi secara otomatis ke koreksi "yang paling mungkin". Ketika saya salah mengetik sebuah kata dan kemudian menekan OPTION-TAB untuk memperbaikinya, flyspell SELALU SELALU memilih koreksi yang benar secara default sebagai saran utama.

Namun, saya ingin flyspell melakukan ini dengan setiap kata yang saya ketik salah, TANPA saya harus menekan OPTION-TAB. Hanya dengan menekan bilah SPACE dan beralih ke kata berikutnya.

Apakah ini mungkin?

Jadi pada dasarnya sesuatu seperti koreksi otomatis pada ponsel. Fitur seperti itu akan berguna untuk memiliki mode suka jabberdan capturedalamorg-mode


Edit :

Saya lebih suka memiliki fitur ini sebagai mode minor terpisah daripada menimpa fungsionalitas fly-spell default. Itu bisa diaktifkan sebagai tambahan atau bukannya terbang-mantra saat dibutuhkan

Tymric
sumber
1
Saya yakin itu mungkin (dan mungkin tidak sulit untuk diretas), tetapi saya merasa berkewajiban untuk mengatakan bahwa IMHO itu akan menjadi ide yang sangat buruk.
mbork
1
@ mbork Akan merupakan ide buruk untuk mengubah cara kerja fly-spell, tetapi apa yang salah dengan memiliki mode minor tambahan yang dapat diaktifkan / dinonaktifkan sesuai permintaan?
Tymric
Saya terus-menerus terganggu oleh fitur serupa di ponsel saya. Saya tidak suka mesin yang berpura-pura lebih pintar dari saya, terutama yang tidak ;-): kosakata mereka sangat terbatas, terutama bahwa saya kadang - kadang ingin mengetikkan non-kata (seperti beberapa kata benda yang tepat).
mbork
@ mbork Benar, tetapi juga memiliki kelebihan, seperti tidak perlu khawatir mengetik setiap '. Saya menggunakan keyboard Jerman , dan jari kelingking saya harus melakukan split setiap kali saya meraih kunci itu
Tymric
1
@mbork Untuk mengatasi masalah "non_words", bisakah kita mengikat S-SPC"meninggalkan kata itu sendiri"?
Tymric

Jawaban:

6

Biarkan saya merujuk Anda ke posting saya tentang ini .


Saya telah menemukan bahwa singkatan adalah cara terbaik untuk melakukan koreksi SPC, Anda hanya perlu menentukan koreksi yang Anda inginkan. Untuk itu, saya mengambil pendekatan berikut:

  1. Tambahkan kode di bawah ini ke file init Anda.
  2. Kapan pun Anda salah mengetik, tekan C-x C-idan pilih salah satu koreksi yang ditawarkan.
  3. Itu dia! Koreksi akan secara otomatis diganti di sana, dan secara otomatis akan dilakukan setiap kali Anda membuat kesalahan ini mulai sekarang.

Ini kodenya

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

Secara manual, menambahkan koreksi mungkin terdengar rumit, tetapi sebenarnya tidak. Anda hanya menekan beberapa kunci, dan Anda akan melihat beberapa koreksi akan membantu Anda.

Selain itu, alternatifnya (membiarkan ispell memilih koreksi untuk Anda setiap kali kata itu tidak ada) akan membuat Anda salah koreksi lebih sering daripada tidak. Jadi, yang terbaik adalah mendefinisikan milik Anda. Itu bahkan memecahkan masalah ketika Anda benar - benar ingin mengetikkan kata-kata.

Malabarba
sumber
Saya mencoba menambahkan substitusi untuk dontuntuk don'tmenggunakan C-x C-i 1tetapi ditambahkan huruf tbukan ( "dont" now expands to "t" globally). Saya tidak berpikir itu menangani apostrof dengan baik. Apakah ada perbaikan untuk itu?
Tymric
@ Timmy Apakah itu dalam mode pemrograman? Dalam mode teks itu tidak terjadi pada saya.
Malabarba
Saya mencobanya dalam percakapan jabber, tetapi setelah komentar Anda, saya mengujinya dalam mode teks dan berfungsi secara global. Terima kasih
Tymric
2

Inilah upaya sederhana:

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

Itu berperilaku aneh ketika Anda memasukkan lebih dari satu spasi dalam satu baris, dan kadang-kadang terbagi menjadi bagian dari kata yang sedang diperbaiki. Jadi posting ini adalah wiki komunitas; jangan ragu untuk memperbaikinya.

legoscia
sumber
6
Saya lebih suka meninggalkan kunci spasi sendirian, dan alih-alih menggunakan post-self-insert-hookuntuk melacak penyisipan spasi dan bertindak sesuai. Itu lebih aman dan lebih efisien.
lunaryorn
1

Akhir jawaban terinspirasi oleh pertanyaan lain tentang AutoCorrect dan jawaban @ legoscia ini . Inilah mode minor cepat yang akan mengoreksi dengan cepat saat menggunakan flyspell. Ini pada dasarnya adalah "global" dalam sarannya self-insert-command, tetapi hanya api di buffer yang telah flyspell-modedihidupkan.

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