Как «найти» несколько файлов и открыть их в vim?

Предположим, что у меня есть файл filename123.txt и это единственный файл, который назван так, и я могу locate его с помощью команды locate filename123 . И он возвращает только этот файл.

Теперь я хочу открыть его с помощью vi / vim . Но я не хочу идти в это место и набирать команду vi за которой следует имя файла. Здесь я хочу, чтобы результат locate filename123 был добавлен к команде vi. Как я могу это сделать? Я уже пробовал:

 locate filename123 | vi 

Но это не работает. И эта ошибка приходит в терминал:

 santosh@santosh:~$ locate filename123 | vi Vim: Warning: Input is not from a terminal Vim: Error reading input, exiting... Vim: Finished. 

3 Solutions collect form web for “Как «найти» несколько файлов и открыть их в vim?”

Вы можете использовать xargs :

 locate filename123 | xargs vi 

По умолчанию xargs будет выполнять как можно меньше экземпляров указанной команды, передавая как можно больше параметров в соответствии с ARG_MAX системы. Чтобы ограничить количество параметров, переданных экземпляру vi , используйте параметр xargs ' -n .

Для обработки имен файлов, содержащих пробелы, используйте параметр xargs -d :

 locate filename123 | xargs -d '\n' vi 

Для обработки имен файлов, содержащих xargs строки, используйте параметр xargs ' -0 вместе с опцией -0 :

 locate -0 filename123 | xargs -0 vi 

(Если -0 не доступно ни на одном из них, проверьте также на --null или другой способ указать символ \000 качестве разделителя.)

Вы можете использовать расширение команды:

 vi "$(locate filename123 | head -n1)" 

Чтобы vim читал свой stdin, вы можете делать vim - , но это просто даст вам результат locate которые являются путями имен файлов. Это может работать, хотя, используя команду vim gf normal, откроется путь, по которому курсор включен.

редактировать

В случае имен файлов с пробелами в них вам лучше использовать xargs опцию xargs или решение vim описанное выше. Обратите внимание, что для работы gf вам нужно добавить пространство в isfname :

 set isfname+=32 

Этот совет и альтернативы описаны здесь .

Изменить 2

Добавлены кавычки и заголовки, как было предложено PeterO в комментариях .

Самый простой способ – передать locate качестве замены подстановки , например:

 vim $(locate filename123) 

Вы можете также рассмотреть возможность использования find вместо locate для передачи имен файлов для редактирования, например:

 find . -name 'filename123' -exec vim {} + 

В Unix / OSX вы можете использовать xargs с параметром -o , например:

 locate filename123 | xargs -o vim 

-o Повторно открыть stdin как / dev / tty в дочернем процессе перед выполнением команды. Это полезно, если вы хотите, чтобы xargs запускали интерактивное приложение.

Или в Linux попробуйте следующее обходное решение, используя:

 locate filename123 | xargs -J% sh -c 'vim < /dev/tty $@' 

Если вы используете разные команды, используйте команду substitution для достижения этого, например:

 vim $(locate filename123) vim `locate filename123` 

Альтернативно используйте GNU- parallel вместо xargs для принудительного распределения tty, например:

 locate filename123 | parallel -X --tty vi 

Примечание: parallel в Unix / OSX не будет работать, поскольку она имеет разные параметры и не поддерживает tty.

Многие другие популярные команды также предоставляют псевдо-tty-распределение (например, -t в ssh ), поэтому обратитесь за помощью.

Другое предложение – использовать vipe (трубу команды Vim) или использовать следующий простой скрипт:

 #!/bin/sh # usage: locate filename123 | vip exec vim < /dev/tty "$@" 

Связанный:

  • Терминал укусил после вызова Vim с xargs на Vim SE
  • Сохранение с помощью CTRL-s в vim
  • Эмуляция Vim в среде IDE vs gVim как IDE
  • Проверка файла vi .swp для предварительного восстановления
  • Вставка с пробелами, добавленными в заголовки строк (по аналогии с комментариями)?
  • Vim NERDTree re-size vsplit
  • Присоединительные линии с использованием редактора Vim
  • YouCompleteMe не работает после установки по умолчанию
  • Найти и изменить некоторые кодировки LaTeX в vim, используя регулярные выражения?
  • Как я могу вызвать vi вместо vim
  • Могу ли я указать макет команды vsplit?
  • Почему Vim ест Ctrl при использовании с Ctrl + v и как его исправить?
  • Linux и Unix - лучшая ОС в мире.