Perl:将多行文本重定向到编辑器并将 return 编辑的文本重定向到变量
Perl: redirect multi line text to editor and return edited text into variable
有没有什么方法可以将变量中的多行文本打印到某些编辑器,并且在退出时将 return 编辑的文本输出到脚本?
喜欢:
my $result = `echo -n $txt | some_editor`;
print $file_handle $result;
好的,我突然找到方法了。 'moreutils' 包中有一个 'vipe' 工具。所以在 sudo apt-get install moreutils
之后(在我的例子中系统是 Ubuntu)代码应该变成:
my $result = `echo -n $txt | vipe`;
print $file_handle $result;
在我的例子中,默认编辑器是 Vim(在我的系统中,vipe 使用来自 'EDITOR' 环境变量的编辑器,如果 'EDITOR' 未定义,则回滚到 vi),所以文本在“/tmp”中的临时文件下的 Vim 中打开 - 在 :wq
Vim 命令后编辑器关闭,临时文件被删除,内容 return 到 '$结果'变量。太棒了!
在我看来 Term::CallEditor 可能是一个不错的方法。 vipe
可以从 moreutils
包中获得,可以使用包管理器安装它,但它不在 CPAN 上。 Term::CallEditor 在 CPAN 上可用,也可能被许多包管理存储库采用。
vipe
从 moreutils
调用 vi。 Term::CallEditor 的 solicit
命令调用 EDITOR
环境变量指向的编辑器,这是一种更 *nix-y 的做事方式;这是人们普遍期望的。在没有 EDITOR
环境变量的情况下,它将回退到 vi
.
来自 Term::CallEditor 的 POD 中的 SYNOPSIS
。
use Term::CallEditor qw/solicit/;
my $fh = solicit('FOO: please replace this text');
die "$Term::CallEditor::errstr\n" unless $fh;
print while <$fh>;
我喜欢 solicit
尊重 $ENV{'EDITOR'}
变量,这类似于 git
的工作方式,例如。
查看来自 Term::CallEditor 的代码,它实际上并没有那么重要也不复杂,但是鉴于该模块存在,我看不出有任何理由尝试自己复制它对边缘情况的处理。
如果 vipe
也尊重 $EDITOR
,那么它将归结为评估每个模块提供的其他功能,以及更深入的代码审查。或者只是选择一个并继续使用它。我仍然可能喜欢 Term::CallEditor,因为它在 CPAN 上。
Proc::InvokeEditor 是另一个在这方面做得很好的模块。
有没有什么方法可以将变量中的多行文本打印到某些编辑器,并且在退出时将 return 编辑的文本输出到脚本?
喜欢:
my $result = `echo -n $txt | some_editor`;
print $file_handle $result;
好的,我突然找到方法了。 'moreutils' 包中有一个 'vipe' 工具。所以在 sudo apt-get install moreutils
之后(在我的例子中系统是 Ubuntu)代码应该变成:
my $result = `echo -n $txt | vipe`;
print $file_handle $result;
在我的例子中,默认编辑器是 Vim(在我的系统中,vipe 使用来自 'EDITOR' 环境变量的编辑器,如果 'EDITOR' 未定义,则回滚到 vi),所以文本在“/tmp”中的临时文件下的 Vim 中打开 - 在 :wq
Vim 命令后编辑器关闭,临时文件被删除,内容 return 到 '$结果'变量。太棒了!
在我看来 Term::CallEditor 可能是一个不错的方法。 vipe
可以从 moreutils
包中获得,可以使用包管理器安装它,但它不在 CPAN 上。 Term::CallEditor 在 CPAN 上可用,也可能被许多包管理存储库采用。
vipe
从 moreutils
调用 vi。 Term::CallEditor 的 solicit
命令调用 EDITOR
环境变量指向的编辑器,这是一种更 *nix-y 的做事方式;这是人们普遍期望的。在没有 EDITOR
环境变量的情况下,它将回退到 vi
.
来自 Term::CallEditor 的 POD 中的 SYNOPSIS
。
use Term::CallEditor qw/solicit/;
my $fh = solicit('FOO: please replace this text');
die "$Term::CallEditor::errstr\n" unless $fh;
print while <$fh>;
我喜欢 solicit
尊重 $ENV{'EDITOR'}
变量,这类似于 git
的工作方式,例如。
查看来自 Term::CallEditor 的代码,它实际上并没有那么重要也不复杂,但是鉴于该模块存在,我看不出有任何理由尝试自己复制它对边缘情况的处理。
如果 vipe
也尊重 $EDITOR
,那么它将归结为评估每个模块提供的其他功能,以及更深入的代码审查。或者只是选择一个并继续使用它。我仍然可能喜欢 Term::CallEditor,因为它在 CPAN 上。
Proc::InvokeEditor 是另一个在这方面做得很好的模块。