diff --git a/functions/_fish_mkdir_p.fish b/functions/_fish_mkdir_p.fish new file mode 100644 index 0000000..eab7375 --- /dev/null +++ b/functions/_fish_mkdir_p.fish @@ -0,0 +1,62 @@ +# Copyright (C) 2026 Rootiest +# SPDX-License-Identifier: AGPL-3.0-or-later + +# mkdir -p with configurable output. +# +# Flags: +# --path / -p (default) Print "Created: ~/full/path/" on one line +# --tree / -t Tree view: dimmed existing anchor + cyan new dirs +# --silent / -s No output +# +# Usage: _fish_mkdir_p [--path|--tree|--silent] +function _fish_mkdir_p --description 'mkdir -p with configurable verbose output' + set -l mode path + set -l target + + for _arg in $argv + switch $_arg + case -s --silent + set mode silent + case -t --tree + set mode tree + case -p --path + set mode path + case '*' + set target $_arg + end + end + + test -n "$target"; or return 1 + test -d "$target"; and return 0 + + # Walk up to find deepest existing ancestor; collect dirs to create (shallowest first). + set -l to_create + set -l cursor $target + while not test -d $cursor + set -p to_create $cursor + set -l up (dirname $cursor) + test "$up" = "$cursor"; and break # filesystem root guard + set cursor $up + end + + mkdir -p $target; or return $status + test $mode = silent; and return 0 + + if test $mode = path + set -l display (string replace -- "$HOME" "~" $target)"/" + echo (set_color --bold cyan)"Created: "(set_color cyan)"$display"(set_color normal) + return 0 + end + + # Tree mode: dimmed existing anchor, then cyan new dirs. + echo (set_color --bold cyan)"Created:"(set_color normal) + set -l anchor (string replace -- "$HOME" "~" $cursor)"/" + echo (set_color brblack)" $anchor"(set_color normal) + set -l i 1 + while test $i -le (count $to_create) + set -l spaces (string repeat -n (math "($i - 1) * 4") " ") + set -l name (basename $to_create[$i])"/" + echo (set_color cyan)" $spaces└── $name"(set_color normal) + set i (math $i + 1) + end +end diff --git a/functions/poke.fish b/functions/poke.fish index 2a5a5f0..76f10b7 100644 --- a/functions/poke.fish +++ b/functions/poke.fish @@ -8,10 +8,7 @@ function poke --description 'touch with automatic parent directory creation' end for _path in $argv set -l _dir (dirname $_path) - if not test -d $_dir - mkdir -p $_dir - and echo (set_color --bold cyan)"Created: "(set_color cyan)"$_dir"(set_color normal) - end + _fish_mkdir_p --tree $_dir touch $_path end end