From 030dfdf80134bfec968809da67ada9c8248dada2 Mon Sep 17 00:00:00 2001 From: Xavier Logerais Date: Sun, 10 Feb 2019 18:12:22 +0100 Subject: [PATCH] Added support for mcfly (https://github.com/cantino/mcfly) --- rc.d/mcfly.bash | 60 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 rc.d/mcfly.bash diff --git a/rc.d/mcfly.bash b/rc.d/mcfly.bash new file mode 100644 index 0000000..b596d8d --- /dev/null +++ b/rc.d/mcfly.bash @@ -0,0 +1,60 @@ +#!/bin/bash + +if ( ! which mcfly &> /dev/null ); then return; fi + +# Avoid loading this file more than once +if [[ "$__MCFLY_LOADED" == "loaded" ]]; then + return 0 +fi + +__MCFLY_LOADED="loaded" +export MCFLY_SESSION_ID=$(cat /dev/urandom | env LC_ALL=C tr -dc 'a-zA-Z0-9' | fold -w 24 | head -n 1) +export MCFLY_HISTORY=$(mktemp -t mcfly.XXXX) +export HISTFILE="${HISTFILE:-$HOME/.bash_history}" + +if [[ -f "$HISTFILE" ]]; +then + tail -n100 "${HISTFILE}" >| ${MCFLY_HISTORY} +else + printf "Welcome to McFly\n" >| ${MCFLY_HISTORY} +fi + +# Ignore commands with a leading space +export HISTCONTROL="ignorespace" + +# Append new history items to .bash_history +shopt -s histappend + +# Setup a function to be used by $PROMPT_COMMAND. +function mcfly_prompt_command { + local exit_code=$? # Record exit status of previous command. + history -a ${MCFLY_HISTORY} # Append history to $MCFLY_HISTORY. + # Run mcfly with the saved code. It will: + # * append commands to $HISTFILE, (~/.bash_history by default) + # for backwards compatibility and to load in new terminal sessions; + # * find the text of the last command in $MCFLY_HISTORY and save it to the database. + mcfly add --exit ${exit_code} --append-to-histfile + # Clear the in-memory history and reload it from $MCFLY_HISTORY + # (to remove instances of '#mcfly: ' from the local session history). + history -cr ${MCFLY_HISTORY} + return ${exit_code} # Restore the original exit code by returning it. +} + +# Set $PROMPT_COMMAND run mcfly_prompt_command and then any existing $PROMPT_COMMAND. +PROMPT_COMMAND="mcfly_prompt_command;$PROMPT_COMMAND" + +# If this is an interactive shell, take ownership of ctrl-r. +# The logic here is: +# 1. Jump to the beginning of the edit buffer, add 'mcfly: ', and comment out the current line. We comment out the line +# to ensure that all possible special characters, including backticks, are ignored. This commented out line will +# end up as the most recent entry in the $MCFLY_HISTORY file. +# 2. Type "mcfly search" and then run the command. McFly will pull the last line from the $MCFLY_HISTORY file, +# which should be the commented-out search from step #1. It will then remove that line from the history file and +# render the search UI pre-filled with it. +if [[ $- =~ .*i.* ]]; then + if set -o | grep "vi " | grep -q on; then + bind "'\C-r': '\e0i#mcfly: \e\C-j mcfly search\C-j'" + else + bind "'\C-r': '\C-amcfly: \e# mcfly search\C-j'" + fi +fi