1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
"""
:class:`KeyBindingManager` is a utility (or shortcut) for loading all the key
bindings in a key binding registry, with a logic set of filters to quickly to
quickly change from Vi to Emacs key bindings at runtime.
You don't have to use this, but it's practical.
Usage::
manager = KeyBindingManager()
cli = CommandLineInterface(key_bindings_registry=manager.registry)
"""
from __future__ import unicode_literals
from prompt_toolkit.key_binding.registry import Registry
from prompt_toolkit.key_binding.bindings.basic import load_basic_bindings, load_abort_and_exit_bindings, load_basic_system_bindings, load_auto_suggestion_bindings, load_mouse_bindings
from prompt_toolkit.key_binding.bindings.emacs import load_emacs_bindings, load_emacs_system_bindings, load_emacs_search_bindings, load_emacs_open_in_editor_bindings, load_extra_emacs_page_navigation_bindings
from prompt_toolkit.key_binding.bindings.vi import load_vi_bindings, load_vi_system_bindings, load_vi_search_bindings, load_vi_open_in_editor_bindings, load_extra_vi_page_navigation_bindings
from prompt_toolkit.filters import to_cli_filter
__all__ = (
'KeyBindingManager',
)
class KeyBindingManager(object):
"""
Utility for loading all key bindings into memory.
:param registry: Optional `Registry` instance.
:param enable_abort_and_exit_bindings: Filter to enable Ctrl-C and Ctrl-D.
:param enable_system_bindings: Filter to enable the system bindings
(meta-! prompt and Control-Z suspension.)
:param enable_search: Filter to enable the search bindings.
:param enable_open_in_editor: Filter to enable open-in-editor.
:param enable_open_in_editor: Filter to enable open-in-editor.
:param enable_extra_page_navigation: Filter for enabling extra page navigation.
(Bindings for up/down scrolling through long pages, like in Emacs or Vi.)
:param enable_auto_suggest_bindings: Filter to enable fish-style suggestions.
:param enable_all: Filter to enable (or disable) all bindings.
:param enable_vi_mode: Deprecated!
"""
def __init__(self, registry=None,
enable_vi_mode=None, # (`enable_vi_mode` is deprecated.)
get_search_state=None,
enable_abort_and_exit_bindings=False,
enable_system_bindings=False, enable_search=False,
enable_open_in_editor=False, enable_extra_page_navigation=False,
enable_auto_suggest_bindings=False,
enable_all=True):
assert registry is None or isinstance(registry, Registry)
assert get_search_state is None or callable(get_search_state)
# Create registry.
self.registry = registry or Registry()
# Accept both Filters and booleans as input.
enable_abort_and_exit_bindings = to_cli_filter(enable_abort_and_exit_bindings)
enable_system_bindings = to_cli_filter(enable_system_bindings)
enable_search = to_cli_filter(enable_search)
enable_open_in_editor = to_cli_filter(enable_open_in_editor)
enable_extra_page_navigation = to_cli_filter(enable_extra_page_navigation)
enable_auto_suggest_bindings = to_cli_filter(enable_auto_suggest_bindings)
enable_all = to_cli_filter(enable_all)
# Load basic bindings.
load_basic_bindings(self.registry, enable_all)
load_mouse_bindings(self.registry, enable_all)
load_abort_and_exit_bindings(
self.registry, enable_abort_and_exit_bindings & enable_all)
load_basic_system_bindings(self.registry,
enable_system_bindings & enable_all)
# Load emacs bindings.
load_emacs_bindings(self.registry, enable_all)
load_emacs_open_in_editor_bindings(
self.registry, enable_open_in_editor & enable_all)
load_emacs_search_bindings(
self.registry,
filter=enable_search & enable_all,
get_search_state=get_search_state)
load_emacs_system_bindings(
self.registry, enable_system_bindings & enable_all)
load_extra_emacs_page_navigation_bindings(
self.registry,
enable_extra_page_navigation & enable_all)
# Load Vi bindings.
load_vi_bindings(
self.registry, enable_visual_key=~enable_open_in_editor,
filter=enable_all,
get_search_state=get_search_state)
load_vi_open_in_editor_bindings(
self.registry,
enable_open_in_editor & enable_all)
load_vi_search_bindings(
self.registry,
filter=enable_search & enable_all,
get_search_state=get_search_state)
load_vi_system_bindings(
self.registry,
enable_system_bindings & enable_all)
load_extra_vi_page_navigation_bindings(
self.registry,
enable_extra_page_navigation & enable_all)
# Suggestion bindings.
# (This has to come at the end, because the Vi bindings also have an
# implementation for the "right arrow", but we really want the
# suggestion binding when a suggestion is available.)
load_auto_suggestion_bindings(
self.registry,
enable_auto_suggest_bindings & enable_all)
@classmethod
def for_prompt(cls, **kw):
"""
Create a ``KeyBindingManager`` with the defaults for an input prompt.
This activates the key bindings for abort/exit (Ctrl-C/Ctrl-D),
incremental search and auto suggestions.
(Not for full screen applications.)
"""
kw.setdefault('enable_abort_and_exit_bindings', True)
kw.setdefault('enable_search', True)
kw.setdefault('enable_auto_suggest_bindings', True)
return cls(**kw)
def reset(self, cli):
# For backwards compatibility.
pass
def get_vi_state(self, cli):
# Deprecated!
return cli.vi_state
|