试了几个Lua IDE后,Lua Studio、Lua Glider、VS+babelua插件、Sublime都不是特别满意。直到发现了国人自创的另一个神奇工具:基于IDEA的EmmyLua插件。该插件功能非常完整:断点调试、自动提示、代码跳转、智能重命名等,可以极大地提高Lua编程的速度。界面也比较舒服。

安装步骤

  1. 下载、安装并破解IntelliJ IDEA(我的版本是目前最新的2017.3.4)
  2. 安装EmmyLua插件 
    建议直接在IDEA工具内搜索插件安装(当然也可以下载插件到硬盘安装)。 
    (1)在启动界面点击Configure-Plugins: 
     
    (2)搜索EmmyLua,然后点Search in repositories: 

    (3)点击右边的Install绿色按钮。安装完需要重启IDEA。
  3. 配置SDK,默认是Path路径需要有一个Lua解释器(lua.exe)。你可以在创建项目时指定其他目录。
  4. 配置其他事项。 
    (1)将*.txt识别成lua文件: 

    (2)忽略代码提示大小写差别: 

创建项目

  1. 创建普通Lua项目(不依赖其他程序,如游戏引擎): 
    New-Project,然后next,填项目名、路径,点击finish。 
    在项目视图的src文件夹New一个Lua文件,可以自己print()一下,Run一下,看看有没有输出,有的话,说明SDK配置正确。 
     

  2. 创建Unity引擎Lua项目 
    New-Modules from existing sources(注意不要选错,这里创建的是Modules,不是Project,否则等下导入不了api自动提示的library)。【这里有一个IDE Bug:第一次创建Modules,会在文件夹里生成一个.iml文件。但是如果文件夹里本来就有.iml文件,以后再点Modules from existing sources就会无法生成Modules,也就无法导入library。这个Bug我折腾了一晚上才发现的!必须删掉.iml文件,才可以重新创建Modules】 
    然后选择Unity文件夹的Lua访问根目录,我选的是Resources文件夹,因为可以从Resources作为根目录搜索lua文件。 
    然后我们测试一下断点调试功能。打开其中一个Lua文件,设置断点: 

    然后Run-Attach To Local Process: 
     
    选择Unity进程,触发断点,说明能断点调试: 

Unity API代码提示

现在Unity API代码提示是没有的,因为我们还没导入API描述的library。这个library根据你选择的Lua中间件不同而不同,所以建议是自己导出。我的Lua中间件是SLua。这里以SLua为例。 
1.打开SLua官方自带的Unity项目,在Slua-Editor下面,新建一个SLuaApiExporter.cs脚本: 
 
2.输入如下代码:

