ฟังก์ชั่นการเลือกคำ / สัญลักษณ์ถูกผูกไว้กับ <double-mouse-1> คืออะไร


11

ฉันชอบความสามารถในการเลือกคำ / สัญลักษณ์ที่จุดซึ่งฉันทำในขณะนี้ด้วยการคลิกเมาส์สองครั้ง ฉันต้องการที่จะสามารถทำได้จากแป้นพิมพ์และดังนั้นฉันต้องการที่จะผูกไว้กับการกดแป้นพิมพ์ (หรืออาจจะเป็นแล้ว?) ดังนั้นฉันต้องการชื่อของฟังก์ชั่น ฉันคิดว่าฟังก์ชั่นจะต้องมีอยู่แล้ว แต่ฉันไม่สามารถเข้าใจได้ว่ามันคือชื่ออะไร

ฉันลองC-h kแล้ว แต่เมื่อฉันดับเบิลคลิกเมาส์ความช่วยเหลือในการ<down-mouse-1>แสดง (ฉันคิดว่าระบบช่วยเหลือไม่รอการคลิกครั้งที่สองหรือบางอย่าง) ฉันยังค้นหาเอกสารที่ฟังก์ชั่นนี้ถูกกำหนดไว้ในส่วนที่ 21.2 แต่ไม่ได้พูดถึงชื่อของฟังก์ชั่น

อัปเดต: สำหรับการเชื่อมโยงคีย์ทั่วไปฉันคิดว่ามันเทียบเท่ากับที่<C-left>ตามมา<C-S-right>ซึ่งleft-wordและright-wordตามลำดับแม้ว่าจะมีการกดคีย์ Shift สำหรับช่วงหลัง (ฉันไม่เข้าใจความสัมพันธ์ระหว่างการกำหนดแป้นพิมพ์ด้วยปุ่ม Shift และการแมปไปยังฟังก์ชันความช่วยเหลือในการ<C-S-right>แปล<C-right>ก่อนที่จะระบุว่าเป็นright-word)


การใช้C-h bและการค้นหาผ่านบัฟเฟอร์นั้นแสดงว่าการ<double-mouse-1>โทรmouse-set-point(จาก "mouse.el") กับเหตุการณ์เฉพาะบางอย่าง ไม่แน่ใจว่าวิธีนี้จะช่วยให้มาก :)
VanLaser

1
สำหรับความสัมพันธ์ระหว่างการเลื่อนและรุ่นที่ไม่เลื่อนจาก C-right และ C-left มันเป็นผลของshift-selection-mode(ดู(info "(emacs) Shift Selection")) ดูเพิ่มเติมที่emacs.stackexchange.com/questions/12858/…
YoungFrog

@ YoungFrog ภาวะแทรกซ้อนประเภทนั้นคือสิ่งที่ทำให้การเขียนโปรแกรม emacs ส่วนใหญ่ของฉันเป็นมาโครคีย์บอร์ด มาโคร kbd อย่างง่ายที่ใช้ <right> <C-left> <C-S-right>วิธีการที่ฉันไม่ต้องการที่จะแก้ไขปัญหาที่ละเอียดอ่อนที่กล่าวถึงในลิงค์นั้น
Chip Grandits

คำตอบ:


9

จริงๆแล้วมันซับซ้อนเล็กน้อย เมื่อคุณดับเบิลคลิกmouse-1จะมีหลายการกระทำ <down-mouse-1>เกิดขึ้นก่อนเมื่อคุณกดปุ่ม จากนั้นmouse-1เกิดขึ้นเมื่อคุณปล่อยปุ่ม

<down-mouse-1>ถูกผูกไว้กับคำสั่งและคำสั่งว่าสายmouse-drag-region mouse-drag-trackฟังก์ชั่นนั้นนับการคลิกปุ่มเมาส์และติดตามการเคลื่อนไหวของเมาส์ (ถ้าคุณดับเบิลคลิกนั่นหมายความว่าคุณไม่ได้ขยับเมาส์)

