mirror of
https://github.com/xonsh/xonsh.git
synced 2025-03-04 08:24:40 +01:00
fixed multiline autowrapping in @(expr)
This commit is contained in:
parent
3a31d6ff31
commit
3b0fe9144d
4 changed files with 40 additions and 0 deletions
17
news/atml.rst
Normal file
17
news/atml.rst
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
**Added:** None
|
||||||
|
|
||||||
|
**Changed:** None
|
||||||
|
|
||||||
|
**Deprecated:** None
|
||||||
|
|
||||||
|
**Removed:** None
|
||||||
|
|
||||||
|
**Fixed:**
|
||||||
|
|
||||||
|
* Fixed issue with multiline string inside of ``@(expr)`` in
|
||||||
|
unwrapped subprocesses. For example, the following now works::
|
||||||
|
|
||||||
|
echo @("""hello
|
||||||
|
mom""")
|
||||||
|
|
||||||
|
**Security:** None
|
|
@ -98,6 +98,12 @@ def test_pyeval_redirect():
|
||||||
code = 'echo @("foo") > bar\n'
|
code = 'echo @("foo") > bar\n'
|
||||||
assert check_parse(code)
|
assert check_parse(code)
|
||||||
|
|
||||||
|
|
||||||
|
def test_pyeval_multiline_str():
|
||||||
|
code = 'echo @("""hello\nmom""")\n'
|
||||||
|
assert check_parse(code)
|
||||||
|
|
||||||
|
|
||||||
def test_echo_comma():
|
def test_echo_comma():
|
||||||
code = 'echo ,\n'
|
code = 'echo ,\n'
|
||||||
assert check_parse(code)
|
assert check_parse(code)
|
||||||
|
@ -114,3 +120,5 @@ def test_echo_comma_2val():
|
||||||
def test_echo_line_cont():
|
def test_echo_line_cont():
|
||||||
code = 'echo "1 \\\n2"\n'
|
code = 'echo "1 \\\n2"\n'
|
||||||
assert check_parse(code)
|
assert check_parse(code)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -292,6 +292,13 @@ def test_subproc_toks_pyeval():
|
||||||
assert exp == obs
|
assert exp == obs
|
||||||
|
|
||||||
|
|
||||||
|
def test_subproc_toks_pyeval_multiline_string():
|
||||||
|
s = 'echo @("""hello\nmom""")'
|
||||||
|
exp = '![{0}]'.format(s)
|
||||||
|
obs = subproc_toks(s, lexer=LEXER, returnline=True)
|
||||||
|
assert exp == obs
|
||||||
|
|
||||||
|
|
||||||
def test_subproc_toks_twopyeval():
|
def test_subproc_toks_twopyeval():
|
||||||
s = 'echo @(1+1) @(40 + 2)'
|
s = 'echo @(1+1) @(40 + 2)'
|
||||||
exp = '![{0}]'.format(s)
|
exp = '![{0}]'.format(s)
|
||||||
|
|
|
@ -342,6 +342,11 @@ def find_next_break(line, mincol=0, lexer=None):
|
||||||
return maxcol
|
return maxcol
|
||||||
|
|
||||||
|
|
||||||
|
def _offset_from_prev_lines(line, last):
|
||||||
|
lines = line.splitlines(keepends=True)[:last]
|
||||||
|
return sum(map(len, lines))
|
||||||
|
|
||||||
|
|
||||||
def subproc_toks(line, mincol=-1, maxcol=None, lexer=None, returnline=False,
|
def subproc_toks(line, mincol=-1, maxcol=None, lexer=None, returnline=False,
|
||||||
greedy=False):
|
greedy=False):
|
||||||
"""Encapsulates tokens in a source code line in a uncaptured
|
"""Encapsulates tokens in a source code line in a uncaptured
|
||||||
|
@ -431,6 +436,9 @@ def subproc_toks(line, mincol=-1, maxcol=None, lexer=None, returnline=False,
|
||||||
return # handle comment lines
|
return # handle comment lines
|
||||||
elif saw_macro or greedy:
|
elif saw_macro or greedy:
|
||||||
end_offset = len(toks[-1].value.rstrip()) + 1
|
end_offset = len(toks[-1].value.rstrip()) + 1
|
||||||
|
if toks[0].lineno != toks[-1].lineno:
|
||||||
|
# handle multiline cases
|
||||||
|
end_offset += _offset_from_prev_lines(line, toks[-1].lineno)
|
||||||
beg, end = toks[0].lexpos, (toks[-1].lexpos + end_offset)
|
beg, end = toks[0].lexpos, (toks[-1].lexpos + end_offset)
|
||||||
end = len(line[:end].rstrip())
|
end = len(line[:end].rstrip())
|
||||||
rtn = '![' + line[beg:end] + ']'
|
rtn = '![' + line[beg:end] + ']'
|
||||||
|
|
Loading…
Add table
Reference in a new issue