summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2014-03-28 15:32:23 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2014-03-28 15:32:23 +0900
commit995d38020016ee1074a6d4ab2fa7f6ce29faf8ff (patch)
treeb0cc6926741ec5d01c9135148dc83eeb67efc0fd
parent2b346659a051d23d789314947b9796efca7b075f (diff)
parentae86cdf09a3cf4cf50ac86a337df23be10186d42 (diff)
Merge pull request #30 from junegunn/keybinding-tmux-split
Make CTRL-T use tmux split when possible
-rw-r--r--README.md6
-rwxr-xr-xinstall65
2 files changed, 51 insertions, 20 deletions
diff --git a/README.md b/README.md
index e830c29a..f2a2740b 100644
--- a/README.md
+++ b/README.md
@@ -212,6 +212,10 @@ The install script will setup the following key bindings.
- `CTRL-R` - Paste the selected command from history into the command line
- `ALT-C` - cd into the selected directory
+If you're on a tmux session, `CTRL-T` will launch fzf in a new split-window. You
+may disable this tmux integration by setting `FZF_TMUX` to 0, or change the
+height of the window with `FZF_TMUX_HEIGHT`.
+
The source code can be found in `~/.fzf.bash` and in `~/.fzf.zsh`.
Auto-completion
@@ -310,7 +314,7 @@ If you have set up fzf for Vim, `:FZF` command will be added.
Note that the environment variables `FZF_DEFAULT_COMMAND` and `FZF_DEFAULT_OPTS`
also apply here.
-If you're on a tmux session, `:FZF`, will launch fzf in a new split-window whose
+If you're on a tmux session, `:FZF` will launch fzf in a new split-window whose
height can be adjusted with `g:fzf_tmux_height` (default: 15). However, the bang
version (`:FZF!`) will always start in fullscreen.
diff --git a/install b/install
index b91d7ac0..a32d0661 100755
--- a/install
+++ b/install
@@ -95,12 +95,12 @@ EOF
if [ $key_bindings -eq 0 ]; then
if [ $shell = bash ]; then
- cat >> $src << "EOF"
+ cat >> $src << "EOFZF"
# Key bindings
# ------------
if [[ $- =~ i ]]; then
-__fsel() {
+read -r -d '' __fsel <<'EOF'
find * -path '*/\.*' -prune \
-o -type f -print \
-o -type d -print \
@@ -108,6 +108,14 @@ __fsel() {
printf '%q ' "$item"
done
echo
+EOF
+
+__fsel() {
+ eval "$__fsel"
+}
+
+__fsel_tmux() {
+ tmux split-window -l ${FZF_TMUX_HEIGHT:-15} "tmux send-keys -t $TMUX_PANE \"\$($__fsel)\""
}
__fcd() {
@@ -115,12 +123,19 @@ __fcd() {
dir=$(find ${1:-*} -path '*/\.*' -prune -o -type d -print 2> /dev/null | fzf +m) && printf 'cd %q' "$dir"
}
+__use_tmux=0
+[ -n "$TMUX_PANE" -a ${FZF_TMUX:-1} -ne 0 -a ${LINES:-30} -gt 15 ] && __use_tmux=1
+
if [ -z "$(set -o | grep '^vi.*on')" ]; then
# Required to refresh the prompt after fzf
bind '"\er": redraw-current-line'
# CTRL-T - Paste the selected file path into the command line
- bind '"\C-t": " \C-u \C-a\C-k$(__fsel)\e\C-e\C-y\C-a\C-y\ey\C-h\C-e\er"'
+ if [ $__use_tmux -eq 1 ]; then
+ bind '"\C-t": " \C-u \C-a\C-k$(__fsel_tmux)\e\C-e\C-y\C-a\C-d\C-y\ey\C-h"'
+ else
+ bind '"\C-t": " \C-u \C-a\C-k$(__fsel)\e\C-e\C-y\C-a\C-y\ey\C-h\C-e\er"'
+ fi
# CTRL-R - Paste the selected command from history into the command line
bind '"\C-r": " \C-e\C-u$(HISTTIMEFORMAT= history | fzf +s | sed \"s/ *[0-9]* *//\")\e\C-e\er"'
@@ -133,7 +148,11 @@ else
# CTRL-T - Paste the selected file path into the command line
# - FIXME: Selected items are attached to the end regardless of cursor position
- bind '"\C-t": "\eddi$(__fsel)\C-x\C-e\e0P$a \C-x\C-r"'
+ if [ $__use_tmux -eq 1 ]; then
+ bind '"\C-t": "\e$a \eddi$(__fsel_tmux)\C-x\C-e\e0P$xa"'
+ else
+ bind '"\C-t": "\e$a \eddi$(__fsel)\C-x\C-e\e0Px$a \C-x\C-r"'
+ fi
# CTRL-R - Paste the selected command from history into the command line
bind '"\C-r": "\eddi$(HISTTIMEFORMAT= history | fzf +s | sed \"s/ *[0-9]* *//\")\C-x\C-e\e$a\C-x\C-r"'
@@ -142,27 +161,35 @@ else
bind '"\ec": "\eddi$(__fcd)\C-x\C-e\C-x\C-r\C-m"'
fi
+unset __use_tmux
+
fi
-EOF
+EOFZF
else
- cat >> $src << "EOF"
+ cat >> $src << "EOFZF"
# Key bindings
# ------------
# CTRL-T - Paste the selected file path(s) into the command line
-fzf-file-widget() {
- local FILES
- local IFS="
-"
- FILES=($(
- find * -path '*/\.*' -prune \
+read -r -d '' __fsel <<'EOF'
+ find * -path '*/\.*' -prune \
-o -type f -print \
-o -type d -print \
- -o -type l -print 2> /dev/null | fzf -m))
- unset IFS
- FILES=$FILES:q
- LBUFFER="${LBUFFER%% #} $FILES"
- zle redisplay
-}
+ -o -type l -print 2> /dev/null | fzf -m | while read item; do
+ printf '%q ' "$item"
+ done
+ echo
+EOF
+
+if [ -n "$TMUX_PANE" -a ${FZF_TMUX:-1} -ne 0 -a ${LINES:-30} -gt 15 ]; then
+ fzf-file-widget() {
+ tmux split-window -l ${FZF_TMUX_HEIGHT:-15} "tmux send-keys -t $TMUX_PANE \"\$($__fsel)\""
+ }
+else
+ fzf-file-widget() {
+ LBUFFER="${LBUFFER%% #}$(eval "$__fsel")"
+ zle redisplay
+ }
+fi
zle -N fzf-file-widget
bindkey '^T' fzf-file-widget
@@ -183,7 +210,7 @@ fzf-history-widget() {
zle -N fzf-history-widget
bindkey '^R' fzf-history-widget
-EOF
+EOFZF
fi
fi