2010-06-24 37 views
5

tôi cố gắng sử dụng grep nội vim với '**' ký tự đại diện như trong lệnh sau:Vim: wildcard grep của không hoạt động trong cửa sổ

grep "test" **\*.txt 

vim cung cấp cho các lỗi sau:

FINDSTR: Cannot open **\*.txt 

Khi Tôi xóa ký tự đại diện '**', lệnh hoạt động đúng:

grep "test" *.txt 

Tôi đã thay đổi ba ckslashes để chuyển tiếp dấu gạch chéo, nhưng nó không giúp đỡ:

grep "test" **\*.txt 

Điều này sẽ cho lỗi trên một lần nữa.

Lý do có thể là gì?

Lưu ý: Tôi sử dụng GVim 7.2 trên Microsoft Windows XP.

Trả lời

5

Thực hiện ": grep" trong Vim trong XP không sử dụng "grep.exe" theo mặc định. Theo mặc định, "FINDSTR" được sử dụng là một phần của quá trình cài đặt Windows. "FINDSTR" không tương thích để grep. Do đó, bạn nhận được thông báo lỗi

FINDSTR: Cannot open **\*.txt 

Xem ": help grepprg".

Nếu bạn muốn sử dụng cổng grep của Windows, bạn phải cài đặt vì grep không phải là một phần của Windows hay cài đặt Vim .

Nhưng kể từ 7.0 Vim có grep nội bộ được gọi là vimgrep. Xem ": help vimgrep" để biết chi tiết.

Bạn phải đặt 'grepprg' sao cho phù hợp để sử dụng grep hoặc vimgrep (thay vì FINDSTR mặc định).

+2

Thank you very much. Điều này giải quyết được vấn đề: ": set grepprg = internal" –

2

Install cygwin, mingw, hayunxutils để có được grep (tôi sử dụng Cygwin). Thêm thư mục bin vào PATH của bạn.

Và cũng giống như Habi said, thêm vào vimrc của bạn:

set grepprg=grep\ -nH 

(Đây là những gì grep trên * nix sử dụng theo mặc định.)

Ngoài ra, nếu bạn :help grep, bạn sẽ nhận được một mô tả về sự khác biệt giữa grep và vimgrep. (Tốc độ so với tính di động và linh hoạt.)

+0

Trong trường hợp của tôi, tôi đã phải sử dụng 'set grepprg = grep \ -nH', nhưng nếu không thì điều này làm việc hoàn hảo. –

+0

@Smashd: Đã sửa lỗi! – idbrii

1

Trên Windows, nếu bạn muốn để móc vào nhanh hơn findstr bạn có thể sử dụng

set grepprg=findstr\ /n\ /s

Trong bạn.vimrc và bây giờ

:vimgrep methodname **/*.py tương đương với

:grep methodname *.py

Cả hai trả về một danh sách các kết quả mà bạn có thể điều hướng thông qua các cửa sổ QuickFix (:copen, :cn/:cp, :cclose)

Theo kinh nghiệm của findstr của tôi nhanh hơn khoảng 30 lần so với vimgrep, tuy nhiên nó có thể không quan trọng với kích thước dự án của bạn và regex của vimgrep là đẹp hơn rất nhiều để sử dụng.

0

Lưu ý rằng: grep không phải là grep nội bộ của vim (nghĩa là: vimgrep), mà là trình bao bọc cho chương trình grep bên ngoài.

Nếu bạn đã cài đặt trình ghép mẫu thay thế (nghĩa là, grep của MinGW hoặc Cygwin), bạn có thể chỉnh sửa tệp vimrc của mình để sử dụng nó thay thế.

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

Các '$ ' là nơi biểu hiện của bạn sẽ đi, các '' ở cuối có nghĩa là tất cả các loại tập tin. Grep là đủ nhanh hoặc codebase của tôi đủ nhỏ mà tôi không quan tâm để giới hạn các loại tập tin. Sử dụng các cờ -n và -R sẽ làm cho nó trả về kết quả khá giống với vimgrep (rõ ràng là các biểu thức patter sẽ khác nhau).

0

** Được mở rộng bằng công cụ bên ngoài được chỉ định trong 'grepprg', hoặc trong trường hợp của Windows, không được mở rộng vì grepprg chỉ là công cụ tìm kiếm.

Nhưng bất kỳ đối số bạn vượt qua trên dòng lệnh Vim cũng đi đến công cụ này, vì vậy chỉ cần thực hiện tìm kiếm findstr đệ quy:

:grep /S pattern *.txt 
Các vấn đề liên quan