diff options
author | Vikas Kushwaha <dev@vikas.rocks> | 2024-11-21 13:30:52 +0530 |
---|---|---|
committer | Vikas Kushwaha <dev@vikas.rocks> | 2024-11-21 13:30:52 +0530 |
commit | 5c916d69d457101326803eb076a746060e3618cf (patch) | |
tree | d6fce3256eede1c1bf78fb6a1be75b9cc4b84cee /.config/zsh/command-tools.zsh |
Moved from github
Diffstat (limited to '.config/zsh/command-tools.zsh')
-rw-r--r-- | .config/zsh/command-tools.zsh | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/.config/zsh/command-tools.zsh b/.config/zsh/command-tools.zsh new file mode 100644 index 0000000..20126cb --- /dev/null +++ b/.config/zsh/command-tools.zsh @@ -0,0 +1,61 @@ +whereis_alias() { + location="$(zsh -xic exit 2>&1 | sed -E "/alias[ '$]*$1=/!d" | + fzf --exit-0 --select-1 --ansi --header-first --header='Select alias location' | + sed -n "s|^\+\(/.*:[0-9]*\)>.*$|\1|p")" + + if [ -z "$location" ]; then + echo "$0: '$1' not found in zsh debug log" >&2; return 1 + elif [ "$location" != "${location#*shortcutrc}" ]; then + awk "/^$1/ {print FILENAME\":\"NR}" ~/.config/shell/bm-{files,dirs} + else + echo "$location" + fi +} + +edit-command() { + [ -z "$1" ] && echo "USAGE: $0 <command>" >&2 && return 2 + cmd="$1" + cmdtype=$(whence -w "$cmd" | cut -d: -f2 | tr -d ' ') + + case "$cmdtype" in + alias) + query="alias ${cmd}=" + location="$(whereis_alias "$cmd")" || return + file="${location%%:*}" + line="${location##*:}" + [ "$file" != "${file#*/bm-}" ] && query="^$cmd" + ;; + function) + query="^\s*${cmd}\s*()" + file=$(whence -v "$cmd" | awk '{print $NF}') + ;; + command) + file=$(whence -ps "$cmd" | awk -F' -> ' '{print $NF}') + case "$(file --mime-type --brief "$file")" in + text/*) $EDITOR "$file" ;; + *) echo "$0: not a text file: $file" >&2; return 2 ;; + esac + return + ;; + builtin) echo "$0: $cmd is a builtin command" >&2; return 2 ;; + reserved) echo "$0: $cmd is a reserved command" >&2; return 2 ;; + none) echo "$0: $cmd not found" >&2; return 2 ;; + *) echo "$0: unknown command type: $cmdtype" >&2; return 2 ;; + esac + + if [ -n "$query" ]; then + $EDITOR +${line:-1} +/"$query" "$file" + else + $EDITOR "$file" + fi +} + +_edit-command() { + [ -z "$BUFFER" ] && return 2 + cmd=(${=BUFFER}); cmd="${cmd[1]}" + zle push-line + BUFFER="edit-command $cmd" + zle accept-line +} +zle -N edit-command _edit-command +bindkey '^[e' edit-command |