如何使用vim删除ruby中除特定函数之外的所有内容?

时间:2016-07-07 01:44:12

标签: vim

我有以下缓冲区:

class Greeting
  def english_greeting
    words.each do
      # do some stuff
    end
    return 'hello'
  end

  def spanish_greeting
    # do some stuff
    return 'hola'
  end
end

我想要一种删除除english_greeting函数及其内容之外的所有内容的方法。我确实知道我可以使用matchit.vim并跳转到def spanish_greeting拉动该函数,然后删除所有内容然后打印出拉出的缓冲区。但我想知道是否还有其他方法可以解决这个问题?

4 个答案:

答案 0 :(得分:2)

您可以收集想要的行,而不是删除不需要的行:

:g/^def english_/,/^end/y A

所有english相关函数都会进入注册"a,您可以使用" ap 将其删除。

答案 1 :(得分:0)

一个 - 不那么优雅 - 可以做到这一点。

ggd/def english_greeting<Enter>

这将删除english_greeting功能之前的所有内容。

现在,要删除所有的剩余功能(在english_greeting功能之后),

/def<Enter>dG

答案 2 :(得分:0)

这应该可以解决问题

var envConnectionString = Environment.GetEnvironmentVariable(...);

if (string.IsNullOrEmpty(envConnectionString))
{
  // log error, throw exception, etc      
}
else
{
  services.AddDbContext<ApplicationDbContext>(options => 
                                              options.UseSqlServer(envConnectionString)));
}

它假定:0;/^def english_greeting$/-1 d | /^end$/+1,$ d def前面没有任何空格。 这样做的原因是,如果您在end中有doend块或if语句,则会从english_greeting中删除,并删除太多了。 这样,如果使用代码缩进,则最终应该使用整个方法。 如果您不希望该命令在执行前要求确认,只需添加end,即silent

另一种选择是安装vim-ruby插件。 它为ruby方法添加了一个文本对象,因此您可以轻松地将整个方法移动到命名缓冲区。例如,要使用缓冲区:silent 0;...,您可以将光标放在方法中的任意位置并键入a。然后,您只需删除文件中的所有文字,例如"ayam,然后将方法粘贴回ggdG

答案 3 :(得分:0)

您可以使用此替换命令:

:%s/\_.*\(def english_greeting\_.*\)def\_.*/\1/