Когда вы вызываете программу через xargs, стандартный ввод программы указывает на /dev/null. (Так как xargs не знает оригинальный stdin, он делает следующую лучшую вещь.)
$ true | xargs filan -s
0 chrdev / dev / null
1 tty / dev / pts / 1
2 tty / dev / pts / 1
$ true | xargs ls -l / dev / fd /
Vim ожидает, что его stdin будет таким же, как его управляющий терминал, и напрямую выполняет различные связанные с терминалом ioctl на stdin. Когда все сделано /dev/null(или любой не-tty файловый дескриптор), эти ioctl не имеют смысла и возвращают ENOTTY, что молча игнорируется.
Я предполагаю более конкретную причину: при запуске Vim считывает и запоминает старые настройки терминала и восстанавливает их при выходе. В нашей ситуации, когда «старые настройки» запрашиваются для не-tty fd (дескриптор файла), Vim получает все значения пустыми и все опции отключены и небрежно устанавливает их для вашего терминала.
Вы можете увидеть это, запустив vim < /dev/null, выйдя из него, затем запустив stty, что выдаст много <undef>s. В Linux, работает stty saneсделают терминал пригодного для использования (хотя это будет потеряло такие варианты , как iutf8, возможно , вызывая незначительные раздражали позже).
Вы можете считать это ошибкой в Vim, поскольку он может открываться /dev/ttyдля управления терминалом, но не открывается. (В какой-то момент во время запуска Vim дублирует свой stderr на stdin, что позволяет ему читать ваши входные команды - с открытого для записи fd - но даже это делается недостаточно рано.)
findилиxargsвообще не используя . Откройте vim без аргументов, затем запустите,:args **/*.txt<CR>чтобы установить аргументы vim из редактора.