将zsh命令行参数传递给xargs引用

时间:2020-06-13 15:40:35

标签: zsh xargs

我有一个zsh函数fvi(查找vi),该函数递归地抓取一个目录,用某种模式搜索文件,收集它们并在vim中打开它们(在Mac上):

function fvi { grep -rl $1 . | xargs sh -c '/Applications/MacVim.app/Contents/MacOS/Vim -g -- "$@" <$0' /dev/tty }

这看起来很糟糕,但是可以正常工作(在Mac上)。但我想通过以下方式将vi的搜索模式设置为 $ 1

function fvi { grep -rl $1 . | xargs zsh -c '/Applications/MacVim.app/Contents/MacOS/Vim -c +/"$1" -g -- "$@" <$0' /dev/tty }

这当然不起作用,因为xargs / zsh看到$ 1并将其转换为文件名。我可以手动说-c + / xyz,它将模式设置为xyz。因此,我知道vim命令语法正在工作。我只是无法将shell命令参数$ 1替换为xargs字符串

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我可能只使用find

fvi () {
    v=/Applications/MacVim.app/Contents/MacOS/Vim
    find . -exec grep -e $1 -- {} \; -exec $v -g +/$1 -- {} \;
}

您正在打开vim中的每个文件进行交互式编辑的事实表明,没有太多可能的匹配项(或候选项),因此多次运行grep确实是一个问题。 (最糟糕的是,您只是将xargs开始的每个额外的Shell进程替换为grep的实例。)

这还排除了与包含换行符的文件名有关的任何可能的问题。

相关问题