-
Notifications
You must be signed in to change notification settings - Fork 0
/
vim自动更新tag.html
207 lines (192 loc) · 14.3 KB
/
vim自动更新tag.html
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
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="littlewhite" />
<meta name="copyright" content="littlewhite" />
<meta property="og:type" content="article" />
<meta name="twitter:card" content="summary">
<meta name="keywords" content="vim, Skill, " />
<meta property="og:title" content="vim自动更新tag "/>
<meta property="og:url" content="https://chukeer.github.io/vim自动更新tag.html" />
<meta property="og:description" content="用vim浏览C/C++代码时可以用ctags生成tag文件,这样可以很方便跳转到函数定义的地方,这个功能几乎所有的图形界面编辑器都有,比如VS,source insight等等,但是vim的tags文件是静态的,也就是说如果我们在源代码里新增了一些函数,原来的tags是不会自动更新的,我们也无法跳转到新增的函数定义处,这个问题怎么怎么办呢 我在网上搜索了很多地方,普遍给的方案就是将ctags命令映射到一个快捷键,这样只需要按一下快捷键就会生成新的tags文件,但这样有几个不方便的地方 每次tags文件都是全量生成,如果工程很大,生成tags文件可能需要十多秒,而运行命令的过程中是不能编辑文件的,也不可能每次修改文件都去更新tags vim下运行ctags命令其实是在命令模式下输入!ctags -R .,它会在vim的工作目录下生成tags文件,而如果你当前工作目录并不是你想要生成tags的目录,还得切换目录 总之是,想要自动更新tags,没有这么简单的事儿! 但是VS和source insight就可以做到,我们秉着凡是其它编辑器能实现的功能vim都能实现的原则来分析下问题的实质,其实不管是VS还是source insight它们都需要建立工程,然后将源代码导入工程,我们可以猜想到这些编辑器会对工程里的源文件建立索引,这样就可以实现各种跳转功能,当有代码更新或是新增源文件时,编辑器自然也可以检测到,这时它暗地里对源文件重新建立索引,我们就可以对新增的函数进行跳转。既然编辑器可以暗地里做很多事,我们为何不也这样呢,计算机的处理器大多数时候都是空闲的,不用白不用 试想我们在Linux下有一堆源代码,我们需要经常编辑和阅读这些代码,它的根目录结构应该是这样的 ..." />
<meta property="og:site_name" content="楚客" />
<meta property="og:article:author" content="littlewhite" />
<meta property="og:article:published_time" content="2015-04-10T00:00:00+08:00" />
<meta property="" content="2015-04-10T00:00:00+08:00" />
<meta name="twitter:title" content="vim自动更新tag ">
<meta name="twitter:description" content="用vim浏览C/C++代码时可以用ctags生成tag文件,这样可以很方便跳转到函数定义的地方,这个功能几乎所有的图形界面编辑器都有,比如VS,source insight等等,但是vim的tags文件是静态的,也就是说如果我们在源代码里新增了一些函数,原来的tags是不会自动更新的,我们也无法跳转到新增的函数定义处,这个问题怎么怎么办呢 我在网上搜索了很多地方,普遍给的方案就是将ctags命令映射到一个快捷键,这样只需要按一下快捷键就会生成新的tags文件,但这样有几个不方便的地方 每次tags文件都是全量生成,如果工程很大,生成tags文件可能需要十多秒,而运行命令的过程中是不能编辑文件的,也不可能每次修改文件都去更新tags vim下运行ctags命令其实是在命令模式下输入!ctags -R .,它会在vim的工作目录下生成tags文件,而如果你当前工作目录并不是你想要生成tags的目录,还得切换目录 总之是,想要自动更新tags,没有这么简单的事儿! 但是VS和source insight就可以做到,我们秉着凡是其它编辑器能实现的功能vim都能实现的原则来分析下问题的实质,其实不管是VS还是source insight它们都需要建立工程,然后将源代码导入工程,我们可以猜想到这些编辑器会对工程里的源文件建立索引,这样就可以实现各种跳转功能,当有代码更新或是新增源文件时,编辑器自然也可以检测到,这时它暗地里对源文件重新建立索引,我们就可以对新增的函数进行跳转。既然编辑器可以暗地里做很多事,我们为何不也这样呢,计算机的处理器大多数时候都是空闲的,不用白不用 试想我们在Linux下有一堆源代码,我们需要经常编辑和阅读这些代码,它的根目录结构应该是这样的 ...">
<title>vim自动更新tag · 楚客
</title>
<!--
<link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet">
<link href="//netdna.bootstrapcdn.com/font-awesome/4.0.1/css/font-awesome.css" rel="stylesheet">
--!>
<link href="https://chukeer.github.io/theme/css/bootstrap-combined.min.css" rel="stylesheet">
<link href="https://chukeer.github.io/theme/css/font-awesome.css" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="https://chukeer.github.io/theme/css/pygments.css" media="screen">
<link rel="stylesheet" type="text/css" href="https://chukeer.github.io/theme/tipuesearch/tipuesearch.css" media="screen">
<link rel="stylesheet" type="text/css" href="https://chukeer.github.io/theme/css/elegant.css" media="screen">
<link rel="stylesheet" type="text/css" href="https://chukeer.github.io/theme/css/custom.css" media="screen">
</head>
<body>
<div id="content-sans-footer">
<div class="navbar navbar-static-top">
<div class="navbar-inner">
<div class="container-fluid">
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</a>
<a class="brand" href="https://chukeer.github.io/"><span class=site-name>楚客</span></a>
<div class="nav-collapse collapse">
<ul class="nav pull-right top-menu">
<li ><a href="https://chukeer.github.io">Home</a></li>
<li ><a href="https://chukeer.github.io/categories.html">Categories</a></li>
<li ><a href="https://chukeer.github.io/tags.html">Tags</a></li>
<li ><a href="https://chukeer.github.io/archives.html">Archives</a></li>
<li><form class="navbar-search" action="https://chukeer.github.io/search.html" onsubmit="return validateForm(this.elements['q'].value);"> <input type="text" class="search-query" placeholder="Search" name="q" id="tipue_search_input"></form></li>
</ul>
</div>
</div>
</div>
</div>
<div class="container-fluid">
<div class="row-fluid">
<div class="span1"></div>
<div class="span10">
<article>
<div class="row-fluid">
<header class="page-header span10 offset2">
<h1><a href="https://chukeer.github.io/vim自动更新tag.html"> vim自动更新tag </a></h1>
</header>
</div>
<div class="row-fluid">
<div class="span2 table-of-content">
<nav>
<h4>Contents</h4>
<div class="toc">
<ul></ul>
</div>
</nav>
</div>
<div class="span8 article-content">
<p>用vim浏览C/C++代码时可以用ctags生成tag文件,这样可以很方便跳转到函数定义的地方,这个功能几乎所有的图形界面编辑器都有,比如VS,source insight等等,但是vim的tags文件是静态的,也就是说如果我们在源代码里新增了一些函数,原来的tags是不会自动更新的,我们也无法跳转到新增的函数定义处,这个问题怎么怎么办呢</p>
<p>我在网上搜索了很多地方,普遍给的方案就是将ctags命令映射到一个快捷键,这样只需要按一下快捷键就会生成新的tags文件,但这样有几个不方便的地方</p>
<ol>
<li>每次tags文件都是全量生成,如果工程很大,生成tags文件可能需要十多秒,而运行命令的过程中是不能编辑文件的,也不可能每次修改文件都去更新tags</li>
<li>vim下运行ctags命令其实是在命令模式下输入<code>!ctags -R .</code>,它会在vim的工作目录下生成tags文件,而如果你当前工作目录并不是你想要生成tags的目录,还得切换目录</li>
</ol>
<p>总之是,想要自动更新tags,没有这么简单的事儿!</p>
<p>但是VS和source insight就可以做到,我们秉着凡是其它编辑器能实现的功能vim都能实现的原则来分析下问题的实质,其实不管是VS还是source insight它们都需要建立工程,然后将源代码导入工程,我们可以猜想到这些编辑器会对工程里的源文件建立索引,这样就可以实现各种跳转功能,当有代码更新或是新增源文件时,编辑器自然也可以检测到,这时它暗地里对源文件重新建立索引,我们就可以对新增的函数进行跳转。既然编辑器可以暗地里做很多事,我们为何不也这样呢,计算机的处理器大多数时候都是空闲的,不用白不用</p>
<p>试想我们在Linux下有一堆源代码,我们需要经常编辑和阅读这些代码,它的根目录结构应该是这样的</p>
<div class="highlight"><pre><span></span>├── auto_tags
├── build
├── common
├── include
├── libs
├── message
├── metadata
├── network
├── nodes
├── privacy
├── tags
└── tests
</pre></div>
<p>其中tags文件是对当前目录下的代码生产的tag,其它目录存放的则是你的源代码,这样当我们打开目录下的源代码时,vim就可以根据tags文件来定位变量的位置</p>
<p>这里的auto_tags目录存放的是自己实现的脚本,它的功能是自动检测当前目录下的源代码是否有更新,如果有,则生产新的tags文件并替换老的,auto_tags目录结构如下</p>
<div class="highlight"><pre><span></span>├── auto_tags.conf
├── auto_tags.sh
└── run_tags.sh
</pre></div>
<p>auto_tags.conf为配置文件,配置项如下</p>
<div class="highlight"><pre><span></span>CTAGS=/usr/bin/ctags
# 生成tags文件存放的目录
tags_dir=../
# 源代码所在目录
source_root=../
# 需要创建tags的目录名,注意只有目录名字,不是路径
source_dirs="common message nodes"
# 日志相关
max_log_size=10 # Unit: Mb
log_file="auto_tags.log"
</pre></div>
<p>将source_dirs变量替换为你需要建立tags的目录名称即可,注意需要用双引号包围,且只写目录名字,不需要添加<code>../</code></p>
<p>使用方式如下</p>
<div class="highlight"><pre><span></span> sh ./run_tags.sh start # 启动脚本
sh ./run_tags.sh stop # 停止脚本
</pre></div>
<p>核心脚本是auto_tags.sh,至于脚本是如何实现的就不贴出来了,毕竟这只是一个程序员自娱自乐实现的一个小小的功能,它并不完善但简单易用。github地址如下</p>
<div class="highlight"><pre><span></span>https://github.com/handy1989/vim/tree/master/auto_tags
</pre></div>
<hr/>
<aside>
<nav>
<ul class="articles-timeline">
<li class="previous-article">« <a href="https://chukeer.github.io/Mac OS X下快速复制文件路径.html" title="Previous: Mac OS X下快速复制文件路径">Mac OS X下快速复制文件路径</a></li>
<li class="next-article"><a href="https://chukeer.github.io/vim比较目录diff.html" title="Next: vim比较目录diff">vim比较目录diff</a> »</li>
</ul>
</nav>
</aside>
</div>
<section>
<div class="span2" style="float:right;font-size:0.9em;">
<table class="table">
<!-- <time pubdate="pubdate" datetime="2015-04-10T00:00:00+08:00"> 4 10, 2015</time> -->
<tr>
<td>Published</td>
<td><time pubdate="pubdate" datetime="2015-04-10T00:00:00+08:00">2015- 4-10</time></td>
</tr>
<tr>
<td>Category</td>
<td><a class="category-link" href="https://chukeer.github.io/categories.html#skill-ref">Skill</a></td>
</tr>
<tr>
<td>Tags</td>
<td>
<ul class="list-of-tags tags-in-article">
<li><a href="https://chukeer.github.io/tags.html#vim-ref">vim
<span>4</span>
</a></li>
</ul>
</td>
</tr>
</table>
</div>
</section>
</div>
</article>
</div>
<div class="span1"></div>
</div>
</div>
<div id="push"></div>
</div>
<footer>
<div id="footer">
<ul class="footer-content">
<li class="elegant-power">Powered by <a href="http://getpelican.com/" title="Pelican Home Page">Pelican</a>. Theme: <a href="http://oncrashreboot.com/pelican-elegant" title="Theme Elegant Home Page">Elegant</a> by <a href="http://oncrashreboot.com" title="Talha Mansoor Home Page">Talha Mansoor</a></li>
</ul>
</div>
</footer> <!--
<script src="http://code.jquery.com/jquery.min.js"></script>
<script src="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
-->
<script src="https://chukeer.github.io/theme/js/jquery.min.js"></script>
<script src="https://chukeer.github.io/theme/js/bootstrap.min.js"></script>
<script>
function validateForm(query)
{
return (query.length > 0);
}
</script>
<script>
$("div.article-content table").addClass("table table-hover");
</script>
</body>
<!-- Theme: Elegant built for Pelican
License : http://oncrashreboot.com/pelican-elegant -->
</html>