### Comments
# TODO
# BEGIN
# fg sfg sfh sft
# END
#
# text in (parenthesis) is ok, (even
# over several lines)
# escaped \) and \( are ok
# an unbalanced single ) is not ok
# This is due to fish comment handling in command substitutions
# which cannot reasonably handled by kate syntax highlighting
### Commands and paths
ls -l |sort
ls -1
/usr/bin/ls -l /usr/local/test/ -xyz # option as indicator of CommandArgs context
./bin/ls -l /usr/abc**/tes?/lkhlk -xyz # tabulator as separator
../bin/ls -l /usr/abc**/tes?/lkhlk
~/bin/ls -l ../usr/lo\ cal/test
~user/bin/ls -l /usr/{local,remote}}/test|cat # show error
/usr/bin/../lib/ls -l /usr/local/test.???|cat
/usr/bin\ sdfg/ls -l /usr/local/test.*
usr/bin/other -l ~user/local/test
\ usr/bin/other -l ~user/local/test
/usr/bin/lsother
../test/root/bin/fish -c "echo $t8"
test/root/bin/fish -c "echo $t8"
u?r/bin/ls
usr/b?n/ls
u*ls # doesn't work, but ok
"ls" /tmp/testtest # Quotes in commands are expanded
/us"r/bin"/xy/ls
abcd$a # show error
other) abc # show error
abc # ok
oth>er abc # ok
ot(her) abc # show error
-cmd
déjà-vu
ls /ho"me/te"st'user'/abc$dir[3]/ab(echo cdefg)cd/xyz
cat\ alog -abc
ls path_not_detected
ls * no_path
ls *path_detected
ls/
ls;echo xy
flex++
echo [abc] abc
#specials
command -s ls
builtin --names jobs
exec bash
exec $test
set -e i[-1]
set test1[-1..1] $test; echo $test1
set test1[1..$n] $test; echo $test1
set test1[$n..1] $test; echo $test1
set test1[2..4 -2..-4] $test1[4..2 -4..-2]; echo $test1
set test1[2..4 -2..-4][1] $test1[4..2 -4..-2][1]
# ~~~ invalid
set test1\
[2..4 -2..-4]\
[1] a
#~~ invalid
set test1 \
#bla bla
a b c
set page_url http://fishshell.com/docs/$version_string/$fish_help_page # ???
string split . example.com
set b (string repeat -n 512 x)
read -gi test # ok
read -gi $test
read -gi "test"
read -gi (echo test)
set x (string split --max 1 --right / (status current-filename) #Comment test)
set test (exec $cmd)
# direct path
test -d $tmpldir/resources
### Options
cat -l /usr/local/test>logfile
ls --longopt=/test
ls -l"kasdflakjs" -r/usr/test -x../test/../bla -z~xyz/hello
### Arguments
echo abc"def"ghi
echo abc/def
echo abc[de]
echo abc(echo def)ghi
echo abc{de,f}ghi
# Path Detection
cd abc*efghi # fish assumes * is glob -> path
cd abc?efghi
cd ..
cd .. #
cd .
cd . #
cd ~
cd ~abc/abc/*.txt
cd ./abc
cd ../abc
cd \ abc/tmp\ .txt
test .. abc
### Escapes
touch a\?bc\[\]ax\~dsf\#gsd\af\(\)dg\?sd\ fg\bhh\%j\$k\\l\?sed\*jk\>hj\>xyz/abc)
true -error # show error
pwd > abc
command -s ls;cat test
builtin -n;builtin echo
complete -c myprog -s o -l output -a "yes no"
builtin jobs
math -s0 10.0 / 6.0
#special keywords as directory names:
/usr/function/testtest /usr/function/testtest
/usr/for/testtest /usr/for/testtest
/usr/begin/testtest /usr/begin/testtest
/usr/switch/testtest /usr/switch/testtest
/usr/if/testtest /usr/if/testtest
/usr/while/testtest /usr/while/testtest
/usr/command/testtest /usr/command/testtest
/usr/builtin/testtest /usr/builtin/testtest
/usr/eval/testtest /usr/eval/testtest
/usr/exec/testtest /usr/exec/testtest
/usr/set/testtest /usr/set/testtest
/usr/test/testtest /usr/test/testtest
### test
test NUM1 -eq NUM2
test -f /tmp/abc -a -e /tmp/def;cat /tmp/abc;
if test \( -f /foo -o -f /bar \) -a \( -f /baz -o -f /bat \)
echo Success.
end
[ 25 -eq $NUM2 ]
[ "abc" = "$STRING2" ]
if [ ! \(STRING1 != STRING2\) ];ls;end
if [ -f abc ]# show error
end
if [ -f abc ] # ok
end
if [ ! \(STRING1 != STRING2\) ] ls;end # show error
if [ "abc" != "def" ] # hallo
echo x;end
### Redirections
ls < SOURCE_FILE # stdin
ls > DESTINATION # stdout
ls ^ DESTINATION # stderr
ls >> DESTINATION_FILE # append
ls ^^ DESTINATION_FILE # append
ls >? DESTINATION # noclobber
ls ^? DESTINATION
ls ^? ~
ls ^? ~testuser/abc
ls ^?/DESTINATION
ls ^?#DESTINATION # show error
ls > $abc[5]
ls >"abc"/defg$v/xyz
ls >& # show error
ls > &1 # show error
ls abc>&25 xyz /tmp/xyz $abc
ls /tmp/tst>&25? # show error
ls /tmp/tst>&25 ? # ok
ls 3>&- xyz
ls 1 all_output.txt ^&1 xyz
ls 2>&-;echo end
ls xyz 2>|cat
ls>x
abs>x
/bin/ls>x
/bin/abs>x
### Quoting
echo 'abcdefg'
echo 'abc\'de\\fg'
echo 'abc\defg'
echo "1\"23\$45\\6"
echo '1\"23\$45\\6'
echo '
hallo
'
echo "$i: '$$name[1][$i]'"
### Piping, Pipelines and background jobs
ls -l /tmp/hello 1| less #show error
### Variable Expansion
echo $PATH
echo $PATH[1..3]
echo $PATH[-1..3 5 9..15]
echo $PATH[$n[2]]
echo $test[1..$n]
echo $test[$n..1]
echo The plural of $WORD is "$WORD"s
echo The plural of $WORD is {$WORD}s
echo $$foo[$i]
echo $test[(count $test)..1]
echo $test[1..(count $test[3])]
echo $$foo[1..-1][5]
echo $$foo[1..-1]\
[5][2]\
[5]
#show error
echo $PATH[error
echo $PATH[1..error]
echo $PATH[1 2 34 ]
echo $PATH[1.. 2]
echo $PATH[1 ..2]
### Brace Expansion
echo input.{c,12h,TXT}
echo input.{abc$test[(count $test)..1],(echo $txt)}
echo input.{a{b,c},12h,TXT}} # show error
### Index range expansion
echo (echo $a)[2..5]
echo (echo $a)[2..5 1..3]
echo (echo $a)[-1..1]
### Process expansion
fg %ema # ???
### Command substitution
echo -n -s "$USER" @ "$__fish_prompt_hostname" ' ' (set_color $color_cwd) (/usr/bin/ls) (set_color normal)
echo (#hallo)abc # ok
echo (ls #hallo)abc # ok, die context-Tiefe ist anders
echo (ls;#hallo)abc # als hier.
echo (ls#hallo)abc # ok: # may be inner part of function names!
echo (/usr/bin/ls)
echo (ls >>mem/abc)
echo (echo $test[2])
echo (/usr"/bi"n/ls /tmp)
echo (seq 10)[1][2]
# ~~~ not an index
echo (seq 10)\
[1][2]
# ~~~ not an index
echo (seq 10)\
[1]\
[2]
#~~ not an index
# multline command substitution
set x (echo dirlist; # blabla
ls)
## same, but commented out:
# set x (echo dirlist; # blabla
# ls)
set pi (math "scale=10; 4*a(1)")
### Continuation lines
ls \
/usr/bin
test "STRING1"="STRING2" -a \
"STRING3" = (echo "STRING4")
echo input.{abc\
,12h,\
TXT}
echo (\
ls)
# no line continuation within single quotes
echo 'abcdefg\
s$dfg sdf'
# but within double quotes
echo "123456\
78910"
echo $PATH[1..3\
]
ls /usr\
local/bin
echo foo\ bar
echo foo\
bar
for i \
in \
a b c
echo $i
end
# Bug?
# Depending on weakDeliminators, either this works:
cat\ alog -abc
# or this:
builtin\
--names jobs
builtin \
--names jobs
command \
ls
eval \
ls . /tmp
eval\
ls .../tmp
set \
-e i[-1]
set \
test1[-1..1] \
$test; \
echo $test1
read \
-gi test
# see https://github.com/fish-shell/fish-shell/pull/1987
echo before comment \
# comment
# comment2
after comment # just another argument
echo before comment\
# comment ^ no space
# comment2
after comment # a command
from root
echo "hello" | \
#remove 'l'
#and more
tr -d 'l'
### Trouble
make; and make install; or make clean # ok
printf '%s\t%s\n' flounder fish # ok
diff (sort a.txt | psub) (sort b.txt | psub)
source-highlight -f esc (cpp main.c | psub -s .c)
while test -f foo.txt # comment
echo hallo
end
for i in {1,(ls),3} # comment
echo $i
end
# function
function __hidden # comment
cd /
end
function ll \
-d "multiline
description"
ls -l $argv
end
function ls --description="Description" -a a b c # comment
command ls --color=auto $argv
if test -f foo.txt
echo foo.txt exists
else if test -f bar.txt # comment
echo bar.txt exists
else
echo foo.txt and bar.txt do not exist
end # comment
end
function test;echo hallo;end # comment
switch $animal # comment
case cat # comment
echo evil
case wolf \
dog
echo mammal
case '*'
echo I have no idea what a $animal is
end
if test (count $argv) = 1
echo $argv
else
echo "?"
end
if not test -f spoon #comment
echo There is no spoon
else
exit 1
end
for file in $cfgfiles
if test -f $file
string match -r '\[Dialer' < $file | string replace -r '\[Dialer (.+)\]' '$1'
end
end | sort -u | string match -v Defaults
for i in *.c
if grep smurf $i # comment
echo Smurfs are present in $i
break
end
end
if begin contains -- $argv --force # ohne ; nach begin: geht
or not status --is-interactive and not status --is-login
end
echo ""
end
begin # comment
for i in *.tmp
if grep smurf $i
continue
end
rm $i
end
end
if [ $status -eq 1 ]
set sta pass
else
set sta fail
end
exec "$test"
# Process Expansion
# see fish issue 4230
kill -STOP %self
endcmd # is a command
for inc in a # inc is a variable
end
switch d;case "*" ; case d;echo; end
if ; else if ; else if ; if ; else ; end;else ; end