【发布时间】:2015-11-07 15:25:04
【问题描述】:
有没有办法从变量打印多行文本到某个编辑器,退出时会将编辑后的文本返回到脚本?
喜欢:
my $result = `echo -n $txt | some_editor`;
print $file_handle $result;
【问题讨论】:
标签: perl user-input text-editor multiline
有没有办法从变量打印多行文本到某个编辑器,退出时会将编辑后的文本返回到脚本?
喜欢:
my $result = `echo -n $txt | some_editor`;
print $file_handle $result;
【问题讨论】:
标签: perl user-input text-editor multiline
在我看来Term::CallEditor 可能是一个好方法。 vipe 可从moreutils 包中获得,该包可以使用包管理器进行安装,但它不在 CPAN 上。 Term::CallEditor 在 CPAN 上可用,并且可能已被许多包管理 repos 采用。
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 上。
【讨论】:
man vipe 让我觉得它使用了“EDITOR”环境。另外,我刚刚检查过:在将 'EDITOR' 设置为 'nano' vipe 使用 nano 编辑器而不是 vi - 至少在我的系统上。
moreutils 不在 CPAN 上;如果提供的话,你只需要从你的 Linux 发行版的包管理器中获取它。查看vipe 的源代码,我发现它也尊重$VISUAL 如果设置,这是一件好事。
好吧,我突然找到了办法。 “moreutils”包中有一个“vipe”工具。所以在sudo apt-get install moreutils(我的系统是Ubuntu)之后代码应该变成:
my $result = `echo -n $txt | vipe`;
print $file_handle $result;
在我的情况下,默认编辑器是 Vim(在我的系统中 vipe 使用来自 'EDITOR' 环境变量的编辑器,如果 'EDITOR' 未定义,则回滚到 vi),因此文本在 Vim 中的临时文件下打开 '/ tmp' - 在:wq Vim 命令后关闭编辑器,删除临时文件并将内容返回到 '$result' 变量。太好了!
【讨论】:
Proc::InvokeEditor 是另一个做得很好的模块。
【讨论】: