Как «найти» несколько файлов и открыть их в 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
  • gvim pipe не читает zshrc при запуске с рабочего стола
  • Vim: заменить на другой матч в строке
  • Как использовать FileType в Vim?
  • Как изменить схему раскраски Gdiff в vim-fugitive plugin?
  • Невозможно установить цветовую схему в Vim в Kubuntu
  • Удаление набора записей, если найденный шаблон
  • Цветовое кодирование html цветных секретов в vim
  • Как разбить и отредактировать патчи?
  • vim - Как избежать имени файла, содержащего один и двойной кавычки?
  • vi требуется два нажатия <enter>, а не один
  • TERM = (linux | xterm) vi в xterm или проблема AAABBBBBBCCDDD
  • Linux и Unix - лучшая ОС в мире.