เป็นไปได้หรือไม่ที่จะสะกดคำว่า "บนอวกาศ" โดยอัตโนมัติ?


10

ฉันกำลังจะโพสต์คำถาม แต่จากนั้นฉันเห็นมันใน Stack Overflowขณะที่ค้นหาความเป็นไปได้ที่ถูกต้องโดยอัตโนมัติ คำถามที่เชื่อมโยงไม่มีคำตอบดังนั้นฉันคิดว่ามันจะมีโชคมากขึ้นในเว็บไซต์นี้ นี่คือข้อความ:

ฉันหวังว่าจะมีวิธีหนึ่งดังนั้นเมื่อฉันพิมพ์คำผิด flyspell สามารถแก้ไขโดยอัตโนมัติเพื่อแก้ไข "น่าจะ" เมื่อฉันพิมพ์คำผิดแล้วกด OPTION-TAB เพื่อแก้ไขคำนั้น flyspell ALMOST ALM ALS จะเลือกการแก้ไขที่ถูกต้องตามค่าเริ่มต้นเป็นคำแนะนำหลัก

อย่างไรก็ตามฉันต้องการให้ flyspell ทำสิ่งนี้กับทุกคำที่ฉันพิมพ์ผิดโดยไม่ต้องกด OPTION-TAB เพียงแค่กดปุ่ม SPACE bar และเลื่อนไปยังคำถัดไป

เป็นไปได้ไหม

ดังนั้นโดยทั่วไปบางสิ่งบางอย่างเช่นการแก้ไขอัตโนมัติบนโทรศัพท์มือถือ คุณสมบัติดังกล่าวจะมีประโยชน์สำหรับโหมดเช่นjabberและcaptureในorg-mode


แก้ไข :

ฉันอยากให้คุณสมบัตินี้เป็นโหมดรองแยกต่างหากแทนที่จะเขียนทับฟังก์ชั่นการสะกดคำที่เป็นค่าเริ่มต้น มันสามารถเปิดใช้งานนอกเหนือจากหรือแทนการสะกดทันทีเมื่อจำเป็น


1
ฉันแน่ใจว่าเป็นไปได้ (และอาจไม่ยากที่จะแฮ็ก) แต่ฉันรู้สึกว่าจำเป็นต้องพูดว่า IMHO ซึ่งเป็นความคิดที่ไม่ดี
mbork

1
@mbork มันจะเป็นความคิดที่ดีที่จะเปลี่ยนวิธีการทำงานของ fly-spell แต่เกิดอะไรขึ้นกับการมีโหมดรองเพิ่มเติมที่สามารถเปิด / ปิดใช้งานได้ตามความต้องการ
Tymric

ฉันหงุดหงิดอยู่ตลอดเวลาด้วยคุณสมบัติที่คล้ายกันในโทรศัพท์ของฉัน ฉันไม่ชอบเครื่องที่แสร้งทำเป็นว่าฉลาดกว่าฉันโดยเฉพาะอย่างยิ่งที่ไม่ได้ ;-): คำศัพท์มี จำกัด มากโดยเฉพาะอย่างยิ่งบางครั้งฉันต้องการพิมพ์คำที่ไม่ใช่คำ (เช่นคำนามที่เหมาะสม)
mbork

@mbork True แต่ก็มีข้อดีเช่นไม่ต้องกังวลกับการพิมพ์ทุก'อย่าง ฉันใช้แป้นพิมพ์ภาษาเยอรมันและ
พิ้งกี้

1
@mbork เพื่อแก้ปัญหา "non_words" เราอาจจะผูกS-SPCกับ "ทิ้งคำนั้นไว้คนเดียว" ได้ไหม?
Tymric

คำตอบ:


6

ผมขอนำคุณไปยังโพสต์ของฉันเกี่ยวกับเรื่องนี้


ฉันพบว่าตัวย่อเป็นวิธีที่ดีที่สุดในการแก้ไขSPCคุณจำเป็นต้องกำหนดการแก้ไขที่คุณต้องการเท่านั้น เพื่อที่ฉันจะใช้วิธีการดังต่อไปนี้:

  1. เพิ่มรหัสด้านล่างลงในไฟล์ init ของคุณ
  2. เมื่อใดก็ตามที่คุณพิมพ์ผิดพลาดให้กดC-x C-iและเลือกหนึ่งในการแก้ไขที่เสนอ
  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 เลือกการแก้ไขสำหรับคุณ ทุกครั้งที่ไม่มีคำศัพท์) จะทำให้คุณแก้ไขผิดบ่อยกว่าไม่ได้ ดังนั้นจึงเป็นการดีที่สุดที่จะกำหนดของคุณเองต่อไป มันยังช่วยแก้ปัญหาเมื่อคุณต้องการพิมพ์คำที่ไม่ใช่


ฉันพยายามเพิ่มการทดแทนสำหรับdontการdon'tใช้C-x C-i 1แต่มันเพิ่มตัวอักษรtแทน ( "dont" now expands to "t" globally) ฉันไม่คิดว่ามันจะจัดการกับอะพอสโทรฟีได้ดี มีวิธีแก้ไขไหม?
Tymric

@ Timmy นั่นคือในโหมดการเขียนโปรแกรมหรือไม่? ในโหมดข้อความที่ไม่ได้เกิดขึ้นกับฉัน
Malabarba

ฉันลองในบทสนทนาที่พูดพล่อยๆ แต่หลังจากความคิดเห็นของคุณฉันได้ทดสอบในโหมดข้อความและมันทำงานได้ทั่วโลก ขอขอบคุณ
Tymric

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)

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


6
ฉันควรปล่อยให้แป้นเว้นวรรคอยู่คนเดียวและแทนที่จะใช้post-self-insert-hookเพื่อติดตามการแทรกช่องว่างและดำเนินการตามนั้น ปลอดภัยและมีประสิทธิภาพมากขึ้น
Lunaryorn

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.