##// END OF EJS Templates
Put the documentation of the keyboard commands into the...
walter.doerwald -
Show More
@@ -1,6 +1,6 b''
1 # -*- coding: iso-8859-1 -*-
1 # -*- coding: iso-8859-1 -*-
2
2
3 import curses, fcntl, signal, struct, tty, textwrap
3 import curses, fcntl, signal, struct, tty, textwrap, inspect
4
4
5 import astyle, ipipe
5 import astyle, ipipe
6
6
@@ -13,119 +13,6 b' except NameError:'
13 set = sets.Set
13 set = sets.Set
14
14
15
15
16 _ibrowse_help = """
17 down
18 Move the cursor to the next line.
19
20 up
21 Move the cursor to the previous line.
22
23 pagedown
24 Move the cursor down one page (minus overlap).
25
26 pageup
27 Move the cursor up one page (minus overlap).
28
29 left
30 Move the cursor left.
31
32 right
33 Move the cursor right.
34
35 home
36 Move the cursor to the first column.
37
38 end
39 Move the cursor to the last column.
40
41 prevattr
42 Move the cursor one attribute column to the left.
43
44 nextattr
45 Move the cursor one attribute column to the right.
46
47 pick
48 'Pick' the object under the cursor (i.e. the row the cursor is on). This
49 leaves the browser and returns the picked object to the caller. (In IPython
50 this object will be available as the '_' variable.)
51
52 pickattr
53 'Pick' the attribute under the cursor (i.e. the row/column the cursor is on).
54
55 pickallattrs
56 Pick' the complete column under the cursor (i.e. the attribute under the
57 cursor) from all currently fetched objects. These attributes will be returned
58 as a list.
59
60 tooglemark
61 Mark/unmark the object under the cursor. Marked objects have a '!' after the
62 row number).
63
64 pickmarked
65 'Pick' marked objects. Marked objects will be returned as a list.
66
67 pickmarkedattr
68 'Pick' the attribute under the cursor from all marked objects (This returns a
69 list).
70
71 enterdefault
72 Enter the object under the cursor. (what this mean depends on the object
73 itself (i.e. how it implements the '__xiter__' method). This opens a new
74 browser 'level'.
75
76 enter
77 Enter the object under the cursor. If the object provides different enter
78 modes a menu of all modes will be presented; choose one and enter it (via the
79 'enter' or 'enterdefault' command).
80
81 enterattr
82 Enter the attribute under the cursor.
83
84 leave
85 Leave the current browser level and go back to the previous one.
86
87 detail
88 Show a detail view of the object under the cursor. This shows the name, type,
89 doc string and value of the object attributes (and it might show more
90 attributes than in the list view, depending on the object).
91
92 detailattr
93 Show a detail view of the attribute under the cursor.
94
95 markrange
96 Mark all objects from the last marked object before the current cursor
97 position to the cursor position.
98
99 sortattrasc
100 Sort the objects (in ascending order) using the attribute under the cursor as
101 the sort key.
102
103 sortattrdesc
104 Sort the objects (in descending order) using the attribute under the cursor as
105 the sort key.
106
107 hideattr
108 Hide the attribute under the cursor.
109
110 unhideattrs
111 Make all attributes visible again.
112
113 goto
114 Jump to a row. The row number can be entered at the bottom of the screen.
115
116 find
117 Search forward for a row. At the bottom of the screen the condition can be
118 entered.
119
120 findbackwards
121 Search backward for a row. At the bottom of the screen the condition can be
122 entered.
123
124 help
125 This screen.
126 """
127
128
129 class UnassignedKeyError(Exception):
16 class UnassignedKeyError(Exception):
130 """
17 """
131 Exception that is used for reporting unassigned keys.
18 Exception that is used for reporting unassigned keys.
@@ -213,13 +100,25 b' class _BrowserHelp(object):'
213
100
214 fields = ("key", "description")
101 fields = ("key", "description")
215
102
216 for (i, command) in enumerate(_ibrowse_help.strip().split("\n\n")):
103 commands = []
104 for name in dir(self.browser):
105 if name.startswith("cmd_"):
106 command = getattr(self.browser, name)
107 commands.append((inspect.getsourcelines(command)[-1], name[4:], command))
108 commands.sort()
109 commands = [(c[1], c[2]) for c in commands]
110 for (i, (name, command)) in enumerate(commands):
217 if i:
111 if i:
218 yield ipipe.Fields(fields, key="", description="")
112 yield ipipe.Fields(fields, key="", description="")
219
113
220 (name, description) = command.split("\n", 1)
114 description = command.__doc__
221 keys = allkeys.get(name, [])
115 if description is None:
116 lines = []
117 else:
118 lines = [l.strip() for l in description.splitlines() if l.strip()]
119 description = "\n".join(lines)
222 lines = textwrap.wrap(description, 60)
120 lines = textwrap.wrap(description, 60)
121 keys = allkeys.get(name, [])
223
122
224 yield ipipe.Fields(fields, description=astyle.Text((self.style_header, name)))
123 yield ipipe.Fields(fields, description=astyle.Text((self.style_header, name)))
225 for i in xrange(max(len(keys), len(lines))):
124 for i in xrange(max(len(keys), len(lines))):
@@ -1026,51 +925,74 b' class ibrowse(ipipe.Display):'
1026 # don't beep again (as long as the same key is pressed)
925 # don't beep again (as long as the same key is pressed)
1027 self._dobeep = False
926 self._dobeep = False
1028
927
1029 def cmd_quit(self):
1030 self.returnvalue = None
1031 return True
1032
1033 def cmd_up(self):
928 def cmd_up(self):
929 """
930 Move the cursor to the previous row.
931 """
1034 level = self.levels[-1]
932 level = self.levels[-1]
1035 self.report("up")
933 self.report("up")
1036 level.moveto(level.curx, level.cury-self.stepy)
934 level.moveto(level.curx, level.cury-self.stepy)
1037
935
1038 def cmd_down(self):
936 def cmd_down(self):
937 """
938 Move the cursor to the next row.
939 """
1039 level = self.levels[-1]
940 level = self.levels[-1]
1040 self.report("down")
941 self.report("down")
1041 level.moveto(level.curx, level.cury+self.stepy)
942 level.moveto(level.curx, level.cury+self.stepy)
1042
943
1043 def cmd_pageup(self):
944 def cmd_pageup(self):
945 """
946 Move the cursor up one page.
947 """
1044 level = self.levels[-1]
948 level = self.levels[-1]
1045 self.report("page up")
949 self.report("page up")
1046 level.moveto(level.curx, level.cury-level.mainsizey+self.pageoverlapy)
950 level.moveto(level.curx, level.cury-level.mainsizey+self.pageoverlapy)
1047
951
1048 def cmd_pagedown(self):
952 def cmd_pagedown(self):
953 """
954 Move the cursor down one page.
955 """
1049 level = self.levels[-1]
956 level = self.levels[-1]
1050 self.report("page down")
957 self.report("page down")
1051 level.moveto(level.curx, level.cury+level.mainsizey-self.pageoverlapy)
958 level.moveto(level.curx, level.cury+level.mainsizey-self.pageoverlapy)
1052
959
1053 def cmd_left(self):
960 def cmd_left(self):
961 """
962 Move the cursor left.
963 """
1054 level = self.levels[-1]
964 level = self.levels[-1]
1055 self.report("left")
965 self.report("left")
1056 level.moveto(level.curx-self.stepx, level.cury)
966 level.moveto(level.curx-self.stepx, level.cury)
1057
967
1058 def cmd_right(self):
968 def cmd_right(self):
969 """
970 Move the cursor right.
971 """
1059 level = self.levels[-1]
972 level = self.levels[-1]
1060 self.report("right")
973 self.report("right")
1061 level.moveto(level.curx+self.stepx, level.cury)
974 level.moveto(level.curx+self.stepx, level.cury)
1062
975
1063 def cmd_home(self):
976 def cmd_home(self):
977 """
978 Move the cursor to the first column.
979 """
1064 level = self.levels[-1]
980 level = self.levels[-1]
1065 self.report("home")
981 self.report("home")
1066 level.moveto(0, level.cury)
982 level.moveto(0, level.cury)
1067
983
1068 def cmd_end(self):
984 def cmd_end(self):
985 """
986 Move the cursor to the last column.
987 """
1069 level = self.levels[-1]
988 level = self.levels[-1]
1070 self.report("end")
989 self.report("end")
1071 level.moveto(level.datasizex+level.mainsizey-self.pageoverlapx, level.cury)
990 level.moveto(level.datasizex+level.mainsizey-self.pageoverlapx, level.cury)
1072
991
1073 def cmd_prevattr(self):
992 def cmd_prevattr(self):
993 """
994 Move the cursor one attribute column to the left.
995 """
1074 level = self.levels[-1]
996 level = self.levels[-1]
1075 if level.displayattr[0] is None or level.displayattr[0] == 0:
997 if level.displayattr[0] is None or level.displayattr[0] == 0:
1076 self.beep()
998 self.beep()
@@ -1084,6 +1006,9 b' class ibrowse(ipipe.Display):'
1084 level.moveto(pos, level.cury)
1006 level.moveto(pos, level.cury)
1085
1007
1086 def cmd_nextattr(self):
1008 def cmd_nextattr(self):
1009 """
1010 Move the cursor one attribute column to the right.
1011 """
1087 level = self.levels[-1]
1012 level = self.levels[-1]
1088 if level.displayattr[0] is None or level.displayattr[0] == len(level.displayattrs)-1:
1013 if level.displayattr[0] is None or level.displayattr[0] == len(level.displayattrs)-1:
1089 self.beep()
1014 self.beep()
@@ -1097,11 +1022,20 b' class ibrowse(ipipe.Display):'
1097 level.moveto(pos, level.cury)
1022 level.moveto(pos, level.cury)
1098
1023
1099 def cmd_pick(self):
1024 def cmd_pick(self):
1025 """
1026 'Pick' the object under the cursor (i.e. the row the cursor is on).
1027 This leaves the browser and returns the picked object to the caller.
1028 (In IPython this object will be available as the '_' variable.)
1029 """
1100 level = self.levels[-1]
1030 level = self.levels[-1]
1101 self.returnvalue = level.items[level.cury].item
1031 self.returnvalue = level.items[level.cury].item
1102 return True
1032 return True
1103
1033
1104 def cmd_pickattr(self):
1034 def cmd_pickattr(self):
1035 """
1036 'Pick' the attribute under the cursor (i.e. the row/column the
1037 cursor is on).
1038 """
1105 level = self.levels[-1]
1039 level = self.levels[-1]
1106 attrname = level.displayattr[1]
1040 attrname = level.displayattr[1]
1107 if attrname is ipipe.noitem:
1041 if attrname is ipipe.noitem:
@@ -1117,6 +1051,11 b' class ibrowse(ipipe.Display):'
1117 return True
1051 return True
1118
1052
1119 def cmd_pickallattrs(self):
1053 def cmd_pickallattrs(self):
1054 """
1055 Pick' the complete column under the cursor (i.e. the attribute under
1056 the cursor) from all currently fetched objects. These attributes
1057 will be returned as a list.
1058 """
1120 level = self.levels[-1]
1059 level = self.levels[-1]
1121 attrname = level.displayattr[1]
1060 attrname = level.displayattr[1]
1122 if attrname is ipipe.noitem:
1061 if attrname is ipipe.noitem:
@@ -1132,11 +1071,19 b' class ibrowse(ipipe.Display):'
1132 return True
1071 return True
1133
1072
1134 def cmd_pickmarked(self):
1073 def cmd_pickmarked(self):
1074 """
1075 'Pick' marked objects. Marked objects will be returned as a list.
1076 """
1135 level = self.levels[-1]
1077 level = self.levels[-1]
1136 self.returnvalue = [cache.item for cache in level.items if cache.marked]
1078 self.returnvalue = [cache.item for cache in level.items if cache.marked]
1137 return True
1079 return True
1138
1080
1139 def cmd_pickmarkedattr(self):
1081 def cmd_pickmarkedattr(self):
1082 """
1083 'Pick' the attribute under the cursor from all marked objects
1084 (This returns a list).
1085 """
1086
1140 level = self.levels[-1]
1087 level = self.levels[-1]
1141 attrname = level.displayattr[1]
1088 attrname = level.displayattr[1]
1142 if attrname is ipipe.noitem:
1089 if attrname is ipipe.noitem:
@@ -1153,6 +1100,10 b' class ibrowse(ipipe.Display):'
1153 return True
1100 return True
1154
1101
1155 def cmd_markrange(self):
1102 def cmd_markrange(self):
1103 """
1104 Mark all objects from the last marked object before the current cursor
1105 position to the cursor position.
1106 """
1156 level = self.levels[-1]
1107 level = self.levels[-1]
1157 self.report("markrange")
1108 self.report("markrange")
1158 start = None
1109 start = None
@@ -1172,6 +1123,11 b' class ibrowse(ipipe.Display):'
1172 level.marked += 1
1123 level.marked += 1
1173
1124
1174 def cmd_enterdefault(self):
1125 def cmd_enterdefault(self):
1126 """
1127 Enter the object under the cursor. (what this mean depends on the object
1128 itself (i.e. how it implements the '__xiter__' method). This opens a new
1129 browser 'level'.
1130 """
1175 level = self.levels[-1]
1131 level = self.levels[-1]
1176 try:
1132 try:
1177 item = level.items[level.cury].item
1133 item = level.items[level.cury].item
@@ -1183,6 +1139,9 b' class ibrowse(ipipe.Display):'
1183 self.enter(item, "default")
1139 self.enter(item, "default")
1184
1140
1185 def cmd_leave(self):
1141 def cmd_leave(self):
1142 """
1143 Leave the current browser level and go back to the previous one.
1144 """
1186 self.report("leave")
1145 self.report("leave")
1187 if len(self.levels) > 1:
1146 if len(self.levels) > 1:
1188 self._calcheaderlines(len(self.levels)-1)
1147 self._calcheaderlines(len(self.levels)-1)
@@ -1192,6 +1151,11 b' class ibrowse(ipipe.Display):'
1192 curses.beep()
1151 curses.beep()
1193
1152
1194 def cmd_enter(self):
1153 def cmd_enter(self):
1154 """
1155 Enter the object under the cursor. If the object provides different
1156 enter modes a menu of all modes will be presented; choose one and enter
1157 it (via the 'enter' or 'enterdefault' command).
1158 """
1195 level = self.levels[-1]
1159 level = self.levels[-1]
1196 try:
1160 try:
1197 item = level.items[level.cury].item
1161 item = level.items[level.cury].item
@@ -1203,6 +1167,9 b' class ibrowse(ipipe.Display):'
1203 self.enter(item, None)
1167 self.enter(item, None)
1204
1168
1205 def cmd_enterattr(self):
1169 def cmd_enterattr(self):
1170 """
1171 Enter the attribute under the cursor.
1172 """
1206 level = self.levels[-1]
1173 level = self.levels[-1]
1207 attrname = level.displayattr[1]
1174 attrname = level.displayattr[1]
1208 if attrname is ipipe.noitem:
1175 if attrname is ipipe.noitem:
@@ -1223,6 +1190,12 b' class ibrowse(ipipe.Display):'
1223 self.enter(attr, None)
1190 self.enter(attr, None)
1224
1191
1225 def cmd_detail(self):
1192 def cmd_detail(self):
1193 """
1194 Show a detail view of the object under the cursor. This shows the
1195 name, type, doc string and value of the object attributes (and it
1196 might show more attributes than in the list view, depending on
1197 the object).
1198 """
1226 level = self.levels[-1]
1199 level = self.levels[-1]
1227 try:
1200 try:
1228 item = level.items[level.cury].item
1201 item = level.items[level.cury].item
@@ -1234,6 +1207,9 b' class ibrowse(ipipe.Display):'
1234 self.enter(item, "detail")
1207 self.enter(item, "detail")
1235
1208
1236 def cmd_detailattr(self):
1209 def cmd_detailattr(self):
1210 """
1211 Show a detail view of the attribute under the cursor.
1212 """
1237 level = self.levels[-1]
1213 level = self.levels[-1]
1238 attrname = level.displayattr[1]
1214 attrname = level.displayattr[1]
1239 if attrname is ipipe.noitem:
1215 if attrname is ipipe.noitem:
@@ -1254,6 +1230,10 b' class ibrowse(ipipe.Display):'
1254 self.enter(attr, "detail")
1230 self.enter(attr, "detail")
1255
1231
1256 def cmd_tooglemark(self):
1232 def cmd_tooglemark(self):
1233 """
1234 Mark/unmark the object under the cursor. Marked objects have a '!'
1235 after the row number).
1236 """
1257 level = self.levels[-1]
1237 level = self.levels[-1]
1258 self.report("toggle mark")
1238 self.report("toggle mark")
1259 try:
1239 try:
@@ -1269,6 +1249,10 b' class ibrowse(ipipe.Display):'
1269 level.marked += 1
1249 level.marked += 1
1270
1250
1271 def cmd_sortattrasc(self):
1251 def cmd_sortattrasc(self):
1252 """
1253 Sort the objects (in ascending order) using the attribute under
1254 the cursor as the sort key.
1255 """
1272 level = self.levels[-1]
1256 level = self.levels[-1]
1273 attrname = level.displayattr[1]
1257 attrname = level.displayattr[1]
1274 if attrname is ipipe.noitem:
1258 if attrname is ipipe.noitem:
@@ -1286,6 +1270,10 b' class ibrowse(ipipe.Display):'
1286 level.sort(key)
1270 level.sort(key)
1287
1271
1288 def cmd_sortattrdesc(self):
1272 def cmd_sortattrdesc(self):
1273 """
1274 Sort the objects (in descending order) using the attribute under
1275 the cursor as the sort key.
1276 """
1289 level = self.levels[-1]
1277 level = self.levels[-1]
1290 attrname = level.displayattr[1]
1278 attrname = level.displayattr[1]
1291 if attrname is ipipe.noitem:
1279 if attrname is ipipe.noitem:
@@ -1302,18 +1290,52 b' class ibrowse(ipipe.Display):'
1302 return None
1290 return None
1303 level.sort(key, reverse=True)
1291 level.sort(key, reverse=True)
1304
1292
1293 def cmd_hideattr(self):
1294 """
1295 Hide the attribute under the cursor.
1296 """
1297 level = self.levels[-1]
1298 if level.displayattr[0] is None:
1299 self.beep()
1300 else:
1301 self.report("hideattr")
1302 level.hiddenattrs.add(level.displayattr[1])
1303 level.moveto(level.curx, level.cury, refresh=True)
1304
1305 def cmd_unhideattrs(self):
1306 """
1307 Make all attributes visible again.
1308 """
1309 level = self.levels[-1]
1310 self.report("unhideattrs")
1311 level.hiddenattrs.clear()
1312 level.moveto(level.curx, level.cury, refresh=True)
1313
1305 def cmd_goto(self):
1314 def cmd_goto(self):
1315 """
1316 Jump to a row. The row number can be entered at the
1317 bottom of the screen.
1318 """
1306 self.startkeyboardinput("goto")
1319 self.startkeyboardinput("goto")
1307
1320
1308 def cmd_find(self):
1321 def cmd_find(self):
1322 """
1323 Search forward for a row. The search condition can be entered at the
1324 bottom of the screen.
1325 """
1309 self.startkeyboardinput("find")
1326 self.startkeyboardinput("find")
1310
1327
1311 def cmd_findbackwards(self):
1328 def cmd_findbackwards(self):
1329 """
1330 Search backward for a row. The search condition can be entered at the
1331 bottom of the screen.
1332 """
1312 self.startkeyboardinput("findbackwards")
1333 self.startkeyboardinput("findbackwards")
1313
1334
1314 def cmd_help(self):
1335 def cmd_help(self):
1315 """
1336 """
1316 The help command
1337 Opens the help screen as a new browser level, describing keyboard
1338 shortcuts.
1317 """
1339 """
1318 for level in self.levels:
1340 for level in self.levels:
1319 if isinstance(level.input, _BrowserHelp):
1341 if isinstance(level.input, _BrowserHelp):
@@ -1323,24 +1345,16 b' class ibrowse(ipipe.Display):'
1323
1345
1324 self.enter(_BrowserHelp(self), "default")
1346 self.enter(_BrowserHelp(self), "default")
1325
1347
1348 def cmd_quit(self):
1349 """
1350 Quit the browser and return to the IPython prompt.
1351 """
1352 self.returnvalue = None
1353 return True
1354
1326 def sigwinchhandler(self, signal, frame):
1355 def sigwinchhandler(self, signal, frame):
1327 self.resized = True
1356 self.resized = True
1328
1357
1329 def cmd_hideattr(self):
1330 level = self.levels[-1]
1331 if level.displayattr[0] is None:
1332 self.beep()
1333 else:
1334 self.report("hideattr")
1335 level.hiddenattrs.add(level.displayattr[1])
1336 level.moveto(level.curx, level.cury, refresh=True)
1337
1338 def cmd_unhideattrs(self):
1339 level = self.levels[-1]
1340 self.report("unhideattrs")
1341 level.hiddenattrs.clear()
1342 level.moveto(level.curx, level.cury, refresh=True)
1343
1344 def _dodisplay(self, scr):
1358 def _dodisplay(self, scr):
1345 """
1359 """
1346 This method is the workhorse of the browser. It handles screen
1360 This method is the workhorse of the browser. It handles screen
@@ -1,3 +1,8 b''
1 2006-06-23 Walter Doerwald <walter@livinglogic.de>
2
3 * IPython/Extensions/ibrowse.py: Put the documentation of the keyboard
4 commands into the methods implementing them.
5
1 2006-06-22 Fernando Perez <Fernando.Perez@colorado.edu>
6 2006-06-22 Fernando Perez <Fernando.Perez@colorado.edu>
2
7
3 * ipython.el (ipython-indentation-hook): cleanup patch, submitted
8 * ipython.el (ipython-indentation-hook): cleanup patch, submitted
General Comments 0
You need to be logged in to leave comments. Login now