Skip to content

Conversation

@eli-percepto
Copy link

@eli-percepto eli-percepto commented Jul 10, 2024

Implementation of issues/3914 but only for bash shell.

Modify Ctrl-t behaviour in the following way (bash shell):

  1. Change the default setting (current dir) to present first the files and directories of depth 0 in order of decreasing modification time (as in ls -t1)
  2. If the cursor follows immediately a word which is a path to an existing dir, fzf this dir instead of the current.

Issue #3914

@eli-percepto eli-percepto changed the title Issue 3914 enhance ctrl t Jul 10, 2024
@eli-percepto eli-percepto force-pushed the issue-3914-enhance-ctrl-t branch from 912308a to b907a6f Compare July 11, 2024 15:37
@eli-percepto eli-percepto force-pushed the issue-3914-enhance-ctrl-t branch from 1d3b746 to ed5c2a0 Compare December 24, 2024 07:56
@phanirithvij
Copy link

phanirithvij commented Dec 24, 2024

so, I've tried it.

simplescreenrecorder-2024-12-24_16.42.49.mp4

I picked your patch and modified the key-bindings.bash file directly, to test it.

diff --git a/key-bindings.bash b/key-bindings.bash
index 2da32cb..4a7bb99 100755
--- a/key-bindings.bash
+++ b/key-bindings.bash
@@ -25,34 +25,59 @@ __fzf_defaults() {
   echo "${FZF_DEFAULT_OPTS-} $2"
 }
 
-__fzf_select__() {
-  FZF_DEFAULT_COMMAND=${FZF_CTRL_T_COMMAND:-} \
-  FZF_DEFAULT_OPTS=$(__fzf_defaults "--reverse --walker=file,dir,follow,hidden --scheme=path" "${FZF_CTRL_T_OPTS-} -m") \
-  FZF_DEFAULT_OPTS_FILE='' $(__fzfcmd) "$@" |
-    while read -r item; do
-      printf '%q ' "$item"  # escape special chars
-    done
-}
-
 __fzfcmd() {
   [[ -n "${TMUX_PANE-}" ]] && { [[ "${FZF_TMUX:-0}" != 0 ]] || [[ -n "${FZF_TMUX_OPTS-}" ]]; } &&
     echo "fzf-tmux ${FZF_TMUX_OPTS:--d${FZF_TMUX_HEIGHT:-40%}} -- " || echo "fzf"
 }
 
