
                        `   d dl mZ d dlmZmZmZmZ d dlmZ d dl	m
Z
mZmZ d dlmZmZmZmZmZ d dlmZmZmZmZmZmZmZmZ d dlmZ d dlmZm Z  d d	l!m"Z" d d
l#m$Z$ d dl%m&Z&m'Z'm(Z( ddl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3 ddl4m5Z5m6Z6m7Z7 d dlm8Z8 d dl9m:Z: d dl;Z;d dl<Z<d dl=Z=	 d dl>m?Z? dZAe<j                  re=j                  j                  d      ZCne=j                  ZCeCdz   ZE G d deF      ZG G d deF      ZHd ZId ZJd%dZKd ZLd  ZMdefd!ZNd" ZO G d# d$e      ZPy# e@$ r d Z?Y w xY w)&    )unicode_literals)ClipboardDataindentunindentreshape_text)Document)IncrementalSearchDirectionSEARCH_BUFFERSYSTEM_BUFFER)Filter	ConditionHasArgAlways
IsReadOnly)ViNavigationModeViInsertModeViInsertMultipleModeViReplaceModeViSelectionModeViWaitingForTextObjectModeViDigraphModeViMode)DIGRAPHS)CharacterFind	InputMode)Keys)find_window_for_buffer_name)SelectionTypeSelectionState	PasteMode   )scroll_forwardscroll_backwardscroll_half_page_upscroll_half_page_downscroll_one_line_upscroll_one_line_downscroll_page_upscroll_page_down)get_by_name   )RegistryConditionalRegistryBaseRegistryN)range)
accumulatec              #   0   K   d}| D ]  }||z  }|  yw)z+ Super simpel 'accumulate' implementation. r   N )iterabletotalitems      9lib/third_party/prompt_toolkit/key_binding/bindings/vi.pyr0   r0      s#     DTMEK s   )load_vi_bindingsload_vi_search_bindingsload_vi_system_bindings&load_extra_vi_page_navigation_bindingsascii
0123456789c                       e Zd ZdZdZdZdZy)TextObjectType	EXCLUSIVE	INCLUSIVELINEWISEBLOCKN)__name__
__module____qualname__r?   r@   rA   rB   r2       r6   r>   r>   1   s    IIHErF   r>   c                   X    e Zd ZdZdej
                  fdZed        Zd Z	d Z
d Zd Zy	)

TextObjectz
    Return struct for functions wrapped in ``text_object``.
    Both `start` and `end` are relative to the current cursor position.
    r   c                 .    || _         || _        || _        y N)startendtype)selfrK   rL   rM   s       r6   __init__zTextObject.__init__=   s    
	rF   c                     | j                   t        j                  k(  rt        j                  S | j                   t        j
                  k(  rt        j
                  S t        j                  S rJ   )rM   r>   rA   r   LINESrB   
CHARACTERSrN   s    r6   selection_typezTextObject.selection_typeB   sJ    99/// &&&99,,, &&& +++rF   c                     | j                   | j                  k  r| j                   | j                  fS | j                  | j                   fS )zA
        Return a (start, end) tuple where start <= end.
        )rK   rL   rS   s    r6   sortedzTextObject.sortedK   s:     :: ::txx''88TZZ''rF   c                 j   | j                         \  }}|}| j                  t        j                  k(  r)|j	                  ||j
                  z         d   dk(  r|dz  }| j                  t        j                  k(  r|dz  }| j                  t        j                  k(  r|j	                  ||j
                  z         \  }}|j                  |d      |j
                  z
  }|j	                  ||j
                  z         \  }}|j                  |t        |j                  |               |j
                  z
  }||fS )z
        Return a (start, end) tuple with start <= end that indicates the range
        operators should operate on.
        `buffer` is used to get start and end of line positions.
        r!   r   )rV   rM   r>   r?   translate_index_to_positioncursor_positionr@   rA   translate_row_col_to_indexlenlines)rN   documentrK   rL   docrowcols          r6   operator_rangezTextObject.operator_rangeT   s    [[]
sII111//c6I6I0IJ1MQRR 1HC990001HC99///66us?R?R7RSHC223:S=P=PPE66sS=P=P7PQHC00c#))C.6IJSM`M``CczrF   c                     | j                  |j                        \  }}||j                  z  }||j                  z  }|j                  j                  |      \  }}|j                  j                  |      \  }}||fS )z7
        Return a (start_line, end_line) pair.
        )ra   r]   rY   rX   )rN   bufferfrom_to_s        r6   get_line_numberszTextObject.get_line_numbersl   sx    
 ''8	r'''
f$$$ ??>>uEq;;B?AbyrF   c                 
   | j                  |j                        \  }}||j                  z  }||j                  z  }|dz  }t        |j                  |t        || j                              }|j                         \  }}||fS )zA
        Turn text object into `ClipboardData` instance.
        r!   )original_cursor_positionrM   )ra   r]   rY   r   textr   rT   cut_selection)rN   rc   rd   re   r]   new_documentclipboard_datas          r6   cutzTextObject.cut{   s     ''8	r'''
f$$$
aFKK^%*1D1D.F G (0'='='?$n^++rF   N)rC   rD   rE   __doc__r>   r?   rO   propertyrT   rV   ra   rg   rn   r2   rF   r6   rH   rH   8   sA     #$.*B*B 
 , ,(0,rF   rH   c                 ~     t         t              sJ t               t               t	                fd}|S )zY
    Create a decorator that can be used to register Vi text object implementations.
    c            	           |j                  dt                     |j                  dd      |j                  dd      |j                  dd      |rJ  	
f	d}|S )a  
        Register a text object function.

        Usage::

            @text_object('w', filter=..., no_move_handler=False)
            def handler(event):
                # Return a text object for this key.
                return TextObject(...)

        :param no_move_handler: Disable the move handler in navigation mode.
            (It's still active in selection mode.)
        filterno_move_handlerFno_selection_handlereagerc                    	  t               sJ  	j                  z  d fd       }s" 	j                   z  z  d fd       }s" 	j                   z  
z  d fd       } S )Nrs   rv   c                 F   | j                   j                  }|j                  xs d| j                  xs dz  | _         |       }|$t        |t              sJ |j                  | |       d | j                   j                  _        d | j                   j                  _        y Nr!   )clivi_stateoperator_argarg_arg
isinstancerH   operator_func)eventr|   text_objtext_object_funcs      r6   rf   zYcreate_text_object_decorator.<locals>.text_object_decorator.<locals>.decorator.<locals>._   s     !99--&338qUYY^!L
 ,E2'%h
;;; **5(; 48		""026		""/rF   c                 h     |       }| j                   xj                  |j                  z  c_        y)z# Move handler for navigation mode. N)current_bufferrY   rK   )r   text_objectr   s     r6   rf   zYcreate_text_object_decorator.<locals>.text_object_decorator.<locals>.decorator.<locals>._   s,     #35"9K((88K<M<MM8rF   c                     |       }| j                   }|j                  r|j                  |j                        \  }}||j                  z  }||j                  z  }||j
                  _        ||_        |j                  t        j                  k(  r t        j                  |j
                  _        yt        j                  |j
                  _        y| j                   xj                  |j                  z  c_        y)z" Move handler for selection mode. N)r   rL   ra   r]   rY   selection_stateri   rM   r>   rA   r   rQ   rR   rK   )r   r   buffrK   rL   r   s        r6   rf   zYcreate_text_object_decorator.<locals>.text_object_decorator.<locals>.decorator.<locals>._   s     #35"9K //D #%0%?%?%N
