使用vimscript通过使用普通vim命令运行测试脚本

使用vimscript通过使用普通vim命令运行测试脚本,vim,Vim,大约六个月前,我开始使用VIM作为我的编辑器,我非常喜欢它。然而,我想实现一些与工作相关的脚本,以使我的生活更轻松。如果有人能帮助我,我将不胜感激 这是我的问题。我用python编写了一些测试,并编写了一个键映射,以使用vim terminal运行这些测试。它工作得很好。但是,现在我想使用VimScript和一些vim函数来让它看起来更好。我是VimScript的初学者,因此,我不确定这是否可行 我的文件夹结构看起来像 . ├── my_test.py └── test └── test

大约六个月前,我开始使用VIM作为我的编辑器,我非常喜欢它。然而,我想实现一些与工作相关的脚本,以使我的生活更轻松。如果有人能帮助我,我将不胜感激

这是我的问题。我用python编写了一些测试,并编写了一个键映射,以使用vim terminal运行这些测试。它工作得很好。但是,现在我想使用VimScript和一些vim函数来让它看起来更好。我是VimScript的初学者,因此,我不确定这是否可行

我的文件夹结构看起来像

.
├── my_test.py
└── test
    └── testRunner.py

1 directory, 2 files
我的测试代码看起来像

my_test.py:

#!/bin/python

class MyTest1:

    def Run():
        # Test body

class MyTest2:

    def Run():
        # Test body
#!/bin/python

print "Running the test"
test/testRunner.py:

#!/bin/python

class MyTest1:

    def Run():
        # Test body

class MyTest2:

    def Run():
        # Test body
#!/bin/python

print "Running the test"
.vimrc中当前的键映射如下所示:

nnoremap <leader>t mZ/class<CR>Nwyiw:noh<CR>:terminal<CR>cd test<CR>python testRunner.py <C-W>"0<CR><C-W><C-W>'Z
nnoremap <leader>t :call RunThisTest()<CR>

function! RunThisTest()
    RememberEditContext()
    FindAndCopyTestName()
    RunTestInTestDirectory()
    ReturnToEditContext()
