Vim 确实支持一个很好的选项来接受带有文件列表的文件,然后在 Quickfix 列表中打开该文件。粗略的例子,我找到 ~ 中所有小于 1KB 的文件并将其传递给 Vim:
find ~ -type f -size -1k > /tmp/1 && vim -q /tmp/1
我很想使用它作为 zsh 后缀别名:
alias V='> /tmp/1 && vim -q /tmp/1'
这样我就可以:
find ~ -type f -size -1k V
我使用了几个方便的后缀:
alias -g H='| head -n'
alias -g X='| xargs -d"\n"'
这样我就可以:
git log H 5
最后我即将接近问题本身。
令我难过的是我无法用来mktemp
创建该临时文件。尝试了所有愚蠢的菜鸟 shell 脚本技巧:
find . | tee QL=$(mktemp) && vim -q $QL
我认为解决方案是如此简单,我会感到羞愧。
目前我使用:
find ... | xargs -d"\n" vim --
但这仅填充缓冲区列表,并且不会填充位置列表的 Quickfix,即使我认为可以将命令传递给 Vim 来-c
执行此操作。有一个警告“Vim:警告:输入不是来自终端”,然后在退出 Vim 后,终端会失败^D
^M
而不是Ctrl-C
Ctrl-D
之后打印,尽管这可以通过添加ttyctl -f
to来修复.zshrc
,但在 Vim 本身中,Tab 和 Backspace 键在 Ex 中表现不佳模式,这是非常烦人的。
答案1
只要您发布的内容到目前为止对您有效,
find ~ -type f -size -1k > /tmp/1 && vim -q /tmp/1
您只想摆脱设置中间文件> /tmp/1 &&
,/tmp/1
看看这是否适合您:
vim -q <( find ~ -type f -size -1k )
解释
- 从您的原始代码来看,您似乎正在使用
find
特定标准生成所需的文件列表,然后将其保存到其中,/tmp/1
这只是一个中间文件,以便vim -q filelist
可以完成,因为vim -q
需要一个文件参数 <( commands... )
是 Bash 的其中之一流程替代/dev/fd/63
,如果您好奇的话,会自动运行命令并将输出保存到系统温度中,只是为了这个目的vim -q
然后认为它正在获取一个文件,并且出于所有意图和目的,它实际上是,所以它可以工作
附加提示
如果您并非绝对必须使用 vim 的快速修复功能,而只是想要一种快速编辑多个文件的方法,请记住您可以向 vim 发送多个文件参数 ( vim file1 file2...
),因此如果我们修改您的原始文件find
,我们可以:
find ~ -type f -size -1k -exec vim {} +
在 vim 中
:args
将在状态栏中显示参数列表,例如:file1 [file2] file3
如果您当前正在编辑file2
:n
导航到参数列表中的下一个文件:wn
写下一个意思是保存该文件并自动打开下一个文件:prev
转到上一个文件
答案2
过了很长一段时间,我现在可以回答我自己的问题了。
自顶向下:
alias -g V='| tee $(rm fifo.tmp; mkfifo fifo.tmp && echo fifo.tmp) &; vim $(< fifo.tmp ) && rm fifo.tmp'
这是一个 zsh 别名,允许:
find . -name TODO V
或者
ls | grep asciidoc V
并获取 Vim 中作为缓冲区打开的所有文件。
不知怎的,如果没有 ,这不起作用tee
,例如替换| tee
为>
不会在 Vim 中打开任何缓冲区。
我们在这里所做的是创建一个名为 的管道fifo.tmp
,告诉tee
将前一个命令的输出重定向到它并将其发送到后台;同时,我们在子 shell 中读取该管道,并将输出作为 Vim 打开的文件列表。
然而,这不适用于包含空格的文件名。