Bộ gõ tiếng Việt cho macOS: nhẹ, ổn định, không lặp chữ
Telex · VNI · kiểu gõ riêng cho từng ứng dụng · không gạch chân (marked text)
Cài đặt · Sử dụng · Cách hoạt động · Gỡ cài đặt · Donate
| ⌨️ Telex & VNI | Đặt dấu kiểu mới (hoà) hoặc kiểu cũ (hòa), kiểm tra âm tiết hợp lệ |
| 🎯 Riêng cho từng app | VS Code gõ tiếng Anh, Messenger gõ Telex, Excel gõ VNI. SenKey tự nhớ |
| 🚫 Không marked text | Không có chữ gạch chân, không lặp chữ kiểu viêviệt |
| 🌐 Sửa lỗi ô gợi ý | Thanh địa chỉ Chrome / Safari / Firefox / Edge / Arc / Cốc Cốc, Spotlight, Raycast, Alfred, Excel |
| 🔤 Tự khôi phục tiếng Anh | windows, google, facebook vẫn là chính nó |
| ⚡ Siêu nhẹ | Engine xử lý mỗi phím trong khoảng 1,2 µs, app nằm gọn trên menu bar |
| 🛡️ An toàn | Tự gỡ bộ bắt phím trong 0,5 giây khi mất quyền Trợ năng, không làm treo máy |
-
Mở Terminal: nhấn ⌘ Command + Space, gõ
Terminal, nhấn Enter. -
Chép dòng dưới đây, dán vào Terminal (⌘ Command + V) rồi nhấn Enter:
curl -fsSL https://raw.githubusercontent.com/tdHuy22/SenKey/main/get.sh | bash -
Cửa sổ Chào mừng đến với SenKey hiện ra. Làm theo từng bước trong đó, bước nào xong sẽ có dấu ✓ xanh.
Cách này tự tải bản mới nhất, cài vào Applications và mở app. macOS không chặn gì cả. Muốn cập nhật: chạy lại đúng dòng lệnh trên.
- Tải SenKey.dmg, mở file, kéo SenKey vào thư mục Applications.
- Mở SenKey trong Applications. Lần đầu macOS sẽ báo "không thể xác minh nhà phát triển", vì SenKey chưa trả phí để Apple công chứng:
- Bấm Xong.
- Vào Cài đặt hệ thống → Quyền riêng tư & Bảo mật, kéo xuống dưới cùng, bấm Vẫn mở (Open Anyway), nhập mật khẩu máy.
- Cửa sổ hướng dẫn của SenKey hiện ra. Làm theo từng bước là xong.
- Cho phép SenKey dùng bàn phím: bấm Mở Cài đặt, bật công tắc cạnh SenKey trong danh sách Trợ năng.
- Không dùng cùng lúc bộ gõ khác: nếu đang chọn tiếng Việt của Apple hoặc đang mở EVKey, UniKey… thì chuyển về ABC hoặc thoát app đó.
- Gõ thử ngay trong cửa sổ. Thấy chữ Vi trên thanh menu (góc trên bên phải màn hình) là xong 🎉
Mở lại cửa sổ này bất cứ lúc nào: bấm Vi/En trên thanh menu → Hướng dẫn cài đặt…
SenKey đọc được mọi phím bạn gõ, nên chỉ cài bản mang đúng chữ ký của tác giả. Lệnh cài một dòng ở trên tự kiểm việc này
và từ chối cài nếu chữ ký sai. Nếu cài từ file DMG, mở file DMG rồi kiểm trước khi kéo vào Applications (in ra SenKey thật là đúng; đã cài rồi thì thay đường dẫn bằng /Applications/SenKey.app):
codesign --verify --strict --deep -R '=identifier "vn.senkey.app" and certificate leaf = H"e90227565deafdcd07f260406f4934fe32ed72d6"' /Volumes/SenKey/SenKey.app && echo "SenKey thật"Warning
Đừng tắt quyền Trợ năng của SenKey khi app đang chạy. Trên một số bản macOS, việc này có thể làm treo bàn phím và chuột. Muốn tắt quyền thì bấm Vi/En → Thoát SenKey trước.
🛠️ Dành cho lập trình viên: build từ mã nguồn
Chỉ cần Xcode Command Line Tools (xcode-select --install).
git clone https://github.com/tdHuy22/SenKey.git
cd SenKey
./make-cert.sh # chỉ cần chạy một lần: đặt passphrase cho chứng chỉ ký
./install.sh # build, ký (hỏi passphrase), chép vào /Applications, mở appmake-cert.sh tạo chứng chỉ tự ký "SenKey Dev" trong một keychain riêng tại
~/Library/Application Support/SenKey/signing/. Nó không đụng vào keychain đăng nhập. Keychain này khoá bằng
passphrase do bạn đặt, không lưu ra file; cất passphrase vào trình quản lý mật khẩu.
build.sh hỏi passphrase mỗi lần ký và khoá keychain ngay sau đó, nên mọi bản build có cùng chữ ký. Nhờ vậy khi cập nhật
bằng ./install.sh, bạn không phải cấp lại quyền Trợ năng. Không có chứng chỉ thì app được ký ad-hoc và mỗi lần cài phải cấp lại quyền.
Ai có khoá này thì ký được app giả mà macOS coi là SenKey, nên đừng để khoá ở dạng dễ đọc. Máy tạo chứng chỉ bằng bản cũ
của make-cert.sh (còn file keychain-password) thì chạy lại ./make-cert.sh một lần để chuyển sang passphrase.
Đóng gói bản phát hành (build/release/SenKey.zip và SenKey.dmg): ./package.sh. Script từ chối đóng gói nếu app không khớp
chữ ký ghim trong get.sh. Repo bật immutable releases, nên đăng bản nháp, kiểm xong rồi mới công bố: đã công bố thì không thay file được nữa.
| Thao tác | Kết quả |
|---|---|
| Nhìn biểu tượng Vi / En trên menu bar | Trạng thái của ứng dụng đang dùng |
| Nhấn rồi thả ⌃⇧ (Control + Shift) | Đảo Việt/Anh cho riêng app hiện tại, app tự ghi nhớ |
| Menu → Kiểu gõ cho ‹app› | Theo mặc định · Telex · VNI · Tiếng Anh |
| Menu → Cài đặt & danh sách ứng dụng… | Xem, sửa, xoá cài đặt của từng app |
Phím tắt có thể đổi sang ⌥Z, ⌃Space hoặc ⌘⇧Space trong Cài đặt.
flowchart LR
A[Phím bấm] --> B[SenKey]
B --> C{Chữ có đổi?}
C -- Không --> D[Giữ phím gốc]
C -- Có --> E[Xoá 2, gõ ệt]
- Không dùng marked text. Mỗi phím chỉ gửi phần chênh lệch:
viet+j→ xoá 2 ký tự, gõệt. Nếu phím không làm thay đổi gì, phím gốc được giữ nguyên. - Ô gợi ý được xử lý riêng. SenKey gõ trước một ký tự vô hình để huỷ phần gợi ý đang bôi đen rồi mới xoá. Bật/tắt được cho từng app.
- Nhận đúng app đang nhận phím qua Accessibility. Spotlight và Raycast không phải app ở phía trước, nhưng vẫn được nhận đúng.
- Không sửa nhầm chỗ khác. Từ đang gõ bị bỏ khi bạn click chuột, đổi app hoặc dùng ⌘ / ⌃ / ⌥.
- Tự hồi phục. Nếu macOS tắt event tap khi hệ thống quá tải, SenKey tự bật lại.
- Ô mật khẩu và Secure Keyboard Entry (Terminal, 1Password…) chặn mọi bộ gõ dạng này, nên gõ ra chữ không dấu.
- Lời hỏi mật khẩu trong Terminal (
sudo,ssh) không phải ô mật khẩu thật, nên SenKey vẫn thêm dấu (passwordthànhpasword). Chuyển sang En trước khi gõ mật khẩu ở đó, hoặc đặt Terminal ở chế độ tiếng Anh. - Sau khi nhấn Space rồi Backspace quay lại từ trước, cần gõ lại cả từ để thêm dấu.
- Bấm Vi/En trên thanh menu → Thoát SenKey.
- Mở Applications, kéo SenKey vào Thùng rác.
- Vào Cài đặt hệ thống → Quyền riêng tư & Bảo mật → Trợ năng, chọn SenKey rồi bấm dấu − để xoá khỏi danh sách.
Nếu cài từ mã nguồn, chạy ./uninstall.sh: script làm cả ba bước trên và xoá luôn cài đặt đã lưu.
SenKey/
├── Sources/
│ ├── VietEngine/VietnameseEngine.swift # Telex/VNI, vị trí dấu, kiểm tra hợp lệ, backspace
│ ├── SenKey/
│ │ ├── KeyboardHook.swift # CGEventTap, gửi Backspace + Unicode, phím tắt
│ │ ├── Settings.swift # cài đặt theo ứng dụng (UserDefaults)
│ │ ├── AppDelegate.swift # menu bar
│ │ ├── SettingsView.swift # cửa sổ cài đặt (SwiftUI)
│ │ └── OnboardingView.swift # cửa sổ hướng dẫn lần đầu
│ └── EngineTests/main.swift # 77 test mô phỏng gõ, chạy tự động khi build
├── Tools/KeyProbe/ # công cụ ghi log sự kiện phím để debug
├── build.sh · install.sh · uninstall.sh · make-cert.sh
├── get.sh · package.sh # cài bằng một lệnh (kiểm chữ ký) · đóng gói bản phát hành
├── SECURITY.md # báo lỗi bảo mật, cách kiểm bản cài
└── LICENSE # MIT
Build thủ công: ./build.sh (dùng swiftc trực tiếp, không cần Xcode project hay SwiftPM). Build xong sẽ có file build/SenKey.app dạng universal (arm64 + x86_64).
MIT: tự do dùng, sửa, chia sẻ, kể cả cho mục đích thương mại, miễn là giữ lại thông báo bản quyền.
SenKey miễn phí. Nhưng code này được viết cùng một con AI, và con AI đó ăn token như uống nước 🥲
Mỗi lần sửa bug lặp chữ, nó đọc lại KeyboardHook.swift từ đầu, suy nghĩ ba trang giấy rồi mới kết luận:
"À, lỗi do keycode 0". Nếu SenKey giúp bạn bớt gõ viêviệt, hãy cân nhắc nạp chút năng lượng:
| Gói | Giá | Bạn nhận được |
|---|---|---|
| 🍵 Trà đá | 5.000đ | AI đọc được đúng một câu import AppKit |
| ☕ Cà phê sữa đá | 20.000đ | Đủ token để AI xin lỗi "Bạn nói đúng, tôi đã nhầm" thêm 3 lần |
| 🍜 Tô phở | 50.000đ | Sửa được một bug. Có thể sinh thêm một bug khác, miễn phí |
| 🧋 Trà sữa full topping | 100.000đ | AI được thinking thật sâu thay vì đoán mò |
| 🔋 Sạc đầy context window | 500.000đ | Refactor cả project mà không bị quên đầu quên đuôi |
| 🚀 Nhà tài trợ kim cương | Tuỳ tâm | Tên bạn được khắc trong một comment // cảm ơn ở VietnameseEngine.swift |
Quét bằng app ngân hàng bất kỳ (VietQR · Napas 247), MoMo hoặc ZaloPay. Bấm vào giá trong bảng để có mã QR điền sẵn số tiền 😉
Không donate cũng không sao: ⭐ star repo cũng là một dạng token tinh thần.