首页 文章 精选 留言 我的

精选列表

搜索[内置VPN],共10004篇文章
优秀的个人博客,低调大师

Chrome 内置的 AI Mode 功能支持“跨标签页上下文”

谷歌正在为 Chrome 浏览器测试升级 AI Mode 功能,使其能够直接理解并利用用户当前或刚刚浏览过的标签页内容。在最新的 Chrome Canary 版本中,用户从地址栏进入 AI Mode 时,可以选择基于“上一个标签页”的内容向 AI 提问,无需手动复制网页信息,查询过程更加连贯。 与此同时,Chrome 新标签页的搜索框也加入了更完整的上下文附加能力,支持在 AI 查询中添加图片、文件以及最近打开的标签页,用于更深入的搜索和分析。在 Android 端,Chrome 地址栏的“+”按钮同样新增了标签页选项,允许用户将某个已打开页面作为 AI 查询的参考上下文。 界面层面,Chrome 还对 AI Mode 的显示方式进行了优化,弱化了偏向开发者的内部 URL 表现形式,改为更直观的“AI Mode”标识,提升普通用户的可理解性。 整体来看,这一系列更新显示出谷歌正在推动 AI 搜索与浏览器标签页深度融合,让 AI 更自然地参与到用户的日常浏览和信息获取流程中。

优秀的个人博客,低调大师

MyBatis JPA Extra 3.3.8 发布,驼峰命名和内置 H2 Demo

