diff -r 1698d1ab0b0a Lib/idlelib/PyShell.py --- a/Lib/idlelib/PyShell.py Wed Oct 31 14:22:31 2012 -0400 +++ b/Lib/idlelib/PyShell.py Wed Oct 31 16:10:46 2012 -0500 @@ -420,6 +420,7 @@ self.rpcclt.register("flist", self.tkconsole.flist) self.rpcclt.register("linecache", linecache) self.rpcclt.register("interp", self) + self.rpcclt.register("pager", self.tkconsole.pager) self.transfer_path(with_cwd=True) self.poll_subprocess() return self.rpcclt @@ -867,10 +868,9 @@ sys.stderr = self.stderr sys.stdin = self.stdin try: - # page help() text to shell. + # page help() text to a textView widget import pydoc # import must be done here to capture i/o rebinding. - # XXX KBK 27Dec07 use a textView someday, but must work w/o subproc - pydoc.pager = pydoc.plainpager + pydoc.pager = self.pager except: sys.stderr = sys.__stderr__ raise @@ -1259,6 +1259,29 @@ raise KeyboardInterrupt return count + def pager(self, text): + import pydoc + from idlelib.textView import view_text + plaintext = pydoc.plain(text) + if self.use_help_window: + parent = self.top + rawstr = r"\AHelp on[^\n]*(?=:)" + m = re.search(rawstr, plaintext) + if m: + title = m.group() + else: + title = 'Help Pager' + view_text(parent, title, plaintext, modal=False) + else: + self.stdout.write(plaintext) + + @property + def use_help_window(self): + v = idleConf.GetOption('main', 'General', 'HelpPager', + default=0, type='bool') + return v + + class PseudoFile(object): def __init__(self, shell, tags, encoding=None): diff -r 1698d1ab0b0a Lib/idlelib/config-main.def --- a/Lib/idlelib/config-main.def Wed Oct 31 14:22:31 2012 -0400 +++ b/Lib/idlelib/config-main.def Wed Oct 31 16:10:46 2012 -0500 @@ -49,6 +49,7 @@ print-command-posix=lpr %%s print-command-win=start /min notepad /p %%s delete-exitfunc= 1 +HelpPager = 0 [EditorWindow] width= 80 diff -r 1698d1ab0b0a Lib/idlelib/configDialog.py --- a/Lib/idlelib/configDialog.py Wed Oct 31 14:22:31 2012 -0400 +++ b/Lib/idlelib/configDialog.py Wed Oct 31 16:10:46 2012 -0500 @@ -337,6 +337,7 @@ self.encoding=StringVar(self) self.userHelpBrowser=BooleanVar(self) self.helpBrowser=StringVar(self) + self.helpPager=BooleanVar(self) #widget creation #body frame=self.tabPages.pages['General'].frame @@ -349,6 +350,7 @@ frameParaSize=Frame(frame,borderwidth=2,relief=GROOVE) frameHelp=LabelFrame(frame,borderwidth=2,relief=GROOVE, text=' Additional Help Sources ') + frameHelpPager=Frame(frame,borderwidth=2,relief=GROOVE) #frameRun labelRunChoiceTitle=Label(frameRun,text='At Startup') radioStartupEdit=Radiobutton(frameRun,variable=self.startupEdit, @@ -375,6 +377,12 @@ ' width (in characters)') entryParaWidth=Entry(frameParaSize,textvariable=self.paraWidth, width=3) + #frameHelpPager + labelHelpPager=Label(frameHelpPager,text='Show help() in: ') + radioHelpShell=Radiobutton(frameHelpPager,variable=self.helpPager, + value=0,command=self.SetPager,text="Shell ") + radioHelpPager=Radiobutton(frameHelpPager,variable=self.helpPager, + value=1,command=self.SetPager,text='Pager ') #frameHelp frameHelpList=Frame(frameHelp) frameHelpListButtons=Frame(frameHelpList) @@ -396,6 +404,7 @@ frameSave.pack(side=TOP,padx=5,pady=5,fill=X) frameWinSize.pack(side=TOP,padx=5,pady=5,fill=X) frameParaSize.pack(side=TOP,padx=5,pady=5,fill=X) + frameHelpPager.pack(side=TOP,padx=5,pady=5,fill=X) frameHelp.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH) #frameRun labelRunChoiceTitle.pack(side=LEFT,anchor=W,padx=5,pady=5) @@ -414,6 +423,10 @@ #paragraphFormatWidth labelParaWidthTitle.pack(side=LEFT,anchor=W,padx=5,pady=5) entryParaWidth.pack(side=RIGHT,anchor=E,padx=10,pady=5) + #frameHelpPager + labelHelpPager.pack(side=LEFT,anchor=W,padx=5,pady=5) + radioHelpPager.pack(side=RIGHT,anchor=W,padx=5,pady=5) + radioHelpShell.pack(side=RIGHT,anchor=W,padx=5,pady=5) #frameHelp frameHelpListButtons.pack(side=RIGHT,padx=5,pady=5,fill=Y) frameHelpList.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH) @@ -444,6 +457,7 @@ self.startupEdit.trace_variable('w',self.VarChanged_startupEdit) self.autoSave.trace_variable('w',self.VarChanged_autoSave) self.encoding.trace_variable('w',self.VarChanged_encoding) + self.helpPager.trace_variable('w',self.VarChanged_helpPager) def VarChanged_fontSize(self,*params): value=self.fontSize.get() @@ -541,6 +555,10 @@ value=self.encoding.get() self.AddChangedItem('main','EditorWindow','encoding',value) + def VarChanged_helpPager(self,*params): + value=self.helpPager.get() + self.AddChangedItem('main','General','helppager',value) + def ResetChangedItems(self): #When any config item is changed in this dialog, an entry #should be made in the relevant section (config type) of this @@ -567,6 +585,9 @@ idleConf.defaultCfg[configType].Get(section,option)) return dItems + def SetPager(self): + pass + def SetThemeType(self): if self.themeIsBuiltin.get(): self.optMenuThemeBuiltin.config(state=NORMAL) @@ -1029,6 +1050,9 @@ # default source encoding self.encoding.set(idleConf.GetOption('main', 'EditorWindow', 'encoding', default='none')) + # Help in pager + self.helpPager.set(idleConf.GetOption('main', 'General', 'HelpPager', + default=0, type='bool')) # additional help sources self.userHelpList = idleConf.GetAllExtraHelpSourcesList() for helpItem in self.userHelpList: diff -r 1698d1ab0b0a Lib/idlelib/run.py --- a/Lib/idlelib/run.py Wed Oct 31 14:22:31 2012 -0400 +++ b/Lib/idlelib/run.py Wed Oct 31 16:10:46 2012 -0500 @@ -311,7 +311,9 @@ sys.displayhook = rpc.displayhook # page help() text to shell. import pydoc # import must be done here to capture i/o binding - pydoc.pager = pydoc.plainpager + idle_pager = self.get_remote_proxy("pager") + pydoc.pager = lambda text: idle_pager.__call__(text) + from idlelib import IOBinding sys.stdin.encoding = sys.stdout.encoding = \ sys.stderr.encoding = IOBinding.encoding