После выполнения grep и передачи его vim, а затем выхода, почему я испытываю эту странную неисправность консоли? - PullRequest
1 голос
/ 23 января 2011

Я попробовал это только сейчас:

grep -RlI "id=\"kw\"" * | xargs vim

Это дало мне 16 результатов. Открыл первый результат в Vim. Я сделал свое первое редактирование и нажал :q, так как не знал ярлыка для перехода к следующему файлу.

Это отбросило меня обратно к консоли (я SSHed на сервер). Моя консоль испорчена сейчас. Все, что я печатаю, я не вижу, и каждый раз, когда я нажимаю клавишу ввода, кажется, что она обрабатывает команду, но дисплей / представление облажались, поэтому

[meder@linode] на моей консоли, по крайней мере на полпути. reset ничего не делает, так как кажется, что он испортил мою настоящую консоль.


Может ли кто-нибудь предложить решение, которое не имеет такого же недостатка? Или кто-нибудь может объяснить, почему :q из самого первого файла испортил мою консоль?


Справочная информация : Мой компьютер Debian Ubuntu, я SSHed в RHEL box. Файлы, которые я открыл, были текстовыми / ascii файлами, phtml / php файлами, а не какими-то странными двоичными файлами с сумасшедшими символами в них.

Вот скриншот того, что произошло

РЕДАКТИРОВАТЬ # 1: Я просто набрал reset снова, и это, казалось, сработало. Первый reset не сработал, я думаю, потому что каким-то образом консоль вставила в него какой-то пробельный символ? В любом случае, я хотел бы объяснить это странное поведение.

Ответы [ 6 ]

3 голосов
/ 23 января 2011

Попробуйте:

vim -o `grep -RlI "id=\"kw\"" * `
2 голосов
/ 23 января 2011

Со страницы руководства для xargs:

     Undefined behavior may occur if utility reads from the standard input.

Этой строки нет на странице руководства Linux, но она присутствует на моем Mac. Если вы хотите запустить программу, которую вы собираетесь читать стандартным вводом, обычной версии xargs для linux понадобится аргумент для чтения ввода из файла:

   OPTIONS
       --arg-file=file, -a file
              Read items from file instead of standard input.
              If you use this option, stdin remains unchanged
              when commands are run.  Otherwise, stdin is
              redirected from /dev/null.

Vim предназначен для работы как со стандартным входом, так и со стандартным выходом, подключенным к реальным (очень редким в наши дни) или псевдотерминальным устройствам. Странные вещи произойдут, если вы нарушите эту договоренность.

Основная проблема с вашей командой заключалась в том, что при стандартном вводе, перенаправленном на канал, xargs не мог запустить vim с "нормальным" стандартным вводом. Таким образом, изменения режима vim и ввод команд оказались не такими, как вы ожидали.

Возможно, вы можете исправить это, набрав return, тильду и точку. Это принудительно закроет ваш ssh-сеанс с вашего конца, затем вы можете снова войти в ssh и запустить «ps», чтобы проверить, осталось ли что-то зависшее в фоновом режиме, что вы должны убить (1).

1 голос
/ 24 апреля 2011

Попробуйте использовать ... | xargs sh -c '...', а затем прочитать с управляющего оконечного устройства /dev/tty.

echo ~/.profile ~/.bashrc | xargs sh -c 'vim "$@" </dev/tty' dummy_script_name

# based on a tip by Laszlo Ersek on http://unix.derkeiler.com/Newsgroups/comp.unix.programmer/2010-03/msg00051.html
#find . -maxdepth 1 -type f | xargs sh -c 'rm -i "$@" </dev/tty' dummy_script_name
1 голос
/ 21 апреля 2011

Другие люди рассказали, что случилось и что с этим делать.Что касается того, почему, ответ на этот вопрос, вероятно, заключается в том, что ввод Vim получил от команды xargs и попытался выполнить так, как если бы этот ввод поступил от терминала.Я не знаю, как разговаривать с терминалом, но вы можете себе представить, что Vim получил какие-то странные команды, которые сломали его или сказали ему выйти.Аналогичные непредсказуемые вещи случаются, когда вы загружаете двоичный файл.

В любом случае, у меня есть другая идея.Вы пытались использовать vimgrep для просмотра списка файлов, соответствующих шаблону?

:vimgrep /id="kw"/ *
:copen

Это greps для id="kw" во всех файлах в текущем каталоге.:copen открывает окно со списком совпадений.Вы можете просмотреть этот список, нажав Enter, чтобы перейти к позиции файла.

enter image description here

Для получения дополнительной информации см.

:help grep
:help :vimgrep
:help :copen
:help quickfix

Если вам это действительно нужно *Опция 1016 *, см.

:help :grep
:help 'grepprg'

См. Также: Vim: Предупреждение: вход не от терминала

1 голос
/ 24 января 2011

Параметры консоли устанавливаются stty, поэтому вы можете сохранить ее параметры в переменной bash и восстановить их после выхода из vim, например:

function vim()
{
    STTYOPTS="$(stty --save)"
    vim "$@"
    stty "${STTYOPTS}"
}

Но это, вероятно, лучший способиспользовать zsh для этой задачи: если вы поместите единственную строку ttyctl -f в ваш ~/.zshrc, то zsh автоматически восстановит параметры терминала после выхода из программы.ttyctl является встроенным в Zsh, поэтому вы не можете использовать его из bash.

1 голос
/ 23 января 2011

Вы можете использовать :next или :n, чтобы перейти к следующему файлу для редактирования. Вы также можете использовать vim -o, чтобы открыть все соответствующие файлы в разных окнах Vim.

Не знаю, почему ваша консоль не работает. Я попытался использовать вашу команду, и моя консоль была в порядке.

...