设置语言包

模拟精灵的语言包在模拟精灵运行目录的"Fairy_Ape\Language"目录下

不同的语言包的语言代码由三个英文字母组成.
如简体中文为CHS,那么简体中文的语法配置文件为 Fairy_Ape\Language\CHSsyntax.txt
简体中文的界面语言包为:Fairy_Ape\Language\CHS.xml

CHS.xml中的ApeMLTable节点是ApeML使用的语法关键字,最好不要随意更改这个节点。

您也可以添加自已的语言包,只要把语言包放到"Fairy_Ape\Language"目录下即可
模拟精灵会自动添加到语言包列表.语言包命令规则为:

语言包: 三个字母的语言代码 + .xml 如:CHS.xml
语法解析语言包: 三个字母的语言代码 + syntax.txt 如:CHSsyntax.txt


一、编辑语法配置文件

修改以前请详细阅读下面的配置规则说明

关键字中的"."圆点表示名称空间层次(语法中的名称空间,类名,对象名)
关键字前面的^表示这是一个系统参数变量,不可修改。

也就是下面两句代码您不可以改动
^MAXTIER = 20
^IGNORECASE_NODE_KEY = 1


含有等号的行是一个键值对,等号前面是关键字,等号后面是提示或模板

示例:

local =? 声明局部变量


提示前面第一个字符如果是"@"符号表示注释是一个自动完成模板
示例:

do =? @do??????? end;
function = @ function???????? end;



没有等号的行都被认为是注释,语法引擎忽略注释行
如果有多个等号时,优先识别前后有空格的等号

二、名称空间转向

例如 this 与 m变量 都是模块对象,他们的成员函数列表是一样的,这时,我们不需要为他们分别指定语法配置列表。
可以使用名称空间转向将m变量的成员函数列表附加给this对象。

首先指定m变量函数列表,如:

m:.left() = 返回当前模块锚点位置横坐标
m:.top() = 返回当前模块锚点位置纵坐标
m:.moveTo( , ) = 移动当前模块到指定坐标

然后为this对象指定转向,如下:
this: = >m:

>符号指示语法编辑器查询引擎记录一个转向操作,当我们输入this:以后,会自动显示m:的成员函数列表。

三、自动合并语法配置文件

语法配置文件在升级时会被覆盖更新。
为了避免自已添加的语法被覆盖,可以新建一个自定义的语法配置文件 "Fairy_Ape\\我的自动完成.txt"

然后将下面的脚本存为LAS文件,需要更新的时候双击运行即可。

--载入自已的自动完成
str2 = assert(string.load(win.getExeDir().."\\Fairy_Ape\\我的自动完成.txt"),select(2,win.lastError()))
head = string.left(str2 ,10)
   
--载入语言包
str = string.load(win.getExeDir().."\\Fairy_Ape\\Language\\CHSsyntax.txt");
 
if(str)then
    if(string.find( str,head )then
            win.messageBox("您已经添加了这个自动完成配置,不需要重复添加")
        return false;
    end;

    --合并语言包
    str = str..str2;
   
    --更新语言包
    string.save(str ,win.getExeDir().."\\Fairy_Ape\\Language\\CHSsyntax.txt")
   
    --重启模拟精灵
    win.exec(win.getExeFile()," /restart=10")
end

四、自动导入插件库成员到自动完成列表

把下面的文件存为 “自动导入库成员到自动完成列表.LAS” 双击运行


function tosyn(ns,objname)
     import(ns)
     if(not _G[ns])then
        return;
     end;
   
     local str = string.load(win.getExeDir().."\\Fairy_Ape\\Language\\CHSsyntax.txt");
     if(string.find(str ,ns ))then
          win.messageBox("自动完成库配置可能已导入了"..ns.."库,不需要重复添加")
          return;--返回,不执行后面的代码了
     end;
 
 
     local syn ="\r\n"
     for k,v in pairs(_G[ns])do
         syn = syn..ns.."."..k.." = ".." \r\n"
     end;
    
     if(not objname)then
          string.save(str..syn ,win.getExeDir().."\\Fairy_Ape\\Language\\CHSsyntax.txt");
          return syn ;
     end;
    
     if(objname=="")then
          string.save(str..syn ,win.getExeDir().."\\Fairy_Ape\\Language\\CHSsyntax.txt");
          return syn ;
     end;
    
     if(_G[ns].new ~= nil)then
          local obj = _G[ns].new();
          if(obj)then
               local meta = getmetatable(obj);
               
               if(meta)then
                    for k,v in pairs(meta) do
                    syn = syn..objname..":"..k.." = ".." \r\n"
                    end;
               end;
          end;
     end;
    
     if( _G[ns].open ~= nil)then
          local obj = _G[ns].open();
          if(obj)then
               local meta = getmetatable(obj);
               
               if(meta)then
                    for k,v in pairs(meta) do
                         syn = syn..objname..":"..k.." = ".." \r\n"
                    end;
               end;
          end;
     end;
    
     string.save(str..syn ,win.getExeDir().."\\Fairy_Ape\\Language\\CHSsyntax.txt");
    
     return syn;
end;
    
ok = tosyn(win.inputBox("请输入库名称","更新自动完成列表"),win.inputBox("请输入创建对象默认变量名字(不创建对象的库请不要填写)","更新自动完成列表"));
    
if(ok)then
    --重启动
    win.messagePrint("@6秒后重启模拟精灵,按".._STOPHKEY.."取消!")
    delay(2000);
    win.messagePrint("@4秒后重启模拟精灵,按".._STOPHKEY.."取消!")
    delay(2000);
    win.messagePrint("@2秒后重启模拟精灵,按".._STOPHKEY.."取消!")
    delay(2000);

    if(nStop())then
         win.exec(win.getExeFile()," /restart=100")
    end;
end;