1 AI探索:通过宏脚本给小众编辑器EverEdit插上AI的翅膀!

1.1 背景

  在AI编程大行其道的背景下,各种AI编程工具:CursorVSCode的各种插件Trae等等搞得不亦乐乎!您是否很苦恼自己使用的工具居然不支持AI,就像作者最爱的文本编辑器EverEdit,它没有原生AI的支持,技术群一片苦苦呼唤而不得?
  本着求人不如求己的原则,作者摸索了一天EverEdit的插件语法及AI平台的接口,做出了一个在EverEdit中使用AI的原型,希望通过这个总结,可以启发您给自己的日常工具插上AI的翅膀!

1.2 准备工作

1.2.1 申请AI账号:账号注册

注:注册账号时输入手机号、验证码,其他保持不变。

说明
  为什么选择“硅基流动”平台:该平台提供近30款免费AI模型、和近60款价格不一的付费AI模型,且注册赠送2000万tokens,个人可以使用很久。

1.3 制作EverEdit的AI插件

  由于我们希望有一个独立的对话窗口用于输入任务给AI,所以需要使用EverEditWeb形式插件

1.3.1 制作1个html页面用于在EverEdit中输入任务及向AI平台发送请求

这个html做了如下几件事:

  1. 提供操作界面
  2. 读取本地ai_setting.ini文件中密钥模型等参数
  3. 读取html页面中用户输入的任务
  4. 将任务描述通过AI平台的API接口发送给平台
  5. 接收AI平台的响应并解析
  6. 将解析后的内容打印到html页面的日志窗口
  7. 将解析后的内容插件到EverEdit当前光标位置

好吧,这个html页面也是AI生成的,我本人也会点htmlcssjavascript,但不经常用所以荒疏了,要速度把这3者结合起来,生成一个可用的html页面,可能要花个1天,而AI给我生成的这个页面,前后调试加需求修改,只花了不到1小时(时间主要花在我的思考)。
html界面如下:

  • html文件中的核心函数(向AI平台发送请求,并解析响应报文)
// 处理按钮点击事件
function sendRequest() {
// 获取文本框中的内容
var inputText = document.getElementById('inputText').value;
// 从文件中获取 API 密钥
//var apiKey = getApiKeyFromFile();
var apiKey = 'Bearer ' + ReadIniValue("AI", "API");
var model = ReadIniValue("AI", "MODEL");
if (!apiKey) {
return;
} // 获取状态图标元素
var statusIcon = document.getElementById('status-icon');
// 切换到运行态图标
statusIcon.style.backgroundImage = "url('running.gif')"; // 创建 XMLHttpRequest 对象
var xhr = createXMLHttpRequest();
if (xhr === null) {
// 切换回初始态图标
statusIcon.style.backgroundImage = "url('initial.png')";
return;
} // 配置请求选项
var options = {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': apiKey
},
body: '{"model":"' + model +'","stream":false,"messages":[{"role":"user","content":"' + inputText + '"}]}'
}; // 初始化请求
xhr.open(options.method, url, true); // 设置请求头
for (var header in options.headers) {
xhr.setRequestHeader(header, options.headers[header]);
} // 处理响应
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
// 切换到完成态图标
statusIcon.style.backgroundImage = "url('completed.png')";
var logWindow = document.getElementById('logWindow');
if (xhr.status >= 200 && xhr.status < 300) {
try {
// 使用引入的 json2.js 提供的 JSON.parse 方法
var response = JSON.parse(xhr.responseText);
// 解析出 content 属性的值
var content = response.choices && response.choices[0] && response.choices[0].message && response.choices[0].message.content;
if (content) {
// 将 content 内容显示在日志窗口中
logWindow.value += content + '\n';
var App = window.external;
App.ActiveDoc.Insert(content);
} else {
logWindow.value += '未找到 content 属性\n';
}
} catch (e) {
logWindow.value += 'Error parsing JSON response: ' + e.message + '\n';
}
} else {
logWindow.value += 'Request failed with status: ' + xhr.status + '\n';
}
}
}; // 发送请求
xhr.send(options.body);

说明
  说实话, 这个函数我自己写不出来,这个函数是AI给我写的!并且没怎么调试,中间读取ini文件的函数是我自己写的,由于读取ini文件使用了EverEdit的API,而AI平台不识别这个API,所以需要我自己操刀。

1.3.2 编写EverEdit的宏脚本调用html弹出窗口

  这里写EverEdit的宏脚本就比较简单了,新建一个AI助手.ejs文件,编码使用GB2312. 脚本的内容如下:

htmlFile = "file:///" + SCRIPT_PATH + "\\ai.html"
var dlg=App.ShowHtmlDialog(true, htmlFile, 700, 1120);
dlg.SetTitle("AI助手")

1.3.3 编写ai_setting.ini文件

  ai_setting.ini文件主要存放AI平台API密钥AI模型等配置信息,文件内容如下:

[AI]
API=请粘贴您的硅基流动的API密钥
MODEL=Qwen/Qwen2.5-Coder-7B-Instruct

截图示例:

参数说明:

  • API:即AI平台的密钥,获取方式如下:

  • MODELAI平台提供的模型名称(近100种模型),获取方式如下:

点击模型后,进入弹出页面,单击复制按钮,如下图所示:

说明
  硅基流动中有近100种模型,免费模型有近30种,可以根据需要自由选择。

1.3.4 完整的AI助手插件下载地址

1.4 效果演示

EverEdit扩展-使用AI助手

1.5 工作原理

  1. 读者如果有兴趣, 可以下载AI助手后使用任一文本编辑器打开阅读,该插件是源代码形式。
  2. 阅读AI平台的接口文档,如下所示:

