Как я могу использовать vim для редактирования текста из Perl, пока скрипт еще работает?
У меня есть Perl-скрипт, который выводит текст. Я хочу импортировать этот текст в vim, отредактировать его, сохранить и затем выйти. При выходе я хочу, чтобы оригинальный скрипт Perl обрабатывал отредактированный файл.
Например как crontab -e
работает, когда вы добавляете новую работу.
Спасибо:)
5 ответов
Похоже, очень просто использовать system для запуска vim с именем файла. Это будет ждать до тех пор, пока vim не будет завершен, после чего вы сможете продолжить чтение нового содержимого файла.
use File::Temp;
my $fh = new File::Temp();
my $fname = $fh->filename;
print $fh "My Text";
$fh->close();
system($ENV{EDITOR}, $fname);
open $fh, '<', $fname or die "Can't open temp file: $!";
while(<$fh>) { print }
close $fh;
Подсказка: почему бы вам не захватить источник в crontab и не посмотреть, что он делает?
Кроме этого, у вас есть ответ.
И я думаю, что способ думать об этом:
"Хорошо, мне нужна программа для записи файла, вызова vim, а затем дальнейшей обработки файла. Итак, вот моя процедура для записи файла, вот моя процедура, которая вызывает vim (используя систему), и вот моя процедура для сделайте постобработку после того, как vim будет сделан. Теперь я объединю их все вместе в моей основной программе, и я готов!"
Похоже, вы хотите передать вывод вашего скрипта в vim:
сценарий | напор
И затем вы хотите, чтобы скрипт как-то знал, что Vim закончил и возобновил. Это не так, как перенаправление ввода / вывода работает. Сценарий не знает, в какую программу выводится его вывод.
Вы упомянули другие программы, такие как crontab
а также cvs
; их объединяет то, что они сами вызывают редактор. Они создают временные файлы, читают переменные окружения EDITOR или VISUAL (обратитесь к руководству за подробной информацией о том, как они выбирают какой), запускают данную программу и ждут ее завершения. Затем они продолжают работать и используют файл, который они указали ранее.
Оказывается, я сделал именно это в Perl. Я создал временный файл (с tempfile
), написал кучу текста в него, а затем использовал system
вызвать редактор файла. Вам даже не нужно закрывать файл во время работы редактора.
Передайте вывод в vim - и не забывайте черту в конце.
script.pl | vim -
Откроется vim с содержимым выходных скриптов. Просто сохраните его :w filename и выйдите : q. Это не то, как работает crontab -e, но достаточно просто.
Редактировать:
Я пропустил эту часть (или, возможно, вопрос был отредактирован позже):
При выходе я хочу, чтобы оригинальный скрипт Perl обрабатывал отредактированный файл.
Это не лучший способ сделать это, но, следуя моему первоначальному ответу, это работает (если вы сохраняете файл как file.txt):
perl -le 'print "1234"' | vim - && perl -pe '' file.txt
Просто замените команды perl вашими командами perl, и это должно работать. Как я уже сказал, это не лучший ответ, но он должен работать.