Подтвердить что ты не робот

Почему "locate filename | xargs vim" вызывает странное поведение терминала?

Когда я "нахожу 50local.policy | xargs vim", я получаю сообщение об ошибке "Vim: Warnung: Die Eingabe kommt nicht von einem Terminal" (перевод: Vim: Warning: вход не поступает с терминала).

Я могу успешно редактировать vim, но после того, как я закрыл его, мой терминал ведет себя странно (я не могу писать буквы, и когда я нахожусь, введите приглашение оболочки просто повторяется. Когда я делаю это с помощью "xargs gedit", это не создает этих проблем.

Я использую Ubuntu 11.10 с Gnome 3 и Gnome-Terminal 3.0.1.

4b9b3361

Ответ 1

Vim ожидает подключения к реальному терминалу и отправляет коды, соответствующие этому.

Reset терминал с

reset

Самый простой способ:

locate 50local.policy | xargs gvim

Обоснование gui vim не требует терминала

В противном случае:

vim $(locate 50local.policy)

Обоснование vim запускается непосредственно с терминалом (а не как дочерний процесс под xargs, который, в свою очередь, работает в подоболочке с stdin/stdout, подключенным к трубам, а не терминалом). Это как сказать

vim /usr/some/dir/50local.policy /usr/local/some/dir/50local.policy

В качестве альтернативы

Вы можете уклониться от проблемы, не запустив vim с аргументами, но добавив аргументы из vim! Vim на самом деле намного лучше работает с ракетами, чем оболочки при запуске vim.

Пока в vim:

:args `locate 50local.policy`
:rewind

Это устанавливает список аргументов в файлы, возвращенные командой оболочки между тиками;: перемотка назад затем переходит к первому файлу из этого списка. Если вы редактировали несколько совпадений, попробуйте следующее:

:w|next

Эта последовательность команд (разделенная символом |) записывает текущий буфер в файл, затем переходит к следующему файлу в списке args.

Ответ 2

Другой вариант - выполнить xargs с опцией -o. На странице man:

-o      Reopen stdin as /dev/tty in the child process before executing
        the command.  This is useful if you want xargs to run an interac-
        tive application.

Примечание. -o является расширением BSD для xargs.

Более портативное средство для достижения такого же эффекта:

xargs sh -c 'vim "[email protected]" < /dev/tty' vim