Làm thế nào để sử dụng Flyspell để sửa từ hiệu quả trước đó?


18

Từ lúc tôi bắt đầu sử dụng Flyspell, việc sử dụng nó luôn gây đau đớn. Tôi hiếm khi kiểm tra toàn bộ bộ đệm cho các từ sai chính tả, thông thường tôi gõ và một khi tôi thấy từ được gạch chân, tôi muốn sửa nó ngay lập tức và tiếp tục gõ. Điều này đơn giản là vì tôi sợ quên sửa từ sau và vì khi tôi bắt đầu kiểm tra toàn diện bộ đệm, iSpell đưa ra quá nhiều thông tin sai. Vì vậy, hầu như tôi luôn sửa từ càng sớm càng tốt trong khi tôi gõ.

Đây là các chức năng tích hợp mà tôi biết và lý do tại sao chúng không hiệu quả (đối với tôi):

  • flyspell-correct-word- Điều này bị ràng buộc với nhấp chuột. Quên đi, tôi sẽ không sử dụng chuột.

  • flyspell-correct-word-before-point- Tôi đã sử dụng nó một thời gian. Nó có hai nhược điểm:

    1. Theo mặc định, nó hiển thị menu GUI khó hoạt động nếu không có chuột và nó thực sự cồng kềnh khi bạn có danh sách chỉnh sửa với hơn 10 mục.

    2. Nó không hoạt động cho từ lâu trước thời điểm. Tôi gõ nhanh và khi tôi phát hiện từ sai chính tả, tôi thường có một hoặc hai từ giữa từ sai chính tả và điểm. Tôi cần di chuyển điểm, sửa từ, quay trở lại. Oh.

  • flyspell-auto-correct-word - Xem điểm 2 ↑ cộng với nó không hoạt động tốt khi bạn có danh sách dài hoàn thành (vì đi xe đạp).

H: Làm cách nào tôi có thể sử dụng Flyspell một cách hiệu quả, với bàn phím, có thể chọn từ danh sách hoàn thành mà không cần đạp xe và có khả năng sửa các từ thậm chí xa hơn hoặc ít hơn?

Câu trả lời có thể chấp nhận bao gồm các gói giúp điều hướng đến từ sai chính tả trước đó, sửa nó và lấy lại hoặc một cái gì đó tương tự cũng như các đoạn nhỏ, có thể từ tệp cấu hình của riêng bạn, vì tôi tin rằng những người khác đã tìm ra cách tương tác hiệu quả với Flyspell.

Câu trả lời:


14

Các inbuilt flyspell-auto-correct-previous-wordhoạt động như một nét duyên dáng đối với tôi. Tôi đã ràng buộc nó F12và tôi đã không nhìn lại. Nó luôn có những từ chính xác cho tôi, không quan trọng có bao nhiêu từ trở lại từ không chính xác.

Từ tài liệu chức năng:

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.

Ngoài ra, nếu lần đầu tiên tự động sửa lỗi không cung cấp cho bạn từ đúng, hãy tiếp tục nhấn phím bị ràng buộc ( F12trong trường hợp của tôi) để duyệt qua tất cả các tùy chọn.

[Cấu hình kiểm tra chính tả của tôi]


1
Tôi thấy bạn vẫn cần phải xoay vòng mặc dù tất cả các điều chỉnh có thể. Hãy thử nó trên ttwoví dụ, mặc dù menu của tôi tôi thấy 26 đề xuất sửa chữa!
Mark Karpov

3
ttwotự động sửa thành twotrong lần thử đầu tiên. Nhưng tôi biết ý của bạn là gì. Từ kinh nghiệm thực tế, trong khoảng 90% các trường hợp, lần thử đầu tiên nhận được từ đúng, có thể 9% còn lại cần 2-3 lần thử và 1% cuối cùng là khi flyspell không phát hiện ra và tôi cần phải đi qua 5+ lần thử (hoặc tôi tự sửa nó).
Kaushal Modi

Tôi thấy, phương pháp của bạn có lợi ích riêng của nó (đơn giản). Có lẽ tôi sẽ chuyển sang nó sau tất cả.
Mark Karpov

2
Rất đẹp - đây là những gì tôi mong đợi để tìm và đã bỏ lỡ nó vì tôi đã ràng buộc khóa mặc định với thứ khác. Điều này được ràng buộc C-;theo mặc định và bạn có thể tùy chỉnh flyspell-auto-correct-bindingđể liên kết nó với một khóa khác trong bản đồ flyspell. (Hoặc chỉ ràng buộc nó theo cách thông thường, tất nhiên.)
glucas

6

Tôi khá chắc chắn rằng những người khác sẽ đưa ra các giải pháp khác nhau sẽ hữu ích cho những độc giả tương lai. Tuy nhiên, đây là cách tôi hiện đang xử lý này.

Tôi nghĩ flyspell-correct-word-before-pointlà một nơi tốt để bắt đầu, bởi vì ít nhất nó có thể được gọi bằng cách bấm phím và nó hiển thị menu các chỉnh sửa có thể. Để sửa menu Tôi đã viết gói Ace Popup Menu sử dụng Avy làm phụ trợ. Điều này thay thế menu bật lên GUI flyspell-correct-word-before-pointsử dụng (chức năng được gọi x-popup-menu) bằng menu bật lên văn bản trình bày các mục menu có nhãn: một hoặc hai nét chính và bạn đã hoàn tất.

Để giải quyết vấn đề thứ hai (không có khả năng sửa từ ngữ ở khoảng cách xa) Tôi đã viết trợ giúp này:

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

Điều này dường như làm việc.


5

Với helm-flyspell, bạn có thể chọn từ danh sách các hiệu chỉnh. Tôi sử dụng đoạn mã sau để chuyển đến các lỗi và sửa chúng với nó, nó lưu vị trí của điểm vào mark-ringđể bạn có thể nhảy trở lại vị trí bạn đã bắt đầu hoặc sửa các từ trước đó:

(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"))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.