Idiom for shelling out to $EDITOR/$PAGER?

T

Tim Chase

After a little searching, I've not been able to come up with what
I'd consider canonical examples of consider calling an external
editor/pager on a file and reading the results back in. (most of
my results are swamped by people asking about editors written in
Python, or what the best editors for Python code are)

The pseudocode would be something like

def edit_text(data):
temp_fname = generate_temp_name()
try:
f = file(temp_fname, 'w')
f.write(data)
f.close()
before = info(temp_fname) # maybe stat+checksum?
editor = find_sensible_editor()
subprocess.call([editor, temp_fname])
if before == info(temp_fname):
return None
else:
return file(temp_fname).read()
finally:
delete_if_exists(temp_fname)

However there are things to watch out for in this lousy code:

-race conditions, unique naming, and permissions on the temp file

-proper & efficient detection of file-change, to know whether the
user actually did anything

-cross-platform determination of a sensible editor (that blocks
rather than spawns), using platform conventions like
os.environ['EDITOR']

-cleanup deletion of the temp-file

I presume the code for spawning $PAGER on some content would look
pretty similar.

Any good example code (or blog posts, or other links) that has
been battle-tested?

Thanks,

-tkc
 
S

Steven D'Aprano

I presume the code for spawning $PAGER on some content would look pretty
similar.

Have a look at pydoc in the standard library, which implements pager-like
functionality.
 
O

Owen Jacobson

MacOSX has "open", though it won't be running a blocking editor, alas.

But it can be. From the man page:

-t Causes the file to be opened with the default text editor, as deter-
mined via LaunchServices

and

-W Causes open to wait until the applications it opens (or that were
already open) have exited. Use with the -n flag to allow open to
function as an appropriate app for the $EDITOR environment variable.

and finally

-n Open a new instance of the application(s) even if one is already run-
ning.

can be combined to make 'open' (the shell interface to OS X's
LaunchServices system) into a workable $EDITOR.

-o
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top