Vim: подстановочный знак grep не работает в Windows - PullRequest
5 голосов
/ 24 июня 2010

Я пытаюсь использовать внутренний grep vim с подстановочным знаком '**', как в следующей команде:

grep "test" **\*.txt

vim выдает следующую ошибку:

FINDSTR: Cannot open **\*.txt

Когда я удаляю '**' Подстановочный знак, команда работает должным образом:

grep "test" *.txt

Я изменил обратную косую черту на прямую косую черту, но это также не помогло:

grep "test" **\*.txt

Это снова выдает вышеуказанную ошибку.

В чем может быть причина?

Примечание. Я использую GVim 7.2 в Microsoft Windows XP.

Ответы [ 6 ]

5 голосов
/ 24 июня 2010

Выполнение «: grep» в Vim под XP не использует «grep.exe» по умолчанию.По умолчанию используется FINDSTR, который является частью установки Windows.«FINDSTR» не совместим с grep.В связи с этим вы получаете сообщение об ошибке

FINDSTR: Cannot open **\*.txt

См. «: Help grepprg».

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

Но начиная с 7.0 Vim имеет внутреннюю grep, называемую vimgrep.См. ": Help vimgrep" для получения подробной информации.

Вы должны установить 'grepprg' соответственно, чтобы использовать либо grep, либо vimgrep (вместо FINDSTR по умолчанию).

2 голосов
/ 25 июня 2010

Установка cygwin , mingw , или unxutils для получения grep (я использую cygwin). Добавьте каталог bin в вашу PATH.

И, как Хаби сказал , добавьте в свой vimrc:

set grepprg=grep\ -nH

(Это то, что grep в * nix использует по умолчанию.)

Также, если вы :help grep, вы получите описание различий между grep и vimgrep. (Скорость в сравнении с мобильностью и гибкостью.)

1 голос
/ 06 февраля 2012

В Windows, если вы хотите подключиться к более быстрому findstr, вы можете использовать

set grepprg=findstr\ /n\ /s

В вашем .vimrc, а теперь

:vimgrep methodname **/*.py эквивалентно

:grep methodname *.py

Оба возвращают список результатов, по которым вы можете перемещаться в окне быстрого исправления (:copen, :cn / :cp, :cclose)

По моему опыту, findstr примерно в 30 раз быстрее, чем vimgrep, однако это может не иметь значения для размера вашего проекта, и регулярное выражение vimgrep гораздо приятнее в использовании.

1 голос
/ 24 июня 2010

Вы должны попробовать vimgrep.

0 голосов
/ 21 августа 2014

** расширяется внешним инструментом, указанным в 'grepprg', или в случае Windows, не расширяется, поскольку grepprg - это просто инструмент findstr.

Но любые аргументы, которые вы передаете в командной строке Vim, также попадают в инструмент, поэтому просто выполните рекурсивный поиск findstr:

:grep /S pattern *.txt
0 голосов
/ 05 апреля 2013

Обратите внимание: grep - это не внутренний grep vim (то есть: vimgrep), а оболочка для внешней программы grep.

Если у вас установлен альтернативный сопоставитель шаблонов (например, MinGW или greg Cygwin), вы можете отредактировать файл vimrc, чтобы использовать его вместо этого.

set grepprg=C:/MinGW/msys/1.0/bin/egrep\ -nR\ $*\ *

«$ » - это то место, куда пойдет ваше выражение, «» в конце означает каждый тип файла. Grep достаточно быстрый или моя кодовая база достаточно мала, поэтому я не хочу ограничивать типы файлов. Использование флагов -n и -R вернет результаты почти так же, как vimgrep (очевидно, выражения patter будут другими). ​​

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