วิธีใช้ Flyspell เพื่อแก้ไขคำก่อนหน้าอย่างมีประสิทธิภาพ?


18

จากช่วงเวลาที่ฉันเริ่มใช้ Flyspell มันเจ็บปวดเสมอที่จะใช้ ฉันไม่ค่อยตรวจสอบบัฟเฟอร์ทั้งหมดสำหรับคำที่สะกดผิดฉันมักจะพิมพ์และเมื่อฉันเห็นคำที่ขีดเส้นใต้ฉันต้องการแก้ไขทันทีและพิมพ์ต่อไป นี่เป็นเพียงเพราะฉันกลัวที่จะลืมแก้ไขคำในภายหลังและเนื่องจากเมื่อฉันเริ่มการตรวจสอบที่ครอบคลุมของบัฟเฟอร์ iSpell ให้ผลบวกเท็จมากเกินไป ดังนั้นฉันมักจะแก้ไขคำให้เร็วที่สุดเท่าที่จะทำได้ในขณะที่พิมพ์

นี่คือฟังก์ชั่นในตัวที่ฉันรู้และเหตุผลว่าทำไมมันไม่มีประสิทธิภาพ (สำหรับฉัน):

  • flyspell-correct-word- สิ่งนี้ผูกพันกับการคลิกเมาส์ ลืมฉันจะไม่ใช้เม้าส์

  • flyspell-correct-word-before-point- ฉันใช้มันบางครั้ง มันมีสองข้อเสีย:

    1. ตามค่าเริ่มต้นจะแสดงเมนู GUI ที่ใช้งานได้ยากโดยไม่ต้องใช้เมาส์และจะยุ่งยากมากเมื่อคุณมีรายการแก้ไขที่มีมากกว่า 10 รายการ

    2. มันใช้งานไม่ได้นานก่อนที่จะถึงจุด ฉันพิมพ์เร็วและเมื่อฉันเห็นคำที่สะกดผิดฉันมักจะมีหนึ่งหรือสองคำระหว่างคำที่สะกดผิดกับจุด ฉันต้องการที่จะย้ายจุดคำที่ถูกต้องกลับมา โอ้

  • flyspell-auto-correct-word - ดูจุดที่ 2 ↑บวกมันใช้งานไม่ได้เมื่อคุณมีรายการความสำเร็จที่ยาวนาน (เนื่องจากการปั่นจักรยาน)

ถาม:ฉันจะใช้ 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 ข้อเสนอ!
Mark Karpov

3
ttwoแก้ไขโดยอัตโนมัติtwoเป็นครั้งแรก แต่ฉันรู้ว่าคุณหมายถึงอะไร จากประสบการณ์ภาคปฏิบัติใน 90% ของคดีความพยายามครั้งแรกได้คำที่ถูกต้องอาจเป็น 9% ที่เหลือต้องใช้ความพยายาม 2-3 ครั้งและ 1% สุดท้ายคือเมื่อ flyspell ไม่เข้าใจและฉันจำเป็นต้องไป ถึง 5+ ครั้ง (หรือฉันแก้ไขด้วยตนเอง)
Kaushal Modi

ฉันเห็นแล้วว่าวิธีการของคุณมีประโยชน์ของตัวเอง (เรียบง่าย) บางทีฉันอาจเปลี่ยนไปใช้มันก็ได้
Mark Karpov

2
ดีมาก - นี่คือสิ่งที่ฉันคาดว่าจะพบและพลาดไปเพราะฉันผูกพันคีย์เริ่มต้นกับสิ่งอื่น สิ่งนี้จะถูกผูกไว้C-;ตามค่าเริ่มต้นและคุณสามารถปรับแต่งflyspell-auto-correct-bindingเพื่อผูกกับคีย์อื่นในแผนที่ flyspell (หรือผูกให้เป็นวิธีปกติแน่นอน)
ลูกัส

6

ฉันค่อนข้างมั่นใจว่าคนอื่นจะคิดวิธีแก้ปัญหาต่าง ๆ ที่จะเป็นประโยชน์สำหรับผู้อ่านในอนาคต อย่างไรก็ตามนี่คือวิธีที่ฉันจัดการกับสิ่งนี้ในปัจจุบัน

ฉันคิดว่าflyspell-correct-word-before-pointเป็นจุดเริ่มต้นที่ดีเพราะอย่างน้อยสามารถเรียกใช้โดยการกดปุ่มและแสดงเมนูของการแก้ไขที่เป็นไปได้ เพื่อแก้ไขเมนูที่ฉันเขียน เมนู Ace Popup Menuที่ใช้ Avyเป็น backend สิ่งนี้แทนที่เมนูป๊อปอัป GUI ที่flyspell-correct-word-before-pointใช้ (เรียกใช้ฟังก์ชัน x-popup-menu) ด้วยเมนูป๊อปอัพแบบข้อความที่แสดงรายการเมนูที่มีป้ายกำกับ: การกดปุ่มหนึ่งหรือสองครั้งและคุณทำเสร็จแล้ว

ในการแก้ปัญหาที่สอง (ไม่สามารถแก้ไขคำว่า "ที่ระยะทาง") ฉันได้เขียนผู้ช่วยนี้:

(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

ด้วยhelm-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.