Linux | c&cpp | Email | github | QQ群:425043908 关注本站

itarticle.cc

您现在的位置是:网站首页 -> Windows 文章内容

sublimeText配置Ctags和Lua开发环境-itarticl.cc-IT技术类文章记录&分享

发布时间: 9年前Windows 119人已围观返回

在朋友的介绍下使用上了subLime Text 编辑器,发现有很多很好的特性适合在项目中开发lua程序,例如在编辑器中支持项目形式的文件夹管理,非常方便的夸文件跳转,符号查找,跳转到函数定义,往回跳转,编译脚本等等。一个配置好的sublime Text 环境能满足VS以及VAX的很多编辑代码常用功能。subLime Text被 称为专为程序员而生的编辑器的确十分给力。

可以前往 subLime Text 官网 下载subLime编辑器以及查看它的基本编辑功能

【安装】

在安装完之后先不要运行sublime text,然后打开运行输入%appdata%,然后删除该目录下的Sublime Text 3 文件夹,然后在Sublime Text 3 安装目录下新建一个名为 Data 的文件夹,注意大小写.然后再打开SublimeText就会发现 安装的插件已经在这个Data目录里了..

【汉化】

下载汉化包http://pan.baidu.com/s/1pJqPkcb,然后放入Data目录下的Installed Packages 文件夹

【跨文件跳转】

ctrl + P

可通过fileA@functionB直接定位到fileA下的functionB函数

【符号搜索,函数名】

ctrl + R

在subLimeText默认功能中,没有函数列表,貌似现有的插件也没有实现这个功能。但其实使用符号搜索可以基本代替函数列表,在ctrl + R 调出搜索框以后会附带符号列表,列表中就是当前文件定义的各个函数

【一切可修改】

在subLmieText中的设置项,包括快捷键等等都可以通过修改配置表自行设置,主要有Preferences 下的Setting表跟KeyBinding表,还有插件的配置表Package Control Setting。

【命令搜索】

subLime中的各种设置命令,除了可以在上方Menu中通过鼠标点选设置以外,还能通过ctrl + shift + P调出命令搜索框,搜索想要的命令并且调用。例如像修改快捷键表,除了可以通过鼠标点击Preferences -> KeyBindings – Default以外,还可以通过命令搜索框输入key binding,搜索并直接调用该命令,无需需记住各个选项在Menu的位置,也无需鼠标操作,特别适合一些双手时刻不愿离开键盘的键盘党程序员。

【文件夹列表】

在subLimeText中可以把一个文件夹导入到编辑器中,并且以Project的形式去管理这些文件夹。但是在默认的情况下会把文件夹下无论是否文档的文件都扫描进来。不过利用【一切可修改】的特性,我们可以在Preferences下的Setting—Default表下找到”folder_exclude_patterns”、”file_exclude_patterns”、”binary_file_patterns” 这几个值修改从而剔除一些我们不需要在编辑器中关注的文件。这里有一点问题是,导入了文件夹以后,通过右键某个子文件夹Delete

Folder删除子文件夹,经常失败。

【编译LUA】

1.下载luajit ,下载地址 http://luajit.org/download.html

2.解压 luajit

3.打开 visual studio 命令行工具,cd 进入 lujit 的 src目录,执行.\msvcbuild.bat 命令编译luajit, 编译成功后会在 src目录下产生 luajit.exe程序,这个就是我们的编译工具.

想在subLime中集成编译Lua(或其他语言)功能,只需要在Tool->Build System -> New Build System中添加代码

{

"cmd":["luajit.exe的路径","$file"],

"file_regex":"^(?:lua:)?[t](...*?):([0-9]*):?([0-9]*)",

"selector":"source.lua"

}

然后在sublime Text文件夹路径下/Packages/ 中新建Lua文件夹,保存为Lua.sublime-build文件即可。

这里”luajit.exe的路径” 是lua编译器的路径,如果系统的环境变量已经配了lua键值,则可直接写”cmd”: ["lua", "$file"]

可以通过Preferences->Browse Packages打开sublime Text文件夹

在一切设置好以后,通过ctrl + B 快捷键编译文件。

【强大的插件】

