vim - abre arquivos contendo uma string específica em novas abas

vim - abre arquivos contendo uma string específica em novas abas

Estou procurando uma maneira de abrir todos os arquivos que contêm uma string específica em novas guias do vim.

Os arquivos não estão em um diretório específico, mas espalhados por uma árvore de diretórios.

Idealmente, quero pular para a posição da correspondência de string em cada arquivo.

Melhor ainda se puder ser executado dentro do vim

Responder1

não é exatamente o que você está procurando, mas você pode encontrar todos os arquivos que contêm sua string da seguinte maneira:

:grep -r "string" directory

e navegue pelos resultados usando:

:copen

que abre uma quickfixjanela contendo os resultados, e então você pode subir/descer na lista e pressionar <CR>para carregar esse arquivo na linha correspondente em um novo buffer.

É a maneira vim de fazer grep. Claro, você pode usar :vimgrepem vez disso ou usar oPlug-in Grepou oPlug-in de confirmação. O plugin ack possui um recurso para abrir o resultado em uma nova aba, se você pressionar tem vez de <CR>uma linha de resultado.

Responder2

Você poderia colocar o seguinte em seu arquivo .vimrc:

com! -nargs=+ PatternFilesToTabs call s:PatternFilesToTabs(<q-args>)

function! s:PatternFilesToTabs(pattern)
    let savelz=&lz
    let savlast=@#
    let savfile=@%
    let hash={}
    let files=[]
    sil! redir => result
    exec 'sil! grep ' . a:pattern . ' -r .'
    sil! redir end
    for line in split(result, '\n')
        if (match(line, ':\d\+:') > 0)
            let filen=substitute(line, ':.*', '', '')
            if (!has_key(hash,filen))
                let hash[filen] = 1
                let files += [ filen ]
            endif
        endif
    endfor
    for filen in files
        exec 'sil! tabedit ' . filen
        1
        sil! call search(a:pattern)
    endfor
    exec 'sil! tabp ' . len(files)
    exec 'sil! edit ' . savlast
    exec 'sil! edit ' . savfile
    let &lz=savelz
endfunction

Responder3

Para abrir os arquivos contendo "*backup-file.*.sh"a string do padrão glob do shell diretamente do shell bash use o seguinte oneliner (sim, você poderia modificar o comando find contanto que obedecesse às aspas simples

   # in bash
   vim -c ':args `find . -type f -name '\''*backup-file.*.sh'\''`'

informação relacionada