Назад | Перейти на главную страницу

Невозможно найти файлы с исходным кодом в Vim

У меня есть файлы, которые я использую в своих файлах. Я хочу искать их, когда нахожусь в файле, в котором есть эти источники.

Я бегу безуспешно

!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