当前位置: 首页 > news >正文

VSCode 使用 EmmyLua 对lua进行调试

时间:2024年10月
其他:win10,EmmyLua v0.8.20

参考:https://blog.csdn.net/ShenHaoDeHao/article/details/140268354

有几个概念搞清楚就好理解了。一般开发中,我们编写的lua文件由宿主程序的来解析、执行;当然对于我们写的单个的测试文件,我们直接使用 lua.exe test.lua 运行即可,这里可以认为lua.exe 就是宿主程序。

EmmyLua 通过在lua代码中加载 emmy_core.dll到宿主程序中,并启动调试内核代码。调试内核通过socket与VSCode侧连互通;通信有Server端和Client端角色之分。默认情况下:

  • IDE connect Debugger 即被调试的程序充当Server端,这时被调试的程序应先启动,再启动IDE侧的调试功能连接到调试内核

另外一种就是:

  • Debugger connect IDE 即IDE充当Server侧,这时应先启动IDE侧的调试功能,等待被调试的程序启动并主动连接到IDE

我们做个简单的测试,在vscode的搜索、安装EmmyLua扩展。我们新建一个testLua文件夹,拖入vscode中打开,新建hello.lua文件:

print("hello!")

点击vscode 右上角的 Toggle Panel ,IDE下方切换到终端页签,输入 lua .\hello.lua ,回车,发现可以打印出“hello!”。
在这里插入图片描述
如果报错,找不到lua,网上搜索安装lua for windows 即可。

接下来进行调试前,我们要在lua代码中引入 EmmyLua 的 Debug 代码。 ctrl + p打开搜索输入>EmmyLua,选择Insert Emmy Debugger Code,然后根据宿主程序需要选择 x86/x64即可(我这里选择x86,选完后运行如果有问题就修改插入代码的路径试试另外一个):
在这里插入图片描述

插入后代码如下:

package.cpath = package.cpath .. ";c:/Users/xxxx/.vscode/extensions/tangzx.emmylua-0.8.20-win32-x64/debugger/emmy/windows/x86/?.dll"
local dbg = require("emmy_core")
dbg.tcpListen("localhost", 9966)print("hello!")

可以看到这里有个tcpListen,说明lua代码这边是Server端,IDE进行调试时lua代码的宿主程序需要处于运行状态,一般在游戏开发中没有问题,但是我们的测试代码很快就运行完成并退出了,所以我们这里 使用【Debugger connect IDE】的方式:这里的tcpListen 改成 tcpConnect

我们按照下图步骤生成launch.json文件:
F5
我们需要把这个文件里的ideConnectDebugger值改成false
在这里插入图片描述
接下来就可以调试了,我们在 print("hello!") 前打断点,按F5启动调试器,再在终端页签,输入 lua .\hello.lua 执行即可命中断点:
在这里插入图片描述

EmmyLua 还有许多其他功能,需要注意的是EmmyLua为了支持其他IDE,大部分的配置文件需要配置在项目的工作区顶层目录的.emmyrc.json中,具体的配置说明如下:

{"completion": {"autoRequire": true,"autoRequireFunction": "require","autoRequireNamingConvention": "camelCase","callSnippet": false,"postfix": "@"},"signature": {"detailSignatureHelper": false},"diagnostics": {"disable": [],"globals": [],"globalsRegex": [],"severity": {},"enables": []},"hint": {"paramHint": true,"indexHint": true,"localHint": true,"overrideHint": true},"runtime": {"version": "Lua5.4","requireLikeFunction": [],"frameworkVersions": [],"extensions": [],"requirePattern": []},"workspace": {"ignoreDir": [],"ignoreGlobs": [],"library": [],"workspaceRoots": [],"preloadFileSize": 1048576,"encoding": ""},"resource": {"paths": []},"codeLens": {"enable": true},"strict": {"requirePath": false,"typeCall": true}
}

