
    p<                         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 d dlmZmZmZmZmZmZ d dlmZ ddlmZmZ dd	lmZ d
dlmZmZ dZd Zd Zd Z ddZ!d Z"y)    )unicode_literals)SelectionTypeindentunindent)Keys)IncrementalSearchDirectionSEARCH_BUFFERSYSTEM_BUFFER)	Condition	EmacsModeHasSelectionEmacsInsertModeHasFocusHasArg)CompleteEvent   )scroll_page_upscroll_page_down)get_by_name   )RegistryConditionalRegistry)load_emacs_bindingsload_emacs_search_bindingsload_emacs_system_bindings)load_extra_emacs_page_navigation_bindingsc                     t        t               t                     } | j                  t	               }t               } t        j                        d        }  t        j                        t        d               t        j                        t        d               t        j                  |      t        d               t        j                        t        d               t        j                        t        d               t        j                        t        d               t        j                        t        d	               t        j                   d
d|      t        d               t        j"                  |      t        d               t        j                  d      t        d               t        j                  d|      t        d               t        j                  d|      t        d               t        j                  d      t        d	               t        j                  d|      t        d               t        j                  d|      t        d               t        j                  d|      t        d               t        j                  t        j$                  |      t        d               t        j                  t        j&                  |      t        d               t        j                  d|      t        d               t        j(                  d |      t        d               t        j                   t        j*                  d |      t        d               t        j                  d|       t        d               t        j                  d |       t        d!               t        j                  d"|      t        d#               t        j                  d$|      t        d#               t        j                  t        j"                  |      t        d%               t        j                  d&|      t        d'               t        j,                        t        d(               t        j.                  |       t        d)               t        j                   d*      t        d+               t        j                   d,      t        d-               t        j                   d.      t        d/              t        j0                        d0        } t        j2                        d1        }fd2}d3D ]
  } ||         t        j                  d4t5                      d5        } d4t7        d6             d7        }t7        d8       }  t        j                  t        j8                  ||z        t        d9             d:  t        j:                  t        j<                        fd;       } t        j                  t        j:                  t        j<                        fd<       } t        j                  d=      d>        } t        j                  d.      d?        } t        j                  d@|      dA        } t        j                  dB|      dC        } t        j                   t        j                         dD        } t        j>                        dE        } t        j@                  |       dF        } t        j@                  |      dG        } t        jB                  |       t        j                   d
dH|      dI               } t        j                  dJ|      dK        } t        j                  t        jD                        dL        } t        j                  t        jF                        dM        } t        j                  dN|      dO        } t        jH                  d |      dP        } t        jH                  d|      dQ        }| S )Rz!
    Some e-macs extensions.
    c                      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    <lib/third_party/prompt_toolkit/key_binding/bindings/emacs.py_zload_emacs_bindings.<locals>._!   s     	    zbeginning-of-linezbackward-charfilterz	kill-wordzend-of-linezforward-charzbackward-wordzforward-wordryyankbczcapitalize-worddflzdowncase-worduzuppercase-wordzyank-popzbackward-kill-word\zdelete-horizontal-spacec                      yNFr   es    r"   <lambda>z%load_emacs_bindings.<locals>.<lambda>A   s    %r$   )save_beforer&   undoc                      yr2   r   r3   s    r"   r5   z%load_emacs_bindings.<locals>.<lambda>D   s    r$   <zbeginning-of-history>zend-of-history.zyank-last-argr#   zyank-nth-arg#zinsert-commentzoperate-and-get-nextzquoted-insert(zstart-kbd-macro)zend-kbd-macror4   zcall-last-kbd-macroc                 8    | j                   j                          y)z Next line. N)current_buffer	auto_downr    s    r"   r#   zload_emacs_bindings.<locals>._Z   s     	&&(r$   c                 P    | j                   j                  | j                         y)z Previous line. countN)r@   auto_upargr    s    r"   r#   zload_emacs_bindings.<locals>.__   s     	$$599$5r$   c                 p       t                      t        j                          fd              }y)zf
        Handle input of arguments.
        The first number needs to be preceeded by escape.
        r%   c                 (    | j                         y N)append_to_arg_count)r!   r+   s    r"   r#   z4load_emacs_bindings.<locals>.handle_digit.<locals>._i   s     %%a(r$   N)r   r   Escape)r+   r#   handles   ` r"   handle_digitz)load_emacs_bindings.<locals>.handle_digitd   s3    
 
