开发工具 使用 ctags 增强 Ruby 项目的阅读和补全体验

loyaqua · 2020年08月13日 · 最后由 tinyfeng 回复于 2020年08月14日 · 1552 次阅读

ctags 能为多种编程语言的源代码生成 tags 缓存。

我用的是 ctags 的一个 alternative ,只能用于 ruby 源代码的 ripper-tags ,用法大致相同。

安装:

$ gem install ripper-tags

在 ruby 项目根目录下运行 ripper-tags -R 就能生成一个 tags 缓存,“-R” 显然是搜索子目录,默认适用于 vim 可用的格式,如果你用其他编辑器可能需要调整生成格式,选项 “-e” 生成 emacs 可用的格式。

一个在 rails 项目中生成 emacs 可用 ctags 缓存的示例:

$ ripper-tags -eR --exclude=.git --exclude=tmp --exclude=public --exclude=app/assets

接下来就能使用你自己编辑器支持的 ctags 插件和功能了,我用的是 emacs,默认支持 ctag ,我额外安装 counsel-etags 简单配置:

(use-package counsel-etags
  :ensure t
  :bind (("C-]" . counsel-etags-find-tag-at-point))
  :init
  (add-hook 'prog-mode-hook
        (lambda ()
          (add-hook 'after-save-hook
            'counsel-etags-virtual-update-tags 'append 'local)))
  :config
  (setq counsel-etags-update-interval 60)
  (push "build" counsel-etags-ignore-directories))

把光标移到代码的 tag 里按 “ctrl + ]” 搜索对应 tag:

如果你已经安装了补全插件 company,无需配置,company-etags 会自动识别你根目录下的 tags 文件增强补全功能。

有一些 gem,可以生成 gem 包的 tags,但是是在 gem 目录下生成的,在项目里有没有办法能跳转到 gem 包的定义里,类似 rubymine 这样的?

https://github.com/tpope/gem-ctags

tinyfeng 回复

跳转功能一般通过你编辑器的插件实现,我用 ripper-tags 因为最多人用,维护很积极,三个月前才更新。

loyaqua 回复

我就用的 ctag,vim 下 ctrl + ] 可以跳转

tinyfeng 回复

我懂你的意思了,你是想把所有 tag 缓存合并起来,可以参考这两篇文章 https://tbaggery.com/2011/08/08/effortless-ctags-with-git.html https://arjanvandergaag.nl/blog/combining-vim-and-ctags.html

gem-ctags 和 rbenv-ctags 都是调用系统的 ctags,而且我用 emacs ,还在摸索最佳实践。

loyaqua 回复

利用第二篇文章,做到了,非常感谢,很有用!

需要 登录 后方可回复, 如果你还没有账号请 注册新账号