completion

  • autoRequire: 是否自动补全 require 语句,默认为 true。
  • autoRequireFunction: 自动补全 require 语句时使用的函数名,默认为 require。
  • autoRequireNamingConvention: 自动补全 require 语句时使用的命名规范,默认为 camelCase, 可选值为 camelCase, snakeCase, pascalCase。
  • callSnippet: 是否使用代码片段补全函数调用,默认为 false。
  • postfix: 补全时的后缀,默认为 @。但是设置该选项暂时无用

signature

  • detailSignatureHelper: 是否显示详细的函数签名帮助,默认为 false。

diagnostics

  • disable: 禁用的诊断信息列表, 如果需要工作区内禁用一些诊断消息, 需要填上对应诊断的id, 例如: “undefined-global”
  • globals: 全局变量列表, 在该列表中的全局变量不会被诊断为未定义.
  • globalsRegex: 全局变量正则表达式列表, 符合正则表达式的全局变量不会被诊断为未定义.
  • severity: 诊断消息的严重程度, 例如: “undefined-global”: “warning”, 可选值为 “error”, “warning”, “information”, “hint”.
  • enables: 启用的诊断信息列表, 语言服务的诊断不是全部都启用的, 可以通过该选项启用一些诊断消息. 例如: “undefined-field”

hint

  • paramHint: 是否显示参数提示,默认为 true。
  • indexHint: 在索引表达式跨行时, 是否显示hint,默认为 true。
  • localHint: 是否显示局部变量提示,默认为 true。
  • overrideHint: 是否显示重载提示,默认为 true。

runtime

  • version: 运行时版本, 默认为 Lua5.4, 可选值为 Lua5.1, Lua5.2, Lua5.3, Lua5.4, LuaJIT.
  • requireLikeFunction: 类似 require 的函数列表, 用于识别类似 require 的函数, 例如: [“import”].
  • frameworkVersions: 框架版本列表, 用于识别框架版本, 例如: [“love2d”]. 可以和emmylua doc 的version标签配合使用.
  • extensions: 文件扩展名列表, 用于识别文件扩展名, 例如: [“.lua”, “.lua.txt”].
  • requirePattern: require 模式列表, 该参数和lua中的package.path和package.cpath有关, 例如: [“?.lua”, “?.lua.txt”]. 默认不需要填写, 将自动拥有, [“?.lua”, “?/init.lua”].

workspace

工作区配置, 大部分工作区配置本身既支持相对路径也支持绝对路径

  • ignoreDir: 忽略的目录列表, 用于忽略一些目录, 例如: [“build”, “dist”].
  • ignoreGlobs: 忽略的文件列表, 基于正则表达式的忽略一些文件, 例如: [“.log", ".tmp”].
  • library: 库文件目录列表, 用于指定一些库文件, 例如: [“/usr/local/lib”].
  • workspaceRoots: 工作区根目录列表, 用于指定工作区的根目录, 例如: [“Assets/script/Lua”]. 该功能主要是为了让require正常工作, 如果必须要打开lua主目录的上级目录, 需要在这里添加当前打开的目录相对于lua主目录的相对路径.
  • preloadFileSize: 预加载文件大小, 默认为 1048576 字节, 用于控制预加载文件的大小.
  • encoding: 文件编码, 默认为 utf-8, 用于读取文件时的编码.

resource

  • paths: 资源路径列表, 用于指定需要加载的资源的根目录, 例如: [“Assets/settings”]. 其默认值为当前打开的工作区目录, emmylua支持在任意字符串中的文件路径补全, 以及任意字符串中的文件路径跳转. 通过配置这个目录, 可以让emmylua知道哪些目录是资源目录, 从而正确的提供补全和跳转.

codeLens

  • enable: 是否启用CodeLens功能, 默认为 true.

strict

  • requirePath: 是否启用require严格模式, 默认为 true. 严格模式时, require必须从指定的根目录开始, 否则无法跳转
  • typeCall: 是否启用类型调用时严格模式, 默认为 true. 严格模式时, 类型调用必须手动写好重载, 否则返回unknown, 非严格模式时, 类型调用会返回自身

