#!/bin/sh # # edit_textbuf # # Grab the current text buffer, and open it in a editor window, when # finshed replace the contents of the original text buffer. # ### # # Orig Author: Ben Collerson {benc[at]bur[dot]st} 24 Oct 2004 # Fixes by: Shreevatsa R 28 Dec 2006 # Modified by: Anthony Thyssen 10 Nov 2010 # # CAVAT: # # The script will fail if a specific text buffer is not actually active, # essentually you may get and edit the last text buffer, but it may not # paste back into place, or if during edit you switch text buffers in the # same application it may replace the test in a different text buffer! # # INSTALLATION: # # Software Requirements # "xprop" find the actualy current window # "xte" from xautomation for XEvent injection ALT: "xdotool" # "xwit" controlling client focus ALT: "wmctrl" "xdotool" # "xsel" X selection handling ALT: "xselection" # # Other than that you need to set the "editor" below to something that # launches a "X Window Editor", see below for examples. # # Then bind this script with some specific key sequence, typically via # the window manger being used. # # For fluxbox/bbkeys use something like this # # KeyToGrab(v), WithModifier(Control+Mod1), WithAction(ExecCommand), # DoThis(edit_textbuffer) # # For openbox somethng like this # # # # # edit_textbuf # # # #### PROGNAME=`type $0 | awk '{print $3}'` # search for executable on path PROGNAME=`basename $PROGNAME` # base name of program # -------------------------------------------------------------------------- # User Configuration Section # The prefered X Window Editor to use... editor="xterm -g 80x24 -name $PROGNAME -n $PROGNAME -T $PROGNAME \ -e ${VISUAL:=vi}" # Alternative suggestions. # editor="/bin/gvim -f" # editor="/bin/emacs" # editor="/usr/bin/emacsclient -a emacs" # Note the editor must not fork (which is why you need: gvim -f). # When the editor finished the saved text is returned to the textbuffer. # # -------------------------------------------------------------------------- # Get the current windows information winid=`xprop -root _NET_ACTIVE_WINDOW | sed 's/.* //'` wintitle=`xprop -id $winid WM_CLASS | sed 's/.*= "//; s/", .*//'` # This script works by actually simulating the keystrokes that programs # use for Select-All, Copy, and Paste. # # Different programs use different ones; so we use $wintitle to decide # what to do. The common browsers (Firefox, Mozilla, Konqueror, Opera) # seem to only differ in what they use for Select-All; so the rest of # the functions are constant functions here. Write your own functions # below if the ones here don't apply to your programs. xte_selectall() { case "$wintitle" in Navagator) echo ' | usleep 50000 | keydown Alt_L | key a | keyup Alt_L ' | sed -n '/^ *|/!d; s/^ *|//; s/^ //; p' | xte # xdotool windowfocus -sync window=$1 alt+a ;; *) echo ' | usleep 50000 | keydown Control_L | key a | keyup Control_L ' | sed -n '/^ *|/!d; s/^ *|//; s/^ //; p' | xte # xdotool windowfocus -sync window=$1 ctrl+l ;; esac } xte_copy() { echo ' | usleep 50000 | keydown Control_L | key c | keyup Control_L ' | sed -n '/^ *|/!d; s/^ *|//; s/^ //; p' | xte # xdotool windowfocus -sync window=$1 ctrl+l } xte_paste() { echo ' | usleep 50000 | keydown Control_L | key v | keyup Control_L ' | sed -n '/^ *|/!d; s/^ *|//; s/^ //; p' | xte # xdotool windowfocus -sync window=$1 ctrl+v } xte_home() { echo ' | usleep 50000 | keydown Control_L | key Home | keyup Control_L ' | sed -n '/^ *|/!d; s/^ *|//; s/^ //; p' | xte # xdotool windowfocus -sync window=$1 ctrl+Home } # --------------------------------------------------------------- # Main Routine # Setup temporary file umask 77 tmp=`mktemp "${TMPDIR:-/tmp}/$PROGNAME.XXXXXXXXXX"` || { echo >&2 "$PROGNAME: Unable to create temporary file"; exit 10;} trap 'rm -f "$tmp"' 0 trap 'exit 2' 1 2 3 15 # copy text using application keyboard short-cuts xte_selectall $winid xte_copy $winid xte_home $winid xsel -b -o > "$tmp" # xselection CLIPBOARD > "$tmp" # xclip -selection clipboard -o > "$tmp" # invoke the editor, wait for it to finish $editor "$tmp" # applications generally use the clipboard for paste! xsel -b -i < "$tmp" # xselection CLIPBOARD - < "$tmp" # some applications use the primary selection # xselection PRIMARY - < "$tmp" # xsel -p -i < "$tmp" # activates the original window # Not needed if xdotool is used above xwit -focus -id $winid # wmctrl -ia $winid # paste text using application keyboard short-cuts xte_selectall $winid xte_paste $winid xte_home $winid # finished - auto clean up # -------------------------------------------------------------------