### 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