s!5!55t333HM,,E/2, '++~/F/FF8E8K8KD0058E8P8PD005,,<<@Q@QQ<rF   )callableadd_binding)r   rf   rv   rs   keysnavigation_modert   ru   operator_givenregistryselection_modes   ` r6   	decoratorzNcreate_text_object_decorator.<locals>.text_object_decorator.<locals>.decorator   s    ,---!X!!40GuU7 V7$ #%%%t^Of4L4^fklN mN (%%%t^Of4L~4]ejkR lR2 $#rF   popr   )r   kwr   rv   rs   rt   ru   r   r   r   r   s   `  @@@@r6   text_object_decoratorz;create_text_object_decorator.<locals>.text_object_decorator   sd     &(+&&!2E:!vv&<eDw&v9	$ 9	$v rF   r   r.   r   r   r   )r   r   r   r   r   s   ` @@@r6   create_text_object_decoratorr      s<     h---/1N&(O$&NO` ! rF   c                 ~     t         t              sJ t               t               t	                fd}|S )zK
    Create a decorator that can be used for registering Vi operators.
    c                       |j                  dt                     |j                  dd      |rJ  fd}|S )z
        Register a Vi operator.

        Usage::

            @operator('d', filter=...)
            def handler(cli, text_object):
                # Do something with the text object here.
        rs   rv   Fc                       j                    z  z  d fd       } j                    z  z  d fd       } S )Nrx   c                     | j                   j                  _        | j                  | j                   j                  _        y)zE
                Handle operator in navigation mode.
                N)r{   r|   r   r~   r}   )r   r   s    r6   rf   zScreate_operator_decorator.<locals>.operator_decorator.<locals>.decorator.<locals>._  s.     4A		""027))		""/rF   c                 v   | j                   }|j                  }|j                  t        j                  k(  rt
        j                  }n>|j                  t        j                  k(  rt
        j                  }nt
        j                  }t        |j                  |j                  z
  |      } | |       d|_        y)zD
                Handle operator in selection mode.
                rM   N)r   r   rM   r   rQ   r>   rA   rB   r@   rH   ri   rY   )r   r   r   text_obj_typer   r   s        r6   rf   zScreate_operator_decorator.<locals>.operator_decorator.<locals>.decorator.<locals>._  s    
 ++"&"6"6 #''=+>+>>$2$;$;M$))]-@-@@$2$8$8M$2$<$<M(#<<t?S?SS&(
 e[1 (,$rF   )r   )	r   rf   rv   rs   r   r   r   r   r   s	   ` r6   r   zHcreate_operator_decorator.<locals>.operator_decorator.<locals>.decorator  so    !X!!4&0H?0Zbgh< i< "X!!4&0H>0Yafg, h,2 ! rF   r   )	r   r   r   rv   rs   r   r   r   r   s	   `  @@r6   operator_decoratorz5create_operator_decorator.<locals>.operator_decorator   sA     &(+w&v&	! &	!N rF   r   )r   r   r   r   r   s   ` @@@r6   create_operator_decoratorr      s;     h---/1N&(O$&N5l rF   c                     t        t               t                     }|j                  } d  t	               }t               }t               }t               }t               }t               }t               }	dt               d fdt               d fdt               d fdt               d	 fd
t        d       d fg}
  |t        j                  |      t        d              |t        j                         d        } |d|      d        } |d|      d        } |t        j"                  |       |t        j$                  |      d               } |d|      d        } |t        j&                  |       |t        j(                  |      d               } |d|      d        } |t        j*                  |       |t        j,                  |      d               } |t        j(                  |      d        } |t        j$                  |      d        } |t        j.                  |      d        } |t        j0                  |      d        } |t        j2                  |      d        } |t        j4                  |      d        } |d|t7                z        d         } |d!|t7                z        d"        } |d#|t7                z        d$        } |d%d%|t7                z         |d&|t7                z        d'               } |d(|      d)        } |d*d*|      d+        } |d,|      d-        } |d.|t7                z        d/        } |d0|t7                z        d1        }t        d2        } |d0|t7                z        dd4        |d!|t7                z        fd5       } |d6|t7                z        d7        } |d8d6|t7                z        d9        } |d6|t7                z        d:        } |d8d6|t7                z        d;        } |d<|      d=        } |d>|      d?        } |d@t        j8                  d<|      dA        } |d@t        j8                  d>|      dB        } |dCt        j8                  |      dD        } |dE|      dF        } |dG|t7                z        dH        } |dI|dJ K      dL        } |dM|      dN        } |t        j                  |      dO        } |dM|      dP        } |dQ|      dR        } |dQ|      dS        } |t        j                  |      dT        } |ddU|       |ddV|      dW               } |d,|      dX        } |dY|      dZ        } |d[d[|       |d\|      d]               } |d^|      d_        } |d`|      da        } |dbdb|      dc        } |dddd|      de        } |df|t7                z        dg        } |dh|t7                z        di        } |dj|      dk        } |d8dIdI|t7                z        dl        } |d8dmdm|t7                z        dn        } |d8djdj|t7                z        do        } |dp|       fdq       } |dr|       fds       } |dt|      du        } |dv|      dw        }t;        |      t=        |       t        j8                  |      dx        }d܈fdy	} |d3d3        |d3dz        |dzd3        |dzdz       fd{}|
