【问题标题】:Perl: redirect multi line text to editor and return edited text into variablePerl:将多行文本重定向到编辑器并将编辑后的文本返回到变量中
【发布时间】:2015-11-07 15:25:04
【问题描述】:

有没有办法从变量打印多行文本到某个编辑器,退出时会将编辑后的文本返回到脚本?

喜欢:

my $result = `echo -n $txt | some_editor`;
print $file_handle $result;

【问题讨论】:

    标签: perl user-input text-editor multiline


    【解决方案1】:

    在我看来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 上。

    【讨论】:

    • 谢谢,看来值得一试。不过,关于 vipe,看着man vipe 让我觉得它使用了“EDITOR”环境。另外,我刚刚检查过:在将 'EDITOR' 设置为 'nano' vipe 使用 nano 编辑器而不是 vi - 至少在我的系统上。
    • 这是一个很好的观察。我很高兴 vipe 做对了。可惜moreutils 不在 CPAN 上;如果提供的话,你只需要从你的 Linux 发行版的包管理器中获取它。查看vipe 的源代码,我发现它也尊重$VISUAL 如果设置,这是一件好事。
    【解决方案2】:

    好吧,我突然找到了办法。 “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' 变量。太好了!

    【讨论】:

      【解决方案3】:

      Proc::InvokeEditor 是另一个做得很好的模块。

      【讨论】:

        猜你喜欢
        • 2014-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-01
        • 1970-01-01
        相关资源
        最近更新 更多