MyBatis JPA Extra MyBatis JPA Extra对MyBatis扩展JPA功能 1.Jakarta JPA 3注释简化CUID操作; 2.增强SELECT分页查询; 3.链式Query查询条件构造器;支持Lambda 形式调用,方便编写各类查询条件 4.@Encrypted注解轻松实现字段数据加密和解密; 5.字段数据自动填充功能; 6.数据库支持 数据库 支持 MySQL ✅ PostgreSQL ✅ Oracle ✅ SqlServer ✅ DB2 ✅ 代码托管 | GitCode | Gitee |GitHub | 1、JPA 3注释 1.1、注释 @Entity @Table @Column @ColumnDefault @Id @GeneratedValue @Encrypted @Transient @Temporal @PartitionKey @SoftDelete 1.2、主键策略 支持3种主键策略 序号 策略 支持 1 AUTO 主键自动填充策略 snowflakeid(雪花ID-默认) uuid(UUID) 2 SEQUENCE 数据库序列生成,generator值为数据库序列名 3 IDENTITY 数据库表自增主键 1.3、Java Bean 注释 @Entity @Table(name = "STUDENTS") public class Students extends JpaEntity implements Serializable{ @Id @Column @GeneratedValue private String id; @Column private String stdNo; @Column @Encrypted private String password; @Column private String stdName; @Column @ColumnDefault("'M'") private String stdGender; @Column private int stdAge; @Column private String stdMajor; @Column private String stdClass; @Column private byte[] images; @Column(insertable = false) @GeneratedValue @Temporal(TemporalType.TIMESTAMP) private LocalDateTime modifyDate; @SoftDelete @Column(name ="is_deleted") private int isDeleted; //getter setter } 2、基本操作 2.1、CURD //新增数据 @Test void insert() throws Exception{ Students student = new Students(); student.setStdNo("10024"); student.setStdGender("M"); student.setStdName("司马昭"); student.setStdAge(20); student.setStdMajor("政治"); student.setStdClass("4"); service.insert(student); } //查询数据实体并更新 @Test void update() throws Exception{ Students student = service.get("317d5eda-927c-4871-a916-472a8062df23"); student.setStdMajor("政治"); service.update(student); } //根据实体查询并更新 @Test void merge() throws Exception{ Students student = new Students(); student.setStdMajor("政治"); student.setStdClass("4"); service.merge(student); } //根据ID查询 @Test void get() throws Exception{ Students student = service.get("317d5eda-927c-4871-a916-472a8062df23"); } //根据实体查询 @Test void query() throws Exception{ Students student = new Students(); student.setStdGender("M"); List listStudents = service.query(student); } //查询所有记录 @Test void findAll() throws Exception{ List listStudents = service.findAll(); } //根据ID删除 @Test void delete() throws Exception{ service.delete("921d3377-937a-4578-b1e2-92fb23b5e512"); } //根据ID集合批量删除 @Test void batchDelete() throws Exception{ List idList = new ArrayList(); idList.add("8584804d-b5ac-45d2-9f91-4dd8e7a090a7"); idList.add("ab7422e9-a91a-4840-9e59-9d911257c918"); //... service.deleteBatch(idList); } 2.2、逻辑删除 //根据IDS批量逻辑删除 @Test void softDelete() throws Exception{ List idList=new ArrayList(); idList.add("8584804d-b5ac-45d2-9f91-4dd8e7a090a7"); idList.add("ab7422e9-a91a-4840-9e59-9d911257c918"); //... service.softDelete(idList); } 2.3、Find查询和Qruey构造器 //SpringJDBC的查询方式 where StdNo = '10024' or StdNo = '10004' @Test void find() throws Exception{ List listStudents = service.find(" StdNo = ? or StdNo = ? ", new Object[]{"10024","10004"}, new int[]{Types.VARCHAR,Types.INTEGER} ); } //根据链式条件构造器查询 //WHERE (stdMajor = '政治' and STDAGE > 30 and stdMajor in ( '政治' , '化学' ) or ( stdname = '周瑜' or stdname = '吕蒙' ) ) @Test void queryByCondition() throws Exception{ List listStudents = service.query( new Query().eq("stdMajor", "政治").and().gt("STDAGE", 30).and().in("stdMajor", new Object[]{"政治","化学"}) .or(new Query().eq("stdname", "周瑜").or().eq("stdname", "吕蒙"))); } 2.4、单表分页查询 //根据实体分页查询 @Test void fetch() throws Exception{ JpaPage page = new JpaPage(1); Students student = new Students(); student.setStdGender("M"); JpaPageResults results = service.fetch(page,student); } //根据Query条件分页查询 where stdMajor = '政治' and STDAGE > 30 @Test void fetchByCondition() throws Exception{ JpaPage page = new JpaPage(1,20); Query condition = new Query().eq("stdMajor", "政治").and().gt("STDAGE", 30); JpaPageResults results = service.fetch(page,condition); } 2.5、根据mapper的xml分页查询 //根据Mapper xml配置fetchPageResults分页查询 @Test void fetchPageResults() throws Exception{ Students student=new Students(); student.setStdGender("M"); student.setPageNumber(1); JpaPageResults results = service.fetchPageResults(student); } //根据Mapper xml id分页查询,fetchPageResults1在mapper的xml中配置 @Test void fetchPageResultsByMapperId() throws Exception{ Students student=new Students(); student.setStdGender("M"); student.setPageNumber(1); JpaPageResults results = service.fetchPageResults("fetchPageResults1",student); } 2.6、 Lambda查询 //根据Lambda链式条件构造器查询 //WHERE (stdMajor = '政治' and STDAGE > 30 and stdMajor in ( '政治' , '化学' ) or ( stdname = '周瑜' or stdname = '吕蒙' ) ) service.query( new LambdaQuery().eq(Students::getStdMajor, "政治") .and().gt(Students::getStdAge, Integer.valueOf(30)) .and().in(Students::getStdMajor, new Object[]{"政治","化学"}) .or( new LambdaQuery().eq(Students::getStdName, "周瑜") .or().eq(Students::getStdName, "吕蒙") ) ); //根据Lambda链式条件构造器分页查询 //where stdMajor = '政治' and stdAge > 30 JpaPage page = new JpaPage(); page.setPageSize(20); page.setPageable(true); LambdaQuery lambdaQuery =new LambdaQuery<>(); lambdaQuery.eq(Students::getStdMajor, "政治").and().gt(Students::getStdAge, Integer.valueOf(30)); JpaPageResults results = service.fetch(page,lambdaQuery); ... 2.6、 UpdateWrapper更新 //根据UpdateWrapper更新数据 UpdateWrapper updateWrapper = new UpdateWrapper(); updateWrapper.set("StdMajor", "历史").eq("StdName", "周瑜").or().eq("StdName", "吕蒙"); service.update(updateWrapper); //更新LambdaUpdateWrapper更新数据,带多重LambdaUpdateWrapper List majorList = new ArrayList<>(Arrays.asList("政治","化学")); LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.set(Students::getStdMajor, "历史") .eq(Students::getStdMajor, "政治") .and().gt(Students::getStdAge, Integer.valueOf(30)) .and().in(Students::getStdMajor, majorList) .or(new LambdaUpdateWrapper().eq(Students::getStdName, "周瑜").or().eq(Students::getStdName, "吕蒙")); service.update(updateWrapper); 2.8、FindBy查询 实现spring data jpa的findBy功能 //Mapper接口定义 //where x.stdNo = ?1 @Select({}) public List findByStdNo(String stdNo); //where x.stdNo = ?1 @Select({}) public List findByStdNoIs(String stdNo); //where x.stdNo = ?1 @Select({}) public List findByStdNoEquals(String stdNo); //where x.stdAge between ?1 and ?2 @Select({}) public List findByStdAgeBetween(int ageStart,int ageEnd); //where x.stdAge < ?1 @Select({}) public List findByStdAgeLessThan(int ageLessThan); //where x.stdAge <= ?1 @Select({}) public List findByStdAgeLessThanEqual(int ageLessThanEqual); //where x.stdAge > ?1 @Select({}) public List findByStdAgeAfter(int ageAfter); //where x.stdAge < ?1 @Select({}) public List findByStdAgeBefore(int ageBefore); //where x.images is null @Select({}) public List findByImagesNull(); //where x.images is null @Select({}) public List findByImagesIsNull(); //where x.images is not null @Select({}) public List findByImagesIsNotNull(); //where x.images is not null @Select({}) public List findByImagesNotNull(); //where x.stdName like ?1 @Select({}) public List findByStdNameLike(String stdName); //where x.stdName not like ?1 @Select({}) public List findByStdNameNotLike(String stdName); //where x.stdName like ?1 (parameter bound with appended %) @Select({}) public List findByStdNameStartingWith(String stdName); //where x.stdName like ?1 (parameter bound with prepended %) @Select({}) public List findByStdNameEndingWith(String stdName); //where x.stdName like ?1 (parameter bound wrapped in %) @Select({}) public List findByStdNameContaining(String stdName); //where x.stdGender = ?1 order by x.stdAge desc @Select({}) public List findByStdGenderOrderByStdAge(String stdGender); //where x.stdGender = ?1 order by x.stdAge desc @Select({}) public List findByStdGenderIsOrderByStdAge(String stdGender); //where x.stdMajors in ?1 @Select({}) public List findByStdMajorIn(String... stdMajors) ; //where x.stdMajors not in ?1 @Select({}) public List findByStdMajorNotIn(List stdMajors); //where x.deleted = true @Select({}) public List findByDeletedTrue(); //where x.deleted = false @Select({}) public List findByDeletedFalse(); //where UPPER(x.stdGender) = UPPER(?1) @Select({}) public List findByStdGenderIgnoreCase(String stdGender); //where x.stdNo <> ?1 @Select({}) public List findByStdNoNot(String stdNo); //where x.lastname = ?1 and x.firstname = ?2 @Select({}) public List findByStdMajorAndStdClass(String stdMajor,String stdClass); 2.9、默认数据自动填充 继承FieldAutoFillHandler,实现insertFill和updateFill函数,可以完成租户字段,创建人、创建时间、修改人、修改时间等默认字段的填充 import org.apache.ibatis.reflection.MetaObject; import org.dromara.mybatis.jpa.handler.FieldAutoFillHandler; public class MxkFieldAutoFillHandler extends FieldAutoFillHandler{ @Override public void insertFill(MetaObject metaObject) { this.setFieldValue(metaObject , "stdNo", "AutoFill_Insert"); } @Override public void updateFill(MetaObject metaObject) { this.setFieldValue(metaObject , "stdNo", "AutoFill_Update"); } } 3、mapper配置 WHERE 1 = 1 AND ID = '${id}' AND STDNAME like '%${stdName}%' AND STDGENDER = #{stdGender} SELECT id , stdno , stdname ,stdgender , stdage , stdmajor , stdclass FROM STUDENTS SELECT id , stdno , stdname ,stdgender , stdage , stdmajor , stdclass FROM STUDENTS SELECT id , stdno , stdname ,stdgender , stdage , stdmajor , stdclass FROM ROLES 4、SpringBoot配置 # spring.datasource.username=root spring.datasource.password=maxkey spring.datasource.url=jdbc:mysql://localhost/test?autoReconnect=true&characterEncoding=UTF-8&serverTimezone=UTC spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.type=com.alibaba.druid.pool.DruidDataSource mybatis.dialect=mysql mybatis.type-aliases-package=org.apache.mybatis.jpa.test.entity mybatis.mapper-locations=classpath*:/org/apache/mybatis/jpa/test/dao/persistence/xml/${mybatis.dialect}/*.xml mybatis.table-column-escape=true #mybatis.table-column-escape-char=` #mybatis.configuration.map-underscore-to-camel-case=true 5、本次发布更新 1、使用H2为默认数据库,兼容MySQL模式 2、数据库自动加载初始化脚本,schema-h2.sql和data-h2.sql 3、支持map-underscore-to-camel-case字段下划线和类驼峰转换 4、findBy IgnoreCase问题修复 5、demo例子优化 6、SpringBootTest支持 7、新logo

优秀的个人博客,低调大师

微软 Edge 109 发布,内置文本预测、即将停止支持 Windows 7/8

微软已经发布了其浏览器的另一个功能更新。109 版本现在可以在稳定频道中下载,其中包括几个功能变化、错误修复和安全补丁。 Microsoft Edge 109 中的新内容: 个人微软账户(MSA)和 Azure Active Directory(AAD)账户之间的账户链接 TLS 服务器证书验证变化:在 Microsoft Edge 110 版本中,证书信任列表和证书验证器将与主机操作系统的根存储脱钩。相反,默认的证书信任列表和证书验证器将由浏览器提供并随浏览器一起提供。 文本预测:为了帮助你写得更快、减少错误,Microsoft Edge 为网页上的长篇可编辑文本字段提供了单词和句子预测。(文本预测目前只在美国、印度和澳大利亚的英语中可用,将继续在未来的 Microsoft Edge 版本中增加新的语言和地区。 微软在 Microsoft Edge 109 中修复了 14 个不同的安全问题。其中两个安全问题是 Edge 特有的,其余 12 个问题与其他基于 Chromium 的浏览器共享,包括 Chrome、Brave、Vivaldi 和 Opera 等。 Microsoft Edge(基于 Chromium的)远程代码执行漏洞 —— CVE-2023-21775 Microsoft Edge(基于 Chromium 的)特权提升漏洞 —— CVE-2023-21796 注意:Edge 109 是最后一个与 Windows 7 和 Windows 8.1 兼容的浏览器版本。微软在 2023 年 1 月的补丁中终止了对这两个操作系统的支持。 更多详情可查看:https://learn.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel

优秀的个人博客,低调大师

openEuler 22.03 内置 openGauss,一键安装提高用户易用性!

2022年3月,openEuler 22.03 LTS版本ISO安装包仓库及LTS官方软件仓库均上线openGauss2.1.0版本安装包,提供RPM一键安装openGauss的能力,提高用户易用性。 openGauss软件包使用,提供用户易用性 openEuler 22.03 LTS版本中涉及的openGauss安装包及其依赖仓库如下: https://gitee.com/src-openeuler/opengauss-server https://gitee.com/src-openeuler/opengauss-dcf openGauss ISO软件包使用概述 方式一:安装操作系统时勾选数据库 在使用openEuler 22.03 LTS ISO镜像安装操作系统时候,安装引导界面的选择软件包里面勾选上openGauss Server,在安装完成操作系统后,便会默认安装上openGauss数据库并启动单机数据库进程。 方式二:安装完操作系统后使用yum一键安装 如果在安装操作系统时候没有选择openGauss软件包,还可以在安装完系统后,通过命令一键安装上openGauss的单机数据库实例: yum install opengauss -y 使用说明: openGauss数据库进程的管理用户为opengauss,切换到该用户下可以进行数据库的常用操作。 su - opengauss 登录数据库中执行sql语句: gsql -d postgres -r 查询数据库实例状态: gs_ctl query 停止数据库实例进程: gs_ctl stop 启动数据库实例进程: gs_ctl start openGauss RPM软件包使用概述 概述为使用非openEuler 22.03 LTS ISO软件包的用户,需要配置openEuler 22.03 LTS官方源。 Step.1 针对不同硬件平台(aarch64/x86_64)在本地添加openEuler 22.03 LTS everything 软件仓库,openGauss软件包所处位置为: https://repo.openeuler.org/openEuler-22.03-LTS/everything/ 配置完成后,执行 dnf update 在本地更新远端仓库。 Step.2 安装openGauss软件包及其对应依赖包。 dnf install opengauss -y 安装完成后: openGauss的安装路径在 /usr/local/opengauss 首先来看openGauss环境变量,启动openGauss和连入服务需要的环境变量被放置在 /var/lib/opengauss/.bash_profile export GAUSSHOME=/usr/local/opengauss/ export LD_LIBRARY_PATH=/usr/local/opengauss/lib:$LD_LIBRARY_PATH export PATH=/usr/local/opengauss/bin:$PATH export PGDATA=/var/lib/opengauss/data export PORT=7654 从这些环境变量,可以直观地看到openGauss的安装路径,DATA PATH,依赖库路径等等。 另外,openGauss轻量化构建选项opengauss_config_file_mini,被放在/usr/local/opengauss/share/postgresql/ 默认启动的配置文件在 /usr/local/opengauss/share/postgresql/postgresql.conf.sample,可以按需修改或重新指定。 Systemd相关文件存放在 /usr/local/opengauss/script/ Step.3 在openGauss软件包安装成功后,会为其创建opengauss用户用来运行openGauss服务。接下来就可以使用: systemctl start opengauss 启动openGauss单节点环境。 Notes: 1. 安装前需要确定系统中没有opengauss同名用户存在,以免产生安装冲突; 2. 当前只支持openGauss单节点环境安装,更多配置参考openGauss社区官方文档; 3. 如需修改openGauss配置文件或systemd启动脚本,参考 /usr/local/opengauss/script/opengauss.service /usr/local/opengauss/script/autostart.sh 进行添加适配; 4. 新添配置或目录需要给予opengauss用户相应权限。 双方社区成员通力合作,为社区间合作提供范例 此次两大社区能够顺畅地完成目标,得益于双方社区成员的通力合作。来自openGauss社区的committer-张旭博(https://gitee.com/zhang_xubo)与openEuler DB SIG maintainer-赵波(https://gitee.com/bzhaoop)以公开透明的形式将本次合作落实在开源社区中,所完成的任务和讨论均符合开源社区贡献流程,包括TC例会讨论,Issue及PR提交等。下面是对本次工作内容的简要介绍,希望可以为未来相关社区间的合作提供参考。 1.openGauss社区2.1.0发布包引入openEuler 22.03 LTS 此次进入openEuler构建和发布的软件包均来自openGauss社区及相应依赖软件包的上游社区,涉及openGauss 2.1.0版本,链接如下: https://gitee.com/opengauss/openGauss-server https://gitee.com/opengauss/DCF 此次参与openEuler构建和发布的包来自openGauss社区发布包(openGauss-server-2.1.0.tar.gz),链接如下: https://gitee.com/opengauss/openGauss-server/tree/2.1.0/ https://gitee.com/opengauss/openGauss-server/releases/v2.1.0 软件包的引入和提交到openEuler社区的PR均由openGauss社区和openEuler DB SIG协作完成,相关的软件包质量和维护由openGauss社区和openEuler DB SIG共同保障。 2.工作重点 本次工作重点主要为几个方面: 1)openGauss依赖分析及梳理 由于openGauss社区本身体系较为庞大,对于通用型数据库来说,所发布自身软件时依赖的其他软件均来自上游社区,并且对部分功能进行一定程度的功能性增强,故部分依赖库与openEuler软件仓库已有的上游社区发布版本冲突,这一部分已经由openGauss社区单独在其社区内部及openEuler软件仓库中单独进行维护。此次合作中,已将全部依赖库引入openEuler软件仓库,完全融入openEuler软件生态当中。 2)openGauss易用性脚本引入 本次的openGauss RPM包引入,为了保留用户使用习惯,延用systemd服务,对openGauss服务进行了全面适配,包括服务启动控制脚本,另外,还提供了openGauss冷升级脚本等,并在openGauss RPM软件包安装过程中进行了与openGauss社区文档所述相同的配置,例如运行用户及相应的配置等,极大方便用户在openEuler上使用openGauss的安装成本,达成一键安装功能。 3. 后续工作 1)为了能够更加深入两方社区合作,从提高用户的易用性出发,计划在openEuler及openGauss两个社区增加RPM方式安装openGauss软件的文档,为用户提供多种安装方式; 2)随着上游openGauss社区发布版本的持续迭代,需要持续在openEuler软件仓库中更替最新版openGauss软件,并计划在最新版openEuler发布版中发布,例如最新版openGauss版本将计划在同样为最新版的openEuler发布版中进行发布,供用户提前体验,如openGauss 3.0.0(已于今年4月发布)计划将在今年openEuler 22.09创新版中发布,同时保留在openEuler LTS(22.03 LTS)版本中的openGauss(2.1.0)版本; 3)如果你对后续计划感兴趣,欢迎到社区官网签署CLA,参与贡献。 两大社区相互赋能,共同铸就丰富多样的软件生态 openGauss社区与openEuler社区作为两个开源开放的社区,通过相互协作和融合,使得openGauss进入openEuler 22.03 LTS ISO镜像,同时为openEuler 22.03 LTS官方仓库提供openGauss软件包,极大地提高了openGauss用户易用性;同时,也为使用openEuler 22.03 LTS ISO及其他镜像源的用户带来了便利。 未来,openGauss和openEuler社区将继续加深合作,持续在openEuler软件仓库中维护openGauss的迭代版本,为openGauss软件的质量提供保障。随着openGauss功能、性能的持续迭代,openGauss日益成熟,秉承共建、共享、共治的理念,被越来越多的用户认可。此次通过与openEuler开源社区的相互合作,提高openGauss的易用性,相信openGauss会成为更多用户的选择,也欢迎更多的人加入openGauss和openEuler社区,共同铸就丰富多样的基础软件生态。 openGauss:openGauss是一款开源关系型数据库管理系统,采用木兰宽松许可证v2发行。openGauss内核深度融合华为在数据库领域多年的经验,结合企业级场景需求,持续构建竞争力特性。同时openGauss也是一个开源的数据库平台,鼓励社区贡献、合作。 openEuler:openEuler是一款开源操作系统。当前openEuler内核源于Linux,支持鲲鹏及其它多种处理器,能够充分释放计算芯片的潜能,是由全球开源贡献者构建的高效、稳定、安全的开源操作系统,适用于数据库、大数据、云计算、人工智能等应用场景。同时,openEuler是一个面向全球的操作系统开源社区,通过社区合作,打造创新平台,构建支持多处理器架构、统一和开放的操作系统,推动软硬件应用生态繁荣发展。

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册