X Tutup
Skip to content

Commit 32e2964

Browse files
ctrl-x -> edit current line/block
1 parent b4bef26 commit 32e2964

File tree

1 file changed

+47
-9
lines changed

1 file changed

+47
-9
lines changed

bpython/curtsiesfrontend/repl.py

Lines changed: 47 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -259,15 +259,7 @@ def process_event(self, e):
259259
elif isinstance(e, events.PasteEvent):
260260
self.paste_mode = True
261261
for ee in e.events:
262-
if ee in ("\n", "\r", "PAD_ENTER"):
263-
self.on_enter()
264-
while self.fake_refresh_request:
265-
self.fake_refresh_request = False
266-
self.process_event(events.RefreshRequestEvent())
267-
elif isinstance(ee, events.Event):
268-
pass # ignore events in a paste
269-
else:
270-
self.add_normal_character(ee if len(ee) == 1 else ee[-1]) #strip control seq
262+
self.process_simple_event(ee)
271263
self.paste_mode = False
272264
self.update_completion()
273265

@@ -331,6 +323,8 @@ def process_event(self, e):
331323
elif e in key_dispatch[self.config.external_editor_key]:
332324
self.send_to_external_editor()
333325
#TODO add PAD keys hack as in bpython.cli
326+
elif e in [""]:
327+
self.send_current_block_to_external_editor()
334328
else:
335329
self.add_normal_character(e if len(e) == 1 else e[-1]) #strip control seq
336330
self.update_completion()
@@ -868,6 +862,50 @@ def send_to_external_editor(self, filename=None):
868862
self._current_line = lines[-1][4:]
869863
self.cursor_offset_in_line = len(self._current_line)
870864

865+
def get_current_block(self):
866+
return '\n'.join(self.buffer + [self._current_line])
867+
868+
def clear_current_block(self):
869+
self.display_buffer = []
870+
[self.history.pop() for _ in self.buffer]
871+
self.buffer = []
872+
self.cursor_offset_in_line = 0
873+
self.saved_indent = 0
874+
self._current_line = ''
875+
self.cursor_offset_in_line = len(self._current_line)
876+
self.done = True
877+
878+
def send_current_block_to_external_editor(self, filename=None):
879+
editor = os.environ.get('VISUAL', os.environ.get('EDITOR', 'vim'))
880+
editor_args = editor.split()
881+
text = self.get_current_block()
882+
self.clear_current_block()
883+
with tempfile.NamedTemporaryFile(suffix='.py') as temp:
884+
temp.write(text.encode('utf8'))
885+
temp.flush()
886+
subprocess.call(editor_args + [temp.name])
887+
lines = [line for line in open(temp.name).read().split('\n')]
888+
while not lines[-1].split():
889+
lines.pop()
890+
events = '\n'.join(lines + ([''] if len(lines) == 1 else ['', '']))
891+
self.paste_mode = True
892+
for e in events:
893+
self.process_simple_event(e)
894+
self.paste_mode = False
895+
self._current_line = ''
896+
self.cursor_offset_in_line = len(self._current_line)
897+
898+
def process_simple_event(self, e):
899+
if e in ("\n", "\r", "PAD_ENTER"):
900+
self.on_enter()
901+
while self.fake_refresh_request:
902+
self.fake_refresh_request = False
903+
self.process_event(events.RefreshRequestEvent())
904+
elif isinstance(e, events.Event):
905+
pass # ignore events
906+
else:
907+
self.add_normal_character(e if len(e) == 1 else e[-1]) #strip control seq
908+
871909
def simple_repl():
872910
refreshes = []
873911
def request_refresh():

0 commit comments

Comments
 (0)
X Tutup