在之前我写的<<vim之tags>>中最后提到将vim和tags成和更新的全部集中到一个<f12>键上来. 这在实践中证明是相当方便的, 不过依然村庄几个问题如下:

1->由于需要顺序生成ctags和cscope的tag,之前的映射使用执行每条命令之后增加一个<cr>的方式来继续向下执行, 这样在按下<f12>之后终端会立刻出现的三个"请按Enter键继续的字样", 当然这个其实不算是一个真正的问题, 只是每次看这个它们闪过还是会感到晃眼.

2->当vim中有超过一个buffer的时候按下f12更新tags结束的时候当前编辑的位置会莫名其妙的跳转一个位置, 这个时候需要使用ctrl+o才能回到更新之前的位置.这个个问题就有一点小蛋疼了, 虽然也只是每次更新之后多按一个ctrl+o就能解决的问题, 可是想想明明不须要的动作偏偏每次都要去做总觉得有点爷们上小号还脱裤子的感觉.

3->在vim中直接更新tags之后当前的的buffer加载的还是更新之前的tags, 也就是说, 如果不关闭再重新打开一次当前的buffer, vim还是不会法跳转到最新的tags标记位置.

这几个问题存在已经有一段时间了, 一直没怎么去想解决的办法, 今天晚上突然就想起来了vim可直接调用的shell的脚本, 如果将ctags和cscope的命令写在一个脚本里直接调用效果会不会好一点呢? 晚上没事就实践了一下发现效果果然会好一些, 首先是第一个问题中的三个"请按Enter键继续"变成了一个, 并且不须要任何额外的<cr>映射vim就能正常的返回, 其次是简单的测试了一下似乎更新之后光标位置变动的问题没有了, 第三个问题现在是通过在映射的最后加上一个:edit %命令来让vim重启加载当前缓冲区来解决. 综合一下似乎这些小问题都有所解决. 下面是最新相关配置的收集, 如果存在不太明白的地方请参考之前的<<vim之tags>>:

nmap <f12> <esc>:call Go_top()<cr>:!tag<cr>:call Go_curr()<cr>:edit %<cr>
imap <f12> <esc>:call Go_top()<cr>:!tag<cr>:call Go_curr()<cr>:edit %<cr>

在~/.vim文件夹中添加bin文件夹,在~/.vim/bin文件夹下建立tag文件并写入如下内容:

#!/bin/sh
ctags -R --fields=+lS $PWD
cscope -Rbkq

保存后为其添加可执行权限:

sudo chmod 771 tag

在环境变量中添加~/.vim/bin目录, 关于环境变量的添加有很多种方式, 具体过程百度一下.这里之所以在~/.vim目录下额外建立一个bin目录是为了将vim相关的各种执行脚本集中在vim在配置目录中以方便vim相关配置的备份和恢复.

Go_top函数是在寻找项目根目录, 你需要在项目的根目录建立一个空的TOP文件, 下面的的vim函数是Go_top利用TOP文件标识寻找根目的简单实现:

"定位到项目根目录
func! Go_top()
   wall
   let g:Curr_dir=getcwd()
   let i = 1
   while i < 10
      if filereadable("TOP")
         return
      else
         cd ..
         let i += 1
      endif
   endwhile
   "不要在没有找到TOP标识的时候在这里返回到之前的工作目录, 如果没有TOP文件, vim此时会cd 到 文件系统的根目录, 在根目录下执行ctags -R等命令会失败,这样刚好实现了没有TOP标志时不执行生成tags命令的目的, 由于当前目录已经通过g:Curr_dir这个全局变量保存起来, 因为我们可以在tags命令执行失败之后在调用Go_curr来回到之前的工作目录.
endfunc

Go_curr函数, 简单实现如下:

"返回到当前目录
func! Go_curr()
   exec 'cd'.g:Curr_dir
endfunc

vim中自定义的函数可以放在任何vim的运行时目录下的.vim结尾的文件中, vim运行时会把它们当作脚本读取, 当然, 这些这些函数也可以写在.vimrc文件中.

