我有一个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字符串 。
有什么想法吗?
答案 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
的实例。)
这还排除了与包含换行符的文件名有关的任何可能的问题。