summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorg Brandl <georg@python.org>2022-10-26 21:12:22 +0200
committerGeorg Brandl <georg@python.org>2022-10-28 17:52:51 +0200
commit2fbffb07087f78f16e84f141a28e14118ecd5b75 (patch)
tree5c6d97d21c6de8d0c83e1eb4c0fe2c20d6d0b136
parentcffc5df62c258ca39fc7474f7197f2df33ab014f (diff)
downloadpygments-git-2fbffb07087f78f16e84f141a28e14118ecd5b75.tar.gz
shell session: allow continuation without marker for PowerShell
Fixes #2262
-rw-r--r--pygments/lexers/shell.py16
-rw-r--r--tests/snippets/pwsh-session/test_continuation.txt124
2 files changed, 136 insertions, 4 deletions
diff --git a/pygments/lexers/shell.py b/pygments/lexers/shell.py
index be74a040..e25274eb 100644
--- a/pygments/lexers/shell.py
+++ b/pygments/lexers/shell.py
@@ -154,6 +154,7 @@ class ShellSessionBaseLexer(Lexer):
.. versionadded:: 2.1
"""
+ _bare_continuation = False
_venv = re.compile(r'^(\([^)]*\))(\s*)')
def get_tokens_unprocessed(self, text):
@@ -172,10 +173,10 @@ class ShellSessionBaseLexer(Lexer):
venv = venv_match.group(1)
venv_whitespace = venv_match.group(2)
insertions.append((len(curcode),
- [(0, Generic.Prompt.VirtualEnv, venv)]))
+ [(0, Generic.Prompt.VirtualEnv, venv)]))
if venv_whitespace:
insertions.append((len(curcode),
- [(0, Text, venv_whitespace)]))
+ [(0, Text, venv_whitespace)]))
line = line[venv_match.end():]
m = self._ps1rgx.match(line)
@@ -193,11 +194,17 @@ class ShellSessionBaseLexer(Lexer):
elif backslash_continuation:
if line.startswith(self._ps2):
insertions.append((len(curcode),
- [(0, Generic.Prompt, line[:len(self._ps2)])]))
+ [(0, Generic.Prompt,
+ line[:len(self._ps2)])]))
curcode += line[len(self._ps2):]
else:
curcode += line
backslash_continuation = curcode.endswith('\\\n')
+ elif self._bare_continuation and line.startswith(self._ps2):
+ insertions.append((len(curcode),
+ [(0, Generic.Prompt,
+ line[:len(self._ps2)])]))
+ curcode += line[len(self._ps2):]
else:
if insertions:
toks = innerlexer.get_tokens_unprocessed(curcode)
@@ -774,8 +781,9 @@ class PowerShellSessionLexer(ShellSessionBaseLexer):
mimetypes = []
_innerLexerCls = PowerShellLexer
+ _bare_continuation = True
_ps1rgx = re.compile(r'^((?:\[[^]]+\]: )?PS[^>]*> ?)(.*\n?)')
- _ps2 = '>> '
+ _ps2 = '> '
class FishShellLexer(RegexLexer):
diff --git a/tests/snippets/pwsh-session/test_continuation.txt b/tests/snippets/pwsh-session/test_continuation.txt
new file mode 100644
index 00000000..4735d369
--- /dev/null
+++ b/tests/snippets/pwsh-session/test_continuation.txt
@@ -0,0 +1,124 @@
+---input---
+PS> python -m doctest `
+> -o DONT_ACCEPT_TRUE_FOR_1 `
+> -o ELLIPSIS options.txt
+
+PS> $Params = @{
+> Height = 50
+> Width = 50
+> Depth = 50
+> Name = 'My Widget'
+> ID = '10dbe43f-0269-48b8-96cb-447a755add55'
+> }
+
+
+PS> ls |
+> grep "python"
+
+---tokens---
+'PS> ' Generic.Prompt
+'python' Name
+' ' Text
+'-m' Name
+' ' Text
+'doctest' Name
+' ' Text
+'`' Punctuation
+'\n' Text
+
+'> ' Generic.Prompt
+'-o' Name
+' ' Text
+'DONT_ACCEPT_TRUE_FOR_1' Name
+' ' Text
+'`' Punctuation
+'\n' Text
+
+'> ' Generic.Prompt
+'-o' Name
+' ' Text
+'ELLIPSIS' Name
+' ' Text
+'options' Name
+'.' Punctuation
+'txt' Name
+'\n' Text
+
+'\n' Generic.Output
+
+'PS> ' Generic.Prompt
+' ' Text
+'$Params' Name.Variable
+' ' Text
+'=' Punctuation
+' ' Text
+'@' Punctuation
+'{' Punctuation
+'\n' Text
+
+'> ' Generic.Prompt
+' ' Text
+'Height' Name
+' ' Text
+'=' Punctuation
+' ' Text
+'50' Name
+'\n' Text
+
+'> ' Generic.Prompt
+' ' Text
+'Width' Name
+' ' Text
+'=' Punctuation
+' ' Text
+'50' Name
+'\n' Text
+
+'> ' Generic.Prompt
+' ' Text
+'Depth' Name
+' ' Text
+'=' Punctuation
+' ' Text
+'50' Name
+'\n' Text
+
+'> ' Generic.Prompt
+' ' Text
+'Name' Name
+' ' Text
+'=' Punctuation
+' ' Text
+"'My Widget'" Literal.String.Single
+'\n' Text
+
+'> ' Generic.Prompt
+' ' Text
+'ID' Name
+' ' Text
+'=' Punctuation
+' ' Text
+"'10dbe43f-0269-48b8-96cb-447a755add55'" Literal.String.Single
+'\n' Text
+
+'> ' Generic.Prompt
+'}' Punctuation
+'\n' Text
+
+'\n' Generic.Output
+
+'\n' Generic.Output
+
+'PS> ' Generic.Prompt
+' ' Text
+'ls ' Name.Builtin
+'|' Punctuation
+'\n' Text
+
+'> ' Generic.Prompt
+'grep' Name
+' ' Text
+'"' Literal.String.Double
+'python' Literal.String.Double
+'"' Literal.String.Double
+'\n' Text