D ]  \  }}} |||g|    d[      d|        } d@t        j8                  d[      d}        } db      d~        } dd      d        } d8d      d        } d      d        } d      d        } d      d        } dU      d        } dV      d        } d      d        } d      d        } d.dUdz      d        } ddUdz      d        } d.dVdz      d        } ddVdz      d        } dd<dz      d        } d      d        } d      d        }d݈fd	}dD ],  }dD ]  \  }} ||||         |dtdv|d        |dd|d       .  d      d        } d      d        } dt        j8                        d        } dt        j8                        d        } dt        j8                        d        } dt        j8                        d        }fd} |dz        |d3        d       t        j>                        d               } ddzdz      d        } ddzdz      d        } d       d       t        j@                        d                      } d      d        } d      d        } d      d        } ddz       fd       } |d|       fd       } ddz       fd       } |d|       fd       } |dd^||z         |dd||z         |dt        j2                  ||z        d                      } |dd`||z         |dd||z        d               } |dd||z        d        } d      d        } d«      dÄ        } d8d8      dĄ        } d8dū      dƄ        } d8d      dǄ        } d8d      dȄ        } d8dɫ      dʄ        } d˫      d̄        } |dtC                     d̈́        }dD ]  } ||||z  |z        dτ        }  |d||z  |z  tC               z        dЄ        } |t        j8                  |      dф        } |t        j8                  |d҄ K      dӄ        } |t        j,                  |      dԄ        } |t        jD                  |      dՄ        } |t        jF                  t        jH                  |      dք        } |t        jF                  t        jJ                  |      dׄ        } |t        jL                  ||z        d؄        }t        dل        } |t        j8                  |	| z        dڄ        } |t        j8                  |	|z        dۄ        }|S )a  
    Vi extensions.

    # Overview of Readline Vi commands:
    # http://www.catonmat.net/download/bash-vi-editing-mode-cheat-sheet.pdf

     :param get_search_state: None or a callable that takes a
        CommandLineInterface and returns a SearchState.
    c                     | j                   S rJ   search_stater{   s    r6   get_search_statez*load_vi_bindings.<locals>.get_search_stateD      #*:*:#:rF   )g?c                 .    t        j                  | d      S )Nrot_13)codecsencodestrings    r6   <lambda>z"load_vi_bindings.<locals>.<lambda>R  s    fmmFH.MrF   )r   uc                 $     | j                          S rJ   lowerr   s    r6   r   z"load_vi_bindings.<locals>.<lambda>U      lfllnrF   )r   Uc                 $     | j                          S rJ   upperr   s    r6   r   z"load_vi_bindings.<locals>.<lambda>X  r   rF   )r   ~c                 $     | j                          S rJ   swapcaser   s    r6   r   z"load_vi_bindings.<locals>.<lambda>[  s    ofoo.?rF   )r   c                 .    | j                   j                  S rJ   )r|   tilde_operatorr   s    r6   r   z"load_vi_bindings.<locals>.<lambda>\  s    (C(CrF   c                 $     | j                          S rJ   r   r   s    r6   r   z"load_vi_bindings.<locals>.<lambda>\  s    UdU[UdUdUfrF   rs   zquoted-insertc                    | j                   }| j                  j                  }|j                  t        j
                  t        j                  fv r-|xj                  |j                  j                         z  c_        |j                  t        j                         t        |j                        r|j                          yy)z4
        Escape goes to vi navigation mode.
        N)r   r{   r|   
input_moder   INSERTREPLACErY   r]   get_cursor_left_positionreset
NAVIGATIONboolr   exit_selection)r   rc   r|   s      r6   rf   zload_vi_bindings.<locals>._b  s    
 %%99%%9#3#3Y5F5F"GG""foo&N&N&PP"y++,&&'!!# (rF   kc                 P    | j                   j                  | j                         y)z-
        Arrow up in selection mode.
        countN)r   	cursor_upr~   r   s    r6   rf   zload_vi_bindings.<locals>._r  s    
 	&&UYY&7rF   jc                 P    | j                   j                  | j                         y)z/
        Arrow down in selection mode.
        r   N)r   cursor_downr~   r   s    r6   rf   zload_vi_bindings.<locals>._y  s    
 	((uyy(9rF   c                 P    | j                   j                  | j                         y)zA
        Arrow up and ControlP in navigation mode go up.
        r   Nr   auto_upr~   r   s    r6   rf   zload_vi_bindings.<locals>._  s     	$$599$5rF   c                 R    | j                   j                  | j                  d       y)zd
        Go up, but if we enter a new history entry, move to the start of the
        line.
        Tr   &go_to_start_of_line_if_history_changesNr   r   s    r6   rf   zload_vi_bindings.<locals>._  s'     	$$))D 	% 	JrF   c                 P    | j                   j                  | j                         y)z>
        Arrow down and Control-N in navigation mode.
        r   Nr   	auto_downr~   r   s    r6   rf   zload_vi_bindings.<locals>._  s     	&&UYY&7rF   c                 R    | j                   j                  | j                  d       y)z\
        Go down, but if we enter a new history entry, go to the start of the line.
        Tr   Nr   r   s    r6   rf   zload_vi_bindings.<locals>._  s'    
 	&&))D 	' 	JrF   c                     | j                   xj                  | j                   j                  j                  | j                        z  c_        y)z2
        In navigation-mode, move cursor.
        r   N)r   rY   r]   r   r~   r   s    r6   rf   zload_vi_bindings.<locals>._  s=     	,,  ))BBBS	T,rF   c                     | j                   }|j                  r|j                          y | j                  j	                  d       y )NT)select_first)r   complete_statecomplete_nextr{   start_completionr   bs     r6   rf   zload_vi_bindings.<locals>._  s5      OOII&&D&9rF   c                     | j                   }|j                  r|j                          y| j                  j	                  d       y)z4
        Control-P: To previous completion.
        T)select_lastN)r   r   complete_previousr{   r   r   s     r6   rf   zload_vi_bindings.<locals>._  s9    
   !II&&4&8rF   c                 &    d| j                   _        y)z,
        Accept current completion.
        N)r   r   r   s    r6   rf   zload_vi_bindings.<locals>._  s    
 /3+rF   c                 8    | j                   j                          y)zF
        Cancel completion. Go back to originally typed text.
        N)r   cancel_completionr   s    r6   rf   zload_vi_bindings.<locals>._  s    
 	..0rF   c                     | j                   }|j                  j                  r'|j                  j                  | j                  |       yy)zR
        In navigation mode, pressing enter will always return the input.
        N)r   accept_actionis_returnablevalidate_and_handler{   r   s     r6   rf   zload_vi_bindings.<locals>._  s9    
   ??((OO//		1= )rF   c                 V    t         j                  | j                  j                  _        y)z Presing the Insert key. Nr   r   r{   r|   r   r   s    r6   rf   zload_vi_bindings.<locals>._  s     )2(8(8		%rF   ac                     | j                   xj                  | j                   j                  j                         z  c_        t        j
                  | j                  j                  _        y rJ   )	r   rY   r]   get_cursor_right_positionr   r   r{   r|   r   r   s    r6   rf   zload_vi_bindings.<locals>._  sH     	,,0D0D0M0M0g0g0ii,(1(8(8		%rF   Ac                     | j                   xj                  | j                   j                  j                         z  c_        t        j
                  | j                  j                  _        y rJ   )	r   rY   r]   get_end_of_line_positionr   r   r{   r|   r   r   s    r6   rf   zload_vi_bindings.<locals>._  sF    ,,0D0D0M0M0f0f0hh,(1(8(8		%rF   Cc                    | j                   }|j                  |j                  j                               }| j                  j
                  j                  |       t        j                  | j                  j                  _
        y)zc
        # Change to end of line.
        # Same as 'c$' (which is implemented elsewhere.)
        r   N)r   deleter]   r   r{   	clipboardset_textr   r   r|   r   r   rc   deleteds      r6   rf   zload_vi_bindings.<locals>._  s\     %%--foo&N&N&P-Q		$$W-(1(8(8		%rF   cSc                    | j                   }t        |j                  j                  t        j
                        }| j                  j                  j                  |       |xj                  |j                  j                  d      z  c_	        |j                  |j                  j                                t        j                  | j                  j                  _        y)z%
        Change current line
        Tafter_whitespacer   N)r   r   r]   current_liner   rQ   r{   r   set_datarY   get_start_of_line_positionr   r   r   r   r|   r   )r   rc   datas      r6   rf   zload_vi_bindings.<locals>._  s     %% V__99=;N;NO		$$T* 	&//"L"L^b"L"ccFOODDFG(1(8(8		%rF   Dc                     | j                   }|j                  |j                  j                               }| j                  j
                  j                  |       y Nr   )r   r   r]   r   r{   r   r   r   s      r6   rf   zload_vi_bindings.<locals>._	  sB    %%--foo&N&N&P-Q		$$W-rF   dc           	         | j                   }|j                  j                  }dj                  |d|j                  j                         }dj                  ||j                  j                  |j                  j                  | j
                  z          }dj                  ||j                  j                  | j
                  z   d       }|r|r|dz   }t        ||z   t        |      t        |      z   t        |j                  d            z
        |_        | j                  j                  j                  t        |t        j                               y)z<
        Delete line. (Or the following 'n' lines.)
        
N )rj   rY   )r   r]   r\   joincursor_position_rowr~   r   r[   lstripr{   r   r  r   r   rQ   )r   rc   r\   beforer   afters         r6   rf   zload_vi_bindings.<locals>._  s   
 %% %%5!E&//"E"EFG))E&//"E"E"(//"E"E		"QS T		% C Ceii O PQR ed]F #%!&kCJ6U\\#=N9OOQ 			$$]7M<O<O%PQrF   xc                     | j                   j                         }| j                  j                  j	                  |       y)zB
        Cut selection.
        ('x' is not an operator.)
        N)r   rk   r{   r   r  )r   rm   s     r6   rf   zload_vi_bindings.<locals>._+  s0     --;;=		$$^4rF   ic                 V    t         j                  | j                  j                  _        y rJ   r   r   s    r6   rf   zload_vi_bindings.<locals>._4  s    (1(8(8		%rF   Ic                     t         j                  | j                  j                  _        | j
                  xj                  | j
                  j                  j                  d      z  c_        y )NTr  )	r   r   r{   r|   r   r   rY   r]   r  r   s    r6   rf   zload_vi_bindings.<locals>._8  sP    (1(8(8		%,,  ))DDVZD[	\,rF   c                     | j                   }|j                  xr' |j                  j                  t        j                  k(  S rJ   )r   r   rM   r   rB   )r{   r   s     r6   in_block_selectionz,load_vi_bindings.<locals>.in_block_selection>  s5    !!##X(<(<(A(A]EXEX(XXrF   Fc                 \   | j                   }g }|rd }nd }t        |j                  j                               D ]/  \  }}|j	                   ||             |dk(  s# ||      |_        1 ||_        t        j                  | j                  j                  _        |j                          y)z! Insert in block selection mode. c                     | d   dz   S rz   r2   from_tos    r6   get_posz@load_vi_bindings.<locals>.go_to_block_selection.<locals>.get_posL  s    qzA~%rF   c                     | d   S )Nr   r2   r  s    r6   r!  z@load_vi_bindings.<locals>.go_to_block_selection.<locals>.get_posO  s    qz!rF   r   N)r   	enumerater]   selection_rangesappendrY   multiple_cursor_positionsr   INSERT_MULTIPLEr{   r|   r   r   )r   r  r   	positionsr!  r  r   s          r6   go_to_block_selectionz/load_vi_bindings.<locals>.go_to_block_selectionC  s     ## 	&" $DMM$B$B$DEJAwWW-.Av'.w'7$ F
 *3& )2(A(A		%rF   c                      | d       y )NT)r  r2   )r   r)  s    r6   rf   zload_vi_bindings.<locals>._]  s    e40rF   Jc                 l    t        | j                        D ]  }| j                  j                           y)z Join lines. Nr/   r~   r   join_next_liner   r  s     r6   rf   zload_vi_bindings.<locals>._a  s)     uyy!A  //1 "rF   r   c                 p    t        | j                        D ]  }| j                  j                  d         y)z Join lines without space.  	separatorNr-  r/  s     r6   rf   zload_vi_bindings.<locals>._g  s.     uyy!A  //"/= "rF   c                 8    | j                   j                          y)z Join selected lines. Nr   join_selected_linesr   s    r6   rf   zload_vi_bindings.<locals>._m  s     	002rF   c                 <    | j                   j                  d       y)z$ Join selected lines without space. r1  r2  Nr5  r   s    r6   rf   zload_vi_bindings.<locals>._r  s     	0020>rF   pc                     | j                   j                  | j                  j                  j	                         | j
                  t        j                         y)z
        Paste after
        r   
paste_modeN)r   paste_clipboard_datar{   r   get_datar~   r    VI_AFTERr   s    r6   rf   zload_vi_bindings.<locals>._w  sC    
 	11II((*)) )) 	2 	+rF   Pc                     | j                   j                  | j                  j                  j	                         | j
                  t        j                         y)z
        Paste before
        r:  N)r   r<  r{   r   r=  r~   r    	VI_BEFOREr   s    r6   rf   zload_vi_bindings.<locals>._  sC    
 	11II((*)) ** 	2 	,rF   "c                    | j                   d   j                  }|t        v ri| j                  j                  j
                  j                  |      }|r7| j                  j                  || j                  t        j                         yyy)z Paste from named register. r!   r:  N)key_sequencer  vi_register_namesr{   r|   named_registersgetr   r<  r~   r    r>  r   r   r  s      r6   rf   zload_vi_bindings.<locals>._  s{     q!&&!!99%%5599!<D$$99		i6H6H : J  "rF   c                    | j                   d   j                  }|t        v ri| j                  j                  j
                  j                  |      }|r7| j                  j                  || j                  t        j                         yyy)z% Paste (before) from named register. r!   r:  N)rD  r  rE  r{   r|   rF  rG  r   r<  r~   r    rA  rH  s      r6   rf   zload_vi_bindings.<locals>._  s{     q!&&!!99%%5599!<D$$99		i6I6I : K  "rF   rc                     | j                   j                  | j                  | j                  z  d       | j                   xj                  dz  c_        y)z7
        Replace single character under cursor
        T	overwriter!   N)r   insert_textr  r~   rY   r   s    r6   rf   zload_vi_bindings.<locals>._  sA    
 	((eii)?4(P,,1,rF   Rc                 V    t         j                  | j                  j                  _        y)z'
        Go to 'replace'-mode.
        N)r   r   r{   r|   r   r   s    r6   rf   zload_vi_bindings.<locals>._  s    
 )2(9(9		%rF   sc                     | j                   j                  | j                        }| j                  j                  j                  |       t        j                  | j                  j                  _	        y)z_
        Substitute with new text
        (Delete character(s) and go to insert mode.)
        r   N)
r   r   r~   r{   r   r   r   r   r|   r   r   rj   s     r6   rf   zload_vi_bindings.<locals>._  sQ     ##***;		$$T*(1(8(8		%rF   r   c                      y)NFr2   es    r6   r   z"load_vi_bindings.<locals>.<lambda>  s    rF   )rs   save_beforec                 l    t        | j                        D ]  }| j                  j                           y rJ   )r/   r~   r   undor/  s     r6   rf   zload_vi_bindings.<locals>._  s'    uyy!A  %%' "rF   Vc                 X    | j                   j                  t        j                         y)z(
        Start lines selection.
        rT   N)r   start_selectionr   rQ   r   s    r6   rf   zload_vi_bindings.<locals>._  s!    
 	,,M<O<O,PrF   c                 X    | j                   j                  t        j                         y)z Enter block selection mode. r\  N)r   r]  r   rB   r   s    r6   rf   zload_vi_bindings.<locals>._  s!     	,,M<O<O,PrF   c                     | j                   j                  }|j                  t        j                  k7  rt        j                  |_        y| j                   j                          y)zn
        Exit line selection mode, or go from non line selection mode to line
        selection mode.
        N)r   r   rM   r   rQ   r   r   r   s     r6   rf   zload_vi_bindings.<locals>._  I      ..>>=#6#66#0#6#6O   //1rF   vc                 X    | j                   j                  t        j                         y)z! Enter character selection mode. r\  N)r   r]  r   rR   r   s    r6   rf   zload_vi_bindings.<locals>._  s!     	,,M<T<T,UrF   c                     | j                   j                  }|j                  t        j                  k7  rt        j                  |_        y| j                   j                          y)z}
        Exit character selection mode, or go from non-character-selection mode
        to character selection mode.
        N)r   r   rM   r   rR   r   r`  s     r6   rf   zload_vi_bindings.<locals>._  sI      ..>>=#;#;;#0#;#;O   //1rF   c                     | j                   j                  }|j                  t        j                  k7  rt        j                  |_        y| j                   j                          y)zq
        Exit block selection mode, or go from non block selection mode to block
        selection mode.
        N)r   r   rM   r   rB   r   r`  s     r6   rf   zload_vi_bindings.<locals>._  ra  rF   wWc                     | j                   }|j                  rH|j                  j                  t        j                  k(  r t        j
                  |j                  _        yyy)zP
        Switch from visual linewise mode to visual characterwise mode.
        N)r   r   rM   r   rQ   rR   r   rc   s     r6   rf   zload_vi_bindings.<locals>._  sN     %%!!f&<&<&A&A]EXEX&X*7*B*BF""' 'Y!rF   c                     | j                   j                  | j                        }| j                  j                  j                  |       y)z#
        Delete character.
        r   N)r   r   r~   r{   r   r   rS  s     r6   rf   zload_vi_bindings.<locals>._  s9    
 ##***;		$$T*rF   Xc                     | j                   j                         }| j                  j                  j	                  |       y rJ   )r   delete_before_cursorr{   r   r   rS  s     r6   rf   zload_vi_bindings.<locals>._	  s.    ##88:		$$T*rF   yYc                     dj                  | j                  j                  j                  d| j                         }| j
                  j                  j                  t        |t        j                               y)z&
        Yank the whole line.
        r  N)r  r   r]   lines_from_currentr~   r{   r   r  r   r   rQ   rS  s     r6   rf   zload_vi_bindings.<locals>._  sT     yy--66II*599UV		$$]49L9L%MNrF   +c                     | j                   }|xj                  |j                  j                  | j                        z  c_        |xj                  |j                  j                  d      z  c_        y)z;
        Move to first non whitespace of next line
        r   Tr  N)r   rY   r]   get_cursor_down_positionr~   r  ri  s     r6   rf   zload_vi_bindings.<locals>._  s]    
 %%&//"J"JQVQZQZ"J"[[&//"L"L^b"L"ccrF   -c                     | j                   }|xj                  |j                  j                  | j                        z  c_        |xj                  |j                  j                  d      z  c_        y)z?
        Move to first non whitespace of previous line
        r   Tr  N)r   rY   r]   get_cursor_up_positionr~   r  ri  s     r6   rf   zload_vi_bindings.<locals>._   sZ    
 %%&//"H"Huyy"H"YY&//"L"L^b"L"ccrF   >c                 |    | j                   }|j                  j                  }t        |||| j                  z          y)z
        Indent lines.
        N)r   r]   r  r   r~   )r   rc   current_rows      r6   rf   zload_vi_bindings.<locals>._)  s3    
 %%oo99v{K%))$;<rF   <c                     | j                   j                  j                  }t        | j                   ||| j                  z          y)z!
        Unindent lines.
        N)r   r]   r  r   r~   )r   rz  s     r6   rf   zload_vi_bindings.<locals>._2  s6    
 **33GG%%{K%))4KLrF   Oc                     | j                   j                  | j                  j                          t        j
                  | j                  j                  _        y)z:
        Open line above and enter insertion mode
        copy_marginN)r   insert_line_abover{   in_paste_moder   r   r|   r   r   s    r6   rf   zload_vi_bindings.<locals>._:  E    
 	.. %		 7 77 	/ 	9(1(8(8		%rF   oc                     | j                   j                  | j                  j                          t        j
                  | j                  j                  _        y)z:
        Open line below and enter insertion mode
        r  N)r   insert_line_belowr{   r  r   r   r|   r   r   s    r6   rf   zload_vi_bindings.<locals>._C  r  rF   r   c                     | j                   }|j                  j                  }|(|dk7  r"|j                  |j	                         d       yyy)zL
        Reverse case of current character and move cursor forward.
        Nr  TrL  )r   r]   current_charrN  r   )r   rc   r   s      r6   rf   zload_vi_bindings.<locals>._L  sI    
 %%OO((=Q$Yqzz|t< '=rF   c                 @    | j                   }|j                  d        y)z Lowercase current line. c                 "    | j                         S rJ   r   rQ  s    r6   r   z-load_vi_bindings.<locals>._.<locals>.<lambda>[  
    aggirF   Nr   transform_current_liner   r   s     r6   rf   zload_vi_bindings.<locals>._W       ####$78rF   r   c                 @    | j                   }|j                  d        y)z Uppercase current line. c                 "    | j                         S rJ   r   r  s    r6   r   z-load_vi_bindings.<locals>._.<locals>.<lambda>a  r  rF   Nr  r  s     r6   rf   zload_vi_bindings.<locals>._]  r  rF   c                 @    | j                   }|j                  d        y)z  Swap case of the current line. c                 "    | j                         S rJ   r   r  s    r6   r   z-load_vi_bindings.<locals>._.<locals>.<lambda>g  s
    ajjlrF   Nr  r  s     r6   rf   zload_vi_bindings.<locals>._c  s     ####$:;rF   #c                     | j                   j                  } | j                         }|j                  j                         |_        t
        j                  |_        |j                  || j                  d       y)z8
        Go to previous occurence of this word.
        Fr   include_current_positionN)
r{   r   r]   get_word_under_cursorrj   r	   BACKWARD	directionapply_searchr~   r   r   r   r   s      r6   rf   zload_vi_bindings.<locals>._i  sa    
 II$$'		2JJ<<>!;!D!D	|59905 	 	7rF   *c                     | j                   j                  } | j                         }|j                  j                         |_        t
        j                  |_        |j                  || j                  d       y)z4
        Go to next occurence of this word.
        Fr  N)
r{   r   r]   r  rj   r	   FORWARDr  r  r~   r  s      r6   rf   zload_vi_bindings.<locals>._w  sa    
 II$$'		2JJ<<>!;!C!C	|59905 	 	7rF   (c                      y rJ   r2   r   s    r6   rf   zload_vi_bindings.<locals>._       	rF   )c                      y rJ   r2   r   s    r6   rf   zload_vi_bindings.<locals>._  r  rF   c                 L    | j                   j                  j                          y)zF
        Unknown key binding while waiting for a text object.
        N)r{   outputbellr   s    r6   rf   zload_vi_bindings.<locals>._  s    
 			rF   c                 z     rdt         j                  d    f}nd    } |dt                i fd       }y)z
        Delete and change operators.

        :param delete_only: Create an operator that deletes, but doesn't go to insert mode.
        :param with_register: Copy the deleted text to this named register instead of the clipboard.
        rB  cdrs   c                    d }| j                   }|r|j                  |      \  }}||_        |rx|j                  rlrE| j                  d   j
                  }|t        v rI|| j                  j                  j                  |<   n%| j                  j                  j                  |       s*t        j                  | j                  j                  _        y y rz   )r   rn   r]   rj   rD  r  rE  r{   r|   rF  r   r  r   r   r   )r   r   rm   r   rl   reg_namedelete_onlywith_registers         r6   delete_or_change_operatorz_load_vi_bindings.<locals>.create_delete_and_change_operators.<locals>.delete_or_change_operator  s    !N''D/:t/D,n , ."5"5 $11!499H#44GU		**::8DII''00@ 090@0@		""- rF   N)r   Anyr   )r  r  handler_keysr  operators   ``  r6   "create_delete_and_change_operatorsz<load_vi_bindings.<locals>.create_delete_and_change_operators  sI     4+<=L,L	<	6	6	A 
7	ArF   Tc                 @     |d| t                z  ifd       }y )Nrs   c                    | j                   }|j                  |j                        \  }}||k  r[|j                  |j                  |z   |j                  |z          |xj                  |j
                  xs |j                  z  c_        yy)zX
            Apply transformation (uppercase, lowercase, rot13, swap case).
            N)r   ra   r]   transform_regionrY   rL   rK   )r   r   r   rK   rL   transform_funcs        r6   rf   z=load_vi_bindings.<locals>.create_transform_handler.<locals>._  s    
 ''D$33DMMBJE3s{%%((50((3."$ $$)MK<M<MN$ rF   )r   )rs   r  r   rf   r  s    `  r6   create_transform_handlerz2load_vi_bindings.<locals>.create_transform_handler  s*    	1	4Vz|m3	4	O 
