有沒有什麼方法可以將多行文本從變量打印到某個編輯器,在退出時將編輯後的文本返回給腳本?Perl:將多行文本重定向到編輯器並將編輯後的文本返回到變量
像:
my $result = `echo -n $txt | some_editor`;
print $file_handle $result;
有沒有什麼方法可以將多行文本從變量打印到某個編輯器,在退出時將編輯後的文本返回給腳本?Perl:將多行文本重定向到編輯器並將編輯後的文本返回到變量
像:
my $result = `echo -n $txt | some_editor`;
print $file_handle $result;
它在我看來像Term::CallEditor可能是一個很好的方法。 vipe
可從moreutils
包中獲得,可使用包管理器進行安裝,但不在CPAN上。 Term :: CallEditor在CPAN上可用,並且很可能已被許多包管理回購所採用。
vipe
from moreutils
invokes 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上。
好吧,我突然發現這樣做的方式。 'moreutils'包中有一個'vipe'工具。所以經過sudo apt-get install moreutils
(在我的系統是Ubuntu的)的代碼應該變成:
my $result = `echo -n $txt | vipe`;
print $file_handle $result;
在我的情況下默認編輯器Vim的(在我的系統VIPE使用從「編輯器」環境變量編輯器,以回滾至vi如果'EDITOR'未定義),所以文本在Vim中以'/ tmp'臨時文件打開 - :wq
Vim命令編輯器關閉後,臨時文件被刪除,內容返回'$ result'變量。大!
謝謝,它似乎值得一試。關於vipe,看着'man vipe'讓我覺得它使用'EDITOR'env。另外,我剛剛檢查過它:在將'EDITOR'設置爲'nano'後,vipe使用nano編輯器而不是vi - 至少在我的系統上。 – a1111exe
這是一個很好的觀察。我很高興vipe正在做正確的事情。 'moreutils'不在CPAN上太糟糕了;如果提供的話,您只需從Linux發行版的軟件包管理器中獲取它。看看'vipe'的來源,我發現它也尊重'$ VISUAL',如果設置的話,這是一件好事。 – DavidO