Vim: открыть файлы матчей на линиях, заданных Grep? - PullRequest
11 голосов
/ 16 апреля 2010

Я хочу автоматически перейти к позициям результатов в Vim после поиска в командной строке.Есть ли такая возможность?

Файлы, которые нужно открыть в 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))

Ответы [ 7 ]

26 голосов
/ 17 апреля 2010

Если вы передаете вывод из grep в vim

% grep -n checkWordInFile * | vim -

Вы можете навести курсор на имя файла и нажать gF, чтобы перейти к строке в этом файле, на которую ссылается эта строка вывода grep. ^WF откроет его в новом окне.

Изнутри vim вы можете сделать то же самое с

:tabedit
:r !grep -n checkWordInFile *

, что эквивалентно, но менее удобно, чем

:lgrep checkWordInFile *
:lopen

, которое открывает окно сверхбыстрого быстрого исправления, чтобы вы могли удобно просматривать результаты поиска.

В качестве альтернативы вы можете получить более медленные, но более гибкие результаты с помощью встроенного в vim grep:

:lvimgrep checkWordInFile *
:lopen

Этот использует vim RE и пути (например, разрешающий **). Для бега может потребоваться в 2-4 раза больше (может быть, больше), но вы можете использовать причудливые \(\)\@<= s и перья птиц.

7 голосов
/ 16 апреля 2010

Посмотрите " Интеграция инструментов поиска Grep с Vim " и " Поиск в файлах в Vim ". В основном vim предоставляет следующие команды для поиска файлов:

:grep
:lgrep
:vimgrep
:lvimgrep

В статьях содержится более подробная информация об их использовании.

5 голосов
/ 16 апреля 2010

Вы можете сделать это:

% vim "+/checkWordInFile" $(grep -l checkWordInFile *)

Это поместит в командную строку vim список всех файлов, которые соответствуют регулярному выражению. Опция "+ / ..." будет указывать vim выполнять поиск с начала каждого файла, пока не найдет первую строку, соответствующую регулярному выражению.

Исправление:

Опция + / ... будет искать в первом файле только регулярное выражение. Для поиска в каждом файле вам нужно:

% vim "-c bufdo /checkWordInFile" $(grep -l checkWordInFile *)

Если это то, что вам нужно делать часто, вы можете написать функцию bash, чтобы вам нужно было указывать регулярное выражение только один раз (при условии, что регулярное выражение действительно как для grep, так и для vim).

4 голосов
/ 12 сентября 2012

Я думаю, это то, что вы ищете:

http://www.vim.org/scripts/script.php?script_id=2184

Когда вы открываете файл: строка, например, при копировании и вставке из ошибки вашего компилятора (или вывод grep) vim пытается открыть файл с двоеточием в имени. С помощью этого небольшого сценария в папке плагинов, если после двоеточия указан номер и существует файл с указанным именем, прежде чем двоеточие vim откроет этот файл и перенаправит вас на строку, которую вы хотели.

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

2 голосов
/ 01 марта 2013

Вы, вероятно, хотите сделать функции для них. :)

Последовательные 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
2 голосов
/ 16 апреля 2010

Я настоятельно рекомендую ack.vim over grep для этой функции.

http://github.com/mileszs/ack.vim

http://betterthangrep.com/

0 голосов
/ 16 апреля 2010

В этом конкретном примере:

vim SearchToUser.java +170
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...