5	OrF   c                     |j                  | j                        \  }}|j                  r&| j                  j                  j                  |       yy)z-
        Yank operator. (Copy text.)
        N)rn   r   rj   r{   r   r  )r   r   rf   rm   s       r6   yank_handlerz&load_vi_bindings.<locals>.yank_handler  sC    
 (OOE,@,@A>II((8 rF   c                     | j                   d   j                  }|t        v rB|j                  | j                        \  }}|| j
                  j                  j                  |<   yy)z# Yank selection to named register. r!   N)rD  r  rE  rn   r   r{   r|   rF  )r   r   r   rf   rm   s        r6   rf   zload_vi_bindings.<locals>._  s[     q!&&!! +0D0D EA~4BEII..q1 "rF   c                 |    | j                   }|j                  |      \  }}t        |||dz   | j                         y)z
        Indent.
        r!   r   N)r   rg   r   r~   r   r   r   rd   re   s        r6   rf   zload_vi_bindings.<locals>._  s9    
 ##006	rtUBF%))4rF   c                 |    | j                   }|j                  |      \  }}t        |||dz   | j                         y)z
        Unindent.
        r!   r   N)r   rg   r   r~   r  s        r6   rf   zload_vi_bindings.<locals>._  s9    
 ##006	rub1fEII6rF   qc                 ^    | j                   }|j                  |      \  }}t        |||       y)z
        Reshape text.
        N)r   rg   r   r  s        r6   rf   zload_vi_bindings.<locals>._  s/    
 ##006	rT5"%rF   r   c                 |    t        | j                  j                  j                  | j                        xs d      S )z Move one word or token left. r   r   rH   r   r]   find_start_of_previous_wordr~   r   s    r6   rf   zload_vi_bindings.<locals>._  s6     %..77SSZ_ZcZcSdihijjrF   Bc                 ~    t        | j                  j                  j                  | j                  d      xs d      S )z Move one non-blank word left Tr   WORDr   r  r   s    r6   rf   zload_vi_bindings.<locals>._  s9     %..77SSZ_ZcZcjnSotstuurF   $c                 \    t        | j                  j                  j                               S )z< 'c$', 'd$' and '$':  Delete/change/move until end of line. )rH   r   r]   r   r   s    r6   
