EmmyLua的安装与使用
//
官方文档 https://emmylua.github.io/zh_CN/
github https://github.com/EmmyLua/IntelliJ-EmmyLua
1.安装IntelliJ IDEA Community Edition 2018.2.4 x64
官网地址 http://www.jetbrains.com/idea/download/#section=windows
直接下载即可,下载 Community 版本,也就是社区版,免费的
这个原本是写java的,安装过程中一些选项直接无视即可
2.下载Lua For Windows
https://github.com/rjpcomputing/luaforwindows/releases
下载最新的就行,然后安装
3.安装emmylua插件
安装插件有2种方法,我用的是直接搜的插件库安装的,其他方法,参照官方文档
- Open settings panel.
- Select plugins and click Browse repositories
- 搜索 EmmyLua 并点击 Install 安装
- 安装完毕重启IDEA
从zip文件安装
- 下载zip文件
- 从 JetBrains Plugin Repository 下载
- 从 Github release page 下载(可能不是最新版本)
- 从QQ群文件下载(最新版首先在群内发布测试,群号:29850775 )
警告
无需解压Zip文件
- 选择菜单 File -> Settings -> Plugins -> Install
- 选择刚下载的EmmyLua.zip文件,安装完毕重启IDEA
4.设置lua工程
先随便创建一个空工程,为了就是进去后设置
选择你的Lua工程根目录
5.读取lua文件,忽略meta文件
也是settings,xlua需要读的txt,可自行设置,不需要不设置也行
下面还有个忽略文件列表,没有图了,上面写上 *.meta; 即可
IntelliJ IDEA添加过滤文件或目录
Settings→Editor→File Types
在下方的忽略文件和目录(Ignore files and folders)中添加自己需要过滤的内容
下图为我自己添加过滤的内容,例如:*.iml;*.idea;*.gitignore;*.sh;*.classpath;*.project;*.settings;target;
6.界面白色太辣眼睛,调整为黑色
File---settings
7.字体太小了
File---settings
8.添加unity的api提示
File---Project Structure
点 加号 按钮
找到unity的 UnityEngine.dll 这个
我用的unity 2018 位置在 D:\Unity2018\Editor\Data\Managed
不同unity版本的文件位置不一样
(这种添加dll,就会有相应的代码提示,感觉添加fairygui的dll也可以有fairygui的代码提示)
9.忽略大小写,为了调用api的提示方便
File---settings 红圈位置取消即可
10.使用注解
比如写了如下代码
local go;
然后在这一行代码,按下alt 加 enter键
会出现一个create type annotation一个选项,再次回车
就可以给go命名类型了,直接输入gameobject下面会有自动提示UnityEngine.GameObject类型,选中即可
那么这个go就是UnityEngine.GameObject类型了
然后go. 就能点出unity的api方法了
注解功能是emmylua一个很强大的功能,更多的技巧参考官网
11.其他
①全局搜索
ctrl shift f 注意的快捷键没有冲突
或者edit---find---find in path
或者参考这个 https://blog.csdn.net/gnail_oug/article/details/78281354
②整理代码格式
code---reformat code
需要选中代码
ctrl + alt + L
③查看方法的具体实现
alt按住不放,然后鼠标点方法
④查看方法哪里被调用
alt+F7
⑤代码折叠与复原
ctrl shift -
ctrl shift +
⑥去除波浪线,拼写检查
file-settings-editor-inspections
输入框里面输入spelling-typo 这个关闭 即可
//
断点调试Emmy-Lua的遇到的问题:
Copy 自己配置的Debug配置的时候的三行代码:提示Try connect localhost:9966 …
Connection refused: connect
解决方法:C:\Windows\System32\drivers\etc\hosts 加入 127.0.0.1 localhost
根据项目中使用的lua文件类型,添加为lua Language的文件类型,比如.lua.txt 和.lua
这样就能在idea里看到lua代码带有颜色并且能断点了
这个 暂时还没连接成功调试
这个是: 先开这里的调试,再打开unity
选择Tcp(Debugger connect IDE),也就是IDE作为server,unity作为client,通过socket进行连接,这种好处就是可以在lua启动的入口处既可以进行调试,缺点是,必须先启动调试器,后启动unity。
设置lua scourceRoot。也就是lua 脚本的根目录
///
/ EmmyLua for IntelliJ IDEA Document /
@class类声明注解
- 完整格式:
--@class MY_TYPE[:PARENT_TYPE] [@comment]
- 应用目标:
- local 变量
- global 变量
- 示例:
|
|
- 示例说明:
将 cls 变量标记为 Car 类,在其它地方可以使用 @type 注解来标记目标变量类型,以增强代码提示以及其它功能
@type类型标记注解
注解
利用 @type 注解来标记目标变量的类型,以增强代码提示以及其它功能
- 完整格式:
---@type MY_TYPE[|OTHER_TYPE] [@comment]
- 应用目标:
- local 变量
|
|
- global 变量
|
|
- property 属性
|
|
@alias 别名注解
注解
可以使用 @alias 将一些复杂不容易输入的类型注册为一个新的别名
- 完整格式:
---@alias NEW_NAME TYPE
- 示例
- ---@alias Handler fun(type: string, data: any):void
- ---@param handler Handler
- function addHandler(handler)
end
@param参数类型标记注解
注解
利用 @param 注解来标记函数定义参数的类型,以增强代码提示以及其它功能
@return 函数返回值注解
注解
利用 @return 注解来标记函数的返回值类型
- 完整格式:
---@return MY_TYPE[|OTHER_TYPE] [@comment]
- 应用目标:
- 函数
1 2 3 4 5 6 7 |
---@return Car|Ship local function create() ... end ---Here car_or_ship doesn't need @type annotation, EmmyLua has already inferred the type via "create" function local car_or_ship = create() |
1 2 3 4 |
---@return Car function factory:create() ... end |
@field 属性注解
注解
利用 @field 注解来标记某个类的额外的属性(即使这个属性没有出现在代码里)
- 完整格式:
---@field [public|protected|private] field_name FIELD_TYPE[|OTHER_TYPE] [@comment]
- 应用目标:
- 在 @class 注解之后
|
|
@generic 泛型注解
注解
利用 @generic 注解来模拟高级语言中的 泛型
- 完整格式:
--@generic T1 [: PARENT_TYPE] [, T2 [: PARENT_TYPE]]
- 应用目标:
- function
- 示例:
|
|
@vararg 不定参数注解
注解
使用 @vararg 注解一个函数的不定参数部分的类型
- 完整格式:
---@vararg TYPE
- 示例
- ---@vararg string
- ---@return string
- local function format(...)
- local tbl = { ... } -- inferred as string[]
end
@language内嵌语言
注解
可以利用 @language 的方式来标注一段文本为某种代码格式,从而可以显示高亮
- 完整格式:
---@language LANGUAGE_ID
- 示例:
|
|
- 效果:
数组类型
注解
可以利用 MY_TYPE[] 的方式来标注一个数据类型为数组
- 完整格式:
---@type MY_TYPE[]
- 示例:
|
|
字典类型
注解
可以利用 table<KEY_TYPE,
VALUE_TYPE> 的方式来标注一个数据类型为字典
- 完整格式:
---@type table<KEY_TYPE, VALUE_TYPE>
- 示例:
|
|
函数类型
注解
可以利用 fun(param:MY_TYPE):RETURN_TYPE 的方式来标注一个数据类型为函数
- 完整格式:
---@type fun(param:MY_TYPE):RETURN_TYPE
- 示例:
|
|
字面量类型
注解
字面量类型(String literal types)允许你指定字符串作为固定的代码提示,结合 @alias 特性可以起到类似“枚举”的效果
- 示例
- ---@alias Handler fun(type: string, data: any):void
- ---@param event string | "'onClosed'" | "'onData'"
- ---@param handler Handler | "function(type, data) print(data) end"
- function addEventListener(event, handler)
end
注解
建议使用 @alias 简化类型复杂度
---@alias Handler fun(type: string, data: any):void
---@alias IOEventEnum string | "'onClosed'" | "'onData'"
---@param event IOEventEnum
---@param handler Handler | "function(type, data) print(data) end"
function addEventListener(event, handler)
end
@see 引用
注解
可以利用 see 的注解来标注一个引用
完整示例
|
|
运行与调试
准备
注解
必须将源码的根目录设置为 Sources 目录。
具体做法是打开菜单 File -> Project
Structure 打开 Project
Structure 设置面板,点击右侧的 Add
Content
Root 来添加你的源码根目录,然后点击 Mark
as
Sources 标记。
开始调试
Attach Debug 附加调试
提示
附加调试目前只能在 Windows 平台上使用,可以附加到32位和64位应用程序,因附加调试需将EmmyLua的调试模块 LuaInject.dll 注入到被调试程序进程中,一些杀毒软件、某卫士可能会弹窗报警告,如果注入过程被拦截则会出现注入失败的错误,导致调试失败。所以一定要选择放行或信任。
注解
Attach Debug 目前处于实验阶段,不稳定。如果经常出现被调试程序崩溃的情况请改使用Remote方式调试。如若能提供重现崩溃BUG的工程是最好不过了
1. 执行步骤
- 运行目标程序,打开IDEA菜单 Run -> Attach
- 选择目标程序
- 注意控制台LOG,出现下图LOG表明附加成功
- 然后就可以在源码中添加断点进行调试了
2. 失败相关问题排查
- 断点无效, IDEA控制台窗口出现 xxx not found 日志
请确认 Sources 目录设置正确
- 附加到目标程序失败,出现 Error: LuaInject.dll could not be loaded into the process
检查是否被杀软、安全卫士拦截了注入过程
Remote Debug 远程调试
提示
说明:远程调试通信基于socket,内核基于mobdebug.lua ,依赖于luasocket模块,所以被调试的程序需要支持luasocket
远程调试要先启动,再启动目标程序
1. 执行步骤
- 配置Remote调试设置,点击右上角 Edit
- 点击 + 选择并创建 Lua Remote(Mobdebug) 配置
设置好相关参数后点击OK
- 点击右上角debug按钮
- 注意IDEA控制台LOG输出,如下图所示表示启动
- 下载 mobdebug.lua 并在目标程序的lua代码入口处添加代码
1 |
require("mobdebug").start() |
或者
1 |
require("mobdebug").start("host-ip", port) --默认值为 "localhost", 8172 |
- 最后启动目标程序,并注意IDEA控制台窗口,出现下图所示`Connected`则表示调试器连接成功并可以添加断点并调试了
2. 失败相关问题排查
- 运行目标程序后控制台并没有出现`Connected`日志
- 确认目标程序包含luasocket模块
- 确认调试端口一致(默认是8172端口)
- Connected 日志有,但断点无效
- 检查 Sources 目录设置正确
- 检查目标程序在运行时提供的文件名与源码文件的文件名一致(致少除了后缀名的前面的部分一致)
此项检查快捷方式是在 mobdebug.lua 的
1 |
local function has_breakpoint(file, line) |
函数中打印输出 file
//新版调试说明//
原理简单说明:
lua代码中通过 local dbg = require("emmy_core") 主动加载 emmy_core.dll
到宿主程序中,并启动调试内核代码。调试内核通过socket与IDEA/VSCode侧连接通
讯。
注意:Windows下的emmy_core.dll 分32位和64位,注意区分
启动顺序的要求:
上面提到调试内核与 IDEA/VSCode 通过socket通信,有 Server端和 Client
端角色之分,所以提供了两种连接模式和对应的启动顺序要求:
1. Debugger connect IDE: 即IDE充当Server侧,这时应先启动IDE侧的调试功能
,等待被调试的程序启动并主动连接到IDE。注意:此时插入的Lua代码应当是
dbg.tcpConnect('localhost', 9966)
2. IDE connect debugger: 即被调试的程序充当Server端,这时被调试的程序应
先启动,再启动IDE侧的调试功能连接到调试内核。注意:此时插入的Lua代码应
当是 dbg.tcpListen('localhost', 9966)
Q: 不能连接的问题:
IDEA 提示相关错误: Connection refused: connect
原因:没有按启动顺序要求启动Server端
解决思路:按照 “启动顺序的要求” 先启动被调试的程序
Q: 不能断点的问题:
IDEA/VSCode 下了断点但不能命中:
1. 首先检查使用最新版本emmy_lua插件,群里的版本比较新,但想要最新的最好是
去CI上去下载每日构建版本,地址见群公告
2. 不能断点的大部分原因是你的宿主代码中(c++/c#)对于类似 load 函数的调用中
的 chunkname 的值给的不正确,导致文件路径不匹配而不能命中断点。例如代
码用到了 require("a.b.c") ,那么在加载 c.lua 文件时给的 chunkname
参数应当是 "a/b/c.lua"
另外调试器提供了一个“强断”的功能,即在要断点的地方写上lua代码:dbg.breakHere()
用这个功能可以查看强断后堆栈里显示的路径正不正常
Q: Mac上提示 'dynamic libraries not enabled;check your lua installation'
这个问题需要重新编译lua c代码所在的模块,加上编译宏: LUA_USE_MACOSX。(Unity下
下的xlua.bundle/tolua.bundle替换之后要重启Unity)
Q: local dbg = require("emmy_core") 失败报错
你的代码里写了自定义的loader,emmy_core并不是一个lua文件,请判断一下,如果加载的
是emmy_core请不要处理也不要报错,交由低层的clib loader继续处理
Q: local dbg = require("emmy_core") 返回一个boolean值
emmy_core库初始化失败,通常是发生在windows平台下。这是因为emmy_core在初始化会
根据lua函数名字去找函数地址,如根据"lua_settop"去找内存中的函数地址,如果找不到则会
导致初始化失败,通常是因为lua相关的函数没有被导出
解决方法1:让你的程序导出lua符号表(加上编译宏LUA_BUILD_AS_DLL)
解决方法2:选择使用自带lua代码版本的emmy_core.dll(下个版本)
Q: 为什么调试不能断点?
A: 为什么不能断点在群文件《新版调试说明.txt》中有提到原因,一句话说来就是路径不匹配。新版调
试器已经做了很多改进,对文件路径进行了模糊匹配,大大减少了不能断点的问题。如果你使用的
是旧版本调试,建议先用新版本调试器先试试!
EmmyLua IDEA版提供了3种调试器:
* Remote Debugger
* Attach Debugger
* Emmy New Debugger
EmmyLua VSCode版提供了2种调试器:
* Attach Debugger
* Emmy New Debugger
其中:
* Attach Debugger 由于BUG比较多不稳定,所以不打算维护了,将废弃
Emmy New Debugger 是最近从零重写的调试器,特点:
* 稳定,易维护
* 跨平台 (windows/mac/linux)
* 后续将完善附加进程功能、移动设备调试、Profiler以及纯lua版本取代mobdebug.lua
具体使用可以看群文件夹《新版调试测试》的视频和专门的说明。
=================================================================================
Q: 移动端手机上如何调试?
A: 目前三种调试中只有 remote debugger 可以在手机上调试。
/
EmmyLua的安装与使用相关推荐
- 最好用的lua编辑器--------emmylua使用汇总
最好的lua编辑器Emmylua,欢迎打脸 官方文档 https://emmylua.github.io/zh_CN/ github https://github.com/EmmyLua ...
- Openresrt最佳案例 | 第2篇:Lua入门
什么是lua Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能. Lua 是巴西里约热内卢天主教大学(Po ...
- 高性能web平台【Lua语言快速入门】
Lua快速入门 一.Lua概述 1.1 Lua是什么 Lua 是一个小巧精妙的脚本语言,诞生于巴西的大学实验室,这个名字在葡萄牙语里的含义是"美丽的月亮".Lua开发小组的目标是开 ...
- Lua脚本快速上手(附示例程序代码)
文章目录 Lua脚本快速入门 前提 基础 注释 保留关键字 变量 变量未声明.未初始化时的类型 局部变量 全局变量 全局变量保存在哪? 全局变量不删除有哪些影响? 全局变量如何删除? 多个变量初始化 ...
- Openresrt最佳案例
第1篇:Nginx介绍 Nginx是一个高性能的Web 服务器,同时是一个高效的反向代理服务器,它还是一个IMAP/POP3/SMTP 代理服务器. 由于Nginx采用的是事件驱动的架构,能够处理并发 ...
- Unity VSCode一些插件 以及调试C#和Lua
创建C#控制端项目 https://www.freesion.com/article/5288179294/ 插件 Code Spell Checker 可以帮助我们检查单词拼写是否出现错误,检查的规 ...
- IntelliJ IDEA + EmmyLua:Lua IDE的安装与使用
第一步:安装 EmmyLua不用管,也不用解压,先安装 IntelliJ 和 LuaForWindows_v5.1.4,如果安装的过程中出现"无法连接至服务器"的错误,那么就先运行 ...
- idea安装lua编辑插件Emmylua
安装Emmylua插 搜索插件并安装 重启idea,使插件生效 idea创建lua项目 lua项目中创建lua文件 运行lua文件:
- idea安装lua插件_IntelliJ EmmyLua 1.1.9发布,IDEA的Lua插件
IntelliJ EmmyLua 1.1.9发布,IDEA的Lua插件 发布时间:2017-09-19 22:07:23来源:红联作者:lovsher EmmyLua 1.1.9 发布,此次更新主要内 ...
- xlua安装到unity
下载xlua GitHub - Tencent/xLua: xLua is a lua programming solution for C# ( Unity, .Net, Mono) , it su ...
最新文章
- spring security 注解不生效的一些隐含问题
- mysql数据库互联网连接_myeclipse怎么连接mysql数据库?(详细步骤)
- 机器学习(MACHINE LEARNING)MATLAB之surf()函数
- 【正则表达式】1.入门
- oracle+SQL优化实例
- 数据传输示例 Moves.asm
- C# 2.0 锐利体验
- chrome禁止三方cookie,网站登录不了怎么办
- asp.net mvc webform和razor的page基类区别
- php 位运算与权限,PHP中的二进制位运算和权限存储
- oracle11g 安装在rhel5.0笔记
- jbpm6 mysql_JBPM6把默认的H2数据库替换成mySql
- 公司部分断电,这些人就没法干活?
- Litjson快速入门
- 知识产权(笔记 1-3章)
- 雨林木风 Ylmf Linux Y1.5(Ubuntu 9.10)发行版正式发布
- php如何采集有验证码的网页信息,网页数据采集出现验证码的解决方法 - 八爪鱼采集器...
- QT3D场景快速绘制入门学习
- 程序员真的是吃青春饭的吗?
- 公差基本偏差代号_基本偏差代号怎么确定
热门文章
- 红米开发版刷机教程_红米K20开发版刷机包(官方系统最新完整固件升级包V20.1.9MIUI开发版)...
- 『2022/2/5』Android Studio下载安装详细步骤(Android Studio BumbleBee/2021.1.1.21 Patch 1 )
- 手把手教你齿轮齿条配合
- 上下文无关文法(例题+计算)
- SQL中的内连接查询和外连接查询
- InTouch蜂鸣器报警提示方法
- 计算机模拟求解流体力学方程,计算流体力学CFD及其应用
- 新塘单片机烧写器_ICP Programming Tool
- 2020-10-22
- 分享一款超好用的 Web SSH 客户端工具