2009-04-24 2 views
4

J'ai un script Perl qui génère du texte. Je veux importer ce texte dans vim, le modifier, l'enregistrer et puis quitter. À la sortie, je veux que le script Perl original traite le fichier édité.Comment puis-je utiliser vim pour modifier du texte à partir de Perl alors que le script est toujours en cours d'exécution?

E.G. comment crontab -e fonctionne lorsque vous ajoutez un nouveau travail.

Merci :)

+0

Alors de quelle pièce avez-vous des problèmes? Quelle est votre question? –

+0

Eh bien, je ne sais pas comment le faire fondamentalement. Je peux diriger la sortie vers vim, mais une fois que j'ai fini avec vim, je dois exécuter manuellement le script perl sur le fichier sauvegardé. Et puis je dois supprimer le fichier temporaire. Je cherche à intégrer de façon transparente vim - comme crontab, cvs et git do. – aidan

+0

Vous ne voulez pas rediriger vers vim. Déroulez a votre réponse. – skiphoppy

Répondre

13

Cela ressemble à un cas très simple à utiliser system pour exécuter vim sur le nom de fichier. Cela attendra jusqu'à ce que vim soit terminé, à quel point vous pouvez aller de l'avant et lire le nouveau contenu du fichier.

+2

Vous pouvez utiliser la variable d'environnement $ EDITOR pour permettre à vos utilisateurs de sélectionner l'éditeur de leur choix. – rampion

2

Vous semblez vouloir redirigez la sortie de votre script dans vim:

 
script | vim 

Et vous voulez que le script de savoir en quelque sorte que Vim est terminé et reprendre. Ce n'est pas comme ça que fonctionne la redirection d'E/S. Le script n'a aucune connaissance du programme dans lequel sa sortie est transmise. Vous avez mentionné d'autres programmes comme crontab et cvs; une chose qu'ils ont en commun est que ils invoquent l'éditeur eux-mêmes. Ils créent des fichiers temporaires, lisent les variables d'environnement EDITOR ou VISUAL (consultez le manuel pour plus de détails sur la manière dont ils choisissent), exécutent le programme donné et attendent la fin du programme. Ensuite, ils continuent à courir et utilisent le fichier qu'ils ont spécifié plus tôt.

Il s'avère que j'ai fait exactement cela en Perl. J'ai créé un fichier temporaire (avec tempfile), écrit un tas de texte, puis utilisé system pour appeler l'éditeur sur le fichier. Vous n'avez même pas à fermer le fichier pendant que vous exécutez l'éditeur.

0

Pipe la sortie vers vim - et n'oublie pas le tiret à la fin.

script.pl | vim - 

Ceci ouvrira vim avec le contenu de la sortie des scripts. Il suffit de le sauvegarder : w nom de fichier et quitter : q. Ce n'est pas comme ça que crontab -e fonctionne, mais ça se rapproche assez facilement.

Edit:
I Missed cette partie (ou peut-être la question a été modifié par la suite):

A la sortie, je veux le script Perl d'origine pour traiter le fichier modifié.

Ce n'est pas la meilleure façon de le faire, mais aller avec ma première réponse, cela fonctionne (si vous enregistrez le fichier comme file.txt):

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

les commandes il suffit de remplacer perl avec vos commandes perl et ça devrait marcher. Comme je l'ai dit, ce n'est pas la meilleure réponse, mais cela devrait fonctionner.

3

Une suggestion: Pourquoi ne pas attraper la source à crontab et voir ce qu'il fait?

En plus de cela, vous aurez votre réponse.

Et je pense que la façon de penser à ce sujet est:.

« D'accord, je besoin d'un programme pour écrire un fichier, appelez vim, puis faire un traitement ultérieur du dossier Donc, voici ma routine d'écrire le fichier, voici ma routine qui appelle vim (using system), et voici ma routine pour faire le post-traitement après que vim soit fait maintenant je vais les lacer tous ensemble dans mon programme principal, et j'ai terminé!

5
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; 
+0

Peut-être que vous voulez 'unlink ($ fname)' après que vous avez terminé, aussi. – ephemient

+0

Il est inutile car File :: Temp le fera pour vous. Voir File :: Temp pour plus de détails. –

Questions connexes