Как я могу использовать vim для редактирования текста из Perl, пока скрипт еще работает? - PullRequest
4 голосов
/ 24 апреля 2009

У меня есть Perl-скрипт, который выводит текст. Я хочу импортировать этот текст в vim, отредактировать его, сохранить и затем выйти. При выходе я хочу, чтобы оригинальный сценарий Perl обработал отредактированный файл.

например. как crontab -e работает, когда вы добавляете новую работу.

Спасибо:)

Ответы [ 5 ]

13 голосов
/ 24 апреля 2009

Похоже, очень просто использовать system для запуска vim с именем файла. Это будет ждать до тех пор, пока vim не будет завершен, после чего вы сможете прочитать новое содержимое файла.

6 голосов
/ 24 апреля 2009
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;
3 голосов
/ 24 апреля 2009

Предложение: почему бы вам не захватить источник в crontab и не посмотреть, что он делает?

Кроме этого, у вас есть ответ.

И я думаю, что способ думать об этом:

"Хорошо, мне нужна программа, чтобы записать файл, вызвать vim, затем выполнить дальнейшую обработку файла. Итак, вот моя процедура записи файла, вот моя процедура, которая вызывает vim (используя систему), и вот моя процедура выполнения постобработки после завершения vim. Теперь я объединю их все вместе в своей основной программе, и все готово! "

2 голосов
/ 24 апреля 2009

Вы, похоже, хотите передать вывод вашего скрипта в vim:

script | vim

А затем вы хотите, чтобы скрипт как-то знал, что Vim завершен, и возобновил. Это не так, как перенаправление ввода / вывода работает. Сценарий не знает, в какую программу выводится его вывод.

Вы упомянули другие программы, такие как crontab и cvs; Общее у них то, что сами вызывают редактор . Они создают временные файлы, читают переменные окружения EDITOR или VISUAL (обратитесь к руководству за подробной информацией о том, как они выбирают какой), запускают данную программу и ждут ее завершения. Затем они продолжают работать и используют файл, который они указали ранее.

Оказывается, я сделал именно это в Perl. Я создал временный файл (с tempfile), записал в него кучу текста, а затем использовал system, чтобы вызвать редактор файла. Вам даже не нужно закрывать файл во время работы редактора.

0 голосов
/ 24 апреля 2009

Передайте вывод на vim - и не забудьте черту в конце.

script.pl | vim -

Откроется vim с содержимым выходных скриптов. Просто сохраните его : w имя файла и выйдите из : q . Это не то, как работает crontab -e, но достаточно просто.

Edit:
Я пропустил эту часть (или, возможно, вопрос был отредактирован позже):

При выходе я хочу оригинальный Perl скрипт для обработки отредактированного файла.

Это не лучший способ сделать это, но если исходить из моего первоначального ответа, это работает (если вы сохраните файл как file.txt):

perl -le 'print "1234"' | vim - && perl -pe '' file.txt

Просто замените команды perl вашими командами perl, и это должно работать. Как я уже сказал, это не лучший ответ, но он должен работать.

...