Почему «locate filename | xargs vim» вызывает странное поведение терминала? - PullRequest
18 голосов
/ 22 ноября 2011

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

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

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

Ответы [ 2 ]

29 голосов
/ 22 ноября 2011

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

Сбросить терминал с помощью

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:

:args `locate 50local.policy`
:rewind

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

:w|next

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

5 голосов
/ 13 ноября 2012

Другой альтернативой является выполнение xargs с опцией -o. Со страницы руководства:

-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 "$@" < /dev/tty' vim
...