mouse-drag-trackเรียกฟังก์ชั่นmouse-start-end เพื่อกำหนดช่วงของข้อความที่จะเลือก มันจะผ่านไปmouse-start-endยังตำแหน่งที่คุณคลิกสองรายการแรกและจำนวนคลิกเป็น ARG ที่สาม นี่คือmouse-start-end:

mouse-start-end is a compiled Lisp function in `mouse.el'.

(mouse-start-end START END MODE)

Return a list of region bounds based on START and END according to MODE.
If MODE is 0 then set point to (min START END), mark to (max START END).
If MODE is 1 then set point to start of word at (min START END),
mark to end of word at (max START END).
If MODE is 2 then do the same for lines.

การนับการคลิกผ่านไปเป็น arg ที่สาม ( MODE) คือ 1 สำหรับการดับเบิลคลิก

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


ขอขอบคุณที่อธิบายว่าทำไมจึง C-h kไม่ทำงานกับเหตุการณ์เมาส์ วิธีที่ดีที่สุดที่ฉันคิดออกเพื่อตรวจสอบวิธีที่ Emacs "จัดการกับเมาส์" คือการบันทึกเป็นแมโครแป้นพิมพ์ตั้งชื่อแล้วดูรหัสที่สร้างขึ้นโดยinsert-kbd-macro ทั่วไปฉันจะไม่พยายามใช้เหตุการณ์เมาส์ใน มาโครดังนั้นมาโครชั่วคราวเหล่านี้จะเป็นประโยชน์ในการดูว่า Emacs กำลังทำอะไร
Chip Grandits

6

@Drew ได้อธิบายถึงความซับซ้อนบางอย่างที่เกี่ยวข้องกับกิจกรรมที่ผูกไว้กับการกระทำของเมาส์ ในฐานะที่เป็นเป้าหมายสูงสุดของคุณของเครื่องหมายคำที่จุดใช้แป้นพิมพ์คุณอาจจะสนใจในการขยายภูมิภาค

expand-regionช่วยให้คุณสามารถจัดการพื้นที่ตามความหมายของหน่วย ตัวอย่างเช่นเมื่อไม่มีภูมิภาคแอ็คทีฟการโทรer/expand-region(โดยทั่วไปถูกผูกไว้กับC-=) จะทำเครื่องหมายคำปัจจุบัน การเรียกอีกครั้งจะขยายขอบเขตเป็นประโยคปัจจุบัน แล้วย่อหน้าส่วน ฯลฯ หน่วยที่แท้จริงจะขึ้นอยู่กับโหมดที่คุณเข้าดังนั้นในโหมดเสียงกระเพื่อมพวกเขาจะเป็นสัญลักษณ์นิพจน์ที่ล้อมรอบสัญลักษณ์นิพจน์ที่ล้อมรอบนิพจน์นั้นเป็นต้น

หน้าที่เชื่อมโยงมีคำอธิบายเพิ่มเติมและวิดีโอสาธิตสิ่งนี้


1
ใช่ฉันเห็นแพคเกจส่วนขยายในรายการแพคเกจจาก melpa มีประโยชน์มากฉันประหลาดใจที่ไม่ได้เป็นค่าเริ่มต้นใน Emacs หรืออย่างน้อยก็รวมอยู่ใน CEDET ขอบคุณสำหรับทิป!
Chip Grandits

Chip Grandits: ขึ้นอยู่กับผู้เขียนส่งแพคเกจของตนไปยัง FSF โดยมีการมอบหมายงานด้านลิขสิทธิ์ที่เหมาะสม มันไม่สามารถเป็นส่วนเริ่มต้นของ Emacs ได้หากผู้เขียนไม่ได้ส่ง
phils

2

นี่คือฟังก์ชั่นที่ฉันดึงมาจากmouse-set-regionการทำเครื่องหมายเมื่อคุณดับเบิลคลิก:

(defun ora-mark-like-double-mouse-1 ()
  (interactive)
  (let ((bnd (mouse-start-end (point) (point) 1)))
    (goto-char (car bnd))
    (push-mark)
    (set-mark (point))
    (goto-char (cadr bnd))))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.