aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/misc/fish.md177
1 files changed, 173 insertions, 4 deletions
diff --git a/src/misc/fish.md b/src/misc/fish.md
index f24b57f..2cc763e 100644
--- a/src/misc/fish.md
+++ b/src/misc/fish.md
@@ -1,15 +1,184 @@
# fish(1)
-## keymaps
-```markdown
+## Quick Info
+Fish initialization file `~/.config/fish/config.fish`
+
+Switch between different key bindings:
+- `fish_default_key_bindings` to use default key bindings
+- `fish_vi_key_bindings` to use vi key bindings
+
+## Variables
+Available scopes
+- `local` variable local to a block
+- `global` variable global to shell instance
+- `universal` variable universal to all shell instances + preserved across
+ shell restart
+
+### Set/Unset Variables
+```text
+set <name> [<values>]
+ -l local scope
+ -g global scope
+ -U universal scope
+ -e erase variable
+ -S show verbose info
+ -x export to ENV
+ -u unexport from ENV
+```
+
+### Lists
+In `fish` all variables are lists (start with index `1`, but lists can't
+contain lists.
+```text
+set foo a b c d
+
+echo $foo[1] # a
+echo $foo[-1] # d
+echo $foo[2..3] # b c
+echo $foo[1 3] # a c
+```
+
+`$` can be seen as dereference operator.
+```text
+set foo a; set a 1337
+echo $$foo # outputs 1337
+```
+
+Cartesian product.
+```text
+echo file.{h,cc}
+# file.h file.cc
+
+echo {a,b}{1,2}
+# a1 b1 b2
+```
+
+### Special Variables (Lists)
+```text
+$status # exit code of last command
+$pipestatus # list of exit codes of pipe chain
+
+$CMD_DURATION # runtime of last command in ms
+```
+
+#### `*PATH`
+Lists ending with `PATH` are automatically split at `:` when used and joined
+with `:` when exported to the environment.
+```text
+set -x BLA_PATH a:b:c:d
+echo $BLA_PATH # a b c d
+env | grep BLA_PATH # BLA_PATH=a:b:c:d
+```
+
+## Command Handling
+```text
+# sub-commands are not run in quotes
+echo "ls output: "(ls)
+```
+
+### I/O redirection
+```text
+# 'noclobber', fail if 'log' already exists
+echo foo >? log
+```
+
+## Control Flow
+### `if` / `else`
+```text
+if grep foo bar
+ # do sth
+else if grep foobar bar
+ # do sth else
+else
+ # do sth else
+end
+```
+
+### `switch`
+```text
+switch (echo foo)
+case 'foo*'
+ # do start with foo
+case bar dudel
+ # do bar and dudel
+case '*'
+ # do else
+end
+```
+
+### `while` Loop
+```text
+while true
+ echo foo
+end
+```
+
+### `for` Loop
+```text
+for f in (ls)
+ echo $f
+end
+```
+
+## Functions
+Function arguments are passed via `$argv` list.
+```text
+function fn_foo
+ echo $argv
+end
+```
+### Autoloading
+When running a command fish attempts to autoload a function. The shell looks
+for `<cmd>.fish` in the locations defined by `$fish_function_path` and loads
+the function lazily if found.
+
+This is the preferred way over monolithically defining all functions in a
+startup script.
+
+### Helper
+```text
+functions # list al functions
+functions foo # describe function 'foo'
+functions -e foo # erase function 'foo'
+
+funced foo # edit function 'foo'
+ # '-e vim' to edit in vim
+```
+
+## Prompt
+The prompt is defined by the output of the `fish_prompt` function.
+```text
+function fish_prompt
+ set -l cmd_ret
+ echo "> "(pwd) $cmd_ret" "
+end
+```
+> Use `set_color` to manipulate terminal colors.
+
+
+## Useful Builtins
+```text
+# history
+history search <str> # search history for <str>
+history merge # merge histories from fish sessions
+
+# list
+count $var # count elements in list
+
+# string
+string split SEP STRING
+```
+
+## Keymaps
+```text
Shift-Tab ........... tab-completion with search
Alt-Up / Alt-Down ... search history with token under the cursor
Alt-l ............... list content of dir under cursor
Alt-p ............... append '2>&1 | less;' to current cmdline
```
-## debug
-```markdown
+## Debug
+```text
status print-stack-trace .. prints function stacktrace (can be used in scripts)
breakpoint ................ halt script execution and gives shell (C-d | exit
to continue)