subLime开放API,有许多功能强大的插件,在安装插件前首先要安装一个插件管理器。通过ctrl + `调出控制台,然后在下方输入框输入以下代码:

import urllib.request,os; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); open(os.path.join(ipp, pf), 'wb').write(urllib.request.urlopen( 'http://sublime.wbond.net/' + pf.replace(' ','%20')).read())

运行结束后就重启subLime就可以在Preferences下找到Package Control

也可以去这个网址下载插件管理器: https://sublime.wbond.net/Package%20Control.sublime-package 然后放到Data\Installed Packages 目录,重启sublime text就可以了

通过Package Control 的Install 和 Remove命令可以调出可安装插件列表和已安装插件列表,搜索想要的插件进行安装(卸载)。

这里推荐几个在项目中开发lua脚本十分有用的插件。

1)FunctionName Display (经测试对LUA不启作用)

这个插件安装后可以在信息栏中显示当前光标所在行是属于哪个函数的。

2)ConverToUTF8

subLimeText原生不支持中文,解析ansi编码的时候是按照western window 1252字符表解析的,中文部分会乱码。安装了这个插件以后,用ctrl + shift + C 设定GB2312编码格式,然后在读写文档的时候就会按照gb2312来读和保存了。(不过提示还是写保存成utf-8)

这个插件装了之后会在保存的时候闪一下,把lazy_reload设置成true就好了

sublime 3

插件设置如下:

// Maximum size for encoding cache, 0 means no cache

"max_cache_size" : 0,

// Maximum lines to detect, 0 means unlimited

"max_detect_lines" : 0,

// Convert when previewing file: true or false

"preview_action" : true,

// Encoding for new file, empty means using sublime text's "default_encoding" setting

"default_encoding_on_create" : "GBK",

// Set this option to true will cause Sublime Text reload the saved file when losing focus

"lazy_reload": false,

// Convert in Find Results view

"convert_on_find": true,

// Convert when loading/saving a file

"convert_on_load" : true,

"convert_on_save" : true

然后我把lazy_reload设置成true,在保存就不会闪了,切换出去失去焦点了才会闪,有个朋友的是sublime2,没这个问题。


3)TortoiseSVN

安装了这个插件以后可以直接右键Folder来Commit或者Update代码,十分方便。但有一个问题就是,在TortoiseSVN面板还没关闭前,subLimeText是阻塞的,无法响应任何操作,这个有点囧。

4) GBK to UTF8

将文件编码从GBK转黄成UTF8,快捷键Ctrl+Shift+C

5) DetectSyntax

这是一个代码检测插件。

6)cTags

1. cTags是一个用于从程序源代码树产生索引文件(或tag文件),从而便于文本编辑器来实现快速定位的实用工具。安装了这个插件以后,通过快捷键ctrl + t,ctrl + r来生成索引文件,在索引文件生成后,可以通过快捷键ctrl

+ 鼠标左键来跳到函数定义的地方,通过ctrl + 鼠标右键跳回上一次编辑的地方。这个功能在阅读代码时十分有用。(cTags快捷键及详情)

2. 安装CTAGS:

2.1 快捷键ctrl+shift+p, 输入install, 选择package controll: install package, 回车,等一会出现一个插件列表,可以输入关键词搜索插件,输入ctags,

2.2 在官网上下载,链接http://sourceforge.net/projects/ctags/files/, 解压,将里面的ctags.exe复制到C:\Windows\System32下面

2.3 打开cmd, 进入到项目根目录,输入以下命令ctags.exe -R -f .tags .执行结束后执行结束后,可以在项目目录下看到新生成了一个.tags文件

2.4 现在,可以用sublime 打开项目,然后可以使用ctags功能啦:函数跳转,搜索函数定义等等


附注:

今天遇到一很2的问题,配好了LUA环境之后,按CRTL+B没反应...后来才发现,实际上有反应的,只是那个输出只有一行,然后我认为那个不是输入,然后去按CTRL+`,然后发现没有输出,就认为配置错误..后来想想好傻啊.....

CTRL+R 在sublime里可以直接打开函数列表.相当方便

CTRL+P 在sublime里直接输入文件名可以打开对应的文件

我的一些sbulime 配置

lua用户配置

{

"autoReloadChanged": false,

"font_size": 11,

"update_check":false,

"ignoreChanged": false,

"ignored_packages":

[

"Vintage"

],

"save_on_focus_lost": true,

"file_exclude_patterns": ["tags","*.tags", "*.tags_sorted_by_file", "*.dll", "*.obj","*.o", "*.a", "*.lib", "*.so", "*.dylib", "*.ncb", "*.sdf", "*.suo", "*.pdb", "*.idb", ".DS_Store", "*.class", "*.psd", "*.db", "*.sublime-workspace"],

}


lua 用户按键

[

{ "keys": ["alt+-"], "command": "decrease_font_size" },

{ "keys": ["ctrl+-"], "command": "jump_back" },

{ "keys": ["ctrl+shift+-"], "command": "jump_forward" },

{"keys": ["alt+g"],"command": "navigate_to_definition"}

]


