o
    �õ±j²L  ã                   @  s  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$eddd„ƒZ%eddd„ƒZ&ddd„Z'ddd„Z(ddd„Z)dS )é    )Ú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_bindingsÚreturnÚboolc                   C  s
   t ƒ jjS ©N)r   Úcurrent_bufferÚis_returnable© r$   r$   úœ/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/prompt_toolkit/key_binding/bindings/emacs.pyr#   $   s   
r#   c                   C  s   t ƒ jjdkS )Nú-)r   Úkey_processorÚargr$   r$   r$   r%   Úis_arg)   s   r)   r   c                    s  t ƒ } | j‰t}ˆdƒd‘dd„ƒ}ˆdƒtd	ƒƒ ˆd
ƒtdƒƒ ˆd|d�tdƒƒ ˆdƒtdƒƒ ˆdƒtdƒƒ ˆdƒtdƒƒ ˆdƒtdƒƒ ˆddd|d�tdƒƒ ˆd|d�tdƒƒ ˆddƒtdƒƒ ˆdd|d�tdƒƒ ˆdd|d�tdƒƒ ˆdd ƒtdƒƒ ˆdd!|d�td"ƒƒ ˆdd#|d�td$ƒƒ ˆdd|d�td%ƒƒ ˆdd&|d�td'ƒƒ ˆdd(|d�td)ƒƒ ˆd*ƒtd+ƒƒ ˆd,ƒtd-ƒƒ ˆd.d/d0„ |d1�td2ƒƒ ˆdd3d4d0„ |d1�td2ƒƒ ˆdd5t d�td6ƒƒ ˆdd7t d�td8ƒƒ ˆdd9|d�td:ƒƒ ˆdd;|d�td:ƒƒ ˆdd|d�td<ƒƒ ˆdd=|d�td>ƒƒ ˆd?ƒtd@ƒƒ ˆdAt d�tdBƒƒ ˆddCƒtdDƒƒ ˆddEƒtdFƒƒ ˆddGƒtdHƒƒ ˆdIƒd‘dJdK„ƒ}ˆdLƒd‘dMdN„ƒ}d’‡fdPdQ„}dRD ]}||ƒ �qxˆddSt d�d‘dTdU„ƒ}ˆdStd�d‘dVdW„ƒ}ˆddX|t@ d�tdYƒƒ ˆdX|t@ t @ d�tdYƒƒ d“d_d`„‰ ˆdat	j
ƒd‘‡ fdbdc„ƒ}	ˆddat	j
ƒd‘‡ fddde„ƒ}
ˆddfƒd‘dgdh„ƒ}ˆddGƒd‘didj„ƒ}ˆddk|d�d‘dldm„ƒ}ˆddn|d�d‘dodp„ƒ}ˆddƒd‘dqdr„ƒ}ˆdsƒd‘dtdu„ƒ}ˆdvt d�d‘dwdx„ƒ}ˆdvtd�d‘dydz„ƒ}ˆd{td�ˆddd|td�d‘d}d~„ƒƒ}ˆddtd�d‘d€d�„ƒ}ˆdd‚ƒd‘dƒd„„ƒ}ˆdd…ƒd‘d†d‡„ƒ}ˆddˆ|d�d‘d‰dŠ„ƒ}ˆd‹d7td�d‘dŒd�„ƒ}ˆd‹d5td�d‘dŽd�„ƒ}t| tƒS )”z!
    Some e-macs extensions.
    ÚescapeÚeventÚEr   ÚNonec                 S  ó   dS )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.)
        Nr$   ©r+   r$   r$   r%   Ú_esc9   s   
z!load_emacs_bindings.<locals>._escz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                 S  r.   ©NFr$   ©Úer$   r$   r%   Ú<lambda>[   ó    z%load_emacs_bindings.<locals>.<lambda>)Úsave_beforer4   Úundozc-uc                 S  r.   rK   r$   rL   r$   r$   r%   rN   _   rO   ú<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-macrorM   zcall-last-kbd-macrozc-nc                 S  ó   | j  ¡  dS )z
Next line.N)r"   Ú	auto_downr/   r$   r$   r%   Ú_nextu   ó   z"load_emacs_bindings.<locals>._nextzc-pc                 S  s   | j j| jd� dS )zPrevious line.©ÚcountN)r"   Úauto_upr(   r/   r$   r$   r%   Ú_prevz   s   z"load_emacs_bindings.<locals>._prevÚstrc                   s(   ˆˆ t d�ˆdˆ ƒd
‡ fdd„ƒƒ}d	S )ze
        Handle input of arguments.
        The first number needs to be preceded by escape.
        r3   r*   r+   r,   r   r-   c                   s   |   ˆ ¡ d S r!   )Úappend_to_arg_countr/   ©r@   r$   r%   rU   …   r\   z4load_emacs_bindings.<locals>.handle_digit.<locals>._N©r+   r,   r   r-   )r   )r@   rU   )Úhandlerc   r%   Úhandle_digit   s   
