feat: use PyperClipboard if available for ptk

closes #3989
This commit is contained in:
Noortheen Raja 2020-11-20 19:59:14 +05:30
parent 24862e03c9
commit 5b6ea6c993
3 changed files with 40 additions and 2 deletions

View file

@ -0,0 +1,27 @@
**Added:**
* support PTK's clipboard integration if pyperclip is installed.
So that some common emacs like
[cut/copy](https://github.com/prompt-toolkit/python-prompt-toolkit/blob/master/examples/prompts/system-clipboard-integration.py)
will work out of the box.
**Changed:**
* <news item>
**Deprecated:**
* <news item>
**Removed:**
* <news item>
**Fixed:**
* <news item>
**Security:**
* <news item>

View file

@ -342,7 +342,7 @@ def main():
} }
skw["cmdclass"]["develop"] = xdevelop skw["cmdclass"]["develop"] = xdevelop
skw["extras_require"] = { skw["extras_require"] = {
"ptk": ["prompt-toolkit>=3.0"], "ptk": ["prompt-toolkit>=3.0", "pyperclip"],
"pygments": ["pygments>=2.2"], "pygments": ["pygments>=2.2"],
"mac": ["gnureadline"], "mac": ["gnureadline"],
"linux": ["distro"], "linux": ["distro"],

View file

@ -35,6 +35,12 @@ from prompt_toolkit.formatted_text import PygmentsTokens, to_formatted_text
from prompt_toolkit.styles import merge_styles, Style from prompt_toolkit.styles import merge_styles, Style
from prompt_toolkit.styles.pygments import pygments_token_to_classname from prompt_toolkit.styles.pygments import pygments_token_to_classname
try:
from prompt_toolkit.clipboard.pyperclip import PyperclipClipboard
SYS_CLIPBOARD = True
except ImportError:
SYS_CLIPBOARD = False
ANSI_OSC_PATTERN = re.compile("\x1b].*?\007") ANSI_OSC_PATTERN = re.compile("\x1b].*?\007")
CAPITAL_PATTERN = re.compile(r"([a-z])([A-Z])") CAPITAL_PATTERN = re.compile(r"([a-z])([A-Z])")
@ -146,7 +152,12 @@ class PromptToolkitShell(BaseShell):
winutils.enable_virtual_terminal_processing() winutils.enable_virtual_terminal_processing()
self._first_prompt = True self._first_prompt = True
self.history = ThreadedHistory(PromptToolkitHistory()) self.history = ThreadedHistory(PromptToolkitHistory())
self.prompter = PromptSession(history=self.history)
ptk_args = {"history": self.history}
if SYS_CLIPBOARD:
ptk_args["clipboard"] = PyperclipClipboard()
self.prompter = PromptSession(**ptk_args)
self.prompt_formatter = PTKPromptFormatter(self.prompter) self.prompt_formatter = PTKPromptFormatter(self.prompter)
self.pt_completer = PromptToolkitCompleter(self.completer, self.ctx, self) self.pt_completer = PromptToolkitCompleter(self.completer, self.ctx, self)
self.key_bindings = load_xonsh_bindings() self.key_bindings = load_xonsh_bindings()