key_dollarz$load_vi_bindings.<locals>.key_dollar  s$     %..77PPRSSrF   c                     t        | j                  j                  j                  | j                        xs$ | j                  j                  j                               S )z@ 'word' forward. 'cw', 'dw', 'w': Delete/change/move one word.  r   rH   r   r]   find_next_word_beginningr~   get_end_of_document_positionr   s    r6   rf   zload_vi_bindings.<locals>._  sT     %..77PPW\W`W`Pa Y!0099VVXZ 	ZrF   c                     t        | j                  j                  j                  | j                  d      xs$ | j                  j                  j                               S )z@ 'WORD' forward. 'cW', 'dW', 'W': Delete/change/move one WORD.  Tr  r  r   s    r6   rf   zload_vi_bindings.<locals>._!  sW     %..77PPW\W`W`gkPl Y!0099VVXZ 	ZrF   rV  c                     | j                   j                  j                  | j                        }t	        |r|dz
  ndt
        j                        S )z  End of 'word': 'ce', 'de', 'e' r   r!   r   r   r   r]   find_next_word_endingr~   rH   r>   r@   r   rL   s     r6   rf   zload_vi_bindings.<locals>._'  sB     ""++AA		ARS#'an6N6NOOrF   Ec                     | j                   j                  j                  | j                  d      }t	        |r|dz
  ndt
        j                        S )z  End of 'WORD': 'cE', 'dE', 'E' Tr  r!   r   r   r  r  s     r6   rf   zload_vi_bindings.<locals>._-  sE     ""++AA		X\A]S#'an6N6NOOrF   rt   c                 h    | j                   j                  j                         \  }}t        ||      S )z Inner 'word': ciw and diw r   r]   find_boundaries_of_current_wordrH   r   rK   rL   s      r6   rf   zload_vi_bindings.<locals>._3  s/     ))22RRT
s%%%rF   c                 l    | j                   j                  j                  d      \  }}t        ||      S )z A 'word': caw and daw T)include_trailing_whitespacer  r  s      r6   rf   zload_vi_bindings.<locals>._9  s5     ))22RRosRt
s%%%rF   c                 l    | j                   j                  j                  d      \  }}t        ||      S )z Inner 'WORD': ciW and diW T)r  r  r  s      r6   rf   zload_vi_bindings.<locals>._?  s5     ))22RRX\R]
s%%%rF   c                 n    | j                   j                  j                  dd      \  }}t        ||      S )z A 'WORD': caw and daw T)r  r  r  r  s      r6   rf   zload_vi_bindings.<locals>._E  s8     ))22RRX\z~R
s%%%rF   c                     | j                   j                  j                         }| j                   j                  j                  | j                        }t        ||      S )z!
        Auto paragraph.
        r   )r   r]   start_of_paragraphend_of_paragraphr~   rH   r  s      r6   rf   zload_vi_bindings.<locals>._K  sN    
 $$--@@B""++<<599<M%%%rF   ^c                 `    t        | j                  j                  j                  d            S )z; 'c^', 'd^' and '^': Soft start of line, after whitespace. Tr  rH   r   r]   r  r   s    r6   key_circumflexz(load_vi_bindings.<locals>.key_circumflexT  s*     %..77RRdhRijjrF   0c                 `    t        | j                  j                  j                  d            S )z
        'c0', 'd0': Hard start of line, before whitespace.
        (The move '0' key is implemented elsewhere, because a '0' could also change the `arg`.)
        Fr  r  r   s    r6   key_zeroz"load_vi_bindings.<locals>.key_zeroY  s*     %..77RRdiRjkkrF   c                       fd}|)  d    d      |         d   d      |       y  d   |d      |       y)z
        Delete/Change string between this start and stop character. But keep these characters.
        This implements all the ci", ci<, ci{, ci(, di", di<, ca", ca<, ... combinations.
        c                    k(  rO| j                   j                  j                  d      }| j                   j                  j                  d      }nL| j                   j                  j	                        }| j                   j                  j                        }||rdnd}t        |dz   |z
  ||z         S t        d      S )NF)in_current_liner   r!   )r   r]   find_backwardsfindfind_enclosing_bracket_leftfind_enclosing_bracket_rightrH   )r   rK   rL   offsetci_endci_startinners       r6   handlerz?load_vi_bindings.<locals>.create_ci_ca_handles.<locals>.handlerg  s    6!,,55DDX_dDe**3388QV8W ,,55QQRZ\bc**33PPQY[ab S_#!%!)f"4cFlCC "!}$rF   NaiTr  r2   )r  r  r  keyr  r   s   ```  r6   create_ci_ca_handlesz.load_vi_bindings.<locals>.create_ci_ca_handlesa  sT    	%" ;DKUXtDWMBKUVTB7K?KUS$?HrF   )FT))rB  rB  )'r  )`r  )[])r{  rx  ){})r  r  r  r  c                 z    | j                   j                  j                  | j                  d      }t	        |      S )zi
        Move to previous blank-line separated section.
        Implements '{', 'c{', 'd{', 'y{'
        T)r   r  )r   r]   r  r~   rH   r   indexs     r6   rf   zload_vi_bindings.<locals>._  s:     $$--@@))D A *%  rF   c                 z    | j                   j                  j                  | j                  d      }t	        |      S )ze
        Move to next blank-line separated section.
        Implements '}', 'c}', 'd}', 'y}'
        T)r   r  )r   r]   r  r~   rH   r  s     r6   rf   zload_vi_bindings.<locals>._  s5     $$-->>UYYVZ>[%  rF   fc                 (   t        | j                  d      | j                  j                  _        | j
                  j                  j                  | j                  d| j                        }|rt        |t        j                        S t        d      S )z
        Go to next occurance of character. Typing 'fx' will move the
        cursor to the next occurance of character. 'x'.
        FTr  r   r   r   r   r  r{   r|   last_character_findr   r]   r  r~   rH   r>   r@   r   matchs     r6   rf   zload_vi_bindings.<locals>._  sq     2?uzz51Q		.$$--22JJEII 3 ?e.*B*BCCa= rF   Fc                     t        | j                  d      | j                  j                  _        t        | j                  j                  j                  | j                  d| j                        xs d      S )z
        Go to previous occurance of character. Typing 'Fx' will move the
        cursor to the previous occurance of character. 'x'.
        Tr  r   )
