5 điểm bởi GN⁺ 2023-08-23 | 1 bình luận | Chia sẻ qua WhatsApp
  • Vì AutoHotKey là một công cụ tự động hóa Windows mạnh mẽ nhưng khá khó tiếp cận với người mới, tác giả công khai bộ sưu tập script cá nhân làm tài liệu học tập
  • Tài liệu gồm tổng cộng 14 tệp, tập trung vào các ví dụ tự động hóa có thể dùng ngay như mở thư mục, chèn văn bản, hay mở rộng phím tắt theo từng chương trình
  • Bao gồm từ nhập nhanh ngày hiện tại, em dash, ¯\_(ツ)_/¯ đến hệ thống phím tắt theo chế độ cho người dùng vim và cả demo GUI đơn giản
  • Cũng có script chuyển đổi timestamp sang UTC và giờ địa phương, cho thấy khả năng tự động hóa quy trình làm việc thực tế vượt ra ngoài các phím tắt đơn thuần
  • Mỗi tệp đều có chú thích giải thích mã làm gì, và một số còn nêu rõ vì sao được triển khai theo cách đó, nên rất phù hợp để đọc như một codebase phục vụ học tập

Bộ sưu tập ví dụ AutoHotKey gần với công việc thực tế

Cách đọc như một codebase phục vụ học tập

  • Kho lưu trữ này là một ví dụ về codebase phục vụ học tập được tạo ra để mọi người có thể đọc mã và học theo
  • Mỗi tệp đều có nhiều chú thích về việc mã làm gì, và ở một số phần triển khai còn có cả lý do vì sao tác giả chọn cách làm đó
  • Phần giải thích riêng về codebase phục vụ học tập được nối tiếp trong bài viết trên newsletter
  • Nếu có đoạn nào cần giải thích thêm, bạn có thể yêu cầu qua GitHub Issues

