欢迎来到半导体与芯片的世界 - PC&Server OS设置
右键菜单添加使用gvim打开方式①打开注册表编辑器，开始-->运行-->regedit②定位到：HKEY_CLASSSES_ROOT---> * --->Shell，在Shell 上右击，新建---> 项，输入： Open With gvim（使用vim打开）③在 Open With gvim 右键--->新建--->字符串值，数值名称设置为：Icon，数值数据设置为：C:\MyProgram\gvim73\gVimPortable\vim\vim73\gvim.exe,0数值名称：Icon数值数据：C:\MyProgram\gvim73\gVimPortable\vim\vim73\gvim.exe,0④在刚才新建的项：Open With gvim 下面添加一个新项：Command修改 Commnad 项右边窗口的数值数据为：C:\MyProgram\gvim73\gVimPortable\vim\vim73\gvim.exe %1C:\MyProgram\gvim73\gVimPortable\vim\vim73\gvim.exe %1上面的设置会带来一个小问题：当文件名的最后一个字符为空格时，使用GVIM打开某个文件时会新建一个空白的文件，而不是直接打开该文件。解决方法：加引号，如下：C:\MyProgram\gvim73\gVimPortable\vim\vim73\gvim.exe "%1"效果如下：本文转自hapjin博客园博客，原文链接：http://www.cnblogs.com/hapjin/，如需转载请自行联系原作者
不论是在手机还是电脑上，我们在与人交流的过程中常常会形成或用到一些重复性的表述，这些表述的内容长度可多可少，但由于它们被用到频率十分之高，所以我们通常会更喜欢用类似于缩写的方式来代替我们一字一句输入的过程，例如说「yyds」（永远滴神）、「dddd」（懂的都懂）、「nbnhhsh」（能不能好好说话）等。这些缩写或缩略语通常也可以被看作是用户自定义词典，我们不仅可以在操作设备上自定义，也可以在输入法上自定义。不过它们也仅限于定义一些纯文字性质的内容且长度有限，同时这些自定义设置可能会和特定的操作系统相绑定又或是无法完全导出，迁移成本存在过高的情况。但有这么一类应用和自定义词典类似，它们为了用户自定义输入的缩写内容而生，不仅能定义纯文字性质的内容，还具备较强的扩展性，也被称为是文本扩展器（Text Expander）。文本扩展器的作用表现和我们在使用自定义词典时的方式别无二致，都是输入一个特定的表达式，然后就会被替换成我们事先定义好的内容，比如：---------------------------------> [input] #42 ---------------------------------- [output] 意大利面拌 42 号混凝土 <---------------------------------当我们在文本扩展器中事先设置完整内容之后，只要输入 #42 后就会转换成「意大利面拌 42 号混凝土」完整的句子。知名的文本扩展器有 TextExpander，不过它属于付费应用也不是我们此次讨论的主角；而本文我们所介绍的则是另外一款免费、开源、跨平台且基于 Rust 语言编写的文本扩展器——Espanso，它不仅简单易用、体积小巧，且可配置性强，用户不但可以基于命令行配置扩展内容，而且还可以安装来自于社区的第三方扩展包。快速上手因为 Espanso 是一个开箱即用的工具，其安装步骤简单到可以一笔带过：打开 Espanso 官网，点击推荐的系统版本，下载并安装。注：安装完成并启动 Espanso 时需要额外的操作授权，否则 Espanso 可能无法正确运行。当然我们主要是看看如何使用 Espanso。毕竟安装完毕后启动 Espanso 是不会直接显示什么华丽的界面，因为它本质可以算是一个名不见经传的后台程序，只不过以应用的方式活跃在系统后台。使用 Espanso 的方式十分简单，我们只需在任意一个可以输入内容的地方，像输入代码一样先按下英文冒号「:」，然后再输入剩下的指令就可以神奇地看到 Espanso 已经为我们补全了内容。其中由 : 开始的一系列内容称为触发器（Trigger），而补全后的内容也被称为是匹配项（Match）。比如我们现在输入 :date 的触发器指令那么 Espanso 直接会就帮我们将内容替换为表示当天日期的匹配项：就是这么简单！不过你可能会好奇，我是怎么知道 :date 匹配项的呢？我们也可以在状态栏中找到 Espanso 的图表并点击「Open Search Bar」选项或是按下 Option+空格（Windows 上是 Alt+空格）就可以弹出相应的列表与搜索界面：除此之外，因为我前面说了 Espanso 本质是一个后台程序，所以我们可以通过命令行来与之交互（可以在终端上通过 espanso --help 命令获取所有命令）。这里我们为了查看有哪些匹配项，可以直接使用 espanso match list 命令：espanso match list:espanso - Hi there!:date - {{ date }}可以看到 Espanso 并没有内置过多的匹配项，所以要想它能为我们更好地自动补全内容，就需要我们像自定义缩略语或短语一样事先进行人为配置。Espanso 的配置主要有两部分，我们可以通过 espanso path 命令来找到配置文件路径：espanso pathConfig: /Users/Bobot/Library/Preferences/espansoPackages: /Users/Bobot/Library/Preferences/espanso/match/packagesRuntime: /Users/Bobot/Library/Application Support/espanso上述结果中的 Config 部分即为 Espanso 在当前操作系统中的配置存放路径。当中主要包含了两部分配置：$CONFIG/ config/default.ymlmatch/base.yml其中：config 部分的配置主要是针对 Espanso 程序本身，包括自定义补全的触发符号（比如将前面的英文冒号 : 更改为其他符号）、是否只在特定应用内 Espanso 才会生效等等；match 部分的配置主要就是我们需要自定义补全的部分，也即 :date 这样的匹配项具体设置。默认情况下 Espanso 是对所有应用都生效，因此当我们在应用中输入时很有可能就会极易触发匹配项弄巧成拙，为了避免冲突我们需要在后续在 config 部分进行配置以进行过滤。不论是 Espanso 本身的配置还是自定义匹配项，Espanso 都采用了目前主流的 YAML 配置文件，我们可以直接通过系统自带的文本编辑器打开。但是由于 YAML 的格式有些特殊，对于语法格式有严格要求，所以建议你使用 VS Code 这类编程专用的编辑器并在当中安装对应的 YAML 插件来进行编辑、配置；除此之外，可能你还需要简单学习一下 YAML 语法 才能更好地自定义相关配置内容。现在就让我们来试着定义一组触发器与匹配项练习一番，这里我就使用 VS Code 来进行操作。首先通过前面的命令我们找到了 Espanso 的配置文件夹后点击并拖拽至 VS Code，然后我们可以在 match/base.yml 默认匹配项的基础上进行设置，也可以像我一样新建一个名为 custom.yml 的匹配项进行设置：接着在当中填入如下内容（注意：如果你是在默认的 base.yml 文件中进行设置，由于已经存在了 matches 键就不需要重复填写）： # custom.yml matches: - trigger: ":tomorrow" replace: "{{mytime}}" vars: - name: mytime type: date params: format: "%Y-%m-%d" offset: 86400 - trigger: ":yesterday" replace: "{{mytime}}" vars: - name: mytime type: date params: format: "%Y-%m-%d" offset: -86400 当中的内容是由 YAML 语法构成的配置内容，其中每一组由「-」符号并紧接着 trigger 开始到下一个 trigger 前的一整块内容都表示定义一个匹配项，里面包括了触发器以及对应的替换内容等等，关于这部分配置我们在后续深入展开，现在暂时按下不表。检测到有文件修改或保存后 Espanso 会自动重新加载配置文件，之后当我们输入 :tomorrow 或 :yesterday 时，就会看到 Espanso 帮我们进行了自动补全：以上仅是对 Espanso 管中窥豹一番，虽然它用法简单，但如果我们想要最大程度地发挥它的作用，可能还有更多用法有待我们进一步探索，所以接下来就让我们再深入了解一下 Espanso 的相关细节。深入了解 EspansoEspanso 相关配置Espanso 的设置默认会作用到所有应用，但这通常可能会导致一些意想不到地冲突，所以我们最好需要对其进行调整。只在特定应用中生效Espanso 的默认配置为 config/default.yml 文件，但我们也可以针对不同应用在同一层级下添加不同的配置文件，比如 config/vscode.yml。之后我们可以在 vscode.yml 文件中添加过滤选项，即不让 Espanso 在使用 VS Code 时生效： # vscode.yml filter_class: "com.microsoft.VSCode" enable: false当我写入这短短地两行内容并保存之后，Espanso 就不会在我使用 VS Code 时生效从而避免了冲突。Espanso 提供了三种过滤应用的方式，包括上述示例即 filter_title、filter_exec 以及 filter_class，它们也分别对应了按当前活跃窗口的文本标题过滤、按应用的可执行路径过滤以及按当前活跃窗口的类名（编程概念）过滤。这三种方式默认使用正则表达式，倘若你不清楚具体的内容，那你就可以填写正则表达式：filter_exec: "Chrome$"enable: false当然你也可能会好奇我前面的例子是如何找到 VS Code 对应的类名 com.microsoft.VSCode？因为 Espanso 内置了一个探测指令可以一次性帮我们生成对应三种过滤方式的内容。在未屏蔽 Espanso 的情况下，我们可以像使用匹配项那样输入 #detect# 来进行触发，比如我在 macOS 的微信随便选择一个对话框，然后输入该指令即可弹出如下界面。之后我们只需要点击拷贝到剪切板再自行粘贴选择即可。建议你在配置时侧重选择除 filter_title 之外的另外两种方式，因为当前活跃窗口的标题文本内容变化幅度较大并不是很稳定。但除了像上述示例那样直接使用 enable: false 这样简单粗暴的屏蔽方式之外，Espanso 也提供了另外一种模式，让你可以自主选择在特定应用中只屏蔽（exclude）掉对应的匹配项。比如我现在排除掉我前面自定义的 custom.yml 文件：filter_class: "com.microsoft.VSCode"extra_excludes:"../match/custom.yml"默认情况下的路径为当前的 config 路径，而匹配项则是在与 config 同级的路径中，所以我们需要通过 ../match 的方式返回到同级目录然后再选择 match 目录。保存之后在 VS Code 中即便使用 :tomorrow 或 :yesterday 都不会得到相应的匹配项。如果要屏蔽的内容过多，你既可以使用 glob 模式来设置路径，也可以换一种思路，即只让某些匹配项——比如代码片段（Snippets）——在特定应用中生效，比如我现在有一个 match/pycode.yml 配置，当中准备了一些 Python 相关的代码片段，现在我只想这些片段只在 VS Code 中生效，那么此时就应该这样做：filter_class: "com.microsoft.VSCode"extra_includes:"../match/pycode.yml"修改 Espanso 默认设置尽管说 Espanso 有提供了基本的 UI 界面并驻留在状态栏中，但 Espanso 的设置都是需要通过配置文件来修改，这样的方式缺点很明显，就是对于一般用户而言缺少图形化配置界面还需要额外的学习成本；不过对于喜欢折腾的玩家来说也好处颇多，一方面你可以随时随地同步配置文件在，在不同操作系统之间也能保持配置统一；另一方面，你可以根据自己直接手动快速修改。比如 Espanso 默认的搜索框界面可以用 Option+空格（Windows 为 Alt+空格）打开，那么我们也可以直接修改为 Option+Shift+空格 打开：search_shortcut: OPTION+SHIFT+SPACE当然我们也可以禁用搜索框快捷键的同时，自定义快速弹出 Espanso 匹配项的搜索框界面的触发器： # default.yml search_shortcut: off search_trigger: ">esp" 之后我们只要敲击 >esp 就能令搜索框直接弹出。除此之外，如果你不喜欢每次修改配置文件时 Espanso 就自动重载，那么你也可以关闭该选项并在每次配置之后手动点击状态栏的驻留程序并选择「Reload config」选项：auto_restart: false如果你觉得 Espanso 在扩展文本时的速度有点慢，那么也可以直接选择将 pre_paste_delay 选项尽量调低一些（默认为毫秒 ms），以便快速替换而不是保留肉眼可见的延迟：pre_paste_delay: 100更多的匹配项用法Espanso 相比于其他文本扩展器或用户自定义词典最为突出的地方在于它的匹配项是灵活且可配置的，并且还能搭配终端的命令行工具一起使用得到最后的匹配结果，当然这都需要我们进行配置。静态匹配项最简单的匹配项配置就是 Espanso 默认自带的例子，它们通常是由 trigger 和 replace 一组内容来组成： - trigger: ":espanso" replace: "Hi, there!" 像这样内容既定的部分和我们自定义词典没有什么区别，也被称为静态匹配项（Static Matches）。借助于 YAML 语法我们也可以编写长串的替换文本，即： - trigger: ":espanso" replace: "Hi,\nthere!" - trigger: ":espanso" replace: | Hi, there!默认情况下 Espanso 会直接将 replace 的部分作为匹配项的描述内容，这当我们存在多个同名触发器且内容近似的匹配项时会很容易造成困惑，所以 Espanso 支持我们为匹配项加上对应的描述信息（label 标签），以便能更好地知道当前触发器所得到的内容是什么： # custom.yml - trigger: ":espanso" replace: "Hi, there!" label: "inline content" - trigger: ":espanso" replace: "Hi,\nthere!" label: "content with newline(\\n)" - trigger: ":espanso" replace: | Hi, there! label: "content with newline" 之后我们再次触发 :espanso 时就会能看到不同匹配项所对应的不同描述内容是什么。类似地，我们也可以让一个匹配项拥有多个触发器，这里就需要用到 YAML 的数组语法来设置，例如： - trigger: [":espanso", ":greet"] replace: "Hi, there!" label: "inline content"但如果你要设置的匹配项其触发器虽然比较多但表达类似，那么 Espanso 也支持你使用正则表达式的方式来进行设置，我们只将 trigger 替换成 regex 并使用正则表达式即可。我们可以直接将上述示例稍作修改： - regex: ":(espanso|greet)" replace: "Hi, there!" label: "inline content" 动态匹配项除了静态匹配项之外，Espanso 也支持动态匹配项，这也是让 Espanso 灵活且强大之处，我前面给出的明天和昨天日期的示例就是如此。因为这两个匹配项有些重复，这里我就以明天时间日期为例： - trigger: ":tomorrow" replace: "{{mytime}}" vars: - name: mytime type: date params: format: "%Y-%m-%d" offset: 86400在当前的匹配项之下我们还可以自定义变量，也即对应着 vars 之下的内容。变量一词就是编程中经常用来保存内容的基本单位，而 Espanso 允许我们沿用这样的设定直接为匹配项设置一连串的变量，之后动态地生成内容，而不是像静态匹配项那样一成不变。所以在设置 :tomorrow 所对应的匹配项时，我自定义了一个 mytime 变量，这个变量的类型（type）是日期类型，然后又分别表示有 format 用于表示日期展示样式和 offset 日期偏移两个参数。像日期类型这样的变量设置在 Espanso 中又被称为扩展（Extension）。所以除了日期类型之外，Espanso 还支持多种类型以适应动态匹配项的需要，如多选类型、随机类型、脚本类型、Shell 命令类型等等。其中脚本类型和 Shell 命令类型有些类似，只不过前者主要是针对于逻辑更为复杂的脚本文件，它们通常由某种编程语言来编写，而后者主要就是适用于我们所示的终端命令行工具： # custom.yml - trigger: ":pynow" replace: "{{now}}" vars: - name: now type: script params: args: - python3 - -c - | from datetime import datetime print(datetime.now()) - trigger: ":sspai_title" replace: "{{title}}" vars: - name: title type: shell params: cmd: "curl -s https://sspai.com | htmlq --text 'title'" shell: zsh 上述定义的 :pynow 和 :sspai_title 两个动态匹配项里分别用到了脚本类型和 Shell 命令类型，前者是执行 Python 解释器及其来输出最终结果，而后者则是通过系统内的 curl 和 htmlq 两个命令行工具来访问少数派官方并通过 HTML 获得最终的标题内容。除了脚本类型和 Shell 命令类型之外，Espanso 还有一种类型——Form 表单——适用于多处动态内容生成的情况，通常可以被作为模板来使用，比如邮件回复模板、问题反馈模板等等： - trigger: ":reply" form: | Hey name, Thank you for your email. We have already try to handle the number issue. 在上述匹配项中我们没有 replace 键，取而代之的是 form，并且当中的动态内容部分则是由之前的花括号变成了方括号。这是 Espanso 对于表单内容的一个简写方式，本质上等价于定义变量的方式： - trigger: ":reply" replace: | Hey {{template.name}}, Thank you for your email. We have already try to handle the {{template.number}} issue. vars: - name: template type: form params: layout: | Hey name, Thank you for your email. We have already try to handle the number issue. 所以当我们配置完毕并保存后，输入 :reply 时会直接弹出 Espanso 为我们准备好的表单界面，我们只需填好其中的部分即可快速生成模板内容。但 Espanso 也还支持某个匹配项在其他匹配项中被使用或引用，极大地提高了灵活性与复用性。比方说我们现在再为这个模板自动带上一个当前回复日期：代码块复制Hey 100gle,Thank you for your email. We have already try to handle the #314 issue.2022-12-12那么我们就可以使用这种引用方式： - trigger: ":today" replace: "{{today}}" vars: - name: today type: date params: format: "%Y-%m-%d" - trigger: ":reply" replace: | Hey {{template.name}}, Thank you for your email. We have already try to handle the {{template.number}} issue. {{today}} vars: - name: today type: match params: trigger: ":today" - name: template type: form params: layout: | Hey name, Thank you for your email. We have already try to handle the number issue.在 :reply 匹配项的变量中，我们会定义一个 today 变量，它的参数类型是特殊的 match 匹配项，然后当中的 trigger 参数与我们 :today 匹配项的触发器一致。这样只要我们填写完姓名与问题 ID 之后就会在模板中还自动生成当前的回复日期。安装社区第三方扩展包自定义匹配项会是一个永无止境的过程，因为它会随着个人的需要而与日俱增。但人类知识是相通的，也有一些内容可能不仅个人会用到，在互联网某一隅的一群人也会用到，譬如说 Emoji。可你知道吗？在我们日常网络交流中经常使用的每一个 Emoji 表情，其实也都基本有一个相对应称呼（CLDR Short Name），这里我就直接引用 Unicode 官方给出的示例列表：Browser CLDR Short Name😀 grinning face😃 grinning face with big eyes😄 grinning face with smiling eyes上述三个表情虽然都属于笑脸范畴，但是它们对应的 Unicode 编码不同，其文字称呼也不同；这也就意味着我们不仅能够通过 Unicode 编码来找到它们，同理文字称呼也适用。所以你要是恰好知道某个 Emoji 的名称而又不像自己四处翻找，那么借助 Espanso 就可以直接类似 :grinning-face 以文字称呼得到 Emoji 表情。Espanso 允许我们安装来自于社区其他人共享的第三方扩展包，它会类似于插件地形式来扩充我们的匹配项，可以让我们「站在巨人的肩膀」上去更好地使用 Espanso。我们可以直接到 Espanso 的官方 Hub 页面 去搜索。比如我们直接就以前面提到的「Emoji」一词进行搜索就可以找到与之相关的扩展包：但我们与扩展包相关的操作都需要通过命令行来完成：Shell复制espanso install all-emojis # 安装 all-emojis 扩展包espanso uninstall all-emojis # 卸载 all-emojis 扩展包espanso package list # 查看 Espanso 中的所有扩展包espanso package update all-emojis # 更新 all-emojis 扩展包espanso package update all # 更新 Espanso 中的所有扩展包安装完成之后我们就再次按照前面提到的查看匹配项的方式来检查是否安装成功。除上述方式之外 Espanso 还支持额外的安装方式，甚至你也可以自己去创建并分享一个扩展包，当然这些内容 Espanso 都在文档中找到详细说明，这里就不再额外赘述。结尾虽然 Espanso 在使用上直接了当并且功能强大，它不仅可以帮我们扩展静态的模板内容，也可以具备较强的扩展性，例如调用脚本或使用命令行来得到内容。不过为了让它好用、易用可能还需要多花一点心思在配置上。受限于篇幅，本文仅介绍了 Espanso 中比较重要的一些配置内容；但像全局变量、导入外部配置、变量注入、如何分享自己的扩展包等等细节并没有一一涉及。好在 Espanso 的官方文档已经给出了较为细致的说明，这些未提及的内容就留给你自行探索。
下面简介了AutoKey软件的概述、安装和使用方法。了解到这个软件的起因是在Ubuntu中想实现Windows中的自定义短语，但是Ubuntu中的Ibus输入法不是很支持该功能。搜索之后了解到espanso和AutoKey可以实现该功能。另外，AutoKey和WIndows中的AutoHotKey功能很相似，但并不是同一个软件。注：AutoKey目前不支持Wayland协议，只支持Xorg，而Ubuntu22.04默认使用的是Wayland。虽然可以切换，但也很麻烦。生成AI：Claude-3-Opus（POE）官方文档：1. https://github.com/autokey/autokey 2. Welcome to AutoKey!1 AutoKey 简介什么是 AutoKeyAutoKey 是一款开源的 Linux 桌面自动化工具,主要用于自动输入文本和执行预定义的操作。它可以帮助用户将常用的短语、句子或代码片段绑定到缩写或热键上,从而提高输入效率,节省时间。AutoKey 支持纯文本和富文本格式,可以在各种应用程序中使用,如文本编辑器、邮件客户端、IDE 等。AutoKey 的主要功能AutoKey 提供了以下主要功能:文本替换:将预定义的缩写替换为相应的文本内容,支持纯文本和富文本格式。脚本执行:可以将 Python 脚本绑定到缩写或热键上,实现更加灵活和强大的自动化操作。快捷键绑定:可以将缩写或脚本绑定到特定的热键组合,通过按键触发相应的操作。应用程序特定的缩写:可以为特定的应用程序设置专属的缩写,实现更加精准的自动化。文本模板:支持创建包含动态内容的文本模板,如日期、时间、剪贴板内容等。AutoKey 的工作原理AutoKey 的工作原理如下:用户在 AutoKey 中创建缩写,并将其绑定到相应的文本内容或 Python 脚本。AutoKey 在后台监听用户的键盘输入,当检测到与预定义缩写匹配的输入时,触发相应的替换操作。如果缩写绑定的是文本内容,AutoKey 会自动删除缩写,并将绑定的文本内容输入到当前光标所在位置。如果缩写绑定的是 Python 脚本,AutoKey 会执行该脚本,并根据脚本的逻辑执行相应的自动化操作,如模拟按键、粘贴文本、控制窗口等。AutoKey 的优势和适用场景AutoKey 的优势包括:提高输入效率:通过将常用的文本绑定到缩写,可以显著减少输入所需的时间和按键次数。自动化重复性任务:利用 Python 脚本,可以自动执行一些重复性的操作,如数据格式转换、文件处理等。减少错误:预定义的缩写和脚本可以确保输入的一致性和准确性,减少手动输入带来的错误。易于自定义:用户可以根据自己的需求,创建和管理缩写和脚本,实现个性化的自动化。AutoKey 适用于以下场景:编程:可以将常用的代码片段、函数模板绑定到缩写,提高编码效率。文案写作:可以将常用的句子、段落、签名等绑定到缩写,加快写作速度。客户服务:可以将常用的回复模板绑定到缩写,提高响应速度和一致性。数据录入:可以将常用的数据格式、表格模板绑定到缩写,简化录入过程。总之,AutoKey 是一款功能强大、灵活易用的 Linux 自动化工具,通过自定义缩写和脚本,可以显著提高工作效率,适用于各种需要重复输入和操作的场景。2 AutoKey 的安装和配置在 Ubuntu 系统中安装 AutoKey在 Ubuntu 系统中,可以通过两种方式安装 AutoKey:通过 Ubuntu 软件中心安装或使用 apt 命令安装。通过 Ubuntu 软件中心安装打开 Ubuntu 软件中心。在搜索框中输入 "AutoKey",点击搜索。在搜索结果中找到 "AutoKey" 应用,点击 "安装" 按钮。输入用户密码,等待安装完成。使用 apt 命令安装打开终端。输入以下命令,按回车执行:sudo apt updatesudo apt install autokey-gtk输入用户密码,等待安装完成。启动和配置 AutoKey启动 AutoKey安装完成后,可以通过以下方式启动 AutoKey:在 Ubuntu 的应用程序菜单中找到并点击 "AutoKey" 图标。在终端中输入 autokey-gtk 命令,按回车执行。熟悉 AutoKey 的用户界面AutoKey 的主界面由以下几个部分组成:缩写列表:显示所有已创建的缩写。缩写编辑器:用于编辑选中的缩写的内容和属性。工具栏:包含常用的操作按钮,如新建缩写、保存、删除等。菜单栏:提供访问 AutoKey 各种功能和设置的菜单项。创建和管理缩写创建新的缩写在 AutoKey 主界面中,点击工具栏上的 "新建" 按钮,或右键点击缩写列表中的 "My Phrases" 文件夹,选择 "New" > "Phrase"。在缩写编辑器中,输入缩写的名称、缩写内容以及可选的注释。点击工具栏上的 "保存" 按钮,或按 Ctrl+S 键保存缩写。编辑和删除现有缩写在缩写列表中,双击要编辑的缩写,或选中缩写后点击工具栏上的 "编辑" 按钮。在缩写编辑器中,修改缩写的内容或属性。点击工具栏上的 "保存" 按钮,或按 Ctrl+S 键保存修改。要删除缩写,在缩写列表中选中要删除的缩写,点击工具栏上的 "删除" 按钮,或按 Delete 键。设置触发方式AutoKey 支持两种触发方式:缩写触发和快捷键触发。缩写触发在缩写编辑器中,找到 "Abbreviations" 字段。输入要用作触发缩写的缩写内容,多个缩写之间用逗号分隔。保存缩写。当在任意应用程序中输入设定的缩写并按下空格、回车或标点符号时,缩写将被替换为预定义的内容。快捷键触发在缩写编辑器中,找到 "Hotkey" 字段。点击 "Set" 按钮,按下要用作触发缩写的快捷键组合。保存缩写。当在任意应用程序中按下设定的快捷键时,缩写内容将被插入到光标所在位置。通过以上步骤,你可以在 Ubuntu 系统中安装、配置 AutoKey,并创建和管理自定义的缩写。合理使用缩写触发和快捷键触发,可以显著提高输入效率和工作流程的自动化程度。3 AutoKey 的进阶使用使用 Python 脚本扩展 AutoKey 功能AutoKey 支持使用 Python 脚本来扩展其功能,使其能够执行更加复杂和灵活的自动化任务。编写 Python 脚本在 AutoKey 主界面中,右键点击 "My Scripts" 文件夹,选择 "New" > "Script"。在脚本编辑器中,输入 Python 脚本的内容。AutoKey 提供了一些内置的模块和函数,如 keyboard、mouse、system 等,可以用于模拟键盘输入、鼠标操作和执行系统命令等。保存脚本,并为其指定一个易于识别的名称。在缩写中调用 Python 脚本创建一个新的缩写或编辑现有的缩写。在缩写内容中,使用 标签来引用 Python 脚本,例如 myscript.py。保存缩写。当触发该缩写时,AutoKey 将执行指定的 Python 脚本。AutoKey 的常见问题和解决方法常见问题 1:缩写无法触发可能原因: - 缩写内容与实际输入不匹配。 - 缩写触发方式设置不正确。 - AutoKey 服务未启动或已停止。解决方法: 1. 仔细检查缩写内容,确保与实际输入完全匹配。 2. 检查缩写的触发方式设置,确保已选择正确的触发方式(缩写触发或快捷键触发)。 3. 确保 AutoKey 服务已启动并正常运行。如果服务已停止,可以在终端中输入 autokey-gtk 命令重新启动。常见问题 2:Python 脚本执行错误可能原因: - Python 脚本中存在语法错误或逻辑错误。 - 脚本中使用的模块或函数不受支持或未正确导入。解决方法: 1. 仔细检查 Python 脚本的语法和逻辑,确保没有错误。 2. 确保脚本中使用的模块和函数已正确导入,并受 AutoKey 支持。可以参考 AutoKey 的文档和示例代码。AutoKey 的使用技巧和建议使用技巧 1:创建递归缩写递归缩写是指在缩写的替换内容中包含缩写本身,从而实现多级展开。例如,创建缩写 "dt" 替换为 "$(date +%Y-%m-%d) $(date +%H:%M:%S)"。当输入 "dtdt" 时,将展开为 "2023-04-20 10:30:00 2023-04-20 10:30:00"。使用技巧 2:使用 Python 脚本实现动态内容在 Python 脚本中,可以使用变量、函数和控制结构等编程元素来生成动态内容。例如,可以编写脚本从文件或数据库中读取数据,根据条件生成不同的输出,或执行一些自动化操作后返回结果。AutoKey 的替代品和对比替代品 1:EspansoEspanso 是一款跨平台的文本扩展工具,支持 Windows、macOS 和 Linux。它使用 YAML 格式的配置文件来定义缩写和替换内容,支持 Shell 和 JavaScript 脚本,并提供了丰富的匹配选项和变量。与 AutoKey 相比,Espanso 的优势在于跨平台支持和更简洁的配置语法,但缺少图形化的用户界面。替代品 2:AutoHotkey (Windows)AutoHotkey 是一款功能强大的 Windows 自动化脚本语言和工具,可用于创建热键、宏、文本扩展等。它使用自己的脚本语言,提供了大量的内置函数和命令,可以与 Windows API 和其他应用程序交互。与 AutoKey 相比,AutoHotkey 更加灵活和功能丰富,但仅支持 Windows 平台,学习曲线也较为陡峭。总的来说,AutoKey 的进阶使用涉及 Python 脚本的编写和调用,以及一些常见问题的解决方法和使用技巧。对于有更高级需求的用户,可以考虑使用 Espanso 或 AutoHotkey 等替代工具,根据具体的使用场景和平台选择最适合的方案。
vscode 界面安装的插件：vscode+neovim 设置参考这篇文档：http://bennyhe.cn/index.php/archives/327/gvim 的界面：常用功能都有，文件浏览、语法高亮、彩虹括号、括号自动补齐、输入关键词提示，ctag 函数跳转、文档状态、多terminal（tmux）集成等等常用功能。terminal界面采用tmux，配合clipper 工具可以和gvim 文本窗口互相粘贴，可以分页多个terminal。gvim 按照的插件~/.vim/ 下文件夹结构~/.vim/ 下文件（插件）acp.vim auto-pairs.vim grep.vim mark.vim NERD_tree.vim scala.vim Tabular.vim verilog_systemverilog.vim vtreeexplorer.vimairline.vim ctrlp.vim marksbrowser.vim matchit.vim rainbow_parentheses.vim showmarks.vim taglist.vim visual-increment.vim~/.vimrc 文件如下：if v:version >= 900 set scroll=1 let g:airline_scroll_size = 1 " 覆盖插件默认值 endif set number syntax on set showmode set showcmd set hlsearch set autoindent set smartindent set cindent set ts=4 set softtabstop=4 set shiftwidth=4 set noexpandtab set tabstop=4 set cursorline set cursorcolumn set lines=35 columns=100 set ruler set showmatch set wrap noremap <C-S-A> gggH<C-O>G inoremap <C-S-A> <C-O>gg<C-O>gH<C-O>G cnoremap <C-S-A> <C-C>gggH<C-O>G onoremap <C-S-A> <C-C>gggH<C-O>G snoremap <C-S-A> <C-C>gggH<C-O>G xnoremap <C-S-A> <C-C>ggVG noremap <C-S> :update<CR> vnoremap <C-S> <C-C>:update<CR> inoremap <C-S> <Esc>:update<CR>gi if has("clipboard") " CTRL-X and SHIFT-Del are Cut vnoremap <C-A-X> "+x vnoremap <S-Del> "+x " CTRL-C and CTRL-Insert are Copy vnoremap <C-A-C> "+y vnoremap <C-Insert> "+y " CTRL-V and SHIFT-Insert are Paste map <C-A-V> "+gP map <S-Insert> "+gP cmap <C-A-V> <C-R>+ cmap <S-Insert> <C-R>+ endif "source $VIMRUNTIME/mswin.vim behave mswin set guifont=Monospace\ 14 set linespace=4 colorscheme evening "unmap <C-V> "unmap <C-A> "unmap <C-C> "unmap <C-X> " copy paste map <C-Insert> "+y map <S-Insert> "+gP "Mouse could be controled when INSERT model set mouse=a set selection=exclusive set selectmode=mouse,key "============================= " showmarks setting "============================= " Enable ShowMarks let showmarks_enable = 1 " Show which marks let showmarks_include = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" " Ignore help, quickfix, non-modifiable buffers let showmarks_ignore_type = "hqm" " Hilight lower & upper marks let showmarks_hlline_lower = 1 let showmarks_hlline_upper = 1 hi ShowMarksHLl ctermbg=Yellow ctermfg=Black guibg=#FFDB72 guifg=Black hi ShowMarksHLu ctermbg=Magenta ctermfg=Black guibg=#FFB3FF guifg=Black "============================= " markbrowser setting "============================= nmap <silent> <leader>mk :MarksBrowser<cr> "Config for treeExplorer plugin let g:treeExplVertical=0 let g:treeExplDirSort=1 let g:treeExplWinSize=20 nmap vt :VSTreeExplore<cr> set autoread nmap <S-F> :call Verilog_format()<cr> function! Verilog_format() :w :silent execute '!~/.vim/tool/verible-verilog-format --column_limit=120 --indentation_spaces=4 --assignment_statement_alignment=align --named_port_alignment=align --port_declarations_alignment=align --module_net_variable_alignment=align --distribution_items_alignment=align --formal_parameters_indentation=indent --port_declarations_right_align_packed_dimensions=true --port_declarations_right_align_unpacked_dimensions=true --inplace=true --verify_convergence=true' expand('%:p') endfunction "ctrlp let g:ctrlp_map = '<c-p>' let g:ctrlp_cmd = 'CtrlP' "Grep hot key nnoremap <silent><C-F> :Grep -r<CR> "filetype, 'indent on' is necessary for smartindent filetype on filetype plugin on filetype indent on "header nmap <C-H> :call AddHeader()<cr> function! AddHeader() call append(0, '///////////////////////////////////////////////////////////////////') call append(1, '//copyright : Copyright © 2019-2023 INNOSTAR. All rights reserved') call append(2, '//project name: demo') call append(3, '//file name : '.expand('%:t')) call append(4, '//author : bennyhe') call append(5, '//abstraction : ') call append(6, '//date : '.strftime('%Y-%m-%d %H:%M:%S')) call append(7, '//version : 2.0') call append(8, '//platform : SuperBench 2.0') call append(9, '//history : created by bennyhe @'.strftime('%Y-%m-%d %H:%M:%S').expand(' v2.0')) call append(10, '///////////////////////////////////////////////////////////////////') endfunction "function nmap <C-L> :call AddFunction()<cr> function! AddFunction() call append(line(".")-1, ' /*****************************************************************') call append(line(".")-1, ' *') call append(line(".")-1, ' *****************************************************************/') endfunction set tags=tags; set tags+=~/.vim/tags/tags; set tags+=~/.vim/tags/tags_uvm; set tags+=~/.vim/tags/tags_vip; set autochdir "config for tlist plugin let Tlist_Ctags_Cmd = '/usr/bin/ctags' let Tlist_Use_Right_Window=0 let Tlist_Max_Tag_Length=1 let g:Tlist_Compact_Format=1 "let g:Tlist_WinHeight=5 let g:Tlist_WinWidth=15 let g:Tlist_Use_Horiz_Window=0 let g:Tlist_Show_One_File=1 "let g:Tlist_Exit_OnlyWindow=1 nmap tl :Tlist<cr> "terminal noremap <F8> :close!<cr> noremap <S-M-p> :sp<cr> noremap <S-M-q> :vs<cr> "noremap <F3> :belowright term ++rows=5 d:\msys64\msys2_shell.cmd -msys -defterm -no-start <cr> noremap <F3> :belowright term ++rows=5 powershell ubuntu2204.exe<cr> noremap <F4> :belowright term ++rows=5 powershell<cr> let b:match_words='\<begin\>:\<end\>' let g:rbpt_colorpairs = [ \ ['brown', 'RoyalBlue3'], \ ['Darkblue', 'SeaGreen3'], \ ['darkgray', 'DarkOrchid3'], \ ['darkgreen', 'firebrick3'], \ ['darkcyan', 'RoyalBlue3'], \ ['darkred', 'SeaGreen3'], \ ['darkmagenta', 'DarkOrchid3'], \ ['brown', 'firebrick3'], \ ['gray', 'RoyalBlue3'], \ ['black', 'SeaGreen3'], \ ['darkmagenta', 'DarkOrchid3'], \ ['Darkblue', 'firebrick3'], \ ['darkgreen', 'RoyalBlue3'], \ ['darkcyan', 'SeaGreen3'], \ ['darkred', 'DarkOrchid3'], \ ['red', 'firebrick3'], \ ] let g:rbpt_max = 16 let g:rbpt_loadcmd_toggle = 0 ""update ctags nmap <F10> :call UpdateCtags()<CR> function! UpdateCtags() let curdir=getcwd() while !filereadable("./tags") cd .. if getcwd() == "/" break endif endwhile if filewritable("./tags") silent !ctags -R --file-scope=yes --languages=systemverilog --links=yes --fields=+iaS --extra=+q TlistUpdate endif execute ":cd " . curdir endfunction nmap <F11> :call UpdateCtags_vip()<CR> function! UpdateCtags_vip() silent !ctags -R --languages=systemverilog -f ~/.vim/tags/tags_vip /data/ver/powervip/v2_0/ endfunction "autocmd BufWritePost *.sv,*.svh,*.v call UpdateCtags() "auto exce "set lines=999 columns=999 augroup initial autocmd! "autocmd VimEnter * VSTreeExplore "autocmd VimEnter * bo terminal ++rows=5 autocmd VimEnter * wincmd k autocmd VimEnter * Tlist autocmd VimEnter * wincmd h autocmd VimEnter * sp autocmd VimEnter * VSTreeExplore autocmd VimEnter * wincmd l autocmd VimEnter * q autocmd VimEnter * wincmd l au VimEnter * RainbowParenthesesToggleAll au Syntax * RainbowParenthesesLoadRound au Syntax * RainbowParenthesesLoadSquare au Syntax * RainbowParenthesesLoadBraces augroup END ":autocmd GUIEnter * VSTreeExplore "let g:airline_powerline_fonts = 1 let g:airline_theme = 'dark' let g:airline#extensions#tabline#enabled = 1 let g:airline#extensions#tabline#show_splits = 1 let g:airline#extensions#tabline#buffer_nr_show = 0 let g:airline#extensions#tabline#buffer_idx_mode = 3 let g:airline#extensions#tabline#show_tab_nr = 1 let g:airline#extensions#tabline#tab_nr_type = 1 let g:airline#extensions#branch#format =2 let g:airline_left_sep='>' let g:airline_inactive_collapse=0 let g:airline#extensions#tabline#formatter = 'unique_tail' let g:airline#extensions#tabline#buffer_idx_format = { \ '0': '0', \ '1': '1', \ '2': '2', \ '3': '3', \ '4': '4', \ '5': '5', \ '6': '6', \ '7': '7', \ '8': '8', \ '9': '9', \ ' ': ' ' \} let mapleader = "\<space>" let g:mapleader = "\<space>" set foldenable set foldmethod=marker set foldlevel=99 "" 代码折叠自定义快捷键 <leader>zz let g:FoldMethod = 0 map <leader>zz :call ToggleFold()<cr> fun! ToggleFold() if g:FoldMethod == 0 exe "normal! zM" let g:FoldMethod = 1 else exe "normal! zR" let g:FoldMethod = 0 endif endfun "set nocompatible "autocmd! bufwritepost .vimrc source % nmap <tab> :bn<cr> nmap <S-Tab> :bp<CR> "nmap <leader>1 :b 1<CR> nmap <leader>1 <Plug>AirlineSelectTab1 "{{{ nmap <leader>2 <Plug>AirlineSelectTab2 nmap <leader>3 <Plug>AirlineSelectTab3 nmap <leader>4 <Plug>AirlineSelectTab4 nmap <leader>5 <Plug>AirlineSelectTab5 nmap <leader>6 <Plug>AirlineSelectTab6 nmap <leader>7 <Plug>AirlineSelectTab7 nmap <leader>8 <Plug>AirlineSelectTab8 nmap <leader>9 <Plug>AirlineSelectTab9 nmap <leader>10 <Plug>AirlineSelectTab10 nmap <leader>11 <Plug>AirlineSelectTab11 nmap <leader>12 <Plug>AirlineSelectTab12 nmap <leader>13 <Plug>AirlineSelectTab13 nmap <leader>14 <Plug>AirlineSelectTab14 nmap <leader>15 <Plug>AirlineSelectTab15 nmap <leader>16 <Plug>AirlineSelectTab16 nmap <leader>17 <Plug>AirlineSelectTab17 nmap <leader>18 <Plug>AirlineSelectTab18 nmap <leader>19 <Plug>AirlineSelectTab19 nmap <leader>20 <Plug>AirlineSelectTab20 nmap <leader>21 <Plug>AirlineSelectTab21 nmap <leader>22 <Plug>AirlineSelectTab22 nmap <leader>23 <Plug>AirlineSelectTab23 nmap <leader>24 <Plug>AirlineSelectTab24 nmap <leader>25 <Plug>AirlineSelectTab25 nmap <leader>26 <Plug>AirlineSelectTab26 nmap <leader>27 <Plug>AirlineSelectTab27 nmap <leader>28 <Plug>AirlineSelectTab28 nmap <leader>29 <Plug>AirlineSelectTab29 nmap <leader>30 <Plug>AirlineSelectTab30 nmap <leader>31 <Plug>AirlineSelectTab31 nmap <leader>32 <Plug>AirlineSelectTab32 nmap <leader>33 <Plug>AirlineSelectTab33 nmap <leader>34 <Plug>AirlineSelectTab34 nmap <leader>35 <Plug>AirlineSelectTab35 nmap <leader>36 <Plug>AirlineSelectTab36 nmap <leader>37 <Plug>AirlineSelectTab37 nmap <leader>38 <Plug>AirlineSelectTab38 nmap <leader>39 <Plug>AirlineSelectTab39 nmap <leader>40 <Plug>AirlineSelectTab40 nmap <leader>41 <Plug>AirlineSelectTab41 nmap <leader>42 <Plug>AirlineSelectTab42 nmap <leader>43 <Plug>AirlineSelectTab43 nmap <leader>44 <Plug>AirlineSelectTab44 nmap <leader>45 <Plug>AirlineSelectTab45 nmap <leader>46 <Plug>AirlineSelectTab46 nmap <leader>47 <Plug>AirlineSelectTab47 nmap <leader>48 <Plug>AirlineSelectTab48 nmap <leader>49 <Plug>AirlineSelectTab49 nmap <leader>50 <Plug>AirlineSelectTab50 nmap <leader>51 <Plug>AirlineSelectTab51 nmap <leader>52 <Plug>AirlineSelectTab52 nmap <leader>53 <Plug>AirlineSelectTab53 nmap <leader>54 <Plug>AirlineSelectTab54 nmap <leader>55 <Plug>AirlineSelectTab55 nmap <leader>56 <Plug>AirlineSelectTab56 nmap <leader>57 <Plug>AirlineSelectTab57 nmap <leader>58 <Plug>AirlineSelectTab58 nmap <leader>59 <Plug>AirlineSelectTab59 nmap <leader>60 <Plug>AirlineSelectTab60 nmap <leader>61 <Plug>AirlineSelectTab61 nmap <leader>62 <Plug>AirlineSelectTab62 nmap <leader>63 <Plug>AirlineSelectTab63 nmap <leader>64 <Plug>AirlineSelectTab64 nmap <leader>65 <Plug>AirlineSelectTab65 nmap <leader>66 <Plug>AirlineSelectTab66 nmap <leader>67 <Plug>AirlineSelectTab67 nmap <leader>68 <Plug>AirlineSelectTab68 nmap <leader>69 <Plug>AirlineSelectTab69 nmap <leader>70 <Plug>AirlineSelectTab70 nmap <leader>71 <Plug>AirlineSelectTab71 nmap <leader>72 <Plug>AirlineSelectTab72 nmap <leader>73 <Plug>AirlineSelectTab73 nmap <leader>74 <Plug>AirlineSelectTab74 nmap <leader>75 <Plug>AirlineSelectTab75 nmap <leader>76 <Plug>AirlineSelectTab76 nmap <leader>77 <Plug>AirlineSelectTab77 nmap <leader>78 <Plug>AirlineSelectTab78 nmap <leader>79 <Plug>AirlineSelectTab79 nmap <leader>80 <Plug>AirlineSelectTab80 nmap <leader>81 <Plug>AirlineSelectTab81 nmap <leader>82 <Plug>AirlineSelectTab82 nmap <leader>83 <Plug>AirlineSelectTab83 nmap <leader>84 <Plug>AirlineSelectTab84 nmap <leader>85 <Plug>AirlineSelectTab85 nmap <leader>86 <Plug>AirlineSelectTab86 nmap <leader>87 <Plug>AirlineSelectTab87 nmap <leader>88 <Plug>AirlineSelectTab88 nmap <leader>89 <Plug>AirlineSelectTab89 nmap <leader>90 <Plug>AirlineSelectTab90 nmap <leader>91 <Plug>AirlineSelectTab91 nmap <leader>92 <Plug>AirlineSelectTab92 nmap <leader>93 <Plug>AirlineSelectTab93 nmap <leader>94 <Plug>AirlineSelectTab94 nmap <leader>95 <Plug>AirlineSelectTab95 nmap <leader>96 <Plug>AirlineSelectTab96 nmap <leader>97 <Plug>AirlineSelectTab97 nmap <leader>98 <Plug>AirlineSelectTab98 nmap <leader>99 <Plug>AirlineSelectTab99 "nmap <leader>- <Plug>AirlineSelectPrevTab "nmap <leader>+ <Plug>AirlineSelectNextTab "}}}
原创php中文网php中文网课程2022年11月16日17：00安徽1.Piwigo（一款开源在线相册应用）项目地址：https://github.com/Piwigo/Piwigo采用 PHP+MySQL 开发的管理照片的 Web 项目，它功能强大安装简单，拥有丰富的主题和灵活的插件，可轻松完成个性化定制。支持 iOS 和 Android 客户端，让你可以随时随地上传、管理照片。2.SyncMusic（在线弹幕点歌台）项目地址：https://github.com/kasuganosoras/SyncMusic基于 PHP Swoole 开发的在线弹幕点歌台。支持自由点歌、切歌、调整排序、删除指定音乐以及基础权限分级3.freenom（免费域名自动续期工具）项目地址：https://github.com/luolongfei/freenom因为顶级免费域名供应商 Freenom，提供的免费域名需要每年续期，该项目可以自动完成域名续期，让你轻松拥有免费的顶级域名。4.dootask（在线项目管理平台）项目地址：https://github.com/kuaifan/dootask功能包括任务分配、文档协作、即时 IM、文档协作、文件管理等5.server（开源云存储平台）项目地址：https://github.com/nextcloud/server开源云存储平台，功能齐全，可以用于搭建公司内部的云存储平台来自微信
5 分钟，教你从零快速编写一个油猴脚本！
1T服务圈儿2022年05月07日17：30江苏来源：经授权转自 AirPython（ID：AirPython）作者：星安果Tampermonkey，又称 Greasemonkey 油猴脚本，是一款免费的浏览器扩展，可用于管理用户脚本，它本质上是对浏览器接口的二次封装油猴脚本可用于更改页面布局样式、完成页面自动化、去广告、下载影视等功能，适用于主流的浏览器官网：https://www.tampermonkey.net/index.php介绍Tampermonkey 特点包含：内置的编辑器，可以非常方便地管理、编辑用户脚本支持自动更新检查功能标签中脚本运行状态速览可以通过压缩文件、云存储进行脚本备份及还原通过面板新建一个用户脚本，默认会生成一个模板，模板内容如下：模板中会预设部分元数据，用于定义脚本的名称、版本号、更新方式、运行页面、权限等功能常见的元数据包含：@name - 油猴脚本的名称 @namespace 脚本的命名空间，用于确定脚本的唯一性 @version 脚本的版本号，用于脚本的更新 @description 脚本的描述信息 @author 作者 @require 定义脚本运行之前需要引入的外部 JS，比如：jQuery @match 使用通配符执行需要匹配运行的网站地址 @exclude 排除匹配到的网站 @grant 指定脚本运行所属的权限 @connect 用于跨域访问时指定的目标网站域名 @run-at 指定脚本的运行时机 @icon 用于指定脚本的图标，可以设置为图片 URL 地址或 base64 的字符串常见 API油猴提供了很多强大的 API，用于操作缓存及窗口等，如果不需要使用这些 API，可以声明权限为 none，即：@grant none2-1 打印日志用于在控制台中打印日志，便于调试// 授权 @grant GM_log // 在控制台打印日志 GM_log("Hello World");2-2 缓存管理包含对缓存的新增、获取、删除，在使用之前我们都需要使用关键字 @grant 进行授权//授权 // @grant GM_setValue // @grant GM_getValue // @grant GM_deleteValue //设置缓存 GM_setValue("hello", true); //获取缓存，默认值为true GM_getValue("hello", true); //删除缓存 GM_deleteValue("hello")2-3 缓存监听有时候，我们需要对缓存中的某个键的值进行监听，当发生变化时，调用一个方法事件比如，这里新增了一个监听器，对键名为 hello 的值进行监听// 授权 // @grant GM_addValueChangeListener // @grant GM_removeValueChangeListener // 添加一个监听器 const listener_id = GM_addValueChangeListener('hello', function(name, old_value, new_value, remote){ if(hello == false){ //具体的调用方法 //.... } }) //监听监听器 GM_removeValueChangeListener(listener_id);2-4 打开一个标签格式：GM_openInTab(url, options)该 API 可用于打开一个新的标签页面其中，第一个参数用于指定新标签页面的 URL 地址，第二个参数用于指定页面展示方式及焦点停留页面// 授权 // @grant GM_openInTab // 打开新页面 var onpenNewTap = function (){ //打开百度页面 //active:true，新标签页获取页面焦点 //setParent :true:新标签页面关闭后，焦点重新回到源页面 newTap = GM_openInTab("https://www.baidu.com",{ active: true, setParent :true}); ...2-5 跨域请求在授予 GM_xmlhttpRequest 权限之后，就可以跨域发送请求了PS：第一次跨域请求时，会弹出请求对话框，需要选中允许，才能正常进行跨域请求// 授权 // @grant GM_xmlhttpRequest ... GM_xmlhttpRequest({ url:"http://www.httpbin.org/post", method:'POST', headers: { "content-type": "application/json" }, data:"", onerror:function(res){ console.log(res); }, onload:function(res){ console.log(res); } }); ...实战一下以某一新闻网站的自动加载下一页为例进行说明目标网站：IGh0dHBzOi8vd3d3LnBpbmd3ZXN0LmNvbS8=首先，我们使用关键字 @match 指定匹配的网站 URL，使用 @grant 设置权限 GM_log，使用关键字@run-at 指定执行时机为页面加载完成，即：document-end// ==UserScript== // @name 新闻查看更多 // @namespace com.xag.more // @version 0.1 // @license GNU General Public License v3.0 // @description 自动查看下一页 // @author xingag // @match 目标网站 // @icon 图标icon地址 // @grant GM_log // @run-at document-end // ==/UserScript== ...接着，添加一个定时任务，获取每一页底部的加载更多按钮最后，判断元素存在时，执行点击操作即可... (function() { 'use strict'; console.log("location.hostname:",location.hostname) if(location.hostname == "www.pingwest.com"){ setInterval(() => { const more_element = document.querySelector(".load-more-box").querySelector("a") if(more_element){ GM_log("元素存在，点击加载更多。。。") more_element.click(); } }, 2000); } })() ...总结本篇文章以一个简单的实例讲解了编写一个油猴脚本的完整流程为了提升开发效率，实际编写脚本可以使用 VS Code 编译器，安装插件 Tampermonkey Snippets 后再进行用户脚本开发当然，应对一些复杂的场景，可以借助一些优秀的脚手架框架https://github.com/kinyaying/wokoohttps://www.npmjs.com/package/create-tampermonkeyhttps://github.com/qianjiachun/vue3-tampermonkey来自微信
通过公网IP 云服务器做开源免费内网穿透推荐
本文以渗透的视角，总结几种个人常用的内网穿透，内网代理工具，介绍其简单原理和使用方法。nps1.1 简介nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发，可支持任何tcp、udp上层协议（访问内网网站、本地支付接口调试、ssh访问、远程桌面，内网dns解析等等……），此外还支持内网http代理、内网socks5代理、p2p等，并带有功能强大的web管理端。一台有公网IP的服务器（VPS）运行服务端（NPS）一个或多个运行在内网的服务器或者PC运行客户端（NPC）1.2 特点Go语言编写支持跨平台支持多种协议的代理web管理端1.3 使用方法https://github.com/ehang-io/nps/releasesNPS安装配置找到自己服务器相应版本的server： cd ~ wget https://github.com/cnlh/nps/releases/download/v0.23.2/linux_amd64_server.tar.gz tar xzvf linux_amd64_server.tar.gz cd ~/nps在nps目录下面会有一个nps可执行文件、conf配置目录和web网页目录，我们只需要修改conf/nps.conf即可：vim conf/nps.conf需要改一下#web下面的几个参数，web_host= 服务器IP或者域名 web_username= admin（登录用户名） web_password= 你的密码 web_port=8080（web管理端口）修改#bridge 可以更改 NPC的连接端口。比如我们拿到一台权限受限的服务器，有防火墙，可能只有部分端口（80，443）可以出网，就需要修改成出网端口。##bridge bridge_type=tcp bridge_port=443 # 修改连接端口 bridge_ip=0.0.0.0启动#Mac/Linux ./nps test|start|stop|restart|status 测试配置文件|启动|停止|重启|状态 #Windows nps.exe test|start|stop|restart|status 测试配置文件|启动|停止|重启|状态NPC./npc -server=你的IP:8024 -vkey=唯一验证密码 -type=tcp新建好客户端后，也可以在+中看到，详细的客户端连接命令：web管理端在客户端界面可以通过新增的方式添加客户端连接，每一个连接的vkey都是唯一区分的。每一个客户端，在建立连接后，都可以建立多个不同协议的隧道，这一个个隧道就是不同的代理了。通过不同的协议和端口就可以连接代理的内网机器。frp2.1 简介frp 是一个专注于内网穿透的高性能的反向代理应用，支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。2.2 特点客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议。端口复用，多个服务通过同一个服务端端口暴露。跨平台，但是支持的比nps少一点多种插件，提供很多功能2.3 使用方法下载：https://github.com/fatedier/frp/releases以下内容摘自：https://segmentfault.com/a/11900000218768361. 通过 rdp 访问家里的机器1.修改 frps.ini 文件，为了安全起见，这里最好配置一下身份验证，服务端和客户端的 common 配置中的 token 参数一致则身份验证通过：# frps.ini [common] bind_port = 7000 # 用于身份验证，请自行修改，要保证服务端与客户端一致 token = abcdefgh启动 frps：./frps -c ./frps.ini修改 frpc.ini 文件，假设 frps 所在服务器的公网 IP 为 x.x.x.x：# frpc.ini [common] server_addr = x.x.x.x server_port = 7000 # 用于身份验证，请自行修改，要保证服务端与客户端一致 token = abcdefgh [rdp] type = tcp local_ip = 127.0.0.1 local_port = 3389 remote_port = 6000启动 frpc：./frpc -c ./frpc.ini5.通过 rdp 访问远程的机器，地址为：x.x.x.x:6000开机自启针对 Windows 系统，为了便于使用，可以配置一下开机的时候静默启动。1.在 frpc.exe 的同级目录创建一个 start_frpc.vbs：'start_frpc.vbs '请根据实际情况修改路径 CreateObject("WScript.Shell").Run """D:\Program Files\frp_windows_amd64\frpc.exe""" & "-c" & """D:\Program Files\frp_windows_amd64\frpc.ini""",02.复制 start_frpc.vbs 文件，打开以下目录，注意将<USER_NAME>改为你的用户名：C:\Users\<USER_NAME>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup3.鼠标右击，粘贴为快捷方式即可。通过 SSH 访问公司内网机器frps 的部署步骤同上。5.启动 frpc，配置如下： # frpc.ini [common] server_addr = x.x.x.x server_port = 7000 # 用于身份验证，请自行修改，要保证服务端与客户端一致 token = abcdefgh [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6000 6.通过 SSH 访问内网机器，假设用户名为 test：ssh -oPort=6000 test@x.x.x.x通过自定义域名访问部署于内网的 Web 服务有时想要让其他人通过域名访问或者测试我们在本地搭建的 Web 服务，但是由于本地机器没有公网 IP，无法将域名解析到本地的机器，通过 frp 就可以实现这一功能，以下示例为 http 服务，https 服务配置方法相同， vhost_http_port 替换为 vhost_https_port， type 设置为 https 即可。8.修改 frps.ini 文件，设置 http 访问端口为 8080：# frps.ini [common] bind_port = 7000 vhost_http_port = 8080 # 用于身份验证，请自行修改，要保证服务端与客户端一致 token = abcdefgh9.启动 frps：./frps -c ./frps.ini10.修改 frpc.ini 文件，假设 frps 所在的服务器的 IP 为 x.x.x.x，local_port 为本地机器上 Web 服务对应的端口， 绑定自定义域名 www.yourdomain.com:# frpc.ini [common] server_addr = x.x.x.x server_port = 7000 # 用于身份验证，请自行修改，要保证服务端与客户端一致 token = abcdefgh [web] type = http local_port = 80 custom_domains = www.yourdomain.com11.启动 frpc：./frpc -c ./frpc.ini12.将 www.yourdomain.com 的域名 A 记录解析到 IP x.x.x.x，如果服务器已经有对应的域名，也可以将 CNAME 记录解析到服务器原先的域名。13.通过浏览器访问 http://www.yourdomain.com:8080 即可访问到处于内网机器上的 Web 服务。 对外提供简单的文件访问服务通过 static_file 插件可以对外提供一个简单的基于 HTTP 的文件访问服务。frps 的部署步骤同上。rps 的部署步骤同上。1.启动 frpc，启用 static_file 插件，配置如下：# frpc.ini [common] server_addr = x.x.x.x server_port = 7000 # 用于身份验证，请自行修改，要保证服务端与客户端一致 token = abcdefgh [test_static_file] type = tcp remote_port = 6000 plugin = static_file # 要对外暴露的文件目录 plugin_local_path = /tmp/file # 访问 url 中会被去除的前缀，保留的内容即为要访问的文件路径 plugin_strip_prefix = static plugin_http_user = abc plugin_http_passwd = abc2.通过浏览器访问 http://x.x.x.x:6000/static/ 来查看位于 /tmp/file 目录下的文件，会要求输入已设置好的用户名和密码。常用功能统计面板（Dashboard）通过浏览器查看 frp 的状态以及代理统计信息展示。注：Dashboard 尚未针对大量的 proxy 数据展示做优化，如果出现 Dashboard 访问较慢的情况，请不要启用此功能。需要在 frps.ini 中指定 dashboard 服务使用的端口，即可开启此功能：[common] dashboard_port = 7500 # dashboard 用户名密码，默认都为 admin dashboard_user = admin dashboard_pwd = admin打开浏览器通过 http://[server_addr]:7500 访问 dashboard 界面，用户名密码默认为 admin。加密与压缩这两个功能默认是不开启的，需要在 frpc.ini 中通过配置来为指定的代理启用加密与压缩的功能，压缩算法使用 snappy：# frpc.ini [ssh] type = tcp local_port = 22 remote_port = 6000 use_encryption = true use_compression = true如果公司内网防火墙对外网访问进行了流量识别与屏蔽，例如禁止了 SSH 协议等，通过设置 use_encryption = true，将 frpc 与 frps 之间的通信内容加密传输，将会有效防止流量被拦截。如果传输的报文长度较长，通过设置 use_compression = true 对传输内容进行压缩，可以有效减小 frpc 与 frps 之间的网络流量，加快流量转发速度，但是会额外消耗一些 CPU 资源。[TLS从 v0.25.0 版本开始 frpc 和 frps 之间支持通过 TLS 协议加密传输。通过在 frpc.ini 的 common 中配置 tls_enable = true 来启用此功能，安全性更高。为了端口复用，frp 建立 TLS 连接的第一个字节为 0x17。注意：启用此功能后除 xtcp 外，不需要再设置 use_encryption。代理限速目前支持在客户端的代理配置中设置代理级别的限速，限制单个 proxy 可以占用的带宽。# frpc.ini [ssh] type = tcp local_port = 22 remote_port = 6000 bandwidth_limit = 1MB在代理配置中增加 bandwidth_limit 字段启用此功能，目前仅支持 MB 和 KB 单位。范围端口映射在 frpc 的配置文件中可以指定映射多个端口，目前只支持 tcp 和 udp 的类型。这一功能通过 range: 段落标记来实现，客户端会解析这个标记中的配置，将其拆分成多个 proxy，每一个 proxy 以数字为后缀命名。例如要映射本地 6000-6005, 6007 这 6 个端口，主要配置如下：# frpc.ini [range:test_tcp] type = tcp local_ip = 127.0.0.1 local_port = 6000-6006,6007 remote_port = 6000-6006,6007实际连接成功后会创建 8 个 proxy，命名为 test_tcp_0, test_tcp_1 ... test_tcp_7。ew3.1 简介EW 是一套便携式的网络穿透工具，具有 SOCKS v5服务架设和端口转发两大核心功能，可在复杂网络环境下完成网络穿透。但是，现在工具已经不更新了。。。3.2 特点轻量级，C语言编写可以设置多级代理跨平台但是只支持Socks代理3.3 使用方法以下使用方法均摘自：http://rootkiter.com/EarthWorm/以下所有样例，如无特殊说明代理端口均为1080，服务均为SOCKSv5代理服务.该工具共有 6 种命令格式（ssocksd、rcsocks、rssocks、lcx_slave、lcx_listen、lcx_tran）。正向 SOCKS v5 服务器$ ./ew -s ssocksd -l 1080反弹 SOCKS v5 服务器这个操作具体分两步：a) 先在一台具有公网 ip 的主机A上运行以下命令：$ ./ew -s rcsocks -l 1080 -e 8888b) 在目标主机B上启动 SOCKS v5 服务 并反弹到公网主机的 8888端口$ ./ew -s rssocks -d 1.1.1.1 -e 8888成功。多级级联工具中自带的三条端口转发指令， 它们的参数格式分别为：$ ./ew -s lcx_listen -l 1080 -e 8888 $ ./ew -s lcx_tran -l 1080 -f 2.2.2.3 -g 9999 $ ./ew -s lcx_slave -d 1.1.1.1 -e 8888 -f 2.2.2.3 -g 9999通过这些端口转发指令可以将处于网络深层的基于TCP的服务转发至根前,比如 SOCKS v5。首先提供两个“二级级联”本地SOCKS测试样例：a) lcx_tran 的用法$ ./ew -s ssocksd -l 9999$ ./ew -s lcx_tran -l 1080 -f 127.0.0.1 -g 9999b) lcx_listen、lcx_slave 的用法$ ./ew -s lcx_listen -l 1080 -e 8888$ ./ew -s ssocksd -l 9999$ ./ew -s lcx_slave -d 127.0.0.1 -e 8888 -f 127.0.0.1 -g 9999再提供一个“三级级联”的本地SOCKS测试用例以供参考$ ./ew -s rcsocks -l 1080 -e 8888$ ./ew -s lcx_slave -d 127.0.0.1 -e 8888 -f 127.0.0.1 -g 9999$ ./ew -s lcx_listen -l 9999 -e 7777$ ./ew -s rssocks -d 127.0.0.1 -e 7777数据流向: SOCKS v5 -> 1080 -> 8888 -> 9999 -> 7777 -> rssocksngrok4.1 简介ngrok 是一个反向代理，通过在公共端点和本地运行的 Web 服务器之间建立一个安全的通道，实现内网主机的服务可以暴露给外网。ngrok 可捕获和分析所有通道上的流量，便于后期分析和重放，所以ngrok可以很方便地协助服务端程序测试。4.2 特点官方维护，一般较为稳定跨平台，闭源有流量记录和重发功能4.3 使用方法进入ngrok官网（https://ngrok.com/），注册ngrok账号并下载ngrok；根据官网给定的授权码，运行如下授权命令；./ngrok authtoken 1hAotxhmORtzCYvUc3BsxDBPh1H_**./ngrok http 80即可将机器的80端口http服务暴露到公网，并且会提供一个公网域名。可以通过官网的UI界面查看数据包和流量等等（但是要付费==、）还可以通过一些命令将内网的文件和其他TCP服务 暴露到公网中。有授权的设置文件共享ngrok http -auth="user:password" file:///Users/alan/share无授权的设置文件共享ngrok http "file:///C:\Users\alan\Public Folder"将主机的3389的TCP端口暴露到公网ngrok tcp 3389更多使用方法参考：https://ngrok.com/docs来自微信
1.RustDesk简介此软件主要功能为远程各种设备（其中包括Windows、macOS、Linux、iOS、Android、Web等）支持文件传输（可直接拷贝远程电脑的文件，类似向日葵的远程文件）支持内网穿透（支持端口映射，TCP/UDP，支持Windows默认远程桌面应用）最主要优点为可远程Android，本人最爱，简单配置，可帮助老家父母直接操控手机，解决他们使用手机过程中的问题2.同类型软件对比（我已知的）2.1 向日葵①网络差②不能高清分辨率③不支持自建服务器④使用第三方网络转发不安全⑤不支持内网穿透（端口映射）⑥不能满足所有设备（我知道的安卓就不可以）2.2 frp①部署不方便②只能使用Windows自带远程桌面③每次端口映射都需要修改配置文件并且重启服务④不能满足所有设备（好像只能电脑使用）2.3 TeamViewer不过多介绍 好多年就不用了（我记的疫情期间居家办公直接卡的要死，之后就没在用过）2.4 ToDesk/RayLink①不能满足所有设备（安卓不能使用）②不支持自建服务器③使用第三方网络转发不安全④不支持内网穿透（端口映射）————————————————1.拉取RustDesk镜像sudo docker image pull rustdesk/rustdesk-server阿里云加速使用这个sudo docker image pull thtom/rustdesk-server2.启动hbbs服务sudo docker run --name hbbs -p 21115:21115 -p 21116:21116 -p 21116:21116/udp -p 21118:21118 -v pwd:/root -td --net=host rustdesk/rustdesk-server hbbs阿里云加速使用这个sudo docker run --name hbbs -p 21115:21115 -p 21116:21116 -p 21116:21116/udp -p 21118:21118 -v pwd:/root -td --net=host thtom/rustdesk-server hbbs3.启动hbbr服务sudo docker run --name hbbr -p 21117:21117 -p 21119:21119 -v pwd:/root -td --net=host rustdesk/rustdesk-server hbbr阿里云加速使用这个sudo docker run --name hbbr -p 21117:21117 -p 21119:21119 -v pwd:/root -td --net=host thtom/rustdesk-server hbbr4.查看Docker容器启动情况docker ps -a确认hbbs、hbbr容器为Up状态命令解释替换路径和域名的地方加了个[]，是为了便于区分，替换的时候记得删除。“-p 26115:21115” ： 26115 是docker宿主机（本机端口），21115 是RustDesk 的默认端口， 如果不修改默认端口 请使用“-p 21115:21115”，其他的端口映射类似--name 是定义了 docker 实例的名称，可以方便引用-v 是docker宿主机到容器内的文件映射“rustdesk/rustdesk-server hbbr” 是带 hbbr或者hbbs 参数启动-r [你的地址（IP/域名）]:26116 是 在你的指定端口监听 ，默认端口是 21116 开放端口默认情况下，hbbs 监听21115(tcp), 21116(tcp/udp), 21118(tcp)，hbbr 监听21117(tcp), 21119(tcp)。务必在防火墙开启这几个端口， 请注意21116同时要开启TCP和UDP 。其中21115是hbbs用作NAT类型测试，21116/UDP是hbbs用作ID注册与心跳服务，21116/TCP是hbbs用作TCP打洞与连接服务，21117是hbbr用作中继服务, 21118和21119是为了支持网页客户端。如果您不需要网页客户端（21118，21119）支持，对应端口可以不开。TCP( 21115, 21116, 21117, 21118, 21119 )UDP( 21116 )加密key自定义key在上述的开启 hbbs和hbbr 命令中 后面加上参数 “-k [你的自定义key]”docker run --name hbbs -p 26115:21115 -p 26116:21116 -p 26116:21116/udp -p 26118:21118 -v [你的自定义地址/hbbs]:/root -td rustdesk/rustdesk-server hbbs -r [你的地址（IP/域名）]:26116 -k [你的自定义key]docker run --name hbbr -p 26117:21117 -p 26119:21119 -v [你的自定义地址/hbbr]:/root -td rustdesk/rustdesk-server hbbr -k [你的自定义key]获取默认key1.进入镜像sudo docker exec -it hbbs bash2.获取keycat ./id_ed25519.pub 测试你的 hbbs和hbbr 端口，确保防火墙放行客户端下载地址https://rustdesk.com/zh/https://github.com/rustdesk/rustdesk/releases 下载完成，需要安装才能配置自建的rustdesk服务器客户端的配置修改了端口的配置如下，如果使用默认端口 只需要在 ID服务器填上你的服务器地址，图中以上文端口为例在客户端两边均填写相同信息，便可以像TeamViewer一样访问了，可以使用下图中的配置的复制粘贴功能
如何快速更换 macOS 应用程序、文件和文件夹的图标
icns是啥？第一步 生成不同尺寸的png图标创建icons.iconset文件夹用来放置不同尺寸的图标注：此文件夹名必须以.iconset结尾，否则生成icns文件时会报错，报错信息为invalid iconsetAI生成项目只做不同分别率图标可以直接使用在线网站https://onlinecooltools.com/zh/image-to-icon-converter或者格式工厂转换生成。在命令行中进入目录，并执行以下命令（可以批量复制粘贴执行）sips -z 16 16 pic.png --out icons.iconset/icon_16x16.pngsips -z 32 32 pic.png --out icons.iconset/icon_16x16@2x.pngsips -z 32 32 pic.png --out icons.iconset/icon_32x32.pngsips -z 64 64 pic.png --out icons.iconset/icon_32x32@2x.pngsips -z 64 64 pic.png --out icons.iconset/icon_64x64.pngsips -z 128 128 pic.png --out icons.iconset/icon_64x64@2x.pngsips -z 128 128 pic.png --out icons.iconset/icon_128x128.pngsips -z 256 256 pic.png --out icons.iconset/icon_128x128@2x.pngsips -z 256 256 pic.png --out icons.iconset/icon_256x256.pngsips -z 512 512 pic.png --out icons.iconset/icon_256x256@2x.pngsips -z 512 512 pic.png --out icons.iconset/icon_512x512.pngsips -z 1024 1024 pic.png --out icons.iconset/icon_512x512@2x.pngAI生成项目pic.png替换为你的图片文件路径，尺寸要求为1024x1024这一步会在icons.iconset目录下生成若干不同尺寸的图标，用来下一步生成icns图标第二步 生成icns图标iconutil -c icns icons.iconset -o Icon.icnsAI生成项目这步之后可以在目录下面看到Icon.icns图标，就可以使用了。或者直接使用在线网站https://www.aconvert.com/cn/image/png-to-icns/ 直接从png 转换为icns， tvbox 的icns 已经生成上传自己的wps 网盘更换图标打开「访达」「Finder」，左侧边栏中中选择「应用程序」文件夹，然后找到要更改图标的应用程序，鼠标左键点一下让 App 处于高亮选中状态 按下command + i 打开 App 的「简介」界面，也可以点击「标题栏」中的「简介」的小按钮选择新的图标文件，鼠标左键点击不松拖动到「简介」左上角的图标框上，然后松开鼠标左键即可如果应用程序在「程序坞」「Dock」上，此时只需 command + 鼠标左键点击应用图标可以立即查看更换后效果3.app 修改名字点击左侧的dock上面的访达图标。在访达内点击左侧边栏上面应用程序文件夹。点击选择需要修改名字的软件，右键软件选择重命名。等待软件上面有个黑色的框或者是文字变成黄色再次点击一下，并且输入新的名字。输入后在软件外围点击一下即可生效，这样做软件已经改名完毕了。
1、禁用 Windows 10/11 开始菜单网络搜索微软从 Windows 10 开始，在开始菜单里集成了 Bing 网络搜索，当输入的搜索词在本地无结果，就会调用 Bing 进行网络搜索。如果我们输入的是敏感信息，就很容易导致隐私泄露。 解决办法就是禁用网络搜索！禁用方法：修改注册表方法适用于 所有版本 Windows 10/11 。第一步使用组合键 Win + R 打开 “运行” 窗口，输入 regedit，确定，打开注册表。第二步找到目录 HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows，右键 Windows -> “新建” -> “项”，创建名称为 Explorer 的项。第三步右键刚刚创建的 Explorer 项，选择 “新建” -> “DWORD(32位)值”，创建名称为 DisableSearchBoxSuggestions 的值。第四步右键刚刚创建的 DisableSearchBoxSuggestions，选择 “修改”，将 “数值数据” 改为 1，确定。重启系统重启系统后，修改就会生效。恢复方法如果你想重新启用开始菜单的网络搜索功能，只需要打开注册表，把我们刚刚创建的 Explorer 目录删除，重启系统即可。Microsoft Windows Search 搜索器 占用CPU解决办法当我正在愉快的使用电脑时，突然小风扇呜呜的转了起来，这声让人很是抓狂！！！ 我想您肯定也有这样的感受。打开任务管理器一看，某进程占用了大量的CPU资源，导致电脑性能下降，并疯狂消耗电力并释放热量，小风扇不抓狂旋转才怪。除了病毒之外，微软Microsoft Windows Search 搜索器这一进程疯狂占用CPU是比较常见一个，在此结合自己经验给出一些亲测有效的解决方法。搜索器使CPU狂飙的主要原因：在建立索引所包含的位置拷贝了大量文件，导致Microsoft Windows Search 搜索器开始疯狂工作为这些新文件建立索引。解决办法：打开 控制面板，找到 索引选项，点击 修改(M)，将不需要建立索引的位置勾选掉即可。禁用一些windows 服务禁用 Windows 10 更新把diagnostic开头的都停止+禁用 //诊断策略,对普通用户来说除了浪费资源并没有什么卵用按需要把windows update,windows备份之类的都关了禁用windows search删除常驻进程软件删除360，安全软件就是系统自带windows defender设置wsa 为需要时启动，wsa 已经不再微软支持，可以使用腾讯应用宝支持apk程序，或者可以在桌面建立apk 启动快捷方式的虚拟机，比如blue stack等等