r   r  r{   r|   r  rH   r   r]   r  r~   r   s    r6   rf   zload_vi_bindings.<locals>._  sg     2?uzz41P		.%..77FFJJEII G ? DBCE 	ErF   tc                 .   t        | j                  d      | j                  j                  _        | j
                  j                  j                  | j                  d| j                        }|rt        |dz
  t        j                        S t        d      S )zP
        Move right to the next occurance of c, then one char backward.
        FTr  r!   r   r   r  r  s     r6   rf   zload_vi_bindings.<locals>._  su    
 2?uzz51Q		.$$--22JJEII 3 ?eain.F.FGGa= rF   Tc                    t        | j                  d      | j                  j                  _        | j
                  j                  j                  | j                  d| j                        }t        |r	|dz         S d      S )zR
        Move left to the previous occurance of c, then one char forward.
        Tr  r!   r   )
r   r  r{   r|   r  r   r]   r  r~   rH   r  s     r6   rf   zload_vi_bindings.<locals>._  sj    
 2?uzz41P		.$$--<<JJEII = ?u%!)44!44rF   c                 0       rdnd       fd       }y)z.
        Create ',' and ';' commands.
        ,;c                    d}| j                   j                  }t        j                  }|j                  r|j                  j
                  }|j                  j                  }r| }|r3| j                  j                  j                  |d| j                        }nB| j                  j                  j                  |d| j                        }t        j                  }|rt        ||      S t        d      S )Nr   Tr  r   )r{   r|   r>   r?   r  	character	backwardsr   r]   r  r~   r  r@   rH   )r   posr|   rM   charr  reverses         r6   rf   z+load_vi_bindings.<locals>.repeat.<locals>._  s     Cyy))H!++D++33==$88BB	$-I..77FFt]ainirirFsC..77<<TSW_d_h_h<iC)33D!#D11!!}$rF   Nr2   )r  rf   r   s   ` r6   repeatz load_vi_bindings.<locals>.repeat  s      
GS	-	% 
.	%rF   hc                 t    t        | j                  j                  j                  | j                              S )z* Implements 'ch', 'dh', 'h': Cursor left. r   )rH   r   r]   r   r~   r   s    r6   rf   zload_vi_bindings.<locals>._  s0     %..77PPW\W`W`PabbrF   )rt   ru   c                     t        | j                  j                  j                  | j                        t
        j                        S )z, Implements 'cj', 'dj', 'j', ... Cursor up. r   r   )rH   r   r]   rt  r~   r>   rA   r   s    r6   rf   zload_vi_bindings.<locals>._  s=     %..77PPW\W`W`Pa-668 	8rF   c                     t        | j                  j                  j                  | j                        t
        j                        S )z, Implements 'ck', 'dk', 'k', ... Cursor up. r   r   )rH   r   r]   rw  r~   r>   rA   r   s    r6   rf   zload_vi_bindings.<locals>._  s=     %..77NNUZU^U^N_-668 	8rF   lr  c                 t    t        | j                  j                  j                  | j                              S )z< Implements 'cl', 'dl', 'l', 'c ', 'd ', ' '. Cursor right. r   )rH   r   r]   r   r~   r   s    r6   rf   zload_vi_bindings.<locals>._  s0    
 %..77QQX]XaXaQbccrF   Hc                    t        | j                  | j                  j                        }| j                  }|rP|j                  rD|j
                  j                  |j                  j                  d      d      |j                  z
  }n t        |j
                  j                         }t        |t        j                        S )zz
        Moves to the start of the visible region. (Below the scroll offset.)
        Implements 'cH', 'dH', 'H'.
        T)after_scroll_offsetr   r   )r   r{   current_buffer_namer   render_infor]   rZ   first_visible_linerY   r[   text_before_cursorrH   r>   rA   r   rf  r   r  s       r6   rf   zload_vi_bindings.<locals>._  s     (		5993P3PQ   ::88}}77D7QSTV$$%C qzz4455C#N$;$;<<rF   Mc                    t        | j                  | j                  j                        }| j                  }|rN|j                  rB|j
                  j                  |j                  j                         d      |j                  z
  }n t        |j
                  j                         }t        |t        j                        S )zp
        Moves cursor to the vertical center of the visible region.
        Implements 'cM', 'dM', 'M'.
        r   r   )r   r{   r"  r   r#  r]   rZ   center_visible_linerY   r[   r%  rH   r>   rA   r&  s       r6   rf   zload_vi_bindings.<locals>._  s     (		5993P3PQ   ::88}}88:A?$$%C qzz4455C#N$;$;<<rF   Lc                    t        | j                  | j                  j                        }| j                  }|rP|j                  rD|j
                  j                  |j                  j                  d      d      |j                  z
  }nt        |j
                  j                        }t        |t        j                        S )zT
        Moves to the end of the visible region. (Above the scroll offset.)
        T)before_scroll_offsetr   r   )r   r{   r"  r   r#  r]   rZ   last_visible_linerY   r[   text_after_cursorrH   r>   rA   r&  s       r6   rf   zload_vi_bindings.<locals>._-  s    
 (		5993P3PQ   ::88}}66D6QSTV$$%C ajj223C#N$;$;<<rF   nc                     | j                   }|j                   | j                        d| j                        }t	        ||j
                  z
        S )z Search next. Fr  r   r   get_search_positionr{   r~   rH   rY   r   r   rY   r   s      r6   rf   zload_vi_bindings.<locals>._A  sR     ##22UYY'%)) 3  /D,@,@@AArF   c                 v    | j                   j                   | j                        d| j                         y)zB Search next in navigation mode. (This goes through the history.) Fr1  Nr   r  r{   r~   r   r   s    r6   rf   zload_vi_bindings.<locals>._J  s3     	))UYY'%)) 	* 	rF   Nc                     | j                   }|j                   | j                         d| j                        }t	        ||j
                  z
        S )z Search previous. Fr1  r2  r4  s      r6   rf   zload_vi_bindings.<locals>._Q  sU     ##22eii((5)) 3  /D,@,@@AArF   c                 x    | j                   j                   | j                         d| j                         y)zF Search previous in navigation mode. (This goes through the history.) Fr1  Nr6  r7  s    r6   rf   zload_vi_bindings.<locals>._Z  s6     	))eii((5)) 	* 	rF   zc                     t        | j                  | j                  j                        }| j                  j                  }|j                  j
                  |_        y)zd
        Scrolls the window to makes the current line the first line in the visible region.
        N)r   r{   r"  r   r]   r  vertical_scroll)r   rf  r   s      r6   rf   zload_vi_bindings.<locals>._a  s?     (		5993P3PQII$$JJ::rF   c                 f    t        | j                  | j                  j                        }d|_        y)zc
        Scrolls the window to makes the current line the last line in the visible region.
        r   N)r   r{   r"  r=  )r   rf  s     r6   rf   zload_vi_bindings.<locals>._l  s(     (		5993P3PQ
 rF   c                    t        | j                  | j                  j                        }| j                  j                  }|r|j                  rx|j                  }|j
                  dz  }t        d|j                  j                  dz
        }d}|dkD  r+|j                  |      }||z   |k  r||z  }|dz  }nn|dkD  r+||_
        yyy)z9
        Center Window vertically around cursor.
        r+   r   r!   N)r   r{   r"  r   r#  window_heightmaxr]   r  get_height_for_liner=  )r   rf  r   infoscroll_heightrn  heightline_heights           r6   rf   zload_vi_bindings.<locals>._y  s    
 (		5993P3PQII$$==D !..!3MAqzz559:AFa%"66q9K'-7k)FFA a% !"A% 1rF   %c                    | j                   }| j                  rd| j                  cxk  rdk  rn t        d      S |j                  j	                  t        | j                  |j                  j                  z  dz
  dz        d      }t        ||j                  j                  z
  t        j                        S t        d      S |j                  j                         }|rt        |t        j                        S t        d      S )z
        Implements 'c%', 'd%', '%, 'y%' (Move to corresponding bracket.)
        If an 'arg' has been given, go this this % position in the file.
        r   d   r!   r   )r   r   r~   r]   rZ   int
line_countrH   rY   r>   rA   find_matching_bracket_positionr@   )r   rc   absolute_indexr  s       r6   rf   zload_vi_bindings.<locals>._  s     %%:: 599##
 "!}$	 "(!K!KV__%?%??!CsJKQ"P!.6??3R3R"RYgYpYpqq!!}$ OOBBDE!%n.F.FGG!!}$rF   |c                 x    t        | j                  j                  j                  | j                  dz
              S rz   )rH   r   r]   get_column_cursor_positionr~   r   s    r6   rf   zload_vi_bindings.<locals>._  s3     %..77RRSXS\S\_`S`abbrF   c                 "   | j                   j                  }| j                  rEt        |j	                  | j
                  dz
  d      |j                  z
  t        j                        S t        |j                         t        j                        S )z/
        Implements 'gg', 'cgg', 'ygg'
        r!   r   r   )
