Когда вы вызываете программу через 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 из редактора.