//

官方文档   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 plugin from disk
  • 选择刚下载的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 变量
  • 示例:
1
2
3
4
5

---@class Car : Transport @define class Car extends Transport
local cls = class()
 
function cls:test()
end
  • 示例说明:

将 cls 变量标记为 Car 类,在其它地方可以使用 @type 注解来标记目标变量类型,以增强代码提示以及其它功能

@type类型标记注解

注解

利用 @type 注解来标记目标变量的类型,以增强代码提示以及其它功能

  • 完整格式:
---@type MY_TYPE[|OTHER_TYPE] [@comment]
  • 应用目标:

    • local 变量
1
2
3
4
5
6

---@type Car @instance of car
local car1 = {}
 
---@type Car|Ship @transport tools, car or ship. Since lua is dynamic-typed, a variable may be of different types
---use | to list all possible types
local transport = {}
  • global 变量
1
2

---@type Car @global variable type
global_car = {}
  • property 属性
1
2
3

local obj = {}
---@type Car @property type
obj.car = getCar()

@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 注解之后
1
2
3

---@class Car
---@field public name string @add name field to class Car, you'll see it in code completion
local cls = class()

@generic 泛型注解

注解

利用 @generic 注解来模拟高级语言中的 泛型

  • 完整格式:
--@generic T1 [: PARENT_TYPE] [, T2 [: PARENT_TYPE]]
  • 应用目标:

    • function
  • 示例:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12

---@generic T : Transport, K
---@param param1 T
---@param param2 K
---@return T
local function test(param1, param2)
    -- todo
end
 
---@type Car
local car = ...
 
local value = test(car)

@vararg 不定参数注解

注解

使用 @vararg 注解一个函数的不定参数部分的类型

  • 完整格式:
---@vararg TYPE
  • 示例
  • ---@vararg string
  • ---@return string
  • local function format(...)
  • local tbl = { ... } -- inferred as string[]
end

@language内嵌语言

注解

可以利用 @language 的方式来标注一段文本为某种代码格式,从而可以显示高亮

  • 完整格式:
---@language LANGUAGE_ID
  • 示例:
1
2
3
4

---@language JSON
local jsonText = [[{
    "name":"Emmy"
}]]
  • 效果:

数组类型

注解

可以利用 MY_TYPE[] 的方式来标注一个数据类型为数组

  • 完整格式:
---@type MY_TYPE[]
  • 示例:
1
2
3
4
5
6
7
8
9

---@type Car[]
local list = {}
 
local car = list[1]
-- car. and you'll see completion
 
for i, car in ipairs(list) do
    -- car. and you'll see completion
end

字典类型

注解

可以利用 table<KEY_TYPE, VALUE_TYPE> 的方式来标注一个数据类型为字典

  • 完整格式:
---@type table<KEY_TYPE, VALUE_TYPE>
  • 示例:
1
2
3
4
5
6
7
8
9

---@type table<string, Car>
local dict = {}
 
local car = dict['key']
-- car. and you'll see completion
 
for key, car in pairs(dict) do
    -- car. and you'll see completion
end

函数类型

注解

可以利用 fun(param:MY_TYPE):RETURN_TYPE 的方式来标注一个数据类型为函数

  • 完整格式:
---@type fun(param:MY_TYPE):RETURN_TYPE
  • 示例:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12

---@type fun(key:string):Car
local carCreatorFn1
 
local car = carCreatorFn1('key')
-- car. and you see code completion
 
---@type fun():Car[]
local carCreatorFn2
 
for i, car in ipairs(carCreatorFn2()) do
    -- car. and you see completion
end

字面量类型

注解

