查找文件并发送到临时文件

查找文件并发送到临时文件

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 -fto来修复.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 打开的文件列表。

然而,这不适用于包含空格的文件名。

相关内容