Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.11/site-packages/prompt_toolkit/key_binding/bindings/auto_suggest.py: 31%

Shortcuts on this page

r m x   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

32 statements  

1""" 

2Key bindings for auto suggestion (for fish-style auto suggestion). 

3""" 

4 

5from __future__ import annotations 

6 

7import re 

8 

9from prompt_toolkit.application.current import get_app 

10from prompt_toolkit.filters import Condition, emacs_mode 

11from prompt_toolkit.key_binding.key_bindings import KeyBindings 

12from prompt_toolkit.key_binding.key_processor import KeyPressEvent 

13 

14__all__ = [ 

15 "load_auto_suggest_bindings", 

16] 

17 

18E = KeyPressEvent 

19 

20 

21def load_auto_suggest_bindings() -> KeyBindings: 

22 """ 

23 Key bindings for accepting auto suggestion text. 

24 

25 (This has to come after the Vi bindings, because they also have an 

26 implementation for the "right arrow", but we really want the suggestion 

27 binding when a suggestion is available.) 

28 """ 

29 key_bindings = KeyBindings() 

30 handle = key_bindings.add 

31 

32 @Condition 

33 def suggestion_available() -> bool: 

34 app = get_app() 

35 return ( 

36 app.current_buffer.suggestion is not None 

37 and len(app.current_buffer.suggestion.text) > 0 

38 and app.current_buffer.document.is_cursor_at_the_end 

39 ) 

40 

41 @handle("c-f", filter=suggestion_available) 

42 @handle("c-e", filter=suggestion_available) 

43 @handle("right", filter=suggestion_available) 

44 def _accept(event: E) -> None: 

45 """ 

46 Accept suggestion. 

47 """ 

48 b = event.current_buffer 

49 suggestion = b.suggestion 

50 

51 if suggestion: 

52 b.insert_text(suggestion.text) 

53 

54 @handle("escape", "f", filter=suggestion_available & emacs_mode) 

55 def _fill(event: E) -> None: 

56 """ 

57 Fill partial suggestion. 

58 """ 

59 b = event.current_buffer 

60 suggestion = b.suggestion 

61 

62 if suggestion: 

63 t = re.split(r"([^\s/]+(?:\s+|/))", suggestion.text) 

64 b.insert_text(next(x for x in t if x)) 

65 

66 return key_bindings