z)load_emacs_bindings.<locals>.handle_digitÚ
0123456789r&   c                 S  s   | j du r|  d¡ dS dS )Ú Nr&   )Ú_argrb   r/   r$   r$   r%   Ú
_meta_dash�   s   
ÿz'load_emacs_bindings.<locals>._meta_dashc                 S  s   d| j j_dS )zp
        When '-' is typed again, after exactly '-' has been given as an
        argument, ignore this.
        r&   N)Úappr'   r(   r/   r$   r$   r%   Ú_dash“   s   z"load_emacs_bindings.<locals>._dashÚenterzaccept-lineÚbuffr   Úcharr^   Úintc                 S  sN   |dk r| j j|d| d�}n	| j j|d|d�}|d ur%|  j|7  _d S d S )Nr   T)Úin_current_liner^   )ÚdocumentÚfind_backwardsÚfindÚcursor_position)rn   ro   r^   Úmatchr$   r$   r%   Úcharacter_search¥   s   ÿÿz-load_emacs_bindings.<locals>.character_searchzc-]c                   s   ˆ | j | j| jƒ dS )z:When Ctl-] + a character is pressed. go to that character.N©r"   Údatar(   r/   ©rw   r$   r%   Ú
_goto_char°   s   z'load_emacs_bindings.<locals>._goto_charc                   s   ˆ | j | j| j ƒ dS )zLike Ctl-], but backwards.Nrx   r/   rz   r$   r%   Ú_goto_char_backwards¶   s   z1load_emacs_bindings.<locals>._goto_char_backwardsÚac                 S  r.   )zPrevious sentence.Nr$   r/   r$   r$   r%   Ú_prev_sentence¼   rO   z+load_emacs_bindings.<locals>._prev_sentencec                 S  r.   )zMove to end of sentence.Nr$   r/   r$   r$   r%   Ú_end_of_sentenceÁ   rO   z-load_emacs_bindings.<locals>._end_of_sentenceÚtc                 S  r.   )z<
        Swap the last two words before the cursor.
        Nr$   r/   r$   r$   r%   Ú_swap_charactersÆ   rO   z-load_emacs_bindings.<locals>._swap_charactersÚ*c                 S  sH   | j }tddd�}t|j |j|¡ƒ}d dd„ |D ƒ¡}| |¡ dS )zR
        `meta-*`: Insert all possible completions of the preceding text.
        FT)Útext_insertedÚcompletion_requestedú c                 s  s   � | ]}|j V  qd S r!   )Útext)Ú.0r@   r$   r$   r%   Ú	<genexpr>Û   s   € zGload_emacs_bindings.<locals>._insert_all_completions.<locals>.<genexpr>N)r"   r   ÚlistÚ	completerÚget_completionsrr   ÚjoinÚinsert_text)r+   rn   Úcomplete_eventÚcompletionsÚtext_to_insertr$   r$   r%   Ú_insert_all_completionsÍ   s   ÿz4load_emacs_bindings.<locals>._insert_all_completionsc                 S  sB   | j }|jjr| j|jjdd�7  _dS | j|j ¡ 7  _dS )zc
        Move cursor back and forth between the start and end of the current
        line.
        F©Úafter_whitespaceN)r"   rr   Úis_cursor_at_the_end_of_lineru   Úget_start_of_line_positionÚget_end_of_line_position©r+   Úbufferr$   r$   r%   Ú_toggle_start_endÞ   s   ÿz.load_emacs_bindings.<locals>._toggle_start_endzc-@c                 S  s"   | j }|jr|jtjd� dS dS )zN
        Start of the selection (if the current buffer is not empty).
        ©Úselection_typeN)r"   r†   Ústart_selectionr   Ú
