2009-02-17 9 views
6

में lgrep और rgrep मुझे Emacs में greps के साथ समस्याएं आ रही हैं।एएमएक्स

ए) grep को समझ नहीं आता है। [Ch] .c और .h फ़ाइलों को खोजने के लिए। यह lgrep कमांड के साथ Emacs द्वारा प्रदान किया गया एक डिफ़ॉल्ट विकल्प है। उदाहरण .c/.h फ़ाइलों में "वैश्विक" शब्द खोज रहा है।

grep -i -nH "global" *.[ch] 
grep: *.[ch]: No such file or directory 

Grep exited abnormally with code 2 at Mon Feb 16 19:34:36 

क्या यह प्रारूप मान्य नहीं है?

ख) rgrep मैं निम्नलिखित त्रुटि मिलती है का उपयोग करना:

find . "(" -path "*/CVS" -o -path "*/.svn" -o -path "*/{arch}" -o -path "*/.hg" -o -path "*/_darcs" -o -path "*/.git" -o -path "*/.bzr" ")" -prune -o -type f "(" -iname "*.[ch]" ")" -print0 | xargs -0 -e grep -i -nH "global" 
FIND: Wrong parameter format 

Grep finished (matches found) at Mon Feb 16 19:37:10 

मैं जीएनयू W32 Utils साथ Windows XP (ग्रेप पर Emacs 22.3.1 उपयोग कर रहा हूँ, मिल जाए, xargs आदि)। Grep v2.5.3 और v4.2.20 खोजें।

मुझे क्या याद आ रही है?

अद्यतन:

बहुत खराब एक एकाधिक जवाब ... स्वीकार नहीं कर सकते, क्योंकि मेरी समस्याओं का हल बाहर फैले हुए हैं।

grep -i -nH "global" *.c *.h 

यह पहली समस्या हल करता है। धन्यवाद लुपायाद!

(setq find-program "c:\\path\\to\\gnuw32\\find.exe") 

emacs वास्तव में Windows find.exe का उपयोग कर रहा था। Gnu32 को मजबूर करना दूसरी समस्या को हल करता है। धन्यवाद स्कॉटफ्रेज़र।

हालांकि, मुझे अभी भी ack पसंद है।

+1

rgrep उपयोग करने के लिए एक आसान तरीका है: ग्रेप -r --include = \ * [ch] --exclude = \ */{सीवीएस। , .svn, arch, .hg, _darcs, .git, .bzr} -i -nH वैश्विक। –

+1

क्या आप अपनी पोस्ट को खोज-कार्यक्रम के उत्तर को सटीक रूप से प्रतिबिंबित करने के लिए बदल सकते हैं? आपने आज मुझे कुछ कठिनाई का कारण बना दिया। अंतर डबल बैक-स्लेश की आवश्यकता है। (सेटक खोज-प्रोग्राम "सी: \\ पथ \\ \\ gnuw32 \\ find.exe") –

+0

@ मैथ्यू टैलबर्ट, मुझे लगता है कि मार्कडाउन प्रोसेसर अतिरिक्त बैकस्लाश को निगल रहा था। मैंने इसे ठीक करने के लिए एक संपादन सबमिट किया। – Alan

उत्तर

5

ठीक है, वहाँ हमेशा Ack और Ack.el है

+0

दोह! मैं पूरी तरह से एक के बारे में भूल गया! इसे विम में प्यार करो। धन्यवाद! – cschol

1

मैं आमतौर पर केवल M-x grep का उपयोग करता हूं और अगर मुझे आवश्यकता होती है तो कमांड लाइन तर्क बदलता है। लेकिन मैंने अभी M-x lgrep चलाने की कोशिश की और आपको वही चीज़ मिल गई। इसका मतलब यह है कि वर्तमान निर्देशिका में *.[ch] से कोई फ़ाइल मेल नहीं खाती है। कि बफर में lgrep के लिए

M-x customize-group RET grep RET 

खोजें खोजने के लिए/संपादन Grep खाका: आप -r और शामिल साथ ही बच्चे निर्देशिका के माध्यम से रिकर्सिवली खोज करने के लिए डिफ़ॉल्ट विकल्प अनुकूलित कर सकते हैं।

जहां तक ​​M-x rgrep चला जाता है, मुझे संदेह है कि इसका डिफ़ॉल्ट संस्करण पसंद नहीं करते find के विंडोज संस्करण के साथ कुछ करना है। यह आदेश लिनक्स पर मेरे लिए ठीक काम करता है। उसी कस्टमाइज़ बफर में rgrep के लिए खोजें और उन विकल्पों को ट्विक करें जब तक कि विंडोज़ खोज खुश न हो जाए।

क्षमा करें मैं विंडोज विकल्पों के साथ और अधिक मदद नहीं कर सकता, लेकिन मैं उनसे परिचित नहीं हूं।

5

ए के लिए) ऐसा लगता है कि वर्तमान निर्देशिका में कोई भी .c या .h फ़ाइलें नहीं हैं।

बी के लिए) विंडोज़ जीएनयू डब्ल्यू 32 यूटिल्स के बजाय अपने स्वयं के खोज का उपयोग करने की कोशिश कर रहा है। प्रयास करें:

(setq find-program "c:\\path\\to\\gnuw32\\find.exe")

+0

इससे आज मुझे मदद मिली। धन्यवाद! –

2

मुझे लगता है कि सामान्य समस्या खिड़कियों cmd ​​है "खोल" बहुत अलग एक यूनिक्स खोल करने के लिए फ़ाइल नाम विस्तार regexps और वाइल्डकार्ड के संबंध में व्यवहार करता है।(यदि कोई * ग या * ज के अस्तित्व में आप अभी भी एक "अमान्य तर्क" मिल जाएगा)

grep -i -nH "global" *.c *.h 

:

का उपयोग कर अपने (क) कोशिश ऊपर उत्तर देने के लिए।

या आप आदेश पंक्ति विकल्प --include=\*.[ch] उपयोग कर सकते हैं खिड़कियों ग्रेप बनाने के लिए करते हैं "उचित" फ़ाइल नाम पैटर्न मिलान (अन्य विकल्पों के लिए grep --help देखें)

3

एडम Rosenfield टिप्पणी है एक जवाब में विस्तार के लायक:

grep -r --include=\*.[ch] --exclude=\*{CVS,.svn,arch} -i -nH 

उदाहरण इस सवाल का काम में दी गई हैं, इस का उपयोग करें:

grep -i -nH --include=\*.[ch] "global" * 

यह भी M-x grep चर grep-command उपलब्ध कराने के डिफ़ॉल्ट सेट करने उपयोगी है:

(setq grep-command "grep -i -nH --include=\*.[ch] ") 
इसके अलावा

यहाँ कुछ अन्य उपयोगी कमांड लाइन grep के लिए मानकों हैं:

-n print the line number 

-s suppress error messages 

-r recursive 
6

मुझे पता चला है कि का उपयोग कर:

(setq find-program "\"C:/path/to/GnuWin32/bin/find.exe\"") 
(setq grep-program "\"C:/path/to/GnuWin32/bin/grep.exe\"") 

विंडोज़ में बेहतर काम करता है, क्योंकि आपके पास पथ के चारों ओर एक जगह बिछा सकती है और अंततः खराब हो जाएगी।

नोटिस मैंने अपने .emacs फ़ाइल में दो प्रोग्रामों का उपयोग किया।

आशा है कि यह जरूरत में कुछ अन्य प्रोग्रामर के लिए कुछ मदद की है;)

संबंधित मुद्दे