Geany是个比较轻量级的代码编辑器,在一些不怎么需要编辑的代码上,我比较常用它来浏览代码。不过它的 跳转到标记定义(Go to tag definition) 功能有点奇怪,一开始死活不知道怎么用,所以值得拿出来说一下。
其实Geany内置了分析代码文件的能力(记得是移植了ctags的代码进来),当打开代码文件的时候,能够分析文件中的tags(包括类、函数和变量)并在 标记(Symbols)
侧边栏列出来, 也能够在文件内或者已经打开的文件间进行跳转(go to tag definition),但不能跳转到未打开的文件 —— Geany称这类tags为workspace tags
P.S. Geany还有一类Global tags,按不同编程语言提供(比如 /usr/share/geany/php.tags, /usr/share/geany/python.tags,另外网站上还提供了一些额外的tags包),文件内容里不包含符号来源信息,所以只能用于自动补全和显示calltip,跟"跳转到标记定义"功能无关)。
如何能够实现跳转到未打开的文件呢?在网上搜到如下信息:
This feature (navigating through the source code) has limitations when used alone in Geany. It can only look for definitions in the files being opened. So, to enable it to look for definitions in other closed files in the same folder, you must use this feature inside a certain project created by Geany's built-in Project feature, with the File patterns defined, and combine it with other project plugins that support Generate file list on load.
-- Top Geany features you need to know about
简单地说,方法是: 得定义工程,并启用GProject插件,在工程配置里配置好 source files
文件名匹配模式(比如*.cpp *.c *.h
)并勾选上GProject页面的Generate tags for all project files
。然后就可以使用了。
虽然用上面的方法已经可以跳转了,但有几个缺点:
于是,在今年年初,Geany开发组就单独做了一个GeanyCtags插件。不过没想到快半年过去了,Geany还是没发布一个新版本,所以要用的朋友就只能自己编译。
推荐用Geany自带的 waf
来编译(至少在Windows下只能用这个。虽然 http://www.geany.org/Support/BuildingOnWin32 这里说的是用 mingw32-make -f makefile.win32
, 但 geany-plugins 的daily snapshot 包并没有提供 makefile.win32
):
wget -c http://download.geany.org/geany_plugins_git.tar.gz
tar zxf geany_plugins_git.tar.gz
cd geany_plugins_git
./waf configure --enable-plugins=geanyctags,automark
./waf build
sudo make install
然后在Geany的插件管理里面启用 GeanyCtags
插件就可以了。
P.S. 一个好消息是, 这个插件可以在Geany 1.24下编译成功,这样你可以在Geany 1.24里面使用 。但其它一些新插件不一定能行,因为可能用到了Geany主程序的新变动,比如
ProjectOrganizer
插件。
0.. 当然,首先得安装Exuberant Ctags
1.. 在项目属性中确保 File patterns
已经设置(比如设为 *.rb *.rake
)
2.. 点击菜单 Project -> Generate tags
生成tags文件,Geany会在底部的信息栏显示生成tags文件的命令和结果
3.. 在符号(函数名、变量名)上点击右键,可以看到顶部新增了两个菜单项目: Find Tag Definition (GeanyCtags)
和 Find Tag Declartion (GeanyCtags)
4.. 主菜单里面的 Project -> Find tag
可以用来跳转到任意tag,自己输入就是了
find . -not -path '/.' ( -name ".c" -o -name ".h" ) | ctags --totals --fields=fKsSt --extra=-fq --c-kinds=+p --sort=foldcase --excmd=number -L - -f /users/bamanzi/farm/geany_plugins_git/geany_plugins.tags (in directory: /users/bamanzi/farm/geany_plugins_git)
409 files, 117412 lines (3410 kB) scanned in 0.2 seconds (17947 kB/s)
10250 tags added to tag file
10250 tags sorted in 0.01 seconds
tags
,而是 prjname.tags
。