在 Zsh/Bash 中使用 Netrw 或 Nerdtree 通过浏览选择文件?

Bra*_*rks 5 bash vim zsh

我经常发现自己在 shell 中,想要将文件名插入到冗长的命令中。

\n

我想点击快捷方式,并使用 Netrw 或 Nerdtree 浏览文件或目录,并将其粘贴到命令 I\xe2\x80\x99m 构建中。

\n

因此,如果我在一个文件夹中,并且想要比较 2 个文件:

\n
    \n
  • 我会输入diff

    \n
  • \n
  • 然后我想点击快捷方式,使用 Netrw 或 Nerdtree 进行可视化浏览,然后选择一个文件。

    \n
  • \n
  • 该文件名现在已添加到我的 diff 命令中...例如diff /tmp/file1.txt

    \n
  • \n
  • 我再次点击快捷方式,然后浏览第二个文件,\n/super/ez/another/file/somewhere/else/compare.txt

    \n
  • \n
  • 然后将第二个文件添加到我的diff命令中,所以我现在有:

    \n
      diff /tmp/file1.txt /super/ez/another/file/somewhere/else/compare.txt\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
\n

使用任何工具可以做到这一点吗?我喜欢 Vim 中的 Netrw,但愿意尝试新事物!

\n

Tab请注意,我对使用通配符完成文件名不感兴趣。这有时有效,但并非总是有效。我喜欢 Netrw,并且很想弄清楚如何使用它通过浏览来选择文件名。

\n

xai*_*zek 3

2022年版答案

Vifm v0.8 或更高版本提供了一种通过选项实现此功能的更好方法 --choose-files,这使得它独立于配置目录的位置。

zsh版本

function insert_files() {
    local file
    while read file; do
        LBUFFER+="$(printf %q "$file") "
    done <<< "$(vifm --choose-files - < /dev/tty)"

    zle reset-prompt
}
zle -N insert_files
bindkey '^t' insert_files
Run Code Online (Sandbox Code Playgroud)

bash版本

function _insert_files() {
    local file
    local files
    while read -r file; do
        files="$files$(printf %q "$file") "
    done <<< "$(vifm --choose-files - < /dev/tty)"

    local prefix=${READLINE_LINE::READLINE_POINT}
    local suffix=${READLINE_LINE:READLINE_POINT}
    READLINE_LINE=${prefix}${files}${suffix}
    READLINE_POINT=$(( READLINE_POINT + ${#files} ))
}
bind -x '"\C-T": _insert_files'
Run Code Online (Sandbox Code Playgroud)

原始答案(2014)

从这里你基本上已经知道答案了。将所有这些放在一起非常容易,如下所示:

function insert_files() {
    vifm -f < /dev/tty > /dev/tty

    while read l; do
        LBUFFER+="'$l' "
    done < ~/.vifm/vimfiles

    zle reset-prompt
}
zle -N insert_files
bindkey '^t' insert_files
Run Code Online (Sandbox Code Playgroud)

我不是 zsh 用户,所以我从 Lucas 的回答中窃取了代码结构。至于bash,我曾经寻找一种在快捷方式内处理外部命令输出的方法,但没有找到。

示范

PS 我的代码包含相当原始的转义,您可能想要改进它,并且可能更改参数之间添加间距的方式。