开发工具 Rails.vim 高效使用指南

lyfi2003 · 2012年07月22日 · 最后由 beiwang 回复于 2016年04月05日 · 23954 次阅读

本文适用于 vim 的待进阶高手,这篇文章并不代表我是高手,只是切磋下互相学习下。如果你是刚听过 vim,建议转身走人。 rails.vim 是 vim 插件中极为强大的专门为 Rails 项目做开发的。熟悉运用后想必会远远超过所谓的 IDE,不信?跟我试试。

开始之前,推荐进行实战,在本文最后有一个配置,相信你已经配置好了。

跳转指令:

很明显,我们最常的需求就是在相关文件中跳来跳去,比如 controller 跳到 view, view 跳到 helper, 或者 unit test 中。 这个需求在 rails.vim 很好的被满足了。

假定你在 app/controllers/blogs_controller.rb,见下表:

Rview index.html.erb -> app/views/blogs/index.html.erb
Rhelper -> app/helpers/blogs_helper.rb

同理,Rcontroller, Rjavascript, Rstylesheet 这几个不用说了。 要是配合上 ctrl + 6 这个 vim 内置的跳回上一次编辑的文件(专业人士叫它缓冲区,我比较土,大家怎么容易理解怎么叫,如果ctrl+6不好用,估计被其他插件映射了,请参考最后的 vim 使用建议) 就很无敌了,一下子就超过 netbeans, eclipse 之流好几个数量级的切换速度了。(它们得用鼠标。。。)

别急,还有更快的方法,Rview 这个玩意还要带个参,虽然可以用 tab 键补全,还是有点不极速。。。 我们来看看gf这个最出彩的命令。

将光标放在 blogs_controller.rbdef index 上,按下 gf ,oh My God, 自动跳到 view 的 index 试试 ctrl+6 切回去吧。 别急,gf还有更多用:

下面 < 是光标指向的区域后,按下 gf 跳转的方向 ( * 是指光标位置,<是将跳转的文件,强大吧。。。) Pos*t.first < app/models/post.rb ~

has_many :c*omments < app/models/comment.rb ~

link_to 'Home', :controller => 'bl*og' < app/controllers/blog_controller.rb ~

<%= render 'sh*ared/sidebar' %> < app/views/shared/_sidebar.html.erb ~

<%= stylesheet_link_tag 'scaf*fold' %> < public/stylesheets/scaffold.css ~

class BlogController < Applica*tionController < app/controllers/application_controller.rb ~

class ApplicationController < ActionCont*roller::Base < .../action_controller/base.rb ~

fixtures :pos*ts < test/fixtures/posts.yml ~

layout :pri*nt < app/views/layouts/print.html.erb ~

<%= link_to "New", new_comme*nt_path %> < app/controllers/comments_controller.rb (jumps to def new) ~

还有还有,虽然简化到极速了,但有时候还是要使用上面的 Rxx 系列跳转指令,还有更方便的吗,比如模糊查。。(source Insight 这货这个能力很强,知道吧) 当然也有,看:

Rfind 指令,你试下就会明白了,搜索 controllers, views, unittest 或 spec 里面的文件进行匹配和跳转(注意必须首字母匹配然后是按 tab 找),这个偶尔会用用,不是太好用了啊。

A 指令与 R 指令,这两个小兄弟是很好用的了,与 Rxx 系列类似,A 总是往 unittest 里面跳,R 会跳相关的,比如在 controller 里,转到 view 中,这里有一个 rails.vim 自带帮助的跳转列表,看看就好了:

