2014-10-27 28 views
0

我寫了一個簡單的腳本,但我正在尋找更好的實現。在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 "", 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()將是我的轉到這裏,但唉,我無法找到足夠的文件。

我很高興提供您可能需要的任何文件或附加內容,謝謝!

+0

側欄:''m' /'] m'將移動到上一個/下一個方法定義 – 2014-10-27 23:33:27

回答

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()

+1

Ah-ha!你只是缺少我的一個要求,在得到'search'生成的行#後,我需要運行let'getline'來獲取文本。謝謝! – Anthony 2014-10-27 20:49:43

+0

哎呀!出於某種原因我忘了那部分。 – romainl 2014-10-27 21:02:41