U Å:âe ã@säddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Tddl m Z ddlmZddl mZddl mZddlmZddlmZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZddlmZddlmZddlmZddl m!Z!ddlm"Z"dZ#de $¡Z%ejdkZ&dd„Z'Gdd„dƒZ(dd„Z)e *d¡Z+dd„Z,Gd d!„d!ƒZ-d"d#„Z.d$d%d&d'œZ/d(d)„Z0d*d+„Z1d,d-„Z2e3d.kràdd/l4m5Z5e5d0d1d2d3dd4l6m7Z7e7e2ƒdS)5éN)Ú*)ÚFont)Ú Scrollbar)Ú simpledialog)Ú messagebox)ÚidleConf)Ú configdialog)Úgrep)Úhelp)Ú help_about)Úmacosx)ÚMultiCallCreator)Úpyparse)Úquery)Úreplace)Úsearch)Ú wheel_event)Úwindowéz (%s)ÚdarwincCsbtj\}}}}}d||f}|d|f7}|dkrB|d|f7}n|dkr^|d|d|f7}|S)zYFormat sys.version_info to produce the Sphinx version string used to install the chm docsz%s%sz%sÚ candidatezrc%sÚfinalr)ÚsysÚ version_info)ÚmajorÚminorÚmicroÚlevelÚserialÚrelease©r ú3/usr/local/python38/lib/python3.8/idlelib/editor.pyÚ_sphinx_version%s r"c@sFeZdZddlmZddlmZmZddlm Z ddl m Z m Z ddl mZddlmZddlmZdd lmZdd lmZdd lmZdd lmZdd lmZmZmZmZddl m!Z!ddl"m#Z#ddl$m%Z%e& '¡Z(dZ)dZ*dZ+dßdd„Z,dàdd„Z-dd„Z.dd„Z/dd„Z0dd„Z1dádd „Z2d!d"d#d$d%d&d'gZ3d(d)„Z4d*d+„Z5d,d-„Z6d.d/„Z7d0d1„Z8dZ9d2d3„Z:d4gZ;d5d6„Zd;d<„Z?dâd=d>„Z@dãd?d@„ZAdädAdB„ZBdådCdD„ZCdEdF„ZDdGdH„ZEdIdJ„ZFdædKdL„ZGdçdMdN„ZHdOdP„ZIdQdR„ZJdSdT„ZKdUdV„ZLdWdX„ZMdYdZ„ZNd[d\„ZOd]d^„ZPd_d`„ZQdadb„ZRdcdd„ZSdèdedf„ZTdédgdh„ZUdêdidj„ZVdkdl„ZWdmdn„ZXdodp„ZYdqdr„ZZdsdt„Z[dudv„Z\dwdx„Z]dydz„Z^e_j`e_jad{Zbd|d}„Zcd~d„Zdd€d„Zed‚dƒ„Zfd„d…„Zgd†d‡„Zhdˆd‰„ZidŠd‹„ZjdëdŒd„ZkdŽd„Zldd‘„Zmd’d“„Znd”d•„Zod–d—„Zpd˜d™„Zqdšd›„Zrdœd„ZsdìdŸd „Ztd¡d¢„Zudíd£d¤„Zvd¥d¦„Zwd§d¨„Zxd©dª„Zyd«d¬„Zzd­d®„Z{d¯d°„Z|d±d²„Z}d³d´„Z~dµd¶„Zd·d¸iZ€d¹dº„Zdîd»d¼„Z‚dïd½d¾„Zƒd¿dÀ„Z„dðdÁd„Z…dñdÃdÄ„Z†dÅdÆ„Z‡dÇdÈ„ZˆdÉdÊ„Z‰dËdÌ„ZŠdòdÍd΄Z‹dÏdЄZŒdÑdÒ„ZdÓdÔ„ZŽdÕdÖ„Zd×dØ„ZdÙdÚ„Z‘dÛdÜ„Z’dódÝdÞ„Z“dS)ôÚ EditorWindowr)Ú Percolator)ÚColorDelegatorÚ color_config)Ú UndoDelegator)Ú IOBindingÚencoding)Úmainmenu)ÚMultiStatusBar)Ú AutoComplete)Ú AutoExpand)ÚCalltip)Ú CodeContext)Ú LineNumbers)ÚFormatParagraphÚ FormatRegionÚIndentsÚRstrip)Ú ParenMatch)ÚSqueezer)Ú ZoomHeightNTc CsH ddlm}tjdkrtj tjdd¡}tj   d¡rvddtj dd…}tj  d ¡r^d }qÌd }tj ||dd¡}nVtj dd…d kr²tj tjdd t ƒ¡} tj | ¡rÌ| }ntj dkrÌtj tjd¡}tj |¡}tj |¡r|t_tj dkrdtjt_ndtj dd…t_||_|p*|j}||_t|ƒ|_tj||jd|_} |rl|j|_|j|j_ni|_i|j_tjotj tjd¡|_d|_t| ƒ|_ } t!| dd|_"} tj#ddddd} dddd| d tj#ddd!ddd"œ}t$t%ƒ| f|Ž|_&}|j&|j_'| (¡| )¡|j *d#|j+¡|j ,d$|j-¡t. /¡rt| ,d$|j-¡| ,d%|j0¡| ,d&|j0¡n| ,d'|j0¡| ,d(t1¡| ,d)t1¡| ,d*t1¡| ,d+|j2¡| ,d,|j3¡| ,d-|j4¡| ,d.|j5¡| ,d/|j6¡| ,d0|j7¡| ,d1|j8¡| ,d2|j9¡| ,d3|j:¡| ,d4|j;¡| ,d5d6d7„¡| ,d8|j<¡| ,d9|j=¡| ,d:|j>¡| ,d;|j?¡| ,d<|j@¡| ,d=|jA¡| ,d>|jB¡| ,d?|jC¡| ,d@|jD¡| ,dA|jE¡| ,dB|jF¡| G|¡|_H}| ,dC|jI¡| ,dD|jJ¡| ,dE|jK¡| ,dF|jL¡| ,dG|jM¡| ,dH|jN¡| O|¡}| ,dI|jP¡| ,dJ|jQ¡| ,dK| Rd¡¡| ,dL| RdM¡¡| ,dN|jS¡| ,dO|jT¡| ,dP|jU¡|r||j|<|rÔ||jV|<| ,dQ|jW¡| ,dR|jjX¡| ,dS|jY¡| ,dT|jZ¡| ,dU|j[¡| \¡| j]t^t_dMdV| j`dMdMdW| jadMdMdW|jb| dX<| jcdMdtddY| je|dZ<t f|jdd¡|d[<|jcdMdMtddY| g¡| h¡tj#dd\d]d^d}| |_id_|_j|jj|_k| l¡tmtd`ƒsð|j&dat_n| o¡db|_p| q|¡|_r}| s¡|_t}| u|¡|jv|_v|jw|_w| x|jy¡| z|¡|_{}| ||j}¡dc|_~| dc¡d|_€d|_d|_‚|rÚtj ƒ|¡rÊtj  |¡sÊ| „|¡rÚdd|_~| …|¡}| |¡n| †|¡dd|_~| ‡¡| y¡| ˆ¡| ‰¡|jŠ ‹de¡}|rP| Œdf¡}|dkr$dg}|dkr>| ¡|dM}||_Žt |j¡t‘j’|_’t“j”|_”t“j•|_•| –dhdi¡| –djdkdldm¡| –dndo¡| –dpdq¡| –drdqdsdt¡| —|¡}| ,dh|j˜¡| ,dj|j™¡| ,du|jš¡| ,dv| ›|¡jœ¡| ,dw| |¡jž¡| Ÿ|¡}| ,dx|j ¡| ,dr|j¡¡||ƒ}| ,dy|j¢¡| ,dz|j£¡| ,d{|j¤¡| ,d|| ¥|¡j¦¡| §|¡|_¨}| ,dn|j©¡| ,dp|jª¡| ,d}|j«¡| ,d~| ¬|¡j­¡|j®rè| ¯|¡|_| ,d|jj°¡n| ±d€dd‚¡|j² r6| ³|¡|_‚tj#dddƒd^d r&| ´¡| ,d„|j´¡n| ±d€d…d‚¡dS)†Nr)Ú ScriptBindingZDocz index.htmlÚlinuxz python-docs-z%s.%s.%séz/var/www/html/python/z/var/www/html/python/index.htmlz/usr/share/doc/Úwinz Python%s.chmrz0Resources/English.lproj/Documentation/index.htmlzfile://zhttps://docs.python.org/%d.%d/é)Úmenuzrecent-files.lstÚÚvbar)ÚnameÚmainr#ÚwidthÚint©ÚtypeÚtextéZnoneZ wordprocessorÚheight)r@ÚpadxÚwrapZhighlightthicknessrBZtabstylerHZWM_DELETE_WINDOWú<>zz<2>z<3>z z z z z<>z<>z <>z<>z<>z<>z<>z<>ú<>z<>cSsdS©NÚbreakr ©Úeventr r r!Ú©óz'EditorWindow.__init__..z<>z<>z<>z<>z<>z<>z <>ú <>z<>z<>z<>z<>z<>z<>z<>z<>z<>z<>ú<>zzéz<>z<>z<>z<>z<>z<>z<>z<>)ÚsideÚfillÚexpand)ZweightÚcommand)ÚrowÚcolumnZstickyZyscrollcommandÚfontÚIndentz use-spacesÚboolrÚblink_off_timeÚ insertofftime)é2iôi@KLFTrÚendéÿÿÿÿz<>z z<>zzzz<>zz<>zz<>zzz<>z<>z<>z<>z<>z<>z<>z <>z<>z<>z<>Úoptionsz *ode*ontextÚdisabledzline-numbers-defaultz<>ú *ine*umbers)µZidlelib.runscriptr8r#Úhelp_urlÚosÚpathÚjoinrÚ base_prefixÚplatformÚcountrÚisdirr"ÚisfileÚnormpathÚflistÚrootÚMenuÚmenubarrZListedToplevelÚtopÚvarsÚ tkinter_varsZ inversedictÚ instance_dictrZuserdirÚrecent_files_pathÚprompt_last_lineÚFrameÚ text_framerr?Ú GetOptionr ZTextrFZfocused_widgetÚ createmenubarÚapply_bindingsÚprotocolÚcloseÚbindÚ close_eventr ZisAquaTkÚright_menu_eventrÚhandle_winconfigÚcutÚcopyÚpasteÚcenter_insert_eventÚ help_dialogÚ python_docsÚ about_dialogÚ config_dialogÚopen_module_eventÚ select_allÚremove_selectionÚ find_eventÚfind_again_eventÚfind_in_files_eventÚfind_selection_eventÚ replace_eventÚgoto_line_eventÚsmart_backspace_eventÚnewline_and_indent_eventÚsmart_indent_eventr2ÚfregionÚindent_region_eventZdedent_region_eventZcomment_region_eventZuncomment_region_eventZtabify_region_eventZuntabify_region_eventr3Ztoggle_tabs_eventZchange_indentwidth_eventÚmove_at_edge_if_selectionÚ del_word_leftÚdel_word_rightÚ home_callbackÚdictÚ new_callbackZclose_all_callbackÚopen_module_browserÚopen_path_browserÚopen_turtle_demoÚset_status_barÚpackZLEFTZBOTHZ rowconfigureZcolumnconfigureÚ handle_yviewZgridZNSEWÚsetÚGetFontZ focus_setÚ set_widthÚusetabsÚtabwidthÚ indentwidthÚset_notabs_indentwidthÚhasattrr_Úupdate_cursor_blinkÚnum_context_linesr$Úperr'ÚundoÚ insertfilterÚundo_block_startÚundo_block_stopZset_saved_change_hookÚsaved_change_hookr(ÚioZset_filename_change_hookÚfilename_change_hookZ good_loadÚset_indentation_paramsÚcolorÚ code_contextÚ line_numbersÚexistsÚloadfileÚispythonsourceZ set_filenameÚResetColorizerÚupdate_recent_files_listÚload_extensionsÚmenudictÚgetÚindexÚ add_separatorÚ wmenu_endZregister_callbackÚpostwindowsmenurZ askintegerrZaskyesnoÚ showerrorÚ event_addr,Zautocomplete_eventZtry_open_completions_eventZforce_open_completions_eventr-Zexpand_word_eventr1Zformat_paragraph_eventr5Zflash_paren_eventZparen_closed_eventZcheck_module_eventZrun_module_eventZrun_custom_eventr4Z do_rstripr.ÚctipZtry_open_calltip_eventZrefresh_calltip_eventZforce_open_calltip_eventr7Zzoom_height_eventÚallow_code_contextr/Ztoggle_code_context_eventÚupdate_menu_stateÚallow_line_numbersr0Útoggle_line_numbers_event)ÚselfrqÚfilenameÚkeyrrr8ZdochomeZpyverZbasepathZchmfilerur|r?rBZ text_optionsrFršÚindentsZ usespacesr²r³r¸Ú is_py_srcr=rbZ autocompleteZ parenmatchZ scriptbindingrÌr r r!Ú__init__HsÒ     ÿ ÿ   ÿ   ÿ   ÿÿù            ÿ                ÿ  ÿ ÿÿ ÿ  ÿ ÿzEditorWindow.__init__cCs | ¡dS©N)rª©rÑrPr r r!r…`szEditorWindow.handle_winconfigcCs^|j}tt|jj| d¡| d¡gƒƒ}| ¡d|}t|| d¡d d¡}|||_ dS)NZborderrIr<r\)r\Ú0) rFÚsumÚmapÚtkZgetintZcgetZ winfo_widthrÚmeasurerB)rÑrFZ inner_paddingZ pixel_widthZzero_char_widthr r r!rªcsÿÿzEditorWindow.set_widthcCs|j ¡\}}|j |¡dSrM)r¸ZdefaultfilenamerqÚnew)rÑrPÚdirnameÚbasenamer r r!r¡ps zEditorWindow.new_callbackcCsÂ|jd@dkr|jdkrdS|j d¡rd|j ddd¡rd|j ddd¡rdt|j d¡ d¡d ƒ}n8|j dd¡}tt |ƒƒD]}||d kr~qœq~t |ƒ}t|j d ¡ d¡d ƒ}||krÂd}d t |ƒd }|jd @dkrò|j  ddd¡n²|j d¡s|j  dd ¡n@|j |j d¡d|j d ¡¡rB|j  dd¡n|j  dd¡|j |¡}|j d¡}|j |d|¡r„||}}|j  ddd¡|j  d||¡|j  d |¡|j d ¡dS)NérZHomeZiomarkú<=zinsert lineendúinsert linestartÚ.rU)ú ú Úinsertzinsert linestart+ÚcÚselú1.0rbú sel.firstZ my_anchorú<úsel.lastú>rN)ÚstateZkeysymrFrÆÚcomparerCÚsplitrÅÚrangeÚlenÚstrÚ tag_removeÚmark_setÚtag_addÚsee)rÑrPZinsertptÚlineZlineatÚdestÚfirstÚlastr r r!rŸusF ÿþ  ÿ    zEditorWindow.home_callbackcCs°| |j¡|_t|jdddd}tjdkr<|jjddtd|jjdd td|jjd d td|jjt t d |jt t d |j   d |j ¡|j  d dd¡|j  |j ¡dS)NrUZgrey75)rHZ borderwidthZ backgroundrZ _padding1z )rVr[zCol: ?rùzLn: ?)rVrWz<>z z)r+ruÚ status_barr{rrlÚ set_labelZRIGHTr¦ZBOTTOMÚXrFr‚Úset_line_and_columnrËZ after_idle)rÑÚsepr r r!r¥ s ÿzEditorWindow.set_status_barcCs>|j t¡ d¡\}}|j dd|¡|j dd|¡dS)Nrär[zCol: %srùzLn: %s)rFrÆZINSERTrñrýrþ)rÑrPrùr[r r r!r°sz EditorWindow.set_line_and_column)ÚfileZ_File)ÚeditZ_Edit)ÚformatZF_ormat)ÚrunZ_Run)rdZ_Options)rZ_Window)r Z_HelpcCsâ|j}i|_}|jD]N\}}t|ƒ\}}t||›ddƒ}t||d|d||<}|j|||dqt ¡r’t|ddd|d<}|jd|d |  ¡t|jdd |_ |jd j d d d|j d|jd  t ¡|_| ¡dS)NZ_menu_postcommandr)r@ÚtearoffÚ postcommand)Úlabelr=Ú underlineZapple)r@rZ applicationZIDLE)rr=©rrr:z Recent Files)rr r=r )rtrÄÚ menu_specsÚprepstrÚgetattrrsZ add_cascader Z isCarbonTkÚ fill_menusÚrecent_files_menuZinsert_cascaderÆÚENDÚbase_helpmenu_lengthÚreset_help_menu_entries)rÑZmbarrÄr@rr rr=r r r!r~Às,  ÿÿþzEditorWindow.createmenubarcCsJ|jd}| d¡}|dkr d}||jkr<| |jd|¡t |¡dS)NrrbrcrU)rÄrÆrÈÚdeleterZadd_windows_to_menu)rÑr=rbr r r!rÉÖs   zEditorWindow.postwindowsmenucCs|j|}|j||ddS)z$Update label for menu item at index.)rN©rÄÚ entryconfig)rÑr=rÆrÚmenuitemr r r!Úupdate_menu_labelàs zEditorWindow.update_menu_labelcCs|j|}|j||ddS)z$Update state for menu item at index.©rïNr)rÑr=rÆrïrr r r!rÎås zEditorWindow.update_menu_statecGsR|dkr ÿ      zEditorWindow.right_menu_event)ÚCloserKNcCsft|jdd}|jD]F}|d|d}}|dk rR|j|fdd„}|j||dq| ¡q||_dS)Nrr rUcSs| |¡dSrשÚevent_generate©rFr*r r r!rY$sz(EditorWindow.make_rmenu..command©rrY)rsrFr'Ú add_commandrÇr%)rÑr%r)rr*rYr r r!r&s  zEditorWindow.make_rmenucCs| ¡Sr×)Úrmenu_check_copy©rÑr r r!Úrmenu_check_cut+szEditorWindow.rmenu_check_cutcCs8z|j d¡}Wntk r&YdSX|r0dSdSdS)NrëreÚnormal©rFrÆr$)rÑZindxr r r!r1.s zEditorWindow.rmenu_check_copycCs8z|jj d|jd¡Wntk r.YdSXdSdS)Nztk::GetSelectionZ CLIPBOARDrer4)rFrÜÚcallr$r2r r r!Úrmenu_check_paste6s zEditorWindow.rmenu_check_pastecCst |j¡dS)zHandle Help 'About IDLE' event.rN)r Z AboutDialogrurØr r r!rŒ>s zEditorWindow.about_dialogcCst |jd¡dS)z&Handle Options 'Configure IDLE' event.ZSettingsrN)rZ ConfigDialogrurØr r r!rDszEditorWindow.config_dialogcCs"|jr|j}n|j}t |¡dS)zHandle Help 'IDLE Help' event.rN)rrrur Z show_idlehelp)rÑrPÚparentr r r!rŠJs  zEditorWindow.help_dialogc Csntjdd…dkr^zt |j¡Wqjtk rZ}ztjdt|ƒ|j dW5d}~XYqjXn t   |j¡dS)Nr:r;úDocument Start Failure©ÚtitleÚmessager8rN) rrlrhÚ startfilergÚOSErrorrrÊrôrFÚ webbrowserÚopen)rÑrPÚwhyr r r!r‹Tsÿ zEditorWindow.python_docscCs|j d¡dS)Nz<>rN©rFr-rØr r r!r†_s zEditorWindow.cutcCs |j d¡sdS|j d¡dS)Nréz<>rN)rFZ tag_rangesr-rØr r r!r‡cs  zEditorWindow.copycCs|j d¡|j d¡dS)Nz <>rçrN)rFr-rørØr r r!rˆjs  zEditorWindow.pastecCs.|j ddd¡|j dd¡|j d¡dS)Nrérêzend-1crçrN)rFr÷rörørØr r r!ros zEditorWindow.select_allcCs |j ddd¡|j d¡dS)NrérêrbrçrN)rFrõrørØr r r!rus zEditorWindow.remove_selectioncs*|jj‰|jj‰d‰‡‡‡‡fdd„}|S)zèCursor move begins at start or end of selection When a left/right cursor key is pressed create and return to Tkinter a function which causes a cursor move from the associated edge of the selection. )z sel.first+1cz sel.last-1ccsB|jd@dkr>zˆdƒˆdˆˆƒWntk r<YnXdS)NrGrrërç)rïr$rO©Ú edge_indexZ edges_tableZself_text_indexZself_text_mark_setr r!Ú move_at_edge…s z.move_at_edge)rFrÆrö)rÑrDrEr rCr!rœzs z&EditorWindow.move_at_edge_if_selectioncCs|j d¡dS)Nz rNrBrØr r r!rŽs zEditorWindow.del_word_leftcCs|j d¡dS)NzrNrBrØr r r!rž’s zEditorWindow.del_word_rightcCst |j¡dSrM)rÚfindrFrØr r r!r‘–s zEditorWindow.find_eventcCst |j¡dSrM)rZ find_againrFrØr r r!r’šs zEditorWindow.find_again_eventcCst |j¡dSrM)rZfind_selectionrFrØr r r!r”žs z!EditorWindow.find_selection_eventcCst |j|j|j¡dSrM)r rFr¸rqrØr r r!r“¢sz EditorWindow.find_in_files_eventcCst |j¡dSrM)rrFrØr r r!r•¦s zEditorWindow.replace_eventcCsT|j}t |dd¡j}|dk rP| ddd¡| d|›d¡| d¡| ¡dS) Nz Go To Linez/Enter a positive integer ('big' = end of file):rérêrbrçú.0rN)rFrZGotoÚresultrõrörør)rÑrPrFÚlinenor r r!r–ªsþ zEditorWindow.goto_line_eventcCspz|j dd¡ ¡}Wntk r.d}YnXt |jdd|¡j}|dk rl|jr`|j |¡n |j   |¡|S)z¯Get module name from user and open it. Return module path or None for calls by open_module_browser when latter is not invoked in named editor window. rërír>z Open ModulezAEnter the name of a Python module to search on sys.path and open:N) rFrÅÚstripr$rZ ModuleNamerHrqr@r¸r¿)rÑr@Ú file_pathr r r!Ú open_module¸s ü zEditorWindow.open_modulecCs | ¡dSrM)rLrØr r r!rŽÐszEditorWindow.open_module_eventcCsJ|jj}|jjdkr|s,| ¡}|dkr,dSddlm}| |j|¡dS)NZPyShellEditorWindowrNr)Úbrowser) r¸rÒÚ __class__Ú__name__rLÚidlelibrMZ ModuleBrowserrr)rÑrPrÒrMr r r!r¢Ôs ÿ z EditorWindow.open_module_browsercCsddlm}| |j¡dS)Nr)Ú pathbrowserrN)rPrQZ PathBrowserrr)rÑrPrQr r r!r£ßs  zEditorWindow.open_path_browsercCs&ddl}tjddg}|j|dddS)Nrz-cz,from turtledemo.__main__ import main; main()F)ÚshellrN)Ú subprocessrÚ executableÚPopen)rÑrPrSÚcmdr r r!r¤äsþzEditorWindow.open_turtle_democCsN|dk rJ|dkrJ|j dd|¡|j ddd¡|j ddd¡| ¡dS)Nrrçz%d.0rérêrbz insert +1l)rFrörõr÷Úcenter)rÑrIr r r!Úgotolineís zEditorWindow.gotolinecCs`|rtj |¡rdStj tj |¡¡\}}tj |¡dkr@dS|j dd¡}| d¡o^d|kS)NT)z.pyz.pywrêz 1.0 lineendz#!Zpython) rhrirnÚsplitextràÚnormcaserFrÅÚ startswith)rÑrÒÚbaseÚextrùr r r!rÀôszEditorWindow.ispythonsourcecCs|jr|j |¡d|_dSr×)rqZunregister_maybe_terminater2r r r!Ú close_hookýs zEditorWindow.close_hookcCs ||_dSr×)r^)rÑr^r r r!Úset_close_hookszEditorWindow.set_close_hookcCs2|jr|j |¡| ¡|j |¡| ¡dSr×)rqZfilename_changed_editr·ruZupdate_windowlist_registryrÁr2r r r!r¹s   z!EditorWindow.filename_change_hookcCsV|jr dS| |jj¡r"| ¡|_|jrR|j |j¡|j |j¡|j |j¡dSr×) r»rÀr¸rÒr%r²Ú removefilterr³r´r2r r r!Ú _addcolorizer s zEditorWindow._addcolorizercCs,|js dS|j ¡|j |j¡d|_dSr×)r»Z removecolorsr²r`r2r r r!Ú _rmcolorizers  zEditorWindow._rmcolorizercCsH| ¡| ¡t |j¡|jdk r0|j ¡|jdk rD|j ¡dS)zUpdate the color themeN) rbrar#r&rFr¼Zupdate_highlight_colorsr½Z update_colorsr2r r r!rÁs    zEditorWindow.ResetColorizerÚ_cCsp| d|¡| |¡}|r6||jkr6| d|d|¡d| |¡krR| d|¡n| d|d¡| |¡dS)NÚERRORz wordstartÚ rçz+1c)r÷rÅÚ IDENTCHARSrörø)rÑrFÚposÚcharr r r!Úcolorize_syntax_error-s  z"EditorWindow.colorize_syntax_errorcCs2tjddddd}|s"d|jd<n tj|jd<dS) z&Update the cursor blink configuration.rAr#z cursor-blinkr^rDrr`N)rr}rFr_)rÑZ cursorblinkr r r!r°8sÿ z EditorWindow.update_cursor_blinkcCsN|jdk r|j ¡|jdk r(|j ¡t |jdd¡}||jd<| ¡dS)z.Update the text widgets' font if it is changedNrAr#r\)r¼Z update_fontr½rr©rrrFrª)rÑZnew_fontr r r!Ú ResetFontBs     zEditorWindow.ResetFontcCsxt ¡|j_}| ¡D]\}}|jj|f|žŽq| ¡D]6}t |¡}|r<| ¡D]\}}|jj|f|žŽqVq)ru)rrkr*rlrrnroÚmenudefsr rÄrÆrròrEZ entrycgetÚget_acceleratorr) rÑrprrrsZ menuEventDictr=r)Z menubarItemrbrÆZaccelZitemNamerPr r r!ÚApplyKeybindings_s<      $        zEditorWindow.ApplyKeybindingscCs|jstjddddd|_dS)zCUpdate the indentwidth if changed and not using tabs in this windowrAr]z num-spacesrCrDN)r«rr}r­r2r r r!r®ƒs ÿz#EditorWindow.set_notabs_indentwidthcCs|t ¡}|jd}| t¡}||jkr8| |jd|¡|rn| ¡|D]$}| |d¡}|j |d|dqH||jd<dS)z3Update the additional help entries on the Help menur rUrr/N) rZGetAllExtraHelpSourcesListrÄrÆrrrrÇÚ"_EditorWindow__extra_help_callbackr0)rÑZ help_listZhelpmenuZhelpmenu_lengthÚentryrVr r r!rŠs   z$EditorWindow.reset_help_menu_entriescs|f‡fdd„ }|S)zCCreate a callback with the helpfile value frozen at definition timec s€| d¡stj |¡}tjdd…dkrrzt |¡Wq|tk rn}ztj dt |ƒˆj dW5d}~XYq|Xn t   |¡dS)N)ZwwwZhttpr:r;r9r:)r[rhrirprrlr=r>rrÊrôrFr?r@)ÚhelpfilerAr2r r!Údisplay_extra_helps  ÿz>EditorWindow.__extra_help_callback..display_extra_helpr )rÑr{r|r r2r!Z__extra_help_callback›s z"EditorWindow.__extra_help_callbackc sºg}|j}|r>tj |¡r>t|dddd}| ¡}W5QRX|rptj |¡d}||krd| |¡| d|¡g‰|D]*}d|ks˜tj |dd…¡sxˆ  |¡qx‡fd d „|Dƒ}d }|dt |ƒ…}|rRz*t|d ddd}|  |¡W5QRXWnVt k rP}z6t |jd dƒs@d|j_tjdd|›d|jdW5d}~XYnX|jjD]Z} | j} |  dt¡t|ƒD]8\} } |  ¡} |  | ¡} | j|| d| | ddqxqZdS)z/Load and update the recent files list and menusÚrÚutf_8r)r)Úerrorsrerúrccsg|]}|ˆkr|‘qSr r )Ú.0ri©Z bad_pathsr r!Ú ½sz9EditorWindow.update_recent_files_list..Z1234567890ABCDEFGHIJKÚwÚrecentfiles_messageFTz IDLE Warningz)Cannot save Recent Files list to disk. z Select OK to continue.r:Nrå)rrYr )ryrhrir¾r@Ú readlinesÚabspathÚremoverçÚappendróÚ writelinesr>r rrr…rÚ showwarningrFrurxrrrÚ enumerateÚrstripÚ#_EditorWindow__recent_file_callbackr0)rÑÚnew_fileZrf_listrKZ rf_list_fileriZulcharsZrf_fileÚerrÚinstancer=ÚiÚ file_nameÚcallbackr r‚r!rªs\ÿ   ÿ ü   þz%EditorWindow.update_recent_files_listcs|f‡fdd„ }|S)Ncsˆjj|ddS)N)ZeditFile)r¸r@)Z fn_closurer2r r!Úopen_recent_fileÙsz=EditorWindow.__recent_file_callback..open_recent_filer )rÑr“r•r r2r!Z__recent_file_callbackØsz#EditorWindow.__recent_file_callbackcCs‚| ¡}| ¡}|r*|r*|d|t}n|r4|}n|r>|}nd}|pL|pL|}| ¡sfd|}d|}|j |¡|j |¡dS)Nz - Úuntitledz*%s*z*%s)Ú short_titleÚ long_titleÚ _py_versionÚ get_savedruZwm_titleZ wm_iconname)rÑZshortÚlongr;Ziconr r r!r·Ýs  zEditorWindow.saved_change_hookcCs |j ¡Sr×)r³ršr2r r r!ršïszEditorWindow.get_savedcCs|j |¡dSr×)r³Ú set_saved)rÑÚflagr r r!rœòszEditorWindow.set_savedcCs|j ¡dSr×)r³Ú reset_undor2r r r!ržõszEditorWindow.reset_undocCs|jj}|rtj |¡SdS)Nr–)r¸rÒrhrirà)rÑrÒr r r!r—øszEditorWindow.short_titlecCs |jjp dS)Nr>)r¸rÒr2r r r!r˜üszEditorWindow.long_titlecCs | ¡dSrM)rWrØr r r!r‰ÿsz EditorWindow.center_insert_eventrçcCsH|j}| ¡\}}| |¡}||}td||dƒ}| t|ƒ¡dS)NrUr<)rFÚgetwindowlinesrÚmaxrr)rÑÚmarkrFruÚbotrIrHZnewtopr r r!rWs   zEditorWindow.centercCsN|j}| d¡}| d¡}||krF| ¡dkrFt|dƒ}||d}||fS)Nrz@0,65535rUrH)rFrZ winfo_heightrC)rÑrFrur¢rHr r r!rŸ s    zEditorWindow.getwindowlinescCs|j}tt| |¡ƒƒSr×)rFrCrrÆ)rÑr¡rFr r r!rszEditorWindow.getlinenocCs(|j ¡}t d|¡}ttt| ¡ƒƒS)zReturn (width, height, x, y)z(\d+)x(\d+)\+(-?\d+)\+(-?\d+))ruZ wm_geometryÚreÚmatchÚlistrÛrCÚgroups)rÑZgeomÚmr r r!Ú get_geometrys  zEditorWindow.get_geometrycCs | ¡dSrM)rrØr r r!rƒszEditorWindow.close_eventcCsH|jrD| ¡s:|j ¡dkr&|j ¡|j ¡|j ¡|j ¡SdS)Nr4)r¸ršrurïZ deiconifyÚlowerZliftÚ maybesaver2r r r!rª#s   zEditorWindow.maybesavecCs<z"| ¡}t|ƒdkr| ¡|WStk r6YnXdS)NÚcancel)rªrôÚ_closeÚAttributeError)rÑZreplyr r r!r,s zEditorWindow.closecCs|jjr|j|jjdt |j¡| ¡|j ¡d|_d|_|j rX|j  ¡d|_ d|_ d|_ |j  ¡d|_ |j  ¡|jrŒ| ¡dS)N)r)r¸rÒrÂrZunregister_callbackrÉÚunload_extensionsrr³r»rFrwr²ruZdestroyr^r2r r r!r¬5s"     zEditorWindow._closecCsi|_| ¡dSr×)Ú extensionsÚload_standard_extensionsr2r r r!rÃIszEditorWindow.load_extensionscCs0t|j ¡ƒD]}t|dƒr| ¡qi|_dS)Nr)r¥r¯Úvaluesr¯r)rÑÚinsr r r!r®Ms  zEditorWindow.unload_extensionscCsD| ¡D]6}z| |¡Wqtdt|ƒƒt ¡YqXqdS)NzFailed to load extension)rnÚload_extensionÚprintÚreprÚ tracebackÚ print_exc)rÑr@r r r!r°Ss  z%EditorWindow.load_standard_extensionscCs tjddS)NT)Z editor_only)rZ GetExtensionsr2r r r!rn[sz)EditorWindow.get_standard_extension_namesZZzDummyZzzdummyc Cs:|j ||¡}z>ztjd|td}Wn"ttfk rHt |¡}YnXWn tk rltd|ƒ‚YnXt||ƒ}t   |¡}t |dƒrš|  |j |¡||ƒ}||j|<|r6| |¡|D]t}| dd¡}|dd…dkrî|dd…}qÐ|d d…d kr|dd …}qî|d }t ||ƒrÀ|j |t||ƒ¡qÀdS) Nrä)Úpackagez Failed to import extension: rvú-rcrUrìrcrîZ_event)ÚextfilesrÅÚ importlibÚ import_moduleÚ __package__Ú ImportErrorÚ TypeErrorr´r rror¯rrvr¯rrrFr‚) rÑr@ZfnameÚmodÚclsrpr²ZveventZ methodnamer r r!r³bs4        zEditorWindow.load_extensioncCsF|dkr|jj}|j}||_| ¡D]\}}|r$|j|f|žŽq$dSr×)r*rlrFrprmrË)rÑrprFrPrqr r r!r~szEditorWindow.apply_bindingsc Csê|dkr|jj}|dkr |jj}|j}|j}|D]´\}}| |¡}|sHq0|D]–}|s^| ¡qL|\} } | dd…dk} | r†| dd…} t| ƒ\} } t|| ƒ} || fdd„}| rÐ|  | t ¡}|j | | || |dqL|j | | || dqLq0dS)zAdd appropriate entries to the menus and submenus Menus that are absent or None in self.menudict are ignored. NrUú!cSs| |¡dSr×r,r.r r r!rY sz(EditorWindow.fill_menus..command)rr rYruÚvariable)rr rYru) r*rvrlrÄrFrÅrÇr rwÚ get_var_objZ BooleanVarZadd_checkbuttonr0)rÑrvrprÄrFZmnameZ entrylistr=rzrr*Z checkbuttonr rurYÚvarr r r!r‡s>       þþzEditorWindow.fill_menuscCs&| |¡}|r| ¡}|St|ƒ‚dSr×)rÄrÅÚ NameError)rÑr@rÅÚvaluer r r!Úgetvar¬s  zEditorWindow.getvarcCs(| ||¡}|r| |¡nt|ƒ‚dSr×)rÄr¨rÆ)rÑr@rÇÚvartyperÅr r r!Úsetvar´s  zEditorWindow.setvarcCs,|j |¡}|s(|r(||jƒ|j|<}|Sr×)rwrÅrF)rÑr@rÉrÅr r r!rÄ»s zEditorWindow.get_var_objcCs,|jr$|j d|¡p"d|j |¡kSdSdS)NZTODOÚSTRINGrU)r»rFÚ tag_prevrangeZ tag_names)rÑZ text_indexr r r!Úis_char_in_stringËs ÿzEditorWindow.is_char_in_stringcCs>z"|j d¡}|j d¡}||fWStk r8YdSXdS)Nrërí)NNr5)rÑrûrür r r!Úget_selection_indices×s    z"EditorWindow.get_selection_indicescCs|jdp t}t|ƒS)NÚtabs)rFÚTK_TABWIDTH_DEFAULTrC)rÑÚcurrentr r r!Úget_tk_tabwidthâszEditorWindow.get_tk_tabwidthc CsB|j}| ¡|kr>|j dd|dd|jd|¡}|j|ddS)Nr\rÝz -displayofÚn)rÏ)rFrÒrÜr6ZmasterZ configure)rÑZ newtabwidthrFZpixelsr r r!Úset_tk_tabwidthès þzEditorWindow.set_tk_tabwidthcCsP|r@|r@| ¡}d|kr$dkr.nn||_|j|jkr@d|_| |j¡dS)Nr<rF)Ú guess_indentr­r¬r«rÔ)rÑrÕZguessr’r r r!rºós z#EditorWindow.set_indentation_paramsc Cs>|j}| ¡\}}|r6|r6| ||¡| d|¡dS| dd¡}|dkrp| ddd¡rd| d¡n| ¡dS|dd krŠ| d¡dS|j}t|  |¡ƒ}|d |j |j }d } ||j krÂqü|dd…}| d } t|  |¡ƒ}||ksü|dd kr¶qüq¶|  ¡| d | d¡||kr2|  dd ||¡| ¡dS)NrçrNrãr>rîrêz insert-1crcú rUrz insert-%dcrå)rFrÎrrörÅrðZbellr¬róÚ expandtabsr­rzrµrçr¶) rÑrPrFrûrüÚcharsr¬ZhaveZwantZ ncharsdeletedr r r!r—üs@          z"EditorWindow.smart_backspace_eventc Csô|j}| ¡\}}| ¡zÊ|r\|r\t|ƒt|ƒkrD|j |¡W¢¤S| ||¡| d|¡|  dd¡}t ||j ƒ\}}|t |ƒkr–|  ||j¡n>|jr¢d}n&t | |j ¡ƒ}|j} d| || }| d|¡| d¡W¢dS| ¡XdS)NrçrãrærårN)rFrÎrµr¶Ú index2lineršr›rrörÅÚget_line_indentr¬róÚ reindent_tor­r«r×rçrø) rÑrPrFrûrüÚprefixÚrawZ effectiveZpadrÓr r r!r™(s,       zEditorWindow.smart_indent_eventc Csì|j}| ¡\}}| ¡z¶|r>|r>| ||¡| d|¡| dd¡}dt|ƒ}}||krv||dkrv|d7}qX||kr”|  dd¡W¢DdS|d|…}d}|rÔ|d dkrÔ||j krÔ|dd …}|d7}q¤|rè| d |d¡| d¡dkr| d¡qè|  dd¡t |  d¡ƒ} t  |j|j¡} |j s°|jD]`} t| | dƒ} t| ƒd } | | d¡}|  |¡|  | | ¡¡}|dk s”| dkr<qžq<|  |pªd¡n@| d d¡}|rÌ|d} nd } | | d¡}|  |¡|  d¡|  ¡}|t jkrˆ|t jkrnn|t jkr,|  d|¡nT|t jkrH| |  ¡¡n8|t j kr€|  !¡dkrp|  d|¡n| |  "¡¡nW¢PdS|  #¡}|  d|¡|  $¡r²| %|¡n|rÌ|  &¡rÌ| '|¡W¢dS| d¡| ¡XdS)a…Insert a newline and indentation after Enter keypress event. Properly position the cursor on the new line based on information from the current line. This takes into account if the current line is a shell prompt, is empty, has selected text, contains a block opener, contains a block closer, is a continuation line, or is inside a string. rçrãrrÖrUrerNNrczinsert - %d charsrGZconsolerê)(rFrÎrµrør¶rrörÅrórçrzrÙrÆrZParserr­r¬r±r rµZset_codeZfind_good_parse_startÚ_build_char_in_string_funcZset_lorÌZget_continuation_typeZC_NONEZC_STRING_FIRST_LINEZC_STRING_NEXT_LINESZ C_BRACKETrÛZcompute_bracket_indentZ C_BACKSLASHZget_num_lines_in_stmtZcompute_backslash_indentZget_base_indent_stringZis_block_openerr™Zis_block_closerr—)rÑrPrFrûrürùr’rÓÚindentÚlnor#ÚcontextZstartatZ startatindexZrawtextZbodr}rèr r r!r˜Ks†                 ÿ                z%EditorWindow.newline_and_indent_eventcCs||jfdd„}|S)NcSs||d|ƒS)Nz+%dcr )ÚoffsetZ _startindexZ_icisr r r!ÚinnerÂsz6EditorWindow._build_char_in_string_func..inner)rÍ)rÑZ startindexrãr r r!rÞÁsÿ z'EditorWindow._build_char_in_string_funccCs2|jr&t||jƒ\}}d|d|Sd|SdS)Nrærå)r«Údivmodr¬)rÑrÓZntabsZnspacesr r r!Ú _make_blanksÑszEditorWindow._make_blankscCsJ|j}| ¡| ddd¡r(| dd¡|r>| d| |¡¡| ¡dS)Nrãz!=rç)rFrµrðrrçrår¶)rÑr[rFr r r!rÛÛs zEditorWindow.reindent_tocCsPt|j|jƒ ¡\}}|r@|r@t||jƒ\}}t||jƒ\}}nd}}||S©Nr)ÚIndentSearcherrFr¬rrÚ)rÑÚopenerZindentedrÝZ indentsmallZ indentlarger r r!rÕés zEditorWindow.guess_indentcCsN|jdkrdS|jjr&|j ¡d}n|j ¡d}|jdd|›dddS)NZShowZHiderdrfz Line Numbers)r=rÆr)r½Zis_shownZ hide_sidebarZ show_sidebarr)rÑrPZ menu_labelr r r!rÐòs   ÿz&EditorWindow.toggle_line_numbers_event)NNNN)N)N)N)N)N)N)N)N)N)N)N)N)rç)rç)N)NN)N)N)T)N)”rOÚ __module__Ú __qualname__Zidlelib.percolatorr$Zidlelib.colorizerr%r&Z idlelib.undor'Zidlelib.iomenur(r)rPr*Zidlelib.statusbarr+Zidlelib.autocompleter,Zidlelib.autoexpandr-Zidlelib.calltipr.Zidlelib.codecontextr/Zidlelib.sidebarr0Zidlelib.formatr1r2r3r4Zidlelib.parenmatchr5Zidlelib.squeezerr6Zidlelib.zoomheightr7rÚgetfilesystemencodingZfilesystemencodingrgrÍrÏrÖr…rªr¡rŸr¥rr r~rÉrrÎr§r%r„r'r&r3r1r7rŒrrŠr‹r†r‡rˆrrrœrržr‘r’r”r“r•r–rLrŽr¢r£r¤rXrÀr^r_r¹rarbrÁÚstringÚ ascii_lettersÚdigitsrfrir°rjrtrxr®rryrÂrŽr·ršrœržr—r˜r‰rWrŸrr¨rƒrªrr¬rÃr®r°rnrºr³rrrÈrÊrÄrÍrÎrÒrÔrºr—r™r˜rÞrårÛrÕrÐr r r r!r#1s               + ù   %þ              $ .    ÿ %     ,#v  r#cCs tt|ƒƒSr×)rCr)rÆr r r!rÙsrÙz[ \t]*cCs$t |¡}| ¡t| ¡ |¡ƒfS)zÌReturn a line's indentation as (# chars, effective # of spaces). The effective # of spaces is the length after properly "expanding" the tabs into spaces, as done by str.expandtabs(tabwidth). )Ú_line_indent_rer¤rbróÚgroupr×)rùr¬r§r r r!rÚs rÚc@s8eZdZdd„Zdd„Zejejdfdd„Zdd „Z d S) rçcCs(||_||_d|_|_d|_|_dSræ)rFr¬r’ÚfinishedÚ blkopenlineÚ indentedline)rÑrFr¬r r r!rÖs zIndentSearcher.__init__cCsL|jr dS|jd}|_t|ƒd}|j |dd¡r:dS|j ||d¡S)Nr>rUrGz>=rbz lineend+1c)rñr’rµrFrðrÅ)rÑr’r¡r r r!Úreadlines zIndentSearcher.readline)ÚclassÚdefÚforÚifÚtryÚwhilec Cs>|jrn2||kr ||kr ||_n||kr:|jr:||_d|_dS)NrU)rñròró) rÑrEÚtokenÚstartrbrùÚINDENTÚNAMEZOPENERSr r r!Ú tokeneater%szIndentSearcher.tokeneaterc Cshtj}|jt_zDz$t |j¡}|D]}|j|Žq"Wntjtfk rNYnXW5|t_X|j|j fSr×) ÚtokenizeÚtabsizer¬Úgenerate_tokensrôrÿÚ TokenErrorÚ SyntaxErrorròró)rÑZ save_tabsizeÚtokensrûr r r!r1s  zIndentSearcher.runN) rOrérêrÖrôrrýrþrÿrr r r r!rçs ý rçcCs6| d¡}|dkr.|d|…||dd…}||fS)NrcrrU)rF)Úsr’r r r!r Cs r ú[ú]ú/)Z bracketleftZ bracketrightZslashcCs´| |¡}|rt ¡r"|dkr"dS|d}t ddd„|¡}t ddd„|¡}t d d|¡}t d d |¡}t d d |¡}t dd|¡}t dd|¡}t dd|¡}t dd|¡}|S)N>rSrTrLr>rz-[a-z]\bcSs | ¡ ¡Sr×)rðÚupper©r§r r r!rQ\rRz!get_accelerator..z\b\w+\bcSst | ¡| ¡¡Sr×)ÚkeynamesrÅrðr r r r!rQ]rRzKey-ZCancelz Ctrl-BreakzControl-zCtrl-r¹ú+z>sx                    Z  4 ý