Mercurial > dotfiles
comparison .shell.d/99.mcfly.zsh @ 485:e4d4cd0d120e
zsh: start using mcfly for ^R history search
This is a modified version of mcfly.zsh from upstream
422557e1ba48c33c5753262bd294bf3e92a40476. I then expect to install
mcfly using cargo.
| author | Augie Fackler <raf@durin42.com> |
|---|---|
| date | Tue, 30 Jun 2020 10:37:13 -0400 |
| parents | |
| children | 4b2472372fad |
comparison
equal
deleted
inserted
replaced
| 484:c85072e620a8 | 485:e4d4cd0d120e |
|---|---|
| 1 #!/bin/zsh | |
| 2 | |
| 3 # Ensure stdin is a tty | |
| 4 [[ -t 0 ]] || return | |
| 5 | |
| 6 # Make sure mcfly is installed | |
| 7 if ! which mcfly > /dev/null ; then | |
| 8 echo nope | |
| 9 fi | |
| 10 | |
| 11 # Avoid loading this file more than once | |
| 12 if [[ "$__MCFLY_LOADED" == "loaded" ]]; then | |
| 13 return 0 | |
| 14 fi | |
| 15 __MCFLY_LOADED="loaded" | |
| 16 | |
| 17 emulate -L zsh | |
| 18 | |
| 19 # Ensure HISTFILE exists. | |
| 20 export HISTFILE="${HISTFILE:-$HOME/.zsh_history}" | |
| 21 if [[ ! -r "${HISTFILE}" ]]; then | |
| 22 echo "McFly: ${HISTFILE} does not exist or is not readable. Please fix this or set HISTFILE to something else before using McFly." | |
| 23 return 1 | |
| 24 fi | |
| 25 | |
| 26 # MCFLY_SESSION_ID is used by McFly internally to keep track of the commands from a particular terminal session. | |
| 27 export MCFLY_SESSION_ID=$(dd if=/dev/urandom bs=256 count=1 2> /dev/null | env LC_ALL=C tr -dc 'a-zA-Z0-9' | head -c 24) | |
| 28 | |
| 29 # Find the binary | |
| 30 MCFLY_PATH=${MCFLY_PATH:-$(which mcfly)} | |
| 31 | |
| 32 # Required for commented out mcfly search commands to work. | |
| 33 setopt interactive_comments # allow comments in interactive shells (like Bash does) | |
| 34 | |
| 35 # McFly's temporary, per-session history file. | |
| 36 if [[ ! -f "${MCFLY_HISTORY}" ]]; then | |
| 37 export MCFLY_HISTORY=$(mktemp -t mcfly.XXXXXXXX) | |
| 38 fi | |
| 39 | |
| 40 # Setup a function to be used by $PROMPT_COMMAND. | |
| 41 function mcfly_prompt_command { | |
| 42 local exit_code=$? # Record exit status of previous command. | |
| 43 | |
| 44 # Populate McFly's temporary, per-session history file from recent commands in the shell's primary HISTFILE. | |
| 45 if [[ ! -f "${MCFLY_HISTORY}" ]]; then | |
| 46 export MCFLY_HISTORY=$(mktemp -t mcfly.XXXXXXXX) | |
| 47 tail -n100 "${HISTFILE}" >| ${MCFLY_HISTORY} | |
| 48 fi | |
| 49 | |
| 50 # Write history to $MCFLY_HISTORY. | |
| 51 fc -W "${MCFLY_HISTORY}" | |
| 52 | |
| 53 # Run mcfly with the saved code. It fill find the text of the last command in $MCFLY_HISTORY and save it to the database. | |
| 54 [ -n "$MCFLY_DEBUG" ] && echo "mcfly.zsh: Run mcfly add --exit ${exit_code}" | |
| 55 $MCFLY_PATH add --exit ${exit_code} | |
| 56 return ${exit_code} # Restore the original exit code by returning it. | |
| 57 } | |
| 58 precmd_functions+=(mcfly_prompt_command) | |
| 59 | |
| 60 # Cleanup $MCFLY_HISTORY tmp files on exit. | |
| 61 exit_logger() { | |
| 62 [ -n "$MCFLY_DEBUG" ] && echo "mcfly.zsh: Exiting and removing $MCFLY_HISTORY" | |
| 63 rm -f $MCFLY_HISTORY | |
| 64 } | |
| 65 zshexit_functions+=(exit_logger) | |
| 66 | |
| 67 # If this is an interactive shell, take ownership of ctrl-r. | |
| 68 if [[ $- =~ .*i.* ]]; then | |
| 69 mcfly-history-widget() { | |
| 70 () { | |
| 71 echoti rmkx | |
| 72 exec </dev/tty | |
| 73 local mcfly_output=$(mktemp -t mcfly.output.XXXXXXXX) | |
| 74 $MCFLY_PATH search -o "${mcfly_output}" "${LBUFFER}" | |
| 75 local mode=$(sed -n 1p $mcfly_output) | |
| 76 local selected=$(sed 1d $mcfly_output) | |
| 77 rm -f $mcfly_output | |
| 78 echoti smkx | |
| 79 if [[ -n $selected ]]; then | |
| 80 RBUFFER="" | |
| 81 LBUFFER="${selected}" | |
| 82 fi | |
| 83 if [[ "${mode}" == "run" ]]; then | |
| 84 zle accept-line | |
| 85 fi | |
| 86 zle redisplay | |
| 87 } | |
| 88 } | |
| 89 zle -N mcfly-history-widget | |
| 90 bindkey '^R' mcfly-history-widget | |
| 91 fi |
