
    nyeL                        d dl mZ d dlmZ d dlmZmZmZ d dlm	Z	 d dl
mZmZ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 d dlmZ d d	lmZ d
dlmZmZm Z  ddl!m"Z" g dZ#eZ$ddZ%ddZ&ddZ'y)    )annotations)get_app)Bufferindentunindent)CompleteEvent)
	Conditionemacs_insert_mode
emacs_modehas_arghas_selectionin_paste_modeis_multilineis_read_onlyshift_selection_modevi_search_direction_reversed)Binding)KeyPressEvent)Keys)SelectionType   )ConditionalKeyBindingsKeyBindingsKeyBindingsBase   )get_by_name)load_emacs_bindingsload_emacs_search_bindings#load_emacs_shift_selection_bindingsc                 J   t               } | j                  t        } d      dod       }  d      t        d               d      t        d               d|      t        d	               d
      t        d               d      t        d               d      t        d               d      t        d               ddd|      t        d               d|      t        d               dd      t        d               dd|      t        d               dd|      t        d	               dd      t        d               dd|      t        d               dd|      t        d               dd|      t        d                dd!|      t        d"               dd#|      t        d$               d%      t        d&               d'      t        d(               d)d* |+      t        d,               dd-d. |+      t        d,               dd/t               t        d0               dd1t               t        d2               dd3|      t        d4               dd5|      t        d4               dd|      t        d6               dd7|      t        d8               d9      t        d:               d;t               t        d<               dd=      t        d>               dd?      t        d@               ddA      t        dB              dC      dodD       } dE      dodF       }dpfdG}dHD ]
  } ||         ddIt
               dodJ       } dIt        dK             dodL       }t        dqdM       }	  ddN||	z        t        dO               dN||	z  t         z        t        dO             drdP dQt        j                        dofdR       }
 ddQt        j                        dofdS       } ddT      dodU       } ddA      dodV       } ddW|      dodX       } ddY|      dodZ       } dd      dod[       } d\      dod]       } d^t               dod_       } d^t              dod`       } dat               dddbt              dodc              } dddt              dode       } ddf      dodg       } ddh      dodi       } ddj|      dodk       } dld1t              dodm       } dld/t              dodn       }t        | t              S )sz!
    Some e-macs extensions.
    escapec                     y)a\  
        By default, ignore escape key.

        (If we don't put this here, and Esc is followed by a key which sequence
        is not handled, we'll insert an Escape character in the input stream.
        Something we don't want and happens to easily in emacs mode.
        Further, people can always use ControlQ to do a quoted insert.)
        N events    K/usr/lib/python3/dist-packages/prompt_toolkit/key_binding/bindings/emacs.py_escz!load_emacs_bindings.<locals>._esc/   s     	    zc-abeginning-of-linezc-bbackward-charzc-deletefilterz	kill-wordzc-eend-of-linezc-fforward-charc-leftbackward-wordc-rightforward-wordzc-xryyankc-ybczcapitalize-worddflzdowncase-worduzuppercase-wordzyank-pop	backspacezbackward-kill-word\zdelete-horizontal-spacec-homebeginning-of-bufferc-endend-of-bufferzc-_c                     yNFr#   es    r&   <lambda>z%load_emacs_bindings.<locals>.<lambda>Q       r(   )save_beforer,   undozc-uc                     yrD   r#   rE   s    r&   rG   z%load_emacs_bindings.<locals>.<lambda>U   rH   r(   <zbeginning-of-history>zend-of-history.zyank-last-arg_zyank-nth-arg#zinsert-commentzc-ozoperate-and-get-nextzc-qzquoted-insert(zstart-kbd-macro)zend-kbd-macrorF   zcall-last-kbd-macrozc-nc                8    | j                   j                          y)z
Next line.N)current_buffer	auto_downr$   s    r&   _nextz"load_emacs_bindings.<locals>._nextk   s     	&&(r(   zc-pc                P    | j                   j                  | j                         y)zPrevious line.countN)rT   auto_upargr$   s    r&   _prevz"load_emacs_bindings.<locals>._prevp   s     	$$599$5r(   c                N       t                d       d fd              }y)ze
        Handle input of arguments.
        The first number needs to be preceded by escape.
        r+   r!   c                (    | j                         y N)append_to_arg_count)r%   r8   s    r&   rO   z4load_emacs_bindings.<locals>.handle_digit.<locals>._{   s     %%a(r(   Nr%   EreturnNone)r   )r8   rO   handles   ` r&   handle_digitz)load_emacs_bindings.<locals>.handle_digitu   s-     
