summaryrefslogtreecommitdiff
path: root/.config/zsh/command-tools.zsh
diff options
context:
space:
mode:
authorVikas Kushwaha <dev@vikas.rocks>2024-11-21 13:30:52 +0530
committerVikas Kushwaha <dev@vikas.rocks>2024-11-21 13:30:52 +0530
commit5c916d69d457101326803eb076a746060e3618cf (patch)
treed6fce3256eede1c1bf78fb6a1be75b9cc4b84cee /.config/zsh/command-tools.zsh
Moved from github
Diffstat (limited to '.config/zsh/command-tools.zsh')
-rw-r--r--.config/zsh/command-tools.zsh61
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