使用vim和regex翻译代码注释

时间:2020-04-12 18:27:28

标签: regex vim

我得到了一个带有中文代码注释的.py文件。

我的任务是用英语翻译那些评论。

因此,我得到了trans命令行工具来快速翻译文本。 (对于Google翻译[https://github.com/soimort/translate-shell],这是一个简单的CLI)

并找出与我要翻译的内容完全匹配的正则表达式。

\v([^#]*&[^"']|^)\zs#.+\ze

我可以在vim内使用带有“!”的trans CLI。命令。

(例如.!trans -b :en翻译我所在的行。

任何人都可以提出命令来翻译所有匹配项吗?

重要

我只想将比赛本身传递给trans工具。

如果我给工具加上整行,就像..

some_variable = True #循迹红外传

..该工具无法正确翻译。

预先感谢:)

2 个答案:

答案 0 :(得分:1)

有趣的问题!

这是我想出的解决方案:

:%g/\v([^#]*&[^"']|^)\zs#.+\ze/exe"norm!\"acgn\<C-r>=system('trans -b :en <<< \"'.@a.'\"')\<CR>"

您可能需要更改system(...)部分,因为我不确定您的trans命令的工作方式...

说明

  • %g |这将在找到正则表达式的每一行上执行给定命令
  • \v([^#]*&[^"']|^)\zs#.+\ze |那就是你的正则表达式!
  • exe"..." |执行给定的vim命令。我们在这里使用它,以便我们可以在normal(例如<C-r>)中输入击键
  • norm! |模拟击键,就像您自己键入击键一样

所以现在我们要像在键盘上键入键一样输入键,并且每次匹配时都会输入键


  • "a |将下一个操作的结果存储在寄存器a
  • cgn |将剪切下一个匹配的图案(或光标下方的一个),并进入插入模式
  • <C-r>= |将插入表达式寄存器的内容,换句话说,它将让您输入表达式
    • system('trans -b :en <<< \"'.@a.'\"') |系统允许您执行bash命令,然后由您决定放置在那里的内容
    • <CR> |回车键(回车)

您当然可以在vim文档中找到所有这些内容:

  • :help :global
  • :help execute
  • :help normal
  • :help i_CTRL-R
  • :help @=
  • :help system()

答案 1 :(得分:1)

使用@Zorzi解决方案,我想出了另一种方法,也许更简单:

:1s/\v([^#]*&[^"']|^)\zs#.+\ze/\=system('trans -b :en \"'. submatch(0) . '\"')

当然,您可以更改范围以适合您的需求。而且,如果将问题分为两部分,则搜索和替换将更容易理解发生的情况:

/\v([^#]*&[^"']|^)\zs#.+\ze/

:1s//\=system('trans -b :en \"'. submatch(0) . '\"')

注意:submatch(0)恰好表示我们的正则表达式匹配的内容

我已经测试了另一个不太复杂的版本,没有反斜杠,它似乎可以工作:

:1s//\=system('trans -b :en "'. submatch(0) . '"')

最后,我找到了查找汉字的方法,使我们的搜索更加容易:

/[^\x00-\xff]\+

参考:https://stackoverflow.com/a/61233146/2571881

相关问题