'	"	!		) 
 
#	)r(   
0123456789-c                @    | j                   | j                  d       yy) Nrh   )_argr`   r$   s    r&   
_meta_dashz'load_emacs_bindings.<locals>._meta_dash   s!     ::%%c* r(   c                 D    t               j                  j                  dk(  S )Nrh   )r   key_processorr[   r#   r(   r&   rG   z%load_emacs_bindings.<locals>.<lambda>   s    ')*A*A*E*E*L r(   c                :    d| j                   j                  _        y)zp
        When '-' is typed again, after exactly '-' has been given as an
        argument, ignore this.
        rh   N)apprn   r[   r$   s    r&   _dashz"load_emacs_bindings.<locals>._dash   s     '*		#r(   c                 >    t               j                  j                  S r_   )r   rT   is_returnabler#   r(   r&   rs   z*load_emacs_bindings.<locals>.is_returnable   s    y''555r(   enterzaccept-linec                    |dk  r | j                   j                  |d|       }n| j                   j                  |d|      }|| xj                  |z  c_        y y )Nr   T)in_current_linerY   )documentfind_backwardsfindcursor_position)buffcharrY   matchs       r&   character_searchz-load_emacs_bindings.<locals>.character_search   sd    19MM00d5& 1 E MM&&tT&OE  E)  r(   zc-]c                V     | j                   | j                  | j                         y)z:When Ctl-] + a character is pressed. go to that character.NrT   datar[   r%   r~   s    r&   
_goto_charz'load_emacs_bindings.<locals>._goto_char   s     	--uzz599Er(   c                X     | j                   | j                  | j                          y)zLike Ctl-], but backwards.Nr   r   s    r&   _goto_char_backwardsz1load_emacs_bindings.<locals>._goto_char_backwards   s!     	--uzzEII:Fr(   ac                     y)zPrevious sentence.Nr#   r$   s    r&   _prev_sentencez+load_emacs_bindings.<locals>._prev_sentence   rH   r(   c                     y)zMove to end of sentence.Nr#   r$   s    r&   _end_of_sentencez-load_emacs_bindings.<locals>._end_of_sentence   rH   r(   tc                     y)z<
        Swap the last two words before the cursor.
        Nr#   r$   s    r&   _swap_charactersz-load_emacs_bindings.<locals>._swap_characters   rH   r(   *c                    | j                   }t        dd      }t        |j                  j	                  |j
                  |            }dj                  d |D              }|j                  |       y)zR
        `meta-*`: Insert all possible completions of the preceding text.
        FT)text_insertedcompletion_requested c              3  4   K   | ]  }|j                     y wr_   )text).0r8   s     r&   	<genexpr>zGload_emacs_bindings.<locals>._insert_all_completions.<locals>.<genexpr>   s     !>Q!&&!>s   N)rT   r   list	completerget_completionsrw   joininsert_text)r%   r{   complete_eventcompletionstext_to_inserts        r&   _insert_all_completionsz4load_emacs_bindings.<locals>._insert_all_completions   sd    
 ## 'UQUVNN**4==.I

 !>+!>>(r(   c                   | j                   }|j                  j                  r0|xj                  |j                  j	                  d      z  c_        y|xj                  |j                  j                         z  c_        y)zc
        Move cursor back and forth between the start and end of the current
        line.
        Fafter_whitespaceN)rT   rw   is_cursor_at_the_end_of_linerz   get_start_of_line_positionget_end_of_line_positionr%   buffers     r&   _toggle_start_endz.load_emacs_bindings.<locals>._toggle_start_end   sg     %%??77""foo&P&P!& 'Q ' " ""foo&N&N&PP"r(   zc-@c                v    | j                   }|j                  r!|j                  t        j                         yy)zN
        Start of the selection (if the current buffer is not empty).
        selection_typeN)rT   r   start_selectionr   
CHARACTERSr%   r{   s     r&   _start_selectionz-load_emacs_bindings.<locals>._start_selection   s2     ##99  0H0H I r(   c-gc                H    d| j                   _        d| j                   _        y)zK
        Control + G: Cancel completion menu and validation state.
        N)rT   complete_statevalidation_errorr$   s    r&   _cancelz$load_emacs_bindings.<locals>._cancel   s     
 /3+04-r(   c                8    | j                   j                          y)#
        Cancel selection.
        N)rT   exit_selectionr$   s    r&   _cancel_selectionz.load_emacs_bindings.<locals>._cancel_selection   s    
 	++-r(   zc-wkc                    | j                   j                         }| j                  j                  j	                  |       y)z$
        Cut selected text.
        N)rT   cut_selectionrp   	clipboardset_datar%   r   s     r&   _cutz!load_emacs_bindings.<locals>._cut   s0     ##113		$$T*r(   wc                    | j                   j                         }| j                  j                  j	                  |       y)z%
        Copy selected text.
        N)rT   copy_selectionrp   r   r   r   s     r&   _copyz"load_emacs_bindings.<locals>._copy	  s0    
 ##224		$$T*r(   leftc                    | j                   }|xj                  |j                  j                  | j                        xs dz  c_        y)z3
        Cursor to start of previous word.
        rX   r   N)rT   rz   rw   find_previous_word_beginningr[   r   s     r&   _start_of_wordz+load_emacs_bindings.<locals>._start_of_word  s>    
 %%OO88uyy8INQ	
r(   rightc                    | j                   }|xj                  |j                  j                  | j                        xs |j                  j                         z  c_        y)z/
        Cursor to start of next word.
        rX   N)rT   rz   rw   find_next_word_beginningr[   get_end_of_document_positionr   s     r&   _start_next_wordz-load_emacs_bindings.<locals>._start_next_word  sN    
 %%OO445994E >;;=	
r(   /c                z    | j                   }|j                  r|j                          y|j                  d       y)z 
        M-/: Complete.
        T)select_firstN)rT   r   complete_nextstart_completion)r%   r7   s     r&   	_completez&load_emacs_bindings.<locals>._complete&  s3    
   OOD1r(   c-cc                d   | j                   }|xj                  |j                  j                  d      z  c_        |j                  j	                         \  }}|j                  j                  |      \  }}|j                  j                  |      \  }}t        |||dz   | j                         y)z'
        Indent selected text.
        Tr   r   rX   N)rT   rz   rw   r   selection_rangetranslate_index_to_positionr   r[   r%   r   from_torO   s        r&   _indentz$load_emacs_bindings.<locals>._indent1  s    
 %%&//"L"L! #M #
 	
 OO335	r??>>uEq;;B?Avub1fEII6r(   c                   | j                   }|j                  j                         \  }}|j                  j                  |      \  }}|j                  j                  |      \  }}t	        |||dz   | j
                         y)z)
        Unindent selected text.
        r   rX   N)rT   rw   r   r   r   r[   r   s        r&   	_unindentz&load_emacs_bindings.<locals>._unindentB  sk    
 %%OO335	r??>>uEq;;B?AQeii8r(   ra   )r8   strrc   rd   )rc   bool)r{   r   r|   r   rY   intrc   rd   )r   addr
   r   r   r   r	   r   r   Anyr   r   )key_bindingsinsert_moder'   rV   r\   rf   r8   rl   rq   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r~   re   s                              @@r&   r   r   $   s0    =LF#KH	 	 F5M+123F5M+o./*F:k*;{+CDF5M+m,-F5M+n-.F8[12F9k.12/F5#s;/F0CD%F5%k&&9:F8S+o67-F8S-k:K.LM-F8S-k+.FGF8S+n56-F8S-k/.JK-F8S-k:J.KL-F8S-k*.EF5F8[5kBV6WX.F8T+.{;T/UVF8[!678F7OK01DF5DF LF5%o{KF 1F8S-0=S1TU0F8S-0=M1NO-F8S-k/.JK-F8S-k/.JK/F8U;/N0KL-F8S-k:J.KLF5M+456
 )F5-(_)EFF5#{#456F5#{?34F5#{#89:E]) ) E]6 6	)  Q Hc7(++ ,+
 C	"LMN* O* 6 6 BF8W[=%@AM"
 HF7;6,FGM"	* E488F F
 HeTXX&G 'G
 Hc  Hc# # Hc+. / Hc+.) /)  E5Q Q E]J J E=.)5 *5 E-(. ). E-(E3M2+ 3 )+ Hc-0+ 1+ Hf
 
 Hg
 
 Hc+.2 /2 E3}-7 .7  E3}-
9 .
9 ",
;;r(   c                    t               } | j                  }ddlm}   |d      |j                           |d      |j
                           |d      |j                           |d      |j                           |d      |j                           |d      |j                           |d      |j                           |d      |j                           |d	      |j                           |d
d      |j                           |dt        t         z        |j                           |dt        t         z        |j
                           |dt        t        z        |j
                           |dt        t        z        |j                          |dt              dd       } |dt              dd       }t        | t              S )Nr   )searchzc-rzc-sr   r   updownrt   r!   T)eager?r+   r   nc                |    | j                   j                  | j                  j                  d| j                         y)zJump to next match.Finclude_current_positionrY   NrT   apply_searchrp   current_search_stater[   r$   s    r&   
_jump_nextz.load_emacs_search_bindings.<locals>._jump_next  s4     	))II**%*)) 	* 	
r(   Nc                ~    | j                   j                  | j                  j                   d| j                         y)zJump to previous match.Fr   Nr   r$   s    r&   
_jump_prevz.load_emacs_search_bindings.<locals>._jump_prev  s7     	))YY+++%*)) 	* 	
r(   ra   )r   r   rj   r    start_reverse_incremental_search start_forward_incremental_searchabort_searchreverse_incremental_searchforward_incremental_searchaccept_searchr   r   r   r   )r   re   r   r   r   s        r&   r   r   R  s   =LF F5M&99:F5M&99:F5M&%%&F5M&%%&F5M&334F5M&334F4L223F6N6445F7OF(() !F84 !5!56 EF3|'C&CCD// EF3|'C&CCD// DF3|&BBC// DF3|&BBC// C%
 &
 C%
 &
 ",
;;r(   c                 Z  	 t               } | j                  }d!d	 |dt                |dt                |dt                |dt                |dt                |dt                |d	t                |d
t                |dt                |dt               d!	fd                                                                      } |dt               |dt               |dt               |dt               |dt               |dt               |d	t               |d
t               |dt               |dt              d!	fd                                                                      } |t        j
                  t              d!d       } |dt        t        z        d!d       } |dt              d!d       } |dt              d!d       } |dt               |dt               |dt               |dt               |dt               |dt               |dt               |dt               |dt               |dt              d!d                                                                       }t        | t              S )"z?
    Bindings to select text with shift + cursor movements
    c                   | j                   d   j                  }|t        j                  k(  r'| j                  j                  | j                         y|t        j                  k(  r'| j                  j                  | j                         yt        j                  dt        j                  dt        j                  dt        j                  dt        j                  dt        j                  d	t        j                  d
t        j                   di}	 t#        ||         }t%        |t&              r|j)                  |        yy# t*        $ r Y yw xY w)z
        Used for the shift selection mode. When called with
        a shift + movement key press event, moves the cursor
        as if shift is not pressed.
        r   rX   Nr*   r.   r)   r-   r0   r2   r@   rB   )key_sequencekeyr   ShiftUprT   rZ   r[   	ShiftDownrU   	ShiftLeft
ShiftRight	ShiftHomeShiftEndControlShiftLeftControlShiftRightControlShiftHomeControlShiftEndr   
isinstancer   callKeyError)r%   r   key_to_commandbindings       r&   unshift_movez9load_emacs_shift_selection_bindings.<locals>.unshift_move  s      #''$,,  ((uyy(9$..   ***; NNOOO^NN/MM=!!?""N!!#8  /	1
	$!."56G '7+U# ,  		s   E 	EEzs-leftr+   zs-rightzs-upzs-downzs-homezs-endzc-s-leftz	c-s-rightzc-s-homezc-s-endc                ,   | j                   }|j                  r{|j                  t        j                         |j
                  |j
                  j                          |j                  } |        |j                  |k(  r|j                          yyy)z8
        Start selection with shift + movement.
        r   N)	rT   r   r   r   r   selection_stateenter_shift_moderz   r   )r%   r{   original_positionr  s      r&   r   z=load_emacs_shift_selection_bindings.<locals>._start_selection  s     ##99  0H0H I##/ $$557 !% 4 4##'88 ##% 9 r(   c                     |        | j                   }|j                  5|j                  |j                  j                  k(  r|j	                          yyy)z&
        Extend the selection
        N)rT   r  rz   original_cursor_positionr   )r%   r{   r  s     r&   _extend_selectionz>load_emacs_shift_selection_bindings.<locals>._extend_selection  sU     	U##+##t';';'T'TT##% U ,r(   c                l    | j                   j                          t        d      j                  |        y)z4
        Replace selection by what is typed
        zself-insertN)rT   r   r   r
  r$   s    r&   _replace_selectionz?load_emacs_shift_selection_bindings.<locals>._replace_selection  s)    
 	**,M"''.r(   rt   c                    | j                   j                          | j                   j                  t                       y)z2
        A newline replaces the selection
        )copy_marginN)rT   r   newliner   r$   s    r&   _newlinez5load_emacs_shift_selection_bindings.<locals>._newline   s2    
 	**,$$]_1D$Er(   r=   c                8    | j                   j                          y)z#
        Delete selection.
        N)rT   r   r$   s    r&   _deletez4load_emacs_shift_selection_bindings.<locals>._delete  s    
 	**,r(   r6   c                    | j                   }|j                  r|j                          t        d      j	                  |        y)zS
        In shift selection mode, yanking (pasting) replace the selection.
        r5   N)rT   r  r   r   r
  r   s     r&   _yankz2load_emacs_shift_selection_bindings.<locals>._yank  s7    
 ## F  'r(   r   r   r   r   homeendr/   r1   r?   rA   c                    | j                   j                          | j                  d   }| j                  j	                  |d       y)r   r   T)firstN)rT   r   r   rn   feed)r%   	key_presss     r&   r   z4load_emacs_shift_selection_bindings.<locals>._cancel  s?     	++-&&q)	  $ 7r(   ra   )	r   r   r   r   r   r   r   r   r   )
r   re   r   r  r  r  r  r  r   r  s
            @r&   r   r     s   
 =LF#$J Hm^,I}n-FM>*Hm^,Hm^,G]N+J~.K/J~.I}n-& . / 0 / , - - + . -&, H12I23F/0H12H12G01J34K 45J34I23& 4 5 6 5 2 3 3 1 4 3& DHH12/ 3/ G0<?@F AF K 45- 6- E./( 0( F/0G01D-.F/0F/0E./H12I23H12G018 2 3 4 3 0 1 1 / 2 18 ",
;;r(   N)rc   r   )(
__future__r   "prompt_toolkit.application.currentr   prompt_toolkit.bufferr   r   r   prompt_toolkit.completionr   prompt_toolkit.filtersr	   r
   r   r   r   r   r   r   r   r   'prompt_toolkit.key_binding.key_bindingsr   (prompt_toolkit.key_binding.key_processorr   prompt_toolkit.keysr   prompt_toolkit.selectionr   r   r   r   r   named_commandsr   __all__rb   r   r   r   r#   r(   r&   <module>r1     s[    " 6 : : 3   < B $ 2 O O ' k<\	?<DY<r(   