1 bình luận

 
GN⁺ 2023-08-23
Ý kiến trên Hacker News
  • Có vẻ đây là lần đầu tôi có thể đóng góp điều gì đó hữu ích cho một cuộc thảo luận liên quan đến code. Với tư cách người viết, tôi đã tạo sẵn một script AutoHotkey để có thể nhanh chóng mở notepad.exe trống bất cứ lúc nào; nhấn phím ~ thì mở, nhấn lại thì đóng, và nếu có nội dung thì hộp thoại lưu sẽ hiện ra
    AHK của tôi chỉ làm có vậy

    • Điều thú vị là cùng phím đó cũng thường được dùng theo quy ước để bật/tắt terminal. Cũng như các lập trình viên “sống” trong terminal, tôi tự hỏi liệu những người làm đồ họa số có mở sketchpad hay chương trình vẽ theo cách tương tự không
      Khi muốn chuyển nhanh qua lại với cửa sổ trước đó mà không đóng hay thu nhỏ cửa sổ, phím tắt mặc định của Windows Alt + Escape rất hữu ích. Nó chuyển thẳng sang cửa sổ được focus ngay trước đó mà không hiện phần tổng quan cửa sổ như Alt+Tab
      Trong AutoHotkey v1, có thể tạo boilerplate dạng switcher/launcher: tìm một mẩu tiêu đề cửa sổ để kích hoạt, nếu nó đã active thì quay lại bằng send, !{escape}, còn nếu không có thì chạy ứng dụng. Nếu không muốn làm rối thanh tác vụ, cũng có thể dùng WinHide/WinShow, nhưng với một số cửa sổ thì không hợp lắm; để nhận diện cửa sổ, đôi khi ahk_exe hoặc ahk_class phù hợp hơn
    • Có lẽ Notepad++ tốt hơn nhờ tự động lưu. Tôi xem tính năng tự động lưu cả các tài liệu chưa lưu là một trong những tính năng hay nhất của nó
    • Nếu chuyển script trên sang AutoHotkey 2, có thể viết đơn giản hơn kiểu “Tilde opens Notepad”. Cách làm là kiểm tra WinActive("Untitled - Notepad")WinExist("*Untitled - Notepad") để đóng hoặc kích hoạt, nếu không có thì chạy Run "Notepad"
    • Nó chỉ nhanh hơn một chút so với việc nhấn phím Windows, gõ “Notepad” rồi Enter. Nhưng nếu làm cho nó mở một tài liệu notes.txt duy nhất, có thể tải ghi chú lên, nối thêm nội dung và lưu/đóng bằng một phím tắt, như vậy có vẻ hay hơn
    • Cách làm tốt. Dùng các hàm WinActive() hoặc WinExist() thì có thể gộp nhiều điều kiện tiêu đề bằng or, và nếu cần cũng có thể thêm điều kiện ahk_class như "Untitled - Notepad ahk_class Notepad"
  • AutoHotkey rất tuyệt, nhưng tôi ước ngôn ngữ của nó bình thường hơn một chút. Tôi từng khổ sở khi cố tạo một phiên bản ổn định của Aero Snap theo tỉ lệ vàng; việc xử lý nhiều màn hình và kích thước lẽ ra không khó đến vậy, nhưng cú pháp Loop kỳ quặc hay việc các lỗi đơn giản âm thầm thất bại đã làm mất hết hứng thú và khiến tôi bỏ cuộc
    Tôi cũng tìm thấy module ahk cho Python, nhưng khi kết hợp với module keyboard thì nó không hoạt động tốt như AutoHotkey trong vai trò listener phím tắt
    https://github.com/idbrii/daveconfig/blob/main/win/autohotke...
    https://pypi.org/project/ahk/

    • Vì thế mới có AutoHotkey v2. Nó giống như khoảnh khắc Python 3 của AHK: đã có trong vài năm, bản ổn định ra khoảng một năm trước, nhưng có vẻ vẫn chưa được áp dụng nhiều
    • Vì vậy ngoài việc đổi CapsLock thành Control, tôi chưa dùng được nhiều. Có lẽ giờ là lúc thử tạo một Lisp DSL biên dịch sang AHK
    • Đúng vậy, đó là vấn đề lớn nhất của AHK, và v2 đã cải thiện khá nhiều phần này. Tôi vẫn mơ rằng có thể có một listener phím tắt phổ dụng dùng được từ bất kỳ ngôn ngữ nào, bằng kiểu phép màu plugin wasm nào đó
  • Tôi đã dùng AutoHotKey để làm photobooth trong đám cưới của mình. Tôi dùng một phần mềm đơn giản điều khiển chiếc Nikon của vị hôn thê qua USB, cùng với IrfanView trên laptop; IrfanView được thiết lập để theo dõi thư mục và luôn hiển thị ảnh mới nhất
    Bằng AutoHotKey, tôi tạo một GUI đơn giản có các nút Preview, Autofocus và “SNAP”; khi nhấn SNAP, nó hiện bộ đếm ngược lớn rồi chụp ảnh, thu nhỏ phần mềm camera và đưa IrfanView lên trước. Vài giây sau nó quay lại GUI nút bấm, khách mời rất thích, còn chúng tôi tiết kiệm được vài trăm euro tiền thuê photobooth và cũng có được những bức ảnh đẹp

  • Script AutoHotKey này đã thay đổi cuộc chơi đối với tôi. Nó ánh xạ Ctrl + Shift + V thành dán không định dạng: chuyển clipboard thành văn bản, dán vào, chờ một chút rồi khôi phục clipboard ban đầu

    • Nhân tiện, có thể làm việc này mà không cần AutoHotKey bằng Powertoys hoặc PureText. Rất hữu ích
      https://learn.microsoft.com/en-us/windows/powertoys/
      https://stevemiller.net/puretext/
    • Việc mặc định là dán kèm cả định dạng thật sự rất kỳ lạ. Từ trước đến nay tôi chưa từng muốn dán mà giữ nguyên định dạng, và cũng không hiểu nó nhắm tới trường hợp sử dụng nào
    • Ctrl+Shift+V thật sự rất tuyệt. Nó nên trở thành phím tắt chuẩn của hệ điều hành cho clipboard
      Sẽ rất hay nếu có cả clipboard nhiều giá trị như 5 mục clipboard gần nhất, nhưng có lẽ như vậy là đòi hỏi quá nhiều
  • AHK là một trong những ứng dụng mình gắn chặt với Windows. Mình dùng nó để thêm các ký tự như äöüß, áóúñ vào bàn phím, điều khiển độ sáng đèn trong phòng và căn hộ, chèn timestamp như 08:39 –, 2023-08-22 08:39:46, 2023-08-22 — Tuesday chỉ bằng một hai nút, và bật/tắt nguồn màn hình qua ổ cắm hỗ trợ Tasmota khi bật/tắt phím Pause
    Tuy nhiên mình vẫn muốn có tính năng dùng bàn phím thứ hai như một bảng nút bấm, đồng thời chặn luôn các phím bấm từ bàn phím đó. Vì vậy hiện mình đang nối một bàn phím Bluetooth nhỏ với Raspberry Pi Zero để có thêm nút

    • Trên macOS, Hammerspoon có vẻ là lựa chọn tốt nhất
      https://www.hammerspoon.org/
    • Nếu chấp nhận được chi phí, bạn có thể tìm một bàn phím rẻ hỗ trợ QMK hoặc firmware tùy biến khác, rồi map một số phím sang F13~F24 hoặc các tổ hợp khó bấm như Ctrl+Alt+Shift+P
    • Mình từng đạt kết quả tốt khi dùng Luamacros để chặn bàn phím thứ hai và chuyển phím bấm sang AutoHotKey
      https://miquelvir.medium.com/secondkeyboard-1c39e52e023b
      Cũng có cái này: https://github.com/evilC/AutoHotInterception
    • Trên Linux mình dùng AutoKey. Nó kém mạnh hơn AHK, nhưng hay ở chỗ dùng Python chuẩn
      https://github.com/autokey/autokey
    • Dùng AutoHotInterception thì AHK có thể phân biệt các bàn phím/chuột khác nhau dựa trên ID phần cứng. Bạn có thể có layout và macro riêng trên một bàn phím riêng
  • Mình cũng luôn dùng AutoHotKey. Mình thiết lập 6 loại phím tắt chèn ngày/giờ, launcher PuTTY/SSH cho các host và cổng serial thường dùng, launcher theo trạng thái cho hơn 10 ứng dụng như Outlook, Windows Terminal, Total Commander, dán không định dạng ở mọi nơi, dán sau khi loại bỏ xuống dòng, lớp nhập AltGr cho ký tự đặc biệt và emoji, cùng phím tắt media/âm lượng

  • Trên laptop Linux cá nhân, mình đã hoán đổi Caps Lock và Escape với nhau và đã quen như vậy. Khi dual boot sang Windows, mình cấu hình tương tự bằng Powertoys, nhưng ở công ty mình không thể cài Powertoys hay Uncap, nên AutoHotKey là lựa chọn duy nhất
    Làm theo câu trả lời trên StackOverflow thì Caps Lock và Escape đều rơi vào trạng thái gửi cả hai phím cùng lúc, nên thỉnh thoảng làm hỏng tin nhắn Teams của mình
    https://github.com/microsoft/PowerToys
    https://github.com/susam/uncap
    https://stackoverflow.com/questions/38558376/how-to-map-caps...

    • Kanata rất tốt. Nó hỗ trợ cả Linux lẫn Windows, nhưng công việc chính của mình là trên Linux nên mình vẫn chưa thử trên Windows
      https://github.com/jtroo/kanata
    • Mình cũng khuyên dùng phím bổ trợ ở hàng home row. Cách này khiến phím hoạt động như bình thường khi bấm ngắn, và thực hiện chức năng khác khi nhấn giữ lâu
      Ví dụ https://github.com/evilC/TapHoldManager triển khai cách này trong AHK. Nếu đặt Shift/Ctrl/Win/Alt dưới fdsajkl;, bạn sẽ ít phải dùng ngón út hơn và các ngón tay có thể ở trên hàng home row lâu hơn
    • Mình đã dùng AHK để hoán đổi các phím này trong vài năm, và script đơn giản như sau hoạt động được: CapsLock::Esc, Esc::CapsLock
      Mình cũng đã tổng hợp các cải tiến nhanh khác với AHK, như chạy chương trình bằng phím tắt toàn cục: https://nickjanetakis.com/blog/remap-and-set-global-hotkeys-...
    • Registry Scancode Map cũng đáng thử. Mình dùng nó để hoán đổi Ctrl/CapsLock, và nó hoạt động tốt cả trong phần mềm RDP hoặc ứng dụng chạy quyền admin mà PowerToys không xử lý được
      https://superuser.com/questions/550679/where-can-i-find-wind...
    • Mình cũng từng bị kẹt vì vấn đề tương tự và cuối cùng đã làm được một thứ chạy tạm
      https://github.com/hwalinga/dotfiles/blob/master/CapsLockCtr...
      Nó cũng triển khai chức năng kép: CapsLock hoạt động như Ctrl khi bấm cùng phím khác, và như Esc khi bấm ngắn
  • Như nhiều người đã nói, AHK cho phép làm được nhiều việc đáng kinh ngạc trên Windows. Cá nhân tôi có thể nói rằng nhờ AHK tôi đã tiết kiệm hoặc kiếm được hơn 100.000 USD
    Nhưng bản thân ngôn ngữ AHK không phải là thứ thú vị nhất để viết. Tôi vẫn thắc mắc vì sao không có công cụ nào mạnh tương tự trong Python hay Lua, và https://github.com/pywinauto/pywinauto trên thực tế cũng không hoạt động tốt bằng AHK. Suy cho cùng bên dưới là WinAPI, nên nếu có một thư viện wrapper tốt thì C# cũng có thể là một lựa chọn. Tôi nghĩ lý do AHK phổ biến là vì tuy xấu xí nhưng nó chạy được

    • Nếu chưa làm, bạn nên thử nâng lên v2. Nó ra mắt đầu năm nay và ngôn ngữ đã bớt xấu đi rất nhiều. Sự phân biệt lệnh/hàm biến mất, tất cả đều trở thành hàm
    • Có một nỗ lực viết lại AHK bằng C# và hỗ trợ cả các hệ điều hành khác
      https://www.autohotkey.com/boards/viewtopic.php?f=80&t=77248
    • Lý do AHK phổ biến phần lớn là nhờ sự xấu xí mà hầu hết các ngôn ngữ lập trình “thật sự” sẽ không chấp nhận, qua đó khiến nó dễ tiếp cận lúc ban đầu hơn
    • PyAutoGui cũng rất tốt. Tôi đã dùng nó từ lâu và gần đây đã viết lại vài tự động hóa AHK đơn giản bằng nó. Nó không phải bản thay thế 1:1 nên tôi vẫn dùng AutoHotKey, nhưng các tính năng tự động hóa UI được làm rất tốt
  • AutoHotKey rất tuyệt. Tôi dùng nó để chuyển ứng dụng nhanh hơn, và trong trường hợp của tôi, tôi dùng Right Alt làm phím “kích hoạt phím tắt” để điều khiển mọi thứ
    Giữ phím đó rồi nhấn một phím chữ sẽ luân chuyển qua các instance của ứng dụng tương ứng. Ví dụ, Alt+C chuyển sang cửa sổ VS Code, còn nhóm Alt+F mở một instance ứng dụng mới, như cửa sổ Chrome mới với một profile cụ thể. Alt+số có thể được gán cho cửa sổ hiện đang focus, và nếu nhấn nhanh Alt thì chế độ chỉnh sửa sẽ bật, cho phép gán cửa sổ hiện tại vào một phím số. Trong chế độ chỉnh sửa, H/J/K/L trở thành các phím điều hướng lên/xuống/trái/phải, giúp việc chuyển ứng dụng nhanh hơn nhiều

  • Kịch bản khiến tôi ấn tượng nhất là một script tôi từng tìm được rồi chỉnh sửa khi chơi Diablo 3. Tôi bắt đầu gặp vấn đề chấn thương căng cơ do lặp lại vì tay cầm chuột đè quá mạnh lên mousepad, nên đã tìm cách chơi bằng controller
    Script đó bind chuyển động analog vào một vòng tròn nhỏ quanh nhân vật, cho phép chạy mượt theo bất kỳ hướng nào; khi nhấn nút, nó đổi sang phạm vi xa hơn để dùng kỹ năng tầm xa. Chỉ cần tùy biến một chút cho từng class là nó hoạt động tốt đến đáng kinh ngạc