|
from __future__ import annotations |
|
|
|
from enum import Enum |
|
from typing import TYPE_CHECKING, Callable |
|
|
|
from prompt_toolkit.clipboard import ClipboardData |
|
|
|
if TYPE_CHECKING: |
|
from .key_bindings.vi import TextObject |
|
from .key_processor import KeyPressEvent |
|
|
|
__all__ = [ |
|
"InputMode", |
|
"CharacterFind", |
|
"ViState", |
|
] |
|
|
|
|
|
class InputMode(str, Enum): |
|
value: str |
|
|
|
INSERT = "vi-insert" |
|
INSERT_MULTIPLE = "vi-insert-multiple" |
|
NAVIGATION = "vi-navigation" |
|
REPLACE = "vi-replace" |
|
REPLACE_SINGLE = "vi-replace-single" |
|
|
|
|
|
class CharacterFind: |
|
def __init__(self, character: str, backwards: bool = False) -> None: |
|
self.character = character |
|
self.backwards = backwards |
|
|
|
|
|
class ViState: |
|
""" |
|
Mutable class to hold the state of the Vi navigation. |
|
""" |
|
|
|
def __init__(self) -> None: |
|
|
|
|
|
self.last_character_find: CharacterFind | None = None |
|
|
|
|
|
|
|
|
|
self.operator_func: None | (Callable[[KeyPressEvent, TextObject], None]) = None |
|
self.operator_arg: int | None = None |
|
|
|
|
|
|
|
self.named_registers: dict[str, ClipboardData] = {} |
|
|
|
|
|
self.__input_mode = InputMode.INSERT |
|
|
|
|
|
self.waiting_for_digraph = False |
|
self.digraph_symbol1: str | None = None |
|
|
|
|
|
self.tilde_operator = False |
|
|
|
|
|
|
|
|
|
|
|
|
|
self.recording_register: str | None = None |
|
self.current_recording: str = "" |
|
|
|
|
|
|
|
|
|
|
|
self.temporary_navigation_mode = False |
|
|
|
@property |
|
def input_mode(self) -> InputMode: |
|
"Get `InputMode`." |
|
return self.__input_mode |
|
|
|
@input_mode.setter |
|
def input_mode(self, value: InputMode) -> None: |
|
"Set `InputMode`." |
|
if value == InputMode.NAVIGATION: |
|
self.waiting_for_digraph = False |
|
self.operator_func = None |
|
self.operator_arg = None |
|
|
|
self.__input_mode = value |
|
|
|
def reset(self) -> None: |
|
""" |
|
Reset state, go back to the given mode. INSERT by default. |
|
""" |
|
|
|
self.input_mode = InputMode.INSERT |
|
|
|
self.waiting_for_digraph = False |
|
self.operator_func = None |
|
self.operator_arg = None |
|
|
|
|
|
self.recording_register = None |
|
self.current_recording = "" |
|
|