&(	#	Q		) 
  
$	)r$   
0123456789-c                 @    | j                   | j                  d       yy)z	
        NrO   )_argrJ   r    s    r"   r#   zload_emacs_bindings.<locals>._q   s!     ::%%c* r$   c                 4    | j                   j                  dk(  S )NrO   )input_processorrF   clis    r"   r5   z%load_emacs_bindings.<locals>.<lambda>x   s    c.A.A.E.E.Lr$   c                 :    d| j                   j                  _        y)zp
        When '-' is typed again, after exactly '-' has been given as an
        argument, ignore this.
        rO   N)rU   rS   rF   r    s    r"   r#   zload_emacs_bindings.<locals>._x   s     ),		!!%r$   c                 B    | j                   j                  j                  S rI   )r@   accept_actionis_returnablerT   s    r"   r5   z%load_emacs_bindings.<locals>.<lambda>   s    C&&44BBr$   zaccept-linec                     |dk  r | j                   j                  |d|       }n| j                   j                  |d|      }|| xj                  |z  c_        y y )Nr   T)in_current_linerD   )documentfind_backwardsfindcursor_position)buffcharrD   matchs       r"   character_searchz-load_emacs_bindings.<locals>.character_search   s_    19MM00tTYSY0ZEMM&&tT&OE  E)  r$   c                 V     | j                   | j                  | j                         y)z< When Ctl-] + a character is pressed. go to that character. Nr@   datarF   r!   rc   s    r"   r#   zload_emacs_bindings.<locals>._   s     	--uzz599Er$   c                 X     | j                   | j                  | j                          y)z Like Ctl-], but backwards. Nre   rg   s    r"   r#   zload_emacs_bindings.<locals>._   s!     	--uzzEII:Fr$   ac                      y)z Previous sentence. Nr   r    s    r"   r#   zload_emacs_bindings.<locals>._       r$   c                      y)z Move to end of sentence. Nr   r    s    r"   r#   zload_emacs_bindings.<locals>._   rk   r$   tc                      y)z<
        Swap the last two words before the cursor.
        Nr   r    s    r"   r#   zload_emacs_bindings.<locals>._   rk   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rI   )text).0r+   s     r"   	<genexpr>z1load_emacs_bindings.<locals>._.<locals>.<genexpr>   s     !>+Q!&&+s   N)r@   r   list	completerget_completionsr\   joininsert_text)r!   r`   complete_eventcompletionstext_to_inserts        r"   r#   zload_emacs_bindings.<locals>._   sa    
 ## 'UQUV4>>99$--XY !>+!>>(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)r@   r\   is_cursor_at_the_end_of_liner_   get_start_of_line_positionget_end_of_line_positionr!   buffers     r"   r#   zload_emacs_bindings.<locals>._   s^     %%??77""foo&P&Pbg&P&hh"""foo&N&N&PP"r$   c                 v    | j                   }|j                  r!|j                  t        j                         yy)zN
        Start of the selection (if the current buffer is not empty).
        )selection_typeN)r@   ru   start_selectionr   
CHARACTERS)r!   r`   s     r"   r#   zload_emacs_bindings.<locals>._   s2     ##99  0H0H I r$   c                 H    d| j                   _        d| j                   _        y)zK
        Control + G: Cancel completion menu and validation state.
        N)r@   complete_statevalidation_errorr    s    r"   r#   zload_emacs_bindings.<locals>._   s     
 /3+04-r$   c                 8    | j                   j                          y)z#
        Cancel selection.
        N)r@   exit_selectionr    s    r"   r#   zload_emacs_bindings.<locals>._   s    
 	++-r$   kc                     | j                   j                         }| j                  j                  j	                  |       y)z$
        Cut selected text.
        N)r@   cut_selectionrU   	clipboardset_datar!   rf   s     r"   r#   zload_emacs_bindings.<locals>._   s0     ##113		$$T*r$   wc                     | j                   j                         }| j                  j                  j	                  |       y)z%
        Copy selected text.
        N)r@   copy_selectionrU   r   r   r   s     r"   r#   zload_emacs_bindings.<locals>._   s0    
 ##224		$$T*r$   c                     | j                   }|xj                  |j                  j                  | j                        xs dz  c_        y)z3
        Cursor to start of previous word.
        rC   r   N)r@   r_   r\   find_previous_word_beginningrF   r   s     r"   r#   zload_emacs_bindings.<locals>._   s?    
 %%&//"N"NUZU^U^"N"_"dcddr$   c                     | j                   }|xj                  |j                  j                  | j                        xs |j                  j                         z  c_        y)z/
        Cursor to start of next word.
        rC   N)r@   r_   r\   find_next_word_beginningrF   get_end_of_document_positionr   s     r"   r#   zload_emacs_bindings.<locals>._   sP    
 %%&//"J"JQVQZQZ"J"[ #;OO88:	;r$   /c                     | j                   }|j                  r|j                          y| j                  j	                  d       y)z 
        M-/: Complete.
        T)select_firstN)r@   r   complete_nextrU   start_completion)r!   r*   s     r"   r#   zload_emacs_bindings.<locals>._  s7    
   OOII&&D&9r$   c                 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   rC   N)r@   r_   r\   r   selection_rangetranslate_index_to_positionr   rF   r!   r   from_tor#   s        r"   r#   zload_emacs_bindings.<locals>._  s    
 %%&//"L"L^b"L"cc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   rC   N)r@   r\   r   r   r   rF   r   s        r"   r#   zload_emacs_bindings.<locals>._  sk    
 %%OO335	r??>>uEq;;B?AQeii8r$   )%r   r   r   add_bindingr   r   r   rK   ControlAr   ControlBControlDeleteControlEControlFControlLeftControlRightControlXControlYControlH	BackspaceControlUnderscoreControlUControlOControlQControlNControlPr   r   ControlJControlSquareCloseAnyControlSpaceControlGControlWLeftRightControlC)	registryinsert_modehas_selectionr#   rM   r+   rY   rc   rL   s	          @@r"   r   r      s    #8:y{;H!!F!#K NMDKK	 	 F4==+&9:;F4==+o672F4k2;{3KLF4==+m45F4==+n56F4[9:F4k.9:7F4==#s;7F8KL-F4==-k&.ABF4;;[9:0F4;;K0=N1OP0F4;;K0[1IJF4;;[890F4;;K0_1MN0F4;;K0=M1NO0F4;;K0Z1HI:F4;;k:;G[;\];F4;;{;KH\<]^1F4;;[1+>W2XYUF4!!UF \F4==$--o{[F 5F4;;m^4[AW5XY4F4;;m^4[AQ5RS0F4;;K0_1MN0F4;;K0_1MN:F4;;k:;~;VW0F4;;K0=M1NOF4==+&<=>
 2F4===.1+o2NOF4==#{+<=>F4==#{?;<F4==#{+@ABDMM) ) DMM6 6) Q  DKKfhY/+ 0+ C	"LMN, O, BDM KF4;;kM.IJM"$* D##TXX.F /F
 DKK00$((;G <G
 DKK  DKK% % DKK[1 2 DKK[1) 2) DMM4==)
Q *
Q DJ J DMMM>25 35 DMM-0. 1. DMM-0DMM3M:+ ; 1+ DKK]3+ 4+ DKK#e $e DKK$; %; DKK[1: 2: DMM3}57 67 DMM3}5
9 6
9 Or$   c                      t               }  | j                  t        j                  t        j                  t               t                z        t        d             | S )zF
    Pressing C-X C-E will open the buffer in an external editor.
    r%   zedit-and-execute-command)r   r   r   r   r   r   r   r   )r   s    r"   "load_emacs_open_in_editor_bindingsr   .  sQ     zH?H )|~o =  ?	/	02 Or$   c                     t        t               t                     } | j                  }t	        t
              } |t        j                  d|       d        } |t        j                  |       |t        j                  |       |t        j                  |      d                      } |t        j                  |      d        }| S )N!r%   c                 B    | j                   j                  t               y)z0
        M-'!' opens the system prompt.
        N)rU   
