4

我是vim的新手。我想要实现的是 vim 将在我的文本文件中返回 python 函数的输出。这个想法是我选择文本的一部分并按 F5 并获取输出。复杂之处在于这个函数是库的一部分,我必须导入它。我试过这个

command MyPythonFunction execute "!python from Bio.Seq import reverse_complement; reverse_complement(%)"
map <F5> :MyPythonFunction<CR>

我得到“不允许范围”

4

2 回答 2

2

选定的行被传递到命令的标准输入。所以使用 sys.stdin.read() 阅读它

fun! ReverseComplement()
    exec ":'<,'>! python -c \"import sys, Bio.Seq; print Bio.Seq.reverse_complement(sys.stdin.read().rstrip())\""
endfun

vnoremap <F5> :call ReverseComplement()<CR>

编辑

通过一行的一部分:

vnoremap <F5> d:let @a=system('python -c "import sys, Bio.Seq; sys.stdout.write(Bio.Seq.reverse_complement(\"' . @" . '\"))"')<CR>"aP
  • d -> 删除选定的部分。副作用:寄存器的内容发生了"变化。
  • @":寄存器的"内容(剪切内容)
  • .: 连接字符串的二元运算符。
  • let @a = system(..):执行外部命令,并将其输出保存到a寄存器。
  • "aP:将a寄存器内容粘贴到当前光标位置之前。
于 2013-07-06T07:26:41.397 回答
1

首先,您将需要**以从标准输入读取数据然后输出到标准输出的方式编写您的 python 部分。然后,您可以按以下样式应用您的代码:

fun! DoMyPythonThing() range
    exec ":'<,'>! python ./path/to/your/script.py"
endfun

vnoremap <F3> :call DoMyPythonThing()<CR>

ex 命令背后的想法:!是你给它一个可执行程序,vim 将可视化文本通过管道传递给它,并用程序的输出替换该区域。

请注意range函数定义中的 。请注意我们仅在视觉模式映射中限制自己的映射。如果您也喜欢挥动鼠标,请考虑在选择模式下进行映射。

**) 好吧,可以编写 in-vim python 来执行此操作,但这更难测试,并且您仍然通过调用来使用外部程序路线!

于 2013-07-06T07:08:10.157 回答