Mercurial > cpython-lru_cache-weakref
annotate Lib/idlelib/GrepDialog.py @ 79675:c0a2294de787 2.7
Issue #16199: Backport 2to3 typo fix from 3.2.
| author | Chris Jerdonek <chris.jerdonek@gmail.com> |
|---|---|
| date | Thu, 11 Oct 2012 16:15:46 -0700 |
| parents | eab361617f6a |
| children | 3c0e8e910125 |
| rev | line source |
|---|---|
| 13975 | 1 import os |
| 2 import fnmatch | |
| 3 import sys | |
|
47183
b53604fad54b
Tkinter rename reversal: remove tkinter package, adapt imports and docs.
Georg Brandl <georg@python.org>
parents:
47101
diff
changeset
|
4 from Tkinter import * |
|
60144
eab361617f6a
#7092: Fix additional "-3" warnings in the idlelib package, and convert to absolute imports.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
47183
diff
changeset
|
5 from idlelib import SearchEngine |
|
eab361617f6a
#7092: Fix additional "-3" warnings in the idlelib package, and convert to absolute imports.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
47183
diff
changeset
|
6 from idlelib.SearchDialogBase import SearchDialogBase |
| 13975 | 7 |
| 8 def grep(text, io=None, flist=None): | |
| 9 root = text._root() | |
| 10 engine = SearchEngine.get(root) | |
| 11 if not hasattr(engine, "_grepdialog"): | |
| 12 engine._grepdialog = GrepDialog(root, engine, flist) | |
| 13 dialog = engine._grepdialog | |
|
29368
1219021c4865
1. Find in Files Dialog shows text selection if there is one
Kurt B. Kaiser <kbk@shore.net>
parents:
25288
diff
changeset
|
14 searchphrase = text.get("sel.first", "sel.last") |
|
1219021c4865
1. Find in Files Dialog shows text selection if there is one
Kurt B. Kaiser <kbk@shore.net>
parents:
25288
diff
changeset
|
15 dialog.open(text, searchphrase, io) |
| 13975 | 16 |
| 17 class GrepDialog(SearchDialogBase): | |
| 18 | |
| 19 title = "Find in Files Dialog" | |
| 20 icon = "Grep" | |
| 21 needwrapbutton = 0 | |
| 22 | |
| 23 def __init__(self, root, engine, flist): | |
| 24 SearchDialogBase.__init__(self, root, engine) | |
| 25 self.flist = flist | |
| 26 self.globvar = StringVar(root) | |
| 27 self.recvar = BooleanVar(root) | |
| 28 | |
|
29368
1219021c4865
1. Find in Files Dialog shows text selection if there is one
Kurt B. Kaiser <kbk@shore.net>
parents:
25288
diff
changeset
|
29 def open(self, text, searchphrase, io=None): |
|
1219021c4865
1. Find in Files Dialog shows text selection if there is one
Kurt B. Kaiser <kbk@shore.net>
parents:
25288
diff
changeset
|
30 SearchDialogBase.open(self, text, searchphrase) |
| 13975 | 31 if io: |
| 32 path = io.filename or "" | |
| 33 else: | |
| 34 path = "" | |
| 35 dir, base = os.path.split(path) | |
| 36 head, tail = os.path.splitext(base) | |
| 37 if not tail: | |
| 38 tail = ".py" | |
| 39 self.globvar.set(os.path.join(dir, "*" + tail)) | |
| 40 | |
| 41 def create_entries(self): | |
| 42 SearchDialogBase.create_entries(self) | |
| 43 self.globent = self.make_entry("In files:", self.globvar) | |
| 44 | |
| 45 def create_other_buttons(self): | |
| 46 f = self.make_frame() | |
| 47 | |
| 48 btn = Checkbutton(f, anchor="w", | |
| 49 variable=self.recvar, | |
| 50 text="Recurse down subdirectories") | |
| 51 btn.pack(side="top", fill="both") | |
| 52 btn.select() | |
| 53 | |
| 54 def create_command_buttons(self): | |
| 55 SearchDialogBase.create_command_buttons(self) | |
| 56 self.make_button("Search Files", self.default_command, 1) | |
| 57 | |
| 58 def default_command(self, event=None): | |
| 59 prog = self.engine.getprog() | |
| 60 if not prog: | |
| 61 return | |
| 62 path = self.globvar.get() | |
| 63 if not path: | |
| 64 self.top.bell() | |
| 65 return | |
|
60144
eab361617f6a
#7092: Fix additional "-3" warnings in the idlelib package, and convert to absolute imports.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
47183
diff
changeset
|
66 from idlelib.OutputWindow import OutputWindow |
| 13975 | 67 save = sys.stdout |
| 68 try: | |
| 69 sys.stdout = OutputWindow(self.flist) | |
| 70 self.grep_it(prog, path) | |
| 71 finally: | |
| 72 sys.stdout = save | |
| 73 | |
| 74 def grep_it(self, prog, path): | |
| 75 dir, base = os.path.split(path) | |
| 76 list = self.findfiles(dir, base, self.recvar.get()) | |
| 77 list.sort() | |
| 78 self.close() | |
| 79 pat = self.engine.getpat() | |
|
31515
71a294bd7950
Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents:
29368
diff
changeset
|
80 print "Searching %r in %s ..." % (pat, path) |
| 13975 | 81 hits = 0 |
| 82 for fn in list: | |
| 83 try: | |
| 84 f = open(fn) | |
| 85 except IOError, msg: | |
| 86 print msg | |
| 87 continue | |
| 88 lineno = 0 | |
| 89 while 1: | |
| 90 block = f.readlines(100000) | |
| 91 if not block: | |
| 92 break | |
| 93 for line in block: | |
| 94 lineno = lineno + 1 | |
| 95 if line[-1:] == '\n': | |
| 96 line = line[:-1] | |
| 97 if prog.search(line): | |
| 98 sys.stdout.write("%s: %s: %s\n" % (fn, lineno, line)) | |
| 99 hits = hits + 1 | |
| 100 if hits: | |
| 101 if hits == 1: | |
| 102 s = "" | |
| 103 else: | |
| 104 s = "s" | |
| 105 print "Found", hits, "hit%s." % s | |
| 106 print "(Hint: right-click to open locations.)" | |
| 107 else: | |
| 108 print "No hits." | |
| 109 | |
| 110 def findfiles(self, dir, base, rec): | |
| 111 try: | |
| 112 names = os.listdir(dir or os.curdir) | |
| 113 except os.error, msg: | |
| 114 print msg | |
| 115 return [] | |
| 116 list = [] | |
| 117 subdirs = [] | |
| 118 for name in names: | |
| 119 fn = os.path.join(dir, name) | |
| 120 if os.path.isdir(fn): | |
| 121 subdirs.append(fn) | |
| 122 else: | |
| 123 if fnmatch.fnmatch(name, base): | |
| 124 list.append(fn) | |
| 125 if rec: | |
| 126 for subdir in subdirs: | |
| 127 list.extend(self.findfiles(subdir, base, rec)) | |
| 128 return list | |
| 129 | |
| 130 def close(self, event=None): | |
| 131 if self.top: | |
| 132 self.top.grab_release() | |
| 133 self.top.withdraw() |