push_focusr
   r    s    r"   r#   z%load_emacs_system_bindings.<locals>._A  s    
 			]+r$   c                     | j                   j                  t           j                          | j                   j	                          y)z'
        Cancel system prompt.
        N)rU   buffersr
   reset	pop_focusr    s    r"   r#   z%load_emacs_system_bindings.<locals>._H  s/     			-(..0		r$   c                     | j                   j                  t           }| j                   j                  |j                         |j                  d       | j                   j                          y)z%
        Run system command.
        T)append_to_historyN)rU   r   r
   run_system_commandru   r   r   )r!   system_lines     r"   r#   z%load_emacs_system_bindings.<locals>._R  sS    
 ii''6		$$[%5%56D1 			r$   )r   r   r   r   r   r
   r   rK   r   r   r   )r   rL   	has_focusr#   s       r"   r   r   ;  s    "8:y{;H!!F'IDKKyj1, 2, DKK	*DMM),DMM), - - + DMM),	 -	 Or$   Nc                     t        t               t                     }|j                  }t	        t
              } t               sJ  sd   |t        j                  |       |t        j                  |      d               } |t        j                  |       fd       } |t        j                  |        fd       } |t        j                  |        fd       }d
 fd	 |t        j                  |       |t        j                  |      fd              } |t        j                  |       |t        j                  |      fd	              }|S )Nc                     | j                   S rI   )search_staterT   s    r"   get_search_statez4load_emacs_search_bindings.<locals>.get_search_statej  s    #*:*:#:r$   r%   c                     | j                   j                  t           }|j                          | j                   j	                          y)zL
        Abort an incremental search and restore the original line.
        N)rU   r   r	   r   r   )r!   search_buffers     r"   r#   z%load_emacs_search_bindings.<locals>._l  s4     		))-8		r$   c                    | j                   j                  j                  | j                         }| j                   j                  t           }|j                  r!|j                   | j                         _        |j                   | j                         d       |j                          |j                          | j                   j                          y)zy
        When enter pressed in isearch, quit isearch mode. (Multiline
        isearch would be too complicated.)
        T)include_current_positionN)	rU   r   previousr	   ru   apply_searchr   r   r   )r!   input_bufferr   r   s      r"   r#   z%load_emacs_search_bindings.<locals>._y  s     yy((11%))<		))-8 /</A/AUYY', 	!!"2599"=X\!] 	'') 			r$   c                     t         j                   | j                        _        | j                  j	                  t
               y rI   )r   BACKWARDrU   	directionr   r	   r!   r   s    r"   r#   z%load_emacs_search_bindings.<locals>._  s-    0J0S0S#-		]+r$   c                     t         j                   | j                        _        | j                  j	                  t
               y rI   )r   FORWARDrU   r   r   r	   r   s    r"   r#   z%load_emacs_search_bindings.<locals>._  s-    0J0R0R#-		]+r$   c                      |       }|j                   |k7  }| j                  t           j                  |_        ||_         |s0| j                  j	                  |       }|j                  |d|       yy)z0 Apply search, but keep search buffer focussed. F)r   rD   N)r   r   r	   ru   r   r   )rU   r   rD   r   direction_changedr   r   s         r"   incremental_searchz6load_emacs_search_bindings.<locals>.incremental_search  sx     (,(22i?KK6;;!* !;;//4L%%l?DE & S !r$   c                 `     | j                   t        j                  | j                         y NrC   )rU   r   r   rF   r!   r   s    r"   r#   z%load_emacs_search_bindings.<locals>._  s#     	599&@&I&IQVQZQZ[r$   c                 `     | j                   t        j                  | j                         y r   )rU   r   r   rF   r   s    r"   r#   z%load_emacs_search_bindings.<locals>._  s#     	599&@&H&HPUPYPYZr$   )r   )r   r   r   r   r   r	   callabler   r   r   r   ControlRControlSUpDown)r   r   rL   r   r#   r   s   `    @r"   r   r   a  sH   "8:y{;H!!F'I#x0@'AAA:DMM),DMM), - - DMM), -, DMMI:., /, DMMI:., /,S DMM),DGGI&\ ' -\ DMM),DIIi([ ) -[ Or$   c                  X   t        t               t                     } | j                  }  |t        j
                        t                 |t        j                        t                 |t        j                  d      t                 |t        j                        t               | S )z
    Key bindings, for scrolling up and down through pages.
    This are separate bindings, because GNU readline doesn't have them.
    v)r   r   r   r   r   ControlVr   PageDownrK   r   PageUp)r   rL   s     r"   r   r     st    
 #8:y{;H!!FF4==*+F4==*+F4;;^,F4;;'Or$   rI   )#
__future__r   prompt_toolkit.bufferr   r   r   prompt_toolkit.keysr   prompt_toolkit.enumsr   r	   r
   prompt_toolkit.filtersr   r   r   r   r   r   prompt_toolkit.completionr   scrollr   r   named_commandsr   r   r   r   __all__r   r   r   r   r   r   r$   r"   <module>r     sN    ' A A $ Y Y h h 3 4 ' 4Vr
#LRjr$   