From 270ab316ed61b17e5cefebdd2081e469f06317e8 Mon Sep 17 00:00:00 2001 From: Mathias Ertl Date: Fri, 25 Dec 2020 13:34:02 +0100 Subject: [PATCH 1/2] consider trailing whitespace a part of the prompt, making copy/paste more straight forward --- pygments/lexers/shell.py | 2 +- tests/test_shell.py | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/pygments/lexers/shell.py b/pygments/lexers/shell.py index 713d432111..daef1f39ac 100644 --- a/pygments/lexers/shell.py +++ b/pygments/lexers/shell.py @@ -232,7 +232,7 @@ class BashSessionLexer(ShellSessionBaseLexer): _innerLexerCls = BashLexer _ps1rgx = re.compile( r'^((?:(?:\[.*?\])|(?:\(\S+\))?(?:| |sh\S*?|\w+\S+[@:]\S+(?:\s+\S+)' \ - r'?|\[\S+[@:][^\n]+\].+))\s*[$#%])(.*\n?)') + r'?|\[\S+[@:][^\n]+\].+))\s*[$#%]\s*)(.*\n?)') _ps2 = '>' diff --git a/tests/test_shell.py b/tests/test_shell.py index b3600a4eaf..b43768d45c 100644 --- a/tests/test_shell.py +++ b/tests/test_shell.py @@ -142,9 +142,8 @@ def test_end_of_line_nums(lexer_bash): def test_newline_in_echo(lexer_session): fragment = '$ echo \\\nhi\nhi\n' tokens = [ - (Token.Text, ''), - (Token.Generic.Prompt, '$'), - (Token.Text, ' '), + (Token.Name.Builtin, ''), + (Token.Generic.Prompt, '$ '), (Token.Name.Builtin, 'echo'), (Token.Text, ' '), (Token.Literal.String.Escape, '\\\n'), @@ -217,8 +216,7 @@ def test_virtualenv(lexer_session): (Token.Text, ''), (Token.Text, ' '), (Token.Text, ''), - (Token.Generic.Prompt, '[~/project]$'), - (Token.Text, ' '), + (Token.Generic.Prompt, '[~/project]$ '), (Token.Text, 'foo'), (Token.Text, ' '), (Token.Text, '-h'), From 456ac59d8481c09c29ea9f771550a933ba70edb8 Mon Sep 17 00:00:00 2001 From: Mathias Ertl Date: Sat, 26 Dec 2020 16:17:25 +0100 Subject: [PATCH 2/2] add tests to illustrate problem discussed in PR #1645 --- tests/test_shell.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/tests/test_shell.py b/tests/test_shell.py index b43768d45c..3cf7e204ea 100644 --- a/tests/test_shell.py +++ b/tests/test_shell.py @@ -154,6 +154,31 @@ def test_newline_in_echo(lexer_session): assert list(lexer_session.get_tokens(fragment)) == tokens +def test_newline_in_ls(lexer_session): + fragment = '$ ls \\\nhi\nhi\n' + tokens = [ + (Token.Text, ''), + (Token.Generic.Prompt, '$ '), + (Token.Text, 'ls'), + (Token.Text, ' '), + (Token.Literal.String.Escape, '\\\n'), + (Token.Text, 'hi'), + (Token.Text, '\n'), + (Token.Generic.Output, 'hi\n'), + ] + assert list(lexer_session.get_tokens(fragment)) == tokens + + +def test_comment_after_prompt(lexer_session): + fragment = '$# comment' + tokens = [ + (Token.Comment.Single, ''), + (Token.Generic.Prompt, '$'), + (Token.Comment.Single, '# comment\n'), + ] + assert list(lexer_session.get_tokens(fragment)) == tokens + + def test_msdos_gt_only(lexer_msdos): fragment = '> py\nhi\n' tokens = [