-fzf-file-widget() {
-  local selected="$(__fzf_select__ "$@")"
-  READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}$selected${READLINE_LINE:$READLINE_POINT}"
-  READLINE_POINT=$(( READLINE_POINT + ${#selected} ))
+# Override defaults for improved ctrl-t experience
+__fzf_find() {
+  command ls -1t $1;
+  command find -L $1 -mindepth 2 \( -path '*/\.*' -o -fstype 'sysfs' -o -fstype 'devfs' -o -fstype 'devtmpfs' -o -fstype 'proc' \) -prune \
+  -o -type f -printf '%P\n' \
+  -o -type d -printf '%P\n' \
+  -o -type l -printf '%P\n' 2> /dev/null
 }
 
-__fzf_cd__() {
-  local dir
-  dir=$(
-    FZF_DEFAULT_COMMAND=${FZF_ALT_C_COMMAND:-} \
-    FZF_DEFAULT_OPTS=$(__fzf_defaults "--reverse --walker=dir,follow,hidden --scheme=path" "${FZF_ALT_C_OPTS-} +m") \
-    FZF_DEFAULT_OPTS_FILE='' $(__fzfcmd)
-  ) && printf 'builtin cd -- %q' "$(builtin unset CDPATH && builtin cd -- "$dir" && builtin pwd)"
+__fzf_select__() {
+  local cmd opts
+  local dir=$1
+  shift
+  cmd="${FZF_CTRL_T_COMMAND:-"__fzf_find $dir"}"
+  opts="--height ${FZF_TMUX_HEIGHT:-40%} --bind=ctrl-z:ignore --reverse $FZF_DEFAULT_OPTS $FZF_CTRL_T_OPTS -m"
+  eval "$cmd" |
+    FZF_DEFAULT_OPTS="$opts" $(__fzfcmd) "$@" |
+    while read -r item; do
+      if [ "$dir" == "." ]; then
+        printf '%q ' "$item"  # escape special chars
+      else
+        printf '%q/%q ' "$dir" "$item"
+      fi
+    done
+}
+
+fzf-file-widget() {
+  local trailing_spaces=$(echo -n "${READLINE_LINE:0:$READLINE_POINT}" | sed "s/^.*\S//")
+  local word=$(echo -n "${READLINE_LINE:0:$READLINE_POINT}" | sed "s/\s*$//"| awk '{print $NF}')
+  local dir=$(echo "${word/#\~/$HOME}" | sed "s#/\+#/#g; s#/\$##")
+  if [[ $READLINE_POINT -eq 0 || -n "$trailing_spaces" || ! -d "$dir" ]]; then
+    local maybe_space=""
+    [[ $READLINE_POINT -gt 0 && -z "$trailing_spaces" ]] && maybe_space=" "
+    local selected="$(__fzf_select__ . "$@")"
+    if [ -n "$selected" ]; then
+      READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}$maybe_space$selected${READLINE_LINE:$READLINE_POINT}"
+      READLINE_POINT=$((READLINE_POINT + ${#maybe_space} + ${#selected}))
+    fi
+  else
+    local selected="$(__fzf_select__ "$dir" "$@")"
+    if [ -n "$selected" ]; then
+      local pre_word=$((READLINE_POINT - ${#word}))
+      READLINE_LINE="${READLINE_LINE:0:$pre_word}$selected${READLINE_LINE:$READLINE_POINT}"
+      READLINE_POINT=$((pre_word + ${#selected}))
+    fi
+  fi
 }
+# end of non default section
 
 if command -v perl > /dev/null; then
   __fzf_history__() {

I do ctrl+t with ls vim-plugins/ and ctrl+t, I still see entries from the same directory (cwd) instead of the subdirectory vim-plugins like I expected.

Also made sure I am using your code only, not the old version.

I checked if it is updated to new function
$ type fzf-file-widget
fzf-file-widget is a function
fzf-file-widget ()
{
    local trailing_spaces=$(echo -n "${READLINE_LINE:0:$READLINE_POINT}" | sed "s/^.*\S//");
    local word=$(echo -n "${READLINE_LINE:0:$READLINE_POINT}" | sed "s/\s*$//" | awk '{print $NF}');
    local dir=$(echo "${word/#\~/$HOME}" | sed "s#/\+#/#g; s#/\$##");
    if [[ $READLINE_POINT -eq 0 || -n "$trailing_spaces" || ! -d "$dir" ]]; then
        local maybe_space="";
        [[ $READLINE_POINT -gt 0 && -z "$trailing_spaces" ]] && maybe_space=" ";
        local selected="$(__fzf_select__ . "$@")";
        if [ -n "$selected" ]; then
            READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}$maybe_space$selected${READLINE_LINE:$READLINE_POINT}";
            READLINE_POINT=$((READLINE_POINT + ${#maybe_space} + ${#selected}));
        fi;
    else
        local selected="$(__fzf_select__ "$dir" "$@")";
        if [ -n "$selected" ]; then
            local pre_word=$((READLINE_POINT - ${#word}));
            READLINE_LINE="${READLINE_LINE:0:$pre_word}$selected${READLINE_LINE:$READLINE_POINT}";
            READLINE_POINT=$((pre_word + ${#selected}));
        fi;
    fi
}
@eli-percepto
Copy link
Author

@phanirithvij Thanks for testing :)
What version of fzf (commit hash) you're based on?

@phanirithvij
Copy link

phanirithvij commented Dec 24, 2024

sorry, I meant to say 0.57.0 tag

@eli-percepto eli-percepto force-pushed the issue-3914-enhance-ctrl-t branch 4 times, most recently from 9acc4ad to e000483 Compare August 12, 2025 09:01
@eli-percepto eli-percepto force-pushed the issue-3914-enhance-ctrl-t branch 2 times, most recently from 0ca9a9d to c368de0 Compare September 2, 2025 14:04
@eli-percepto eli-percepto force-pushed the issue-3914-enhance-ctrl-t branch from ba40474 to c368de0 Compare September 28, 2025 09:06
@eli-percepto eli-percepto force-pushed the issue-3914-enhance-ctrl-t branch from c368de0 to dfc367d Compare September 28, 2025 09:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

2 participants