diff --git a/.vim/startup/map_vimrc b/.vim/startup/map_vimrc index 52369a2..9764eaa 100644 --- a/.vim/startup/map_vimrc +++ b/.vim/startup/map_vimrc @@ -70,7 +70,7 @@ endfunction noremap ss :call StripWhitespace() set hidden " 避免必须保存修改才可以跳转 buffer -" buffer +" buffer "nmap n :bnext "nmap p :bprev @@ -88,3 +88,12 @@ nmap :NERDTreeToggle nnoremap i :PlugInstall nnoremap u :PlugUpdate + +" fzf +nnoremap :GFiles +nnoremap f :Files +nnoremap C :Colors +nnoremap :Buffers +nnoremap fl :Lines +nnoremap ag :Ag! +nnoremap m :History diff --git a/zsh/fzf.zsh b/zsh/fzf.zsh new file mode 100644 index 0000000..563557d --- /dev/null +++ b/zsh/fzf.zsh @@ -0,0 +1,141 @@ +# fzf config +[ -f ~/.fzf.zsh ] && source ~/.fzf.zsh +# export FZF_DEFAULT_COMMAND='ag --hidden --ignore .git --ignore .idea -l -g ""' +export FZF_DEFAULT_COMMAND='fd --type f --hidden --exclude .git --exclude .idea ""' +#export FZF_DEFAULT_OPTS="--reverse --inline-info" +export FZF_DEFAULT_OPTS="--height 40% --layout=reverse --preview '(highlight -O ansi {} || cat {}) 2> /dev/null | head -500'" + +# fe [FUZZY PATTERN] - Open the selected file with the default editor +# - Bypass fuzzy finder if there's only one match (--select-1) +# - Exit if there's no match (--exit-0) +fe() { + local files + IFS=$'\n' files=($(fzf-tmux --query="$1" --multi --select-1 --exit-0)) + [[ -n "$files" ]] && ${EDITOR:-vim} "${files[@]}" +} + + +# Modified version where you can press +# - CTRL-O to open with `open` command, +# - CTRL-E or Enter key to open with the $EDITOR +fo() { + local out file key + IFS=$'\n' out=("$(fzf-tmux --query="$1" --exit-0 --expect=ctrl-o,ctrl-e)") + key=$(head -1 <<< "$out") + file=$(head -2 <<< "$out" | tail -1) + if [ -n "$file" ]; then + [ "$key" = ctrl-o ] && open "$file" || ${EDITOR:-vim} "$file" + fi +} + +# Use fd and fzf to get the args to a command. +# Works only with zsh +# Examples: +# f mv # To move files. You can write the destination after selecting the files. +# f 'echo Selected:' +# f 'echo Selected music:' --extention mp3 +# fm rm # To rm files in current directory +f() { + sels=( "${(@f)$(fd "${fd_default[@]}" "${@:2}"|fz)}" ) + test -n "$sels" && print -z -- "$1 ${sels[@]:q:q}" +} + +# Like f, but not recursive. +fm() f "$@" --max-depth 1 + +# Deps +alias fz="fzf-noempty --bind 'tab:toggle,shift-tab:toggle+beginning-of-line+kill-line,ctrl-j:toggle+beginning-of-line+kill-line,ctrl-t:top' --color=light -1 -m" +fzf-noempty () { + local in="$( /dev/null | fzf +m) && + cd "$dir" +} + +# fh - repeat history +fh() { + print -z $( ([ -n "$ZSH_NAME" ] && fc -l 1 || history) | fzf +s --tac | sed -r 's/ *[0-9]*\*? *//' | sed -r 's/\\/\\\\/g') +} + +# fkill - kill process +fkill() { + local pid + pid=$(ps -ef |grep -v ^root | sed 1d | fzf -m | awk '{print $2}') + + if [ "x$pid" != "x" ] + then + echo $pid | xargs kill -${1:-9} + fi +} + +# tm - create new tmux session, or switch to existing one. Works from within tmux too. (@bag-man) +# `tm` will allow you to select your tmux session via fzf. +# `tm irc` will attach to the irc session (if it exists), else it will create it. + +tm() { + [[ -n "$TMUX" ]] && change="switch-client" || change="attach-session" + if [ $1 ]; then + tmux $change -t "$1" 2>/dev/null || (tmux new-session -d -s $1 && tmux $change -t "$1"); return + fi + session=$(tmux list-sessions -F "#{session_name}" 2>/dev/null | fzf --exit-0) && tmux $change -t "$session" || echo "No sessions found." +} + +# fs [FUZZY PATTERN] - Select selected tmux session +# - Bypass fuzzy finder if there's only one match (--select-1) +# - Exit if there's no match (--exit-0) +fs() { + local session + session=$(tmux list-sessions -F "#{session_name}" | \ + fzf --query="$1" --select-1 --exit-0) && + tmux switch-client -t "$session" +} + +unalias z 2> /dev/null +z() { + [ $# -gt 0 ] && _z "$*" && return + cd "$(_z -l 2>&1 | fzf --height 40% --nth 2.. --reverse --inline-info +s --tac --query "${*##-* }" | sed 's/^[0-9,.]* *//')" +} + + +#alias lp="lpass show -c --password $(lpass ls | fzf | awk '{print $(NF)}' | sed 's/\]//g')" +gcbr() { + result=$(git branch -a --color=always | grep -v '/HEAD\s' | sort | + fzf --height 50% --border --ansi --tac --preview-window right:70% \ + --preview 'git log --oneline --graph --date=short --pretty="format:%C(auto)%cd %h%d %s" $(sed s/^..// <<< {} | cut -d" " -f1) | head -'$LINES | + sed 's/^..//' | cut -d' ' -f1) + + if [[ $result != "" ]]; then + if [[ $result == remotes/* ]]; then + git checkout --track $(echo $result | sed 's#remotes/##') + else + git checkout "$result" + fi + fi +} + +gfs() { + git -c color.status=always status --short | + fzf --height 50% --border --ansi --multi --ansi --nth 2..,.. \ + --preview '(git diff --color=always -- {-1} | sed 1,4d; cat {-1}) | head -500' | + cut -c4- | sed 's/.* -> //' +} + +