Title: Add shell session logging option to IDLE
Type: enhancement Stage: test needed
Components: IDLE Versions: Python 3.9, Python 3.8, Python 3.7
Status: open Resolution:
Dependencies: Superseder:
Assigned To: terry.reedy Nosy List: grantjenks, rhettinger, taleinat, terry.reedy
Priority: normal Keywords:

Created on 2015-03-14 23:38 by rhettinger, last changed 2019-08-10 07:17 by terry.reedy.

Messages (7)
msg238109 - (view) Author: Raymond Hettinger (rhettinger) * (Python committer) Date: 2015-03-14 23:38
IDLE's interactive shell supports File / Save to save an interactive session.  However, if a user restarts a session or accidentally exits without saving, all is lost.

In Python courses I've taught, there has been a recurring request for an auto-logging feature (save the session at some regular interval).  This would help user's record everything they type during a Python class.

I suggest an addition to the File menu (for the interactive shell only): Session Logging Enable/Disable.
msg238740 - (view) Author: Terry J. Reedy (terry.reedy) * (Python committer) Date: 2015-03-20 23:42
I do not see how Restart (as opposed to a proposed Clear option) loses anything.  However, closing without saving definitely anything since a save.  Moreover, even after saving Shell once, there is no Save on Close box displayed (as for editor windows) when closing Shell without saving.  This has been discussed somewhere (maybe StackOverflow) but I do not find an issue.

Raymond, would it be sufficient if saving once would mean that one could not close (or clear the window) without being prompted to save again?  What if we add timed autosaves #21152 (based on your comment on #21140, msg215485), or autosave (or autoappend) with each prompt?
msg238743 - (view) Author: Raymond Hettinger (rhettinger) * (Python committer) Date: 2015-03-21 00:26
Autosave would suffice.  :-)

The "restart" issue wasn't the usual restart you get by pressing F5.  What is happening is that someone does an action that kills or hangs the IDLE app, then they have to force close and restart IDLE itself.
msg238745 - (view) Author: Terry J. Reedy (terry.reedy) * (Python committer) Date: 2015-03-21 01:13
Do you know if, when a process is killed, date written to open files gets flushed to disk?
msg302498 - (view) Author: Grant Jenks (grantjenks) * Date: 2017-09-19 03:23
+1 from me. I'd like to see it ask me to save when I close the window if I've already saved once.
msg349315 - (view) Author: Tal Einat (taleinat) * (Python committer) Date: 2019-08-09 20:26
I'm happy to look into implementing this. Also perhaps auto-saved backups for edited files.

Where would you suggest the files be kept? The user's .idlerc directory?
msg349334 - (view) Author: Terry J. Reedy (terry.reedy) * (Python committer) Date: 2019-08-10 07:17
A dirty editor must be saved before running, or discarded before closing.  Neither is true for Shell,  Making these at least an option in Shell should be the first change.  If the user has specified a savefile name, that should be used, and the user is responsible for the file.  If a file is automatically put, say, in .idlerc/, there is an issue of when to delete or overwrite.

We should continue working to make automatic, versus explicit, shell logging less necessary.

If IDLE running in normal mode (user code running in a separate process) either closes by itself or locks up so that it *must* be closed, that should indicates a bug in python or IDLE that should be fixed.  There might be a couple such bugs left, I am not sure.

If the user process closes, the shell should restart one automatically. As far as I know, it dies.

If the user process hangs, control-C (Shell => Interrupt Execution) usually works,
  >>> while 1: 2+2
But a) beginning computer user may not know about ^C, or it may not work due to limitations in Python.  (There is an issue about the latter.)  In the latter case, one can restart with Shell => Restart Shell, but this is IDLE specific and users may not know about it.

When the shell catches ^C, it could create an after callback with a delay of, say, .5 seconds (but to be determined).  If ^C works, cancel the callback.  If not, display a message (only once per session) about using Restart.  Maybe next time, do an auto restart.

We might also think about detecting a hang (5 seconds, no output?) and printing a message about using ^C.
Date User Action Args
2019-08-10 07:17:16terry.reedysetassignee: terry.reedy
stage: test needed
messages: + msg349334
versions: + Python 3.7, Python 3.8, Python 3.9, - Python 3.5
2019-08-09 20:26:44taleinatsetnosy: + taleinat
messages: + msg349315
2017-09-19 03:23:41grantjenkssetnosy: + grantjenks
messages: + msg302498
2015-03-21 01:13:36terry.reedysetmessages: + msg238745
2015-03-21 00:26:41rhettingersetmessages: + msg238743
2015-03-20 23:42:45terry.reedysetnosy: + terry.reedy
messages: + msg238740
2015-03-14 23:38:05rhettingercreate