Skip to content

Commit 9e6015c

Browse files
Toggle file watching on and off with F5
Currently only turns off reloading, NOT WATCHING OF FILES!
1 parent c53cf2a commit 9e6015c

File tree

3 files changed

+41
-12
lines changed

3 files changed

+41
-12
lines changed

bpython/config.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ def loadini(struct, configfile):
7979
'save': 'C-s',
8080
'show_source': 'F2',
8181
'suspend': 'C-z',
82+
'toggle_file_watch': 'F5',
8283
'undo': 'C-r',
8384
'reimport': 'F6',
8485
'search': 'C-o',
@@ -120,6 +121,7 @@ def loadini(struct, configfile):
120121
struct.search_key = config.get('keyboard', 'search')
121122
struct.show_source_key = config.get('keyboard', 'show_source')
122123
struct.suspend_key = config.get('keyboard', 'suspend')
124+
struct.toggle_file_watch_key = config.get('keyboard', 'toggle_file_watch')
123125
struct.undo_key = config.get('keyboard', 'undo')
124126
struct.reimport_key = config.get('keyboard', 'reimport')
125127
struct.up_one_line_key = config.get('keyboard', 'up_one_line')

bpython/curtsiesfrontend/interaction.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,22 @@ def __init__(self, initial_message='', permanent_text="", refresh_request=lambda
2929
self._message = initial_message
3030
self.message_start_time = time.time()
3131
self.message_time = 3
32-
self.permanent_text = permanent_text
32+
self.permanent_stack = []
33+
if permanent_text:
34+
self.permanent_stack.append(permanent_text)
3335
self.main_greenlet = greenlet.getcurrent()
3436
self.request_greenlet = None
3537
self.refresh_request = refresh_request
3638

39+
def push_permanent_message(self, msg):
40+
self.permanent_stack.append(msg)
41+
42+
def pop_permanent_message(self, msg):
43+
if msg in self.permanent_stack:
44+
self.permanent_stack.remove(msg)
45+
else:
46+
raise ValueError("Messsage %r was not in permanent_stack" % msg)
47+
3748
@property
3849
def has_focus(self):
3950
return self.in_prompt or self.in_confirm or self.waiting_for_refresh
@@ -102,12 +113,13 @@ def current_line(self):
102113
return self.prompt
103114
if self._message:
104115
return self._message
105-
return self.permanent_text
116+
if self.permanent_stack:
117+
return self.permanent_stack[-1]
118+
return ''
106119

107120
@property
108121
def should_show_message(self):
109-
self._check_for_expired_message()
110-
return bool(self._message)
122+
return bool(self.current_line)
111123

112124
# interaction interface - should be called from other greenlets
113125
def notify(self, msg, n=3):

bpython/curtsiesfrontend/repl.py

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -220,9 +220,11 @@ def smarter_request_refresh(when='now'):
220220
self.get_term_hw = get_term_hw
221221
self.get_cursor_vertical_diff = get_cursor_vertical_diff
222222

223-
self.status_bar = StatusBar(banner if config.curtsies_fill_terminal else '', _(
224-
" <%s> Rewind <%s> Save <%s> Pastebin <%s> Editor"
225-
) % (config.undo_key, config.save_key, config.pastebin_key, config.external_editor_key),
223+
self.status_bar = StatusBar(
224+
banner if config.curtsies_fill_terminal else '',
225+
(_(" <%s> Rewind <%s> Save <%s> Pastebin <%s> Editor")
226+
% (config.undo_key, config.save_key, config.pastebin_key, config.external_editor_key)
227+
if config.curtsies_fill_terminal else ''),
226228
refresh_request=self.request_refresh
227229
)
228230
self.rl_char_sequences = get_updated_char_sequences(key_dispatch, config)
@@ -262,6 +264,7 @@ def smarter_request_refresh(when='now'):
262264
self.paste_mode = False
263265
self.current_match = None
264266
self.list_win_visible = False
267+
self.watching_files = False
265268

266269
self.original_modules = sys.modules.keys()
267270

@@ -361,13 +364,25 @@ def process_event(self, e):
361364
self.update_completion()
362365
return
363366

364-
elif isinstance(e, events.ReloadEvent) or e in key_dispatch[self.config.reimport_key]:
365-
self.clear_modules_and_reevaluate()
366-
self.update_completion()
367-
if isinstance(e, events.ReloadEvent):
367+
elif isinstance(e, events.ReloadEvent):
368+
if self.watching_files:
369+
self.clear_modules_and_reevaluate()
370+
self.update_completion()
368371
self.status_bar.message('Reloaded at ' + time.strftime('%H:%M:%S') + ' because ' + ' & '.join(e.files_modified) + ' modified')
372+
373+
elif e in key_dispatch[self.config.toggle_file_watch_key]:
374+
msg = "Auto-reloading active, watching for file changes..."
375+
if self.watching_files:
376+
self.watching_files = False
377+
self.status_bar.pop_permanent_message(msg)
369378
else:
370-
self.status_bar.message('Reloaded at ' + time.strftime('%H:%M:%S') + ' by user')
379+
self.watching_files = True
380+
self.status_bar.push_permanent_message(msg)
381+
382+
elif e in key_dispatch[self.config.reimport_key]:
383+
self.clear_modules_and_reevaluate()
384+
self.update_completion()
385+
self.status_bar.message('Reloaded at ' + time.strftime('%H:%M:%S') + ' by user')
371386

372387
elif (e in ("<RIGHT>", '<Ctrl-f>') and self.config.curtsies_right_arrow_completion
373388
and self.cursor_offset == len(self.current_line)):

0 commit comments

Comments
 (0)