Vim配置钢铁雄心文档大纲

2023年9月20日

Tagbar (https://majutsushi.github.io/tagbar/)是一个Vim插件,可以在Vim里显示代码大纲。它其实不限定自己只能显示“代码”大纲,它可以显示任何大纲式的内容。所以它可以显示XML大纲,也能显示钢铁雄心mod文件的大纲。

Tagbar仅仅负责显示大纲,而不负责生成。生成大纲的工作由Exuberant ctags (http://ctags.sourceforge.net)或Universal Ctags(http://docs.ctags.io)担任。Universal Ctags是Exuberant ctags的后继,所以推荐使用。

安装Tagbar和Universal Ctags,确保在Vim里运行:Tagbar可以显示c++、Java、C#等文件的大纲,然后再配置钢铁雄心mod文件。

既然Tagbar仅仅负责显示,我们要先让Universal Ctags学会钢铁雄心文件结构。我用以下文件为例。

buildings = {

	# show_on_map:
	#    if provincial = yes, then show_on_map = X is amount per each province
	#    if provincial = no, then show_on_map = X is amount per state


	infrastructure = {
		base_cost = 3000
		icon_frame = 3
		infrastructure = yes
		max_level = 10
		value = 1
	}

	arms_factory = {
		show_on_map = 6
		base_cost = 7200
		base_cost_conversion = 4000
		military_production = 1
		icon_frame = 2
		max_level = 20
		shares_slots = yes
		value = 8
		infrastructure_construction_effect = yes
	}
}

我要把buildings、infrastructure、arms_factory等作为大纲标题显示出来。

Universal Ctags的帮助文档写得比较面向使用过Exuberant ctags的老用户,不太有关于ctags的基础知识,所以还得去看Exuberant ctags的帮助文档。

按照How to Add Support for a New Language to Exuberant Ctags (http://ctags.sourceforge.net/EXTENDING.html),在%HOME%\.ctags.d路径下创建一个扩展名.ctags的文件。HOME是环境变量。我把该文件命名为hoi.ctags,比较好辨认。文件里写

--langdef=hoi
--langmap=hoi:.txt
--regex-hoi=/^([a-zA-Z0-9_]+)\s*\=//s,section/

第一行定义语言名称,第二行指定语言映射,即hoi语言的文件扩展名是.txt。这个定义过于广泛,但还算能用。第三行使用正则表达式提取标签(tag)。

/^([a-zA-Z0-9_]+)\s*\=//s,section/
^([a-zA-Z0-9_]+)\s*\=

匹配原文件,\1把匹配组提取为标签,s,section指定该标签的类型——短名称和长名称。没有预设的标签类型,都是自定义的。

最后在命令行里运行

B:\>ctags -f - --format=2 --excmd=pattern --extra= --fields=nksaSmt  00_buildings.txt
ctags: Warning: --extra option is obsolete; use --extras instead
buildings       00_buildings.txt        /^buildings = {$/;"     s       line:10

确保能输出提取到的标签,Universal Ctags就算配置完成了。

接着配置Tagbar。添加以下代码到_vimrc。

autocmd BufNewFile,BufRead */Hearts\sof\sIron*.txt set ft=hoi

let g:tagbar_type_hoi = {
  \ 'ctagstype': 'hoi',
  \ 'kinds': [ 's:section' ]
\}

第一句是说在Hearts of Iron文件夹里的txt文件的语言都是hoi。尽管Universal Ctags里我们制定了语言映射,Vim仍需要再次指定映射。其中原因尚不明确。

第二段是tagbar设置,指定对于hoi语言,要显示section。

最后打开钢铁雄心文件,调用:Tagbar,确认大纲显示成功。