From 731e98d56e9499b8df2b7b20c1a4533d949ec88b Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 28 Apr 2024 20:42:51 +0300 Subject: [PATCH] fish functions as derivation --- derivations/fish/fish-functions.nix | 12 +++ .../fish/fish-functions/completions/bd.fish | 18 ++++ .../fish/fish-functions/functions/bd.fish | 96 +++++++++++++++++++ .../fish-functions/functions/icat_auto.fish | 5 + .../fish/fish-functions/functions/up.fish | 12 +++ 5 files changed, 143 insertions(+) create mode 100644 derivations/fish/fish-functions.nix create mode 100644 derivations/fish/fish-functions/completions/bd.fish create mode 100644 derivations/fish/fish-functions/functions/bd.fish create mode 100644 derivations/fish/fish-functions/functions/icat_auto.fish create mode 100644 derivations/fish/fish-functions/functions/up.fish diff --git a/derivations/fish/fish-functions.nix b/derivations/fish/fish-functions.nix new file mode 100644 index 0000000..007ec3d --- /dev/null +++ b/derivations/fish/fish-functions.nix @@ -0,0 +1,12 @@ +{ stdenv, lib, buildFishPlugin }: + +buildFishPlugin rec { + pname = "my-fish-functions"; + version = "1.0.0"; + + src = ./fish-functions; # use local directory + + meta = with stdenv.lib; { + description = "My custom fish functions"; + }; +} diff --git a/derivations/fish/fish-functions/completions/bd.fish b/derivations/fish/fish-functions/completions/bd.fish new file mode 100644 index 0000000..2d1f205 --- /dev/null +++ b/derivations/fish/fish-functions/completions/bd.fish @@ -0,0 +1,18 @@ +#!/usr/bin/env fish +# -*- mode:fish; tab-width:4 -*- +# +# fish-completion for fish-bd +# https://github.com/0rax/fish-bd +# + +complete -c bd -s c --description "Classic mode : goes back to the first directory named as the string" +complete -c bd -s s --description "Seems mode : goes back to the first directory containing string" +complete -c bd -s i --description "Case insensitive move (implies seems mode)" +complete -c bd -s h -x --description "Display help and exit" +complete -c bd -A -f + +function __fish_bd_complete_dirs + printf (pwd | sed 's%/[^/]*$%/%; s/.$//; s|/|\\\n|g') +end + +complete -c bd -a '(__fish_bd_complete_dirs)' \ No newline at end of file diff --git a/derivations/fish/fish-functions/functions/bd.fish b/derivations/fish/fish-functions/functions/bd.fish new file mode 100644 index 0000000..d292b38 --- /dev/null +++ b/derivations/fish/fish-functions/functions/bd.fish @@ -0,0 +1,96 @@ +#!/usr/bin/env fish +# -*- mode:fish; tab-width:4 -*- +# +# fish-bd main & usage function +# https://github.com/0rax/bd-fish +# + +function bd + + set -l oldpwd (pwd) + set -l newpwd "" + set -l opts "$BD_OPT" + set -l args (getopt "csih" $argv) + + if [ $status -gt 0 ] + return 1 + end + set args (echo $args | sed 's/^\s//' | tr ' ' '\n') + + set -l i 1 + for arg in $args + switch $arg + case "-h" + printf "# fish-bd v1.3.3 (https://github.com/0rax/bd-fish) + +Description: + Quickly go back to a parent directory up in your current working directory tree. + Don't write 'cd ../../..' redundantly, use bd instead. + +Usage: + bd [option] + +Examples: + # You are in /home/user/my/path/is/very/long/ + # And you want to go back to 'path', simple type + > bd path + # or + > bd -s pa + # or + > bd -i Pat + # And you are now in /home/user/my/path/ + +Options: + -c + Classic mode : goes back to the first directory matching the pattern (default) + Set if default using (set -gx BD_OPT 'classic') + Default mode when BD_OPT or CLI options are specified + -s + Seems mode: goes back to the first directory starting with pattern + Set it as default using (set -gx BD_OPT 'sensitive') + -i + Case insensitive mode: same as seems mode without case sensitity + Set it as default using (set -gx BD_OPT 'insensitive') + -h Print this help and exit + +Note: + Fuzzy matching of a directory can be done with any mode using the built-in + fish-shell autocompletion. This allows you to enter any part of the path + and still match it.\n" + return 0 + case "-s" + set opts "sensitive" + case "-i" + set opts "insensitive" + case "-c" + set opts "classic" + case "--" + set i (math $i + 1) + break + end + set i (math $i + 1) + end + + if [ $i -gt (count $args) ] + cd .. + pwd + return 0 + end + + switch "$opts" + case "sensitive" + set newpwd (echo $oldpwd | sed 's|\(.*/'$args[$i]'[^/]*/\).*|\1|') + case "insensitive" + set newpwd (echo $oldpwd | perl -pe 's|(.*/'$args[$i]'[^/]*/).*|$1|i') + case '*' # classic + set newpwd (echo $oldpwd | sed 's|\(.*/'$args[$i]'/\).*|\1|') + end + + if [ "$newpwd" = "$oldpwd" ] + echo "No such occurence." >&2 + else + echo "$newpwd" + cd "$newpwd" + end + +end \ No newline at end of file diff --git a/derivations/fish/fish-functions/functions/icat_auto.fish b/derivations/fish/fish-functions/functions/icat_auto.fish new file mode 100644 index 0000000..fe4c57b --- /dev/null +++ b/derivations/fish/fish-functions/functions/icat_auto.fish @@ -0,0 +1,5 @@ +function icat_auto + set cols (math (tput cols) - 1) + set lines (math (tput lines) - 1) + kitty +kitten icat --place $cols"x"$lines"@0x0" $argv +end \ No newline at end of file diff --git a/derivations/fish/fish-functions/functions/up.fish b/derivations/fish/fish-functions/functions/up.fish new file mode 100644 index 0000000..c204cf2 --- /dev/null +++ b/derivations/fish/fish-functions/functions/up.fish @@ -0,0 +1,12 @@ +function up + if test -z "$argv" + cd .. + else + switch $argv + case '*' + for i in (seq $argv) + cd .. + end + end + end +end