Vim: открыть файлы совпадений по строкам, заданным Грепом?
Я хочу автоматически получить позиции результатов в Vim после grepping в командной строке. Есть ли такая возможность?
Файлы для открытия в Vim на строках, заданных grep:
% grep --colour -n checkWordInFile *
SearchToUser.java:170: public boolean checkWordInFile(String word, File file) {
SearchToUser.java~:17: public boolean checkWordInFile(String word, File file) {
SearchToUser.java~:41: if(checkWordInFile(word, f))
Ответы
Ответ 1
Посмотрите на Интеграция инструментов поиска Grep с Vim "и" Найти файлы в Vim". В основном vim предоставляет эти команды для поиска файлов:
:grep
:lgrep
:vimgrep
:lvimgrep
В статьях содержится дополнительная информация об их использовании.
Ответ 2
Если вы передаете вывод с grep
в vim
% grep -n checkWordInFile * | vim -
вы можете поместить курсор на имя файла и нажать gF
, чтобы перейти к строке в этом файле, на которую ссылается эта строка вывода grep. ^WF
откроет его в новом окне.
Изнутри vim вы можете сделать то же самое с
:tabedit
:r !grep -n checkWordInFile *
что эквивалентно, но менее удобно, чем
:lgrep checkWordInFile *
:lopen
который вызывает окно суперфантастического quickfix, чтобы вы могли удобно просматривать результаты поиска.
Вы можете альтернативно получать более медленные, но в некотором роде более гибкие результаты, используя vim native grep:
:lvimgrep checkWordInFile *
:lopen
Этот использует vim REs и пути (например, разрешает **). Это может занять в 2-4 раза больше времени (возможно, больше), но вы можете использовать фантазию \(\)\@<=
и птиц перьев.
Ответ 3
Вы можете сделать это:
% vim "+/checkWordInFile" $(grep -l checkWordInFile *)
В командной строке vim будет указан список всех файлов, соответствующих регулярному выражению. Опция "+/..." подскажет vim для поиска с начала каждого файла, пока не найдет первую строку, соответствующую регулярному выражению.
Исправление:
Параметр +/... будет искать только первый файл для регулярного выражения. Для поиска в каждом файле вам нужно следующее:
% vim "-c bufdo /checkWordInFile" $(grep -l checkWordInFile *)
Если вам нужно часто делать что-то, вы можете написать функцию bash, так что вам нужно будет только один раз задать регулярное выражение (предполагая, что регулярное выражение действует как для grep, так и для vim).
Ответ 4
Я думаю, что это то, что вы ищете:
http://www.vim.org/scripts/script.php?script_id=2184
Когда вы открываете файл: line, например, при копировании и вставке из ошибки из вашего компилятора (или grep output) vim пытается открыть файл с двоеточием в его имени. С помощью этого небольшого script в вашей папке плагинов, если материал после двоеточия является числом, а файл существует с именем, указанным до того, как двоеточие vim откроет этот файл и отвезет вас в нужную вам линию.
Это определенно то, что я искал.
Ответ 5
Я настоятельно рекомендую ack.vim по grep для этой функции.
http://github.com/mileszs/ack.vim
http://betterthangrep.com/
Ответ 6
Вы, вероятно, захотите сделать для них функции.:)
Последовательные vim
вызовы (консоль)
grep -rn "implements" app | # Or any (with "-n") you like
awk '{
split($0,a,":"); # split on ":"
print "</dev/tty vim", a[1], "+" a[2] # results in lines with "</dev/tty vim <foundfile> +<linenumber>
}' |
parallel --halt-on-error 1 -j1 --tty bash -ec # halt on error and "-e" important to make it possible to quit in the middle
Используйте :cq
от vim
, чтобы остановить редактирование.
Параллельное открытие вкладок (gvim
)
Запустите сервер:
gvim --servername GVIM
Откройте вкладки:
grep -rn "implements" app | # again, any grep you like (with "-n")
awk "{ # double quotes because of $PWD
split(\$0,a,\":\"); # split on ":"
print \":tabedit $PWD/\" a[1] \"<CR>\" a[2] \"G\" # Vim commands. Open file, then jump to line
}" |
parallel gvim --servername GVIM --remote-send # of course the servername needs to match
Ответ 7
В этом конкретном примере:
vim SearchToUser.java +170