Não é possível obter arquivos de origem do grep no Vim

1

Eu tenho arquivos que eu forneço em meus arquivos. Eu quero pesquisá-los, quando estou em um arquivo que tem essas fontes.

Eu corro sem sucesso

!bufdo grep source 

e

!bufdo grep source %

Exemplo de .zshrc que originou PATHs que eu quero 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

Vamos supor que você esteja no meu .zshrc. Você deseja pesquisar a palavra "manual" em todos os arquivos originados no Vim.

Como você procuraria a palavra manual apenas nos arquivos de origem?

    
por Léo Léopold Hertz 준영 03.06.2009 / 14:35

4 respostas

3

Isso funcionou para mim:

:! grep manual 'sed -n 's/^\. \(.*\)//p' %'

A parte sed procura pelos arquivos fonte e os fornece como argumentos para o grep.

Para evitar ter que digitar isso toda vez, você pode criar um comando como este:

:command! -nargs=1 SourceGrep :! grep <args> 'sed -n 's/^\. \(.*\)//p' %'

Tenha cuidado ao pesquisar por mais de uma palavra, você terá que usar aspas. Por exemplo:

:SourceGrep "sudo ssh"

EDITAR:

Para pesquisar por linhas com 'source' e '.':

:! grep manual 'sed -rn 's/^(\.|source) (.*)//p' %'

O comando ficará assim:

:command! -nargs=1 SourceGrep :! grep <args> 'sed -rn 's/^(source|\.) (.*)//p' %'
    
por 29.06.2009 / 14:14
1

Não tenho certeza se entendi sua pergunta corretamente, mas se você quer executar o comando externo do vim e passar o conteúdo do arquivo que está editando no momento, você pode usar algo assim:

:! grep sometext%

    
por 03.06.2009 / 14:42
1

Supondo que você tenha seu arquivo .zshrc aberto, e você deseja fazer algo em todas as fontes de arquivos nele. Você pode fazer isso do vim assim:

!sed -ne 's/^\. \(.*\)//gp' % | xargs grep foobar

Substitua "foobar" por qualquer coisa que você queira grep.

    
por 30.06.2009 / 19:34
0

Supondo que seu arquivo principal é chamado de 'mainfile', você pode executar algo como:

$ grep searchstring mainfile $(grep source mainfile | awk '{print $2}')

(Eu assumi que você usa source <file> dentro do seu mainfile para o sourcing)

Atualização: veja um exemplo:

$ 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
    
por 03.06.2009 / 14:39

Tags