diff --git a/pyreadline/keysyms/keysyms.py b/pyreadline/keysyms/keysyms.py index 6d62de7..f07e1f5 100644 --- a/pyreadline/keysyms/keysyms.py +++ b/pyreadline/keysyms/keysyms.py @@ -117,6 +117,8 @@ def make_KeyPress(char,state,keycode): shift = (state & 0x10) != 0 if control and char !="\x00": char = chr(VkKeyScan(ord(char)) & 0xff) + elif control and meta and char !="\x00": + char = chr(VkKeyScan(ord(char)) & 0xff) elif control: char=chr(keycode) try: diff --git a/pyreadline/modes/basemode.py b/pyreadline/modes/basemode.py index dfaa449..3767acf 100644 --- a/pyreadline/modes/basemode.py +++ b/pyreadline/modes/basemode.py @@ -144,7 +144,7 @@ class BaseMode(object): def _bind_key(self, key, func): - '''setup the mapping from key to call the function.''' + """setup the mapping from key to call the function.""" if type(func) != type(self._bind_key): print "Trying to bind non method to keystroke:%s,%s"%(key,func) raise PyreadlineError("Trying to bind non method to keystroke:%s,%s,%s,%s"%(key,func,type(func),type(self._bind_key))) @@ -153,20 +153,20 @@ class BaseMode(object): self.key_dispatch[keyinfo] = func def _bind_exit_key(self, key): - '''setup the mapping from key to call the function.''' + """setup the mapping from key to call the function.""" keyinfo = make_KeyPress_from_keydescr(key.lower()).tuple() self.exit_dispatch[keyinfo] = None def init_editing_mode(self, e): # (C-e) - '''When in vi command mode, this causes a switch to emacs editing - mode.''' + """When in vi command mode, this causes a switch to emacs editing + mode.""" raise NotImplementedError #completion commands def _get_completions(self): - '''Return a list of possible completions for the string ending at the point. - Also set begidx and endidx in the process.''' + """Return a list of possible completions for the string ending at the point. + Also set begidx and endidx in the process.""" completions = [] self.begidx = self.l_buffer.point self.endidx = self.l_buffer.point @@ -235,9 +235,9 @@ class BaseMode(object): def complete(self, e): # (TAB) - '''Attempt to perform completion on the text before point. The + """Attempt to perform completion on the text before point. The actual completion performed is application-specific. The default is - filename completion.''' + filename completion.""" completions = self._get_completions() if completions: cprefix = commonprefix(completions) @@ -254,13 +254,13 @@ class BaseMode(object): self._bell() def possible_completions(self, e): # (M-?) - '''List the possible completions of the text before point. ''' + """List the possible completions of the text before point. """ completions = self._get_completions() self._display_completions(completions) def insert_completions(self, e): # (M-*) - '''Insert all completions of the text before point that would have - been generated by possible-completions.''' + """Insert all completions of the text before point that would have + been generated by possible-completions.""" completions = self._get_completions() b = self.begidx e = self.endidx @@ -273,7 +273,7 @@ class BaseMode(object): self.line_cursor = b def menu_complete(self, e): # () - '''Similar to complete, but replaces the word to be completed with a + """Similar to complete, but replaces the word to be completed with a single match from the list of possible completions. Repeated execution of menu-complete steps through the list of possible completions, inserting each match in turn. At the end of the list of @@ -281,154 +281,153 @@ class BaseMode(object): and the original text is restored. An argument of n moves n positions forward in the list of matches; a negative argument may be used to move backward through the list. This command is intended to - be bound to TAB, but is unbound by default.''' + be bound to TAB, but is unbound by default.""" pass ### Methods below here are bindable emacs functions def insert_text(self, string): - '''Insert text into the command line.''' + """Insert text into the command line.""" self.l_buffer.insert_text(string) def beginning_of_line(self, e): # (C-a) - '''Move to the start of the current line. ''' + """Move to the start of the current line. """ self.l_buffer.beginning_of_line() def end_of_line(self, e): # (C-e) - '''Move to the end of the line. ''' + """Move to the end of the line. """ self.l_buffer.end_of_line() def forward_char(self, e): # (C-f) - '''Move forward a character. ''' + """Move forward a character. """ self.l_buffer.forward_char(self.argument_reset) def backward_char(self, e): # (C-b) - '''Move back a character. ''' + """Move back a character. """ self.l_buffer.backward_char(self.argument_reset) def forward_word(self, e): # (M-f) - '''Move forward to the end of the next word. Words are composed of - letters and digits.''' + """Move forward to the end of the next word. Words are composed of + letters and digits.""" self.l_buffer.forward_word(self.argument_reset) def backward_word(self, e): # (M-b) - '''Move back to the start of the current or previous word. Words are - composed of letters and digits.''' + """Move back to the start of the current or previous word. Words are + composed of letters and digits.""" self.l_buffer.backward_word(self.argument_reset) def forward_word_end(self, e): # () - '''Move forward to the end of the next word. Words are composed of - letters and digits.''' + """Move forward to the end of the next word. Words are composed of + letters and digits.""" self.l_buffer.forward_word_end(self.argument_reset) def backward_word_end(self, e): # () - '''Move forward to the end of the next word. Words are composed of - letters and digits.''' + """Move forward to the end of the next word. Words are composed of + letters and digits.""" self.l_buffer.backward_word_end(self.argument_reset) ### Movement with extend selection def beginning_of_line_extend_selection(self, e): # - '''Move to the start of the current line. ''' + """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. ''' + """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. ''' + """Move forward a character. """ self.l_buffer.forward_char_extend_selection(self.argument_reset) def backward_char_extend_selection(self, e): # - '''Move back a character. ''' + """Move back a character. """ self.l_buffer.backward_char_extend_selection(self.argument_reset) def forward_word_extend_selection(self, e): # - '''Move forward to the end of the next word. Words are composed of - letters and digits.''' + """Move forward to the end of the next word. Words are composed of + letters and digits.""" self.l_buffer.forward_word_extend_selection(self.argument_reset) 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.''' + """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(self.argument_reset) def forward_word_end_extend_selection(self, e): # - '''Move forward to the end of the next word. Words are composed of - letters and digits.''' + """Move forward to the end of the next word. Words are composed of + letters and digits.""" self.l_buffer.forward_word_end_extend_selection(self.argument_reset) def backward_word_end_extend_selection(self, e): # - '''Move forward to the end of the next word. Words are composed of - letters and digits.''' + """Move forward to the end of the next word. Words are composed of + letters and digits.""" self.l_buffer.forward_word_end_extend_selection(self.argument_reset) ######## Change case def upcase_word(self, e): # (M-u) - '''Uppercase the current (or following) word. With a negative - argument, uppercase the previous word, but do not move the cursor.''' + """Uppercase the current (or following) word. With a negative + argument, uppercase the previous word, but do not move the cursor.""" self.l_buffer.upcase_word() def downcase_word(self, e): # (M-l) - '''Lowercase the current (or following) word. With a negative - argument, lowercase the previous word, but do not move the cursor.''' + """Lowercase the current (or following) word. With a negative + argument, lowercase the previous word, but do not move the cursor.""" self.l_buffer.downcase_word() def capitalize_word(self, e): # (M-c) - '''Capitalize the current (or following) word. With a negative - argument, capitalize the previous word, but do not move the cursor.''' + """Capitalize the current (or following) word. With a negative + argument, capitalize the previous word, but do not move the cursor.""" self.l_buffer.capitalize_word() ######## 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.''' + """Clear the screen and redraw the current line, leaving the current + line at the top of the screen.""" self.console.page() def redraw_current_line(self, e): # () - '''Refresh the current line. By default, this is unbound.''' + """Refresh the current line. By default, this is unbound.""" pass def accept_line(self, e): # (Newline or Return) - '''Accept the line regardless of where the cursor is. If this line + """Accept the line regardless of where the cursor is. If this line is non-empty, it may be added to the history list for future recall with add_history(). If this line is a modified history line, the - history line is restored to its original state.''' + history line is restored to its original state.""" return True def delete_char(self, e): # (C-d) - '''Delete the character at point. If point is at the beginning of + """Delete the character at point. If point is at the beginning of the line, there are no characters in the line, and the last - character typed was not bound to delete-char, then return EOF.''' + character typed was not bound to delete-char, then return EOF.""" self.l_buffer.delete_char(self.argument_reset) def backward_delete_char(self, e): # (Rubout) - '''Delete the character behind the cursor. A numeric argument means - to kill the characters instead of deleting them.''' + """Delete the character behind the cursor. A numeric argument means + to kill the characters instead of deleting them.""" self.l_buffer.backward_delete_char(self.argument_reset) def backward_delete_word(self, e): # (Control-Rubout) - '''Delete the character behind the cursor. A numeric argument means - to kill the characters instead of deleting them.''' + """Delete the character behind the cursor. A numeric argument means + to kill the characters instead of deleting them.""" self.l_buffer.backward_delete_word(self.argument_reset) def forward_delete_word(self, e): # (Control-Delete) - '''Delete the character behind the cursor. A numeric argument means - to kill the characters instead of deleting them.''' + """Delete the character behind the cursor. A numeric argument means + to kill the characters instead of deleting them.""" self.l_buffer.forward_delete_word(self.argument_reset) def delete_horizontal_space(self, e): # () - '''Delete all spaces and tabs around point. By default, this is unbound. ''' + """Delete all spaces and tabs around point. By default, this is unbound. """ self.l_buffer.delete_horizontal_space() def self_insert(self, e): # (a, b, A, 1, !, ...) - '''Insert yourself. ''' - + """Insert yourself. """ if e.char and ord(e.char)!=0: #don't insert null character in buffer, can happen with dead keys. self.insert_text(e.char) @@ -436,8 +435,8 @@ class BaseMode(object): # Paste from clipboard def paste(self,e): - '''Paste windows clipboard. - Assume single line strip other lines and end of line markers and trailing spaces''' #(Control-v) + """Paste windows clipboard. + Assume single line strip other lines and end of line markers and trailing spaces""" #(Control-v) if self.enable_win32_clipboard: txt=clipboard.get_clipboard_text_and_convert(False) txt=txt.split("\n")[0].strip("\r").strip("\n") @@ -445,8 +444,8 @@ class BaseMode(object): self.insert_text(txt) def paste_mulitline_code(self,e): - '''Paste windows clipboard as multiline code. - Removes any empty lines in the code''' + """Paste windows clipboard as multiline code. + Removes any empty lines in the code""" reg=re.compile("\r?\n") if self.enable_win32_clipboard: txt=clipboard.get_clipboard_text_and_convert(False) @@ -462,10 +461,10 @@ class BaseMode(object): return False def ipython_paste(self,e): - '''Paste windows clipboard. If enable_ipython_paste_list_of_lists is + """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 enable_ipython_paste_for_paths==True then change \\ to / and spaces to \space''' + If enable_ipython_paste_for_paths==True then change \\ to / and spaces to \space""" if self.enable_win32_clipboard: txt=clipboard.get_clipboard_text_and_convert( self.enable_ipython_paste_list_of_lists) @@ -476,22 +475,22 @@ class BaseMode(object): def copy_region_to_clipboard(self, e): # () - '''Copy the text in the region to the windows clipboard.''' + """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.''' + """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.''' + """Copy the text in the region to the windows clipboard.""" self.l_buffer.cut_selection_to_clipboard() def dump_functions(self, e): # () - '''Print all of the functions and their key bindings to the Readline + """Print all of the functions and their key bindings to the Readline output stream. If a numeric argument is supplied, the output is formatted in such a way that it can be made part of an inputrc - file. This command is unbound by default.''' + file. This command is unbound by default.""" print txt="\n".join(self.rl_settings_to_string()) print txt diff --git a/pyreadline/rlmain.py b/pyreadline/rlmain.py index cf2bcd6..617044f 100644 --- a/pyreadline/rlmain.py +++ b/pyreadline/rlmain.py @@ -490,7 +490,6 @@ class Readline(BaseReadline): event = c.getkeypress() except KeyboardInterrupt: event=self.handle_ctrl_c() - result=self.mode.process_keyevent(event.keyinfo) self._update_line() return result @@ -529,10 +528,6 @@ class Readline(BaseReadline): - - - - # create a Readline object to contain the state rl = Readline()