1""" 
    2Utilities function for keybinding with prompt toolkit. 
    3 
    4This will be bound to specific key press and filter modes, 
    5like whether we are in edit mode, and whether the completer is open. 
    6""" 
    7 
    8import re 
    9from prompt_toolkit.key_binding import KeyPressEvent 
    10 
    11 
    12def parenthesis(event: KeyPressEvent): 
    13    """Auto-close parenthesis""" 
    14    event.current_buffer.insert_text("()") 
    15    event.current_buffer.cursor_left() 
    16 
    17 
    18def brackets(event: KeyPressEvent): 
    19    """Auto-close brackets""" 
    20    event.current_buffer.insert_text("[]") 
    21    event.current_buffer.cursor_left() 
    22 
    23 
    24def braces(event: KeyPressEvent): 
    25    """Auto-close braces""" 
    26    event.current_buffer.insert_text("{}") 
    27    event.current_buffer.cursor_left() 
    28 
    29 
    30def double_quote(event: KeyPressEvent): 
    31    """Auto-close double quotes""" 
    32    event.current_buffer.insert_text('""') 
    33    event.current_buffer.cursor_left() 
    34 
    35 
    36def single_quote(event: KeyPressEvent): 
    37    """Auto-close single quotes""" 
    38    event.current_buffer.insert_text("''") 
    39    event.current_buffer.cursor_left() 
    40 
    41 
    42def docstring_double_quotes(event: KeyPressEvent): 
    43    """Auto-close docstring (double quotes)""" 
    44    event.current_buffer.insert_text('""""') 
    45    event.current_buffer.cursor_left(3) 
    46 
    47 
    48def docstring_single_quotes(event: KeyPressEvent): 
    49    """Auto-close docstring (single quotes)""" 
    50    event.current_buffer.insert_text("''''") 
    51    event.current_buffer.cursor_left(3) 
    52 
    53 
    54def raw_string_parenthesis(event: KeyPressEvent): 
    55    """Auto-close parenthesis in raw strings""" 
    56    matches = re.match( 
    57        r".*(r|R)[\"'](-*)", 
    58        event.current_buffer.document.current_line_before_cursor, 
    59    ) 
    60    dashes = matches.group(2) if matches else "" 
    61    event.current_buffer.insert_text("()" + dashes) 
    62    event.current_buffer.cursor_left(len(dashes) + 1) 
    63 
    64 
    65def raw_string_bracket(event: KeyPressEvent): 
    66    """Auto-close bracker in raw strings""" 
    67    matches = re.match( 
    68        r".*(r|R)[\"'](-*)", 
    69        event.current_buffer.document.current_line_before_cursor, 
    70    ) 
    71    dashes = matches.group(2) if matches else "" 
    72    event.current_buffer.insert_text("[]" + dashes) 
    73    event.current_buffer.cursor_left(len(dashes) + 1) 
    74 
    75 
    76def raw_string_braces(event: KeyPressEvent): 
    77    """Auto-close braces in raw strings""" 
    78    matches = re.match( 
    79        r".*(r|R)[\"'](-*)", 
    80        event.current_buffer.document.current_line_before_cursor, 
    81    ) 
    82    dashes = matches.group(2) if matches else "" 
    83    event.current_buffer.insert_text("{}" + dashes) 
    84    event.current_buffer.cursor_left(len(dashes) + 1) 
    85 
    86 
    87def skip_over(event: KeyPressEvent): 
    88    """Skip over automatically added parenthesis/quote. 
    89 
    90    (rather than adding another parenthesis/quote)""" 
    91    event.current_buffer.cursor_right() 
    92 
    93 
    94def delete_pair(event: KeyPressEvent): 
    95    """Delete auto-closed parenthesis""" 
    96    event.current_buffer.delete() 
    97    event.current_buffer.delete_before_cursor() 
    98 
    99 
    100auto_match_parens = {"(": parenthesis, "[": brackets, "{": braces} 
    101auto_match_parens_raw_string = { 
    102    "(": raw_string_parenthesis, 
    103    "[": raw_string_bracket, 
    104    "{": raw_string_braces, 
    105}