相关文章:

VSCode 使用 EmmyLua 对lua进行调试

时间:2024年10月 其他:win10,EmmyLua v0.8.20 参考:https://blog.csdn.net/ShenHaoDeHao/article/details/140268354 有几个概念搞清楚就好理解了。一般开发中,我们编写的lua文件由宿主程序的来解析、执行&#xff1…...

neovim ubuntu中WARNING No clipboard tool found

我在vnc远程的ubuntu中做个临时开发,发现neovim无法复制文字,于是我:checkhealth查看了一下,测试结果如下: WARNING No clipboard tool found. Clipboard registers (" and "*) will not work.ADVICE::help clipboard …...

1882B - Sets and Union

题意就是有n个集合,对n个集合做并集得到 S S S, 现在抽n个集合中的集合做交集得到 T T T,问如何做让 S ≠ T S\neq T ST,并且让 T T T尽可能大。 这道题如果数据大一些做不了,但是数字大小只在50之间,并且集合的大小50,n大小50…...

thinkphp阿里云发送短信验证码,存储到缓存中完成手机号验证

源码demo下载地址 https://download.csdn.net/download/hanzhuhuaa/89865893 或者也可以在文章中查看demo源码 ↓ 第一步安装阿里云 SDK 您可以使用 Composer 来安装阿里云的 SDK。在项目目录中运行: composer require alibabacloud/sdk第二步发送短信 namespace app\api\c…...

题目解析:1423. 可获得的最大点数

题目解析:1423. 可获得的最大点数 > Problem: 1423. 可获得的最大点数 题目描述: 你有一个整数数组 cardPoints,表示排成一行的几张卡牌的点数。你每次可以从这排卡牌的 开头或末尾 拿一张卡牌,最终你需要正好拿 k 张卡牌。目…...

【MySQL】数据库的操作

文章目录 一、查看数据库(显示所有的数据库)二、使用数据库二、创建数据库字符集编码(为数据进行编码然后保存)校验(排序)规则(如何对数据进行排序)推荐这样创建数据库: …...

Spring Boot读取resources目录下文件(打成jar可用),并放入Guava缓存

1、文件所在位置&#xff1a; 2、需要Guava依赖&#xff1a; <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>23.0</version></dependency>3、启动时就读取放入缓存的代码&#xf…...

rsync 数据镜像同步服务笔记

1. rsync概述 定义&#xff1a;rsync是一款数据镜像备份工具&#xff0c;支持快速完全备份和增量备份&#xff0c;支持本地复制与远程同步。镜像指两份完全相同的数据备份.特点&#xff1a; 支持整个目录树和文件系统的更新&#xff1b;可选择性地保留符号链接、文件属性、权限…...

【layui】多文件上传组件实现

插件预览效果&#xff1a; 需要引入layui的脚本文件layui.js和样式文件layui.css html代码&#xff1a; <div class"layui-input-block"><div class"layui-upload-list"><table class"layui-table"><colgroup><col…...

多维最短路

D-最短&#xff1f;路径_牛客小白月赛102 (nowcoder.com) #include <bits/stdc.h> #define int long long using namespace std; const int N1e6; struct node {int x;int y;int z;bool operator>(const node& other) const {return x> other.x;} }; signed m…...

设计模式03-装饰模式(Java)

4.4 装饰模式 1.模式定义 不改变现有对象结构的情况下&#xff0c;动态地给该对象增加一些职责&#xff08;即增加其额外功能&#xff09;的模式。 2.模式结构 抽象构件角色 &#xff1a;定义一个抽象接口以规范准备接收附加责任的对象。客户端可以方便调用装饰类和被装饰类…...

TiDB 监控组件之 Blackbox_exporter 运行原理

作者&#xff1a; TiDBerHailang 原文来源&#xff1a; https://tidb.net/blog/b269e96f 1. 介绍 本文介绍了 TiDB 集群监控组件Blackbox Exporter监控运行机制和配置方式。Blackbox Exporter是Prometheus官方提供的 Exporter&#xff0c;它能够通过多种协议对网络服务进行…...