r   r]   r   rH   rZ   r~   rY   r>   rA   get_start_of_document_position)r   r  s     r6   rf   zload_vi_bindings.<locals>._  sn    
   ))::a::599q=!LqO`O``gug~g~ a>>@~G^G^__rF   rf   c                 |    t        | j                  j                  j                         t        j
                        S )zQ
        Go to last non-blank of line.
        'g_', 'cg_', 'yg_', etc..
        r   )rH   r   r]   'last_non_blank_of_current_line_positionr>   r@   r   s    r6   rf   zload_vi_bindings.<locals>._  s4       ))QQSZhZrZrt 	trF   c                     | j                   j                  j                  | j                        }t	        ||dz
  ndt
        j                        S )zZ
        Go to last character of previous word.
        'ge', 'cge', 'yge', etc..
        r   r!   r   r   r   r]   find_previous_word_endingr~   rH   r>   r@   r   prev_ends     r6   rf   zload_vi_bindings.<locals>._  sH     ''00JJQVQZQZJ[(*>(Q,ANLdLdeerF   c                     | j                   j                  j                  | j                  d      }t	        ||dz
  ndt
        j                        S )zZ
        Go to last character of previous WORD.
        'gE', 'cgE', 'ygE', etc..
        Tr  r!   r   r   rV  rX  s     r6   rf   zload_vi_bindings.<locals>._  sK     ''00JJQVQZQZaeJf(*>(Q,ANLdLdeerF   mc           	         t        | j                  | j                  j                        }| j                  }|r|j                  r|j                  j
                  }|j                  j                  d      }|t        t        |dz  t        |j                  j                                    z  }t        |t        j                        S t        d      S )zY
        Like g0, but half a screenwidth to the right. (Or as much as possible.)
        Fr  r+   r   r   )r   r{   r"  r   r#  window_widthr]   r  rJ  minr[   r  rH   r>   r@   )r   rf  r   widthrK   s        r6   rf   zload_vi_bindings.<locals>._  s    
 (		5993P3PQ##MM..EMM<<e<TESUQYDMM,F,F(GHIIEe.*B*BCC!}rF   Gc                     | j                   }t        |j                  j                  |j                  j                  dz
  d      |j
                  z
  t        j                        S )zL
        Go to the end of the document. (If no arg has been given.)
        r!   r   r   )r   rH   r]   rZ   rK  rY   r>   rA   )r   bufs     r6   rf   zload_vi_bindings.<locals>._  sY    
 ""#,,AA#,,BYBY\]B]_`a--.4B4K4KM 	MrF   c                 T    | j                   j                  | j                  dz
         y)zh
        If an argument is given, move to this line in the  history. (for
        example, 15G)
        r!   N)r   go_to_historyr~   r   s    r6   rf   zload_vi_bindings.<locals>._  s      	**599q=9rF   	123456789c                 :    | j                  | j                         y)zL
            Always handle numberics in navigation mode as arg.
            Nappend_to_arg_countr  r   s    r6   rf   zload_vi_bindings.<locals>._  s    
 %%ejj1rF   c                 :    | j                  | j                         y)z) Zero when an argument was already give. Nrg  r   s    r6   rf   zload_vi_bindings.<locals>._  s     	!!%**-rF   c                 R    | j                   j                  | j                  d       y)z1
        Insert data at cursor position.
        TrL  N)r   rN  r  r   s    r6   rf   zload_vi_bindings.<locals>._  s!    
 	((t(DrF   c                     | j                    S rJ   )	is_repeatrU  s    r6   r   z"load_vi_bindings.<locals>.<lambda>  s
    q{{?rF   c                    | j                   }|j                  }g }d}|j                  D ]3  }|j                  |||        |j                  | j                         |}5 |j                  ||d        t        |j                        D cg c]  \  }}||z   dz    }}}dj                  |      |_        ||_        |xj                  dz  c_        yc c}}w )z
        Insert data at multiple cursor positions at once.
        (Usually a result of pressing 'I' or 'A' in block-selection mode.)
        r   Nr!   r1  )r   rj   r&  r%  r  r#  r  rY   )r   r   original_textrj   r8  p2r  new_cursor_positionss           r6   rf   zload_vi_bindings.<locals>._  s     ##		 00BKKa+,KK

#A 1
 	M!"%& #,D,J,J"K M"K$!QAEAI"K 	  M GGDM	)=&! Ms   Cc                 $   | j                   }|j                  }d}g }d}|j                  D ]B  }|dkD  r%||dz
     dk7  r|j                  |||dz
          d}n|j                  |||        |}D |j                  ||d        |rb|dd D cg c]  }t	        |       }}t        t        |            }	dj                  |      |_        |	|_        |xj                  dz  c_        y| j                  j                  j                          yc c}w )	z$ Backspace, using multiple cursors. Fr   r!   r  TNr1  )r   rj   r&  r%  r[   listr0   r  rY   r{   r  r  )
r   r   rn  deleted_somethingrj   r8  ro  partlengthsrp  s
             r6   rf   zload_vi_bindings.<locals>._5  s    ##		 "00BAv-Q/47M!BF34$(!M!B/0A 1 	M!"%&-1#2Y7YTs4yYG7#'
7(;#<  DI-AD*  A% II!!# 8s   Dc                    | j                   }|j                  }d}g }g }d}|j                  D ]6  }|j                  |||        |t	        |      k\  s||   dk(  r|}0|dz   }d}8 |j                  ||d        |rM|dd D cg c]  }t	        |       }	}t        t        |	            }dj                  |      |_        ||_        y| j                  j                  j                          yc c}w )	z! Delete, using multiple cursors. Fr   r  r!   TNrr  r1  )r   rj   r&  r%  r[   rs  r0   r  r{   r  r  )
r   r   rn  rt  rj   rp  r8  ro  ru  rv  s
             r6   rf   zload_vi_bindings.<locals>._V  s     ##		 "!00BKKa+,S''=+<+DF$(! 1 	M!"%&-1#2Y7YTs4yYG7#'
7(;#<  DI-AD*II!!# 8s   C.c                 8    | j                   j                          y)z
        Pressing the ControlX - ControlL sequence in Vi mode does line
        completion based on the other lines in the document and the history.
        N)r   start_history_lines_completionr   s    r6   rf   zload_vi_bindings.<locals>._y  s     	;;=rF   c                      y)z&
        Complete file names.
        Nr2   r   s    r6   rf   zload_vi_bindings.<locals>._  s     	rF   c                 :    d| j                   j                  _        y)z Go into digraph mode. TN)r{   r|   waiting_for_digraphr   s    r6   rf   zload_vi_bindings.<locals>._  s     26		.rF   c                 2    | j                   j                  d uS rJ   )r|   digraph_symbol1r   s    r6   digraph_symbol_1_givenz0load_vi_bindings.<locals>.digraph_symbol_1_given  s    ||++477rF   c                 N    | j                   | j                  j                  _        y rJ   )r  r{   r|   r~  r   s    r6   rf   zload_vi_bindings.<locals>._  s    -2ZZ		*rF   c                    	 | j                   j                  j                  | j                  f}|t        vr|ddd   }t        |   }| j                   j                  j
                  t        j                  k(  }| j                  j                  t        j                  |      |       d| j                   j                  _        d| j                   j                  _        d| j                   j                  _        y# t        $ r' | j                   j                  j                          Y fw xY w# d| j                   j                  _        d| j                   j                  _        w xY w)z Insert digraph. Nrr  rL  F)r{   r|   r~  r  r   r   r   r   r   rN  sixunichrr|  KeyErrorr  r  )r   codesymbolrM  s       r6   rf   zload_vi_bindings.<locals>._  s   	6II&&66

CD8#DbDzd^F 		**559J9JJI  ,,

