我得到了一个带有中文代码注释的.py文件。
我的任务是用英语翻译这些评论。
因此,我获得了trans
命令行工具来快速翻译文本。(这是谷歌翻译器[https://github.com/soimort/translate-shell]的一个简单的CLI )
找出一个正则表达式,它与我想要翻译的内容完全匹配。
\v([^#]*&[^"']|^)\zs#.+\ze
我可以在vim中使用trans和"!“命令。
(例如,.!trans -b :en
翻译我正在接的线路。
有人能想出一个命令来翻译所有的匹配吗?
重要
我只想把匹配本身传递给trans
工具。
如果我给工具整条线就像..。
some_variable = True #循迹红外传
。。这个工具不能正确地传递它。
(预先谢谢:)
发布于 2020-04-13 09:51:31
使用@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]\+
发布于 2020-04-12 19:01:33
有趣的问题!
以下是我想出的解决方案:
:%g/\v([^#]*&[^"']|^)\zs#.+\ze/exe"norm!\"acgn\<C-r>=system('trans -b :en <<< \"'.@a.'\"')\<CR>"
您可能需要更改system(...)
部分,因为我不确定您的trans
命令是如何工作的。
解释
%g
| --这将在regex为found\v([^#]*&[^"']|^)\zs#.+\ze
|的每一行上执行给定的命令,即regex!exe"..."
|执行给定的vim命令。我们在这里使用它,以便在normal
中输入击键(例如,normal
模拟击键,就像您自己键入一样)。
所以现在我们要输入键,就像我们在键盘上键入它们一样,这将在匹配的每一次出现时都被输入。
"a
|将将下一个操作的结果存储在寄存器中,a
cgn
|将裁剪下一个模式匹配(或光标下的一个),并输入insert mode<C-r>=
|将插入表达式寄存器的内容,在另一个条件下,它将允许您输入一个表达式system('trans -b :en <<< \"'.@a.'\"')
|系统,它允许您执行bash命令,然后取决于您在there<CR>
|中所放的enter键(回车Return))中的内容
当然,您可以在vim文档中找到所有这些:
:help :global
:help execute
:help normal
:help i_CTRL-R
:help @=
:help system()
https://stackoverflow.com/questions/61176237
复制相似问题