在之前我写的<<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文件中.

最新文章

  1. javaWeb项目中Web.xml的基本配置
  2. No Spring WebApplicationInitializer types detected on classpath。启动时不报错,但是页面打不开。
  3. mysqlnd cannot connect to MySQL 4.1+
  4. MapGuide Maestro 5.1发布了
  5. 工欲善其事必先利其器——dreamweaver
  6. 获取登陆ip
  7. poj 2240(floyd)
  8. java图形化编程
  9. jquery实现radio按纽全不选和checkbox全选的实例
  10. jdbc框架 commons-dbutils+google guice+servlet 实现一个例子
  11. [Oracle EBS APIs]import Flow routing and DJ routing using BOM_RTG_PUB.PROCESS_RTG APIs
  12. 精选7款绚丽的HTML5和jQuery图片动画特效
  13. python numpy笔记:给matlab使用者
  14. Codeforces Round #350 (Div. 2)解题报告
  15. JAVA基础知识(2)--关键字static的使用
  16. 在Navicat 中给Mysql中的某字段添加前缀00
  17. JSON.stringify实战用法
  18. yii防止延迟用户多次点击按钮重复提交数据
  19. python时间模块time
  20. react native 打包Ignoring return value of function declared with warn_unused_result attribute

热门文章

  1. 单例模式解决RabbitMQ超出最大连接问题
  2. eclipse下载egit插件,实现代码git同步问题
  3. laravel5.5更新到laravel5.7
  4. 使用JSONObject 深度序列化和反序列化
  5. android 程序猿跳槽须要注意哪些?
  6. BestCoder Round #61 (div.2) B.Game 细节题
  7. 一次次迭代 百度语音生成 api 字幕 语音的同步性 关键
  8. Android EditText默认不获取焦点
  9. Linux gadget驱动分析2------设备识别过程
  10. codeforce1070 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred) 题解