Bagaimana cara menggunakan Flyspell untuk memperbaiki kata sebelumnya secara efisien?

18

Sejak saya mulai menggunakan Flyspell, selalu terasa menyakitkan untuk digunakan. Saya jarang memeriksa seluruh buffer untuk kata-kata yang salah eja, biasanya saya mengetik dan begitu saya melihat kata yang digarisbawahi saya ingin memperbaikinya secara instan dan terus mengetik. Ini hanya karena saya takut lupa untuk memperbaiki kata nanti dan karena ketika saya mulai memeriksa buffer secara menyeluruh, iSpell memberikan terlalu banyak false positive. Jadi, hampir selalu saya memperbaiki kata-kata sesegera mungkin saat saya mengetik.

Berikut ini adalah fungsi bawaan yang saya ketahui dan alasan mengapa mereka tidak efisien (bagi saya):

  • flyspell-correct-word- Ini terikat ke klik mouse. Lupakan saja, aku tidak akan menggunakan mouse.

  • flyspell-correct-word-before-point- Saya menggunakannya untuk beberapa waktu. Ini memiliki dua kelemahan:

    1. Secara default ini menunjukkan menu GUI yang sulit dioperasikan tanpa mouse dan itu benar-benar rumit ketika Anda memiliki daftar koreksi dengan lebih dari 10 item.

    2. Itu tidak bekerja untuk kata jauh sebelum poin. Saya mengetik cepat dan ketika saya menemukan kata yang salah eja, saya biasanya memiliki satu atau dua kata antara kata dan titik yang salah eja. Saya perlu pindah titik, kata yang benar, kembali. Oh

  • flyspell-auto-correct-word - Lihat poin 2 ↑ ditambah itu tidak berfungsi dengan baik ketika Anda memiliki daftar panjang penyelesaian (karena bersepeda).

T: Bagaimana saya bisa menggunakan Flyspell secara efisien, dengan keyboard, dapat memilih dari daftar penyelesaian tanpa bersepeda, dan dengan kemampuan untuk mengoreksi kata-kata yang bahkan lebih jauh?

Jawaban yang dapat diterima termasuk paket yang membantu menavigasi ke kata yang salah eja sebelumnya, memperbaikinya dan kembali atau sesuatu seperti itu serta potongan kecil, mungkin dari file konfigurasi Anda sendiri, karena saya percaya orang lain menemukan cara mereka untuk berinteraksi secara efisien dengan Flyspell.

Mark Karpov
sumber

Jawaban:

14

Inbuilt flyspell-auto-correct-previous-wordbekerja seperti pesona bagi saya. Saya telah mengikatnya F12dan saya belum melihat ke belakang. Ini memiliki kata-kata yang benar secara konsisten untuk saya, tidak peduli berapa banyak kata di belakang kata yang salah itu.

Dari dokumentasi fungsi:

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.

Selain itu, jika koreksi otomatis pertama kali tidak memberi Anda kata yang tepat, terus tekan tombol terikat Anda ( F12dalam kasus saya) untuk menggilir semua opsi.

[Konfigurasi periksa ejaan saya]

Kaushal Modi
sumber
1
Saya melihat Anda masih perlu melakukan siklus melalui semua koreksi yang mungkin. Cobalah ttwomisalnya, meskipun menu saya, saya melihat 26 usulan koreksi!
Mark Karpov
3
ttwokoreksi otomatis ke twodalam percobaan pertama. Tapi aku tahu maksudmu. Dari pengalaman praktis, dalam sekitar 90% kasus, percobaan pertama mendapatkan kata yang tepat, mungkin 9% sisanya membutuhkan 2-3 percobaan dan 1% terakhir adalah ketika flyspell tidak mengetahuinya dan saya harus pergi melalui 5+ percobaan (atau saya memperbaikinya secara manual).
Kaushal Modi
Saya melihat, metode Anda memiliki manfaatnya sendiri (kesederhanaan). Mungkin saya akan beralih ke itu semua.
Mark Karpov
2
Sangat bagus - inilah yang saya harapkan, dan saya lewatkan karena saya mengikat kunci default ke sesuatu yang lain. Ini terikat C-;secara default, dan Anda dapat menyesuaikan flyspell-auto-correct-bindinguntuk mengikatnya ke kunci lain di peta flyspell. (Atau ikat saja dengan cara biasa, tentu saja.)
glucas
6

Saya cukup yakin orang lain akan datang dengan solusi berbeda yang akan berguna bagi pembaca masa depan. Namun, inilah cara saya saat ini menangani ini.

Saya pikir flyspell-correct-word-before-pointini adalah tempat yang baik untuk memulai, karena paling tidak dapat dipanggil dengan penekanan tombol dan menampilkan menu koreksi yang mungkin. Untuk memperbaiki menu saya sudah menulis paket Ace Popup Menu yang menggunakan Avy sebagai backend. Ini menggantikan menu popup GUI yang flyspell-correct-word-before-pointmenggunakan (fungsi ini disebut x-popup-menu) dengan menu popup tekstual yang menyajikan item menu berlabel: satu atau dua stroke tombol dan Anda selesai.

Untuk mengatasi masalah kedua (ketidakmampuan untuk memperbaiki kata "di kejauhan"), saya telah menulis bantuan ini:

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

Ini sepertinya berhasil.

Mark Karpov
sumber
5

Dengan helm-flyspell Anda dapat memilih dari daftar koreksi secara efisien. Saya menggunakan kode berikut untuk melompat ke kesalahan dan memperbaikinya dengan itu, ini menyimpan posisi titik ke mark-ringsehingga Anda dapat melompat kembali ke posisi di mana Anda memulai atau memperbaiki kata-kata sebelumnya:

(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"))
clemera
sumber