![vim — открытие файлов, содержащих определенную строку, в новых вкладках](https://rvso.com/image/1365800/vim%20%E2%80%94%20%D0%BE%D1%82%D0%BA%D1%80%D1%8B%D1%82%D0%B8%D0%B5%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%2C%20%D1%81%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B0%D1%89%D0%B8%D1%85%20%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%BD%D1%83%D1%8E%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D1%83%2C%20%D0%B2%20%D0%BD%D0%BE%D0%B2%D1%8B%D1%85%20%D0%B2%D0%BA%D0%BB%D0%B0%D0%B4%D0%BA%D0%B0%D1%85.png)
Я ищу способ открыть все файлы, содержащие определенную строку, в новых вкладках Vim.
Файлы не находятся в определенном каталоге, а разбросаны по дереву каталогов.
В идеале я хочу перейти к позиции совпадения строки в каждом файле.
Еще лучше, если это можно будет выполнить в vim.
решение1
Это не совсем то, что вы ищете, но вы можете найти все файлы, содержащие вашу строку, следующим образом:
:grep -r "string" directory
а затем просмотрите результаты, используя:
:copen
откроется quickfix
окно с результатами, после чего вы сможете перемещаться вверх/вниз по списку и нажимать , <CR>
чтобы загрузить файл на совпадающей строке в новый буфер.
Это способ grepping в vim. Конечно, вы можете использовать :vimgrep
вместо этого, или использоватьПлагин GrepилиПодтверждение плагина. Плагин ack имеет функцию открытия результата в новой вкладке, если нажать t
вместо <CR>
строки результата.
решение2
Вы можете поместить в файл .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
решение3
Чтобы открыть файлы, содержащие "*backup-file.*.sh"
строку шаблона shell glob, прямо из оболочки bash, используйте следующий однострочник (да, вы можете изменить команду find, если вы соблюдаете правила заключения в одинарные кавычки)
# in bash
vim -c ':args `find . -type f -name '\''*backup-file.*.sh'\''`'