CHARACTERS©r+   rn   r$   r$   r%   Ú_start_selectioní   s   ÿz-load_emacs_bindings.<locals>._start_selectionúc-gc                 S  s   d| j _d| j _dS )zK
        Control + G: Cancel completion menu and validation state.
        N)r"   Úcomplete_stateÚvalidation_errorr/   r$   r$   r%   Ú_cancel÷   s   z$load_emacs_bindings.<locals>._cancelc                 S  rY   )ú#
        Cancel selection.
        N)r"   Úexit_selectionr/   r$   r$   r%   Ú_cancel_selectionÿ   ó   z.load_emacs_bindings.<locals>._cancel_selectionzc-wÚkc                 S  ó   | j  ¡ }| jj |¡ dS )z$
        Cut selected text.
        N)r"   Úcut_selectionrk   Ú	clipboardÚset_data©r+   ry   r$   r$   r%   Ú_cut  s   
z!load_emacs_bindings.<locals>._cutÚwc                 S  r©   )z%
        Copy selected text.
        N)r"   Úcopy_selectionrk   r«   r¬   r­   r$   r$   r%   Ú_copy  ó   
z"load_emacs_bindings.<locals>._copyÚleftc                 S  s(   | j }| j|jj| jd�pd7  _dS )z3
        Cursor to start of previous word.
        r]   r   N)r"   ru   rr   Úfind_previous_word_beginningr(   r—   r$   r$   r%   Ú_start_of_word  s   
ÿz+load_emacs_bindings.<locals>._start_of_wordÚrightc                 S  s.   | j }| j|jj| jd�p|j ¡ 7  _dS )z/
        Cursor to start of next word.
        r]   N)r"   ru   rr   Úfind_next_word_beginningr(   Úget_end_of_document_positionr—   r$   r$   r%   Ú_start_next_word!  s
   
þz-load_emacs_bindings.<locals>._start_next_wordú/c                 S  s(   | j }|jr| ¡  dS |jdd� dS )z 
        M-/: Complete.
        T)Úselect_firstN)r"   r¡   Úcomplete_nextÚstart_completion)r+   r?   r$   r$   r%   Ú	_complete,  s   z&load_emacs_bindings.<locals>._completeúc-cc                 S  sf   | j }| j|jjdd�7  _|j ¡ \}}|j |¡\}}|j |¡\}}t|||d | jd� dS )z'
        Indent selected text.
        Tr’   r   r]   N)r"   ru   rr   r•   Úselection_rangeÚtranslate_index_to_positionr   r(   ©r+   r˜   Úfrom_ÚtorU   r$   r$   r%   Ú_indent7  s   
