刚刚抛弃世界上最强大的语言转投 Ruby on Rails 怀抱。刚开始被被 Rails 的 View, Model, Controller, UnitTest 文件之间跳来跳去折腾的够呛。单独的 CtrlP 或者 Fzf 明显不能满足要求。仔细研究 rails.vim 插件后豁然开朗。
rails.vim 提供了一些直接在 Vim 执行的 Rails 命令。但是在 Vim 8 之前 执行外部命令都是同步运行的,需要等待的时间比较久,这段时间不能在 Vim 不能做其他的操作。虽然 Vim 8 提供了异步模式,但大多数插件都没跟上。在目前主流的 Tmux + Vim 搭配下,反而不如在 Tmux 里切换到另外一个 Pane 或者 Window 来执行外部命令。所以在这里不对 Vim 执行的 Rails 命令做介绍,详情请见 :help rails-commands
这才是 rails.vim 的强大之处。没有太多需要记忆的命令而又功能强大,处处体现了 Rails 的哲学。
gf 本是一个自带的 Vim 命令,Normal 模式下,当光标下为文件路径时,按下 gf 可以基于相对路径跳转到该文件。但是在实际项目开发过程中很多时候 gf 不会命中。rails.vim 遵循 Rails 的习惯大于配置的原则加强了 gf 命令,大大的提高了这个命令的命中率。只要我们项目文件的路径和命名是符合 Rails 的约定。gf 的命中率是 100%。下面列举了一些常见的跳转案例。 *
为光标所在的位置。
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 (并且会跳转到 def new)
Alternate 和 Related 是 rails.vim 插件定义的两个概念,命令分别是 :A 和 :R。
注意 A 和 R 都为大写,在 Vim 里有个约定,插件提供的命令都是需大写开头
Alternate 和 Related 对应表:
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 |
database.yml | database.example.yml | environments/*.rb |
配合 S, V, T 可以在不同的 Vim 窗口模式下打开,如
rails.vim 还提供一组命令可以快速指定文件类型打开某个文件。如
类似的命令还很多,具体请查看 :h rails-type-navigation
日常 Rails 开发中,经常会碰到在 view 中需要将可重用或者逻辑较为独立的片段提取为一个 partial。rails.vim 里提供一个叫 Rextract 的命令来帮忙完成。
如需要将下图的 simple_form 片段提取成 _form。先选中相关代码后执行 :Rextract form 即可。
![alt text][rextract-cmd]
![alt text][rextract-result]
rails.vim 非常智能,如果是在 Helper 文件里 Rextract 为提取新的 helper。在 Model 和 Controller 里则是 concern。
surround.vim 是一个用来添加、修改、替换类似各种括号,引号等成对出现的符号。只要 Vim 安装了 surround.vim,rails.vim 便会自动对它增强。在 eruby 中可以用 <C-g>s=
等快捷键快速插入 eruby 标签。如
<C-g>s=
可以得到 <%= %><C-g>s-
可以得到 <% %><C-g>s#
可以得到 <%# %><C-g>s<C-e>
可以得到 <% %> <% end %>遗憾的是 rails.vim 并没有对删除和替换 surround 做增强。
[rextract-cmd]: https://ww4.sinaimg.cn/large/006tKfTcgy1fcuohz615jj31j60tkgv0.jpg [rextract-result]: https://ww3.sinaimg.cn/large/006tKfTcgy1fcuoi0md08j31d80tqdov.jpg