代码之家  ›  专栏  ›  技术社区  ›  roeland

使用fzf列出按日期排序的git文件(并在bash中设置默认值)

  •  0
  • roeland  · 技术社区  · 7 年前

    我想使用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_命令仍然为空:

    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 回复  |  直到 7 年前
        1
  •  1
  •   Jürgen Hötzel    7 年前

    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'