Как открыть несколько файлов, соответствующих шаблону выражения?

10

Я хочу отредактировать несколько файлов, соответствующих выражению glob. Например, чтобы отредактировать все файлы конфигурации git в дочерних каталогах, я могу сделать это в оболочке:

vim */.git/config

В :командной строке Vim я ожидал :find */.git/configсделать что-то подобное (то есть открыть все файлы, соответствующие выражению glob), но вместо этого он жалуется E77: Too many file names.

Есть ли команда Vim или однострочная строка для открытия нескольких файлов, соответствующих выражению с подстановочным знаком / глобусом (что не требует написания функции)?

Джастин М. Кейс
источник

Ответы:

8

Вы можете использовать :args {glob}. В вашем глобусе **будет рекурсивно проходить каталоги.

Это заполнит список аргументов, который является тем же списком, который заполняется при запуске Vim с одним или несколькими именами файлов в качестве аргументов.

Когда ваш список аргументов заполнен, вы можете перемещаться по нему, используя :nextи :previous. Вы также можете перейти к первому и последнему элементу с :firstи :lastкомандами.

tommcdo
источник
1
:args */.git/configХорошо :) на самом деле заполняет список буферов, так что :bnextработает тоже. Это кажется странным? (Vim 7.4.52 и Neovim)
Джастин М. Кейс
1
Также напоминание другим, ]aциклически изменяет:args список, если установлен github.com/tpope/vim-unimpaired .
Джастин М. Кейс
Также :argadd file*можно сделать.
Кенорб
Чтобы использовать шаблоны glob ( **), вам нужно globstarустановить set, см .: Сопоставление всех файлов во всех вложенных каталогах с глобализацией оболочки .
Кенорб
@ JustinM.Keyes Список буферов является расширенным набором списка аргументов, так что это ожидаемо.
jamessan
3

Чтобы открыть соответствующие файлы в отдельных вкладках ...

:n */.git/config | tab all

Объяснение: :n ( :next) устанавливает список следующего файла для всех совпадений. tab allоткрывает все файлы в списке следующего файла в новых вкладках.

… или …

for f in glob("*.py", 0, 1) | exe "tabe" f | endfor

Объяснение: In glob(…), 0 означает включение всех подходящих файлов, даже если в противном случае они были бы проигнорированы из-за настроек suffixesили wildignorecase. 1 означает возврат списка вместо строки. exe "tabe" fявляется краткой формой execute "tabedit" fи означает, чтобы открыть файл, указанный переменной fв новой вкладке.

Алекс Куинн
источник
1
Похоже :n */.git/config | bufferработает.
Матин Улхак,
2

В командной строке Vim: я ожидал :find */.git/configсделать что-то подобное (то есть открыть все файлы, соответствующие выражению glob), но вместо этого он жалуется E77: Too many file names.

Не ждите ничего, прежде чем читать документацию.

В дополнение к ответу Тома, вы можете напрямую использовать :nextв качестве альтернативы :args.

romainl
источник
0

Открытие файлов vim */.git/configопределенно должно работать. Если этого не произойдет, вы должны обновить Vim до 7.4 (предыдущая версия была более глючной).

Или попробуйте одно из следующих действий (в редакторе):

:n `find .git/ -name config`
:args `find . -name config`
kenorb
источник
Вы не внимательно прочитали мой вопрос. И, принятый ответ уже упоминает :args.
Джастин М. Кейс
@ JustinM.Keyes Спасибо за ваши очки. Подстановочный знак должен работать по умолчанию, и это единственный ответ, который говорит, что он должен работать в 7.4 (поскольку у меня была точно такая же ошибка перед обновлением). Использование args- это только обходной путь, но более подробно он показывает, как использовать расширение оболочки в vim it-self на тот случай, если другие пользователи захотят использовать его для более сложных решений, используя find, например, это . Поэтому я думаю, что это придает дополнительную ценность вашему вопросу. Надеюсь, с тобой все в порядке.
Кенорб
У меня никогда не было проблем с vim */foo, и я никак не мог быть связан с версией Vim, потому что это функция оболочки .
Джастин М. Кейс
0

Очевидно, но не перечислено выше - пример поиска всех файлов sql, имеющих в своем имени строку create_table

:args **/*create_table*sql

и проверь их

:ls

и открой первый

:b 1
Йордан Георгиев
источник