Я иногда пытался вызвать Vim, используя xargs
это:
find . -name '*.java' | xargs vim
… Какие работы:
Когда Vim запускается, я вижу следующее предупреждение:
Vim: Warning: Input is not from a terminal
- Редактирование работает -
:files
правильно перечисляет все.java
файлы, как и ожидалось. - Я могу сохранить и выйти.
Однако после выхода из Vim мой терминал пропал:
- Все, что я печатаю в командной строке, не отражается.
- Возврат каретки вообще не появляется, а переводы строки появляются только иногда.
Это продолжается до тех пор, пока я не выполню reset(1)
команду для повторной инициализации терминала.
Это ошибка Vim, или есть более удовлетворительное объяснение, почему он так взаимодействует с терминалом? Я видел, как это происходит в Vim до версии 7.3 (версия, кажется, не имеет значения) в Linux и различных Unices.
Я знаю один обходной путь, а именно vim $(find . -name '*.java')
. Другие обходные пути будут приветствоваться, хотя это не мой главный вопрос.
terminal
invocation
unix
quit
200_success
источник
источник
xargs
используется пустышкаstdin
, которую Vim не может использовать, и перерывы все потом.Ответы:
Это происходит, когда vim вызывается и подключается к выходу предыдущего конвейера, а не к терминалу и получает другой неожиданный ввод (например, NUL). То же самое происходит при запуске:,
vim < /dev/null
так чтоreset
команда в этом случае помогает. Это хорошо объясняется благодарностью суперпользователя .Если вы используете
find
для передачи имен файлов для редактирования, вам не нужноxargs
, просто используйте-exec
, например:Если вы хотите использовать
xargs
, в Unix / macOS вы должны использовать-o
параметр, например:или:
Примечание. Использование
-print0
/-0
будет поддерживать имена файлов с пробелами.find
+ BSDxargs
В Unix / macOS вы можете попробовать следующий обходной путь:
Вы также можете использовать подстановки команд синтаксиса, например:
В качестве альтернативы используйте GNU
parallel
вместоxargs
принудительного распределения tty, например:Примечание:
parallel
в Unix / OSX не будет работать, так как он имеет разные параметры и не поддерживает tty.Многие другие популярные команды также предоставляют псевдо-tty распределение (например,
-t
вssh
), поэтому обратитесь за помощью.Другое предложение будет использовать:
ex
редактор командной строки для разбора данных или использования режима Ex, более подробную информацию смотрите в:Как редактировать файлы не в интерактивном режиме (например, в конвейере)?
vipe
(командный канал Vim)используйте следующий простой скрипт:
Связанный:
grep -l .. | xargs vim
выдает предупреждение, почему? [dup] в Unix SEисточник
xargs
не имеет-J
. Похоже, это опция MacOS (BSD), которой нет в версии GNU.Обходной путь: используйте буфер в качестве навигатора файловой системы
Используйте
vim -
команду, чтобы прочитать список путей из стандартного ввода. Вима:help --
объясняет это: 1Затем вы можете использовать gfили Ctrl-wCtrl-fдля перехода к файлу в том же буфере или в новом разделенном окне соответственно.
Обходной путь: список аргументов
Другой отличный способ - использовать список аргументов Vim. Команда
:argadd **/*.java
заполнит список аргументов Vim всеми java-файлами, найденными внутри текущего каталога рекурсивно. Затем вы можете использовать:next
и:prev
для перемещения между файлами.1 Первый
-
говорит Vim, что вы хотите найти справку для параметра командной строки, второй - это флаг командной строки, который вы ищете. Читайте:help help-context
больше трюков, как это.источник
Кроме того
reset
, вы можете попробовать:что также должно сделать ваш терминал снова пригодным для использования.
Смотрите здесь для объяснений. И почему-то это может считаться плохим поведением, по крайней мере, у Neovim в настоящее время нет этой проблемы.
источник
reset
что тоже должен.Причина заключается в том, что
xargs
наборыstdin
для/dev/null
, в то время какvim
потребностиstdin
быть/dev/tty
.xargs
Решение BSD (например, Mac):-o
устанавливаетstdin
дочерний процесс xarg (vim
в данном случае) вdev/tty
.xargs
Решение GNU (например, Linux):GNU
xargs
не имеет-o
возможности. Вместо этого вам придется использовать более сложный обходной путь. (Примечание: очень важно иметь конечнуюzero
строку, не забывайте об этом.)Вы также можете сделать его псевдонимом:
Подробное объяснение решения GNU xargs
Давайте разберем это шаг за шагом:
1.
xargs
просто добавляетstdin
к концу строки, поэтомуxargs
будет выполнять это:2. Формат для
bash -c
естьbash -c 'COMMAND_STRING' $0 $1 $2 etc
."$@"
расширяется до позиционных параметров"$1", "$2"
и т. д. Он не содержит «$ 0», потому что это специальный параметр для имени скрипта, а не позиционный параметр. Вот почему нам нужно добавить фиктивную строкуzero
(это может быть любая строка), чтобы занять место$0
. В противном случае вы потеряете первый файл.Итак, после расширения
"$@"
вы получите:3.
bash -c
выполнит COMMAND_STRING:</dev/tty
устанавливаетstdin
для/dev/tty
так , чтоvim
может работать в интерактивном режиме.источник
$0
Заполнитель (здесь «ноль») является ключевым.Я обнаружил, что все эти ответы отсутствуют. После преодоления проблемы с xargs, самый простой способ - для меня! - выполнить поиск и открытие в универсальном окне, заключается в следующем:
У меня нет проблемы , используя
find
сxargs
иgrep
, но я считаю , что синтаксис раздражает. И как ежедневный кодер, который используетvim
и терминал в качестве своей IDE, и постоянно ищет в файлах свойства, это то, что я использовал.Есть время и место для
find . -path ./node_modules -prune -o -name '*.js' | xargs grep -i mySearchTerm
открытия файлов с помощью vim и других методов. Для меня это редко.Надеюсь, это кому-нибудь поможет.
источник
$(...)
вместо нее . Это не так важно в вашей командной строке, как в сценарии, но я думаю, что все же лучше использовать это в своих ответах :) (ссылки здесь и здесь )