5 คะแนน โดย GN⁺ 2023-08-23 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • แม้ AutoHotKey จะเป็นเครื่องมืออัตโนมัติบน Windows ที่ทรงพลัง แต่ก็เริ่มใช้งานยากสำหรับมือใหม่ จึงเปิดเผย ชุดสคริปต์ส่วนตัว ที่ใช้งานจริงเป็นสื่อการเรียนรู้
  • ชุดนี้ประกอบด้วยไฟล์ทั้งหมด 14 ไฟล์ โดยเน้นตัวอย่างงานอัตโนมัติที่นำไปลองใช้ได้ทันที เช่น เปิดโฟลเดอร์ แทรกข้อความ และเพิ่มคีย์ลัดให้แต่ละโปรแกรม
  • มีตั้งแต่การพิมพ์วันที่ปัจจุบัน, em dash, ¯\_(ツ)_/¯ อย่างรวดเร็ว ไปจนถึง ระบบคีย์ลัดแบบ modal สำหรับผู้ใช้ vim และเดโม GUI แบบง่าย
  • ยังมีสคริปต์สำหรับแปลง timestamp เป็น UTC และเวลาท้องถิ่น ให้เห็นการทำงานอัตโนมัติของ workflow ที่ใช้งานได้จริงมากกว่าการตั้งคีย์ลัดอย่างเดียว
  • แต่ละไฟล์มีคอมเมนต์อธิบายว่าโค้ดทำอะไร และบางส่วนยังอธิบายว่าทำไมจึงเลือกเขียนแบบนั้น ทำให้อ่านเป็น codebase เพื่อการเรียนรู้ ได้ดี

ชุดตัวอย่าง AutoHotKey ที่ใกล้เคียงงานจริง

วิธีอ่านในฐานะ codebase เพื่อการเรียนรู้

  • repository นี้เป็นตัวอย่างของ codebase เพื่อการเรียนรู้ ที่สร้างขึ้นเพื่อให้ผู้อื่นเรียนรู้ผ่านการอ่านโค้ด
  • แต่ละไฟล์มีคอมเมนต์จำนวนมากอธิบายว่าโค้ดทำอะไร และในบาง implementation ก็มีคำอธิบายเหตุผลที่เลือกใช้วิธีนั้นด้วย
  • คำอธิบายเพิ่มเติมเกี่ยวกับ codebase เพื่อการเรียนรู้มีต่อใน บทความจดหมายข่าว
  • หากมีส่วนที่ต้องการคำอธิบายเพิ่มเติม สามารถขอได้ผ่าน GitHub issue

