seen+=($fn 1)
     print $fn
 done | fzf -m | tr "\n" " " | read data
-tmux set-buffer "$data"
+tmux set-buffer "${data:- }"
 
--- /dev/null
+ #!/bin/sh
+
+tmux capture-pane -J
+tmp=`mktemp`
+trap "rm -f $tmp" HUP PIPE INT QUIT TERM EXIT
+tmux save-buffer $tmp
+tmux delete-buffer
+session_name="fzf-selector"
+tmux has-session -t $session_name 2>/dev/null && tmux kill-session -t $session_name || :
+
+case "$1" in
+find)
+    tmux new-session -d -s $session_name -c "$2" '
+        find . -path "*/.git" -prune -o \( -type f -o -type d -o -type l \) -print |
+        cut -c3- | fzf -m --preview="less -N -S {}" | read data
+        tmux set-buffer "${data:- }"
+    '
+    ;;
+buf-files)
+    tmux new-session -d -s $session_name -c "$2" "pe < $tmp"
+    ;;
+git-files)
+    tmux new-session -d -s $session_name -c "$2" '
+        git status --short | fzf -m | while read item ; do
+            item=$(echo $item | cut -w -f2-)
+            echo -n "$item "
+        done | read data
+        tmux set-buffer "${data:- }"
+    '
+    ;;
+git-branches)
+    tmux new-session -d -s $session_name -c "$2" '
+        { git branch ; git branch --remote } | fzf | read data
+        tmux set-buffer "${data:- }"
+    '
+    ;;
+git-commits)
+    tmux new-session -d -s $session_name -c "$2" '
+        git --no-pager log --oneline -n 20 | perl -ne "print \"@~\$n \$_\"; \$n++" |
+        fzf --reverse | cut -w -f1 | read data
+        tmux set-buffer "${data:- }"
+    '
+    ;;
+*)
+    echo unknown command
+    sleep 1
+    exit
+    ;;
+esac
+
+tmux set-option -t $session_name status off
+tmux attach-session -t $session_name
+tmux paste-buffer
+tmux delete-buffer
 
+++ /dev/null
-#!/bin/sh
-
-tmux has-session -t path-extractor && tmux kill-session -t path-extractor || :
-tmux new-session -d -s path-extractor -c "$1" "pe < /tmp/tmux-buffer ; tmux detach"
-tmux set-option -t path-extractor status off
-exec tmux attach-session -t path-extractor
 
     split-window 'vim -c "set listchars=" -c "match ExtraWhitespace //" /tmp/tmux-buffer'
 }
 
-bind-key o {
-    capture-pane -J
-    save-buffer /tmp/tmux-buffer
-    delete-buffer
-    display-popup -KE -w 100% -R "~/bin/tmux-path-extractor.sh '#{pane_current_path}'"
-    paste-buffer
-    delete-buffer
-}
-
-bind-key O {
-    display-popup -KE -w 100% -R "~/bin/tmux-git-extractor.sh '#{pane_current_path}'"
-    paste-buffer
-    delete-buffer
-}
+bind-key o display-menu \
+    find d "display-popup -KE -w 100% -R \"~/bin/tmux-fzf.sh find '#{pane_current_path}'\"" \
+    buf-files f "display-popup -KE -w 100% -R \"~/bin/tmux-fzf.sh buf-files '#{pane_current_path}'\"" \
+    git-files g "display-popup -KE -w 100% -R \"~/bin/tmux-fzf.sh git-files '#{pane_current_path}'\"" \
+    git-branches b "display-popup -KE -w 100% -R \"~/bin/tmux-fzf.sh git-branches '#{pane_current_path}'\"" \
+    git-commits c "display-popup -KE -w 100% -R \"~/bin/tmux-fzf.sh git-commits '#{pane_current_path}'\""
 
 bind-key Y {
     capture-pane -J -S - -E -
 
 # }}}
 
 # fzf {{{
-alias -g PE="| pe"
-
-export FZF_DEFAULT_OPTS="--color=16 --info=inline --preview='less -N -S {}'"
-
-_fzf_find() {
-    find . \( -path "*/\.git" -o -fstype devfs -o -fstype procfs \) -prune \
-        -o \( -type d $@ \) -print 2>/dev/null | cut -b3-
+export FZF_DEFAULT_OPTS="--color=16 --info=inline"
+cf() {
+    local dir=$(find ${1:-.} -path "*/\.git" -prune -o -type d -print |
+        fzf --height 40% --reverse --preview="tree -CN {}")
+    [[ -z "$dir" ]] || cd "$dir"
 }
-
-export FZF_CTRL_T_COMMAND="_fzf_find -o -type f -o -type l"
-export FZF_ALT_C_COMMAND=_fzf_find
-
-. ~/work/fzf/shell/key-bindings.zsh
 # }}}