### 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
<other abc  # show error
other> 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\<hou\&h\;hgkj\^kj\"kjh\'jhg
touch sdf\xa5lh\Xb7kll\157j\158hk\ua47bz\U123b5678fs\cxzdfga

touch "a\?bc\[\]a"      # no escaping in Quotes
touch fgh\y1            # \y is no escape sequence in fish, show it as normal text like fish itself

### Builtins
. hallo
source hallo 
eval ls . /tmp
eval ls .../tmp
eval $var
eval abc
eval {l,a}s  # lists ./as. colours not ok, but we cut here
eval "echo bla"

history merge

true ;ls
echo (true)
echo (true #comment)
echo (true>>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<DESTINATION
echo Hello > 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<DEST| sort
comand_1;command_2
comand_1 ;command_2
ls;ls
run_long_job & ls  # yes & is a command sequencing operator like | and ;
cat foo.txt | head
make fish 2>| 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