Java之网络编程详解

一、Java网络编程的基本概念 Java网络编程是指在Java语言中使用网络协议和API进行网络通信的编程技术。Java网络编程可以实现多种应用场景&#xff0c;包括客户端/服务器通信、网站开发、分布式系统等。 二、Java网络编程的基本原理 网络编程的核心概念包括网络通信协议、So…...

苍穹外卖学习笔记(二十)

文章目录 用户端历史订单模块&#xff1a;查询历史订单OrderControllerOrderServiceOrderServiceImpl 查询订单详情OrderControllerOrderServiceOrderServiceImpl 用户端历史订单模块&#xff1a; 查询历史订单 OrderController /*** 历史订单*/GetMapping("/historyOrd…...

2024 第一次周赛

A: 题目大意 骑士每连续 i 天每天会得到 i 个金币&#xff0c;&#xff08;i 1&#xff0c; 2&#xff0c; 3 &#xff0c; …&#xff09;,那么展开看每一天可以得到的金币数&#xff1a;1 2 2 3 3 3 4 4 4 5 5 5 5 5 … 可以发现就是1个1 &#xff0c;2个2, 3个3…,那么我…...

【数据脱敏方案】不使用 AOP + 注解,使用 SpringBoot+YAML 实现

文章目录 引入认识 YAML 格式规范定义脱敏规则格式脱敏逻辑实现读取 YAML 配置文件获取脱敏规则通过键路径获取对应字段规则原始优化后 对数据进行脱敏处理递归生成字段对应的键路径脱敏测试 完整工具类 引入 在项目中遇到一个需求&#xff0c;需要对交易接口返回结果中的指定…...

dbt doc 生成文档命令示例应用

DBT提供了强大的命令行工具&#xff0c;它使数据分析师和工程师能够更有效地转换仓库中的数据。dbt的一个关键特性是能够为数据模型生成文档&#xff0c;这就是dbt docs命令发挥作用的地方。本教程将指导您完成使用dbt生成和提供项目文档的过程。 dbt doc 命令 dbt docs命令有…...

【Windows】【DevOps】Windows Server 2022 安装ansible,基于powershell实现远程自动化运维部署 入门到放弃!

目标服务器安装openssh server参考 【Windows】【DevOps】Windows Server 2022 在线/离线 安装openssh实现ssh远程登陆powershell、scp文件拷贝-CSDN博客 注意&#xff1a;Ansible不支持Windows操作系统部署 根据官方说明&#xff1a; Windows Frequently Asked Questions —…...

深入理解 Parquet 文件格式

深入理解 Parquet 文件格式 深入理解 Parquet 文件格式一、引言二、为什么采用 Parquet 格式1. 行式存储的局限性2. 列式存储的优势 三、Parquet 的工作原理1. 文件结构2. 列块和页面3. 编码和压缩 四、具体数据实例1. 数据示例2. 行式存储 vs 列式存储3. 查询性能对比4. 压缩效…...

计算机挑战赛3

老式的计算机只能按照固定次序进行运算&#xff0c;华安大学就有这样一台老式计算机&#xff0c;计算模式为AB#C&#xff0c;和#为输入的运算符(可能是、-或*&#xff0c;运算符优先级与C一致)&#xff0c;现给出A&#xff0c;B&#xff0c;C的数值以及和#对应的运算符&#xf…...

告别手动切图:用快马ai生成脚本,自动化ps设计稿导出与标注

作为一名长期与PS打交道的设计师&#xff0c;我深知重复性切图标注的痛苦。每次设计稿调整后&#xff0c;手动导出图层、记录样式、测量间距的过程不仅枯燥&#xff0c;还容易出错。最近尝试用InsCode(快马)平台的AI辅助生成自动化脚本&#xff0c;意外发现效率提升显著。以下是…...

Navicat密码解密工具:专业恢复数据库连接密码的技术方案

