aboutsummaryrefslogtreecommitdiff
path: root/dot_config/fish/functions
diff options
context:
space:
mode:
Diffstat (limited to 'dot_config/fish/functions')
-rw-r--r--dot_config/fish/functions/fish_prompt.fish10
-rw-r--r--dot_config/fish/functions/lfcd.fish18
-rw-r--r--dot_config/fish/functions/z.fish76
-rw-r--r--dot_config/fish/functions/zi.fish17
4 files changed, 121 insertions, 0 deletions
diff --git a/dot_config/fish/functions/fish_prompt.fish b/dot_config/fish/functions/fish_prompt.fish
new file mode 100644
index 0000000..415f452
--- /dev/null
+++ b/dot_config/fish/functions/fish_prompt.fish
@@ -0,0 +1,10 @@
+function fish_prompt
+ set -l last_status $status
+ # Prompt status only if it's not 0
+ set -l stat
+ if test $last_status -ne 0
+ set stat (set_color red)" [$last_status] "(set_color normal)
+ end
+
+ string join '' -- (set_color green) (prompt_pwd -D 50) (set_color normal) $stat '> '
+end
diff --git a/dot_config/fish/functions/lfcd.fish b/dot_config/fish/functions/lfcd.fish
new file mode 100644
index 0000000..9007021
--- /dev/null
+++ b/dot_config/fish/functions/lfcd.fish
@@ -0,0 +1,18 @@
+# Change working dir in fish to last dir in lf on exit (adapted from ranger).
+#
+# You may put this file to a directory in $fish_function_path variable:
+#
+# mkdir -p ~/.config/fish/functions
+# ln -s "/path/to/lfcd.fish" ~/.config/fish/functions
+#
+# You may also like to assign a key (Ctrl-O) to this command:
+#
+# bind \co 'set old_tty (stty -g); stty sane; lfcd; stty $old_tty; commandline -f repaint'
+#
+# You may put this in a function called fish_user_key_bindings.
+
+function lfcd --wraps="lf" --description="lf - Terminal file manager (changing directory on exit)"
+ # `command` is needed in case `lfcd` is aliased to `lf`.
+ # Quotes will cause `cd` to not change directory if `lf` prints nothing to stdout due to an error.
+ cd "$(command lf -print-last-dir $argv)"
+end
diff --git a/dot_config/fish/functions/z.fish b/dot_config/fish/functions/z.fish
new file mode 100644
index 0000000..6b1d535
--- /dev/null
+++ b/dot_config/fish/functions/z.fish
@@ -0,0 +1,76 @@
+# =============================================================================
+#
+# Utility functions for zoxide.
+#
+
+# pwd based on the value of _ZO_RESOLVE_SYMLINKS.
+function __zoxide_pwd
+ builtin pwd -L
+end
+
+# A copy of fish's internal cd function. This makes it possible to use
+# `alias cd=z` without causing an infinite loop.
+if ! builtin functions --query __zoxide_cd_internal
+ string replace --regex -- '^function cd\s' 'function __zoxide_cd_internal ' <$__fish_data_dir/functions/cd.fish | source
+end
+
+# cd + custom logic based on the value of _ZO_ECHO.
+function __zoxide_cd
+ if set -q __zoxide_loop
+ builtin echo "zoxide: infinite loop detected"
+ builtin echo "Avoid aliasing `cd` to `z` directly, use `zoxide init --cmd=cd fish` instead"
+ return 1
+ end
+ __zoxide_loop=1 __zoxide_cd_internal $argv
+end
+
+# =============================================================================
+#
+# Hook configuration for zoxide.
+#
+
+# Initialize hook to add new entries to the database.
+function __zoxide_hook --on-variable PWD
+ test -z "$fish_private_mode"
+ and command zoxide add -- (__zoxide_pwd)
+end
+
+# =============================================================================
+#
+# When using zoxide with --no-cmd, alias these internal functions as desired.
+#
+
+# Jump to a directory using only keywords.
+function z
+ set -l argc (builtin count $argv)
+ if test $argc -eq 0
+ __zoxide_cd $HOME
+ else if test "$argv" = -
+ __zoxide_cd -
+ else if test $argc -eq 1 -a -d $argv[1]
+ __zoxide_cd $argv[1]
+ else if test $argc -eq 2 -a $argv[1] = --
+ __zoxide_cd -- $argv[2]
+ else
+ set -l result (command zoxide query --exclude (__zoxide_pwd) -- $argv)
+ and __zoxide_cd $result
+ end
+end
+
+# Completions.
+function __zoxide_z_complete
+ set -l tokens (builtin commandline --current-process --tokenize)
+ set -l curr_tokens (builtin commandline --cut-at-cursor --current-process --tokenize)
+
+ if test (builtin count $tokens) -le 2 -a (builtin count $curr_tokens) -eq 1
+ # If there are < 2 arguments, use `cd` completions.
+ complete --do-complete "'' "(builtin commandline --cut-at-cursor --current-token) | string match --regex -- '.*/$'
+ else if test (builtin count $tokens) -eq (builtin count $curr_tokens)
+ # If the last argument is empty, use interactive selection.
+ set -l query $tokens[2..-1]
+ set -l result (command zoxide query --exclude (__zoxide_pwd) --interactive -- $query)
+ and __zoxide_cd $result
+ and builtin commandline --function cancel-commandline repaint
+ end
+end
+complete --command __zoxide_z --no-files --arguments '(__zoxide_z_complete)'
diff --git a/dot_config/fish/functions/zi.fish b/dot_config/fish/functions/zi.fish
new file mode 100644
index 0000000..c529662
--- /dev/null
+++ b/dot_config/fish/functions/zi.fish
@@ -0,0 +1,17 @@
+if ! builtin functions --query __zoxide_cd_internal
+ string replace --regex -- '^function cd\s' 'function __zoxide_cd_internal ' <$__fish_data_dir/functions/cd.fish | source
+end
+function __zoxide_cd
+ if set -q __zoxide_loop
+ builtin echo "zoxide: infinite loop detected"
+ builtin echo "Avoid aliasing `cd` to `z` directly, use `zoxide init --cmd=cd fish` instead"
+ return 1
+ end
+ __zoxide_loop=1 __zoxide_cd_internal $argv
+end
+
+# Jump to a directory using interactive search.
+function zi
+ set -l result (command zoxide query --interactive -- $argv)
+ and __zoxide_cd $result
+end