作者声明:本文用于记录和分享作者的学习心得,可能有部分文字或示例来自AI平台,如:豆包、DeepSeek(硅基流动)(注册链接)等,由于本人水平有限,难免存在表达错误,欢迎留言交流和指教!
Copyright 2022~2025 All rights reserved.

AI探索:通过宏脚本给小众编辑器EverEdit插上AI的翅膀!的更多相关文章

  1. 王亮:游戏AI探索之旅——从alphago到moba游戏

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由云加社区技术沙龙 发表于云+社区专栏 演讲嘉宾:王亮,腾讯AI高级研究员.2013年加入腾讯,从事大数据预测以及游戏AI研发工作.目前 ...

  2. Procomm Plus 与ASPECT脚本语言在基于远程终端设备上的测试应用

    产测 ---------------------------------------------------- 原文:http://www.bixuanzl.com/20180801/1084478. ...

  3. git clone开启云上AI开发

    摘要:相比于传统的软件开发,AI开发存在以下4个痛点:算法繁多:训练时间长:算力需求大:模型需手动管理,我们可以使用云上AI开发的方式来缓解以上4个痛点. 本文分享自华为云社区<git clon ...

  4. 只能从脚本中调用在类定义上有[ScriptService]属性的Web服务问题的解决方案

    ajax调用webservice中的接口时, 会出现[只能从脚本中调用在类定义上有[ScriptService]属性的...]的异常. 这是因为, 在.net3.5中, 访问web服务, 要对web服 ...

  5. Android艺术开发探索第三章——View的事件体系(上)

    Android艺术开发探索第三章----View的事件体系(上) 我们继续来看这本书,因为有点长,所以又分了上下,你在本片中将学习到 View基础知识 什么是View View的位置参数 Motion ...

  6. ASP利用xhEditor编辑器实现图片上传的功能。

    本人这几天在做一个软件,无意中用到xhEditor在线编辑器,这个编辑器虽然看着比较简单,但功能非常强大,大家可以去官网上查看,废话不说了. 这篇文件主要是实现在ASP环境中利用xhEditor编辑器 ...

  7. SouthidcEditor编辑器如何支持上传png图片

    SouthidcEditor编辑器如何支持上传png图片? asp网站一般都是用的南方数据SouthidcEditor编辑器,可是这个编辑器上传图片功能不能上传png类型的图片,那怎么办?我(红蜘蛛网 ...

  8. uedit富文本编辑器及图片上传控件

    微力后台 uedit富文本编辑器及文件上传控件的使用,无时间整理,暂略,参考本地代码.能跑起来.

  9. kindeditor编辑器和图片上传独立分开的配置细节

    关于kindeditor编辑器上传按钮的异步加载最关键的部署问题,它的上传图片的组件都已经封装得很好了的,只需要监听到页面按钮的点击事件给编辑器对象传递一些对应的初始化参数即可显示图片上传的弹窗实现异 ...

  10. shell脚本批量执行命令----必需判断上一步执行结果--没有捷径

    # 注意:shell脚本批量执行命令,不能只写一个函数,然后把所有命令复制进去,之前试过这样是不行的.必须要有一个判断命令执行成功与否的语句 # 简单的命令可以不加结果判断符号,但是遇到解压包.sed ...

随机推荐

  1. AO SDK安装问题

    ao sdk for .net安装时,需要进行验证.net框架,没装vs的时候会提示 arcobjects SDK for the Microsoft.NT Framework requires a ...

  2. openEuler-怎么看服务器操作系统是不是欧拉系统?

    ​[root@localhost ~]# cat /etc/os-release NAME="openEuler" VERSION="22.03 (LTS-SP2)&qu ...

  3. 【Amadeus原创】centos中挖矿病毒kdevtmpfsi的终极解决方法

    试了很久,最终的解决方法如下: 1,编写sh脚本:rm_wk.sh #!/bin/bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr ...

  4. 云数据备份 | MySQL、SQL Server 数据备份到 COS

    随着互联网高速发展,数据安全的重要性日趋明显.数据备份是企业应对系统故障的重要手段.数据备份可以提高系统的高可用性和灾难可恢复性,使用备份还原数据是系统崩溃时提供数据恢复最小代价的最优方案. 一.云数 ...

  5. Flutter ListView报错RenderBox was not laid out: RenderViewport#680c1 NEEDS-LAYOUT NEEDS-PAINT

    RenderBox was not laid out: RenderViewport#680c1 NEEDS-LAYOUT NEEDS-PAINT 使用ListView.builder()布局时,如果 ...

  6. nanoFramework

    nanoFramework 01: Getting started with nanoFramework! 08: .NET nanoFramework GPIO, I2C, SPI and othe ...

  7. 关于 Span 的一切:探索新的 .NET 明星:5. .NET 运行时的处理

    .5. NET 运行时会怎么样? 1. Span<T> 是什么? 2. Span<T> 是如何实现的? 3. 什么是 Memory<T>,以及为什么你需要它? 4. ...

  8. kubernetes更改nodePort模式下的默认端口范围

    使用nodePort模式,官方默认范围为30000-32767,详见Service官方文档. NodePort 类型如果将 type 字段设置为 NodePort,则 Kubernetes 控制平面将 ...

  9. Win10正式专业版激活方法

      首先,我们先查看一下Win10正式专业版系统的激活状态: 点击桌面左下角的"Windows"按钮,从打开的扩展面板中依次点击"设置"-"更新和安全 ...

  10. 冒泡排序------python实现

    if __name__ == '__main__': ''' 算法描述 1.比较相邻的元素,更具大小交互位置 2.对每一对相邻元素作同样的工作,从开始第一队到结尾的最后一对,即可选出最大的数 3.所有 ...