diff --git a/modules/README.md b/modules/README.md index 551d614..f36f71c 100644 --- a/modules/README.md +++ b/modules/README.md @@ -61,8 +61,7 @@ An extensive example of a wrapper for docker operations, with nushell completion ## filesystem -- [cdpath](./filesystem/cdpath.nu) - ??? -- [up](./filesystem/up.nu) - Cd up `X` times +- [bm](./filesystem/bm.nu) - A Simple bookmarking module. It uses `XGD_DATA_HOME` to save bookmarks. ## formats Examples of input/output formatters: diff --git a/modules/filesystem/bm.nu b/modules/filesystem/bm.nu new file mode 100644 index 0000000..87ea340 --- /dev/null +++ b/modules/filesystem/bm.nu @@ -0,0 +1,117 @@ +# simple bookmark module + +# Prints general information about bm. +export def main [] { + print -n (help bm) + + print ( + [ + $"(ansi green)Environment(ansi reset):" + $" (ansi cyan)BM_PATH(ansi reset) - path to save bookmarks to with ('add' | nu-highlight). Alternatively searches for (ansi cyan)XDG_DATA_HOME(ansi reset) or (ansi cyan)~/.local/share/(ansi reset)" + ] | + str join "\n" | + nu-highlight + ) +} + +# List all bookmarked paths +export def list [] { + let bm_path = (get_path) + + if (not ($bm_path | path exists)) { + [] | save $bm_path + } + open ($bm_path) +} + +def get_path [] { + $env.BM_PATH? | + default ( + $env.XDG_DATA_HOME? | + default ( + $env.HOME | path join ".local" "share" | + default ( + $env.USERPROFILE? | path join "bm" + ) + ) + ) | + if (not ($in | path exists)) { + mkdir $in + $in + } | + path join "bookmarks.nuon" + ) +} + +def save_path [] { + $in | + update path { str replace $env.HOME '~' } | + save -f (get_path) +} + +# Reset the bookmarks +export def reset [] { + list | + where name == "prev" | + save -f (get_path) +} + +# Add a new bookmark with an optional name +export def add [ + pth: path # Path to bookmark to. + name?: string # Optional name to give to it + ] { + if (($pth | path type) == "dir") and ($pth | path exists) { + list | + append {name: $name, path: $pth} | + save_path + } +} + +# remove one or more bookmarks +export def remove [] { + let rm_these = ( + list | + where name != "prev" | + input list -m + ) + + list | where {|it| + not $it in $rm_these + } | + print + +} + +def marks [] { + list | each {|it| + { + value: $it.path, + description: $it.name + } + } +} + +# Goto your bookmark +export def-env goto [ + pth: path@marks # Path to "go to" + ] { + let prev = $env.PWD + cd $pth + change_prev $prev +} + +# Experimental use of `input` instead of completion +export def-env goto_alternative [] { + let prev = $env.PWD + list | input list -f | cd $in.path + change_prev $prev +} + +def change_prev [new_path: path] { + ( list | + where name != "prev" + ) | + append {name: prev, path: $new_path} | + save_path +}