安装了ConvertToUTF8之后保存的时候会闪一下...这个问题找了很久.. 解决方案:preferences-->package settings --> Conver To UTF8 --> Setttings Default 在打开的文件里把 "lazy_reload":false 改为 true 就不会出现保存时闪一下的情况了.


在使用ctags前要先右键->CTags:RebuildTags,然后再运行下面cmd命令


ctags 增强对LUA支持,可以实现跳转到定义的函数

ctags --langdef=MYLUA --langmap=MYLUA:.lua -f ./.tags --regex-MYLUA="/^.*\s*function\s*(\w+):(\w+).*$/\2/f/" --regex-MYLUA="/^\s*(\w+)\s*=\s*[0-9]+.*$/\1/e/" --regex-MYLUA="/^.*\s*function\s*(\w+)\.(\w+).*$/\2/f/" --regex-MYLUA="/^.*\s*function\s*(\w+)\s*\(.*$/\1/f/" --regex-MYLUA="/^\s*(\w+)\s*=\s*\{.*$/\1/e/" --regex-MYLUA="/^\s*module\s+\"(\w+)\".*$/\1/m,module/" --regex-MYLUA="/^\s*module\s+\"[a-zA-Z0-9._]+\.(\w+)\".*$/\1/m,module/" --languages=MYLUA --excmd=number -R .


最近发现由于ctags对lua支持不友好, 很多lua的符号都不能跳转 表现在

1) ctags默认对lua的支持仅限于识别function, 不支持识别常量定义.

2) 如果通过CLASS:MEMBER_FUN(...)方式以及CLASS.MEMBER_FUN()方式定义的function, 所生成的tags是如下形式:

CLASS:MEMBER_FUN ...省略

CLASS.MEMBER_FUN ...省略

这样的tags文件无法直接通过MEMBER_FUN跳转过去. , 比如:通过:tselect MEMBER_FUN也无法找到对应的tag,

除非通过tselect /^.*MEMBER_FUN来找, 但是通过正则效率又太低. 而且会找到很多无关的匹配项.

所以, 本文研究了通过其他手段来生成lua的tags. 主要需要解决两个问题,

1) 支持能对lua中定义的常量/变量生成tags. 为了放置太多变量被索引, 限制变量的值必须是数字. 因为几乎所有的枚举值/常量的值都是数字.

2) 生成的tags去掉类名前缀, 比如:"CLASS:"以及"CLASS."前缀, 以便通过MEMBER_FUN能够直接跳转过去.

解决方法:

用ctags自定义的生成规则, 自己生成了lua文件的tags, 目前看来基本满足需求.

ctags --langdef=MYLUA --langmap=MYLUA:.lua --regex-MYLUA="/^.*\s*function\s*(\w+):(\w+).*$/\2/f/" --regex-MYLUA="/^\s*(\w+)\s*=\s*[0-9]+.*$/\1/e/" --regex-MYLUA="/^.*\s*function\s*(\w+)\.(\w+).*$/\2/f/" --regex-MYLUA="/^.*\s*function\s*(\w+)\s*\(.*$/\1/f/" --regex-MYLUA="/^\s*(\w+)\s*=\s*\{.*$/\1/e/" --regex-MYLUA="/^\s*module\s+\"(\w+)\".*$/\1/m,module/" --regex-MYLUA="/^\s*module\s+\"[a-zA-Z0-9._]+\.(\w+)\".*$/\1/m,module/" --languages=MYLUA --excmd=number -R .


自己加了一些规则可以支持 self._memeber = nil DEFINE_ERR = -122 这种情况,把下面的代码直接拷到.cmd文件中即可

E:

cd E:\...path...\script

ctags --langdef=MYLUA --langmap=MYLUA:.lua -f ./.tags --regex-MYLUA="/^.*\s*function\s*(\w+):(\w+).*$/\2/f/" --regex-MYLUA="/^\s*self\.(\w+)\s*=\s*(\w+)\s*.*$/\1/e/" --regex-MYLUA="/^\s*self\.(\w+)\s*=\s*\{\}\s*.*$/\1/e/" --regex-MYLUA="/^\s*(\w+)\s*=\s*(\w+)\.getInstance\(\).*$/\1/e/" --regex-MYLUA="/^\s*(\w+)\s*=\s*[0-9]+.*$/\1/e/" --regex-MYLUA="/^\s*(\w+)\s*=\s*-[0-9]+.*$/\1/e/" --regex-MYLUA="/^.*\s*function\s*(\w+)\.(\w+).*$/\2/f/" --regex-MYLUA="/^.*\s*function\s*(\w+)\s*\(.*$/\1/f/" --regex-MYLUA="/^\s*(\w+)\s*=\s*\{.*$/\1/e/" --regex-MYLUA="/^\s*module\s+\"(\w+)\".*$/\1/m,module/" --regex-MYLUA="/^\s*module\s+\"[a-zA-Z0-9._]+\.(\w+)\".*$/\1/m,module/" --languages=MYLUA --excmd=number -R .

