Используйте FZF для отображения файлов git, отсортированных по дате (и установите значение по умолчанию в bash)

Я хочу использовать fzf для вывода списка всех файлов в git, отсортированных по дате модификации. (Я использую этот вывод в VIM)

Эта команда, кажется, работает:

(while read file; do echo $(git log --pretty=format:%ad -n 1 --date=raw -- $file) $file; done < <(git ls-tree -r --name-only HEAD) | sort -k1,1n | awk {"print \$3"}) 2> /dev/nul

Но как я могу получить это как команду FZF по умолчанию? Я пробовал это, но переменная FZF_DEFAULT_COMMAND остается пустой:

export FZF_DEFAULT_COMMAND='
    (while read file; do echo $(git log --pretty=format:%ad -n 1 --date=raw -- $file) $file; done < <(git ls-tree -r --name-only HEAD) | sort -k1,1n | awk {"print \$3"}) 2> /dev/null'

Может мне нужно что-то сбежать?

Изменить: это команда, которую я сейчас использую:

export FZF_DEFAULT_COMMAND='(git ls-tree -r --name-only HEAD)|(while read file; do echo $(git log --pretty=format:%ad -n 1 --date=raw -- "$file") $file; done | sort -r | awk {"print \$3"}) 2> /dev/null'

1 ответ

Решение

fzf использования /bin/sh (Posix shell) для выполнения вашей команды. Даже если /bin/sh связан с /bin/bash это не удастся для не posix функций (например, подстановка процессов в вашем случае). Вы можете включить поддержку GNU/bash:

export FZF_DEFAULT_COMMAND='set +o posix
    (while read file; do echo $(git log --pretty=format:%ad -n 1 --date=raw -- $file) $file; done < <(git ls-tree -r --name-only HEAD) | sort -k1,1n | awk {"print \$3"}) 2> /dev/null'

Если у вас нет bash символическая ссылка на /bin/sh, вам нужно избавиться от процесса подстановки:

export FZF_DEFAULT_COMMAND='
    (git ls-tree -r --name-only HEAD)|(while read file; do echo $(git log --pretty=format:%ad -n 1 --date=raw -- $file) $file; done | sort -k1,1n | awk {"print \$3"}) 2> /dev/null'
Другие вопросы по тегам