aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/ipython/py3/IPython/terminal
diff options
context:
space:
mode:
authorAlexSm <alex@ydb.tech>2024-01-09 18:56:40 +0100
committerGitHub <noreply@github.com>2024-01-09 18:56:40 +0100
commite95f266d2a3e48e62015220588a4fd73d5d5a5cb (patch)
treea8a784b6931fe52ad5f511cfef85af14e5f63991 /contrib/python/ipython/py3/IPython/terminal
parent50a65e3b48a82d5b51f272664da389f2e0b0c99a (diff)
downloadydb-e95f266d2a3e48e62015220588a4fd73d5d5a5cb.tar.gz
Library import 6 (#888)
Diffstat (limited to 'contrib/python/ipython/py3/IPython/terminal')
-rw-r--r--contrib/python/ipython/py3/IPython/terminal/interactiveshell.py15
-rw-r--r--contrib/python/ipython/py3/IPython/terminal/prompts.py27
2 files changed, 36 insertions, 6 deletions
diff --git a/contrib/python/ipython/py3/IPython/terminal/interactiveshell.py b/contrib/python/ipython/py3/IPython/terminal/interactiveshell.py
index 997fd82250..532287f5e7 100644
--- a/contrib/python/ipython/py3/IPython/terminal/interactiveshell.py
+++ b/contrib/python/ipython/py3/IPython/terminal/interactiveshell.py
@@ -588,6 +588,17 @@ class TerminalInteractiveShell(InteractiveShell):
help="Display the current vi mode (when using vi editing mode)."
).tag(config=True)
+ prompt_line_number_format = Unicode(
+ "",
+ help="The format for line numbering, will be passed `line` (int, 1 based)"
+ " the current line number and `rel_line` the relative line number."
+ " for example to display both you can use the following template string :"
+ " c.TerminalInteractiveShell.prompt_line_number_format='{line: 4d}/{rel_line:+03d} | '"
+ " This will display the current line number, with leading space and a width of at least 4"
+ " character, as well as the relative line number 0 padded and always with a + or - sign."
+ " Note that when using Emacs mode the prompt of the first line may not update.",
+ ).tag(config=True)
+
@observe('term_title')
def init_term_title(self, change=None):
# Enable or disable the terminal title.
@@ -736,7 +747,7 @@ class TerminalInteractiveShell(InteractiveShell):
def get_message():
return PygmentsTokens(self.prompts.in_prompt_tokens())
- if self.editing_mode == 'emacs':
+ if self.editing_mode == "emacs" and self.prompt_line_number_format == "":
# with emacs mode the prompt is (usually) static, so we call only
# the function once. With VI mode it can toggle between [ins] and
# [nor] so we can't precompute.
@@ -753,7 +764,7 @@ class TerminalInteractiveShell(InteractiveShell):
"message": get_message,
"prompt_continuation": (
lambda width, lineno, is_soft_wrap: PygmentsTokens(
- self.prompts.continuation_prompt_tokens(width)
+ self.prompts.continuation_prompt_tokens(width, lineno=lineno)
)
),
"multiline": True,
diff --git a/contrib/python/ipython/py3/IPython/terminal/prompts.py b/contrib/python/ipython/py3/IPython/terminal/prompts.py
index 3f5c07b980..ca56d91a40 100644
--- a/contrib/python/ipython/py3/IPython/terminal/prompts.py
+++ b/contrib/python/ipython/py3/IPython/terminal/prompts.py
@@ -25,11 +25,21 @@ class Prompts(object):
return '['+mode+'] '
return ''
+ def current_line(self) -> int:
+ if self.shell.pt_app is not None:
+ return self.shell.pt_app.default_buffer.document.cursor_position_row or 0
+ return 0
def in_prompt_tokens(self):
return [
- (Token.Prompt, self.vi_mode() ),
- (Token.Prompt, 'In ['),
+ (Token.Prompt, self.vi_mode()),
+ (
+ Token.Prompt,
+ self.shell.prompt_line_number_format.format(
+ line=1, rel_line=-self.current_line()
+ ),
+ ),
+ (Token.Prompt, "In ["),
(Token.PromptNum, str(self.shell.execution_count)),
(Token.Prompt, ']: '),
]
@@ -37,11 +47,20 @@ class Prompts(object):
def _width(self):
return fragment_list_width(self.in_prompt_tokens())
- def continuation_prompt_tokens(self, width=None):
+ def continuation_prompt_tokens(self, width=None, *, lineno=None):
if width is None:
width = self._width()
+ line = lineno + 1 if lineno is not None else 0
+ prefix = " " * len(
+ self.vi_mode()
+ ) + self.shell.prompt_line_number_format.format(
+ line=line, rel_line=line - self.current_line() - 1
+ )
return [
- (Token.Prompt, (' ' * (width - 5)) + '...: '),
+ (
+ Token.Prompt,
+ prefix + (" " * (width - len(prefix) - 5)) + "...: ",
+ ),
]
def rewrite_prompt_tokens(self):