6"i - 95:EII25:EII215EII.  	$II!!#	$ 6;EII215EII.s+   AC: A<D- :-D*'D- )D**D- -8E%)FrJ   )'r-   r,   r   r   r   r   r   r   r   r   r   r   r   r   ControlVr*   EscapeUpControlPDownControlNControlH	BackspaceControlYControlEControlJInsertr   r  r   r   LeftRightr   DeleteControlXControlLControlFControlK) r   r   handler   insert_modeinsert_multiple_modereplace_moder   r   digraph_modevi_transform_functionsrf   r  r  r  r   r  funcr  r  r  r  r  r  r  r  r  r/  r  r)  r  r   s    `                            @@@r6   r7   r7   ,  sX   & #8:vx8H!!F : '(O.K/1 ?L$&N/1N ?L 
VXMN 
VX<= 
VX<= 
VX?@	)CDFfg  .F4==-k/.JKDKK$ $ C'8 (8 C': (: DGGO,DMM/26 3 -6 C(J )J DIIo.DMM/28 3 /8 C(J )J DMM/2DNN?3T 4 3T DMM+.: /: DMM+.	9 /	9 DMM+.3 /3 DMM+.1 /1 DMM/2> 3> DKK09 19 C:<-789 99 C:<-789 99 C:<-78	9 9	9 C_
}<=C:<-789 9 >9 C(. ).
 C_-R .R6 C'5 (5 C:<-789 99 C:<-78\ 9\
 Y Y C*jl]:; <2 C*jl]:;1 <1 C:<-782 92
 C_
}<=> >>
 C*,673 83 C^z|m;<? =? C(+ )+ C(, ), C37J 8J C37K 8K C/22 32 C(: ): C:<-789 99 CoG( H( C(Q )Q DMM/2Q 3Q C'
2 (
2 C(V )V C'
2 (
2 DMM.1
2 2
2 C^,C^,C - -C C(+ )+ C(+ )+ C_-C(O ) .O C(d )d C(d )d C_-= .= C_-M .M C:<-789 99 C:<-789 99 C(= )= Cc/Z\M"AB9 C9
 Cc/Z\M"AB9 C9
 Cc/Z\M"AB< C<
 C(7 )7 C(7 )7 C( )
 C( )
 )2H.x8K.1  2  AD 'ue4&ud3&tU3&tT2O& -
1d D-1- - c]9 9 c488S!C "C c]5 5 c]7 7 c3& & k k v v T T Z Z
 Z Z
 P P
 P P
 c40& 1&
 c40& 1&
 c40& 1&
 c40& 1&
 c40& 1& k k l lI: !QHf 659!Q 	S#uc2S#uc2  ! ! ! ! dhh!  ! dhhE  E dhh
!  
! dhh5  5%8 4L
5Mc  c dF8	 G8
 dF8 G8
 d   d = =( = =( = =& d+B ,B C( ) d+B ,B C( ) C_^;<C_^;<C~'EF; G = =; C_^;<C_^;<	 = =	 C_^;<" ="6 % %2 c c
 c` ` ct t cf f cf f c  M M C!: ": 	/.8G	H	2 
I	2  C7F&(RS. T. DHH\*E +E DHH125"5"8 DNN#78$ 9$@ DKK 45$ 6$D DMM4===> >> DMM4=== > DMM+l":;6 <6 8 8 DHH\-C,CCD8 E8 DHH\,BBC6 D6* OrF   c                  r    t               } t               } | j                  d|      t        d             | S )zU
    Pressing 'v' in navigation mode will open the buffer in an external editor.
    rb  r   zedit-and-execute-command)r,   r   r   r*   )r   r   s     r6   load_vi_open_in_editor_bindingsr    s;     zH&(O5H_5./1OrF   c                  r   t        t               t                     } | j                  }t	        j
                  t              }t               } |d| |z        d        } |t        j                  |       |t        j                  |      d               } |t        j                  |      d        }| S )N!r   c                     | j                   j                  t               t        j                  | j                   j
                  _        y)z.
        '!' opens the system prompt.
        N)r{   
push_focusr   r   r   r|   r   r   s    r6   rf   z"load_vi_system_bindings.<locals>._  s.    
 			]+(1(8(8		%rF   c                     t         j                  | j                  j                  _        | j                  j
                  t           j                          | j                  j                          y)z'
        Cancel system prompt.
        N)	r   r   r{   r|   r   buffersr   r   	pop_focusr   s    r6   rf   z"load_vi_system_bindings.<locals>._  sG     )2(<(<		%		-(..0		rF   c                 2   t         j                  | j                  j                  _        | j                  j
                  t           }| j                  j                  |j                         |j                  d       | j                  j                          y)z%
        Run system command.
        T)append_to_historyN)r   r   r{   r|   r   r  r   run_system_commandrj   r   r  )r   system_buffers     r6   rf   z"load_vi_system_bindings.<locals>._  sk    
 )2(<(<		%		))-8		$$]%7%78d3 			rF   )r-   r,   r   r   filtersHasFocusr   r   r   r  ControlCr  )r   r  	has_focusr   rf   s        r6   r9   r9     s    "8:vx8H!!F  /I&(OC
_459 69 DKK	*DMM), - + DMM), - OrF   c           
         
  t               sJ  sd  t        t               t                     }|j                  }t        j                        }t               }t               }t        d       } |d||z  | z         |d||z  |z         |t        j                  |        fd                     } |d||z  | z         |d||z  |z         |t        j                  |        fd                     } |t        j                  |       fd       }d fd		
 |t        j                  |      
fd
       } |t        j                  |      
fd       }fd}	 |t        j                  |       |t        j                  |       |t        j                   |t        |	      z         |t        j"                  |t        |	      z        fd                            }|S )Nc                     | j                   S rJ   r   r   s    r6   r   z1load_vi_search_bindings.<locals>.get_search_state  r   rF   c                 8    | j                   j                  |       S rJ   )applicationreverse_vi_search_directionr   s    r6   r   z)load_vi_search_bindings.<locals>.<lambda>  s    COO??DrF   /r   r   c                     t         j                   | j                        _        t        j
                  | j                  j                  _        | j                  j                         y)z*
        Vi-style forward search.
        N)	r	   r  r{   r  r   r   r|   r   r  r   r   search_buffer_names    r6   rf   z"load_vi_search_bindings.<locals>._  sK     1K0R0R#-(1(8(8		% 			/0rF   c                     t         j                   | j                        _        | j                  j	                         t
        j                  | j                  j                  _        y)z+
        Vi-style backward search.
        N)	r	   r  r{   r  r  r   r   r|   r   r  s    r6   rf   z"load_vi_search_bindings.<locals>._  sK     1K0S0S#- 			/0(1(8(8		%rF   c                    | j                   j                  j                  | j                         }| j                   j                     }|j                  r!|j                   | j                         _        |j	                   | j                                |j                          |j                          t        j                  | j                   j                  _
        | j                   j                          y)z;
        Apply the search. (At the / or ? prompt.)
        N)r{   r  previousrj   r  r  r   r   r   r|   r   r  )r   input_buffersearch_bufferr   r  s      r6   rf   z"load_vi_search_bindings.<locals>._  s    
 yy((11%))<		))*<= /</A/AUYY', 	!!"2599"=> 	'') )2(<(<		%		rF   c                      |       }|j                   |k7  }| j                     j                  |_        ||_         |s0| j                  j                  |       }|j	                  |d|       yy)z0 Apply search, but keep search buffer focussed. Fr1  N)r  r  rj   r  r  )r{   r  r   r   direction_changedr  r   r  s         r6   incremental_searchz3load_vi_search_bindings.<locals>.incremental_search)  sy     (,(22i?KK(:;@@!* !;;//4L%%l?DE & S !rF   c                 `     | j                   t        j                  | j                         y r  )r{   r	   r  r~   r   r  s    r6   rf   z"load_vi_search_bindings.<locals>._8  s!    599&@&I&IQVQZQZ[rF   c                 `     | j                   t        j                  | j                         y r  )r{   r	   r  r~   r  s    r6   rf   z"load_vi_search_bindings.<locals>._<  s!    599&@&H&HPUPYPYZrF   c                 <    | j                      j                  dk(  S )z/ Returns True when the search buffer is empty. r1  )r  rj   )r{   r  s    r6   search_buffer_is_emptyz7load_vi_search_bindings.<locals>.search_buffer_is_empty@  s    {{-.33r99rF   c                     t         j                  | j                  j                  _        | j                  j                          | j                  j                     j                          y)z 
        Cancel search.
        N)r   r   r{   r|   r   r  r  r   )r   r  s    r6   rf   z"load_vi_search_bindings.<locals>._D  sI     )2(<(<		%				,-335rF   )r!   )r   r-   r,   r   r   r  r  r   r   r   r   ControlSControlRr  r  r  r  r  )r   r  r   r  r  r   r   r  rf   r  r  s   ``        @r6   r8   r8     s   #x0@'AAA:"8:vx8H!!F  !34I&(O$&N"+D#F C7:U9UUVC79TTUDMM9*-	1 . V W	1 C7:U9UUVC79TTUDMM9*-	9 . V W	9 DMM), -,S DMM),\ -\ DMM),[ -[: DKK	*DMM),DMM)i8N.O"OPDNN9y9O/P#PQ6 R Q - +6 OrF   c                  V   t        t               t                     } | j                  }  |t        j
                        t                 |t        j                        t                 |t        j                        t                 |t        j                        t                 |t        j                        t                 |t        j                        t                  |t        j"                        t$                 |t        j&                        t(               | S )z
    Key bindings, for scrolling up and down through pages.
    This are separate bindings, because GNU readline doesn't have them.
    )r-   r,   r   r   r   r  r"   ControlBr#   ControlDr%   ControlUr$   r  r'   r  r&   PageDownr)   PageUpr(   )r   r  s     r6   r:   r:   T  s    
 #8:vx8H!!FF4==.)F4==/*F4==/0F4==-.F4==./F4==,-F4==*+F4;;'OrF   c                       e Zd ZdZd Zd Zy)ViStateFilterz Deprecated! c                      || _         || _        y rJ   )get_vi_statemode)rN   r  r  s      r6   rO   zViStateFilter.__init__j  s    (	rF   c                 R    | j                  |      j                  | j                  k(  S rJ   )r  r   r  )rN   r{   s     r6   __call__zViStateFilter.__call__n  s"      %00DII==rF   N)rC   rD   rE   ro   rO   r  r2   rF   r6   r  r  h  s    >rF   r  rJ   )Q
__future__r   prompt_toolkit.bufferr   r   r   r   prompt_toolkit.documentr   prompt_toolkit.enumsr	   r
   r   prompt_toolkit.filtersr   r   r   r   r   prompt_toolkit.filters.clir   r   r   r   r   r   r   r   #prompt_toolkit.key_binding.digraphsr   #prompt_toolkit.key_binding.vi_stater   r   prompt_toolkit.keysr   prompt_toolkit.layout.utilsr   prompt_toolkit.selectionr   r   r    scrollr"   r#   r$   r%   r&   r'   r(   r)   named_commandsr*   r   r,   r-   r.   r  	six.movesr/   r   r  r   	itertoolsr0   ImportError__all__PY2ascii_lowercasedecoderE  objectr>   rH   r   r   r7   r  r9   r8   r:   r  r2   rF   r6   <module>r     s!   ' O O , Y Y P P o  o  o 8 H $ C M M l  l  l ' B B (   
 $ 77,,33G<O,,O#l2 V Q, Q,hZ!z@F@F,	'T .2/<l^(>F >]:  s   &D" "D-,D-