Navicat密码解密工具&#xff1a;专业恢复数据库连接密码的技术方案 【免费下载链接】navicat_password_decrypt 忘记navicat密码时,此工具可以帮您查看密码 项目地址: https://gitcode.com/gh_mirrors/na/navicat_password_decrypt Navicat密码解密工具是一个专门用于解…...

通义千问1.5-1.8B-Chat-GPTQ-Int4效果实测:对比Claude Code的代码生成能力

通义千问1.5-1.8B-Chat-GPTQ-Int4效果实测&#xff1a;对比Claude Code的代码生成能力 最近在尝试各种轻量级的代码生成模型&#xff0c;想看看在资源有限的情况下&#xff0c;哪个工具能更好地辅助日常开发。通义千问1.5-1.8B-Chat-GPTQ-Int4这个版本&#xff0c;因为做了量化…...

【agent原理】OpenClaw之agent全链路详解

未来已来,只需一句指令,养龙虾专栏导航,持续更新ing… openclaw的术语约定 专业术语 类比 核心作用 不用的后果 Agent Bootstrapping AI员工的入职仪式 给AI办工牌、定岗位职责、录用户信息、建工作文件夹,只执行一次 手动建文件格式错乱、agent读不到规则、配置不统一、重…...

【Matlab】MATLAB教程:数据插值interp1(案例:interp1(x,y,xi,‘linear‘);应用:数据补全、插值)

MATLAB教程:数据插值interp1(案例:interp1(x,y,xi,linear);应用:数据补全、插值) 在科研实验、工程监测、信号采集等各类数据获取场景中,受限于设备精度、测试条件、环境干扰等因素,采集到的原始数据往往存在**数据点稀疏、采样间隔不均、局部数据缺失**等问题,直接使…...

PCB设计新手必看:从零开始掌握PCB设计全流程

1. PCB设计入门&#xff1a;从零开始的完整指南 刚接触PCB设计时&#xff0c;我完全被各种专业术语和复杂流程搞懵了。直到自己动手做了几块板子&#xff0c;才发现其实只要掌握正确的方法&#xff0c;PCB设计并没有想象中那么难。这篇文章就是把我踩过的坑和积累的经验&#x…...

OpenClaw技能扩展实战:基于Qwen3-32B开发自定义文件处理器

OpenClaw技能扩展实战&#xff1a;基于Qwen3-32B开发自定义文件处理器 1. 为什么需要自定义文件处理器 上周处理季度数据时&#xff0c;我又遇到了那个老问题&#xff1a;手头有37个CSV文件需要清洗格式、去重合并&#xff0c;还要按日期归档。这种重复性工作既耗时又容易出错…...

Halcon HImage转Bitmap性能大比拼:实测unsafe方案比安全方案快30倍的背后原因

Halcon HImage转Bitmap性能优化实战&#xff1a;从30倍差距到工业级解决方案 在工业视觉检测和实时图像处理领域&#xff0c;毫秒级的性能差异可能意味着生产线能否稳定运行。最近在为一个汽车零部件检测系统做性能优化时&#xff0c;我意外发现Halcon的HImage转Bitmap操作竟成…...

STM32在博物馆环境监测系统中的应用设计

基于STM32的博物馆文物展柜环境监测与控制系统设计1. 项目概述1.1 系统架构本系统采用STM32F103RCT6作为主控制器&#xff0c;构建了一套完整的文物展柜环境监测与控制解决方案。系统通过集成多种传感器和执行机构&#xff0c;实现了对展柜内温度、湿度及光照强度的实时监测与自…...

STM32实现智能酒驾监测系统设计

基于STM32的酒后驾车监测报警系统设计与实现1. 项目概述1.1 系统背景酒后驾车是全球交通事故的主要诱因之一&#xff0c;传统的人工检测方法存在效率低、覆盖范围有限等问题。随着嵌入式系统和物联网技术的发展&#xff0c;智能化的酒精监测系统成为解决这一问题的有效方案。1.…...