ขโมยสคริปต์ของฉันไปเพื่อเรียนรู้ AutoHotKey
(hillelwayne.com)- แม้ AutoHotKey จะเป็นเครื่องมืออัตโนมัติบน Windows ที่ทรงพลัง แต่ก็เริ่มใช้งานยากสำหรับมือใหม่ จึงเปิดเผย ชุดสคริปต์ส่วนตัว ที่ใช้งานจริงเป็นสื่อการเรียนรู้
- ชุดนี้ประกอบด้วยไฟล์ทั้งหมด 14 ไฟล์ โดยเน้นตัวอย่างงานอัตโนมัติที่นำไปลองใช้ได้ทันที เช่น เปิดโฟลเดอร์ แทรกข้อความ และเพิ่มคีย์ลัดให้แต่ละโปรแกรม
- มีตั้งแต่การพิมพ์วันที่ปัจจุบัน, em dash,
¯\_(ツ)_/¯อย่างรวดเร็ว ไปจนถึง ระบบคีย์ลัดแบบ modal สำหรับผู้ใช้ vim และเดโม GUI แบบง่าย - ยังมีสคริปต์สำหรับแปลง timestamp เป็น UTC และเวลาท้องถิ่น ให้เห็นการทำงานอัตโนมัติของ workflow ที่ใช้งานได้จริงมากกว่าการตั้งคีย์ลัดอย่างเดียว
- แต่ละไฟล์มีคอมเมนต์อธิบายว่าโค้ดทำอะไร และบางส่วนยังอธิบายว่าทำไมจึงเลือกเขียนแบบนั้น ทำให้อ่านเป็น codebase เพื่อการเรียนรู้ ได้ดี
ชุดตัวอย่าง AutoHotKey ที่ใกล้เคียงงานจริง
- สำหรับผู้ใช้ที่รู้สึกว่า AutoHotKey เรียนรู้ได้ยาก ผู้เขียนจึงเผยแพร่สคริปต์ส่วนตัวส่วนใหญ่ที่เคยใช้งาน พร้อมคำอธิบายประกอบ
- ดูโค้ดทั้งหมดได้ใน GitHub repository ซึ่งประกอบด้วยทั้งหมด 14 ไฟล์
- ตัวอย่างหลักมีดังนี้
วิธีอ่านในฐานะ codebase เพื่อการเรียนรู้
- repository นี้เป็นตัวอย่างของ codebase เพื่อการเรียนรู้ ที่สร้างขึ้นเพื่อให้ผู้อื่นเรียนรู้ผ่านการอ่านโค้ด
- แต่ละไฟล์มีคอมเมนต์จำนวนมากอธิบายว่าโค้ดทำอะไร และในบาง implementation ก็มีคำอธิบายเหตุผลที่เลือกใช้วิธีนั้นด้วย
- คำอธิบายเพิ่มเติมเกี่ยวกับ codebase เพื่อการเรียนรู้มีต่อใน บทความจดหมายข่าว
- หากมีส่วนที่ต้องการคำอธิบายเพิ่มเติม สามารถขอได้ผ่าน GitHub issue
1 ความคิดเห็น
ความคิดเห็นจาก 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ก็เหมาะกว่าWinActive("Untitled - Notepad")และWinExist("*Untitled - Notepad")เพื่อปิดหรือ activate และถ้าไม่มีอยู่ก็รันRun "Notepad"WinActive()หรือWinExist()แล้วรวมเงื่อนไขชื่อหลายแบบด้วยorได้ และถ้าจำเป็นก็ใส่เงื่อนไข ahk_class ร่วมด้วยได้ เช่น"Untitled - Notepad ahk_class Notepad"AutoHotkey ยอดเยี่ยมมาก แต่ก็อยากให้ภาษามันปกติกว่านี้หน่อย เคยพยายามทำ Aero Snap เวอร์ชันอัตราส่วนทองคำให้เสถียรแล้วลำบากมาก ทั้งที่การจัดการหลายจอและหลายขนาดไม่น่าจะยากขนาดนี้ แต่ไวยากรณ์
Loopแปลก ๆ หรือความผิดพลาดเล็ก ๆ ที่ล้มเหลวแบบเงียบ ๆ ทำให้หมดสนุกจนยอมแพ้เคยหาโมดูล ahk สำหรับ Python ด้วย แต่พอใช้ร่วมกับโมดูล
keyboardแล้วมันทำงานเป็นตัวฟังปุ่มลัดได้ไม่ดีเท่า AutoHotkeyhttps://github.com/idbrii/daveconfig/blob/main/win/autohotke...
https://pypi.org/project/ahk/
ตอนงานแต่งงาน ผมทำโฟโตบ็อกซ์ด้วย AutoHotKey ใช้ซอฟต์แวร์ง่าย ๆ สำหรับควบคุม Nikon ของคู่หมั้นผ่าน USB ร่วมกับ IrfanView บนแล็ปท็อป และตั้งค่าให้ IrfanView คอยดูโฟลเดอร์เพื่อแสดงรูปถ่ายล่าสุดเสมอ
ผมใช้ AutoHotKey ทำ GUI ง่าย ๆ ที่มีปุ่ม Preview, Autofocus และ “SNAP” พอกด SNAP ก็จะแสดงเคานต์ดาวน์ขนาดใหญ่ จากนั้นถ่ายรูป ย่อซอฟต์แวร์กล้องลง แล้วเปิด IrfanView ขึ้นมา หลังจากไม่กี่วินาทีก็กลับไปที่ GUI ปุ่มอีกครั้ง แขกชอบกันมาก และช่วยประหยัดค่าเช่าโฟโตบ็อกซ์ไปได้หลายร้อยยูโร แถมยังได้รูปดี ๆ ด้วย
สคริปต์ AutoHotKey นี้เปลี่ยนเกมสำหรับผมเลย ผมแมป Ctrl + Shift + V ให้เป็นการวางแบบไม่มีรูปแบบ โดยแปลงคลิปบอร์ดเป็นข้อความแล้ววาง รอสักครู่ จากนั้นคืนค่าคลิปบอร์ดเดิม
https://learn.microsoft.com/en-us/windows/powertoys/
https://stevemiller.net/puretext/
ถ้ามีคลิปบอร์ดแบบหลายค่า เช่น คลิปล่าสุด 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 เพื่อเพิ่มจำนวนปุ่ม
https://www.hammerspoon.org/
https://miquelvir.medium.com/secondkeyboard-1c39e52e023b
อันนี้ก็มีเช่นกัน: https://github.com/evilC/AutoHotInterception
https://github.com/autokey/autokey
ผมก็ใช้ AutoHotKey ตลอดเหมือนกัน ใส่ไว้ทั้งปุ่มลัด stamp วันที่/เวลา 6 แบบ, launcher สำหรับ PuTTY/SSH ของ host และ serial port ที่ใช้บ่อย, launcher ตามสถานะของแอปมากกว่า 10 ตัวอย่าง Outlook, Windows Terminal, Total Commander, วางแบบไม่มี formatting ได้ทุกที่, วางโดยลบ line break, เลเยอร์อินพุต AltGr สำหรับอักขระพิเศษและอีโมจิ รวมถึงปุ่มลัด media/volume
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...
https://github.com/jtroo/kanata
ตัวอย่างเช่น https://github.com/evilC/TapHoldManager ทำสิ่งนี้ใน AHK ถ้าวาง Shift/Ctrl/Win/Alt ไว้ใต้
fdsaและjkl;จะลดการใช้ก้อยและทำให้นิ้วอยู่บน home row ได้นานขึ้นCapsLock::Esc,Esc::CapsLockยังรวบรวม quick win อื่น ๆ ของ AHK ไว้ด้วย เช่น การตั้ง global hotkey เพื่อเปิดโปรแกรม: https://nickjanetakis.com/blog/remap-and-set-global-hotkeys-...
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 ได้รับความนิยมคือ ถึงมันจะหน้าตาไม่สวย แต่ใช้งานได้จริง
https://www.autohotkey.com/boards/viewtopic.php?f=80&t=77248
AutoHotKey ยอดเยี่ยมมาก ผมใช้เพื่อ สลับแอป ให้เร็วขึ้น และในกรณีของผมใช้ Right Alt เป็นปุ่ม “เปิดใช้งานคีย์ลัด” เพื่อควบคุมทั้งหมด
เมื่อกดค้างไว้แล้วกดปุ่มตัวอักษร จะวนไปตามอินสแตนซ์ของแอปนั้น เช่น Alt+C จะสลับไปยังหน้าต่าง VS Code และกลุ่ม Alt+F จะเปิดอินสแตนซ์แอปใหม่ เช่น หน้าต่าง Chrome ใหม่ของโปรไฟล์เฉพาะ Alt+ตัวเลข สามารถตั้งให้กับหน้าต่างที่โฟกัสอยู่ในปัจจุบันได้ และถ้าแตะ Alt จะเปิดโหมดแก้ไข ซึ่งสามารถกำหนดหน้าต่างปัจจุบันให้กับปุ่มตัวเลขได้ ในโหมดแก้ไข H/J/K/L จะกลายเป็นปุ่มนำทางขึ้น/ลง/ซ้าย/ขวา ทำให้การสลับแอปเร็วขึ้นมาก
สคริปต์ที่ประทับใจที่สุดคือสคริปต์ที่เคยไปเจอแล้วนำมาแก้ตอนเล่น Diablo 3 สมัยก่อน ตอนนั้นมือที่จับเมาส์กดลงบนแผ่นรองเมาส์แรงเกินไปจนเริ่มมีปัญหา การบาดเจ็บจากการใช้งานซ้ำ ๆ เลยหาวิธีเล่นด้วยคอนโทรลเลอร์
สคริปต์นั้นผูกการเคลื่อนที่แบบอนาล็อกเข้ากับวงกลมเล็ก ๆ รอบตัวละคร ทำให้วิ่งได้ลื่นไหลทุกทิศทาง และเมื่อกดปุ่มก็สามารถเปลี่ยนระยะให้ไกลขึ้นเพื่อร่ายความสามารถระยะไกลได้ พอปรับแต่งเพิ่มเล็กน้อยตามแต่ละคลาส มันก็ทำงานได้ดีจนน่าทึ่ง