endfunction
nnoremap t mZ/classNwyiw:noh:ternalcd testpython testRunner.py“0'Z
它的作用是

  • 查找测试名称(我当前正在编辑的测试)
  • 复制名称并在vim终端中运行该测试名称
  • 我希望它是这样的:

    nnoremap <leader>t mZ/class<CR>Nwyiw:noh<CR>:terminal<CR>cd test<CR>python testRunner.py <C-W>"0<CR><C-W><C-W>'Z
    
    nnoremap <leader>t :call RunThisTest()<CR>
    
    function! RunThisTest()
        RememberEditContext()
        FindAndCopyTestName()
        RunTestInTestDirectory()
        ReturnToEditContext()
    endfunction
    
    nnoremap t:调用RunThisTest()
    函数!RunThisTest()
    RememberEditContext()
    FindAndCopyTestName()
    runTestEntestDirectory()
    ReturnToEditContext()
    端功能
    
    有人能帮我开发这些功能吗

    提前感谢!

    一个选项是直接使用命令,它允许您直接运行一系列击键,就像您在映射中使用它们一样

    但事实证明我们可以做得更好,更好得多,所以让我们开始吧

    搜索和匹配 您可以使用该函数查找您所在的类。您可以传递它的标志,如
    bcnW
    ,让它反向搜索b,可能在cursor位置匹配,不要移动光标,也不要在文件周围移动w。将所有内容放在一起:

    let line = search('^class \w', 'bcnW')
    
    如果存在正匹配,则返回行号;如果没有匹配,则返回0。如果存在匹配,则可以使用
    getline()
    获取其内容,然后捕获类的名称

    let [_, classname; _] = matchlist(getline(line), '^class \(\w\+\)')
    
    如您所见,使用Vimscript,我们能够在不移动光标和不接触搜索寄存器的情况下获得类名。因此,我们不需要设置任何标记,也不需要担心恢复当前位置和视图

    运行命令 现在是在终端上运行命令的时候了。我们可以通过直接向其传递命令来简化该过程。(请注意,这里有一个区别,终端将只运行该命令,它在完成后不会离开外壳。根据您的使用情况,您可能更愿意执行与您现在所做的更类似的操作。)

    我们可以在终端中使用以下命令运行该命令:

    :terminal ++shell cd test && python testRunner.py MyTest1
    
    但是,当然,我们需要传递我们得到的类名,而不是一个固定的值。我们可以使用该命令来实现这一目的。它获取一个字符串并将其作为Vimscript命令运行。我们可以使用它来动态组装字符串

    execute "terminal ++shell cd test && python testRunner.py ".shellescape(classname)
    
    最后,要返回到原始窗口,我们可以使用命令,更具体地说是
    wincmd p

    把它放在一起 由此产生的功能是:

    function! RunThisTest() abort
        let line = search('^class \w', 'bcnW')
        if line == 0
            echoerr "Not inside a test class!"
            return
        endif
        let [_, classname; _] = matchlist(getline(line), '^class \(\w\+\)')
        execute "terminal ++shell cd test && python testRunner.py ".shellescape(classname)
        wincmd p
    endfunction
    
    nnoremap <silent> <leader>t :call RunThisTest()<CR>
    
    如果你要猛拉一个寄存器,你也可以保存和还原它。例如,默认寄存器为
    @“
    。您还应该保存寄存器类型,它记录内容是在字符、行还是块上下文中获取的

    let saved_register = getreg('"')
    let saved_regtype = getregtype('"')
    normal! y3W
    let words = getreg('"')
    call setreg('"', saved_register, saved_regtype)
    
    您还可以保存当前视图,其中包括光标所在的位置,还可以保存窗口的其他参数,例如第一行和第一列显示的内容,以便完全恢复该上下文。有关详细信息,请参阅和函数

    管理终端 控制终端的功能远远超出了
    :terminal
    的功能范围

    例如,更丰富的功能允许以列表形式运行命令,并传递选项(如
    'cwd'
    )在不同的目录上运行命令

    因此,我们可以通过以下方式简化测试执行:

    call term_start(['python', 'testRunner.py', classname], {'cwd': 'test'})
    
    还有一个可以用来向终端发送击键的程序。例如,如果您喜欢启动shell并通过shell调用Python脚本:

    let termbuf = term_start(&shell, {'cwd': 'test'})
    call term_sendkeys(termbuf, "python testRunner.py ".shellescape(classname)."\r")
    
    您还可以使用
    term_getline(termbuf,'.')
    获取光标当前所在行的内容。例如,您可以使用它来检测终端是在shell提示符上(以
    $
    和空格结尾的行),还是仍在测试运行程序的执行中

    最后,您甚至可以在终端调用Vim命令中运行该命令!通过特殊的转义序列,它可以调用导出的函数或要求Vim打开文件进行编辑。有关详细信息,请参阅

    学习更多 这一切都很整洁。。。但是我怎样才能学到更多呢

    我的第一个强烈建议是阅读Steve Losh的《优秀》一书。它涵盖了该语言的基础知识、如何与编辑器交互(映射、自动命令、缩进表达式、文件类型)以及如何组合Vim插件的基础知识。它还涵盖了Vimscript的常见缺陷和编写可靠代码的最佳实践。如果您想认真对待编写Vim脚本,这是必须的

    第二个建议是阅读通过
    :help
    提供的优秀文档!很少有应用程序像Vim那样有文档记录,因此了解帮助系统的方法确实会有很大帮助

    第三是使用StackExchange。特别是,这本书致力于这一主题。你不仅可以在那里找到很好的答案,而且可以提出很好的问题,你还有机会看到很好的问题,想知道如何解决这些问题,还可以尝试写一个答案。(从我开始使用VI和VIM SE以来,我的VIM FoO已经有了很大的改进,从这点上我可以考虑Mys。