auto_match.py
104 lines
| 3.0 KiB
| text/x-python
|
PythonLexer
Matthias Bussonnier
|
r28030 | """ | ||
krassowski
|
r28074 | Utilities function for keybinding with prompt toolkit. | ||
Matthias Bussonnier
|
r28030 | |||
krassowski
|
r28074 | This will be bound to specific key press and filter modes, | ||
Matthias Bussonnier
|
r28030 | like whether we are in edit mode, and whether the completer is open. | ||
""" | ||||
krassowski
|
r28010 | 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, | ||||
) | ||||
krassowski
|
r28011 | dashes = matches.group(2) if matches else "" | ||
krassowski
|
r28010 | 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, | ||||
) | ||||
krassowski
|
r28011 | dashes = matches.group(2) if matches else "" | ||
krassowski
|
r28010 | 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, | ||||
) | ||||
krassowski
|
r28011 | dashes = matches.group(2) if matches else "" | ||
krassowski
|
r28010 | event.current_buffer.insert_text("{}" + dashes) | ||
event.current_buffer.cursor_left(len(dashes) + 1) | ||||
def skip_over(event: KeyPressEvent): | ||||
krassowski
|
r28074 | """Skip over automatically added parenthesis/quote. | ||
krassowski
|
r28010 | |||
krassowski
|
r28074 | (rather than adding another parenthesis/quote)""" | ||
krassowski
|
r28010 | event.current_buffer.cursor_right() | ||
def delete_pair(event: KeyPressEvent): | ||||
"""Delete auto-closed parenthesis""" | ||||
event.current_buffer.delete() | ||||
event.current_buffer.delete_before_cursor() | ||||
Matthias Bussonnier
|
r28032 | |||
auto_match_parens = {"(": parenthesis, "[": brackets, "{": braces} | ||||
auto_match_parens_raw_string = { | ||||
"(": raw_string_parenthesis, | ||||
"[": raw_string_bracket, | ||||
"{": raw_string_braces, | ||||
} | ||||