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