using System;
using System.Reflection;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEditor;
using SLua;
using System.IO;
using UnityEngine; namespace Slua
{
public static class EmmyLuaApiExporter
{
[MenuItem("SLua/导出EmmyLuaApi", false, 14)]
static void Gen()
{
string path = "./EmmyApi/";
if (Directory.Exists(path))
{
Directory.Delete(path, true);
}
Directory.CreateDirectory(path);
//UnityEngine
GenAssembly("UnityEngine", path);
//GenAssembly("UnityEngine.UI", path);
GenCustom(path);
} public static void GenAssembly(string name, string path)
{
List<string> excludeList;
List<string> includeList;
CustomExport.OnGetNoUseList(out excludeList);
CustomExport.OnGetUseList(out includeList);
Type[] types = Assembly.Load(name).GetTypes();
foreach (Type t in types)
{
if (LuaCodeGen.filterType(t, excludeList, includeList))
{
GenType(t, false, path);
}
}
} public static void GenCustom(string path)
{
Type[] types = Assembly.Load("Assembly-CSharp-firstpass").GetTypes();
foreach (Type t in types)
{
if (t.IsDefined(typeof(CustomLuaClassAttribute), false))
{
GenType(t, true, path);
}
} types = Assembly.Load("Assembly-CSharp").GetTypes();
foreach (Type t in types)
{
if (t.IsDefined(typeof(CustomLuaClassAttribute), false))
{
GenType(t, true, path);
}
}
}
public static void GenType(Type t, bool custom, string path)
{
if (!CheckType(t, custom))
return;
//TODO System.MulticastDelegate
var sb = new StringBuilder();
if (!CheckType(t.BaseType, custom))
sb.AppendFormat("---@class {0}\n", t.Name);
else
sb.AppendFormat("---@class {0} : {1}\n", t.Name, t.BaseType.Name);
GenTypeField(t, sb);
sb.AppendFormat("local {0}={{ }}\n", t.Name); GenTypeMehod(t, sb); sb.AppendFormat("{0}.{1} = {2}", t.Namespace, t.Name, t.Name); File.WriteAllText(path + t.FullName + ".lua", sb.ToString(), Encoding.UTF8);
} static bool CheckType(Type t, bool custom)
{
if (t == null)
return false;
if (t == typeof(System.Object))
return false;
if (t.IsGenericTypeDefinition)
return false;
if (t.IsDefined(typeof(ObsoleteAttribute), false))
return false;
if (t == typeof(YieldInstruction))
return false;
if (t == typeof(Coroutine))
return false;
if (t.IsNested)
return false;
if (custom && !t.IsDefined(typeof(CustomLuaClassAttribute), false))
return false;
return true;
} public static void GenTypeField(Type t, StringBuilder sb)
{
FieldInfo[] fields = t.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly);
foreach(var field in fields)
{
if (field.IsDefined(typeof(DoNotToLuaAttribute), false))
continue;
sb.AppendFormat("---@field public {0} {1}\n", field.Name, GetLuaType(field.FieldType));
}
PropertyInfo[] properties = t.GetProperties(BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly);
foreach (var pro in properties)
{
if (pro.IsDefined(typeof(DoNotToLuaAttribute), false))
continue;
sb.AppendFormat("---@field public {0} {1}\n", pro.Name, GetLuaType(pro.PropertyType));
}
} public static void GenTypeMehod(Type t, StringBuilder sb)
{
MethodInfo[] methods = t.GetMethods(BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly);
foreach (var method in methods)
{
if (method.IsGenericMethod)
continue;
if (method.IsDefined(typeof(DoNotToLuaAttribute), false))
continue;
if(method.Name.StartsWith("get_") || method.Name.StartsWith("set_"))
continue;
sb.AppendLine("---@public");
var paramstr = new StringBuilder();
foreach (var param in method.GetParameters())
{
sb.AppendFormat("---@param {0} {1}\n", param.Name, GetLuaType(param.ParameterType));
if (paramstr.Length != 0)
{
paramstr.Append(", ");
}
paramstr.Append(param.Name);
}
sb.AppendFormat("---@return {0}\n", method.ReturnType == null ? "void" : GetLuaType(method.ReturnType));
if( method.IsStatic)
{
sb.AppendFormat("function {0}.{1}({2}) end\n", t.Name, method.Name, paramstr);
}
else
{
sb.AppendFormat("function {0}:{1}({2}) end\n", t.Name, method.Name, paramstr);
}
}
} static string GetLuaType(Type t)
{
if (t.IsEnum
//|| t == typeof(ulong)
//|| t == typeof(long)
//|| t == typeof(int)
//|| t == typeof(uint)
//|| t == typeof(float)
|| t == typeof(double)
//|| t == typeof(byte)
//|| t == typeof(ushort)
//|| t == typeof(short)
)
return "number";
if (t == typeof(bool))
return "bool";
if (t == typeof(string))
return "string";
if (t == typeof(void))
return "void"; return t.Name;
}
}
}
  • 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
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184

3.在Unity编辑器中点击SLua-导出EmmyLuaApi 

4.看到Unity工程项目会多出一个EmmyApi文件夹: 

5.将其打包成zip文件(注意不能是rar、7z其它压缩格式!) 

6.在IDEA中点击File-Project Structure,Modules-选择我们的Modules-Dependencies,+号-Library-Lua Zip Library,选择我们刚才打包的zip文件。然后一直OK保存就行了。 

7.测试Unity API提示功能: 

成功!

其它功能

代码跳转: 

智能重命名: 
 

后续

本教程就到这里结束了,但是该插件还有许多有用的功能,可以自行探索,也可以加入EmmyLua的官方QQ群:29850775。群里面有许多教程,本文所用的API导出代码也是从群文件里拿出来改的。

github: https://github.com/tangzx/IntelliJ-EmmyLua 
oschina: http://git.oschina.net/tangzx/IntelliJ-Lua 
IDEA Plugins : https://plugins.jetbrains.com/plugin/9768-emmylua

最后感谢EmmyLua的作者们无私开源编写了这个强大的插件。

参考链接:https://blog.csdn.net/sinat_24229853/article/details/79226608

https://blog.csdn.net/u010019717/article/details/77510066?ref=myread

