3 คะแนน โดย woojinim64 2026-04-22 | 4 ความคิดเห็น | แชร์ทาง WhatsApp

สวัสดีครับ! ผมขอมาเปิดตัวโปรเจกต์เล็ก ๆ ชื่อ 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 ไว้เดิมก็จะหายไป
ผมคิดอยู่นานมากว่าจะแก้ยังไงดี
สุดท้ายเลยทำให้มันทำงานตามลำดับนี้ครับ

  1. สำรอง system clipboard ปัจจุบันไว้ก่อน (deep copy ทุก type)
  2. เขียนทับด้วยเนื้อหาของ Slot B
  3. จำลอง ⌘V ด้วย CGEvent
  4. หลังจาก 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 ความคิดเห็น

 
vwjdalsgkv 2026-04-23

โปรแกรมจัดการคลิปบอร์ดสำหรับ Windows อย่าง ditto ก็ทำงานคล้ายกับที่คุณทำไว้เช่นกัน
คิดว่าน่าจะลองอ้างอิงดูได้นะครับ เผื่อจะช่วยจับทิศทางในการปรับปรุงได้~

 
woojinim64 2026-04-23

ขอบคุณสำหรับข้อมูลครับ!🙇🙇
เดี๋ยวจะลองดูสักหน่อย แล้วจะพิจารณาคัดเลือกบางส่วนมาใช้ครับ!

 
greekr4 2026-04-23

น่าจะดีถ้ามีฟังก์ชันบันทึกเหมือน Clipy ด้วย

 
woojinim64 2026-04-23

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