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))

Ответ 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 откроет этот файл и отвезет вас в нужную вам линию.

Это определенно то, что я искал.

Ответ 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