
                        p   S SK Jr  S SKJrJrJrJr  S SKJr  S SK	J
r
JrJr  S SKJrJrJrJrJr  S SKJrJrJrJrJrJrJrJr  S SKJr  S SKJrJ r   S S	K!J"r"  S S
K#J$r$  S SK%J&r&J'r'J(r(  SSK)J*r*J+r+J,r,J-r-J.r.J/r/J0r0J1r1  SSK2J3r3  SSK4J5r5J6r6J7r7  S SKJ8r8  S SK9J:r:  S SK;r;S SK<r<S SK=r= S SK>J?r?  SrA\<R                  (       a  \=R                  R                  S5      rCO\=R                  rC\CS-   rE " S S\F5      rG " S S\F5      rHS rIS rJS%S jrKS rLS  rMS\4S! jrNS" rO " S# S$\5      rPg! \@ a    S r? Nf = f)&    )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              #   2   #    SnU  H  nX-  nUv   M     g7f)z*Super simpel 'accumulate' implementation. r   N )iterabletotalitems      9lib/third_party/prompt_toolkit/key_binding/bindings/vi.pyr0   r0      s      DMEK s   )load_vi_bindingsload_vi_search_bindingsload_vi_system_bindings&load_extra_vi_page_navigation_bindingsascii
0123456789c                   $    \ rS rSrSrSrSrSrSrg)TextObjectType1   	EXCLUSIVE	INCLUSIVELINEWISEBLOCKr2   N)	__name__
__module____qualname____firstlineno__r@   rA   rB   rC   __static_attributes__r2       r6   r>   r>   1   s    IIHErI   r>   c                   b    \ rS rSrSrS\R                  4S jr\S 5       r	S r
S rS rS	 rS
rg)
TextObject8   z}
Return struct for functions wrapped in ``text_object``.
Both `start` and `end` are relative to the current cursor position.
r   c                 (    Xl         X l        X0l        g N)startendtype)selfrO   rP   rQ   s       r6   __init__TextObject.__init__=   s    
	rI   c                     U R                   [        R                  :X  a  [        R                  $ U R                   [        R
                  :X  a  [        R
                  $ [        R                  $ rN   )rQ   r>   rB   r   LINESrC   
CHARACTERSrR   s    r6   selection_typeTextObject.selection_typeB   sJ    99/// &&&99,,, &&& +++rI   c                     U R                   U R                  :  a  U R                   U R                  4$ U R                  U R                   4$ )z1
Return a (start, end) tuple where start <= end.
)rO   rP   rX   s    r6   sortedTextObject.sortedK   s:     :: ::txx''88TZZ''rI   c                 d   U R                  5       u  p#UnU R                  [        R                  :X  a)  UR	                  X4R
                  -   5      S   S:X  a  US-  nU R                  [        R                  :X  a  US-  nU R                  [        R                  :X  a  UR	                  X$R
                  -   5      u  pVUR                  US5      UR
                  -
  nUR	                  X4R
                  -   5      u  pVUR                  U[        UR                  U   5      5      UR
                  -
  nX#4$ )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   )r\   rQ   r>   r@   translate_index_to_positioncursor_positionrA   rB   translate_row_col_to_indexlenlines)rR   documentrO   rP   docrowcols          r6   operator_rangeTextObject.operator_rangeT   s    [[]
II111//6I6I0IJ1MQRR 1HC990001HC99///66u?R?R7RSHC223:S=P=PPE66s=P=P7PQHC00c#))C.6IJSM`M``CzrI   c                     U R                  UR                  5      u  p#X!R                  -  nX1R                  -  nUR                  R                  U5      u  p$UR                  R                  U5      u  p4X#4$ )z'
Return a (start_line, end_line) pair.
)rh   rd   r`   r_   )rR   bufferfrom_to_s        r6   get_line_numbersTextObject.get_line_numbersl   sl    
 ''8	'''
$$$ ??>>uE;;B?yrI   c           	          U R                  UR                  5      u  p#X!R                  -  nX1R                  -  nUS-  n[        UR                  U[        X R                  S95      nUR                  5       u  pVXV4$ )z1
Turn text object into `ClipboardData` instance.
r!   )original_cursor_positionrQ   )rh   rd   r`   r   textr   rY   cut_selection)rR   rk   rl   rm   rd   new_documentclipboard_datas          r6   cutTextObject.cut{   s     ''8	'''
$$$
aFKK^%*1D1D.F G (0'='='?$++rI   )rP   rO   rQ   N)rD   rE   rF   rG   __doc__r>   r@   rS   propertyrY   r\   rh   ro   rw   rH   r2   rI   r6   rK   rK   8   sA     #$.*B*B 
 , ,(0,rI   rK   c                    ^ ^^^ [        T [        5      (       d   e[        5       m[        5       m[	        5       mUUU U4S jnU$ )zQ
Create a decorator that can be used to register Vi text object implementations.
c            	         >^ ^^^^ UR                  S[        5       5      mUR                  SS5      mUR                  SS5      mUR                  SS5      mU(       a   eUUU UUUUU	U
4	S jnU$ )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 5      (       d   eT	R                  " TTT-  TS.6U 4S j5       nT(       d#  T	R                  " TT) T-  T-  TS.6U 4S j5       nT(       d#  T	R                  " TT) T-  T
-  TS.6U 4S j5       nT $ )Nr}   r   c                 d  > U R                   R                  nUR                  =(       d    SU R                  =(       d    S-  U l        T" U 5      nUb(  [        U[        5      (       d   eUR                  X5        S U R                   R                  l        S U R                   R                  l        g Nr!   )clivi_stateoperator_argarg_arg
isinstancerK   operator_func)eventr   text_objtext_object_funcs      r6   rn   Ycreate_text_object_decorator.<locals>.text_object_decorator.<locals>.decorator.<locals>._   s     !99--&338qUYY^!L
 ,E2'%h
;;;; **5; 48		""026		""/rI   c                 h   > T" U 5      nU R                   =R                  UR                  -  sl        g)z"Move handler for navigation mode. N)current_bufferr`   rO   )r   text_objectr   s     r6   rn   r      s,     #35"9K((88K<M<MM8rI   c                   > T" U 5      nU R                   nUR                  (       a  UR                  UR                  5      u  p4X2R                  -  nXBR                  -  nX2R
                  l        XBl        UR                  [        R                  :X  a   [        R                  UR
                  l        g[        R                  UR
                  l        gU R                   =R                  UR                  -  sl        g)z!Move handler for selection mode. N)r   rP   rh   rd   r`   selection_staterr   rQ   r>   rB   r   rV   rW   rO   )r   r   buffrO   rP   r   s        r6   rn   r      s     #35"9K //D #%0%?%?%N
!5!55333HM,,E/2, '++~/F/FF8E8K8KD0058E8P8PD005,,<<@Q@QQ<rI   )callableadd_binding)r   rn   r   r}   keysnavigation_moder~   r   operator_givenregistryselection_modes   ` r6   	decoratorNcreate_text_object_decorator.<locals>.text_object_decorator.<locals>.decorator   s    ,----!!40GuU7 V7$ #%%t^Of4L4^fklN mN (%%t^Of4L~4]ejkR lR2 $#rI   popr   )r   kwr   r   r}   r~   r   r   r   r   r   s   `  @@@@r6   text_object_decorator;create_text_object_decorator.<locals>.text_object_decorator   sd     &(+&&!2E:!vv&<eDw&v9	$ 9	$v rI   r   r.   r   r   r   )r   r   r   r   r   s   ` @@@r6   create_text_object_decoratorr      sE     h----/1N&(O$&NO O` ! rI   c                    ^ ^^^ [        T [        5      (       d   e[        5       m[        5       m[	        5       mUUU U4S jnU$ )zC
Create a decorator that can be used for registering Vi operators.
c                     >^ ^^ UR                  S[        5       5      mUR                  SS5      mU(       a   eUUU UUUU4S jnU$ )z
Register a Vi operator.

Usage::

    @operator('d', filter=...)
    def handler(cli, text_object):
        # Do something with the text object here.
r}   r   Fc                    >^  TR                   " TT) T-  T-  TS.6U 4S j5       nTR                   " TT) T-  T-  TS.6U 4S j5       nT $ )Nr   c                    > TU R                   R                  l        U R                  U R                   R                  l        g)z%
Handle operator in navigation mode.
N)r   r   r   r   r   )r   r   s    r6   rn   Screate_operator_decorator.<locals>.operator_decorator.<locals>.decorator.<locals>._  s.     4A		""027))		""/rI   c                 r  > U R                   nUR                  nUR                  [        R                  :X  a  [
        R                  nO?UR                  [        R                  :X  a  [
        R                  nO[
        R                  n[        UR                  UR                  -
  US9nT" X5        SUl        g)z$
Handle operator in selection mode.
rQ   N)r   r   rQ   r   rV   r>   rB   rC   rA   rK   rr   r`   )r   r   r   text_obj_typer   r   s        r6   rn   r     s    
 ++"&"6"6 #''=+>+>>$2$;$;M$))]-@-@@$2$8$8M$2$<$<M(#<<t?S?SS&(
 e1 (,$rI   )r   )	r   rn   r   r}   r   r   r   r   r   s	   ` r6   r   Hcreate_operator_decorator.<locals>.operator_decorator.<locals>.decorator  sk    !!4&0H?0Zbgh< i< !!4&0H>0Yafg, h,2 ! rI   r   )	r   r   r   r   r}   r   r   r   r   s	   `  @@r6   operator_decorator5create_operator_decorator.<locals>.operator_decorator   sA     &(+w&v&	! &	!N rI   r   )r   r   r   r   r   s   ` @@@r6   create_operator_decoratorr      sC     h----/1N&(O$&N5 5l rI   c                   ^ ^^^ [        [        5       [        5       5      nUR                  nT c  S m [	        5       n[        5       n[        5       n[        5       n[        5       n[        5       n[        5       n	S[        5       S 4S[        5       S 4S[        5       S 4S[        5       S	 4S
[        S 5      S 4/n
U" [        R                  US9" [        S5      5        U" [        R                   5      S 5       nU" SUS9S 5       nU" SUS9S 5       nU" [        R"                  US9U" [        R$                  US9S 5       5       nU" SUS9S 5       nU" [        R&                  US9U" [        R(                  US9S 5       5       nU" SUS9S 5       nU" [        R*                  US9U" [        R,                  US9S 5       5       nU" [        R(                  US9S 5       nU" [        R$                  US9S 5       nU" [        R.                  US9S 5       nU" [        R0                  US9S 5       nU" [        R2                  US9S 5       nU" [        R4                  US9S 5       nU" SU[7        5       ) -  S9S  5       nU" S!U[7        5       ) -  S9S" 5       nU" S#U[7        5       ) -  S9S$ 5       nU" S%S%U[7        5       ) -  S9U" S&U[7        5       ) -  S9S' 5       5       nU" S(US9S) 5       nU" S*S*US9S+ 5       nU" S,US9S- 5       nU" S.U[7        5       ) -  S9S/ 5       nU" S0U[7        5       ) -  S9S1 5       n[        S2 5       nU" S0U[7        5       ) -  S9SS4 j5       mU" S!U[7        5       ) -  S9U4S5 j5       nU" S6U[7        5       ) -  S9S7 5       nU" S8S6U[7        5       ) -  S9S9 5       nU" S6U[7        5       ) -  S9S: 5       nU" S8S6U[7        5       ) -  S9S; 5       nU" S<US9S= 5       nU" S>US9S? 5       nU" S@[        R8                  S<US9SA 5       nU" S@[        R8                  S>US9SB 5       nU" SC[        R8                  US9SD 5       nU" SEUS9SF 5       nU" SGU[7        5       ) -  S9SH 5       nU" SIUSJ SK9SL 5       nU" SMUS9SN 5       nU" [        R                  US9SO 5       nU" SMUS9SP 5       nU" SQUS9SR 5       nU" SQUS9SS 5       nU" [        R                  US9ST 5       nU" SSUUS9U" SSVUS9SW 5       5       nU" S,US9SX 5       nU" SYUS9SZ 5       nU" S[S[US9U" S\US9S] 5       5       nU" S^US9S_ 5       nU" S`US9Sa 5       nU" SbSbUS9Sc 5       nU" SdSdUS9Se 5       nU" SfU[7        5       ) -  S9Sg 5       nU" ShU[7        5       ) -  S9Si 5       nU" SjUS9Sk 5       nU" S8SISIU[7        5       ) -  S9Sl 5       nU" S8SmSmU[7        5       ) -  S9Sn 5       nU" S8SjSjU[7        5       ) -  S9So 5       nU" SpUS9U 4Sq j5       nU" SrUS9U 4Ss j5       nU" StUS9Su 5       nU" SvUS9Sw 5       n[;        U5      m[=        U5      mT" [        R8                  US9Sx 5       nSU4Sy jjnU" S3S35        U" S3Sz5        U" SzS35        U" SzSz5        U4S{ jnU
 H  u  nnnU" UU/UQ76   M     T" S[5      S| 5       nT" S@[        R8                  S[5      S} 5       nT" Sb5      S~ 5       nT" Sd5      S 5       nT" S8S5      S 5       nT" S5      S 5       nT" S5      S 5       nT" S5      S 5       nT" SU5      S 5       nT" SV5      S 5       nT" S5      S 5       nT" S5      S 5       nT" S.SUSzS9S 5       nT" SSUSzS9S 5       nT" S.SVSzS9S 5       nT" SSVSzS9S 5       nT" SS<SzS9S 5       nT" S5      S 5       nT" S5      S 5       nSU4S jjnS H/  nS H  u  nnU" UUU5        M     U" StSvUS5        U" SSUS5        M1     T" S5      S 5       nT" S5      S 5       nT" S[        R8                  5      S 5       nT" S[        R8                  5      S 5       nT" S[        R8                  5      S 5       nT" S[        R8                  5      S 5       nU4S jnU" Sz5        U" S35        T" S5      T" [        R>                  5      S 5       5       nT" SSzSzS9S 5       nT" SSzSzS9S 5       nT" S5      T" S5      T" [        R@                  5      S 5       5       5       nT" S5      S 5       nT" S5      S 5       nT" S5      S 5       nT" SSzS9U 4S j5       nU" SUS9U 4S j5       nT" SSzS9U 4S j5       nU" SUS9U 4S j5       nU" SS^X7-  S9U" SSX7-  S9U" S[        R2                  X7-  S9S 5       5       5       nU" SS`X7-  S9U" SSX7-  S9S 5       5       nU" SSX7-  S9S 5       nT" S5      S 5       nT" S5      S 5       nT" S8S85      S 5       nT" S8S5      S 5       nT" S8S5      S 5       nT" S8S5      S 5       nT" S8S5      S 5       nT" S5      S 5       nU" S[C        5       S9S 5       nS H  nU" UX7-  U-  S9S 5       nM     U" SX7-  U-  [C        5       -  S9S 5       nU" [        R8                  US9S 5       nU" [        R8                  US SK9S 5       nU" [        R,                  US9S 5       nU" [        RD                  US9S 5       nU" [        RF                  [        RH                  US9S 5       nU" [        RF                  [        RJ                  US9S 5       nU" [        RL                  XF-  S9S 5       n[        S 5       nU" [        R8                  U	U) -  S9S 5       nU" [        R8                  U	U-  S9S 5       nU$ )z
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                     U R                   $ rN   search_stater   s    r6   get_search_state*load_vi_bindings.<locals>.get_search_stateD      #*:*:#:rI   )g?c                 0    [         R                  " U S5      $ )Nrot_13)codecsencodestrings    r6   <lambda>"load_vi_bindings.<locals>.<lambda>R  s    fmmFH.MrI   )r   uc                 $    U R                   " 5       $ rN   lowerr   s    r6   r   r   U  
    fllnrI   )r   Uc                 $    U R                   " 5       $ rN   upperr   s    r6   r   r   X  r   rI   )r   ~c                 $    U R                   " 5       $ rN   swapcaser   s    r6   r   r   [  s    foo.?rI   )r   c                 .    U R                   R                  $ rN   )r   tilde_operatorr   s    r6   r   r   \  s    (C(CrI   c                 $    U R                   " 5       $ rN   r   r   s    r6   r   r   \  s    U[UdUdUfrI   r}   zquoted-insertc                    U R                   nU R                  R                  nUR                  [        R
                  [        R                  4;   a-  U=R                  UR                  R                  5       -  sl        UR                  [        R                  5        [        UR                  5      (       a  UR                  5         gg)z$
Escape goes to vi navigation mode.
N)r   r   r   
input_moder   INSERTREPLACEr`   rd   get_cursor_left_positionreset
NAVIGATIONboolr   exit_selection)r   rk   r   s      r6   rn   load_vi_bindings.<locals>._b  s    
 %%99%%9#3#3Y5F5F"GG""foo&N&N&PP"y++,&&''!!# (rI   kc                 J    U R                   R                  U R                  S9  g)z
Arrow up in selection mode.
countN)r   	cursor_upr   r   s    r6   rn   r   r  s    
 	&&UYY&7rI   jc                 J    U R                   R                  U R                  S9  g)z
Arrow down in selection mode.
r   N)r   cursor_downr   r   s    r6   rn   r   y  s    
 	((uyy(9rI   c                 J    U R                   R                  U R                  S9  g)z1
Arrow up and ControlP in navigation mode go up.
r   Nr   auto_upr   r   s    r6   rn   r     s     	$$599$5rI   c                 L    U R                   R                  U R                  SS9  g)zL
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   rn   r     s'     	$$))D 	% 	JrI   c                 J    U R                   R                  U R                  S9  g)z.
Arrow down and Control-N in navigation mode.
r   Nr   	auto_downr   r   s    r6   rn   r     s     	&&UYY&7rI   c                 L    U R                   R                  U R                  SS9  g)zL
Go down, but if we enter a new history entry, go to the start of the line.
Tr   Nr   r   s    r6   rn   r     s'    
 	&&))D 	' 	JrI   c                     U R                   =R                  U R                   R                  R                  U R                  S9-  sl        g)z"
In navigation-mode, move cursor.
r   N)r   r`   rd   r   r   r   s    r6   rn   r     s=     	,,  ))BBBS	T,rI   c                     U R                   nUR                  (       a  UR                  5         g U R                  R	                  SS9  g )NT)select_first)r   complete_statecomplete_nextr   start_completionr   bs     r6   rn   r     s5      OOII&&D&9rI   c                     U R                   nUR                  (       a  UR                  5         gU R                  R	                  SS9  g)z$
Control-P: To previous completion.
T)select_lastN)r   r   complete_previousr   r   r   s     r6   rn   r     s9    
   !II&&4&8rI   c                 &    SU R                   l        g)z
Accept current completion.
N)r   r   r   s    r6   rn   r     s    
 /3+rI   c                 8    U R                   R                  5         g)z6
Cancel completion. Go back to originally typed text.
N)r   cancel_completionr   s    r6   rn   r     s    
 	..0rI   c                     U R                   nUR                  R                  (       a'  UR                  R                  U R                  U5        gg)zB
In navigation mode, pressing enter will always return the input.
N)r   accept_actionis_returnablevalidate_and_handler   r   s     r6   rn   r     s9    
   ??((OO//		1= )rI   c                 V    [         R                  U R                  R                  l        g)zPresing the Insert key. Nr   r   r   r   r   r   s    r6   rn   r     s     )2(8(8		%rI   ac                     U R                   =R                  U R                   R                  R                  5       -  sl        [        R
                  U R                  R                  l        g rN   )	r   r`   rd   get_cursor_right_positionr   r   r   r   r   r   s    r6   rn   r     sH     	,,0D0D0M0M0g0g0ii,(1(8(8		%rI   Ac                     U R                   =R                  U R                   R                  R                  5       -  sl        [        R
                  U R                  R                  l        g rN   )	r   r`   rd   get_end_of_line_positionr   r   r   r   r   r   s    r6   rn   r     sF    ,,0D0D0M0M0f0f0hh,(1(8(8		%rI   Cc                    U R                   nUR                  UR                  R                  5       S9nU R                  R
                  R                  U5        [        R                  U R                  R                  l
        g)zK
# Change to end of line.
# Same as 'c$' (which is implemented elsewhere.)
r   N)r   deleterd   r  r   	clipboardset_textr   r   r   r   r   rk   deleteds      r6   rn   r     s\     %%--foo&N&N&P-Q		$$W-(1(8(8		%rI   cSc                    U R                   n[        UR                  R                  [        R
                  5      nU R                  R                  R                  U5        U=R                  UR                  R                  SS9-  sl	        UR                  UR                  R                  5       S9  [        R                  U R                  R                  l        g)z
Change current line
Tafter_whitespacer   N)r   r   rd   current_liner   rV   r   r  set_datar`   get_start_of_line_positionr  r  r   r   r   r   )r   rk   datas      r6   rn   r     s     %% V__99=;N;NO		$$T* 	&//"L"L^b"L"ccFOODDFG(1(8(8		%rI   Dc                     U R                   nUR                  UR                  R                  5       S9nU R                  R
                  R                  U5        g Nr   )r   r  rd   r  r   r  r  r  s      r6   rn   r   	  sB    %%--foo&N&N&P-Q		$$W-rI   dc           	         U R                   nUR                  R                  nSR                  USUR                  R                   5      nSR                  X!R                  R                  UR                  R                  U R
                  -    5      nSR                  X!R                  R                  U R
                  -   S 5      nU(       a  U(       a  US-   n[        X5-   [        U5      [        U5      -   [        UR                  S5      5      -
  S9Ul        U R                  R                  R                  [        U[        R                  5      5        g)z,
Delete line. (Or the following 'n' lines.)

N )rs   r`   )r   rd   rc   joincursor_position_rowr   r   rb   lstripr   r  r  r   r   rV   )r   rk   rc   beforer  afters         r6   rn   r     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QrI   xc                     U R                   R                  5       nU R                  R                  R	                  U5        g)z*
Cut selection.
('x' is not an operator.)
N)r   rt   r   r  r  )r   rv   s     r6   rn   r   +  s0     --;;=		$$^4rI   ic                 V    [         R                  U R                  R                  l        g rN   r  r   s    r6   rn   r   4  s    (1(8(8		%rI   Ic                     [         R                  U R                  R                  l        U R
                  =R                  U R
                  R                  R                  SS9-  sl        g )NTr  )	r   r   r   r   r   r   r`   rd   r  r   s    r6   rn   r   8  sP    (1(8(8		%,,  ))DDVZD[	\,rI   c                     U R                   nUR                  =(       a'    UR                  R                  [        R                  :H  $ rN   )r   r   rQ   r   rC   )r   r   s     r6   in_block_selection,load_vi_bindings.<locals>.in_block_selection>  s5    !!##X(<(<(A(A]EXEX(XXrI   Fc                 j   U R                   n/ nU(       a  S nOS n[        UR                  R                  5       5       H1  u  pVUR	                  U" U5      5        US:X  d  M$  U" U5      Ul        M3     X2l        [        R                  U R                  R                  l        UR                  5         g)z Insert in block selection mode. c                     U S   S-   $ r   r2   from_tos    r6   get_pos@load_vi_bindings.<locals>.go_to_block_selection.<locals>.get_posL  s    qzA~%rI   c                     U S   $ )Nr   r2   r3  s    r6   r5  r6  O  s    qz!rI   r   N)r   	enumeraterd   selection_rangesappendr`   multiple_cursor_positionsr   INSERT_MULTIPLEr   r   r   r   )r   r'  r   	positionsr5  r*  r4  s          r6   go_to_block_selection/load_vi_bindings.<locals>.go_to_block_selectionC  s     ## 	&" $DMM$B$B$DEJAWW-.Av'.w'7$ F
 *3& )2(A(A		%rI   c                    > T" U SS9  g )NT)r'  r2   )r   r>  s    r6   rn   r   ]  s    e40rI   Jc                 p    [        U R                  5       H  nU R                  R                  5         M     g)zJoin lines. Nr/   r   r   join_next_liner   r*  s     r6   rn   r   a  s)     uyy!A  //1 "rI   r   c                 n    [        U R                  5       H  nU R                  R                  SS9  M     g)zJoin lines without space.  	separatorNrC  rE  s     r6   rn   r   g  s.     uyy!A  //"/= "rI   c                 8    U R                   R                  5         g)zJoin selected lines. Nr   join_selected_linesr   s    r6   rn   r   m  s     	002rI   c                 6    U R                   R                  SS9  g)z#Join selected lines without space. rG  rH  NrK  r   s    r6   rn   r   r  s     	0020>rI   pc                     U R                   R                  U R                  R                  R	                  5       U R
                  [        R                  S9  g)z
Paste after
r   
paste_modeN)r   paste_clipboard_datar   r  get_datar   r    VI_AFTERr   s    r6   rn   r   w  sC    
 	11II((*)) )) 	2 	+rI   Pc                     U R                   R                  U R                  R                  R	                  5       U R
                  [        R                  S9  g)z
Paste before
rP  N)r   rR  r   r  rS  r   r    	VI_BEFOREr   s    r6   rn   r     sC    
 	11II((*)) ** 	2 	,rI   "c                    U R                   S   R                  nU[        ;   aj  U R                  R                  R
                  R                  U5      nU(       a3  U R                  R                  X R                  [        R                  S9  ggg)zPaste from named register. r!   rP  N)key_sequencer  vi_register_namesr   r   named_registersgetr   rR  r   r    rT  r   r  r  s      r6   rn   r     sy     q!&&!!99%%5599!<D$$99		i6H6H : J  "rI   c                    U R                   S   R                  nU[        ;   aj  U R                  R                  R
                  R                  U5      nU(       a3  U R                  R                  X R                  [        R                  S9  ggg)z$Paste (before) from named register. r!   rP  N)rZ  r  r[  r   r   r\  r]  r   rR  r   r    rW  r^  s      r6   rn   r     sy     q!&&!!99%%5599!<D$$99		i6I6I : K  "rI   rc                     U R                   R                  U R                  U R                  -  SS9  U R                   =R                  S-  sl        g)z'
Replace single character under cursor
T	overwriter!   N)r   insert_textr  r   r`   r   s    r6   rn   r     sA    
 	((eii)?4(P,,1,rI   Rc                 V    [         R                  U R                  R                  l        g)z
Go to 'replace'-mode.
N)r   r   r   r   r   r   s    r6   rn   r     s    
 )2(9(9		%rI   sc                     U R                   R                  U R                  S9nU R                  R                  R                  U5        [        R                  U R                  R                  l	        g)zG
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   rs   s     r6   rn   r     sQ     ##***;		$$T*(1(8(8		%rI   r   c                     g)NFr2   es    r6   r   r     s    rI   )r}   save_beforec                 p    [        U R                  5       H  nU R                  R                  5         M     g rN   )r/   r   r   undorE  s     r6   rn   r     s'    uyy!A  %%' "rI   Vc                 R    U R                   R                  [        R                  S9  g)z
Start lines selection.
rY   N)r   start_selectionr   rV   r   s    r6   rn   r     s!    
 	,,M<O<O,PrI   c                 R    U R                   R                  [        R                  S9  g)zEnter block selection mode. rr  N)r   rs  r   rC   r   s    r6   rn   r     s!     	,,M<O<O,PrI   c                     U R                   R                  nUR                  [        R                  :w  a  [        R                  Ul        gU R                   R                  5         g)zV
Exit line selection mode, or go from non line selection mode to line
selection mode.
N)r   r   rQ   r   rV   r   r   r   s     r6   rn   r     I      ..>>=#6#66#0#6#6O   //1rI   vc                 R    U R                   R                  [        R                  S9  g)z Enter character selection mode. rr  N)r   rs  r   rW   r   s    r6   rn   r     s!     	,,M<T<T,UrI   c                     U R                   R                  nUR                  [        R                  :w  a  [        R                  Ul        gU R                   R                  5         g)ze
Exit character selection mode, or go from non-character-selection mode
to character selection mode.
N)r   r   rQ   r   rW   r   rv  s     r6   rn   r     sI      ..>>=#;#;;#0#;#;O   //1rI   c                     U R                   R                  nUR                  [        R                  :w  a  [        R                  Ul        gU R                   R                  5         g)zY
Exit block selection mode, or go from non block selection mode to block
selection mode.
N)r   r   rQ   r   rC   r   rv  s     r6   rn   r     rw  rI   wWc                     U R                   nUR                  (       aI  UR                  R                  [        R                  :X  a   [        R
                  UR                  l        ggg)z@
Switch from visual linewise mode to visual characterwise mode.
N)r   r   rQ   r   rV   rW   r   rk   s     r6   rn   r     sN     %%!!f&<&<&A&A]EXEX&X*7*B*BF""' 'Y!rI   c                     U R                   R                  U R                  S9nU R                  R                  R                  U5        g)z
Delete character.
r   N)r   r  r   r   r  r  ri  s     r6   rn   r     s9    
 ##***;		$$T*rI   Xc                     U R                   R                  5       nU R                  R                  R	                  U5        g rN   )r   delete_before_cursorr   r  r  ri  s     r6   rn   r   	  s.    ##88:		$$T*rI   yYc                     SR                  U R                  R                  R                  SU R                   5      nU R
                  R                  R                  [        U[        R                  5      5        g)z
Yank the whole line.
r!  N)r#  r   rd   lines_from_currentr   r   r  r  r   r   rV   ri  s     r6   rn   r     sT     yy--66II*599UV		$$]49L9L%MNrI   +c                     U R                   nU=R                  UR                  R                  U R                  S9-  sl        U=R                  UR                  R                  SS9-  sl        g)z+
Move to first non whitespace of next line
r   Tr  N)r   r`   rd   get_cursor_down_positionr   r  r  s     r6   rn   r     s]    
 %%&//"J"JQVQZQZ"J"[[&//"L"L^b"L"ccrI   -c                     U R                   nU=R                  UR                  R                  U R                  S9-  sl        U=R                  UR                  R                  SS9-  sl        g)z/
Move to first non whitespace of previous line
r   Tr  N)r   r`   rd   get_cursor_up_positionr   r  r  s     r6   rn   r      sZ    
 %%&//"H"Huyy"H"YY&//"L"L^b"L"ccrI   >c                 x    U R                   nUR                  R                  n[        XX R                  -   5        g)z
Indent lines.
N)r   rd   r$  r   r   )r   rk   current_rows      r6   rn   r   )  s/    
 %%oo99vK))$;<rI   <c                     U R                   R                  R                  n[        U R                   XU R                  -   5        g)z
Unindent lines.
N)r   rd   r$  r   r   )r   r  s     r6   rn   r   2  s4    
 **33GG%%{%))4KLrI   Oc                     U R                   R                  U R                  R                  (       + S9  [        R
                  U R                  R                  l        g)z*
Open line above and enter insertion mode
copy_marginN)r   insert_line_abover   in_paste_moder   r   r   r   r   s    r6   rn   r   :  E    
 	.. %		 7 77 	/ 	9(1(8(8		%rI   oc                     U R                   R                  U R                  R                  (       + S9  [        R
                  U R                  R                  l        g)z*
Open line below and enter insertion mode
r  N)r   insert_line_belowr   r  r   r   r   r   r   s    r6   rn   r   C  r  rI   r   c                     U R                   nUR                  R                  nUb&  US:w  a  UR                  UR	                  5       SS9  ggg)z<
Reverse case of current character and move cursor forward.
Nr!  Trb  )r   rd   current_charrd  r   )r   rk   r  s      r6   rn   r   L  sI    
 %%OO((=Q$Yqzz|t< '=rI   c                 @    U R                   nUR                  S 5        g)zLowercase current line. c                 "    U R                  5       $ rN   r   rg  s    r6   r   -load_vi_bindings.<locals>._.<locals>.<lambda>[  
    aggirI   Nr   transform_current_liner   r   s     r6   rn   r   W       ####$78rI   r   c                 @    U R                   nUR                  S 5        g)zUppercase current line. c                 "    U R                  5       $ rN   r   r  s    r6   r   r  a  r  rI   Nr  r  s     r6   rn   r   ]  r  rI   c                 @    U R                   nUR                  S 5        g)zSwap case of the current line. c                 "    U R                  5       $ rN   r   r  s    r6   r   r  g  s
    ajjlrI   Nr  r  s     r6   rn   r   c  s     ####$:;rI   #c                    > U R                   R                  nT" U R                   5      nUR                  R                  5       Ul        [
        R                  Ul        UR                  X R                  SS9  g)z(
Go to previous occurence of this word.
Fr   include_current_positionN)
r   r   rd   get_word_under_cursorrs   r	   BACKWARD	directionapply_searchr   r   r   r   r   s      r6   rn   r   i  s_    
 II$$'		2JJ<<>!;!D!D	|9905 	 	7rI   *c                    > U R                   R                  nT" U R                   5      nUR                  R                  5       Ul        [
        R                  Ul        UR                  X R                  SS9  g)z$
Go to next occurence of this word.
Fr  N)
r   r   rd   r  rs   r	   FORWARDr  r  r   r  s      r6   rn   r   w  s_    
 II$$'		2JJ<<>!;!C!C	|9905 	 	7rI   (c                     g rN   r2   r   s    r6   rn   r          	rI   )c                     g rN   r2   r   s    r6   rn   r     r  rI   c                 L    U R                   R                  R                  5         g)z6
Unknown key binding while waiting for a text object.
N)r   outputbellr   s    r6   rn   r     s    
 			rI   c                    >^ ^ T(       a  S[         R                  ST    4nOST    nT" US[        5       ) 06U U4S j5       ng)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.
rX  cdr}   c                   > S nU R                   nU(       a  UR                  U5      u  pBXCl        U(       a  UR                  (       ar  T(       aF  U R                  S   R
                  nU[        ;   a"  X R                  R                  R                  U'   O%U R                  R                  R                  U5        T(       d*  [        R                  U R                  R                  l        g g r   )r   rw   rd   rs   rZ  r  r[  r   r   r\  r  r  r   r   r   )r   r   rv   r   ru   reg_namedelete_onlywith_registers         r6   delete_or_change_operator_load_vi_bindings.<locals>.create_delete_and_change_operators.<locals>.delete_or_change_operator  s    !N''D/:t/D, , ."5"5 $11!499H#44GU		**::8DII''00@ 090@0@		""- rI   N)r   Anyr   )r  r  handler_keysr  operators   ``  r6   "create_delete_and_change_operators<load_vi_bindings.<locals>.create_delete_and_change_operators  sI     4+<=L,L	<	6	6	A 
7	ArI   Tc                 B   >^ T" USU [        5       ) -  06U4S j5       ng )Nr}   c                 "  > U R                   nUR                  UR                  5      u  p4X4:  a`  UR                  UR                  U-   UR                  U-   T5        U=R                  UR
                  =(       d    UR                  -  sl        gg)z@
Apply transformation (uppercase, lowercase, rot13, swap case).
N)r   rh   rd   transform_regionr`   rP   rO   )r   r   r   rO   rP   transform_funcs        r6   rn   =load_vi_bindings.<locals>.create_transform_handler.<locals>._  s    
 ''D$33DMMBJE{%%((50((3."$ $$)MK<M<MN$ rI   )r   )r}   r  r  rn   r  s    `  r6   create_transform_handler2load_vi_bindings.<locals>.create_transform_handler  s*    	1	4Vz|m3	4	O 
5	OrI   c                     UR                  U R                  5      u  p#UR                  (       a&  U R                  R                  R                  U5        gg)z
Yank operator. (Copy text.)
N)rw   r   rs   r   r  r  )r   r   rn   rv   s       r6   yank_handler&load_vi_bindings.<locals>.yank_handler  sA    
 (OOE,@,@AII((8 rI   c                     U R                   S   R                  nU[        ;   a@  UR                  U R                  5      u  p4X@R
                  R                  R                  U'   gg)z"Yank selection to named register. r!   N)rZ  r  r[  rw   r   r   r   r\  )r   r   r  rn   rv   s        r6   rn   r     sW     q!&&!! +0D0D EA4BII..q1 "rI   c                 r    U R                   nUR                  U5      u  p4[        X#US-   U R                  S9  g)z	
Indent.
r!   r   N)r   ro   r   r   r   r   r   rl   rm   s        r6   rn   r     s5    
 ##006	tBF%))4rI   c                 r    U R                   nUR                  U5      u  p4[        X#US-   U R                  S9  g)z
Unindent.
r!   r   N)r   ro   r   r   r  s        r6   rn   r     s5    
 ##006	b1fEII6rI   qc                 Z    U R                   nUR                  U5      u  p4[        X#U5        g)z
Reshape text.
N)r   ro   r   r  s        r6   rn   r     s+    
 ##006	T"%rI   r   c                     [        U R                  R                  R                  U R                  S9=(       d    S5      $ )zMove one word or token left. r   r   rK   r   rd   find_start_of_previous_wordr   r   s    r6   rn   r     s6     %..77SSZ_ZcZcSdihijjrI   Bc                     [        U R                  R                  R                  U R                  SS9=(       d    S5      $ )zMove one non-blank word left Tr   WORDr   r  r   s    r6   rn   r     s9     %..77SSZ_ZcZcjnSotstuurI   $c                 \    [        U R                  R                  R                  5       5      $ )z;'c$', 'd$' and '$':  Delete/change/move until end of line. )rK   r   rd   r  r   s    r6   
key_dollar$load_vi_bindings.<locals>.key_dollar  s$     %..77PPRSSrI   c                     [        U R                  R                  R                  U R                  S9=(       d$    U R                  R                  R                  5       5      $ )z?'word' forward. 'cw', 'dw', 'w': Delete/change/move one word.  r   rK   r   rd   find_next_word_beginningr   get_end_of_document_positionr   s    r6   rn   r     sT     %..77PPW\W`W`Pa Y!0099VVXZ 	ZrI   c                     [        U R                  R                  R                  U R                  SS9=(       d$    U R                  R                  R                  5       5      $ )z?'WORD' forward. 'cW', 'dW', 'W': Delete/change/move one WORD.  Tr  r  r   s    r6   rn   r   !  sW     %..77PPW\W`W`gkPl Y!0099VVXZ 	ZrI   rl  c                     U R                   R                  R                  U R                  S9n[	        U(       a  US-
  OS[
        R                  S9$ )zEnd of 'word': 'ce', 'de', 'e' r   r!   r   r   r   rd   find_next_word_endingr   rK   r>   rA   r   rP   s     r6   rn   r   '  sB     ""++AA		ARS#'an6N6NOOrI   Ec                     U R                   R                  R                  U R                  SS9n[	        U(       a  US-
  OS[
        R                  S9$ )zEnd of 'WORD': 'cE', 'dE', 'E' Tr  r!   r   r   r  r  s     r6   rn   r   -  sE     ""++AA		X\A]S#'an6N6NOOrI   r~   c                 d    U R                   R                  R                  5       u  p[        X5      $ )zInner 'word': ciw and diw r   rd   find_boundaries_of_current_wordrK   r   rO   rP   s      r6   rn   r   3  s+     ))22RRT
%%%rI   c                 b    U R                   R                  R                  SS9u  p[        X5      $ )zA 'word': caw and daw T)include_trailing_whitespacer  r  s      r6   rn   r   9  s1     ))22RRosRt
%%%rI   c                 b    U R                   R                  R                  SS9u  p[        X5      $ )zInner 'WORD': ciW and diW T)r  r  r  s      r6   rn   r   ?  s1     ))22RRX\R]
%%%rI   c                 d    U R                   R                  R                  SSS9u  p[        X5      $ )zA 'WORD': caw and daw T)r  r  r  r  s      r6   rn   r   E  s4     ))22RRX\z~R
%%%rI   c                     U R                   R                  R                  5       nU R                   R                  R                  U R                  S9n[        X5      $ )z
Auto paragraph.
r   )r   rd   start_of_paragraphend_of_paragraphr   rK   r  s      r6   rn   r   K  sL    
 $$--@@B""++<<599<M%%%rI   ^c                 Z    [        U R                  R                  R                  SS95      $ )z:'c^', 'd^' and '^': Soft start of line, after whitespace. Tr  rK   r   rd   r  r   s    r6   key_circumflex(load_vi_bindings.<locals>.key_circumflexT  s*     %..77RRdhRijjrI   0c                 Z    [        U R                  R                  R                  SS95      $ )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_zero"load_vi_bindings.<locals>.key_zeroY  s*     %..77RRdiRjkkrI   c                    >^ ^^ UU U4S jnUc#  T" ST   T SS9" U5        T" ST   TSS9" U5        gT" ST   USS9" U5        g)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                   > TT:X  aI  U R                   R                  R                  TSS9nU R                   R                  R                  TSS9nOLU R                   R                  R	                  TT5      nU R                   R                  R                  TT5      nUb"  Ub  T(       a  SOSn[        US-   U-
  X#-   5      $ [        S5      $ )NF)in_current_liner   r!   )r   rd   find_backwardsfindfind_enclosing_bracket_leftfind_enclosing_bracket_rightrK   )r   rO   rP   offsetci_endci_startinners       r6   handler?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"4clCC "!}$rI   NaiTr  r2   )r  r  r  keyr  r   s   ```  r6   create_ci_ca_handles.load_vi_bindings.<locals>.create_ci_ca_handlesa  sN    	%" ;UXtDWMUVTB7KUS$?HrI   )FT))rX  rX  )'r  )`r  )[])r  r  ){})r  r  r  r  c                 t    U R                   R                  R                  U R                  SS9n[	        U5      $ )zQ
Move to previous blank-line separated section.
Implements '{', 'c{', 'd{', 'y{'
T)r   r&  )r   rd   r  r   rK   r   indexs     r6   rn   r     s:     $$--@@))D A *%  rI   c                 t    U R                   R                  R                  U R                  SS9n[	        U5      $ )zM
Move to next blank-line separated section.
Implements '}', 'c}', 'd}', 'y}'
T)r   r'  )r   rd   r  r   rK   r   s     r6   rn   r     s5     $$-->>UYYVZ>[%  rI   fc                 &   [        U R                  S5      U R                  R                  l        U R
                  R                  R                  U R                  SU R                  S9nU(       a  [        U[        R                  S9$ [        S5      $ )zn
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   rd   r  r   rK   r>   rA   r   matchs     r6   rn   r     sq     2?uzz51Q		.$$--22JJEII 3 ?e.*B*BCCa= rI   Fc                     [        U R                  S5      U R                  R                  l        [        U R                  R                  R                  U R                  SU R                  S9=(       d    S5      $ )zv
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'  rK   r   rd   r  r   r   s    r6   rn   r     sg     2?uzz41P		.%..77FFJJEII G ? DBCE 	ErI   tc                 ,   [        U R                  S5      U R                  R                  l        U R
                  R                  R                  U R                  SU R                  S9nU(       a  [        US-
  [        R                  S9$ [        S5      $ )z@
Move right to the next occurance of c, then one char backward.
FTr%  r!   r   r   r&  r(  s     r6   rn   r     su    
 2?uzz51Q		.$$--22JJEII 3 ?eain.F.FGGa= rI   Tc                    [        U R                  S5      U R                  R                  l        U R
                  R                  R                  U R                  SU R                  S9n[        U(       a	  US-   5      $ S5      $ )zB
Move left to the previous occurance of c, then one char forward.
Tr%  r!   r   )
r   r  r   r   r'  r   rd   r  r   rK   r(  s     r6   rn   r     sj    
 2?uzz41P		.$$--<<JJEII = ?u%!)44!44rI   c                 <   >^  T" T (       a  SOS5      U 4S j5       ng)z
Create ',' and ';' commands.
,;c                   > SnU R                   R                  n[        R                  nUR                  (       a  UR                  R
                  nUR                  R                  nT(       a  U(       + nU(       a0  U R                  R                  R                  USU R                  S9nO?U R                  R                  R                  USU R                  S9n[        R                  nU(       a	  [        XS9$ [        S5      $ )Nr   Tr%  r   )r   r   r>   r@   r'  	character	backwardsr   rd   r  r   r  rA   rK   )r   posr   rQ   charr5  reverses         r6   rn   +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!#11!!}$rI   Nr2   )r8  rn   r   s   ` r6   repeat load_vi_bindings.<locals>.repeat  s      
GS	-	% 
.	%rI   hc                 n    [        U R                  R                  R                  U R                  S95      $ )z)Implements 'ch', 'dh', 'h': Cursor left. r   )rK   r   rd   r   r   r   s    r6   rn   r     s0     %..77PPW\W`W`PabbrI   )r~   r   c                     [        U R                  R                  R                  U R                  S9[
        R                  S9$ )z+Implements 'cj', 'dj', 'j', ... Cursor up. r   r   )rK   r   rd   r  r   r>   rB   r   s    r6   rn   r     s=     %..77PPW\W`W`Pa-668 	8rI   c                     [        U R                  R                  R                  U R                  S9[
        R                  S9$ )z+Implements 'ck', 'dk', 'k', ... Cursor up. r   r   )rK   r   rd   r  r   r>   rB   r   s    r6   rn   r     s=     %..77NNUZU^U^N_-668 	8rI   lr"  c                 n    [        U R                  R                  R                  U R                  S95      $ )z;Implements 'cl', 'dl', 'l', 'c ', 'd ', ' '. Cursor right. r   )rK   r   rd   r  r   r   s    r6   rn   r     s0    
 %..77QQX]XaXaQbccrI   Hc                    [        U R                  U R                  R                  5      nU R                  nU(       aR  UR                  (       aA  UR
                  R                  UR                  R                  SS9S5      UR                  -
  nO [        UR
                  R                  5      * n[        U[        R                  S9$ )zb
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_inford   ra   first_visible_liner`   rb   text_before_cursorrK   r>   rB   r   r|  r   r6  s       r6   rn   r     s     (		5993P3PQ   ::88}}77D7QSTV$$%C qzz4455C#N$;$;<<rI   Mc                    [        U R                  U R                  R                  5      nU R                  nU(       aS  UR                  (       aB  UR
                  R                  UR                  R                  5       S5      UR                  -
  nO [        UR
                  R                  5      * n[        U[        R                  S9$ )zX
Moves cursor to the vertical center of the visible region.
Implements 'cM', 'dM', 'M'.
r   r   )r   r   rE  r   rF  rd   ra   center_visible_liner`   rb   rH  rK   r>   rB   rI  s       r6   rn   r     s     (		5993P3PQ   ::88}}88:A?$$%C qzz4455C#N$;$;<<rI   Lc                    [        U R                  U R                  R                  5      nU R                  nU(       aR  UR                  (       aA  UR
                  R                  UR                  R                  SS9S5      UR                  -
  nO[        UR
                  R                  5      n[        U[        R                  S9$ )zD
Moves to the end of the visible region. (Above the scroll offset.)
T)before_scroll_offsetr   r   )r   r   rE  r   rF  rd   ra   last_visible_liner`   rb   text_after_cursorrK   r>   rB   rI  s       r6   rn   r   -  s    
 (		5993P3PQ   ::88}}66D6QSTV$$%C ajj223C#N$;$;<<rI   nc                    > U R                   nUR                  T" U R                  5      SU R                  S9n[	        X!R
                  -
  5      $ )zSearch next. Fr  r   r   get_search_positionr   r   rK   r`   r   r   r`   r   s      r6   rn   r   A  sP     ##22UYY'%)) 3  /,@,@@AArI   c                 p   > U R                   R                  T" U R                  5      SU R                  S9  g)zASearch next in navigation mode. (This goes through the history.) FrT  Nr   r  r   r   r   r   s    r6   rn   r   J  s3     	))UYY'%)) 	* 	rI   Nc                    > U R                   nUR                  T" U R                  5      ) SU R                  S9n[	        X!R
                  -
  5      $ )zSearch previous. FrT  rU  rW  s      r6   rn   r   Q  sS     ##22eii((5)) 3  /,@,@@AArI   c                 r   > U R                   R                  T" U R                  5      ) SU R                  S9  g)zESearch previous in navigation mode. (This goes through the history.) FrT  NrY  rZ  s    r6   rn   r   Z  s6     	))eii((5)) 	* 	rI   zc                     [        U R                  U R                  R                  5      nU R                  R                  nUR                  R
                  Ul        g)zT
Scrolls the window to makes the current line the first line in the visible region.
N)r   r   rE  r   rd   r$  vertical_scroll)r   r|  r   s      r6   rn   r   a  s?     (		5993P3PQII$$JJ::rI   c                 f    [        U R                  U R                  R                  5      nSUl        g)zS
Scrolls the window to makes the current line the last line in the visible region.
r   N)r   r   rE  r`  )r   r|  s     r6   rn   r   l  s(     (		5993P3PQ
 rI   c                    [        U R                  U R                  R                  5      nU R                  R                  nU(       a  UR                  (       ay  UR                  nUR
                  S-  n[        SUR                  R                  S-
  5      nSnUS:  a,  UR                  U5      nXg-   U:  a
  Xg-  nUS-  nOOUS:  a  M,  XQl
        ggg)z)
Center Window vertically around cursor.
r+   r   r!   N)r   r   rE  r   rF  window_heightmaxrd   r$  get_height_for_liner`  )r   r|  r   infoscroll_heightr  heightline_heights           r6   rn   r   y  s    
 (		5993P3PQII$$==D !..!3MAqzz559:AFa%"66q9'-7)FFA a% !"% 1rI   %c                    U R                   nU R                  (       a  SU R                  s=:  a  S::  a}  O  OzUR                  R	                  [        U R                  UR                  R                  -  S-
  S-  5      S5      n[        X!R                  R                  -
  [        R                  S9$ [        S5      $ UR                  R                  5       nU(       a  [        U[        R                  S9$ [        S5      $ )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   rd   ra   int
line_countrK   r`   r>   rB   find_matching_bracket_positionrA   )r   rk   absolute_indexr)  s       r6   rn   r     s     %%:: 599##!'!K!KV__%?%??!CsJKQ"P!.??3R3R"RYgYpYpqq!!}$ OOBBDE!%n.F.FGG!!}$rI   |c                 x    [        U R                  R                  R                  U R                  S-
  5      5      $ r   )rK   r   rd   get_column_cursor_positionr   r   s    r6   rn   r     s3     %..77RRSXS\S\_`S`abbrI   c                     U R                   R                  nU R                  (       aB  [        UR	                  U R
                  S-
  S5      UR                  -
  [        R                  S9$ [        UR                  5       [        R                  S9$ )z
Implements 'gg', 'cgg', 'ygg'
r!   r   r   )
r   rd   r   rK   ra   r   r`   r>   rB   get_start_of_document_position)r   r  s     r6   rn   r     sn    
   ))::a::599q=!LqO`O``gug~g~ a>>@~G^G^__rI   rn   c                 v    [        U R                  R                  R                  5       [        R
                  S9$ )z9
Go to last non-blank of line.
'g_', 'cg_', 'yg_', etc..
r   )rK   r   rd   'last_non_blank_of_current_line_positionr>   rA   r   s    r6   rn   r     s4       ))QQSZhZrZrt 	trI   c                     U R                   R                  R                  U R                  S9n[	        Ub  US-
  OS[
        R                  S9$ )zB
Go to last character of previous word.
'ge', 'cge', 'yge', etc..
r   r!   r   r   r   rd   find_previous_word_endingr   rK   r>   rA   r   prev_ends     r6   rn   r     sH     ''00JJQVQZQZJ[(*>(Q,ANLdLdeerI   c                     U R                   R                  R                  U R                  SS9n[	        Ub  US-
  OS[
        R                  S9$ )zB
Go to last character of previous WORD.
'gE', 'cgE', 'ygE', etc..
Tr  r!   r   r   ry  r{  s     r6   rn   r     sK     ''00JJQVQZQZaeJf(*>(Q,ANLdLdeerI   mc           	         [        U R                  U R                  R                  5      nU R                  nU(       a  UR                  (       a  UR                  R
                  nUR                  R                  SS9nU[        [        US-  [        UR                  R                  5      5      5      -  n[        U[        R                  S9$ [        S5      $ )zI
Like g0, but half a screenwidth to the right. (Or as much as possible.)
Fr  r+   r   r   )r   r   rE  r   rF  window_widthrd   r  rm  minrb   r  rK   r>   rA   )r   r|  r   widthrO   s        r6   rn   r     s    
 (		5993P3PQ##MM..EMM<<e<TESUQYDMM,F,F(GHIIEe.*B*BCC!}rI   Gc                     U R                   n[        UR                  R                  UR                  R                  S-
  S5      UR
                  -
  [        R                  S9$ )z<
Go to the end of the document. (If no arg has been given.)
r!   r   r   )r   rK   rd   ra   rn  r`   r>   rB   )r   bufs     r6   rn   r     sY    
 ""#,,AA#,,BYBY\]B]_`a--.4B4K4KM 	MrI   c                 T    U R                   R                  U R                  S-
  5        g)zP
If an argument is given, move to this line in the  history. (for
example, 15G)
r!   N)r   go_to_historyr   r   s    r6   rn   r     s      	**599q=9rI   	123456789c                 :    U R                  U R                  5        g)z4
Always handle numberics in navigation mode as arg.
Nappend_to_arg_countr  r   s    r6   rn   r     s    
 %%ejj1rI   c                 :    U R                  U R                  5        g)z(Zero when an argument was already give. Nr  r   s    r6   rn   r     s     	!!%**-rI   c                 L    U R                   R                  U R                  SS9  g)z!
Insert data at cursor position.
Trb  N)r   rd  r  r   s    r6   rn   r     s!    
 	((t(DrI   c                 $    U R                   (       + $ rN   )	is_repeatrk  s    r6   r   r     s
    q{{?rI   c                    U R                   nUR                  n/ nSnUR                   H3  nUR                  X$U 5        UR                  U R                  5        UnM5     UR                  X$S 5        [        UR                  5       VVs/ s H  u  pdXF-   S-   PM     nnnSR                  U5      Ul        Xql        U=R                  S-  sl        gs  snnf )zv
Insert data at multiple cursor positions at once.
(Usually a result of pressing 'I' or 'A' in block-selection mode.)
r   Nr!   rG  )r   rs   r;  r:  r  r8  r#  r`   )r   r   original_textrs   rN  p2r*  new_cursor_positionss           r6   rn   r     s     ##		 00BKK+,KK

#A 1
 	M"%& #,D,J,J"K M"K$!AEAI"K 	  M GGDM	)=&! Ms   Cc                 2   U R                   nUR                  nSn/ nSnUR                   HB  nUS:  a$  X&S-
     S:w  a  UR                  X%US-
   5        SnOUR                  X%U 5        UnMD     UR                  X%S 5        U(       ad  USS  Vs/ s H  n[	        U5      PM     nn[        [        U5      5      n	SR                  U5      Ul        Xl        U=R                  S-  sl        gU R                  R                  R                  5         gs  snf )	z#Backspace, using multiple cursors. Fr   r!   r!  TNrG  )r   rs   r;  r:  rb   listr0   r#  r`   r   r  r  )
r   r   r  deleted_somethingrs   rN  r  partlengthsr  s
             r6   rn   r   5  s    ##		 "00BAv-Q/47MBF34$(!MB/0A 1 	M"%&-1#2Y7YTs4yYG7#'
7(;#<  DI-A*  A% II!!# 8s   Dc                    U R                   nUR                  nSn/ n/ nSnUR                   H8  nUR                  X&U 5        U[	        U5      :  d  X'   S:X  a  UnM1  US-   nSnM:     UR                  X&S 5        U(       aO  USS  Vs/ s H  n[	        U5      PM     n	n[        [        U	5      5      nSR                  U5      Ul        XQl        gU R                  R                  R                  5         gs  snf )	z Delete, using multiple cursors. Fr   r!  r!   TNr  rG  )r   rs   r;  r:  rb   r  r0   r#  r   r  r  )
r   r   r  r  rs   r  rN  r  r  r  s
             r6   rn   r   V  s     ##		 "!00BKK+,S''=+<+DF$(! 1 	M"%&-1#2Y7YTs4yYG7#'
7(;#<  DI-A*II!!# 8s   
C7c                 8    U R                   R                  5         g)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   rn   r   y  s     	;;=rI   c                     g)z
Complete file names.
Nr2   r   s    r6   rn   r     s     	rI   c                 :    SU R                   R                  l        g)zGo into digraph mode. TN)r   r   waiting_for_digraphr   s    r6   rn   r     s     26		.rI   c                 2    U R                   R                  S L$ rN   )r   digraph_symbol1r   s    r6   digraph_symbol_1_given0load_vi_bindings.<locals>.digraph_symbol_1_given  s    ||++477rI   c                 N    U R                   U R                  R                  l        g rN   )r  r   r   r  r   s    r6   rn   r     s    -2ZZ		*rI   c                     U R                   R                  R                  U R                  4nU[        ;  a  USSS2   n[        U   nU R                   R                  R
                  [        R                  :H  nU R                  R                  [        R                  " U5      US9  SU R                   R                  l        SU R                   R                  l        SU R                   R                  l        g! [         a'    U R                   R                  R                  5          Ngf = f! SU R                   R                  l        SU R                   R                  l        f = f)zInsert digraph. Nr  rb  F)r   r   r  r  r   r   r   r   r   rd  sixunichrr  KeyErrorr  r  )r   codesymbolrc  s       r6   rn   r     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&)FrN   )'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_functionsrn   r/  r  r  r   r#  funcr  r  r  r  r  r  r  r  r:  rR  r  r>  r  r   s    `                            @@@r6   r7   r7   ,  sD   & #8:vx8H!!F : '(O.K/1 ?L$&N/1N ?L 
VXMN 
VX<= 
VX<= 
VX?@	)CDFfg  4==-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+":;6 <6 8 8 DHH\-C,CCD8 E8 DHH\,BBC6 D6* OrI   c                  l    [        5       n [        5       nU R                  SUS9" [        S5      5        U $ )zM
Pressing 'v' in navigation mode will open the buffer in an external editor.
rx  r   zedit-and-execute-command)r,   r   r   r*   )r   r   s     r6   load_vi_open_in_editor_bindingsr    s9     zH&(O_5./1OrI   c                  \   [        [        5       [        5       5      n U R                  n[        R
                  " [        5      n[        5       nU" SU) U-  S9S 5       nU" [        R                  US9U" [        R                  US9S 5       5       nU" [        R                  US9S 5       nU $ )N!r   c                     U R                   R                  [        5        [        R                  U R                   R
                  l        g)z
'!' opens the system prompt.
N)r   
push_focusr   r   r   r   r   r   s    r6   rn   "load_vi_system_bindings.<locals>._  s.    
 			]+(1(8(8		%rI   c                     [         R                  U R                  R                  l        U R                  R
                  [           R                  5         U R                  R                  5         g)z
Cancel system prompt.
N)	r   r   r   r   r   buffersr   r   	pop_focusr   s    r6   rn   r    sG     )2(<(<		%		-(..0		rI   c                 ,   [         R                  U R                  R                  l        U R                  R
                  [           nU R                  R                  UR                  5        UR                  SS9  U R                  R                  5         g)z
Run system command.
T)append_to_historyN)r   r   r   r   r   r  r   run_system_commandrs   r   r  )r   system_buffers     r6   rn   r    sk    
 )2(<(<		%		))-8		$$]%7%78d3 			rI   )r-   r,   r   r   filtersHasFocusr   r   r   r  ControlCr  )r   r  	has_focusr   rn   s        r6   r9   r9     s    "8:vx8H!!F  /I&(OC
_459 69 DKK	*DMM), - + DMM), - OrI   c           
        ^ ^^
 T b  [        T 5      (       d   eT (       d  S m [        [        5       [        5       5      nUR                  n[
        R                  " T5      n[        5       n[        5       n[        S 5      nU" SXV-  U) -  S9U" SXV-  U-  S9U" [        R                  U) S9U U4S j5       5       5       nU" SXV-  U) -  S9U" SXV-  U-  S9U" [        R                  U) S9U U4S j5       5       5       nU" [        R                  US9U U4S j5       nSU U4S	 jjm
U" [        R                  US9U
4S
 j5       nU" [        R                  US9U
4S j5       nU4S jn	U" [        R                  US9U" [        R                  US9U" [        R                   U[        U	5      -  S9U" [        R"                  U[        U	5      -  S9U4S j5       5       5       5       nU$ )Nc                     U R                   $ rN   r   r   s    r6   r   1load_vi_search_bindings.<locals>.get_search_state  r   rI   c                 8    U R                   R                  U 5      $ rN   )applicationreverse_vi_search_directionr   s    r6   r   )load_vi_search_bindings.<locals>.<lambda>  s    COO??DrI   /r   r   c                    > [         R                  T" U R                  5      l        [        R
                  U R                  R                  l        U R                  R                  T5        g)z
Vi-style forward search.
N)	r	   r  r   r  r   r   r   r   r  r   r   search_buffer_names    r6   rn   "load_vi_search_bindings.<locals>._  sK     1K0R0R#-(1(8(8		% 			/0rI   c                    > [         R                  T" U R                  5      l        U R                  R	                  T5        [
        R                  U R                  R                  l        g)z
Vi-style backward search.
N)	r	   r  r   r  r  r   r   r   r   r  s    r6   rn   r    sK     1K0S0S#- 			/0(1(8(8		%rI   c                   > U R                   R                  R                  U R                   5      nU R                   R                  T   nUR                  (       a!  UR                  T" U R                   5      l        UR	                  T" U R                   5      5        UR                  5         UR                  5         [        R                  U R                   R                  l
        U R                   R                  5         g)z+
Apply the search. (At the / or ? prompt.)
N)r   r  previousrs   r  r  r   r   r   r   r   r  )r   input_buffersearch_bufferr   r  s      r6   rn   r    s    
 yy((11%))<		))*<= /</A/AUYY', 	!!"2599"=> 	'') )2(<(<		%		rI   c                    > T" U 5      nUR                   U:g  nU R                  T   R                  Ul        Xl         U(       d-  U R                  R                  U 5      nUR	                  USUS9  gg)z/Apply search, but keep search buffer focussed. FrT  N)r  r  rs   r  r  )r   r  r   r   direction_changedr  r   r  s         r6   incremental_search3load_vi_search_bindings.<locals>.incremental_search)  sw     (,(22i?KK(:;@@!* !;;//4L%%l?DE & S !rI   c                 Z   > T" U R                   [        R                  U R                  S9  g r  )r   r	   r  r   r   r  s    r6   rn   r  8  s!    599&@&I&IQVQZQZ[rI   c                 Z   > T" U R                   [        R                  U R                  S9  g r  )r   r	   r  r   r  s    r6   rn   r  <  s!    599&@&H&HPUPYPYZrI   c                 <   > U R                   T   R                  S:H  $ )z.Returns True when the search buffer is empty. rG  )r  rs   )r   r  s    r6   search_buffer_is_empty7load_vi_search_bindings.<locals>.search_buffer_is_empty@  s    {{-.33r99rI   c                    > [         R                  U R                  R                  l        U R                  R                  5         U R                  R                  T   R                  5         g)z
Cancel search.
N)r   r   r   r   r   r  r  r   )r   r  s    r6   rn   r  D  sI     )2(<(<		%				,-335rI   )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  rn   r  r  s   ``        @r6   r8   r8     s    #x0@'A'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 S DMM),\ -\ DMM),[ -[: DKK	*DMM),DMM)i8N.O"OPDNN9y9O/P#PQ6 R Q - +6 OrI   c                  V   [        [        5       [        5       5      n U R                  nU" [        R
                  5      " [        5        U" [        R                  5      " [        5        U" [        R                  5      " [        5        U" [        R                  5      " [        5        U" [        R                  5      " [        5        U" [        R                  5      " [         5        U" [        R"                  5      " [$        5        U" [        R&                  5      " [(        5        U $ )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
4==.)
4==/*
4==/0
4==-.
4==./
4==,-
4==*+
4;;'OrI   c                   $    \ rS rSrSrS rS rSrg)ViStateFilterih  zDeprecated! c                     Xl         X l        g rN   get_vi_statemode)rR   r  r   s      r6   rS   ViStateFilter.__init__j  s    (	rI   c                 R    U R                  U5      R                  U R                  :H  $ rN   )r  r   r   )rR   r   s     r6   __call__ViStateFilter.__call__n  s"      %00DII==rI   r  N)rD   rE   rF   rG   ry   rS   r  rH   r2   rI   r6   r  r  h  s    >rI   r  rN   )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decoder[  objectr>   rK   r   r   r7   r  r9   r8   r:   r  r2   rI   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) )	D54D5