在vim中,将Ruby hashrockets更改为name:value表示法的有效方法是什么?

时间:2014-03-21 10:44:55

标签: ruby vim

在vim中将Ruby的hashrocket表示法更改为name: 'value' notation的最有效方法是什么?

一些例子:

{ 
  :id => site.id,
  :primary_domain => site.name,
  :wp_admin_url => site.wp_admin_url
}
{ 
  id: site.id,
  primary_domain: site.name,
  wp_admin_url: site.wp_admin_url
}


{ :id => site.id, :primary_domain => site.name }
{ id: site.id, primary_domain: site.name }


Site.find_by(:access_token => params[:access_token], :primary_domain => params[:primary_domain])
Site.find_by(access_token: params[:access_token], primary_domain:params[:primary_domain])

你有一个宏吗?我的一些更有效的序列呢?使用搜索替换? 我能想到的最有效率,非常手动,需要一些重复:

ft:xpldf> 转到第一个:,删除它并将其粘贴到单词后面,然后向前移动一个字符并删除=>部分。 需要对哈希中的每个:name => value部分重复这一过程。并且不能简单地运行N次,因为可能有一些:symbols需要保留,就像在上一个例子中一样。

如何快速更改Hashrocket表示法?

3 个答案:

答案 0 :(得分:6)

这种替换似乎可以解决所有三个样本的问题:

:%s/:\(\w\+\)\s*=>\s*/\1: /g

您可以使用它创建一个简单的自定义命令:

command! Notation %s/:\(\w\+\)\s*=>\s*/\1: /g

或稍微聪明一点:

command! -range=% Notation silent execute <line1>.','.<line2>.'s/:\(\w\+\)\s*=>\s*/\1: /g'

答案 1 :(得分:0)

仅供参考:这个正则表达式实际上已经破坏了我。

我有一些代码:Module::Class.where(:symbol => ...

因此,正则表达式试图从::开始匹配。

相反,我使用了:

:1,$s/:\([^\:\s]\+\)\s\+=>/\1:/gc

答案 2 :(得分:0)

本着迭代改进的精神,以下内容还应保留键值对之间的空白(例如,当选择了火箭标签以对齐它们时,假设不需要保留火箭和值之间的空间): / p>

:%s​​ /:(\ w +)(\ s *)=> \ s * / \ 1:\ 2 / g

应使用以下所有示例:

:key => value

Module::Class.where(:symbol => value)

{ 
  :id => site.id,
  :primary_domain => site.name
}

Site.find_by(:access_token => params[:access_token], :primary_domain => params[:primary_domain])

:symbol_one => some_method(:symbol_two).other_method(:symbol_3 => third_method(:symbol_4).attribute)

:to   => :processing_payment,
:from => [:awaiting_contact, :awaiting_payment]