* Current file Alternate file Related file
* model unit test schema definition
* controller (in method) functional test template (view)
* template (view) functional test controller (jump to method)
* migration previous migration next migration
* config/database.yml config/routes.rb config/environments/*.rb

上面这些已经可以满足大部分需求了,哦,还有,我们经常要编辑route.rb,有时候也会编辑 config/*里的东西怎么办?

Rails.vim 也有一些可以满足,route.rb直接使用 Rinitializer 就可以了(常 用)。Rinitializer 带参就可以编辑 config/initializer/xxx的东西了。 还有一些,如 RlibRlayout, RfunctionaltestRenvironment ,不用记了,不常用的可以忘了,常用的用两次就记下了。

建议你除了Rails.vim,再安装一个fuzzfinder.vim这个插件,在 vim 中映射 map <c-t> :FufCoverageFile!<CR> 之后重启 vim 后使用 ctrl+t 打开一个模糊搜索框了,这下爽了吧。

到这,关于rails.vim跳转的就基本介绍完了。很简单,很易用,很强大。

编辑或新建文件:

还有一类操作是直接找到要编辑的文件,或者新建一个文件。(我们可不想傻瓜似的重新开一个终端吧,这种影响效率的操作是作为 Geek 的我们无法接受的事情) 看招: Redit: 相对于 Rails 项目根目录进行编辑,如 Redit config/config.ru。嗯,不错吧。 当然还有, Rcd 可以切换当前工作目录,这样方便 Redit 的连续操作,你以为 Redit 就这点用就错了,还有新建,试试这个: Redit config/my_config.rb: 嗯?新建了一个文件了,离开的时候 Save 就可以了。类似的,用Redit可以创建很多自定义文件。

还有一点补充,Rview 这个指令,如果你在后面的参数带上了 .html.erb,它会尝试帮你创建对应的空文件,很方便。(常 用)

不对不对,作者,我一般是自动运行 rails generate 生成的,你怎么告诉我这些玩意。。。

马上来,Rgenerate 指令对应于 rails 自带的生成命令,同理 Rdestroy 用来删除的。这个很常用,但与 rails 的对应,我不用多介绍了吧。

操作指令:

Rake: 用来执行一些自带的 rake 命令的。

Rgenerate migration xx 用来生成指定的迁移文件

Rake!: 这种带!号可以将输出带回来,新开一个窗口,叫做 QuickFix

为什么这个地方的命令我放后面呢?我的建议是,如果是涉及独立的命令操作时,使用另一个终端处理,像我,使用 Guard+spork 做单元测试,爽死了。再开一个终端 thin start 或 rails s 这样足够。

小特性: 当然不用说,rails.vim 已经默认了很好看的语法高亮,你也可定制,这个不是本文的话题,你是 DIY 狂人的自己研究吧。 提供的一个 ctrl + x + ctrl + u(先按 ctrl+x 再按 ctrl+u) 补全了许多许多 rails 内置的方法,如 time_ago_in_words 。用好这个,老板再也不用担心我拼写 E 文错误的 2B 行为了。

小片断补全,嗯,有,快捷键是 ctrl+] 再加上要补全的内容,使用 Rabbr 可以看看,当前支持哪些。(这个功能有些 2,不如再装一个 snipmate 来玩,不过还算 OK)

其他:

还有 Rextract 这个玩意,可以帮你将 view 中冗余的代码转到 partial 里。 另外,还有一些整合的东西,如果你装了 NERTree 了,使用 Rtree 就可以打开树列表,有些用。(不过如果你足够高明的话,会使用 F8 来映射 打开树吧。嗯。你做了说明果然是 Geek);

最后,一般 Rails 开发,我总结一下使用 vim 时除了 rails.vim 还会用哪些插件,有兴趣你可以试试:

  1. fuzzyfinder 或者 command + T(推荐前者)
  2. l9 配合 fuzzfinder 用的。
  3. zencoding.vim 这玩意好啊,用了它写 html 代码就像写这篇文字一样轻松。
  4. NERD_tree.vim 显示树的,一般人都需要吧,我虽然装了,但基本不装,除了 review 代码外。。。
  5. NERD_commenter.vim 这个可以用来快速注释代码或反注释代码。也推荐使用tComment 来注释,更接近原生的 vim 操作。

再最后(我靠,你这作者,还有个再最后。。。),我想对 vim 的使用者说几点最佳实践:

不要过多映射单键

什么 F10,F11,ctrl +xx 的都少一些。你最终会发现,多使用 26 个字母键,你的效益才是最好的。

不要过多装插件,除非它符合你的风格。

插件都是在特定的领域里进行的改进,不要轻易安装任何一款你并不了解的插件。

多使用 vim 默认的快捷键

实际上 ctrl + x + ctrl +f 就可以补全文件名。还有除了i进入插入模式外,你应该还知道,a 是向后插入, s 是删除当前光标的字母并进入插入模式 (如果你试了不好用,说明你的插件装过头了)。这个s也许就能帮你少打很多 ESC,不是么?还有比如 C ,删除当前行后面的字符,马上进入插入模式,这个也是很好用的。以及 @5long 留言中提到的 Scc 删除当前行并插入。 m + 字母,将当前行打一个标记,下次就可以直接使用 ' + 字母(L 后面的字符) 回到这里了。

尽量少用 tab 而多用 buffer

是的,你不需要多 tab 操作,bn 与 bp 足够你用了,不行的话还有lsb x 。这个足够你的多文件编辑了。

符合 vim 的设计哲学,你的效率才是最高的。最最后,你可以参考一下我的 vim 配置(很简洁):

https://github.com/windy/ruby-vimrc

推荐这几天看到的很适合分享 vim 知识的视频站: http://happycasts.net/ 这里你可以学到不少技巧

如果你发现此文对你有用,对我有更多兴趣,欢迎访问和订阅我的博客: http://yafeilee.me/

附:修复 gf 在 rails3.1 以后 view 跳转 public 的 bug:

rails.vim gf跳转问题,fix:

 autoload/rails.vim:  1952:  将public改为 app/assets/stylesheets
(下同)
1958: app/assets/javascripts/\1'),'/defaults>','/application')

很强大,收藏

@dexterdeng 有功夫一定要实战一下,反复几次就会高效起来~

3 楼 已删除

把标识标题的 #### 后面加个空格吧 - - 有些 Markdown Parser 比较宽松所以有时依然能正常显示。

以前没觉得 rails.vim 有什么大用,浏览文件一路 Command-T 了事 - - 经历了大一点的项目之后感觉还是有必要准备一些特定于 framework 的技巧。很感谢 LZ 按照使用经验挑常用的介绍~

注释/反注释代码我用的是 tComment. 它提供的gcgC 命令支持用 motion 来指定需要处理的文本范围。跟内置的 d 命令等用起来一个感觉。不妨试试。当然如果你习惯先进入 Visual Mode 选取代码然后再下命令,tComment 也是支持的。

再 nitpick 一个:C 命令的作用相当于 D 然后再按 A. 文中所描述的行为应该是 cc 或者 S.

@5long thx,C 的作用是写的不明确了。多谢纠正,已修正。

注释习惯了一种,所以就没过多要求了。有时候会自定义一些宏来。这里就不多说了。 我也推荐一下~

Thx~

Rails3.1 以后,我一直期待 gf 这个命令用在 <%= stylesheet_link_tag 'scaf*fold' %> 的时候,可以跳到 app/assets/ 下对应的文件,而不应该是 public

@HungYuHei 嗯,这是个问题,rails.vim(包括 github 上) 一直没有这方面的 fix. 有空研究下 gf 的实现 pull 一个 fix.

虽然也用这个插件,但是没有像楼主用的这么仔细,看来需要再阅读一遍 help 文档。

ctrl+6 是上一个文件吧,ctrl+o 是上一个地方。

#11 楼 @sevkctrl+6是上一个文件,再按是切换回来,所以很方便。两个单引号,在L键右二个的位置,也是返回上一个地方。不过一般并不是我想期望的,还是推荐使用 m x 来引用比较准确。

好文,收藏!结合 ctags,开发起来就是爽。

之前下载了 rails.vim 就没怎么用,看了这篇文章才知道这么方便的,不错不错!

匿名 #15 2012年07月24日

关注喜欢收藏

#12 楼 @lyfi2003 两个单引号可以按%来回切换。

@sevk 可能你的理解有误,我说的两个单引号是指在命令模式使用,会跳至上一次光标停留的行。 跟你这里% 的意思不大一样。仍然谢谢你的提示。

之前 @HungYuHei 提到的gf的跳转问题,我做了如下的 patch, 可以试试直接修改,随后会尝试推送一个 patch 过去。 附:修复 gf 在 rails3.1 以后 view 跳转 public 的 bug:

`rails.vim` gf跳转问题,fix:

 autoload/rails.vim:  1952:  将public改为 app/assets/stylesheets
(下同)
1958: app/assets/javascripts/\1'),'/defaults>','/application')

@lyfi2003 我用 vundle 装的这个,但是:Rview 之类的命令都用不了,报的是 not an editor command 的错误,:R tab 补全也没没看上述命令,请问这是什么原因呢?

#20 楼 @dfang 先去打开一个 rails 项的一个文件,如 :e Gemfile,再使用这里提到的命令。

@lyfi2003 呵呵 我 看过文档,知道这个工具是 file related 的,我有打开一个 controller 文件的 :R tab 还是提示不出这些相关的命令

@lyfi2003 汗,搞定了,原来装的版本不对,我之前还给@zlx_star回复过 帖子在这里:http://ruby-china.org/topics/4045

#22 楼 @dfang :help rails 看是否安装成功,否则你再尝试重新安装。

@lyfi2003 现在搞好了,之前也安装好了,.vim 目录有 rails.vim 那个目录,我觉都还是版本的问题

fugitive 也非常强大,我对他的依赖性仅差于 rails.vim

竟然还有这么多妙用。

太棒了,特别是 buffer 这块

好文,相见恨晚~

讲得挺不错,看 github 上的介绍,很晦涩,看 help 文档,也看的人头疼。

33 楼 已删除

我装的 rails.vim 怎么没有 Redit 这个命令啊,求解!

#34 楼 @chen_rb 新版本已经去掉这个命令啦,可以直接用 R 来代替。

#35 楼 @lyfi2003 嗯,好像是的。但创建文件的时候需要带路径

这篇文章真好

确实强大,最近用 vim

vim tmux zsh 凑齐拿走 好文 值得推荐

lyfi2003 (纯干活) Rails 高效开发工具 vim 指南 提及了此话题。 07月28日 14:04
vincent178 好用的 Vim 提及了此话题。 12月20日 22:17
wsdjeg 讨论在 Vim 里开发 Ruby 时,Vim 插件的选择 提及了此话题。 09月03日 14:08
需要 登录 后方可回复, 如果你还没有账号请 注册新账号