mirror of
https://github.com/fish-shell/fish-shell.git
synced 2024-11-28 04:03:39 +08:00
b00899179f
On a command with multiline quoted string like begin echo "line1 line2" end we actually indent line2 which seeems misleading because the indentation changes the behavior when typed into a script. This has become more prominent since commits -a37629f86
(fish_clipboard_copy: indent multiline commands, 2024-04-13) -611a0572b
(builtins type/functions: indent interactively-defined functions, 2024-04-12) -222673f33
(edit_command_buffer: send indented commandline to editor, 2024-04-12) which add indentation to an exported commandline. Never indent quoted strings, to make sure the rendering matches the semantics. Note that we do need to indent the opening quote which is fine because it's on the same line. While at it, indent command substitutions recursively. That feature should also be added to fish_indent's formatting mode (which is the default). Fortunately the formatting mode already works fine with quoted strings; it does not indent them. Not sure how that's done and whether indentation can use the same logic.
528 lines
8.2 KiB
Fish
528 lines
8.2 KiB
Fish
# RUN: %fish -C 'set -g fish_indent %fish_indent' %s
|
|
# Test file for fish_indent
|
|
# Note that littlecheck ignores leading whitespace, so we have to use {{ }} to explicitly match it.
|
|
|
|
echo 'echo foo \\
|
|
| cat' | $fish_indent
|
|
#CHECK: echo foo \
|
|
#CHECK: | cat
|
|
|
|
echo 'echo foo | \\
|
|
cat' | $fish_indent
|
|
#CHECK: echo foo | cat
|
|
|
|
echo 'echo foo |
|
|
cat' | $fish_indent
|
|
#CHECK: echo foo |
|
|
#CHECK: cat
|
|
|
|
echo 'if true; \\
|
|
or false
|
|
echo something
|
|
end' | $fish_indent
|
|
#CHECK: if true; or false
|
|
#CHECK: echo something
|
|
#CHECK: end
|
|
|
|
echo '\\
|
|
echo wurst' | $fish_indent
|
|
#CHECK: echo wurst
|
|
|
|
echo 'echo foo \\
|
|
brot' | $fish_indent
|
|
#CHECK: echo foo \
|
|
#CHECK: brot
|
|
|
|
|
|
echo 'echo rabarber \\
|
|
banana' | $fish_indent
|
|
#CHECK: echo rabarber \
|
|
#CHECK: banana
|
|
|
|
echo 'for x in a \\
|
|
b \\
|
|
c
|
|
echo thing
|
|
end' | $fish_indent
|
|
#CHECK: for x in a \
|
|
#CHECK: b \
|
|
#CHECK: c
|
|
#CHECK: echo thing
|
|
#CHECK: end
|
|
|
|
echo 'echo foo |
|
|
echo banana' | $fish_indent
|
|
#CHECK: echo foo |
|
|
#CHECK: echo banana
|
|
|
|
echo 'echo foo \\
|
|
;' | $fish_indent
|
|
#CHECK: echo foo
|
|
|
|
echo 'echo foo \\
|
|
' | $fish_indent
|
|
#CHECK: echo foo
|
|
|
|
echo -n '
|
|
begin
|
|
echo hi
|
|
|
|
|
|
end | cat | cat | begin ; echo hi ; end | begin ; begin ; echo hi ; end ; end arg
|
|
' | $fish_indent
|
|
|
|
#CHECK: begin
|
|
#CHECK: {{ }}echo hi
|
|
#CHECK:
|
|
#CHECK: end | cat | cat | begin
|
|
#CHECK: {{ }}echo hi
|
|
#CHECK: end | begin
|
|
#CHECK: {{ }}begin
|
|
#CHECK: {{ }}{{ }}echo hi
|
|
#CHECK: {{ }}end
|
|
#CHECK: end arg
|
|
|
|
echo -n '
|
|
switch aloha
|
|
|
|
case alpha
|
|
echo sup
|
|
|
|
case beta gamma
|
|
echo hi
|
|
|
|
end
|
|
' | $fish_indent
|
|
|
|
#CHECK: switch aloha
|
|
#CHECK: {{ }}case alpha
|
|
#CHECK: {{ }}{{ }}echo sup
|
|
#CHECK: {{ }}case beta gamma
|
|
#CHECK: {{ }}{{ }}echo hi
|
|
#CHECK:
|
|
#CHECK: end
|
|
|
|
echo -n '
|
|
function hello_world
|
|
|
|
\'begin\'
|
|
echo hi
|
|
end | cat
|
|
|
|
echo sup; echo sup
|
|
echo hello;
|
|
|
|
echo hello
|
|
end
|
|
' | $fish_indent
|
|
|
|
#CHECK: function hello_world
|
|
#CHECK:
|
|
#CHECK: {{ }}begin
|
|
#CHECK: {{ }}{{ }}echo hi
|
|
#CHECK: {{ }}end | cat
|
|
#CHECK:
|
|
#CHECK: {{ }}echo sup
|
|
#CHECK: {{ }}echo sup
|
|
#CHECK: {{ }}echo hello
|
|
#CHECK:
|
|
#CHECK: {{ }}echo hello
|
|
#CHECK: end
|
|
|
|
echo -n '
|
|
echo alpha #comment1
|
|
#comment2
|
|
|
|
#comment3
|
|
for i in abc #comment1
|
|
#comment2
|
|
echo hi
|
|
end
|
|
|
|
switch foo #abc
|
|
# bar
|
|
case bar
|
|
echo baz\
|
|
qqq
|
|
case "*"
|
|
echo sup
|
|
end' | $fish_indent
|
|
#CHECK: echo alpha #comment1
|
|
#CHECK: #comment2
|
|
#CHECK:
|
|
#CHECK: #comment3
|
|
#CHECK: for i in abc #comment1
|
|
#CHECK: {{ }}#comment2
|
|
#CHECK: {{ }}echo hi
|
|
#CHECK: end
|
|
#CHECK:
|
|
#CHECK: switch foo #abc
|
|
#CHECK: {{ }}# bar
|
|
#CHECK: {{ }}case bar
|
|
#CHECK: {{ }}{{ }}echo baz\
|
|
#CHECK: qqq
|
|
#CHECK: {{ }}case "*"
|
|
#CHECK: {{ }}{{ }}echo sup
|
|
#CHECK: end
|
|
|
|
# No indent
|
|
echo -n '
|
|
if true
|
|
else if false
|
|
echo alpha
|
|
switch beta
|
|
case gamma
|
|
echo delta
|
|
end
|
|
end
|
|
' | $fish_indent -i
|
|
#CHECK: if true
|
|
#CHECK: else if false
|
|
#CHECK: {{^}}echo alpha
|
|
#CHECK: {{^}}switch beta
|
|
#CHECK: {{^}}case gamma
|
|
#CHECK: {{^}}echo delta
|
|
#CHECK: {{^}}end
|
|
#CHECK: end
|
|
|
|
# Test errors
|
|
echo -n '
|
|
begin
|
|
echo hi
|
|
else
|
|
echo bye
|
|
end; echo alpha "
|
|
' | $fish_indent
|
|
#CHECK: begin
|
|
#CHECK: {{ }}echo hi
|
|
#CHECK: else
|
|
#CHECK:
|
|
#CHECK: {{^}}echo bye
|
|
#CHECK: end; echo alpha "
|
|
|
|
# issue 1665
|
|
echo -n '
|
|
if begin ; false; end; echo hi ; end
|
|
while begin ; false; end; echo hi ; end
|
|
' | $fish_indent
|
|
#CHECK: if begin
|
|
#CHECK: {{ }}{{ }}false
|
|
#CHECK: {{ }}end
|
|
#CHECK: {{ }}echo hi
|
|
#CHECK: end
|
|
#CHECK: while begin
|
|
#CHECK: {{ }}{{ }}false
|
|
#CHECK: {{ }}end
|
|
#CHECK: {{ }}echo hi
|
|
#CHECK: end
|
|
|
|
# issue 2899
|
|
echo -n '
|
|
echo < stdin >>appended yes 2>&1 no > stdout maybe 2>& 4 | cat 2>| cat
|
|
' | $fish_indent
|
|
#CHECK: echo <stdin >>appended yes 2>&1 no >stdout maybe 2>&4 | cat 2>| cat
|
|
|
|
|
|
# issue 7252
|
|
echo -n '
|
|
begin
|
|
# comment
|
|
end
|
|
' | $fish_indent
|
|
#CHECK: {{^}}begin
|
|
#CHECK: {{^ }}# comment
|
|
#CHECK: {{^}}end
|
|
|
|
echo -n '
|
|
begin
|
|
cmd
|
|
# comment
|
|
end
|
|
' | $fish_indent
|
|
#CHECK: {{^}}begin
|
|
#CHECK: {{^ }}cmd
|
|
#CHECK: {{^ }}# comment
|
|
#CHECK: {{^}}end
|
|
|
|
echo -n '
|
|
cmd \\
|
|
continuation
|
|
' | $fish_indent
|
|
#CHECK: {{^}}cmd \
|
|
#CHECK: {{^ }}continuation
|
|
|
|
echo -n '
|
|
begin
|
|
cmd \
|
|
continuation
|
|
end
|
|
' | $fish_indent
|
|
#CHECK: {{^}}begin
|
|
#CHECK: {{^ }}cmd \
|
|
#CHECK: {{^ }}{{ }}continuation
|
|
#CHECK: {{^}}end
|
|
|
|
|
|
echo -n '
|
|
i\
|
|
f true
|
|
echo yes
|
|
en\
|
|
d
|
|
|
|
"whil\
|
|
e" true
|
|
"builtin" yes
|
|
en"d"
|
|
|
|
alpha | \
|
|
beta
|
|
|
|
gamma | \
|
|
# comment3
|
|
delta
|
|
|
|
if true
|
|
echo abc
|
|
end
|
|
|
|
if false # comment4
|
|
and true && false
|
|
echo abc;end
|
|
|
|
echo hi |
|
|
|
|
echo bye
|
|
' | $fish_indent
|
|
#CHECK: i\
|
|
#CHECK: f true
|
|
#CHECK: {{ }}echo yes
|
|
#CHECK: en\
|
|
#CHECK: d
|
|
#CHECK:
|
|
#CHECK: while true
|
|
#CHECK: {{ }}builtin yes
|
|
#CHECK: end
|
|
#CHECK:
|
|
#CHECK: alpha | beta
|
|
#CHECK:
|
|
#CHECK: gamma | \
|
|
#CHECK: # comment3
|
|
#CHECK: delta
|
|
#CHECK:
|
|
#CHECK: if true
|
|
#CHECK: {{ }}echo abc
|
|
#CHECK: end
|
|
#CHECK:
|
|
#CHECK: if false # comment4
|
|
#CHECK: {{ }}and true && false
|
|
#CHECK: {{ }}echo abc
|
|
#CHECK: end
|
|
#CHECK:
|
|
#CHECK: echo hi |
|
|
#CHECK: {{ }}echo bye
|
|
|
|
echo 'a;;;;;;' | $fish_indent
|
|
#CHECK: a
|
|
echo 'echo; echo' | $fish_indent
|
|
#CHECK: echo
|
|
#CHECK: echo
|
|
|
|
# Check that we keep semicolons for and and or, but only on the same line.
|
|
printf '%s\n' "a; and b" | $fish_indent
|
|
#CHECK: a; and b
|
|
printf '%s\n' "a;" "and b" | $fish_indent
|
|
#CHECK: a
|
|
#CHECK: and b
|
|
printf '%s\n' a "; and b" | $fish_indent
|
|
#CHECK: a
|
|
#CHECK: and b
|
|
printf '%s\n' "a; b" | $fish_indent
|
|
#CHECK: a
|
|
#CHECK: b
|
|
|
|
echo 'foo &&
|
|
#
|
|
bar' | $fish_indent
|
|
#CHECK: {{^}}foo &&
|
|
#CHECK: {{^ }}#
|
|
#CHECK: {{ }}bar
|
|
|
|
echo 'command 1 |
|
|
command 1 cont ||
|
|
command 2' | $fish_indent
|
|
#CHECK: {{^}}command 1 |
|
|
#CHECK: {{^ }}command 1 cont ||
|
|
#CHECK: {{^ }}command 2
|
|
|
|
echo " foo" | $fish_indent --check
|
|
echo $status
|
|
#CHECK: 1
|
|
echo foo | $fish_indent --check
|
|
echo $status
|
|
#CHECK: 0
|
|
|
|
echo 'thing | # comment
|
|
thing' | $fish_indent --check
|
|
echo $status
|
|
#CHECK: 0
|
|
|
|
echo 'echo \
|
|
# first indented comment
|
|
# second indented comment
|
|
indented argument
|
|
echo' | $fish_indent --check
|
|
echo $status
|
|
#CHECK: 0
|
|
|
|
echo 'if true;
|
|
end' | $fish_indent
|
|
#CHECK: if true{{$}}
|
|
#CHECK: end
|
|
|
|
echo 'if true; and false; or true
|
|
end' | $fish_indent --check
|
|
echo $status
|
|
#CHECK: 0
|
|
|
|
echo -n '
|
|
function hello_continuations
|
|
echo cmd \
|
|
echo --opt1 \
|
|
echo --opt2 \
|
|
echo --opt3
|
|
end
|
|
' | $fish_indent
|
|
|
|
#CHECK: function hello_continuations
|
|
#CHECK: {{^}} echo cmd \
|
|
#CHECK: {{^}} echo --opt1 \
|
|
#CHECK: {{^}} echo --opt2 \
|
|
#CHECK: {{^}} echo --opt3
|
|
#CHECK: end
|
|
|
|
echo "\
|
|
a=1 \\
|
|
a=2 \\
|
|
echo" | $fish_indent --check
|
|
echo $status #CHECK: 0
|
|
|
|
echo "\
|
|
a=1 \\
|
|
a=2 echo" | $fish_indent --check
|
|
echo $status #CHECK: 0
|
|
|
|
echo 'first-word\\
|
|
second-word' | $fish_indent
|
|
# CHECK: first-word \
|
|
# CHECK: {{^}} second-word
|
|
|
|
echo 'begin
|
|
first-indented-word\\
|
|
second-indented-word' | $fish_indent
|
|
# CHECK: begin
|
|
# CHECK: {{^}} first-indented-word \
|
|
# CHECK: {{^}} second-indented-word
|
|
|
|
echo 'multiline-\\
|
|
-word' | $fish_indent --check
|
|
echo $status #CHECK: 0
|
|
|
|
echo 'PATH={$PATH[echo " "' | $fish_indent --ansi
|
|
# CHECK: PATH={$PATH[echo " "
|
|
|
|
echo a\> | $fish_indent
|
|
# CHECK: a >
|
|
|
|
echo a\<\) | $fish_indent
|
|
# CHECK: a < )
|
|
echo b\|\{ | $fish_indent
|
|
# CHECK: b | {
|
|
|
|
echo "\'\\\\\x00\'" | string unescape | $fish_indent | string escape
|
|
# CHECK: \'\\\x00\'
|
|
|
|
echo '\"\"\|\x00' | string unescape | $fish_indent | string unescape
|
|
# CHECK: |
|
|
|
|
echo 'a
|
|
|
|
|
|
;
|
|
|
|
|
|
b
|
|
' | $fish_indent
|
|
#CHECK: a
|
|
#CHECK:
|
|
#CHECK: b
|
|
|
|
echo "
|
|
|
|
|
|
|
|
echo this file starts late
|
|
" | $fish_indent
|
|
#CHECK: echo this file starts late
|
|
|
|
echo 'foo|bar; begin
|
|
echo' | $fish_indent --only-indent
|
|
# CHECK: foo|bar; begin
|
|
# CHECK: {{^}} echo
|
|
|
|
echo 'begin
|
|
echo
|
|
end' | $fish_indent --only-unindent
|
|
# CHECK: {{^}}begin
|
|
# CHECK: {{^}}echo
|
|
# CHECK: {{^}}end
|
|
|
|
echo 'if true
|
|
begin
|
|
echo
|
|
end
|
|
end' | $fish_indent --only-unindent
|
|
# CHECK: {{^}}if true
|
|
# CHECK: {{^}}begin
|
|
# CHECK: {{^}}echo
|
|
# CHECK: {{^}}end
|
|
# CHECK: {{^}}end
|
|
|
|
echo 'begin
|
|
echo
|
|
not indented properly
|
|
end' | $fish_indent --only-unindent
|
|
# CHECK: {{^}}begin
|
|
# CHECK: {{^}} echo
|
|
# CHECK: {{^}} not indented properly
|
|
# CHECK: {{^}}end
|
|
|
|
|
|
echo 'echo (
|
|
if true
|
|
echo
|
|
end
|
|
)' | $fish_indent --only-indent
|
|
# CHECK: {{^}}echo (
|
|
# CHECK: {{^}} if true
|
|
# CHECK: {{^}} echo
|
|
# CHECK: {{^}} end
|
|
# CHECK: {{^}})
|
|
|
|
echo 'echo (
|
|
if true
|
|
echo "
|
|
multi
|
|
line
|
|
"
|
|
end
|
|
)' | $fish_indent --only-indent
|
|
# CHECK: {{^}}echo (
|
|
# CHECK: {{^}} if true
|
|
# CHECK: {{^}} echo "
|
|
# CHECK: {{^}}multi
|
|
# CHECK: {{^}}line
|
|
# CHECK: {{^}}"
|
|
# CHECK: {{^}} end
|
|
# CHECK: {{^}})
|