| """ | |
| Utilities function for keybinding with prompt toolkit. | |
| This will be bound to specific key press and filter modes, | |
| like whether we are in edit mode, and whether the completer is open. | |
| """ | |
| import re | |
| from prompt_toolkit.key_binding import KeyPressEvent | |
| def parenthesis(event: KeyPressEvent): | |
| """Auto-close parenthesis""" | |
| event.current_buffer.insert_text("()") | |
| event.current_buffer.cursor_left() | |
| def brackets(event: KeyPressEvent): | |
| """Auto-close brackets""" | |
| event.current_buffer.insert_text("[]") | |
| event.current_buffer.cursor_left() | |
| def braces(event: KeyPressEvent): | |
| """Auto-close braces""" | |
| event.current_buffer.insert_text("{}") | |
| event.current_buffer.cursor_left() | |
| def double_quote(event: KeyPressEvent): | |
| """Auto-close double quotes""" | |
| event.current_buffer.insert_text('""') | |
| event.current_buffer.cursor_left() | |
| def single_quote(event: KeyPressEvent): | |
| """Auto-close single quotes""" | |
| event.current_buffer.insert_text("''") | |
| event.current_buffer.cursor_left() | |
| def docstring_double_quotes(event: KeyPressEvent): | |
| """Auto-close docstring (double quotes)""" | |
| event.current_buffer.insert_text('""""') | |
| event.current_buffer.cursor_left(3) | |
| def docstring_single_quotes(event: KeyPressEvent): | |
| """Auto-close docstring (single quotes)""" | |
| event.current_buffer.insert_text("''''") | |
| event.current_buffer.cursor_left(3) | |
| def raw_string_parenthesis(event: KeyPressEvent): | |
| """Auto-close parenthesis in raw strings""" | |
| matches = re.match( | |
| r".*(r|R)[\"'](-*)", | |
| event.current_buffer.document.current_line_before_cursor, | |
| ) | |
| dashes = matches.group(2) if matches else "" | |
| event.current_buffer.insert_text("()" + dashes) | |
| event.current_buffer.cursor_left(len(dashes) + 1) | |
| def raw_string_bracket(event: KeyPressEvent): | |
| """Auto-close bracker in raw strings""" | |
| matches = re.match( | |
| r".*(r|R)[\"'](-*)", | |
| event.current_buffer.document.current_line_before_cursor, | |
| ) | |
| dashes = matches.group(2) if matches else "" | |
| event.current_buffer.insert_text("[]" + dashes) | |
| event.current_buffer.cursor_left(len(dashes) + 1) | |
| def raw_string_braces(event: KeyPressEvent): | |
| """Auto-close braces in raw strings""" | |
| matches = re.match( | |
| r".*(r|R)[\"'](-*)", | |
| event.current_buffer.document.current_line_before_cursor, | |
| ) | |
| dashes = matches.group(2) if matches else "" | |
| event.current_buffer.insert_text("{}" + dashes) | |
| event.current_buffer.cursor_left(len(dashes) + 1) | |
| def skip_over(event: KeyPressEvent): | |
| """Skip over automatically added parenthesis/quote. | |
| (rather than adding another parenthesis/quote)""" | |
| event.current_buffer.cursor_right() | |
| def delete_pair(event: KeyPressEvent): | |
| """Delete auto-closed parenthesis""" | |
| event.current_buffer.delete() | |
| event.current_buffer.delete_before_cursor() | |
| auto_match_parens = {"(": parenthesis, "[": brackets, "{": braces} | |
| auto_match_parens_raw_string = { | |
| "(": raw_string_parenthesis, | |
| "[": raw_string_bracket, | |
| "{": raw_string_braces, | |
| } | |