使用IDEA进行Lua代码调试、自动提示、代码跳转、智能重命名的更多相关文章

  1. Eclipse设置自动提示代码(不用alt+/了)

    在preferences找到如图的相关位置.在输入框里把26个字母加进去,qwer...........

  2. 反调试代码调试死机代码禁止F12代码

    反调试代码调试死机代码禁止F12代码  // 反调试函数,参数:开关,执行代码 function siji(){    var total="";    for (var i=0; ...

  3. 写代码的自动提示是怎么出来的...我的WebStorm中不能自动提示Bootstrap中的样式呢

    首先开启自动提示 File -> Settings ->Editor ->Code Completion ->Preselect the first suggestion:,将 ...

  4. Xcode不自动提示代码

    今天群里有个小朋友惊慌了,“啊啊啊,我的Xcode不能提示代码了,文字都变成黑的了,可怎么办呀...”看到这个我真的是无语了,随手百度一下 ,一大把好不啦,何须惊慌,姐姐我在几年前就遇到了,好在今天不 ...

  5. Eclipse中实现JAVA代码的自动提示功能

    1.打开Eclipse,在.出现时进行代码提示换成任意字母+.出现时的代码提示了(.abcdefghijklmnopqrstuvwxyz):

  6. VS code C++代码没有自动提示

    用了一段时间的VS code,发现一直都没有代码提示,奇了个怪?可能是插件有问题,于是重装C/C++,clang...等插件.结果......没用,

  7. myeclipse安装flex插件后代码无自动提示及自动补全无效的解决办法

    在myeclipse配置flex插件后,可能会产生快捷键的冲突,或者快捷键设置被修改的情况,本文探索其解决办法 在卸载flex插件后,myeclipse的快捷键设置并不会自动还原,这需要我们手动设置. ...

  8. 解决zend studio代码无法自动提示的3个方法

    最近电脑重装,索性把用了好多年的老版本7.x 升级了,网上下载了一个12.x的破解版. 起初一切正常,等导入项目开始开发的时候发现PHP函数尽然没有提示,一脸懵逼! 经过多方查阅和尝试,现在分享3个解 ...

  9. Visual Studio Code python 代码快速自动提示

    1.file --> setting->设置 搜索 python 或者auto_complete setting.json { "explorer.confirmDelete&q ...

随机推荐

  1. 【shell编程】之基础知识-语法

    一.shell变量 1.定义变量 定义变量时,变量名不加美元符号($,PHP语言中变量需要), 如: your_name="runoob.com" 注意,变量名和等号之间不能有空格 ...

  2. day18-19 Storm

    课程介绍 课程名称:Storm是什么 课程目标: 通过该课程的学习能够了解离线计算与流式计算的区别.掌握Storm框架的基础知识.了解流式计算的一般架构图. 课程大纲: 1. 离线计算是什么? 2.  ...

  3. hiveserver 占用内存过大的问题

    今天为了求解hiveserver占用内存过大的问题,特地加了hive在apache的邮件列表,讨论半天.特别说的是 里面的人确实很热情啊 ,外国人做事确实很认真,讨论帖发的时候都狠详细. 粘出一些记录 ...

  4. day 53 js学习之

    ---恢复内容开始--- 1.昨日作业讲解 弄一个上图一样的选择器,可以全选,可以反选,取消 <!DOCTYPE html> <html lang="zh-CN" ...

  5. 你不知道的JavaScript(中卷) (Kyle Simpson 著)

    第一部分 类型和语法 第1章 类型 1.1 类型 1.2 内置类型 1.3 值和类型 1.3.1 undefined和undeclared 1.3.2 typeof Undeclared 1.4 小结 ...

  6. JS中encodeURIComponent函数用php解码的代码

    JS中encodeURIComponent函数给中文编码后,如何用php解码?? 前提:编码前的中文可能是gbk,gb2312,utf-8等. 复制代码 代码如下: urldecode() iconv ...

  7. JS正则表达式验证身份证号码

    function isCardNo(card) { // 身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X var reg = /(^\d{1 ...

  8. .NET设计模式 第二部分 创建型模式(1)—:单件模式(Singleton Pattern)

    单件模式(Singleton Pattern) ——.NET设计模式系列之二 Terrylee,2005年12月07日 概述 Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问 ...

  9. Go 定时器timer和ticker

    两种类型的定时器:ticker和timer.两者有什么区别呢?请看如下代码: ticker package main import ( "fmt" "time" ...

  10. RedHat6.5安装kafka集群

    版本号: Redhat6.5    JDK1.8     zookeeper-3.4.6   kafka_2.11-0.8.2.1 1.软件环境 1.3台RedHat机器,master.slave1. ...