แก้ไข DOuble CApitals ขณะที่ฉันพิมพ์


23

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

THere's nothing in there. DEfinitely not a body.

โดยปกติแล้วสิ่งที่ฉันทำคือตีM-b M-c(สมมติว่าฉันพบมันทันที) แต่ฉันรู้สึกเบื่อเล็กน้อย

ฉันจะให้ Emacs แก้ไขปัญหานี้ให้ฉันโดยอัตโนมัติได้อย่างไร

นั่นคือฉันต้องการให้ Emac ตรวจจับเมื่อฉันพิมพ์คำที่ขึ้นต้นด้วยตัวอักษรตัวพิมพ์ใหญ่สองตัวตามด้วยตัวอักษรตัวพิมพ์เล็กอย่างน้อยหนึ่งตัวและแก้ไขโดยอัตโนมัติ

คำตอบ:


19

นี่คือฟังก์ชั่นที่จะแปลง DOuble CApitals เป็น Single Capitals ฉันแนะนำให้เพิ่มลงไปpost-self-insert-hookแต่ด้านล่างเป็นตัวเลือกสำหรับโหมดรองที่ได้รับการยกย่องเพื่อให้คุณเพิ่มลงใน hook นั้นเมื่อคุณต้องการจริงๆ:

(defun dcaps-to-scaps ()
  "Convert word in DOuble CApitals to Single Capitals."
  (interactive)
  (and (= ?w (char-syntax (char-before)))
       (save-excursion
         (and (if (called-interactively-p)
                  (skip-syntax-backward "w")
                (= -3 (skip-syntax-backward "w")))
              (let (case-fold-search)
                (looking-at "\\b[[:upper:]]\\{2\\}[[:lower:]]"))
              (capitalize-word 1)))))