vim之<F12> 一键生成tags的一些小优化的更多相关文章

  1. 一键生成APP官网

    只需要输入苹果下载地址,安卓市场下载地址,或者内测下载地址,就能一键生成APP的官网,方便在网上推广. 好推APP官网 www.hotapp.cn/app

  2. Ant搭建 一键生成APP技术 平台

    1.博客概要 本文详细介绍了当今流行的一键生成APP技术.介绍了这种设计思想的来源,介绍了国内外的研究背景,并介绍了这个技术体系中的一些实现细节,欢迎各路大神们多提意见.一键生成技术,说的通俗点就是, ...

  3. 使用sencha cmd 一键生成你的应用程序代码

    一键生成你的应用程序代码: ------------------------------------------------------------ 我们的出发点就是使用命令来产生一个应用程序,执行以 ...

  4. ctags对部分目录生成tags

    最近在研究Tiny6410上的uboot移植,看uboot源码时,生成tags文件用的是最粗暴的方法:“ctags -R *”,由于某些函数在各个平台下都有实现,导致在用“g+]”跳转到该函数的定义时 ...

  5. 一键生成HTML4和WAP站

    前两天在QQ空间上提到微信上线风铃时,把其中的HTML5错打成HTML4,结果发现很多媒体微博照着转载,依旧说成 "一键生成HTML4和WAP站",这就是转载不注明出处.不署名.不 ...

  6. Automator一键生成所需的iOS 图片icon

    iOS到8了, 终于受不了它的各种尺寸的icon了. 写一个Finder服务来一键生成吧. 拖放几次再重复, 无技术含量, 但很有用. // 存放目录    ~/资源库/Services/

  7. PHP通过(PDO)Mysql表字段一键生成创建sqlite的SQL

    首发于:http://www.zzzzy.com/201406053158.html /** * Mysql表字段一键生成创建sqlite的SQL 2 * @author: Skiychan < ...

  8. 一键生成JNI头文件方法二

    经常使用java的同学一定都接触过JNI(Java Native Interface)吧.JNI为我们提供了java<---->C/C++之间的接口,使得我们可以在java中调用C程序,以 ...

  9. HubbleDotNet 最新绿色版,服务端免安装,基于eaglet 最后V1.2.8.9版本开发,bug修正,支持一键生成同步表

    HubbleDotNet 是一个基于.net framework 的开源免费的全文搜索数据库组件.开源协议是 Apache 2.0.HubbleDotNet提供了基于SQL的全文检索接口,使用者只需会 ...

随机推荐

  1. [bzoj 2705][SDOI2012]Longge的问题(数学)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2705 分析: 设k为n的因数 设f[k]为gcd(x,n)==k的x的个数,容易知道a ...

  2. [bzoj 1025][SCOI2009]游戏(DP)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1025 分析:首先这个问题等价于A1+A2+……Ak=n,求lcm(A1,A2,……,Ak)的种 ...

  3. Oracle创建表空间、用户名、密码步骤教程

    第一步,以最高级别 SYSDBA 身份登录数据库 cmd 进入命令行 登录方式一: C:\Documents and Settings\Administrator>sqlplus sys/sys ...

  4. [转]《MEF程序设计指南》博文汇总

    在MEF之前,人们已经提出了许多依赖注入框架来解决应用的扩展性问题,比如OSGI 实现以Spring 等等.在 Microsoft 的平台上,.NET Framework 自身内部包含组件模型和 Sy ...

  5. Solid Edge如何快速装配,如何截取组装关系式

    我们点击装配体的任意零件,下方将显示他的装配关系,由于一些零件的装配关系是固定的,比如螺栓,肯定要做一个面贴和,再做一个同轴,所以我们可以保存这些固有的步骤,不用再每次挨个点击这些装配关系.   点击 ...

  6. map, string 强大的STL

    hdu 1247  Hat's Words Input Standard input consists of a number of lowercase words, one per line, in ...

  7. Codeforces 196 D. The Next Good String

    D. The Next Good String time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  8. Codeforces 91C Ski Base 加边求欧拉回路数量

    题目链接:点击打开链接 题意: 给出n个点m条无向边的图 開始图里没有边.每次加一条边,然后输出图里欧拉回路的条数. 思路: We will count the number of ski bases ...

  9. linux常用命令---持续添加中...

    1.cp -r  源文件夹  目的文件夹   // -r 可递归所有子目录及文件 2.grep -r 查找内容 ./*    //递归查找当前目录下所有文件指定内容 3. 查看系统运行时间 who - ...

  10. System.load 与 System.loadLibrary 的区别

    相同点 它们都可以用来装载库文件,不论是JNI库文件还是非JNI库文件. 在任何本地方法被调用之前必须先用这个两个方法之一把相应的JNI库文件装载. System.load System.load 参 ...