|
|
"""
|
|
|
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,
|
|
|
}
|
|
|
|