(add-hook 'post-self-insert-hook #'dcaps-to-scaps nil 'local)

และคำจำกัดความของโหมดรอง:

(define-minor-mode dubcaps-mode
  "Toggle `dubcaps-mode'.  Converts words in DOuble CApitals to
Single Capitals as you type."
  :init-value nil
  :lighter (" DC")
  (if dubcaps-mode
      (add-hook 'post-self-insert-hook #'dcaps-to-scaps nil 'local)
    (remove-hook 'post-self-insert-hook #'dcaps-to-scaps 'local)))

สำหรับสิ่งที่มีค่าใช้เวอร์ชันนี้:

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

แม้ว่าคุณจะเพิ่มลงpost-self-insert-hookในค่าใช้จ่ายที่เกือบจะไม่มีอยู่อย่างน้อยตามมาตรฐานการเปรียบเทียบง่าย ๆ บนเครื่องของฉันนี่คือสิ่งที่ฉันได้รับจากการทำซ้ำ 10,000 รายการแต่ละรูปแบบเรียบง่ายอย่างน่าหัวเราะและdcaps-to-scapsฟังก์ชั่น:

(benchmark-run-compiled 10000 (+ 1 1))          ; => .001 to .003 -ish
(benchmark-run-compiled 10000 (dcaps-to-scaps)) ; => .003 to .006 -ish

ดังนั้นใช่มันช้ากว่าการเพิ่ม 1 + 1 แต่ในแง่สมบูรณ์คุณจะไม่สังเกตเห็น


คุณสามารถใช้looking-at-pซึ่งไม่ได้ตั้งค่าข้อมูลการแข่งขันเลย (ไม่เป็นไรเพราะคุณไม่ต้องการหรือใช้ที่นี่)
YoungFrog

จะดูข้อสังเกตอีกไม่กี่ส่วนใหญ่ไม่สำคัญ ( แต่ฉันชอบคำตอบของคุณดังนั้นฉันต้องการจะมีส่วนร่วม; P): การใช้forward-wordจะไม่สามารถทำงานได้ดีกับsubword-modeการใช้(char-syntax (char-before))จะ (ฉันเดา) ไม่สนใจใด ๆ ชุดชั้นไวยากรณ์ที่มีคุณสมบัติ (สารละลายอื่น: (syntax-after (1- (point))) และ (สุดท้าย แต่ไม่ท้ายสุด) regexp จะไม่พบตัวอักษรที่เน้นเสียง (เช่น "ÉMincer" เป็นภาษาฝรั่งเศส)
YoungFrog

@ YoungFrog: อัปเดตเพื่อจัดการกับforward-wordปัญหาและเปลี่ยน regexp เพื่อจัดการกับตัวพิมพ์ใหญ่ที่เน้นเสียง
แดน

มีเหตุผลที่จะชอบandมากกว่าwhenโดยเฉพาะในกรณีแรกหรือไม่
Clément

@ Clément: andลัดวงจรดังนั้นตรรกะทำงานเช่นwhenนี้ ฉันไม่แน่ใจว่ามีวิธีปฏิบัติที่ดีที่สุดเกี่ยวกับการใช้งานแบบหนึ่งกับแบบอื่นหรือไม่ แต่ดูเหมือนว่ามันจะเป็นคำถามที่ดีในเว็บไซต์นี้ (ฉันต้องการโหวตแล้ว)
Dan

8

ตั้งค่าของฉันก็คือการสร้างฟังก์ชั่นใหม่ที่ไม่สิ่งที่ปกติself-insert-commandจะทำบวกมากขึ้น

นี่คือเหตุผลบางประการ:

  • การควบคุมที่ดีขึ้นซึ่งโหมดหลักควรมีความสามารถในการแก้ไขอัตโนมัตินี้ สำหรับกรณีการใช้งานนี้มันอาจจะเป็นโหมดข้อความเท่านั้นชอบorg-mode, text-modeฯลฯ
  • สำหรับประเภทของการแก้ไขที่ร้องขอในคำถามโดยทั่วไปผู้ใช้จะกดปุ่มSPCหรือRETหรือ.ตามหลังคำ ดังนั้นการใช้บางอย่างเช่นpost-self-insert-hookอาจเป็นการ overkill และเราจะทำการประมวลผลพิเศษทุกครั้งที่เรากดปุ่มใด ๆ

ดังนั้นวิธีการแก้ปัญหาที่เสนอด้านล่างนี้ผูกฟังก์ชั่นนี้ด้วยเพียงแค่SPCคีย์org-mode-map(ละเว้นกรณีมุมที่คำที่อาจเป็นคำสุดท้ายในบรรทัด) หากจำเป็นผู้ใช้สามารถผูกฟังก์ชั่น wrapper คล้ายกับปุ่มเพิ่มเติม

(defun space-plus-more ()
  (interactive)
  (save-excursion
    (backward-word 1)
    (let ((case-fold-search))
      (when (looking-at-p "[A-Z]\\{2\\}.*?[a-z]+.*?\\b")
        (capitalize-word 1))))
  (self-insert-command 1))

(define-key org-mode-map (kbd "<SPC>") #'space-plus-more)

นี่เป็นแบบฝึกหัดที่น่าสนใจ :)

โดยส่วนตัวฉันไม่ต้องการที่จะผูกมันไว้RETเพราะฉันจะสูญเสียการเชื่อมต่อที่เป็นค่าเริ่มต้นorg-modeและอาจเป็นโหมดหลักอื่น ๆ ด้วย แต่มันก็น่าสนใจที่จะเรียนรู้เกี่ยวกับและeltthis-command-keys-vector

(defun my/fix-double-caps ()
  (interactive)
  (save-excursion
    (backward-word 1)
    (let ((case-fold-search))
      (when (looking-at-p "[A-Z]\\{2\\}.*?[a-z]+.*?\\b")
        (capitalize-word 1))))
  (if (eq 13 (elt (this-command-keys-vector) 0)) ; detect RET
      (newline)
    (self-insert-command 1)))

(let ((maps-list (list org-mode-map
                       text-mode-map))
      (keys-list (list "<SPC>" "<RET>" ".")))
  (dolist (map maps-list)
    (dolist (key keys-list)
      (define-key map (kbd key) #'my/fix-double-caps))))

โอ้ใช่การ จำกัด ให้เป็นโหมดที่ได้รับข้อความเป็นความคิดที่ดี :)
Malabarba

@Malabarba คุณไม่ต้องการพฤติกรรมนี้ในสตริงสำหรับโหมดที่ได้รับจากโหมด prog หรือไม่
YoungFrog

@ YoungFrog แน่นอน แต่มันจะต้องตรวจสอบว่ามันอยู่ในสายอักขระมิฉะนั้นจะเข้าทาง
Malabarba

0

บางทีคำตอบนี้อาจไม่มีวิธีแก้ปัญหาที่คุณคาดหวัง (การแก้ไขคำแบบโต้ตอบขณะที่คุณพิมพ์) ฉันต้องการแบ่งปันวิธีของฉันในการต่อสู้กับปัญหาดังกล่าว

ก่อนอื่นฉันไม่ชอบสิ่งที่เปลี่ยนข้อความของฉันอย่างเงียบ ๆ (พิมพ์ใหญ่ ฯลฯ ถ้าคุณต้องการพิมพ์คำIBufferฉันคิดว่า "นักแก้ไข" เป็นวิธีที่ผิด) ดังนั้นฉันจึงแนะนำสองสิ่ง:

ก่อนอื่นให้ลองเปิดใช้งานฟีเจอร์ "Sticky Keys" มันอาจดูแปลกในตอนแรก แต่ฉันใช้มันตลอดเวลา ฟีเจอร์นี้มีให้ใน OS / เดสก์ท็อปในระดับสิ่งแวดล้อมไม่ใช่ของ Emacs เมื่อสิ่งนี้ถูกเปิดใช้งานคุณกดครั้งแรก ⇧ Shiftและจากนั้นคุณกดแป้นอื่นที่คุณต้องการใช้ประโยชน์ วิธีนี้ทำให้ปัญหาของคุณไม่สามารถเกิดขึ้นได้มีเพียงตัวอักษรตัวเดียวที่เป็นตัวพิมพ์ใหญ่ในวิธีการเรียงตามลำดับนี้! นอกจากนี้ยังช่วยลดการทำงานของมือของคุณจำเป็นต้องถือ⇧ Shiftกุญแจ ฉันคิดว่าตอนนี้พิมพ์ง่ายขึ้น

ประการที่สองตอนนี้คุณยังสามารถใช้⇧ Shiftคีย์ตามปกติ (ถือมัน) เมื่อคุณคิดว่ามันเป็นสิ่งจำเป็น แต่ผมอยากจะเสนอให้คุณแพคเกจ Emacs เรียกว่าการแก้ไขปัญหาของ Word แม้ว่าคุณจะไม่ชอบ "Sticky Keys" คุณสามารถแก้ไขคำในรูปแบบที่เหมาะสมได้อย่างง่ายดายและคุณสามารถแก้ไขคำต่าง ๆ ในแถวโดยไม่ต้องใช้เคอร์เซอร์ ลองดูสิฉันใช้มันตลอดเวลา (มันยังคงยากที่จะแก้ไขสิ่งต่าง ๆ หากคุณป้อนหลายคำและคำที่คุณต้องใช้ให้เป็นประโยชน์อยู่ตรงกลาง)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.