字面量类型(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 的注解来标注一个引用

完整示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

---@class Transport @parent class
---@public field name string
local transport = {}
 
function transport:move()end
 
---@class Car : Transport @Car extends Transport
local car = {}
function car:move()end
 
---@class Ship : Transport @Ship extends Transport
local ship = {}
 
---@param type number @parameter type
---@return Car|Ship @may return Car or Ship
local function create(type)
-- ignored
end
 
local obj = create(1)
---now you can see completion for obj
 
---@type Car
local obj2
---now you can see completion for obj2
 
local list = { obj, obj2 }
---@param v Transport
for _, v in ipairs(list) do
---not you can see completion for v
end

运行与调试

准备

注解

必须将源码的根目录设置为 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 to Local Process...

  • 选择目标程序

  • 注意控制台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 Configurations

  • 点击 + 选择并创建 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的安装与使用相关推荐

  1. 最好用的lua编辑器--------emmylua使用汇总

    最好的lua编辑器Emmylua,欢迎打脸 官方文档   https://emmylua.github.io/zh_CN/ github      https://github.com/EmmyLua ...

  2. Openresrt最佳案例 | 第2篇:Lua入门

    什么是lua Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能. Lua 是巴西里约热内卢天主教大学(Po ...

  3. 高性能web平台【Lua语言快速入门】

    Lua快速入门 一.Lua概述 1.1 Lua是什么 Lua 是一个小巧精妙的脚本语言,诞生于巴西的大学实验室,这个名字在葡萄牙语里的含义是"美丽的月亮".Lua开发小组的目标是开 ...

  4. Lua脚本快速上手(附示例程序代码)

    文章目录 Lua脚本快速入门 前提 基础 注释 保留关键字 变量 变量未声明.未初始化时的类型 局部变量 全局变量 全局变量保存在哪? 全局变量不删除有哪些影响? 全局变量如何删除? 多个变量初始化 ...

  5. Openresrt最佳案例

    第1篇:Nginx介绍 Nginx是一个高性能的Web 服务器,同时是一个高效的反向代理服务器,它还是一个IMAP/POP3/SMTP 代理服务器. 由于Nginx采用的是事件驱动的架构,能够处理并发 ...

  6. Unity VSCode一些插件 以及调试C#和Lua

    创建C#控制端项目 https://www.freesion.com/article/5288179294/ 插件 Code Spell Checker 可以帮助我们检查单词拼写是否出现错误,检查的规 ...

  7. IntelliJ IDEA + EmmyLua:Lua IDE的安装与使用

    第一步:安装 EmmyLua不用管,也不用解压,先安装 IntelliJ 和 LuaForWindows_v5.1.4,如果安装的过程中出现"无法连接至服务器"的错误,那么就先运行 ...

  8. idea安装lua编辑插件Emmylua

    安装Emmylua插 搜索插件并安装 重启idea,使插件生效 idea创建lua项目 lua项目中创建lua文件 运行lua文件:

  9. 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 发布,此次更新主要内 ...

  10. xlua安装到unity

    下载xlua GitHub - Tencent/xLua: xLua is a lua programming solution for C# ( Unity, .Net, Mono) , it su ...

最新文章

  1. spring security 注解不生效的一些隐含问题
  2. mysql数据库互联网连接_myeclipse怎么连接mysql数据库?(详细步骤)
  3. 机器学习(MACHINE LEARNING)MATLAB之surf()函数
  4. 【正则表达式】1.入门
  5. oracle+SQL优化实例
  6. 数据传输示例 Moves.asm
  7. C# 2.0 锐利体验
  8. chrome禁止三方cookie,网站登录不了怎么办
  9. asp.net mvc webform和razor的page基类区别
  10. php 位运算与权限,PHP中的二进制位运算和权限存储
  11. oracle11g 安装在rhel5.0笔记
  12. jbpm6 mysql_JBPM6把默认的H2数据库替换成mySql
  13. 公司部分断电,这些人就没法干活?
  14. Litjson快速入门
  15. 知识产权(笔记 1-3章)
  16. 雨林木风 Ylmf Linux Y1.5(Ubuntu 9.10)发行版正式发布
  17. php如何采集有验证码的网页信息,网页数据采集出现验证码的解决方法 - 八爪鱼采集器...
  18. QT3D场景快速绘制入门学习
  19. 程序员真的是吃青春饭的吗?
  20. 公差基本偏差代号_基本偏差代号怎么确定

热门文章

  1. 红米开发版刷机教程_红米K20开发版刷机包(官方系统最新完整固件升级包V20.1.9MIUI开发版)...
  2. 『2022/2/5』Android Studio下载安装详细步骤(Android Studio BumbleBee/2021.1.1.21 Patch 1 )
  3. 手把手教你齿轮齿条配合
  4. 上下文无关文法(例题+计算)
  5. SQL中的内连接查询和外连接查询
  6. InTouch蜂鸣器报警提示方法
  7. 计算机模拟求解流体力学方程,计算流体力学CFD及其应用
  8. 新塘单片机烧写器_ICP Programming Tool
  9. 2020-10-22
  10. 分享一款超好用的 Web SSH 客户端工具