1 ความคิดเห็น

 
GN⁺ 2023-08-23
ความคิดเห็นจาก Hacker News
  • รู้สึกว่านี่อาจเป็นครั้งแรกที่ผมมีอะไรที่มีประโยชน์พอจะเสริมในการคุยเรื่องโค้ดได้ ในฐานะคนเขียนบทความ ผมทำสคริปต์ AutoHotkey ไว้สำหรับเปิด notepad.exe เปล่า ๆ ได้อย่างรวดเร็วทุกเมื่อ กดปุ่ม ~ แล้วจะเปิด กดอีกครั้งก็ปิด และถ้ามีเนื้อหาอยู่ก็จะแสดงกล่องโต้ตอบให้บันทึก
    สิ่งที่ AHK ของผมทำมีแค่นี้ทั้งหมด

    • น่าสนใจที่ปุ่มเดียวกันนี้ก็มักถูกใช้เป็นธรรมเนียมสำหรับ สลับเทอร์มินัล ด้วย เหมือนที่โปรแกรมเมอร์ “อาศัยอยู่” ในเทอร์มินัล ก็สงสัยเหมือนกันว่าคนทำงานกราฟิกดิจิทัลก็เรียกแผ่นสเก็ตช์หรือโปรแกรมวาดภาพขึ้นมาในลักษณะคล้ายกันหรือไม่
      ถ้าต้องการสลับไปมาระหว่างหน้าต่างก่อนหน้าอย่างรวดเร็วโดยไม่ปิดหรือย่อหน้าต่าง แป้นลัดมาตรฐานของ Windows อย่าง Alt + Escape มีประโยชน์มาก มันจะสลับไปยังหน้าต่างที่เคยโฟกัสก่อนหน้าทันที โดยไม่แสดงภาพรวมหน้าต่างเหมือน Alt+Tab
      ใน AutoHotkey v1 สามารถทำ boilerplate แบบสวิตเชอร์/ลอนเชอร์ที่ค้นหาส่วนหนึ่งของชื่อหน้าต่างแล้ว activate ถ้าหน้าต่างนั้น active อยู่แล้วก็ใช้ send, !{escape} เพื่อย้อนกลับ และถ้าไม่มีก็รันขึ้นมาได้ ถ้าไม่อยากให้ taskbar รก ก็ใช้ WinHide/WinShow ได้เช่นกัน แต่กับบางหน้าต่างอาจไม่ค่อยเข้ากัน และสำหรับการตรวจจับหน้าต่าง บางครั้ง ahk_exe หรือ ahk_class ก็เหมาะกว่า
    • คิดว่า Notepad++ อาจดีกว่าเพราะมี autosave ฟีเจอร์ที่บันทึกอัตโนมัติแม้แต่เอกสารที่ยังไม่ได้เซฟน่าจะเป็นหนึ่งในฟีเจอร์ที่ดีที่สุด
    • ถ้าย้ายสคริปต์ข้างต้นไปเป็น AutoHotkey 2 ก็เขียนได้สั้นลงแบบ “Tilde opens Notepad” โดยตรวจสอบ WinActive("Untitled - Notepad") และ WinExist("*Untitled - Notepad") เพื่อปิดหรือ activate และถ้าไม่มีอยู่ก็รัน Run "Notepad"
    • มันเร็วกว่าการกดปุ่ม Windows พิมพ์ “Notepad” แล้วกด Enter แค่นิดเดียวเท่านั้น แต่ถ้าทำให้เปิดเอกสาร notes.txt ไฟล์เดียวแทน ก็น่าจะเจ๋งกว่า เพราะเรียกโน้ตขึ้นมา เพิ่มข้อความต่อท้าย แล้วบันทึก/ปิดได้ด้วยปุ่มลัดเดียว
    • เป็นวิธีที่ดี ใช้ฟังก์ชัน WinActive() หรือ WinExist() แล้วรวมเงื่อนไขชื่อหลายแบบด้วย or ได้ และถ้าจำเป็นก็ใส่เงื่อนไข ahk_class ร่วมด้วยได้ เช่น "Untitled - Notepad ahk_class Notepad"
  • AutoHotkey ยอดเยี่ยมมาก แต่ก็อยากให้ภาษามันปกติกว่านี้หน่อย เคยพยายามทำ Aero Snap เวอร์ชันอัตราส่วนทองคำให้เสถียรแล้วลำบากมาก ทั้งที่การจัดการหลายจอและหลายขนาดไม่น่าจะยากขนาดนี้ แต่ไวยากรณ์ Loop แปลก ๆ หรือความผิดพลาดเล็ก ๆ ที่ล้มเหลวแบบเงียบ ๆ ทำให้หมดสนุกจนยอมแพ้
    เคยหาโมดูล ahk สำหรับ Python ด้วย แต่พอใช้ร่วมกับโมดูล keyboard แล้วมันทำงานเป็นตัวฟังปุ่มลัดได้ไม่ดีเท่า AutoHotkey
    https://github.com/idbrii/daveconfig/blob/main/win/autohotke...
    https://pypi.org/project/ahk/

    • นั่นแหละจึงมี AutoHotkey v2 มันเหมือนช่วง Python 3 ของ AHK ซึ่งมีให้ใช้มาหลายปีแล้ว และเวอร์ชันเสถียรออกมาราวหนึ่งปีก่อน แต่ดูเหมือนยังมีคน adopt ไม่มากนัก
    • เพราะงั้นนอกจากเปลี่ยน CapsLock ให้เป็น Control แล้วก็ยังไม่ได้ใช้อะไรมากนัก บางทีอาจถึงเวลาทำ Lisp DSL ที่คอมไพล์เป็น AHK แล้วก็ได้
    • ใช่ นั่นคือปัญหาใหญ่ที่สุดของ AHK และ v2 ก็ปรับปรุงส่วนนี้ไปมาก มีความฝันว่าอยากให้มีตัวฟังปุ่มลัดแบบทั่วไปที่ใช้ได้จากภาษาอะไรก็ได้ ด้วยเวทมนตร์ปลั๊กอิน wasm อะไรทำนองนั้น
  • ตอนงานแต่งงาน ผมทำโฟโตบ็อกซ์ด้วย AutoHotKey ใช้ซอฟต์แวร์ง่าย ๆ สำหรับควบคุม Nikon ของคู่หมั้นผ่าน USB ร่วมกับ IrfanView บนแล็ปท็อป และตั้งค่าให้ IrfanView คอยดูโฟลเดอร์เพื่อแสดงรูปถ่ายล่าสุดเสมอ
    ผมใช้ AutoHotKey ทำ GUI ง่าย ๆ ที่มีปุ่ม Preview, Autofocus และ “SNAP” พอกด SNAP ก็จะแสดงเคานต์ดาวน์ขนาดใหญ่ จากนั้นถ่ายรูป ย่อซอฟต์แวร์กล้องลง แล้วเปิด IrfanView ขึ้นมา หลังจากไม่กี่วินาทีก็กลับไปที่ GUI ปุ่มอีกครั้ง แขกชอบกันมาก และช่วยประหยัดค่าเช่าโฟโตบ็อกซ์ไปได้หลายร้อยยูโร แถมยังได้รูปดี ๆ ด้วย

  • สคริปต์ AutoHotKey นี้เปลี่ยนเกมสำหรับผมเลย ผมแมป Ctrl + Shift + V ให้เป็นการวางแบบไม่มีรูปแบบ โดยแปลงคลิปบอร์ดเป็นข้อความแล้ววาง รอสักครู่ จากนั้นคืนค่าคลิปบอร์ดเดิม

    • อนึ่ง แม้ไม่ใช้ AutoHotKey ก็ทำได้ด้วย Powertoys หรือ PureText มีประโยชน์มาก
      https://learn.microsoft.com/en-us/windows/powertoys/
      https://stevemiller.net/puretext/
    • มันแปลกมากที่ค่าเริ่มต้นคือวางพร้อมรูปแบบ ผมไม่เคยอยากวางโดยคงรูปแบบไว้เลยสักครั้งจนถึงตอนนี้ และก็ไม่เข้าใจว่ามันตั้งใจรองรับ use case แบบไหน
    • Ctrl+Shift+V ดีจริง ๆ ควรกลายเป็นปุ่มลัดมาตรฐานของระบบปฏิบัติการสำหรับคลิปบอร์ด
      ถ้ามีคลิปบอร์ดแบบหลายค่า เช่น คลิปล่าสุด 5 รายการ ก็คงดี แต่เรื่องนั้นอาจเป็นคำขอที่ใหญ่เกินไปหน่อย
  • AHK เป็นหนึ่งในแอปที่ผูกผมไว้กับ Windows ใช้เพิ่มอักขระอย่าง äöüß, áóúñ ลงบนคีย์บอร์ด, ควบคุมความสว่างไฟในห้องและอพาร์ตเมนต์, ใส่ timestamp อย่าง 08:39 –, 2023-08-22 08:39:46, 2023-08-22 — Tuesday ด้วยปุ่มหนึ่งหรือสองปุ่ม และใช้ปุ่ม Pause แบบ toggle เพื่อปิด–เปิดไฟจอมอนิเตอร์ผ่านปลั๊กที่รองรับ Tasmota
    แต่อยากได้ฟีเจอร์ที่ใช้คีย์บอร์ดตัวที่สองเหมือน button pad แล้วกิน key input ของคีย์บอร์ดนั้นไปด้วย เลยกำลังใช้คีย์บอร์ด Bluetooth ขนาดเล็กต่อกับ Raspberry Pi Zero เพื่อเพิ่มจำนวนปุ่ม

    • บน macOS Hammerspoon ดูเหมือนเป็นตัวเลือกที่ดีที่สุด
      https://www.hammerspoon.org/
    • ถ้ารับต้นทุนได้ อาจหาคีย์บอร์ดราคาถูกที่รองรับ QMK หรือ custom firmware อื่น แล้ว map บางปุ่มเป็น F13~F24 หรือคีย์ผสมที่กดยากอย่าง Ctrl+Alt+Shift+P ได้
    • เคยได้ผลดีจากการใช้ Luamacros ดักคีย์บอร์ดตัวที่สองแล้วส่ง key input ต่อไปยัง AutoHotKey
      https://miquelvir.medium.com/secondkeyboard-1c39e52e023b
      อันนี้ก็มีเช่นกัน: https://github.com/evilC/AutoHotInterception
    • บน Linux ใช้ AutoKey แม้จะทรงพลังน้อยกว่า AHK แต่ชอบตรงที่ใช้ Python พื้นฐาน
      https://github.com/autokey/autokey
    • ถ้าใช้ AutoHotInterception AHK จะสามารถแยกคีย์บอร์ด/เมาส์ต่างตัวกันตาม hardware ID ได้ ทำให้มี layout และ macro เฉพาะบนคีย์บอร์ดแยกได้
  • ผมก็ใช้ AutoHotKey ตลอดเหมือนกัน ใส่ไว้ทั้งปุ่มลัด stamp วันที่/เวลา 6 แบบ, launcher สำหรับ PuTTY/SSH ของ host และ serial port ที่ใช้บ่อย, launcher ตามสถานะของแอปมากกว่า 10 ตัวอย่าง Outlook, Windows Terminal, Total Commander, วางแบบไม่มี formatting ได้ทุกที่, วางโดยลบ line break, เลเยอร์อินพุต AltGr สำหรับอักขระพิเศษและอีโมจิ รวมถึงปุ่มลัด media/volume

    • ไหน ๆ ก็แชร์แล้ว เลยเอาสคริปต์ของผมมาโพสต์ด้วย ใช้และปรับปรุงต่อเนื่องมาตั้งแต่ปี 2012
      https://gist.github.com/raveren/bac5196d2063665d2154
  • บนแล็ปท็อป Linux ส่วนตัว ผมสลับ Caps Lock กับ Escape ใช้กันและชินแล้ว ตอน dual boot เป็น Windows ก็ใช้ Powertoys ตั้งค่าแบบเดียวกัน แต่ที่บริษัทติดตั้ง Powertoys หรือ Uncap ไม่ได้ จึงเหลือตัวเลือกแค่ AutoHotKey
    พอทำตามคำตอบใน StackOverflow กลายเป็นว่า Caps Lock กับ Escape ต่างก็ส่งสองปุ่มพร้อมกันทั้งคู่ ทำให้บางครั้งข้อความใน Teams พัง
    https://github.com/microsoft/PowerToys
    https://github.com/susam/uncap
    https://stackoverflow.com/questions/38558376/how-to-map-caps...

    • Kanata ยอดเยี่ยม รองรับทั้ง Linux และ Windows แต่เครื่องหลักใช้ Linux เลยยังไม่ได้ลองบน Windows
      https://github.com/jtroo/kanata
    • ขอแนะนำ home row modifiers ด้วย เป็นวิธีที่ให้ปุ่มทำงานตามเดิมเมื่อกดสั้น ๆ และทำอีกฟังก์ชันเมื่อกดยาว
      ตัวอย่างเช่น https://github.com/evilC/TapHoldManager ทำสิ่งนี้ใน AHK ถ้าวาง Shift/Ctrl/Win/Alt ไว้ใต้ fdsa และ jkl; จะลดการใช้ก้อยและทำให้นิ้วอยู่บน home row ได้นานขึ้น
    • ใช้ AHK สลับปุ่มเหล่านี้มาหลายปีแล้ว และสคริปต์ง่าย ๆ แบบนี้ก็ทำงานได้: CapsLock::Esc, Esc::CapsLock
      ยังรวบรวม quick win อื่น ๆ ของ AHK ไว้ด้วย เช่น การตั้ง global hotkey เพื่อเปิดโปรแกรม: https://nickjanetakis.com/blog/remap-and-set-global-hotkeys-...
    • รีจิสทรี scancode map ก็น่าลอง ใช้สลับ Ctrl/CapsLock อยู่ และทำงานได้ดีแม้ในซอฟต์แวร์ RDP หรือแอปที่รันด้วยสิทธิ์ผู้ดูแลระบบ ซึ่ง PowerToys จัดการไม่ได้
      https://superuser.com/questions/550679/where-can-i-find-wind...
    • เคยติดปัญหาเดียวกัน แล้วสุดท้ายก็ทำให้มันพอใช้งานได้แบบฝืน ๆ
      https://github.com/hwalinga/dotfiles/blob/master/CapsLockCtr...
      ยังทำฟังก์ชันแบบสองหน้าที่ด้วย คือถ้ากด CapsLock พร้อมปุ่มอื่นจะเป็น Ctrl และถ้ากดสั้น ๆ จะเป็น Esc
  • อย่างที่หลายคนพูดกัน AHK ทำอะไรบน Windows ได้มากจนน่าทึ่ง ส่วนตัวแล้วผมคิดว่าได้ประหยัดหรือทำเงินได้ มากกว่า 100,000 ดอลลาร์ เพราะ AHK
    แต่ตัวภาษา AHK เองไม่ใช่ภาษาที่เขียนแล้วสนุกที่สุด ผมสงสัยว่าทำไมถึงไม่มีเครื่องมือที่ทรงพลังในระดับเดียวกันบน Python หรือ Lua และ https://github.com/pywinauto/pywinauto ในทางปฏิบัติก็ทำงานได้ไม่ดีเท่า AHK สุดท้ายข้างล่างก็คือ WinAPI ดังนั้นถ้ามีไลบรารี wrapper ดี ๆ C# ก็อาจเป็นตัวเลือกได้ ผมคิดว่าเหตุผลที่ AHK ได้รับความนิยมคือ ถึงมันจะหน้าตาไม่สวย แต่ใช้งานได้จริง

    • ถ้ายังไม่ได้ทำ แนะนำให้ลองอัปไปใช้ v2 ออกมาเมื่อต้นปีนี้ และภาษาก็ดูน่าเกลียดน้อยลงมาก ความแตกต่างระหว่าง command/function หายไป ทุกอย่างกลายเป็นฟังก์ชันทั้งหมด
    • มีความพยายามที่จะ เขียน AHK ใหม่ด้วย C# และรองรับระบบปฏิบัติการอื่นด้วย
      https://www.autohotkey.com/boards/viewtopic.php?f=80&t=77248
    • เหตุผลที่ AHK ได้รับความนิยมคือความ “น่าเกลียด” ที่ภาษาโปรแกรม “จริงจัง” ส่วนใหญ่คงยอมรับไม่ได้ กลับทำให้เข้าถึงได้ง่ายในช่วงเริ่มต้น
    • PyAutoGui ก็ดีมากเช่นกัน ผมใช้มานาน และเมื่อไม่นานมานี้ก็เขียน automation ง่าย ๆ บางตัวจาก AHK ใหม่ด้วยมัน มันไม่ใช่ตัวแทนแบบ 1:1 เลยยังใช้ AutoHotKey อยู่ แต่ความสามารถด้าน UI automation ทำมาได้ดี
  • AutoHotKey ยอดเยี่ยมมาก ผมใช้เพื่อ สลับแอป ให้เร็วขึ้น และในกรณีของผมใช้ Right Alt เป็นปุ่ม “เปิดใช้งานคีย์ลัด” เพื่อควบคุมทั้งหมด
    เมื่อกดค้างไว้แล้วกดปุ่มตัวอักษร จะวนไปตามอินสแตนซ์ของแอปนั้น เช่น Alt+C จะสลับไปยังหน้าต่าง VS Code และกลุ่ม Alt+F จะเปิดอินสแตนซ์แอปใหม่ เช่น หน้าต่าง Chrome ใหม่ของโปรไฟล์เฉพาะ Alt+ตัวเลข สามารถตั้งให้กับหน้าต่างที่โฟกัสอยู่ในปัจจุบันได้ และถ้าแตะ Alt จะเปิดโหมดแก้ไข ซึ่งสามารถกำหนดหน้าต่างปัจจุบันให้กับปุ่มตัวเลขได้ ในโหมดแก้ไข H/J/K/L จะกลายเป็นปุ่มนำทางขึ้น/ลง/ซ้าย/ขวา ทำให้การสลับแอปเร็วขึ้นมาก

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