ÿz$load_emacs_bindings.<locals>._indentc                 S  sN   | j }|j ¡ \}}|j |¡\}}|j |¡\}}t|||d | jd� dS )z)
        Unindent selected text.
        r   r]   N)r"   rr   rÀ   rÁ   r   r(   rÂ   r$   r$   r%   Ú	_unindentH  s
   z&load_emacs_bindings.<locals>._unindentNrd   )r@   ra   r   r-   )rn   r   ro   ra   r^   rp   r   r-   )r   Úaddr	   r   r   r   r)   r#   r   r   ÚAnyr   r
   )Úkey_bindingsÚinsert_moder0   r[   r`   rf   r@   rj   rl   r{   r|   r~   r   r�   r‘   r™   rŸ   r£   r¦   r®   r±   rµ   r¹   r¾   rÅ   rÆ   r$   )rw   re   r%   r   .   sÀ   ÿÿ
ÿÿ

	

	


r   c                  C  s:  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d�|j	ƒ |dt
t @ d�|jƒ |dt
t @ d�|jƒ |dt
t@ d�|jƒ |dt
t@ d�|jƒ |dt
d�ddd„ƒ}|dt
d�ddd„ƒ}t| tƒS )Nr   )Úsearchzc-rzc-sr¿   r    ÚupÚdownrm   r*   T)Úeagerú?r3   rº   Únr+   r,   r   r-   c                 S  s   | j j| jjd| jd� dS )zJump to next match.F©Úinclude_current_positionr^   N©r"   Úapply_searchrk   Úcurrent_search_stater(   r/   r$   r$   r%   Ú
_jump_next…  s
   
ýz.load_emacs_search_bindings.<locals>._jump_nextÚNc                 S  s   | j j| jj d| jd� dS )zJump to previous match.FrÑ   NrÓ   r/   r$   r$   r%   Ú
_jump_prevŽ  s
   
ýz.load_emacs_search_bindings.<locals>._jump_prevrd   )r   rÇ   rh   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Ø   r$   r$   r%   r   X  s<   ÿÿÿÿ


r   c            	        s   t ƒ } | j}d.dd„‰ |dt d�|d	t d�|d
t d�|dt d�|dt d�|dt d�|dt d�|dt d�|dt d�|dt d�d.‡ fdd„ƒƒƒƒƒƒƒƒƒƒ}|dtd�|d	td�|d
td�|dtd�|dtd�|dtd�|dtd�|dtd�|dtd�|dtd�d.‡ fdd„ƒƒƒƒƒƒƒƒƒƒ}|tjtd�d.dd„ƒ}|dtt@ d�d.dd„ƒ}|dtd�d.dd„ƒ}|dtd�d.dd „ƒ}|d!td�|d"td�|d#td�|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| tƒS )/z?
    Bindings to select text with shift + cursor movements
    r+   r,   r   r-   c                 S  s¾   | j d j}|tjkr| jj| jd� dS |tjkr$| jj| jd� dS 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}zt|| ƒ}W n
 tyP   Y dS w t|tƒr]| | ¡ dS dS )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   r]   Nr2   r6   r1   r5   r8   r:   rH   rJ   )Úkey_sequenceÚkeyr   ÚShiftUpr"   r_   r(   Ú	ShiftDownrZ   Ú	ShiftLeftÚ
ShiftRightÚ	ShiftHomeÚShiftEndÚControlShiftLeftÚControlShiftRightÚControlShiftHomeÚControlShiftEndr   ÚKeyErrorÚ
isinstancer   Úcall)r+   rà   Úkey_to_commandÚbindingr$   r$   r%   Úunshift_move¢  s0   

øÿ
þz9load_emacs_shift_selection_bindings.<locals>.unshift_movezs-leftr3   zs-rightzs-upzs-downzs-homezs-endzc-s-leftz	c-s-rightzc-s-homezc-s-endc                   sZ   | j }|jr)|jtjd� |jdur|j ¡  |j}ˆ | ƒ |j|kr+| ¡  dS dS dS )z8
        Start selection with shift + movement.
        rš   N)	r"   r†   rœ   r   r�   Úselection_stateÚenter_shift_moderu   r¥   )r+   rn   Úoriginal_position©rð   r$   r%   rŸ   Ç  s   


òz=load_emacs_shift_selection_bindings.<locals>._start_selectionc                   s:   ˆ | ƒ | j }|jdur|j|jjkr| ¡  dS dS dS )z&
        Extend the selection
        N)r"   rñ   ru   Úoriginal_cursor_positionr¥   rž   rô   r$   r%   Ú_extend_selectionç  s   
ýz>load_emacs_shift_selection_bindings.<locals>._extend_selectionc                 S  s   | j  ¡  tdƒ | ¡ dS )z4
        Replace selection by what is typed
        zself-insertN)r"   rª   r   rí   r/   r$   r$   r%   Ú_replace_selectionþ  r²   z?load_emacs_shift_selection_bindings.<locals>._replace_selectionrm   c                 S  s    | j  ¡  | j jtƒ  d� dS )z2
        A newline replaces the selection
        )Úcopy_marginN)r"   rª   Únewliner   r/   r$   r$   r%   Ú_newline  s   
z5load_emacs_shift_selection_bindings.<locals>._newlinerE   c                 S  rY   )z#
        Delete selection.
        N)r"   rª   r/   r$   r$   r%   Ú_delete  r§   z4load_emacs_shift_selection_bindings.<locals>._deleter>   c                 S  s&   | j }|jr
| ¡  tdƒ | ¡ dS )zS
        In shift selection mode, yanking (pasting) replace the selection.
        r=   N)r"   rñ   rª   r   rí   rž   r$   r$   r%   Ú_yank  s   z2load_emacs_shift_selection_bindings.<locals>._yankr³   r¶   rÌ   rÍ   ÚhomeÚendr7   r9   rG   rI   c                 S  s(   | j  ¡  | jd }| jj|dd� dS )r¤   r   T)ÚfirstN)r"   r¥   rß   r'   Úfeed)r+   Ú	key_pressr$   r$   r%   r£      s   

z4load_emacs_shift_selection_bindings.<locals>._cancelNrd   )	r   rÇ   r   r   r   rÈ   r   r   r
   )	rÉ   re   rŸ   rö   r÷   rú   rû   rü   r£   r$   rô   r%   r   š  sZ   
%"









"













	r   N)r   r    )r   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__r,   r#   r)   r   r   r   r$   r$   r$   r%   Ú<module>   s,   0
  
,B