У меня есть файлы, которые я использую в своих файлах. Я хочу искать их, когда нахожусь в файле, в котором есть эти источники.
Я бегу безуспешно
!bufdo grep source
и
!bufdo grep source %
Пример .zshrc, из которого были получены ПУТИ, которые я хочу использовать с помощью grep
# ~/bin/shells/Zsh/describtion
# ~/bin/shells/Zsh/bugs
# ./bin/shells/zsh/alphaOptions
. /Users/masi/bin/shells/.personal/ssh
. /Users/masi/bin/shells/.personal/shellVariables
. /Users/masi/bin/shells/.personal/alias
. /Users/masi/bin/shells/externalPrograms
. /Users/masi/bin/shells/codingSettings
# . /Users/masi/bin/shells/OS/ubuntu/alias
# ~/bin/shells/Zsh/sources
Предположим, вы находитесь на моем .zshrc. Вы хотите искать слово «руководство» во всех исходных файлах в Vim.
Как бы вы могли искать слово "руководство" только в исходных файлах?
Это сработало для меня:
:! grep manual `sed -n 's/^\. \(.*\)/\1/p' %`
Часть sed ищет исходные файлы и передает их в качестве аргументов grep.
Чтобы не вводить это каждый раз, вы можете создать такую команду:
:command! -nargs=1 SourceGrep :! grep <args> `sed -n 's/^\. \(.*\)/\1/p' %`
Будьте осторожны при поиске более чем одного слова, вам придется использовать кавычки. Например:
:SourceGrep "sudo ssh"
РЕДАКТИРОВАТЬ:
Для поиска строк с 'источником', а также '.':
:! grep manual `sed -rn 's/^(\.|source) (.*)/\2/p' %`
Команда будет выглядеть так:
:command! -nargs=1 SourceGrep :! grep <args> `sed -rn 's/^(source|\.) (.*)/\2/p' %`
Я не уверен, правильно ли я понял ваш вопрос, но если вы хотите запустить внешнюю команду из vim и передать ей содержимое файла, который вы в настоящее время редактируете, вы можете использовать что-то вроде этого:
:! grep sometext%
Предполагая, что у вас открыт файл .zshrc, и вы хотите что-то найти во всех исходных файлах в нем. Вы можете сделать это из vim вот так:
!sed -ne 's/^\. \(.*\)/\1/gp' % | xargs grep foobar
Замените "foobar" на то, что хотите grep.
Предполагая, что ваш основной файл называется mainfile, вы можете запустить что-то вроде:
$ grep searchstring mainfile $(grep source mainfile | awk '{print $2}')
(Я предполагал, что вы используете source <file>
внутри вашего основного файла для поиска)
Обновление: см. Пример:
$ head a b c
==> a <==
afile
source b
source c
==> b <==
bfile
==> c <==
cfile
$ grep file a $(grep source a | awk '{print $2}')
a:afile
b:bfile
c:cfile