init
This commit is contained in:
57
.zsh/plugin/cdselect.zsh
Normal file
57
.zsh/plugin/cdselect.zsh
Normal file
@@ -0,0 +1,57 @@
|
||||
autoload -Uz chpwd_recent_dirs cdr add-zsh-hook
|
||||
add-zsh-hook chpwd chpwd_recent_dirs
|
||||
zstyle ':chpwd:*' recent-dirs-max 50
|
||||
|
||||
cdselect() {
|
||||
local dirs=("${(@f)$(cdr -l 2>/dev/null | sed 's/^[0-9]* *//')}")
|
||||
[[ ${#dirs} -eq 0 ]] && return
|
||||
local query="" cursor=1 selected=""
|
||||
while true; do
|
||||
local filtered=()
|
||||
for d in "${dirs[@]}"; do
|
||||
local match=1
|
||||
for word in ${(s: :)query}; do
|
||||
[[ "${d:l}" != *"${word:l}"* ]] && match=0 && break
|
||||
done
|
||||
[[ $match -eq 1 ]] && filtered+=("$d")
|
||||
done
|
||||
# sort by path length (shortest first)
|
||||
local sorted=()
|
||||
for f in "${filtered[@]}"; do sorted+=("${#f} $f"); done
|
||||
sorted=(${(n)sorted})
|
||||
filtered=()
|
||||
for s in "${sorted[@]}"; do filtered+=("${s#* }"); done
|
||||
[[ $cursor -gt ${#filtered} ]] && cursor=${#filtered}
|
||||
[[ $cursor -lt 1 ]] && cursor=1
|
||||
clear
|
||||
echo "cd> $query"
|
||||
local i=1
|
||||
for d in "${filtered[@]}"; do
|
||||
if [[ $i -eq $cursor ]]; then
|
||||
printf "\e[7m %s\e[0m\n" "$d"
|
||||
else
|
||||
printf " %s\n" "$d"
|
||||
fi
|
||||
((i++))
|
||||
[[ $i -gt 20 ]] && break
|
||||
done
|
||||
read -k1 key 2>/dev/null
|
||||
case "$key" in
|
||||
$'\n'|$'\r') [[ ${#filtered} -gt 0 ]] && selected="${filtered[$cursor]}"; break ;;
|
||||
$'\x0e') ((cursor++)) ;; # C-n
|
||||
$'\x10') ((cursor--)) ;; # C-p
|
||||
$'\x7f'|$'\b') query="${query%?}"; cursor=1 ;;
|
||||
$'\x1b') break ;;
|
||||
*) query+="$key"; cursor=1 ;;
|
||||
esac
|
||||
done
|
||||
clear
|
||||
if [[ -n "$selected" ]]; then
|
||||
selected="${selected/#\~/$HOME}"
|
||||
selected="${selected//\\ / }"
|
||||
cd "$selected"
|
||||
fi
|
||||
zle reset-prompt
|
||||
}
|
||||
zle -N cdselect
|
||||
bindkey '^j' cdselect
|
||||
3
.zsh/plugin/cdup.zsh
Normal file
3
.zsh/plugin/cdup.zsh
Normal file
@@ -0,0 +1,3 @@
|
||||
cdup() { [[ -z "$BUFFER" ]] && { cd ..; zle reset-prompt } || zle self-insert 'k' }
|
||||
zle -N cdup
|
||||
bindkey '^k' cdup
|
||||
14
.zsh/plugin/clipcopy.zsh
Normal file
14
.zsh/plugin/clipcopy.zsh
Normal file
@@ -0,0 +1,14 @@
|
||||
# copy prompt buffer to clipboard
|
||||
# C-p C-p (chord)
|
||||
|
||||
clipcopy() {
|
||||
if [[ -n "$BUFFER" ]]; then
|
||||
case "$(uname)" in
|
||||
Darwin) echo -n "$BUFFER" | pbcopy ;;
|
||||
*) echo -n "$BUFFER" | xclip -sel c 2>/dev/null ;;
|
||||
esac
|
||||
zle -M "copied"
|
||||
fi
|
||||
}
|
||||
zle -N clipcopy
|
||||
bindkey '^p^p' clipcopy
|
||||
49
.zsh/plugin/fileselect.zsh
Normal file
49
.zsh/plugin/fileselect.zsh
Normal file
@@ -0,0 +1,49 @@
|
||||
# file select - search files and insert into prompt
|
||||
# C-f: open file selector
|
||||
|
||||
fileselect() {
|
||||
local files=("${(@f)$(find . -maxdepth 3 -not -path '*/\.git/*' -type f 2>/dev/null | sed 's|^\./||' | sort)}")
|
||||
[[ ${#files} -eq 0 ]] && return
|
||||
local query="" cursor=1 selected=""
|
||||
while true; do
|
||||
local filtered=()
|
||||
for f in "${files[@]}"; do
|
||||
local match=1
|
||||
for word in ${(s: :)query}; do
|
||||
[[ "${f:l}" != *"${word:l}"* ]] && match=0 && break
|
||||
done
|
||||
[[ $match -eq 1 ]] && filtered+=("$f")
|
||||
done
|
||||
[[ $cursor -gt ${#filtered} ]] && cursor=${#filtered}
|
||||
[[ $cursor -lt 1 ]] && cursor=1
|
||||
clear
|
||||
echo "file> $query (${#filtered})"
|
||||
local i=1
|
||||
for f in "${filtered[@]}"; do
|
||||
if [[ $i -eq $cursor ]]; then
|
||||
printf "\e[7m %s\e[0m\n" "$f"
|
||||
else
|
||||
printf " %s\n" "$f"
|
||||
fi
|
||||
((i++))
|
||||
[[ $i -gt 20 ]] && break
|
||||
done
|
||||
read -k1 key 2>/dev/null
|
||||
case "$key" in
|
||||
$'\n'|$'\r') [[ ${#filtered} -gt 0 ]] && selected="${filtered[$cursor]}"; break ;;
|
||||
$'\x0e') ((cursor++)) ;; # C-n
|
||||
$'\x10') ((cursor--)) ;; # C-p
|
||||
$'\x7f'|$'\b') query="${query%?}"; cursor=1 ;;
|
||||
$'\x1b') break ;;
|
||||
*) query+="$key"; cursor=1 ;;
|
||||
esac
|
||||
done
|
||||
clear
|
||||
if [[ -n "$selected" ]]; then
|
||||
BUFFER+="$selected"
|
||||
CURSOR=${#BUFFER}
|
||||
fi
|
||||
zle reset-prompt
|
||||
}
|
||||
zle -N fileselect
|
||||
bindkey '^f' fileselect
|
||||
49
.zsh/plugin/histselect.zsh
Normal file
49
.zsh/plugin/histselect.zsh
Normal file
@@ -0,0 +1,49 @@
|
||||
# history select - search history and insert into prompt
|
||||
# C-r: open history selector, type to filter, C-n/C-p to move, Enter to insert
|
||||
|
||||
histselect() {
|
||||
local lines=("${(@f)$(fc -l -n -r 1 | awk '!seen[$0]++')}")
|
||||
[[ ${#lines} -eq 0 ]] && return
|
||||
local query="" cursor=1 selected=""
|
||||
while true; do
|
||||
local filtered=()
|
||||
for l in "${lines[@]}"; do
|
||||
local match=1
|
||||
for word in ${(s: :)query}; do
|
||||
[[ "${l:l}" != *"${word:l}"* ]] && match=0 && break
|
||||
done
|
||||
[[ $match -eq 1 ]] && filtered+=("$l")
|
||||
done
|
||||
[[ $cursor -gt ${#filtered} ]] && cursor=${#filtered}
|
||||
[[ $cursor -lt 1 ]] && cursor=1
|
||||
clear
|
||||
echo "hist> $query"
|
||||
local i=1
|
||||
for l in "${filtered[@]}"; do
|
||||
if [[ $i -eq $cursor ]]; then
|
||||
printf "\e[7m %s\e[0m\n" "$l"
|
||||
else
|
||||
printf " %s\n" "$l"
|
||||
fi
|
||||
((i++))
|
||||
[[ $i -gt 20 ]] && break
|
||||
done
|
||||
read -k1 key 2>/dev/null
|
||||
case "$key" in
|
||||
$'\n'|$'\r') [[ ${#filtered} -gt 0 ]] && selected="${filtered[$cursor]}"; break ;;
|
||||
$'\x0e') ((cursor++)) ;; # C-n
|
||||
$'\x10') ((cursor--)) ;; # C-p
|
||||
$'\x7f'|$'\b') query="${query%?}"; cursor=1 ;;
|
||||
$'\x1b') break ;;
|
||||
*) query+="$key"; cursor=1 ;;
|
||||
esac
|
||||
done
|
||||
clear
|
||||
if [[ -n "$selected" ]]; then
|
||||
BUFFER="$selected"
|
||||
CURSOR=${#BUFFER}
|
||||
fi
|
||||
zle reset-prompt
|
||||
}
|
||||
zle -N histselect
|
||||
bindkey '^r' histselect
|
||||
55
.zsh/plugin/powerline.zsh
Normal file
55
.zsh/plugin/powerline.zsh
Normal file
@@ -0,0 +1,55 @@
|
||||
# powerline prompt
|
||||
# requires: aifont (MesloLGS NF + ai/syui icons)
|
||||
|
||||
_has_aifont() {
|
||||
[[ -f "$HOME/Library/Fonts/aifont.ttf" ]] || [[ -f "$HOME/.local/share/fonts/aifont.ttf" ]]
|
||||
}
|
||||
|
||||
_powerline_git() {
|
||||
local branch=$(git symbolic-ref --short HEAD 2>/dev/null) || return
|
||||
local dirty=""
|
||||
[[ -n $(git status --porcelain 2>/dev/null) ]] && dirty="*"
|
||||
echo "${branch}${dirty}"
|
||||
}
|
||||
|
||||
_powerline_icon() {
|
||||
case "$USER" in
|
||||
syui) echo $'\ue002' ;;
|
||||
ai) echo $'\ue001' ;;
|
||||
*) echo "❯" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
_powerline_prompt() {
|
||||
local icon=$(_powerline_icon)
|
||||
local sep=$'\ue0b0'
|
||||
local dir="${PWD/#$HOME/~}"
|
||||
local git=$(_powerline_git)
|
||||
|
||||
local prompt=""
|
||||
if [[ -n "$icon" ]]; then
|
||||
prompt+="%F{yellow}%K{black} ${icon} %k%f"
|
||||
prompt+="%F{black}%K{234}${sep}%f"
|
||||
else
|
||||
prompt+="%F{234}${sep}%f"
|
||||
fi
|
||||
prompt+="%F{yellow}%K{234} $USER %k%f"
|
||||
prompt+="%F{234}%K{236}${sep}%f"
|
||||
prompt+="%F{white}%K{236} ${dir} %k%f"
|
||||
|
||||
if [[ -n "$git" ]]; then
|
||||
prompt+="%F{236}%K{234}${sep}%f"
|
||||
prompt+="%F{cyan}%K{234} ${git} %k%f"
|
||||
prompt+="%F{234}${sep}%f"
|
||||
else
|
||||
prompt+="%F{236}${sep}%f"
|
||||
fi
|
||||
prompt+="%k%f "
|
||||
|
||||
echo "$prompt"
|
||||
}
|
||||
|
||||
if _has_aifont; then
|
||||
setopt PROMPT_SUBST
|
||||
PROMPT='$(_powerline_prompt)'
|
||||
fi
|
||||
Reference in New Issue
Block a user