分析一下这一行 --regex-MYLUA="/^\s*self\.(\w+)\s*=\s*(\w+)\s*.*$/\1/e/" .(\w+)对应后面的\1 意思是提取第一个匹配到的词,\s* 意思是任意的空白字符,\. 点号, \w+ 任意词组, .* 任意0个或多个非换行字符

增加 -f 选项用于指定生成的tags文件的路径和文件名

下面是正则的一些说明:

常用元字符

. 匹配除换行符以外的任意字符

\w 匹配字母或数字或下划线

\s 匹配任意的空白符

\d 匹配数字

\b 匹配单词的开始或结束

^ 匹配字符串的开始(有时指一行开始)

$ 匹配字符串的结束(有时指一行结束)

常用限定符

* 重复零次或更多次

+ 重复一次或更多次

? 重复零次或一次

{n} 重复n次

{n,} 重复n次或更多次

{n,m} 重复n到m次


常用反义词

\W 匹配任意不是字母,数字,下划线,汉字的字符

\S 匹配任意不是空白符的字符

\D 匹配任意非数字的字符

\B 匹配不是单词开头或结束的位置

[^x] 匹配除了x以外的任意字符

[^aeiou] 匹配除了aeiou这几个字母以外的任意字符


执行方法:打开CMD窗口,进入脚本的最上层目录,输入以上命令,然后回车就会生成ctags符号

关于ctags自定义语言的tags生成器的规则网上可以找到, 参考如下文章:

http://www.cnblogs.com/jianyungsun/archive/2011/01/20/1940262.html

http://helloxchen.itpub.net/category/42725/66614

这里简单的说明一下

1) 上面的语句定义了一种新的语言MYLUA, 该语言支持的文件后缀为*.lua. 定义了几条从源文件生成tags的正则替换规则,

其中三条用来识别function,

两条用来识别常量.

两条用来识别module

ctags在处理时会扫描lua文件的每一行, 分别施加上面几条规则, 任意一条规则匹配上, 则把匹配结果加入的tags文件.

2) 正则语法默认采用perl 兼容的正则语法. 也就是等价于 grep -E, 或者 egrep

3) --excmd指示生成的tags文件的格式. number表示直接写入tag所在文件的行号, 跳转效率最好, 生成的tags文件也比较小.

但是当源文件给改动后, 行号就会不匹配. 可以改为 --excmd=pattern , 这样生成正则匹配的跳转点. 不受源文件修改的影响.

4)-R . 对当前目录以及递归子目录的所有lua文件生成tags

举例:

1.lua文件:

[plain] view plain copy

module "modules.submodule.mymodule1"

module "modules.mymodule2"

module "mymodule3"

OBJECT_IDS = {

XX=1,

YY = 2,

msg_login = 8001,

msg_login2 = 8001, -- logon

}


function hello()

return nil

end

function xxx.hello()

return nil

end

function xxx:hello()

return nil

end

[plain] view plain copy


!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/

!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/

!_TAG_PROGRAM_AUTHOR Darren Hiebert /dhiebert@users.sourceforge.net/

!_TAG_PROGRAM_NAME Exuberant Ctags //

!_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/

!_TAG_PROGRAM_VERSION 5.9~svn20110310 //

OBJECT_IDS 1.lua 4;" e

XX 1.lua 5;" e

YY 1.lua 6;" e

hello 1.lua 11;" f

hello 1.lua 14;" f

hello 1.lua 17;" f

msg_login 1.lua 7;" e

msg_login2 1.lua 8;" e

mymodule1 1.lua 1;" m

mymodule2 1.lua 2;" m

mymodule3 1.lua 3;" m

发布时间: 9年前Windows119人已围观返回回到顶端

很赞哦! (1)

文章评论

  • 请先说点什么
    热门评论
    118人参与,0条评论

站点信息

  • 建站时间:2016-04-01
  • 文章统计:728条
  • 文章评论:82条
  • QQ群二维码:扫描二维码,互相交流