O Vim precisa de sua entrada padrão para ser o terminal no qual você inserirá os comandos, mas obterá /dev/null ou o canal de grep dependendo da implementação xargs .
Você pode restaurar a entrada padrão por meio de um shell intermediário.
grep -rl test . | xargs sh -c 'vim -- "$@" <$0' /dev/tty
Se os nomes dos arquivos não contiverem nenhum caractere de espaços em branco ou qualquer um de \[?* , você poderá usar a substituição de comandos:
vim $(grep -rl test .)
Uma maneira de lidar com caracteres especiais (além de nova linha) é restringir a divisão de palavras a novas linhas e desativar globbing.
(IFS='
'; set -f; exec vim $(grep -rl test .))