ไม่ชอบที่กด ⌘C ซ้ำสองครั้งไม่ได้ เลยทำคลิปบอร์ด macOS ให้มี 3 ช่อง - DualClip
(github.com/RAKKUNN)สวัสดีครับ! ผมขอมาเปิดตัวโปรเจกต์เล็ก ๆ ชื่อ DualClip ที่ทำขึ้นตอนเริ่มใช้ macOS เป็นครั้งแรกครับ
นี่เป็นครั้งแรกที่ผมเขียนโพสต์แบบนี้ เลยแอบตื่นเต้นนิดหน่อยนะครับ ถ้าประโยคยังไม่ลื่นไหลก็ขอความกรุณาด้วย 🙇
มันคืออะไร
มันเป็นแอปเล็ก ๆ บนเมนูบาร์ ที่ให้คลิปบอร์ดมา 3 "ช่อง"
Slot A → คลิปบอร์ดปกติเดิม (⌘C / ⌘V)
Slot B → ⌥⌘C / ⌥⌘V
Slot C → ⌃⌘C / ⌃⌘V
มันไม่ใช่แบบ "ประวัติ" อย่าง Paste หรือ Maccy แต่เป็นแบบ "ช่อง" ครับ
คุณสามารถปักอีเมลที่ใช้บ่อยหรือชื่อตัวแปรไว้ใน B แล้วใช้การคัดลอก/วางปกติด้วย ⌘C/⌘V ตามเดิมได้เลย
ทำไมถึงสร้างมันขึ้นมา
เวลารีแฟกเตอร์หรือทำงานแปล แค่กด ⌘C เพิ่มอีกครั้ง สิ่งที่คัดลอกไว้ก่อนหน้าก็หายไปเลยใช่ไหมครับ
พอสะสมตลอดทั้งวัน มันกลายเป็นความเครียดเล็ก ๆ แบบไม่รู้ตัว
ผมก็เคยลองใช้แอปแบบประวัติเหมือนกัน แต่สำหรับผมยังมีจุดที่เสียดายแบบนี้ครับ
- ต้องเปิดป๊อปอัปแล้วเลือก ทำให้ช้าลงไปอีกจังหวะ
- ถ้าจะหา "อันก่อนหน้านั้น ไม่ใช่อันเมื่อกี้" สุดท้ายก็ต้องใช้ตาดูอยู่ดี
- สำหรับผม แค่อยากให้กด ⌥⌘V แล้ววางสิ่งนั้นได้ทันทีเลย
เพราะงั้น แทนที่จะใส่ฟีเจอร์เพิ่มเต็มไปหมด ผมเลยเหลือไว้แค่คอนเซปต์สั้น ๆ ว่า "ปักไว้ในช่อง แล้วเรียกออกมาด้วยคีย์ลัด"
ส่วนที่สนุกที่สุดตอนทำ (Atomic Paste)
เรื่องนี้ยุ่งกว่าที่คิดครับ เพราะบน macOS นั้น ⌘V จะอ่านจาก system pasteboard เท่านั้น
ดังนั้นถ้าจะวาง Slot B ก็ต้องเขียนทับ system clipboard ชั่วคราว แต่พอทำแบบนั้น สิ่งที่เคย ⌘C ไว้เดิมก็จะหายไป
ผมคิดอยู่นานมากว่าจะแก้ยังไงดี
สุดท้ายเลยทำให้มันทำงานตามลำดับนี้ครับ
- สำรอง system clipboard ปัจจุบันไว้ก่อน (deep copy ทุก type)
- เขียนทับด้วยเนื้อหาของ Slot B
- จำลอง ⌘V ด้วย CGEvent
- หลังจาก 150ms ก็กู้คืนต้นฉบับที่สำรองไว้กลับมา
วงจรทั้งหมดนี้จบภายใน 150ms ทำให้คนใช้แทบไม่รู้สึกเลยว่า "ของที่เคย ⌘C ไว้หายไปชั่วคราว"
ผมเลยเรียกมันเองว่า "Atomic Paste" ...(ตั้งชื่อเองแล้วก็แอบภูมิใจอยู่คนเดียว 😅)
ส่วนที่ใช้เวลานานจริง ๆ คือการจับจังหวะให้หยุด polling ชั่วคราว และทำให้ ignore changeCount
มีช่วงหนึ่งที่งงอยู่นานว่า "ทำไม Slot A ถึงกลายเป็นเนื้อหาของ Slot B ล่ะ...?"
รายละเอียดจุกจิกอื่น ๆ:
- รองรับทั้งข้อความ/รูปภาพ/ไฟล์/RTF ทั้งหมด (deep copy ของ NSPasteboardItem)
- จะไม่ทำงานเลยในช่องกรอกรหัสผ่าน (เช็ก IsSecureEventInputEnabled)
- ตอนปิดแอปจะ zero-fill หน่วยความจำของสล็อต (memset_s)
- เปลี่ยนคีย์ลัดได้ทั้งหมด (ขอบคุณ sindresorhus/KeyboardShortcuts)
เรื่องความเป็นส่วนตัว
เพราะแอปคลิปบอร์ดต้องจัดการข้อมูลที่อ่อนไหว ผมเลยใส่ใจส่วนนี้เป็นพิเศษครับ
- ไม่เขียนอะไรลงดิสก์เลย ทุกอย่างอยู่ใน RAM เท่านั้น
- ไม่มีโค้ดเครือข่ายเลย ไม่มีทั้งการเช็กอัปเดตและ telemetry
- เป็นโอเพนซอร์สภายใต้ MIT จะเปิดดูโค้ดเองก็ได้ครับ
ถ้าอยากลองใช้
ถ้าใช้ Homebrew น่าจะสะดวกที่สุดครับ
brew install RAKKUNN/tap/dualclip
หรือจะดาวน์โหลด zip จาก GitHub Releases แล้วเอาไปไว้ใน /Applications ก็ได้ครับ
ตัวบิลด์ผ่าน Apple notarization แล้ว ดังนั้นตอนเปิดครั้งแรกจะไม่มีหน้าต่างแจ้งเตือนขึ้นมา
GitHub: https://github.com/RAKKUNN/DualClip
ข้อกำหนด: macOS 13+ (Apple Silicon), สิทธิ์การช่วยการเข้าถึง
นี่เป็นแอป macOS ตัวแรกที่ผมทำ ดังนั้นน่าจะยังมีหลายจุดที่ไม่สมบูรณ์แน่นอนครับ
ถ้ามีฟีดแบ็กอย่าง "แบบนี้น่าจะดีกว่า" หรือ "ตรงนี้เกิดข้อผิดพลาด" ผมจะขอบคุณมากและยินดีเรียนรู้จริง ๆ ครับ
ฝากคอมเมนต์กันได้สบาย ๆ เลย!
ขอให้ทุกคนมีวันที่ดีนะครับ!!
4 ความคิดเห็น
โปรแกรมจัดการคลิปบอร์ดสำหรับ Windows อย่าง ditto ก็ทำงานคล้ายกับที่คุณทำไว้เช่นกัน
คิดว่าน่าจะลองอ้างอิงดูได้นะครับ เผื่อจะช่วยจับทิศทางในการปรับปรุงได้~
ขอบคุณสำหรับข้อมูลครับ!🙇🙇
เดี๋ยวจะลองดูสักหน่อย แล้วจะพิจารณาคัดเลือกบางส่วนมาใช้ครับ!
น่าจะดีถ้ามีฟังก์ชันบันทึกเหมือน Clipy ด้วย
คุณต้องการฟีเจอร์ประวัติหรือสไนเป็ตกันใช่ไหม?
แต่ฟีเจอร์ประวัติไม่สอดคล้องกับทิศทางของ DualClip
ผมกำลังพยายามทำให้มันเบาที่สุดและใช้งานสะดวกที่สุด
ขอบคุณสำหรับฟีดแบ็กครับ