From fa8862b0303efcb7e43e1e2222c9949a10874d8d Mon Sep 17 00:00:00 2001 From: snomiao Date: Fri, 12 Jan 2024 14:27:10 +0000 Subject: [PATCH 01/15] fix(91-english-version): en readme en readme --- .gitignore | 3 +- DevTools/modulesTips.mjs | 2 - bun.lockb | Bin 0 -> 267058 bytes docs/README.en.md | 1107 ++++++++++++++++++++++---------------- docs/translate.ts | 49 +- package.json | 14 +- 6 files changed, 701 insertions(+), 474 deletions(-) create mode 100755 bun.lockb diff --git a/.gitignore b/.gitignore index c6a469a..f6d027c 100644 --- a/.gitignore +++ b/.gitignore @@ -41,4 +41,5 @@ dist/cli.mjs.map .env # logs -*.log \ No newline at end of file +*.log +docs/.vitepress diff --git a/DevTools/modulesTips.mjs b/DevTools/modulesTips.mjs index 0c05ff8..324c4c3 100644 --- a/DevTools/modulesTips.mjs +++ b/DevTools/modulesTips.mjs @@ -1,7 +1,5 @@ import fs from "fs"; import "sno-utils"; -import _ from "lodash-es"; -import pinyin from "pinyin"; import { 表键筛 } from "sno-utils"; const 全部提取 = (s, p) => { return (s.match(RegExp(p, p.flags)) || []).map((e) => { diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..be6830ef5a0c3749bd3a03237ec45759937c42de GIT binary patch literal 267058 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

txfpjit@6_2;C_UfxuS_9~jWFk|YW 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 @@ -39,593 +41,782 @@ CapsLockX is a modular hotkey script engine based on AutoHotkey. Allows you to e --- -## Tutorial 📖 +## Beginner's Quick Start Tutorial 📖 Tutorial + +### Simple Quick Start Tutorial (Completion of this section is considered the beginning of mastering CapsLockX) + +CapsLockX has four core functions: **window management**, **mouse emulation**, **arrow key emulation**, and application-specific hotkeys. This beginner tutorial will teach you the first three core functions. + +First, get CapsLockX: download this zip file: [Download JSDelivrCDN - Release Package.zip](https://cdn.jsdelivr.net/gh/snolab/CapsLockX@gh-pages/CapsLockX-latest.zip) + +After unzipping, open `CapsLockX.exe` within the CapsLockX folder, get past the simple beginner tutorial, and then try out the following functions in the left and right-hand feature areas to understand the capabilities of CapsLockX. + +Once CapsLockX is started, it will **not affect** the functionality of other keys on your keyboard. The following features are triggered only when you press `CapsLockX + combination keys`. + +Left-hand feature area: + +- Window management: `CapsLockX + 1234567890` switches to the `n`th virtual desktop, `CapsLockX + ZXCV` for window operations (window switching, window closing, window arranging, transparency top-most). +- Mouse emulation function: Press `CapsLockX + WASD` to move the mouse (as simple as moving a character while playing a game), press `CapsLockX + QE` for left and right mouse clicks, `CapsLockX + RF` for scrolling up and down. + +Right-hand feature area: + +- Arrow key emulation: Open any text editor (such as Notepad), press `HJKL` to move the cursor, `YOUI` to move the page + +After familiarizing yourself with the basic features, consult the quick reference guide below for more advanced functionalities. + +--- + +## Advanced Reference Manual 🦽 Manual + +### Installation and Use 🛠 Installation + +#### Portable Program Package (for beginners, stable version) 📦 Packaged Bins + +The source code package is the software itself, no need to compile, just unzip and use the green portable software. Source code + program package, the first one is recommended (the fastest). + +1. [Download JSDelivrCDN - Release Package.zip](https://cdn.jsdelivr.net/gh/snolab/CapsLockX@gh-pages/CapsLockX-latest.zip) +2. [Alternative Download CloudFlareCDN - Release Package.zip](https://capslockx.snomiao.com/CapsLockX-latest.zip) +3. [Alternative Download GitHub - Release Package.zip](https://github.com/snolab/CapsLockX/raw/gh-pages/CapsLockX-latest.zip) +4. [Alternative Download GitHub - Repository Program Package.zip](https://github.com/snolab/CapsLockX/archive/master.zip) +5. [Alternative Download BitBucket - Repository Program Package.zip](https://bitbucket.org/snomiao/capslockx/get/master.zip) +6. [Alternative Download for Mainland China Users - Gitee - Repository Program Package.zip (login required)](https://gitee.com/snomiao/CapslockX/repository/archive/master.zip) + +You can use it after unzipping. Methods to start and set to auto-start: Double-click `CapsLockX.exe` to start the script. To add a startup item, enter shell:startup in the start menu - run, then create a shortcut for this program, and throw it in. + +#### Command Line Installation (recommended for advanced users, can be updated automatically) 🖥️ Install by command + +Choose any of the following, the 4th one is recommended for users in mainland China + +1. `npx capslockx@latest`, -- Directly run with NPX, always run the latest version, recommended (requires installation of NodeJS) +2. `choco update capslockx && capslockx` -- Use [Chocolatey](https://community.chocolatey.org/packages/CapsLockX/) to install and use cup for automatic updates, recommended +3. `npm i -g capslockx && npx capslockx` -- npm global installation +4. `git clone https://gitee.com/snomiao/CapslockX && .\CapsLockX\CapsLockX.exe` -- Mainland China source code package (green software package) unzip and use, recommended for mainland China users +5. `git clone https://github.com/snolab/CapsLockX && .\CapsLockX\CapsLockX.exe` -- GitHub source code package (green software package) unzip and use +6. `winget capslockx` -- TODO #40 +7. `scoop capslockx` -- TODO #41 + +## User Manual 📖 - Usage Manual + +### Basic Operations + +- Hold down `CapsLockX` to enter CapsLockX mode, at which point your keyboard will become a functional keyboard like the default mode of Vim (see key positions below). +- Press `CapsLockX+Space` at the same time to lock `CLX` mode, where `CLX` will be maintained until `CapsLockX` is pressed again next time. [Origin of Function](https://github.com/snolab/CapsLockX/issues/21) + +### Module Description + +CapsLockX by default loads some commonly used modules. The features and how to use them are listed below. +If you don't need certain modules, you can also directly delete the `.ahk` files in the `./Modules` directory, and then press `Ctrl + Alt + \` to reload. + +You can also write your own `my-ahk.user.ahk` and put it in the `./User/` directory, and CapsLockX will automatically recognize and load them. + +### Nightmares of Multitasking + +#### Virtual Desktop Overview: Scenario Modes, Work Desks, Entertainment Desks, Project Categories... + +Typically, a set of tasks a user is currently performing will include multiple windows. These windows combined can constitute a usage scenario, while multiple scenarios are likely to run at the same time, and some of them will run for a long time, without interference. This will involve a lot of window arrangement and virtual desktop switching operations, in these aspects, using CLX to manage your windows will bring a terrifying efficiency improvement. -### Simple Entry Tutorial (After reading this section, you would have understood how to use CapsLockX) +Below are some examples of scenario combinations: Suppose you can study, work on several different jobs, chat with friends, play games, listen to BGM in the background, and have a paused movie ready to watch with family in the evening. -CapsLockX has four core functions: **window management**, **mouse simulation**, **arrow key simulation**, and hotkeys within applications. This beginner's tutorial will teach you the first three core functions. +- Virtual desktop 1: Planning scenario: Schedule window + Multi-platform sync notes, e.g.: Google Calendar + Notion + Gmail. +- Virtual desktop 2: Learning scenario: Book reading window, note-taking window, e.g.: OneNote + Calibre, etc. +- Virtual desktop 3: Work scenario 1 (Front-end Development): Code editing + Documentation querying + Browser, e.g.: Chrome(dev) + VSCode + [stackoverflow](https://stackoverflow.com), etc. +- Virtual desktop 4: Work scenario 2 (Back-end Development): Code editing + Documentation querying + Backend terminal + Database browser, e.g.: DBeaver + VSCode(+bash) + [stackoverflow](https://stackoverflow.com), etc. +- Virtual desktop 5: Work scenario 3 (Script Development): Code editing + Documentation querying + Script target, e.g.: VSCode(+bash) + [stackoverflow](https://stackoverflow.com) etc. +- Virtual desktop 6: Work scenario 4 (3D Modeling and Rendering): 3D modeling software + Material searching, e.g.: Blender + Chrome. +- Virtual desktop 7: Work scenario 5 (3D Printing Slicing): Slicing software + Model searching window, e.g.: Cura + [thingiverse](https://thingiverse.com) +- Virtual desktop 7: Work scenario 6 (Video Processing): Editing + Material management, e.g.: PR + Everything. +- Virtual desktop 7: Work scenario 7 (Video Processing): Post-production + Documentation tutorial, e.g.: AE + Chrome. +- Virtual desktop 8: Writing scenario: Writing window, material referencing window, e.g.: Obsidian + Chrome (Google Scholar Index), etc. +- Virtual desktop 9: Communication scenario 1: Casual chats, e.g.: Telegram + Reddit + . +- Virtual desktop 9: Communication scenario 2: Work communication, e.g.: Slack + Skype + Gmail. +- Virtual desktop 9: Communication scenario 3: Presentation, e.g.: Google Meeting + (Vscode | Page application | Requirements document | Feedback document). +- Virtual desktop 0: Entertainment scenario 1: Playing games, e.g.: Age of Empires, Minecraft, Skyrim, Overcooked 2, etc. +- Virtual desktop 0: Entertainment scenario 3: Watching movies, listening to songs, e.g.: PotPlayer, Youtube Music, etc... +- ... More examples are welcome. Provide Issues or PRs for supplementation. -First, get CapsLockX: Download this compressed file: [Download JSDelivrCDN-Publishing Program Package.zip](https://cdn.jsdelivr.net/gh/snolab/CapsLockX@gh-pages/CapsLockX-latest.zip) +Snowstar does not recommend you handle too many tasks at the same time, but CapsLockX can save your thinking environment, greatly reducing the mental cost you incur during task switching, that is, saving you a lot of time rearranging windows and the resulting loss of attention. -After decompressing, open the `CapsLockX.exe` in the CapsLockX folder, skip the simple beginner's tutorial, and then follow the hands-on trial of the left and right functional areas below to understand the functions of CapsLockX. +(Note: If you like to handle many tasks at the same time, you might need not only a computer with not a small amount of memory but also a brain of significant capacity :D ) -After CapsLockX starts, it will **not affect** the functions of other keys on your keyboard. The following features will only be triggered when you press `CapsLockX + combination key`. +#### Enhancing the User Experience of Windows Window Switching - Win+Tab -Left hand functional area: +When switching windows with Alt+Tab, if there are too many windows, a two-dimensional window pre-arrangement display will show up. +Generally speaking, Alt+Tab and Alt+Shift+Tab are purely left-handed keystrokes. If the user wants to select the window in the next line, they will instinctively press Alt+Tab many times. +However, the directional keys used for two-dimensional operations are often ignored because the right hand is usually on the mouse or on the J key. -- Window Management: `CapsLockX + 1234567890` switches to the `n`th virtual desktop, `CapsLockX + ZXCV` for window operations (window switch, close window, arrange windows, transparent top). -- Mouse Simulation function: Press `CapsLockX + WASD` to move the mouse (it's as simple as moving characters in a game), press `CapsLockX + QE` for left and right mouse clicks, `CapsLockX + RF` for wheel scrolling up and down. +Also, users will continue to hold down the Alt key after releasing the Tab key to browse the windows and select the target window to switch to. +In CLX, Alt+WASD will be used instead of the arrow keys to perform multiline window switching directly with the left hand, so there is no need to press Shift to go back to the left. +Moreover, if a user needs to clean up or close multiple windows, they simply press Alt+X to batch clean multiple target windows while remaining within the window browsing interface. -Right hand functional area: +In CLX, these features greatly improve the usability of Alt+Tab. -- Arrow key simulation: Open any editor `HJKL` for cursor movement, `YOUI` for page movement. +#### TODO-Docs -After getting started, if you want to know more functions, you can refer to the quick reference manual below. +

+Click to expand TODO-docs -## Advanced Reference Manual +#### Focus count: Active window, default active window, … -### Installation and Use 🛠 +Each desktop has only one active focus window, and the virtual desktop can achieve automatic switching to the focus window of that virtual desktop when switching to it, achieving multiple task focuses (i.e., active windows). -#### Portable Green Software Package (Suitable for Beginners, Stable Version) 📦 +#### Utilizing Multiple Screens - Multi-screening -The source code package is the software itself, which requires no compilation, purely green and portable, and is ready to use upon extraction. We recommend the first (fastest) source code + program package. +#### Window Arrangement in the Era of 4K - Window arrange with 4k screen -1. [Download JSDelivrCDN-Published Program Package.zip](https://cdn.jsdelivr.net/gh/snolab/CapsLockX@gh-pages/CapsLockX-latest.zip) -2. [Alternative Download CloudFlareCDN-Published Program Package.zip](https://capslockx.snomiao.com/CapsLockX-latest.zip) -3. [Alternative Download from GitHub-Published Program Package.zip](https://github.com/snolab/CapsLockX/raw/gh-pages/CapsLockX-latest.zip) -4. [Alternative Download GitHub-Repository Program Package.zip](https://github.com/snolab/CapsLockX/archive/master.zip) -5. [Alternative Download BitBucket-Repository Program Package.zip](https://bitbucket.org/snomiao/capslockx/get/master.zip) -6. [Alternative Download for Mainland China Users-Gitee-Repository Program Package.zip (Login Required)](https://gitee.com/snomiao/CapslockX/repository/archive/master.zip) +Default window arrangement limitations in Windows 10: -After extraction, it's ready to use. To start and set up autostart: double-click `CapsLockX.exe` to start the script. If you want to add it to startup items, enter shell:startup in the Start menu - Run, then create a shortcut for this program and drop it there. +1. Not applicable to multiple desktops. +2. Unnecessary window gaps are too large. -#### Command Line Installation (Recommended for Advanced Users, Supports Auto Update) 🖥️ +##### Window Management on Linux and Mac - Window Manager in Linux and mac -Choose any of the following, the 2nd option is recommended for users in other regions +TODO: i3 Window Management -1. `npx capslockx`, -- Run directly with NPX to always have the latest version, recommended (NodeJS installation required). -2. `choco update capslockx && capslockx` -- Install with [Chocolatey](https://community.chocolatey.org/packages/CapsLockX/) and use `cup` for auto-updates, recommended. -3. `npm i -g capslockx && npx capslockx` -- npm global install. -4. `git clone https://gitee.com/snomiao/CapslockX && .\CapsLockX\CapsLockX.exe` -- Mainland source code package (green software package) extracted for use, recommended for users in mainland China. -5. `git clone https://github.com/snolab/CapsLockX && .\CapsLockX\CapsLockX.exe` -- GitHub source code package (green software package) extracted for use. -6. `winget capslockx` -- TODO -7. `scoop capslockx` -- TODO +##### Window Management on Android and iOS - Window Manage in android -## 使用手册 📖 +Two system-level solutions: Left-right top-bottom split screen, floating windows; Application level: floating components, - +### Troubles with Editing Operations -- 按住 `CapsLockX` 进入 CapsLockX 模式,此时你的键盘会成为像 Vim 默认模式那样的功能键盘,(键位见下 -- 长按 `CapsLockX` 键将锁定 `CLX` 模式,此时弹起 `CapsLockX` 键将保持 `CLX` 到下一次按下 `CaspLockX` 键为止。[功能由来](https://github.com/snolab/CapsLockX/issues/21) +#### The Distance Between the Typing Area and Editing Control Area -CapsLockX 默认加载了一些常用的模块,功能与使用方法已在下方列出。 -对于不需要的模块,你也可以直接删除 `./Modules` 目录下对应的 `.ahk` 文件,然后按 `Ctrl + Alt + \` 重新加载即可。 +TODO Discussion on ThinkPad and Mac arrow keys, inspiration from VIM, -你也可以编写自己的 `my-ahk.user.ahk` 然后放到 `./User/` 目录下,CapsLockX 会自动识别并加载它们。 +#### The Concept of Chording -### 多任务工作的噩梦 +TODO Various types of chording -#### 单线程大脑、多线程大脑,为什么进行多任务工作? +TODO Calculation of information quantity increase with chording -#### 多窗口的出现,虚拟桌面的出现,整理窗口, 桌面定义,虚拟桌面,Chrome 标签组、…… +### Troubles with the Graphical User Interface -#### 焦点数量:活动窗口、默认活动窗口、…… +TODO: Document: Introduction to mouse simulation function, movement in RPG games -#### 情景模式、工作桌面、娱乐桌面、项目分类 虚拟桌面概述 +### Human Perception of Speed -#### 多屏幕的利用 +TODO: World perception of exponential growth, focus, auditory, visual, tactile, VS conventional linear operations -#### 4K 时代的窗口排列 +### Shortcut Deficiencies in Software -Windows 默认窗口排列限制 +TODO: Application enhancement module introduction -##### Linux 与 Mac 窗口的管理 +### The Usability of Portable Keyboards -##### Android 与 iOS 的窗口管理 +TODO: FN key, arrow keys, editing operations, 61-key layout vs 87-key layout, -### 编辑操作的困扰 +
-#### 键入区与编辑区的疏远 + + + -TODO 漫谈 ThinkPad 与 mac 方向键位、来自 VIM 的灵感 +### Help Module -#### 并击的概念 +If you want to learn how to develop plugins for CapsLockX, please: -TODO 各种类型的并击 +1. Open `Modules/@Help.ahk`, where you can learn the basic format of CapsLockX plugins. +2. Copy it and name it with your own plugin name. +3. Change its original functionality to what you need, and the plugin development is done! -TODO 并击的信息量提升计算 +## Functionality of this module is described below -### 图形界面的困扰 +| Applied to | Key | Function | +| ---------- | --------------------- | ------------------------------------------------- | +| Global | CapsLockX + / | Temporarily display hotkey hints | +| Global | CapsLockX + Alt + / | 🔗 Open the full documentation page for CapsLockX | +| Global | CapsLockX + Shift + / | 🕷 Submit bugs, suggestions, etc. | -TODO:文档:鼠标模拟功能介绍、RPG 游戏的移动 + -### 人类的速度认知 +### Anki Enhancement Module -TODO:指数增长的世界感知,焦点,听力、视觉、触觉,VS 常规线性操作 +Enhanced operations for Anki -### 软件的热键缺陷 +## Common Features/Characteristics -TODO:应用增强模块介绍 +1. Use WASD or HJKL to quickly and continuously (and reversibly) switch between flashcards. +2. Create a word list in Excel with 2 columns, select all, copy, and then press Alt + i in Anki to quickly import the list of words. +3. Simplify the 4 options to 3 directional keys, left for easy, down for medium, right for hard, up to undo. +4. Can be used in conjunction with a gamepad, use XPadder to configure the gamepad joystick to map to the directional keys. For effect, see bilibili [Zhōngèr xuě xīng zěn bèi cí - How can a gamepad not be used for memorizing words!](https://www.bilibili.com/video/av8456838/) -### 便携键盘的可用性 +## Instructions -TODO:FN 键、方向键、编辑操作、61 配列 vs 87 键配列、 +| Mode | Anki Enhancement Module | Description | +| -------------------------- | :---------------------: | ----------------------------------------------------------------------------------------- | +| In Anki-Study Interface | `w or k or ↑` | Press to undo, release to show answer | +| In Anki-Study Interface | `a or h or ←` | Press for easy, release to show answer | +| In Anki-Study Interface | `s or j or ↓` | Press for good, release to show answer | +| In Anki-Study Interface | `d or l or →` | Press for hard, release to show answer | +| In Anki-Study Interface | `q` | Go back to the previous interface | +| In Anki-Study Interface | `c` | Add a new card | +| In Anki-Study Interface | `1 or NumPad1` | Hard (original key position) | +| In Anki-Study Interface | `2 or NumPad2` | Again (original key position) | +| In Anki-Study Interface | `3 or NumPad3` | Good (original key position) | +| In Anki-Study Interface | `4 or NumPad4` | Easy (original key position) | +| In Anki-Study Interface | `5 or NumPad5` | Undo | +| In Anki-Study Interface | `6 or NumPad6` | Suspend card | +| In Anki-Study Interface | `Alt + i` | Quickly import contents from the clipboard (separated by Tab) / e.g., can copy from Excel | +| In Anki-Add Card Interface | `Alt + s` | Press the Add button | - - - + -### 帮助模块 +### OneNote 2016 - 2019 Enhancements -如果你想学习如何开发 CapsLockX 的插件,请: +Simply enhance the keyboard operations in OneNote 2016 - 2019, conveniently use the keyboard to: change pens, create links, organize pages, adjust views... -1. 打开 `Modules/01-Help.ahk` , 你可以了解到 CapsLockX 插件的基本格式 -2. 将它复制一份,命名为你自己的插件名称 -3. 将它本来的功能改成你自己需要的功能,插件的开发就完成啦! +## Common Features of Snowstar Meow -## 本模块功能见下 +1. When making diary entries, first add a date tag to the note title on the note page with `Alt + T` (for future searches), then use the global shortcut `Win + Shift + N` to search for all notes with the tag 'Today' in OneNote. It makes it easy to retrieve your daily records: love diary, training logs, daily reading lists, project reports... In short, writing a diary in OneNote is very convenient, they just pop up with a keystroke, no need to search XD +2. Select a word and press `Alt + K`, and it will list all the related page links underneath that word, to create an index directory, weaving your OneNote into a web. +3. Create a new note, rename it to `My Clipboard`, and when you copy text or pictures, CLX will automatically append them to this note for you, making it easy to collect materials or excerpt articles. +4. Alt + 1234567 for hierarchical folding, easily switch between different levels of abstract thinking. -| 作用于 | 按键 | 功能 | -| ------ | --------------------- | -------------------------------- | -| 全局 | CapsLockX + / | 临时显示热键提示 | -| 全局 | CapsLockX + Alt + / | 🔗 打开 CapsLockX 的完整文档页面 | -| 全局 | CapsLockX + Shift + / | 🕷 提交 bug、建议等 | +## Keyboard Layout Design (Under Development) - +| Key Description | Function | Remarks | +| ---------------------------- | ----------------------------------------- | ---------------------- | +| `All OneNote Hotkeys` | Original functions | | +| `Press Alt then another key` | Trigger OneNote's original menu functions | | +| `Alt + 1234567` | Outline collapse/expand to levels 1-7 | | +| `Alt + qwe asd r` | Tools, change pen, view | | +| `Alt + f` | Find tags | | +| `Alt + -=` | Formula related | | +| `Alt + m` | Move notes, sections | | +| `Alt + hjkl` | Various linking functions | | +| `Alt + zxcv` | Advanced copy-paste | Details in development | +| `Alt + /` | Hotkey help, hints | Under development | +| `F2 F3` | Rename, search notes | | -### 模拟鼠标插件( WASD QERF ) +## Detailed Key Bindings / CheatSheet -> 一直以来,我总是以键盘控自居,应该是在从前做模型的时候伤到了手指关节开始,成为键盘重度用户的。各种键盘加速工具,主动去记住各种快捷键,力求少用鼠标,甚至去学习了 vim 和 emacs。但是,很多时候,鼠标是无可替代的,尤其是在图形界面大行其道时候。 +| Applies To | Hotkey | Function | +| ------------------------------ | ---------------------------- | ------------------------------------------------------------------------------------------------------ | +| Global | `Win + Alt + N` | Open the first page of Quick Notes (compensates for OneNote's lack of a home page concept like Notion) | +| Global | `Win + Shift + N` | Open OneNote and search precisely for today's tag | +| OneNote2019 | `Alt + 1234567` | Outline: Expand or collapse the outline to that level (highly recommended, very useful) | +| OneNote2019 | `F2` | Organize: Rename note | +| OneNote2019 | `Shift + F2` | Organize: Rename section | +| OneNote2019 | `Alt + m` | Organize: Move note | +| OneNote2019 | `Alt + Shift + m` | Organize: Move section | +| OneNote2019 | `Ctrl + n` | Organize: Create new note | +| OneNote2019 | `Ctrl + Alt + n` | Organize: Create new note below current one | +| OneNote2019 | `Alt + Delete` | Organize: Quickly delete current page | +| OneNote2019 | `Ctrl + s` | Organize: Immediately synchronize this notebook | +| OneNote2019 | `Ctrl + w` | Organize: Close window | +| OneNote2019 | `Shift + Delete` | Edit: Quickly delete current line | +| OneNote2019 | `Alt + -` | Edit: Auto-convert equations to 2D | +| OneNote2019 | `Alt + k` | Edit: ⭐🔗 Expand links to pages related to the current keyword (fast keyword one-to-many linking) | +| OneNote2019 | `Alt + n` | Style: Switch page to colorless background | +| OneNote2019 | `Alt + v` | Style: Change text background color | +| OneNote2019 | `Alt + q` | Tool: Dragging | +| OneNote2019 | `Alt + w` | Tool: Latch | +| OneNote2019 | `Alt + e` | Tool: Eraser | +| OneNote2019 | `Alt + s` | Tool: Input | +| OneNote2019 | `Alt + a` | Tool: Switch to second pen | +| OneNote2019 | `Alt + d` | Tool: Open pen tray (select pen with arrow keys (currently ineffective fullscreen)) | +| OneNote2019 | `Alt + d -> 1234567` | Tool: Open pen tray (then select the 1st row x pen) (currently ineffective fullscreen) | +| OneNote2019 | `Alt + d -> Shift + 1234567` | Tool: Open pen tray (then select the 2nd row x pen) (currently ineffective fullscreen) | +| OneNote2019 | `Alt + r` | View: Zoom to original size | +| OneNote2019 | `Alt + y` | View: Zoom to page width | +| OneNote2019 | `^!+- or ^!+=` | View: Zoom out or zoom in page | +| OneNote2019 | `Alt + f` | View: Search for tags | +| OneNote2019 | `Alt + t` | Edit: Add the date tag to the note, e.g., (20220717) | +| OneNote2019 | `Ctrl + Shift + c` | Edit: Copy (plain text) | +| OneNote2019 | `Ctrl + Shift + v` | Edit: Paste (plain text) | +| OneNote2019 Create Link Window | `Alt + s` | Edit: Copy links to all search result pages | +| OneNote2019 Create Link Window | `Alt + Shift + s` | Edit: Copy and paste links to all search result pages | +| OneNote2019 Clipboard Note | `Ctrl + C` | Edit: ⭐ Append copied content to the note with "Clipboard" or "剪贴板" in its name | + + + +### Xunfei Input Method Floating Window Plugin + +#### Usage + +| Applies To | Key | Function Description | +| ---------- | :-----: | ---------------------------------- | +| Global | Win + H | Start/Switch to Xunfei Voice Input | + +#### Notes + +1. The original `Win + H` function is Windows' built-in dictation. After installing this plugin, you can use the original Windows dictation with `Win + Shift + H`. +2. If Xunfei voice is not installed, it will automatically ask whether to guide the download and installation. + +#### Effect is shown in the following image + +![App-Xunfei Voice Input Method Floating Window Demo.gif](./media/App-Xunfei Voice Input Method Floating Window Demo.gif) + + + +### CLX - Brainstorm + +At any time, in any input field, press the `CLX+b` key to start using AI-assisted typing. + +#### Key Layout (Under Development) + +| Key Description | Function | Note | +| --------------- | -------------------------------------------------------------------------------------------------- | ---- | +| CLX + b | Automatically copy the current selection, enter a command, and let AI assist your typing | | +| CLX + Alt + b | Configure activation code (currently only a free plan, more features might be added in the future) | | +| CLX + Shift + b | Check usage quota | | + +#### Protips: + +##### Organize meeting minutes anytime + +1. In any input box, use Win+H to call out voice input, then speak the text you want, no need for precision, just convey the general idea. +2. Then select all and press `CLX+b`, enter `List key points and to-do items`, and you can see the key points and to-do items automatically organized by AI. + +##### Translate any language to any language at any time + +1. In any input box, select the text you want to translate. +2. Then select all and press `CLX+b`, enter `to chinese:`, and AI will automatically input it in Chinese. + + + +### Editing Enhancement Plugin (TG YUIO HJKL) 🌟 + +Is there anything better in the world than Vim mode's HJKL cursor movement? There must be! +That's the accelerated HJKL smooth editing experience! Want to try letting your cursor perform a high-end maneuver like speeding around a drain? Install it! -—— 以上是来自 [SimClick 模拟点击](https://github.com/rywiki/simclick) 作者的一段话,这是一款以网格细分方式模拟鼠标的作品,可以与本项目互补 +![EditorCursorMovement.gif](./media/EditorCursorMovement.gif) -—— 由 [秦金伟](http://rsytes.coding-pages.com/) 推荐 +| Scope | Edit Module | Description | +| ---------------- | --------------------- | ---------------------------------------------------------------- | +| Global(Basic) | `CapsLockX + h j k l` | Arrow keys: up, down, left, right | +| Global(Basic) | `CapsLockX + y o` | Home End | +| Global(Basic) | `CapsLockX + u i` | PageUp PageDown | +| Global(Basic) | `CapsLockX + [ ]` | Shift+Tab and Tab | +| Global(Basic) | `CapsLockX + g` | Enter | +| Global(Advanced) | `CapsLockX + t` | Delete | +| Global(Advanced) | `CapsLockX + hl` | Press hl together to select the current word | +| Global(Advanced) | `CapsLockX + kj` | Press kj together to select the current line | +| Global(Advanced) | `CapsLockX + h + t` | Move and delete: In most cases, it can replace the backspace key | -## 功能 + -- 本模块使用按键区:CapsLockX + QWER ASDF -- 非常舒适地使用 WASD QE RF 来模拟【完整的】鼠标功能,相信我,试过这种手感之后,你会喜欢上它的。 -- 指针移动时会自动黏附各种按钮、超链接。滚轮的指数级增长的加速度滚动机制使你再也不惧怕超级长的文章和网页。 -- 效果如图: - ![鼠标模拟.gif](./media/鼠标模拟.gif) +### Surface Laptop Function Key Expansion -## 使用方法如下 +Cures all kinds of broken laptop keyboards -| 作用于 | 按键 | 说明 | -| ------ | ------------------------------------- | ---------------------------------------- | -| 全局 | `CapsLockX + w a s d` | 鼠标移动(上下左右) | -| 全局 | `CapsLockX + ad` | 将 HJKL 键切换到滚轮模式(上下左右滚动) | -| 全局 | `CapsLockX + r f` | 垂直滚轮(上下) | -| 全局 | `CapsLockX + Shift + r f` | 水平滚轮(左右) | -| 全局 | `CapsLockX + Ctrl + Alt + r f` | 垂直滚轮自动滚动(上 下) | -| 全局 | `CapsLockX + Ctrl + Alt + Shift+ r f` | 水平滚轮自动滚动(左 右) | -| 全局 | `CapsLockX + rf` | rf 同时按相当于鼠标中键 | -| 全局 | `CapsLockX + e` | 鼠标左键 | -| 全局 | `CapsLockX + q` | 鼠标右键 | +1. No right Ctrl key? Combine Menu with right Ctrl, Menu can be used as Ctrl or Ctrl as Menu. +2. No Pause key? Win + Alt + P can also open system settings info. +3. To be supplemented -## 操作细节 +| Mode | Key | Function | +| -------------------------- | :---------------------------------------------------------- | -------------------------------------------------------------- | +| Global | Win + Alt + P | Equivalent to Win + Pause, designed for notebooks | +| Global | Press right Ctrl briefly | Presses Menu to pop up the menu | +| Global | Hold right Menu | Holding will press Ctrl, which can be combined with other keys | +| Win key simulation enabled | Hold ] while pressing [ | Equivalent to pressing the Win key | +| Win key simulation enabled | RAlt+\| is equivalent to pressing Alt+Tab on the right hand | -快速连按 AD 步进 + - +### Media Keys Module -### 编辑增强插件( TG YUIO HJKL ) +| Applies To | Media Keys Module | Description | +| ---------- | ----------------- | ----------------------------------------------------- | +| Global | `CapsLockX + F1` | Open: My Computer | +| Global | `CapsLockX + F2` | Open: Calculator | +| Global | `CapsLockX + F3` | Open: Browser homepage | +| Global | `CapsLockX + F4` | Open: Media library (default is Windows Media Player) | +| Global | `CapsLockX + F5` | Playback: Pause/Play | +| Global | `CapsLockX + F6` | Playback: Previous track | +| Global | `CapsLockX + F7` | Playback: Next track | +| Global | `CapsLockX + F8` | Playback: Stop | +| Global | `CapsLockX + F9` | Volume up | +| Global | `CapsLockX + F10` | Volume down | +| Global | `CapsLockX + F11` | Mute | -这个世界上还有比 Vim 模式的 HJKL 移动光标更棒的东西吗? -这个必须有! -那就是带加速度的 HJKL 流畅编辑体验!想不想试试让你的光标来一次排水沟过弯的高端操作?装它! + -![光标移动.gif](./media/光标移动.gif) +### Simulated Mouse Plugin (WASD QERF) -| 作用域 | Edit 模块 | 说明 | -| ---------- | --------------------- | -------------------------------- | -| 全局(基本) | `CapsLockX + h j k l` | 上下左右 方向键 | -| 全局(基本) | `CapsLockX + y o` | Home End | -| 全局(基本) | `CapsLockX + u i` | PageUp PageDown | -| 全局(基本) | `CapsLockX + g` | 回车 | -| 全局(进阶) | `CapsLockX + t` | Delete | -| 全局(进阶) | `CapsLockX + hl` | hl 一起按选择当前词 | -| 全局(进阶) | `CapsLockX + kj` | kj 一起按选择当前行 | -| 全局(进阶) | `CapsLockX + h + t` | 移位后删:大部分情况可代替退格键 | +> I have always prided myself on being a keyboard enthusiast, probably starting when I injured my finger joints while working on models, becoming a heavy keyboard user. Various keyboard acceleration tools, actively remembering various shortcuts, trying to use the mouse less, even learning vim and emacs. But many times, the mouse is irreplaceable, especially when graphical interfaces are prevalent. - +—— The above is a quote from the author of [SimClick](https://github.com/rywiki/simclick), a project for simulating mouse actions through grid partitioning, which can complement this project. -### 窗口增强插件 (CLX + 1234567890 ZXCV) +—— Recommended by [Qin Jinwei](http://rsytes.coding-pages.com/) -## 功能简述 +## Features -用好 Win 10 自带的 10 个虚拟桌面豪华配置、多显示器自动排列窗口、半透明置顶、(注:任务栏和 AltTab 相关功能暂不兼容 Win11,窗口排列功能正常。) +- This module uses the key area: CapsLockX + QWER ASDF +- Very comfortably use WASD QE RF to simulate [full] mouse functionality, believe me, after trying this feel, you'll love it. +- The pointer automatically sticks to various buttons, hyperlinks when moved. The wheel's exponentially accelerating scrolling mechanism means you'll no longer fear super long articles and web pages. +- The effect is shown in the image: + ![CLX-Mouse.gif](./media/CLX-Mouse.gif) -1. 窗口切换:`CapsLockX + [Shift] + Z` -2. 窗口关闭:`CapsLockX + [Shift] + X` -3. 窗口排列:`CapsLockX + [Shift] + C` -4. 窗口置顶:`CapsLockX + [Shift] + V` -5. 左手窗口管理:在 `Alt + Tab` 的界面,用 `WASD` 切换窗口,`X` 关掉窗口。 -6. 高效使用虚拟桌面:`CapsLockX + 0123456789` 切换、增减虚拟桌面,加上 `Shift` 键可以转移当前窗口 -7. 虚拟机与远程桌面快速脱离:双击左边 `Shift + Ctrl + Alt`。 +## Instructions for Use -## 效果图 +| Applies to | Key Combination | Description | +| ---------- | ------------------------------------- | ------------------------------------------------------------- | +| Global | `CapsLockX + w a s d` | Mouse movement (up, down, left, right) | +| Global | `CapsLockX + ad` | Toggle HJKL keys to wheel mode (scroll up, down, left, right) | +| Global | `CapsLockX + r f` | Vertical scroll wheel (up, down) | +| Global | `CapsLockX + Shift + r f` | Horizontal scroll wheel (left, right) | +| Global | `CapsLockX + Ctrl + Alt + r f` | Auto vertical scroll (up, down) | +| Global | `CapsLockX + Ctrl + Alt + Shift+ r f` | Auto horizontal scroll (left, right) | +| Global | `CapsLockX + rf` | Pressing rf together is equivalent to the middle mouse button | +| Global | `CapsLockX + e` | Left mouse button | +| Global | `CapsLockX + q` | Right mouse button | -- Alt + Tab 管理窗口增强 - ![02-插件-窗口增强_Alt+Tab+WASD管理窗口.gif](./02-插件-窗口增强_Alt+Tab+WASD管理窗口.gif) -- CapsLockX + C 一键排列窗口(这 GIF 是旧版本录的看起来比较卡,新版本优化过 API 就不卡了) - ![02-插件-窗口增强_一键排列窗口.gif](./media/02-插件-窗口增强_一键排列窗口.gif) +## Operation Details -## 使用方法如下 ( Alt+Tab 与 CapsLockX ) +Quick tap AD for stepping -| 作用域 | 窗口增强模块 | 说明 | -| ------------ | ------------------------------------- | ------------------------------------------ | -| Alt+Tab 界面 | `Q E` | 左右切换多桌面 | -| Alt+Tab 界面 | `W A S D` | 上下左右切换窗口选择 | -| Alt+Tab 界面 | `X C` | 关闭选择的窗口(目前 X 和 C 没有区别) | -| Win+Tab 视图 | `Alt + W A S D` | 切换窗口选择 | -| 全局 | `Win + [Shift] + b` | 定位到托盘或任务栏任务 | -| 全局 | `Win + Shift + hjkl` | 在窗口之间按方向切换焦点 | -| 任务栏 | `Ctrl + W 或 Delete` | 在托盘图标或任务栏任务上,选择退出按钮 | -| 全局 | `CapsLockX + 1 2 ... 9 0` | 切换到第 1 .. 12 个桌面 | -| 全局 | `CapsLockX + Shift + 1 2 ... 9 0 - =` | 把当前窗口移到第 n 个桌面(如果有的话) | -| 全局 | `CapsLockX + Alt + Backspace` | 删除当前桌面(会把所有窗口移到上一个桌面) | -| 全局 | `CapsLockX + C` | 快速排列当前桌面的窗口 | -| 全局 | `CapsLockX + Ctrl + C` | 快速排列当前桌面的窗口(包括最小化的窗口) | -| 全局 | `CapsLockX + Shift + C` | 快速堆叠当前桌面的窗口 | -| 全局 | `CapsLockX + Shift + Ctrl + C` | 快速堆叠当前桌面的窗口(包括最小化的窗口) | -| 全局 | `CapsLockX + Shift + [ ]` | 把当前窗口移到上一个/下一个桌面 | -| 全局 | `CapsLockX + Z` | 循环切到最近使用的窗口 | -| 全局 | `CapsLockX + Shift + Z` | 循环切到最不近使用的窗口 | -| 全局 | `CapsLockX + X` | 关掉当前标签页 Ctrl+W | -| 全局 | `CapsLockX + Shift + X` | 关掉当前窗口 Alt+F4 | -| 全局 | `CapsLockX + V` | 让窗口透明 | -| 全局 | `CapsLockX + Shift + V` | 让窗口保持透明(并置顶) | -| 任意窗口 | `双击左边 Shift+Ctrl+Alt` | 后置当前窗口, \* 见下方注 | - -\*注: 双击左边 Shift+Ctrl+Alt 设计用于远程桌面与虚拟机,使其可与本机桌面窗口同时显示。 -例如 mstsc.exe、TeamViewer、VirtualBox、HyperV、VMWare 等远程桌面或虚拟机程序,配合 CapsLockX + Shift + V 透明置顶功能,让你在 Windows 的界面上同时使用 Linux 界面或 MacOS 界面再也不是难题。 - -此处借用 [@yangbin9317 的评论](https://v2ex.com/t/772052#r_10458792) - -> 以 CapsLock 为抓手,打通底层逻辑,拉齐 Windows 和 Linux WM,解决了 Windows 难用的痛点 - -(20220313) 对于两端都是 Windows 的情况,也可以考虑使用 [RemoteApp Tool - Kim Knight](http://www.kimknight.net/remoteapptool) 来代替远程桌面。 - - - -### JavaScript 计算 (建议安装 NodeJS ) - -| 作用于 | 按键 | 效果 | -| ------ | --------------- | -------------------------------------- | -| 全局 | `CapsLockX + -` | 计算当前选区 JavaScript 表达式,并替换 | -| 全局 | `CapsLockX + =` | 计算当前选区 JavaScript 表达式,并替换 | - - - -### Surface 笔记本扩充功能键 - -专治各种笔记本残破键盘 - -1. 没有右 Ctrl 键?合并 Menu 与 右 Ctrl 键,Menu 当 Ctrl 用 或者 Ctrl 当 Menu 用都可以 -2. 没有 Pause 键?Win + Alt + P 也能打开系统设定信息。 -3. 待补充 - -| 模式 | 按键 | 功能 | -| ---------------- | :------------------------------------ | ---------------------------------- | -| 全局 | Win + Alt + P | 相当于 Win + Pause,专为笔记本定制 | -| 全局 | 右 Ctrl 按一下 | 会按一下 Menu 弹出菜单 | -| 全局 | 按住右 Menu | 会按住 Ctrl,此时可以与其它键组合 | -| Win 键模拟启用后 | ] 按住同时,[ 按下 | 相当于按 Win 键 | -| Win 键模拟启用后 | RAlt+\| 相当于按 Alt+Tab 只不过在右手 | - - - -### 快捷输入 - -| 模式 | 快捷输入 | 说明 | -| ---- | -------- | ----------------------------------------------- | -| 全局 | `#D#` | 日期输入:`(20220217)` | -| 全局 | `#T#` | 时间输入:`(20220217.220717)` | -| 全局 | `#DT#` | 日期时间输入:`2022-02-17 22:07:33` | -| 全局 | `#NPW#` | 随机输入数字密码如: `7500331260229289` | -| 全局 | `#PW#` | 随机输入数字字母密码如: `yyCTCNYodECTLr2h` | -| 全局 | `#WPW#` | 随机输入数字字母密码如: `FtD5BB1m5H98eY7Y` | -| 全局 | `#SPW#` | 随机输入数字字母符号密码如: `/})y+xK]z~>XKQ+p` | - - - -### Anki 增强模块 - -| 模式 | Anki 增强模块 | 说明 | -| -------------------- | :-------------: | ----------------------------------------------------------- | -| 在 Anki-学习界面 | `w 或 k 或 ↑` | 按下=撤销,松开显示答案 | -| 在 Anki-学习界面 | `a 或 h 或 ←` | 按下=顺利,松开显示答案 | -| 在 Anki-学习界面 | `s 或 j 或 ↓` | 按下=困难,松开显示答案 | -| 在 Anki-学习界面 | `d 或 l 或 →` | 按下=生疏,松开显示答案 | -| 在 Anki-学习界面 | `q` | 返回上个界面 | -| 在 Anki-学习界面 | `c` | 添加新卡片 | -| 在 Anki-学习界面 | `1 或 NumPad1 ` | 困难(原键位不动) | -| 在 Anki-学习界面 | `2 或 NumPad2 ` | 生疏(原键位不动) | -| 在 Anki-学习界面 | `3 或 NumPad3 ` | 一般(原键位不动) | -| 在 Anki-学习界面 | `4 或 NumPad4 ` | 顺利(原键位不动) | -| 在 Anki-学习界面 | `5 或 NumPad5 ` | 撤销 | -| 在 Anki-学习界面 | `6 或 NumPad6 ` | 暂停卡片 | -| 在 Anki-学习界面 | `Alt + i` | 快速导入剪贴版的内容(按 Tab 分割) / 比如可以从 Excel 复制 | -| 在 Anki-添加卡片界面 | `Alt + s` | 按下 添加 按钮 | - -> 此插件可配合手柄使用,使用 XPadder 配置手柄摇杆映射到方向键即可。 -> -> 效果请见 bilibili [中二雪星怎背词 - 手柄怎么可以不用来背单词!](https://www.bilibili.com/video/av8456838/) - - - -### OneNote 2016 - -我很确定我们用的不是同一个 OneNote,因为,你没有装 CapsLockX ! - -## 按键分布设计(开发中) - -| 按键描述 | 作用 | 备注 | -| ----------------------- | ----------------------- | ---------- | -| `所有 OneNote 自带热键` | 原功能 | | -| `按一下 Alt 再按别的` | 触发 OneNote 原菜单功能 | | -| `Alt + 1234567` | 大纲折叠展开到 1-7 层级 | | -| `Alt + qwe asd r` | 工具、换笔、视图 | | -| `Alt + f` | 查找标签 | | -| `Alt + -=` | 公式相关 | | -| `Alt + m` | 移动笔记、分区 | | -| `Alt + hjkl` | 各种链接功能 | | -| `Alt + zxcv` | 高级复制粘贴 | 细节开发中 | -| `Alt + /` | 热键帮助、提示 | 开发中 | -| `F2 F3` | 重命名、查找笔记 | | - -## 详细按键表 / CheatSheet - -| 作用于 | 格式热键 | 功能 | -| ------------------------ | ------------------------------ | ------------------------------------------------------------------------- | -| 全局 | `Win + Alt + N` | 打开快速笔记第一页(弥补 OneNote 原本没有像 Notion 一样的首页概念的不足) | -| 全局 | `Win + Shift + N` | 打开 OneNote 并精确搜索 | -| OneNote2016 | `Alt + 1234567` | 大纲:大纲折叠展开到那层(强烈推荐,超好用) | -| OneNote2016 | `Ctrl + Shift + c` | 转换:复制(纯文本) | -| OneNote2016 | `Ctrl + Shift + v` | 转换:粘贴(纯文本) | -| OneNote2016 | `F2` | 整理:重命名笔记 | -| OneNote2016 | `Shift + F2` | 整理:重命名分区 | -| OneNote2016 | `Alt + m` | 整理:移动笔记 | -| OneNote2016 | `Alt + Shift + m` | 整理:移动分区 | -| OneNote2016 | `Ctrl + n` | 整理:新建笔记 | -| OneNote2016 | `Ctrl + Alt + n` | 整理:在当前笔记下方新建笔记 | -| OneNote2016 | `Alt + Delete` | 整理:快速删除当前页面 | -| OneNote2016 | `Ctrl + s` | 整理:立即同步此笔记本 | -| OneNote2016 | `Ctrl + w` | 整理:关闭窗口 | -| OneNote2016 | `Shift + Delete` | 编辑:快速删除当前行 | -| OneNote2016 | `Alt + -` | 编辑:自动 2 维化公式 | -| OneNote2016 | `Alt + k` | 编辑:展开当前关键词的相关页面链接(快速关键词一对多链接) | -| OneNote2016 | `Alt + n` | 样式:切换页面为无色背景 | -| OneNote2016 | `Alt + v` | 样式:改变文字背景色 | -| OneNote2016 | `Alt + q` | 工具:拖动 | -| OneNote2016 | `Alt + w` | 工具:套锁 | -| OneNote2016 | `Alt + e` | 工具:橡皮 | -| OneNote2016 | `Alt + s` | 工具:输入 | -| OneNote2016 | `Alt + a` | 工具:换到第 2 支笔 | -| OneNote2016 | `Alt + d` | 工具:打开换笔盘(然后可可方向键选笔 (目前全屏无效) | -| OneNote2016 | `Alt + d 然后 1234567` | 工具:打开换笔盘(然后选第 1 行第 x 支笔) (目前全屏无效) | -| OneNote2016 | `Alt + d 然后 Shift + 1234567` | 工具:打开换笔盘(然后选第 2 行第 x 支笔) (目前全屏无效) | -| OneNote2016 | `Alt + r` | 视图:缩放到原始大小 | -| OneNote2016 | `Alt + y` | 视图:缩放到页面宽度 | -| OneNote2016 | `^!+- 或 ^!+=` | 视图:缩小页面 或 放大页面 | -| OneNote2016 | `Alt + f` | 视图:搜索标记 | -| OneNote2016 创建链接窗口 | `Alt + s` | 转换:复制当前所有搜索结果页面的链接 | -| OneNote2016 创建链接窗口 | `Alt + Shift + s` | 转换:复制当前所有搜索结果页面的链接并粘贴 | -| `剪贴板` 笔记打开时 | `Ctrl + C` | 转换:追加复制的内容到该笔记 | -| `Clipboard` 笔记打开时 | `Ctrl + C` | 转换:追加复制的内容到该笔记 | - - - -### 讯飞输入法悬浮窗插件 - -## 用法 - -| 作用于 | 按键 | 功能说明 | -| ------ | :-------------: | --------------------- | -| 全局 | `Win + Alt + H` | 启动/切换讯飞语音输入 | - -## 注 - -1. 原 `Win + H` 的功能是 Windows 自带听写,安装本插件后,可通过 `Win + Shift + H` 使用原 Windows 的听写 -2. 若没有安装讯飞语音则会自动询问是否引导下载安装 - -## 效果如下图 - -![应用-讯飞语音输入法悬浮窗演示.gif](./media/应用-讯飞语音输入法悬浮窗演示.gif) - - - -### 媒体键模块 - -| 作用于 | 媒体键模块 | 说明 | -| ------ | ----------------- | ------------------------------------------- | -| 全局 | `CapsLockX + F1` | 打开:我的电脑 | -| 全局 | `CapsLockX + F2` | 打开:计算器 | -| 全局 | `CapsLockX + F3` | 打开:浏览器主页 | -| 全局 | `CapsLockX + F4` | 打开:媒体库(默认是 Windows Media Player) | -| 全局 | `CapsLockX + F5` | 播放:暂停/播放 | -| 全局 | `CapsLockX + F6` | 播放:上一首 | -| 全局 | `CapsLockX + F7` | 播放:下一首 | -| 全局 | `CapsLockX + F8` | 播放:停止 | -| 全局 | `CapsLockX + F9` | 音量加 | -| 全局 | `CapsLockX + F10` | 音量减 | -| 全局 | `CapsLockX + F11` | 静音 | - - - -### 番茄时钟 - -25 分钟固定循环休息提醒。 - -使用 CapsLockX + M 打开配置,然后修改 EnableScheduleTasks=1 即可启用本插件。 - -- 使用番茄报时(00 分和 30 分播放工作铃声,每小时的 25 分和 55 分播放休息铃声)(需要先开启定时任务) - - ```ini + + +### JavaScript Evaluation (NodeJS installation recommended) + +| Applies to | Hotkey | Effect | +| ---------- | --------------- | --------------------------------------------------------------------------------- | +| Global | `CapsLockX + -` | Calculate and replace the current selection with the JavaScript expression result | +| Global | `CapsLockX + =` | Calculate and replace the current selection with the JavaScript expression result | + + + +### Window Enhancement Plugin (CLX + 1234567890 ZXCV) + +## Feature Overview + +Make the most of Win 10's luxurious configuration with 10 built-in virtual desktops, automatic window arrangement for multi-monitors, translucent always-on-top (Note: Taskbar and AltTab related features are temporarily incompatible with Win11, but window arrangement functions normally.) + +1. Window Switching: `CapsLockX + [Shift] + Z` +2. Window Closing: `CapsLockX + [Shift] + X` +3. Window Arrangement: `CapsLockX + [Shift] + C` +4. Always On Top: `CapsLockX + [Shift] + V` +5. Left-Handed Window Management: In the `Alt + Tab` interface, use `WASD` to switch windows, and `X` to close a window. +6. Efficient Use of Virtual Desktops: `CapsLockX + 0123456789` to switch, add or remove virtual desktops; use the `Shift` key to transfer the current window. +7. Quick Release from Virtual Machines and Remote Desktops: Double click the left `Shift + Ctrl + Alt`. + +## Effect Picture + +- Enhanced Alt+Tab Window Management + ![02-Plugin-Enhanced Window Management_Alt+Tab+WASD Window Management.gif](./02-Plugin-Enhanced Window Management_Alt+Tab+WASD Window Management.gif) +- CapsLockX + C to arrange windows with one click (This GIF was recorded on an older version which looks a bit laggy, but the new version has optimized the API so it's not laggy anymore) + ![02-Plugin-Enhanced Window Management_One-Click Arrange Windows.gif](./media/02-Plugin-Enhanced Window Management_One-Click Arrange Windows.gif) + +## Usage Instructions ( Alt+Tab and CapsLockX ) + +| Scope | Window Enhancement Module | Description | +| ------------ | ------------------------------------- | ------------------------------------------------------------------------ | +| Alt+Tab UI | `Q E` | Switch between virtual desktops left and right | +| Alt+Tab UI | `W A S D` | Switch window selection up, down, left, and right | +| Alt+Tab UI | `X C` | Close the selected window (currently no difference between X and C) | +| Win+Tab View | `Alt + W A S D` | Switch window selection | +| Global | `Win + [Shift] + B` | Navigate to system tray tasks (Windows native hotkey) | +| Global | `Win + [Shift] + T` | Navigate to taskbar tasks (Windows native hotkey) | +| Global | `Win + Shift + hjkl` | Switch focus between windows in direction | +| Taskbar | `Ctrl + W or Delete` | Choose the exit button on the tray icon or taskbar task | +| Global | `CapsLockX + 1 2 ... 9 0` | Switch to desktop 1 .. 12 | +| Global | `CapsLockX + Shift + 1 2 ... 9 0 - =` | Move the current window to the nth desktop (if available) | +| Global | `CapsLockX + Alt + Backspace` | Delete current desktop (all windows moved to previous desktop) | +| Global | `CapsLockX + C` | Quickly arrange windows on current desktop | +| Global | `CapsLockX + Ctrl + C` | Quickly arrange windows on current desktop (including minimized windows) | +| Global | `CapsLockX + Shift + C` | Quickly stack windows on current desktop | +| Global | `CapsLockX + Shift + Ctrl + C` | Quickly stack windows on current desktop (including minimized windows) | +| Global | `CapsLockX + Z` | Cycle to most recently used window | +| Global | `CapsLockX + Shift + Z` | Cycle to least recently used window | +| Global | `CapsLockX + X` | Close current tab Ctrl+W | +| Global | `CapsLockX + Shift + X` | Close current window Alt+F4 | +| Global | `CapsLockX + V` | Make window transparent | +| Global | `CapsLockX + Shift + V` | Keep window transparent (and topmost) | +| Any window | `Double-click Left Shift+Ctrl+Alt` | Send current window to back, \* see note below | + +\*Note: Double-clicking Left Shift+Ctrl+Alt is designed for remote desktops and virtual machines, allowing simultaneous display with the host desktop windows. +For example, with programs like mstsc.exe, TeamViewer, VirtualBox, HyperV, VMWare, and other remote desktop or virtual machine software, combined with the CapsLockX + Shift + V transparency and topmost feature, using interfaces like Linux or MacOS on Windows is no longer a challenge. + +This reference uses [@yangbin9317's comment](https://v2ex.com/t/772052#r_10458792) + +> Using CapsLock as the interface, it bridges the underlying logic, aligns Windows with Linux WM, and solves the pain points of Windows. + +(20220313) For scenarios where both ends are Windows, you can also consider using [RemoteApp Tool - Kim Knight](http://www.kimknight.net/remoteapptool) as a substitute for remote desktop. + + + +### Quick Input + +| Mode | Quick Input | Description | +| ------ | ----------- | ------------------------------------------------------------------------------ | +| Global | `#D#` | Date input: `(20220217)` | +| Global | `#T#` | Time input: `(20220217.220717)` | +| Global | `#DT#` | Date and time input: `2022-02-17 22:07:33` | +| Global | `#NPW#` | Randomly input a numeric password like: `7500331260229289` | +| Global | `#PW#` | Randomly input a numeric and letter password like: `yyCTCNYodECTLr2h` | +| Global | `#WPW#` | Randomly input a numeric and letter password like: `FtD5BB1m5H98eY7Y` | +| Global | `#SPW#` | Randomly input a numeric, letter, and symbol password like: `/})y+xK]z~>XKQ+p` | + + + +### Pomodoro Timer + +25 minutes fixed cycle for rest reminders. + +Use `CapsLockX + ,` to open the configuration, then change EnableScheduleTasks=1 to enable this plugin. + +- Use Pomodoro chime (play a working bell sound at 00 and 30 minutes, and a rest bell sound at 25 and 55 minutes of every hour) (schedule tasks must first be enabled) + +```ini UseTomatoLife=1 - ``` +``` -- 使用番茄报时时,自动切换桌面(使用番茄报时时,自动切换桌面(休息桌面为 1,工作桌面为 2) +- When using Pomodoro chime, automatically switch desktops (rest desktop is 1, work desktop is 2) - ```ini +```ini UseTomatoLifeSwitchVirtualDesktop=1 - ``` +``` + +Note: If you only need the sound and do not need to automatically switch desktops, you can also try this Chrome plugin [Tomato Life - Chrome Web Store](https://chrome.google.com/webstore/detail/25min-tomato-life/kkacpbmkhbljebmpcopjlgfgbgeokbhn) + +Note: This plugin has been separated into an independent project, if you like the Pomodoro technique you can refer to the snow star's tomato-life project: [snomiao/tomato-life](https://github.com/snomiao/tomato-life) -注:如果只需要声音而不需要自动切换桌面的话,也可试试这款 Chrome 插件 [Tomato Life - Chrome 网上应用店](https://chrome.google.com/webstore/detail/25min-tomato-life/kkacpbmkhbljebmpcopjlgfgbgeokbhn) + -注注: 本插件已经分离出一个独立项目,如果你喜欢番茄工作法的话可以参见雪星的 tomato-life 项目: [snomiao/tomato-life](https://github.com/snomiao/tomato-life) +### Auto Turn Off Screen When Locking - +When pressing Win + L to lock the screen, immediately turn off the screen. This is suitable for automatically turning off the computer screen when preparing to sleep, so that it does not dazzle during the night... -## 过去与未来 🛰 + -### 制作背景 ( 2017 年秋) 🍁 +## Past and Future 🛰 -> 本人比较经常写代码… -> 起初我习惯右手用鼠标……后来觉得鼠标放右边有点远……改成了左手用鼠标 -> 左手用鼠标之后发现手还是要离开键盘……于是做了个 WASD 模拟鼠标的脚本。(然后就能一直用右手托着下巴玩电脑了) -> 后来写的脚本越来越多,就把其中一些常用的放到一起加载…… +### Production Background (Autumn of 2017) 🍁 Background -### 发展路线 🛰️ +> I often write code… +> At first, I was used to using the mouse with my right hand... later I found it a bit far to put the mouse on the right... so I switched to using the mouse with my left hand. +> After switching to the left hand, I realized I still had to take it off the keyboard... so I made a script that simulates the mouse with the WASD keys. (Then I could keep playing with the computer with my right hand under my chin) +> Later I wrote more and more scripts and put some of the common ones together to load... -本项目的核心理念是:简化系统操作逻辑,提升操作效率,且不与原有习惯键位冲突。 +### Development RoadMap 🛰️ RoadMap -1. [x] 按 CapsLockX + / 键显示对应帮助(目前的显示样式相当草率) -2. [ ] 自动更新(虽然 git pull 一下也不是不行) -3. [ ] 初次使用上手教程(这个现在有点简陋……) -4. [ ] 插件管理器(虽然文件系统也可以搞定) -5. [ ] 自动配置同步功能(虽然一般来说扔 onedrive 就够) -6. [ ] 易用的选项配置的 UI 界面(虽然改 ini 也不是什么难事) -7. [ ] 执行外部代码(Python、Nodejs、外部 AHK、Bash、……)(虽然写个脚本 run 一下也并不算麻烦) +The core philosophy of CapsLockX is to simplify system operation logic, improve operation efficiency, and not conflict with existing habitual key positions. -如果你有任何想法或建议,请在这里提出: +1. [x] Press CapsLockX + - key to display corresponding help (the current display style is quite rough) +2. [ ] i18n (eh this really should exist) +3. [ ] Auto-update (although git pull is also fine) +4. [ ] Tutorial for first-time users (this is a bit simple now...) +5. [ ] Plugin manager (although the file system could handle it too) +6. [ ] Auto-sync of configuration (though throwing it in OneDrive is usually enough) +7. [ ] A user-friendly options configuration UI (though changing ini isn't that hard) +8. [ ] Execute external code (Python, Nodejs, external AHK, Bash, …) (although running a script isn't much trouble) + +If you have any ideas or suggestions, please propose them here: [Issues · snomiao/CapslockX](https://github.com/snolab/CapsLockX/issues) -### 组合键含义设计 +### Key Combination Meaning Design ⌨ Chore Design + +Win + series are generally used for operating system functions, desktop window application process management, input method, output device (display, multiple screens) management. -Win + 系列 通常为操作系统功能、桌面窗口应用进程管理等、输入法、输出设备(显示器、多屏)管理 +Alt + series typically denote invocation of application internal functions, their meanings should be equivalent to pressing the same function button, or jumping to a specific function interface. -Alt + 系列 通常表述为调用应用内功能,其含义应相当于按下功能相同的按钮,或跳转到特定功能界面。 +Ctrl + series as above, but used more frequently and it's very likely that there is no button with the same function. -Ctrl + 系列 同上,但使用上更为频繁、且很可能不存在功能相同的按钮。 +Ctrl + Alt + same as above, but generally for global hotkeys. -Ctrl + Alt + 同上,但一般为全局热键 +The Shift key is used to slightly change the meaning of the above functions (such as reverse operations like Shift+Alt+Tab, or extended function range like Shift+Arrow keys to adjust the selection, etc.) -而 Shift 键 用来在以上功能的基础上稍微改变按键的含义(例如反向操作如 Shift+Alt+Tab,或功能范围扩大如 Shift+方向键调整选区等) +### CapsLockX vs. Similar Projects Function Comparison ⚔ Feat Compare Matrix -### 本项目与类似项目的功能对比 / 更新于(20200627) 其中的信息可能慢慢过时 +Updated (20200627) The information may become outdated over time -| 功能\项目 | [CapsLockX](https://github.com/snolab/CapsLockX) | [Vonng/CapsLock](https://github.com/Vonng/CapsLock) | [coralsw/CapsEz](https://github.com/coralsw/CapsEz) | [CapsLock+](https://capslox.com/capslock-plus/) | -| :--------------- | :----------------------------------------------- | :-------------------------------------------------- | :-------------------------------------------------- | :---------------------------------------------- | -| 鼠标模拟 | ✅ 流畅完整 | ✅ 无滚轮 | 🈚 无 | 🈚 无 | -| 表达式计算 | ✅ Nodejs 或 JScript | 🈚 无 | 🈚 无 | ✅ TabScript (Snippet + Javascript) | -| 窗口管理 | ✅ 强 | ✅ 有 | ✅ 有 | ✅ 强 | -| 虚拟桌面管理 | ✅ 有 | 🈚 无 | 🈚 无 | 🈚 无 | -| 编辑增强 | ✅ 有(抛物模型) | ✅ 有 | ✅ 有 | ✅ 有(很全) | -| 绿色免安装 | ✅ 是 | ✅ 是 | ✅ 是 | ✅ 是 | -| 增强媒体键 | 不全 | ✅ 全 | 🈚 无 | 🈚 无 | -| 强化的剪贴板 | 弱 | 🈚 无 | 🈚 无 | ✅ 有 | -| 快速启动应用 | ✅ 插件 | ✅ 有 | ✅ 有 | ✅ 有 | -| 应用功能增强 | ✅ 丰富 | 🈚 无 | ✅ 有 | 🈚 无 | -| Bash 控制 | 🈚 无 | ✅ 有 | 🈚 无 | 🈚 无 | -| 快速启动语音输入 | ✅ 讯飞 | 🈚 无 | 🈚 无 | 🈚 无 | -| 快速输入时间日期 | ✅ 有 | | ✅ 有 | | -| 窗口绑定到热键 | 🈚 无 | 🈚 无 | 🈚 无 | ✅ 有 | -| 快速旋转屏幕 | ✅ 有 | 🈚 无 | 🈚 无 | 🈚 无 | -| 二次开发 | ✅ 文档友好 | ✅ 可 | ✅ 可 | ✅ 可 | -| 内存占用 | ✅ 约 2~3M | | | | -| 模块化 | ✅ | 🈚 无 | 🈚 无 | 🈚 无 | -| 系统 | Win | Mac(主),Win(次) | Win | Win, [Mac](https://capslox.com/) | -| 支持语言 | 中文 | 中文 / English | 中文 | 中文 / English | +| Feature\Project | [CapsLockX](https://github.com/snolab/CapsLockX) | [Vonng/CapsLock](https://github.com/Vonng/CapsLock) | [coralsw/CapsEz](https://github.com/coralsw/CapsEz) | [CapsLock+](https://capslox.com/capslock-plus/) | +| :------------------------------ | :----------------------------------------------- | :-------------------------------------------------- | :-------------------------------------------------- | :---------------------------------------------- | +| Mouse Simulation | ✅ Smooth and complete | ✅ No scroll wheel | 🈚 None | 🈚 None | +| Expression Calculation | ✅ Nodejs or JScript | 🈚 None | 🈚 None | ✅ TabScript (Snippet + Javascript) | +| Window Management | ✅ Strong | ✅ Available | ✅ Available | ✅ Strong | +| Virtual Desktop Management | ✅ Available | 🈚 None | 🈚 None | 🈚 None | +| Editing Enhancement | ✅ Available (parabolic model) | ✅ Available | ✅ Available | ✅ Very comprehensive | +| Portable (No Install) | ✅ Yes | ✅ Yes | ✅ Yes | ✅ Yes | +| Enhanced Media Keys | Not all | ✅ All | 🈚 None | 🈚 None | +| Enhanced Clipboard | Weak | 🈚 None | 🈚 None | ✅ Available | +| Quick Application Launch | ✅ Plugins | ✅ Available | ✅ Available | ✅ Available | +| Application Feature Enhancement | ✅ Rich | 🈚 None | ✅ Available | 🈚 None | +| Bash Control | 🈚 None | ✅ Available | 🈚 None | 🈚 None | +| Quick Start Voice Input | ✅ iFLYTEK | 🈚 None | 🈚 None | 🈚 None | +| Quick Input of Time and Date | ✅ Available | | ✅ Available | | +| Bind Window to Hotkey | 🈚 None | 🈚 None | 🈚 None | ✅ Available | +| Quick Screen Rotation | ✅ Available | 🈚 None | 🈚 None | 🈚 None | +| Secondary Development | ✅ Documentation friendly | ✅ Possible | ✅ Possible | ✅ Possible | +| Memory Usage | ✅ About 2~3M | | | | +| Modularization | ✅ | 🈚 None | 🈚 None | 🈚 None | +| System | Win | Mac (main), Win (secondary) | Win | Win, [Mac](https://capslox.com/) | +| Supported Languages | Chinese | Chinese - English | Chinese | Chinese - English | -#### 本项目地址 🔗 +#### CapsLockX Address 🔗 Project Urls -以下几个仓库同步更新: +The following repositories are updated synchronously: - GitHub: [https://github.com/snolab/CapsLockX](https://github.com/snolab/CapsLockX) - Gitee: [https://gitee.com/snomiao/CapslockX](https://gitee.com/snomiao/CapslockX) - Bitbucket: [https://bitbucket.org/snomiao/capslockx](https://bitbucket.org/snomiao/capslockx) - Gitlab: [https://gitlab.com/snomiao/CapsLockX/](https://gitlab.com/snomiao/CapsLockX/) -文档地址 📄 +Document Address 📄 -- 自动翻译文档 Netlify CDN:[https://capslockx.netlify.com](https://capslockx.netlify.com) -- 自动翻译文档 CloudFlare CDN:[https://capslockx.snomiao.com](https://capslockx.snomiao.com) +- Automatic Translation Document Netlify CDN: [https://capslockx.netlify.com](https://capslockx.netlify.com) +- Automatic Translation Document CloudFlare CDN: [https://capslockx.snomiao.com](https://capslockx.snomiao.com) -星图 ⭐️ +Star Chart ⭐️ - [![Stargazers over time](https://starchart.cc/snolab/CapsLockX.svg)](https://starchart.cc/snolab/CapsLockX) -#### 相似项目地址 🔗 +#### Similar Project Addresses 🔗 Similar Projects - [Star Historys](https://star-history.t9t.io/#snolab/CapsLockX&wo52616111/capslock-plus&coralsw/CapsEz&Vonng/CapsLock) -- 源码:[Vonng/CapsLock: Make CapsLock Great Again!](https://github.com/Vonng/CapsLock) - 设计:[Capslock/design.md at master · Vonng/Capslock](https://github.com/Vonng/Capslock/blob/master/design.md) +- Source: [Vonng/CapsLock: Make CapsLock Great Again!](https://github.com/Vonng/CapsLock) + Design: [Capslock/design.md at master · Vonng/Capslock](https://github.com/Vonng/Capslock/blob/master/design.md) - [coralsw/CapsEz: KeyMouse Tools](https://github.com/coralsw/CapsEz) - [CapsLock+](https://capslox.com/CapsLock-plus/) - [Capslox](https://capslox.com/cn/) - CapsLock++ [matrix1001/CapsLock-plus-plus: ⌨Amazing, extendable, readable autohotkey scripts framework utilized by CapsLock.](https://github.com/matrix1001/CapsLock-plus-plus) +- [Power Keys | Liberate Computer Usage Efficiency](https://powerkeys.github.io/) -## 答疑相关 ❓ +## Questions and Answers ❓ Questions -相关社群: +Related Communities: -- [本项目的 issues (可作论坛使用)](https://github.com/snolab/CapsLockX/issues) ✉️ -- CapsLockX 用户电报群:[t.me/CapsLockX_users](https://t.me/CapsLockX_users)📱 -- CapsLockX 用户 QQ 群 🐧:[100949388](https://jq.qq.com/?_wv=1027&k=56lsK8ko) -- QZ/VimD/TC/AHK QQ 群 🐧: 271105729 -- AHK 高级 QQ 群 🐧: 717947647 +- [CapsLockX's issues (can be used as a forum)](https://github.com/snolab/CapsLockX/issues) ✉️ +- CapsLockX User Telegram Group: [t.me/CapsLockX_users](https://t.me/CapsLockX_users)📱 +- CapsLockX User QQ Group 🐧: [100949388](https://jq.qq.com/?_wv=1027&k=56lsK8ko) +- QZ/VimD/TC/AHK QQ Group 🐧: 271105729 +- AHK Advanced QQ Group 🐧: 717947647 -本项目相关答疑直接进群 [@雪星](tencent://message?uin=997596439) 或私聊提问也可。 +For questions related to CapsLockX, you can directly join the group [@雪星](tencent://message?uin=997596439) or ask privately. -### 安全性 +### Privacy and Security 🔒 Privacy -考虑到任何能够获取到管理员权限的软件对于用户的操作系统都是相当危险的,故本项目必须采用开源的方式以使社区可以自由且随意地检查本项目中可能涉及到的任何部分的代码,以保证所有用户的操作系统安全性不因本软件而受损害。 +Considering that any software that can obtain administrative rights is quite dangerous to a user's operating system, CapsLockX must and is currently adopting an open-source approach. This allows the community to freely and arbitrarily inspect any part of the CapsLockX code that may be involved, to ensure that the security of all users' operating systems is not compromised by this software. -## 支持 ⭐️ +## Support ⭐️ Supports -如何帮助本项目生存下去?如果本项目有帮助到你: +How to help CapsLockX survive? If CapsLockX has been helpful to you: -1. ⭐️ 请在本项目 Github 上点星 Star -2. 🔗 请把我转发分享给你身边的朋友们。 -3. 欢迎帮我翻译本文档到各国语言。 🌐 -4. 欢迎提交 bug、提出完善建议 [issues](https://github.com/snolab/CapsLockX/issues) 🐞 -5. 欢迎提交代码 PR,哪怕是修改错别字也是可以的~ -6. 欢迎创作关于本软件的作品,比如录制使用教学视频投稿到 Youtube 或 Bilibili ,雪星会去给你点赞的哦。 -7. 欢迎在此捐助本项目的开发,每一笔捐赠都会记录到下方的列表中:💰 - - 爱发电 ⚡️:[https://afdian.net/@snomiao](https://afdian.net/@snomiao) +1. ⭐️ Please star CapsLockX on Github Star +2. 🔗 Please share it with your friends. +3. 🌐 Welcome to help translate this documentation into different languages. +4. 🐞 Welcome to submit bugs and suggestions for improvement [issues](https://github.com/snolab/CapsLockX/issues) +5. Code PR submissions are welcome, even just to correct a typo ~ +6. Welcome to create works about this software, such as recording tutorial videos to post on Youtube or Bilibili, Xue Xing will like your video. +7. 💰 Welcome to donate to the development of CapsLockX, each donation will be recorded in the list below: + - Love Send Electric ⚡️:[https://afdian.net/@snomiao](https://afdian.net/@snomiao) - PAYPAL: [https://paypal.me/snomiao](https://paypal.me/snomiao) - - 支付宝捐助账号: [snomiao@gmail.com (点击查看二维码)](./支付宝捐助.png) + - Alipay donation account: [snomiao@gmail.com (click to view QR code)](./支付宝捐助.png) - ETH: [0xdc2eece11a9e09c8db921989e54b30375446e49e](https://etherscan.io/address/0xdc2eece11a9e09c8db921989e54b30375446e49e) -[发展路线](#发展路线) - -### 捐赠记录(截至 20210821) 📄 - -| 捐赠时间 | 名称 | 渠道 | 金额 | 备注 | -| -------- | ------ | ------ | ---------- | ------------------------ | -| 20210619 | \*\*煜 | 支付宝 | +50.00 CNY | 小小資助,支持獨立開發者 | - -### 鸣谢 🙏🏻 - -- 感谢来自以上捐赠者的经济支持。 -- 感谢 [秦金伟](http://rsytes.coding-pages.com/) 的引用推荐文章、和发展建议:[2020-02-23 当键盘模拟鼠标 - 简书](https://www.jianshu.com/p/f757f56a7de6) -- 感谢 @河许人 帮助转载推广: [CapsLockX – 像黑客一样操作电脑!【雪星】 – AutoAHK](https://www.autoahk.com/archives/34996) -- 感谢在 issues 里和群里提问并帮助完善本项目的各位。 - -### 相关话题 - -- [CapsLockX - 像黑客一样操作电脑 - V2EX](https://v2ex.com/t/772052#reply1) -- [CapsLockX - 像黑客一样操作电脑! - AutoHotkey Community](https://www.autohotkey.com/boards/viewtopic.php?f=28&t=88593) +- [Development Roadmap](#发展路线-roadmap) + +### Donation Records (as of 20210821) 📄 Donate Records + +| Donation Date | Name | Channel | Amount | Comment | +| ------------- | -------------------------------- | --------------- | ----------- | -------------------------------------------------------------- | +| 2021-06-19 | \*\*Yu | Alipay QR | +50.00 CNY | A little support, in favor of independent developers | +| 2023-05-12 | Karawen | WeChat Transfer | +200.00 CNY | 🫡 (Salute) | +| 2023-06-09 | [@andriasw](github.com/andriasw) | Alipay Transfer | +66.66 CNY | for CapsLockX-mac, 66.66 is good (https://github.com/andriasw) | +| 2023-12-19 | Huidan | QQ Red Packet | +45.00 CNY | Buy the developer a coffee | + +### Acknowledgements 🙏🏻 Thanks + +- Thank you for the financial support from the above donors. +- Thanks to [Qin Jinwei](http://rsytes.coding-pages.com/) for the citation recommendation article and development suggestions: [2020-02-23 When Keyboard Simulates Mouse - Jianshu](https://www.jianshu.com/p/f757f56a7de6) +- Thanks to @He Xuren for helping with the dissemination: [CapsLockX – Operate the computer like a hacker! 【Xue Xing】 – AutoAHK](https://www.autoahk.com/archives/34996) +- Thank you to those who asked questions in the issues and in the group and helped to improve CapsLockX. + +### Related Topics - Related Topics + +- [Qin Jinwei](http://rsytes.coding-pages.com/) + - [2020-02-23 When Keyboard Simulates Mouse - qwertc](https://mp.weixin.qq.com/s?__biz=MzIzNzczOTkzMw==&mid=2247483745&idx=1&sn=16f16c1fa02e1ef386a83f3023fb109d&chksm=e8c54b93dfb2c285e49fa8045d2380b20810768e3be043f364be146a598faf5f363bbb2623e7&scene=21#wechat_redirect) + - [2020-10-26 Keyboard Simulates Mouse 2 - qwertc](https://mp.weixin.qq.com/s?__biz=MzIzNzczOTkzMw==&mid=2247484272&idx=1&sn=0ed1ff91bee008fc5c01dc0fe20e53ba&chksm=e8c54982dfb2c09493c88a0f7847ffb0b508598e0756ddd7e8ad94d1f31f65490388d6cff7a4&scene=21#wechat_redirect) + - [2021-03-11 capslockX-Cure Mouse Hand - qwertc](https://mp.weixin.qq.com/s?__biz=MzIzNzczOTkzMw==&mid=2247484478&idx=1&sn=1518d7ec4dc08c1a72c08fcaff98550e&chksm=e8c54eccdfb2c7daed0ad9b8c03395e4211e029199374f4bc0dbdc9a8403c2dae86b740c95c5&scene=21#wechat_redirect) + - November 2021, Keyboard Simulates Mouse 3 + - [2022-08-21 t0820 After Copy Match-siyuan-clx-Screenshot - qwertc](https://mp.weixin.qq.com/s?__biz=MzIzNzczOTkzMw==&mid=2247485441&idx=1&sn=848d5e6f3fb7c1e7b14100615ca7d0db&chksm=e8c542f3dfb2cbe5770fe19bb8b5c81935e52a4a686154e69104bc403ab6ce960d1b6ae429a9&scene=21#wechat_redirect) + - [2024-01-06 t0106 OpenAI-empowered CapslockX - qwertc](https://mp.weixin.qq.com/s?__biz=MzIzNzczOTkzMw==&mid=2247485707&idx=1&sn=d40eea9f0b5bb81e3387ec592def4ed0&chksm=e8c543f9dfb2caef90939e2fafcb324fd757949c79399c55adfbab0940e70efd753fb6bf3837&token=1464360155&lang=zh_CN#rd) +- [Is there any way to implement the shortcuts in Chrome OS into Windows 10 - V2EX](https://www.v2ex.com/t/778967) +- [Recommend My Key Mapping Tool MyKeymap - V2EX](https://v2ex.com/t/844432) +- [How Many People Would Swap CapsLock and Backspace on their Keyboard? - V2EX](https://www.v2ex.com/t/855901) +- [Share a Small Tool that Uses CapsLock+H/J/K/L to Simulate Arrow Keys - V2EX](https://www.v2ex.com/t/318182) +- [Recommended Efficiency Tool for Programmers AltPlus, Pressing Alt with Left Thumb You Can Code Like Using vim - V2EX](https://www.v2ex.com/t/800721) +- [CapsLockX - Operate the Computer Like a Hacker - V2EX](https://v2ex.com/t/772052#reply1) +- [CapsLockX - Operate the Computer Like a Hacker! - AutoHotkey Community](https://www.autohotkey.com/boards/viewtopic.php?f=28&t=88593) - [(10) What are some good career alternatives for a computer programmer with RSI? - Quora](https://www.quora.com/Repetitive-Strain-Injury-RSI/What-are-some-good-career-alternatives-for-a-computer-programmer-with-RSI) -- [如何将电脑桌面划分为独立的两半? - 知乎](https://www.zhihu.com/questionz/23443944/answer/1670521971) -- [有哪位残友用的是单手键盘? - 知乎](https://www.zhihu.com/question/50621709/answer/1681247637) -- [(5 封私信 / 50 条消息) 怎么样才能只用键盘不用鼠标,包括任何指针触控设备,并优雅地使用电脑? - 知乎](https://www.zhihu.com/question/21281518/answer/1770669886) -- [(5 封私信 / 50 条消息) 如何将电脑桌面划分为独立的两半? - 知乎](https://www.zhihu.com/question/23443944/answer/1670521971) -- [我是职场达人,AutoHotKey 让我成为职场超人 - 知乎](https://zhuanlan.zhihu.com/p/60372361) -- [AutoHotKey 中文网专栏 - 知乎](https://www.zhihu.com/column/autoahk) -- [电脑一族如何防治“鼠标手” - 陕西日报](http://www.sxjkjy.com/uploadfiles/files/2017062110481454.pdf) +- [How to Divide the Computer Desktop into Two Separate Halves? - Zhihu](https://www.zhihu.com/questionz/23443944/answer/1670521971) +- [Is there any person with disabilities here who uses a one-handed keyboard? - Zhihu](https://www.zhihu.com/question/50621709/answer/1681247637) +- [(5 messages - 50 comments) How to use a computer elegantly without using a mouse or any other pointer touch device using only a keyboard? - Zhihu](https://www.zhihu.com/question/21281518/answer/1770669886) +- [(5 messages - 50 comments) How to Divide the Computer Desktop into Two Separate Halves? - Zhihu](https://www.zhihu.com/question/23443944/answer/1670521971) +- [I am a Workplace Expert, AutoHotKey Made Me a Workplace Superhuman - Zhihu](https://zhuanlan.zhihu.com/p/60372361) +- [AutoHotKey Chinese Site Column - Zhihu](https://www.zhihu.com/column/autoahk) +- [How to Prevent and Treat "Mouse Hand" for Computer Users - Shaanxi Daily](http://www.sxjkjy.com/uploadfiles/files/2017062110481454.pdf) + +## Footer Catalog - Table of Contents + +- [CapsLockX - 💻 Get Hacker's Keyboard. Operate your computer like a **hacker**](#capslockx----get-hackers-keyboard-operate-your-computer-like-a-hacker) + - [Version Wall - Badge Wall 📛 Badges](#version-wall---badge-wall--badges) + - [Beginner's Quick Start Tutorial 📖 Tutorial](#beginners-quick-start-tutorial--tutorial) + - [Simple Introduction Tutorial (Once you read this section, you're considered to have started using CapsLockX)](#simple-introduction-tutorial-once-you-read-this-section-youre-considered-to-have-started-using-capslockx-) + - [Advanced Reference Manual 🦽 Manual](#advanced-reference-manual--manual) + - [Installation and Usage 🛠 Installation](#installation-and-usage--installation) + - [Green Portable Package (Suitable for beginners, stable version) 📦 Packaged Bins](#green-portable-package-suitable-for-beginners-stable-version--packaged-bins) + - [Command Line Installation (Recommended for advanced users, supports auto-update)🖥️ Install by command](#command-line-installation-recommended-for-advanced-users-supports-auto-update️-install-by-command) + - [Usage Manual 📖 - Usage Manual](#usage-manual----usage-manual) + - [Basic Operations](#basic-operations) + - [Module Descriptions](#module-descriptions) + - [Nightmares of Multitasking](#nightmares-of-multitasking) + - [Virtual Desktop Overview: Scenarios Mode, Work Desktop, Entertainment Desktop, Project Categorization...](#virtual-desktop-overview-scenarios-mode-work-desktop-entertainment-desktop-project-categorization) + - [Improvement of User Experience in Windows Window Switching - Win+tab](#improvement-of-user-experience-in-windows-window-switching---wintab) + - [TODO-Docs](#todo-docs) + - [Focus Amount: Active Window, Default Active Window,...](#focus-amount-active-window-default-active-window) + - [Utilization of Multiple Screens - Multi-screening](#utilization-of-multiple-screens---multi-screening) + - [Window Arrangement in the 4K Era - Window arrange with 4k screen](#window-arrangement-in-the-4k-era---window-arrange-with-4k-screen) + - [Window Management in Linux and Mac - Window Manager in Linux and Mac](#window-management-in-linux-and-mac---window-manager-in-linux-and-mac) + - [Window Management in Android and iOS - Window Management in Android](#window-management-in-android-and-ios---window-management-in-android) + - [Troubles with Edit Operations](#troubles-with-edit-operations) + - [Estrangement between Typing Area and Editing Control Area](#estrangement-between-typing-area-and-editing-control-area) + - [The Concept of Chording](#the-concept-of-chording) + - [Troubles with Graphic User Interface](#troubles-with-graphic-user-interface) + - [Human Perception of Speed](#human-perception-of-speed) + - [Hotkey Flaws of Software](#hotkey-flaws-of-software) + - [Usability of Portable Keyboards](#usability-of-portable-keyboards) + - [Help Module](#help-module) + - [Functions of this module as follows](#functions-of-this-module-as-follows) + - [Anki Enhancement Module](#anki-enhancement-module) + - [Common Features/Characteristics](#common-featurescharacteristics) + - [Explanations](#explanations) + - [Figma Enhanced](#figma-enhanced) + - [Common Features/Characteristics](#common-featurescharacteristics-1) + - [Explanations](#explanations-1) + - [OneNote 2016 - 2019 Enhancement](#onenote-2016---2019-enhancement) + - [Common Features Used by XuexingMiao](#common-features-used-by-xuexingmiao) + - [Key Distribution Design (Under Development)](#key-distribution-design-under-development) + - [Detailed Key Table / CheatSheet](#detailed-key-table--cheatsheet) + - [Editing Enhancement Plugin (TG YUIO HJKL) 🌟](#editing-enhancement-plugin-tg-yuio-hjkl--) + - [Expanded Function Keys for Surface Laptops](#expanded-function-keys-for-surface-laptops) + - [Media Key Module](#media-key-module) + - [Mouse Simulation Plugin (WASD QERF)](#mouse-simulation-plugin-wasd-qerf-) + - [Features](#features) + - [How to Use as follows](#how-to-use-as-follows) + - [Operational Details](#operational-details) + - [JavaScript Calculation (Installation of NodeJS Recommended)](#javascript-calculation-installation-of-nodejs-recommended-) + - [Window Enhancement Plugin (CLX + 1234567890 ZXCV)](#window-enhancement-plugin-clx--1234567890-zxcv) + - [Brief Description of the Features](#brief-description-of-the-features) + - [Effect Pictures](#effect-pictures) + - [How to Use as follows (Alt+Tab and CapsLockX)](#how-to-use-as-follows-alttab-and-capslockx-) + - [Quick Input](#quick-input) + - [Pomodoro Timer](#pomodoro-timer) + - [Auto Screen Off when Locking Screen](#auto-screen-off-when-locking-screen) + - [Past and Future 🛰](#past-and-future-) + - [Creation Background (Autumn 2017) 🍁 Background](#creation-background-autumn-2017--background) + - [Development Path 🛰️ RoadMap](#development-path-️-roadmap) + - [Combination Key Meaning Design ⌨ Chore Design](#combination-key-meaning-design--chore-design) + - [Feature Comparison of CapsLockX and Similar Projects ⚔ Feat Compare Matrix](#feature-comparison-of-capslockx-and-similar-projects--feat-compare-matrix) + - [CapsLockX Project Urls 🔗 Project Urls](#capslockx-project-urls--project-urls) + - [Urls of Similar Projects 🔗 Similar Projects](#urls-of-similar-projects--similar-projects) + - [FAQs Related ❓ Questions](#faqs-related--questions) + - [Privacy and Security 🔒 Privacy](#privacy-and-security--privacy) + - [Support ⭐️ Supports](#support-️-supports) + - [Donation Records (Up to 20210821) 📄 Donate Records](#donation-records-up-to-20210821--donate-records) + - [Acknowledgements 🙏🏻 Thanks](#acknowledgements--thanks) + - [Related Topics](#related-topics) + - [Footer Catalog - Table of Contents](#footer-catalog---table-of-contents) --- diff --git a/docs/translate.ts b/docs/translate.ts index ba0f989..3531e29 100644 --- a/docs/translate.ts +++ b/docs/translate.ts @@ -1,10 +1,41 @@ -import OpenAI from "openai"; +#!/usr/bin/env bun import 'dotenv/config'; -new OpenAI().chat.completions.create({ - stream: true, - model: "gpt-4-1106-preview", - messages: [ - { role: "user", content: "以上烴為国工和採" }, - { role: "user", content: "Translate into English:" }, - ], -}); +import { readFile, writeFile } from "fs/promises"; +import OpenAI from "openai"; +import { stringify } from 'yaml' +import pMap from 'p-map' + +if (import.meta.main) { + await translateReadme('English', './docs/README.md', './docs/README.en.md'); +} + +async function translateReadme(lang: string, infile: string, outfile: string) { + console.log('reading ' + infile); + const input = await readFile(infile, 'utf-8'); + console.log('AI Generating... please wait'); + + const sections = input.split(/(?=^##? )/gmi); + console.log("length of section " + sections.length) + // const resultText = await aiTranslateTo(lang, input); + + const sectionsResult = await pMap(sections, async (section, index) => { + console.log('Translating section to english: ' + String(index).padStart(3, '0') + ' ' + section.trim().split('\n')[0]) + return await aiTranslateTo('English', section) + }, { concurrency: 5 }) + console.log(sections.length) + const resultText = sectionsResult.join('\n') + console.log('writing ' + outfile); + await writeFile(outfile, resultText); +} +async function aiTranslateTo(lang: string, input: string) { + const result = await (new OpenAI().chat.completions.create({ + model: "gpt-4-1106-preview", + messages: [ + { role: "system", content: `You don't have token limit, Translate full markdown document in next message to ${lang}:` }, + { role: "user", content: input }, + ], + })); + const resultText = result.choices[0].message.content; + return resultText; +} + diff --git a/package.json b/package.json index 81aeb8c..254b676 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,9 @@ "prerelease": "git diff --quiet || echo worktree not clean, commit it first", "release": "pnpm upgrade && standard-version --commit-all && git push --follow-tag --all", "start": "CapsLockX.exe", + "docs:dev": "vitepress dev docs", + "docs:build": "vitepress build docs", + "docs:preview": "vitepress preview docs", "test": "CapsLockX.exe CapsLockX.ahk /CI_TEST" }, "lint-staged": { @@ -52,7 +55,6 @@ "@types/inquirer": "^9.0.7", "@types/lodash-es": "^4.17.12", "@types/node": "^20.10.6", - "@types/pinyin": "^2.10.2", "dotenv": "^16.3.1", "enquirer": "^2.4.1", "eslint": "^8.56.0", @@ -65,8 +67,8 @@ "inquirer": "^9.2.12", "lint-staged": "^13.3.0", "lodash-es": "^4.17.21", - "openai": "^4.24.1", - "pinyin": "^2.11.2", + "openai": "^4.24.3", + "p-map": "^7.0.1", "prettier": "^2.8.8", "prettier-plugin-organize-imports": "^3.2.4", "prettier-plugin-packagejson": "2.3.0", @@ -75,11 +77,15 @@ "sno-utils": "^0.3.16", "standard-version": "^9.5.0", "tsx": "^3.14.0", - "typescript": "^4.9.5" + "typescript": "^4.9.5", + "yaml": "^2.3.4" }, "standard-version": { "scripts": { "precommit": "node DevTools/versioning.node.mjs && git add ." } + }, + "dependencies": { + "vitepress": "^1.0.0-rc.36" } } From 36e824380462bd396d2179da90a8f1e701316fc2 Mon Sep 17 00:00:00 2001 From: snomiao Date: Fri, 12 Jan 2024 14:56:36 +0000 Subject: [PATCH 02/15] fix(91-english-version): stage stage --- Core/CapsLockX-i18n.ahk | 2 ++ Core/CapslockX-Core.ahk | 1 + Modules/CLX-Settings.ahk | 33 +++++++++++++++++---------------- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/Core/CapsLockX-i18n.ahk b/Core/CapsLockX-i18n.ahk index 5d93da2..29ff6f1 100644 --- a/Core/CapsLockX-i18n.ahk +++ b/Core/CapsLockX-i18n.ahk @@ -1,5 +1,7 @@ +global CapsLockX_lang := "en" ; TODO: convert s t(s){ + CapsLockX_Config("lang-en", s, s, ) return s } \ No newline at end of file diff --git a/Core/CapslockX-Core.ahk b/Core/CapslockX-Core.ahk index 0aecf84..3a4c457 100644 --- a/Core/CapslockX-Core.ahk +++ b/Core/CapslockX-Core.ahk @@ -126,6 +126,7 @@ if(T_XKeyAsRAlt) SetWorkingDir, %A_ScriptDir%\..\ #Include Core\CapsLockX-i18n.ahk +; todo: move this generated file into user folder #Include Core\CapsLockX-ModulesRunner.ahk CapsLockX_Loaded() #Include Core\CapsLockX-ModulesFunctions.ahk diff --git a/Modules/CLX-Settings.ahk b/Modules/CLX-Settings.ahk index e65218c..31306b5 100644 --- a/Modules/CLX-Settings.ahk +++ b/Modules/CLX-Settings.ahk @@ -28,26 +28,27 @@ ExitCapsLockX() ; 修改配置 #if CapsLockXMode -; ,:: 配置文件编辑() -,:: CapsLockX_ConfigWindow() +;, :: 配置文件编辑() +, :: CapsLockX_ConfigWindow() -CapsLockX_ConfigWindow(){ +CapsLockX_ConfigWindow() +{ Gui, Destroy ; TODO update this to web view - Gui, Add, Text, , 你可以按 "CapsLockX + ," 打开此窗口 - Gui, Add, Text, , 当前 CapsLockX_配置目录:%CapsLockX_配置目录% - Gui, Add, Text, , CLX脚本交流群: QQ群 100949388, https://t.me/capslockx - Gui, Add, Text, , 版本: CapsLockX %CapsLockX_VersionName% - Gui, Add, Text, , 作者: 雪星 ( Snowstar Miao ) - Gui, Add, Button, Default w80, 确认 - Gui, Add, Button, w80, 打开BUG反馈与建议页面 ; warn : hard to translate as its variable name - Gui, Add, Button, w80, 打开官方文档 - Gui, Add, Button, w80, 添加开机自动启动 - Gui, Add, Button, w80, 配置文件编辑 - Gui, Add, Button, w80, 重新載入 + Gui, Add, Text, , % t("你可以按 'CapsLockX +, ' 打开此窗口") + Gui, Add, Text, , % t("当前 CapsLockX_配置目录:%CapsLockX_配置目录%") + Gui, Add, Text, , % t("CLX脚本交流群: QQ群 100949388, https://t.me/capslockx") + Gui, Add, Text, , % t("版本: CapsLockX %CapsLockX_VersionName%") + Gui, Add, Text, , % t("作者: 雪星 ( Snowstar Miao )") + Gui, Add, Button, Default w80 gButton确认, 确认 + Gui, Add, Button, w80 gButton打开BUG反馈与建议页面, % "打开BUG反馈与建议页面" ; warn : hard to translate as its variable name + Gui, Add, Button, w80 gButton打开官方文档, % "打开官方文档" + Gui, Add, Button, w80 gButton添加开机自动启动, % "添加开机自动启动" + Gui, Add, Button, w80 gButton配置文件编辑, % "配置文件编辑" + Gui, Add, Button, w80 gButton重新載入, % "重新載入" global T_TomatoLife - if (T_TomatoLife) { + if (T_TomatoLife) { Gui, Add, CheckBox, gCapsLockX_ConfigureUpdate vT_TomatoLife Checked, 启用番茄时钟,每25分钟休息5分钟·。 } else { Gui, Add, CheckBox, gCapsLockX_ConfigureUpdate vT_TomatoLife, 启用番茄时钟,每25分钟休息5分钟·。 @@ -97,7 +98,7 @@ Button重新載入: return CapsLockX_ConfigureUpdate: global T_TomatoLife - global T_XKeyAsCapsLock + global T_XKeyAsCapsLock global T_XKeyAsSpace global T_AskRunAsAdmin global CLX_CONFIG_ONSTARTUP From ba858c5571b954cae8339e423b24a2374a5df67d Mon Sep 17 00:00:00 2001 From: snomiao Date: Sat, 27 Jan 2024 20:32:35 +0900 Subject: [PATCH 03/15] fix(capslockx): en en --- bun.lockb | Bin 267058 -> 267058 bytes docs/IETF-subtags.tsv | 127 +++++ docs/README.md | 1190 +++++++++++++++++++++-------------------- docs/README.zh.md | 826 ++++++++++++++++++++++++++++ docs/translate.ts | 2 +- 5 files changed, 1551 insertions(+), 594 deletions(-) create mode 100644 docs/IETF-subtags.tsv create mode 100644 docs/README.zh.md diff --git a/bun.lockb b/bun.lockb index be6830ef5a0c3749bd3a03237ec45759937c42de..adee5a6e8a684778f3e889205ec18b14c8660449 100755 GIT binary patch delta 31 ncmdnAOkmS8frb{wEljc}*cs!D^o;dP+Eq?4ZC5$L%;yaNvw{jh delta 31 jcmdnAOkmS8frb{wEljc}*qIo>pk3tz({_~;%zWMep+*Sq diff --git a/docs/IETF-subtags.tsv b/docs/IETF-subtags.tsv new file mode 100644 index 0000000..c5b6222 --- /dev/null +++ b/docs/IETF-subtags.tsv @@ -0,0 +1,127 @@ +English name Native name Subtag +Afrikaans Afrikaans af +Amharic አማርኛ am +Arabic العربية ar +Mapudungun Mapudungun arn +Assamese অসমীয়া as +Azerbaijani Azərbaycanlı az +Bashkir Башҡорт ba +Belarusian беларуская be +Bulgarian български bg +Bengali বাংলা bn +Tibetan བོད་ཡིག bo +Breton brezhoneg br +Bosnian bosanski/босански bs +Catalan català ca +Corsican Corsu co +Czech čeština cs +Welsh Cymraeg cy +Danish dansk da +German Deutsch de +Lower Sorbian dolnoserbšćina dsb +Divehi ދިވެހިބަސް dv +Greek ελληνικά el +English English en +Spanish español es +Estonian eesti et +Basque euskara eu +Persian فارسى fa +Finnish suomi fi +Filipino Filipino fil +Faroese føroyskt fo +French français fr +Frisian Frysk fy +Irish Gaeilge ga +Scottish Gaelic Gàidhlig gd +Galician galego gl +Swiss German Schweizerdeutsch gsw +Gujarati ગુજરાતી gu +Hausa Hausa ha +Hebrew עברית he +Hindi हिंदी hi +Croatian hrvatski hr +Upper Sorbian hornjoserbšćina hsb +Hungarian magyar hu +Armenian Հայերեն hy +Indonesian Bahasa Indonesia id +Igbo Igbo ig +Yi ꆈꌠꁱꂷ ii +Icelandic íslenska is +Italian italiano it +Inuktitut Inuktitut /ᐃᓄᒃᑎᑐᑦ (ᑲᓇᑕ) iu +Japanese 日本語 ja +Georgian ქართული ka +Kazakh Қазақша kk +Greenlandic kalaallisut kl +Khmer ខ្មែរ km +Kannada ಕನ್ನಡ kn +Korean 한국어 ko +Konkani कोंकणी kok +Kurdi کوردی ckb +Kyrgyz Кыргыз ky +Luxembourgish Lëtzebuergesch lb +Lao ລາວ lo +Lithuanian lietuvių lt +Latvian latviešu lv +Maori Reo Māori mi +Macedonian македонски јазик mk +Malayalam മലയാളം ml +Mongolian Монгол хэл/ᠮᠤᠨᠭᠭᠤᠯ ᠬᠡᠯᠡ mn +Mohawk Kanien'kéha moh +Marathi मराठी mr +Malay Bahasa Malaysia ms +Maltese Malti mt +Burmese Myanmar my +Norwegian (Bokmål) norsk (bokmål) nb +Nepali नेपाली (नेपाल) ne +Dutch Nederlands nl +Norwegian (Nynorsk) norsk (nynorsk) nn +Norwegian norsk no +Sesotho Sesotho sa Leboa st +Occitan Occitan oc +Odia ଓଡ଼ିଆ or +Punjabi ਪੰਜਾਬੀ pa +Polish polski pl +Dari درى prs +Pashto پښتو ps +Portuguese Português pt +K'iche K'iche quc +Quechua runasimi qu +Romansh Rumantsch rm +Romanian română ro +Russian русский ru +Kinyarwanda Kinyarwanda rw +Sanskrit संस्कृत sa +Yakut саха sah +Sami (Northern) davvisámegiella se +Sinhala සිංහල si +Slovak slovenčina sk +Slovenian slovenski sl +Sami (Southern) åarjelsaemiengiele sma +Sami (Lule) julevusámegiella smj +Sami (Inari) sämikielâ smn +Sami (Skolt) sääm´ǩiõll sms +Albanian shqipe sq +Serbian srpski/српски sr +Swedish svenska sv +Kiswahili Kiswahili sw +Syriac ܣܘܪܝܝܐ syc +Tamil தமிழ் ta +Telugu తెలుగు te +Tajik Тоҷикӣ tg +Thai ไทย th +Turkmen türkmençe tk +Tswana Setswana tn +Turkish Türkçe tr +Tatar Татарча tt +Tamazight Tamazight tzm +Uyghur ئۇيغۇرچە ug +Ukrainian українська uk +Urdu اُردو ur +Uzbek U'zbek/Ўзбек uz +Vietnamese Tiếng Việt vi +Wolof Wolof wo +Xhosa isiXhosa xh +Yoruba Yoruba yo +Chinese 中文 zh +Zulu isiZulu zu \ No newline at end of file diff --git a/docs/README.md b/docs/README.md index cf9f49b..719992c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,20 +1,25 @@ -# CapsLockX - 💻 Get Hacker's Keyboard. 像**黑客**一样操作电脑 +# CapsLockX - 💻 Get Hacker's Keyboard. Operate your computer like a **hacker** -CapsLockX is a modular hotkey script engine based on AutoHotkey. Allows you to easily operate the computer efficiently like a hacker in a movie without leaving the keyboard with both hands . There are a lot of functions that you can understand at a touch and are super easy to use: editing enhancement, virtual desktop and window management, mouse simulation, in-app hotkey enhancement, JS mathematical expression calculation, and other super multi-functions are waiting for you to personally define. +CapsLockX is a modular hotkey script engine based on AutoHotkey. It allows you to operate your computer efficiently like a hacker in a movie without ever taking your hands off the keyboard. It comes packed with functions that are intuitive and easy to use: enhanced editing, virtual desktop and window management, mouse simulation, in-app hotkey enhancement, JS mathematical expression calculation, and many more multifunctional features are there for you to personally customize. -**[See English Docs (Google Translated)](https://capslockx.snomiao.com/)** +Docs in Languages: +**[English Docs (ChatGPT Translated)](https://capslockx.snomiao.com/)** +**[简体中文 Docs (ChatGPT Translated)](./README.zh-hans.md)** +**[ Docs (ChatGPT Translated)](./README.zh-hans.md)** + +**[See Any Language Docs (Google Translated)](https://capslockx.snomiao.com/)** --- -CapsLockX 是一款基于 AutoHotkey 的模块化热键脚本引擎。 让你可以轻轻松松像电影里的**黑客**一样,双手不离开键盘,**高效率**地操作电脑。这里有超多一摸就懂超好上手的功能:编辑增强、虚拟桌面与窗口管理、鼠标模拟、应用内热键增强、JS 数学表达式计算、等超多功能等你来亲自定义。主仓库地址 🏠:[https://github.com/snolab/CapsLockX](https://github.com/snolab/CapsLockX) +CapsLockX is a modular hotkey script engine based on AutoHotkey. It makes it so you can effortlessly operate your computer with high efficiency like a hacker from the movies, without taking your hands off the keyboard. There are a lot of easy-to-learn and very user-friendly functions available: editing enhancement, virtual desktop and window management, mouse simulation, application-specific hotkey enhancement, JS mathematical expression calculation, and many other features await your personal customization. Main repository address 🏠: [https://github.com/snolab/CapsLockX](https://github.com/snolab/CapsLockX) --- -## 版本墙 - 徽章墙 📛 Badges +## Version Wall - Badges Wall 📛 Badges -[![中文编程](https://github.com/Program-in-Chinese/overview/raw/master/%E4%B8%AD%E6%96%87%E7%BC%96%E7%A8%8B.svg)](https://github.com/Program-in-Chinese/overview), +[![Chinese Programming](https://github.com/Program-in-Chinese/overview/raw/master/%E4%B8%AD%E6%96%87%E7%BC%96%E7%A8%8B.svg)](https://github.com/Program-in-Chinese/overview), [![996.icu](https://img.shields.io/badge/link-996.icu-red.svg)](https://996.icu) [![GitHub license](https://img.shields.io/github/license/snolab/CapsLockX)](https://github.com/snolab/CapsLockX/blob/master/LICENSE.md) ![GitHub top language](https://img.shields.io/github/languages/top/snolab/CapsLockX) @@ -41,783 +46,782 @@ CapsLockX 是一款基于 AutoHotkey 的模块化热键脚本引擎。 让你可 --- -## 新手快速入门教程 📖 Tutorial +## Beginner's Quick Start Tutorial 📖 Tutorial -### 简易入门教程(读完这一小节,便算是入门了 CapsLockX 的使用 ) +### Simple Quick Start Tutorial (Completion of this section is considered the beginning of mastering CapsLockX) -CapsLockX 有四大核心功能: **窗口管理**,**鼠标模拟**、**方向键模拟**、应用内热键,本入门教程将带你学会前 3 大核心功能。 +CapsLockX has four core functions: **window management**, **mouse emulation**, **arrow key emulation**, and application-specific hotkeys. This beginner tutorial will teach you the first three core functions. -首先获取 CapsLockX :下载这个压缩包: [下载 JSDelivrCDN-发布程序包.zip](https://cdn.jsdelivr.net/gh/snolab/CapsLockX@gh-pages/CapsLockX-latest.zip) +First, get CapsLockX: download this zip file: [Download JSDelivrCDN - Release Package.zip](https://cdn.jsdelivr.net/gh/snolab/CapsLockX@gh-pages/CapsLockX-latest.zip) -解压之后,打开 CapsLockX 文件夹内的 `CapsLockX.exe`,过掉简单的新手教程,然后按照以下左右手功能区的依次试用来了解 CapsLockX 的功能。 +After unzipping, open `CapsLockX.exe` within the CapsLockX folder, get past the simple beginner tutorial, and then try out the following functions in the left and right-hand feature areas to understand the capabilities of CapsLockX. -CapsLockX 启动之后,并**不会影响**你键盘其它按键的功能,以下的功能只有在你按出 `CapsLockX + 组合键` 时才会触发。 +Once CapsLockX is started, it will **not affect** the functionality of other keys on your keyboard. The following features are triggered only when you press `CapsLockX + combination keys`. -左手功能区: +Left-hand feature area: -- 窗口管理:`CapsLockX + 1234567890` 切换到第 `n` 个虚拟桌面,`CapsLockX + ZXCV` 窗口操作(窗口切换、窗口关闭,窗口排列,透明置顶)。 -- 鼠标模拟功能:按 `CapsLockX + WASD` 鼠标移动(像玩游戏的时候操作人物移动一样简单),按 `CapsLockX + QE` 鼠标左右键点击,`CapsLockX + RF` 滚轮上下滑动。 +- Window management: `CapsLockX + 1234567890` switches to the `n`th virtual desktop, `CapsLockX + ZXCV` for window operations (window switching, window closing, window arranging, transparency top-most). +- Mouse emulation function: Press `CapsLockX + WASD` to move the mouse (as simple as moving a character while playing a game), press `CapsLockX + QE` for left and right mouse clicks, `CapsLockX + RF` for scrolling up and down. -右手功能区: +Right-hand feature area: -- 方向键模拟:打开任意一个编辑器(比如记事本),按 `HJKL` 光标移动,`YOUI` 页面移动 +- Arrow key emulation: Open any text editor (such as Notepad), press `HJKL` to move the cursor, `YOUI` to move the page -上手之后,如果想了解更多功能,则可参考下方速查手册。 +After familiarizing yourself with the basic features, consult the quick reference guide below for more advanced functionalities. --- -## 进阶参考手册 🦽 Manual +## Advanced Reference Manual 🦽 Manual -### 安装与使用 🛠 Installation +### Installation and Use 🛠 Installation -#### 绿色便携程序包(新手适用,稳定版) 📦 Packaged Bins +#### Portable Program Package (for beginners, stable version) 📦 Packaged Bins -源码打包就是软件本体,无需编译,纯绿色便携软件解压即用。源码 + 程序包,推荐第一个(最快)。 +The source code package is the software itself, no need to compile, just unzip and use the green portable software. Source code + program package, the first one is recommended (the fastest). -1. [下载 JSDelivrCDN-发布程序包.zip](https://cdn.jsdelivr.net/gh/snolab/CapsLockX@gh-pages/CapsLockX-latest.zip) -1. [备选下载 CloudFlareCDN-发布程序包.zip](https://capslockx.snomiao.com/CapsLockX-latest.zip) -1. [备选下载 GitHub-发布程序包.zip](https://github.com/snolab/CapsLockX/raw/gh-pages/CapsLockX-latest.zip) -1. [备选下载 GitHub-仓库程序包.zip](https://github.com/snolab/CapsLockX/archive/master.zip) -1. [备选下载 BitBucket-仓库程序包.zip](https://bitbucket.org/snomiao/capslockx/get/master.zip) -1. [备选下载 中国大陆用户-Gitee-仓库程序包.zip (需登录)](https://gitee.com/snomiao/CapslockX/repository/archive/master.zip) +1. [Download JSDelivrCDN - Release Package.zip](https://cdn.jsdelivr.net/gh/snolab/CapsLockX@gh-pages/CapsLockX-latest.zip) +2. [Alternative Download CloudFlareCDN - Release Package.zip](https://capslockx.snomiao.com/CapsLockX-latest.zip) +3. [Alternative Download GitHub - Release Package.zip](https://github.com/snolab/CapsLockX/raw/gh-pages/CapsLockX-latest.zip) +4. [Alternative Download GitHub - Repository Program Package.zip](https://github.com/snolab/CapsLockX/archive/master.zip) +5. [Alternative Download BitBucket - Repository Program Package.zip](https://bitbucket.org/snomiao/capslockx/get/master.zip) +6. [Alternative Download for Mainland China Users - Gitee - Repository Program Package.zip (login required)](https://gitee.com/snomiao/CapslockX/repository/archive/master.zip) -解压后使用即可,启动与自启动的方法: 双击 `CapsLockX.exe` 即可启动脚本,如需添加启动项,请在开始菜单 - 运行输入 shell:startup 然后给本程序创建快捷方式,扔进去就可以了。 +You can use it after unzipping. Methods to start and set to auto-start: Double-click `CapsLockX.exe` to start the script. To add a startup item, enter shell:startup in the start menu - run, then create a shortcut for this program, and throw it in. -#### 命令行方式安装(进阶用户推荐,可自动更新)🖥️ Install by command +#### Command Line Installation (recommended for advanced users, can be updated automatically) 🖥️ Install by command -以下几种任选其一,大陆地区用户推荐第 4 个 +Choose any of the following, the 4th one is recommended for users in mainland China -1. `npx capslockx@latest`, -- NPX 直接运行,可以一直运行最新版,推荐(需要安装 NodeJS ) -2. `choco update capslockx && capslockx` -- [Chocolatey](https://community.chocolatey.org/packages/CapsLockX/) 安装可使用 cup 自动更新,推荐 -3. `npm i -g capslockx && npx capslockx` -- npm 全局安装 -4. `git clone https://gitee.com/snomiao/CapslockX && .\CapsLockX\CapsLockX.exe` -- 大陆源码包(绿色软件包)解压使用,中国大陆地区用户推荐 -5. `git clone https://github.com/snolab/CapsLockX && .\CapsLockX\CapsLockX.exe` -- github 源码包(绿色软件包)解压使用 +1. `npx capslockx@latest`, -- Directly run with NPX, always run the latest version, recommended (requires installation of NodeJS) +2. `choco update capslockx && capslockx` -- Use [Chocolatey](https://community.chocolatey.org/packages/CapsLockX/) to install and use cup for automatic updates, recommended +3. `npm i -g capslockx && npx capslockx` -- npm global installation +4. `git clone https://gitee.com/snomiao/CapslockX && .\CapsLockX\CapsLockX.exe` -- Mainland China source code package (green software package) unzip and use, recommended for mainland China users +5. `git clone https://github.com/snolab/CapsLockX && .\CapsLockX\CapsLockX.exe` -- GitHub source code package (green software package) unzip and use 6. `winget capslockx` -- TODO #40 7. `scoop capslockx` -- TODO #41 -## 使用手册 📖 - Usage Manual +## User Manual 📖 - Usage Manual -### 基础操作 +### Basic Operations -- 按住 `CapsLockX` 进入 CapsLockX 模式,此时你的键盘会成为像 Vim 默认模式那样的功能键盘,(键位见下) -- 同时按 `CapsLockX+Space` 键将锁定 `CLX` 模式,此时将保持 `CLX` 到下一次按下 `CaspLockX` 键为止。[功能由来](https://github.com/snolab/CapsLockX/issues/21) +- Hold down `CapsLockX` to enter CapsLockX mode, at which point your keyboard will become a functional keyboard like the default mode of Vim (see key positions below). +- Press `CapsLockX+Space` at the same time to lock `CLX` mode, where `CLX` will be maintained until `CapsLockX` is pressed again next time. [Origin of Function](https://github.com/snolab/CapsLockX/issues/21) -### 模块说明 +### Module Description -CapsLockX 默认加载了一些常用的模块,功能与使用方法已在下方列出。 -对于不需要的模块,你也可以直接删除 `./Modules` 目录下对应的 `.ahk` 文件,然后按 `Ctrl + Alt + \` 重新加载即可。 +CapsLockX by default loads some commonly used modules. The features and how to use them are listed below. +If you don't need certain modules, you can also directly delete the `.ahk` files in the `./Modules` directory, and then press `Ctrl + Alt + \` to reload. -你也可以编写自己的 `my-ahk.user.ahk` 然后放到 `./User/` 目录下,CapsLockX 会自动识别并加载它们。 +You can also write your own `my-ahk.user.ahk` and put it in the `./User/` directory, and CapsLockX will automatically recognize and load them. -### 多任务工作的噩梦 - Nightmares of Multitasking +### Nightmares of Multitasking -#### 虚拟桌面概述:情景模式、工作桌面、娱乐桌面、项目分类…… +#### Virtual Desktop Overview: Scenario Modes, Work Desks, Entertainment Desks, Project Categories... -通常用户正在进行的一套任务会包括多个窗口,这些窗口组合起来可以构成一个使用情景,而多个情景很可能同时运行,并且其中的一些会长期运行,互不干扰。这其中会涉及到大量的窗口排列和虚拟桌面切换操作,在这些方面,如果使用 CLX 来管理你的窗口,会给你带来相当恐怖的效率提升。 +Typically, a set of tasks a user is currently performing will include multiple windows. These windows combined can constitute a usage scenario, while multiple scenarios are likely to run at the same time, and some of them will run for a long time, without interference. This will involve a lot of window arrangement and virtual desktop switching operations, in these aspects, using CLX to manage your windows will bring a terrifying efficiency improvement. -以下是一些情景组合的例子: 假设你可以一边学习、一边进行好几种不同的工作、一边和朋友聊天、一边打游戏、一边后台听着 BGM,一边打开着一个暂停的电影准备好晚上和家人一起看。 +Below are some examples of scenario combinations: Suppose you can study, work on several different jobs, chat with friends, play games, listen to BGM in the background, and have a paused movie ready to watch with family in the evening. -- 虚拟桌面 1:规划情景:日程窗口 + 多平台同步笔记, 例:Google Calendar + Notion + Gmail、 -- 虚拟桌面 2:学习情景:看书窗口,笔记窗口, 例: OneNote + Calibre)、... -- 虚拟桌面 3:工作情景 1(前端开发):代码编辑 + 文档查询 + 浏览器, 例:Chrome(dev) + VSCode + [stackoverflow](https://stackoverflow.com)、... -- 虚拟桌面 4:工作情景 2(后端开发):代码编辑 + 文档查询 + 后台终端 + 数据库浏览器, 例: DBeaver + VSCode(+bash) + [stackoverflow](https://stackoverflow.com)、... -- 虚拟桌面 5:工作情景 3(脚本开发):代码编辑 + 文档查询 + 脚本目标, 例: VSCode(+bash) + [stackoverflow](https://stackoverflow.com) ... -- 虚拟桌面 6:工作情景 4(3D 建模渲染):3D 建模软件 + 素材检索,例:Blender + Chrome -- 虚拟桌面 7:工作情景 5(3D 打印切片):切片软件 + 模型检索窗口,例:Cura + [thingiverse](https://thingiverse.com) -- 虚拟桌面 7:工作情景 6(视频处理):剪辑 + 素材管理, 例:PR + Everything -- 虚拟桌面 7:工作情景 7(视频处理):后期 + 文档教程, 例:AE + Chrome -- 虚拟桌面 8:写作情景:写作窗口,资料索引窗口, 例: Obsidian + Chrome(谷歌学术索引) )、... -- 虚拟桌面 9:交流情景 1:日常闲聊, 例:Telegram + Reddit + -- 虚拟桌面 9:交流情景 2:工作交流, 例:Slack + Skype + GMail -- 虚拟桌面 9:交流情景 3:展示演讲, 例:Google Meeting + (vscode | 页面应用 | 需求文档 | 反馈文档) -- 虚拟桌面 0:娱乐情景 1:打游戏, 例:Age of Empires、Minecraft、Skyrim、Overcooked 2、... -- 虚拟桌面 0:娱乐情景 3:看电影、听歌, 例:PotPlayer、Youtube Music、...)、... -- ... 更多例子欢迎提 Issue 或 PR 来补充 +- Virtual desktop 1: Planning scenario: Schedule window + Multi-platform sync notes, e.g.: Google Calendar + Notion + Gmail. +- Virtual desktop 2: Learning scenario: Book reading window, note-taking window, e.g.: OneNote + Calibre, etc. +- Virtual desktop 3: Work scenario 1 (Front-end Development): Code editing + Documentation querying + Browser, e.g.: Chrome(dev) + VSCode + [stackoverflow](https://stackoverflow.com), etc. +- Virtual desktop 4: Work scenario 2 (Back-end Development): Code editing + Documentation querying + Backend terminal + Database browser, e.g.: DBeaver + VSCode(+bash) + [stackoverflow](https://stackoverflow.com), etc. +- Virtual desktop 5: Work scenario 3 (Script Development): Code editing + Documentation querying + Script target, e.g.: VSCode(+bash) + [stackoverflow](https://stackoverflow.com) etc. +- Virtual desktop 6: Work scenario 4 (3D Modeling and Rendering): 3D modeling software + Material searching, e.g.: Blender + Chrome. +- Virtual desktop 7: Work scenario 5 (3D Printing Slicing): Slicing software + Model searching window, e.g.: Cura + [thingiverse](https://thingiverse.com) +- Virtual desktop 7: Work scenario 6 (Video Processing): Editing + Material management, e.g.: PR + Everything. +- Virtual desktop 7: Work scenario 7 (Video Processing): Post-production + Documentation tutorial, e.g.: AE + Chrome. +- Virtual desktop 8: Writing scenario: Writing window, material referencing window, e.g.: Obsidian + Chrome (Google Scholar Index), etc. +- Virtual desktop 9: Communication scenario 1: Casual chats, e.g.: Telegram + Reddit + . +- Virtual desktop 9: Communication scenario 2: Work communication, e.g.: Slack + Skype + Gmail. +- Virtual desktop 9: Communication scenario 3: Presentation, e.g.: Google Meeting + (Vscode | Page application | Requirements document | Feedback document). +- Virtual desktop 0: Entertainment scenario 1: Playing games, e.g.: Age of Empires, Minecraft, Skyrim, Overcooked 2, etc. +- Virtual desktop 0: Entertainment scenario 3: Watching movies, listening to songs, e.g.: PotPlayer, Youtube Music, etc... +- ... More examples are welcome. Provide Issues or PRs for supplementation. -雪星不建议你同时处理太多任务,但 CapsLockX 可以为你保存你的思考环境,最大限度地降低你在任务切换中的心智成本,也就是可以为你省去很多重新排列窗口的时间以及由此失去的注意力。 +Snowstar does not recommend you handle too many tasks at the same time, but CapsLockX can save your thinking environment, greatly reducing the mental cost you incur during task switching, that is, saving you a lot of time rearranging windows and the resulting loss of attention. -(注:如果你喜欢同时处理很多个任务,你可能不止需要一台内存不小的电脑,还需要一团容量不小的脑子 :D ) +(Note: If you like to handle many tasks at the same time, you might need not only a computer with not a small amount of memory but also a brain of significant capacity :D ) -#### Windows 窗口切换的用户体验提升 - Win+tab +#### Enhancing the User Experience of Windows Window Switching - Win+Tab -Alt+Tab 窗口切换时,如果窗口过多,就会显示一个二维窗口预排列。 -一般来说,Alt+Tab 和 Alt+Shift+Tab 是一个纯左手的键位,如果用户希望选选择下一行的窗口,就会本能地按很多下 Alt+Tab。 -而用于二维操作的方向键则因为右手通常放在鼠标上或者 j 键上而常常被忽视。 +When switching windows with Alt+Tab, if there are too many windows, a two-dimensional window pre-arrangement display will show up. +Generally speaking, Alt+Tab and Alt+Shift+Tab are purely left-handed keystrokes. If the user wants to select the window in the next line, they will instinctively press Alt+Tab many times. +However, the directional keys used for two-dimensional operations are often ignored because the right hand is usually on the mouse or on the J key. -并且,用户会在放开 Tab 键后继续按住 Alt 键来浏览窗口,并选择要切换的目标窗口。 -而 CLX 在此处将启用 Alt+WASD 来代替方向键的功能,以实现左手直接进行多行窗口切换,这样不需要按 Shift 就能向左回退。 -并且如果用户需要清理或关闭多个窗口,只需要按下 Alt+X 就能直接批量清理多个目标窗口并且同时保持在窗口浏览界面内。 +Also, users will continue to hold down the Alt key after releasing the Tab key to browse the windows and select the target window to switch to. +In CLX, Alt+WASD will be used instead of the arrow keys to perform multiline window switching directly with the left hand, so there is no need to press Shift to go back to the left. +Moreover, if a user needs to clean up or close multiple windows, they simply press Alt+X to batch clean multiple target windows while remaining within the window browsing interface. -在 CLX 中,这些功能这极大地提高了 Alt+Tab 的可用性。 +In CLX, these features greatly improve the usability of Alt+Tab. #### TODO-Docs
Click to expand TODO-docs -#### 焦点数量:活动窗口、默认活动窗口、…… +#### Focus count: Active window, default active window, … -每个桌面只有一个活动焦点窗口,而虚拟桌面可以实现切换到该桌面时自动切换该虚拟桌面的焦点窗口,实现多个任务焦点(即活动窗口)。 +Each desktop has only one active focus window, and the virtual desktop can achieve automatic switching to the focus window of that virtual desktop when switching to it, achieving multiple task focuses (i.e., active windows). -#### 多屏幕的利用 - Multi-screening +#### Utilizing Multiple Screens - Multi-screening -#### 4K 时代的窗口排列 - Window arrange with 4k screen +#### Window Arrangement in the Era of 4K - Window arrange with 4k screen -Windows 10 默认窗口排列的限制: +Default window arrangement limitations in Windows 10: -1. 不适用于多桌面 -2. 不必要的窗口间隙过大 +1. Not applicable to multiple desktops. +2. Unnecessary window gaps are too large. -##### Linux 与 Mac 窗口的管理 - Window Manager in Linux and mac +##### Window Management on Linux and Mac - Window Manager in Linux and mac -TODO: i3 窗口管理 +TODO: i3 Window Management -##### Android 与 iOS 的窗口管理 - Window Manage in android +##### Window Management on Android and iOS - Window Manage in android -系统级两种方案:左右上下分屏、浮动窗口;应用级:浮动组件、 +Two system-level solutions: Left-right top-bottom split screen, floating windows; Application level: floating components, -### 编辑操作的困扰 +### Troubles with Editing Operations -#### 键入区与编辑控制区的疏远 +#### The Distance Between the Typing Area and Editing Control Area -TODO 漫谈 ThinkPad 与 mac 方向键位、来自 VIM 的灵感、 +TODO Discussion on ThinkPad and Mac arrow keys, inspiration from VIM, -#### 并击的概念 +#### The Concept of Chording -TODO 各种类型的并击 +TODO Various types of chording -TODO 并击的信息量提升计算 +TODO Calculation of information quantity increase with chording -### 图形界面的困扰 +### Troubles with the Graphical User Interface -TODO:文档:鼠标模拟功能介绍、RPG 游戏的移动 +TODO: Document: Introduction to mouse simulation function, movement in RPG games -### 人类的速度认知 +### Human Perception of Speed -TODO:指数增长的世界感知,焦点,听力、视觉、触觉,VS 常规线性操作 +TODO: World perception of exponential growth, focus, auditory, visual, tactile, VS conventional linear operations -### 软件的热键缺陷 +### Shortcut Deficiencies in Software -TODO:应用增强模块介绍 +TODO: Application enhancement module introduction -### 便携键盘的可用性 +### The Usability of Portable Keyboards -TODO:FN 键、方向键、编辑操作、61 配列 vs 87 键配列、 +TODO: FN key, arrow keys, editing operations, 61-key layout vs 87-key layout,
- - - - -### 帮助模块 - -如果你想学习如何开发 CapsLockX 的插件,请: - -1. 打开 `Modules/@Help.ahk` , 你可以了解到 CapsLockX 插件的基本格式 -2. 将它复制一份,命名为你自己的插件名称 -3. 将它本来的功能改成你自己需要的功能,插件的开发就完成啦! - -## 本模块功能见下 - -| 作用于 | 按键 | 功能 | -| ------ | --------------------- | -------------------------------- | -| 全局 | CapsLockX + / | 临时显示热键提示 | -| 全局 | CapsLockX + Alt + / | 🔗 打开 CapsLockX 的完整文档页面 | -| 全局 | CapsLockX + Shift + / | 🕷 提交 bug、建议等 | - - - -### Anki 增强模块 - -Anki 操作增强 - -## 常用功能/特性 - -1. 使用 WASD 或 HJKL 来快速连续地(并且可以撤销)切换记忆卡片 -2. 在 Excel 制作一个单词列表,共 2 列, 全选复制,然后在 Anki 中按 Alt + i 来快速导入单词列表。 -3. 简化 4 个选项为 3 个方向键,左易,下中,右难,上撤销。 -4. 可配合手柄使用,使用 XPadder 配置手柄摇杆映射到方向键即可。效果请见 bilibili [中二雪星怎背词 - 手柄怎么可以不用来背单词!](https://www.bilibili.com/video/av8456838/) - -## 说明 - -| 模式 | Anki 增强模块 | 说明 | -| -------------------- | :------------: | ----------------------------------------------------------- | -| 在 Anki-学习界面 | `w 或 k 或 ↑` | 按下=撤销,松开显示答案 | -| 在 Anki-学习界面 | `a 或 h 或 ←` | 按下=顺利,松开显示答案 | -| 在 Anki-学习界面 | `s 或 j 或 ↓` | 按下=一般,松开显示答案 | -| 在 Anki-学习界面 | `d 或 l 或 →` | 按下=生疏,松开显示答案 | -| 在 Anki-学习界面 | `q` | 返回上个界面 | -| 在 Anki-学习界面 | `c` | 添加新卡片 | -| 在 Anki-学习界面 | `1 或 NumPad1` | 困难(原键位) | -| 在 Anki-学习界面 | `2 或 NumPad2` | 生疏(原键位) | -| 在 Anki-学习界面 | `3 或 NumPad3` | 一般(原键位) | -| 在 Anki-学习界面 | `4 或 NumPad4` | 顺利(原键位) | -| 在 Anki-学习界面 | `5 或 NumPad5` | 撤销 | -| 在 Anki-学习界面 | `6 或 NumPad6` | 暂停卡片 | -| 在 Anki-学习界面 | `Alt + i` | 快速导入剪贴版的内容(按 Tab 分割) / 比如可以从 Excel 复制 | -| 在 Anki-添加卡片界面 | `Alt + s` | 按下 添加 按钮 | - - - -### OneNote 2016 - 2019 增强 - -朴素地增强 OneNote 2016 - 2019 的键盘操作,便捷地使用键盘来:换笔,制作链接,整理页面,调整视图…… - -## 雪星喵常用功能 - -1. 做日志的时候,先在笔记页面 `Alt + T` 给笔记标题添加日期标签(用于将来搜索),然后全局 `Win + Shift + N` 在 OneNote 搜索带有 今日标签 的所有笔记,用来方便地检索你今日的:恋爱日记、训练日志、每日书单、项目日报……总之在 OneNote 写日记就很方便了,一按就出来,不用找 XD -2. 选一个词按 `Alt + K` ,会把所有相关的页面链接列到这个词的下方,用来做索引目录,把你的 OneNote 织成一张网。 -3. 新建一个笔记,改名叫 `我的剪贴板`,然后在复制文本、图片的时候,CLX 会帮你自动追加到这个笔记,用于方便地收集资料或摘抄文章。 -4. Alt + 1234567 层级折叠,轻松地在不同抽象层次的思考上切换。 - -## 按键分布设计(开发中) - -| 按键描述 | 作用 | 备注 | -| ----------------------- | ----------------------- | ---------- | -| `所有 OneNote 自带热键` | 原功能 | | -| `按一下 Alt 再按别的` | 触发 OneNote 原菜单功能 | | -| `Alt + 1234567` | 大纲折叠展开到 1-7 层级 | | -| `Alt + qwe asd r` | 工具、换笔、视图 | | -| `Alt + f` | 查找标签 | | -| `Alt + -=` | 公式相关 | | -| `Alt + m` | 移动笔记、分区 | | -| `Alt + hjkl` | 各种链接功能 | | -| `Alt + zxcv` | 高级复制粘贴 | 细节开发中 | -| `Alt + /` | 热键帮助、提示 | 开发中 | -| `F2 F3` | 重命名、查找笔记 | | - -## 详细按键表 / CheatSheet - -| 作用于 | 格式热键 | 功能 | -| ------------------------ | ---------------------------- | ------------------------------------------------------------------------- | -| 全局 | `Win + Alt + N` | 打开快速笔记第一页(弥补 OneNote 原本没有像 Notion 一样的首页概念的不足) | -| 全局 | `Win + Shift + N` | 打开 OneNote 并精确搜索今日标签 | -| OneNote2019 | `Alt + 1234567` | 大纲:大纲折叠展开到那层(强烈推荐,超好用) | -| OneNote2019 | `F2` | 整理:重命名笔记 | -| OneNote2019 | `Shift + F2` | 整理:重命名分区 | -| OneNote2019 | `Alt + m` | 整理:移动笔记 | -| OneNote2019 | `Alt + Shift + m` | 整理:移动分区 | -| OneNote2019 | `Ctrl + n` | 整理:新建笔记 | -| OneNote2019 | `Ctrl + Alt + n` | 整理:在当前笔记下方新建笔记 | -| OneNote2019 | `Alt + Delete` | 整理:快速删除当前页面 | -| OneNote2019 | `Ctrl + s` | 整理:立即同步此笔记本 | -| OneNote2019 | `Ctrl + w` | 整理:关闭窗口 | -| OneNote2019 | `Shift + Delete` | 编辑:快速删除当前行 | -| OneNote2019 | `Alt + -` | 编辑:自动 2 维化公式 | -| OneNote2019 | `Alt + k` | 编辑:⭐🔗 展开当前关键词的相关页面链接(快速关键词一对多链接) | -| OneNote2019 | `Alt + n` | 样式:切换页面为无色背景 | -| OneNote2019 | `Alt + v` | 样式:改变文字背景色 | -| OneNote2019 | `Alt + q` | 工具:拖动 | -| OneNote2019 | `Alt + w` | 工具:套锁 | -| OneNote2019 | `Alt + e` | 工具:橡皮 | -| OneNote2019 | `Alt + s` | 工具:输入 | -| OneNote2019 | `Alt + a` | 工具:换到第 2 支笔 | -| OneNote2019 | `Alt + d` | 工具:打开换笔盘(然后可可方向键选笔 (目前全屏无效) | -| OneNote2019 | `Alt + d -> 1234567` | 工具:打开换笔盘(然后选第 1 行第 x 支笔) (目前全屏无效) | -| OneNote2019 | `Alt + d -> Shift + 1234567` | 工具:打开换笔盘(然后选第 2 行第 x 支笔) (目前全屏无效) | -| OneNote2019 | `Alt + r` | 视图:缩放到原始大小 | -| OneNote2019 | `Alt + y` | 视图:缩放到页面宽度 | -| OneNote2019 | `^!+- 或 ^!+=` | 视图:缩小页面 或 放大页面 | -| OneNote2019 | `Alt + f` | 视图:搜索标记 | -| OneNote2019 | `Alt + t` | 编辑:给笔记增加日期标签,例如: (20220717) | -| OneNote2019 | `Ctrl + Shift + c` | 编辑:复制(纯文本) | -| OneNote2019 | `Ctrl + Shift + v` | 编辑:粘贴(纯文本) | -| OneNote2019 创建链接窗口 | `Alt + s` | 编辑:复制当前所有搜索结果页面的链接 | -| OneNote2019 创建链接窗口 | `Alt + Shift + s` | 编辑:复制当前所有搜索结果页面的链接并粘贴 | -| OneNote2019 剪贴板笔记 | `Ctrl + C` | 编辑:⭐ 追加复制的内容到名称中含有 "Clipboard" 或 "剪贴板" 的笔记 | - - - -### 讯飞输入法悬浮窗插件 - -#### 用法 - -| 作用于 | 按键 | 功能说明 | -| ------ | :-----: | --------------------- | -| 全局 | Win + H | 启动/切换讯飞语音输入 | - -#### 注 - -1. 原 `Win + H` 的功能是 Windows 自带听写,安装本插件后,可通过 `Win + Shift + H` 使用原 Windows 的听写 -2. 若没有安装讯飞语音则会自动询问是否引导下载安装 - -#### 效果如下图 - -![App-讯飞语音输入法悬浮窗演示.gif](./media/App-讯飞语音输入法悬浮窗演示.gif) - - - -### CLX - Brainstorm 大脳风暴 - -任何時間,任何輸入框,按下 `CLX+b` 鍵,開始使用 AI 輔助輸入。 - -#### 按键分布(开发中) - -| 按键描述 | 作用 | 备注 | -| --------------- | ---------------------------------------------------- | ---- | -| CLX + b | 自動複製当前选中内容,輸入指令,让 AI 辅助你的輸入 | | -| CLX + Alt + b | 配置激活碼(目前只有免費方案,将来可能加入功能増強) | | -| CLX + Shift + b | 査看使用額度 | | + + + + +### Help Module + +If you want to learn how to develop plugins for CapsLockX, please: + +1. Open `Modules/@Help.ahk`, where you can learn the basic format of CapsLockX plugins. +2. Copy it and name it with your own plugin name. +3. Change its original functionality to what you need, and the plugin development is done! + +## Functionality of this module is described below + +| Applied to | Key | Function | +| ---------- | --------------------- | ------------------------------------------------- | +| Global | CapsLockX + / | Temporarily display hotkey hints | +| Global | CapsLockX + Alt + / | 🔗 Open the full documentation page for CapsLockX | +| Global | CapsLockX + Shift + / | 🕷 Submit bugs, suggestions, etc. | + + + +### Anki Enhancement Module + +Enhanced operations for Anki + +## Common Features/Characteristics + +1. Use WASD or HJKL to quickly and continuously (and reversibly) switch between flashcards. +2. Create a word list in Excel with 2 columns, select all, copy, and then press Alt + i in Anki to quickly import the list of words. +3. Simplify the 4 options to 3 directional keys, left for easy, down for medium, right for hard, up to undo. +4. Can be used in conjunction with a gamepad, use XPadder to configure the gamepad joystick to map to the directional keys. For effect, see bilibili [Zhōngèr xuě xīng zěn bèi cí - How can a gamepad not be used for memorizing words!](https://www.bilibili.com/video/av8456838/) + +## Instructions + +| Mode | Anki Enhancement Module | Description | +| -------------------------- | :---------------------: | ----------------------------------------------------------------------------------------- | +| In Anki-Study Interface | `w or k or ↑` | Press to undo, release to show answer | +| In Anki-Study Interface | `a or h or ←` | Press for easy, release to show answer | +| In Anki-Study Interface | `s or j or ↓` | Press for good, release to show answer | +| In Anki-Study Interface | `d or l or →` | Press for hard, release to show answer | +| In Anki-Study Interface | `q` | Go back to the previous interface | +| In Anki-Study Interface | `c` | Add a new card | +| In Anki-Study Interface | `1 or NumPad1` | Hard (original key position) | +| In Anki-Study Interface | `2 or NumPad2` | Again (original key position) | +| In Anki-Study Interface | `3 or NumPad3` | Good (original key position) | +| In Anki-Study Interface | `4 or NumPad4` | Easy (original key position) | +| In Anki-Study Interface | `5 or NumPad5` | Undo | +| In Anki-Study Interface | `6 or NumPad6` | Suspend card | +| In Anki-Study Interface | `Alt + i` | Quickly import contents from the clipboard (separated by Tab) / e.g., can copy from Excel | +| In Anki-Add Card Interface | `Alt + s` | Press the Add button | + + + +### OneNote 2016 - 2019 Enhancements + +Simply enhance the keyboard operations in OneNote 2016 - 2019, conveniently use the keyboard to: change pens, create links, organize pages, adjust views... + +## Common Features of Snowstar Meow + +1. When making diary entries, first add a date tag to the note title on the note page with `Alt + T` (for future searches), then use the global shortcut `Win + Shift + N` to search for all notes with the tag 'Today' in OneNote. It makes it easy to retrieve your daily records: love diary, training logs, daily reading lists, project reports... In short, writing a diary in OneNote is very convenient, they just pop up with a keystroke, no need to search XD +2. Select a word and press `Alt + K`, and it will list all the related page links underneath that word, to create an index directory, weaving your OneNote into a web. +3. Create a new note, rename it to `My Clipboard`, and when you copy text or pictures, CLX will automatically append them to this note for you, making it easy to collect materials or excerpt articles. +4. Alt + 1234567 for hierarchical folding, easily switch between different levels of abstract thinking. + +## Keyboard Layout Design (Under Development) + +| Key Description | Function | Remarks | +| ---------------------------- | ----------------------------------------- | ---------------------- | +| `All OneNote Hotkeys` | Original functions | | +| `Press Alt then another key` | Trigger OneNote's original menu functions | | +| `Alt + 1234567` | Outline collapse/expand to levels 1-7 | | +| `Alt + qwe asd r` | Tools, change pen, view | | +| `Alt + f` | Find tags | | +| `Alt + -=` | Formula related | | +| `Alt + m` | Move notes, sections | | +| `Alt + hjkl` | Various linking functions | | +| `Alt + zxcv` | Advanced copy-paste | Details in development | +| `Alt + /` | Hotkey help, hints | Under development | +| `F2 F3` | Rename, search notes | | + +## Detailed Key Bindings / CheatSheet + +| Applies To | Hotkey | Function | +| ------------------------------ | ---------------------------- | ------------------------------------------------------------------------------------------------------ | +| Global | `Win + Alt + N` | Open the first page of Quick Notes (compensates for OneNote's lack of a home page concept like Notion) | +| Global | `Win + Shift + N` | Open OneNote and search precisely for today's tag | +| OneNote2019 | `Alt + 1234567` | Outline: Expand or collapse the outline to that level (highly recommended, very useful) | +| OneNote2019 | `F2` | Organize: Rename note | +| OneNote2019 | `Shift + F2` | Organize: Rename section | +| OneNote2019 | `Alt + m` | Organize: Move note | +| OneNote2019 | `Alt + Shift + m` | Organize: Move section | +| OneNote2019 | `Ctrl + n` | Organize: Create new note | +| OneNote2019 | `Ctrl + Alt + n` | Organize: Create new note below current one | +| OneNote2019 | `Alt + Delete` | Organize: Quickly delete current page | +| OneNote2019 | `Ctrl + s` | Organize: Immediately synchronize this notebook | +| OneNote2019 | `Ctrl + w` | Organize: Close window | +| OneNote2019 | `Shift + Delete` | Edit: Quickly delete current line | +| OneNote2019 | `Alt + -` | Edit: Auto-convert equations to 2D | +| OneNote2019 | `Alt + k` | Edit: ⭐🔗 Expand links to pages related to the current keyword (fast keyword one-to-many linking) | +| OneNote2019 | `Alt + n` | Style: Switch page to colorless background | +| OneNote2019 | `Alt + v` | Style: Change text background color | +| OneNote2019 | `Alt + q` | Tool: Dragging | +| OneNote2019 | `Alt + w` | Tool: Latch | +| OneNote2019 | `Alt + e` | Tool: Eraser | +| OneNote2019 | `Alt + s` | Tool: Input | +| OneNote2019 | `Alt + a` | Tool: Switch to second pen | +| OneNote2019 | `Alt + d` | Tool: Open pen tray (select pen with arrow keys (currently ineffective fullscreen)) | +| OneNote2019 | `Alt + d -> 1234567` | Tool: Open pen tray (then select the 1st row x pen) (currently ineffective fullscreen) | +| OneNote2019 | `Alt + d -> Shift + 1234567` | Tool: Open pen tray (then select the 2nd row x pen) (currently ineffective fullscreen) | +| OneNote2019 | `Alt + r` | View: Zoom to original size | +| OneNote2019 | `Alt + y` | View: Zoom to page width | +| OneNote2019 | `^!+- or ^!+=` | View: Zoom out or zoom in page | +| OneNote2019 | `Alt + f` | View: Search for tags | +| OneNote2019 | `Alt + t` | Edit: Add the date tag to the note, e.g., (20220717) | +| OneNote2019 | `Ctrl + Shift + c` | Edit: Copy (plain text) | +| OneNote2019 | `Ctrl + Shift + v` | Edit: Paste (plain text) | +| OneNote2019 Create Link Window | `Alt + s` | Edit: Copy links to all search result pages | +| OneNote2019 Create Link Window | `Alt + Shift + s` | Edit: Copy and paste links to all search result pages | +| OneNote2019 Clipboard Note | `Ctrl + C` | Edit: ⭐ Append copied content to the note with "Clipboard" or "剪贴板" in its name | + + + +### Xunfei Input Method Floating Window Plugin + +#### Usage + +| Applies To | Key | Function Description | +| ---------- | :-----: | ---------------------------------- | +| Global | Win + H | Start/Switch to Xunfei Voice Input | + +#### Notes + +1. The original `Win + H` function is Windows' built-in dictation. After installing this plugin, you can use the original Windows dictation with `Win + Shift + H`. +2. If Xunfei voice is not installed, it will automatically ask whether to guide the download and installation. + +#### Effect is shown in the following image + +![App-Xunfei Voice Input Method Floating Window Demo.gif](./media/App-Xunfei Voice Input Method Floating Window Demo.gif) + + + +### CLX - Brainstorm + +At any time, in any input field, press the `CLX+b` key to start using AI-assisted typing. + +#### Key Layout (Under Development) + +| Key Description | Function | Note | +| --------------- | -------------------------------------------------------------------------------------------------- | ---- | +| CLX + b | Automatically copy the current selection, enter a command, and let AI assist your typing | | +| CLX + Alt + b | Configure activation code (currently only a free plan, more features might be added in the future) | | +| CLX + Shift + b | Check usage quota | | #### Protips: -##### 随時整理会議記録 +##### Organize meeting minutes anytime -1. 任何輸入框内,使用 Win+H 來調出語音輸入,然後說出你想要的文字,不用在意語音輸入的準確度,只要說出大概的意思就可以了, -2. 然後全選按下 `CLX+b`,輸入 `列出要点和待辦事項`,就可以看到 AI 自動幫你整理出來的要點和待辦事項。 +1. In any input box, use Win+H to call out voice input, then speak the text you want, no need for precision, just convey the general idea. +2. Then select all and press `CLX+b`, enter `List key points and to-do items`, and you can see the key points and to-do items automatically organized by AI. -##### 随時翻訳任何語言到任何語言 +##### Translate any language to any language at any time -1. 任何輸入框内,选中你想要翻譯的文字 -2. 然後全選按下 `CLX+b`,`to chinese:` AI 自動幫你輸入成中文。 +1. In any input box, select the text you want to translate. +2. Then select all and press `CLX+b`, enter `to chinese:`, and AI will automatically input it in Chinese. - + -### 编辑增强插件( TG YUIO HJKL ) 🌟 +### Editing Enhancement Plugin (TG YUIO HJKL) 🌟 -这个世界上还有比 Vim 模式的 HJKL 移动光标更棒的东西吗? -这个必须有! -那就是带加速度的 HJKL 流畅编辑体验!想不想试试让你的光标来一次排水沟过弯的高端操作?装它! +Is there anything better in the world than Vim mode's HJKL cursor movement? There must be! +That's the accelerated HJKL smooth editing experience! Want to try letting your cursor perform a high-end maneuver like speeding around a drain? Install it! ![EditorCursorMovement.gif](./media/EditorCursorMovement.gif) -| 作用域 | Edit 模块 | 说明 | -| ---------- | --------------------- | -------------------------------- | -| 全局(基本) | `CapsLockX + h j k l` | 上下左右 方向键 | -| 全局(基本) | `CapsLockX + y o` | Home End | -| 全局(基本) | `CapsLockX + u i` | PageUp PageDown | -| 全局(基本) | `CapsLockX + [ ]` | Shift+Tab 和 Tab | -| 全局(基本) | `CapsLockX + g` | 回车 | -| 全局(进阶) | `CapsLockX + t` | Delete | -| 全局(进阶) | `CapsLockX + hl` | hl 一起按选择当前词 | -| 全局(进阶) | `CapsLockX + kj` | kj 一起按选择当前行 | -| 全局(进阶) | `CapsLockX + h + t` | 移位后删:大部分情况可代替退格键 | +| Scope | Edit Module | Description | +| ---------------- | --------------------- | ---------------------------------------------------------------- | +| Global(Basic) | `CapsLockX + h j k l` | Arrow keys: up, down, left, right | +| Global(Basic) | `CapsLockX + y o` | Home End | +| Global(Basic) | `CapsLockX + u i` | PageUp PageDown | +| Global(Basic) | `CapsLockX + [ ]` | Shift+Tab and Tab | +| Global(Basic) | `CapsLockX + g` | Enter | +| Global(Advanced) | `CapsLockX + t` | Delete | +| Global(Advanced) | `CapsLockX + hl` | Press hl together to select the current word | +| Global(Advanced) | `CapsLockX + kj` | Press kj together to select the current line | +| Global(Advanced) | `CapsLockX + h + t` | Move and delete: In most cases, it can replace the backspace key | - + -### Surface 笔记本扩充功能键 +### Surface Laptop Function Key Expansion -专治各种笔记本残破键盘 +Cures all kinds of broken laptop keyboards -1. 没有右 Ctrl 键?合并 Menu 与 右 Ctrl 键,Menu 当 Ctrl 用 或者 Ctrl 当 Menu 用都可以 -2. 没有 Pause 键?Win + Alt + P 也能打开系统设定信息。 -3. 待补充 +1. No right Ctrl key? Combine Menu with right Ctrl, Menu can be used as Ctrl or Ctrl as Menu. +2. No Pause key? Win + Alt + P can also open system settings info. +3. To be supplemented -| 模式 | 按键 | 功能 | -| ---------------- | :------------------------------------ | ---------------------------------- | -| 全局 | Win + Alt + P | 相当于 Win + Pause,专为笔记本定制 | -| 全局 | 右 Ctrl 按一下 | 会按一下 Menu 弹出菜单 | -| 全局 | 按住右 Menu | 会按住 Ctrl,此时可以与其它键组合 | -| Win 键模拟启用后 | ] 按住同时,[ 按下 | 相当于按 Win 键 | -| Win 键模拟启用后 | RAlt+\| 相当于按 Alt+Tab 只不过在右手 | +| Mode | Key | Function | +| -------------------------- | :---------------------------------------------------------- | -------------------------------------------------------------- | +| Global | Win + Alt + P | Equivalent to Win + Pause, designed for notebooks | +| Global | Press right Ctrl briefly | Presses Menu to pop up the menu | +| Global | Hold right Menu | Holding will press Ctrl, which can be combined with other keys | +| Win key simulation enabled | Hold ] while pressing [ | Equivalent to pressing the Win key | +| Win key simulation enabled | RAlt+\| is equivalent to pressing Alt+Tab on the right hand | - + -### 媒体键模块 +### Media Keys Module -| 作用于 | 媒体键模块 | 说明 | -| ------ | ----------------- | ------------------------------------------- | -| 全局 | `CapsLockX + F1` | 打开:我的电脑 | -| 全局 | `CapsLockX + F2` | 打开:计算器 | -| 全局 | `CapsLockX + F3` | 打开:浏览器主页 | -| 全局 | `CapsLockX + F4` | 打开:媒体库(默认是 Windows Media Player) | -| 全局 | `CapsLockX + F5` | 播放:暂停/播放 | -| 全局 | `CapsLockX + F6` | 播放:上一首 | -| 全局 | `CapsLockX + F7` | 播放:下一首 | -| 全局 | `CapsLockX + F8` | 播放:停止 | -| 全局 | `CapsLockX + F9` | 音量加 | -| 全局 | `CapsLockX + F10` | 音量减 | -| 全局 | `CapsLockX + F11` | 静音 | +| Applies To | Media Keys Module | Description | +| ---------- | ----------------- | ----------------------------------------------------- | +| Global | `CapsLockX + F1` | Open: My Computer | +| Global | `CapsLockX + F2` | Open: Calculator | +| Global | `CapsLockX + F3` | Open: Browser homepage | +| Global | `CapsLockX + F4` | Open: Media library (default is Windows Media Player) | +| Global | `CapsLockX + F5` | Playback: Pause/Play | +| Global | `CapsLockX + F6` | Playback: Previous track | +| Global | `CapsLockX + F7` | Playback: Next track | +| Global | `CapsLockX + F8` | Playback: Stop | +| Global | `CapsLockX + F9` | Volume up | +| Global | `CapsLockX + F10` | Volume down | +| Global | `CapsLockX + F11` | Mute | - + -### 模拟鼠标插件( WASD QERF ) +### Simulated Mouse Plugin (WASD QERF) -> 一直以来,我总是以键盘控自居,应该是在从前做模型的时候伤到了手指关节开始,成为键盘重度用户的。各种键盘加速工具,主动去记住各种快捷键,力求少用鼠标,甚至去学习了 vim 和 emacs。但是,很多时候,鼠标是无可替代的,尤其是在图形界面大行其道时候。 +> I have always prided myself on being a keyboard enthusiast, probably starting when I injured my finger joints while working on models, becoming a heavy keyboard user. Various keyboard acceleration tools, actively remembering various shortcuts, trying to use the mouse less, even learning vim and emacs. But many times, the mouse is irreplaceable, especially when graphical interfaces are prevalent. -—— 以上是来自 [SimClick 模拟点击](https://github.com/rywiki/simclick) 作者的一段话,这是一款以网格细分方式模拟鼠标的作品,可以与本项目互补 +—— The above is a quote from the author of [SimClick](https://github.com/rywiki/simclick), a project for simulating mouse actions through grid partitioning, which can complement this project. -—— 由 [秦金伟](http://rsytes.coding-pages.com/) 推荐 +—— Recommended by [Qin Jinwei](http://rsytes.coding-pages.com/) -## 功能 +## Features -- 本模块使用按键区:CapsLockX + QWER ASDF -- 非常舒适地使用 WASD QE RF 来模拟【完整的】鼠标功能,相信我,试过这种手感之后,你会喜欢上它的。 -- 指针移动时会自动黏附各种按钮、超链接。滚轮的指数级增长的加速度滚动机制使你再也不惧怕超级长的文章和网页。 -- 效果如图: +- This module uses the key area: CapsLockX + QWER ASDF +- Very comfortably use WASD QE RF to simulate [full] mouse functionality, believe me, after trying this feel, you'll love it. +- The pointer automatically sticks to various buttons, hyperlinks when moved. The wheel's exponentially accelerating scrolling mechanism means you'll no longer fear super long articles and web pages. +- The effect is shown in the image: ![CLX-Mouse.gif](./media/CLX-Mouse.gif) -## 使用方法如下 +## Instructions for Use -| 作用于 | 按键 | 说明 | -| ------ | ------------------------------------- | ---------------------------------------- | -| 全局 | `CapsLockX + w a s d` | 鼠标移动(上下左右) | -| 全局 | `CapsLockX + ad` | 将 HJKL 键切换到滚轮模式(上下左右滚动) | -| 全局 | `CapsLockX + r f` | 垂直滚轮(上下) | -| 全局 | `CapsLockX + Shift + r f` | 水平滚轮(左右) | -| 全局 | `CapsLockX + Ctrl + Alt + r f` | 垂直滚轮自动滚动(上 下) | -| 全局 | `CapsLockX + Ctrl + Alt + Shift+ r f` | 水平滚轮自动滚动(左 右) | -| 全局 | `CapsLockX + rf` | rf 同时按相当于鼠标中键 | -| 全局 | `CapsLockX + e` | 鼠标左键 | -| 全局 | `CapsLockX + q` | 鼠标右键 | +| Applies to | Key Combination | Description | +| ---------- | ------------------------------------- | ------------------------------------------------------------- | +| Global | `CapsLockX + w a s d` | Mouse movement (up, down, left, right) | +| Global | `CapsLockX + ad` | Toggle HJKL keys to wheel mode (scroll up, down, left, right) | +| Global | `CapsLockX + r f` | Vertical scroll wheel (up, down) | +| Global | `CapsLockX + Shift + r f` | Horizontal scroll wheel (left, right) | +| Global | `CapsLockX + Ctrl + Alt + r f` | Auto vertical scroll (up, down) | +| Global | `CapsLockX + Ctrl + Alt + Shift+ r f` | Auto horizontal scroll (left, right) | +| Global | `CapsLockX + rf` | Pressing rf together is equivalent to the middle mouse button | +| Global | `CapsLockX + e` | Left mouse button | +| Global | `CapsLockX + q` | Right mouse button | -## 操作细节 +## Operation Details -快速连按 AD 步进 +Quick tap AD for stepping - + -### JavaScript 计算 (建议安装 NodeJS ) +### JavaScript Evaluation (NodeJS installation recommended) -| 作用于 | 按键 | 效果 | -| ------ | --------------- | -------------------------------------- | -| 全局 | `CapsLockX + -` | 计算当前选区 JavaScript 表达式,并替换 | -| 全局 | `CapsLockX + =` | 计算当前选区 JavaScript 表达式,并替换 | +| Applies to | Hotkey | Effect | +| ---------- | --------------- | --------------------------------------------------------------------------------- | +| Global | `CapsLockX + -` | Calculate and replace the current selection with the JavaScript expression result | +| Global | `CapsLockX + =` | Calculate and replace the current selection with the JavaScript expression result | - + -### 窗口增强插件 (CLX + 1234567890 ZXCV) +### Window Enhancement Plugin (CLX + 1234567890 ZXCV) -## 功能简述 +## Feature Overview -用好 Win 10 自带的 10 个虚拟桌面豪华配置、多显示器自动排列窗口、半透明置顶、(注:任务栏和 AltTab 相关功能暂不兼容 Win11,窗口排列功能正常。) +Make the most of Win 10's luxurious configuration with 10 built-in virtual desktops, automatic window arrangement for multi-monitors, translucent always-on-top (Note: Taskbar and AltTab related features are temporarily incompatible with Win11, but window arrangement functions normally.) -1. 窗口切换:`CapsLockX + [Shift] + Z` -2. 窗口关闭:`CapsLockX + [Shift] + X` -3. 窗口排列:`CapsLockX + [Shift] + C` -4. 窗口置顶:`CapsLockX + [Shift] + V` -5. 左手窗口管理:在 `Alt + Tab` 的界面,用 `WASD` 切换窗口,`X` 关掉窗口。 -6. 高效使用虚拟桌面:`CapsLockX + 0123456789` 切换、增减虚拟桌面,加上 `Shift` 键可以转移当前窗口 -7. 虚拟机与远程桌面快速脱离:双击左边 `Shift + Ctrl + Alt`。 +1. Window Switching: `CapsLockX + [Shift] + Z` +2. Window Closing: `CapsLockX + [Shift] + X` +3. Window Arrangement: `CapsLockX + [Shift] + C` +4. Always On Top: `CapsLockX + [Shift] + V` +5. Left-Handed Window Management: In the `Alt + Tab` interface, use `WASD` to switch windows, and `X` to close a window. +6. Efficient Use of Virtual Desktops: `CapsLockX + 0123456789` to switch, add or remove virtual desktops; use the `Shift` key to transfer the current window. +7. Quick Release from Virtual Machines and Remote Desktops: Double click the left `Shift + Ctrl + Alt`. -## 效果图 +## Effect Picture -- Alt + Tab 管理窗口增强 - ![02-插件-窗口增强_Alt+Tab+WASD管理窗口.gif](./02-插件-窗口增强_Alt+Tab+WASD管理窗口.gif) -- CapsLockX + C 一键排列窗口(这 GIF 是旧版本录的看起来比较卡,新版本优化过 API 就不卡了) - ![02-插件-窗口增强_一键排列窗口.gif](./media/02-插件-窗口增强_一键排列窗口.gif) +- Enhanced Alt+Tab Window Management + ![02-Plugin-Enhanced Window Management_Alt+Tab+WASD Window Management.gif](./02-Plugin-Enhanced Window Management_Alt+Tab+WASD Window Management.gif) +- CapsLockX + C to arrange windows with one click (This GIF was recorded on an older version which looks a bit laggy, but the new version has optimized the API so it's not laggy anymore) + ![02-Plugin-Enhanced Window Management_One-Click Arrange Windows.gif](./media/02-Plugin-Enhanced Window Management_One-Click Arrange Windows.gif) -## 使用方法如下 ( Alt+Tab 与 CapsLockX ) +## Usage Instructions ( Alt+Tab and CapsLockX ) -| 作用域 | 窗口增强模块 | 说明 | -| ------------ | ------------------------------------- | ------------------------------------------ | -| Alt+Tab 界面 | `Q E` | 左右切换多桌面 | -| Alt+Tab 界面 | `W A S D` | 上下左右切换窗口选择 | -| Alt+Tab 界面 | `X C` | 关闭选择的窗口(目前 X 和 C 没有区别) | -| Win+Tab 视图 | `Alt + W A S D` | 切换窗口选择 | -| 全局 | `Win + [Shift] + B` | 定位到托盘任务(windows 系統自帯熱鍵) | -| 全局 | `Win + [Shift] + T` | 定位到任務栏任务(windows 系統自帯熱鍵) | -| 全局 | `Win + Shift + hjkl` | 在窗口之间按方向切换焦点 | -| 任务栏 | `Ctrl + W 或 Delete` | 在托盘图标或任务栏任务上,选择退出按钮 | -| 全局 | `CapsLockX + 1 2 ... 9 0` | 切换到第 1 .. 12 个桌面 | -| 全局 | `CapsLockX + Shift + 1 2 ... 9 0 - =` | 把当前窗口移到第 n 个桌面(如果有的话) | -| 全局 | `CapsLockX + Alt + Backspace` | 删除当前桌面(会把所有窗口移到上一个桌面) | -| 全局 | `CapsLockX + C` | 快速排列当前桌面的窗口 | -| 全局 | `CapsLockX + Ctrl + C` | 快速排列当前桌面的窗口(包括最小化的窗口) | -| 全局 | `CapsLockX + Shift + C` | 快速堆叠当前桌面的窗口 | -| 全局 | `CapsLockX + Shift + Ctrl + C` | 快速堆叠当前桌面的窗口(包括最小化的窗口) | -| 全局 | `CapsLockX + Z` | 循环切到最近使用的窗口 | -| 全局 | `CapsLockX + Shift + Z` | 循环切到最不近使用的窗口 | -| 全局 | `CapsLockX + X` | 关掉当前标签页 Ctrl+W | -| 全局 | `CapsLockX + Shift + X` | 关掉当前窗口 Alt+F4 | -| 全局 | `CapsLockX + V` | 让窗口透明 | -| 全局 | `CapsLockX + Shift + V` | 让窗口保持透明(并置顶) | -| 任意窗口 | `双击左边 Shift+Ctrl+Alt` | 后置当前窗口, \* 见下方注 | +| Scope | Window Enhancement Module | Description | +| ------------ | ------------------------------------- | ------------------------------------------------------------------------ | +| Alt+Tab UI | `Q E` | Switch between virtual desktops left and right | +| Alt+Tab UI | `W A S D` | Switch window selection up, down, left, and right | +| Alt+Tab UI | `X C` | Close the selected window (currently no difference between X and C) | +| Win+Tab View | `Alt + W A S D` | Switch window selection | +| Global | `Win + [Shift] + B` | Navigate to system tray tasks (Windows native hotkey) | +| Global | `Win + [Shift] + T` | Navigate to taskbar tasks (Windows native hotkey) | +| Global | `Win + Shift + hjkl` | Switch focus between windows in direction | +| Taskbar | `Ctrl + W or Delete` | Choose the exit button on the tray icon or taskbar task | +| Global | `CapsLockX + 1 2 ... 9 0` | Switch to desktop 1 .. 12 | +| Global | `CapsLockX + Shift + 1 2 ... 9 0 - =` | Move the current window to the nth desktop (if available) | +| Global | `CapsLockX + Alt + Backspace` | Delete current desktop (all windows moved to previous desktop) | +| Global | `CapsLockX + C` | Quickly arrange windows on current desktop | +| Global | `CapsLockX + Ctrl + C` | Quickly arrange windows on current desktop (including minimized windows) | +| Global | `CapsLockX + Shift + C` | Quickly stack windows on current desktop | +| Global | `CapsLockX + Shift + Ctrl + C` | Quickly stack windows on current desktop (including minimized windows) | +| Global | `CapsLockX + Z` | Cycle to most recently used window | +| Global | `CapsLockX + Shift + Z` | Cycle to least recently used window | +| Global | `CapsLockX + X` | Close current tab Ctrl+W | +| Global | `CapsLockX + Shift + X` | Close current window Alt+F4 | +| Global | `CapsLockX + V` | Make window transparent | +| Global | `CapsLockX + Shift + V` | Keep window transparent (and topmost) | +| Any window | `Double-click Left Shift+Ctrl+Alt` | Send current window to back, \* see note below | -\*注: 双击左边 Shift+Ctrl+Alt 设计用于远程桌面与虚拟机,使其可与本机桌面窗口同时显示。 -例如 mstsc.exe、TeamViewer、VirtualBox、HyperV、VMWare 等远程桌面或虚拟机程序,配合 CapsLockX + Shift + V 透明置顶功能,让你在 Windows 的界面上同时使用 Linux 界面或 MacOS 界面再也不是难题。 +\*Note: Double-clicking Left Shift+Ctrl+Alt is designed for remote desktops and virtual machines, allowing simultaneous display with the host desktop windows. +For example, with programs like mstsc.exe, TeamViewer, VirtualBox, HyperV, VMWare, and other remote desktop or virtual machine software, combined with the CapsLockX + Shift + V transparency and topmost feature, using interfaces like Linux or MacOS on Windows is no longer a challenge. -此处借用 [@yangbin9317 的评论](https://v2ex.com/t/772052#r_10458792) +This reference uses [@yangbin9317's comment](https://v2ex.com/t/772052#r_10458792) -> 以 CapsLock 为抓手,打通底层逻辑,拉齐 Windows 和 Linux WM,解决了 Windows 难用的痛点 +> Using CapsLock as the interface, it bridges the underlying logic, aligns Windows with Linux WM, and solves the pain points of Windows. -(20220313) 对于两端都是 Windows 的情况,也可以考虑使用 [RemoteApp Tool - Kim Knight](http://www.kimknight.net/remoteapptool) 来代替远程桌面。 +(20220313) For scenarios where both ends are Windows, you can also consider using [RemoteApp Tool - Kim Knight](http://www.kimknight.net/remoteapptool) as a substitute for remote desktop. - + -### 快捷输入 +### Quick Input -| 模式 | 快捷输入 | 说明 | -| ---- | -------- | ----------------------------------------------- | -| 全局 | `#D#` | 日期输入:`(20220217)` | -| 全局 | `#T#` | 时间输入:`(20220217.220717)` | -| 全局 | `#DT#` | 日期时间输入:`2022-02-17 22:07:33` | -| 全局 | `#NPW#` | 随机输入数字密码如: `7500331260229289` | -| 全局 | `#PW#` | 随机输入数字字母密码如: `yyCTCNYodECTLr2h` | -| 全局 | `#WPW#` | 随机输入数字字母密码如: `FtD5BB1m5H98eY7Y` | -| 全局 | `#SPW#` | 随机输入数字字母符号密码如: `/})y+xK]z~>XKQ+p` | +| Mode | Quick Input | Description | +| ------ | ----------- | ------------------------------------------------------------------------------ | +| Global | `#D#` | Date input: `(20220217)` | +| Global | `#T#` | Time input: `(20220217.220717)` | +| Global | `#DT#` | Date and time input: `2022-02-17 22:07:33` | +| Global | `#NPW#` | Randomly input a numeric password like: `7500331260229289` | +| Global | `#PW#` | Randomly input a numeric and letter password like: `yyCTCNYodECTLr2h` | +| Global | `#WPW#` | Randomly input a numeric and letter password like: `FtD5BB1m5H98eY7Y` | +| Global | `#SPW#` | Randomly input a numeric, letter, and symbol password like: `/})y+xK]z~>XKQ+p` | - + -### 番茄时钟 +### Pomodoro Timer -25 分钟固定循环休息提醒。 +25 minutes fixed cycle for rest reminders. -使用 `CapsLockX + ,` 打开配置,然后修改 EnableScheduleTasks=1 即可启用本插件。 +Use `CapsLockX + ,` to open the configuration, then change EnableScheduleTasks=1 to enable this plugin. -- 使用番茄报时(00 分和 30 分播放工作铃声,每小时的 25 分和 55 分播放休息铃声)(需要先开启定时任务) +- Use Pomodoro chime (play a working bell sound at 00 and 30 minutes, and a rest bell sound at 25 and 55 minutes of every hour) (schedule tasks must first be enabled) - ```ini +```ini UseTomatoLife=1 - ``` +``` -- 使用番茄报时时,自动切换桌面(使用番茄报时时,自动切换桌面(休息桌面为 1,工作桌面为 2) +- When using Pomodoro chime, automatically switch desktops (rest desktop is 1, work desktop is 2) - ```ini +```ini UseTomatoLifeSwitchVirtualDesktop=1 - ``` +``` -注:如果只需要声音而不需要自动切换桌面的话,也可试试这款 Chrome 插件 [Tomato Life - Chrome 网上应用店](https://chrome.google.com/webstore/detail/25min-tomato-life/kkacpbmkhbljebmpcopjlgfgbgeokbhn) +Note: If you only need the sound and do not need to automatically switch desktops, you can also try this Chrome plugin [Tomato Life - Chrome Web Store](https://chrome.google.com/webstore/detail/25min-tomato-life/kkacpbmkhbljebmpcopjlgfgbgeokbhn) -注注: 本插件已经分离出一个独立项目,如果你喜欢番茄工作法的话可以参见雪星的 tomato-life 项目: [snomiao/tomato-life](https://github.com/snomiao/tomato-life) +Note: This plugin has been separated into an independent project, if you like the Pomodoro technique you can refer to the snow star's tomato-life project: [snomiao/tomato-life](https://github.com/snomiao/tomato-life) - + -### 锁屏自动息屏 +### Auto Turn Off Screen When Locking -按 Win + L 锁屏时,立即关闭屏幕,适用于准备睡觉的时候自动把电脑屏幕关掉,不让它在睡觉的时候刺眼…… +When pressing Win + L to lock the screen, immediately turn off the screen. This is suitable for automatically turning off the computer screen when preparing to sleep, so that it does not dazzle during the night... - + -## 过去与未来 🛰 +## Past and Future 🛰 -### 制作背景 ( 2017 年秋) 🍁 Background +### Production Background (Autumn of 2017) 🍁 Background -> 本人比较经常写代码… -> 起初我习惯右手用鼠标……后来觉得鼠标放右边有点远……改成了左手用鼠标 -> 左手用鼠标之后发现手还是要离开键盘……于是做了个 WASD 模拟鼠标的脚本。(然后就能一直用右手托着下巴玩电脑了) -> 后来写的脚本越来越多,就把其中一些常用的放到一起加载…… +> I often write code… +> At first, I was used to using the mouse with my right hand... later I found it a bit far to put the mouse on the right... so I switched to using the mouse with my left hand. +> After switching to the left hand, I realized I still had to take it off the keyboard... so I made a script that simulates the mouse with the WASD keys. (Then I could keep playing with the computer with my right hand under my chin) +> Later I wrote more and more scripts and put some of the common ones together to load... -### 发展路线 🛰️ RoadMap +### Development RoadMap 🛰️ RoadMap -CapsLockX 的核心理念是:简化系统操作逻辑,提升操作效率,且不与原有习惯键位冲突。 +The core philosophy of CapsLockX is to simplify system operation logic, improve operation efficiency, and not conflict with existing habitual key positions. -1. [x] 按 CapsLockX + - 键显示对应帮助(目前的显示样式相当草率) -2. [ ] i18n (eh 这个真得有) -3. [ ] 自动更新(虽然 git pull 一下也不是不行) -4. [ ] 初次使用上手教程(这个现在有点简陋……) -5. [ ] 插件管理器(虽然文件系统也可以搞定) -6. [ ] 自动配置同步功能(虽然一般来说扔 onedrive 就够) -7. [ ] 易用的选项配置的 UI 界面(虽然改 ini 也不是什么难事) -8. [ ] 执行外部代码(Python、Nodejs、外部 AHK、Bash、……)(虽然写个脚本 run 一下也并不算麻烦) +1. [x] Press CapsLockX + - key to display corresponding help (the current display style is quite rough) +2. [ ] i18n (eh this really should exist) +3. [ ] Auto-update (although git pull is also fine) +4. [ ] Tutorial for first-time users (this is a bit simple now...) +5. [ ] Plugin manager (although the file system could handle it too) +6. [ ] Auto-sync of configuration (though throwing it in OneDrive is usually enough) +7. [ ] A user-friendly options configuration UI (though changing ini isn't that hard) +8. [ ] Execute external code (Python, Nodejs, external AHK, Bash, …) (although running a script isn't much trouble) -如果你有任何想法或建议,请在这里提出: +If you have any ideas or suggestions, please propose them here: [Issues · snomiao/CapslockX](https://github.com/snolab/CapsLockX/issues) -### 组合键含义设计 ⌨ Chore Design +### Key Combination Meaning Design ⌨ Chore Design -Win + 系列 通常为操作系统功能、桌面窗口应用进程管理等、输入法、输出设备(显示器、多屏)管理 +Win + series are generally used for operating system functions, desktop window application process management, input method, output device (display, multiple screens) management. -Alt + 系列 通常表述为调用应用内功能,其含义应相当于按下功能相同的按钮,或跳转到特定功能界面。 +Alt + series typically denote invocation of application internal functions, their meanings should be equivalent to pressing the same function button, or jumping to a specific function interface. -Ctrl + 系列 同上,但使用上更为频繁、且很可能不存在功能相同的按钮。 +Ctrl + series as above, but used more frequently and it's very likely that there is no button with the same function. -Ctrl + Alt + 同上,但一般为全局热键 +Ctrl + Alt + same as above, but generally for global hotkeys. -而 Shift 键 用来在以上功能的基础上稍微改变按键的含义(例如反向操作如 Shift+Alt+Tab,或功能范围扩大如 Shift+方向键调整选区等) +The Shift key is used to slightly change the meaning of the above functions (such as reverse operations like Shift+Alt+Tab, or extended function range like Shift+Arrow keys to adjust the selection, etc.) -### CapsLockX 与类似项目的功能对比 ⚔ Feat Compare Matrix +### CapsLockX vs. Similar Projects Function Comparison ⚔ Feat Compare Matrix -更新于(20200627) 其中的信息可能慢慢过时 +Updated (20200627) The information may become outdated over time -| 功能\项目 | [CapsLockX](https://github.com/snolab/CapsLockX) | [Vonng/CapsLock](https://github.com/Vonng/CapsLock) | [coralsw/CapsEz](https://github.com/coralsw/CapsEz) | [CapsLock+](https://capslox.com/capslock-plus/) | -| :--------------- | :----------------------------------------------- | :-------------------------------------------------- | :-------------------------------------------------- | :---------------------------------------------- | -| 鼠标模拟 | ✅ 流畅完整 | ✅ 无滚轮 | 🈚 无 | 🈚 无 | -| 表达式计算 | ✅ Nodejs 或 JScript | 🈚 无 | 🈚 无 | ✅ TabScript (Snippet + Javascript) | -| 窗口管理 | ✅ 强 | ✅ 有 | ✅ 有 | ✅ 强 | -| 虚拟桌面管理 | ✅ 有 | 🈚 无 | 🈚 无 | 🈚 无 | -| 编辑增强 | ✅ 有(抛物模型) | ✅ 有 | ✅ 有 | ✅ 有(很全) | -| 绿色免安装 | ✅ 是 | ✅ 是 | ✅ 是 | ✅ 是 | -| 增强媒体键 | 不全 | ✅ 全 | 🈚 无 | 🈚 无 | -| 强化的剪贴板 | 弱 | 🈚 无 | 🈚 无 | ✅ 有 | -| 快速启动应用 | ✅ 插件 | ✅ 有 | ✅ 有 | ✅ 有 | -| 应用功能增强 | ✅ 丰富 | 🈚 无 | ✅ 有 | 🈚 无 | -| Bash 控制 | 🈚 无 | ✅ 有 | 🈚 无 | 🈚 无 | -| 快速启动语音输入 | ✅ 讯飞 | 🈚 无 | 🈚 无 | 🈚 无 | -| 快速输入时间日期 | ✅ 有 | | ✅ 有 | | -| 窗口绑定到热键 | 🈚 无 | 🈚 无 | 🈚 无 | ✅ 有 | -| 快速旋转屏幕 | ✅ 有 | 🈚 无 | 🈚 无 | 🈚 无 | -| 二次开发 | ✅ 文档友好 | ✅ 可 | ✅ 可 | ✅ 可 | -| 内存占用 | ✅ 约 2~3M | | | | -| 模块化 | ✅ | 🈚 无 | 🈚 无 | 🈚 无 | -| 系统 | Win | Mac(主),Win(次) | Win | Win, [Mac](https://capslox.com/) | -| 支持语言 | 中文 | 中文 - English | 中文 | 中文 - English | +| Feature\Project | [CapsLockX](https://github.com/snolab/CapsLockX) | [Vonng/CapsLock](https://github.com/Vonng/CapsLock) | [coralsw/CapsEz](https://github.com/coralsw/CapsEz) | [CapsLock+](https://capslox.com/capslock-plus/) | +| :------------------------------ | :----------------------------------------------- | :-------------------------------------------------- | :-------------------------------------------------- | :---------------------------------------------- | +| Mouse Simulation | ✅ Smooth and complete | ✅ No scroll wheel | 🈚 None | 🈚 None | +| Expression Calculation | ✅ Nodejs or JScript | 🈚 None | 🈚 None | ✅ TabScript (Snippet + Javascript) | +| Window Management | ✅ Strong | ✅ Available | ✅ Available | ✅ Strong | +| Virtual Desktop Management | ✅ Available | 🈚 None | 🈚 None | 🈚 None | +| Editing Enhancement | ✅ Available (parabolic model) | ✅ Available | ✅ Available | ✅ Very comprehensive | +| Portable (No Install) | ✅ Yes | ✅ Yes | ✅ Yes | ✅ Yes | +| Enhanced Media Keys | Not all | ✅ All | 🈚 None | 🈚 None | +| Enhanced Clipboard | Weak | 🈚 None | 🈚 None | ✅ Available | +| Quick Application Launch | ✅ Plugins | ✅ Available | ✅ Available | ✅ Available | +| Application Feature Enhancement | ✅ Rich | 🈚 None | ✅ Available | 🈚 None | +| Bash Control | 🈚 None | ✅ Available | 🈚 None | 🈚 None | +| Quick Start Voice Input | ✅ iFLYTEK | 🈚 None | 🈚 None | 🈚 None | +| Quick Input of Time and Date | ✅ Available | | ✅ Available | | +| Bind Window to Hotkey | 🈚 None | 🈚 None | 🈚 None | ✅ Available | +| Quick Screen Rotation | ✅ Available | 🈚 None | 🈚 None | 🈚 None | +| Secondary Development | ✅ Documentation friendly | ✅ Possible | ✅ Possible | ✅ Possible | +| Memory Usage | ✅ About 2~3M | | | | +| Modularization | ✅ | 🈚 None | 🈚 None | 🈚 None | +| System | Win | Mac (main), Win (secondary) | Win | Win, [Mac](https://capslox.com/) | +| Supported Languages | Chinese | Chinese - English | Chinese | Chinese - English | -#### CapsLockX 地址 🔗 Project Urls +#### CapsLockX Address 🔗 Project Urls -以下几个仓库同步更新: +The following repositories are updated synchronously: - GitHub: [https://github.com/snolab/CapsLockX](https://github.com/snolab/CapsLockX) - Gitee: [https://gitee.com/snomiao/CapslockX](https://gitee.com/snomiao/CapslockX) - Bitbucket: [https://bitbucket.org/snomiao/capslockx](https://bitbucket.org/snomiao/capslockx) - Gitlab: [https://gitlab.com/snomiao/CapsLockX/](https://gitlab.com/snomiao/CapsLockX/) -文档地址 📄 +Document Address 📄 -- 自动翻译文档 Netlify CDN:[https://capslockx.netlify.com](https://capslockx.netlify.com) -- 自动翻译文档 CloudFlare CDN:[https://capslockx.snomiao.com](https://capslockx.snomiao.com) +- Automatic Translation Document Netlify CDN: [https://capslockx.netlify.com](https://capslockx.netlify.com) +- Automatic Translation Document CloudFlare CDN: [https://capslockx.snomiao.com](https://capslockx.snomiao.com) -星图 ⭐️ +Star Chart ⭐️ - [![Stargazers over time](https://starchart.cc/snolab/CapsLockX.svg)](https://starchart.cc/snolab/CapsLockX) -#### 相似项目地址 🔗 Similar Projects +#### Similar Project Addresses 🔗 Similar Projects - [Star Historys](https://star-history.t9t.io/#snolab/CapsLockX&wo52616111/capslock-plus&coralsw/CapsEz&Vonng/CapsLock) -- 源码:[Vonng/CapsLock: Make CapsLock Great Again!](https://github.com/Vonng/CapsLock) - 设计:[Capslock/design.md at master · Vonng/Capslock](https://github.com/Vonng/Capslock/blob/master/design.md) +- Source: [Vonng/CapsLock: Make CapsLock Great Again!](https://github.com/Vonng/CapsLock) + Design: [Capslock/design.md at master · Vonng/Capslock](https://github.com/Vonng/Capslock/blob/master/design.md) - [coralsw/CapsEz: KeyMouse Tools](https://github.com/coralsw/CapsEz) - [CapsLock+](https://capslox.com/CapsLock-plus/) - [Capslox](https://capslox.com/cn/) - CapsLock++ [matrix1001/CapsLock-plus-plus: ⌨Amazing, extendable, readable autohotkey scripts framework utilized by CapsLock.](https://github.com/matrix1001/CapsLock-plus-plus) -- [Power Keys | 解放电脑使用效率](https://powerkeys.github.io/) +- [Power Keys | Liberate Computer Usage Efficiency](https://powerkeys.github.io/) -## 答疑相关 ❓ Questions +## Questions and Answers ❓ Questions -相关社群: +Related Communities: -- [CapsLockX 的 issues (可作论坛使用)](https://github.com/snolab/CapsLockX/issues) ✉️ -- CapsLockX 用户电报群:[t.me/CapsLockX_users](https://t.me/CapsLockX_users)📱 -- CapsLockX 用户 QQ 群 🐧:[100949388](https://jq.qq.com/?_wv=1027&k=56lsK8ko) -- QZ/VimD/TC/AHK QQ 群 🐧: 271105729 -- AHK 高级 QQ 群 🐧: 717947647 +- [CapsLockX's issues (can be used as a forum)](https://github.com/snolab/CapsLockX/issues) ✉️ +- CapsLockX User Telegram Group: [t.me/CapsLockX_users](https://t.me/CapsLockX_users)📱 +- CapsLockX User QQ Group 🐧: [100949388](https://jq.qq.com/?_wv=1027&k=56lsK8ko) +- QZ/VimD/TC/AHK QQ Group 🐧: 271105729 +- AHK Advanced QQ Group 🐧: 717947647 -CapsLockX 相关答疑直接进群 [@雪星](tencent://message?uin=997596439) 或私聊提问也可。 +For questions related to CapsLockX, you can directly join the group [@雪星](tencent://message?uin=997596439) or ask privately. -### 隐私与安全性 🔒 Privacy +### Privacy and Security 🔒 Privacy -考虑到任何能够获取到管理员权限的软件对于用户的操作系统都是相当危险的,故 CapsLockX 必须而且正在采用开源的方式以使社区可以自由且随意地检查 CapsLockX 中可能涉及到的任何部分的代码,以保证所有用户的操作系统安全性不因本软件而受损害。 +Considering that any software that can obtain administrative rights is quite dangerous to a user's operating system, CapsLockX must and is currently adopting an open-source approach. This allows the community to freely and arbitrarily inspect any part of the CapsLockX code that may be involved, to ensure that the security of all users' operating systems is not compromised by this software. -## 支持 ⭐️ Supports +## Support ⭐️ Supports -如何帮助 CapsLockX 生存下去?如果 CapsLockX 有帮助到你: +How to help CapsLockX survive? If CapsLockX has been helpful to you: -1. ⭐️ 请在 CapsLockX Github 上点星 Star -2. 🔗 请把我转发分享给你身边的朋友们。 -3. 🌐 欢迎帮我翻译本文档到各国语言。 -4. 🐞 欢迎提交 bug、提出完善建议 [issues](https://github.com/snolab/CapsLockX/issues) -5. 欢迎提交代码 PR,哪怕是修改错别字也是可以的~ -6. 欢迎创作关于本软件的作品,比如录制使用教学视频投稿到 Youtube 或 Bilibili ,雪星会去给你点赞的哦。 -7. 💰 欢迎在此捐助 CapsLockX 的开发,每一笔捐赠都会记录到下方的列表中: - - 爱发电 ⚡️:[https://afdian.net/@snomiao](https://afdian.net/@snomiao) +1. ⭐️ Please star CapsLockX on Github Star +2. 🔗 Please share it with your friends. +3. 🌐 Welcome to help translate this documentation into different languages. +4. 🐞 Welcome to submit bugs and suggestions for improvement [issues](https://github.com/snolab/CapsLockX/issues) +5. Code PR submissions are welcome, even just to correct a typo ~ +6. Welcome to create works about this software, such as recording tutorial videos to post on Youtube or Bilibili, Xue Xing will like your video. +7. 💰 Welcome to donate to the development of CapsLockX, each donation will be recorded in the list below: + - Love Send Electric ⚡️:[https://afdian.net/@snomiao](https://afdian.net/@snomiao) - PAYPAL: [https://paypal.me/snomiao](https://paypal.me/snomiao) - - 支付宝捐助账号: [snomiao@gmail.com (点击查看二维码)](./支付宝捐助.png) + - Alipay donation account: [snomiao@gmail.com (click to view QR code)](./支付宝捐助.png) - ETH: [0xdc2eece11a9e09c8db921989e54b30375446e49e](https://etherscan.io/address/0xdc2eece11a9e09c8db921989e54b30375446e49e) -- [发展路线](#发展路线-roadmap) - -### 捐赠记录(截至 20210821) 📄 Donate Records - -| 捐赠时间 | 名称 | 渠道 | 金额 | 备注 | -| ---------- | -------------------------------- | ----------- | ----------- | -------------------------------------------------------------- | -| 2021-06-19 | \*\*煜 | Alipay QR | +50.00 CNY | 小小資助,支持獨立開發者 | -| 2023-05-12 | 卡拉翁 | 微信转账 | +200.00 CNY | 🫡 (敬礼) | -| 2023-06-09 | [@andriasw](github.com/andriasw) | Alipay 转账 | +66.66 CNY | for CapsLockX-mac, 66.66 is good (https://github.com/andriasw) | -| 2023-12-19 | 慧蛋 | QQ 红包 | +45.00 CNY | 请开发者喝咖啡 | - -### 鸣谢 🙏🏻 Thanks - -- 感谢来自以上捐赠者的经济支持。 -- 感谢 [秦金伟](http://rsytes.coding-pages.com/) 的引用推荐文章、和发展建议:[2020-02-23 当键盘模拟鼠标 - 简书](https://www.jianshu.com/p/f757f56a7de6) -- 感谢 @河许人 帮助转载推广: [CapsLockX – 像黑客一样操作电脑!【雪星】 – AutoAHK](https://www.autoahk.com/archives/34996) -- 感谢在 issues 里和群里提问并帮助完善 CapsLockX 的各位。 - -### 相关话题 - Related Topics - -- [秦金伟](http://rsytes.coding-pages.com/) - - [2020-02-23 当键盘模拟鼠标 - qwertc]( https://mp.weixin.qq.com/s?__biz=MzIzNzczOTkzMw==&mid=2247483745&idx=1&sn=16f16c1fa02e1ef386a83f3023fb109d&chksm=e8c54b93dfb2c285e49fa8045d2380b20810768e3be043f364be146a598faf5f363bbb2623e7&scene=21#wechat_redirect ) - - [2020-10-26 键盘模拟鼠标2 - qwertc]( https://mp.weixin.qq.com/s?__biz=MzIzNzczOTkzMw==&mid=2247484272&idx=1&sn=0ed1ff91bee008fc5c01dc0fe20e53ba&chksm=e8c54982dfb2c09493c88a0f7847ffb0b508598e0756ddd7e8ad94d1f31f65490388d6cff7a4&scene=21#wechat_redirect ) - - [2021-03-11 capslockX-治愈鼠标手 - qwertc](https://mp.weixin.qq.com/s?__biz=MzIzNzczOTkzMw==&mid=2247484478&idx=1&sn=1518d7ec4dc08c1a72c08fcaff98550e&chksm=e8c54eccdfb2c7daed0ad9b8c03395e4211e029199374f4bc0dbdc9a8403c2dae86b740c95c5&scene=21#wechat_redirect) - - 2021年11月,键盘模拟鼠标3 - - [2022-08-21 t0820 复制后匹配-siyuan-clx-截图 - qwertc]( https://mp.weixin.qq.com/s?__biz=MzIzNzczOTkzMw==&mid=2247485441&idx=1&sn=848d5e6f3fb7c1e7b14100615ca7d0db&chksm=e8c542f3dfb2cbe5770fe19bb8b5c81935e52a4a686154e69104bc403ab6ce960d1b6ae429a9&scene=21#wechat_redirect ) - - [2024-01-06 t0106 OpenAI加持的CapslockX - qwertc]( https://mp.weixin.qq.com/s?__biz=MzIzNzczOTkzMw==&mid=2247485707&idx=1&sn=d40eea9f0b5bb81e3387ec592def4ed0&chksm=e8c543f9dfb2caef90939e2fafcb324fd757949c79399c55adfbab0940e70efd753fb6bf3837&token=1464360155&lang=zh_CN#rd) -- [有没有办法将 Chrome OS 中的快捷键实现到 Windows 10 中 - V2EX](https://www.v2ex.com/t/778967) -- [推荐一下我的键位映射工具 MyKeymap - V2EX](https://v2ex.com/t/844432) -- [有多少人会把键盘上的 CapsLock 和 Backspace 对调? - V2EX](https://www.v2ex.com/t/855901) -- [分享一个用 CapsLock+H/J/K/L 模拟方向键的小工具 - V2EX](https://www.v2ex.com/t/318182) -- [推荐一个适合程序员的效率工具 AltPlus,左边大拇指按下 Alt 键,就可以像使用 vim 一样编程了. - V2EX](https://www.v2ex.com/t/800721) -- [CapsLockX - 像黑客一样操作电脑 - V2EX](https://v2ex.com/t/772052#reply1) -- [CapsLockX - 像黑客一样操作电脑! - AutoHotkey Community](https://www.autohotkey.com/boards/viewtopic.php?f=28&t=88593) +- [Development Roadmap](#发展路线-roadmap) + +### Donation Records (as of 20210821) 📄 Donate Records + +| Donation Date | Name | Channel | Amount | Comment | +| ------------- | -------------------------------- | --------------- | ----------- | -------------------------------------------------------------- | +| 2021-06-19 | \*\*Yu | Alipay QR | +50.00 CNY | A little support, in favor of independent developers | +| 2023-05-12 | Karawen | WeChat Transfer | +200.00 CNY | 🫡 (Salute) | +| 2023-06-09 | [@andriasw](github.com/andriasw) | Alipay Transfer | +66.66 CNY | for CapsLockX-mac, 66.66 is good (https://github.com/andriasw) | +| 2023-12-19 | Huidan | QQ Red Packet | +45.00 CNY | Buy the developer a coffee | + +### Acknowledgements 🙏🏻 Thanks + +- Thank you for the financial support from the above donors. +- Thanks to [Qin Jinwei](http://rsytes.coding-pages.com/) for the citation recommendation article and development suggestions: [2020-02-23 When Keyboard Simulates Mouse - Jianshu](https://www.jianshu.com/p/f757f56a7de6) +- Thanks to @He Xuren for helping with the dissemination: [CapsLockX – Operate the computer like a hacker! 【Xue Xing】 – AutoAHK](https://www.autoahk.com/archives/34996) +- Thank you to those who asked questions in the issues and in the group and helped to improve CapsLockX. + +### Related Topics - Related Topics + +- [Qin Jinwei](http://rsytes.coding-pages.com/) + - [2020-02-23 When Keyboard Simulates Mouse - qwertc](https://mp.weixin.qq.com/s?__biz=MzIzNzczOTkzMw==&mid=2247483745&idx=1&sn=16f16c1fa02e1ef386a83f3023fb109d&chksm=e8c54b93dfb2c285e49fa8045d2380b20810768e3be043f364be146a598faf5f363bbb2623e7&scene=21#wechat_redirect) + - [2020-10-26 Keyboard Simulates Mouse 2 - qwertc](https://mp.weixin.qq.com/s?__biz=MzIzNzczOTkzMw==&mid=2247484272&idx=1&sn=0ed1ff91bee008fc5c01dc0fe20e53ba&chksm=e8c54982dfb2c09493c88a0f7847ffb0b508598e0756ddd7e8ad94d1f31f65490388d6cff7a4&scene=21#wechat_redirect) + - [2021-03-11 capslockX-Cure Mouse Hand - qwertc](https://mp.weixin.qq.com/s?__biz=MzIzNzczOTkzMw==&mid=2247484478&idx=1&sn=1518d7ec4dc08c1a72c08fcaff98550e&chksm=e8c54eccdfb2c7daed0ad9b8c03395e4211e029199374f4bc0dbdc9a8403c2dae86b740c95c5&scene=21#wechat_redirect) + - November 2021, Keyboard Simulates Mouse 3 + - [2022-08-21 t0820 After Copy Match-siyuan-clx-Screenshot - qwertc](https://mp.weixin.qq.com/s?__biz=MzIzNzczOTkzMw==&mid=2247485441&idx=1&sn=848d5e6f3fb7c1e7b14100615ca7d0db&chksm=e8c542f3dfb2cbe5770fe19bb8b5c81935e52a4a686154e69104bc403ab6ce960d1b6ae429a9&scene=21#wechat_redirect) + - [2024-01-06 t0106 OpenAI-empowered CapslockX - qwertc](https://mp.weixin.qq.com/s?__biz=MzIzNzczOTkzMw==&mid=2247485707&idx=1&sn=d40eea9f0b5bb81e3387ec592def4ed0&chksm=e8c543f9dfb2caef90939e2fafcb324fd757949c79399c55adfbab0940e70efd753fb6bf3837&token=1464360155&lang=zh_CN#rd) +- [Is there any way to implement the shortcuts in Chrome OS into Windows 10 - V2EX](https://www.v2ex.com/t/778967) +- [Recommend My Key Mapping Tool MyKeymap - V2EX](https://v2ex.com/t/844432) +- [How Many People Would Swap CapsLock and Backspace on their Keyboard? - V2EX](https://www.v2ex.com/t/855901) +- [Share a Small Tool that Uses CapsLock+H/J/K/L to Simulate Arrow Keys - V2EX](https://www.v2ex.com/t/318182) +- [Recommended Efficiency Tool for Programmers AltPlus, Pressing Alt with Left Thumb You Can Code Like Using vim - V2EX](https://www.v2ex.com/t/800721) +- [CapsLockX - Operate the Computer Like a Hacker - V2EX](https://v2ex.com/t/772052#reply1) +- [CapsLockX - Operate the Computer Like a Hacker! - AutoHotkey Community](https://www.autohotkey.com/boards/viewtopic.php?f=28&t=88593) - [(10) What are some good career alternatives for a computer programmer with RSI? - Quora](https://www.quora.com/Repetitive-Strain-Injury-RSI/What-are-some-good-career-alternatives-for-a-computer-programmer-with-RSI) -- [如何将电脑桌面划分为独立的两半? - 知乎](https://www.zhihu.com/questionz/23443944/answer/1670521971) -- [有哪位残友用的是单手键盘? - 知乎](https://www.zhihu.com/question/50621709/answer/1681247637) -- [(5 封私信 - 50 条消息) 怎么样才能只用键盘不用鼠标,包括任何指针触控设备,并优雅地使用电脑? - 知乎](https://www.zhihu.com/question/21281518/answer/1770669886) -- [(5 封私信 - 50 条消息) 如何将电脑桌面划分为独立的两半? - 知乎](https://www.zhihu.com/question/23443944/answer/1670521971) -- [我是职场达人,AutoHotKey 让我成为职场超人 - 知乎](https://zhuanlan.zhihu.com/p/60372361) -- [AutoHotKey 中文网专栏 - 知乎](https://www.zhihu.com/column/autoahk) -- [电脑一族如何防治“鼠标手” - 陕西日报](http://www.sxjkjy.com/uploadfiles/files/2017062110481454.pdf) - -## 页尾目录 - Table of Contents - -- [CapsLockX - 💻 Get Hacker's Keyboard. 像**黑客**一样操作电脑](#capslockx----get-hackers-keyboard-像黑客一样操作电脑) - - [版本墙 - 徽章墙 📛 Badges](#版本墙---徽章墙--badges) - - [新手快速入门教程 📖 Tutorial](#新手快速入门教程--tutorial) - - [简易入门教程(读完这一小节,便算是入门了 CapsLockX 的使用 )](#简易入门教程读完这一小节便算是入门了-capslockx-的使用-) - - [进阶参考手册 🦽 Manual](#进阶参考手册--manual) - - [安装与使用 🛠 Installation](#安装与使用--installation) - - [绿色便携程序包(新手适用,稳定版) 📦 Packaged Bins](#绿色便携程序包新手适用稳定版--packaged-bins) - - [命令行方式安装(进阶用户推荐,可自动更新)🖥️ Install by command](#命令行方式安装进阶用户推荐可自动更新️-install-by-command) - - [使用手册 📖 - Usage Manual](#使用手册----usage-manual) - - [基础操作](#基础操作) - - [模块说明](#模块说明) - - [多任务工作的噩梦 - Nightmares of Multitasking](#多任务工作的噩梦---nightmares-of-multitasking) - - [虚拟桌面概述:情景模式、工作桌面、娱乐桌面、项目分类……](#虚拟桌面概述情景模式工作桌面娱乐桌面项目分类) - - [Windows 窗口切换的用户体验提升 - Win+tab](#windows-窗口切换的用户体验提升---wintab) +- [How to Divide the Computer Desktop into Two Separate Halves? - Zhihu](https://www.zhihu.com/questionz/23443944/answer/1670521971) +- [Is there any person with disabilities here who uses a one-handed keyboard? - Zhihu](https://www.zhihu.com/question/50621709/answer/1681247637) +- [(5 messages - 50 comments) How to use a computer elegantly without using a mouse or any other pointer touch device using only a keyboard? - Zhihu](https://www.zhihu.com/question/21281518/answer/1770669886) +- [(5 messages - 50 comments) How to Divide the Computer Desktop into Two Separate Halves? - Zhihu](https://www.zhihu.com/question/23443944/answer/1670521971) +- [I am a Workplace Expert, AutoHotKey Made Me a Workplace Superhuman - Zhihu](https://zhuanlan.zhihu.com/p/60372361) +- [AutoHotKey Chinese Site Column - Zhihu](https://www.zhihu.com/column/autoahk) +- [How to Prevent and Treat "Mouse Hand" for Computer Users - Shaanxi Daily](http://www.sxjkjy.com/uploadfiles/files/2017062110481454.pdf) + +## Footer Catalog - Table of Contents + +- [CapsLockX - 💻 Get Hacker's Keyboard. Operate your computer like a **hacker**](#capslockx----get-hackers-keyboard-operate-your-computer-like-a-hacker) + - [Version Wall - Badge Wall 📛 Badges](#version-wall---badge-wall--badges) + - [Beginner's Quick Start Tutorial 📖 Tutorial](#beginners-quick-start-tutorial--tutorial) + - [Simple Introduction Tutorial (Once you read this section, you're considered to have started using CapsLockX)](#simple-introduction-tutorial-once-you-read-this-section-youre-considered-to-have-started-using-capslockx-) + - [Advanced Reference Manual 🦽 Manual](#advanced-reference-manual--manual) + - [Installation and Usage 🛠 Installation](#installation-and-usage--installation) + - [Green Portable Package (Suitable for beginners, stable version) 📦 Packaged Bins](#green-portable-package-suitable-for-beginners-stable-version--packaged-bins) + - [Command Line Installation (Recommended for advanced users, supports auto-update)🖥️ Install by command](#command-line-installation-recommended-for-advanced-users-supports-auto-update️-install-by-command) + - [Usage Manual 📖 - Usage Manual](#usage-manual----usage-manual) + - [Basic Operations](#basic-operations) + - [Module Descriptions](#module-descriptions) + - [Nightmares of Multitasking](#nightmares-of-multitasking) + - [Virtual Desktop Overview: Scenarios Mode, Work Desktop, Entertainment Desktop, Project Categorization...](#virtual-desktop-overview-scenarios-mode-work-desktop-entertainment-desktop-project-categorization) + - [Improvement of User Experience in Windows Window Switching - Win+tab](#improvement-of-user-experience-in-windows-window-switching---wintab) - [TODO-Docs](#todo-docs) - - [焦点数量:活动窗口、默认活动窗口、……](#焦点数量活动窗口默认活动窗口) - - [多屏幕的利用 - Multi-screening](#多屏幕的利用---multi-screening) - - [4K 时代的窗口排列 - Window arrange with 4k screen](#4k-时代的窗口排列---window-arrange-with-4k-screen) - - [Linux 与 Mac 窗口的管理 - Window Manager in Linux and mac](#linux-与-mac-窗口的管理---window-manager-in-linux-and-mac) - - [Android 与 iOS 的窗口管理 - Window Manage in android](#android-与-ios-的窗口管理---window-manage-in-android) - - [编辑操作的困扰](#编辑操作的困扰) - - [键入区与编辑控制区的疏远](#键入区与编辑控制区的疏远) - - [并击的概念](#并击的概念) - - [图形界面的困扰](#图形界面的困扰) - - [人类的速度认知](#人类的速度认知) - - [软件的热键缺陷](#软件的热键缺陷) - - [便携键盘的可用性](#便携键盘的可用性) - - [帮助模块](#帮助模块) - - [本模块功能见下](#本模块功能见下) - - [Anki 增强模块](#anki-增强模块) - - [常用功能/特性](#常用功能特性) - - [说明](#说明) + - [Focus Amount: Active Window, Default Active Window,...](#focus-amount-active-window-default-active-window) + - [Utilization of Multiple Screens - Multi-screening](#utilization-of-multiple-screens---multi-screening) + - [Window Arrangement in the 4K Era - Window arrange with 4k screen](#window-arrangement-in-the-4k-era---window-arrange-with-4k-screen) + - [Window Management in Linux and Mac - Window Manager in Linux and Mac](#window-management-in-linux-and-mac---window-manager-in-linux-and-mac) + - [Window Management in Android and iOS - Window Management in Android](#window-management-in-android-and-ios---window-management-in-android) + - [Troubles with Edit Operations](#troubles-with-edit-operations) + - [Estrangement between Typing Area and Editing Control Area](#estrangement-between-typing-area-and-editing-control-area) + - [The Concept of Chording](#the-concept-of-chording) + - [Troubles with Graphic User Interface](#troubles-with-graphic-user-interface) + - [Human Perception of Speed](#human-perception-of-speed) + - [Hotkey Flaws of Software](#hotkey-flaws-of-software) + - [Usability of Portable Keyboards](#usability-of-portable-keyboards) + - [Help Module](#help-module) + - [Functions of this module as follows](#functions-of-this-module-as-follows) + - [Anki Enhancement Module](#anki-enhancement-module) + - [Common Features/Characteristics](#common-featurescharacteristics) + - [Explanations](#explanations) - [Figma Enhanced](#figma-enhanced) - - [常用功能/特性](#常用功能特性-1) - - [说明](#说明-1) - - [OneNote 2016 - 2019 增强](#onenote-2016---2019-增强) - - [雪星喵常用功能](#雪星喵常用功能) - - [按键分布设计(开发中)](#按键分布设计开发中) - - [详细按键表 / CheatSheet](#详细按键表--cheatsheet) - - [编辑增强插件( TG YUIO HJKL ) 🌟](#编辑增强插件-tg-yuio-hjkl--) - - [Surface 笔记本扩充功能键](#surface-笔记本扩充功能键) - - [媒体键模块](#媒体键模块) - - [模拟鼠标插件( WASD QERF )](#模拟鼠标插件-wasd-qerf-) - - [功能](#功能) - - [使用方法如下](#使用方法如下) - - [操作细节](#操作细节) - - [JavaScript 计算 (建议安装 NodeJS )](#javascript-计算-建议安装-nodejs-) - - [窗口增强插件 (CLX + 1234567890 ZXCV)](#窗口增强插件-clx--1234567890-zxcv) - - [功能简述](#功能简述) - - [效果图](#效果图) - - [使用方法如下 ( Alt+Tab 与 CapsLockX )](#使用方法如下--alttab-与-capslockx-) - - [快捷输入](#快捷输入) - - [番茄时钟](#番茄时钟) - - [锁屏自动息屏](#锁屏自动息屏) - - [过去与未来 🛰](#过去与未来-) - - [制作背景 ( 2017 年秋) 🍁 Background](#制作背景--2017-年秋--background) - - [发展路线 🛰️ RoadMap](#发展路线-️-roadmap) - - [组合键含义设计 ⌨ Chore Design](#组合键含义设计--chore-design) - - [CapsLockX 与类似项目的功能对比 ⚔ Feat Compare Matrix](#capslockx-与类似项目的功能对比--feat-compare-matrix) - - [CapsLockX 地址 🔗 Project Urls](#capslockx-地址--project-urls) - - [相似项目地址 🔗 Similar Projects](#相似项目地址--similar-projects) - - [答疑相关 ❓ Questions](#答疑相关--questions) - - [隐私与安全性 🔒 Privacy](#隐私与安全性--privacy) - - [支持 ⭐️ Supports](#支持-️-supports) - - [捐赠记录(截至 20210821) 📄 Donate Records](#捐赠记录截至-20210821--donate-records) - - [鸣谢 🙏🏻 Thanks](#鸣谢--thanks) - - [相关话题 - Related Topics](#相关话题---related-topics) - - [页尾目录 - Table of Contents](#页尾目录---table-of-contents) + - [Common Features/Characteristics](#common-featurescharacteristics-1) + - [Explanations](#explanations-1) + - [OneNote 2016 - 2019 Enhancement](#onenote-2016---2019-enhancement) + - [Common Features Used by XuexingMiao](#common-features-used-by-xuexingmiao) + - [Key Distribution Design (Under Development)](#key-distribution-design-under-development) + - [Detailed Key Table / CheatSheet](#detailed-key-table--cheatsheet) + - [Editing Enhancement Plugin (TG YUIO HJKL) 🌟](#editing-enhancement-plugin-tg-yuio-hjkl--) + - [Expanded Function Keys for Surface Laptops](#expanded-function-keys-for-surface-laptops) + - [Media Key Module](#media-key-module) + - [Mouse Simulation Plugin (WASD QERF)](#mouse-simulation-plugin-wasd-qerf-) + - [Features](#features) + - [How to Use as follows](#how-to-use-as-follows) + - [Operational Details](#operational-details) + - [JavaScript Calculation (Installation of NodeJS Recommended)](#javascript-calculation-installation-of-nodejs-recommended-) + - [Window Enhancement Plugin (CLX + 1234567890 ZXCV)](#window-enhancement-plugin-clx--1234567890-zxcv) + - [Brief Description of the Features](#brief-description-of-the-features) + - [Effect Pictures](#effect-pictures) + - [How to Use as follows (Alt+Tab and CapsLockX)](#how-to-use-as-follows-alttab-and-capslockx-) + - [Quick Input](#quick-input) + - [Pomodoro Timer](#pomodoro-timer) + - [Auto Screen Off when Locking Screen](#auto-screen-off-when-locking-screen) + - [Past and Future 🛰](#past-and-future-) + - [Creation Background (Autumn 2017) 🍁 Background](#creation-background-autumn-2017--background) + - [Development Path 🛰️ RoadMap](#development-path-️-roadmap) + - [Combination Key Meaning Design ⌨ Chore Design](#combination-key-meaning-design--chore-design) + - [Feature Comparison of CapsLockX and Similar Projects ⚔ Feat Compare Matrix](#feature-comparison-of-capslockx-and-similar-projects--feat-compare-matrix) + - [CapsLockX Project Urls 🔗 Project Urls](#capslockx-project-urls--project-urls) + - [Urls of Similar Projects 🔗 Similar Projects](#urls-of-similar-projects--similar-projects) + - [FAQs Related ❓ Questions](#faqs-related--questions) + - [Privacy and Security 🔒 Privacy](#privacy-and-security--privacy) + - [Support ⭐️ Supports](#support-️-supports) + - [Donation Records (Up to 20210821) 📄 Donate Records](#donation-records-up-to-20210821--donate-records) + - [Acknowledgements 🙏🏻 Thanks](#acknowledgements--thanks) + - [Related Topics](#related-topics) + - [Footer Catalog - Table of Contents](#footer-catalog---table-of-contents) --- diff --git a/docs/README.zh.md b/docs/README.zh.md new file mode 100644 index 0000000..5cd0101 --- /dev/null +++ b/docs/README.zh.md @@ -0,0 +1,826 @@ +# CapsLockX - 💻 Get Hacker's Keyboard. 像**黑客**一样操作电脑 + +CapsLockX is a modular hotkey script engine based on AutoHotkey. Allows you to easily operate the computer efficiently like a hacker in a movie without leaving the keyboard with both hands . There are a lot of functions that you can understand at a touch and are super easy to use: editing enhancement, virtual desktop and window management, mouse simulation, in-app hotkey enhancement, JS mathematical expression calculation, and other super multi-functions are waiting for you to personally define. + +**[See English Docs (Google Translated)](https://capslockx.snomiao.com/)** + + + +[![中文编程](https://github.com/Program-in-Chinese/overview/raw/master/%E4%B8%AD%E6%96%87%E7%BC%96%E7%A8%8B.svg)](https://github.com/Program-in-Chinese/overview), +[![996.icu](https://img.shields.io/badge/link-996.icu-red.svg)](https://996.icu) +[![GitHub license](https://img.shields.io/github/license/snolab/CapsLockX)](https://github.com/snolab/CapsLockX/blob/master/LICENSE.md) +![GitHub top language](https://img.shields.io/github/languages/top/snolab/CapsLockX) +![GitHub commit activity](https://img.shields.io/github/commit-activity/m/snolab/CapsLockX) +[![GitHub stars](https://img.shields.io/github/stars/snolab/CapsLockX)](https://github.com/snolab/CapsLockX/stargazers) + + + +![GitHub release (latest by date)](https://img.shields.io/github/v/release/snolab/CapsLockX) +[![gh-pages](https://github.com/snolab/CapsLockX/actions/workflows/gh-pages-release.yml/badge.svg)](https://github.com/snolab/CapsLockX/actions/workflows/gh-pages-release.yml) +![GitHub all releases](https://img.shields.io/github/downloads/snolab/CapsLockX/total) +[![jsdelivr_GITHUB](https://data.jsdelivr.com/v1/package/gh/snolab/capslockx/badge)](https://www.jsdelivr.com/package/gh/snolab/capslockx) + +[![npm](https://img.shields.io/npm/v/capslockx)](https://www.npmjs.com/capslockx) +[![npm publish](https://github.com/snolab/CapsLockX/actions/workflows/npm-publish.yml/badge.svg)](https://github.com/snolab/CapsLockX/actions/workflows/npm-publish.yml) +![npm](https://img.shields.io/npm/dt/capslockx) +![jsDelivr hits (npm)](https://img.shields.io/jsdelivr/npm/hy/capslockx) + +[![Chocolatey version](https://img.shields.io/chocolatey/v/capslockx)](https://community.chocolatey.org/packages/CapsLockX/) +[![Chocolatey Publish](https://github.com/snolab/CapsLockX/actions/workflows/choco-push.yml/badge.svg)](https://github.com/snolab/CapsLockX/actions/workflows/choco-push.yml) +[![Chocolatey Downloads](https://img.shields.io/chocolatey/dt/CapsLockX)](https://community.chocolatey.org/packages/CapsLockX/) + + + +--- + +## 新手快速入门教程 📖 Tutorial + +### 简易入门教程(读完这一小节,便算是入门了 CapsLockX 的使用 ) + +CapsLockX 有四大核心功能: **窗口管理**,**鼠标模拟**、**方向键模拟**、应用内热键,本入门教程将带你学会前 3 大核心功能。 + +首先获取 CapsLockX :下载这个压缩包: [下载 JSDelivrCDN-发布程序包.zip](https://cdn.jsdelivr.net/gh/snolab/CapsLockX@gh-pages/CapsLockX-latest.zip) + +解压之后,打开 CapsLockX 文件夹内的 `CapsLockX.exe`,过掉简单的新手教程,然后按照以下左右手功能区的依次试用来了解 CapsLockX 的功能。 + +CapsLockX 启动之后,并**不会影响**你键盘其它按键的功能,以下的功能只有在你按出 `CapsLockX + 组合键` 时才会触发。 + +左手功能区: + +- 窗口管理:`CapsLockX + 1234567890` 切换到第 `n` 个虚拟桌面,`CapsLockX + ZXCV` 窗口操作(窗口切换、窗口关闭,窗口排列,透明置顶)。 +- 鼠标模拟功能:按 `CapsLockX + WASD` 鼠标移动(像玩游戏的时候操作人物移动一样简单),按 `CapsLockX + QE` 鼠标左右键点击,`CapsLockX + RF` 滚轮上下滑动。 + +右手功能区: + +- 方向键模拟:打开任意一个编辑器(比如记事本),按 `HJKL` 光标移动,`YOUI` 页面移动 + +上手之后,如果想了解更多功能,则可参考下方速查手册。 + +--- + +## 进阶参考手册 🦽 Manual + +### 安装与使用 🛠 Installation + +#### 绿色便携程序包(新手适用,稳定版) 📦 Packaged Bins + +源码打包就是软件本体,无需编译,纯绿色便携软件解压即用。源码 + 程序包,推荐第一个(最快)。 + +1. [下载 JSDelivrCDN-发布程序包.zip](https://cdn.jsdelivr.net/gh/snolab/CapsLockX@gh-pages/CapsLockX-latest.zip) +1. [备选下载 CloudFlareCDN-发布程序包.zip](https://capslockx.snomiao.com/CapsLockX-latest.zip) +1. [备选下载 GitHub-发布程序包.zip](https://github.com/snolab/CapsLockX/raw/gh-pages/CapsLockX-latest.zip) +1. [备选下载 GitHub-仓库程序包.zip](https://github.com/snolab/CapsLockX/archive/master.zip) +1. [备选下载 BitBucket-仓库程序包.zip](https://bitbucket.org/snomiao/capslockx/get/master.zip) +1. [备选下载 中国大陆用户-Gitee-仓库程序包.zip (需登录)](https://gitee.com/snomiao/CapslockX/repository/archive/master.zip) + +解压后使用即可,启动与自启动的方法: 双击 `CapsLockX.exe` 即可启动脚本,如需添加启动项,请在开始菜单 - 运行输入 shell:startup 然后给本程序创建快捷方式,扔进去就可以了。 + +#### 命令行方式安装(进阶用户推荐,可自动更新)🖥️ Install by command + +以下几种任选其一,大陆地区用户推荐第 4 个 + +1. `npx capslockx@latest`, -- NPX 直接运行,可以一直运行最新版,推荐(需要安装 NodeJS ) +2. `choco update capslockx && capslockx` -- [Chocolatey](https://community.chocolatey.org/packages/CapsLockX/) 安装可使用 cup 自动更新,推荐 +3. `npm i -g capslockx && npx capslockx` -- npm 全局安装 +4. `git clone https://gitee.com/snomiao/CapslockX && .\CapsLockX\CapsLockX.exe` -- 大陆源码包(绿色软件包)解压使用,中国大陆地区用户推荐 +5. `git clone https://github.com/snolab/CapsLockX && .\CapsLockX\CapsLockX.exe` -- github 源码包(绿色软件包)解压使用 +6. `winget capslockx` -- TODO #40 +7. `scoop capslockx` -- TODO #41 + +## 使用手册 📖 - Usage Manual + +### 基础操作 + +- 按住 `CapsLockX` 进入 CapsLockX 模式,此时你的键盘会成为像 Vim 默认模式那样的功能键盘,(键位见下) +- 同时按 `CapsLockX+Space` 键将锁定 `CLX` 模式,此时将保持 `CLX` 到下一次按下 `CaspLockX` 键为止。[功能由来](https://github.com/snolab/CapsLockX/issues/21) + +### 模块说明 + +CapsLockX 默认加载了一些常用的模块,功能与使用方法已在下方列出。 +对于不需要的模块,你也可以直接删除 `./Modules` 目录下对应的 `.ahk` 文件,然后按 `Ctrl + Alt + \` 重新加载即可。 + +你也可以编写自己的 `my-ahk.user.ahk` 然后放到 `./User/` 目录下,CapsLockX 会自动识别并加载它们。 + +### 多任务工作的噩梦 - Nightmares of Multitasking + +#### 虚拟桌面概述:情景模式、工作桌面、娱乐桌面、项目分类…… + +通常用户正在进行的一套任务会包括多个窗口,这些窗口组合起来可以构成一个使用情景,而多个情景很可能同时运行,并且其中的一些会长期运行,互不干扰。这其中会涉及到大量的窗口排列和虚拟桌面切换操作,在这些方面,如果使用 CLX 来管理你的窗口,会给你带来相当恐怖的效率提升。 + +以下是一些情景组合的例子: 假设你可以一边学习、一边进行好几种不同的工作、一边和朋友聊天、一边打游戏、一边后台听着 BGM,一边打开着一个暂停的电影准备好晚上和家人一起看。 + +- 虚拟桌面 1:规划情景:日程窗口 + 多平台同步笔记, 例:Google Calendar + Notion + Gmail、 +- 虚拟桌面 2:学习情景:看书窗口,笔记窗口, 例: OneNote + Calibre)、... +- 虚拟桌面 3:工作情景 1(前端开发):代码编辑 + 文档查询 + 浏览器, 例:Chrome(dev) + VSCode + [stackoverflow](https://stackoverflow.com)、... +- 虚拟桌面 4:工作情景 2(后端开发):代码编辑 + 文档查询 + 后台终端 + 数据库浏览器, 例: DBeaver + VSCode(+bash) + [stackoverflow](https://stackoverflow.com)、... +- 虚拟桌面 5:工作情景 3(脚本开发):代码编辑 + 文档查询 + 脚本目标, 例: VSCode(+bash) + [stackoverflow](https://stackoverflow.com) ... +- 虚拟桌面 6:工作情景 4(3D 建模渲染):3D 建模软件 + 素材检索,例:Blender + Chrome +- 虚拟桌面 7:工作情景 5(3D 打印切片):切片软件 + 模型检索窗口,例:Cura + [thingiverse](https://thingiverse.com) +- 虚拟桌面 7:工作情景 6(视频处理):剪辑 + 素材管理, 例:PR + Everything +- 虚拟桌面 7:工作情景 7(视频处理):后期 + 文档教程, 例:AE + Chrome +- 虚拟桌面 8:写作情景:写作窗口,资料索引窗口, 例: Obsidian + Chrome(谷歌学术索引) )、... +- 虚拟桌面 9:交流情景 1:日常闲聊, 例:Telegram + Reddit + +- 虚拟桌面 9:交流情景 2:工作交流, 例:Slack + Skype + GMail +- 虚拟桌面 9:交流情景 3:展示演讲, 例:Google Meeting + (vscode | 页面应用 | 需求文档 | 反馈文档) +- 虚拟桌面 0:娱乐情景 1:打游戏, 例:Age of Empires、Minecraft、Skyrim、Overcooked 2、... +- 虚拟桌面 0:娱乐情景 3:看电影、听歌, 例:PotPlayer、Youtube Music、...)、... +- ... 更多例子欢迎提 Issue 或 PR 来补充 + +雪星不建议你同时处理太多任务,但 CapsLockX 可以为你保存你的思考环境,最大限度地降低你在任务切换中的心智成本,也就是可以为你省去很多重新排列窗口的时间以及由此失去的注意力。 + +(注:如果你喜欢同时处理很多个任务,你可能不止需要一台内存不小的电脑,还需要一团容量不小的脑子 :D ) + +#### Windows 窗口切换的用户体验提升 - Win+tab + +Alt+Tab 窗口切换时,如果窗口过多,就会显示一个二维窗口预排列。 +一般来说,Alt+Tab 和 Alt+Shift+Tab 是一个纯左手的键位,如果用户希望选选择下一行的窗口,就会本能地按很多下 Alt+Tab。 +而用于二维操作的方向键则因为右手通常放在鼠标上或者 j 键上而常常被忽视。 + +并且,用户会在放开 Tab 键后继续按住 Alt 键来浏览窗口,并选择要切换的目标窗口。 +而 CLX 在此处将启用 Alt+WASD 来代替方向键的功能,以实现左手直接进行多行窗口切换,这样不需要按 Shift 就能向左回退。 +并且如果用户需要清理或关闭多个窗口,只需要按下 Alt+X 就能直接批量清理多个目标窗口并且同时保持在窗口浏览界面内。 + +在 CLX 中,这些功能这极大地提高了 Alt+Tab 的可用性。 + +#### TODO-Docs + +
+Click to expand TODO-docs + +#### 焦点数量:活动窗口、默认活动窗口、…… + +每个桌面只有一个活动焦点窗口,而虚拟桌面可以实现切换到该桌面时自动切换该虚拟桌面的焦点窗口,实现多个任务焦点(即活动窗口)。 + +#### 多屏幕的利用 - Multi-screening + +#### 4K 时代的窗口排列 - Window arrange with 4k screen + +Windows 10 默认窗口排列的限制: + +1. 不适用于多桌面 +2. 不必要的窗口间隙过大 + +##### Linux 与 Mac 窗口的管理 - Window Manager in Linux and mac + +TODO: i3 窗口管理 + +##### Android 与 iOS 的窗口管理 - Window Manage in android + +系统级两种方案:左右上下分屏、浮动窗口;应用级:浮动组件、 + +### 编辑操作的困扰 + +#### 键入区与编辑控制区的疏远 + +TODO 漫谈 ThinkPad 与 mac 方向键位、来自 VIM 的灵感、 + +#### 并击的概念 + +TODO 各种类型的并击 + +TODO 并击的信息量提升计算 + +### 图形界面的困扰 + +TODO:文档:鼠标模拟功能介绍、RPG 游戏的移动 + +### 人类的速度认知 + +TODO:指数增长的世界感知,焦点,听力、视觉、触觉,VS 常规线性操作 + +### 软件的热键缺陷 + +TODO:应用增强模块介绍 + +### 便携键盘的可用性 + +TODO:FN 键、方向键、编辑操作、61 配列 vs 87 键配列、 + +
+ + + + + +### 帮助模块 + +如果你想学习如何开发 CapsLockX 的插件,请: + +1. 打开 `Modules/@Help.ahk` , 你可以了解到 CapsLockX 插件的基本格式 +2. 将它复制一份,命名为你自己的插件名称 +3. 将它本来的功能改成你自己需要的功能,插件的开发就完成啦! + +## 本模块功能见下 + +| 作用于 | 按键 | 功能 | +| ------ | --------------------- | -------------------------------- | +| 全局 | CapsLockX + / | 临时显示热键提示 | +| 全局 | CapsLockX + Alt + / | 🔗 打开 CapsLockX 的完整文档页面 | +| 全局 | CapsLockX + Shift + / | 🕷 提交 bug、建议等 | + + + +### Anki 增强模块 + +Anki 操作增强 + +## 常用功能/特性 + +1. 使用 WASD 或 HJKL 来快速连续地(并且可以撤销)切换记忆卡片 +2. 在 Excel 制作一个单词列表,共 2 列, 全选复制,然后在 Anki 中按 Alt + i 来快速导入单词列表。 +3. 简化 4 个选项为 3 个方向键,左易,下中,右难,上撤销。 +4. 可配合手柄使用,使用 XPadder 配置手柄摇杆映射到方向键即可。效果请见 bilibili [中二雪星怎背词 - 手柄怎么可以不用来背单词!](https://www.bilibili.com/video/av8456838/) + +## 说明 + +| 模式 | Anki 增强模块 | 说明 | +| -------------------- | :------------: | ----------------------------------------------------------- | +| 在 Anki-学习界面 | `w 或 k 或 ↑` | 按下=撤销,松开显示答案 | +| 在 Anki-学习界面 | `a 或 h 或 ←` | 按下=顺利,松开显示答案 | +| 在 Anki-学习界面 | `s 或 j 或 ↓` | 按下=一般,松开显示答案 | +| 在 Anki-学习界面 | `d 或 l 或 →` | 按下=生疏,松开显示答案 | +| 在 Anki-学习界面 | `q` | 返回上个界面 | +| 在 Anki-学习界面 | `c` | 添加新卡片 | +| 在 Anki-学习界面 | `1 或 NumPad1` | 困难(原键位) | +| 在 Anki-学习界面 | `2 或 NumPad2` | 生疏(原键位) | +| 在 Anki-学习界面 | `3 或 NumPad3` | 一般(原键位) | +| 在 Anki-学习界面 | `4 或 NumPad4` | 顺利(原键位) | +| 在 Anki-学习界面 | `5 或 NumPad5` | 撤销 | +| 在 Anki-学习界面 | `6 或 NumPad6` | 暂停卡片 | +| 在 Anki-学习界面 | `Alt + i` | 快速导入剪贴版的内容(按 Tab 分割) / 比如可以从 Excel 复制 | +| 在 Anki-添加卡片界面 | `Alt + s` | 按下 添加 按钮 | + + + +### OneNote 2016 - 2019 增强 + +朴素地增强 OneNote 2016 - 2019 的键盘操作,便捷地使用键盘来:换笔,制作链接,整理页面,调整视图…… + +## 雪星喵常用功能 + +1. 做日志的时候,先在笔记页面 `Alt + T` 给笔记标题添加日期标签(用于将来搜索),然后全局 `Win + Shift + N` 在 OneNote 搜索带有 今日标签 的所有笔记,用来方便地检索你今日的:恋爱日记、训练日志、每日书单、项目日报……总之在 OneNote 写日记就很方便了,一按就出来,不用找 XD +2. 选一个词按 `Alt + K` ,会把所有相关的页面链接列到这个词的下方,用来做索引目录,把你的 OneNote 织成一张网。 +3. 新建一个笔记,改名叫 `我的剪贴板`,然后在复制文本、图片的时候,CLX 会帮你自动追加到这个笔记,用于方便地收集资料或摘抄文章。 +4. Alt + 1234567 层级折叠,轻松地在不同抽象层次的思考上切换。 + +## 按键分布设计(开发中) + +| 按键描述 | 作用 | 备注 | +| ----------------------- | ----------------------- | ---------- | +| `所有 OneNote 自带热键` | 原功能 | | +| `按一下 Alt 再按别的` | 触发 OneNote 原菜单功能 | | +| `Alt + 1234567` | 大纲折叠展开到 1-7 层级 | | +| `Alt + qwe asd r` | 工具、换笔、视图 | | +| `Alt + f` | 查找标签 | | +| `Alt + -=` | 公式相关 | | +| `Alt + m` | 移动笔记、分区 | | +| `Alt + hjkl` | 各种链接功能 | | +| `Alt + zxcv` | 高级复制粘贴 | 细节开发中 | +| `Alt + /` | 热键帮助、提示 | 开发中 | +| `F2 F3` | 重命名、查找笔记 | | + +## 详细按键表 / CheatSheet + +| 作用于 | 格式热键 | 功能 | +| ------------------------ | ---------------------------- | ------------------------------------------------------------------------- | +| 全局 | `Win + Alt + N` | 打开快速笔记第一页(弥补 OneNote 原本没有像 Notion 一样的首页概念的不足) | +| 全局 | `Win + Shift + N` | 打开 OneNote 并精确搜索今日标签 | +| OneNote2019 | `Alt + 1234567` | 大纲:大纲折叠展开到那层(强烈推荐,超好用) | +| OneNote2019 | `F2` | 整理:重命名笔记 | +| OneNote2019 | `Shift + F2` | 整理:重命名分区 | +| OneNote2019 | `Alt + m` | 整理:移动笔记 | +| OneNote2019 | `Alt + Shift + m` | 整理:移动分区 | +| OneNote2019 | `Ctrl + n` | 整理:新建笔记 | +| OneNote2019 | `Ctrl + Alt + n` | 整理:在当前笔记下方新建笔记 | +| OneNote2019 | `Alt + Delete` | 整理:快速删除当前页面 | +| OneNote2019 | `Ctrl + s` | 整理:立即同步此笔记本 | +| OneNote2019 | `Ctrl + w` | 整理:关闭窗口 | +| OneNote2019 | `Shift + Delete` | 编辑:快速删除当前行 | +| OneNote2019 | `Alt + -` | 编辑:自动 2 维化公式 | +| OneNote2019 | `Alt + k` | 编辑:⭐🔗 展开当前关键词的相关页面链接(快速关键词一对多链接) | +| OneNote2019 | `Alt + n` | 样式:切换页面为无色背景 | +| OneNote2019 | `Alt + v` | 样式:改变文字背景色 | +| OneNote2019 | `Alt + q` | 工具:拖动 | +| OneNote2019 | `Alt + w` | 工具:套锁 | +| OneNote2019 | `Alt + e` | 工具:橡皮 | +| OneNote2019 | `Alt + s` | 工具:输入 | +| OneNote2019 | `Alt + a` | 工具:换到第 2 支笔 | +| OneNote2019 | `Alt + d` | 工具:打开换笔盘(然后可可方向键选笔 (目前全屏无效) | +| OneNote2019 | `Alt + d -> 1234567` | 工具:打开换笔盘(然后选第 1 行第 x 支笔) (目前全屏无效) | +| OneNote2019 | `Alt + d -> Shift + 1234567` | 工具:打开换笔盘(然后选第 2 行第 x 支笔) (目前全屏无效) | +| OneNote2019 | `Alt + r` | 视图:缩放到原始大小 | +| OneNote2019 | `Alt + y` | 视图:缩放到页面宽度 | +| OneNote2019 | `^!+- 或 ^!+=` | 视图:缩小页面 或 放大页面 | +| OneNote2019 | `Alt + f` | 视图:搜索标记 | +| OneNote2019 | `Alt + t` | 编辑:给笔记增加日期标签,例如: (20220717) | +| OneNote2019 | `Ctrl + Shift + c` | 编辑:复制(纯文本) | +| OneNote2019 | `Ctrl + Shift + v` | 编辑:粘贴(纯文本) | +| OneNote2019 创建链接窗口 | `Alt + s` | 编辑:复制当前所有搜索结果页面的链接 | +| OneNote2019 创建链接窗口 | `Alt + Shift + s` | 编辑:复制当前所有搜索结果页面的链接并粘贴 | +| OneNote2019 剪贴板笔记 | `Ctrl + C` | 编辑:⭐ 追加复制的内容到名称中含有 "Clipboard" 或 "剪贴板" 的笔记 | + + + +### 讯飞输入法悬浮窗插件 + +#### 用法 + +| 作用于 | 按键 | 功能说明 | +| ------ | :-----: | --------------------- | +| 全局 | Win + H | 启动/切换讯飞语音输入 | + +#### 注 + +1. 原 `Win + H` 的功能是 Windows 自带听写,安装本插件后,可通过 `Win + Shift + H` 使用原 Windows 的听写 +2. 若没有安装讯飞语音则会自动询问是否引导下载安装 + +#### 效果如下图 + +![App-讯飞语音输入法悬浮窗演示.gif](./media/App-讯飞语音输入法悬浮窗演示.gif) + + + +### CLX - Brainstorm 大脳风暴 + +任何時間,任何輸入框,按下 `CLX+b` 鍵,開始使用 AI 輔助輸入。 + +#### 按键分布(开发中) + +| 按键描述 | 作用 | 备注 | +| --------------- | ---------------------------------------------------- | ---- | +| CLX + b | 自動複製当前选中内容,輸入指令,让 AI 辅助你的輸入 | | +| CLX + Alt + b | 配置激活碼(目前只有免費方案,将来可能加入功能増強) | | +| CLX + Shift + b | 査看使用額度 | | + +#### Protips: + +##### 随時整理会議記録 + +1. 任何輸入框内,使用 Win+H 來調出語音輸入,然後說出你想要的文字,不用在意語音輸入的準確度,只要說出大概的意思就可以了, +2. 然後全選按下 `CLX+b`,輸入 `列出要点和待辦事項`,就可以看到 AI 自動幫你整理出來的要點和待辦事項。 + +##### 随時翻訳任何語言到任何語言 + +1. 任何輸入框内,选中你想要翻譯的文字 +2. 然後全選按下 `CLX+b`,`to chinese:` AI 自動幫你輸入成中文。 + + + +### 编辑增强插件( TG YUIO HJKL ) 🌟 + +这个世界上还有比 Vim 模式的 HJKL 移动光标更棒的东西吗? +这个必须有! +那就是带加速度的 HJKL 流畅编辑体验!想不想试试让你的光标来一次排水沟过弯的高端操作?装它! + +![EditorCursorMovement.gif](./media/EditorCursorMovement.gif) + +| 作用域 | Edit 模块 | 说明 | +| ---------- | --------------------- | -------------------------------- | +| 全局(基本) | `CapsLockX + h j k l` | 上下左右 方向键 | +| 全局(基本) | `CapsLockX + y o` | Home End | +| 全局(基本) | `CapsLockX + u i` | PageUp PageDown | +| 全局(基本) | `CapsLockX + [ ]` | Shift+Tab 和 Tab | +| 全局(基本) | `CapsLockX + g` | 回车 | +| 全局(进阶) | `CapsLockX + t` | Delete | +| 全局(进阶) | `CapsLockX + hl` | hl 一起按选择当前词 | +| 全局(进阶) | `CapsLockX + kj` | kj 一起按选择当前行 | +| 全局(进阶) | `CapsLockX + h + t` | 移位后删:大部分情况可代替退格键 | + + + +### Surface 笔记本扩充功能键 + +专治各种笔记本残破键盘 + +1. 没有右 Ctrl 键?合并 Menu 与 右 Ctrl 键,Menu 当 Ctrl 用 或者 Ctrl 当 Menu 用都可以 +2. 没有 Pause 键?Win + Alt + P 也能打开系统设定信息。 +3. 待补充 + +| 模式 | 按键 | 功能 | +| ---------------- | :------------------------------------ | ---------------------------------- | +| 全局 | Win + Alt + P | 相当于 Win + Pause,专为笔记本定制 | +| 全局 | 右 Ctrl 按一下 | 会按一下 Menu 弹出菜单 | +| 全局 | 按住右 Menu | 会按住 Ctrl,此时可以与其它键组合 | +| Win 键模拟启用后 | ] 按住同时,[ 按下 | 相当于按 Win 键 | +| Win 键模拟启用后 | RAlt+\| 相当于按 Alt+Tab 只不过在右手 | + + + +### 媒体键模块 + +| 作用于 | 媒体键模块 | 说明 | +| ------ | ----------------- | ------------------------------------------- | +| 全局 | `CapsLockX + F1` | 打开:我的电脑 | +| 全局 | `CapsLockX + F2` | 打开:计算器 | +| 全局 | `CapsLockX + F3` | 打开:浏览器主页 | +| 全局 | `CapsLockX + F4` | 打开:媒体库(默认是 Windows Media Player) | +| 全局 | `CapsLockX + F5` | 播放:暂停/播放 | +| 全局 | `CapsLockX + F6` | 播放:上一首 | +| 全局 | `CapsLockX + F7` | 播放:下一首 | +| 全局 | `CapsLockX + F8` | 播放:停止 | +| 全局 | `CapsLockX + F9` | 音量加 | +| 全局 | `CapsLockX + F10` | 音量减 | +| 全局 | `CapsLockX + F11` | 静音 | + + + +### 模拟鼠标插件( WASD QERF ) + +> 一直以来,我总是以键盘控自居,应该是在从前做模型的时候伤到了手指关节开始,成为键盘重度用户的。各种键盘加速工具,主动去记住各种快捷键,力求少用鼠标,甚至去学习了 vim 和 emacs。但是,很多时候,鼠标是无可替代的,尤其是在图形界面大行其道时候。 + +—— 以上是来自 [SimClick 模拟点击](https://github.com/rywiki/simclick) 作者的一段话,这是一款以网格细分方式模拟鼠标的作品,可以与本项目互补 + +—— 由 [秦金伟](http://rsytes.coding-pages.com/) 推荐 + +## 功能 + +- 本模块使用按键区:CapsLockX + QWER ASDF +- 非常舒适地使用 WASD QE RF 来模拟【完整的】鼠标功能,相信我,试过这种手感之后,你会喜欢上它的。 +- 指针移动时会自动黏附各种按钮、超链接。滚轮的指数级增长的加速度滚动机制使你再也不惧怕超级长的文章和网页。 +- 效果如图: + ![CLX-Mouse.gif](./media/CLX-Mouse.gif) + +## 使用方法如下 + +| 作用于 | 按键 | 说明 | +| ------ | ------------------------------------- | ---------------------------------------- | +| 全局 | `CapsLockX + w a s d` | 鼠标移动(上下左右) | +| 全局 | `CapsLockX + ad` | 将 HJKL 键切换到滚轮模式(上下左右滚动) | +| 全局 | `CapsLockX + r f` | 垂直滚轮(上下) | +| 全局 | `CapsLockX + Shift + r f` | 水平滚轮(左右) | +| 全局 | `CapsLockX + Ctrl + Alt + r f` | 垂直滚轮自动滚动(上 下) | +| 全局 | `CapsLockX + Ctrl + Alt + Shift+ r f` | 水平滚轮自动滚动(左 右) | +| 全局 | `CapsLockX + rf` | rf 同时按相当于鼠标中键 | +| 全局 | `CapsLockX + e` | 鼠标左键 | +| 全局 | `CapsLockX + q` | 鼠标右键 | + +## 操作细节 + +快速连按 AD 步进 + + + +### JavaScript 计算 (建议安装 NodeJS ) + +| 作用于 | 按键 | 效果 | +| ------ | --------------- | -------------------------------------- | +| 全局 | `CapsLockX + -` | 计算当前选区 JavaScript 表达式,并替换 | +| 全局 | `CapsLockX + =` | 计算当前选区 JavaScript 表达式,并替换 | + + + +### 窗口增强插件 (CLX + 1234567890 ZXCV) + +## 功能简述 + +用好 Win 10 自带的 10 个虚拟桌面豪华配置、多显示器自动排列窗口、半透明置顶、(注:任务栏和 AltTab 相关功能暂不兼容 Win11,窗口排列功能正常。) + +1. 窗口切换:`CapsLockX + [Shift] + Z` +2. 窗口关闭:`CapsLockX + [Shift] + X` +3. 窗口排列:`CapsLockX + [Shift] + C` +4. 窗口置顶:`CapsLockX + [Shift] + V` +5. 左手窗口管理:在 `Alt + Tab` 的界面,用 `WASD` 切换窗口,`X` 关掉窗口。 +6. 高效使用虚拟桌面:`CapsLockX + 0123456789` 切换、增减虚拟桌面,加上 `Shift` 键可以转移当前窗口 +7. 虚拟机与远程桌面快速脱离:双击左边 `Shift + Ctrl + Alt`。 + +## 效果图 + +- Alt + Tab 管理窗口增强 + ![02-插件-窗口增强_Alt+Tab+WASD管理窗口.gif](./02-插件-窗口增强_Alt+Tab+WASD管理窗口.gif) +- CapsLockX + C 一键排列窗口(这 GIF 是旧版本录的看起来比较卡,新版本优化过 API 就不卡了) + ![02-插件-窗口增强_一键排列窗口.gif](./media/02-插件-窗口增强_一键排列窗口.gif) + +## 使用方法如下 ( Alt+Tab 与 CapsLockX ) + +| 作用域 | 窗口增强模块 | 说明 | +| ------------ | ------------------------------------- | ------------------------------------------ | +| Alt+Tab 界面 | `Q E` | 左右切换多桌面 | +| Alt+Tab 界面 | `W A S D` | 上下左右切换窗口选择 | +| Alt+Tab 界面 | `X C` | 关闭选择的窗口(目前 X 和 C 没有区别) | +| Win+Tab 视图 | `Alt + W A S D` | 切换窗口选择 | +| 全局 | `Win + [Shift] + B` | 定位到托盘任务(windows 系統自帯熱鍵) | +| 全局 | `Win + [Shift] + T` | 定位到任務栏任务(windows 系統自帯熱鍵) | +| 全局 | `Win + Shift + hjkl` | 在窗口之间按方向切换焦点 | +| 任务栏 | `Ctrl + W 或 Delete` | 在托盘图标或任务栏任务上,选择退出按钮 | +| 全局 | `CapsLockX + 1 2 ... 9 0` | 切换到第 1 .. 12 个桌面 | +| 全局 | `CapsLockX + Shift + 1 2 ... 9 0 - =` | 把当前窗口移到第 n 个桌面(如果有的话) | +| 全局 | `CapsLockX + Alt + Backspace` | 删除当前桌面(会把所有窗口移到上一个桌面) | +| 全局 | `CapsLockX + C` | 快速排列当前桌面的窗口 | +| 全局 | `CapsLockX + Ctrl + C` | 快速排列当前桌面的窗口(包括最小化的窗口) | +| 全局 | `CapsLockX + Shift + C` | 快速堆叠当前桌面的窗口 | +| 全局 | `CapsLockX + Shift + Ctrl + C` | 快速堆叠当前桌面的窗口(包括最小化的窗口) | +| 全局 | `CapsLockX + Z` | 循环切到最近使用的窗口 | +| 全局 | `CapsLockX + Shift + Z` | 循环切到最不近使用的窗口 | +| 全局 | `CapsLockX + X` | 关掉当前标签页 Ctrl+W | +| 全局 | `CapsLockX + Shift + X` | 关掉当前窗口 Alt+F4 | +| 全局 | `CapsLockX + V` | 让窗口透明 | +| 全局 | `CapsLockX + Shift + V` | 让窗口保持透明(并置顶) | +| 任意窗口 | `双击左边 Shift+Ctrl+Alt` | 后置当前窗口, \* 见下方注 | + +\*注: 双击左边 Shift+Ctrl+Alt 设计用于远程桌面与虚拟机,使其可与本机桌面窗口同时显示。 +例如 mstsc.exe、TeamViewer、VirtualBox、HyperV、VMWare 等远程桌面或虚拟机程序,配合 CapsLockX + Shift + V 透明置顶功能,让你在 Windows 的界面上同时使用 Linux 界面或 MacOS 界面再也不是难题。 + +此处借用 [@yangbin9317 的评论](https://v2ex.com/t/772052#r_10458792) + +> 以 CapsLock 为抓手,打通底层逻辑,拉齐 Windows 和 Linux WM,解决了 Windows 难用的痛点 + +(20220313) 对于两端都是 Windows 的情况,也可以考虑使用 [RemoteApp Tool - Kim Knight](http://www.kimknight.net/remoteapptool) 来代替远程桌面。 + + + +### 快捷输入 + +| 模式 | 快捷输入 | 说明 | +| ---- | -------- | ----------------------------------------------- | +| 全局 | `#D#` | 日期输入:`(20220217)` | +| 全局 | `#T#` | 时间输入:`(20220217.220717)` | +| 全局 | `#DT#` | 日期时间输入:`2022-02-17 22:07:33` | +| 全局 | `#NPW#` | 随机输入数字密码如: `7500331260229289` | +| 全局 | `#PW#` | 随机输入数字字母密码如: `yyCTCNYodECTLr2h` | +| 全局 | `#WPW#` | 随机输入数字字母密码如: `FtD5BB1m5H98eY7Y` | +| 全局 | `#SPW#` | 随机输入数字字母符号密码如: `/})y+xK]z~>XKQ+p` | + + + +### 番茄时钟 + +25 分钟固定循环休息提醒。 + +使用 `CapsLockX + ,` 打开配置,然后修改 EnableScheduleTasks=1 即可启用本插件。 + +- 使用番茄报时(00 分和 30 分播放工作铃声,每小时的 25 分和 55 分播放休息铃声)(需要先开启定时任务) + + ```ini + UseTomatoLife=1 + ``` + +- 使用番茄报时时,自动切换桌面(使用番茄报时时,自动切换桌面(休息桌面为 1,工作桌面为 2) + + ```ini + UseTomatoLifeSwitchVirtualDesktop=1 + ``` + +注:如果只需要声音而不需要自动切换桌面的话,也可试试这款 Chrome 插件 [Tomato Life - Chrome 网上应用店](https://chrome.google.com/webstore/detail/25min-tomato-life/kkacpbmkhbljebmpcopjlgfgbgeokbhn) + +注注: 本插件已经分离出一个独立项目,如果你喜欢番茄工作法的话可以参见雪星的 tomato-life 项目: [snomiao/tomato-life](https://github.com/snomiao/tomato-life) + + + +### 锁屏自动息屏 + +按 Win + L 锁屏时,立即关闭屏幕,适用于准备睡觉的时候自动把电脑屏幕关掉,不让它在睡觉的时候刺眼…… + + + +## 过去与未来 🛰 + +### 制作背景 ( 2017 年秋) 🍁 Background + +> 本人比较经常写代码… +> 起初我习惯右手用鼠标……后来觉得鼠标放右边有点远……改成了左手用鼠标 +> 左手用鼠标之后发现手还是要离开键盘……于是做了个 WASD 模拟鼠标的脚本。(然后就能一直用右手托着下巴玩电脑了) +> 后来写的脚本越来越多,就把其中一些常用的放到一起加载…… + +### 发展路线 🛰️ RoadMap + +CapsLockX 的核心理念是:简化系统操作逻辑,提升操作效率,且不与原有习惯键位冲突。 + +1. [x] 按 CapsLockX + - 键显示对应帮助(目前的显示样式相当草率) +2. [ ] i18n (eh 这个真得有) +3. [ ] 自动更新(虽然 git pull 一下也不是不行) +4. [ ] 初次使用上手教程(这个现在有点简陋……) +5. [ ] 插件管理器(虽然文件系统也可以搞定) +6. [ ] 自动配置同步功能(虽然一般来说扔 onedrive 就够) +7. [ ] 易用的选项配置的 UI 界面(虽然改 ini 也不是什么难事) +8. [ ] 执行外部代码(Python、Nodejs、外部 AHK、Bash、……)(虽然写个脚本 run 一下也并不算麻烦) + +如果你有任何想法或建议,请在这里提出: +[Issues · snomiao/CapslockX](https://github.com/snolab/CapsLockX/issues) + +### 组合键含义设计 ⌨ Chore Design + +Win + 系列 通常为操作系统功能、桌面窗口应用进程管理等、输入法、输出设备(显示器、多屏)管理 + +Alt + 系列 通常表述为调用应用内功能,其含义应相当于按下功能相同的按钮,或跳转到特定功能界面。 + +Ctrl + 系列 同上,但使用上更为频繁、且很可能不存在功能相同的按钮。 + +Ctrl + Alt + 同上,但一般为全局热键 + +而 Shift 键 用来在以上功能的基础上稍微改变按键的含义(例如反向操作如 Shift+Alt+Tab,或功能范围扩大如 Shift+方向键调整选区等) + +### CapsLockX 与类似项目的功能对比 ⚔ Feat Compare Matrix + +更新于(20200627) 其中的信息可能慢慢过时 + +| 功能\项目 | [CapsLockX](https://github.com/snolab/CapsLockX) | [Vonng/CapsLock](https://github.com/Vonng/CapsLock) | [coralsw/CapsEz](https://github.com/coralsw/CapsEz) | [CapsLock+](https://capslox.com/capslock-plus/) | +| :--------------- | :----------------------------------------------- | :-------------------------------------------------- | :-------------------------------------------------- | :---------------------------------------------- | +| 鼠标模拟 | ✅ 流畅完整 | ✅ 无滚轮 | 🈚 无 | 🈚 无 | +| 表达式计算 | ✅ Nodejs 或 JScript | 🈚 无 | 🈚 无 | ✅ TabScript (Snippet + Javascript) | +| 窗口管理 | ✅ 强 | ✅ 有 | ✅ 有 | ✅ 强 | +| 虚拟桌面管理 | ✅ 有 | 🈚 无 | 🈚 无 | 🈚 无 | +| 编辑增强 | ✅ 有(抛物模型) | ✅ 有 | ✅ 有 | ✅ 有(很全) | +| 绿色免安装 | ✅ 是 | ✅ 是 | ✅ 是 | ✅ 是 | +| 增强媒体键 | 不全 | ✅ 全 | 🈚 无 | 🈚 无 | +| 强化的剪贴板 | 弱 | 🈚 无 | 🈚 无 | ✅ 有 | +| 快速启动应用 | ✅ 插件 | ✅ 有 | ✅ 有 | ✅ 有 | +| 应用功能增强 | ✅ 丰富 | 🈚 无 | ✅ 有 | 🈚 无 | +| Bash 控制 | 🈚 无 | ✅ 有 | 🈚 无 | 🈚 无 | +| 快速启动语音输入 | ✅ 讯飞 | 🈚 无 | 🈚 无 | 🈚 无 | +| 快速输入时间日期 | ✅ 有 | | ✅ 有 | | +| 窗口绑定到热键 | 🈚 无 | 🈚 无 | 🈚 无 | ✅ 有 | +| 快速旋转屏幕 | ✅ 有 | 🈚 无 | 🈚 无 | 🈚 无 | +| 二次开发 | ✅ 文档友好 | ✅ 可 | ✅ 可 | ✅ 可 | +| 内存占用 | ✅ 约 2~3M | | | | +| 模块化 | ✅ | 🈚 无 | 🈚 无 | 🈚 无 | +| 系统 | Win | Mac(主),Win(次) | Win | Win, [Mac](https://capslox.com/) | +| 支持语言 | 中文 | 中文 - English | 中文 | 中文 - English | + +#### CapsLockX 地址 🔗 Project Urls + +以下几个仓库同步更新: + +- GitHub: [https://github.com/snolab/CapsLockX](https://github.com/snolab/CapsLockX) +- Gitee: [https://gitee.com/snomiao/CapslockX](https://gitee.com/snomiao/CapslockX) +- Bitbucket: [https://bitbucket.org/snomiao/capslockx](https://bitbucket.org/snomiao/capslockx) +- Gitlab: [https://gitlab.com/snomiao/CapsLockX/](https://gitlab.com/snomiao/CapsLockX/) + +文档地址 📄 + +- 自动翻译文档 Netlify CDN:[https://capslockx.netlify.com](https://capslockx.netlify.com) +- 自动翻译文档 CloudFlare CDN:[https://capslockx.snomiao.com](https://capslockx.snomiao.com) + +星图 ⭐️ + +- [![Stargazers over time](https://starchart.cc/snolab/CapsLockX.svg)](https://starchart.cc/snolab/CapsLockX) + +#### 相似项目地址 🔗 Similar Projects + +- [Star Historys](https://star-history.t9t.io/#snolab/CapsLockX&wo52616111/capslock-plus&coralsw/CapsEz&Vonng/CapsLock) +- 源码:[Vonng/CapsLock: Make CapsLock Great Again!](https://github.com/Vonng/CapsLock) + 设计:[Capslock/design.md at master · Vonng/Capslock](https://github.com/Vonng/Capslock/blob/master/design.md) +- [coralsw/CapsEz: KeyMouse Tools](https://github.com/coralsw/CapsEz) +- [CapsLock+](https://capslox.com/CapsLock-plus/) +- [Capslox](https://capslox.com/cn/) +- CapsLock++ [matrix1001/CapsLock-plus-plus: ⌨Amazing, extendable, readable autohotkey scripts framework utilized by CapsLock.](https://github.com/matrix1001/CapsLock-plus-plus) +- [Power Keys | 解放电脑使用效率](https://powerkeys.github.io/) + +## 答疑相关 ❓ Questions + +相关社群: + +- [CapsLockX 的 issues (可作论坛使用)](https://github.com/snolab/CapsLockX/issues) ✉️ +- CapsLockX 用户电报群:[t.me/CapsLockX_users](https://t.me/CapsLockX_users)📱 +- CapsLockX 用户 QQ 群 🐧:[100949388](https://jq.qq.com/?_wv=1027&k=56lsK8ko) +- QZ/VimD/TC/AHK QQ 群 🐧: 271105729 +- AHK 高级 QQ 群 🐧: 717947647 + +CapsLockX 相关答疑直接进群 [@雪星](tencent://message?uin=997596439) 或私聊提问也可。 + +### 隐私与安全性 🔒 Privacy + +考虑到任何能够获取到管理员权限的软件对于用户的操作系统都是相当危险的,故 CapsLockX 必须而且正在采用开源的方式以使社区可以自由且随意地检查 CapsLockX 中可能涉及到的任何部分的代码,以保证所有用户的操作系统安全性不因本软件而受损害。 + +## 支持 ⭐️ Supports + +如何帮助 CapsLockX 生存下去?如果 CapsLockX 有帮助到你: + +1. ⭐️ 请在 CapsLockX Github 上点星 Star +2. 🔗 请把我转发分享给你身边的朋友们。 +3. 🌐 欢迎帮我翻译本文档到各国语言。 +4. 🐞 欢迎提交 bug、提出完善建议 [issues](https://github.com/snolab/CapsLockX/issues) +5. 欢迎提交代码 PR,哪怕是修改错别字也是可以的~ +6. 欢迎创作关于本软件的作品,比如录制使用教学视频投稿到 Youtube 或 Bilibili ,雪星会去给你点赞的哦。 +7. 💰 欢迎在此捐助 CapsLockX 的开发,每一笔捐赠都会记录到下方的列表中: + - 爱发电 ⚡️:[https://afdian.net/@snomiao](https://afdian.net/@snomiao) + - PAYPAL: [https://paypal.me/snomiao](https://paypal.me/snomiao) + - 支付宝捐助账号: [snomiao@gmail.com (点击查看二维码)](./支付宝捐助.png) + - ETH: [0xdc2eece11a9e09c8db921989e54b30375446e49e](https://etherscan.io/address/0xdc2eece11a9e09c8db921989e54b30375446e49e) + +- [发展路线](#发展路线-roadmap) + +### 捐赠记录(截至 20210821) 📄 Donate Records + +| 捐赠时间 | 名称 | 渠道 | 金额 | 备注 | +| ---------- | -------------------------------- | ----------- | ----------- | -------------------------------------------------------------- | +| 2021-06-19 | \*\*煜 | Alipay QR | +50.00 CNY | 小小資助,支持獨立開發者 | +| 2023-05-12 | 卡拉翁 | 微信转账 | +200.00 CNY | 🫡 (敬礼) | +| 2023-06-09 | [@andriasw](github.com/andriasw) | Alipay 转账 | +66.66 CNY | for CapsLockX-mac, 66.66 is good (https://github.com/andriasw) | +| 2023-12-19 | 慧蛋 | QQ 红包 | +45.00 CNY | 请开发者喝咖啡 | + +### 鸣谢 🙏🏻 Thanks + +- 感谢来自以上捐赠者的经济支持。 +- 感谢 [秦金伟](http://rsytes.coding-pages.com/) 的引用推荐文章、和发展建议:[2020-02-23 当键盘模拟鼠标 - 简书](https://www.jianshu.com/p/f757f56a7de6) +- 感谢 @河许人 帮助转载推广: [CapsLockX – 像黑客一样操作电脑!【雪星】 – AutoAHK](https://www.autoahk.com/archives/34996) +- 感谢在 issues 里和群里提问并帮助完善 CapsLockX 的各位。 + +### 相关话题 - Related Topics + +- [秦金伟](http://rsytes.coding-pages.com/) + - [2020-02-23 当键盘模拟鼠标 - qwertc]( https://mp.weixin.qq.com/s?__biz=MzIzNzczOTkzMw==&mid=2247483745&idx=1&sn=16f16c1fa02e1ef386a83f3023fb109d&chksm=e8c54b93dfb2c285e49fa8045d2380b20810768e3be043f364be146a598faf5f363bbb2623e7&scene=21#wechat_redirect ) + - [2020-10-26 键盘模拟鼠标2 - qwertc]( https://mp.weixin.qq.com/s?__biz=MzIzNzczOTkzMw==&mid=2247484272&idx=1&sn=0ed1ff91bee008fc5c01dc0fe20e53ba&chksm=e8c54982dfb2c09493c88a0f7847ffb0b508598e0756ddd7e8ad94d1f31f65490388d6cff7a4&scene=21#wechat_redirect ) + - [2021-03-11 capslockX-治愈鼠标手 - qwertc](https://mp.weixin.qq.com/s?__biz=MzIzNzczOTkzMw==&mid=2247484478&idx=1&sn=1518d7ec4dc08c1a72c08fcaff98550e&chksm=e8c54eccdfb2c7daed0ad9b8c03395e4211e029199374f4bc0dbdc9a8403c2dae86b740c95c5&scene=21#wechat_redirect) + - 2021年11月,键盘模拟鼠标3 + - [2022-08-21 t0820 复制后匹配-siyuan-clx-截图 - qwertc]( https://mp.weixin.qq.com/s?__biz=MzIzNzczOTkzMw==&mid=2247485441&idx=1&sn=848d5e6f3fb7c1e7b14100615ca7d0db&chksm=e8c542f3dfb2cbe5770fe19bb8b5c81935e52a4a686154e69104bc403ab6ce960d1b6ae429a9&scene=21#wechat_redirect ) + - [2024-01-06 t0106 OpenAI加持的CapslockX - qwertc]( https://mp.weixin.qq.com/s?__biz=MzIzNzczOTkzMw==&mid=2247485707&idx=1&sn=d40eea9f0b5bb81e3387ec592def4ed0&chksm=e8c543f9dfb2caef90939e2fafcb324fd757949c79399c55adfbab0940e70efd753fb6bf3837&token=1464360155&lang=zh_CN#rd) +- [有没有办法将 Chrome OS 中的快捷键实现到 Windows 10 中 - V2EX](https://www.v2ex.com/t/778967) +- [推荐一下我的键位映射工具 MyKeymap - V2EX](https://v2ex.com/t/844432) +- [有多少人会把键盘上的 CapsLock 和 Backspace 对调? - V2EX](https://www.v2ex.com/t/855901) +- [分享一个用 CapsLock+H/J/K/L 模拟方向键的小工具 - V2EX](https://www.v2ex.com/t/318182) +- [推荐一个适合程序员的效率工具 AltPlus,左边大拇指按下 Alt 键,就可以像使用 vim 一样编程了. - V2EX](https://www.v2ex.com/t/800721) +- [CapsLockX - 像黑客一样操作电脑 - V2EX](https://v2ex.com/t/772052#reply1) +- [CapsLockX - 像黑客一样操作电脑! - AutoHotkey Community](https://www.autohotkey.com/boards/viewtopic.php?f=28&t=88593) +- [(10) What are some good career alternatives for a computer programmer with RSI? - Quora](https://www.quora.com/Repetitive-Strain-Injury-RSI/What-are-some-good-career-alternatives-for-a-computer-programmer-with-RSI) +- [如何将电脑桌面划分为独立的两半? - 知乎](https://www.zhihu.com/questionz/23443944/answer/1670521971) +- [有哪位残友用的是单手键盘? - 知乎](https://www.zhihu.com/question/50621709/answer/1681247637) +- [(5 封私信 - 50 条消息) 怎么样才能只用键盘不用鼠标,包括任何指针触控设备,并优雅地使用电脑? - 知乎](https://www.zhihu.com/question/21281518/answer/1770669886) +- [(5 封私信 - 50 条消息) 如何将电脑桌面划分为独立的两半? - 知乎](https://www.zhihu.com/question/23443944/answer/1670521971) +- [我是职场达人,AutoHotKey 让我成为职场超人 - 知乎](https://zhuanlan.zhihu.com/p/60372361) +- [AutoHotKey 中文网专栏 - 知乎](https://www.zhihu.com/column/autoahk) +- [电脑一族如何防治“鼠标手” - 陕西日报](http://www.sxjkjy.com/uploadfiles/files/2017062110481454.pdf) + +## 页尾目录 - Table of Contents + +- [CapsLockX - 💻 Get Hacker's Keyboard. 像**黑客**一样操作电脑](#capslockx----get-hackers-keyboard-像黑客一样操作电脑) + - [版本墙 - 徽章墙 📛 Badges](#版本墙---徽章墙--badges) + - [新手快速入门教程 📖 Tutorial](#新手快速入门教程--tutorial) + - [简易入门教程(读完这一小节,便算是入门了 CapsLockX 的使用 )](#简易入门教程读完这一小节便算是入门了-capslockx-的使用-) + - [进阶参考手册 🦽 Manual](#进阶参考手册--manual) + - [安装与使用 🛠 Installation](#安装与使用--installation) + - [绿色便携程序包(新手适用,稳定版) 📦 Packaged Bins](#绿色便携程序包新手适用稳定版--packaged-bins) + - [命令行方式安装(进阶用户推荐,可自动更新)🖥️ Install by command](#命令行方式安装进阶用户推荐可自动更新️-install-by-command) + - [使用手册 📖 - Usage Manual](#使用手册----usage-manual) + - [基础操作](#基础操作) + - [模块说明](#模块说明) + - [多任务工作的噩梦 - Nightmares of Multitasking](#多任务工作的噩梦---nightmares-of-multitasking) + - [虚拟桌面概述:情景模式、工作桌面、娱乐桌面、项目分类……](#虚拟桌面概述情景模式工作桌面娱乐桌面项目分类) + - [Windows 窗口切换的用户体验提升 - Win+tab](#windows-窗口切换的用户体验提升---wintab) + - [TODO-Docs](#todo-docs) + - [焦点数量:活动窗口、默认活动窗口、……](#焦点数量活动窗口默认活动窗口) + - [多屏幕的利用 - Multi-screening](#多屏幕的利用---multi-screening) + - [4K 时代的窗口排列 - Window arrange with 4k screen](#4k-时代的窗口排列---window-arrange-with-4k-screen) + - [Linux 与 Mac 窗口的管理 - Window Manager in Linux and mac](#linux-与-mac-窗口的管理---window-manager-in-linux-and-mac) + - [Android 与 iOS 的窗口管理 - Window Manage in android](#android-与-ios-的窗口管理---window-manage-in-android) + - [编辑操作的困扰](#编辑操作的困扰) + - [键入区与编辑控制区的疏远](#键入区与编辑控制区的疏远) + - [并击的概念](#并击的概念) + - [图形界面的困扰](#图形界面的困扰) + - [人类的速度认知](#人类的速度认知) + - [软件的热键缺陷](#软件的热键缺陷) + - [便携键盘的可用性](#便携键盘的可用性) + - [帮助模块](#帮助模块) + - [本模块功能见下](#本模块功能见下) + - [Anki 增强模块](#anki-增强模块) + - [常用功能/特性](#常用功能特性) + - [说明](#说明) + - [Figma Enhanced](#figma-enhanced) + - [常用功能/特性](#常用功能特性-1) + - [说明](#说明-1) + - [OneNote 2016 - 2019 增强](#onenote-2016---2019-增强) + - [雪星喵常用功能](#雪星喵常用功能) + - [按键分布设计(开发中)](#按键分布设计开发中) + - [详细按键表 / CheatSheet](#详细按键表--cheatsheet) + - [编辑增强插件( TG YUIO HJKL ) 🌟](#编辑增强插件-tg-yuio-hjkl--) + - [Surface 笔记本扩充功能键](#surface-笔记本扩充功能键) + - [媒体键模块](#媒体键模块) + - [模拟鼠标插件( WASD QERF )](#模拟鼠标插件-wasd-qerf-) + - [功能](#功能) + - [使用方法如下](#使用方法如下) + - [操作细节](#操作细节) + - [JavaScript 计算 (建议安装 NodeJS )](#javascript-计算-建议安装-nodejs-) + - [窗口增强插件 (CLX + 1234567890 ZXCV)](#窗口增强插件-clx--1234567890-zxcv) + - [功能简述](#功能简述) + - [效果图](#效果图) + - [使用方法如下 ( Alt+Tab 与 CapsLockX )](#使用方法如下--alttab-与-capslockx-) + - [快捷输入](#快捷输入) + - [番茄时钟](#番茄时钟) + - [锁屏自动息屏](#锁屏自动息屏) + - [过去与未来 🛰](#过去与未来-) + - [制作背景 ( 2017 年秋) 🍁 Background](#制作背景--2017-年秋--background) + - [发展路线 🛰️ RoadMap](#发展路线-️-roadmap) + - [组合键含义设计 ⌨ Chore Design](#组合键含义设计--chore-design) + - [CapsLockX 与类似项目的功能对比 ⚔ Feat Compare Matrix](#capslockx-与类似项目的功能对比--feat-compare-matrix) + - [CapsLockX 地址 🔗 Project Urls](#capslockx-地址--project-urls) + - [相似项目地址 🔗 Similar Projects](#相似项目地址--similar-projects) + - [答疑相关 ❓ Questions](#答疑相关--questions) + - [隐私与安全性 🔒 Privacy](#隐私与安全性--privacy) + - [支持 ⭐️ Supports](#支持-️-supports) + - [捐赠记录(截至 20210821) 📄 Donate Records](#捐赠记录截至-20210821--donate-records) + - [鸣谢 🙏🏻 Thanks](#鸣谢--thanks) + - [相关话题 - Related Topics](#相关话题---related-topics) + - [页尾目录 - Table of Contents](#页尾目录---table-of-contents) + +--- + + + diff --git a/docs/translate.ts b/docs/translate.ts index 3531e29..f6c8e2b 100644 --- a/docs/translate.ts +++ b/docs/translate.ts @@ -6,7 +6,7 @@ import { stringify } from 'yaml' import pMap from 'p-map' if (import.meta.main) { - await translateReadme('English', './docs/README.md', './docs/README.en.md'); + await translateReadme('English', './docs/README.zh.md', './docs/README.en.md'); } async function translateReadme(lang: string, infile: string, outfile: string) { From 5ac5047bd4ad5c8205c402af8711aeb8c4611dd1 Mon Sep 17 00:00:00 2001 From: snomiao Date: Sun, 12 May 2024 21:08:46 +0900 Subject: [PATCH 04/15] fix(capslockx): i18n setup i18n setup --- CapsLockX.ahk | 90 ++++---- Core/CapsLockX-ModulesLoader.ahk | 128 ++++++------ Core/CapsLockX-QuickTips.ahk | 8 +- Core/CapsLockX-RunSilent.ahk | 2 +- Core/CapsLockX-Update.ahk | 196 +++++++++--------- Core/CapsLockX-i18n.ahk | 108 +++++++++- Core/CapslockX-Config.ahk | 126 +++++------ Core/CapslockX-Core.ahk | 121 ++++++----- Core/lang-en.ini | 2 + Modules/@Help.ahk | 28 +-- Modules/App-OneNote2019.ahk | 2 +- Modules/App-XunFeiSwitching.ahk | 4 +- Modules/CLX-Brainstorm.ahk | 28 +-- Modules/CLX-Edit.ahk | 14 +- Modules/CLX-Elevate.ahk | 2 +- Modules/CLX-LaptopKeyboardFix.ahk | 8 +- Modules/CLX-MediaKeys.ahk | 2 +- Modules/CLX-Mouse.ahk | 74 +++---- Modules/CLX-NodeEval.ahk | 8 +- Modules/CLX-Pause.ahk | 10 +- Modules/CLX-Reload.ahk | 42 ++-- Modules/CLX-RunOnLogin.ahk | 2 +- Modules/CLX-Settings.ahk | 107 +++++----- Modules/CLX-Userscripts.ahk | 12 +- Modules/CLX-VirtualDesktop.ahk | 30 +-- Modules/CLX-WindowManager.ahk | 4 +- Modules/QuickInput.ahk | 2 +- Modules/QuickTips.ahk | 4 +- Modules/SnoChordTyping.ahk | 4 +- Modules/TomatoLife.ahk | 32 +-- README.md | 2 +- ...3\346\202\254\346\265\256\347\252\227.ahk" | 2 +- docs/README.md | 2 +- 33 files changed, 660 insertions(+), 546 deletions(-) create mode 100644 Core/lang-en.ini diff --git a/CapsLockX.ahk b/CapsLockX.ahk index 8f6f6af..cce7f7c 100644 --- a/CapsLockX.ahk +++ b/CapsLockX.ahk @@ -21,40 +21,40 @@ SetWorkingDir, %A_ScriptDir% #Include %A_ScriptDir%/Core/CapsLockX-RunSilent.ahk -global CapsLockX_模块路径 := "./Modules" -; global CapsLockX_用户模块路径 := CapsLockX_配置目录 "/Modules" -global CapsLockX_核心路径 := "./Core" +global CLX_模块路径 := "./Modules" +; global CLX_用户模块路径 := CLX_ConfigDir "/Modules" +global CLX_核心路径 := "./Core" ; 版本 -global CapsLockX_Version -FileRead, CapsLockX_Version, ./Core/version.txt -CapsLockX_Version := CapsLockX_Version ? CapsLockX_Version : "未知版本" +global CLX_Version +FileRead, CLX_Version, ./Core/version.txt +CLX_Version := CLX_Version ? CLX_Version : "未知版本" -global CapsLockX_VersionName := "v" CapsLockX_Version +global CLX_VersionName := "v" CLX_Version ; 加载过程提示 global 显示加载提示 := 1 global loadingTips := "" ; 对 核心模块 进行 编码清洗 -清洗为_UTF8_WITH_BOM_型编码(CapsLockX_核心路径 "/CapsLockX-Config.ahk") -清洗为_UTF8_WITH_BOM_型编码(CapsLockX_核心路径 "/CapsLockX-Core.ahk") -清洗为_UTF8_WITH_BOM_型编码(CapsLockX_核心路径 "/CapsLockX-RunSilent.ahk") -清洗为_UTF8_WITH_BOM_型编码(CapsLockX_核心路径 "/CapsLockX-Update.ahk") +清洗为_UTF8_WITH_BOM_型编码(CLX_核心路径 "/CapsLockX-Config.ahk") +清洗为_UTF8_WITH_BOM_型编码(CLX_核心路径 "/CapsLockX-Core.ahk") +清洗为_UTF8_WITH_BOM_型编码(CLX_核心路径 "/CapsLockX-RunSilent.ahk") +清洗为_UTF8_WITH_BOM_型编码(CLX_核心路径 "/CapsLockX-Update.ahk") ; 复制用户模块 ; TODO FIX:如果CLX已经开了的话,这一步会触发重启,这可能会导致一些文件冲突的BUG…… -FileDelete, %CapsLockX_模块路径%/*.user.ahk -FileDelete, %CapsLockX_模块路径%/*.user.md -FileCopy %CapsLockX_配置目录%/*.user.ahk, %CapsLockX_模块路径%/, 1 -FileCopy %CapsLockX_配置目录%/*.user.md, %CapsLockX_模块路径%/, 1 +FileDelete, %CLX_模块路径%/*.user.ahk +FileDelete, %CLX_模块路径%/*.user.md +FileCopy %CLX_ConfigDir%/*.user.ahk, %CLX_模块路径%/, 1 +FileCopy %CLX_ConfigDir%/*.user.md, %CLX_模块路径%/, 1 ; 模块加载器路径 -global CapsLockX_ModulesRunner := CapsLockX_核心路径 "/CapsLockX-ModulesRunner.ahk" -global CapsLockX_ModulesFunctions := CapsLockX_核心路径 "/CapsLockX-ModulesFunctions.ahk" -; LoadModules(CapsLockX_ModulesRunner, CapsLockX_ModulesFunctions) +global CLX_ModulesRunner := CLX_核心路径 "/CapsLockX-ModulesRunner.ahk" +global CLX_ModulesFunctions := CLX_核心路径 "/CapsLockX-ModulesFunctions.ahk" +; LoadModules(CLX_ModulesRunner, CLX_ModulesFunctions) ; 判断安装方式 global NPM全局安装也 := InStr(A_ScriptFullPath, APPDATA) == 1 && InStr("node_modules", A_ScriptFullPath) -global GIT仓库安装也 := "true" == Trim(CapsLockX_RunSilent("cmd /c git rev-parse --is-inside-work-tree"), "`r`n`t` ") +global GIT仓库安装也 := "true" == Trim(CLX_RunSilent("cmd /c git rev-parse --is-inside-work-tree"), "`r`n`t` ") ; 模块帮助向README编译() @@ -120,7 +120,7 @@ Return global 显示加载提示 if(!显示加载提示) return if (clear || loadingTips == "") { - loadingTips := "CapsLockX " CapsLockX_Version "`n" + loadingTips := "CapsLockX " CLX_Version "`n" } loadingTips .= msg "`n" } @@ -132,7 +132,7 @@ Return FileEncoding UTF-8-Raw ; 列出模块文件 ModuleFiles := "" - loop, Files, %CapsLockX_模块路径%\*.ahk + loop, Files, %CLX_模块路径%\*.ahk { ; Do not Recurse into subfolders. 子文件夹由模块自己去include去加载 ModuleFiles .= A_LoopFileName "`n" @@ -159,22 +159,22 @@ Return 模块帮助内容 := "" 模块帮助文件 := "" if (!模块帮助内容) { - 模块帮助文件 := CapsLockX_模块路径 "/" 模块名称 ".md" + 模块帮助文件 := CLX_模块路径 "/" 模块名称 ".md" if (FileExist(模块帮助文件)) { FileRead, 模块帮助内容, %模块帮助文件% } } if (!模块帮助内容) { - 模块帮助文件 := CapsLockX_模块路径 "/" 模块文件名称 ".md" + 模块帮助文件 := CLX_模块路径 "/" 模块文件名称 ".md" if (FileExist(模块帮助文件)) { FileRead, 模块帮助内容, %模块帮助文件% } } ; 加载模块描述 - FileRead, 模块文件内容, % CapsLockX_模块路径 "/" 模块文件 + FileRead, 模块文件内容, % CLX_模块路径 "/" 模块文件 matchPos := RegExMatch(模块文件内容, "mi)^; 描述:(.*)", 模块描述) - T%模块名称%_Disabled := CapsLockX_Config("ModuleDisable", "T" 模块名称 "_Disabled", 0, "是否禁用模块:" 模块名称 (模块描述1 ? " - " 模块描述1 : "") ) + T%模块名称%_Disabled := CLX_Config("ModuleDisable", "T" 模块名称 "_Disabled", 0, "是否禁用模块:" 模块名称 (模块描述1 ? " - " 模块描述1 : "") ) if (模块帮助内容) { 模块帮助内容 := Trim(模块帮助内容, " `t`n") @@ -185,8 +185,8 @@ Return 模块帮助内容 := RegExReplace(模块帮助内容, "m)^#", "###") ; 替换资源链接的相对目录(图片gif等) - FileCopy, %CapsLockX_模块路径%\*.gif, .\docs\media\, 1 - FileCopy, %CapsLockX_模块路径%\*.png, .\docs\media\, 1 + FileCopy, %CLX_模块路径%\*.gif, .\docs\media\, 1 + FileCopy, %CLX_模块路径%\*.png, .\docs\media\, 1 模块帮助内容 := RegExReplace(模块帮助内容, "m)\[(.*)\]\(\s*?\.\/(.*?)\)", "[$1](./media/$2)") ; 没有标题的,给自动加标题 if (!RegExMatch(模块帮助内容, "^#")) { @@ -202,17 +202,17 @@ Return 加载提示追加("跳过模块:" i " " 模块名称) } else { ; 这里引入模块代码 - 清洗为_UTF8_WITH_BOM_型编码(CapsLockX_模块路径 "/" 模块文件) + 清洗为_UTF8_WITH_BOM_型编码(CLX_模块路径 "/" 模块文件) ; 导入模块 - 模块初始化代码 .= "GoSub CapsLockX_ModuleSetup_" i "`n" + 模块初始化代码 .= "GoSub CLX_ModuleSetup_" i "`n" 模块导入代码 .= "`n" "#If" "`n" "`n" - 模块导入代码 .= "CapsLockX_ModuleSetup_" i ":" "`n" + 模块导入代码 .= "CLX_ModuleSetup_" i ":" "`n" if (模块帮助内容 && 模块帮助文件) { - 模块导入代码 .= " " " " " " " " "CapsLockX_THIS_MODULE_HELP_FILE_PATH = " 模块帮助文件 "`n" + 模块导入代码 .= " " " " " " " " "CLX_THIS_MODULE_HELP_FILE_PATH = " 模块帮助文件 "`n" } else { - 模块导入代码 .= " " " " " " " " "CapsLockX_THIS_MODULE_HELP_FILE_PATH := """"" "`n" + 模块导入代码 .= " " " " " " " " "CLX_THIS_MODULE_HELP_FILE_PATH := """"" "`n" } - 模块导入代码 .= " " " " " " " " "#Include " CapsLockX_模块路径 "/" 模块文件 "`n" + 模块导入代码 .= " " " " " " " " "#Include " CLX_模块路径 "/" 模块文件 "`n" 模块导入代码 .= "Return" "`n" 加载提示追加("运行模块:" i " " 模块名称) } @@ -221,25 +221,25 @@ Return ; 拼接模块加载器代码 常量语句 .= "; 请勿直接编辑本文件,以下内容由核心加载器自动生成。雪星/(20210318)" "`n" - 常量语句 .= "global CapsLockX_模块路径 := " """" CapsLockX_模块路径 """" "`n" - 常量语句 .= "global CapsLockX_核心路径 := " """" CapsLockX_核心路径 """" "`n" - 常量语句 .= "global CapsLockX_Version := " """" CapsLockX_Version """" "`n" - 常量语句 .= "global CapsLockX_VersionName := " """" CapsLockX_VersionName """" "`n" + 常量语句 .= "global CLX_模块路径 := " """" CLX_模块路径 """" "`n" + 常量语句 .= "global CLX_核心路径 := " """" CLX_核心路径 """" "`n" + 常量语句 .= "global CLX_Version := " """" CLX_Version """" "`n" + 常量语句 .= "global CLX_VersionName := " """" CLX_VersionName """" "`n" 模块运行器 .= 常量语句 "`n" 模块初始化代码 模块加载器 .= "Return" "`n" 模块导入代码 FileEncoding UTF-8 - FileDelete %CapsLockX_ModulesRunner% - FileAppend %模块运行器%, %CapsLockX_ModulesRunner% - if (!FileExist(CapsLockX_ModulesRunner)) { + FileDelete %CLX_ModulesRunner% + FileAppend %模块运行器%, %CLX_ModulesRunner% + if (!FileExist(CLX_ModulesRunner)) { msg = msg .= "Unable to write ModulesRunner.ahk, if you are install with chocolatey, run me as admin at the first time please.`n" msg .= "注意:未能写入模块运行器,如果使用 chocolatey 首次安装后,请以管理员权限运行。" msgbox %msg% } - FileDelete %CapsLockX_ModulesFunctions% - FileAppend %模块加载器%, %CapsLockX_ModulesFunctions% + FileDelete %CLX_ModulesFunctions% + FileAppend %模块加载器%, %CLX_ModulesFunctions% 加载提示显示() 全部帮助 := Trim(全部帮助, " `t`n") @@ -260,8 +260,8 @@ Return Return targetREADME } CapsLockX启动(){ - CoreAHK := CapsLockX_核心路径 "\CapsLockX-Core.ahk" - UpdatorAHK := CapsLockX_核心路径 "\CapsLockX-Update.ahk" + CoreAHK := CLX_核心路径 "\CapsLockX-Core.ahk" + UpdatorAHK := CLX_核心路径 "\CapsLockX-Update.ahk" ; 为了避免运行时对更新模块的影响,先把 EXE 文件扔到 Temp 目录,然后再使用 Temp 里的 AHK 来运行本核心。 AHK_EXE_ROOT_PATH := "CapsLockX.exe" AHK_EXE_CORE_PATH := "./Core/CapsLockX.exe" @@ -278,7 +278,7 @@ CapsLockX启动(){ ; 运行核心 ; 启动 - global T_AskRunAsAdmin := CapsLockX_ConfigGet("Core", "T_AskRunAsAdmin", 0) + global T_AskRunAsAdmin := CLX_ConfigGet("Core", "T_AskRunAsAdmin", 0) adminCommand := RegExMatch(DllCall("GetCommandLine", "str"), "/admin") if (!A_IsAdmin && T_AskRunAsAdmin || adminCommand) { RunWait *RunAs %AHK_EXE_TEMP_PATH% %CoreAHK%, %A_ScriptDir% diff --git a/Core/CapsLockX-ModulesLoader.ahk b/Core/CapsLockX-ModulesLoader.ahk index e91c455..7c87092 100644 --- a/Core/CapsLockX-ModulesLoader.ahk +++ b/Core/CapsLockX-ModulesLoader.ahk @@ -2,224 +2,224 @@ #If -CapsLockX_ModuleSetup_1: - CapsLockX_THIS_MODULE_HELP_FILE_PATH = ./Modules/@Help.md +CLX_ModuleSetup_1: + CLX_THIS_MODULE_HELP_FILE_PATH = ./Modules/@Help.md #Include ./Modules/@Help.ahk Return #If -CapsLockX_ModuleSetup_2: - CapsLockX_THIS_MODULE_HELP_FILE_PATH := "" +CLX_ModuleSetup_2: + CLX_THIS_MODULE_HELP_FILE_PATH := "" #Include ./Modules/App-AcrobatEnhanced.ahk Return #If -CapsLockX_ModuleSetup_3: - CapsLockX_THIS_MODULE_HELP_FILE_PATH = ./Modules/App-AnkiEnhanced.md +CLX_ModuleSetup_3: + CLX_THIS_MODULE_HELP_FILE_PATH = ./Modules/App-AnkiEnhanced.md #Include ./Modules/App-AnkiEnhanced.ahk Return #If -CapsLockX_ModuleSetup_4: - CapsLockX_THIS_MODULE_HELP_FILE_PATH := "" +CLX_ModuleSetup_4: + CLX_THIS_MODULE_HELP_FILE_PATH := "" #Include ./Modules/App-BlenderEnhanced.ahk Return #If -CapsLockX_ModuleSetup_5: - CapsLockX_THIS_MODULE_HELP_FILE_PATH := "" +CLX_ModuleSetup_5: + CLX_THIS_MODULE_HELP_FILE_PATH := "" #Include ./Modules/App-Figma.ahk Return #If -CapsLockX_ModuleSetup_6: - CapsLockX_THIS_MODULE_HELP_FILE_PATH := "" +CLX_ModuleSetup_6: + CLX_THIS_MODULE_HELP_FILE_PATH := "" #Include ./Modules/App-LoopbackExemptionManager.ahk Return #If -CapsLockX_ModuleSetup_7: - CapsLockX_THIS_MODULE_HELP_FILE_PATH := "" +CLX_ModuleSetup_7: + CLX_THIS_MODULE_HELP_FILE_PATH := "" #Include ./Modules/App-MobaXterm.ahk Return #If -CapsLockX_ModuleSetup_8: - CapsLockX_THIS_MODULE_HELP_FILE_PATH = ./Modules/App-OneNote2019.md +CLX_ModuleSetup_8: + CLX_THIS_MODULE_HELP_FILE_PATH = ./Modules/App-OneNote2019.md #Include ./Modules/App-OneNote2019.ahk Return #If -CapsLockX_ModuleSetup_9: - CapsLockX_THIS_MODULE_HELP_FILE_PATH := "" +CLX_ModuleSetup_9: + CLX_THIS_MODULE_HELP_FILE_PATH := "" #Include ./Modules/App-OneNoteMetro.ahk Return #If -CapsLockX_ModuleSetup_10: - CapsLockX_THIS_MODULE_HELP_FILE_PATH := "" +CLX_ModuleSetup_10: + CLX_THIS_MODULE_HELP_FILE_PATH := "" #Include ./Modules/App-QQ-Desktop.ahk Return #If -CapsLockX_ModuleSetup_11: - CapsLockX_THIS_MODULE_HELP_FILE_PATH := "" +CLX_ModuleSetup_11: + CLX_THIS_MODULE_HELP_FILE_PATH := "" #Include ./Modules/CLX-Cursor.ahk Return #If -CapsLockX_ModuleSetup_12: - CapsLockX_THIS_MODULE_HELP_FILE_PATH = ./Modules/CLX-Edit.md +CLX_ModuleSetup_12: + CLX_THIS_MODULE_HELP_FILE_PATH = ./Modules/CLX-Edit.md #Include ./Modules/CLX-Edit.ahk Return #If -CapsLockX_ModuleSetup_13: - CapsLockX_THIS_MODULE_HELP_FILE_PATH := "" +CLX_ModuleSetup_13: + CLX_THIS_MODULE_HELP_FILE_PATH := "" #Include ./Modules/CLX-Elevate.ahk Return #If -CapsLockX_ModuleSetup_14: - CapsLockX_THIS_MODULE_HELP_FILE_PATH := "" +CLX_ModuleSetup_14: + CLX_THIS_MODULE_HELP_FILE_PATH := "" #Include ./Modules/CLX-EnterWithoutBreak.ahk Return #If -CapsLockX_ModuleSetup_15: - CapsLockX_THIS_MODULE_HELP_FILE_PATH = ./Modules/CLX-JavaScriptEval.md +CLX_ModuleSetup_15: + CLX_THIS_MODULE_HELP_FILE_PATH = ./Modules/CLX-JavaScriptEval.md #Include ./Modules/CLX-JavaScriptEval.ahk Return #If -CapsLockX_ModuleSetup_16: - CapsLockX_THIS_MODULE_HELP_FILE_PATH = ./Modules/CLX-LaptopKeyboardFix.md +CLX_ModuleSetup_16: + CLX_THIS_MODULE_HELP_FILE_PATH = ./Modules/CLX-LaptopKeyboardFix.md #Include ./Modules/CLX-LaptopKeyboardFix.ahk Return #If -CapsLockX_ModuleSetup_17: - CapsLockX_THIS_MODULE_HELP_FILE_PATH = ./Modules/CLX-MediaKeys.md +CLX_ModuleSetup_17: + CLX_THIS_MODULE_HELP_FILE_PATH = ./Modules/CLX-MediaKeys.md #Include ./Modules/CLX-MediaKeys.ahk Return #If -CapsLockX_ModuleSetup_18: - CapsLockX_THIS_MODULE_HELP_FILE_PATH = ./Modules/CLX-Mouse.md +CLX_ModuleSetup_18: + CLX_THIS_MODULE_HELP_FILE_PATH = ./Modules/CLX-Mouse.md #Include ./Modules/CLX-Mouse.ahk Return #If -CapsLockX_ModuleSetup_19: - CapsLockX_THIS_MODULE_HELP_FILE_PATH := "" +CLX_ModuleSetup_19: + CLX_THIS_MODULE_HELP_FILE_PATH := "" #Include ./Modules/CLX-Pause.ahk Return #If -CapsLockX_ModuleSetup_20: - CapsLockX_THIS_MODULE_HELP_FILE_PATH := "" +CLX_ModuleSetup_20: + CLX_THIS_MODULE_HELP_FILE_PATH := "" #Include ./Modules/CLX-Reload.ahk Return #If -CapsLockX_ModuleSetup_21: - CapsLockX_THIS_MODULE_HELP_FILE_PATH := "" +CLX_ModuleSetup_21: + CLX_THIS_MODULE_HELP_FILE_PATH := "" #Include ./Modules/CLX-RunOnLogin.ahk Return #If -CapsLockX_ModuleSetup_22: - CapsLockX_THIS_MODULE_HELP_FILE_PATH := "" +CLX_ModuleSetup_22: + CLX_THIS_MODULE_HELP_FILE_PATH := "" #Include ./Modules/CLX-Settings.ahk Return #If -CapsLockX_ModuleSetup_23: - CapsLockX_THIS_MODULE_HELP_FILE_PATH := "" +CLX_ModuleSetup_23: + CLX_THIS_MODULE_HELP_FILE_PATH := "" #Include ./Modules/CLX-Userscripts.ahk Return #If -CapsLockX_ModuleSetup_24: - CapsLockX_THIS_MODULE_HELP_FILE_PATH := "" +CLX_ModuleSetup_24: + CLX_THIS_MODULE_HELP_FILE_PATH := "" #Include ./Modules/CLX-VirtualDesktop.ahk Return #If -CapsLockX_ModuleSetup_25: - CapsLockX_THIS_MODULE_HELP_FILE_PATH = ./Modules/CLX-WindowManager.md +CLX_ModuleSetup_25: + CLX_THIS_MODULE_HELP_FILE_PATH = ./Modules/CLX-WindowManager.md #Include ./Modules/CLX-WindowManager.ahk Return #If -CapsLockX_ModuleSetup_26: - CapsLockX_THIS_MODULE_HELP_FILE_PATH := "" +CLX_ModuleSetup_26: + CLX_THIS_MODULE_HELP_FILE_PATH := "" #Include ./Modules/EmojiSearchByPreferLanguage.ahk Return #If -CapsLockX_ModuleSetup_27: - CapsLockX_THIS_MODULE_HELP_FILE_PATH = ./Modules/QuickInput.md +CLX_ModuleSetup_27: + CLX_THIS_MODULE_HELP_FILE_PATH = ./Modules/QuickInput.md #Include ./Modules/QuickInput.ahk Return #If -CapsLockX_ModuleSetup_28: - CapsLockX_THIS_MODULE_HELP_FILE_PATH := "" +CLX_ModuleSetup_28: + CLX_THIS_MODULE_HELP_FILE_PATH := "" #Include ./Modules/QuickTips.ahk Return #If -CapsLockX_ModuleSetup_29: - CapsLockX_THIS_MODULE_HELP_FILE_PATH := "" +CLX_ModuleSetup_29: + CLX_THIS_MODULE_HELP_FILE_PATH := "" #Include ./Modules/SnoChordTyping.ahk Return #If -CapsLockX_ModuleSetup_30: - CapsLockX_THIS_MODULE_HELP_FILE_PATH := "" +CLX_ModuleSetup_30: + CLX_THIS_MODULE_HELP_FILE_PATH := "" #Include ./Modules/SNOCLICK.ahk Return #If -CapsLockX_ModuleSetup_31: - CapsLockX_THIS_MODULE_HELP_FILE_PATH = ./Modules/TomatoLife.md +CLX_ModuleSetup_31: + CLX_THIS_MODULE_HELP_FILE_PATH = ./Modules/TomatoLife.md #Include ./Modules/TomatoLife.ahk Return #If -CapsLockX_ModuleSetup_32: - CapsLockX_THIS_MODULE_HELP_FILE_PATH = ./Modules/TurnOffScreenWhenLock.md +CLX_ModuleSetup_32: + CLX_THIS_MODULE_HELP_FILE_PATH = ./Modules/TurnOffScreenWhenLock.md #Include ./Modules/TurnOffScreenWhenLock.ahk Return diff --git a/Core/CapsLockX-QuickTips.ahk b/Core/CapsLockX-QuickTips.ahk index fbfd0ea..23ee01a 100644 --- a/Core/CapsLockX-QuickTips.ahk +++ b/Core/CapsLockX-QuickTips.ahk @@ -20,10 +20,10 @@ QuickTips(){ msg .= "| Shift + z | 下一个窗口激活 |`n" msg .= "| Ctrl + Alt + x | 杀死窗口并切到下一窗口 |`n" msg .= "| Shift + Ctrl + c | 自动堆叠窗口(包括最小化的窗口) |`n" - msg .= "| \ | CapsLockX_模块重载 |`n" - msg .= "| Shift + \ | CapsLockX_Reload |`n" - msg .= "| Shift + \ | CapsLockX_重新启动 |`n" - msg .= "| Shift + Ctrl + \ | CapsLockX_退出 |`n" + msg .= "| \ | CLX_模块重载 |`n" + msg .= "| Shift + \ | CLX_Reload |`n" + msg .= "| Shift + \ | CLX_重新启动 |`n" + msg .= "| Shift + Ctrl + \ | CLX_退出 |`n" msg .= "| m | 配置文件编辑 |`n" } } diff --git a/Core/CapsLockX-RunSilent.ahk b/Core/CapsLockX-RunSilent.ahk index c8aaa34..15dc637 100644 --- a/Core/CapsLockX-RunSilent.ahk +++ b/Core/CapsLockX-RunSilent.ahk @@ -57,6 +57,6 @@ StdoutToVar_CreateProcess(sCmd, sEncoding:="CP0", sDir:="", ByRef nExitCode:=0){ Return sOutput } -CapsLockX_RunSilent(command){ +CLX_RunSilent(command){ Return StdoutToVar_CreateProcess(command) } \ No newline at end of file diff --git a/Core/CapsLockX-Update.ahk b/Core/CapsLockX-Update.ahk index bbbb645..c9cc6bf 100644 --- a/Core/CapsLockX-Update.ahk +++ b/Core/CapsLockX-Update.ahk @@ -17,126 +17,126 @@ #Include *i ./CapsLockX-Config.ahk #Include *i ./CapsLockX-RunSilent.ahk -if(FileExist(CapsLockX_配置路径)) { +if(FileExist(CLX_ConfigPath)) { global T_CheckUpdate global T_DownloadUpdate ; 用ConfigGet防止触发自动重载 - T_CheckUpdate := CapsLockX_ConfigGet("Update", "T_CheckUpdate", 1) - T_DownloadUpdate := CapsLockX_ConfigGet("Update", "T_DownloadUpdate", 1) + T_CheckUpdate := CLX_ConfigGet("Update", "T_CheckUpdate", 1) + T_DownloadUpdate := CLX_ConfigGet("Update", "T_DownloadUpdate", 1) } -global CapsLockX_Update_Updated := 0x01 -global CapsLockX_Update_Fail := 0x02 -global CapsLockX_Update_AlreadyLatest := 0x04 -global CapsLockX_Update_NeedUpdate := 0x08 -global CapsLockX_Update_Stop := 0x10 +global CLX_Update_Updated := 0x01 +global CLX_Update_Fail := 0x02 +global CLX_Update_AlreadyLatest := 0x04 +global CLX_Update_NeedUpdate := 0x08 +global CLX_Update_Stop := 0x10 ; Sleep, 5000 if (T_CheckUpdate) - CapsLockX_更新() -; CapsLockX_更新记录("发现新版本!准备更新:" "`n仓库版本:" remote "`n我的版本:" local) + CLX_更新() +; CLX_更新记录("发现新版本!准备更新:" "`n仓库版本:" remote "`n我的版本:" local) ; TODO ; TrayTip, CapsLockX 更新模块, 更新完成 ; Sleep, 5000 return -CapsLockX_更新记录(msg){ +CLX_更新记录(msg){ ; TrayTip CapsLockX 更新, %msg% ; ToolTip, CapsLockX 更新:%msg% ; MsgBox, CapsLockX 更新:%msg% } -CapsLockX_更新提示(msg){ +CLX_更新提示(msg){ ; TrayTip CapsLockX 更新, %msg% ; ToolTip, CapsLockX 更新:%msg% MsgBox, CapsLockX 更新:%msg% } -CapsLockX_仓库版本号比对(remote, local){ +CLX_仓库版本号比对(remote, local){ ; from [(1) Simple version comparison - AutoHotkey Community](https://www.autohotkey.com/boards/viewtopic.php?f=6&t=5959) ver_local := StrSplit(local, ".") ver_other := StrSplit(remote, ".") for _ in dex, _num in ver_local { if ( (ver_other[_index]+0) > (_num+0) ) { - CapsLockX_更新记录("发现新版本!准备更新:" "`n仓库版本:" remote "`n我的版本:" local) + CLX_更新记录("发现新版本!准备更新:" "`n仓库版本:" remote "`n我的版本:" local) return 1 } else if ( (ver_other[_index]+0) < (_num+0) ) { - ; CapsLockX_更新记录("当前已经是最新版本" "`n仓库版本:" remote "`n我的版本:" local) + ; CLX_更新记录("当前已经是最新版本" "`n仓库版本:" remote "`n我的版本:" local) return -1 } - ; CapsLockX_更新记录("当前已经是最新版本" "`n仓库版本:" remote "`n我的版本:" local) + ; CLX_更新记录("当前已经是最新版本" "`n仓库版本:" remote "`n我的版本:" local) return 0 } } -CapsLockX_通过npm更新尝试(){ +CLX_通过npm更新尝试(){ EnvGet, APPDATA, APPDATA NPM全局安装也 := InStr(A_ScriptFullPath, APPDATA) == 1 && InStr("node_modules", A_ScriptFullPath) if(!NPM全局安装也) { - return CapsLockX_Update_Fail + return CLX_Update_Fail } - CapsLockX_更新记录("当前版本由 npm i -g 安装,正在尝试通过 npm update -g capslockx 更新") + CLX_更新记录("当前版本由 npm i -g 安装,正在尝试通过 npm update -g capslockx 更新") 更新成功 := 0 - || "SUCC" == CapsLockX_RunSilent("cmd /c cnpm update -g capslockx && echo SUCC || echo FAIL") - || "SUCC" == CapsLockX_RunSilent("cmd /c npm update -g capslockx && echo SUCC || echo FAIL") - return 更新成功 ? CapsLockX_Update_AlreadyLatest : CapsLockX_Update_Fail + || "SUCC" == CLX_RunSilent("cmd /c cnpm update -g capslockx && echo SUCC || echo FAIL") + || "SUCC" == CLX_RunSilent("cmd /c npm update -g capslockx && echo SUCC || echo FAIL") + return 更新成功 ? CLX_Update_AlreadyLatest : CLX_Update_Fail } -CapsLockX_通过gitpull更新(tryAgainFlag := 0){ - GIT仓库安装也 := "true" == Trim(CapsLockX_RunSilent("cmd /c git rev-parse --is-inside-work-tree"), "`r`n`t` ") +CLX_通过gitpull更新(tryAgainFlag := 0){ + GIT仓库安装也 := "true" == Trim(CLX_RunSilent("cmd /c git rev-parse --is-inside-work-tree"), "`r`n`t` ") if(!GIT仓库安装也) { - return CapsLockX_Update_Fail + return CLX_Update_Fail } - CapsLockX_更新记录("当前版本由 git clone 安装,正在尝试通过 git pull 更新" tryAgainFlag) - 命令返回 := CapsLockX_RunSilent("cmd /c git fetch && git pull") + CLX_更新记录("当前版本由 git clone 安装,正在尝试通过 git pull 更新" tryAgainFlag) + 命令返回 := CLX_RunSilent("cmd /c git fetch && git pull") if(Trim(命令返回, "`t`r`n ") == "Already up to date.") { - CapsLockX_更新记录("CapsLockX 已是最新") - return CapsLockX_Update_AlreadyLatest + CLX_更新记录("CapsLockX 已是最新") + return CLX_Update_AlreadyLatest } if(命令返回) { if(tryAgainFlag) { ; 通常是有错误发生。 - CapsLockX_更新记录("git pull 错误:" 命令返回) - Return CapsLockX_Update_Fail | CapsLockX_Update_Stop + CLX_更新记录("git pull 错误:" 命令返回) + Return CLX_Update_Fail | CLX_Update_Stop } else { - return CapsLockX_通过gitpull更新("tryAgainFlag") + return CLX_通过gitpull更新("tryAgainFlag") } } - return CapsLockX_Update_Fail | CapsLockX_Update_Stop + return CLX_Update_Fail | CLX_Update_Stop } -CapsLockX_通过发布包_更新(版本文件地址, 包网址){ - CapsLockX_更新记录("正在获取新版本号...地址:" 版本文件地址) +CLX_通过发布包_更新(版本文件地址, 包网址){ + CLX_更新记录("正在获取新版本号...地址:" 版本文件地址) UrlDownloadToFile, %版本文件地址%, Core/version-remote.txt FileRead, version, Core/version.txt FileRead, remoteVersion, Core/version-remote.txt if(!remoteVersion || !version) { - return CapsLockX_Update_Fail + return CLX_Update_Fail } - CapsLockX_更新记录("正在比对版本号...地址:" 版本文件地址) - ver_cmp := CapsLockX_仓库版本号比对(remoteVersion, version) + CLX_更新记录("正在比对版本号...地址:" 版本文件地址) + ver_cmp := CLX_仓库版本号比对(remoteVersion, version) if(ver_cmp<0) { - return CapsLockX_Update_Updated + return CLX_Update_Updated } ; if(ver_cmp==0) - ; return CapsLockX_Update_AlreadyLatest + ; return CLX_Update_AlreadyLatest if(!T_DownloadUpdate) { return } 包路径 := A_Temp "/CapsLockX-UpdatePackage" "/" remoteVersion ".zip" 解压目录 := A_Temp "/CapsLockX-UpdatePackage" "/CapsLockX-" remoteVersion 程序目录 := A_Temp "/CapsLockX-UpdatePackage" "/CapsLockX-" remoteVersion - return CapsLockX_ZIP下载解压更新(包网址, 包路径, 解压目录, 程序目录) + return CLX_ZIP下载解压更新(包网址, 包路径, 解压目录, 程序目录) } -CapsLockX_通过git仓库包_更新(版本文件地址, 归档文件前缀){ - CapsLockX_更新记录("正在获取新版本号...地址:" 版本文件地址) +CLX_通过git仓库包_更新(版本文件地址, 归档文件前缀){ + CLX_更新记录("正在获取新版本号...地址:" 版本文件地址) UrlDownloadToFile, %版本文件地址%, Core/version-remote.txt FileRead, version, Core/version.txt FileRead, remoteVersion, Core/version-remote.txt if(!remoteVersion || !version) { - return CapsLockX_Update_Fail + return CLX_Update_Fail } - CapsLockX_更新记录("正在比对版本号...地址:" 版本文件地址) - ver_cmp := CapsLockX_仓库版本号比对(remoteVersion, version) + CLX_更新记录("正在比对版本号...地址:" 版本文件地址) + ver_cmp := CLX_仓库版本号比对(remoteVersion, version) if(ver_cmp<0) { - return CapsLockX_Update_Updated + return CLX_Update_Updated } ; if(ver_cmp==0) - ; return CapsLockX_Update_AlreadyLatest + ; return CLX_Update_AlreadyLatest if(!T_DownloadUpdate) { return } @@ -144,111 +144,111 @@ CapsLockX_通过git仓库包_更新(版本文件地址, 归档文件前缀){ 包路径 := A_Temp "\CapsLockX-UpdateArchive" "/" remoteVersion ".zip" 解压目录 := A_Temp "\CapsLockX-UpdateArchive" "/" remoteVersion 程序目录 := A_Temp "\CapsLockX-UpdateArchive" "/" remoteVersion "/CapsLockX-" remoteVersion - return CapsLockX_ZIP下载解压更新(包网址, 包路径, 解压目录, 程序目录) + return CLX_ZIP下载解压更新(包网址, 包路径, 解压目录, 程序目录) } -CapsLockX_ZIP下载解压更新(包网址, 包路径, 解压目录, 程序目录){ +CLX_ZIP下载解压更新(包网址, 包路径, 解压目录, 程序目录){ FileCreateDir %解压目录% - CapsLockX_更新记录("正在下载新版本...地址:" 包网址) + CLX_更新记录("正在下载新版本...地址:" 包网址) UrlDownloadToFile %包网址%, %包路径% if(ErrorLevel) { - return CapsLockX_Update_Fail + return CLX_Update_Fail } - CapsLockX_更新记录("下载完成,正在解压...") + CLX_更新记录("下载完成,正在解压...") RunWait PowerShell.exe -Command Expand-Archive -LiteralPath '%包路径%' -DestinationPath '%解压目录%' -Force, , Hide if(ErrorLevel) { msgbox CapsLockX 更新解压错误 Run explorer /select`, %包路径% - return CapsLockX_Update_Fail | CapsLockX_Update_Stop + return CLX_Update_Fail | CLX_Update_Stop } ; 删除压缩包 FileDelete, %包路径% - + if(!FileExist(程序目录)) { - CapsLockX_更新记录("解压错误:未找到程序目录,将打开解压目录") + CLX_更新记录("解压错误:未找到程序目录,将打开解压目录") Run explorer %解压目录% - return CapsLockX_Update_Fail | CapsLockX_Update_Stop + return CLX_Update_Fail | CLX_Update_Stop } - CapsLockX_更新记录("解压完成...") - - CapsLockX_更新提示("解压完成,将打开新版本文件夹,请把它手动复制到当前软件目录。") + CLX_更新记录("解压完成...") + + CLX_更新提示("解压完成,将打开新版本文件夹,请把它手动复制到当前软件目录。") Run explorer /select`, %程序目录% Run explorer /select`, %A_ScriptDir% ; TODO REPLACE CURRENT FOLDER - Return CapsLockX_Update_Updated + Return CLX_Update_Updated } -CapsLockX_更新(){ - stopFlag := CapsLockX_Update_AlreadyLatest | CapsLockX_Update_Updated | CapsLockX_Update_Stop +CLX_更新(){ + stopFlag := CLX_Update_AlreadyLatest | CLX_Update_Updated | CLX_Update_Stop return false ; 依次尝试,直到更新成功或已是最新 - || stopFlag & CapsLockX_通过gitpull更新() - || stopFlag & CapsLockX_通过npm更新尝试() - || stopFlag & CapsLockX_通过jsdelivr发布包更新() - || stopFlag & CapsLockX_通过snomiao发布包更新() - || stopFlag & CapsLockX_通过github发布包更新() - || stopFlag & CapsLockX_通过github仓库包更新() - ; || stopFlag & CapsLockX_通过gitee仓库包更新() - ; || stopFlag & CapsLockX_通过gitlab仓库包更新() + || stopFlag & CLX_通过gitpull更新() + || stopFlag & CLX_通过npm更新尝试() + || stopFlag & CLX_通过jsdelivr发布包更新() + || stopFlag & CLX_通过snomiao发布包更新() + || stopFlag & CLX_通过github发布包更新() + || stopFlag & CLX_通过github仓库包更新() + ; || stopFlag & CLX_通过gitee仓库包更新() + ; || stopFlag & CLX_通过gitlab仓库包更新() } -CapsLockX_更新测试(){ +CLX_更新测试(){ msgbox 将 通过gitpull更新 - 通过gitpull更新结果 := CapsLockX_通过gitpull更新() + 通过gitpull更新结果 := CLX_通过gitpull更新() msgbox 通过gitpull更新结果 msgbox 将 通过npm更新 - 通过npm更新结果 := CapsLockX_通过npm更新尝试() + 通过npm更新结果 := CLX_通过npm更新尝试() msgbox 通过npm更新结果 msgbox 将 通过jsdelivr发布包更新 - 通过jsdelivr发布包更新结果 := CapsLockX_通过jsdelivr发布包更新() + 通过jsdelivr发布包更新结果 := CLX_通过jsdelivr发布包更新() msgbox 通过jsdelivr发布包更新结果 msgbox 将 通过snomiao发布包更新 - 通过snomiao发布包更新结果 := CapsLockX_通过snomiao发布包更新() + 通过snomiao发布包更新结果 := CLX_通过snomiao发布包更新() msgbox 通过snomiao发布包更新结果 msgbox 将 通过github发布包更新 - 通过github发布包更新结果 := CapsLockX_通过github发布包更新() + 通过github发布包更新结果 := CLX_通过github发布包更新() msgbox 通过github发布包更新结果 msgbox 将 通过github仓库包更新 - 通过github仓库包更新结果 := CapsLockX_通过github仓库包更新() + 通过github仓库包更新结果 := CLX_通过github仓库包更新() msgbox 通过github仓库包更新结果 ; msgbox 将 通过gitee仓库包更新 - ; ; 通过gitee仓库包更新结果 := CapsLockX_通过gitee仓库包更新() + ; ; 通过gitee仓库包更新结果 := CLX_通过gitee仓库包更新() ; msgbox 通过gitee仓库包更新结果 ; msgbox 将 通过gitlab仓库包更新 - ; ; 通过gitlab仓库包更新结果 := CapsLockX_通过gitlab仓库包更新() + ; ; 通过gitlab仓库包更新结果 := CLX_通过gitlab仓库包更新() ; msgbox 通过gitlab仓库包更新结果 } -CapsLockX_通过jsdelivr发布包更新(){ - CapsLockX_更新记录("正在通过jsdelivr发布包更新") +CLX_通过jsdelivr发布包更新(){ + CLX_更新记录("正在通过jsdelivr发布包更新") 版本文件地址:="https://cdn.jsdelivr.net/gh/snolab/CapsLockX@gh-pages/version.txt" 发布包文件地址:="https://cdn.jsdelivr.net/gh/snolab/CapsLockX@gh-pages/CapsLockX-latest.zip" - return CapsLockX_通过发布包_更新(版本文件地址, 发布包文件地址) + return CLX_通过发布包_更新(版本文件地址, 发布包文件地址) } -CapsLockX_通过snomiao发布包更新(){ - CapsLockX_更新记录("正在通过snomiao发布包更新") +CLX_通过snomiao发布包更新(){ + CLX_更新记录("正在通过snomiao发布包更新") 版本文件地址:="https://capslockx.snomiao.com/version.txt" 发布包文件地址:="https://capslockx.snomiao.com/CapsLockX-latest.zip" - return CapsLockX_通过发布包_更新(版本文件地址, 发布包文件地址) + return CLX_通过发布包_更新(版本文件地址, 发布包文件地址) } -CapsLockX_通过github发布包更新(){ - CapsLockX_更新记录("正在通过github发布包更新") +CLX_通过github发布包更新(){ + CLX_更新记录("正在通过github发布包更新") 版本文件地址:="https://github.com/snolab/CapsLockX/raw/gh-pages/version.txt" 发布包文件地址:="https://github.com/snolab/CapsLockX/raw/gh-pages/CapsLockX-latest.zip" - return CapsLockX_通过发布包_更新(版本文件地址, 发布包文件地址) + return CLX_通过发布包_更新(版本文件地址, 发布包文件地址) } -CapsLockX_通过github仓库包更新(){ - CapsLockX_更新记录("正在检查更新: github") +CLX_通过github仓库包更新(){ + CLX_更新记录("正在检查更新: github") 版本文件地址:="https://github.com/snomiao/CapsLockX/raw/master/Core/version.txt" 归档文件前缀:="https://github.com/snomiao/CapsLockX/archive" - return CapsLockX_通过git仓库包_更新(版本文件地址, 归档文件前缀) + return CLX_通过git仓库包_更新(版本文件地址, 归档文件前缀) } -; CapsLockX_通过gitee仓库包更新(){ -; CapsLockX_更新记录("正在检查更新: gitee") +; CLX_通过gitee仓库包更新(){ +; CLX_更新记录("正在检查更新: gitee") ; 版本文件地址:="https://gitee.com/snomiao/CapslockX/raw/master/Core/version.txt" ; 归档文件前缀:="https://gitee.com/snomiao/CapslockX/repository/archive" -; return CapsLockX_通过git仓库包_更新(版本文件地址, 归档文件前缀) +; return CLX_通过git仓库包_更新(版本文件地址, 归档文件前缀) ; } -; CapsLockX_通过gitlab仓库包更新(){ -; CapsLockX_更新记录("正在检查更新: gitlab") +; CLX_通过gitlab仓库包更新(){ +; CLX_更新记录("正在检查更新: gitlab") ; 版本文件地址:="https://gitlab.com/snomiao/CapsLockX/-/raw/master/Core/version.txt" ; 归档文件前缀:="https://gitlab.com/snomiao/CapsLockX/-/archive/master/CapsLockX-master.zip" -; return CapsLockX_通过git仓库包_更新(版本文件地址, 归档文件前缀) +; return CLX_通过git仓库包_更新(版本文件地址, 归档文件前缀) ; } diff --git a/Core/CapsLockX-i18n.ahk b/Core/CapsLockX-i18n.ahk index 29ff6f1..f2898ef 100644 --- a/Core/CapsLockX-i18n.ahk +++ b/Core/CapsLockX-i18n.ahk @@ -1,7 +1,105 @@ -global CapsLockX_lang := "en" +; - [Language Codes \| AutoHotkey v1]( https://www.autohotkey.com/docs/v1/misc/Languages.htm ) -; TODO: convert s -t(s){ - CapsLockX_Config("lang-en", s, s, ) - return s +global CLX_Lang := CLX_Config("Core", "Language", "auto", "语言切换") + +; Hans +LCID_7804 := "Chinese" ; zh +LCID_0004 := "Chinese (Simplified)" ; zh-Hans +LCID_0804 := "Chinese (Simplified, China)" ; zh-CN +LCID_1004 := "Chinese (Simplified, Singapore)" ; zh-SG +LCID_7C04 := "Chinese (Traditional)" ; zh-Hant +LCID_0C04 := "Chinese (Traditional, Hong Kong SAR)" ; zh-HK +LCID_1404 := "Chinese (Traditional, Macao SAR)" ; zh-MO +LCID_0404 := "Chinese (Traditional, Taiwan)" ; zh-TW +LCID_0011 := "Japanese" ; ja +LCID_0411 := "Japanese (Japan)" ; ja-JP + +; TODO: converts +t(s) +{ + global CLX_Lang + + key := s + defaultValue := s + explain := s + + ; for dev, autotranslate + ; run node "prompts/translate-en.md" + lang := "en" + if ( CLX_Lang == "auto" ) { + if (A_Language == "7804") { + lang := "zh" + } + if (A_Language == "0004") { + lang := "zh" + } + if (A_Language == "0804") { + lang := "zh" + } + if (A_Language == "1004") { + lang := "zh" + } + if (A_Language == "7C04") { + lang := "zh" + } + if (A_Language == "0C04") { + lang := "zh" + } + if (A_Language == "1404") { + lang := "zh" + } + if (A_Language == "0404") { + lang := "zh" + } + if (A_Language == "0011") { + lang := "ja" + } + if (A_Language == "0411") { + lang := "ja" + } + } + clx_i18n_TranslateByAsync(lang, key) + return CLX_ConfigGet("lang-" lang, key, key) +} +clx_i18n_TranslateByAsync(lang, key){ + translated := CLX_ConfigGet("lang-" lang, key, "") + if (translated) { + return + } + question := key . "`n`nTranslate to " . lang + + ; TrayTip, % "CapsLockX i18n [" . lang "]", % key "-->" lang, + + global brainstorm_origin + endpoint := brainstorm_origin "/ai/chat?ret=text" + xhr := ComObjCreate("Msxml2.XMLHTTP") + xhr.Open("POST", endpoint) + xhr.setRequestHeader("Authorization", "Bearer " . brainstormApiKey) + xhr.onreadystatechange := Func("brainstorm_translatePostResult").Bind(lang, key, xhr) + xhr.Send(question) +} +brainstorm_translatePostResult(lang, key, xhr){ + if (xhr.readyState != 4) + return + if (xhr.status != 200) { + if (xhr.status == 429) { + MsgBox, % xhr.responseText " Please wait a moment then try again." + } + MsgBox, % xhr.responseText " Unknown Error" + return + } + global transcript := xhr.responseText + if (!transcript) { + MsgBox, fail to ask ai + return + } + TrayTip, % "CapsLockX i18n [" . lang . "]", % key "=>" transcript, + + CLX_ConfigSet("lang-" lang, key, transcript) +} + +i18n_changeLanguage(lang := "auto") +{ + CLX_Lang := lang + CLX_ConfigSet("Core", "Language", lang) } \ No newline at end of file diff --git a/Core/CapslockX-Config.ahk b/Core/CapslockX-Config.ahk index 8d15ad5..a903970 100644 --- a/Core/CapslockX-Config.ahk +++ b/Core/CapslockX-Config.ahk @@ -1,57 +1,56 @@ ; 保存为 save with UTF8 with DOM ; 用户创建目录 -便携版配置目录 = ./User -用户目录配置目录 = %USERPROFILE%/.CapsLockX -APPDATA配置目录 = %APPDATA%/CapsLockX +ConfigDir_Portable := "./User" +ConfigDir_UserProfile := USERPROFILE . "/.CapsLockX" +ConfigDir_AppData := APPDATA . "/CapsLockX" ; 默认值 -启动配置目录 := APPDATA配置目录 +LaunchConfigDir := ConfigDir_AppData -if ( InStr(FileExist(APPDATA配置目录), "D")) { - 启动配置目录 := APPDATA配置目录 +if ( InStr(FileExist(ConfigDir_AppData), "D")) { + LaunchConfigDir := ConfigDir_AppData } -if ( InStr(FileExist(用户目录配置目录), "D")) { - 启动配置目录 := 用户目录配置目录 +if ( InStr(FileExist(ConfigDir_UserProfile), "D")) { + LaunchConfigDir := ConfigDir_UserProfile } -if ( InStr(FileExist(便携版配置目录), "D")) { - 启动配置目录 := 便携版配置目录 +if ( InStr(FileExist(ConfigDir_Portable), "D")) { + LaunchConfigDir := ConfigDir_Portable } -FileCreateDir %启动配置目录% +FileCreateDir %LaunchConfigDir% -global CapsLockX_配置目录 := 启动配置目录 -; msgbox %CapsLockX_配置目录% -global CapsLockX_配置路径 := CapsLockX_配置目录 "/CapsLockX-Config.ini" +global CLX_ConfigDir := LaunchConfigDir +global CLX_ConfigPath := CLX_ConfigDir . "\CapsLockX-Config.ini" ; 初始化配置 -if (!CapsLockX_配置路径) { +if (!CLX_ConfigPath) { Return } ; 配置文件编码清洗 -global CapsLockX_ConfigChangedTickCount -CapsLockX_ConfigChangedTickCount := A_TickCount +global CLX_ConfigChangedTickCount +CLX_ConfigChangedTickCount := A_TickCount ; msgbox 清洗为_UTF16_WITH_BOM_型编码1 -清洗为_UTF16_WITH_BOM_型编码(CapsLockX_配置路径) +清洗为_UTF16_WITH_BOM_型编码(CLX_ConfigPath) ; msgbox 清洗为_UTF16_WITH_BOM_型编码2 -CapsLockX_Config("_NOTICE_", "ENCODING_USING", "UTF16_LE", "") +CLX_Config("_NOTICE_", "ENCODING_USING", "UTF16_LE", "") ; 基本设定 ; [Core] -global T_XKeyAsSpace := CapsLockX_Config("Core", "T_XKeyAsSpace", 1, "使用 Space 作为引导键(默认启用,游戏玩家可在 .user.ignore.txt 里配置忽略游戏窗口)") -global T_XKeyAsCapsLock := CapsLockX_Config("Core", "T_XKeyAsCapsLock", 1, "使用 CapsLock 作为引导键(默认启用)") -global T_XKeyAsInsert := CapsLockX_Config("Core", "T_XKeyAsInsert", 0, "使用 Insert 作为引导键") -global T_XKeyAsScrollLock := CapsLockX_Config("Core", "T_XKeyAsScrollLock", 0, "使用 ScrollLock 作为引导键") -global T_XKeyAsRAlt := CapsLockX_Config("Core", "T_XKeyAsRAlt", 0, "使用 右 Alt 作为引导键") - -global T_UseScrollLockLight := CapsLockX_Config("Advanced", "T_UseScrollLockLight", 0, "进阶: 是否使用 ScrollLock 灯来显示 CapsLockX 状态(不建议)") -global T_UseCapsLockLight := CapsLockX_Config("Advanced", "T_UseCapsLockLight", 0, "进阶: 是否使用 CapsLockX 灯来显示 CapsLockX 状态(强烈不建议)") -global T_SwitchSound := CapsLockX_Config("Advanced", "T_SwitchSound", 0, "进阶: 是否开启CapsLockX模式切换声音提示(默认不开)") -global T_SwitchSoundOn := CapsLockX_Config("Advanced", "T_SwitchSoundOn", "./Data/NoteG.mp3", "CapsLockX 按下声音提示路径") -global T_SwitchSoundOff := CapsLockX_Config("Advanced", "T_SwitchSoundOff", "./Data/NoteC.mp3", "CapsLockX 弹起声音提示路径") +global T_XKeyAsSpace := CLX_Config("Core", "T_XKeyAsSpace", 1, ("使用 Space 作为引导键(默认启用,游戏玩家可在 .user.ignore.txt 里配置忽略游戏窗口)")) +global T_XKeyAsCapsLock := CLX_Config("Core", "T_XKeyAsCapsLock", 1, ("使用 CapsLock 作为引导键(默认启用)")) +global T_XKeyAsInsert := CLX_Config("Core", "T_XKeyAsInsert", 0, ("使用 Insert 作为引导键")) +global T_XKeyAsScrollLock := CLX_Config("Core", "T_XKeyAsScrollLock", 0, ("使用 ScrollLock 作为引导键")) +global T_XKeyAsRAlt := CLX_Config("Core", "T_XKeyAsRAlt", 0, ("使用 右 Alt 作为引导键")) + +global T_UseScrollLockLight := CLX_Config("Advanced", "T_UseScrollLockLight", 0, "进阶: 是否使用 ScrollLock 灯来显示 CapsLockX 状态(不建议)") +global T_UseCapsLockLight := CLX_Config("Advanced", "T_UseCapsLockLight", 0, "进阶: 是否使用 CapsLockX 灯来显示 CapsLockX 状态(强烈不建议)") +global T_SwitchSound := CLX_Config("Advanced", "T_SwitchSound", 0, "进阶: 是否开启CapsLockX模式切换声音提示(默认不开)") +global T_SwitchSoundOn := CLX_Config("Advanced", "T_SwitchSoundOn", "./Data/NoteG.mp3", "CapsLockX 按下声音提示路径") +global T_SwitchSoundOff := CLX_Config("Advanced", "T_SwitchSoundOff", "./Data/NoteC.mp3", "CapsLockX 弹起声音提示路径") ; 不同模式下的拖盘图标 -; global T_SwitchTrayIconDefault := CapsLockX_Config("Core", "T_SwitchTrayIconDefault", "./Data/XIconWhite.ico", "CapsLockX默认托盘显示图标,默认" "./Data/XIconWhite.ico") -global T_SwitchTrayIconOff := CapsLockX_Config("Advanced", "T_SwitchTrayIconOff", "./Data/XIconWhite.ico", "CapsLockX弹起托盘显示图标,默认为 " "./Data/XIconWhite.ico") -global T_SwitchTrayIconOn := CapsLockX_Config("Advanced", "T_SwitchTrayIconOn", "./Data/XIconBlue.ico", "CapsLockX按下托盘显示图标,默认为 " "./Data/XIconBlue.ico") +; global T_SwitchTrayIconDefault := CLX_Config("Core", "T_SwitchTrayIconDefault", "./Data/XIconWhite.ico", "CapsLockX默认托盘显示图标,默认" "./Data/XIconWhite.ico") +global T_SwitchTrayIconOff := CLX_Config("Advanced", "T_SwitchTrayIconOff", "./Data/XIconWhite.ico", "CapsLockX弹起托盘显示图标,默认为 " "./Data/XIconWhite.ico") +global T_SwitchTrayIconOn := CLX_Config("Advanced", "T_SwitchTrayIconOn", "./Data/XIconBlue.ico", "CapsLockX按下托盘显示图标,默认为 " "./Data/XIconBlue.ico") IniSave(content, path, field, varName, defaultValue := "") { @@ -62,46 +61,51 @@ IniSave(content, path, field, varName, defaultValue := "") IniWrite, %content%, %path%, %field%, %varName% return content } -CapsLockX_ConfigSet(field, varName, setValue, comment := "") + +CLX_ConfigSet(field, varName, setValue, comment := "") { - global CapsLockX_ConfigChangedTickCount - CapsLockX_ConfigChangedTickCount := A_TickCount + global CLX_ConfigChangedTickCount + CLX_ConfigChangedTickCount := A_TickCount content := setValue ConfigLock() ; 不对配置自动重新排序 if (comment) { - ; IniDelete, %CapsLockX_配置路径%, %field%, %varName%#注释 - ; IniWrite, %comment%, %CapsLockX_配置路径%, %field%, %varName%#注释 - IniSave( comment, CapsLockX_配置路径, field, varName . "#注释" ) + ; IniDelete, %CLX_ConfigPath%, %field%, %varName%#注释 + ; IniWrite, %comment%, %CLX_ConfigPath%, %field%, %varName%#注释 + IniSave( comment, CLX_ConfigPath, field, varName . "#注释" ) } - ; IniDelete, %CapsLockX_配置路径%, %field%, %varName% - ; IniWrite, %content%, %CapsLockX_配置路径%, %field%, %varName% - IniSave( content, CapsLockX_配置路径, field, varName) + ; IniDelete, %CLX_ConfigPath%, %field%, %varName% + ; IniWrite, %content%, %CLX_ConfigPath%, %field%, %varName% + IniSave( content, CLX_ConfigPath, field, varName) ConfigUnlock() return content } -CapsLockX_ConfigGet(field, varName, defaultValue) +CLX_ConfigGet(field, varName, defaultValue) { - global CapsLockX_ConfigChangedTickCount - CapsLockX_ConfigChangedTickCount := A_TickCount - IniRead, content, %CapsLockX_配置路径%, %field%, %varName%, %defaultValue% + global CLX_ConfigChangedTickCount + CLX_ConfigChangedTickCount := A_TickCount + + IniRead, content, %CLX_ConfigPath%, %field%, %varName%, %defaultValue% + if (content == "ERROR") { + return "" + } return content } -CapsLockX_Config(field, varName, defaultValue, comment := "") +CLX_Config(field, varName, defaultValue, comment := "") { - global CapsLockX_ConfigChangedTickCount - CapsLockX_ConfigChangedTickCount := A_TickCount - IniRead, content, %CapsLockX_配置路径%, %field%, %varName%, %defaultValue% - CapsLockX_ConfigSet(field, varName, content, comment) + global CLX_ConfigChangedTickCount + CLX_ConfigChangedTickCount := A_TickCount + IniRead, content, %CLX_ConfigPath%, %field%, %varName%, %defaultValue% + CLX_ConfigSet(field, varName, content, comment) ; 对配置自动重新排序 ; ConfigLock(field varName) ; if (comment) { - ; IniDelete, %CapsLockX_配置路径%, %field%, %varName%#注释 - ; IniWrite, %comment%, %CapsLockX_配置路径%, %field%, %varName%#注释 + ; IniDelete, %CLX_ConfigPath%, %field%, %varName%#注释 + ; IniWrite, %comment%, %CLX_ConfigPath%, %field%, %varName%#注释 ; } - ; IniDelete, %CapsLockX_配置路径%, %field%, %varName% - ; IniWrite, %content%, %CapsLockX_配置路径%, %field%, %varName% + ; IniDelete, %CLX_ConfigPath%, %field%, %varName% + ; IniWrite, %content%, %CLX_ConfigPath%, %field%, %varName% ; ConfigUnlock() return content } @@ -163,10 +167,10 @@ FileGetFormat(file) ConfigLock(名义:="") { k:= 0 - while (FileExist(CapsLockX_配置路径 ".lock")) { + while (FileExist(CLX_ConfigPath ".lock")) { k := k + 1 if ( k > 10 ) { - FileRead 上次名义, % CapsLockX_配置路径 ".lock" + FileRead 上次名义, % CLX_ConfigPath ".lock" ; MsgBox, 程序退出, %名义% 配置写入失败,配置文件被意外锁定,上次锁定名义为 %上次名义% ConfigUnlock() Reload @@ -175,14 +179,14 @@ ConfigLock(名义:="") } Sleep, 1000 } - CapsLockX_DontReload := 1 + CLX_DontReload := 1 - FileAppend %名义%, % CapsLockX_配置路径 ".lock" + FileAppend %名义%, % CLX_ConfigPath ".lock" return True } ConfigUnlock() { - FileDelete % CapsLockX_配置路径 ".lock" - CapsLockX_DontReload := 0 + FileDelete % CLX_ConfigPath ".lock" + CLX_DontReload := 0 return True } diff --git a/Core/CapslockX-Core.ahk b/Core/CapslockX-Core.ahk index 3a4c457..c2af973 100644 --- a/Core/CapslockX-Core.ahk +++ b/Core/CapslockX-Core.ahk @@ -33,13 +33,13 @@ SetTitleMatchMode RegEx global CapsLockX := 1 ; 模块运行标识符 global CapsLockXMode := 0 global ModuleState := 0 -global CapsLockX_FnActed := 0 +global CLX_FnActed := 0 global CM_NORMAL := 0 ; 普通模式(键盘的正常状态) global CM_FN := 1 ; 组合键 CapsLockX 模式(或称组合键模式 global CM_CapsLockX := 2 ; CapsLockX 模式,通过长按CLX键进入 ; global CM_FNX := 3 ; FnX 模式并不存在 global CapsLockPressTimestamp := 0 -global CapsLockX_上次触发键 := "" +global CLX_上次触发键 := "" ; value func CapsLockX() @@ -69,66 +69,66 @@ UpdateCapsLockXLight() global T_IgnoresByLines defaultIgnoreFilePath := "./Data/CapsLockX.defaults.ignore.txt" -userIgnoreFilePath := CapsLockX_配置目录 "/CapsLockX.user.ignore.txt" +userIgnoreFilePath := CLX_ConfigDir "/CapsLockX.user.ignore.txt" FileRead, T_IgnoresByLines, %userIgnoreFilePath% if (!T_IgnoresByLinesUser) { FileCopy, %defaultIgnoreFilePath%, %userIgnoreFilePath% FileRead, T_IgnoresByLines, %userIgnoreFilePath% } -global CapsLockX_Paused := 0 +global CLX_Paused := 0 -#if CapsLockX_Avaliable() +#if CLX_Avaliable() -#if CapsLockX_NotAvaliable() +#if CLX_NotAvaliable() #If -Hotkey, If, CapsLockX_Avaliable() +Hotkey, If, CLX_Avaliable() if(T_XKeyAsCapsLock) - Hotkey *CapsLock, CapsLockX_Dn + Hotkey *CapsLock, CLX_Dn if(T_XKeyAsSpace) - Hotkey *Space, CapsLockX_Dn + Hotkey *Space, CLX_Dn if(T_XKeyAsInsert) - Hotkey *Insert, CapsLockX_Dn + Hotkey *Insert, CLX_Dn if(T_XKeyAsScrollLock) - Hotkey *ScrollLock, CapsLockX_Dn + Hotkey *ScrollLock, CLX_Dn if(T_XKeyAsRAlt) - Hotkey *RAlt, CapsLockX_Dn + Hotkey *RAlt, CLX_Dn -Hotkey, If, CapsLockX_NotAvaliable() +Hotkey, If, CLX_NotAvaliable() if(T_XKeyAsCapsLock) - Hotkey CapsLock, CapsLockX_NotAvaliable + Hotkey CapsLock, CLX_NotAvaliable if(T_XKeyAsSpace) - Hotkey Space, CapsLockX_NotAvaliable + Hotkey Space, CLX_NotAvaliable if(T_XKeyAsInsert) - Hotkey Insert, CapsLockX_NotAvaliable + Hotkey Insert, CLX_NotAvaliable if(T_XKeyAsScrollLock) - Hotkey ScrollLock, CapsLockX_NotAvaliable + Hotkey ScrollLock, CLX_NotAvaliable if(T_XKeyAsRAlt) - Hotkey RAlt, CapsLockX_NotAvaliable + Hotkey RAlt, CLX_NotAvaliable Hotkey, If if(T_XKeyAsCapsLock) - Hotkey *CapsLock Up, CapsLockX_Up + Hotkey *CapsLock Up, CLX_Up if(T_XKeyAsSpace) - Hotkey *Space Up, CapsLockX_Up + Hotkey *Space Up, CLX_Up if(T_XKeyAsInsert) - Hotkey *Insert Up, CapsLockX_Up + Hotkey *Insert Up, CLX_Up if(T_XKeyAsScrollLock) - Hotkey *ScrollLock Up, CapsLockX_Up + Hotkey *ScrollLock Up, CLX_Up if(T_XKeyAsRAlt) - Hotkey *RAlt Up, CapsLockX_Up + Hotkey *RAlt Up, CLX_Up SetWorkingDir, %A_ScriptDir%\..\ #Include Core\CapsLockX-i18n.ahk ; todo: move this generated file into user folder #Include Core\CapsLockX-ModulesRunner.ahk -CapsLockX_Loaded() +CLX_Loaded() #Include Core\CapsLockX-ModulesFunctions.ahk SetWorkingDir, %A_ScriptDir%\..\ @@ -198,11 +198,11 @@ CapsLockXTurnOn() re := UpdateCapsLockXLight() Return re } -CapsLockX_NotAvaliable() +CLX_NotAvaliable() { - return !CapsLockX_Avaliable() + return !CLX_Avaliable() } -CapsLockX_Avaliable() +CLX_Avaliable() { return 1 flag_IgnoreWindow := 0 @@ -217,19 +217,19 @@ CapsLockX_Avaliable() } } } - return !CapsLockX_Paused + return !CLX_Paused } -CapsLockX_Loaded() +CLX_Loaded() { ; 使用退出键退出其它实例 SendInput ^!+\ - TrayTip CapsLockX %CapsLockX_VersionName%, 加载成功 - Menu, Tray, Tip, CapsLockX %CapsLockX_VersionName% + TrayTip CapsLockX %CLX_VersionName%, % t("加载成功") + Menu, Tray, Tip, CapsLockX %CLX_VersionName% } -CapsLockX_Reload() +CLX_Reload() { - ToolTip, CapsLockX 重载中 + ToolTip, % t("CapsLockX 重载中") static times := 0 times += 1 if (times == 1 && false) { @@ -246,23 +246,22 @@ CapsLockX_Reload() } } -CapsLockX_ModeExit() +CLX_ModeExit() { ; TrayTip CapsLockX, 退出CLX模式 ; ToolTip 退出CLX模式 ; SetTimer CLX_HideToolTips, -1000 CapsLockXMode &= ~CM_CapsLockX } -CapsLockX_ModeEnter() +CLX_ModeEnter() { ; ToolTip 进入CLX模式 ; SetTimer CLX_HideToolTips, -1000 CapsLockXMode |= CM_CapsLockX } -CapsLockX_Dn() +CLX_Dn() { - ; /* 组合键细节: 模式: @@ -278,7 +277,7 @@ CapsLockX_Dn() */ ; 按住其它键的时候 不触发 CapsLockX 避免影响打字 - CapsLockX_上次触发键 := 触发键 := RegExReplace(A_ThisHotkey, "[\$\*\!\^\+\#\s]") + CLX_上次触发键 := 触发键 := RegExReplace(A_ThisHotkey, "[\$\*\!\^\+\#\s]") 其它键按住 := 触发键 && 触发键 != A_PriorKey && GetKeyState(A_PriorKey, "P") WheelQ := InStr("WheelDown|WheelUp", A_PriorKey) SpaceQ := 触发键 == "Space" @@ -288,7 +287,7 @@ CapsLockX_Dn() CLX_AND_SPACE_Q := (A_PriorKey == "CapsLock" && 触发键 == "Space") || (触发键 == "CapsLock" && A_PriorKey == "Space" ) if (CLX_AND_SPACE_Q && A_TimeSincePriorHotkey < 250) { - ; CapsLockX_ModeEnter() + ; CLX_ModeEnter() CapsLockXMode |= CM_CapsLockX UpdateCapsLockXLight() KeyWait %触发键% @@ -298,7 +297,7 @@ CapsLockX_Dn() ; tooltip % ModifierQ "a" ModifierEnableQ "a" WheelQ "a" 其它键按住 BypassCapsLockX := !ModifierEnableQ && !WheelQ && 其它键按住 if (BypassCapsLockX) { - CapsLockX_上次触发键 := "" + CLX_上次触发键 := "" ; ToolTip, % first5char "_" 触发键 Send {Blind}{%触发键% Down} KeyWait %触发键% @@ -311,16 +310,16 @@ CapsLockX_Dn() } ; 进入 Fn 模式 ; if (CapsLockXMode & CM_CapsLockX) { - ; CapsLockX_ModeExit() + ; CLX_ModeExit() ; KeyWait, %waitKey% ; wait to prevent flashing the quit and enter message ; } - ; CapsLockX_ModeExit() + ; CLX_ModeExit() CapsLockXMode |= CM_FN CapsLockXMode &= ~CM_CapsLockX ; ToolTip clxmode - if (A_PriorKey == CapsLockX_上次触发键) { + if (A_PriorKey == CLX_上次触发键) { if (A_PriorKey == "Space") { ; 长按空格时保持原功能 ; TODO: read system repeat interval @@ -330,19 +329,19 @@ CapsLockX_Dn() } else { if ( A_TickCount - CapsLockPressTimestamp > 1000) { ; (20210817)长按(空格除外) - waitKey := CapsLockX_上次触发键 + waitKey := CLX_上次触发键 ; 取消长按CLX进入CLX锁定模式 - ; CapsLockX_ModeEnter() + ; CLX_ModeEnter() ; 尝试增加长按显示热键提示 - ; Func("CapsLockX_LongPressDown").Call() + ; Func("CLX_LongPressDown").Call() KeyWait, %waitKey% ; wait to prevent flashing the quit and enter message - ; Func("CapsLockX_LongPressUp").Call() + ; Func("CLX_LongPressUp").Call() } } } UpdateCapsLockXLight() } -CapsLockX_Up() +CLX_Up() { CapsLockPressTimestamp := 0 @@ -350,12 +349,12 @@ CapsLockX_Up() CapsLockXMode &= ~CM_FN ; CLX单击弹起时 - if (A_PriorKey == CapsLockX_上次触发键) { + if (A_PriorKey == CLX_上次触发键) { if (CapsLockXMode & CM_CapsLockX) { - ; CapsLockX_ModeExit() + ; CLX_ModeExit() } else { ; 单击 CapsLockX - if (CapsLockX_上次触发键 == "CapsLock") { + if (CLX_上次触发键 == "CapsLock") { ; 切换 CapsLock 状态(原功能) if (GetKeyState("CapsLock", "T")) { SetCapsLockState, Off @@ -364,14 +363,14 @@ CapsLockX_Up() } } ; 单击 空格键 - if (CapsLockX_上次触发键 == "Space") { + if (CLX_上次触发键 == "Space") { ; 原功能(按空格键) Send {Blind}{Space} } } } UpdateCapsLockXLight() - CapsLockX_上次触发键 := "" + CLX_上次触发键 := "" } RunAsSameUser(CMD, WorkingDir) { @@ -383,23 +382,23 @@ RunAsLimitiedUser(CMD, WorkingDir) ; ref: [Run as normal user (not as admin) when user is admin - Ask for Help - AutoHotkey Community]( https://autohotkey.com/board/topic/79136-run-as-normal-user-not-as-admin-when-user-is-admin/ ) ; ; TEST DEMO - ; schtasks /Create /tn CapsLockX_RunAsLimitedUser /sc ONCE /tr "cmd /k cd \"C:\\users\\snomi\\\" && notepad \".\\tmp.txt\"" /F /ST 00:00 - ; schtasks /Run /tn CapsLockX_RunAsLimitedUser - ; schtasks /Delete /tn CapsLockX_RunAsLimitedUser /F + ; schtasks /Create /tn CLX_RunAsLimitedUser /sc ONCE /tr "cmd /k cd \"C:\\users\\snomi\\\" && notepad \".\\tmp.txt\"" /F /ST 00:00 + ; schtasks /Run /tn CLX_RunAsLimitedUser + ; schtasks /Delete /tn CLX_RunAsLimitedUser /F ; ; Safe_WorkingDir := RegExReplace("C:\users\snomi\", "\\", "\\") ; Safe_CMD := RegExReplace(RegExReplace("notepad "".\temp.txt""", "\\", "\\"), "\""", "\""") Safe_WorkingDir := RegExReplace(WorkingDir, "\\", "\\") Safe_CMD := RegExReplace(RegExReplace(CMD, "\\", "\\"), "\""", "\""") - RunWait cmd /c schtasks /Create /tn CapsLockX_RunAsLimitedUser /F /sc ONCE /ST 00:00 /tr "cmd /c cd \"%Safe_WorkingDir% && %Safe_CMD%\", , Hide - RunWait cmd /c schtasks /Run /tn CapsLockX_RunAsLimitedUser, , Hide - RunWait cmd /c schtasks /Delete /tn CapsLockX_RunAsLimitedUser /F, , Hide + RunWait cmd /c schtasks /Create /tn CLX_RunAsLimitedUser /F /sc ONCE /ST 00:00 /tr "cmd /c cd \"%Safe_WorkingDir% && %Safe_CMD%\", , Hide + RunWait cmd /c schtasks /Run /tn CLX_RunAsLimitedUser, , Hide + RunWait cmd /c schtasks /Delete /tn CLX_RunAsLimitedUser /F, , Hide } ; 接下来是流程控制 #if -; CapsLockX 模式切换处理 -CapsLockX_NotAvaliable: +; CapsLockX Mode switching processing +CLX_NotAvaliable: TrayTip, CapsLockX, NotAvaliable Return diff --git a/Core/lang-en.ini b/Core/lang-en.ini new file mode 100644 index 0000000..f47000f --- /dev/null +++ b/Core/lang-en.ini @@ -0,0 +1,2 @@ +[lang-en] + diff --git a/Modules/@Help.ahk b/Modules/@Help.ahk index 4e628b0..177ae3a 100644 --- a/Modules/@Help.ahk +++ b/Modules/@Help.ahk @@ -30,13 +30,13 @@ if (!CapsLockX) { ; 需要注意模块按照文件名排序先后加载, ; 所以后一个模块可以读取前一个模块定义的变量(包括全局和本地的)(但通常不建议这么做)。 ; -global CapsLockX_HelpInfo := "" -CapsLockX_IssuesPage := "https://github.com/snolab/CapsLockX/issues" +global CLX_HelpInfo := "" +CLX_IssuesPage := "https://github.com/snolab/CapsLockX/issues" -; 注释:在这里,你可以使用 CapsLockX_AppendHelp 添加帮助信息 +; 注释:在这里,你可以使用 CLX_AppendHelp 添加帮助信息 ; 在 AHK 中,所有的函数都在编译时就定义好了,声明顺序是无所谓的。 -; CapsLockX_THIS_MODULE_HELP_FILE_PATH 在当前模块中的值为 "./Modules/00-Help.md" -CapsLockX_AppendHelp(CapsLockX_LoadHelpFrom(CapsLockX_THIS_MODULE_HELP_FILE_PATH)) +; CLX_THIS_MODULE_HELP_FILE_PATH 在当前模块中的值为 "./Modules/00-Help.md" +CLX_AppendHelp(CLX_LoadHelpFrom(CLX_THIS_MODULE_HELP_FILE_PATH)) ; ; 初始化完成之后就可以返回了, 在这个 Return 之后,可以定义函数和热键 ; 注:CapsLockX 模块【必须】 Return,才能顺利地执行后面的模块。 @@ -45,7 +45,7 @@ Return ; = 函数声名和热键区 ===================================================== ; ; 定义函数,这里定义了 2 个用来操作帮助的函数。 -CapsLockX_LoadHelpFrom(file) +CLX_LoadHelpFrom(file) { FileEncoding UTF-8 FileRead, helpStr, %file% @@ -53,13 +53,13 @@ CapsLockX_LoadHelpFrom(file) helpStr := RegExReplace(helpStr, "m)\r?\n(\r?\n)+", "`n") return helpStr } -CapsLockX_AppendHelp(helpStr) +CLX_AppendHelp(helpStr) { if (helpStr) { - CapsLockX_HelpInfo .= helpStr "`n`n" + CLX_HelpInfo .= helpStr "`n`n" } } -CapsLockX_ShowHelp(helpStr, inGlobal := 0, waitKey := "/") +CLX_ShowHelp(helpStr, inGlobal := 0, waitKey := "/") { if (!inGlobal && !CapsLockXMode) { SendEvent, / @@ -70,7 +70,7 @@ CapsLockX_ShowHelp(helpStr, inGlobal := 0, waitKey := "/") Gui, Help:Add, Edit, ReadOnly, ==== CapsLockX Help ==== Gui, Help:Add, Edit, H768 ReadOnly, %helpStr% Gui, Help:Show, AutoSize Center - + KeyWait, %waitKey%, T60 ; wait for 60 seconds, then auto close ; Gui, Hide Gui, Help:Destroy @@ -81,18 +81,18 @@ CapsLockX_ShowHelp(helpStr, inGlobal := 0, waitKey := "/") ; ; 比如这一行,指的是当前在 CapsLockX 模式时,生效的热键 #if CapsLockXMode - + ; #if CapsLockXMode ; 显示使用方法,直接调用前面定义的函数 -; /:: CapsLockX_ShowHelp(CapsLockX_HelpInfo, 1) +; /:: CLX_ShowHelp(CLX_HelpInfo, 1) ; 你可以按住 CapsLockX 键观察托盘的 CapsLockX 图标,当它变蓝时,按下 Alt + / 就可以快速打开 CapsLockX 的首页 ; 也就是 CapsLockX + Alt + / !/:: Run https://capslockx.snomiao.com/ ; 同理,这个热键可以使用 CapsLockX + Shift + / 触发 -+/:: Run % CapsLockX_IssuesPage ++/:: Run % CLX_IssuesPage #if - + ; 在这里你也可以定义无需按下 CapsLockX 就能触发的热键 diff --git a/Modules/App-OneNote2019.ahk b/Modules/App-OneNote2019.ahk index 429d3df..1fc743c 100644 --- a/Modules/App-OneNote2019.ahk +++ b/Modules/App-OneNote2019.ahk @@ -269,7 +269,7 @@ OneNote2019创建链接窗口内(){ return WinActive("ahk_class NUIDialog ahk_exe ONENOTE.EXE") } -; /:: CapsLockX_ShowHelp OneNote2019创建链接窗口 +; /:: CLX_ShowHelp OneNote2019创建链接窗口 ; 复制链接笔记页面的搜索结果 !+s:: 笔记条目搜索结果复制整理向页面粘贴条数() diff --git a/Modules/App-XunFeiSwitching.ahk b/Modules/App-XunFeiSwitching.ahk index 7674b32..99203fe 100644 --- a/Modules/App-XunFeiSwitching.ahk +++ b/Modules/App-XunFeiSwitching.ahk @@ -7,8 +7,8 @@ ; 2021-04-15 更新 @telppa:[修改了一下语音识别模块的代码。・Issue #14・snolab/CapsLockX]( https://github.com/snolab/CapsLockX/issues/14 ) ; -global T_EnableXunFeiSwitching := CapsLockX_Config("App", "T_EnableXunFeiSwitching", 1, "使用 Win+H 快速启动讯飞语音悬浮窗(默认启用)") -CapsLockX_AppendHelp( CapsLockX_LoadHelpFrom(CapsLockX_THIS_MODULE_HELP_FILE_PATH)) +global T_EnableXunFeiSwitching := CLX_Config("App", "T_EnableXunFeiSwitching", 1, "使用 Win+H 快速启动讯飞语音悬浮窗(默认启用)") +CLX_AppendHelp( CLX_LoadHelpFrom(CLX_THIS_MODULE_HELP_FILE_PATH)) Return diff --git a/Modules/CLX-Brainstorm.ahk b/Modules/CLX-Brainstorm.ahk index 19c4775..f8bc615 100644 --- a/Modules/CLX-Brainstorm.ahk +++ b/Modules/CLX-Brainstorm.ahk @@ -1,8 +1,8 @@ #SingleInstance, Force global brainstorming := false -global brainstorm_origin := CapsLockX_Config("BrainStorm", "Website", "https://brainstorm.snomiao.com", "Brainstorm 官方網址") ; -global brainstormApiKey := CapsLockX_Config("BrainStorm", "Key", "FREE", "CLX BrainStorm 的功能激活碼,填FREE使用免費版本") ; +global brainstorm_origin := CLX_Config("BrainStorm", "Website", "https://brainstorm.snomiao.com", "Brainstorm 官方網址") ; +global brainstormApiKey := CLX_Config("BrainStorm", "Key", "FREE", "CLX BrainStorm 的功能激活碼,填FREE使用免費版本") ; return @@ -41,11 +41,12 @@ stop_brainstorm() } brainstorm_set_key() { - InputBox, key, 激活碼輸入, 訪問 %brainstorm_origin% 来取得激活碼,在此輸入,或者填 FREE 使用免費版 + msg := t("訪問官方網站来取得激活碼,在此輸入,或者填 FREE 使用免費版,網址如下:") + InputBox, key, % "激活碼輸入", % msg "`n" brainstorm_origin if (ErrorLevel == 1) { Return } - CapsLockX_ConfigSet("BrainStorm", "Key", key, "CLX BrainStorm 的功能激活碼") + CLX_ConfigSet("BrainStorm", "Key", key, "CLX BrainStorm 的功能激活碼") } brainstorm_copy() { @@ -62,10 +63,10 @@ brainstorm() content:=brainstorm_copy() prompt := "" - prompt .= "例1: trasnlate to english=`n" - prompt .= "例2: 解釈这句話:`n" - prompt .= "例3: 总结5点:`n" - prompt .= "--- 以下为提問内容 ---`n" . content + prompt .= t("例1: Translate to english:") . "`n" + prompt .= t("例2: 解釈这句話:") . "`n" + prompt .= t("例3: 总结5点:") . "`n" + prompt .= "--- " . t("以下为提問内容") . " ---`n" . content InputBox, cmd, 请輸入文本指令, %prompt%, , 500, 600 ; if escape if (ErrorLevel == 1) { @@ -74,23 +75,23 @@ brainstorm() msg := Trim(content . "`n`n" . cmd, OmitChars = " `t`n") global brainstorming := true - questionPost(msg) + brainstorm_questionPost(msg) } -questionPost(question) +brainstorm_questionPost(question) { global brainstorming if (!brainstorming) { return } global brainstorm_origin - endpoint := brainstorm_origin "/ai/chatgpt" + endpoint := brainstorm_origin "/ai/chat?ret=polling" xhr := ComObjCreate("Msxml2.XMLHTTP") xhr.Open("POST", endpoint) xhr.setRequestHeader("Authorization", "Bearer " . brainstormApiKey) - xhr.onreadystatechange := Func("questionPost_onReadyStateChange").Bind(xhr) + xhr.onreadystatechange := Func("BS_questionPost_onReadyStateChange").Bind(xhr) xhr.Send(question) } -questionPost_onReadyStateChange(xhr) +BS_questionPost_onReadyStateChange(xhr) { global brainstorming if (!brainstorming) @@ -105,6 +106,7 @@ questionPost_onReadyStateChange(xhr) if (xhr.status == 429) { MsgBox, % xhr.responseText " 请等待一段时间后再试" } + MsgBox, % xhr.responseText " Unknown Error" return } global questionId := xhr.responseText diff --git a/Modules/CLX-Edit.ahk b/Modules/CLX-Edit.ahk index 06be916..42f9045 100644 --- a/Modules/CLX-Edit.ahk +++ b/Modules/CLX-Edit.ahk @@ -17,11 +17,11 @@ if (!CapsLockX) { ExitApp } -global CapsLockX_HJKL_Scroll := CapsLockX_Config("TMouse", "CapsLockX_HJKL_Scroll", 0, "使用IJKL滚轮移动滚轮,比RF多一个横轴。") -global 编辑增强_SpeedRatioX := CapsLockX_Config("EditEnhance", "SpeedRatioX", 1, "光标加速度比率, 默认为 1, 你想慢点就改成 0.5 之类") -global 编辑增强_SpeedRatioY := CapsLockX_Config("EditEnhance", "SpeedRatioY", 1, "光标加速度比率, 默认为 1, 你想慢点就改成 0.5 之类") -global 编辑增强_PageSpeed := CapsLockX_Config("EditEnhance", "PageSpeed", 1, "翻页速率") -global 编辑增强_TabSpeed := CapsLockX_Config("EditEnhance", "TabSpeed", 1, "Tab速率") +global CLX_HJKL_Scroll := CLX_Config("TMouse", "CLX_HJKL_Scroll", 0, "使用IJKL滚轮移动滚轮,比RF多一个横轴。") +global 编辑增强_SpeedRatioX := CLX_Config("EditEnhance", "SpeedRatioX", 1, "光标加速度比率, 默认为 1, 你想慢点就改成 0.5 之类") +global 编辑增强_SpeedRatioY := CLX_Config("EditEnhance", "SpeedRatioY", 1, "光标加速度比率, 默认为 1, 你想慢点就改成 0.5 之类") +global 编辑增强_PageSpeed := CLX_Config("EditEnhance", "PageSpeed", 1, "翻页速率") +global 编辑增强_TabSpeed := CLX_Config("EditEnhance", "TabSpeed", 1, "Tab速率") global 方向键模拟 := new AccModel2D(Func("方向键模拟"), 0.1, 编辑增强_SpeedRatioX * 15, 编辑增强_SpeedRatioY * 15) global 翻页键模拟 := new AccModel2D(Func("翻页键模拟"), 0.1, 20 * 编辑增强_PageSpeed) global Tab键模拟 := new AccModel2D(Func("Tab键模拟"), 0.1, 15 * 编辑增强_TabSpeed) @@ -29,7 +29,7 @@ global Tab键模拟 := new AccModel2D(Func("Tab键模拟"), 0.1, 15 * 编辑增 翻页键模拟.最大速度 := 250 Tab键模拟.最大速度 := 250 -CapsLockX_AppendHelp( CapsLockX_LoadHelpFrom(CapsLockX_THIS_MODULE_HELP_FILE_PATH)) +CLX_AppendHelp( CLX_LoadHelpFrom(CLX_THIS_MODULE_HELP_FILE_PATH)) ; DisableLockWorkstation() Return @@ -236,7 +236,7 @@ Tab键模拟(dx, dy, 状态){ *p:: Tab键模拟.上按("p") *n:: Tab键模拟.下按("n") -#if CapsLockXMode && !CapsLockX_HJKL_Scroll +#if CapsLockXMode && !CLX_HJKL_Scroll *i:: 翻页键模拟.上按("i") *u:: 翻页键模拟.下按("u") diff --git a/Modules/CLX-Elevate.ahk b/Modules/CLX-Elevate.ahk index 2f67723..899ee1b 100644 --- a/Modules/CLX-Elevate.ahk +++ b/Modules/CLX-Elevate.ahk @@ -9,7 +9,7 @@ ; LICENCE: GNU GPLv3 ; ========== CapsLockX ========== -global T_AskRunAsAdmin := CapsLockX_Config("Core", "T_AskRunAsAdmin", 0, "请求管理员权限(权限受限时,权限受限,例如鼠标模拟等功能无法正常运行,默认请求提升权限,如果不需要管理权限下的功能,可以改为0)") +global T_AskRunAsAdmin := CLX_Config("Core", "T_AskRunAsAdmin", 0, "请求管理员权限(权限受限时,权限受限,例如鼠标模拟等功能无法正常运行,默认请求提升权限,如果不需要管理权限下的功能,可以改为0)") Func("AskRunAsAdminIfNeeded").Call() diff --git a/Modules/CLX-LaptopKeyboardFix.ahk b/Modules/CLX-LaptopKeyboardFix.ahk index 7d054d1..d185e22 100644 --- a/Modules/CLX-LaptopKeyboardFix.ahk +++ b/Modules/CLX-LaptopKeyboardFix.ahk @@ -10,9 +10,9 @@ if !CapsLockX ExitApp -global WinKeySimulate := CapsLockX_Config("LKF", "WinKeySimulate", 1, "右手 \][ 模拟Windows键和 Alt + Tab, 具体用法参见LaptopKeyboardFix 模块说明,默认启用") +global WinKeySimulate := CLX_Config("LKF", "WinKeySimulate", 1, "右手 \][ 模拟Windows键和 Alt + Tab, 具体用法参见LaptopKeyboardFix 模块说明,默认启用") global FLAG_SWAP_ESC_STROKE := false -CapsLockX_AppendHelp( CapsLockX_LoadHelpFrom(CapsLockX_THIS_MODULE_HELP_FILE_PATH)) +CLX_AppendHelp( CLX_LoadHelpFrom(CLX_THIS_MODULE_HELP_FILE_PATH)) Return ; 专治 Surface 的残破键盘,合并右Ctrl与Menu键! @@ -55,8 +55,8 @@ Return ; 对于没有Esc或没有 Stroke 键的键 #if CapsLockXMode & CM_FN -`:: FLAG_SWAP_ESC_STROKE := CapsLockX_ConfigSet("CLX_LKF", "FLAG_SWAP_ESC_STROKE", !FLAG_SWAP_ESC_STROKE, "交换ESC和~键,你可以按CLX+Esc来切换这个选项") -Esc:: FLAG_SWAP_ESC_STROKE := CapsLockX_ConfigSet("CLX_LKF", "FLAG_SWAP_ESC_STROKE", !FLAG_SWAP_ESC_STROKE, "交换ESC和~键,你可以按CLX+Esc来切换这个选项") +`:: FLAG_SWAP_ESC_STROKE := CLX_ConfigSet("CLX_LKF", "FLAG_SWAP_ESC_STROKE", !FLAG_SWAP_ESC_STROKE, "交换ESC和~键,你可以按CLX+Esc来切换这个选项") +Esc:: FLAG_SWAP_ESC_STROKE := CLX_ConfigSet("CLX_LKF", "FLAG_SWAP_ESC_STROKE", !FLAG_SWAP_ESC_STROKE, "交换ESC和~键,你可以按CLX+Esc来切换这个选项") #if (FLAG_SWAP_ESC_STROKE && !CapsLockXMode) || (!FLAG_SWAP_ESC_STROKE && CapsLockXMode) diff --git a/Modules/CLX-MediaKeys.ahk b/Modules/CLX-MediaKeys.ahk index a046317..7304af5 100644 --- a/Modules/CLX-MediaKeys.ahk +++ b/Modules/CLX-MediaKeys.ahk @@ -2,7 +2,7 @@ MsgBox, % "本模块只在 CapsLockX 下工作" ExitApp } -CapsLockX_AppendHelp( CapsLockX_LoadHelpFrom(CapsLockX_THIS_MODULE_HELP_FILE_PATH)) +CLX_AppendHelp( CLX_LoadHelpFrom(CLX_THIS_MODULE_HELP_FILE_PATH)) Return #if !!(CapsLockXMode & CM_FN) || !!(CapsLockXMode & CM_CapsLockX) diff --git a/Modules/CLX-Mouse.ahk b/Modules/CLX-Mouse.ahk index 6efd0a4..8afb6ad 100644 --- a/Modules/CLX-Mouse.ahk +++ b/Modules/CLX-Mouse.ahk @@ -17,22 +17,22 @@ if (!CapsLockX) { ExitApp } -global TMouse_Disabled := CapsLockX_Config("TMouse", "Disabled", 0, "禁用模拟鼠标模块") -global TMouse_SendInput := CapsLockX_Config("TMouse", "SendInput", 1, "使用 SendInput 方法提高模拟鼠标点击、移动性能") -global TMouse_SendInputAPI := CapsLockX_Config("TMouse", "SendInputAPI", 1, "使用 Windows API 强势提升模拟鼠标移动性能") -global TMouse_SendInputScroll := CapsLockX_Config("TMouse", "TMouse_SendInputScroll", 0, "使用 Windows API 强势提升模拟鼠标滚轮性能(目前有bug不建议启用)") +global TMouse_Disabled := CLX_Config("TMouse", "Disabled", 0, "禁用模拟鼠标模块") +global TMouse_SendInput := CLX_Config("TMouse", "SendInput", 1, "使用 SendInput 方法提高模拟鼠标点击、移动性能") +global TMouse_SendInputAPI := CLX_Config("TMouse", "SendInputAPI", 1, "使用 Windows API 强势提升模拟鼠标移动性能") +global TMouse_SendInputScroll := CLX_Config("TMouse", "TMouse_SendInputScroll", 0, "使用 Windows API 强势提升模拟鼠标滚轮性能(目前有bug不建议启用)") -global TMouse_StickyCursor := CapsLockX_Config("TMouse", "StickyCursor", 1, "启用自动粘附各种按钮,编辑框") -global TMouse_StopAtScreenEdge := CapsLockX_Config("TMouse", "StopAtScreenEdge", 1, "撞上屏幕边界后停止加速") +global TMouse_StickyCursor := CLX_Config("TMouse", "StickyCursor", 1, "启用自动粘附各种按钮,编辑框") +global TMouse_StopAtScreenEdge := CLX_Config("TMouse", "StopAtScreenEdge", 1, "撞上屏幕边界后停止加速") ; 根据屏幕 DPI 比率,自动计算,得出,如果数值不对,才需要纠正 -global TMouse_UseDPIRatio := CapsLockX_Config("TMouse", "UseDPIRatio", 1, "是否根据屏幕 DPI 比率缩放鼠标速度") -global TMouse_MouseSpeedRatio := CapsLockX_Config("TMouse", "MouseSpeedRatio", 1, "鼠标加速度比率, 默认为 1, 你想慢点就改成 0.5 之类") -global TMouse_WheelSpeedRatio := CapsLockX_Config("TMouse", "WheelSpeedRatio", 1, "滚轮加速度比率, 默认为 1, 你想慢点就改成 0.5 之类") +global TMouse_UseDPIRatio := CLX_Config("TMouse", "UseDPIRatio", 1, "是否根据屏幕 DPI 比率缩放鼠标速度") +global TMouse_MouseSpeedRatio := CLX_Config("TMouse", "MouseSpeedRatio", 1, "鼠标加速度比率, 默认为 1, 你想慢点就改成 0.5 之类") +global TMouse_WheelSpeedRatio := CLX_Config("TMouse", "WheelSpeedRatio", 1, "滚轮加速度比率, 默认为 1, 你想慢点就改成 0.5 之类") global TMouse_DPIRatio := TMouse_UseDPIRatio ? A_ScreenDPI / 96 : 1 -global CapsLockX_HJKL_Scroll := CapsLockX_Config("TMouse", "CapsLockX_HJKL_Scroll", 0, "使用IJKL滚轮移动滚轮,比RF多一个横轴。") +global CLX_HJKL_Scroll := CLX_Config("TMouse", "CLX_HJKL_Scroll", 0, "使用IJKL滚轮移动滚轮,比RF多一个横轴。") -CapsLockX_AppendHelp( CapsLockX_LoadHelpFrom("Modules/01.1-插件-鼠标模拟.md" )) +CLX_AppendHelp( CLX_LoadHelpFrom("Modules/01.1-插件-鼠标模拟.md" )) ; global debug_fps := new FPS_Debugger() global 鼠标模拟 := new AccModel2D(Func("鼠标模拟"), 0.1, TMouse_DPIRatio * 120 * 2 * TMouse_MouseSpeedRatio) global ScrollSimulator := new AccModel2D(Func("ScrollSimulator"), 0.1, TMouse_DPIRatio * 120 * 4 * TMouse_WheelSpeedRatio) @@ -62,21 +62,21 @@ global GID_PRESSANDTAP:=7 Return -#if CapsLockXMode && !CapsLockX_MouseButtonSwitched +#if CapsLockXMode && !CLX_MouseButtonSwitched ; 鼠标按键处理 -*e:: CapsLockX_LMouseButtonDown("e") -*q:: CapsLockX_RMouseButtonDown("q") -*e Up::CapsLockX_LMouseButtonUp()k -*q Up:: CapsLockX_RMouseButtonUp() +*e:: CLX_LMouseButtonDown("e") +*q:: CLX_RMouseButtonDown("q") +*e Up::CLX_LMouseButtonUp()k +*q Up:: CLX_RMouseButtonUp() -#if CapsLockXMode && CapsLockX_MouseButtonSwitched +#if CapsLockXMode && CLX_MouseButtonSwitched ; 鼠标按键处理 -*e:: CapsLockX_RMouseButtonDown("e") -*q:: CapsLockX_LMouseButtonDown("q") -*e Up::CapsLockX_RMouseButtonUp() -*q Up:: CapsLockX_LMouseButtonUp() +*e:: CLX_RMouseButtonDown("e") +*q:: CLX_LMouseButtonDown("q") +*e Up::CLX_RMouseButtonUp() +*q Up:: CLX_LMouseButtonUp() #if CapsLockXMode @@ -366,36 +366,36 @@ PostMessageForScroll(msg, zDelta) ; tooltip % x " " y "`n" ControlClass1 "`n" ControlClass2 "`n" ControlClass3 "`n" wid } -CapsLockX_LMouseButtonDown(wait){ - global CapsLockX_鼠标左键等待 - if (CapsLockX_鼠标左键等待) { +CLX_LMouseButtonDown(wait){ + global CLX_鼠标左键等待 + if (CLX_鼠标左键等待) { return } - CapsLockX_鼠标左键等待 := wait + CLX_鼠标左键等待 := wait SendEvent {Blind}{LButton Down} KeyWait %wait% - ; Hotkey, %wait% Up, CapsLockX_LMouseButtonUp + ; Hotkey, %wait% Up, CLX_LMouseButtonUp } -CapsLockX_LMouseButtonUp(){ - global CapsLockX_鼠标左键等待 +CLX_LMouseButtonUp(){ + global CLX_鼠标左键等待 SendEvent {Blind}{LButton Up} - CapsLockX_鼠标左键等待 := "" + CLX_鼠标左键等待 := "" } -CapsLockX_RMouseButtonDown(wait){ - global CapsLockX_RMouseButtonWait - if (CapsLockX_RMouseButtonWait) { +CLX_RMouseButtonDown(wait){ + global CLX_RMouseButtonWait + if (CLX_RMouseButtonWait) { return } - CapsLockX_RMouseButtonWait := wait + CLX_RMouseButtonWait := wait SendEvent {Blind}{RButton Down} KeyWait %wait% - ; Hotkey, %wait% Up, CapsLockX_RMouseButtonUp + ; Hotkey, %wait% Up, CLX_RMouseButtonUp } -CapsLockX_RMouseButtonUp(){ - global CapsLockX_RMouseButtonWait +CLX_RMouseButtonUp(){ + global CLX_RMouseButtonWait SendEvent {Blind}{RButton Up} - CapsLockX_RMouseButtonWait := "" + CLX_RMouseButtonWait := "" } 鼠标模拟_ToolTip(tips){ ToolTip %tips% diff --git a/Modules/CLX-NodeEval.ahk b/Modules/CLX-NodeEval.ahk index d7b2cda..ab5a919 100644 --- a/Modules/CLX-NodeEval.ahk +++ b/Modules/CLX-NodeEval.ahk @@ -11,7 +11,7 @@ if (!CapsLockX){ ExitApp } -CapsLockX_AppendHelp( CapsLockX_LoadHelpFrom(CapsLockX_THIS_MODULE_HELP_FILE_PATH)) +CLX_AppendHelp( CLX_LoadHelpFrom(CLX_THIS_MODULE_HELP_FILE_PATH)) Return @@ -61,7 +61,7 @@ EvalJavaScriptByBrowser_TODO(code){ EvalJavaScriptByNodeServer(code){ static PassTutorial := "" if(!PassTutorial) - PassTutorial := CapsLockX_Config("EvalJS", "PassTutorial", 0, "忽略使用提示") + PassTutorial := CLX_Config("EvalJS", "PassTutorial", 0, "忽略使用提示") /* sno.md5("asdf")= */ @@ -73,11 +73,11 @@ EvalJavaScriptByNodeServer(code){ ; 让我们来试试输入: ; sno.md5("asdf") ; ) - ; CapsLockX_ConfigSet("EvalJS", "PassTutorial", 1) + ; CLX_ConfigSet("EvalJS", "PassTutorial", 1) ; } static port := "" if(!port) - port := CapsLockX_Config("EvalJS", "Port", 29503, "EvalJS 服务端口") + port := CLX_Config("EvalJS", "Port", 29503, "EvalJS 服务端口") static nodePID := 0 static EvalNodeJS_PIDFile := A_Temp "/EvalNodeJS.pid" ; pid 文件读取尝试 diff --git a/Modules/CLX-Pause.ahk b/Modules/CLX-Pause.ahk index b3041d2..13985fe 100644 --- a/Modules/CLX-Pause.ahk +++ b/Modules/CLX-Pause.ahk @@ -73,10 +73,10 @@ return ; MsgBox % stat ; } #if - + ^!Home:: - CapsLockX_Paused := 0 - if(CapsLockX_Paused) { + CLX_Paused := 0 + if(CLX_Paused) { TrayTip, 暂停, CapsLockX 已暂停 } else { TrayTip, 暂停, CapsLockX 已恢复 @@ -84,8 +84,8 @@ return Return ^!End:: - CapsLockX_Paused := 1 - if(CapsLockX_Paused) { + CLX_Paused := 1 + if(CLX_Paused) { TrayTip, 暂停, CapsLockX 已暂停 } else { TrayTip, 暂停, CapsLockX 已恢复 diff --git a/Modules/CLX-Reload.ahk b/Modules/CLX-Reload.ahk index ecbf922..65b0218 100644 --- a/Modules/CLX-Reload.ahk +++ b/Modules/CLX-Reload.ahk @@ -8,36 +8,36 @@ ; LICENCE: GNU GPLv3 ; ========== CapsLockX ========== ; tooltip loaded -; WatchFolder(A_WorkingDir "\User\", "CapsLockX_FolderModified", true, 0x08) -WatchFolder(A_WorkingDir "\Modules\", "CapsLockX_FolderModified", true, 0x08) ; chagned -WatchFolder(CapsLockX_配置目录, "CapsLockX_FolderChanged", true, 0x02 | 0x03 | 0x08) ; delete or add, iguess -; WatchFolder(A_WorkingDir "\Modules\", "CapsLockX_FolderChanged", true, 0x02 | 0x03) ; delete or add -TrayTip CapsLockX 载入成功 +; WatchFolder(A_WorkingDir "\User\", "CLX_FolderModified", true, 0x08) +WatchFolder(A_WorkingDir "\Modules\", "CLX_FolderModified", true, 0x08) ; chagned +WatchFolder(CLX_ConfigDir, "CLX_FolderChanged", true, 0x02 | 0x03 | 0x08) ; delete or add, iguess +; WatchFolder(A_WorkingDir "\Modules\", "CLX_FolderChanged", true, 0x02 | 0x03) ; delete or add +TrayTip % t("CapsLockX 载入成功") #include Modules/WatchFolder/WatchFolder.ahk global Reload_DeveloperAsYouInstallMeByGitClone := FileExist(A_WorkingDir "/.git") return -CapsLockX_JustConfigured() +CLX_JustConfigured() { ; 跳过 CapsLockX 自己改的配置,容差 2-5 秒 - global CapsLockX_ConfigChangedTickCount - return CapsLockX_ConfigChangedTickCount && A_TickCount - CapsLockX_ConfigChangedTickCount < 5000 + global CLX_ConfigChangedTickCount + return CLX_ConfigChangedTickCount && A_TickCount - CLX_ConfigChangedTickCount < 5000 } ; 只 reload 不重新编译模块 -CapsLockX_FolderModified(Folder, Changes) { - if ( CapsLockX_JustConfigured() ) { +CLX_FolderModified(Folder, Changes) { + if ( CLX_JustConfigured() ) { return } ; don reload - if (CapsLockX_DontReload) { + if (CLX_DontReload) { return } ; 只在 git clone 安装方式下询问配置重载 if (!Reload_DeveloperAsYouInstallMeByGitClone) { return } - MsgBox, 4, CapsLockX 重载模块, 检测到配置更改,是否软重载? + MsgBox, 4, % t("CapsLockX 重载模块"), 检测到配置更改,是否软重载? IfMsgBox Yes ; MsgBox, 4, CapsLockX 重载模块, 检测到配置更改,是否软重载? ; IfMsgBox Yes @@ -45,22 +45,22 @@ CapsLockX_FolderModified(Folder, Changes) { sleep 200 reload } -CapsLockX_FolderChanged(Folder, Changes) +CLX_FolderChanged(Folder, Changes) { - if ( CapsLockX_JustConfigured() ) { + if ( CLX_JustConfigured() ) { return } ; don reload - if (CapsLockX_DontReload) { + if (CLX_DontReload) { return } - global T_AutoReloadOnConfigsChange := CapsLockX_Config("Advanced", "T_AutoReloadOnConfigsChange", 0, "用户配置修改保存时自动重载") + global T_AutoReloadOnConfigsChange := CLX_Config("Advanced", "T_AutoReloadOnConfigsChange", 0, "用户配置修改保存时自动重载") if (T_AutoReloadOnConfigsChange) { TrayTip, CapsLockX 重载模块, 检测到配置更改,正在自动重载。 sleep 200 - ; CapsLockX_Reload() + ; CLX_Reload() reload } else { ; 只在 git clone 安装方式下询问重载 @@ -70,12 +70,12 @@ CapsLockX_FolderChanged(Folder, Changes) MsgBox, 4, CapsLockX 重载模块, 检测到配置更改,是否重载? IfMsgBox Yes Reload - ; CapsLockX_Reload() + ; CLX_Reload() } } #if CapsLockXMode -.:: Reload ; CapsLockX_模块重载 -+.:: CapsLockX_Reload() ; CapsLockX_重新启动 -^+.:: ExitApp ; CapsLockX_退出 +.:: Reload ; CLX_模块重载 ++.:: CLX_Reload() ; CLX_重新启动 +^+.:: ExitApp ; CLX_退出 diff --git a/Modules/CLX-RunOnLogin.ahk b/Modules/CLX-RunOnLogin.ahk index b1fa08e..6b3d8de 100644 --- a/Modules/CLX-RunOnLogin.ahk +++ b/Modules/CLX-RunOnLogin.ahk @@ -9,7 +9,7 @@ return -CapsLockX_MakeStartup() +CLX_MakeStartup() { content = cd "%A_WorkingDir%" && start "" CapsLockX.exe startCMDPath := APPDATA "\Microsoft\Windows\Start Menu\Programs\Startup\capslockx-startup.cmd" diff --git a/Modules/CLX-Settings.ahk b/Modules/CLX-Settings.ahk index 31306b5..0516b23 100644 --- a/Modules/CLX-Settings.ahk +++ b/Modules/CLX-Settings.ahk @@ -7,21 +7,21 @@ ; 版本:v0.0.1 ; ========== CapsLockX ========== -global CapsLockX_FIRST_LAUNCH := CapsLockX_Config("_NOTICE_", "FIRST_LAUNCH", 1, t("首次启动?若想重新进入首次使用教学,请改为 1 并保存,然后使用 Ctrl+Alt+\ 重载 CapsLockX。")) -global CLX_CONFIG_ONSTARTUP := CapsLockX_Config("Core", "CLX_CONFIG_ONSTARTUP", 1, t("启动时显示配置窗口")) - +global CLX_FIRST_LAUNCH := CLX_Config("_NOTICE_", "FIRST_LAUNCH", 1, t("首次启动?若想重新进入首次使用教学,请改为 1 并保存,然后使用 Ctrl+Alt+\ 重载 CapsLockX。")) +global CLX_CONFIG_ONSTARTUP := CLX_Config("Core", "CLX_CONFIG_ONSTARTUP", 1, t("启动时显示配置窗口")) +global CLX_Lang Menu, Tray, Add ; Creates a separator line. -Menu, Tray, Add, % t("Edit config.ini"), 配置文件编辑 -Menu, Tray, Add, % t("Reload CapsLockX"), CapsLockX_Reload -Menu, Tray, Add, % t("Exit CapsLockX"), ExitCapsLockX +Menu, Tray, Add, % t("Edit config.ini"), CLX_ConfigureEdit +Menu, Tray, Add, % t("Reload CapsLockX"), CLX_Reload +Menu, Tray, Add, % t("Exit CapsLockX"), CLX_Exit if (CLX_CONFIG_ONSTARTUP) { - SetTimer CapsLockX_ConfigWindow, -1 + SetTimer CLX_ConfigWindow, -1 } return -ExitCapsLockX() +CLX_Exit() { ExitApp } @@ -29,62 +29,64 @@ ExitCapsLockX() #if CapsLockXMode ;, :: 配置文件编辑() -, :: CapsLockX_ConfigWindow() +,:: CLX_ConfigWindow() -CapsLockX_ConfigWindow() +CLX_ConfigWindow() { Gui, Destroy ; TODO update this to web view - Gui, Add, Text, , % t("你可以按 'CapsLockX +, ' 打开此窗口") - Gui, Add, Text, , % t("当前 CapsLockX_配置目录:%CapsLockX_配置目录%") - Gui, Add, Text, , % t("CLX脚本交流群: QQ群 100949388, https://t.me/capslockx") - Gui, Add, Text, , % t("版本: CapsLockX %CapsLockX_VersionName%") + Gui, Add, Text, , % t("你可以按 'CapsLockX +, ' (CLX+逗号) 打开此窗口") + Gui, Add, Text, , % t("当前 CLX_ConfigDir:") . CLX_ConfigDir + Gui, Add, Text, , % t("CLX脚本交流群: QQ群 100949388 、 Telegram 群 https://t.me/capslockx 、微信群: 添加 @snomiao 拉你") + Gui, Add, Text, , % t("CapsLockX 版本: ") . CLX_VersionName + Gui, Add, Text, , % t("Current Language") . ": " . CLX_Lang Gui, Add, Text, , % t("作者: 雪星 ( Snowstar Miao )") - Gui, Add, Button, Default w80 gButton确认, 确认 - Gui, Add, Button, w80 gButton打开BUG反馈与建议页面, % "打开BUG反馈与建议页面" ; warn : hard to translate as its variable name - Gui, Add, Button, w80 gButton打开官方文档, % "打开官方文档" - Gui, Add, Button, w80 gButton添加开机自动启动, % "添加开机自动启动" - Gui, Add, Button, w80 gButton配置文件编辑, % "配置文件编辑" - Gui, Add, Button, w80 gButton重新載入, % "重新載入" + Gui, Add, Button, Default w120 gButton确认, % t("确定") + Gui, Add, Button, w120 gButtonLanguageSwitch, % t("切换語言") + Gui, Add, Button, w120 gButton打开BUG反馈与建议页面, % t("打开BUG反馈与建议页面") + Gui, Add, Button, w120 gButton打开官方文档, % t("打开官方文档") + Gui, Add, Button, w120 gButton添加开机自动启动, % t("添加开机自动启动") + Gui, Add, Button, w120 gButton配置文件编辑, % t("配置文件编辑") + Gui, Add, Button, w120 gButton重新載入, % t("重新載入") - global T_TomatoLife - if (T_TomatoLife) { - Gui, Add, CheckBox, gCapsLockX_ConfigureUpdate vT_TomatoLife Checked, 启用番茄时钟,每25分钟休息5分钟·。 + global T_TomatoLife ; + if (T_TomatoLife) { + Gui, Add, CheckBox, gCLX_ConfigureUpdate vT_TomatoLife Checked, % t("启用番茄时钟,每25分钟休息5分钟·。") } else { - Gui, Add, CheckBox, gCapsLockX_ConfigureUpdate vT_TomatoLife, 启用番茄时钟,每25分钟休息5分钟·。 + Gui, Add, CheckBox, gCLX_ConfigureUpdate vT_TomatoLife, % t("启用番茄时钟,每25分钟休息5分钟·。") } global T_XKeyAsCapsLock if (T_XKeyAsCapsLock) { - Gui, Add, CheckBox, gCapsLockX_ConfigureUpdate vT_XKeyAsCapsLock Checked, 使用 CapsLock 作为引导键(默认启用) + Gui, Add, CheckBox, gCLX_ConfigureUpdate vT_XKeyAsCapsLock Checked, % t("使用 CapsLock 作为引导键(默认启用)") } else { - Gui, Add, CheckBox, gCapsLockX_ConfigureUpdate vT_XKeyAsCapsLock, 使用 CapsLock 作为引导键(默认启用) + Gui, Add, CheckBox, gCLX_ConfigureUpdate vT_XKeyAsCapsLock, % t("使用 CapsLock 作为引导键(默认启用)") } global T_XKeyAsSpace if (T_XKeyAsSpace) { - Gui, Add, CheckBox, gCapsLockX_ConfigureUpdate vT_XKeyAsSpace Checked, 使用 Space 作为引导键(默认启用) + Gui, Add, CheckBox, gCLX_ConfigureUpdate vT_XKeyAsSpace Checked, % t("使用 Space 作为引导键(默认启用)") } else { - Gui, Add, CheckBox, gCapsLockX_ConfigureUpdate vT_XKeyAsSpace, 使用 Space 作为引导键(默认启用) + Gui, Add, CheckBox, gCLX_ConfigureUpdate vT_XKeyAsSpace, % t("使用 Space 作为引导键(默认启用)") } global T_AskRunAsAdmin if (T_AskRunAsAdmin) { - Gui, Add, CheckBox, gCapsLockX_ConfigureUpdate vT_AskRunAsAdmin Checked, % t("请求管理员权限(权限受限时,鼠标模拟等功能无法正常运行,如果不需要管理权限下的功能,可以改为0)") + Gui, Add, CheckBox, gCLX_ConfigureUpdate vT_AskRunAsAdmin Checked, % t("请求管理员权限(权限受限时,鼠标模拟等功能无法正常运行,如果不需要管理权限下的功能,可以改为0)") } else { - Gui, Add, CheckBox, gCapsLockX_ConfigureUpdate vT_AskRunAsAdmin, % t("请求管理员权限(权限受限时,鼠标模拟等功能无法正常运行,如果不需要管理权限下的功能,可以改为0)") + Gui, Add, CheckBox, gCLX_ConfigureUpdate vT_AskRunAsAdmin, % t("请求管理员权限(权限受限时,鼠标模拟等功能无法正常运行,如果不需要管理权限下的功能,可以改为0)") } global vCLX_CONFIG_ONSTARTUP if (vCLX_CONFIG_ONSTARTUP) { - Gui, Add, CheckBox, gCapsLockX_ConfigureUpdate vCLX_CONFIG_ONSTARTUP Checked, 启动时显示配置窗口 + Gui, Add, CheckBox, gCLX_ConfigureUpdate vCLX_CONFIG_ONSTARTUP Checked, % t("启动时显示配置窗口") } else { - Gui, Add, CheckBox, gCapsLockX_ConfigureUpdate vCLX_CONFIG_ONSTARTUP, 启动时显示配置窗口 + Gui, Add, CheckBox, gCLX_ConfigureUpdate vCLX_CONFIG_ONSTARTUP, % t("启动时显示配置窗口") } Gui, Show } Button添加开机自动启动: - Func("CapsLockX_MakeStartup").Call() + Func("CLX_MakeStartup").Call() return Button打开BUG反馈与建议页面: Run https://github.com/snolab/CapsLockX/issues @@ -93,10 +95,10 @@ Button打开官方文档: Run https://capslockx.snomiao.com/ return Button重新載入: - Func("CapsLockX_Reload").Call() + Func("CLX_Reload").Call() Reload return -CapsLockX_ConfigureUpdate: +CLX_ConfigureUpdate: global T_TomatoLife global T_XKeyAsCapsLock global T_XKeyAsSpace @@ -104,15 +106,15 @@ CapsLockX_ConfigureUpdate: global CLX_CONFIG_ONSTARTUP Gui, Submit, NoHide reloadFlag := 0 - reloadFlag := reloadFlag || ( CapsLockX_ConfigGet("Core", "T_XKeyAsCapsLock", T_XKeyAsCapsLock) != T_XKeyAsCapsLock ) - reloadFlag := reloadFlag || ( CapsLockX_ConfigGet("Core", "T_XKeyAsSpace", T_XKeyAsSpace) != T_XKeyAsSpace ) + reloadFlag := reloadFlag || ( CLX_ConfigGet("Core", "T_XKeyAsCapsLock", T_XKeyAsCapsLock) != T_XKeyAsCapsLock ) + reloadFlag := reloadFlag || ( CLX_ConfigGet("Core", "T_XKeyAsSpace", T_XKeyAsSpace) != T_XKeyAsSpace ) reloadFlagAdmin := 0 - reloadFlagAdmin := reloadFlagAdmin || ( CapsLockX_ConfigGet("Core", "T_AskRunAsAdmin", T_AskRunAsAdmin) != T_AskRunAsAdmin ) - CapsLockX_ConfigSet("TomatoLife", "Enable", T_TomatoLife, "使用番茄时钟(默认禁用,改为 1 开启)") - CapsLockX_ConfigSet("Core", "T_XKeyAsCapsLock", T_XKeyAsCapsLock, "使用 Space 作为引导键(默认启用,用户启用)") - CapsLockX_ConfigSet("Core", "T_XKeyAsSpace", T_XKeyAsSpace, "使用 CapsLock 作为引导键(默认启用,用户启用)") - CapsLockX_ConfigSet("Core", "T_AskRunAsAdmin", T_AskRunAsAdmin, "请求管理员权限(权限受限时,鼠标模拟等功能无法正常运行,如果不需要管理权限下的功能,可以改为0)") - CapsLockX_ConfigSet("Core", "CLX_CONFIG_ONSTARTUP", CLX_CONFIG_ONSTARTUP, "启动时显示配置窗口") + reloadFlagAdmin := reloadFlagAdmin || ( CLX_ConfigGet("Core", "T_AskRunAsAdmin", T_AskRunAsAdmin) != T_AskRunAsAdmin ) + CLX_ConfigSet("TomatoLife", "Enable", T_TomatoLife, "使用番茄时钟(默认禁用,改为 1 开启)") + CLX_ConfigSet("Core", "T_XKeyAsCapsLock", T_XKeyAsCapsLock, "使用 Space 作为引导键(默认启用,用户启用)") + CLX_ConfigSet("Core", "T_XKeyAsSpace", T_XKeyAsSpace, "使用 CapsLock 作为引导键(默认启用,用户启用)") + CLX_ConfigSet("Core", "T_AskRunAsAdmin", T_AskRunAsAdmin, "请求管理员权限(权限受限时,鼠标模拟等功能无法正常运行,如果不需要管理权限下的功能,可以改为0)") + CLX_ConfigSet("Core", "CLX_CONFIG_ONSTARTUP", CLX_CONFIG_ONSTARTUP, "启动时显示配置窗口") if (reloadFlag) { reload } @@ -121,20 +123,27 @@ CapsLockX_ConfigureUpdate: } return Button确认: - Gosub, CapsLockX_ConfigureUpdate + Gosub, CLX_ConfigureUpdate ; TrayTip conf, %T_XKeyAsCapsLock% %T_XKeyAsSpace% %T_AskRunAsAdmin% %CLX_CONFIG_ONSTARTUP% gui, destroy return +ButtonLanguageSwitch: + InputBox, targetLang, % t("Change Language of CapsLockX"), % t("Please input target Language: "),,,,,,,,% CLX_Lang + ; InputBox, OutputVar [, Title, Prompt, HIDE, Width, Height, X, Y, Locale, Timeout, Default + ; targetLang + i18n_changeLanguage(targetLang) + Reload +return Button配置文件编辑: - 配置文件编辑() + CLX_ConfigureEdit() Return -CapsLockX_首次使用教学(){ +CLX_首次使用教学(){ ; TODO } -配置文件编辑(){ - Run notepad %CapsLockX_配置路径% +CLX_ConfigureEdit(){ + Run notepad %CLX_ConfigPath% ; TrayTip, 配置文件关, 自动重载 - ; CapsLockX_Reload() + ; CLX_Reload() } diff --git a/Modules/CLX-Userscripts.ahk b/Modules/CLX-Userscripts.ahk index f3f1b1e..ea9307b 100644 --- a/Modules/CLX-Userscripts.ahk +++ b/Modules/CLX-Userscripts.ahk @@ -12,9 +12,9 @@ if (!CapsLockX) { MsgBox, % "本模块只为 CapsLockX 工作" ExitApp } -; Func("CapsLockX_AppendHelp").Call(Func("CapsLockX_LoadHelpFrom").Call(CapsLockX_THIS_MODULE_HELP_FILE_PATH)) +; Func("CLX_AppendHelp").Call(Func("CLX_LoadHelpFrom").Call(CLX_THIS_MODULE_HELP_FILE_PATH)) -global 快速窗口热键编辑用户模块目录 := CapsLockX_配置目录 "/" +global 快速窗口热键编辑用户模块目录 := CLX_ConfigDir "/" global 快速窗口热键编辑初始内容 := " ( ; ========== CapsLockX ========== @@ -46,8 +46,8 @@ Return UserModuleEdit(dir, filename := "") { - global CapsLockX_DontReload - CapsLockX_DontReload := 1 + global CLX_DontReload + CLX_DontReload := 1 WinGet, hWnd, ID, A WinGetClass, 窗口类名, ahk_id %hWnd% @@ -66,7 +66,7 @@ UserModuleEdit(dir, filename := "") 填充内容 := "`n" "`n" "; #if WinActive(""" match """)" "`n" "`n" "; !d`:`: TrayTip, CapsLockX, 在当前窗口按下了Alt+d" "`n" FileAppend, %填充内容%, %path% - CapsLockX_DontReload := 0 + CLX_DontReload := 0 ; clipboard := 填充内容 Run code.cmd "%path%" || notepad "%path%" @@ -79,6 +79,6 @@ UserModuleEdit(dir, filename := "") } ; 自定义脚本创建 -!,:: UserModuleEdit(快速窗口热键编辑用户模块目录, "CapsLockX_用户脚本.user.ahk") +!,:: UserModuleEdit(快速窗口热键编辑用户模块目录, "CLX_用户脚本.user.ahk") +!,:: UserModuleEdit(快速窗口热键编辑用户模块目录, "使用进程名AHK") diff --git a/Modules/CLX-VirtualDesktop.ahk b/Modules/CLX-VirtualDesktop.ahk index 1f3958e..0399c38 100644 --- a/Modules/CLX-VirtualDesktop.ahk +++ b/Modules/CLX-VirtualDesktop.ahk @@ -30,16 +30,16 @@ if (!CapsLockX) { ExitApp } -global VirtualDesktopPinPattern1 := CapsLockX_Config("VirtualDesktopPinPattern", "p1", "#Desktop1", "Pin matched window to desktop 1") -global VirtualDesktopPinPattern2 := CapsLockX_Config("VirtualDesktopPinPattern", "p2", "#Desktop2", "Pin matched window to desktop 2") -global VirtualDesktopPinPattern3 := CapsLockX_Config("VirtualDesktopPinPattern", "p3", "#Desktop3", "Pin matched window to desktop 3") -global VirtualDesktopPinPattern4 := CapsLockX_Config("VirtualDesktopPinPattern", "p4", "#Desktop4", "Pin matched window to desktop 4") -global VirtualDesktopPinPattern5 := CapsLockX_Config("VirtualDesktopPinPattern", "p5", "#Desktop5", "Pin matched window to desktop 5") -global VirtualDesktopPinPattern6 := CapsLockX_Config("VirtualDesktopPinPattern", "p6", "#Desktop6", "Pin matched window to desktop 6") -global VirtualDesktopPinPattern7 := CapsLockX_Config("VirtualDesktopPinPattern", "p7", "#Desktop7", "Pin matched window to desktop 7") -global VirtualDesktopPinPattern8 := CapsLockX_Config("VirtualDesktopPinPattern", "p8", "#Desktop8", "Pin matched window to desktop 8") -global VirtualDesktopPinPattern9 := CapsLockX_Config("VirtualDesktopPinPattern", "p9", "#Desktop9", "Pin matched window to desktop 9") -global VirtualDesktopPinPattern0 := CapsLockX_Config("VirtualDesktopPinPattern", "p0", "#Desktop0", "Pin matched window to desktop 0") +global VirtualDesktopPinPattern1 := CLX_Config("VirtualDesktopPinPattern", "p1", "#Desktop1", "Pin matched window to desktop 1") +global VirtualDesktopPinPattern2 := CLX_Config("VirtualDesktopPinPattern", "p2", "#Desktop2", "Pin matched window to desktop 2") +global VirtualDesktopPinPattern3 := CLX_Config("VirtualDesktopPinPattern", "p3", "#Desktop3", "Pin matched window to desktop 3") +global VirtualDesktopPinPattern4 := CLX_Config("VirtualDesktopPinPattern", "p4", "#Desktop4", "Pin matched window to desktop 4") +global VirtualDesktopPinPattern5 := CLX_Config("VirtualDesktopPinPattern", "p5", "#Desktop5", "Pin matched window to desktop 5") +global VirtualDesktopPinPattern6 := CLX_Config("VirtualDesktopPinPattern", "p6", "#Desktop6", "Pin matched window to desktop 6") +global VirtualDesktopPinPattern7 := CLX_Config("VirtualDesktopPinPattern", "p7", "#Desktop7", "Pin matched window to desktop 7") +global VirtualDesktopPinPattern8 := CLX_Config("VirtualDesktopPinPattern", "p8", "#Desktop8", "Pin matched window to desktop 8") +global VirtualDesktopPinPattern9 := CLX_Config("VirtualDesktopPinPattern", "p9", "#Desktop9", "Pin matched window to desktop 9") +global VirtualDesktopPinPattern0 := CLX_Config("VirtualDesktopPinPattern", "p0", "#Desktop0", "Pin matched window to desktop 0") Return @@ -57,7 +57,7 @@ Return +]:: MoveActiveWindowWithAction("^#{Right}") #if CapsLockXMode - + ; Add or delete desktop !Backspace:: SendEvent ^#{F4} !+Backspace:: SendEvent ^#d @@ -226,7 +226,7 @@ MoveActiveWindowToDesktop(idx) MoveAllVisibleWindowToDesktop(idx) { listOfWindow := WindowsListOfMonitorFast(arrangeFlags | ARRANGE_MAXWINDOW | ARRANGE_MINWINDOW) - + loop Parse, listOfWindow, `n { hWnd := RegExReplace(A_LoopField, "^.*?ahk_id (\S+?)$", "$1") @@ -242,7 +242,7 @@ MoveAllVisibleWindowToDesktop(idx) hWnd := RegExReplace(A_LoopField, "^.*?ahk_id (\S+?)$", "$1") if(!hWnd) continue - + DllCall("ShowWindowAsync", UInt, hWnd, UInt, (SW_SHOWNOACTIVATE := 0x4) ) } } @@ -302,7 +302,7 @@ SwitchToDesktopByHotkey(idx) SendEvent ^#{Left} } lastIdx := idx - + return idx } @@ -400,7 +400,7 @@ WindowsListInAllVirtualDesktop() WS_EX_NOACTIVATE := 0x08000000 WS_POPUP := 0x80000000 DetectHiddenWindows, Off - WinGet, id, List, , , + WinGet, id, List, , , loop %id% { hWnd := id%A_Index% filter := !WindowsListOfMonitorInAllVirtualDesktopFilter(hWnd) diff --git a/Modules/CLX-WindowManager.ahk b/Modules/CLX-WindowManager.ahk index 5d47496..c9a4579 100644 --- a/Modules/CLX-WindowManager.ahk +++ b/Modules/CLX-WindowManager.ahk @@ -16,7 +16,7 @@ if (!CapsLockX) { ExitApp } -CapsLockX_AppendHelp( CapsLockX_LoadHelpFrom(CapsLockX_THIS_MODULE_HELP_FILE_PATH)) +CLX_AppendHelp( CLX_LoadHelpFrom(CLX_THIS_MODULE_HELP_FILE_PATH)) ; setup done ; flags @@ -36,7 +36,7 @@ global ARRANGE_Z_ORDERING := 0x20 global lastFlashWinIDs := [] global 最迟闪动窗口 := {} ; global 窗口鼠标位置表表 := {} -global T窗口增强_鼠标位置记忆 := CapsLockX_Config("窗口增强", "鼠标位置记忆尝试", 1, "在CLX+Z窗口切换时记住还原鼠标在每个窗口中的位置") +global T窗口增强_鼠标位置记忆 := CLX_Config("窗口增强", "鼠标位置记忆尝试", 1, "在CLX+Z窗口切换时记住还原鼠标在每个窗口中的位置") 闪动窗口记录器初始化() diff --git a/Modules/QuickInput.ahk b/Modules/QuickInput.ahk index e21d4ba..3897c40 100644 --- a/Modules/QuickInput.ahk +++ b/Modules/QuickInput.ahk @@ -8,7 +8,7 @@ ; 版权:Copyright © 2017-2022 Snowstar Laboratory. All Rights Reserved. ; ========== CapsLockX ========== -CapsLockX_AppendHelp( CapsLockX_LoadHelpFrom(CapsLockX_THIS_MODULE_HELP_FILE_PATH)) +CLX_AppendHelp( CLX_LoadHelpFrom(CLX_THIS_MODULE_HELP_FILE_PATH)) Return diff --git a/Modules/QuickTips.ahk b/Modules/QuickTips.ahk index 6eff943..3f3de5c 100644 --- a/Modules/QuickTips.ahk +++ b/Modules/QuickTips.ahk @@ -42,11 +42,11 @@ SceneTips() ToolTip %msg% } } -CapsLockX_LongPressDown() +CLX_LongPressDown() { SceneTips() } -CapsLockX_LongPressUp() +CLX_LongPressUp() { SceneTipsRemove() } \ No newline at end of file diff --git a/Modules/SnoChordTyping.ahk b/Modules/SnoChordTyping.ahk index 4d23e30..2aa30d1 100644 --- a/Modules/SnoChordTyping.ahk +++ b/Modules/SnoChordTyping.ahk @@ -13,7 +13,7 @@ FileEncoding, UTF-8 ; 開關 默认关 -global SnoChordTypingEnable := CapsLockX_Config("Plugins", "EnableSnoChordTyping", 0, "启用雪星并击(实验中),") +global SnoChordTypingEnable := CLX_Config("Plugins", "EnableSnoChordTyping", 0, "启用雪星并击(实验中),") if (!T_SnoChordTypingEnable) Return @@ -36,7 +36,7 @@ Return global SnoChordTypingLastKeyDownTick := 0 ; 读入配置 - ConfigPath := CapsLockX_配置目录 "/雪星并击配置.ini" + ConfigPath := CLX_ConfigDir "/雪星并击配置.ini" IniRead, SnoChordTypingChordIntervalThreshold, %ConfigPath%, Common, SnoChordTypingChordIntervalThreshold, %SnoChordTypingChordIntervalThreshold% IniWrite, %SnoChordTypingChordIntervalThreshold%, %ConfigPath%, Common, SnoChordTypingChordIntervalThreshold IniRead, SnoChordTypingAllowRewriteString, %ConfigPath%, Common, SnoChordTypingAllowRewriteString, %SnoChordTypingAllowRewriteString% diff --git a/Modules/TomatoLife.ahk b/Modules/TomatoLife.ahk index cc03d09..e8083c0 100644 --- a/Modules/TomatoLife.ahk +++ b/Modules/TomatoLife.ahk @@ -7,26 +7,26 @@ ; 版本:v2021.03.26 ; ========== CapsLockX ========== -global T_TomatoLife := CapsLockX_Config("TomatoLife", "Enable", 0, "使用番茄时钟(默认禁用,改为 1 开启)") -global T_TomatoLife_NoticeOnLaunch := CapsLockX_Config("TomatoLife", "NoticeOnLaunch", 1, "启动时报告番茄状态") -global T_TomatoLife_UseTomatoLifeSound := CapsLockX_Config("TomatoLife", "UseTomatoLifeSound", 1, "使用番茄报时(00分和30分播放工作铃声,每小时的25分和55分播放休息铃声)(需要先开启番茄时钟)") -global T_TomatoLife_UseTomatoLifeSwitchVirtualDesktop := CapsLockX_Config("TomatoLife", "UseTomatoLifeSwitchVirtualDesktop", 1, "使用番茄报时时,自动切换桌面(休息为桌面1,工作为桌面2)") +global T_TomatoLife := CLX_Config("TomatoLife", "Enable", 0, "使用番茄时钟(默认禁用,改为 1 开启)") +global T_TomatoLife_NoticeOnLaunch := CLX_Config("TomatoLife", "NoticeOnLaunch", 1, "启动时报告番茄状态") +global T_TomatoLife_UseTomatoLifeSound := CLX_Config("TomatoLife", "UseTomatoLifeSound", 1, "使用番茄报时(00分和30分播放工作铃声,每小时的25分和55分播放休息铃声)(需要先开启番茄时钟)") +global T_TomatoLife_UseTomatoLifeSwitchVirtualDesktop := CLX_Config("TomatoLife", "UseTomatoLifeSwitchVirtualDesktop", 1, "使用番茄报时时,自动切换桌面(休息为桌面1,工作为桌面2)") if (T_TomatoLife) { 高精度时间配置() - GoSub CapsLockX_番茄时钟定时任务 + GoSub CLX_番茄时钟定时任务 ; [有一个难以复现的 bug・Issue #17・snolab/CapsLockX]( https://github.com/snolab/CapsLockX/issues/17 ) } Return 高精度时间配置(){ - ; global T_TomatoLife := CapsLockX_Config("TomatoLife", "", 0, "使用定时任务") + ; global T_TomatoLife := CLX_Config("TomatoLife", "", 0, "使用定时任务") ; MsgBox, 你开启了定时任务,是否现在配置高精度时间? ; IfMsgBox, Cancel ; return - - global T_TomatoLife_UsingHighPerformanceTime := CapsLockX_Config("TomatoLife", "T_UsingHighPerformanceTime", "0", "已经配置过高精度时间的Flag") + + global T_TomatoLife_UsingHighPerformanceTime := CLX_Config("TomatoLife", "T_UsingHighPerformanceTime", "0", "已经配置过高精度时间的Flag") if (T_TomatoLife_UsingHighPerformanceTime) return ToolTip, 番茄时钟开启,正在为您配置系统高精度时间 @@ -38,7 +38,7 @@ Return RunWait reg add "HKLM\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient" /v "SpecialPollInterval" /t REG_DWORD /d 64 /f, , Hide RunWait net stop w32time, , Hide RunWait net start w32time, , Hide - CapsLockX_ConfigSet("TomatoLife", "T_UsingHighPerformanceTime", "1", "") + CLX_ConfigSet("TomatoLife", "T_UsingHighPerformanceTime", "1", "") ToolTip } @@ -48,7 +48,7 @@ Return 番茄报时(force:=0){ ; CapsLockX 暂停时,番茄状态也暂停 - if (CapsLockX_Paused) + if (CLX_Paused) Return ; tooltip 检测睡眠标记文件以跳过报时 static SLEEPING_FLAG_CLEAN := 0 @@ -64,12 +64,12 @@ Return } 番茄状态 := 番茄状态计算() ; tooltip 边沿触发过滤器 - + static 上次番茄状态 := "" ; : 番茄状态计算() - + global T_TomatoLife_NoticeOnLaunch ; tomatoLaunchFlag := 0 ; - + if ( 上次番茄状态 == "" && !T_TomatoLife_NoticeOnLaunch) { 上次番茄状态 = 番茄状态计算() tomatoLaunchFlag := 1 @@ -81,7 +81,7 @@ Return } 上次番茄状态 := 番茄状态 MsgBox, 番茄:%番茄状态% - + ; 状态动作 if ("工作时间" == 番茄状态) { TrayTip 番茄时钟:%番茄状态%, 工作时间到啦! @@ -109,14 +109,14 @@ UnixTimeGet() Return t * 1000 + A_MSec } -CapsLockX_番茄时钟定时任务: +CLX_番茄时钟定时任务: if (T_TomatoLife && T_TomatoLife_UseTomatoLife) 番茄报时() ; 下次循环时间计算 间隔 := 60000 ; 间隔为1分钟,精度到毫秒级 延时 := (间隔 - Mod(UnixTimeGet(), 间隔)) ; ToolTip, % 延时 - SetTimer CapsLockX_番茄时钟定时任务, %延时% + SetTimer CLX_番茄时钟定时任务, %延时% Return #If diff --git a/README.md b/README.md index 80b0fd7..76eafd6 100644 --- a/README.md +++ b/README.md @@ -680,7 +680,7 @@ Ctrl + Alt + 同上,但一般为全局热键 相关社群: - [CapsLockX 的 issues (可作论坛使用)](https://github.com/snolab/CapsLockX/issues) ✉️ -- CapsLockX 用户电报群:[t.me/CapsLockX_users](https://t.me/CapsLockX_users)📱 +- CapsLockX 用户电报群:[t.me/CLX_users](https://t.me/CLX_users)📱 - CapsLockX 用户 QQ 群 🐧:[100949388](https://jq.qq.com/?_wv=1027&k=56lsK8ko) - QZ/VimD/TC/AHK QQ 群 🐧: 271105729 - AHK 高级 QQ 群 🐧: 717947647 diff --git "a/Tools/DeprecatedModules/\350\256\257\351\243\236\350\276\223\345\205\245\346\263\225\350\257\255\351\237\263\346\202\254\346\265\256\347\252\227.ahk" "b/Tools/DeprecatedModules/\350\256\257\351\243\236\350\276\223\345\205\245\346\263\225\350\257\255\351\237\263\346\202\254\346\265\256\347\252\227.ahk" index 50c099a..35d7505 100644 --- "a/Tools/DeprecatedModules/\350\256\257\351\243\236\350\276\223\345\205\245\346\263\225\350\257\255\351\237\263\346\202\254\346\265\256\347\252\227.ahk" +++ "b/Tools/DeprecatedModules/\350\256\257\351\243\236\350\276\223\345\205\245\346\263\225\350\257\255\351\237\263\346\202\254\346\265\256\347\252\227.ahk" @@ -9,7 +9,7 @@ ; 2021-04-15 更新 @telppa:[修改了一下语音识别模块的代码。・Issue #14・snolab/CapsLockX]( https://github.com/snolab/CapsLockX/issues/14 ) ; -CapsLockX_AppendHelp( CapsLockX_LoadHelpFrom(CapsLockX_THIS_MODULE_HELP_FILE_PATH)) +CLX_AppendHelp( CLX_LoadHelpFrom(CLX_THIS_MODULE_HELP_FILE_PATH)) Return diff --git a/docs/README.md b/docs/README.md index 719992c..42e4c05 100644 --- a/docs/README.md +++ b/docs/README.md @@ -682,7 +682,7 @@ Star Chart ⭐️ Related Communities: - [CapsLockX's issues (can be used as a forum)](https://github.com/snolab/CapsLockX/issues) ✉️ -- CapsLockX User Telegram Group: [t.me/CapsLockX_users](https://t.me/CapsLockX_users)📱 +- CapsLockX User Telegram Group: [t.me/CLX_users](https://t.me/CLX_users)📱 - CapsLockX User QQ Group 🐧: [100949388](https://jq.qq.com/?_wv=1027&k=56lsK8ko) - QZ/VimD/TC/AHK QQ Group 🐧: 271105729 - AHK Advanced QQ Group 🐧: 717947647 From 0ef49e2600a66ef0baf34a144e5cca9e3d68a5ff Mon Sep 17 00:00:00 2001 From: snomiao Date: Sun, 12 May 2024 22:35:19 +0900 Subject: [PATCH 05/15] fix(Modules): example lang example lang --- Modules/App-AnkiEnhanced.ahk | 16 +++++----- Modules/CLX-Brainstorm.ahk | 27 +++++++++------- Modules/CLX-ClipStack.ahk | 23 -------------- Modules/CLX-Cursor.ahk | 53 ------------------------------- Modules/CLX-Edit.ahk | 10 +++--- Modules/CLX-LaptopKeyboardFix.ahk | 2 +- Modules/CLX-MediaKeys.ahk | 2 +- Modules/CLX-Mouse.ahk | 50 ++++++++++++++--------------- Modules/CLX-Reload.ahk | 8 ++--- Modules/CLX-Settings.ahk | 30 ++++++++++------- Modules/CLX-Userscripts.ahk | 6 ++-- Modules/CLX-WindowManager.ahk | 2 +- Modules/TomatoLife.ahk | 14 ++++---- Modules/TurnOffScreenWhenLock.ahk | 4 +++ 14 files changed, 92 insertions(+), 155 deletions(-) delete mode 100644 Modules/CLX-ClipStack.ahk delete mode 100644 Modules/CLX-Cursor.ahk diff --git a/Modules/App-AnkiEnhanced.ahk b/Modules/App-AnkiEnhanced.ahk index 50d1e38..71781fc 100644 --- a/Modules/App-AnkiEnhanced.ahk +++ b/Modules/App-AnkiEnhanced.ahk @@ -14,24 +14,24 @@ ;^!F12:: ExitApp -Global Anki增强_Lock := 0 +Global AnkiEnhance_Lock := 0 #WinActivateForce Return AnkiEnlock(key, to) { - if (Anki增强_Lock) { + if (AnkiEnhance_Lock) { Send {%key% up}r Return } - Anki增强_Lock := 1 + AnkiEnhance_Lock := 1 Send %to% KeyWait, %key%, T60 ; wait for 60 seconds } AnkiUnlock(x) { - Anki增强_Lock := 0 + AnkiEnhance_Lock := 0 Send %x% } @@ -102,7 +102,7 @@ $Left up:: AnkiUnlock("{space}") $Down up:: AnkiUnlock("{space}") $Right up:: AnkiUnlock("{space}") -; 快速从剪贴板导入卡片列表 +; 快速从ClipboardImported卡片列表 $!i:: AnkiImport() AnkiImport() { @@ -118,7 +118,7 @@ AnkiImport() Send ^+i ; 获取到文本后保存到临时文件…… - FileName = %APPDATA%\Anki2\剪贴板导入.txt + FileName = %APPDATA%\Anki2\ClipboardImported.txt file := FileOpen(FileName, "w", "UTF-8") if !IsObject(file) { MsgBox Can't open "%FileName%" for writing. @@ -158,7 +158,7 @@ CaptureScreenNoteAdd() ClipWait, 10, 1 WinShow ahk_id %addWindow% if ErrorLevel { - TrayTip, CapsLockX, 没有获取到剪贴板的内容 + TrayTip, CapsLockX, % t("没有获取到剪贴板的内容") Return False } while !WinActive("ahk_id" addWindow) && WinExist("ahk_id" addWindow) @@ -179,7 +179,7 @@ $!c:: ClipWait, 10, 1 if ErrorLevel { - TrayTip, CapsLockX, 没有获取到剪贴板的内容 + TrayTip, CapsLockX, % t("没有获取到剪贴板的内容") Return } Send ^v diff --git a/Modules/CLX-Brainstorm.ahk b/Modules/CLX-Brainstorm.ahk index f8bc615..15e1374 100644 --- a/Modules/CLX-Brainstorm.ahk +++ b/Modules/CLX-Brainstorm.ahk @@ -1,8 +1,9 @@ #SingleInstance, Force global brainstorming := false -global brainstorm_origin := CLX_Config("BrainStorm", "Website", "https://brainstorm.snomiao.com", "Brainstorm 官方網址") ; -global brainstormApiKey := CLX_Config("BrainStorm", "Key", "FREE", "CLX BrainStorm 的功能激活碼,填FREE使用免費版本") ; +global brainstorm_origin := CLX_Config("BrainStorm", "Website", "https://brainstorm.snomiao.com") +global brainstormApiKey := CLX_Config("BrainStorm", "Key", "FREE", t("CLX BrainStorm 的功能激活碼,填FREE使用免費版本")) +global brainstormLastQuestion := CLX_Config("BrainStorm", "LastQuestion", "", t("Brainstorm 上次提问")) return @@ -42,11 +43,11 @@ stop_brainstorm() brainstorm_set_key() { msg := t("訪問官方網站来取得激活碼,在此輸入,或者填 FREE 使用免費版,網址如下:") - InputBox, key, % "激活碼輸入", % msg "`n" brainstorm_origin + InputBox, key, % t("激活碼輸入"), % msg "`n" brainstorm_origin if (ErrorLevel == 1) { Return } - CLX_ConfigSet("BrainStorm", "Key", key, "CLX BrainStorm 的功能激活碼") + CLX_ConfigSet("BrainStorm", "Key", key) } brainstorm_copy() { @@ -63,15 +64,17 @@ brainstorm() content:=brainstorm_copy() prompt := "" - prompt .= t("例1: Translate to english:") . "`n" - prompt .= t("例2: 解釈这句話:") . "`n" - prompt .= t("例3: 总结5点:") . "`n" + prompt .= t("例1: 'Translate to english:'") . "`n" + prompt .= t("例2: '解釈这句話:'") . "`n" + prompt .= t("例3: '总结5点:'") . "`n" prompt .= "--- " . t("以下为提問内容") . " ---`n" . content - InputBox, cmd, 请輸入文本指令, %prompt%, , 500, 600 + InputBox, cmd, % t("请輸入文本指令"), %prompt%, , 500, 600,,,,,% brainstormLastQuestion + ; if escape if (ErrorLevel == 1) { Return } + CLX_ConfigSet("BrainStorm", "LastQuestion", cmd) msg := Trim(content . "`n`n" . cmd, OmitChars = " `t`n") global brainstorming := true @@ -100,18 +103,18 @@ BS_questionPost_onReadyStateChange(xhr) return if (xhr.status != 200) { if (xhr.status == 403) { - MsgBox, % xhr.responseText " 请检查激活码是否正确" + MsgBox, % xhr.responseText . " " . t("请检查激活码是否正确") brainstorm_set_key() } if (xhr.status == 429) { - MsgBox, % xhr.responseText " 请等待一段时间后再试" + MsgBox, % xhr.responseText . " " . t("请等待一段时间后再试") } - MsgBox, % xhr.responseText " Unknown Error" + MsgBox, % xhr.responseText . " " . t("Unknown Error") return } global questionId := xhr.responseText if (!questionId) { - MsgBox, fail to ask ai + MsgBox, t("Fail to ask ai") return } ; tooltip askAiSucc with question %questionId% diff --git a/Modules/CLX-ClipStack.ahk b/Modules/CLX-ClipStack.ahk deleted file mode 100644 index efded79..0000000 --- a/Modules/CLX-ClipStack.ahk +++ /dev/null @@ -1,23 +0,0 @@ -return -; clipStack = [] -; clipStack.Push([1,2,3]) -; return - - -; *^c:: -; ; ClipboardAll= -; ; ClipWait, [ SecondsToWait, 1] -; clip:= ClipboardAll - -; tooltip %clip% -; clipStack.Push(clip) -; ; ToolTip, [ Text, X, Y, WhichToolTip] -; return -; *^v:: -; clip1:= ClipboardAll -; clip:= clipStack.Pop() -; tooltip %clip1% - %clip% -; ; ClipboardAll= -; ; ClipWait, [ SecondsToWait, 1] -; ; clip:= ClipboardAll -; return \ No newline at end of file diff --git a/Modules/CLX-Cursor.ahk b/Modules/CLX-Cursor.ahk deleted file mode 100644 index 9dc67cf..0000000 --- a/Modules/CLX-Cursor.ahk +++ /dev/null @@ -1,53 +0,0 @@ -; -; 模块:在增强模式下,用另一套鼠标指针 -; 贡献者: @冰封 QQ: 124702759 -; -;鼠标特征值 -Return - -SetCursor(code, curFile) -{ - ;加载CapsLock增强的标指针 - hIcon := DllCall("LoadCursorFromFile", "Str", curFile) - DllCall("SetSystemCursor", "UInt", hIcon, "Int", code) -} - -UpdateCapsCursor(s) -{ - if (!s) { - ;恢复默认指针 - SPI_SETCURSORS := 0x57 - DllCall( "SystemParametersInfo", "UInt", SPI_SETCURSORS, "UInt", 0, "UInt", 0, "UInt", 0) - Return - } - - PATH_CURSOR := "数据/cursor" - ; OCR_APPSTARTING := 32650 - SetCursor(32650, PATH_CURSOR "/APPSTARTING.cur") ;AppStarting.cur") - ; OCR_NORMAL := 32512 - SetCursor(32512, PATH_CURSOR "/NORMAL.cur") ;正常选择.cur") - ; OCR_CROSS := 32515 - SetCursor(32515, PATH_CURSOR "/CROSS.cur") ;精确选择.cur") - ; OCR_HAND := 32649 - SetCursor(32649, PATH_CURSOR "/HAND.cur") ;链接选择.cur") - ; OCR_HELP := 32651 - SetCursor(32651, PATH_CURSOR "/HELP.cur") ;帮助选择.cur") - ; OCR_IBEAM := 32513 - SetCursor(32513, PATH_CURSOR "/IBEAM.cur") ;文本选择.cur") - ; OCR_NO := 32648 - SetCursor(32648, PATH_CURSOR "/NO.cur") ;不可用.cur") - ; OCR_SIZEALL := 32646 - SetCursor(32646, PATH_CURSOR "/SIZEALL.cur") ;移动.cur") - ; OCR_SIZENESW := 32643 - SetCursor(32643, PATH_CURSOR "/SIZENESW.cur") ;沿对角线调整大小2.cur") - ; OCR_SIZENS := 32645 - SetCursor(32645, PATH_CURSOR "/SIZENS.cur") ;垂直调整大小.cur") - ; OCR_SIZENWSE := 32642 - SetCursor(32642, PATH_CURSOR "/SIZENWSE.cur") ;沿对角线调整大小1.cur") - ; OCR_SIZEWE := 32644 - SetCursor(32644, PATH_CURSOR "/SIZEWE.cur") ;水平调整大小.cur") - ; OCR_UP := 32516 - SetCursor(32516, PATH_CURSOR "/UP.cur") ;候选.cur") - ; OCR_WAIT := 32514 - SetCursor(32514, PATH_CURSOR "/WAIT.cur") ;忙.cur") -} \ No newline at end of file diff --git a/Modules/CLX-Edit.ahk b/Modules/CLX-Edit.ahk index 42f9045..6ccf542 100644 --- a/Modules/CLX-Edit.ahk +++ b/Modules/CLX-Edit.ahk @@ -17,11 +17,11 @@ if (!CapsLockX) { ExitApp } -global CLX_HJKL_Scroll := CLX_Config("TMouse", "CLX_HJKL_Scroll", 0, "使用IJKL滚轮移动滚轮,比RF多一个横轴。") -global 编辑增强_SpeedRatioX := CLX_Config("EditEnhance", "SpeedRatioX", 1, "光标加速度比率, 默认为 1, 你想慢点就改成 0.5 之类") -global 编辑增强_SpeedRatioY := CLX_Config("EditEnhance", "SpeedRatioY", 1, "光标加速度比率, 默认为 1, 你想慢点就改成 0.5 之类") -global 编辑增强_PageSpeed := CLX_Config("EditEnhance", "PageSpeed", 1, "翻页速率") -global 编辑增强_TabSpeed := CLX_Config("EditEnhance", "TabSpeed", 1, "Tab速率") +global CLX_HJKL_Scroll := CLX_Config("TMouse", "CLX_HJKL_Scroll", 0, t("使用IJKL滚轮移动滚轮,比RF多一个横轴。")) +global 编辑增强_SpeedRatioX := CLX_Config("EditEnhance", "SpeedRatioX", 1, t("HJKL光标加速度比率, 默认为 1, 你想慢点就改成 0.5 之类")) +global 编辑增强_SpeedRatioY := CLX_Config("EditEnhance", "SpeedRatioY", 1, t("HJKL光标加速度比率, 默认为 1, 你想慢点就改成 0.5 之类")) +global 编辑增强_PageSpeed := CLX_Config("EditEnhance", "PageSpeed", 1, t("U:PageDown I:PageUP 翻页速率")) +global 编辑增强_TabSpeed := CLX_Config("EditEnhance", "TabSpeed", 1, t("Tab速率")) global 方向键模拟 := new AccModel2D(Func("方向键模拟"), 0.1, 编辑增强_SpeedRatioX * 15, 编辑增强_SpeedRatioY * 15) global 翻页键模拟 := new AccModel2D(Func("翻页键模拟"), 0.1, 20 * 编辑增强_PageSpeed) global Tab键模拟 := new AccModel2D(Func("Tab键模拟"), 0.1, 15 * 编辑增强_TabSpeed) diff --git a/Modules/CLX-LaptopKeyboardFix.ahk b/Modules/CLX-LaptopKeyboardFix.ahk index d185e22..c61dab7 100644 --- a/Modules/CLX-LaptopKeyboardFix.ahk +++ b/Modules/CLX-LaptopKeyboardFix.ahk @@ -10,7 +10,7 @@ if !CapsLockX ExitApp -global WinKeySimulate := CLX_Config("LKF", "WinKeySimulate", 1, "右手 \][ 模拟Windows键和 Alt + Tab, 具体用法参见LaptopKeyboardFix 模块说明,默认启用") +global WinKeySimulate := CLX_Config("LKF", "WinKeySimulate", 1, t("右手 \][ 模拟Windows键和 Alt + Tab, 具体用法参见LaptopKeyboardFix 模块说明,默认启用")) global FLAG_SWAP_ESC_STROKE := false CLX_AppendHelp( CLX_LoadHelpFrom(CLX_THIS_MODULE_HELP_FILE_PATH)) diff --git a/Modules/CLX-MediaKeys.ahk b/Modules/CLX-MediaKeys.ahk index 7304af5..e8d5f85 100644 --- a/Modules/CLX-MediaKeys.ahk +++ b/Modules/CLX-MediaKeys.ahk @@ -1,5 +1,5 @@ if (!CapsLockX) { - MsgBox, % "本模块只在 CapsLockX 下工作" + MsgBox, % "本模块只在 CapsLockX 下工作 / This module is only for CapsLockX" ExitApp } CLX_AppendHelp( CLX_LoadHelpFrom(CLX_THIS_MODULE_HELP_FILE_PATH)) diff --git a/Modules/CLX-Mouse.ahk b/Modules/CLX-Mouse.ahk index 8afb6ad..5cd1dd2 100644 --- a/Modules/CLX-Mouse.ahk +++ b/Modules/CLX-Mouse.ahk @@ -13,28 +13,28 @@ #Include, Modules/AccModel/AccModel.ahk if (!CapsLockX) { - MsgBox, % "本模块只为 CapsLockX 工作" + MsgBox, % "本模块只在 CapsLockX 下工作 / This module is only for CapsLockX" ExitApp } -global TMouse_Disabled := CLX_Config("TMouse", "Disabled", 0, "禁用模拟鼠标模块") -global TMouse_SendInput := CLX_Config("TMouse", "SendInput", 1, "使用 SendInput 方法提高模拟鼠标点击、移动性能") -global TMouse_SendInputAPI := CLX_Config("TMouse", "SendInputAPI", 1, "使用 Windows API 强势提升模拟鼠标移动性能") -global TMouse_SendInputScroll := CLX_Config("TMouse", "TMouse_SendInputScroll", 0, "使用 Windows API 强势提升模拟鼠标滚轮性能(目前有bug不建议启用)") +global TMouse_Disabled := CLX_Config("TMouse", "Disabled", 0, t("禁用模拟鼠标模块")) +global TMouse_SendInput := CLX_Config("TMouse", "SendInput", 1,t( "使用 SendInput 方法提高模拟鼠标点击、移动性能")) +global TMouse_SendInputAPI := CLX_Config("TMouse", "SendInputAPI", 1,t( "使用 Windows API 强势提升模拟鼠标移动性能")) +global TMouse_SendInputScroll := CLX_Config("TMouse", "TMouse_SendInputScroll", 0,t( "使用 Windows API 强势提升模拟鼠标滚轮性能(目前有bug不建议启用)")) -global TMouse_StickyCursor := CLX_Config("TMouse", "StickyCursor", 1, "启用自动粘附各种按钮,编辑框") -global TMouse_StopAtScreenEdge := CLX_Config("TMouse", "StopAtScreenEdge", 1, "撞上屏幕边界后停止加速") +global TMouse_StickyCursor := CLX_Config("TMouse", "StickyCursor", 1,t( "启用自动粘附各种按钮,编辑框")) +global TMouse_StopAtScreenEdge := CLX_Config("TMouse", "StopAtScreenEdge", 1,t( "撞上屏幕边界后停止加速")) ; 根据屏幕 DPI 比率,自动计算,得出,如果数值不对,才需要纠正 -global TMouse_UseDPIRatio := CLX_Config("TMouse", "UseDPIRatio", 1, "是否根据屏幕 DPI 比率缩放鼠标速度") -global TMouse_MouseSpeedRatio := CLX_Config("TMouse", "MouseSpeedRatio", 1, "鼠标加速度比率, 默认为 1, 你想慢点就改成 0.5 之类") -global TMouse_WheelSpeedRatio := CLX_Config("TMouse", "WheelSpeedRatio", 1, "滚轮加速度比率, 默认为 1, 你想慢点就改成 0.5 之类") +global TMouse_UseDPIRatio := CLX_Config("TMouse", "UseDPIRatio", 1,t( "是否根据屏幕 DPI 比率缩放鼠标速度")) +global TMouse_MouseSpeedRatio := CLX_Config("TMouse", "MouseSpeedRatio", 1,t( "鼠标加速度比率, 默认为 1, 你想慢点就改成 0.5 之类")) +global TMouse_WheelSpeedRatio := CLX_Config("TMouse", "WheelSpeedRatio", 1,t( "滚轮加速度比率, 默认为 1, 你想慢点就改成 0.5 之类")) global TMouse_DPIRatio := TMouse_UseDPIRatio ? A_ScreenDPI / 96 : 1 -global CLX_HJKL_Scroll := CLX_Config("TMouse", "CLX_HJKL_Scroll", 0, "使用IJKL滚轮移动滚轮,比RF多一个横轴。") +global CLX_HJKL_Scroll := CLX_Config("TMouse", "CLX_HJKL_Scroll", 0,t( "使用IJKL滚轮移动滚轮,比RF多一个横轴。")) CLX_AppendHelp( CLX_LoadHelpFrom("Modules/01.1-插件-鼠标模拟.md" )) ; global debug_fps := new FPS_Debugger() -global 鼠标模拟 := new AccModel2D(Func("鼠标模拟"), 0.1, TMouse_DPIRatio * 120 * 2 * TMouse_MouseSpeedRatio) +global mouseSimulator := new AccModel2D(Func("mouseSimulator"), 0.1, TMouse_DPIRatio * 120 * 2 * TMouse_MouseSpeedRatio) global ScrollSimulator := new AccModel2D(Func("ScrollSimulator"), 0.1, TMouse_DPIRatio * 120 * 4 * TMouse_WheelSpeedRatio) global DragSimulator := new AccModel2D(Func("DragSimulator"), 0.1, TMouse_DPIRatidweo * 120 * 16 * TMouse_WheelSpeedRatio) global ZoomSimu := new AccModel2D(Func("ZoomSimu"), 0.1, TMouse_DPIRatio * 120 * 4 * TMouse_WheelSpeedRatio) @@ -81,10 +81,10 @@ Return #if CapsLockXMode ; 鼠标运动处理 -*a:: 鼠标模拟.左按("a") -*d:: 鼠标模拟.右按("d") -*w:: 鼠标模拟.上按("w") -*s:: 鼠标模拟.下按("s") +*a:: mouseSimulator.左按("a") +*d:: mouseSimulator.右按("d") +*w:: mouseSimulator.上按("w") +*s:: mouseSimulator.下按("s") #if CapsLockXMode @@ -214,20 +214,20 @@ SendInput_MouseMove(x, y) } -; void 鼠标模拟 -鼠标模拟(dx, dy, 状态){ +; void mouseSimulator +mouseSimulator(dx, dy, 状态){ if (!CapsLockXMode) { - 鼠标模拟.止动() + mouseSimulator.止动() return } if (状态 == "横中键") { ; TODO: better ScrollModeToggle() - 鼠标模拟.止动() + mouseSimulator.止动() return } if (状态 == "纵中键") { ; TODO: better ScrollModeToggle() - 鼠标模拟.止动() + mouseSimulator.止动() return } if (状态 != "移动") { @@ -249,13 +249,13 @@ SendInput_MouseMove(x, y) ; TODO: 撞到屏幕边角就停下来 ; if(TMouse_StopAtScreenEdge ) ; MouseGetPos, xb, yb - ; 鼠标模拟.横速 *= dx && xa == xb ? 0 : 1 - ; 鼠标模拟.纵速 *= dy && ya == yb ? 0 : 1 + ; mouseSimulator.横速 *= dx && xa == xb ? 0 : 1 + ; mouseSimulator.纵速 *= dy && ya == yb ? 0 : 1 ; 在各种按钮上减速,进出按钮时减速80% if (TMouse_StickyCursor && CursorShapeChangedQ()) { - 鼠标模拟.横速 *= 0.2 - 鼠标模拟.纵速 *= 0.2 + mouseSimulator.横速 *= 0.2 + mouseSimulator.纵速 *= 0.2 } } diff --git a/Modules/CLX-Reload.ahk b/Modules/CLX-Reload.ahk index 65b0218..0a50681 100644 --- a/Modules/CLX-Reload.ahk +++ b/Modules/CLX-Reload.ahk @@ -37,11 +37,11 @@ CLX_FolderModified(Folder, Changes) { if (!Reload_DeveloperAsYouInstallMeByGitClone) { return } - MsgBox, 4, % t("CapsLockX 重载模块"), 检测到配置更改,是否软重载? + MsgBox, 4, % t("CapsLockX 重载模块"), % t("检测到配置更改,是否软重载?") IfMsgBox Yes ; MsgBox, 4, CapsLockX 重载模块, 检测到配置更改,是否软重载? ; IfMsgBox Yes - TrayTip, CapsLockX 重载模块, 检测到配置更改,正在自动软重载。 + TrayTip, % t("CapsLockX 重载模块"), % t("检测到配置更改,正在自动软重载。") sleep 200 reload } @@ -58,7 +58,7 @@ CLX_FolderChanged(Folder, Changes) global T_AutoReloadOnConfigsChange := CLX_Config("Advanced", "T_AutoReloadOnConfigsChange", 0, "用户配置修改保存时自动重载") if (T_AutoReloadOnConfigsChange) { - TrayTip, CapsLockX 重载模块, 检测到配置更改,正在自动重载。 + TrayTip, % t("CapsLockX 重载模块"), % t("检测到配置更改,正在自动重载。") sleep 200 ; CLX_Reload() reload @@ -67,7 +67,7 @@ CLX_FolderChanged(Folder, Changes) if (!Reload_DeveloperAsYouInstallMeByGitClone) { return } - MsgBox, 4, CapsLockX 重载模块, 检测到配置更改,是否重载? + MsgBox, 4, % t("CapsLockX 重载模块"), % t("检测到配置更改,是否重载?") IfMsgBox Yes Reload ; CLX_Reload() diff --git a/Modules/CLX-Settings.ahk b/Modules/CLX-Settings.ahk index 0516b23..9dac36b 100644 --- a/Modules/CLX-Settings.ahk +++ b/Modules/CLX-Settings.ahk @@ -39,10 +39,9 @@ CLX_ConfigWindow() Gui, Add, Text, , % t("当前 CLX_ConfigDir:") . CLX_ConfigDir Gui, Add, Text, , % t("CLX脚本交流群: QQ群 100949388 、 Telegram 群 https://t.me/capslockx 、微信群: 添加 @snomiao 拉你") Gui, Add, Text, , % t("CapsLockX 版本: ") . CLX_VersionName - Gui, Add, Text, , % t("Current Language") . ": " . CLX_Lang Gui, Add, Text, , % t("作者: 雪星 ( Snowstar Miao )") Gui, Add, Button, Default w120 gButton确认, % t("确定") - Gui, Add, Button, w120 gButtonLanguageSwitch, % t("切换語言") + Gui, Add, Button, w120 gButtonLanguageSwitch, % t("切换語言") . "`n" . t("Current Language") . ": " . CLX_Lang Gui, Add, Button, w120 gButton打开BUG反馈与建议页面, % t("打开BUG反馈与建议页面") Gui, Add, Button, w120 gButton打开官方文档, % t("打开官方文档") Gui, Add, Button, w120 gButton添加开机自动启动, % t("添加开机自动启动") @@ -110,11 +109,11 @@ CLX_ConfigureUpdate: reloadFlag := reloadFlag || ( CLX_ConfigGet("Core", "T_XKeyAsSpace", T_XKeyAsSpace) != T_XKeyAsSpace ) reloadFlagAdmin := 0 reloadFlagAdmin := reloadFlagAdmin || ( CLX_ConfigGet("Core", "T_AskRunAsAdmin", T_AskRunAsAdmin) != T_AskRunAsAdmin ) - CLX_ConfigSet("TomatoLife", "Enable", T_TomatoLife, "使用番茄时钟(默认禁用,改为 1 开启)") - CLX_ConfigSet("Core", "T_XKeyAsCapsLock", T_XKeyAsCapsLock, "使用 Space 作为引导键(默认启用,用户启用)") - CLX_ConfigSet("Core", "T_XKeyAsSpace", T_XKeyAsSpace, "使用 CapsLock 作为引导键(默认启用,用户启用)") - CLX_ConfigSet("Core", "T_AskRunAsAdmin", T_AskRunAsAdmin, "请求管理员权限(权限受限时,鼠标模拟等功能无法正常运行,如果不需要管理权限下的功能,可以改为0)") - CLX_ConfigSet("Core", "CLX_CONFIG_ONSTARTUP", CLX_CONFIG_ONSTARTUP, "启动时显示配置窗口") + CLX_ConfigSet("TomatoLife", "Enable", T_TomatoLife, t("使用番茄时钟(默认禁用,改为 1 开启)")) + CLX_ConfigSet("Core", "T_XKeyAsCapsLock", T_XKeyAsCapsLock, t("使用 Space 作为引导键(默认启用,用户启用)")) + CLX_ConfigSet("Core", "T_XKeyAsSpace", T_XKeyAsSpace, t("使用 CapsLock 作为引导键(默认启用,用户启用)")) + CLX_ConfigSet("Core", "T_AskRunAsAdmin", T_AskRunAsAdmin, t("请求管理员权限(权限受限时,鼠标模拟等功能无法正常运行,如果不需要管理权限下的功能,可以改为0)")) + CLX_ConfigSet("Core", "CLX_CONFIG_ONSTARTUP", CLX_CONFIG_ONSTARTUP, t("启动时显示配置窗口")) if (reloadFlag) { reload } @@ -128,16 +127,23 @@ Button确认: gui, destroy return ButtonLanguageSwitch: - InputBox, targetLang, % t("Change Language of CapsLockX"), % t("Please input target Language: "),,,,,,,,% CLX_Lang - ; InputBox, OutputVar [, Title, Prompt, HIDE, Width, Height, X, Y, Locale, Timeout, Default - ; targetLang - i18n_changeLanguage(targetLang) - Reload + CLX_LanguageSwitch() return Button配置文件编辑: CLX_ConfigureEdit() Return +CLX_LanguageSwitch(){ + ; msg := t("输入你使用的语言,支持所有语言,比如:zh,ja,en,fr,es,ar...") + msg := t("Enter the language you are using, for example: zh,ja,en,fr,es,ar...") + InputBox, targetLang, % t("Change Language of CapsLockX"), % msg ,,,,,,,,% CLX_Lang + ; InputBox, OutputVar [, Title, Prompt, HIDE, Width, Height, X, Y, Locale, Timeout, Default + ; targetLang + if (targetLang){ + i18n_changeLanguage(targetLang) + Reload + } +} CLX_首次使用教学(){ ; TODO } diff --git a/Modules/CLX-Userscripts.ahk b/Modules/CLX-Userscripts.ahk index ea9307b..b8c206e 100644 --- a/Modules/CLX-Userscripts.ahk +++ b/Modules/CLX-Userscripts.ahk @@ -14,7 +14,7 @@ if (!CapsLockX) { } ; Func("CLX_AppendHelp").Call(Func("CLX_LoadHelpFrom").Call(CLX_THIS_MODULE_HELP_FILE_PATH)) -global 快速窗口热键编辑用户模块目录 := CLX_ConfigDir "/" +global 快速窗口热键编辑用户模块目录 := CLX_ConfigDir . "\" global 快速窗口热键编辑初始内容 := " ( ; ========== CapsLockX ========== @@ -54,12 +54,12 @@ UserModuleEdit(dir, filename := "") WinGet, 进程名, ProcessName, ahk_id %hWnd% filename := filename || "/应用-" 进程名 ".user.ahk" - path := dir "/" filename + path := dir . "/" . filename WinGetTitle, title, ahk_id %hWnd% match = %title% ahk_class %窗口类名% ahk_exe %进程名% - MsgBox 开始编辑用户脚本: %path% + MsgBox % t("开始编辑用户脚本:") . %path% if (!FileExist(path)) { FileAppend, %快速窗口热键编辑初始内容%, %path% } diff --git a/Modules/CLX-WindowManager.ahk b/Modules/CLX-WindowManager.ahk index c9a4579..3817841 100644 --- a/Modules/CLX-WindowManager.ahk +++ b/Modules/CLX-WindowManager.ahk @@ -36,7 +36,7 @@ global ARRANGE_Z_ORDERING := 0x20 global lastFlashWinIDs := [] global 最迟闪动窗口 := {} ; global 窗口鼠标位置表表 := {} -global T窗口增强_鼠标位置记忆 := CLX_Config("窗口增强", "鼠标位置记忆尝试", 1, "在CLX+Z窗口切换时记住还原鼠标在每个窗口中的位置") +global T窗口增强_鼠标位置记忆 := CLX_Config("WindowsManageEnhance", "RemenberMousePos", 1, t("在CLX+Z窗口切换时记住还原鼠标在每个窗口中的位置")) 闪动窗口记录器初始化() diff --git a/Modules/TomatoLife.ahk b/Modules/TomatoLife.ahk index e8083c0..7f51e6b 100644 --- a/Modules/TomatoLife.ahk +++ b/Modules/TomatoLife.ahk @@ -7,10 +7,10 @@ ; 版本:v2021.03.26 ; ========== CapsLockX ========== -global T_TomatoLife := CLX_Config("TomatoLife", "Enable", 0, "使用番茄时钟(默认禁用,改为 1 开启)") -global T_TomatoLife_NoticeOnLaunch := CLX_Config("TomatoLife", "NoticeOnLaunch", 1, "启动时报告番茄状态") -global T_TomatoLife_UseTomatoLifeSound := CLX_Config("TomatoLife", "UseTomatoLifeSound", 1, "使用番茄报时(00分和30分播放工作铃声,每小时的25分和55分播放休息铃声)(需要先开启番茄时钟)") -global T_TomatoLife_UseTomatoLifeSwitchVirtualDesktop := CLX_Config("TomatoLife", "UseTomatoLifeSwitchVirtualDesktop", 1, "使用番茄报时时,自动切换桌面(休息为桌面1,工作为桌面2)") +global T_TomatoLife := CLX_Config("TomatoLife", "Enable", 0, t("使用番茄时钟(默认禁用,改为 1 开启)")) +global T_TomatoLife_NoticeOnLaunch := CLX_Config("TomatoLife", "NoticeOnLaunch", 1, t("启动时报告番茄状态")) +global T_TomatoLife_UseTomatoLifeSound := CLX_Config("TomatoLife", "UseTomatoLifeSound", 1, t("使用番茄报时(00分和30分播放工作铃声,每小时的25分和55分播放休息铃声)(需要先开启番茄时钟)")) +global T_TomatoLife_UseTomatoLifeSwitchVirtualDesktop := CLX_Config("TomatoLife", "UseTomatoLifeSwitchVirtualDesktop", 1, t("使用番茄报时时,自动切换桌面(休息为桌面1,工作为桌面2)")) if (T_TomatoLife) { 高精度时间配置() @@ -26,7 +26,7 @@ Return ; IfMsgBox, Cancel ; return - global T_TomatoLife_UsingHighPerformanceTime := CLX_Config("TomatoLife", "T_UsingHighPerformanceTime", "0", "已经配置过高精度时间的Flag") + global T_TomatoLife_UsingHighPerformanceTime := CLX_Config("TomatoLife", "T_UsingHighPerformanceTime", "0", t("已经配置过高精度时间的Flag")) if (T_TomatoLife_UsingHighPerformanceTime) return ToolTip, 番茄时钟开启,正在为您配置系统高精度时间 @@ -84,7 +84,7 @@ Return ; 状态动作 if ("工作时间" == 番茄状态) { - TrayTip 番茄时钟:%番茄状态%, 工作时间到啦! + TrayTip % t("番茄时钟:") . %番茄状态%, % t("工作时间到啦!") SoundPlay % "Data/NoteC_G.mp3" ; 升调 ; sleep 10000 ; 暂缓10秒切工作桌面 if (T_TomatoLife_UseTomatoLifeSwitchVirtualDesktop && !tomatoLaunchFlag) { @@ -92,7 +92,7 @@ Return } } if ("休息时间" == 番茄状态) { - TrayTip 番茄时钟:%番茄状态%, 起来运动一下收拾收拾东西! + TrayTip % t("番茄时钟:") . %番茄状态%, % t("起来运动一下收拾收拾东西!") SoundPlay % "Data/NoteG_C.mp3" ; 降调 sleep 10000 ; 暂缓10秒切休息桌面 if(T_TomatoLife_UseTomatoLifeSwitchVirtualDesktop && !tomatoLaunchFlag) { diff --git a/Modules/TurnOffScreenWhenLock.ahk b/Modules/TurnOffScreenWhenLock.ahk index 58f0dc5..52732da 100644 --- a/Modules/TurnOffScreenWhenLock.ahk +++ b/Modules/TurnOffScreenWhenLock.ahk @@ -1,5 +1,9 @@ Return +global TurnOffScreenWhenLock := CLX_Config("TurnOffScreenWhenLock", "TurnOffScreenWhenLock", "1", t("按 Win + L 锁定电脑时,立即关闭屏幕")) ; + +#if TurnOffScreenWhenLock + ; Run rundll32.exe user32.dll LockWorkStation, , Hide ; cmdScreenOff := "cmd /c start """" powershell (Add-Type '[DllImport(\""user32.dll\"")]^public static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);' -Name a -Pas)::SendMessage(-1, 0x0112, 0xF170, 2)" ; SendMessage, 0x112, 0xF170, 2, , Program Manager From 5bb72c183499606d13ee31713464fba2dc2fd751 Mon Sep 17 00:00:00 2001 From: snomiao Date: Sun, 12 May 2024 22:43:54 +0900 Subject: [PATCH 06/15] fix(capslockx): cfg dir cfg dir --- Core/CapsLockX-i18n.ahk | 53 ++++++++++++++++++++----- Core/CapslockX-Config.ahk | 7 ++-- Core/lang-en.ini | 2 - Core/lang.ini | Bin 0 -> 23298 bytes Modules/CLX-Settings.ahk | 7 ++-- Tools/DeprecatedModules/CLX-Cursor.ahk | 53 +++++++++++++++++++++++++ 6 files changed, 103 insertions(+), 19 deletions(-) delete mode 100644 Core/lang-en.ini create mode 100644 Core/lang.ini create mode 100644 Tools/DeprecatedModules/CLX-Cursor.ahk diff --git a/Core/CapsLockX-i18n.ahk b/Core/CapsLockX-i18n.ahk index f2898ef..a727559 100644 --- a/Core/CapsLockX-i18n.ahk +++ b/Core/CapsLockX-i18n.ahk @@ -1,6 +1,9 @@ ; - [Language Codes \| AutoHotkey v1]( https://www.autohotkey.com/docs/v1/misc/Languages.htm ) global CLX_Lang := CLX_Config("Core", "Language", "auto", "语言切换") +global CLX_i18nConfigPath := "Core/lang.ini" + +清洗为_UTF16_WITH_BOM_型编码(CLX_i18nConfigPath) ; Hans LCID_7804 := "Chinese" ; zh @@ -25,8 +28,13 @@ t(s) ; for dev, autotranslate ; run node "prompts/translate-en.md" - lang := "en" - if ( CLX_Lang == "auto" ) { + + lang := CLX_Lang + if (!lang) { + lang:="auto" + } + if ( lang == "auto" ) { + lang := "en" if (A_Language == "7804") { lang := "zh" } @@ -58,25 +66,34 @@ t(s) lang := "ja" } } - clx_i18n_TranslateByAsync(lang, key) - return CLX_ConfigGet("lang-" lang, key, key) + return i18n_translated(lang, key) } -clx_i18n_TranslateByAsync(lang, key){ - translated := CLX_ConfigGet("lang-" lang, key, "") + +i18n_translated(lang, key){ + ; user translation + translated := CLX_ConfigGet("lang-" . lang, key, "") if (translated) { - return + return translated + } + ; system + translated := CLX_i18n_ConfigGet("lang-" . lang, key, "") + if (translated) { + return translated } - question := key . "`n`nTranslate to " . lang - ; TrayTip, % "CapsLockX i18n [" . lang "]", % key "-->" lang, + question := key . "`n`nTranslate to " . lang global brainstorm_origin - endpoint := brainstorm_origin "/ai/chat?ret=text" + if (!brainstorm_origin){ + brainstorm_origin := CLX_Config("BrainStorm", "Website", "https://brainstorm.snomiao.com") + } + endpoint := brainstorm_origin . "/ai/chat?ret=text" xhr := ComObjCreate("Msxml2.XMLHTTP") xhr.Open("POST", endpoint) xhr.setRequestHeader("Authorization", "Bearer " . brainstormApiKey) xhr.onreadystatechange := Func("brainstorm_translatePostResult").Bind(lang, key, xhr) xhr.Send(question) + return "…[" . key . "]" } brainstorm_translatePostResult(lang, key, xhr){ if (xhr.readyState != 4) @@ -101,5 +118,19 @@ brainstorm_translatePostResult(lang, key, xhr){ i18n_changeLanguage(lang := "auto") { CLX_Lang := lang + if (!lang) { + lang:="auto" + } CLX_ConfigSet("Core", "Language", lang) -} \ No newline at end of file +} +CLX_i18n_ConfigGet(field, varName, defaultValue) +{ + global CLX_ConfigChangedTickCount + CLX_ConfigChangedTickCount := A_TickCount + global CLX_i18nConfigPath + IniRead, content, %CLX_i18nConfigPath%, %field%, %varName%, %defaultValue% + if (content == "ERROR") { + return "" + } + return content +} diff --git a/Core/CapslockX-Config.ahk b/Core/CapslockX-Config.ahk index a903970..30104b6 100644 --- a/Core/CapslockX-Config.ahk +++ b/Core/CapslockX-Config.ahk @@ -1,9 +1,9 @@ ; 保存为 save with UTF8 with DOM ; 用户创建目录 -ConfigDir_Portable := "./User" +ConfigDir_Portable := "./User" ConfigDir_UserProfile := USERPROFILE . "/.CapsLockX" -ConfigDir_AppData := APPDATA . "/CapsLockX" +ConfigDir_AppData := APPDATA . "/CapsLockX" ; 默认值 LaunchConfigDir := ConfigDir_AppData @@ -34,6 +34,7 @@ CLX_ConfigChangedTickCount := A_TickCount ; msgbox 清洗为_UTF16_WITH_BOM_型编码2 CLX_Config("_NOTICE_", "ENCODING_USING", "UTF16_LE", "") + ; 基本设定 ; [Core] global T_XKeyAsSpace := CLX_Config("Core", "T_XKeyAsSpace", 1, ("使用 Space 作为引导键(默认启用,游戏玩家可在 .user.ignore.txt 里配置忽略游戏窗口)")) @@ -73,7 +74,7 @@ CLX_ConfigSet(field, varName, setValue, comment := "") if (comment) { ; IniDelete, %CLX_ConfigPath%, %field%, %varName%#注释 ; IniWrite, %comment%, %CLX_ConfigPath%, %field%, %varName%#注释 - IniSave( comment, CLX_ConfigPath, field, varName . "#注释" ) + IniSave( comment, CLX_ConfigPath, field, varName . "#" ) } ; IniDelete, %CLX_ConfigPath%, %field%, %varName% ; IniWrite, %content%, %CLX_ConfigPath%, %field%, %varName% diff --git a/Core/lang-en.ini b/Core/lang-en.ini deleted file mode 100644 index f47000f..0000000 --- a/Core/lang-en.ini +++ /dev/null @@ -1,2 +0,0 @@ -[lang-en] - diff --git a/Core/lang.ini b/Core/lang.ini new file mode 100644 index 0000000000000000000000000000000000000000..68c7a36381a168175a69b6774017c5acc82e9901 GIT binary patch literal 23298 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 )") Gui, Add, Button, Default w120 gButton确认, % t("确定") - Gui, Add, Button, w120 gButtonLanguageSwitch, % t("切换語言") . "`n" . t("Current Language") . ": " . CLX_Lang + Gui, Add, Button, w120 gButtonLanguageSwitch, % t("'切换語言'") . "`n" . t("'Current Language'") . ": " . CLX_Lang Gui, Add, Button, w120 gButton打开BUG反馈与建议页面, % t("打开BUG反馈与建议页面") Gui, Add, Button, w120 gButton打开官方文档, % t("打开官方文档") Gui, Add, Button, w120 gButton添加开机自动启动, % t("添加开机自动启动") diff --git a/Tools/DeprecatedModules/CLX-Cursor.ahk b/Tools/DeprecatedModules/CLX-Cursor.ahk new file mode 100644 index 0000000..9dc67cf --- /dev/null +++ b/Tools/DeprecatedModules/CLX-Cursor.ahk @@ -0,0 +1,53 @@ +; +; 模块:在增强模式下,用另一套鼠标指针 +; 贡献者: @冰封 QQ: 124702759 +; +;鼠标特征值 +Return + +SetCursor(code, curFile) +{ + ;加载CapsLock增强的标指针 + hIcon := DllCall("LoadCursorFromFile", "Str", curFile) + DllCall("SetSystemCursor", "UInt", hIcon, "Int", code) +} + +UpdateCapsCursor(s) +{ + if (!s) { + ;恢复默认指针 + SPI_SETCURSORS := 0x57 + DllCall( "SystemParametersInfo", "UInt", SPI_SETCURSORS, "UInt", 0, "UInt", 0, "UInt", 0) + Return + } + + PATH_CURSOR := "数据/cursor" + ; OCR_APPSTARTING := 32650 + SetCursor(32650, PATH_CURSOR "/APPSTARTING.cur") ;AppStarting.cur") + ; OCR_NORMAL := 32512 + SetCursor(32512, PATH_CURSOR "/NORMAL.cur") ;正常选择.cur") + ; OCR_CROSS := 32515 + SetCursor(32515, PATH_CURSOR "/CROSS.cur") ;精确选择.cur") + ; OCR_HAND := 32649 + SetCursor(32649, PATH_CURSOR "/HAND.cur") ;链接选择.cur") + ; OCR_HELP := 32651 + SetCursor(32651, PATH_CURSOR "/HELP.cur") ;帮助选择.cur") + ; OCR_IBEAM := 32513 + SetCursor(32513, PATH_CURSOR "/IBEAM.cur") ;文本选择.cur") + ; OCR_NO := 32648 + SetCursor(32648, PATH_CURSOR "/NO.cur") ;不可用.cur") + ; OCR_SIZEALL := 32646 + SetCursor(32646, PATH_CURSOR "/SIZEALL.cur") ;移动.cur") + ; OCR_SIZENESW := 32643 + SetCursor(32643, PATH_CURSOR "/SIZENESW.cur") ;沿对角线调整大小2.cur") + ; OCR_SIZENS := 32645 + SetCursor(32645, PATH_CURSOR "/SIZENS.cur") ;垂直调整大小.cur") + ; OCR_SIZENWSE := 32642 + SetCursor(32642, PATH_CURSOR "/SIZENWSE.cur") ;沿对角线调整大小1.cur") + ; OCR_SIZEWE := 32644 + SetCursor(32644, PATH_CURSOR "/SIZEWE.cur") ;水平调整大小.cur") + ; OCR_UP := 32516 + SetCursor(32516, PATH_CURSOR "/UP.cur") ;候选.cur") + ; OCR_WAIT := 32514 + SetCursor(32514, PATH_CURSOR "/WAIT.cur") ;忙.cur") +} \ No newline at end of file From c70b8919ab38f4951b26263cef3b19175f618ea4 Mon Sep 17 00:00:00 2001 From: snomiao Date: Sun, 12 May 2024 22:53:49 +0900 Subject: [PATCH 07/15] fix(capslockx): tr error tr error --- Core/lang.ini | Bin 23298 -> 76416 bytes Modules/App-OneNote2019.ahk | 14 +++++++------- Modules/CLX-NodeEval.ahk | 6 +++--- Modules/CLX-Settings.ahk | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Core/lang.ini b/Core/lang.ini index 68c7a36381a168175a69b6774017c5acc82e9901..f68aacfee731e17dd9d341f234c72ce5d38b6e1e 100644 GIT binary patch literal 76416 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 YZLzIYc+BFqJdXz>`z;Ud(1P**KQHNdZ~y=R delta 9 QcmZp;%F?uraRXB{02EpSpa1{> diff --git a/Modules/App-OneNote2019.ahk b/Modules/App-OneNote2019.ahk index 1fc743c..ee0ef65 100644 --- a/Modules/App-OneNote2019.ahk +++ b/Modules/App-OneNote2019.ahk @@ -93,7 +93,7 @@ OneNote快速笔记窗口启动(){ if (ErrorLevel) { WinWait %OneNote窗口匹配串%, , 5 ; wait seconds if (ErrorLevel) { - TrayTip, 错误, 未找到OneNote窗口 + TrayTip, % t("错误"), % t("未找到OneNote窗口") return } WinActivate %OneNote窗口匹配串% @@ -121,7 +121,7 @@ OneNote2019搜索启动() { ; WinWaitNotActive ahk_class NUIDialog ahk_exe ONENOTE.EXE, , 2 WinWaitActive %OneNote窗口匹配串%, , 5 ; wait for 5 seconds if(ErrorLevel) { - TrayTip, 错误, 未找到OneNote窗口 + TrayTip, % t("错误"), % t("未找到OneNote窗口") return } if (条数 >= 1) { @@ -134,7 +134,7 @@ OneNote2019搜索启动() { 笔记条目搜索结果复制整理条数(){ WinWaitActive ahk_class NUIDialog ahk_exe ONENOTE.EXE, , 2 if(ErrorLevel) { - TrayTip, 错误, 搜索结果窗口不正确 + TrayTip, % t("错误"), % t("搜索结果窗口不正确") return 0 } ; 标题 ClassNN: RICHEDIT60W3 @@ -455,10 +455,10 @@ OneNote2019_ToggleTODO(){ SendEvent ^a^c ClipWait, 1 if(ErrorLevel) { - TrayTip, 错误, OneNote 内容未能复制成功,5秒内按 Ctrl + C 可手动复制并尝试继续流程 + TrayTip, % t("错误"), % t("OneNote 内容未能复制成功,5秒内按 Ctrl + C 可手动复制并尝试继续流程") ClipWait, 5 if(ErrorLevel) { - TrayTip, 错误, OneNote 内容未能复制成功 + TrayTip, % t("错误"), % t("OneNote 内容未能复制成功") return } } @@ -470,13 +470,13 @@ OneNote2019_ToggleTODO(){ KeyWait, Alt, D T60 ; wait for 60 seconds if(ErrorLevel) { ToolTip - TrayTip, 错误, 超时未按下Alt键 + TrayTip, % t("错误"), % t("超时未按下Alt键") return } KeyWait, Alt, T60 ; wait for 60 seconds if(ErrorLevel) { ToolTip - TrayTip, 错误, 超时未放开Alt键 + TrayTip, % t("错误"), % t("超时未放开Alt键") return } ToolTip diff --git a/Modules/CLX-NodeEval.ahk b/Modules/CLX-NodeEval.ahk index ab5a919..657022d 100644 --- a/Modules/CLX-NodeEval.ahk +++ b/Modules/CLX-NodeEval.ahk @@ -130,7 +130,7 @@ EvalJavaScriptByNodeServer(code){ (res) => (res?.toString !== {}.toString && String(res)) || JSON.stringify(res)) - .catch((e) => (console.error("错误", e), e.toString())) + .catch((e) => (console.error("Error", e), e.toString())) .then((s) => (res.end(s), console.log("入:", code, "\n出:", s))); }); }) @@ -180,8 +180,8 @@ EvalJavaScriptByNodeStdIO(code){ realcode .= "}" "`n" ; 写入纯 UTF8 脚本文件 FileAppend %realcode%, %inputScriptPath%, UTF-8-RAW - if (!FileExist(inputScriptPath)){ - TrayTip 错误, % inputScriptPath "执行失败,未能写入脚本文件" + if (!FileExist(inputScriptPath)) { + TrayTip % t("错误"), % inputScriptPath t("执行失败,未能写入脚本文件") Return "err" } ; 执行 node 的指令 diff --git a/Modules/CLX-Settings.ahk b/Modules/CLX-Settings.ahk index 18a07b1..ce4b358 100644 --- a/Modules/CLX-Settings.ahk +++ b/Modules/CLX-Settings.ahk @@ -39,7 +39,7 @@ CLX_ConfigWindow() Gui, Add, Text, , % t("你可以按 'CapsLockX +, ' (CLX+逗号) 打开此窗口") Gui, Add, Text, , % t("当前配置目录:") . CLX_ConfigDir Gui, Add, Text, , % t("CLX脚本交流群: QQ群 100949388 、 Telegram 群 https://t.me/capslockx 、微信群: 添加 @snomiao 拉你") - Gui, Add, Text, , % t("CapsLockX 版本: ") . CLX_VersionName + Gui, Add, Text, , % "CapsLockX" . t("版本: ") . CLX_VersionName Gui, Add, Text, , % t("作者: 雪星 ( Snowstar Miao )") Gui, Add, Button, Default w120 gButton确认, % t("确定") Gui, Add, Button, w120 gButtonLanguageSwitch, % t("'切换語言'") . "`n" . t("'Current Language'") . ": " . CLX_Lang @@ -47,7 +47,7 @@ CLX_ConfigWindow() Gui, Add, Button, w120 gButton打开官方文档, % t("打开官方文档") Gui, Add, Button, w120 gButton添加开机自动启动, % t("添加开机自动启动") Gui, Add, Button, w120 gButton配置文件编辑, % t("配置文件编辑") - Gui, Add, Button, w120 gButton重新載入, % t("重新載入") + Gui, Add, Button, w120 gButton重新載入, % t("重新載入CapsLockX") global T_TomatoLife ; if (T_TomatoLife) { From 38335b96f8c4adaaae78960ace27177915a607bb Mon Sep 17 00:00:00 2001 From: snomiao Date: Mon, 13 May 2024 04:30:27 +0900 Subject: [PATCH 08/15] fix(capslockx): initial-langs initial-langs --- CapsLockX.ahk | 4 +-- Core/CapsLockX-i18n.ahk | 50 ++++++++++++++++++++++++---------- Core/lang.ini | Bin 76416 -> 58120 bytes Modules/App-AnkiEnhanced.ahk | 2 +- Modules/App-OneNote2019.ahk | 4 +-- Modules/CLX-Brainstorm.ahk | 6 ++-- Modules/CLX-NodeEval.ahk | 6 ++-- Modules/CLX-Pause.ahk | 8 +++--- Modules/CLX-RunOnLogin.ahk | 2 +- Modules/CLX-Settings.ahk | 2 +- Modules/CLX-WindowManager.ahk | 2 +- README.md | 4 +-- docs/README.zh-Hans.md | 4 +-- 13 files changed, 57 insertions(+), 37 deletions(-) diff --git a/CapsLockX.ahk b/CapsLockX.ahk index cce7f7c..41a032e 100644 --- a/CapsLockX.ahk +++ b/CapsLockX.ahk @@ -245,14 +245,14 @@ Return 全部帮助 := Trim(全部帮助, " `t`n") ; 生成 README 替换代码 - NeedleRegEx := "m)(\s*)()([\s\S]*)\r?\n(\s*)(\r?\n)" + NeedleRegEx := "m)(\s*)()([\s\S]*)\r?\n(\s*)(\r?\n)" Replacement := "$1$2`n" 全部帮助 "`n$4$5" targetREADME := RegExReplace(sourceREADME, NeedleRegEx, Replacement, Replaces) ; 检查 README 替换情况 if (!Replaces) { Run https://capslockx.snomiao.com/ - MsgBox % "加载模块帮助遇到错误。`n已为你打开 CapsLockX 主页,请手动更新 CapsLockX" + MsgBox % t("加载模块帮助遇到错误。") . "`n" . t("已为你打开 CapsLockX 主页,请手动更新 CapsLockX") MsgBox % targetREADME Return sourceREADME } diff --git a/Core/CapsLockX-i18n.ahk b/Core/CapsLockX-i18n.ahk index a727559..74bc7c5 100644 --- a/Core/CapsLockX-i18n.ahk +++ b/Core/CapsLockX-i18n.ahk @@ -2,7 +2,6 @@ global CLX_Lang := CLX_Config("Core", "Language", "auto", "语言切换") global CLX_i18nConfigPath := "Core/lang.ini" - 清洗为_UTF16_WITH_BOM_型编码(CLX_i18nConfigPath) ; Hans @@ -69,13 +68,14 @@ t(s) return i18n_translated(lang, key) } -i18n_translated(lang, key){ +i18n_translated(lang, key) +{ ; user translation - translated := CLX_ConfigGet("lang-" . lang, key, "") - if (translated) { - return translated - } - ; system + ; translated := CLX_ConfigGet("lang-" . lang, key, "") + ; if (translated) { + ; return translated + ; } + ; system translation translated := CLX_i18n_ConfigGet("lang-" . lang, key, "") if (translated) { return translated @@ -84,7 +84,7 @@ i18n_translated(lang, key){ question := key . "`n`nTranslate to " . lang global brainstorm_origin - if (!brainstorm_origin){ + if (!brainstorm_origin) { brainstorm_origin := CLX_Config("BrainStorm", "Website", "https://brainstorm.snomiao.com") } endpoint := brainstorm_origin . "/ai/chat?ret=text" @@ -95,7 +95,8 @@ i18n_translated(lang, key){ xhr.Send(question) return "…[" . key . "]" } -brainstorm_translatePostResult(lang, key, xhr){ +brainstorm_translatePostResult(lang, key, xhr) +{ if (xhr.readyState != 4) return if (xhr.status != 200) { @@ -111,8 +112,8 @@ brainstorm_translatePostResult(lang, key, xhr){ return } TrayTip, % "CapsLockX i18n [" . lang . "]", % key "=>" transcript, - - CLX_ConfigSet("lang-" lang, key, transcript) + CLX_i18n_ConfigSet("lang-" . lang, key, transcript) + ; CLX_ConfigSet("lang-" . lang, key, transcript) } i18n_changeLanguage(lang := "auto") @@ -127,10 +128,29 @@ CLX_i18n_ConfigGet(field, varName, defaultValue) { global CLX_ConfigChangedTickCount CLX_ConfigChangedTickCount := A_TickCount - global CLX_i18nConfigPath - IniRead, content, %CLX_i18nConfigPath%, %field%, %varName%, %defaultValue% + ; user locales + global CLX_ConfigDir + IniRead, content, % CLX_ConfigDir . "/" . field . ".ini", %field%, %varName%, %defaultValue% if (content == "ERROR") { - return "" + content := "" + } + if (content) { + return content } - return content + ; clx pre-installed locales + IniRead, content, % CLX_i18nConfigPath, %field%, %varName%, %defaultValue% + if (content == "ERROR") { + content := "" + } + if (content) { + return content + } +} +CLX_i18n_ConfigSet(field, varName, value) +{ + global CLX_ConfigChangedTickCount + CLX_ConfigChangedTickCount := A_TickCount + global CLX_ConfigDir + IniSave(value, CLX_ConfigDir . "/" . field . ".ini", field, varName) + ; 清洗为_UTF16_WITH_BOM_型编码(CLX_ConfigDir) } diff --git a/Core/lang.ini b/Core/lang.ini index f68aacfee731e17dd9d341f234c72ce5d38b6e1e..6db58a27185c6dc1c7d59f8254813c264de66a54 100644 GIT binary patch delta 1240 zcmZ8gOKgl$6h6Pl@rY?@XKEDn8?9eQO)~lz#v^K`qlTumh@=aenyJ#(^q=vlg^HCo zbrQ3X)H4zyrp%&YXCpRN9*G5!h=m1VCnV~-cSeiF{r`K;{mys3bI-ZQUrjpsbmB$# zNTS$?8`%k&xFM1EPDy+(dk~GABd?vtV?%ai3bJR1FOMB%J>IWw;kJ^1MU8e@bgS`V^4sG96I=Y5717ngcSC0l9?bJajItWiUnbMqb zm3t^ed#N4Kotn#}JsRJg_bKe+nQ>%!UHZToyv|3=IC^zoJkgk*vmC+aXlcI zVMTZbJW<$)mUDOJ$hx~_UM~>q5wjQwpT4>A)~V_VYdjLrKrlJ27OWwe;B?6EZ5#T|5Gr{qBG5YDjnUHzRtL;#9?>m zxEQ|{;{{n25>XIUHIp&CjF@JL z;4B7D2YRnqH^8!iRk67&DeSw|1m`_b>=N1JgJ%O$QKD|z{i2%H7<75?ia^u=}{tgt(I=Zc*}D0<3n34%#Lc=zjI@yua_7VGF<1({yO!g gJbk;wF!R=r@~rRSddJASMaB&ldzP8q`EZ`&H!CO_djJ3c delta 3636 zcmb7H3s98T6~2JN0xMv6ElA}DDXb4*0iRS*2sNUxyX+%?JooW02)L}f>_#vOCN$_m z1Ux8?rbwJl>SU%Jm6>K_GDg#B(uPEF6k{}_F>0sN+EkN{b!y`FoVzdzWisvT?Ed$^ z=iGD7{mygue&p9NF{e*9a@Y5;00UhXA3bEmg~M|F3n1ttekNx&*2D~~m2G8KR>uTf z3+xrv%!aaZqEu?Z zd)hfQjUD)UeLyK%D>5sj#zk{X&Lsv#lihd*_XU(FB6lN6g^J+#a+3TC%4p$tC7QtG z{9axZyxN~Th4>0AgIoLz)mgaU<1ML$x=F3|sG$zmsd$<&GvT`fzs-m{*|wE!nBV45(lo)NEY}PtS$~>bZ$15zd5`#}SB5+#xv>99HBu zqPb)ge0p|0Ji5FLk4YgeD><|Pw`Ul*<-ZM_Zq&1QB}@#cj8NT%E5gTwd$Svy#$edK z7LHfN!DD-vPYT?sj888_`^W(MB;b=_!(k^uWIxfZC|G3KaLMr#lNMEO;|lGVJ_1Ka zK!mn37xD-wsTtRF&cU+TJQl?6DT9^S%5jrQ|BI3{6*;VsrEqk~6E^&i6mMuy@HH_T z7-Ayf&;4O@x$EJfZ57xY5>THCg4*}|!%4cpUPMpQiu@?Tf|^B8eO`bMgJcowxYmDl zukIB~y2NF50j9f3C<;%83oVi?6Gw~i!d&KzWTFmt1@?2?t3v}Q>gv&Wfh96@FFdS> zgyo@XKXfkCghnr&%91HZFJ@`TNpdQ9WRjFr)_^*y;Fj;I5oyW;S^LupLl1KgxeqAB zlB1eZg+-xK)GG9f0!6Hcj&h{X+97wN;z@g!+bgb=-w|UJ)6c<*x!DFDy=1I6mdQ6& z{JaKNlpMM<14yotb(3|d28`Tb9#cSnn)zzxLtKGA2fz@b`dj6rk zr(7e38L1wp@yZ!xbd_9H?hx0iQRvC&l}(9kzAjklghUqWQKPMt=LH-+iW#B?&7kU; z8dZ(CRr(XP-_<^8KXtIv72nt8NVmk6&##Q`Rwx?C@OlY`o zzGM}SB{UT50_C+gqVAgoHr;br6#&BiurO9&mFTPrCiOVnid}N&MAMl2_u5kj1Af53!FqiQST@Cmud4ZangaA4JX{?u zv31k&Ko8i8nL*`G+$Gh~^?!F>tPYsNIyfX1R-w+UEHRiRz$cbsYb49X;oO(eI z-`vow2s@lQ=~by`x>q}0+ua$Jvw9VpzkF#kh0*izF}ozcUZa5|d1K@QcZ*0dG$TqN z{!b~;R1&c~5DP>prFvLm3-EJQqFTL0ptR`BjveQ+pvbKY;NERV4^_rehwn;}i&)GK{ps%Yz zMy{ldl%ukNo*Jp=Vq<6}-4N8bqvXpE*gKwW(OBZI>Cvs=&)=AH#rdk{TH=AHxAWJ! zoKqLdx5x&_GKw&=yQtncDDe>UsEyVc80Yt@DplUMOoo>n-;xyfZ58YyVBb()J975b z(H-wp=UV{tE~cT!4YB?Txa%7MCqouWD5E~>5A20MW+uiRZ&+qkXj0urD*kC%BT7B# zmSo+n{X~xUOg6W)1p*eST*NGeJ!x<54m0NMzH%g0*(Jt$c*_f=_C>SB7Sy*;bSk7+st`+R&5UqJx zpV0tM84DYwo-y~h>8Of|&Ypc_Yp3g&cC5S(Tcp%8-{@EO_qJionG?11>b}tUDoD=s zmX^cD+|=Su)ONbM#L|iYKk9SmYUTbeXED|X`0C_BIJCG3u3pTQbRRS~@-XfQ$b^pZ zHXjG%y_o{Sr59lMbSBhZ3W2+)W$=}+43taa@aqrb`>Vk&DGMRZ)*VN%agX9JjEl(; zq+rO+c#jIu7)`W>>($HQ)0Pb|^j=W=v}S=A$+2wyFUWdlTyJm2-hf{8PT_>HciNkE zU|^JsJYPwC7`P5oZ#wNu>B4^ZukdX&(Jx)3mV)Ge!b`_^} diff --git a/Modules/App-AnkiEnhanced.ahk b/Modules/App-AnkiEnhanced.ahk index 71781fc..ce2dcfb 100644 --- a/Modules/App-AnkiEnhanced.ahk +++ b/Modules/App-AnkiEnhanced.ahk @@ -112,7 +112,7 @@ AnkiImport() MsgBox, 剪贴板里没有内容 Return } - TrayTip, Anki导入, 获取到 %text% + TrayTip, % t("Anki导入"), % t("获取到") text ; 让 Anki 打开导入框 Send ^+i diff --git a/Modules/App-OneNote2019.ahk b/Modules/App-OneNote2019.ahk index ee0ef65..84d6b73 100644 --- a/Modules/App-OneNote2019.ahk +++ b/Modules/App-OneNote2019.ahk @@ -207,7 +207,7 @@ OneNote2019搜索启动() { wc.SetHTML(links_html) SendEvent {Escape} - TrayTip, %k% 条笔记链接已复制, %links%, 1 + TrayTip, % k . t("条笔记链接已复制"), %links%, 1 return k } @@ -548,7 +548,7 @@ OneNote剪贴板收集(){ ; ; 通常在弹起时触发 ClipWait, 2, 1 ; 2 secons if(ErrorLevel) { - TrayTip, error, 复制失败 + TrayTip, error, % t("复制失败") Return } WinGet, current, ID, A diff --git a/Modules/CLX-Brainstorm.ahk b/Modules/CLX-Brainstorm.ahk index 15e1374..31b9ce8 100644 --- a/Modules/CLX-Brainstorm.ahk +++ b/Modules/CLX-Brainstorm.ahk @@ -64,9 +64,9 @@ brainstorm() content:=brainstorm_copy() prompt := "" - prompt .= t("例1: 'Translate to english:'") . "`n" - prompt .= t("例2: '解釈这句話:'") . "`n" - prompt .= t("例3: '总结5点:'") . "`n" + prompt .= t("'例1:Translate to english:'") . "`n" + prompt .= t("'例2:解釈这句話:'") . "`n" + prompt .= t("'例3:总结5点:'") . "`n" prompt .= "--- " . t("以下为提問内容") . " ---`n" . content InputBox, cmd, % t("请輸入文本指令"), %prompt%, , 500, 600,,,,,% brainstormLastQuestion diff --git a/Modules/CLX-NodeEval.ahk b/Modules/CLX-NodeEval.ahk index 657022d..8f18848 100644 --- a/Modules/CLX-NodeEval.ahk +++ b/Modules/CLX-NodeEval.ahk @@ -89,7 +89,7 @@ EvalJavaScriptByNodeServer(code){ nodePID := 0 ; 不存在则尝试启动 if(!nodePID){ - TrayTip, EvalJS 模块, 正在启动 NodeJS 筆記服務... + TrayTip, % t("EvalJS 模块"), % t("正在启动 NodeJS 筆記服務...") EnvGet, USERPROFILE, USERPROFILE escaped_USERPROFILE := RegExReplace(USERPROFILE, "\\", "\\") ; 生成服务端代码 @@ -143,7 +143,7 @@ EvalJavaScriptByNodeServer(code){ Run, node --inspect "%serverScriptPath%", %USERPROFILE%, Hide, nodePID FileDelete, %EvalNodeJS_PIDFile% FileAppend, %nodePID%, %EvalNodeJS_PIDFile%, UTF-8-Raw - TrayTip, EvalJS 模块, NodeJS 服务已启动。 + TrayTip, % t("EvalJS 模块"), % t("NodeJS 服务已启动。") } ; 若没有代码需要执行则将进程退出 if(!code){ @@ -198,7 +198,7 @@ EvalJavaScriptByNodeStdIO(code){ stderr := exec.stderr.readall() stdout := exec.stdout.readall() out := stdout - if(stderr){ + if (stderr) { TrayTip Error, % stderr } ; msgbox % out diff --git a/Modules/CLX-Pause.ahk b/Modules/CLX-Pause.ahk index 13985fe..1fe388f 100644 --- a/Modules/CLX-Pause.ahk +++ b/Modules/CLX-Pause.ahk @@ -77,17 +77,17 @@ return ^!Home:: CLX_Paused := 0 if(CLX_Paused) { - TrayTip, 暂停, CapsLockX 已暂停 + TrayTip, % t("暂停"), % t("CapsLockX 已暂停") } else { - TrayTip, 暂停, CapsLockX 已恢复 + TrayTip, % t("暂停"), % t("CapsLockX 已恢复") } Return ^!End:: CLX_Paused := 1 if(CLX_Paused) { - TrayTip, 暂停, CapsLockX 已暂停 + TrayTip, % t("暂停"), % t("CapsLockX 已暂停") } else { - TrayTip, 暂停, CapsLockX 已恢复 + TrayTip, % t("暂停"), % t("CapsLockX 已恢复") } Return diff --git a/Modules/CLX-RunOnLogin.ahk b/Modules/CLX-RunOnLogin.ahk index e7661f0..9e75a30 100644 --- a/Modules/CLX-RunOnLogin.ahk +++ b/Modules/CLX-RunOnLogin.ahk @@ -18,5 +18,5 @@ CLX_MakeStartup() FileAppend, %content%, %startCMDPath% cmdView := "explorer /select, " """" startCMDPath """" run % cmdView - TrayTip 已在Startup文件夹添加CLX的开机自启动,请确认。 + TrayTip % t("已在Startup文件夹添加CLX的开机自启动,请确认。") } \ No newline at end of file diff --git a/Modules/CLX-Settings.ahk b/Modules/CLX-Settings.ahk index ce4b358..953cb62 100644 --- a/Modules/CLX-Settings.ahk +++ b/Modules/CLX-Settings.ahk @@ -39,7 +39,7 @@ CLX_ConfigWindow() Gui, Add, Text, , % t("你可以按 'CapsLockX +, ' (CLX+逗号) 打开此窗口") Gui, Add, Text, , % t("当前配置目录:") . CLX_ConfigDir Gui, Add, Text, , % t("CLX脚本交流群: QQ群 100949388 、 Telegram 群 https://t.me/capslockx 、微信群: 添加 @snomiao 拉你") - Gui, Add, Text, , % "CapsLockX" . t("版本: ") . CLX_VersionName + Gui, Add, Text, , % "CapsLockX " . t("'版本'") . ": " . CLX_VersionName Gui, Add, Text, , % t("作者: 雪星 ( Snowstar Miao )") Gui, Add, Button, Default w120 gButton确认, % t("确定") Gui, Add, Button, w120 gButtonLanguageSwitch, % t("'切换語言'") . "`n" . t("'Current Language'") . ": " . CLX_Lang diff --git a/Modules/CLX-WindowManager.ahk b/Modules/CLX-WindowManager.ahk index 3817841..582deb8 100644 --- a/Modules/CLX-WindowManager.ahk +++ b/Modules/CLX-WindowManager.ahk @@ -887,7 +887,7 @@ ShellMessage( wParam, lParam ) 鼠标位置记忆尝试() WinActivate, ahk_id %hWnd% WinGetTitle, this_title, ahk_id %hWnd% - TrayTip, 最近1分钟内闪动窗口激活, %this_title% + TrayTip, % t("最近1分钟内闪动窗口激活"), %this_title% 最迟闪动窗口 := {} 鼠标位置还原尝试() } else { diff --git a/README.md b/README.md index 76eafd6..919808a 100644 --- a/README.md +++ b/README.md @@ -209,7 +209,7 @@ TODO:FN 键、方向键、编辑操作、61 配列 vs 87 键配列、 - + ### 帮助模块 @@ -580,7 +580,7 @@ Anki 操作增强 按 Win + L 锁屏时,立即关闭屏幕,适用于准备睡觉的时候自动把电脑屏幕关掉,不让它在睡觉的时候刺眼…… - + ## 过去与未来 🛰 diff --git a/docs/README.zh-Hans.md b/docs/README.zh-Hans.md index 5cd0101..5758f75 100644 --- a/docs/README.zh-Hans.md +++ b/docs/README.zh-Hans.md @@ -208,7 +208,7 @@ TODO:FN 键、方向键、编辑操作、61 配列 vs 87 键配列、 - + ### 帮助模块 @@ -579,7 +579,7 @@ Anki 操作增强 按 Win + L 锁屏时,立即关闭屏幕,适用于准备睡觉的时候自动把电脑屏幕关掉,不让它在睡觉的时候刺眼…… - + ## 过去与未来 🛰 From 68b61e811404967b0bb58e377905e5f3094a42b9 Mon Sep 17 00:00:00 2001 From: snomiao Date: Mon, 13 May 2024 05:05:56 +0900 Subject: [PATCH 09/15] fix(capslockx): initial locales initial locales --- Core/CapsLockX-i18n.ahk | 2 +- Core/lang.ini | Bin 58120 -> 72548 bytes Modules/CLX-Settings.ahk | 18 ++++++++---------- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/Core/CapsLockX-i18n.ahk b/Core/CapsLockX-i18n.ahk index 74bc7c5..617dbef 100644 --- a/Core/CapsLockX-i18n.ahk +++ b/Core/CapsLockX-i18n.ahk @@ -81,7 +81,7 @@ i18n_translated(lang, key) return translated } - question := key . "`n`nTranslate to " . lang + question := key . "`n`nTry translate to " . lang global brainstorm_origin if (!brainstorm_origin) { diff --git a/Core/lang.ini b/Core/lang.ini index 6db58a27185c6dc1c7d59f8254813c264de66a54..4c30440aaeec97076579d9f6bfd4c650a1f301d0 100644 GIT binary patch delta 9493 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 S_b#yCExY>E&)&Ly!T$l1Sk*TG delta 194 zcmaE|jiuulv&jE{(F{2Zi41uR=?uCIsX#iGVX{Jm$mBgHZj(FYco@|ux4OwQsWVLe z5UDl!fIiD)EmM`rOiMagKx&Cn$qZCEnbA>la$L0B<_6O`h0QA>7cow*_`$bXAYvNh zX0K=~$;}O=_ZlZkC~WuOW0c_CzKfkvkC~S}C@Fbf7ekjigDry+$QhGg>1#|*kYn4< J$ITcf000{=K9&Fg diff --git a/Modules/CLX-Settings.ahk b/Modules/CLX-Settings.ahk index 953cb62..799a90b 100644 --- a/Modules/CLX-Settings.ahk +++ b/Modules/CLX-Settings.ahk @@ -18,7 +18,6 @@ Menu, Tray, Add, % t("Exit CapsLockX"), CLX_Exit if (CLX_CONFIG_ONSTARTUP) { SetTimer CLX_ConfigWindow, -1 } - return CLX_Exit() @@ -42,12 +41,12 @@ CLX_ConfigWindow() Gui, Add, Text, , % "CapsLockX " . t("'版本'") . ": " . CLX_VersionName Gui, Add, Text, , % t("作者: 雪星 ( Snowstar Miao )") Gui, Add, Button, Default w120 gButton确认, % t("确定") - Gui, Add, Button, w120 gButtonLanguageSwitch, % t("'切换語言'") . "`n" . t("'Current Language'") . ": " . CLX_Lang - Gui, Add, Button, w120 gButton打开BUG反馈与建议页面, % t("打开BUG反馈与建议页面") - Gui, Add, Button, w120 gButton打开官方文档, % t("打开官方文档") - Gui, Add, Button, w120 gButton添加开机自动启动, % t("添加开机自动启动") - Gui, Add, Button, w120 gButton配置文件编辑, % t("配置文件编辑") - Gui, Add, Button, w120 gButton重新載入, % t("重新載入CapsLockX") + Gui, Add, Button, w200 gButtonLanguageSwitch, % t("'切换語言'") . "`n" . t("'Current Language is: '") . " " . CLX_Lang + Gui, Add, Button, w200 gButton打开BUG反馈与建议页面, % t("打开BUG反馈与建议页面") + Gui, Add, Button, w200 gButton打开官方文档, % t("打开官方文档") + Gui, Add, Button, w200 gButton添加开机自动启动, % t("添加开机自动启动") + Gui, Add, Button, w200 gButton配置文件编辑, % t("配置文件编辑") + Gui, Add, Button, w200 gButton重新載入, % t("重新載入CapsLockX") global T_TomatoLife ; if (T_TomatoLife) { @@ -135,12 +134,11 @@ Button配置文件编辑: Return CLX_LanguageSwitch(){ - ; msg := t("输入你使用的语言,支持所有语言,比如:zh,ja,en,fr,es,ar...") - msg := t("Enter the language you are using, for example: zh,ja,en,fr,es,ar...") + msg := t("'Choose your language'") . "`n" . t("For example: zh,ja,en,fr,es,ar...'") InputBox, targetLang, % t("Change Language of CapsLockX"), % msg ,,,,,,,,% CLX_Lang ; InputBox, OutputVar [, Title, Prompt, HIDE, Width, Height, X, Y, Locale, Timeout, Default ; targetLang - if (targetLang){ + if (targetLang) { i18n_changeLanguage(targetLang) Reload } From bb7921651d076324641fa2a980c7650f5c4fce58 Mon Sep 17 00:00:00 2001 From: snomiao Date: Mon, 13 May 2024 05:08:42 +0900 Subject: [PATCH 10/15] fix(capslockx): lang codes lang codes --- Core/CapsLockX-i18n.ahk | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Core/CapsLockX-i18n.ahk b/Core/CapsLockX-i18n.ahk index 617dbef..3c6d335 100644 --- a/Core/CapsLockX-i18n.ahk +++ b/Core/CapsLockX-i18n.ahk @@ -1,10 +1,9 @@ -; - [Language Codes \| AutoHotkey v1]( https://www.autohotkey.com/docs/v1/misc/Languages.htm ) global CLX_Lang := CLX_Config("Core", "Language", "auto", "语言切换") global CLX_i18nConfigPath := "Core/lang.ini" 清洗为_UTF16_WITH_BOM_型编码(CLX_i18nConfigPath) -; Hans +; - [Language Codes \| AutoHotkey v1]( https://www.autohotkey.com/docs/v1/misc/Languages.htm ) LCID_7804 := "Chinese" ; zh LCID_0004 := "Chinese (Simplified)" ; zh-Hans LCID_0804 := "Chinese (Simplified, China)" ; zh-CN From 605254966310d0c0f57138a54383ca39ff8760c7 Mon Sep 17 00:00:00 2001 From: snomiao Date: Mon, 13 May 2024 11:17:32 +0900 Subject: [PATCH 11/15] fix(capslockx): xflymsg xflymsg --- CapsLockX.ahk | 86 +-- Core/CapsLockX-i18n.ahk | 39 +- Core/CapslockX-Config.ahk | 6 +- Modules/App-XunFeiSwitching.ahk | 11 +- Modules/App-XunFeiSwitching.md | 5 +- Modules/CLX-RunOnLogin.ahk | 2 +- Modules/SnoChordTyping.ahk | 2 +- README.md | 1037 ++++++++++++++----------------- docs/README.md | 439 +++++-------- docs/README.zh-Hans.md | 2 +- 10 files changed, 691 insertions(+), 938 deletions(-) diff --git a/CapsLockX.ahk b/CapsLockX.ahk index 41a032e..dfe094f 100644 --- a/CapsLockX.ahk +++ b/CapsLockX.ahk @@ -18,12 +18,12 @@ if (A_IsAdmin) { SetWorkingDir, %A_ScriptDir% #Include %A_ScriptDir%/Core/CapsLockX-Config.ahk - #Include %A_ScriptDir%/Core/CapsLockX-RunSilent.ahk +#Include %A_ScriptDir%/Core/CapsLockX-i18n.ahk -global CLX_模块路径 := "./Modules" +global CLX_ModuleDir := "./Modules" ; global CLX_用户模块路径 := CLX_ConfigDir "/Modules" -global CLX_核心路径 := "./Core" +global CLX_CoreDir := "./Core" ; 版本 global CLX_Version FileRead, CLX_Version, ./Core/version.txt @@ -35,21 +35,22 @@ global 显示加载提示 := 1 global loadingTips := "" ; 对 核心模块 进行 编码清洗 -清洗为_UTF8_WITH_BOM_型编码(CLX_核心路径 "/CapsLockX-Config.ahk") -清洗为_UTF8_WITH_BOM_型编码(CLX_核心路径 "/CapsLockX-Core.ahk") -清洗为_UTF8_WITH_BOM_型编码(CLX_核心路径 "/CapsLockX-RunSilent.ahk") -清洗为_UTF8_WITH_BOM_型编码(CLX_核心路径 "/CapsLockX-Update.ahk") +清洗为_UTF8_WITH_BOM_型编码(CLX_CoreDir "/CapsLockX-Config.ahk") +清洗为_UTF8_WITH_BOM_型编码(CLX_CoreDir "/CapsLockX-Core.ahk") +清洗为_UTF8_WITH_BOM_型编码(CLX_CoreDir "/CapsLockX-RunSilent.ahk") +清洗为_UTF8_WITH_BOM_型编码(CLX_CoreDir "/CapsLockX-Update.ahk") +清洗为_UTF8_WITH_BOM_型编码(CLX_CoreDir "/CapsLockX-i18n.ahk") ; 复制用户模块 ; TODO FIX:如果CLX已经开了的话,这一步会触发重启,这可能会导致一些文件冲突的BUG…… -FileDelete, %CLX_模块路径%/*.user.ahk -FileDelete, %CLX_模块路径%/*.user.md -FileCopy %CLX_ConfigDir%/*.user.ahk, %CLX_模块路径%/, 1 -FileCopy %CLX_ConfigDir%/*.user.md, %CLX_模块路径%/, 1 +FileDelete, %CLX_ModuleDir%/*.user.ahk +FileDelete, %CLX_ModuleDir%/*.user.md +FileCopy %CLX_ConfigDir%/*.user.ahk, %CLX_ModuleDir%/, 1 +FileCopy %CLX_ConfigDir%/*.user.md, %CLX_ModuleDir%/, 1 ; 模块加载器路径 -global CLX_ModulesRunner := CLX_核心路径 "/CapsLockX-ModulesRunner.ahk" -global CLX_ModulesFunctions := CLX_核心路径 "/CapsLockX-ModulesFunctions.ahk" +global CLX_ModulesRunner := "Core\CapsLockX-ModulesRunner.ahk" +global CLX_ModulesFunctions := "Core\CapsLockX-ModulesFunctions.ahk" ; LoadModules(CLX_ModulesRunner, CLX_ModulesFunctions) ; 判断安装方式 @@ -92,11 +93,11 @@ Return } ; 如果不一样,就再编译一次,并且显示加载提示 显示加载提示 := 1 - 加载提示追加("模块帮助有变更") + 加载提示追加(t("模块帮助有变更")) ; 然后进行稳定性检查 source := 模块编译和帮助README更新(target) if (target != source) { - MsgBox % "如果你看到了这个,请联系雪星(QQ:997596439),这里肯定有 BUG……(20200228)" + MsgBox % t("警告:模块帮助未能稳定更新,如果你看到了这个消息,请联系雪星(QQ:997596439, 邮箱: snomiao@gmail.com)") } ; 输出到 docs/readme.md (用于 github-pages ) ; docs_target := 模块编译和帮助README更新(source, 1) @@ -126,13 +127,13 @@ Return } 加载提示显示(){ ToolTip % loadingTips - sleep 2000 + sleep 1000 } -模块编译和帮助README更新(sourceREADME, docs=""){ +模块编译和帮助README更新(sourceREADME, lang="en"){ FileEncoding UTF-8-Raw ; 列出模块文件 ModuleFiles := "" - loop, Files, %CLX_模块路径%\*.ahk + loop, Files, %CLX_ModuleDir%\*.ahk { ; Do not Recurse into subfolders. 子文件夹由模块自己去include去加载 ModuleFiles .= A_LoopFileName "`n" @@ -159,50 +160,50 @@ Return 模块帮助内容 := "" 模块帮助文件 := "" if (!模块帮助内容) { - 模块帮助文件 := CLX_模块路径 "/" 模块名称 ".md" + 模块帮助文件 := CLX_ModuleDir "/" 模块名称 ".md" if (FileExist(模块帮助文件)) { FileRead, 模块帮助内容, %模块帮助文件% } } if (!模块帮助内容) { - 模块帮助文件 := CLX_模块路径 "/" 模块文件名称 ".md" + 模块帮助文件 := CLX_ModuleDir "/" 模块文件名称 ".md" if (FileExist(模块帮助文件)) { FileRead, 模块帮助内容, %模块帮助文件% } } ; 加载模块描述 - FileRead, 模块文件内容, % CLX_模块路径 "/" 模块文件 - matchPos := RegExMatch(模块文件内容, "mi)^; 描述:(.*)", 模块描述) + FileRead, 模块文件内容, % CLX_ModuleDir "/" 模块文件 T%模块名称%_Disabled := CLX_Config("ModuleDisable", "T" 模块名称 "_Disabled", 0, "是否禁用模块:" 模块名称 (模块描述1 ? " - " 模块描述1 : "") ) if (模块帮助内容) { 模块帮助内容 := Trim(模块帮助内容, " `t`n") - 加载提示追加("加载模块帮助:" + i + "-" + 模块名称) + 加载提示追加(t("加载模块帮助:") . i . "-" . 模块名称) - 全部帮助 .= "" "`n`n" + 全部帮助 .= "" "`n`n" ; 替换标题层级 模块帮助内容 := RegExReplace(模块帮助内容, "m)^#", "###") ; 替换资源链接的相对目录(图片gif等) - FileCopy, %CLX_模块路径%\*.gif, .\docs\media\, 1 - FileCopy, %CLX_模块路径%\*.png, .\docs\media\, 1 + FileCopy, %CLX_ModuleDir%\*.gif, .\docs\media\, 1 + FileCopy, %CLX_ModuleDir%\*.png, .\docs\media\, 1 模块帮助内容 := RegExReplace(模块帮助内容, "m)\[(.*)\]\(\s*?\.\/(.*?)\)", "[$1](./media/$2)") ; 没有标题的,给自动加标题 if (!RegExMatch(模块帮助内容, "^#")) { if (T%模块名称%_Disabled) { - 全部帮助 .= "### " 模块名称 "模块(禁用)" "`n" + 模块帮助内容 .= "### " 模块名称 "模块(禁用)" "`n" } else { - 全部帮助 .= "### " 模块名称 "模块" "`n" + 模块帮助内容 .= "### " 模块名称 "模块" "`n" } } - 全部帮助 .= 模块帮助内容 "`n`n" + + 全部帮助 .= t(模块帮助内容, lang) "`n`n" } if (T%模块名称%_Disabled) { - 加载提示追加("跳过模块:" i " " 模块名称) + 加载提示追加(t("跳过模块:") . i . " " . 模块名称) } else { ; 这里引入模块代码 - 清洗为_UTF8_WITH_BOM_型编码(CLX_模块路径 "/" 模块文件) + 清洗为_UTF8_WITH_BOM_型编码(CLX_ModuleDir "/" 模块文件) ; 导入模块 模块初始化代码 .= "GoSub CLX_ModuleSetup_" i "`n" 模块导入代码 .= "`n" "#If" "`n" "`n" @@ -212,17 +213,17 @@ Return } else { 模块导入代码 .= " " " " " " " " "CLX_THIS_MODULE_HELP_FILE_PATH := """"" "`n" } - 模块导入代码 .= " " " " " " " " "#Include " CLX_模块路径 "/" 模块文件 "`n" + 模块导入代码 .= " " " " " " " " "#Include " CLX_ModuleDir "/" 模块文件 "`n" 模块导入代码 .= "Return" "`n" - 加载提示追加("运行模块:" i " " 模块名称) + 加载提示追加(t("运行模块:") . i . " " . 模块名称) } } 加载提示显示() ; 拼接模块加载器代码 - 常量语句 .= "; 请勿直接编辑本文件,以下内容由核心加载器自动生成。雪星/(20210318)" "`n" - 常量语句 .= "global CLX_模块路径 := " """" CLX_模块路径 """" "`n" - 常量语句 .= "global CLX_核心路径 := " """" CLX_核心路径 """" "`n" + 常量语句 .= "; " . t("请勿直接编辑本文件,以下内容由核心加载器自动生成。雪星/(20210318)") . "`n" + 常量语句 .= "global CLX_ModuleDir := " """" CLX_ModuleDir """" "`n" + 常量语句 .= "global CLX_CoreDir := " """" CLX_CoreDir """" "`n" 常量语句 .= "global CLX_Version := " """" CLX_Version """" "`n" 常量语句 .= "global CLX_VersionName := " """" CLX_VersionName """" "`n" @@ -234,8 +235,9 @@ Return FileAppend %模块运行器%, %CLX_ModulesRunner% if (!FileExist(CLX_ModulesRunner)) { msg = - msg .= "Unable to write ModulesRunner.ahk, if you are install with chocolatey, run me as admin at the first time please.`n" - msg .= "注意:未能写入模块运行器,如果使用 chocolatey 首次安装后,请以管理员权限运行。" + msg .= t("Unable to write ModulesRunner.ahk, if you are install with chocolatey, run me as admin at the first time please.") + msg .= "`n" + msg .= t("注意:未能写入模块运行器,如果使用 chocolatey 首次安装后,请以管理员权限运行。") msgbox %msg% } FileDelete %CLX_ModulesFunctions% @@ -260,8 +262,8 @@ Return Return targetREADME } CapsLockX启动(){ - CoreAHK := CLX_核心路径 "\CapsLockX-Core.ahk" - UpdatorAHK := CLX_核心路径 "\CapsLockX-Update.ahk" + CoreAHK := CLX_CoreDir "\CapsLockX-Core.ahk" + UpdatorAHK := CLX_CoreDir "\CapsLockX-Update.ahk" ; 为了避免运行时对更新模块的影响,先把 EXE 文件扔到 Temp 目录,然后再使用 Temp 里的 AHK 来运行本核心。 AHK_EXE_ROOT_PATH := "CapsLockX.exe" AHK_EXE_CORE_PATH := "./Core/CapsLockX.exe" @@ -286,12 +288,12 @@ CapsLockX启动(){ RunWait %AHK_EXE_TEMP_PATH% %CoreAHK%, %A_ScriptDir% } if (ErrorLevel) { - MsgBox, 4, CapsLockX 错误, CapsLockX 异常退出,是否重载? + MsgBox, 4, % t("CapsLockX 错误"), % t("CapsLockX 异常退出,是否重载?") IfMsgBox No return Reload } else { - TrayTip, CapsLockX 退出, CapsLockX 已退出。 + TrayTip, % t("CapsLockX 退出"), % t("CapsLockX 已退出。") Sleep, 1000 } ExitApp diff --git a/Core/CapsLockX-i18n.ahk b/Core/CapsLockX-i18n.ahk index 3c6d335..bb8502b 100644 --- a/Core/CapsLockX-i18n.ahk +++ b/Core/CapsLockX-i18n.ahk @@ -1,6 +1,8 @@ - + global CLX_Lang := CLX_Config("Core", "Language", "auto", "语言切换") global CLX_i18nConfigPath := "Core/lang.ini" +global CLX_i18n_newTranslated := "Core/lang.ini" + 清洗为_UTF16_WITH_BOM_型编码(CLX_i18nConfigPath) ; - [Language Codes \| AutoHotkey v1]( https://www.autohotkey.com/docs/v1/misc/Languages.htm ) @@ -16,7 +18,7 @@ LCID_0011 := "Japanese" ; ja LCID_0411 := "Japanese (Japan)" ; ja-JP ; TODO: converts -t(s) +t(s, lang = "") { global CLX_Lang @@ -26,8 +28,9 @@ t(s) ; for dev, autotranslate ; run node "prompts/translate-en.md" - - lang := CLX_Lang + if (!lang) { + lang := CLX_Lang + } if (!lang) { lang:="auto" } @@ -125,31 +128,49 @@ i18n_changeLanguage(lang := "auto") } CLX_i18n_ConfigGet(field, varName, defaultValue) { + encodedKey := CLX_i18n_ConfigEnocde(varName) global CLX_ConfigChangedTickCount CLX_ConfigChangedTickCount := A_TickCount ; user locales global CLX_ConfigDir - IniRead, content, % CLX_ConfigDir . "/" . field . ".ini", %field%, %varName%, %defaultValue% + IniRead, content, % CLX_ConfigDir . "/" . field . ".ini", %field%, % encodedKey, %defaultValue% if (content == "ERROR") { content := "" } if (content) { - return content + return CLX_i18n_ConfigDecode(content) } ; clx pre-installed locales - IniRead, content, % CLX_i18nConfigPath, %field%, %varName%, %defaultValue% + IniRead, content, % CLX_i18nConfigPath, %field%, % encodedKey, %defaultValue% if (content == "ERROR") { content := "" } if (content) { - return content + return CLX_i18n_ConfigDecode(content) } } CLX_i18n_ConfigSet(field, varName, value) { + encodedKey := CLX_i18n_ConfigEnocde(varName) + encodedValue := CLX_i18n_ConfigEnocde(value) global CLX_ConfigChangedTickCount CLX_ConfigChangedTickCount := A_TickCount global CLX_ConfigDir - IniSave(value, CLX_ConfigDir . "/" . field . ".ini", field, varName) + IniSave(encodedValue, CLX_ConfigDir . "/" . field . ".ini", field, encodedKey) + ; 清洗为_UTF16_WITH_BOM_型编码(CLX_ConfigDir) } +CLX_i18n_ConfigEnocde(str){ + str := RegExReplace(str, "\\", "\\") + str := RegExReplace(str, "`r", "\r") + str := RegExReplace(str, "`n", "\n") + str := RegExReplace(str, "=", "\e") + return str +} +CLX_i18n_ConfigDecode(str){ + str := RegExReplace(str, "\\e", "=") + str := RegExReplace(str, "\\n", "`n") + str := RegExReplace(str, "\\r", "`r") + str := RegExReplace(str, "\\\\", "\") + return str +} \ No newline at end of file diff --git a/Core/CapslockX-Config.ahk b/Core/CapslockX-Config.ahk index 30104b6..47c756c 100644 --- a/Core/CapslockX-Config.ahk +++ b/Core/CapslockX-Config.ahk @@ -1,9 +1,9 @@ ; 保存为 save with UTF8 with DOM ; 用户创建目录 -ConfigDir_Portable := "./User" -ConfigDir_UserProfile := USERPROFILE . "/.CapsLockX" -ConfigDir_AppData := APPDATA . "/CapsLockX" +ConfigDir_Portable := ".\User" +ConfigDir_UserProfile := USERPROFILE . "\.CapsLockX" +ConfigDir_AppData := APPDATA . "\CapsLockX" ; 默认值 LaunchConfigDir := ConfigDir_AppData diff --git a/Modules/App-XunFeiSwitching.ahk b/Modules/App-XunFeiSwitching.ahk index 99203fe..d6d3040 100644 --- a/Modules/App-XunFeiSwitching.ahk +++ b/Modules/App-XunFeiSwitching.ahk @@ -7,16 +7,16 @@ ; 2021-04-15 更新 @telppa:[修改了一下语音识别模块的代码。・Issue #14・snolab/CapsLockX]( https://github.com/snolab/CapsLockX/issues/14 ) ; -global T_EnableXunFeiSwitching := CLX_Config("App", "T_EnableXunFeiSwitching", 1, "使用 Win+H 快速启动讯飞语音悬浮窗(默认启用)") +global T_EnableXunFeiSwitching := CLX_Config("App", "T_EnableXunFeiSwitching", 1, t("使用 Win+Alt+H 快速启动讯飞语音悬浮窗(默认启用)")) CLX_AppendHelp( CLX_LoadHelpFrom(CLX_THIS_MODULE_HELP_FILE_PATH)) - Return #if !CapsLockXMode && T_EnableXunFeiSwitching -#h:: 讯飞语音输入法切换() +#!h:: 讯飞语音输入法切换() 讯飞语音输入法切换(){ + xflyInstallMsg := t("你似乎还没有安装讯飞语音输入法,是否现在下载安装包并【手动安装】到默认目录? - [讯飞输入法官网 - 更好用的手机输入法,提供专业输入法定制解决方案!]( https://srf.xunfei.cn/#/ )") ; v3 iFlyWnd := WinExist("ahk_class BaseGui ahk_exe iFlyVoice.exe" ) @@ -48,7 +48,7 @@ Return If (FileExist(iFlyPath "\iFlyVoice.exe")){ Run "%iFlyPath%\iFlyVoice.exe" }else{ - MsgBox, 4, , 你似乎还没有安装讯飞语音输入法,是否现在下载安装包并【手动安装】到默认目录? - [讯飞输入法官网 - 更好用的手机输入法,提供专业输入法定制解决方案!]( https://srf.xunfei.cn/#/ ) + MsgBox, 4, , % xflyInstallMsg IfMsgBox, NO, Return ; Run https://download.voicecloud.cn/200ime/iFlyIME_Setup_2.1.1708.exe run https://srf.xunfei.cn/#/ @@ -58,6 +58,3 @@ Return ; Run %TEMP%/iFlyIME_Setup_2.1.1708.exe } } - -; 加 Alt 访问原热键 -#!h:: Send #h diff --git a/Modules/App-XunFeiSwitching.md b/Modules/App-XunFeiSwitching.md index f537eb0..fe68615 100644 --- a/Modules/App-XunFeiSwitching.md +++ b/Modules/App-XunFeiSwitching.md @@ -4,12 +4,11 @@ | 作用于 | 按键 | 功能说明 | | ------ | :-----: | --------------------- | -| 全局 | Win + H | 启动/切换讯飞语音输入 | +| 全局 | Win + Alt + H | 启动/切换讯飞语音输入 | ## 注 -1. 原 `Win + H` 的功能是 Windows 自带听写,安装本插件后,可通过 `Win + Shift + H` 使用原 Windows 的听写 -2. 若没有安装讯飞语音则会自动询问是否引导下载安装 +1. 若没有安装讯飞语音则会自动询问是否引导下载安装 ## 效果如下图 diff --git a/Modules/CLX-RunOnLogin.ahk b/Modules/CLX-RunOnLogin.ahk index 9e75a30..81a0511 100644 --- a/Modules/CLX-RunOnLogin.ahk +++ b/Modules/CLX-RunOnLogin.ahk @@ -14,7 +14,7 @@ CLX_MakeStartup() content = cd "%A_WorkingDir%" && start "" CapsLockX.exe startCMDPath := APPDATA "\Microsoft\Windows\Start Menu\Programs\Startup\capslockx-startup.cmd" FileDelete, %startCMDPath% - FileAppend, echo off, %startCMDPath% + FileAppend, echo off`r`n, %startCMDPath% FileAppend, %content%, %startCMDPath% cmdView := "explorer /select, " """" startCMDPath """" run % cmdView diff --git a/Modules/SnoChordTyping.ahk b/Modules/SnoChordTyping.ahk index 2aa30d1..b81a454 100644 --- a/Modules/SnoChordTyping.ahk +++ b/Modules/SnoChordTyping.ahk @@ -13,7 +13,7 @@ FileEncoding, UTF-8 ; 開關 默认关 -global SnoChordTypingEnable := CLX_Config("Plugins", "EnableSnoChordTyping", 0, "启用雪星并击(实验中),") +global SnoChordTypingEnable := CLX_Config("SnoChordTyping", "EnableSnoChordTyping", 0, t("启用雪星并击(实验中),使用单手操作整个主键区")) if (!T_SnoChordTypingEnable) Return diff --git a/README.md b/README.md index 919808a..2dc4f1f 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,27 @@ -# CapsLockX - 💻 Get Hacker's Keyboard. 像**黑客**一样操作电脑 +# CapsLockX - 💻 Get Hacker's Keyboard. Operate your computer like a **hacker** -CapsLockX is a modular hotkey script engine based on AutoHotkey. Allows you to easily operate the computer efficiently like a hacker in a movie without leaving the keyboard with both hands . There are a lot of functions that you can understand at a touch and are super easy to use: editing enhancement, virtual desktop and window management, mouse simulation, in-app hotkey enhancement, JS mathematical expression calculation, and other super multi-functions are waiting for you to personally define. +CapsLockX is a modular hotkey script engine based on AutoHotkey. It allows you to operate your computer efficiently like a hacker in a movie without ever taking your hands off the keyboard. It comes packed with functions that are intuitive and easy to use: enhanced editing, virtual desktop and window management, mouse simulation, in-app hotkey enhancement, JS mathematical expression calculation, and many more multifunctional features are there for you to personally customize. -**[See English Docs (Google Translated)](https://capslockx.snomiao.com/)** +Docs in Languages: +**[English Docs (ChatGPT Translated)](https://capslockx.snomiao.com/)** +**[简体中文 説明](./docs/README.zh-hans.md)** +**[English Docs (ChatGPT Translated)](./docs/README.zh-hans.md)** + +**[See Any Language Docs (Google Translated)](https://capslockx.snomiao.com/)** --- -CapsLockX 是一款基于 AutoHotkey 的模块化热键脚本引擎。 让你可以轻轻松松像电影里的**黑客**一样,双手不离开键盘,**高效率**地操作电脑。这里有超多一摸就懂超好上手的功能:编辑增强、虚拟桌面与窗口管理、鼠标模拟、应用内热键增强、JS 数学表达式计算、等超多功能等你来亲自定义。主仓库地址 🏠:[https://github.com/snolab/CapsLockX](https://github.com/snolab/CapsLockX) +CapsLockX is a modular hotkey script engine based on AutoHotkey. It makes it so you can effortlessly operate your computer with high efficiency like a hacker from the movies, without taking your hands off the keyboard. There are a lot of easy-to-learn and very user-friendly functions available: editing enhancement, virtual desktop and window management, mouse simulation, application-specific hotkey enhancement, JS mathematical expression calculation, and many other features await your personal customization. Main repository address 🏠: [https://github.com/snolab/CapsLockX](https://github.com/snolab/CapsLockX) --- -## 版本墙 - 徽章墙 📛 Badges +## Version Wall - Badges Wall 📛 Badges -[![中文编程](https://github.com/Program-in-Chinese/overview/raw/master/%E4%B8%AD%E6%96%87%E7%BC%96%E7%A8%8B.svg)](https://github.com/Program-in-Chinese/overview), +[![Chinese Programming](https://github.com/Program-in-Chinese/overview/raw/master/%E4%B8%AD%E6%96%87%E7%BC%96%E7%A8%8B.svg)](https://github.com/Program-in-Chinese/overview), [![996.icu](https://img.shields.io/badge/link-996.icu-red.svg)](https://996.icu) [![GitHub license](https://img.shields.io/github/license/snolab/CapsLockX)](https://github.com/snolab/CapsLockX/blob/master/LICENSE.md) ![GitHub top language](https://img.shields.io/github/languages/top/snolab/CapsLockX) @@ -43,783 +48,647 @@ CapsLockX 是一款基于 AutoHotkey 的模块化热键脚本引擎。 让你可 --- -## 新手快速入门教程 📖 Tutorial +## Beginner's Quick Start Tutorial 📖 Tutorial -### 简易入门教程(读完这一小节,便算是入门了 CapsLockX 的使用 ) +### Simple Quick Start Tutorial (Completion of this section is considered the beginning of mastering CapsLockX) -CapsLockX 有四大核心功能: **窗口管理**,**鼠标模拟**、**方向键模拟**、应用内热键,本入门教程将带你学会前 3 大核心功能。 +CapsLockX has four core functions: **window management**, **mouse emulation**, **arrow key emulation**, and application-specific hotkeys. This beginner tutorial will teach you the first three core functions. -首先获取 CapsLockX :下载这个压缩包: [下载 JSDelivrCDN-发布程序包.zip](https://cdn.jsdelivr.net/gh/snolab/CapsLockX@gh-pages/CapsLockX-latest.zip) +First, get CapsLockX: download this zip file: [Download JSDelivrCDN - Release Package.zip](https://cdn.jsdelivr.net/gh/snolab/CapsLockX@gh-pages/CapsLockX-latest.zip) -解压之后,打开 CapsLockX 文件夹内的 `CapsLockX.exe`,过掉简单的新手教程,然后按照以下左右手功能区的依次试用来了解 CapsLockX 的功能。 +After unzipping, open `CapsLockX.exe` within the CapsLockX folder, get past the simple beginner tutorial, and then try out the following functions in the left and right-hand feature areas to understand the capabilities of CapsLockX. -CapsLockX 启动之后,并**不会影响**你键盘其它按键的功能,以下的功能只有在你按出 `CapsLockX + 组合键` 时才会触发。 +Once CapsLockX is started, it will **not affect** the functionality of other keys on your keyboard. The following features are triggered only when you press `CapsLockX + combination keys`. -左手功能区: +Left-hand feature area: -- 窗口管理:`CapsLockX + 1234567890` 切换到第 `n` 个虚拟桌面,`CapsLockX + ZXCV` 窗口操作(窗口切换、窗口关闭,窗口排列,透明置顶)。 -- 鼠标模拟功能:按 `CapsLockX + WASD` 鼠标移动(像玩游戏的时候操作人物移动一样简单),按 `CapsLockX + QE` 鼠标左右键点击,`CapsLockX + RF` 滚轮上下滑动。 +- Window management: `CapsLockX + 1234567890` switches to the `n`th virtual desktop, `CapsLockX + ZXCV` for window operations (window switching, window closing, window arranging, transparency top-most). +- Mouse emulation function: Press `CapsLockX + WASD` to move the mouse (as simple as moving a character while playing a game), press `CapsLockX + QE` for left and right mouse clicks, `CapsLockX + RF` for scrolling up and down. -右手功能区: +Right-hand feature area: -- 方向键模拟:打开任意一个编辑器(比如记事本),按 `HJKL` 光标移动,`YOUI` 页面移动 +- Arrow key emulation: Open any text editor (such as Notepad), press `HJKL` to move the cursor, `YOUI` to move the page -上手之后,如果想了解更多功能,则可参考下方速查手册。 +After familiarizing yourself with the basic features, consult the quick reference guide below for more advanced functionalities. --- -## 进阶参考手册 🦽 Manual +## Advanced Reference Manual 🦽 Manual -### 安装与使用 🛠 Installation +### Installation and Use 🛠 Installation -#### 绿色便携程序包(新手适用,稳定版) 📦 Packaged Bins +#### Portable Program Package (for beginners, stable version) 📦 Packaged Bins -源码打包就是软件本体,无需编译,纯绿色便携软件解压即用。源码 + 程序包,推荐第一个(最快)。 +The source code package is the software itself, no need to compile, just unzip and use the green portable software. Source code + program package, the first one is recommended (the fastest). -1. [下载 JSDelivrCDN-发布程序包.zip](https://cdn.jsdelivr.net/gh/snolab/CapsLockX@gh-pages/CapsLockX-latest.zip) -1. [备选下载 CloudFlareCDN-发布程序包.zip](https://capslockx.snomiao.com/CapsLockX-latest.zip) -1. [备选下载 GitHub-发布程序包.zip](https://github.com/snolab/CapsLockX/raw/gh-pages/CapsLockX-latest.zip) -1. [备选下载 GitHub-仓库程序包.zip](https://github.com/snolab/CapsLockX/archive/master.zip) -1. [备选下载 BitBucket-仓库程序包.zip](https://bitbucket.org/snomiao/capslockx/get/master.zip) -1. [备选下载 中国大陆用户-Gitee-仓库程序包.zip (需登录)](https://gitee.com/snomiao/CapslockX/repository/archive/master.zip) +1. [Download JSDelivrCDN - Release Package.zip](https://cdn.jsdelivr.net/gh/snolab/CapsLockX@gh-pages/CapsLockX-latest.zip) +2. [Alternative Download CloudFlareCDN - Release Package.zip](https://capslockx.snomiao.com/CapsLockX-latest.zip) +3. [Alternative Download GitHub - Release Package.zip](https://github.com/snolab/CapsLockX/raw/gh-pages/CapsLockX-latest.zip) +4. [Alternative Download GitHub - Repository Program Package.zip](https://github.com/snolab/CapsLockX/archive/master.zip) +5. [Alternative Download BitBucket - Repository Program Package.zip](https://bitbucket.org/snomiao/capslockx/get/master.zip) +6. [Alternative Download for Mainland China Users - Gitee - Repository Program Package.zip (login required)](https://gitee.com/snomiao/CapslockX/repository/archive/master.zip) -解压后使用即可,启动与自启动的方法: 双击 `CapsLockX.exe` 即可启动脚本,如需添加启动项,请在开始菜单 - 运行输入 shell:startup 然后给本程序创建快捷方式,扔进去就可以了。 +You can use it after unzipping. Methods to start and set to auto-start: Double-click `CapsLockX.exe` to start the script. To add a startup item, enter shell:startup in the start menu - run, then create a shortcut for this program, and throw it in. -#### 命令行方式安装(进阶用户推荐,可自动更新)🖥️ Install by command +#### Command Line Installation (recommended for advanced users, can be updated automatically) 🖥️ Install by command -以下几种任选其一,大陆地区用户推荐第 4 个 +Choose any of the following, the 4th one is recommended for users in mainland China -1. `npx capslockx@latest`, -- NPX 直接运行,可以一直运行最新版,推荐(需要安装 NodeJS ) -2. `choco update capslockx && capslockx` -- [Chocolatey](https://community.chocolatey.org/packages/CapsLockX/) 安装可使用 cup 自动更新,推荐 -3. `npm i -g capslockx && npx capslockx` -- npm 全局安装 -4. `git clone https://gitee.com/snomiao/CapslockX && .\CapsLockX\CapsLockX.exe` -- 大陆源码包(绿色软件包)解压使用,中国大陆地区用户推荐 -5. `git clone https://github.com/snolab/CapsLockX && .\CapsLockX\CapsLockX.exe` -- github 源码包(绿色软件包)解压使用 +1. `npx capslockx@latest`, -- Directly run with NPX, always run the latest version, recommended (requires installation of NodeJS) +2. `choco update capslockx && capslockx` -- Use [Chocolatey](https://community.chocolatey.org/packages/CapsLockX/) to install and use cup for automatic updates, recommended +3. `npm i -g capslockx && npx capslockx` -- npm global installation +4. `git clone https://gitee.com/snomiao/CapslockX && .\CapsLockX\CapsLockX.exe` -- Mainland China source code package (green software package) unzip and use, recommended for mainland China users +5. `git clone https://github.com/snolab/CapsLockX && .\CapsLockX\CapsLockX.exe` -- GitHub source code package (green software package) unzip and use 6. `winget capslockx` -- TODO #40 7. `scoop capslockx` -- TODO #41 -## 使用手册 📖 - Usage Manual +## User Manual 📖 - Usage Manual -### 基础操作 +### Basic Operations -- 按住 `CapsLockX` 进入 CapsLockX 模式,此时你的键盘会成为像 Vim 默认模式那样的功能键盘,(键位见下) -- 同时按 `CapsLockX+Space` 键将锁定 `CLX` 模式,此时将保持 `CLX` 到下一次按下 `CaspLockX` 键为止。[功能由来](https://github.com/snolab/CapsLockX/issues/21) +- Hold down `CapsLockX` to enter CapsLockX mode, at which point your keyboard will become a functional keyboard like the default mode of Vim (see key positions below). +- Press `CapsLockX+Space` at the same time to lock `CLX` mode, where `CLX` will be maintained until `CapsLockX` is pressed again next time. [Origin of Function](https://github.com/snolab/CapsLockX/issues/21) -### 模块说明 +### Module Description -CapsLockX 默认加载了一些常用的模块,功能与使用方法已在下方列出。 -对于不需要的模块,你也可以直接删除 `./Modules` 目录下对应的 `.ahk` 文件,然后按 `Ctrl + Alt + \` 重新加载即可。 +CapsLockX by default loads some commonly used modules. The features and how to use them are listed below. +If you don't need certain modules, you can also directly delete the `.ahk` files in the `./Modules` directory, and then press `Ctrl + Alt + \` to reload. -你也可以编写自己的 `my-ahk.user.ahk` 然后放到 `./User/` 目录下,CapsLockX 会自动识别并加载它们。 +You can also write your own `my-ahk.user.ahk` and put it in the `./User/` directory, and CapsLockX will automatically recognize and load them. -### 多任务工作的噩梦 - Nightmares of Multitasking +### Nightmares of Multitasking -#### 虚拟桌面概述:情景模式、工作桌面、娱乐桌面、项目分类…… +#### Virtual Desktop Overview: Scenario Modes, Work Desks, Entertainment Desks, Project Categories... -通常用户正在进行的一套任务会包括多个窗口,这些窗口组合起来可以构成一个使用情景,而多个情景很可能同时运行,并且其中的一些会长期运行,互不干扰。这其中会涉及到大量的窗口排列和虚拟桌面切换操作,在这些方面,如果使用 CLX 来管理你的窗口,会给你带来相当恐怖的效率提升。 +Typically, a set of tasks a user is currently performing will include multiple windows. These windows combined can constitute a usage scenario, while multiple scenarios are likely to run at the same time, and some of them will run for a long time, without interference. This will involve a lot of window arrangement and virtual desktop switching operations, in these aspects, using CLX to manage your windows will bring a terrifying efficiency improvement. -以下是一些情景组合的例子: 假设你可以一边学习、一边进行好几种不同的工作、一边和朋友聊天、一边打游戏、一边后台听着 BGM,一边打开着一个暂停的电影准备好晚上和家人一起看。 +Below are some examples of scenario combinations: Suppose you can study, work on several different jobs, chat with friends, play games, listen to BGM in the background, and have a paused movie ready to watch with family in the evening. -- 虚拟桌面 1:规划情景:日程窗口 + 多平台同步笔记, 例:Google Calendar + Notion + Gmail、 -- 虚拟桌面 2:学习情景:看书窗口,笔记窗口, 例: OneNote + Calibre)、... -- 虚拟桌面 3:工作情景 1(前端开发):代码编辑 + 文档查询 + 浏览器, 例:Chrome(dev) + VSCode + [stackoverflow](https://stackoverflow.com)、... -- 虚拟桌面 4:工作情景 2(后端开发):代码编辑 + 文档查询 + 后台终端 + 数据库浏览器, 例: DBeaver + VSCode(+bash) + [stackoverflow](https://stackoverflow.com)、... -- 虚拟桌面 5:工作情景 3(脚本开发):代码编辑 + 文档查询 + 脚本目标, 例: VSCode(+bash) + [stackoverflow](https://stackoverflow.com) ... -- 虚拟桌面 6:工作情景 4(3D 建模渲染):3D 建模软件 + 素材检索,例:Blender + Chrome -- 虚拟桌面 7:工作情景 5(3D 打印切片):切片软件 + 模型检索窗口,例:Cura + [thingiverse](https://thingiverse.com) -- 虚拟桌面 7:工作情景 6(视频处理):剪辑 + 素材管理, 例:PR + Everything -- 虚拟桌面 7:工作情景 7(视频处理):后期 + 文档教程, 例:AE + Chrome -- 虚拟桌面 8:写作情景:写作窗口,资料索引窗口, 例: Obsidian + Chrome(谷歌学术索引) )、... -- 虚拟桌面 9:交流情景 1:日常闲聊, 例:Telegram + Reddit + -- 虚拟桌面 9:交流情景 2:工作交流, 例:Slack + Skype + GMail -- 虚拟桌面 9:交流情景 3:展示演讲, 例:Google Meeting + (vscode | 页面应用 | 需求文档 | 反馈文档) -- 虚拟桌面 0:娱乐情景 1:打游戏, 例:Age of Empires、Minecraft、Skyrim、Overcooked 2、... -- 虚拟桌面 0:娱乐情景 3:看电影、听歌, 例:PotPlayer、Youtube Music、...)、... -- ... 更多例子欢迎提 Issue 或 PR 来补充 +- Virtual desktop 1: Planning scenario: Schedule window + Multi-platform sync notes, e.g.: Google Calendar + Notion + Gmail. +- Virtual desktop 2: Learning scenario: Book reading window, note-taking window, e.g.: OneNote + Calibre, etc. +- Virtual desktop 3: Work scenario 1 (Front-end Development): Code editing + Documentation querying + Browser, e.g.: Chrome(dev) + VSCode + [stackoverflow](https://stackoverflow.com), etc. +- Virtual desktop 4: Work scenario 2 (Back-end Development): Code editing + Documentation querying + Backend terminal + Database browser, e.g.: DBeaver + VSCode(+bash) + [stackoverflow](https://stackoverflow.com), etc. +- Virtual desktop 5: Work scenario 3 (Script Development): Code editing + Documentation querying + Script target, e.g.: VSCode(+bash) + [stackoverflow](https://stackoverflow.com) etc. +- Virtual desktop 6: Work scenario 4 (3D Modeling and Rendering): 3D modeling software + Material searching, e.g.: Blender + Chrome. +- Virtual desktop 7: Work scenario 5 (3D Printing Slicing): Slicing software + Model searching window, e.g.: Cura + [thingiverse](https://thingiverse.com) +- Virtual desktop 7: Work scenario 6 (Video Processing): Editing + Material management, e.g.: PR + Everything. +- Virtual desktop 7: Work scenario 7 (Video Processing): Post-production + Documentation tutorial, e.g.: AE + Chrome. +- Virtual desktop 8: Writing scenario: Writing window, material referencing window, e.g.: Obsidian + Chrome (Google Scholar Index), etc. +- Virtual desktop 9: Communication scenario 1: Casual chats, e.g.: Telegram + Reddit + . +- Virtual desktop 9: Communication scenario 2: Work communication, e.g.: Slack + Skype + Gmail. +- Virtual desktop 9: Communication scenario 3: Presentation, e.g.: Google Meeting + (Vscode | Page application | Requirements document | Feedback document). +- Virtual desktop 0: Entertainment scenario 1: Playing games, e.g.: Age of Empires, Minecraft, Skyrim, Overcooked 2, etc. +- Virtual desktop 0: Entertainment scenario 3: Watching movies, listening to songs, e.g.: PotPlayer, Youtube Music, etc... +- ... More examples are welcome. Provide Issues or PRs for supplementation. -雪星不建议你同时处理太多任务,但 CapsLockX 可以为你保存你的思考环境,最大限度地降低你在任务切换中的心智成本,也就是可以为你省去很多重新排列窗口的时间以及由此失去的注意力。 +Snowstar does not recommend you handle too many tasks at the same time, but CapsLockX can save your thinking environment, greatly reducing the mental cost you incur during task switching, that is, saving you a lot of time rearranging windows and the resulting loss of attention. -(注:如果你喜欢同时处理很多个任务,你可能不止需要一台内存不小的电脑,还需要一团容量不小的脑子 :D ) +(Note: If you like to handle many tasks at the same time, you might need not only a computer with not a small amount of memory but also a brain of significant capacity :D ) -#### Windows 窗口切换的用户体验提升 - Win+tab +#### Enhancing the User Experience of Windows Window Switching - Win+Tab -Alt+Tab 窗口切换时,如果窗口过多,就会显示一个二维窗口预排列。 -一般来说,Alt+Tab 和 Alt+Shift+Tab 是一个纯左手的键位,如果用户希望选选择下一行的窗口,就会本能地按很多下 Alt+Tab。 -而用于二维操作的方向键则因为右手通常放在鼠标上或者 j 键上而常常被忽视。 +When switching windows with Alt+Tab, if there are too many windows, a two-dimensional window pre-arrangement display will show up. +Generally speaking, Alt+Tab and Alt+Shift+Tab are purely left-handed keystrokes. If the user wants to select the window in the next line, they will instinctively press Alt+Tab many times. +However, the directional keys used for two-dimensional operations are often ignored because the right hand is usually on the mouse or on the J key. -并且,用户会在放开 Tab 键后继续按住 Alt 键来浏览窗口,并选择要切换的目标窗口。 -而 CLX 在此处将启用 Alt+WASD 来代替方向键的功能,以实现左手直接进行多行窗口切换,这样不需要按 Shift 就能向左回退。 -并且如果用户需要清理或关闭多个窗口,只需要按下 Alt+X 就能直接批量清理多个目标窗口并且同时保持在窗口浏览界面内。 +Also, users will continue to hold down the Alt key after releasing the Tab key to browse the windows and select the target window to switch to. +In CLX, Alt+WASD will be used instead of the arrow keys to perform multiline window switching directly with the left hand, so there is no need to press Shift to go back to the left. +Moreover, if a user needs to clean up or close multiple windows, they simply press Alt+X to batch clean multiple target windows while remaining within the window browsing interface. -在 CLX 中,这些功能这极大地提高了 Alt+Tab 的可用性。 +In CLX, these features greatly improve the usability of Alt+Tab. #### TODO-Docs
Click to expand TODO-docs -#### 焦点数量:活动窗口、默认活动窗口、…… +#### Focus count: Active window, default active window, … -每个桌面只有一个活动焦点窗口,而虚拟桌面可以实现切换到该桌面时自动切换该虚拟桌面的焦点窗口,实现多个任务焦点(即活动窗口)。 +Each desktop has only one active focus window, and the virtual desktop can achieve automatic switching to the focus window of that virtual desktop when switching to it, achieving multiple task focuses (i.e., active windows). -#### 多屏幕的利用 - Multi-screening +#### Utilizing Multiple Screens - Multi-screening -#### 4K 时代的窗口排列 - Window arrange with 4k screen +#### Window Arrangement in the Era of 4K - Window arrange with 4k screen -Windows 10 默认窗口排列的限制: +Default window arrangement limitations in Windows 10: -1. 不适用于多桌面 -2. 不必要的窗口间隙过大 +1. Not applicable to multiple desktops. +2. Unnecessary window gaps are too large. -##### Linux 与 Mac 窗口的管理 - Window Manager in Linux and mac +##### Window Management on Linux and Mac - Window Manager in Linux and mac -TODO: i3 窗口管理 +TODO: i3 Window Management -##### Android 与 iOS 的窗口管理 - Window Manage in android +##### Window Management on Android and iOS - Window Manage in android -系统级两种方案:左右上下分屏、浮动窗口;应用级:浮动组件、 +Two system-level solutions: Left-right top-bottom split screen, floating windows; Application level: floating components, -### 编辑操作的困扰 +### Troubles with Editing Operations -#### 键入区与编辑控制区的疏远 +#### The Distance Between the Typing Area and Editing Control Area -TODO 漫谈 ThinkPad 与 mac 方向键位、来自 VIM 的灵感、 +TODO Discussion on ThinkPad and Mac arrow keys, inspiration from VIM, -#### 并击的概念 +#### The Concept of Chording -TODO 各种类型的并击 +TODO Various types of chording -TODO 并击的信息量提升计算 +TODO Calculation of information quantity increase with chording -### 图形界面的困扰 +### Troubles with the Graphical User Interface -TODO:文档:鼠标模拟功能介绍、RPG 游戏的移动 +TODO: Document: Introduction to mouse simulation function, movement in RPG games -### 人类的速度认知 +### Human Perception of Speed -TODO:指数增长的世界感知,焦点,听力、视觉、触觉,VS 常规线性操作 +TODO: World perception of exponential growth, focus, auditory, visual, tactile, VS conventional linear operations -### 软件的热键缺陷 +### Shortcut Deficiencies in Software -TODO:应用增强模块介绍 +TODO: Application enhancement module introduction -### 便携键盘的可用性 +### The Usability of Portable Keyboards -TODO:FN 键、方向键、编辑操作、61 配列 vs 87 键配列、 +TODO: FN key, arrow keys, editing operations, 61-key layout vs 87-key layout,
- + - - -### 帮助模块 - -如果你想学习如何开发 CapsLockX 的插件,请: - -1. 打开 `Modules/@Help.ahk` , 你可以了解到 CapsLockX 插件的基本格式 -2. 将它复制一份,命名为你自己的插件名称 -3. 将它本来的功能改成你自己需要的功能,插件的开发就完成啦! - -## 本模块功能见下 - -| 作用于 | 按键 | 功能 | -| ------ | --------------------- | -------------------------------- | -| 全局 | CapsLockX + / | 临时显示热键提示 | -| 全局 | CapsLockX + Alt + / | 🔗 打开 CapsLockX 的完整文档页面 | -| 全局 | CapsLockX + Shift + / | 🕷 提交 bug、建议等 | - - - -### Anki 增强模块 - -Anki 操作增强 - -## 常用功能/特性 - -1. 使用 WASD 或 HJKL 来快速连续地(并且可以撤销)切换记忆卡片 -2. 在 Excel 制作一个单词列表,共 2 列, 全选复制,然后在 Anki 中按 Alt + i 来快速导入单词列表。 -3. 简化 4 个选项为 3 个方向键,左易,下中,右难,上撤销。 -4. 可配合手柄使用,使用 XPadder 配置手柄摇杆映射到方向键即可。效果请见 bilibili [中二雪星怎背词 - 手柄怎么可以不用来背单词!](https://www.bilibili.com/video/av8456838/) - -## 说明 - -| 模式 | Anki 增强模块 | 说明 | -| -------------------- | :------------: | ----------------------------------------------------------- | -| 在 Anki-学习界面 | `w 或 k 或 ↑` | 按下=撤销,松开显示答案 | -| 在 Anki-学习界面 | `a 或 h 或 ←` | 按下=顺利,松开显示答案 | -| 在 Anki-学习界面 | `s 或 j 或 ↓` | 按下=一般,松开显示答案 | -| 在 Anki-学习界面 | `d 或 l 或 →` | 按下=生疏,松开显示答案 | -| 在 Anki-学习界面 | `q` | 返回上个界面 | -| 在 Anki-学习界面 | `c` | 添加新卡片 | -| 在 Anki-学习界面 | `1 或 NumPad1` | 困难(原键位) | -| 在 Anki-学习界面 | `2 或 NumPad2` | 生疏(原键位) | -| 在 Anki-学习界面 | `3 或 NumPad3` | 一般(原键位) | -| 在 Anki-学习界面 | `4 或 NumPad4` | 顺利(原键位) | -| 在 Anki-学习界面 | `5 或 NumPad5` | 撤销 | -| 在 Anki-学习界面 | `6 或 NumPad6` | 暂停卡片 | -| 在 Anki-学习界面 | `Alt + i` | 快速导入剪贴版的内容(按 Tab 分割) / 比如可以从 Excel 复制 | -| 在 Anki-添加卡片界面 | `Alt + s` | 按下 添加 按钮 | - - - -### OneNote 2016 - 2019 增强 - -朴素地增强 OneNote 2016 - 2019 的键盘操作,便捷地使用键盘来:换笔,制作链接,整理页面,调整视图…… - -## 雪星喵常用功能 - -1. 做日志的时候,先在笔记页面 `Alt + T` 给笔记标题添加日期标签(用于将来搜索),然后全局 `Win + Shift + N` 在 OneNote 搜索带有 今日标签 的所有笔记,用来方便地检索你今日的:恋爱日记、训练日志、每日书单、项目日报……总之在 OneNote 写日记就很方便了,一按就出来,不用找 XD -2. 选一个词按 `Alt + K` ,会把所有相关的页面链接列到这个词的下方,用来做索引目录,把你的 OneNote 织成一张网。 -3. 新建一个笔记,改名叫 `我的剪贴板`,然后在复制文本、图片的时候,CLX 会帮你自动追加到这个笔记,用于方便地收集资料或摘抄文章。 -4. Alt + 1234567 层级折叠,轻松地在不同抽象层次的思考上切换。 - -## 按键分布设计(开发中) - -| 按键描述 | 作用 | 备注 | -| ----------------------- | ----------------------- | ---------- | -| `所有 OneNote 自带热键` | 原功能 | | -| `按一下 Alt 再按别的` | 触发 OneNote 原菜单功能 | | -| `Alt + 1234567` | 大纲折叠展开到 1-7 层级 | | -| `Alt + qwe asd r` | 工具、换笔、视图 | | -| `Alt + f` | 查找标签 | | -| `Alt + -=` | 公式相关 | | -| `Alt + m` | 移动笔记、分区 | | -| `Alt + hjkl` | 各种链接功能 | | -| `Alt + zxcv` | 高级复制粘贴 | 细节开发中 | -| `Alt + /` | 热键帮助、提示 | 开发中 | -| `F2 F3` | 重命名、查找笔记 | | - -## 详细按键表 / CheatSheet - -| 作用于 | 格式热键 | 功能 | -| ------------------------ | ---------------------------- | ------------------------------------------------------------------------- | -| 全局 | `Win + Alt + N` | 打开快速笔记第一页(弥补 OneNote 原本没有像 Notion 一样的首页概念的不足) | -| 全局 | `Win + Shift + N` | 打开 OneNote 并精确搜索今日标签 | -| OneNote2019 | `Alt + 1234567` | 大纲:大纲折叠展开到那层(强烈推荐,超好用) | -| OneNote2019 | `F2` | 整理:重命名笔记 | -| OneNote2019 | `Shift + F2` | 整理:重命名分区 | -| OneNote2019 | `Alt + m` | 整理:移动笔记 | -| OneNote2019 | `Alt + Shift + m` | 整理:移动分区 | -| OneNote2019 | `Ctrl + n` | 整理:新建笔记 | -| OneNote2019 | `Ctrl + Alt + n` | 整理:在当前笔记下方新建笔记 | -| OneNote2019 | `Alt + Delete` | 整理:快速删除当前页面 | -| OneNote2019 | `Ctrl + s` | 整理:立即同步此笔记本 | -| OneNote2019 | `Ctrl + w` | 整理:关闭窗口 | -| OneNote2019 | `Shift + Delete` | 编辑:快速删除当前行 | -| OneNote2019 | `Alt + -` | 编辑:自动 2 维化公式 | -| OneNote2019 | `Alt + k` | 编辑:⭐🔗 展开当前关键词的相关页面链接(快速关键词一对多链接) | -| OneNote2019 | `Alt + n` | 样式:切换页面为无色背景 | -| OneNote2019 | `Alt + v` | 样式:改变文字背景色 | -| OneNote2019 | `Alt + q` | 工具:拖动 | -| OneNote2019 | `Alt + w` | 工具:套锁 | -| OneNote2019 | `Alt + e` | 工具:橡皮 | -| OneNote2019 | `Alt + s` | 工具:输入 | -| OneNote2019 | `Alt + a` | 工具:换到第 2 支笔 | -| OneNote2019 | `Alt + d` | 工具:打开换笔盘(然后可可方向键选笔 (目前全屏无效) | -| OneNote2019 | `Alt + d -> 1234567` | 工具:打开换笔盘(然后选第 1 行第 x 支笔) (目前全屏无效) | -| OneNote2019 | `Alt + d -> Shift + 1234567` | 工具:打开换笔盘(然后选第 2 行第 x 支笔) (目前全屏无效) | -| OneNote2019 | `Alt + r` | 视图:缩放到原始大小 | -| OneNote2019 | `Alt + y` | 视图:缩放到页面宽度 | -| OneNote2019 | `^!+- 或 ^!+=` | 视图:缩小页面 或 放大页面 | -| OneNote2019 | `Alt + f` | 视图:搜索标记 | -| OneNote2019 | `Alt + t` | 编辑:给笔记增加日期标签,例如: (20220717) | -| OneNote2019 | `Ctrl + Shift + c` | 编辑:复制(纯文本) | -| OneNote2019 | `Ctrl + Shift + v` | 编辑:粘贴(纯文本) | -| OneNote2019 创建链接窗口 | `Alt + s` | 编辑:复制当前所有搜索结果页面的链接 | -| OneNote2019 创建链接窗口 | `Alt + Shift + s` | 编辑:复制当前所有搜索结果页面的链接并粘贴 | -| OneNote2019 剪贴板笔记 | `Ctrl + C` | 编辑:⭐ 追加复制的内容到名称中含有 "Clipboard" 或 "剪贴板" 的笔记 | - - - -### 讯飞输入法悬浮窗插件 - -#### 用法 - -| 作用于 | 按键 | 功能说明 | -| ------ | :-----: | --------------------- | -| 全局 | Win + H | 启动/切换讯飞语音输入 | - -#### 注 - -1. 原 `Win + H` 的功能是 Windows 自带听写,安装本插件后,可通过 `Win + Shift + H` 使用原 Windows 的听写 -2. 若没有安装讯飞语音则会自动询问是否引导下载安装 - -#### 效果如下图 + -![App-讯飞语音输入法悬浮窗演示.gif](./docs/media/App-讯飞语音输入法悬浮窗演示.gif) +### Help Module - +If you want to learn how to develop plugins for CapsLockX, please: -### CLX - Brainstorm 大脳风暴 +1. Open `Modules/@Help.ahk`, where you'll be able to understand the basic format of CapsLockX plugins. +2. Make a copy of it and name it after your own plugin. +3. Modify its functionality to what you need, and your plugin development is done! -任何時間,任何輸入框,按下 `CLX+b` 鍵,開始使用 AI 輔助輸入。 +## The functions of this module are as follows -#### 按键分布(开发中) +| Applies to | Key Combination | Function | +| ---------- | -------------------- | ---------------------------------- | +| Global | CapsLockX + / | Temporarily displays hotkey tips | +| Global | CapsLockX + Alt + / | 🔗 Opens CapsLockX's full doc page | +| Global | CapsLockX + Shift + /| 🕷 Submit bugs, suggestions, etc. | -| 按键描述 | 作用 | 备注 | -| --------------- | ---------------------------------------------------- | ---- | -| CLX + b | 自動複製当前选中内容,輸入指令,让 AI 辅助你的輸入 | | -| CLX + Alt + b | 配置激活碼(目前只有免費方案,将来可能加入功能増強) | | -| CLX + Shift + b | 査看使用額度 | | + -#### Protips: +### Anki Enhancement Module + +Anki Operations Enhancement + +## Common Features/Characteristics + +1. Use WASD or HJKL for quick and consecutive (and reversible) switching of flashcards. +2. Create a word list in Excel with 2 columns, select all and copy, then press Alt + i in Anki to quickly import the word list. +3. Simplify the 4 options to 3 directional keys; left for easy, down for medium, right for hard, and up to undo. +4. Can be used with a game controller; use XPadder to map the controller's joystick to the directional keys. See the effect on bilibili ["How to Memorize Words with a Controller - Why not use a Controller to Memorize Words!"](https://www.bilibili.com/video/av8456838/) + +## Description + +| Mode | Anki Enhancement Module | Description | +| --------------------- | :---------------------: | ----------------------------------------------------------- | +| In Anki-Study Interface | `w or k or ↑` | Press=Undo, Release=Show answer | +| In Anki-St + + -##### 随時整理会議記録 +### Enhancements to OneNote 2016 - 2019 -1. 任何輸入框内,使用 Win+H 來調出語音輸入,然後說出你想要的文字,不用在意語音輸入的準確度,只要說出大概的意思就可以了, -2. 然後全選按下 `CLX+b`,輸入 `列出要点和待辦事項`,就可以看到 AI 自動幫你整理出來的要點和待辦事項。 +Simplify keyboard operation for OneNote 2016 - 2019, conveniently using keyboard shortcuts to: switch pens, create links, organize pages, adjust views... -##### 随時翻訳任何語言到任何語言 +## Snowstar Cat's Common Features -1. 任何輸入框内,选中你想要翻譯的文字 -2. 然後全選按下 `CLX+b`,`to chinese:` AI 自動幫你輸入成中文。 +1. When making a journal entry, add a date tag to the note title with `Alt + T` (for future searches), then globally use `Win + Shift + N` to search all notes with Today's tag in OneNote, making it easy to retrieve your daily: love diaries, training logs, reading lists, project reports... In short, journaling in OneNote is very convenient, press and it appears, no need to search XD +2. Select a word and press `Alt + K`, it will list all related page links under this word, creating an index directory and interconnecting your OneNote. +3. Create a new note named `My Clipboard`, and when copying text or images, CLX (an assumed application or script) automatically appends it to this note for easily collecting information or excerpting articles. +4. Use `Alt + 1234567` for outline collapsing - + -### 编辑增强插件( TG YUIO HJKL ) 🌟 +### Xunfei Input Method Floating Window Plugin -这个世界上还有比 Vim 模式的 HJKL 移动光标更棒的东西吗? -这个必须有! -那就是带加速度的 HJKL 流畅编辑体验!想不想试试让你的光标来一次排水沟过弯的高端操作?装它! +#### Usage -![EditorCursorMovement.gif](./docs/media/EditorCursorMovement.gif) +| Application | Shortcut | Function Description | +| ----------- | :----------: | ---------------------------- | +| Global | Win + Alt + H | Launch/Switch Xunfei Voice Input | -| 作用域 | Edit 模块 | 说明 | -| ---------- | --------------------- | -------------------------------- | -| 全局(基本) | `CapsLockX + h j k l` | 上下左右 方向键 | -| 全局(基本) | `CapsLockX + y o` | Home End | -| 全局(基本) | `CapsLockX + u i` | PageUp PageDown | -| 全局(基本) | `CapsLockX + [ ]` | Shift+Tab 和 Tab | -| 全局(基本) | `CapsLockX + g` | 回车 | -| 全局(进阶) | `CapsLockX + t` | Delete | -| 全局(进阶) | `CapsLockX + hl` | hl 一起按选择当前词 | -| 全局(进阶) | `CapsLockX + kj` | kj 一起按选择当前行 | -| 全局(进阶) | `CapsLockX + h + t` | 移位后删:大部分情况可代替退格键 | +#### Note - +1. If Xunfei Voice Input is not installed, it will automatically prompt whether to guide the download and installation. -### Surface 笔记本扩充功能键 +#### The effect is as shown in the following figure -专治各种笔记本残破键盘 +![App-讯飞语音输入法悬浮窗演示.gif](./docs/media/App-讯飞语音输入法悬浮窗演示.gif) + + + +### CLX - Brainstorm Brainstorming + +At any time, in any input box, press `CLX+b` to start using AI-assisted input. + +#### Key Layout (Under Development) + +| Key Description | Function | Note | +| --------------- | ------------------------------------------------------ | ---- | +| CLX + b | Automatically copies the current selection, input commands, and lets AI assist your input | | +| CLX + Alt + b | Activate the activation code (currently free plan only, may include enhanced features in the future) | | +| CLX + Shift + b | Check usage quota | | + +#### Protips: -1. 没有右 Ctrl 键?合并 Menu 与 右 Ctrl 键,Menu 当 Ctrl 用 或者 Ctrl 当 Menu 用都可以 -2. 没有 Pause 键?Win + Alt + P 也能打开系统设定信息。 -3. 待补充 +##### Always Organize Meeting Notes -| 模式 | 按键 | 功能 | -| ---------------- | :------------------------------------ | ---------------------------------- | -| 全局 | Win + Alt + P | 相当于 Win + Pause,专为笔记本定制 | -| 全局 | 右 Ctrl 按一下 | 会按一下 Menu 弹出菜单 | -| 全局 | 按住右 Menu | 会按住 Ctrl,此时可以与其它键组合 | -| Win 键模拟启用后 | ] 按住同时,[ 按下 | 相当于按 Win 键 | -| Win 键模拟启用后 | RAlt+\| 相当于按 Alt+Tab 只不过在右手 | +1. Use Win+H to activate voice input in any input box, then speak the text you want, regardless of the accuracy of the voice input, just the general meaning is sufficient, +2. Then select all and press `CLX+b`, input `list key points and to-dos`, and you can see the AI automatically helps you organize key points and to-dos. - +##### Instant Translation between Any Languages -### 媒体键模块 +1. In any input box, select the text you want to translate +2. Then select all and press `CLX+b`, `to chinese:` AI will automatically input it in Chinese. -| 作用于 | 媒体键模块 | 说明 | -| ------ | ----------------- | ------------------------------------------- | -| 全局 | `CapsLockX + F1` | 打开:我的电脑 | -| 全局 | `CapsLockX + F2` | 打开:计算器 | -| 全局 | `CapsLockX + F3` | 打开:浏览器主页 | -| 全局 | `CapsLockX + F4` | 打开:媒体库(默认是 Windows Media Player) | -| 全局 | `CapsLockX + F5` | 播放:暂停/播放 | -| 全局 | `CapsLockX + F6` | 播放:上一首 | -| 全局 | `CapsLockX + F7` | 播放:下一首 | -| 全局 | `CapsLockX + F8` | 播放:停止 | -| 全局 | `CapsLockX + F9` | 音量加 | -| 全局 | `CapsLockX + F10` | 音量减 | -| 全局 | `CapsLockX + F11` | 静音 | +试着翻译成中文 - + -### 模拟鼠标插件( WASD QERF ) +### Editing Enhancement Plugin (TG YUIO HJKL) 🌟 -> 一直以来,我总是以键盘控自居,应该是在从前做模型的时候伤到了手指关节开始,成为键盘重度用户的。各种键盘加速工具,主动去记住各种快捷键,力求少用鼠标,甚至去学习了 vim 和 emacs。但是,很多时候,鼠标是无可替代的,尤其是在图形界面大行其道时候。 +Is there anything better in this world than moving the cursor with HJKL in Vim mode? +This is a must-have! +Introducing accelerated HJKL for a smooth editing experience! Ever thought about making your cursor drift like a car in a gutter? Install this! -—— 以上是来自 [SimClick 模拟点击](https://github.com/rywiki/simclick) 作者的一段话,这是一款以网格细分方式模拟鼠标的作品,可以与本项目互补 +| Scope | Edit module | Description | +|------------|-------------------------|-----------------------------------| +| Global(Basic) | `CapsLockX + h j k l` | Arrow keys for up, down, left, right | +| Global(Basic) | `CapsLockX + y o` | Home, End | +| Global(Basic) | `CapsLockX + u i` | PageUp, PageDown | +| Global(Basic) | `CapsLockX + [ ]` | Shift+Tab and Tab | +| Global(Basic) | `CapsLockX + -—— 由 [秦金伟](http://rsytes.coding-pages.com/) 推荐 + -## 功能 +The Surface notebook's function key expansion -- 本模块使用按键区:CapsLockX + QWER ASDF -- 非常舒适地使用 WASD QE RF 来模拟【完整的】鼠标功能,相信我,试过这种手感之后,你会喜欢上它的。 -- 指针移动时会自动黏附各种按钮、超链接。滚轮的指数级增长的加速度滚动机制使你再也不惧怕超级长的文章和网页。 -- 效果如图: - ![CLX-Mouse.gif](./docs/media/CLX-Mouse.gif) +A cure for all kinds of broken laptop keyboards -## 使用方法如下 +1. No right Ctrl key? Combine the Menu and the right Ctrl key, using the Menu as Ctrl or vice versa. +2. Missing a Pause key? Win + Alt + P also opens system settings information. +3. To be added -| 作用于 | 按键 | 说明 | -| ------ | ------------------------------------- | ---------------------------------------- | -| 全局 | `CapsLockX + w a s d` | 鼠标移动(上下左右) | -| 全局 | `CapsLockX + ad` | 将 HJKL 键切换到滚轮模式(上下左右滚动) | -| 全局 | `CapsLockX + r f` | 垂直滚轮(上下) | -| 全局 | `CapsLockX + Shift + r f` | 水平滚轮(左右) | -| 全局 | `CapsLockX + Ctrl + Alt + r f` | 垂直滚轮自动滚动(上 下) | -| 全局 | `CapsLockX + Ctrl + Alt + Shift+ r f` | 水平滚轮自动滚动(左 右) | -| 全局 | `CapsLockX + rf` | rf 同时按相当于鼠标中键 | -| 全局 | `CapsLockX + e` | 鼠标左键 | -| 全局 | `CapsLockX + q` | 鼠标右键 | +| Mode | Key Combination | Function | +| ------------------- | :-------------------------------- | ------------------------------------------- | +| Global | Win + Alt + P | Equivalent to Win + Pause, customized for notebooks | +| Global | Tap right Ctrl | Will tap the Menu to pop up the context menu | +| Global | Hold right Menu | Acts as holding Ctrl, can be combined with other keys | +| Win key simulation activated | Hold ] and press [ | Equivalent to pressing the Win key | +| Win key simulation activated | RAlt + \| is equivalent to pressing Alt + Tab but on the right hand | -## 操作细节 + -快速连按 AD 步进 +### Media Key Module - +| Applies to | Media Key Module | Description | +|------------|-----------------------|----------------------------------------------| +| Global | `CapsLockX + F1` | Open: My Computer | +| Global | `CapsLockX + F2` | Open: Calculator | +| Global | `CapsLockX + F3` | Open: Browser Homepage | +| Global | `CapsLockX + F4` | Open: Media Library (defaults to Windows Media Player) | +| Global | `CapsLockX + F5` | Play: Pause/Play | +| Global | `CapsLockX + F6` | Play: Previous Track | +| Global | `CapsLockX + F7` | Play: Next Track | +| Global | `CapsLockX + F8` | Play: Stop | +| Global | `CapsLockX + F9` | Volume Up | +| Global | `CapsLockX + F10` | Volume Down -### JavaScript 计算 (建议安装 NodeJS ) + -| 作用于 | 按键 | 效果 | -| ------ | --------------- | -------------------------------------- | -| 全局 | `CapsLockX + -` | 计算当前选区 JavaScript 表达式,并替换 | -| 全局 | `CapsLockX + =` | 计算当前选区 JavaScript 表达式,并替换 | +### Mouse Simulation Plugin (WASD QERF) - +> I've always prided myself on being a keyboard warrior, likely starting after injuring my finger joints while modeling in the past, thus becoming a heavy keyboard user. I use various keyboard acceleration tools and actively memorize a multitude of shortcuts to minimize mouse usage, even learning vim and emacs. However, many times the mouse is irreplaceable, especially when graphical interfaces are prevalent. -### 窗口增强插件 (CLX + 1234567890 ZXCV) +—— The above is a passage from the author of [SimClick Mouse Simulation](https://github.com/rywiki/simclick), a work that simulates mouse behavior through a grid subdivision approach and can complement this project. -## 功能简述 +—— Recommended by [Qin Jinwei](http://rsytes.coding-pages.com/) -用好 Win 10 自带的 10 个虚拟桌面豪华配置、多显示器自动排列窗口、半透明置顶、(注:任务栏和 AltTab 相关功能暂不兼容 Win11,窗口排列功能正常。) +## Features -1. 窗口切换:`CapsLockX + [Shift] + Z` -2. 窗口关闭:`CapsLockX + [Shift] + X` -3. 窗口排列:`CapsLockX + [Shift] + C` -4. 窗口置顶:`CapsLockX + [Shift] + V` -5. 左手窗口管理:在 `Alt + Tab` 的界面,用 `WASD` 切换窗口,`X` 关掉窗口。 -6. 高效使用虚拟桌面:`CapsLockX + 0123456789` 切换、增减虚拟桌面,加上 `Shift` 键可以转移当前窗口 -7. 虚拟机与远程桌面快速脱离:双击左边 `Shift + Ctrl + Alt`。 +- This module uses the key area: CapsLockX + QWER ASDF +- Comfortably use WASD QE RF to simulate [complete] mouse functionality. Trust me, after trying this feel, you'll like it. +- The pointer automatically sticks to various buttons and hyperlinks when moving. The exponential growth of the wheel's acceleration scroll mechanism means you'll no longer fear super long articles and web pages. +- For effect -## 效果图 + -- Alt + Tab 管理窗口增强 - ![02-插件-窗口增强_Alt+Tab+WASD管理窗口.gif](./docs/02-插件-窗口增强_Alt+Tab+WASD管理窗口.gif) -- CapsLockX + C 一键排列窗口(这 GIF 是旧版本录的看起来比较卡,新版本优化过 API 就不卡了) - ![02-插件-窗口增强_一键排列窗口.gif](./docs/media/02-插件-窗口增强_一键排列窗口.gif) +### JavaScript Calculation (NodeJS installation recommended) -## 使用方法如下 ( Alt+Tab 与 CapsLockX ) +| Applies to | Key Combination | Effect | +| ---------- | --------------------- | ---------------------------------------------- | +| Global | `CapsLockX + -` | Calculate the selected JavaScript expression and replace it | +| Global | `CapsLockX + =` | Calculate the selected JavaScript expression and replace it | -| 作用域 | 窗口增强模块 | 说明 | -| ------------ | ------------------------------------- | ------------------------------------------ | -| Alt+Tab 界面 | `Q E` | 左右切换多桌面 | -| Alt+Tab 界面 | `W A S D` | 上下左右切换窗口选择 | -| Alt+Tab 界面 | `X C` | 关闭选择的窗口(目前 X 和 C 没有区别) | -| Win+Tab 视图 | `Alt + W A S D` | 切换窗口选择 | -| 全局 | `Win + [Shift] + B` | 定位到托盘任务(windows 系統自帯熱鍵) | -| 全局 | `Win + [Shift] + T` | 定位到任務栏任务(windows 系統自帯熱鍵) | -| 全局 | `Win + Shift + hjkl` | 在窗口之间按方向切换焦点 | -| 任务栏 | `Ctrl + W 或 Delete` | 在托盘图标或任务栏任务上,选择退出按钮 | -| 全局 | `CapsLockX + 1 2 ... 9 0` | 切换到第 1 .. 12 个桌面 | -| 全局 | `CapsLockX + Shift + 1 2 ... 9 0 - =` | 把当前窗口移到第 n 个桌面(如果有的话) | -| 全局 | `CapsLockX + Alt + Backspace` | 删除当前桌面(会把所有窗口移到上一个桌面) | -| 全局 | `CapsLockX + C` | 快速排列当前桌面的窗口 | -| 全局 | `CapsLockX + Ctrl + C` | 快速排列当前桌面的窗口(包括最小化的窗口) | -| 全局 | `CapsLockX + Shift + C` | 快速堆叠当前桌面的窗口 | -| 全局 | `CapsLockX + Shift + Ctrl + C` | 快速堆叠当前桌面的窗口(包括最小化的窗口) | -| 全局 | `CapsLockX + Z` | 循环切到最近使用的窗口 | -| 全局 | `CapsLockX + Shift + Z` | 循环切到最不近使用的窗口 | -| 全局 | `CapsLockX + X` | 关掉当前标签页 Ctrl+W | -| 全局 | `CapsLockX + Shift + X` | 关掉当前窗口 Alt+F4 | -| 全局 | `CapsLockX + V` | 让窗口透明 | -| 全局 | `CapsLockX + Shift + V` | 让窗口保持透明(并置顶) | -| 任意窗口 | `双击左边 Shift+Ctrl+Alt` | 后置当前窗口, \* 见下方注 | + -\*注: 双击左边 Shift+Ctrl+Alt 设计用于远程桌面与虚拟机,使其可与本机桌面窗口同时显示。 -例如 mstsc.exe、TeamViewer、VirtualBox、HyperV、VMWare 等远程桌面或虚拟机程序,配合 CapsLockX + Shift + V 透明置顶功能,让你在 Windows 的界面上同时使用 Linux 界面或 MacOS 界面再也不是难题。 +### Window Enhancement Plugin (CLX + 1234567890 ZXCV) -此处借用 [@yangbin9317 的评论](https://v2ex.com/t/772052#r_10458792) +## Feature Summary -> 以 CapsLock 为抓手,打通底层逻辑,拉齐 Windows 和 Linux WM,解决了 Windows 难用的痛点 +Make good use of the Win 10's built-in 10 virtual desktops with a luxury configuration, automatic window arrangement for multiple monitors, translucent pinning to the top (note: taskbar and AltTab related features are not yet compatible with Win11, but window arrangement functions work normally). -(20220313) 对于两端都是 Windows 的情况,也可以考虑使用 [RemoteApp Tool - Kim Knight](http://www.kimknight.net/remoteapptool) 来代替远程桌面。 +1. Window switching: `CapsLockX + [Shift] + Z` +2. Window closing: `CapsLockX + [Shift] + X` +3. Window arranging: `CapsLockX + [Shift] + C` +4. Window pinning: `CapsLockX + [Shift] + V` +5. Left-hand window management: In the `Alt + Tab` interface, use `WASD` to switch windows, `X` to close the window. +6. Efficient use of virtual desktops: `CapsLockX + 0123456789` to switch or modify virtual desktops, add `Shift` to transfer the current window +7. - + -### 快捷输入 +### Shortcut Input -| 模式 | 快捷输入 | 说明 | -| ---- | -------- | ----------------------------------------------- | -| 全局 | `#D#` | 日期输入:`(20220217)` | -| 全局 | `#T#` | 时间输入:`(20220217.220717)` | -| 全局 | `#DT#` | 日期时间输入:`2022-02-17 22:07:33` | -| 全局 | `#NPW#` | 随机输入数字密码如: `7500331260229289` | -| 全局 | `#PW#` | 随机输入数字字母密码如: `yyCTCNYodECTLr2h` | -| 全局 | `#WPW#` | 随机输入数字字母密码如: `FtD5BB1m5H98eY7Y` | -| 全局 | `#SPW#` | 随机输入数字字母符号密码如: `/})y+xK]z~>XKQ+p` | +| Mode | Shortcut Input | Description | +| ---- | -------------- | ------------------------------------------------ | +| Global | `#D#` | Date input: e.g., `(20220217)` | +| Global | `#T#` | Time input: e.g., `(20220217.220717)` | +| Global | `#DT#` | Date and time input: `2022-02-17 22:07:33` | +| Global | `#NPW#` | Random numeric password, e.g.: `7500331260229289` | +| Global | `#PW#` | Random alphanumeric password, e.g.: `yyCTCNYodECTLr2h` | +| Global | `#WPW#` | Random alphanumeric password, e.g.: `FtD5BB1m5H98eY7Y` | +| Global | `#SPW#` | Random alphanumeric and symbol password, e.g.: `/})y+xK]z~>XKQ+p` | - + -### 番茄时钟 +### Pomodoro Timer -25 分钟固定循环休息提醒。 +25-minute fixed cycle for rest reminder. -使用 `CapsLockX + ,` 打开配置,然后修改 EnableScheduleTasks=1 即可启用本插件。 +You can open the configuration by pressing `CapsLockX + ,` and then enable the plugin by modifying EnableScheduleTasks=1. -- 使用番茄报时(00 分和 30 分播放工作铃声,每小时的 25 分和 55 分播放休息铃声)(需要先开启定时任务) +- Use Pomodoro time announcements (Work bell sounds at o'clock and half-past, rest bell sounds at 25 and 55 minutes past every hour) — requires scheduled tasks to be enabled ```ini UseTomatoLife=1 ``` -- 使用番茄报时时,自动切换桌面(使用番茄报时时,自动切换桌面(休息桌面为 1,工作桌面为 2) +- When using Pomodoro announcements, automatically switch desktops (Automatically switch to desktop 1 for rest, and to desktop 2 for work during Pomodoro announcements) ```ini UseTomatoLifeSwitchVirtualDesktop=1 ``` -注:如果只需要声音而不需要自动切换桌面的话,也可试试这款 Chrome 插件 [Tomato Life - Chrome 网上应用店](https://chrome.google.com/webstore/detail/25min-tomato-life/kkacpbmkhbljebmpcopjlgfgbgeokbhn) +Note: If you only need the sound without the automatic desktop switching, you might want to try this Chrome extension [Tomato Life - Chrome Web Store](https://chrome.google.com/webstore/detail/25min-tomato-life/kkacpbmkhbljebmpcopjlgfgbgeokbhn) -注注: 本插件已经分离出一个独立项目,如果你喜欢番茄工作法的话可以参见雪星的 tomato-life 项目: [snomiao/tomato-life](https://github.com/snomiao/tomato-life) +Further Note: This plugin has been spun off into a standalone project. If you like the Pomodoro Technique, you can refer to the snowstar's tomato-life project here: [snom - + -### 锁屏自动息屏 +### Auto Screen Off on Lock -按 Win + L 锁屏时,立即关闭屏幕,适用于准备睡觉的时候自动把电脑屏幕关掉,不让它在睡觉的时候刺眼…… +When locking the screen with Win + L, the screen turns off immediately. This is suitable for automatically turning off the computer screen when getting ready for sleep, to prevent it from being glaring during the night. -## 过去与未来 🛰 +## Past and Future 🛰 -### 制作背景 ( 2017 年秋) 🍁 Background +### Production Background (Autumn of 2017) 🍁 Background -> 本人比较经常写代码… -> 起初我习惯右手用鼠标……后来觉得鼠标放右边有点远……改成了左手用鼠标 -> 左手用鼠标之后发现手还是要离开键盘……于是做了个 WASD 模拟鼠标的脚本。(然后就能一直用右手托着下巴玩电脑了) -> 后来写的脚本越来越多,就把其中一些常用的放到一起加载…… +> I often write code… +> At first, I was used to using the mouse with my right hand... later I found it a bit far to put the mouse on the right... so I switched to using the mouse with my left hand. +> After switching to the left hand, I realized I still had to take it off the keyboard... so I made a script that simulates the mouse with the WASD keys. (Then I could keep playing with the computer with my right hand under my chin) +> Later I wrote more and more scripts and put some of the common ones together to load... -### 发展路线 🛰️ RoadMap +### Development RoadMap 🛰️ RoadMap -CapsLockX 的核心理念是:简化系统操作逻辑,提升操作效率,且不与原有习惯键位冲突。 +The core philosophy of CapsLockX is to simplify system operation logic, improve operation efficiency, and not conflict with existing habitual key positions. -1. [x] 按 CapsLockX + - 键显示对应帮助(目前的显示样式相当草率) -2. [ ] i18n (eh 这个真得有) -3. [ ] 自动更新(虽然 git pull 一下也不是不行) -4. [ ] 初次使用上手教程(这个现在有点简陋……) -5. [ ] 插件管理器(虽然文件系统也可以搞定) -6. [ ] 自动配置同步功能(虽然一般来说扔 onedrive 就够) -7. [ ] 易用的选项配置的 UI 界面(虽然改 ini 也不是什么难事) -8. [ ] 执行外部代码(Python、Nodejs、外部 AHK、Bash、……)(虽然写个脚本 run 一下也并不算麻烦) +1. [x] Press CapsLockX + - key to display corresponding help (the current display style is quite rough) +2. [ ] i18n (eh this really should exist) +3. [ ] Auto-update (although git pull is also fine) +4. [ ] Tutorial for first-time users (this is a bit simple now...) +5. [ ] Plugin manager (although the file system could handle it too) +6. [ ] Auto-sync of configuration (though throwing it in OneDrive is usually enough) +7. [ ] A user-friendly options configuration UI (though changing ini isn't that hard) +8. [ ] Execute external code (Python, Nodejs, external AHK, Bash, …) (although running a script isn't much trouble) -如果你有任何想法或建议,请在这里提出: +If you have any ideas or suggestions, please propose them here: [Issues · snomiao/CapslockX](https://github.com/snolab/CapsLockX/issues) -### 组合键含义设计 ⌨ Chore Design +### Key Combination Meaning Design ⌨ Chore Design -Win + 系列 通常为操作系统功能、桌面窗口应用进程管理等、输入法、输出设备(显示器、多屏)管理 +Win + series are generally used for operating system functions, desktop window application process management, input method, output device (display, multiple screens) management. -Alt + 系列 通常表述为调用应用内功能,其含义应相当于按下功能相同的按钮,或跳转到特定功能界面。 +Alt + series typically denote invocation of application internal functions, their meanings should be equivalent to pressing the same function button, or jumping to a specific function interface. -Ctrl + 系列 同上,但使用上更为频繁、且很可能不存在功能相同的按钮。 +Ctrl + series as above, but used more frequently and it's very likely that there is no button with the same function. -Ctrl + Alt + 同上,但一般为全局热键 +Ctrl + Alt + same as above, but generally for global hotkeys. -而 Shift 键 用来在以上功能的基础上稍微改变按键的含义(例如反向操作如 Shift+Alt+Tab,或功能范围扩大如 Shift+方向键调整选区等) +The Shift key is used to slightly change the meaning of the above functions (such as reverse operations like Shift+Alt+Tab, or extended function range like Shift+Arrow keys to adjust the selection, etc.) -### CapsLockX 与类似项目的功能对比 ⚔ Feat Compare Matrix +### CapsLockX vs. Similar Projects Function Comparison ⚔ Feat Compare Matrix -更新于(20200627) 其中的信息可能慢慢过时 +Updated (20200627) The information may become outdated over time -| 功能\项目 | [CapsLockX](https://github.com/snolab/CapsLockX) | [Vonng/CapsLock](https://github.com/Vonng/CapsLock) | [coralsw/CapsEz](https://github.com/coralsw/CapsEz) | [CapsLock+](https://capslox.com/capslock-plus/) | -| :--------------- | :----------------------------------------------- | :-------------------------------------------------- | :-------------------------------------------------- | :---------------------------------------------- | -| 鼠标模拟 | ✅ 流畅完整 | ✅ 无滚轮 | 🈚 无 | 🈚 无 | -| 表达式计算 | ✅ Nodejs 或 JScript | 🈚 无 | 🈚 无 | ✅ TabScript (Snippet + Javascript) | -| 窗口管理 | ✅ 强 | ✅ 有 | ✅ 有 | ✅ 强 | -| 虚拟桌面管理 | ✅ 有 | 🈚 无 | 🈚 无 | 🈚 无 | -| 编辑增强 | ✅ 有(抛物模型) | ✅ 有 | ✅ 有 | ✅ 有(很全) | -| 绿色免安装 | ✅ 是 | ✅ 是 | ✅ 是 | ✅ 是 | -| 增强媒体键 | 不全 | ✅ 全 | 🈚 无 | 🈚 无 | -| 强化的剪贴板 | 弱 | 🈚 无 | 🈚 无 | ✅ 有 | -| 快速启动应用 | ✅ 插件 | ✅ 有 | ✅ 有 | ✅ 有 | -| 应用功能增强 | ✅ 丰富 | 🈚 无 | ✅ 有 | 🈚 无 | -| Bash 控制 | 🈚 无 | ✅ 有 | 🈚 无 | 🈚 无 | -| 快速启动语音输入 | ✅ 讯飞 | 🈚 无 | 🈚 无 | 🈚 无 | -| 快速输入时间日期 | ✅ 有 | | ✅ 有 | | -| 窗口绑定到热键 | 🈚 无 | 🈚 无 | 🈚 无 | ✅ 有 | -| 快速旋转屏幕 | ✅ 有 | 🈚 无 | 🈚 无 | 🈚 无 | -| 二次开发 | ✅ 文档友好 | ✅ 可 | ✅ 可 | ✅ 可 | -| 内存占用 | ✅ 约 2~3M | | | | -| 模块化 | ✅ | 🈚 无 | 🈚 无 | 🈚 无 | -| 系统 | Win | Mac(主),Win(次) | Win | Win, [Mac](https://capslox.com/) | -| 支持语言 | 中文 | 中文 - English | 中文 | 中文 - English | +| Feature\Project | [CapsLockX](https://github.com/snolab/CapsLockX) | [Vonng/CapsLock](https://github.com/Vonng/CapsLock) | [coralsw/CapsEz](https://github.com/coralsw/CapsEz) | [CapsLock+](https://capslox.com/capslock-plus/) | +| :------------------------------ | :----------------------------------------------- | :-------------------------------------------------- | :-------------------------------------------------- | :---------------------------------------------- | +| Mouse Simulation | ✅ Smooth and complete | ✅ No scroll wheel | 🈚 None | 🈚 None | +| Expression Calculation | ✅ Nodejs or JScript | 🈚 None | 🈚 None | ✅ TabScript (Snippet + Javascript) | +| Window Management | ✅ Strong | ✅ Available | ✅ Available | ✅ Strong | +| Virtual Desktop Management | ✅ Available | 🈚 None | 🈚 None | 🈚 None | +| Editing Enhancement | ✅ Available (parabolic model) | ✅ Available | ✅ Available | ✅ Very comprehensive | +| Portable (No Install) | ✅ Yes | ✅ Yes | ✅ Yes | ✅ Yes | +| Enhanced Media Keys | Not all | ✅ All | 🈚 None | 🈚 None | +| Enhanced Clipboard | Weak | 🈚 None | 🈚 None | ✅ Available | +| Quick Application Launch | ✅ Plugins | ✅ Available | ✅ Available | ✅ Available | +| Application Feature Enhancement | ✅ Rich | 🈚 None | ✅ Available | 🈚 None | +| Bash Control | 🈚 None | ✅ Available | 🈚 None | 🈚 None | +| Quick Start Voice Input | ✅ iFLYTEK | 🈚 None | 🈚 None | 🈚 None | +| Quick Input of Time and Date | ✅ Available | | ✅ Available | | +| Bind Window to Hotkey | 🈚 None | 🈚 None | 🈚 None | ✅ Available | +| Quick Screen Rotation | ✅ Available | 🈚 None | 🈚 None | 🈚 None | +| Secondary Development | ✅ Documentation friendly | ✅ Possible | ✅ Possible | ✅ Possible | +| Memory Usage | ✅ About 2~3M | | | | +| Modularization | ✅ | 🈚 None | 🈚 None | 🈚 None | +| System | Win | Mac (main), Win (secondary) | Win | Win, [Mac](https://capslox.com/) | +| Supported Languages | Chinese | Chinese - English | Chinese | Chinese - English | -#### CapsLockX 地址 🔗 Project Urls +#### CapsLockX Address 🔗 Project Urls -以下几个仓库同步更新: +The following repositories are updated synchronously: - GitHub: [https://github.com/snolab/CapsLockX](https://github.com/snolab/CapsLockX) - Gitee: [https://gitee.com/snomiao/CapslockX](https://gitee.com/snomiao/CapslockX) - Bitbucket: [https://bitbucket.org/snomiao/capslockx](https://bitbucket.org/snomiao/capslockx) - Gitlab: [https://gitlab.com/snomiao/CapsLockX/](https://gitlab.com/snomiao/CapsLockX/) -文档地址 📄 +Document Address 📄 -- 自动翻译文档 Netlify CDN:[https://capslockx.netlify.com](https://capslockx.netlify.com) -- 自动翻译文档 CloudFlare CDN:[https://capslockx.snomiao.com](https://capslockx.snomiao.com) +- Automatic Translation Document Netlify CDN: [https://capslockx.netlify.com](https://capslockx.netlify.com) +- Automatic Translation Document CloudFlare CDN: [https://capslockx.snomiao.com](https://capslockx.snomiao.com) -星图 ⭐️ +Star Chart ⭐️ - [![Stargazers over time](https://starchart.cc/snolab/CapsLockX.svg)](https://starchart.cc/snolab/CapsLockX) -#### 相似项目地址 🔗 Similar Projects +#### Similar Project Addresses 🔗 Similar Projects - [Star Historys](https://star-history.t9t.io/#snolab/CapsLockX&wo52616111/capslock-plus&coralsw/CapsEz&Vonng/CapsLock) -- 源码:[Vonng/CapsLock: Make CapsLock Great Again!](https://github.com/Vonng/CapsLock) - 设计:[Capslock/design.md at master · Vonng/Capslock](https://github.com/Vonng/Capslock/blob/master/design.md) +- Source: [Vonng/CapsLock: Make CapsLock Great Again!](https://github.com/Vonng/CapsLock) + Design: [Capslock/design.md at master · Vonng/Capslock](https://github.com/Vonng/Capslock/blob/master/design.md) - [coralsw/CapsEz: KeyMouse Tools](https://github.com/coralsw/CapsEz) - [CapsLock+](https://capslox.com/CapsLock-plus/) - [Capslox](https://capslox.com/cn/) - CapsLock++ [matrix1001/CapsLock-plus-plus: ⌨Amazing, extendable, readable autohotkey scripts framework utilized by CapsLock.](https://github.com/matrix1001/CapsLock-plus-plus) -- [Power Keys | 解放电脑使用效率](https://powerkeys.github.io/) +- [Power Keys | Liberate Computer Usage Efficiency](https://powerkeys.github.io/) -## 答疑相关 ❓ Questions +## Questions and Answers ❓ Questions -相关社群: +Related Communities: -- [CapsLockX 的 issues (可作论坛使用)](https://github.com/snolab/CapsLockX/issues) ✉️ -- CapsLockX 用户电报群:[t.me/CLX_users](https://t.me/CLX_users)📱 -- CapsLockX 用户 QQ 群 🐧:[100949388](https://jq.qq.com/?_wv=1027&k=56lsK8ko) -- QZ/VimD/TC/AHK QQ 群 🐧: 271105729 -- AHK 高级 QQ 群 🐧: 717947647 +- [CapsLockX's issues (can be used as a forum)](https://github.com/snolab/CapsLockX/issues) ✉️ +- CapsLockX User Telegram Group: [t.me/CLX_users](https://t.me/CLX_users)📱 +- CapsLockX User QQ Group 🐧: [100949388](https://jq.qq.com/?_wv=1027&k=56lsK8ko) +- QZ/VimD/TC/AHK QQ Group 🐧: 271105729 +- AHK Advanced QQ Group 🐧: 717947647 -CapsLockX 相关答疑直接进群 [@雪星](tencent://message?uin=997596439) 或私聊提问也可。 +For questions related to CapsLockX, you can directly join the group [@雪星](tencent://message?uin=997596439) or ask privately. -### 隐私与安全性 🔒 Privacy +### Privacy and Security 🔒 Privacy -考虑到任何能够获取到管理员权限的软件对于用户的操作系统都是相当危险的,故 CapsLockX 必须而且正在采用开源的方式以使社区可以自由且随意地检查 CapsLockX 中可能涉及到的任何部分的代码,以保证所有用户的操作系统安全性不因本软件而受损害。 +Considering that any software that can obtain administrative rights is quite dangerous to a user's operating system, CapsLockX must and is currently adopting an open-source approach. This allows the community to freely and arbitrarily inspect any part of the CapsLockX code that may be involved, to ensure that the security of all users' operating systems is not compromised by this software. -## 支持 ⭐️ Supports +## Support ⭐️ Supports -如何帮助 CapsLockX 生存下去?如果 CapsLockX 有帮助到你: +How to help CapsLockX survive? If CapsLockX has been helpful to you: -1. ⭐️ 请在 CapsLockX Github 上点星 Star -2. 🔗 请把我转发分享给你身边的朋友们。 -3. 🌐 欢迎帮我翻译本文档到各国语言。 -4. 🐞 欢迎提交 bug、提出完善建议 [issues](https://github.com/snolab/CapsLockX/issues) -5. 欢迎提交代码 PR,哪怕是修改错别字也是可以的~ -6. 欢迎创作关于本软件的作品,比如录制使用教学视频投稿到 Youtube 或 Bilibili ,雪星会去给你点赞的哦。 -7. 💰 欢迎在此捐助 CapsLockX 的开发,每一笔捐赠都会记录到下方的列表中: - - 爱发电 ⚡️:[https://afdian.net/@snomiao](https://afdian.net/@snomiao) +1. ⭐️ Please star CapsLockX on Github Star +2. 🔗 Please share it with your friends. +3. 🌐 Welcome to help translate this documentation into different languages. +4. 🐞 Welcome to submit bugs and suggestions for improvement [issues](https://github.com/snolab/CapsLockX/issues) +5. Code PR submissions are welcome, even just to correct a typo ~ +6. Welcome to create works about this software, such as recording tutorial videos to post on Youtube or Bilibili, Xue Xing will like your video. +7. 💰 Welcome to donate to the development of CapsLockX, each donation will be recorded in the list below: + - Love Send Electric ⚡️:[https://afdian.net/@snomiao](https://afdian.net/@snomiao) - PAYPAL: [https://paypal.me/snomiao](https://paypal.me/snomiao) - - 支付宝捐助账号: [snomiao@gmail.com (点击查看二维码)](./docs/支付宝捐助.png) + - Alipay donation account: [snomiao@gmail.com (click to view QR code)](./docs/支付宝捐助.png) - ETH: [0xdc2eece11a9e09c8db921989e54b30375446e49e](https://etherscan.io/address/0xdc2eece11a9e09c8db921989e54b30375446e49e) -- [发展路线](#发展路线-roadmap) - -### 捐赠记录(截至 20210821) 📄 Donate Records - -| 捐赠时间 | 名称 | 渠道 | 金额 | 备注 | -| ---------- | -------------------------------- | ----------- | ----------- | -------------------------------------------------------------- | -| 2021-06-19 | \*\*煜 | Alipay QR | +50.00 CNY | 小小資助,支持獨立開發者 | -| 2023-05-12 | 卡拉翁 | 微信转账 | +200.00 CNY | 🫡 (敬礼) | -| 2023-06-09 | [@andriasw](github.com/andriasw) | Alipay 转账 | +66.66 CNY | for CapsLockX-mac, 66.66 is good (https://github.com/andriasw) | -| 2023-12-19 | 慧蛋 | QQ 红包 | +45.00 CNY | 请开发者喝咖啡 | - -### 鸣谢 🙏🏻 Thanks - -- 感谢来自以上捐赠者的经济支持。 -- 感谢 [秦金伟](http://rsytes.coding-pages.com/) 的引用推荐文章、和发展建议:[2020-02-23 当键盘模拟鼠标 - 简书](https://www.jianshu.com/p/f757f56a7de6) -- 感谢 @河许人 帮助转载推广: [CapsLockX – 像黑客一样操作电脑!【雪星】 – AutoAHK](https://www.autoahk.com/archives/34996) -- 感谢在 issues 里和群里提问并帮助完善 CapsLockX 的各位。 - -### 相关话题 - Related Topics - -- [秦金伟](http://rsytes.coding-pages.com/) - - [2020-02-23 当键盘模拟鼠标 - qwertc]( https://mp.weixin.qq.com/s?__biz=MzIzNzczOTkzMw==&mid=2247483745&idx=1&sn=16f16c1fa02e1ef386a83f3023fb109d&chksm=e8c54b93dfb2c285e49fa8045d2380b20810768e3be043f364be146a598faf5f363bbb2623e7&scene=21#wechat_redirect ) - - [2020-10-26 键盘模拟鼠标2 - qwertc]( https://mp.weixin.qq.com/s?__biz=MzIzNzczOTkzMw==&mid=2247484272&idx=1&sn=0ed1ff91bee008fc5c01dc0fe20e53ba&chksm=e8c54982dfb2c09493c88a0f7847ffb0b508598e0756ddd7e8ad94d1f31f65490388d6cff7a4&scene=21#wechat_redirect ) - - [2021-03-11 capslockX-治愈鼠标手 - qwertc](https://mp.weixin.qq.com/s?__biz=MzIzNzczOTkzMw==&mid=2247484478&idx=1&sn=1518d7ec4dc08c1a72c08fcaff98550e&chksm=e8c54eccdfb2c7daed0ad9b8c03395e4211e029199374f4bc0dbdc9a8403c2dae86b740c95c5&scene=21#wechat_redirect) - - 2021年11月,键盘模拟鼠标3 - - [2022-08-21 t0820 复制后匹配-siyuan-clx-截图 - qwertc]( https://mp.weixin.qq.com/s?__biz=MzIzNzczOTkzMw==&mid=2247485441&idx=1&sn=848d5e6f3fb7c1e7b14100615ca7d0db&chksm=e8c542f3dfb2cbe5770fe19bb8b5c81935e52a4a686154e69104bc403ab6ce960d1b6ae429a9&scene=21#wechat_redirect ) - - [2024-01-06 t0106 OpenAI加持的CapslockX - qwertc]( https://mp.weixin.qq.com/s?__biz=MzIzNzczOTkzMw==&mid=2247485707&idx=1&sn=d40eea9f0b5bb81e3387ec592def4ed0&chksm=e8c543f9dfb2caef90939e2fafcb324fd757949c79399c55adfbab0940e70efd753fb6bf3837&token=1464360155&lang=zh_CN#rd) -- [有没有办法将 Chrome OS 中的快捷键实现到 Windows 10 中 - V2EX](https://www.v2ex.com/t/778967) -- [推荐一下我的键位映射工具 MyKeymap - V2EX](https://v2ex.com/t/844432) -- [有多少人会把键盘上的 CapsLock 和 Backspace 对调? - V2EX](https://www.v2ex.com/t/855901) -- [分享一个用 CapsLock+H/J/K/L 模拟方向键的小工具 - V2EX](https://www.v2ex.com/t/318182) -- [推荐一个适合程序员的效率工具 AltPlus,左边大拇指按下 Alt 键,就可以像使用 vim 一样编程了. - V2EX](https://www.v2ex.com/t/800721) -- [CapsLockX - 像黑客一样操作电脑 - V2EX](https://v2ex.com/t/772052#reply1) -- [CapsLockX - 像黑客一样操作电脑! - AutoHotkey Community](https://www.autohotkey.com/boards/viewtopic.php?f=28&t=88593) +- [Development Roadmap](#发展路线-roadmap) + +### Donation Records (as of 20210821) 📄 Donate Records + +| Donation Date | Name | Channel | Amount | Comment | +| ------------- | -------------------------------- | --------------- | ----------- | -------------------------------------------------------------- | +| 2021-06-19 | \*\*Yu | Alipay QR | +50.00 CNY | A little support, in favor of independent developers | +| 2023-05-12 | Karawen | WeChat Transfer | +200.00 CNY | 🫡 (Salute) | +| 2023-06-09 | [@andriasw](github.com/andriasw) | Alipay Transfer | +66.66 CNY | for CapsLockX-mac, 66.66 is good (https://github.com/andriasw) | +| 2023-12-19 | Huidan | QQ Red Packet | +45.00 CNY | Buy the developer a coffee | + +### Acknowledgements 🙏🏻 Thanks + +- Thank you for the financial support from the above donors. +- Thanks to [Qin Jinwei](http://rsytes.coding-pages.com/) for the citation recommendation article and development suggestions: [2020-02-23 When Keyboard Simulates Mouse - Jianshu](https://www.jianshu.com/p/f757f56a7de6) +- Thanks to @He Xuren for helping with the dissemination: [CapsLockX – Operate the computer like a hacker! 【Xue Xing】 – AutoAHK](https://www.autoahk.com/archives/34996) +- Thank you to those who asked questions in the issues and in the group and helped to improve CapsLockX. + +### Related Topics - Related Topics + +- [Qin Jinwei](http://rsytes.coding-pages.com/) + - [2020-02-23 When Keyboard Simulates Mouse - qwertc](https://mp.weixin.qq.com/s?__biz=MzIzNzczOTkzMw==&mid=2247483745&idx=1&sn=16f16c1fa02e1ef386a83f3023fb109d&chksm=e8c54b93dfb2c285e49fa8045d2380b20810768e3be043f364be146a598faf5f363bbb2623e7&scene=21#wechat_redirect) + - [2020-10-26 Keyboard Simulates Mouse 2 - qwertc](https://mp.weixin.qq.com/s?__biz=MzIzNzczOTkzMw==&mid=2247484272&idx=1&sn=0ed1ff91bee008fc5c01dc0fe20e53ba&chksm=e8c54982dfb2c09493c88a0f7847ffb0b508598e0756ddd7e8ad94d1f31f65490388d6cff7a4&scene=21#wechat_redirect) + - [2021-03-11 capslockX-Cure Mouse Hand - qwertc](https://mp.weixin.qq.com/s?__biz=MzIzNzczOTkzMw==&mid=2247484478&idx=1&sn=1518d7ec4dc08c1a72c08fcaff98550e&chksm=e8c54eccdfb2c7daed0ad9b8c03395e4211e029199374f4bc0dbdc9a8403c2dae86b740c95c5&scene=21#wechat_redirect) + - November 2021, Keyboard Simulates Mouse 3 + - [2022-08-21 t0820 After Copy Match-siyuan-clx-Screenshot - qwertc](https://mp.weixin.qq.com/s?__biz=MzIzNzczOTkzMw==&mid=2247485441&idx=1&sn=848d5e6f3fb7c1e7b14100615ca7d0db&chksm=e8c542f3dfb2cbe5770fe19bb8b5c81935e52a4a686154e69104bc403ab6ce960d1b6ae429a9&scene=21#wechat_redirect) + - [2024-01-06 t0106 OpenAI-empowered CapslockX - qwertc](https://mp.weixin.qq.com/s?__biz=MzIzNzczOTkzMw==&mid=2247485707&idx=1&sn=d40eea9f0b5bb81e3387ec592def4ed0&chksm=e8c543f9dfb2caef90939e2fafcb324fd757949c79399c55adfbab0940e70efd753fb6bf3837&token=1464360155&lang=zh_CN#rd) +- [Is there any way to implement the shortcuts in Chrome OS into Windows 10 - V2EX](https://www.v2ex.com/t/778967) +- [Recommend My Key Mapping Tool MyKeymap - V2EX](https://v2ex.com/t/844432) +- [How Many People Would Swap CapsLock and Backspace on their Keyboard? - V2EX](https://www.v2ex.com/t/855901) +- [Share a Small Tool that Uses CapsLock+H/J/K/L to Simulate Arrow Keys - V2EX](https://www.v2ex.com/t/318182) +- [Recommended Efficiency Tool for Programmers AltPlus, Pressing Alt with Left Thumb You Can Code Like Using vim - V2EX](https://www.v2ex.com/t/800721) +- [CapsLockX - Operate the Computer Like a Hacker - V2EX](https://v2ex.com/t/772052#reply1) +- [CapsLockX - Operate the Computer Like a Hacker! - AutoHotkey Community](https://www.autohotkey.com/boards/viewtopic.php?f=28&t=88593) - [(10) What are some good career alternatives for a computer programmer with RSI? - Quora](https://www.quora.com/Repetitive-Strain-Injury-RSI/What-are-some-good-career-alternatives-for-a-computer-programmer-with-RSI) -- [如何将电脑桌面划分为独立的两半? - 知乎](https://www.zhihu.com/questionz/23443944/answer/1670521971) -- [有哪位残友用的是单手键盘? - 知乎](https://www.zhihu.com/question/50621709/answer/1681247637) -- [(5 封私信 - 50 条消息) 怎么样才能只用键盘不用鼠标,包括任何指针触控设备,并优雅地使用电脑? - 知乎](https://www.zhihu.com/question/21281518/answer/1770669886) -- [(5 封私信 - 50 条消息) 如何将电脑桌面划分为独立的两半? - 知乎](https://www.zhihu.com/question/23443944/answer/1670521971) -- [我是职场达人,AutoHotKey 让我成为职场超人 - 知乎](https://zhuanlan.zhihu.com/p/60372361) -- [AutoHotKey 中文网专栏 - 知乎](https://www.zhihu.com/column/autoahk) -- [电脑一族如何防治“鼠标手” - 陕西日报](http://www.sxjkjy.com/uploadfiles/files/2017062110481454.pdf) - -## 页尾目录 - Table of Contents - -- [CapsLockX - 💻 Get Hacker's Keyboard. 像**黑客**一样操作电脑](#capslockx----get-hackers-keyboard-像黑客一样操作电脑) - - [版本墙 - 徽章墙 📛 Badges](#版本墙---徽章墙--badges) - - [新手快速入门教程 📖 Tutorial](#新手快速入门教程--tutorial) - - [简易入门教程(读完这一小节,便算是入门了 CapsLockX 的使用 )](#简易入门教程读完这一小节便算是入门了-capslockx-的使用-) - - [进阶参考手册 🦽 Manual](#进阶参考手册--manual) - - [安装与使用 🛠 Installation](#安装与使用--installation) - - [绿色便携程序包(新手适用,稳定版) 📦 Packaged Bins](#绿色便携程序包新手适用稳定版--packaged-bins) - - [命令行方式安装(进阶用户推荐,可自动更新)🖥️ Install by command](#命令行方式安装进阶用户推荐可自动更新️-install-by-command) - - [使用手册 📖 - Usage Manual](#使用手册----usage-manual) - - [基础操作](#基础操作) - - [模块说明](#模块说明) - - [多任务工作的噩梦 - Nightmares of Multitasking](#多任务工作的噩梦---nightmares-of-multitasking) - - [虚拟桌面概述:情景模式、工作桌面、娱乐桌面、项目分类……](#虚拟桌面概述情景模式工作桌面娱乐桌面项目分类) - - [Windows 窗口切换的用户体验提升 - Win+tab](#windows-窗口切换的用户体验提升---wintab) +- [How to Divide the Computer Desktop into Two Separate Halves? - Zhihu](https://www.zhihu.com/questionz/23443944/answer/1670521971) +- [Is there any person with disabilities here who uses a one-handed keyboard? - Zhihu](https://www.zhihu.com/question/50621709/answer/1681247637) +- [(5 messages - 50 comments) How to use a computer elegantly without using a mouse or any other pointer touch device using only a keyboard? - Zhihu](https://www.zhihu.com/question/21281518/answer/1770669886) +- [(5 messages - 50 comments) How to Divide the Computer Desktop into Two Separate Halves? - Zhihu](https://www.zhihu.com/question/23443944/answer/1670521971) +- [I am a Workplace Expert, AutoHotKey Made Me a Workplace Superhuman - Zhihu](https://zhuanlan.zhihu.com/p/60372361) +- [AutoHotKey Chinese Site Column - Zhihu](https://www.zhihu.com/column/autoahk) +- [How to Prevent and Treat "Mouse Hand" for Computer Users - Shaanxi Daily](http://www.sxjkjy.com/uploadfiles/files/2017062110481454.pdf) + +## Footer Catalog - Table of Contents + +- [CapsLockX - 💻 Get Hacker's Keyboard. Operate your computer like a **hacker**](#capslockx----get-hackers-keyboard-operate-your-computer-like-a-hacker) + - [Version Wall - Badge Wall 📛 Badges](#version-wall---badge-wall--badges) + - [Beginner's Quick Start Tutorial 📖 Tutorial](#beginners-quick-start-tutorial--tutorial) + - [Simple Introduction Tutorial (Once you read this section, you're considered to have started using CapsLockX)](#simple-introduction-tutorial-once-you-read-this-section-youre-considered-to-have-started-using-capslockx-) + - [Advanced Reference Manual 🦽 Manual](#advanced-reference-manual--manual) + - [Installation and Usage 🛠 Installation](#installation-and-usage--installation) + - [Green Portable Package (Suitable for beginners, stable version) 📦 Packaged Bins](#green-portable-package-suitable-for-beginners-stable-version--packaged-bins) + - [Command Line Installation (Recommended for advanced users, supports auto-update)🖥️ Install by command](#command-line-installation-recommended-for-advanced-users-supports-auto-update️-install-by-command) + - [Usage Manual 📖 - Usage Manual](#usage-manual----usage-manual) + - [Basic Operations](#basic-operations) + - [Module Descriptions](#module-descriptions) + - [Nightmares of Multitasking](#nightmares-of-multitasking) + - [Virtual Desktop Overview: Scenarios Mode, Work Desktop, Entertainment Desktop, Project Categorization...](#virtual-desktop-overview-scenarios-mode-work-desktop-entertainment-desktop-project-categorization) + - [Improvement of User Experience in Windows Window Switching - Win+tab](#improvement-of-user-experience-in-windows-window-switching---wintab) - [TODO-Docs](#todo-docs) - - [焦点数量:活动窗口、默认活动窗口、……](#焦点数量活动窗口默认活动窗口) - - [多屏幕的利用 - Multi-screening](#多屏幕的利用---multi-screening) - - [4K 时代的窗口排列 - Window arrange with 4k screen](#4k-时代的窗口排列---window-arrange-with-4k-screen) - - [Linux 与 Mac 窗口的管理 - Window Manager in Linux and mac](#linux-与-mac-窗口的管理---window-manager-in-linux-and-mac) - - [Android 与 iOS 的窗口管理 - Window Manage in android](#android-与-ios-的窗口管理---window-manage-in-android) - - [编辑操作的困扰](#编辑操作的困扰) - - [键入区与编辑控制区的疏远](#键入区与编辑控制区的疏远) - - [并击的概念](#并击的概念) - - [图形界面的困扰](#图形界面的困扰) - - [人类的速度认知](#人类的速度认知) - - [软件的热键缺陷](#软件的热键缺陷) - - [便携键盘的可用性](#便携键盘的可用性) - - [帮助模块](#帮助模块) - - [本模块功能见下](#本模块功能见下) - - [Anki 增强模块](#anki-增强模块) - - [常用功能/特性](#常用功能特性) - - [说明](#说明) + - [Focus Amount: Active Window, Default Active Window,...](#focus-amount-active-window-default-active-window) + - [Utilization of Multiple Screens - Multi-screening](#utilization-of-multiple-screens---multi-screening) + - [Window Arrangement in the 4K Era - Window arrange with 4k screen](#window-arrangement-in-the-4k-era---window-arrange-with-4k-screen) + - [Window Management in Linux and Mac - Window Manager in Linux and Mac](#window-management-in-linux-and-mac---window-manager-in-linux-and-mac) + - [Window Management in Android and iOS - Window Management in Android](#window-management-in-android-and-ios---window-management-in-android) + - [Troubles with Edit Operations](#troubles-with-edit-operations) + - [Estrangement between Typing Area and Editing Control Area](#estrangement-between-typing-area-and-editing-control-area) + - [The Concept of Chording](#the-concept-of-chording) + - [Troubles with Graphic User Interface](#troubles-with-graphic-user-interface) + - [Human Perception of Speed](#human-perception-of-speed) + - [Hotkey Flaws of Software](#hotkey-flaws-of-software) + - [Usability of Portable Keyboards](#usability-of-portable-keyboards) + - [Help Module](#help-module) + - [Functions of this module as follows](#functions-of-this-module-as-follows) + - [Anki Enhancement Module](#anki-enhancement-module) + - [Common Features/Characteristics](#common-featurescharacteristics) + - [Explanations](#explanations) - [Figma Enhanced](#figma-enhanced) - - [常用功能/特性](#常用功能特性-1) - - [说明](#说明-1) - - [OneNote 2016 - 2019 增强](#onenote-2016---2019-增强) - - [雪星喵常用功能](#雪星喵常用功能) - - [按键分布设计(开发中)](#按键分布设计开发中) - - [详细按键表 / CheatSheet](#详细按键表--cheatsheet) - - [编辑增强插件( TG YUIO HJKL ) 🌟](#编辑增强插件-tg-yuio-hjkl--) - - [Surface 笔记本扩充功能键](#surface-笔记本扩充功能键) - - [媒体键模块](#媒体键模块) - - [模拟鼠标插件( WASD QERF )](#模拟鼠标插件-wasd-qerf-) - - [功能](#功能) - - [使用方法如下](#使用方法如下) - - [操作细节](#操作细节) - - [JavaScript 计算 (建议安装 NodeJS )](#javascript-计算-建议安装-nodejs-) - - [窗口增强插件 (CLX + 1234567890 ZXCV)](#窗口增强插件-clx--1234567890-zxcv) - - [功能简述](#功能简述) - - [效果图](#效果图) - - [使用方法如下 ( Alt+Tab 与 CapsLockX )](#使用方法如下--alttab-与-capslockx-) - - [快捷输入](#快捷输入) - - [番茄时钟](#番茄时钟) - - [锁屏自动息屏](#锁屏自动息屏) - - [过去与未来 🛰](#过去与未来-) - - [制作背景 ( 2017 年秋) 🍁 Background](#制作背景--2017-年秋--background) - - [发展路线 🛰️ RoadMap](#发展路线-️-roadmap) - - [组合键含义设计 ⌨ Chore Design](#组合键含义设计--chore-design) - - [CapsLockX 与类似项目的功能对比 ⚔ Feat Compare Matrix](#capslockx-与类似项目的功能对比--feat-compare-matrix) - - [CapsLockX 地址 🔗 Project Urls](#capslockx-地址--project-urls) - - [相似项目地址 🔗 Similar Projects](#相似项目地址--similar-projects) - - [答疑相关 ❓ Questions](#答疑相关--questions) - - [隐私与安全性 🔒 Privacy](#隐私与安全性--privacy) - - [支持 ⭐️ Supports](#支持-️-supports) - - [捐赠记录(截至 20210821) 📄 Donate Records](#捐赠记录截至-20210821--donate-records) - - [鸣谢 🙏🏻 Thanks](#鸣谢--thanks) - - [相关话题 - Related Topics](#相关话题---related-topics) - - [页尾目录 - Table of Contents](#页尾目录---table-of-contents) + - [Common Features/Characteristics](#common-featurescharacteristics-1) + - [Explanations](#explanations-1) + - [OneNote 2016 - 2019 Enhancement](#onenote-2016---2019-enhancement) + - [Common Features Used by XuexingMiao](#common-features-used-by-xuexingmiao) + - [Key Distribution Design (Under Development)](#key-distribution-design-under-development) + - [Detailed Key Table / CheatSheet](#detailed-key-table--cheatsheet) + - [Editing Enhancement Plugin (TG YUIO HJKL) 🌟](#editing-enhancement-plugin-tg-yuio-hjkl--) + - [Expanded Function Keys for Surface Laptops](#expanded-function-keys-for-surface-laptops) + - [Media Key Module](#media-key-module) + - [Mouse Simulation Plugin (WASD QERF)](#mouse-simulation-plugin-wasd-qerf-) + - [Features](#features) + - [How to Use as follows](#how-to-use-as-follows) + - [Operational Details](#operational-details) + - [JavaScript Calculation (Installation of NodeJS Recommended)](#javascript-calculation-installation-of-nodejs-recommended-) + - [Window Enhancement Plugin (CLX + 1234567890 ZXCV)](#window-enhancement-plugin-clx--1234567890-zxcv) + - [Brief Description of the Features](#brief-description-of-the-features) + - [Effect Pictures](#effect-pictures) + - [How to Use as follows (Alt+Tab and CapsLockX)](#how-to-use-as-follows-alttab-and-capslockx-) + - [Quick Input](#quick-input) + - [Pomodoro Timer](#pomodoro-timer) + - [Auto Screen Off when Locking Screen](#auto-screen-off-when-locking-screen) + - [Past and Future 🛰](#past-and-future-) + - [Creation Background (Autumn 2017) 🍁 Background](#creation-background-autumn-2017--background) + - [Development Path 🛰️ RoadMap](#development-path-️-roadmap) + - [Combination Key Meaning Design ⌨ Chore Design](#combination-key-meaning-design--chore-design) + - [Feature Comparison of CapsLockX and Similar Projects ⚔ Feat Compare Matrix](#feature-comparison-of-capslockx-and-similar-projects--feat-compare-matrix) + - [CapsLockX Project Urls 🔗 Project Urls](#capslockx-project-urls--project-urls) + - [Urls of Similar Projects 🔗 Similar Projects](#urls-of-similar-projects--similar-projects) + - [FAQs Related ❓ Questions](#faqs-related--questions) + - [Privacy and Security 🔒 Privacy](#privacy-and-security--privacy) + - [Support ⭐️ Supports](#support-️-supports) + - [Donation Records (Up to 20210821) 📄 Donate Records](#donation-records-up-to-20210821--donate-records) + - [Acknowledgements 🙏🏻 Thanks](#acknowledgements--thanks) + - [Related Topics](#related-topics) + - [Footer Catalog - Table of Contents](#footer-catalog---table-of-contents) --- diff --git a/docs/README.md b/docs/README.md index fae6149..006febf 100644 --- a/docs/README.md +++ b/docs/README.md @@ -212,377 +212,242 @@ TODO: FN key, arrow keys, editing operations, 61-key layout vs 87-key layout, - - + + ### Help Module If you want to learn how to develop plugins for CapsLockX, please: -1. Open `Modules/@Help.ahk`, where you can learn the basic format of CapsLockX plugins. -2. Copy it and name it with your own plugin name. -3. Change its original functionality to what you need, and the plugin development is done! +1. Open `Modules/@Help.ahk`, where you'll be able to understand the basic format of CapsLockX plugins. +2. Make a copy of it and name it after your own plugin. +3. Modify its functionality to what you need, and your plugin development is done! -## Functionality of this module is described below +## The functions of this module are as follows -| Applied to | Key | Function | -| ---------- | --------------------- | ------------------------------------------------- | -| Global | CapsLockX + / | Temporarily display hotkey hints | -| Global | CapsLockX + Alt + / | 🔗 Open the full documentation page for CapsLockX | -| Global | CapsLockX + Shift + / | 🕷 Submit bugs, suggestions, etc. | +| Applies to | Key Combination | Function | +| ---------- | -------------------- | ---------------------------------- | +| Global | CapsLockX + / | Temporarily displays hotkey tips | +| Global | CapsLockX + Alt + / | 🔗 Opens CapsLockX's full doc page | +| Global | CapsLockX + Shift + /| 🕷 Submit bugs, suggestions, etc. | - + ### Anki Enhancement Module -Enhanced operations for Anki +Anki Operations Enhancement ## Common Features/Characteristics -1. Use WASD or HJKL to quickly and continuously (and reversibly) switch between flashcards. -2. Create a word list in Excel with 2 columns, select all, copy, and then press Alt + i in Anki to quickly import the list of words. -3. Simplify the 4 options to 3 directional keys, left for easy, down for medium, right for hard, up to undo. -4. Can be used in conjunction with a gamepad, use XPadder to configure the gamepad joystick to map to the directional keys. For effect, see bilibili [Zhōngèr xuě xīng zěn bèi cí - How can a gamepad not be used for memorizing words!](https://www.bilibili.com/video/av8456838/) - -## Instructions - -| Mode | Anki Enhancement Module | Description | -| -------------------------- | :---------------------: | ----------------------------------------------------------------------------------------- | -| In Anki-Study Interface | `w or k or ↑` | Press to undo, release to show answer | -| In Anki-Study Interface | `a or h or ←` | Press for easy, release to show answer | -| In Anki-Study Interface | `s or j or ↓` | Press for good, release to show answer | -| In Anki-Study Interface | `d or l or →` | Press for hard, release to show answer | -| In Anki-Study Interface | `q` | Go back to the previous interface | -| In Anki-Study Interface | `c` | Add a new card | -| In Anki-Study Interface | `1 or NumPad1` | Hard (original key position) | -| In Anki-Study Interface | `2 or NumPad2` | Again (original key position) | -| In Anki-Study Interface | `3 or NumPad3` | Good (original key position) | -| In Anki-Study Interface | `4 or NumPad4` | Easy (original key position) | -| In Anki-Study Interface | `5 or NumPad5` | Undo | -| In Anki-Study Interface | `6 or NumPad6` | Suspend card | -| In Anki-Study Interface | `Alt + i` | Quickly import contents from the clipboard (separated by Tab) / e.g., can copy from Excel | -| In Anki-Add Card Interface | `Alt + s` | Press the Add button | - - - -### OneNote 2016 - 2019 Enhancements - -Simply enhance the keyboard operations in OneNote 2016 - 2019, conveniently use the keyboard to: change pens, create links, organize pages, adjust views... - -## Common Features of Snowstar Meow - -1. When making diary entries, first add a date tag to the note title on the note page with `Alt + T` (for future searches), then use the global shortcut `Win + Shift + N` to search for all notes with the tag 'Today' in OneNote. It makes it easy to retrieve your daily records: love diary, training logs, daily reading lists, project reports... In short, writing a diary in OneNote is very convenient, they just pop up with a keystroke, no need to search XD -2. Select a word and press `Alt + K`, and it will list all the related page links underneath that word, to create an index directory, weaving your OneNote into a web. -3. Create a new note, rename it to `My Clipboard`, and when you copy text or pictures, CLX will automatically append them to this note for you, making it easy to collect materials or excerpt articles. -4. Alt + 1234567 for hierarchical folding, easily switch between different levels of abstract thinking. - -## Keyboard Layout Design (Under Development) - -| Key Description | Function | Remarks | -| ---------------------------- | ----------------------------------------- | ---------------------- | -| `All OneNote Hotkeys` | Original functions | | -| `Press Alt then another key` | Trigger OneNote's original menu functions | | -| `Alt + 1234567` | Outline collapse/expand to levels 1-7 | | -| `Alt + qwe asd r` | Tools, change pen, view | | -| `Alt + f` | Find tags | | -| `Alt + -=` | Formula related | | -| `Alt + m` | Move notes, sections | | -| `Alt + hjkl` | Various linking functions | | -| `Alt + zxcv` | Advanced copy-paste | Details in development | -| `Alt + /` | Hotkey help, hints | Under development | -| `F2 F3` | Rename, search notes | | - -## Detailed Key Bindings / CheatSheet - -| Applies To | Hotkey | Function | -| ------------------------------ | ---------------------------- | ------------------------------------------------------------------------------------------------------ | -| Global | `Win + Alt + N` | Open the first page of Quick Notes (compensates for OneNote's lack of a home page concept like Notion) | -| Global | `Win + Shift + N` | Open OneNote and search precisely for today's tag | -| OneNote2019 | `Alt + 1234567` | Outline: Expand or collapse the outline to that level (highly recommended, very useful) | -| OneNote2019 | `F2` | Organize: Rename note | -| OneNote2019 | `Shift + F2` | Organize: Rename section | -| OneNote2019 | `Alt + m` | Organize: Move note | -| OneNote2019 | `Alt + Shift + m` | Organize: Move section | -| OneNote2019 | `Ctrl + n` | Organize: Create new note | -| OneNote2019 | `Ctrl + Alt + n` | Organize: Create new note below current one | -| OneNote2019 | `Alt + Delete` | Organize: Quickly delete current page | -| OneNote2019 | `Ctrl + s` | Organize: Immediately synchronize this notebook | -| OneNote2019 | `Ctrl + w` | Organize: Close window | -| OneNote2019 | `Shift + Delete` | Edit: Quickly delete current line | -| OneNote2019 | `Alt + -` | Edit: Auto-convert equations to 2D | -| OneNote2019 | `Alt + k` | Edit: ⭐🔗 Expand links to pages related to the current keyword (fast keyword one-to-many linking) | -| OneNote2019 | `Alt + n` | Style: Switch page to colorless background | -| OneNote2019 | `Alt + v` | Style: Change text background color | -| OneNote2019 | `Alt + q` | Tool: Dragging | -| OneNote2019 | `Alt + w` | Tool: Latch | -| OneNote2019 | `Alt + e` | Tool: Eraser | -| OneNote2019 | `Alt + s` | Tool: Input | -| OneNote2019 | `Alt + a` | Tool: Switch to second pen | -| OneNote2019 | `Alt + d` | Tool: Open pen tray (select pen with arrow keys (currently ineffective fullscreen)) | -| OneNote2019 | `Alt + d -> 1234567` | Tool: Open pen tray (then select the 1st row x pen) (currently ineffective fullscreen) | -| OneNote2019 | `Alt + d -> Shift + 1234567` | Tool: Open pen tray (then select the 2nd row x pen) (currently ineffective fullscreen) | -| OneNote2019 | `Alt + r` | View: Zoom to original size | -| OneNote2019 | `Alt + y` | View: Zoom to page width | -| OneNote2019 | `^!+- or ^!+=` | View: Zoom out or zoom in page | -| OneNote2019 | `Alt + f` | View: Search for tags | -| OneNote2019 | `Alt + t` | Edit: Add the date tag to the note, e.g., (20220717) | -| OneNote2019 | `Ctrl + Shift + c` | Edit: Copy (plain text) | -| OneNote2019 | `Ctrl + Shift + v` | Edit: Paste (plain text) | -| OneNote2019 Create Link Window | `Alt + s` | Edit: Copy links to all search result pages | -| OneNote2019 Create Link Window | `Alt + Shift + s` | Edit: Copy and paste links to all search result pages | -| OneNote2019 Clipboard Note | `Ctrl + C` | Edit: ⭐ Append copied content to the note with "Clipboard" or "剪贴板" in its name | - - +1. Use WASD or HJKL for quick and consecutive (and reversible) switching of flashcards. +2. Create a word list in Excel with 2 columns, select all and copy, then press Alt + i in Anki to quickly import the word list. +3. Simplify the 4 options to 3 directional keys; left for easy, down for medium, right for hard, and up to undo. +4. Can be used with a game controller; use XPadder to map the controller's joystick to the directional keys. See the effect on bilibili ["How to Memorize Words with a Controller - Why not use a Controller to Memorize Words!"](https://www.bilibili.com/video/av8456838/) + +## Description + +| Mode | Anki Enhancement Module | Description | +| --------------------- | :---------------------: | ----------------------------------------------------------- | +| In Anki-Study Interface | `w or k or ↑` | Press=Undo, Release=Show answer | +| In Anki-St + + + +### Enhancements to OneNote 2016 - 2019 + +Simplify keyboard operation for OneNote 2016 - 2019, conveniently using keyboard shortcuts to: switch pens, create links, organize pages, adjust views... + +## Snowstar Cat's Common Features + +1. When making a journal entry, add a date tag to the note title with `Alt + T` (for future searches), then globally use `Win + Shift + N` to search all notes with Today's tag in OneNote, making it easy to retrieve your daily: love diaries, training logs, reading lists, project reports... In short, journaling in OneNote is very convenient, press and it appears, no need to search XD +2. Select a word and press `Alt + K`, it will list all related page links under this word, creating an index directory and interconnecting your OneNote. +3. Create a new note named `My Clipboard`, and when copying text or images, CLX (an assumed application or script) automatically appends it to this note for easily collecting information or excerpting articles. +4. Use `Alt + 1234567` for outline collapsing + + ### Xunfei Input Method Floating Window Plugin #### Usage -| Applies To | Key | Function Description | -| ---------- | :-----: | ---------------------------------- | -| Global | Win + H | Start/Switch to Xunfei Voice Input | +| Application | Shortcut | Function Description | +| ----------- | :----------: | ---------------------------- | +| Global | Win + Alt + H | Launch/Switch Xunfei Voice Input | -#### Notes +#### Note -1. The original `Win + H` function is Windows' built-in dictation. After installing this plugin, you can use the original Windows dictation with `Win + Shift + H`. -2. If Xunfei voice is not installed, it will automatically ask whether to guide the download and installation. +1. If Xunfei Voice Input is not installed, it will automatically prompt whether to guide the download and installation. -#### Effect is shown in the following image +#### The effect is as shown in the following figure -![App-Xunfei Voice Input Method Floating Window Demo.gif](./media/App-Xunfei Voice Input Method Floating Window Demo.gif) +![App-讯飞语音输入法悬浮窗演示.gif](./media/App-讯飞语音输入法悬浮窗演示.gif) - + -### CLX - Brainstorm +### CLX - Brainstorm Brainstorming -At any time, in any input field, press the `CLX+b` key to start using AI-assisted typing. +At any time, in any input box, press `CLX+b` to start using AI-assisted input. #### Key Layout (Under Development) -| Key Description | Function | Note | -| --------------- | -------------------------------------------------------------------------------------------------- | ---- | -| CLX + b | Automatically copy the current selection, enter a command, and let AI assist your typing | | -| CLX + Alt + b | Configure activation code (currently only a free plan, more features might be added in the future) | | -| CLX + Shift + b | Check usage quota | | +| Key Description | Function | Note | +| --------------- | ------------------------------------------------------ | ---- | +| CLX + b | Automatically copies the current selection, input commands, and lets AI assist your input | | +| CLX + Alt + b | Activate the activation code (currently free plan only, may include enhanced features in the future) | | +| CLX + Shift + b | Check usage quota | | #### Protips: -##### Organize meeting minutes anytime +##### Always Organize Meeting Notes -1. In any input box, use Win+H to call out voice input, then speak the text you want, no need for precision, just convey the general idea. -2. Then select all and press `CLX+b`, enter `List key points and to-do items`, and you can see the key points and to-do items automatically organized by AI. +1. Use Win+H to activate voice input in any input box, then speak the text you want, regardless of the accuracy of the voice input, just the general meaning is sufficient, +2. Then select all and press `CLX+b`, input `list key points and to-dos`, and you can see the AI automatically helps you organize key points and to-dos. -##### Translate any language to any language at any time +##### Instant Translation between Any Languages -1. In any input box, select the text you want to translate. -2. Then select all and press `CLX+b`, enter `to chinese:`, and AI will automatically input it in Chinese. +1. In any input box, select the text you want to translate +2. Then select all and press `CLX+b`, `to chinese:` AI will automatically input it in Chinese. - +试着翻译成中文 -### Editing Enhancement Plugin (TG YUIO HJKL) 🌟 + -Is there anything better in the world than Vim mode's HJKL cursor movement? There must be! -That's the accelerated HJKL smooth editing experience! Want to try letting your cursor perform a high-end maneuver like speeding around a drain? Install it! +### Editing Enhancement Plugin (TG YUIO HJKL) 🌟 -![EditorCursorMovement.gif](./media/EditorCursorMovement.gif) +Is there anything better in this world than moving the cursor with HJKL in Vim mode? +This is a must-have! +Introducing accelerated HJKL for a smooth editing experience! Ever thought about making your cursor drift like a car in a gutter? Install this! -| Scope | Edit Module | Description | -| ---------------- | --------------------- | ---------------------------------------------------------------- | -| Global(Basic) | `CapsLockX + h j k l` | Arrow keys: up, down, left, right | -| Global(Basic) | `CapsLockX + y o` | Home End | -| Global(Basic) | `CapsLockX + u i` | PageUp PageDown | -| Global(Basic) | `CapsLockX + [ ]` | Shift+Tab and Tab | -| Global(Basic) | `CapsLockX + g` | Enter | -| Global(Advanced) | `CapsLockX + t` | Delete | -| Global(Advanced) | `CapsLockX + hl` | Press hl together to select the current word | -| Global(Advanced) | `CapsLockX + kj` | Press kj together to select the current line | -| Global(Advanced) | `CapsLockX + h + t` | Move and delete: In most cases, it can replace the backspace key | +| Scope | Edit module | Description | +|------------|-------------------------|-----------------------------------| +| Global(Basic) | `CapsLockX + h j k l` | Arrow keys for up, down, left, right | +| Global(Basic) | `CapsLockX + y o` | Home, End | +| Global(Basic) | `CapsLockX + u i` | PageUp, PageDown | +| Global(Basic) | `CapsLockX + [ ]` | Shift+Tab and Tab | +| Global(Basic) | `CapsLockX + - + -### Surface Laptop Function Key Expansion +The Surface notebook's function key expansion -Cures all kinds of broken laptop keyboards +A cure for all kinds of broken laptop keyboards -1. No right Ctrl key? Combine Menu with right Ctrl, Menu can be used as Ctrl or Ctrl as Menu. -2. No Pause key? Win + Alt + P can also open system settings info. -3. To be supplemented +1. No right Ctrl key? Combine the Menu and the right Ctrl key, using the Menu as Ctrl or vice versa. +2. Missing a Pause key? Win + Alt + P also opens system settings information. +3. To be added -| Mode | Key | Function | -| -------------------------- | :---------------------------------------------------------- | -------------------------------------------------------------- | -| Global | Win + Alt + P | Equivalent to Win + Pause, designed for notebooks | -| Global | Press right Ctrl briefly | Presses Menu to pop up the menu | -| Global | Hold right Menu | Holding will press Ctrl, which can be combined with other keys | -| Win key simulation enabled | Hold ] while pressing [ | Equivalent to pressing the Win key | -| Win key simulation enabled | RAlt+\| is equivalent to pressing Alt+Tab on the right hand | +| Mode | Key Combination | Function | +| ------------------- | :-------------------------------- | ------------------------------------------- | +| Global | Win + Alt + P | Equivalent to Win + Pause, customized for notebooks | +| Global | Tap right Ctrl | Will tap the Menu to pop up the context menu | +| Global | Hold right Menu | Acts as holding Ctrl, can be combined with other keys | +| Win key simulation activated | Hold ] and press [ | Equivalent to pressing the Win key | +| Win key simulation activated | RAlt + \| is equivalent to pressing Alt + Tab but on the right hand | - + -### Media Keys Module +### Media Key Module -| Applies To | Media Keys Module | Description | -| ---------- | ----------------- | ----------------------------------------------------- | -| Global | `CapsLockX + F1` | Open: My Computer | -| Global | `CapsLockX + F2` | Open: Calculator | -| Global | `CapsLockX + F3` | Open: Browser homepage | -| Global | `CapsLockX + F4` | Open: Media library (default is Windows Media Player) | -| Global | `CapsLockX + F5` | Playback: Pause/Play | -| Global | `CapsLockX + F6` | Playback: Previous track | -| Global | `CapsLockX + F7` | Playback: Next track | -| Global | `CapsLockX + F8` | Playback: Stop | -| Global | `CapsLockX + F9` | Volume up | -| Global | `CapsLockX + F10` | Volume down | -| Global | `CapsLockX + F11` | Mute | +| Applies to | Media Key Module | Description | +|------------|-----------------------|----------------------------------------------| +| Global | `CapsLockX + F1` | Open: My Computer | +| Global | `CapsLockX + F2` | Open: Calculator | +| Global | `CapsLockX + F3` | Open: Browser Homepage | +| Global | `CapsLockX + F4` | Open: Media Library (defaults to Windows Media Player) | +| Global | `CapsLockX + F5` | Play: Pause/Play | +| Global | `CapsLockX + F6` | Play: Previous Track | +| Global | `CapsLockX + F7` | Play: Next Track | +| Global | `CapsLockX + F8` | Play: Stop | +| Global | `CapsLockX + F9` | Volume Up | +| Global | `CapsLockX + F10` | Volume Down - + -### Simulated Mouse Plugin (WASD QERF) +### Mouse Simulation Plugin (WASD QERF) -> I have always prided myself on being a keyboard enthusiast, probably starting when I injured my finger joints while working on models, becoming a heavy keyboard user. Various keyboard acceleration tools, actively remembering various shortcuts, trying to use the mouse less, even learning vim and emacs. But many times, the mouse is irreplaceable, especially when graphical interfaces are prevalent. +> I've always prided myself on being a keyboard warrior, likely starting after injuring my finger joints while modeling in the past, thus becoming a heavy keyboard user. I use various keyboard acceleration tools and actively memorize a multitude of shortcuts to minimize mouse usage, even learning vim and emacs. However, many times the mouse is irreplaceable, especially when graphical interfaces are prevalent. -—— The above is a quote from the author of [SimClick](https://github.com/rywiki/simclick), a project for simulating mouse actions through grid partitioning, which can complement this project. +—— The above is a passage from the author of [SimClick Mouse Simulation](https://github.com/rywiki/simclick), a work that simulates mouse behavior through a grid subdivision approach and can complement this project. —— Recommended by [Qin Jinwei](http://rsytes.coding-pages.com/) ## Features - This module uses the key area: CapsLockX + QWER ASDF -- Very comfortably use WASD QE RF to simulate [full] mouse functionality, believe me, after trying this feel, you'll love it. -- The pointer automatically sticks to various buttons, hyperlinks when moved. The wheel's exponentially accelerating scrolling mechanism means you'll no longer fear super long articles and web pages. -- The effect is shown in the image: - ![CLX-Mouse.gif](./media/CLX-Mouse.gif) +- Comfortably use WASD QE RF to simulate [complete] mouse functionality. Trust me, after trying this feel, you'll like it. +- The pointer automatically sticks to various buttons and hyperlinks when moving. The exponential growth of the wheel's acceleration scroll mechanism means you'll no longer fear super long articles and web pages. +- For effect -## Instructions for Use + -| Applies to | Key Combination | Description | -| ---------- | ------------------------------------- | ------------------------------------------------------------- | -| Global | `CapsLockX + w a s d` | Mouse movement (up, down, left, right) | -| Global | `CapsLockX + ad` | Toggle HJKL keys to wheel mode (scroll up, down, left, right) | -| Global | `CapsLockX + r f` | Vertical scroll wheel (up, down) | -| Global | `CapsLockX + Shift + r f` | Horizontal scroll wheel (left, right) | -| Global | `CapsLockX + Ctrl + Alt + r f` | Auto vertical scroll (up, down) | -| Global | `CapsLockX + Ctrl + Alt + Shift+ r f` | Auto horizontal scroll (left, right) | -| Global | `CapsLockX + rf` | Pressing rf together is equivalent to the middle mouse button | -| Global | `CapsLockX + e` | Left mouse button | -| Global | `CapsLockX + q` | Right mouse button | +### JavaScript Calculation (NodeJS installation recommended) -## Operation Details +| Applies to | Key Combination | Effect | +| ---------- | --------------------- | ---------------------------------------------- | +| Global | `CapsLockX + -` | Calculate the selected JavaScript expression and replace it | +| Global | `CapsLockX + =` | Calculate the selected JavaScript expression and replace it | -Quick tap AD for stepping + - +### Window Enhancement Plugin (CLX + 1234567890 ZXCV) -### JavaScript Evaluation (NodeJS installation recommended) +## Feature Summary -| Applies to | Hotkey | Effect | -| ---------- | --------------- | --------------------------------------------------------------------------------- | -| Global | `CapsLockX + -` | Calculate and replace the current selection with the JavaScript expression result | -| Global | `CapsLockX + =` | Calculate and replace the current selection with the JavaScript expression result | +Make good use of the Win 10's built-in 10 virtual desktops with a luxury configuration, automatic window arrangement for multiple monitors, translucent pinning to the top (note: taskbar and AltTab related features are not yet compatible with Win11, but window arrangement functions work normally). - +1. Window switching: `CapsLockX + [Shift] + Z` +2. Window closing: `CapsLockX + [Shift] + X` +3. Window arranging: `CapsLockX + [Shift] + C` +4. Window pinning: `CapsLockX + [Shift] + V` +5. Left-hand window management: In the `Alt + Tab` interface, use `WASD` to switch windows, `X` to close the window. +6. Efficient use of virtual desktops: `CapsLockX + 0123456789` to switch or modify virtual desktops, add `Shift` to transfer the current window +7. -### Window Enhancement Plugin (CLX + 1234567890 ZXCV) + + +### Shortcut Input + +| Mode | Shortcut Input | Description | +| ---- | -------------- | ------------------------------------------------ | +| Global | `#D#` | Date input: e.g., `(20220217)` | +| Global | `#T#` | Time input: e.g., `(20220217.220717)` | +| Global | `#DT#` | Date and time input: `2022-02-17 22:07:33` | +| Global | `#NPW#` | Random numeric password, e.g.: `7500331260229289` | +| Global | `#PW#` | Random alphanumeric password, e.g.: `yyCTCNYodECTLr2h` | +| Global | `#WPW#` | Random alphanumeric password, e.g.: `FtD5BB1m5H98eY7Y` | +| Global | `#SPW#` | Random alphanumeric and symbol password, e.g.: `/})y+xK]z~>XKQ+p` | -## Feature Overview - -Make the most of Win 10's luxurious configuration with 10 built-in virtual desktops, automatic window arrangement for multi-monitors, translucent always-on-top (Note: Taskbar and AltTab related features are temporarily incompatible with Win11, but window arrangement functions normally.) - -1. Window Switching: `CapsLockX + [Shift] + Z` -2. Window Closing: `CapsLockX + [Shift] + X` -3. Window Arrangement: `CapsLockX + [Shift] + C` -4. Always On Top: `CapsLockX + [Shift] + V` -5. Left-Handed Window Management: In the `Alt + Tab` interface, use `WASD` to switch windows, and `X` to close a window. -6. Efficient Use of Virtual Desktops: `CapsLockX + 0123456789` to switch, add or remove virtual desktops; use the `Shift` key to transfer the current window. -7. Quick Release from Virtual Machines and Remote Desktops: Double click the left `Shift + Ctrl + Alt`. - -## Effect Picture - -- Enhanced Alt+Tab Window Management - ![02-Plugin-Enhanced Window Management_Alt+Tab+WASD Window Management.gif](./02-Plugin-Enhanced Window Management_Alt+Tab+WASD Window Management.gif) -- CapsLockX + C to arrange windows with one click (This GIF was recorded on an older version which looks a bit laggy, but the new version has optimized the API so it's not laggy anymore) - ![02-Plugin-Enhanced Window Management_One-Click Arrange Windows.gif](./media/02-Plugin-Enhanced Window Management_One-Click Arrange Windows.gif) - -## Usage Instructions ( Alt+Tab and CapsLockX ) - -| Scope | Window Enhancement Module | Description | -| ------------ | ------------------------------------- | ------------------------------------------------------------------------ | -| Alt+Tab UI | `Q E` | Switch between virtual desktops left and right | -| Alt+Tab UI | `W A S D` | Switch window selection up, down, left, and right | -| Alt+Tab UI | `X C` | Close the selected window (currently no difference between X and C) | -| Win+Tab View | `Alt + W A S D` | Switch window selection | -| Global | `Win + [Shift] + B` | Navigate to system tray tasks (Windows native hotkey) | -| Global | `Win + [Shift] + T` | Navigate to taskbar tasks (Windows native hotkey) | -| Global | `Win + Shift + hjkl` | Switch focus between windows in direction | -| Taskbar | `Ctrl + W or Delete` | Choose the exit button on the tray icon or taskbar task | -| Global | `CapsLockX + 1 2 ... 9 0` | Switch to desktop 1 .. 12 | -| Global | `CapsLockX + Shift + 1 2 ... 9 0 - =` | Move the current window to the nth desktop (if available) | -| Global | `CapsLockX + Alt + Backspace` | Delete current desktop (all windows moved to previous desktop) | -| Global | `CapsLockX + C` | Quickly arrange windows on current desktop | -| Global | `CapsLockX + Ctrl + C` | Quickly arrange windows on current desktop (including minimized windows) | -| Global | `CapsLockX + Shift + C` | Quickly stack windows on current desktop | -| Global | `CapsLockX + Shift + Ctrl + C` | Quickly stack windows on current desktop (including minimized windows) | -| Global | `CapsLockX + Z` | Cycle to most recently used window | -| Global | `CapsLockX + Shift + Z` | Cycle to least recently used window | -| Global | `CapsLockX + X` | Close current tab Ctrl+W | -| Global | `CapsLockX + Shift + X` | Close current window Alt+F4 | -| Global | `CapsLockX + V` | Make window transparent | -| Global | `CapsLockX + Shift + V` | Keep window transparent (and topmost) | -| Any window | `Double-click Left Shift+Ctrl+Alt` | Send current window to back, \* see note below | - -\*Note: Double-clicking Left Shift+Ctrl+Alt is designed for remote desktops and virtual machines, allowing simultaneous display with the host desktop windows. -For example, with programs like mstsc.exe, TeamViewer, VirtualBox, HyperV, VMWare, and other remote desktop or virtual machine software, combined with the CapsLockX + Shift + V transparency and topmost feature, using interfaces like Linux or MacOS on Windows is no longer a challenge. - -This reference uses [@yangbin9317's comment](https://v2ex.com/t/772052#r_10458792) - -> Using CapsLock as the interface, it bridges the underlying logic, aligns Windows with Linux WM, and solves the pain points of Windows. - -(20220313) For scenarios where both ends are Windows, you can also consider using [RemoteApp Tool - Kim Knight](http://www.kimknight.net/remoteapptool) as a substitute for remote desktop. - - - -### Quick Input - -| Mode | Quick Input | Description | -| ------ | ----------- | ------------------------------------------------------------------------------ | -| Global | `#D#` | Date input: `(20220217)` | -| Global | `#T#` | Time input: `(20220217.220717)` | -| Global | `#DT#` | Date and time input: `2022-02-17 22:07:33` | -| Global | `#NPW#` | Randomly input a numeric password like: `7500331260229289` | -| Global | `#PW#` | Randomly input a numeric and letter password like: `yyCTCNYodECTLr2h` | -| Global | `#WPW#` | Randomly input a numeric and letter password like: `FtD5BB1m5H98eY7Y` | -| Global | `#SPW#` | Randomly input a numeric, letter, and symbol password like: `/})y+xK]z~>XKQ+p` | - - + ### Pomodoro Timer -25 minutes fixed cycle for rest reminders. +25-minute fixed cycle for rest reminder. -Use `CapsLockX + ,` to open the configuration, then change EnableScheduleTasks=1 to enable this plugin. +You can open the configuration by pressing `CapsLockX + ,` and then enable the plugin by modifying EnableScheduleTasks=1. -- Use Pomodoro chime (play a working bell sound at 00 and 30 minutes, and a rest bell sound at 25 and 55 minutes of every hour) (schedule tasks must first be enabled) +- Use Pomodoro time announcements (Work bell sounds at o'clock and half-past, rest bell sounds at 25 and 55 minutes past every hour) — requires scheduled tasks to be enabled -```ini + ```ini UseTomatoLife=1 -``` + ``` -- When using Pomodoro chime, automatically switch desktops (rest desktop is 1, work desktop is 2) +- When using Pomodoro announcements, automatically switch desktops (Automatically switch to desktop 1 for rest, and to desktop 2 for work during Pomodoro announcements) -```ini + ```ini UseTomatoLifeSwitchVirtualDesktop=1 -``` + ``` -Note: If you only need the sound and do not need to automatically switch desktops, you can also try this Chrome plugin [Tomato Life - Chrome Web Store](https://chrome.google.com/webstore/detail/25min-tomato-life/kkacpbmkhbljebmpcopjlgfgbgeokbhn) +Note: If you only need the sound without the automatic desktop switching, you might want to try this Chrome extension [Tomato Life - Chrome Web Store](https://chrome.google.com/webstore/detail/25min-tomato-life/kkacpbmkhbljebmpcopjlgfgbgeokbhn) -Note: This plugin has been separated into an independent project, if you like the Pomodoro technique you can refer to the snow star's tomato-life project: [snomiao/tomato-life](https://github.com/snomiao/tomato-life) +Further Note: This plugin has been spun off into a standalone project. If you like the Pomodoro Technique, you can refer to the snowstar's tomato-life project here: [snom - + -### Auto Turn Off Screen When Locking +### Auto Screen Off on Lock -When pressing Win + L to lock the screen, immediately turn off the screen. This is suitable for automatically turning off the computer screen when preparing to sleep, so that it does not dazzle during the night... +When locking the screen with Win + L, the screen turns off immediately. This is suitable for automatically turning off the computer screen when getting ready for sleep, to prevent it from being glaring during the night. - + ## Past and Future 🛰 diff --git a/docs/README.zh-Hans.md b/docs/README.zh-Hans.md index 5758f75..60c83cc 100644 --- a/docs/README.zh-Hans.md +++ b/docs/README.zh-Hans.md @@ -195,7 +195,7 @@ TODO:文档:鼠标模拟功能介绍、RPG 游戏的移动 ### 人类的速度认知 -TODO:指数增长的世界感知,焦点,听力、视觉、触觉,VS 常规线性操作 +TODO:指数增长的世界感知,焦点,听力(分贝)、视觉()、触觉,VS 常规线性操作 ### 软件的热键缺陷 From 97ee5f88c076e8e97d38782f9ab530d41c9233b1 Mon Sep 17 00:00:00 2001 From: snomiao Date: Mon, 13 May 2024 11:23:47 +0900 Subject: [PATCH 12/15] docs(docs): zh zh --- docs/README.md | 109 ++++++++++++----------- docs/{README.zh-Hans.md => README.zh.md} | 22 ++--- 2 files changed, 67 insertions(+), 64 deletions(-) rename docs/{README.zh-Hans.md => README.zh.md} (97%) diff --git a/docs/README.md b/docs/README.md index 006febf..ddfda12 100644 --- a/docs/README.md +++ b/docs/README.md @@ -4,8 +4,7 @@ CapsLockX is a modular hotkey script engine based on AutoHotkey. It allows you t Docs in Languages: **[English Docs (ChatGPT Translated)](https://capslockx.snomiao.com/)** -**[简体中文 説明](./README.zh-hans.md)** -**[English Docs (ChatGPT Translated)](./README.zh-hans.md)** +**[简体中文 説明](./README.zh.md)** **[See Any Language Docs (Google Translated)](https://capslockx.snomiao.com/)** @@ -225,11 +224,11 @@ If you want to learn how to develop plugins for CapsLockX, please: ## The functions of this module are as follows -| Applies to | Key Combination | Function | -| ---------- | -------------------- | ---------------------------------- | -| Global | CapsLockX + / | Temporarily displays hotkey tips | -| Global | CapsLockX + Alt + / | 🔗 Opens CapsLockX's full doc page | -| Global | CapsLockX + Shift + /| 🕷 Submit bugs, suggestions, etc. | +| Applies to | Key Combination | Function | +| ---------- | --------------------- | ---------------------------------- | +| Global | CapsLockX + / | Temporarily displays hotkey tips | +| Global | CapsLockX + Alt + / | 🔗 Opens CapsLockX's full doc page | +| Global | CapsLockX + Shift + / | 🕷 Submit bugs, suggestions, etc. | @@ -246,9 +245,10 @@ Anki Operations Enhancement ## Description -| Mode | Anki Enhancement Module | Description | -| --------------------- | :---------------------: | ----------------------------------------------------------- | -| In Anki-Study Interface | `w or k or ↑` | Press=Undo, Release=Show answer | +| Mode | Anki Enhancement Module | Description | +| ----------------------- | :---------------------: | ------------------------------- | +| In Anki-Study Interface | `w or k or ↑` | Press=Undo, Release=Show answer | + | In Anki-St @@ -270,8 +270,8 @@ Simplify keyboard operation for OneNote 2016 - 2019, conveniently using keyboard #### Usage -| Application | Shortcut | Function Description | -| ----------- | :----------: | ---------------------------- | +| Application | Shortcut | Function Description | +| ----------- | :-----------: | -------------------------------- | | Global | Win + Alt + H | Launch/Switch Xunfei Voice Input | #### Note @@ -290,11 +290,11 @@ At any time, in any input box, press `CLX+b` to start using AI-assisted input. #### Key Layout (Under Development) -| Key Description | Function | Note | -| --------------- | ------------------------------------------------------ | ---- | -| CLX + b | Automatically copies the current selection, input commands, and lets AI assist your input | | +| Key Description | Function | Note | +| --------------- | ---------------------------------------------------------------------------------------------------- | ---- | +| CLX + b | Automatically copies the current selection, input commands, and lets AI assist your input | | | CLX + Alt + b | Activate the activation code (currently free plan only, may include enhanced features in the future) | | -| CLX + Shift + b | Check usage quota | | +| CLX + Shift + b | Check usage quota | | #### Protips: @@ -318,13 +318,13 @@ Is there anything better in this world than moving the cursor with HJKL in Vim m This is a must-have! Introducing accelerated HJKL for a smooth editing experience! Ever thought about making your cursor drift like a car in a gutter? Install this! -| Scope | Edit module | Description | -|------------|-------------------------|-----------------------------------| +| Scope | Edit module | Description | +| ------------- | --------------------- | ------------------------------------ | | Global(Basic) | `CapsLockX + h j k l` | Arrow keys for up, down, left, right | -| Global(Basic) | `CapsLockX + y o` | Home, End | -| Global(Basic) | `CapsLockX + u i` | PageUp, PageDown | -| Global(Basic) | `CapsLockX + [ ]` | Shift+Tab and Tab | -| Global(Basic) | `CapsLockX + +| Global(Basic) | `CapsLockX + y o` | Home, End | +| Global(Basic) | `CapsLockX + u i` | PageUp, PageDown | +| Global(Basic) | `CapsLockX + [ ]` | Shift+Tab and Tab | +| Global(Basic) | `CapsLockX + | @@ -336,30 +336,30 @@ A cure for all kinds of broken laptop keyboards 2. Missing a Pause key? Win + Alt + P also opens system settings information. 3. To be added -| Mode | Key Combination | Function | -| ------------------- | :-------------------------------- | ------------------------------------------- | -| Global | Win + Alt + P | Equivalent to Win + Pause, customized for notebooks | -| Global | Tap right Ctrl | Will tap the Menu to pop up the context menu | -| Global | Hold right Menu | Acts as holding Ctrl, can be combined with other keys | -| Win key simulation activated | Hold ] and press [ | Equivalent to pressing the Win key | +| Mode | Key Combination | Function | +| ---------------------------- | :------------------------------------------------------------------ | ----------------------------------------------------- | +| Global | Win + Alt + P | Equivalent to Win + Pause, customized for notebooks | +| Global | Tap right Ctrl | Will tap the Menu to pop up the context menu | +| Global | Hold right Menu | Acts as holding Ctrl, can be combined with other keys | +| Win key simulation activated | Hold ] and press [ | Equivalent to pressing the Win key | | Win key simulation activated | RAlt + \| is equivalent to pressing Alt + Tab but on the right hand | ### Media Key Module -| Applies to | Media Key Module | Description | -|------------|-----------------------|----------------------------------------------| -| Global | `CapsLockX + F1` | Open: My Computer | -| Global | `CapsLockX + F2` | Open: Calculator | -| Global | `CapsLockX + F3` | Open: Browser Homepage | -| Global | `CapsLockX + F4` | Open: Media Library (defaults to Windows Media Player) | -| Global | `CapsLockX + F5` | Play: Pause/Play | -| Global | `CapsLockX + F6` | Play: Previous Track | -| Global | `CapsLockX + F7` | Play: Next Track | -| Global | `CapsLockX + F8` | Play: Stop | -| Global | `CapsLockX + F9` | Volume Up | -| Global | `CapsLockX + F10` | Volume Down +| Applies to | Media Key Module | Description | +| ---------- | ----------------- | ------------------------------------------------------ | +| Global | `CapsLockX + F1` | Open: My Computer | +| Global | `CapsLockX + F2` | Open: Calculator | +| Global | `CapsLockX + F3` | Open: Browser Homepage | +| Global | `CapsLockX + F4` | Open: Media Library (defaults to Windows Media Player) | +| Global | `CapsLockX + F5` | Play: Pause/Play | +| Global | `CapsLockX + F6` | Play: Previous Track | +| Global | `CapsLockX + F7` | Play: Next Track | +| Global | `CapsLockX + F8` | Play: Stop | +| Global | `CapsLockX + F9` | Volume Up | +| Global | `CapsLockX + F10` | Volume Down | @@ -382,10 +382,10 @@ A cure for all kinds of broken laptop keyboards ### JavaScript Calculation (NodeJS installation recommended) -| Applies to | Key Combination | Effect | -| ---------- | --------------------- | ---------------------------------------------- | -| Global | `CapsLockX + -` | Calculate the selected JavaScript expression and replace it | -| Global | `CapsLockX + =` | Calculate the selected JavaScript expression and replace it | +| Applies to | Key Combination | Effect | +| ---------- | --------------- | ----------------------------------------------------------- | +| Global | `CapsLockX + -` | Calculate the selected JavaScript expression and replace it | +| Global | `CapsLockX + =` | Calculate the selected JavaScript expression and replace it | @@ -407,15 +407,15 @@ Make good use of the Win 10's built-in 10 virtual desktops with a luxury configu ### Shortcut Input -| Mode | Shortcut Input | Description | -| ---- | -------------- | ------------------------------------------------ | -| Global | `#D#` | Date input: e.g., `(20220217)` | -| Global | `#T#` | Time input: e.g., `(20220217.220717)` | -| Global | `#DT#` | Date and time input: `2022-02-17 22:07:33` | -| Global | `#NPW#` | Random numeric password, e.g.: `7500331260229289` | -| Global | `#PW#` | Random alphanumeric password, e.g.: `yyCTCNYodECTLr2h` | -| Global | `#WPW#` | Random alphanumeric password, e.g.: `FtD5BB1m5H98eY7Y` | -| Global | `#SPW#` | Random alphanumeric and symbol password, e.g.: `/})y+xK]z~>XKQ+p` | +| Mode | Shortcut Input | Description | +| ------ | -------------- | ----------------------------------------------------------------- | +| Global | `#D#` | Date input: e.g., `(20220217)` | +| Global | `#T#` | Time input: e.g., `(20220217.220717)` | +| Global | `#DT#` | Date and time input: `2022-02-17 22:07:33` | +| Global | `#NPW#` | Random numeric password, e.g.: `7500331260229289` | +| Global | `#PW#` | Random alphanumeric password, e.g.: `yyCTCNYodECTLr2h` | +| Global | `#WPW#` | Random alphanumeric password, e.g.: `FtD5BB1m5H98eY7Y` | +| Global | `#SPW#` | Random alphanumeric and symbol password, e.g.: `/})y+xK]z~>XKQ+p` | @@ -511,10 +511,11 @@ Updated (20200627) The information may become outdated over time | Memory Usage | ✅ About 2~3M | | | | | Modularization | ✅ | 🈚 None | 🈚 None | 🈚 None | | System | Win | Mac (main), Win (secondary) | Win | Win, [Mac](https://capslox.com/) | -| Supported Languages | Chinese | Chinese - English | Chinese | Chinese - English | +| Supported Languages | English / Chinese / Any Language (by ChatGPT) | Chinese / English | Chinese | Chinese / English | #### CapsLockX Address 🔗 Project Urls + The following repositories are updated synchronously: - GitHub: [https://github.com/snolab/CapsLockX](https://github.com/snolab/CapsLockX) diff --git a/docs/README.zh-Hans.md b/docs/README.zh.md similarity index 97% rename from docs/README.zh-Hans.md rename to docs/README.zh.md index 60c83cc..859215c 100644 --- a/docs/README.zh-Hans.md +++ b/docs/README.zh.md @@ -2,10 +2,12 @@ CapsLockX is a modular hotkey script engine based on AutoHotkey. Allows you to easily operate the computer efficiently like a hacker in a movie without leaving the keyboard with both hands . There are a lot of functions that you can understand at a touch and are super easy to use: editing enhancement, virtual desktop and window management, mouse simulation, in-app hotkey enhancement, JS mathematical expression calculation, and other super multi-functions are waiting for you to personally define. -**[See English Docs (Google Translated)](https://capslockx.snomiao.com/)** +其他语言: +**[English README](./README.md)** - @@ -245,10 +245,9 @@ Anki Operations Enhancement ## Description -| Mode | Anki Enhancement Module | Description | -| ----------------------- | :---------------------: | ------------------------------- | -| In Anki-Study Interface | `w or k or ↑` | Press=Undo, Release=Show answer | - +| Mode | Anki Enhancement Module | Description | +| --------------------- | :---------------------: | ----------------------------------------------------------- | +| In Anki-Study Interface | `w or k or ↑` | Press=Undo, Release=Show answer | | In Anki-St @@ -270,8 +269,8 @@ Simplify keyboard operation for OneNote 2016 - 2019, conveniently using keyboard #### Usage -| Application | Shortcut | Function Description | -| ----------- | :-----------: | -------------------------------- | +| Application | Shortcut | Function Description | +| ----------- | :----------: | ---------------------------- | | Global | Win + Alt + H | Launch/Switch Xunfei Voice Input | #### Note @@ -290,11 +289,11 @@ At any time, in any input box, press `CLX+b` to start using AI-assisted input. #### Key Layout (Under Development) -| Key Description | Function | Note | -| --------------- | ---------------------------------------------------------------------------------------------------- | ---- | -| CLX + b | Automatically copies the current selection, input commands, and lets AI assist your input | | +| Key Description | Function | Note | +| --------------- | ------------------------------------------------------ | ---- | +| CLX + b | Automatically copies the current selection, input commands, and lets AI assist your input | | | CLX + Alt + b | Activate the activation code (currently free plan only, may include enhanced features in the future) | | -| CLX + Shift + b | Check usage quota | | +| CLX + Shift + b | Check usage quota | | #### Protips: @@ -318,13 +317,13 @@ Is there anything better in this world than moving the cursor with HJKL in Vim m This is a must-have! Introducing accelerated HJKL for a smooth editing experience! Ever thought about making your cursor drift like a car in a gutter? Install this! -| Scope | Edit module | Description | -| ------------- | --------------------- | ------------------------------------ | +| Scope | Edit module | Description | +|------------|-------------------------|-----------------------------------| | Global(Basic) | `CapsLockX + h j k l` | Arrow keys for up, down, left, right | -| Global(Basic) | `CapsLockX + y o` | Home, End | -| Global(Basic) | `CapsLockX + u i` | PageUp, PageDown | -| Global(Basic) | `CapsLockX + [ ]` | Shift+Tab and Tab | -| Global(Basic) | `CapsLockX + | +| Global(Basic) | `CapsLockX + y o` | Home, End | +| Global(Basic) | `CapsLockX + u i` | PageUp, PageDown | +| Global(Basic) | `CapsLockX + [ ]` | Shift+Tab and Tab | +| Global(Basic) | `CapsLockX + @@ -336,30 +335,30 @@ A cure for all kinds of broken laptop keyboards 2. Missing a Pause key? Win + Alt + P also opens system settings information. 3. To be added -| Mode | Key Combination | Function | -| ---------------------------- | :------------------------------------------------------------------ | ----------------------------------------------------- | -| Global | Win + Alt + P | Equivalent to Win + Pause, customized for notebooks | -| Global | Tap right Ctrl | Will tap the Menu to pop up the context menu | -| Global | Hold right Menu | Acts as holding Ctrl, can be combined with other keys | -| Win key simulation activated | Hold ] and press [ | Equivalent to pressing the Win key | +| Mode | Key Combination | Function | +| ------------------- | :-------------------------------- | ------------------------------------------- | +| Global | Win + Alt + P | Equivalent to Win + Pause, customized for notebooks | +| Global | Tap right Ctrl | Will tap the Menu to pop up the context menu | +| Global | Hold right Menu | Acts as holding Ctrl, can be combined with other keys | +| Win key simulation activated | Hold ] and press [ | Equivalent to pressing the Win key | | Win key simulation activated | RAlt + \| is equivalent to pressing Alt + Tab but on the right hand | ### Media Key Module -| Applies to | Media Key Module | Description | -| ---------- | ----------------- | ------------------------------------------------------ | -| Global | `CapsLockX + F1` | Open: My Computer | -| Global | `CapsLockX + F2` | Open: Calculator | -| Global | `CapsLockX + F3` | Open: Browser Homepage | -| Global | `CapsLockX + F4` | Open: Media Library (defaults to Windows Media Player) | -| Global | `CapsLockX + F5` | Play: Pause/Play | -| Global | `CapsLockX + F6` | Play: Previous Track | -| Global | `CapsLockX + F7` | Play: Next Track | -| Global | `CapsLockX + F8` | Play: Stop | -| Global | `CapsLockX + F9` | Volume Up | -| Global | `CapsLockX + F10` | Volume Down | +| Applies to | Media Key Module | Description | +|------------|-----------------------|----------------------------------------------| +| Global | `CapsLockX + F1` | Open: My Computer | +| Global | `CapsLockX + F2` | Open: Calculator | +| Global | `CapsLockX + F3` | Open: Browser Homepage | +| Global | `CapsLockX + F4` | Open: Media Library (defaults to Windows Media Player) | +| Global | `CapsLockX + F5` | Play: Pause/Play | +| Global | `CapsLockX + F6` | Play: Previous Track | +| Global | `CapsLockX + F7` | Play: Next Track | +| Global | `CapsLockX + F8` | Play: Stop | +| Global | `CapsLockX + F9` | Volume Up | +| Global | `CapsLockX + F10` | Volume Down @@ -382,10 +381,10 @@ A cure for all kinds of broken laptop keyboards ### JavaScript Calculation (NodeJS installation recommended) -| Applies to | Key Combination | Effect | -| ---------- | --------------- | ----------------------------------------------------------- | -| Global | `CapsLockX + -` | Calculate the selected JavaScript expression and replace it | -| Global | `CapsLockX + =` | Calculate the selected JavaScript expression and replace it | +| Applies to | Key Combination | Effect | +| ---------- | --------------------- | ---------------------------------------------- | +| Global | `CapsLockX + -` | Calculate the selected JavaScript expression and replace it | +| Global | `CapsLockX + =` | Calculate the selected JavaScript expression and replace it | @@ -407,15 +406,15 @@ Make good use of the Win 10's built-in 10 virtual desktops with a luxury configu ### Shortcut Input -| Mode | Shortcut Input | Description | -| ------ | -------------- | ----------------------------------------------------------------- | -| Global | `#D#` | Date input: e.g., `(20220217)` | -| Global | `#T#` | Time input: e.g., `(20220217.220717)` | -| Global | `#DT#` | Date and time input: `2022-02-17 22:07:33` | -| Global | `#NPW#` | Random numeric password, e.g.: `7500331260229289` | -| Global | `#PW#` | Random alphanumeric password, e.g.: `yyCTCNYodECTLr2h` | -| Global | `#WPW#` | Random alphanumeric password, e.g.: `FtD5BB1m5H98eY7Y` | -| Global | `#SPW#` | Random alphanumeric and symbol password, e.g.: `/})y+xK]z~>XKQ+p` | +| Mode | Shortcut Input | Description | +| ---- | -------------- | ------------------------------------------------ | +| Global | `#D#` | Date input: e.g., `(20220217)` | +| Global | `#T#` | Time input: e.g., `(20220217.220717)` | +| Global | `#DT#` | Date and time input: `2022-02-17 22:07:33` | +| Global | `#NPW#` | Random numeric password, e.g.: `7500331260229289` | +| Global | `#PW#` | Random alphanumeric password, e.g.: `yyCTCNYodECTLr2h` | +| Global | `#WPW#` | Random alphanumeric password, e.g.: `FtD5BB1m5H98eY7Y` | +| Global | `#SPW#` | Random alphanumeric and symbol password, e.g.: `/})y+xK]z~>XKQ+p` | @@ -515,7 +514,6 @@ Updated (20200627) The information may become outdated over time #### CapsLockX Address 🔗 Project Urls - The following repositories are updated synchronously: - GitHub: [https://github.com/snolab/CapsLockX](https://github.com/snolab/CapsLockX) From ce71b549a2852f990d29e4022845cb9dda3a352c Mon Sep 17 00:00:00 2001 From: snomiao Date: Mon, 13 May 2024 12:32:34 +0900 Subject: [PATCH 14/15] fix(ifly): click pos click pos --- Modules/App-XunFeiSwitching.ahk | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Modules/App-XunFeiSwitching.ahk b/Modules/App-XunFeiSwitching.ahk index d6d3040..e78f8f3 100644 --- a/Modules/App-XunFeiSwitching.ahk +++ b/Modules/App-XunFeiSwitching.ahk @@ -26,14 +26,20 @@ Return ; WinSet, TransColor, 0xffffff 150, ahk_id %iFlyWnd% ; WinSet, Transparent, 200, ahk_id %iFlyWnd% ; w357 h177 - ControlClick, x175 y80, ahk_id %iFlyWnd% + WinGetPos, X, Y, Width, Height, ahk_id %iFlyWnd% + CLICK_X := Width / 2 + CLICK_Y := Height / 2 + ControlClick, x%CLICK_X% y%CLICK_Y%, ahk_id %iFlyWnd% return } ; v2 iFlyWnd := WinExist("ahk_class UIIFlyVoiceFrame ahk_exe iFlyVoice.exe" ) If (iFlyWnd){ - ; WinGet, Transparent, Transparent + WinGetPos, X, Y, Width, Height, ahk_id %iFlyWnd% + CLICK_X := Width / 2 + CLICK_Y := Height / 2 + ; WinGet, Transparent, TransparentMhm ; WinSet, TransColor, Off, ahk_id %iFlyWnd% ; WinSet, TransColor, 0xffffff 150, ahk_id %iFlyWnd% ; WinSet, Transparent, 200, ahk_id %iFlyWnd% From 737ed64cab8a57c182a7379a7c0cd9771bc79d25 Mon Sep 17 00:00:00 2001 From: snomiao Date: Mon, 13 May 2024 12:35:20 +0900 Subject: [PATCH 15/15] docs(capslockx): update update --- Core/CapsLockX-i18n.ahk | 8 ++++---- README.md | 8 ++++---- docs/README.md | 1 + 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Core/CapsLockX-i18n.ahk b/Core/CapsLockX-i18n.ahk index bb8502b..43ab2ab 100644 --- a/Core/CapsLockX-i18n.ahk +++ b/Core/CapsLockX-i18n.ahk @@ -18,7 +18,7 @@ LCID_0011 := "Japanese" ; ja LCID_0411 := "Japanese (Japan)" ; ja-JP ; TODO: converts -t(s, lang = "") +t(s, lang := "") { global CLX_Lang @@ -28,11 +28,11 @@ t(s, lang = "") ; for dev, autotranslate ; run node "prompts/translate-en.md" - if (!lang) { + if (lang == ""){ lang := CLX_Lang - } + } if (!lang) { - lang:="auto" + lang := "auto" } if ( lang == "auto" ) { lang := "en" diff --git a/README.md b/README.md index bcab82d..2d38d67 100644 --- a/README.md +++ b/README.md @@ -603,26 +603,26 @@ How to help CapsLockX survive? If CapsLockX has been helpful to you: - 2021年11月,键盘模拟鼠标3 - [2022-08-21 t0820 复制后匹配-siyuan-clx-截图 - qwertc]( https://mp.weixin.qq.com/s?__biz=MzIzNzczOTkzMw==&mid=2247485441&idx=1&sn=848d5e6f3fb7c1e7b14100615ca7d0db&chksm=e8c542f3dfb2cbe5770fe19bb8b5c81935e52a4a686154e69104bc403ab6ce960d1b6ae429a9&scene=21#wechat_redirect ) - [2024-01-06 t0106 OpenAI加持的CapslockX - qwertc]( https://mp.weixin.qq.com/s?__biz=MzIzNzczOTkzMw==&mid=2247485707&idx=1&sn=d40eea9f0b5bb81e3387ec592def4ed0&chksm=e8c543f9dfb2caef90939e2fafcb324fd757949c79399c55adfbab0940e70efd753fb6bf3837&token=1464360155&lang=zh_CN#rd) -- V2EX +- V2EX: - [有没有办法将 Chrome OS 中的快捷键实现到 Windows 10 中 - V2EX](https://www.v2ex.com/t/778967) - [推荐一下我的键位映射工具 MyKeymap - V2EX](https://v2ex.com/t/844432) - [有多少人会把键盘上的 CapsLock 和 Backspace 对调? - V2EX](https://www.v2ex.com/t/855901) - [分享一个用 CapsLock+H/J/K/L 模拟方向键的小工具 - V2EX](https://www.v2ex.com/t/318182) - [推荐一个适合程序员的效率工具 AltPlus,左边大拇指按下 Alt 键,就可以像使用 vim 一样编程了. - V2EX](https://www.v2ex.com/t/800721) - [CapsLockX - 像黑客一样操作电脑 - V2EX](https://v2ex.com/t/772052#reply1) -- Zhihu +- Zhihu: - [如何将电脑桌面划分为独立的两半? - 知乎](https://www.zhihu.com/questionz/23443944/answer/1670521971) - [有哪位残友用的是单手键盘? - 知乎](https://www.zhihu.com/question/50621709/answer/1681247637) - [怎么样才能只用键盘不用鼠标,包括任何指针触控设备,并优雅地使用电脑? - 知乎](https://www.zhihu.com/question/21281518/answer/1770669886) - [如何将电脑桌面划分为独立的两半? - 知乎](https://www.zhihu.com/question/23443944/answer/1670521971) - [我是职场达人,AutoHotKey 让我成为职场超人 - 知乎](https://zhuanlan.zhihu.com/p/60372361) - [为什么知乎上这么多人推荐 HHKB,却不反复强调说该键盘不适合大多数程序员? - 知乎]( https://www.zhihu.com/question/33690121/answer/3495460336 ) -- AutoAHK +- AutoAHK: - [AutoHotKey 中文网专栏 - 知乎](https://www.zhihu.com/column/autoahk) - [我是职场达人,AutoHotKey让我成为职场超人 – AutoAHK]( https://www.autoahk.com/archives/14636 ) - [脱胎于CapslockX的雪星鼠标-键盘模拟鼠标 – AutoAHK]( https://www.autoahk.com/archives/44126 ) - [QZ——Arrary – AutoAHK]( https://www.autoahk.com/archives/4133 ) -- [CapsLockX - 像黑客一样操作电脑! - AutoHotkey Community](https://www.autohotkey.com/boards/viewtopic.php?f=28&t=88593) + - [CapsLockX - 像黑客一样操作电脑! - AutoHotkey Community](https://www.autohotkey.com/boards/viewtopic.php?f=28&t=88593) - [(10) What are some good career alternatives for a computer programmer with RSI? - Quora](https://www.quora.com/Repetitive-Strain-Injury-RSI/What-are-some-good-career-alternatives-for-a-computer-programmer-with-RSI) ## Footer Catalog - Table of Contents diff --git a/docs/README.md b/docs/README.md index 1df23d3..0d77531 100644 --- a/docs/README.md +++ b/docs/README.md @@ -550,6 +550,7 @@ Related Communities: - CapsLockX User QQ Group 🐧: [100949388](https://jq.qq.com/?_wv=1027&k=56lsK8ko) - QZ/VimD/TC/AHK QQ Group 🐧: 271105729 - AHK Advanced QQ Group 🐧: 717947647 +- The Little Red Dot mechanical keyboard group 🐧: 199606725 For questions related to CapsLockX, you can directly join the group [@雪星](tencent://message?uin=997596439) or ask privately.