mirror of
https://github.com/wassname/pyreadline.git
synced 2026-08-17 11:24:37 +08:00
pyreadline-refactor: Added visible selection mode to emacs-mode.
This commit is contained in:
@@ -6,12 +6,13 @@
|
||||
# Distributed under the terms of the BSD License. The full license is in
|
||||
# the file COPYING, distributed as part of this software.
|
||||
#*****************************************************************************
|
||||
import os
|
||||
import os,re
|
||||
import pyreadline.logger as logger
|
||||
from pyreadline.logger import log
|
||||
from pyreadline.keysyms import key_text_to_keyinfo
|
||||
import pyreadline.lineeditor.lineobj as lineobj
|
||||
import pyreadline.lineeditor.history as history
|
||||
import pyreadline.clipboard as clipboard
|
||||
|
||||
class BaseMode(object):
|
||||
mode="base"
|
||||
@@ -41,11 +42,12 @@ class BaseMode(object):
|
||||
next_meta=property(*_gs("next_meta"))
|
||||
first_prompt=property(*_gs("first_prompt"))
|
||||
prompt=property(*_gs("prompt"))
|
||||
paste_line_buffer=property(*_gs("paste_line_buffer"))
|
||||
|
||||
console=property(_g("console"))
|
||||
insert_text=property(_g("insert_text"))
|
||||
_print_prompt=property(_g("_print_prompt"))
|
||||
_update_line=property(_g("_update_line"))
|
||||
paste_line_buffer=property(_g("paste_line_buffer"))
|
||||
add_history=property(_g("add_history"))
|
||||
_bell=property(_g("_bell"))
|
||||
_clear_after=property(_g("_clear_after"))
|
||||
@@ -54,9 +56,11 @@ class BaseMode(object):
|
||||
_update_prompt_pos=property(_g("_update_prompt_pos"))
|
||||
_update_line=property(_g("_update_line"))
|
||||
enable_win32_clipboard=property(_g("enable_win32_clipboard"))
|
||||
enable_ipython_paste_list_of_lists=property(_g("enable_ipython_paste_list_of_lists"))
|
||||
enable_ipython_paste_for_paths=property(_g("enable_ipython_paste_for_paths"))
|
||||
_bell=property(_g("_bell"))
|
||||
_history=property(_g("_history"))
|
||||
|
||||
|
||||
def _readline_from_keyboard(self):
|
||||
raise NotImplementedError
|
||||
|
||||
@@ -229,6 +233,37 @@ class BaseMode(object):
|
||||
composed of letters and digits.'''
|
||||
self.l_buffer.backward_word()
|
||||
|
||||
|
||||
|
||||
def beginning_of_line_extend_selection(self, e): #
|
||||
'''Move to the start of the current line. '''
|
||||
self.l_buffer.beginning_of_line_extend_selection()
|
||||
|
||||
def end_of_line_extend_selection(self, e): #
|
||||
'''Move to the end of the line. '''
|
||||
self.l_buffer.end_of_line_extend_selection()
|
||||
|
||||
def forward_char_extend_selection(self, e): #
|
||||
'''Move forward a character. '''
|
||||
self.l_buffer.forward_char_extend_selection()
|
||||
|
||||
def backward_char_extend_selection(self, e): #
|
||||
'''Move back a character. '''
|
||||
self.l_buffer.backward_char_extend_selection()
|
||||
|
||||
def forward_word_extend_selection(self, e): #
|
||||
'''Move forward to the end of the next word. Words are composed of
|
||||
letters and digits.'''
|
||||
self.l_buffer.forward_word_extend_selection()
|
||||
|
||||
def backward_word_extend_selection(self, e): #
|
||||
'''Move back to the start of the current or previous word. Words are
|
||||
composed of letters and digits.'''
|
||||
self.l_buffer.backward_word_extend_selection()
|
||||
|
||||
|
||||
|
||||
|
||||
def clear_screen(self, e): # (C-l)
|
||||
'''Clear the screen and redraw the current line, leaving the current
|
||||
line at the top of the screen.'''
|
||||
@@ -257,8 +292,63 @@ class BaseMode(object):
|
||||
to kill the characters instead of deleting them.'''
|
||||
self.l_buffer.backward_delete_char()
|
||||
|
||||
def backward_delete_word(self, e): # (Rubout)
|
||||
'''Delete the character behind the cursor. A numeric argument means
|
||||
to kill the characters instead of deleting them.'''
|
||||
self.l_buffer.backward_delete_word()
|
||||
|
||||
def self_insert(self, e): # (a, b, A, 1, !, ...)
|
||||
'''Insert yourself. '''
|
||||
if ord(e.char)!=0: #don't insert null character in buffer, can happen with dead keys.
|
||||
self.insert_text(e.char)
|
||||
|
||||
|
||||
# Paste from clipboard
|
||||
|
||||
def paste(self,e):
|
||||
'''Paste windows clipboard'''
|
||||
if self.enable_win32_clipboard:
|
||||
txt=clipboard.get_clipboard_text_and_convert(False)
|
||||
self.insert_text(txt)
|
||||
|
||||
def paste_mulitline_code(self,e):
|
||||
'''Paste windows clipboard'''
|
||||
reg=re.compile("\r?\n")
|
||||
if self.enable_win32_clipboard:
|
||||
txt=clipboard.get_clipboard_text_and_convert(False)
|
||||
t=reg.split(txt)
|
||||
t=[row for row in t if row.strip()!=""] #remove empty lines
|
||||
if t!=[""]:
|
||||
self.insert_text(t[0])
|
||||
self.add_history(self.l_buffer.copy())
|
||||
self.paste_line_buffer=t[1:]
|
||||
log("multi: %s"%self.paste_line_buffer)
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
def ipython_paste(self,e):
|
||||
'''Paste windows clipboard. If enable_ipython_paste_list_of_lists is
|
||||
True then try to convert tabseparated data to repr of list of lists or
|
||||
repr of array'''
|
||||
if self.enable_win32_clipboard:
|
||||
txt=clipboard.get_clipboard_text_and_convert(
|
||||
self.enable_ipython_paste_list_of_lists)
|
||||
if self.enable_ipython_paste_for_paths:
|
||||
if len(txt)<300 and ("\t" not in txt) and ("\n" not in txt):
|
||||
txt=txt.replace("\\","/").replace(" ",r"\ ")
|
||||
self.insert_text(txt)
|
||||
|
||||
|
||||
def copy_region_to_clipboard(self, e): # ()
|
||||
'''Copy the text in the region to the windows clipboard.'''
|
||||
self.l_buffer.copy_region_to_clipboard()
|
||||
|
||||
def copy_selection_to_clipboard(self, e): # ()
|
||||
'''Copy the text in the region to the windows clipboard.'''
|
||||
self.l_buffer.copy_selection_to_clipboard()
|
||||
|
||||
def cut_selection_to_clipboard(self, e): # ()
|
||||
'''Copy the text in the region to the windows clipboard.'''
|
||||
self.l_buffer.cut_selection_to_clipboard()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user