在Vim Script中查找测试名称

时间:2014-10-27 20:34:36

标签: vim

我已经编写了一个有效的简单脚本,但我正在寻找更好的实现。

这是我的理想情景。我坐在一个包含许多测试的测试文件中:

  def test_cleans_number
    number = PhoneNumber.new("(123) 456-7890").number
    assert_equal "1234567890", number
  end

  def test_cleans_a_different_number
    number = PhoneNumber.new("(987) 654-3210").number
    assert_equal "9876543210", number
  end

  def test_cleans_number_with_dots
    number = PhoneNumber.new("456.123.7890").number
    assert_equal "4561237890", number
  end

我已经编写了这个vim脚本,它允许我将光标放在测试的定义行上,它将只运行该测试和测试:

function! RunNearestTest()
  let line = getline('.')
  let test_name = substitute(line, 'def ', "", "g")
  exec ":!ruby " . @% . " -n " . test_name
endfunction

" run test runner
map <leader>T :call RunNearestTest()<cr>

如果脚本中不明显,我需要测试名称才能专门运行该测试。在第一个示例中,测试名称为test_cleans_number

正如我所说,这很好但我想做的就是在测试中的任何一行,它会知道跳到上一个def,得到test_name然后运行执行。我认为searchpair()会成为我的转到此,但是我无法找到足够的文档。

我很高兴在此提供您可能需要的任何文件或附加内容,谢谢!

1 个答案:

答案 0 :(得分:3)

search()函数返回匹配行的编号:

function! RunNearestTest()
  let line_text = getline(search('def ', 'bcW'))
  let test_name = substitute(line_text, 'def ', "", "g")
  exec ":!ruby " . @% . " -n " . test_name
endfunction

请参阅:help search()