如何在vim的:s命令中嵌入Python表达式?

5

我可以在:s命令中使用\=expr。例如,在原地转换时间戳格式:

:%s/\v<\d{10}>/\=strftime('%c', submatch(0))/g

但是内置函数的功能非常有限。为了解析时间戳,我想使用类似这样的Python脚本:

$ python
>>> import datetime
>>> d = 'Apr 11 2012'
>>> datetime.datetime.strptime(d, '%b %d %Y').isoformat()
'2012-04-11T00:00:00'

如何将此py-expr嵌入到:s命令中?
:%s/\v\w+ \d{2} \d{4}/\={?py-expr?}/g

谢谢!


注意:如果你相信vim文档,空格在非常魔法模式下可能有特殊含义,因此需要进行转义。只有0-9、a-z、A-Z和_这些ASCII字符明确地被表示在此模式下没有特殊含义。 - ZyX
1个回答

8
如果您至少拥有vim-7.3.569,则可以执行以下操作:
:python import datetime
:%s/\v\w+\ \d{2}\ \d{4}/\=pyeval('datetime.datetime.strptime(vim.eval("submatch(0)"), "%b %d %Y").isoformat()')/g

如果您没有最新版本的vim,您可以在此情况下模拟pyeval:

function Pyeval(expr)
    python import json
    python vim.command('return '+json.dumps(eval(vim.eval('a:expr'))))
endfunction

如果您想使用 Pyeval 替换上述代码中的 pyeval,请执行以下操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接