我经常发现自己在 shell 中,想要将文件名插入到冗长的命令中。
\n我想点击快捷方式,并使用 Netrw 或 Nerdtree 浏览文件或目录,并将其粘贴到命令 I\xe2\x80\x99m 构建中。
\n我会输入diff
然后我想点击快捷方式,使用 Netrw 或 Nerdtree 进行可视化浏览,然后选择一个文件。
\n该文件名现在已添加到我的 diff 命令中...例如diff /tmp/file1.txt
我再次点击快捷方式,然后浏览第二个文件,\n/super/ez/another/file/somewhere/else/compare.txt
然后将第二个文件添加到我的diff
命令中,所以我现在有:
diff /tmp/file1.txt /super/ez/another/file/somewhere/else/compare.txt\n
Run Code Online (Sandbox Code Playgroud)\n使用任何工具可以做到这一点吗?我喜欢 Vim 中的 Netrw,但愿意尝试新事物!
\nTab请注意,我对使用通配符完成文件名不感兴趣。这有时有效,但并非总是有效。我喜欢 Netrw,并且很想弄清楚如何使用它通过浏览来选择文件名。
\nVifm v0.8 或更高版本提供了一种通过选项实现此功能的更好方法
--choose-files
,这使得它独立于配置目录的位置。
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)
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)
从这里你基本上已经知道答案了。将所有这些放在一起非常容易,如下所示:
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 我的代码包含相当原始的转义,您可能想要改进它,并且可能更改参数之间添加间距的方式。
归档时间: |
|
查看次数: |
1729 次 |
最近记录: |