ʹÓÃ
Dynamic Languages Toolkit (DLTK) ´´½¨×Ô¼ºµÄ IDE
Eclipse Ϊ¹¹½¨±àÒëÐÔÓïÑÔ£¨±ÈÈç C£©ºÍ Java? ±à³ÌÓïÑԵŤ¾ßÌṩÁË´óÁ¿ÌØÐÔ£¬µ«¶Ô½Å±¾ÓïÑÔ£¨±ÈÈç
Perl¡¢Python ºÍ PHP£©µÄÖ§³ÖÈ´ºÜÉÙ¡£ÇìÐÒµÄÊÇ£¬Eclipse Dynamic Languages
Toolkit (DLTK) ΪÕâЩÓïÑÔÒÔ¼°ÀàËÆµÄÓïÑÔÌṩÁËÖ§³Ö¡£Í¨¹ý±¾ÎÄѧϰ¹¹½¨»ùÓÚ DLTK µÄ IDE
µÄ²½Ö裬²¢ÇÒ̽Ë÷ÿ¸ö²½ÖèµÄÑùÀý´úÂë¡£
¿ªÊ¼Ö®Ç°
¹ØÓÚ±¾½Ì³Ì
±¾½Ì³ÌÏÔʾÈçºÎͨ¹ý Eclipse DLTK Ϊ½Å±¾ÓïÑÔ¹¹½¨¿ª·¢¹¤¾ß£¬²¢ÇÒÌØ±ð½âÊÍÁËÈçºÎÔÚ»ùÓÚ²å¼þµÄÏîÄ¿ÖÐʵÏÖÓï·¨×ÅÉ«¡¢Óû§Ê×Ñ¡ÏîºÍ½âÊÍÆ÷¼¯³É¡£
Ä¿±ê
Õâ¸ö½Ì³Ì·Ö²½½âÊÍÁËÈçºÎ¹¹½¨»ùÓÚ DLTK µÄ¿ª·¢»·¾³¡£Õâ¸öÌÖÂÛͨ¹ý¹Ø×¢»ùÓÚ
Octave ÊýÖµ¼ÆËãÓïÑÔµÄʵ¼Ê²å¼þÏîÄ¿À´½éÉÜ DLTK¡£ÌÖÂÛµÄÖ÷Ìâ°üÀ¨£º
´´½¨²å¼þÏîÄ¿¡£
ÅäÖÃ±à¼Æ÷ºÍ DLTK Îı¾¹¤¾ß¡£
Ìí¼ÓÔÚÎı¾±à¼Æ÷ÖпØÖÆÓï·¨ÑÕÉ«µÄÀà¡£
ÆôÓÃÓû§Ê×Ñ¡Ïî¡£
½«½Å±¾½âÊÍÆ÷¼¯³Éµ½¿ª·¢»·¾³¡£
Ìí¼Ó¶¨ÖÆ¿ØÖÆÌ¨£¬ÒÔÔÚ¹¤×÷̨ºÍ½âÊÍÆ÷Ö®¼ä½øÐÐͨÐÅ¡£
ÏȾöÌõ¼þ
±¾½Ì³ÌÊÇΪÊìϤ Eclipse ²¢¶Ô¹¹½¨¶¯Ì¬ÓïÑÔ£¨±ÈÈç PHP¡¢Tcl¡¢Ruby
ºÍ Python£©¹¤¾ß¸ÐÐËȤµÄ Java ¿ª·¢ÈËÔ±±àдµÄ¡£ËüÒªÇó¶ÁÕß»ù±¾Àí½â²å¼þºÍ»ùÓÚ Eclipse
µÄ¿ª·¢¹¤¾ß¡£
ϵͳÐèÇó
ΪÁ˹¹½¨±¾½Ì³ÌÖеÄʾÀýÏîÄ¿£¬±ØÐë¾ß±¸°²×°ÓÐ Eclipse£¨V3.4 »ò¸üа汾£©µÄ¼ÆËã»ú£¬ÒÔ¼°×îеÄ
Java Runtime Environment (JRE)¡£´ËÍ⣬±ØÐë°²×°½Ïа汾µÄ DLTK£¬ÎÒÃǽ«ÔÚ
¡°°²×° DLTK¡± С½ÚÖжԴ˽øÐÐ˵Ã÷£¨²Î¼û ²Î¿¼×ÊÁÏ »ñµÃ Eclipse ÏÂÔØÁ´½Ó£©¡£
DLTK ºÍ DLTK ±à¼Æ÷½éÉÜ
Eclipse Ìṩ´óÁ¿ÓÃÓÚ¹¹½¨¿ª·¢¹¤¾ßµÄÌØÐÔ£¬µ«ÕâÐ©ÌØÐÔ²»Ò×Àí½âºÍʹÓá£ÔÚÕâЩÀàÖУ¬´ó²¿·Ö¶¼Ðè´óÁ¿µÄÅäÖòÅÄÜÕýÈ·¹¤×÷£¬±ÈÈç
TextEditor¡£Ïà·´£¬DLTK Ìṩһ¸öÔ¤´ò°üµÄ¿ª·¢»·¾³£¬Ö»Ðè½øÐÐһЩСµÄµ÷Õû¾ÍÄܹ¤×÷¡£Óà DLTK
¹¹½¨¿ª·¢¹¤¾ß¾ÍÏñÓø÷ÖÖ»ìºÏÔÁÏ¿¾Ãæ°üÒ»Ñù£º½á¹û²»ÊǺÜÓд´Ò⣬µ«ÊÇ¿ÉÒÔÒÔ×îÉٵŤ×÷»ñµÃ×î¼ÑµÄÖÊÁ¿ºÍ¿É¿¿ÐÔ¡£
DLTK ºÍ Eclipse µÄµÚ¶þ¸öÇø±ð¾ÍÊÇÖ§³ÖµÄÓïÑÔ¡£Eclipse
µÄ¹¹½¨ÌØÐÔ»ùÓÚ±àÒëÐÔÓïÑÔ£¬±ÈÈç Java¡¢C ºÍ C++¡£¶ø DLTK ÔòÆ«Ïò¶¯Ì¬ÓïÑÔ£¬ÆäÖаüÀ¨½Å±¾ÓïÑÔ£¬±ÈÈç
PHP¡¢Ruby ºÍ Tcl µÈ¡£ÔÚÀíÏëµÄÇé¿öÏ£¬ÕâЩÓïÑԵĿª·¢¹¤¾ßÓ¦¸ÃÄܹ»ÇáËɵؼ¯³É½Å±¾½âÊÍÆ÷¡¢ÖðÐнøÐÐÃüÁî¼ÆË㣬ÒÔ¼°ÔÚ¿ØÖÆÌ¨ÖÐÊäÈëÃüÁî¡£Óë
Eclipse ²»Í¬£¬DLTK Ö§³ÖËùÓÐÕâÐ©ÌØÐÔ¡£
°²×° DLTK
Èç¹ûÄú»¹Ã»Óа²×° DLTK£¬Çë°´ÒÔϲ½Öè²Ù×÷£º
´ò¿ª Eclipse£¬È»ºóµ¥»÷ Help > Software Updates¡£
µ¥»÷ Available Software Ñ¡Ï¡£
µ¥»÷ Add Site£¬È»ºóÊäÈë http://download.eclipse.org/technology/dltk/updates¡ª
DLTK ¸üÐÂÕ¾µãµÄ URL¡£
Ñ¡Ôñ DLTK ¸´Ñ¡¿ò£¬È»ºóµ¥»÷ Install¡£
»ùÓÚ DLTK µÄ²å¼þÏîÄ¿£ºOctave IDE
±¾½Ì³Ì²»½ö½öÊÇÌÖÂÛ DLTK ¼°ÆäÌØÐÔ¡£Ëü½«½ÌÄúÈçºÎÖð²½´´½¨ Octave
½Å±¾ÓïÑԵĻùÓÚ DLTK µÄ¼¯³É¿ª·¢»·¾³£¨IDE£©¡£Octave ÊÇÓÉ GNU Public License
(GPL) ÊÚȨµÄ¹¤¾ß¼¯£¬ÓÃÓÚÖ´ÐÐÊýѧ¼ÆË㣬ÓÈÆäÊʺÏÉæ¼°¾ØÕóµÄÇé¿ö¡£Octave ÃüÁîÒ×ÓÚÀí½â£¬²¢ÇÒÓëÁ÷ÐеÄרÓй¤¾ß
Matlab ·Ç³£ÏàËÆ¡£Äú¿ÉÒÔ´Ó ÏÂÔØ С½ÚÏÂÔØËüµÄʾÀý´úÂë¡£
½«Òª¹¹½¨µÄ Octave IDE ²»Èç Eclipse ÄǰãÍêÃÀ£¬µ«ÊÇËü¿ÉÒÔ´´½¨
Octave ½Å±¾£¨*.m Îļþ£©£¬Ôڶ๦ÄÜÎı¾±à¼Æ÷Öб༽ű¾£¬²¢ÇÒµ¥»÷Ò»¸ö°´Å¥¾ÍÄÜÔËÐÐ Octave
½âÊÍÆ÷£¬È»ºó¿ÉÒԲ鿴ÏÔʾÔÚ IDE ¿ØÖÆÌ¨ÖеĽá¹û¡£Í¼ 1 ÏÔʾÁË±à¼Æ÷ºÍ¿ØÖÆÌ¨¡£

ͼ 1. Octave IDE
±¾½Ì³Ìͨ¹ý 4 ¸ö²½Öè½âÊ͹¹½¨ Octave IDE µÄ¹ý³Ì£º
´´½¨ Octave ±à¼Æ÷²¢Ìí¼ÓÌØÐÔ¡£
´æ´¢²¢ÏìÓ¦Óû§Ê×Ñ¡Ïî¡£
¼¯³É Octave ½âÊÍÆ÷¡£
ÔÚ¿ØÖÆÌ¨ÖÐÏÔʾ½âÊÍÆ÷µÄÊä³ö¡£
Ê×ÏÈÒª´¦ÀíµÄÊÇ Octave ½Å±¾±à¼Æ÷¡£Õâ¸öÖ÷ÌâÓкܶàÐèÒªÀí½âµÄµØ·½£¬µ«ÔÚ±àд´úÂë֮ǰ£¬ÎÒÃÇÏÈÍËÒ»²½£¬¿´¿´
DLTK ±à¼Æ÷ÊÇÈçºÎ¹¤×÷µÄ¡£ÕâЩÌÖÂÛ»ù±¾ÊÊÓÃÓÚËùÓÐ Eclipse Îı¾±à¼Æ÷¡£
DLTK Îı¾±à¼Æ÷µÄ¸ß¼¶½éÉÜ
´Ó×î»ù´¡µÄ¼¶±ð½²£¬DLTK Îı¾±à¼Æ÷½öÊÇÒ»¸ö´øÓÐÐí¶à¶îÍâÌØÐÔµÄÆÕͨ Standard
Widget Toolkit (SWT) StyledText ²¿¼þ¡£ÕâÐ©ÌØÐÔ·ÖΪÁ½Àࣺ
ÏìÓ¦Óû§Ê¼þ
¸ù¾ÝÓû§µÄ»÷¼ü¸ü¸Ä±à¼Æ÷ÏÔʾ
ÎļþÊäÈë/Êä³ö£¨I/O£©
ÔÚ IDE ºÍÓû§ÏµÍ³ÉϵÄÎļþÖ®¼ä´«Êä×Ö·ûÊý¾Ý
ÔÚ DLTK ±à¼Æ÷ÖУ¬ÓÉ ScriptSourceViewer ¶ÔÏó¸ºÔð´¦Àíʼþ¡£Õâ¸ö¶ÔÏóÊÇÓÉ
ScriptEditor ´´½¨µÄ£¬Ëü°üΧ StyledText ²¿¼þ£¬²¢ÇÒ¹ÜÀíÆä¶ÔÓû§»÷¼üµÄÏìÓ¦¡£Õâ¸öÏìӦͨ³£Éæ¼°µ½Ð޸IJ¿¼þµÄÏÔʾ»ò¸üÐÂ±à¼Æ÷µÄÄÚ²¿Êý¾Ý¡£Êý¾ÝÄÚǶÔÚ
IDocument ¶ÔÏóÖУ¬Õâ¸ö¶ÔÏó²»½ö´æ´¢Îı¾£¬²¢ÇÒ»¹´æ´¢ÓëÐкš¢Î»ÖúÍÇøÓò£¨¼´·ÖÇø£©Ïà¹ØµÄÐÅÏ¢¡£
ScriptSourceViewer ͨ¹ý·ÃÎʳÆÎª SourceModuleDocumentProvider
µÄ¶ÔÏó¸üРIDocument¡£³ýÁËÄܹ»·ÃÎÊ IDocument Ö®Í⣬Õâ¸ö¶ÔÏó»¹´¦ÀíÎļþ²Ù×÷¡£DLTK
ÌæÄú´¦ÀíËùÓÐ±à¼Æ÷Îļþ½»»¥£¬µ«Èç¹ûÐèÒª½øÒ»²½Á˽⣬¿ÉÒÔÔĶÁ¹ØÓڸöÔÏóµÄ³¬Àà TextFileDocumentProvider
µÄÎĵµ£º¡£
Èç¹ûÊìϤ Model-View-Controller (MVC) ģʽ£¬ScriptSourceViewer¡¢IDocument
ºÍ StyledText ²¿¼þÖ®¼äµÄ¹ØÏµ¾Í»áºÜÇåÎú¡£IDocument ÓÃ×÷±à¼Æ÷µÄ Model£¨Ä£ÐÍ£©²¿·Ö£¬°üº¬ÓëÆä±íʾÎ޹صÄÊý¾Ý¡£StyledText
²¿¼þÓÃ×÷±à¼Æ÷µÄ View£¨ÊÓͼ£©²¿·Ö£¬¶ø ScriptSourceViewer ÔòÓÃ×÷ Controller£¨¿ØÖÆÆ÷£©²¿·Ö£¬ÓÃÓÚ¹ÜÀí
Model¡¢View ºÍÓû§Ö®¼äµÄͨÐÅ¡£Í¼ 2 ÏÔʾÁËÕâÒ»¹ØÏµ¡£

ͼ 2. DLTK ±à¼Æ÷µÄ»ù±¾×é³É²¿·Ö
Èç¹ûÄÜÀí½âÉÏÃæµÄ½âÊÍÄÚÈݺÍͼ 2£¬ÄÇô¾ÍºÜÈÝÒ×Àí½â½ÓÏÂÀ´µÄ¼¼ÊõÌÖÂÛ¡£ÏÂһС½Ú½«¿ªÊ¼´´½¨
Octave ²å¼þ¡£
¿ªÊ¼ DLTK ÏîÄ¿
Ϊ¼òµ¥Æð¼û£¬±¾½Ì³Ì½«ËùÓÐ Octave IDE ÌØÐÔ¼¯³Éµ½Ò»¸ö¼òµ¥µÄ²å¼þÖС£×ÜÌåÀ´Ëµ£¬¾ÍÊÇÓöà¸ö²å¼þʵÏÖÒ»¸öÌØÐÔ£ºÕâЩ²å¼þ·Ö±ð°üº¬ºËÐÄÀà¡¢UI
Àà¡¢µ÷ÊÔÀàµÈµÈ¡£µ«ÊDZ¾½Ì³ÌµÄ´úÂëÖ»ÐèÒªÒ»¸ö²å¼þ£¬Òò´ËÔËÐÐ Eclipse ʱ£¬µ¥»÷ File >
New > Project£¬Ñ¡Ôñ Plug-in Project Ñ¡ÏȻºó´´½¨Ò»¸öеIJå¼þÏîÄ¿¡£ÔÚʾÀý´úÂëÖУ¬ÏîÄ¿ÃûΪ
org.dworks.octaveide£¬²¢ÇÒ²å¼þÀàΪ OctavePlugin£¨µ«ÊÇÄú¿ÉÒÔÑ¡Ôñ×Ô¼ºÏ²»¶µÄÃû³Æ£©¡£
ÅäÖà Octave ²å¼þ
ÔÚ´´½¨²å¼þÖ®ºó£¬ÏÂÒ»²½±ãÊǽ«Ò»Ð©À©Õ¹Ìí¼Óµ½ Octave IDE ²å¼þµÄÅäÖÃÎļþÖУºplugin.xml£¨ÐèÒªµ¥»÷
File > New > File À´´´½¨¸ÃÎļþ£©¡£ÕâЩÀ©Õ¹¸æËß Eclipse Õâ¸ö²å¼þÈçºÎÔÚ¹¤×÷̨Öй¤×÷¡£Ê×ÏÈ£¬plugin.xml
ÎļþÐèÒªÁ½¸ö¼òµ¥µÄÀ©Õ¹£ºÒ»¸öÓÃÓÚʶ±ð Octave ±à¼Æ÷£¬ÁíÒ»¸öÓÃÓÚʶ±ðÐèÒª±à¼µÄÎļþµÄÀàÐÍ¡£Çåµ¥ 1
¸ø³öÁ˵ÚÒ»¸öÀ©Õ¹£¬Ëü¶¨Òå Octave ±à¼Æ÷µÄÌØÕ÷¡£
Çåµ¥ 1. Octave IDE ±à¼Æ÷À©Õ¹
<extension point="org.eclipse.ui.editors"> <editor id="org.dworks.octaveide.editor.OctaveEditor" class="org.dworks.octaveide.editor.OctaveEditor" contributorClass="org.dworks.octaveide.actions.OctaveActionContributor" default="true" icon="icons/oct.gif" name="%OctaveEditor.name"> <contentTypeBinding contentTypeId="org.dworks.octaveide.octaveContentType"> </contentTypeBinding> </editor> </extension> |
Õâ¸öÀ©Õ¹°üº¬¼¸¸ö·Ç³£ÖØÒªµÄÊôÐÔ¡£class ÊôÐÔ¶¨Òå¹¹³É±à¼Æ÷µÄ»ùÀࣺOctaveEditor¡£ËæºóÄú½«´´½¨Õâ¸öÀà¡£contributorClass
ÊôÐÔʶ±ðΪ±à¼Æ÷ÌṩÐÐΪµÄÀà¡£default ÊôÐÔÒªÇó OctaveEditor Ó¦¸ÃÊÇÏà¹ØÎļþµÄĬÈÏ±à¼Æ÷¡£name
ÊôÐÔʶ±ð½«ÔÚ±à¼Æ÷ÖÐÏÔʾµÄÎı¾¡£¾ÍÏñÔÚ plugin.properties ÎļþÖж¨ÒåµÄÒ»Ñù£¬OctaveEditor.name
ÊôÐÔ¶ÔÓ¦ ¡°Octave Script Editor¡±¡£
Õâ¸öÀ©Õ¹ÖÐ×îºóÐèÒª½âÊ͵ÄÊÇ contentTypeBinding¡£Eclipse °üº¬Ò»¸öÄÚÈÝÀàÐÍ×¢²á±í£¬ÓÃÀ´±íʾÎļþ¸ñʽºÍÃüÃûÔ¼¶¨¡£Í¨¹ý½«
contentTypeBinding ÔªËØÌí¼Óµ½±à¼Æ÷µÄÀ©Õ¹£¬¾Í¿ÉÒÔ½«±à¼Æ÷ÓëÎļþºó׺¡¢ÎļþÃû£¬ÉõÖÁÎļþ±ðÃû¹ØÁªÆðÀ´¡£µ«ÄúµÄ
Octave ±à¼Æ÷Ö»ÐèÒª¹Ø×¢ *.m Îļþ£¬Òò´Ë org.eclipse.core.runtime.contentTypes
À©Õ¹ºÜ¼òµ¥¡£Çåµ¥ 2 ¸ø³öÁ˵ڶþ¸öÀ©Õ¹¡£
Çåµ¥ 2. Octave IDE ContentType À©Õ¹
<extension point="org.eclipse.core.runtime.contentTypes"> <content-type id="org.dworks.octaveide.octaveContentType" base-type="org.eclipse.core.runtime.text" file-extensions="m" name="%octaveContentType" priority="high"> </content-type> </extension> |
Ðí¶àÊôÐÔ¶¼¿ÉÒÔÓÃÀ´¶¨ÖÆÄÚÈÝÀàÐÍ£¬µ«ÊÇÕâ¸öÉùÃ÷½« org.dworks.octaveide.octaveContentType
ÄÚÈÝÀàÐÍʶ±ðΪ»ùÓÚÎı¾µÄ£¬²¢ÇÒÓëÎļþºó׺ .m Ïà¹ØÁª¡£priority ÊôÐÔÒªÇóÈç¹ûÒ»¸öÎļþÓë¶à¸öÄÚÈÝÀàÐÍÏà¹ØÁª£¬Ä³¸öÀàÐͱØÐë¾ßÓкܸߵÄÓÅÏȼ¶¡£
´´½¨ DLTK ÓïÑÔ¹¤¾ßÏäÀà
ʹÓà DLTK µÄ×î´óºÃ´¦ÊǶ¨ÖÆ IDE µÄ¹¤×÷·½Ê½ºÜ¼òµ¥¡£Õâ¸ö¶¨ÖÆ¿ÉÒÔͨ¹ý DLTK µÄÓïÑÔ¹¤¾ßÏä½Ó¿ÚÀ´ÊµÏÖ£¨IDLTKCoreLanguageToolkit¡¢IDLTKDebugUILanguageToolkit
ºÍ IDLTKUILanguageToolkit µÈ£©¡£ÊµÏÖÕâЩ½Ó¿ÚÖ®ºó£¬ËüÃǾ͸ø³öÅäÖà IDE µÄ¸÷¸ö·½ÃæµÄ·½·¨£¬±ÈÈç½âÎö¡¢ÑÕɫʹÓá¢Óû§Ê×Ñ¡ÏîºÍ½âÊÍÆ÷µÄ·ÃÎÊ¡£
±¾½Ì³ÌÖ÷Òª¹Ø×¢ DLTK UI£¬Òò´Ë½öÐè¹ØÐÄ IDLTKUILanguageToolkit¡£Õâ¸ö½Ó¿ÚÖеķ½·¨Ö´ÐÐÁ½ÏÄÜÖ®Ò»£ºËüÃÇ»òÕß·µ»Ø´¦Àí±à¼Æ÷ÅäÖõÄÀ࣬»òÕßÌṩÔÚ
plugin.xml ÖÐÉùÃ÷µÄÅäÖöÔÏóµÄ ID¡£ÏÖÔÚÁгöÕâЩ·½·¨ÖÐµÄ 7 ¸ö¡£
getEditorId(Object elementID)
·µ»Ø±à¼Æ÷µÄ ID
getTextTools()
·µ»Ø ScriptTextTools ¶ÔÏó£¬Ëü¶¨ÖÆÈçºÎÔÚ±à¼Æ÷ÖÐÏÔʾÎı¾
createSourceViewerConfiguration()
·µ»Ø ScriptSourceViewerConfiguration ¶ÔÏó£¬ËüÅäÖÃ±à¼Æ÷µÄÔ´´úÂë²é¿´Æ÷µÄ²Ù×÷
getPreferenceStore()
·µ»Ø IPreferenceStore ¶ÔÏó£¬Ëü°üº¬Óû§ÉèÖÃ
getEditorPreferencePages()
·µ»ØÓë±à¼Æ÷ÉèÖÃÏà¹ØµÄÊ×Ñ¡ÏîÒ³ÃæµÄ ID
getInterpreterPreferencePages()
·µ»ØÓë½Å±¾½âÊÍÆ÷Ïà¹ØµÄÊ×Ñ¡ÏîÒ³ÃæµÄ ID
getIntepreterId()
·µ»Ø½Å±¾½âÊÍÆ÷µÄ ID
ÔÚʾÀý´úÂëÖУ¬OctaveUILanguageToolkit ÀàʹÓöÔÏóºÍ±êʶ·û²¹³äÁËÕâЩ·½·¨¡£ÔÚÕâ¸ö¹¤¾ßÏäÖУ¬ÓëÁгöµÄǰÁ½¸ö·½·¨¶ÔÓ¦µÄÁ½¸ö¶ÔÏóÊÇ
OctaveEditor ºÍ OctaveTextTools¡£
´´½¨ Octave ±à¼Æ÷ºÍ Octave Îı¾¹¤¾ß
ÏÖÔÚ±à¼Æ÷À©Õ¹ÒѾÅäÖÃÍê³É£¬½ÓÏÂÀ´Ê×ÏÈÐèÒª×öµÄ¾ÍÊÇ´´½¨ OctaveEditor¡£ÓÉÓÚÓÐÁË DLTK£¬ËùÒÔ²»ÐèÒª±àдºÜ¶à´úÂ룺DLTK
µÄ ScriptEditor ÀࣨOctaveEditor µÄ³¬Àࣩ°ïÖúÄú´¦Àí´ó²¿·Ö±à¼Æ÷²Ù×÷¡£Äú½öÐèһЩÅäÖ÷½·¨¡£ÔÚ
OctaveEditor ÖУ¬×îÖØÒªµÄ·½·¨ÊÇ getTextTools()£¬Ëü·µ»ØÒ»¸ö ScriptTextTools
¶ÔÏó¡£
ScriptTextTools ÀàÊ®·Ö·½±ã¡£Õâ¸öÖÐÐÄÀà·ÃÎÊÆäËû¼¸¸öÌṩ±à¼Æ÷ÌØÐÔµÄÀࡣͨ¹ý±àд ScriptTextTools
µÄ×ÓÀ࣬±à¼Æ÷Äܹ»¶¨ÖÆÕâÐ©ÌØÐÔµÄÖ´Ðз½Ê½¡£Octave ±à¼Æ÷´´½¨Ò»¸ö³ÆÎª OctaveTextTools
µÄ×ÓÀ࣬ËüÄܹ»·ÃÎÊÁ½¸öÖØÒªµÄ¶ÔÏó£º
OctavePartitionScanner
¶ÁÈ¡±à¼Æ÷Îı¾²¢¾ö¶¨·ÖÇø½çÏÞ
OctaveSourceViewerConfiguration
ÅäÖà ScriptSourceViewer ¼°ÆäÏìÓ¦Óû§Éú³ÉµÄʼþµÄ·½Ê½
ÕâЩ¶ÔÏóÔÚʵÏÖÓï·¨×ÅÉ« ʱÓÈÎªÖØÒª ¡ª ¼´¸ù¾ÝÎı¾µÄÓï·¨¹¦Äܸıä´úÂëÖÐÎı¾µÄÑÕÉ«¡£ÏÂÒ»¸öÖ÷Ì⽫¸ü¼ÓÏêϸµØ½âÊÍÕâ¸öÌØÐÔ¡£
DLTK ±à¼Æ÷ÖеÄÓï·¨×ÅÉ«
Óï·¨×ÅÉ«ÊÇÈκÎרҵԴ´úÂë±à¼Æ÷×îÒýÈËעĿµÄ·½ÃæÖ®Ò»¡£ÑÕÉ«²»½öÈÃ?ÂëµÄÔĶÁ¸ü¼Ó·½±ã£¬²¢ÇÒʹÊäÈë´íÎó¸üÃ÷ÏÔ¡£Í¼
3 ÏÔʾÈçºÎͨ¹ý²»Í¬µÄÑÕÉ«½«×¢ÊÍ¡¢Êý×Ö¡¢¹Ø¼ü×ÖºÍ×Ö·û´®ÓëÆÕͨµÄ´úÂëÇø·Ö¿ªÀ´¡£

ͼ 3. Octave IDE ÖеÄÓï·¨×ÅÉ«
ÔÚ Octave ±à¼Æ÷ÖÐÅäÖÃÓï·¨×ÅÉ«
DLTK ͨ¹ý 4 ¸ö²½Öè´¦ÀíÓï·¨×ÅÉ«£º
ScriptSourceViewer ͨ¹ýÏòÎĵµµÄ·ÖÇøÆ÷£¨partitioner£©·¢³ö֪ͨÀ´ÏìÓ¦»÷¼ü¡£
·ÖÇøÆ÷¸ù¾Ý¹æÔò¶ÔÎĵµµÄÎı¾·ÖÇø¡£
·ÖÇø½áÊøÖ®ºó£¬²é¿´Æ÷֪ͨÏÔʾµ÷½âÆ÷£¨presentation reconciler£©·ÖÎöÐ޸ĺóµÄ·ÖÇø¡£
µ÷½âÆ÷µ÷ÓÃÏú»ÙÆ÷/ÐÞ¸´Æ÷£¨damager/repairer£©À´·ÖÎöÊÜÓ°ÏìµÄÇøÓò£¬È»ºóÓ¦ÓÃÓï·¨×ÅÉ«¹¦ÄÜ¡£
ÔÚÕâÖÖ·½Ê½Ï£¬±à¼Æ÷ʹÓ÷ÖÖΣ¨divide-and-conquer£©²ßÂÔÀ´ÎªÎı¾Ìí¼ÓÑÕÉ«¡£Ê×ÏÈ£¬Ëü½«Îĵµ·ÖΪ¶à¸öÇøÓò¡£È»ºó£¬·ÖÎöÐ޸ĺóµÄÇøÓò²¢È·¶¨ÐèÒª¸üÐÂÓï·¨ÑÕÉ«µÄµØ·½¡£½ÓÏÂÀ´µÄÁ½¸öС½Ú½«¸ü¼ÓÉîÈëµØ½âÊÍÕâ¸ö¹ý³Ì£¬²¢ÇÒÑÝʾÈçºÎÔÚ
Octave IDE ÖÐʵÏÖÓï·¨×ÅÉ«¡£
Îĵµ·ÖÇø
³ýÁËÎı¾Ö®Í⣬IDocument »¹´æ´¢Ò»×é Position£¬ËüÃÇÓÃÓÚÈ·¶¨Îı¾ÄÚ²¿µÄÇøÓòµÄ½çÏÞ¡£ÕâÐ©ÇøÓò²»½öʹÓï·¨×ÅÉ«³ÉΪ¿ÉÄÜ£¨×¢ÊͺʹúÂë²ÉÓò»Í¬µÄÑÕÉ«£©£¬²¢ÇÒʹÄúÄܹ»ÔÚÎı¾µÄ²»Í¬ÇøÓòÉÏʹÓò»Í¬µÄ¹¤¾ß¡£ÀýÈ磬²»Èýű¾½âÎöÆ÷·ÖÎö×¢ÊÍÐС£Í¨¹ý·ÖÇø£¬¿ÉÒÔÈ·±£½âÎöÆ÷½ö·ÖÎö°üº¬Êµ¼Ê´úÂëµÄÇøÓò¡£
ÓÉÁ½¸öÖÐÐĶÔÏóÀ´Íê³ÉÎĵµ·ÖÇø£ºÒ»¸öʵÏÖ IDocumentPartitioner£¬ÁíÒ»¸öʵÏÖ IPartitionTokenScanner¡£·ÖÇøÆ÷½«Îı¾Ìá½»¸øÉ¨ÃèÆ÷½øÐзÖÎö£¬È»ºóÉú³É
IToken¡£·ÖÇøÆ÷ʹÓÃÕâЩ±ê¼Ç£¨token£©ÔÚÎĵµµÄÄÚ²¿ÉèÖà Position¡£
ÎÒÃÇÏ£Íû OctaveEditor Äܹ»ÔÚÓû§´ò¿ª *.m ʱ×Ô¶¯³õʼ»¯·ÖÇøÆ÷ºÍɨÃèÆ÷¡£Îª´Ë£¬±ØÐëʹÓÃ
org.eclipse.core.filebuffers.documentSetup À©Õ¹µãµÄÒ»¸öÀ©Õ¹ÔÚ
plugin.xml ÖÐÏÔʽµØ¶¨ÒåÎĵµµÄÅäÖá£Õâ¸öÀ©Õ¹ÔÚÎĵµ³õʼ»¯ÆÚ¼äʶ±ðÓÃÓÚÅäÖÃÎĵµµÄÀà¡£Çåµ¥ 3 ¸ø³öÁËΪ
Octave IDE ²å¼þ¶¨ÒåµÄÀ©Õ¹¡£
Çåµ¥ 3. ÅäÖÃÎĵµ
<extension point="org.eclipse.core.filebuffers.documentSetup"> id="org.dworks.octaveide.editor.OctaveDocumentSetup" name="%documentSetupName" <participant extensions="m" class="org.dworks.octaveide.editor.OctaveDocumentSetup"> </participant> </extension> |
OctaveDocumentSetup µ÷Óà DLTK ScriptTextTools ¶ÔÏó³õʼ»¯ *.m
Îĵµ¡£Ä¬ÈÏÇé¿öÏ£¬Õ⽫´´½¨Ò»¸öÓÃ×÷Îĵµ·ÖÇøÆ÷µÄ FastPartitioner¡£
ÿ¸ö DLTK ±à¼Æ÷¶¼±ØÐë´´½¨×Ô¼ºµÄ IPartitionTokenScanner ¶ÔÏóÀ´¶ÁÈ¡×Ö·ûºÍÉú³ÉÓë·ÖÇø¶ÔÓ¦µÄ±ê¼Ç¡£ÀýÈ磬Èç¹ûÏëҪΪÒÔ
¡®/*¡¯ ¿ªÊ¼²¢ÒÔ ¡®*/¡¯ ½áÊøµÄÎı¾´´½¨Ò»¸ö·ÖÇø£¬ÔòÒªÅäÖÃɨÃèÆ÷£¬ÈÃËüÔÚÓöµ½ÕâÖÖÐÎʽµÄÎı¾Ê±Éú³ÉÕýÈ·µÄ±ê¼Ç¡£Octave
²å¼þ½«Îı¾·ÖΪ 3 ¸öÇøÓò£º
×¢ÊÍ
ÓÉ OCTAVE_COMMENT ʶ±ð£¬ËüµÈЧÓÚ "__octave_comment__"
×Ö·û´®
ÓÉ OCTAVE_STRING ʶ±ð£¬ËüµÈЧÓÚ "__octave_string__"
ÆÕͨ½Å±¾´úÂë
ÓÉ IDocument.DEFAULT_CONTENT_TYPE ʶ±ð£¬ËüµÈЧÓÚ "__dftl_partition_content_type"
ÕâЩ·ÖÇøÊÇÔÚ IOctavePartititons ½Ó¿ÚÖж¨ÒåµÄ¡£ÕâЩ·ÖÇøÓÃÓÚ³õʼ»¯ FastPartitioner£¬ºóÕß½«·ÖÇø·¢Ë͸ø·ÖÇøÉ¨ÃèÆ÷¡£
¿ÉÒÔʹÓÃÒ»×éÂß¼¹æÔòʶ±ð Octave ±à¼Æ÷ÖеķÖÇø£¬Òò´Ë OctavePartitionScanner
½«À©Õ¹ RuleBasedPartitionScanner Àà¡£Õâ¸öÀàÖÐ×îÖØÒªµÄ·½·¨ÊÇ setPartitionRules£¬Ëü½ÓÊÜÒ»¸ö
IPredicateRule ¶ÔÏóÊý×é¡£¹æÔòµÄÄ¿±êÊǽ«Îı¾µÄ¸÷¸ö²¿·Öת»»³É IToken¡£´ÓÍ·±àд¹æÔòÊǺÜÀ§Äѵģ¬ÇìÐÒµÄÊÇ
Eclipse ÌṩÁË IPredicateRule ½Ó¿ÚµÄÐí¶àÓÐÓÃʵÏÖ¡£Octave IDE ʹÓÃÆäÖÐÁ½¸öÀ´Ê¶±ð·ÖÇø£ºSingleLineRule
ºÍ MultiLineRule¡£ÕâÁ½¸öÀà¾ßÓÐÀàËÆµÄ¹¹ÔìÆ÷£¬ËüÃÇÓÉÒÔÏÂÐÅÏ¢£¨ÖÁÉÙ£©³õʼ»¯£º
1.¿ªÊ¼·ÖÇøµÄ×Ö·û
2.½áÊø·ÖÇøµÄ×Ö·û
3.¶ÔÓ¦ÓÚ±»Ê¶±ð·ÖÇøµÄ IToken
ÀýÈ磬¼ÙÉèÄúÏ£Íû´´½¨ÕâÑùÒ»¸ö¹æÔò£¬ËüÔÚ·¢ÏÖÒÔµ¥ÒýºÅ£¨'£©¿ªÊ¼ºÍ½áÊøµÄÎı¾Ê±Éú³ÉÒ»¸ö×Ö·û´®±ê¼Ç¡£Õâ¿ÉÒÔʹÓÃÒÔÏ´úÂëʵÏÖ£º
IToken stringToken = new Token(OctavePartitions.OCTAVE_STRING); new SingleLineRule("'", "'", stringToken, '\\'); |
Çåµ¥ 4 ¸ø³öÁË OctavePartitionScanner ÓÃÓÚÔÚ Octave ½Å±¾Öмì²â·ÖÇøµÄÍêÕû´úÂë¡£ÔÚÓöµ½Ç°ÃæÓÐÒ»¸ö°Ù·ÖºÅ£¨%£©²¢ÇÒºóÃæ¸ú×ÅÒ»¸öÐÂÐеÄÎı¾Ê±£¬Octave
±à¼Æ÷½«´´½¨×¢ÊÍ·ÖÇø¡£×Ö·û´®·ÖÇøÓɵ¥ÒýºÅÈ·¶¨½çÏÞ¡£
Çåµ¥ 4. Octave IDE ·ÖÇøÉ¨ÃèÆ÷
// Declare the different tokens IToken string = new Token(IOctavePartitions.OCTAVE_STRING); IToken comment = new Token(IOctavePartitions.OCTAVE_COMMENT);
// Create the list of rules that produce tokens
List<IPredicateRule> rules = new ArrayList<IPredicateRule>();
rules.add(new SingleLineRule("%", "\n",
comment));
rules.add(new SingleLineRule("'", "'",
string));
IPredicateRule[] result = new IPredicateRule[rules.size()];
rules.toArray(result);
setPredicateRules(result); |
´´½¨ OctavePartitionScanner ²¢ÇÒ³õʼ»¯Æä¹æÔòÖ®ºó£¬±à¼Æ÷·ÖÇøµÄÅäÖþÍÍê³ÉÁË¡£ÏÂÒ»²½¾ÍÊǸæËß±à¼Æ÷ÈçºÎÔÚ·ÖÇøÄÚ²¿É¨ÃèÎı¾²¢ÎªÆäÌí¼ÓÑÕÉ«¡£
ÔÚ·ÖÇøÄÚ²¿É¨ÃèÎı¾
ÈçǰËùÊö£¬DLTK ±à¼Æ÷ÒÀ¿¿ ScriptSourceViewer ÏìÓ¦Óû§Ê¼þ£¬±ÈÈç»÷¼ü¡£¿ÉÒÔͨ¹ý
ScriptSourceViewerConfiguration ¶ÔÏóÀ´µ÷Õû²é¿´Æ÷µÄ²Ù×÷¡£Ïñ ScriptTextTools
ÀàÒ»Ñù£¬ÅäÖöÔÏó½öÐèÍê³ÉÉÙÁ¿¹¤×÷¡£Ïà·´£¬ËüµÄ·½·¨Ê¶±ðÐÖúÔ´´úÂë²é¿´Æ÷²Ù×÷µÄÀà¡£¶ÔÓÚÓï·¨×ÅÉ«£¬ÕâЩ ¡°°ïÖú¡±
·½·¨ÖÐ×îÖØÒªµÄÁ½¸öÊÇ£º
getPresentationReconciler()
·µ»ØÔÚ·¢Éú±ä¸üʱ¿ØÖÆÎı¾ÈçºÎÏÔʾµÄ IPresentationReconciler
initializeScanners()
·µ»ØÒ»×é AbstractScriptScanner£¬ËüÃÇÏñ RuleBasedPartitionScanner
ÔÚÇ°ÃæÃèÊöµÄÄÇÑùÖ´ÐÐͬһÀàÐ͵ÄÎı¾É¨Ãè
ÕâÁ½¸ö·½·¨ÊǽôÃÜÏà¹ØµÄ¡£ÏÂÃæµÄÌÖÂÛ½âÊÍ Octave IDE ÈçºÎʵÏÖËüÃÇ£¬ÒÔÌṩÎı¾ÑÕÉ«¡£
IPresentationReconciler
¸ù¾Ý Eclipse µÄ˵·¨£¬µ÷½âÆ÷ ÊÇÒ»¸ö¸ú×ÙÎĵµÄÚÈݲ¢¶Ô¸ü¸Ä×÷³öÏìÓ¦µÄ¶ÔÏó¡£ÏÔʾµ÷½âÆ÷ ÊÇͨ¹ý¸Ä±äÎĵµµÄÏÔʾ·½Ê½À´ÏìÓ¦Îĵµ¸ü¸ÄµÄµ÷½âÆ÷¡£ÌرðÐèҪעÒâµÄÊÇ£¬IPresentationReconciler
ͨ¹ýµ÷ÓÃÁ½¸ö¶ÔÏóÀ´ÏìÓ¦¸ü¸Ä£º
IPresentationDamager
¾ö¶¨ÎĵµÐ޸ĵķ¶Î§
IPresentationRepairer
´´½¨Ò»¸ö TextPresentation ¶ÔÏóÀ´ÏìÓ¦ÓÉ IPresentationDamager ʶ±ðµ½µÄ¸ü¸Ä
ÕâÁ½¸ö¶ÔÏó°´Ë³Ðò²Ù×÷¡£µ±Óû§ÔÚÒ»¸ö·ÖÇøÖÐÐÞ¸ÄÎı¾Ê±£¬IPresentationReconciler »á¸ø
IPresentationDamager Ò»¸ö·ÖÇøÃû¡£ÔÚÏú»ÙÆ÷ʶ±ðµ½Ð޸ĺóµÄÇøÓòÖ®ºó£¬IPresentationRepairer
½«·ÖÎöÕâ¸öÇøÓò£¬¿´¿´ÇøÓòÖÐÎı¾ÏÔʾµÄÄÄЩµØ·½ÐèÒª¸üУ¬ÒÔ¼°ÈçºÎ¸üС£
Ϊ¼òµ¥Æð¼û£¬Eclipse Ìṩһ¸ö DefaultDamagerRepairer ×÷ΪÏú»ÙÆ÷ºÍÐÞ¸´Æ÷¡£Octave
IDE ΪÕâÈý¸ö·ÖÇøµÄÿ¸ö·ÖÇø¹¹ÔìÒ»¸ö DefaultDamagerRepairer£¬²¢Ê¹Óò»Í¬µÄɨÃèÆ÷³õʼ»¯ËüÃÇ¡£Çåµ¥
5 ÏÔʾÁËÕâ¸öµ÷½âÆ÷¡£
Çåµ¥ 5. ÅäÖÃÏÔʾµ÷½âÆ÷
// Create a DefaultDamagerRepairer for the default partition (code) DefaultDamagerRepairer dr = new DefaultDamagerRepairer(codeScanner); reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE); reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);
// Create a DefaultDamagerRepairer for string
partitions
dr = new DefaultDamagerRepairer(stringScanner);
reconciler.setDamager(dr, OctavePartitions.OCTAVE_STRING);
reconciler.setRepairer(dr, OctavePartitions.OCTAVE_STRING);
// Create a DefaultDamagerRepairer for comment
partitions
dr = new DefaultDamagerRepairer(commentScanner);
reconciler.setDamager(dr, OctavePartitions.OCTAVE_COMMENT);
reconciler.setRepairer(dr, OctavePartitions.OCTAVE_COMMENT); |
¾ÍÏñ·ÖÇøÉ¨ÃèÆ÷ʹÓùæÔòʶ±ð·ÖÇøÒ»Ñù£¬ËùÓÐÕâЩɨÃèÆ÷¶¼¸ù¾ÝÀàËÆµÄ¹æÔò´´½¨±ê¼Ç¡£ÏÂһС½ÚÏêϸÌÖÂÛÎı¾É¨ÃèÆ÷¡£
ÔÚ·ÖÇøÄÚɨÃèÎı¾
ScriptSourceViewerConfiguration µÄ¹¹ÔìÆ÷µ÷Óà initializeScanners()
´´½¨·ÖÎöÎı¾ËùÐèµÄɨÃèÆ÷¡£Çåµ¥ 6 ÏÔʾ OctaveSourceViewerConfiguration
ÀàÖÐ initializeScanners() µÄÍêÕûʵÏÖ¡£
Çåµ¥ 6. ´´½¨½Å±¾É¨ÃèÆ÷
private AbstractScriptScanner codeScanner, stringScanner, commentScanner;
protected void initializeScanners() {
// Create a scanner for the script code
codeScanner = new OctaveCodeScanner(getColorManager(),
fPreferenceStore);
// Create a scanner for string partitions
stringScanner = new SingleTokenScriptScanner(getColorManager(),
fPreferenceStore, IOctavePartitions.OCTAVE_STRING);
// Create a scanner for comment partitions
commentScanner = new SingleTokenScriptScanner(getColorManager(),
fPreferenceStore, IOctavePartitions.OCTAVE_COMMENT);
} |
ÓÉÓÚ·ÖÇøÉ¨ÃèÆ÷ÒѾʶ±ð×Ö·û´®ºÍ×¢ÊÍ£¬Òò´Ë²»ÐèÒªÖØÐ·ÖÎöÕâЩ·ÖÇø¡£ËùÒÔ stringScanner ºÍ
commentScanner ¶¼ÊÇ SingleTokenScriptScanner¡£Õâ¸öÀಢ²»¸ù¾Ý¹æÔò×ö³ö¾ö¶¨£¬µ«Í¨³£·µ»ØÏàͬÀàÐ͵Ä
IToken¡£ÀýÈ磬stringScanner ·µ»ØÒ»¸öÓà OctavePartitions.OCTAVE_STRING
³õʼ»¯µÄ±ê¼Ç£¬ÒÔ¼° commentScanner ·µ»ØÒ»¸öÓà OctavePartitions.OCTAVE_COMMENT
³õʼ»¯µÄ±ê¼Ç¡£ÉÔºóÄú½«¿´µ½ÕâЩ±ê¼ÇÊôÐÔÈçºÎ¾ö¶¨Îı¾µÄÑÕÉ«¡£
codeScanner ÓõÃ×î¶à£¬²¢ÇÒÊÇ IDE Îı¾·ÖÎöµÄÖ÷Á¦¡£Õâ¸öɨÃèÆ÷ÊÇÒ»¸ö OctaveCodeScanner£¬ËüÏñ
PartitionTokenScanner Ò»Ñù¸ù¾Ý¹æÔò´´½¨±ê¼Ç¡£Ëü²¢²»»ùÓÚ MultiLineRule
»ò SingleLineRule£¬¶øÊÇ»ùÓÚÁ½¸ö IRule ʵÏÖ£º
WordRule
µ±É¨ÃèÆ÷Óöµ½Ìض¨µÄµ¥´Êʱ·µ»ØÒ»¸ö±ê¼Ç
NumberRule
µ±É¨ÃèÆ÷Óöµ½Êý×Öʱ·µ»ØÒ»¸ö±ê¼Ç
ÕâЩ¹æÔòÔÚ OctaveCodeScanner µÄ createRules ·½·¨Öд´½¨¡£Çåµ¥ 7 ÍêÕûµØÏÔʾÁËÕâ¸ö·½·¨¡£
Çåµ¥ 7. ´´½¨½Å±¾É¨ÃèÆ÷
protected List<IRule> createRules() {
// Create tokens
IToken keywordToken = getToken(DLTKColorConstants.DLTK_KEYWORD);
IToken numberToken = getToken(DLTKColorConstants.DLTK_NUMBER);
IToken defaultToken = getToken(DLTKColorConstants.DLTK_DEFAULT);
// Create and populate list
List<IRule> ruleList = new ArrayList<IRule>();
// Create word rule to detect keywords
WordRule wordRule = new WordRule(new OctaveWordDetector(),
defaultToken);
for (int i = 0; i < IOctaveKeywords.keywords.length;
i++)
wordRule.addWord(IOctaveKeywords.keywords[i],
keywordToken);
ruleList.add(wordRule);
// Create number rule to detect numbers
NumberRule numberRule = new NumberRule(numberToken);
ruleList.add(numberRule);
// Set the token returned for default text
setDefaultReturnToken(defaultToken);
return ruleList;
} |
±ØÐ뽫ÔÚÇåµ¥ 7 Öд´½¨µÄ±ê¼ÇÓëÇåµ¥ 4 Öеıê¼ÇÇø·Ö¿ªÀ´¡£Token ¹¹ÔìÆ÷¿ÉÒÔÒÔÈκΠObject
Ϊ²ÎÊý£¬²¢ÇÒÕâ¸ö Object ¸æËß±ê¼Ç½ÓÊÕÕßÓ¦¸Ã²ÉȡʲôÐж¯¡£ÔÚÇåµ¥ 4 ÖУ¬Ê¹ÓøæËß FastPartitioner
ÈçºÎ¸üÐÂÎĵµ·ÖÇøµÄ·ÖÇøÃû³õʼ»¯ Token¡£ÔÚÇåµ¥ 7 ÖУ¬Ê¹ÓøæËß IDE ÈçºÎÔÚ±à¼Æ÷ÖÐÏÔʾÎı¾µÄ
TextPresentation ¶ÔÏó³õʼ»¯ Token¡£
Çåµ¥ 7 ͨ¹ýµ÷Óà getToken ½«Ã¿¸ö Token ÓëÒ»¸ö TextPresentation
¹ØÁªÆðÀ´¡£Õâ¸ö·½·¨ËÑË÷ÓÉÓû§Ê×Ñ¡ÏîÌî³äµÄ Map¡£ÒªÀí½âÕâ¸öÓ³ÉäÊÇÈçºÎ¸üÐµģ¬±ØÐëÏÈÀí½â DLTK Ê×Ñ¡ÏîÊÇÈçºÎ¹¤×÷µÄ¡£Õâ¾ÍÊǽÓÏÂÀ´µÄÌÖÂÛÖ÷Ìâ¡£
ÅäÖà DLTK Ê×Ñ¡Ïî
Ç°ÃæµÄÌÖÂÛÏÔʾÁËÓû§Ê×Ñ¡ÏîÈçºÎ¾ö¶¨Îı¾ÏÔʾ¡£ÏÖÔÚÎÒÃǸü½øÒ»²½£¬ÑÝʾÈçºÎ´´½¨½ÓÊÕÓû§Ê×Ñ¡ÏîµÄÒ³Ãæ¡£Äú¿ÉÒÔͨ¹ýµ¥»÷
Eclipse ÖÐµÄ Window > Preferences À´·ÃÎÊÕâЩÊ×Ñ¡Ïî¡£ÔÚÌÖÂÛµÄ×îºó£¬ÎÒ½«½âÊÍÓû§Ê×Ñ¡ÏîÈçºÎ½«½Å±¾½âÊÍÆ÷¼¯³Éµ½
IDE ÖС£
Ê×Ñ¡Ïî´æ´¢
Eclipse µÄÊ×Ñ¡Ïî´æ´¢ ¾ÍÏñÒ»¸öÊôÐÔÎļþ£ºËü°üº¬ÓÃÓÚʶ±ðÓû§Ê×Ñ¡ÏîÉèÖõÄÃû³Æ-Öµ¶Ô¡£µ«ËüÃÇÖ®¼äÓÐÁ½´¦ÖØÒªÇø±ð¡£³ýÁ˵±Ç°ÖµÖ®Í⣬ÿ¸öÊ×Ñ¡Ïî¶¼°üº¬Ò»¸öĬÈÏÖµ£¬²¢ÇÒÊ×Ñ¡ÏîÖµ±ØÐëÊÇÒÔÏÂ
6 Öлù±¾ÀàÐÍÖ®Ò»£º
Boolean
int
long
float
double
String
ͨ¹ýµ÷ÓÃÓÉ IPreferenceStore ½Ó¿Ú¶¨ÒåµÄ·½·¨À´´æ´¢ºÍ»ñÈ¡Ê×Ñ¡Ïî¡£setValue ºÍ
setDefaultValue ·½·¨Ìí¼Ó²¢¸üÐÂÊ×Ñ¡Ïî¡£Òª»ñÈ¡Ê×Ñ¡ÏîµÄÖµ£¬¿ÉÒÔµ÷Óà getBoolean¡¢getInt¡¢getLong¡¢getFloat¡¢getDouble
»ò getString Ö®Ò»¡£ÓÐһЩÀàËÆµÄ·½·¨¿ÉÒÔ·ÃÎÊĬÈÏÖµ£¬±ÈÈç getDefaultDouble¡£
Òª·ÃÎÊÓë SWT ¶ÔÏóÓйصÄÊ×Ñ¡ÏÓÈÆäÊÇ RGB¡¢Rectangle¡¢FontData ºÍ FontData[]
¶ÔÏ󣩣¬¿ÉÒÔµ÷Óà PreferenceConverter ÀàÖеķ½·¨¡£
ÔÚ³õʼ»¯ÆÚ¼ä£¬DLTK ScriptEditor ´´½¨ÁËÒ»¸ö°üº¬ 4 ¸ö IPreferenceStore
¶ÔÏóµÄ ArrayList£º
ScopedPreferenceStore£¬ÊÇΪ Octave ²å¼þ£¨org.dworks.octaveide£©´´½¨µÄ
ScopedPreferenceStore£¬ÊÇΪ Eclipse Îı¾±à¼Æ÷²å¼þ£¨org.eclipse.ui.editors.text£©´´½¨µÄ
Ò»¸öÌṩÓëÏîÄ¿ÓйصÄÊ×Ñ¡ÏîµÄ EclipsePreferencesAdapter£¬°üº¬ÐèÒª±à¼µÄ½Å±¾
Ò»¸ö PreferencesAdapter£¬°üº¬Óë DLTK ºËÐÄÏà¹ØÁªµÄÊ×Ñ¡Ïî
ÕâЩ´æ´¢±»ºÏ²¢³ÉÒ»¸ö ChainedPreferenceStore¡£Èç¹ûÁ½¸ö»òÁ½¸öÒÔÉϵÄÊ×Ñ¡Ïî´æ´¢°üº¬ÏàͬµÄÊ×Ñ¡ÏÔòÓÉÏÈÌí¼ÓµÄ´æ´¢Ìṩֵ¡£
³õʼ»¯Ê×Ñ¡Ïî
Eclipse ÔÊÐí³õʼ»¯ÆÚ¼äʹÓÃÀ©Õ¹µã org.eclipse.core.runtime.preferences
ÉèÖÃÊ×Ñ¡Ïî¡£Octave IDE À©Õ¹Õâ¸öµã²¢½« OctavePreferenceInitializer
Àà±êʶΪΪ IDE Ê×Ñ¡ÏîÌṩĬÈÏÖµ¡£·´¹ýÀ´£¬OctavePreferenceInitializer ÀàÓÖÀ©Õ¹³éÏóÀà
AbstractPreferenceInitializer£¬ºóÕßΩһҪÇóµÄ·½·¨ÊÇ initializeDefaultPreferences¡£IDE
ÔÚ³õʼ»¯ÆÚ¼äµ÷ÓÃÕâ¸ö·½·¨¡£Çåµ¥ 8 ÏÔʾÁËÈçºÎͨ¹ý´úÂëʵÏÖËü¡£
Çåµ¥ 8. ³õʼ»¯Ä¬ÈÏÊ×Ñ¡Ïî
public void initializeDefaultPreferences() { IPreferenceStore store = OctavePlugin.getDefault().getPreferenceStore(); OctavePreferenceConstants.initializeDefaultValues(store); } |
Õâ¸ö¼òµ¥µÄÀý³Ì·ÃÎÊ Octave ²å¼þµÄÊ×Ñ¡Ïî´æ´¢£¬²¢µ÷Óà OctavePreferenceConstants
ÀàÀ´³õʼ»¯´æ´¢µÄÖµ¡£ËüÊÇ DLTK µÄ PreferenceConstants ÀàµÄ×ÓÀ࣬PreferenceConstants
ÀàÄܹ»¶¨Òå²¢³õʼ»¯¸÷ÖÖ³£¼ûµÄ½Å±¾Ê×Ñ¡Ïî¡£ÔÚ±¾½Ì³ÌÖУ¬½ö³õʼ»¯ÓÃÓÚ´¦ÀíÓï·¨ÑÕÉ«µÄÊ×Ñ¡Ïî¡£Çåµ¥ 9 չʾÈçºÎʵÏÖ³õʼ»¯¡£
Çåµ¥ 9. ÉèÖÃÓï·¨ÑÕÉ«Ê×Ñ¡Ïî
public static void initializeDefaultValues(IPreferenceStore store) {
// Set default preferences for the editor
PreferenceConstants.initializeDefaultValues(store);
// Make keywords blue and bold
PreferenceConverter.setDefault(store, DLTKColorConstants.DLTK_KEYWORD,
new RGB(40, 0, 200));
store.setDefault(DLTKColorConstants.DLTK_KEYWORD
+
PreferenceConstants.EDITOR_BOLD_SUFFIX, true);
// Set default values for other preferences
PreferenceConverter.setDefault(store,
DLTKColorConstants.DLTK_SINGLE_LINE_COMMENT, new
RGB(25, 200, 25));
PreferenceConverter.setDefault(store, DLTKColorConstants.DLTK_NUMBER,
new RGB(255, 25, 25));
PreferenceConverter.setDefault(store, DLTKColorConstants.DLTK_STRING,
new RGB(50, 100, 100));
} |
Octave Ê×Ñ¡ÏîµÄµÚÒ»¸öÑ¡ÏîÓÃÓÚ´¦Àí¹Ø¼ü×Ö¡£ËüµÄ´úÂëͨ¹ýÁ½¸ö²½ÖèÔÚ IDE ÖÐÅäÖùؼü×ÖµÄÑÕÉ«ºÍÑùʽ£¨bold/italics/strikethrough£©¡£Ê×ÏÈ£¬µ÷ÓÃ
PreferenceConverter ½« DLTKColorConstants.DLTK_KEYWORD
ÓëÀ¶É«¹ØÁªÆðÀ´¡£Æä´Î£¬µ÷Óà store.setDefault ·½·¨½« DLTKColorConstants.DLTK_KEYWORD
+ PreferenceConstants.EDITOR_BOLD_SUFFIX ºÍ true ¹ØÁªÆðÀ´¡£ÕâÁ½ÐдúÂëÈ·±£ÔÚʹÓÃ
DLTKColorConstants.DLTK_KEYWORD ³õʼ»¯ÈκΠToken ʱ£¬ÏàÓ¦µÄÎı¾¾ÍÏÔʾΪ´ÖÌåÀ¶É«¡£
Preference pages ºÍ configuration blocks
ÏÖÔÚÄúÒѾ֪µÀÈçºÎ³õʼ»¯Ê×Ñ¡ÏÄÇôҲӦ¸ÃΪÓû§ÌṩÅäÖÃÊ×Ñ¡ÏîµÄ»ú»á¡£Eclipse ͨ¹ý preference
pages À´ÊµÏÖÕâ¸ö¹¦ÄÜ¡£DLTK ʹÓóÆÎª configuration blocks µÄ¶ÔÏó¼ò»¯ÁËÕâÐ©Ò³ÃæµÄÅäÖùý³Ì¡£Õâ¸öС½Ú½«ÃèÊöÕâÁ½¸öÀ࣬ÒÔ¼°ËüÃÇÈçºÎÐ×÷ÒÔÔÚ
Octave IDE ÖÐÌṩÓû§Ê×Ñ¡Ïî¡£
Eclipse preference pages
µ¥»÷ Eclipse ÖÐµÄ Window > Preferences ʱ£¬Preferences
´°¿ÚµÄ×ó±ßÃæ°å½«ÒÔ²ã´Î½á¹¹µÄ·½Ê½ÏÔʾÓû§¿ÉÅäÖõÄÑ¡Ïî¡£¶ÔÓÚ Octave IDE£¬ÄúÐèҪʹÓÃÒ»¸ö³ÆÎª Octave
²¢´øÓÐ×ÓÊ×Ñ¡ÏîµÄ¶¥¼¶Ê×Ñ¡ÏÓÃÓÚ´¦ÀíÓï·¨ÑÕÉ«ºÍ Octave ½âÊÍÆ÷¡£Í¼ 4 ÏÔʾÁËÕâ¸ö´°¿Ú¡£

ͼ 4. Octave Ê×Ñ¡Ïî´°¿Ú
ÔÚ Octave ÏîÄ¿ÖУ¬plugin.xml ͨ¹ýÀ©Õ¹ org.eclipse.ui.preferencePages
¶¨Òå 3 ¸öÊ×Ñ¡ÏîÖ÷Ì⡣ÿ¸öÀ©Õ¹¶¼ÐèÒª¾ßÓÐ id¡¢name ºÍ class ÊôÐÔ¡£Á½¸ö×ÓÊ×Ñ¡Ïî¾ßÓÐÒ»¸ö¶îÍâÊôÐÔ
category£¬ËüÃüÃû¸¸Ê×Ñ¡ÏîµÄ id¡£Çåµ¥ 10 ¸ø³öÁËÕâЩÀ©Õ¹¡£
Çåµ¥ 10. Octave Ê×Ñ¡ÏîÀ©Õ¹
<extension point="org.eclipse.ui.preferencePages"> <page class="org.dworks.octaveide.preferences.OctaveMainPreferencePage" id="org.dworks.octaveide.preferences.OctaveMainPreferencePage" name="%MainPreferencePage.name"/> <page category="org.dworks.octaveide.preferences.OctaveMainPreferencePage" class="org.dworks.octaveide.preferences.OctaveSyntaxColorPage" id="org.dworks.octaveide.preferences.OctaveSyntaxColorPage" name="%SyntaxColorPreferencePage.name"/> <page category="org.dworks.octaveide.preferences.OctaveMainPreferencePage" class="org.dworks.octaveide.preferences.OctaveInterpreterPreferencePage" id="org.dworks.octaveide.preferences.OctaveInterpreterPreferencePage" name="%InterpreterPreferencePage.name"/> </extension> |
class ÊôÐÔÃüÃûÒ»¸öʵÏÖ IWorkbenchPreferencePage£¨IPreferencePage
µÄ×Ó½Ó¿Ú£©µÄÀà¡£DLTK ÌṩËü×Ô¼ºµÄ IWorkbenchPreferencePage ʵÏÖ£¬³ÆÎª AbstractConfigurationBlockPreferencePage¡£DLTK
»¹Ìṩ¼¸¸öÓÐÆäËûÓÃ;µÄ×ÓÀࡣͼ 5 ÃèÊöÁËÕâЩÀà½Ó¿ÚµÄ¹ØÏµ¡£

ͼ 5. Preference page
ÀàµÄ²ã´Î½á¹¹
Çåµ¥ 10 ÖÐµÄ 3 ¸öÀà¶¼ÊÇ AbstractConfigurationBlockPreferencePage
µÄÖ±½Ó×ÓÀà¡£²é¿´ËüÃÇµÄ Java Îļþʱ£¬¿ÉÒÔ¿´µ½ËüÃǰüº¬µÄ´úÂëºÜÉÙ¡£Ã¿¸öÀàÌṩһ¸ö ID¡¢Ò»¸ö±êÇ©£¬ÒÔ¼°µ½²å¼þµÄÊ×Ñ¡Ïî´æ´¢µÄ·ÃÎÊ¡£´ËÍ⣬ÿ¸ö
AbstractConfigurationBlockPreferencePage ±ØÐëʵÏÖ·½·¨ createConfigurationBlock()£¬¸Ã·½·¨¹¹ÔìÌá¹©Ò³ÃæÍ¼ÐÎÔªËØµÄ¶ÔÏó¡£Õâ¸ö¶ÔÏó±ØÐëʵÏÖ
DLTK ½Ó¿Ú IPreferenceConfigurationBlock¡£ÏÂһС½Ú½«ÌÖÂÛÕâ¸öÖØÒªµÄ½Ó¿Ú¡£
DLTK configuration blocks
¶Ô³ÊÏÖ IDE Ê×Ñ¡Ïî¶øÑÔ£¬×îÄѵIJ¿·Ö¾ÍÊǹ¹½¨ UI¡£ÀýÈ磬Octave Óï·¨×ÅÉ«Ê×Ñ¡ÏîÒ³Ãæ²»½öÔÊÐíÓû§Ñ¡ÔñÑÕÉ«ºÍÑùʽ£¬²¢ÇÒ»¹Ìṩһ¸öÓÃÓÚÏÔʾʵ¼ÊЧ¹ûµÄǶÈëʽÎı¾±à¼Æ÷¡£´ÓÍ·¹¹½¨ÕâЩͼÐοؼþ·Ç³£ºÄ·Ñʱ¼ä£¬²»¹ý
DLTK µÄ IPreferenceConfigurationBlock Äܹ»°ïÉÏ´óæ¡£Í¼ 6 ÏÔʾÁË
configuration block ÀàµÄ²ã´Î½á¹¹¡£

ͼ 6. Configuration block
ÀàµÄ²ã´Î½á¹¹
Óï·¨×ÅÉ« configuration block Àà
Ïà¹ØµÄµÚÒ»¸öÀàÊÇ AbstractScriptEditorColoringConfigurationBlock£¬ËüΪÓû§ÌṩÓï·¨×ÅÉ«Ê×Ñ¡Ïî¡£ÓÉ
createSyntaxPage ·½·¨Íê³ÉÖ÷Òª¹¤×÷£¬¼´´´½¨Í¼ÐÎÊ×Ñ¡ÏîÒ³Ãæ¡£¾ßÌåÀ´½²£¬Ëü¹¹ÔìÁËÒ»¸ö TreeViewer£¬ÒÔÏÔʾÓï·¨ÀàÐͺÍÒ»×éÓÃÓÚ±íʾÑÕÉ«ºÍÑùʽÊ×Ñ¡ÏîµÄ°´Å¥¡£È»ºó£¬Ëüµ÷ÓÃ
createPreviewer ¹¹½¨Ç¶ÈëʽÎı¾±à¼Æ÷¡£
Octave ²å¼þ´úÂë°üº¬ AbstractScriptEditorColoringConfigurationBlock
µÄÒ»¸ö×ÓÀ࣬³ÆÎª OctaveSyntaxColorConfigurationBlock¡£³ýÁ˹¹ÔìÆ÷Ö®Í⣬»¹ÊµÏÖÁË
4 ¸ö·½·¨£º
createPreviewViewer
·µ»ØÒ»¸ö°üΧǶÈëʽÎı¾±à¼Æ÷µÄ²é¿´Æ÷
createSimpleSourceViewerConfiguration
·µ»ØÒ»¸öÔÚǶÈëʽÎı¾±à¼Æ÷ÖÐÅäÖò鿴Æ÷µÄ»ù±¾¶ÔÏó
setDocumentPartitioning
µ÷Óà IDocumentSetupParticipant À´ÉèÖÃÎĵµµÄ·ÖÇø
getSyntaxColorListModel
·µ»ØÒ»¸ö 2-D Êý×飬Ëüʶ±ð¿ÉÒÔÌí¼ÓÑÕÉ«µÄ²»Í¬Óï·¨ÀàÐÍ£¬ÒÔ¼°Ê×Ñ¡Ïî´æ´¢ÖеĶÔÓ¦¼ü
ǰ 3 ¸ö·½·¨ºÜºÃÀí½â£¬ÒòΪǶÈëʽÎı¾±à¼Æ÷²»ÐèÒª¸´ÔӵIJ鿴Æ÷¡¢²é¿´Æ÷ÅäÖöÔÏó»òÎĵµÉèÖòÎÓëÕß¡£È»¶ø×îºóÒ»¸ö·½·¨
getSyntaxColorListModel ÐèÒª½âÊÍһϡ£Õâ¸ö·½·¨Ìṩһ¸ö 2-D Êý×飬ËüµÄÔªËØ¶ÔÓ¦ÓÚÒ³ÃæµÄ
TreeViewer ÖеÄÓï·¨ÀàÐÍ¡£Ã¿¸öÔªËØÐèÒª¾ßÓÐ 3 ¸öÐÅÏ¢£ºÃû³Æ¡¢Àà±ðºÍÒ³ÃæÊ×Ñ¡Ïî´æ´¢ÖеĶÔÓ¦¼ü¡£
»Ø¹ýÍ·À´¿´¿´Õâ¸öÀý×Ó£¬Í¼ 4 ±íÃ÷ Octave Óï·¨ÑÕɫģÐͰüº¬ 4 ¸öÓï·¨ÀàÐÍ£ºkeywords¡¢numbers¡¢strings
ºÍ single-line comments¡£Ç° 3 ¸öÓï·¨ÀàÐÍÊôÓÚ General ·¶Î§£¬¶ø×îºóÒ»¸öÓï·¨ÀàÐÍÊôÓÚ
Comment ·¶Î§¡£Çåµ¥ 11 ÖеĴúÂëÏÔʾÁËÈçºÎÔÚ OctaveSyntaxColorConfigurationBlock.getSyntaxColorListModel
ÖÐÅäÖÃÕâЩÀàÐÍ¡£
Çåµ¥ 11. ´´½¨Óï·¨ÑÕÉ«ÁбíÄ£ÐÍ
protected String[][] getSyntaxColorListModel() { return new String[][] { { "Single-Line Comments", DLTKColorConstants.DLTK_SINGLE_LINE_COMMENT, sCommentsCategory }, { "Keywords", DLTKColorConstants.DLTK_KEYWORD, sCoreCategory }, { "Strings", DLTKColorConstants.DLTK_STRING, sCoreCategory }, { "Numbers", DLTKColorConstants.DLTK_NUMBER, sCoreCategory }}; } |
µ±Óû§ÔÚÒ³ÃæÖиü¸ÄÊ×Ñ¡ÏîÉèÖò¢µ¥»÷ OK ʱ£¬Ò³Ã潫¸üÐÂÊ×Ñ¡Ïî´æ´¢ÖÐÏàÓ¦µÄÖµ¡£±à¼Æ÷ͨ¹ý¸üÐÂÎı¾µÄ±íʾÀ´ÏìÓ¦Ê×Ñ¡Ïî¸ü¸Ä¡£
½âÊÍÆ÷Ê×Ñ¡Ïî
ͼ 4 ÖеÄ×îºóÒ»¸öÊ×Ñ¡ÏîÑ¡ÏîÓÃÓÚÉèÖà IDE µÄ½Å±¾½âÊÍÆ÷¡£DLTK ÌṩÁ½¸öÀàÀ´ÊµÏÖÕâ¸ö¹¦ÄÜ£ºScriptInterpreterPreferencePage
ºÍ InterpretersBlock¡£InterpretersBlock ´´½¨Ò³ÃæµÄͼÐοؼþ£¬ÆäÖаüº¬Ò»¸öÌṩ˵Ã÷µÄ
Label£»Ò»¸öÁгöËùÓпÉÓýâÊÍÆ÷µÄ CheckboxTableViewer£»ÒÔ¼°Ò»×éÔÊÐíÓû§Ìí¼Ó¡¢±à¼¡¢¸´ÖÆ¡¢É¾³ýºÍËÑË÷½âÊÍÆ÷µÄ°´Å¥¡£Í¼
7 ÏÔʾÁËÕâ¸öÒ³Ãæ£¬ÒÔ¼°Óû§µ¥»÷ Add ʱ³öÏֵĴ°¿Ú¡£

ͼ 7. ½âÊÍÆ÷Ê×Ñ¡ÏîÒ³ÃæºÍ´°¿Ú
³éÏóÀà InterpretersBlock ÒªÇó×ÓÀàʵÏÖÁ½¸ö·½·¨£ºgetCurrentNature ºÍ
createInterpreterDialog¡£µÚÒ»¸ö·½·¨·µ»ØÒ»¸ö±íʾ½âÊÍÆ÷¡¢Ô´´úÂëÓïÑÔºÍÆäËûÏà¹Ø¶ÔÏóµÄ
String¡£Í¨³£ÔÚ DLTK À©Õ¹µãÖÐʹÓÃÕâÖÖÌØÕ÷£¬Ëü·Ç³£ÖØÒª¡£Èç¹ûÄúµÄ Eclipse Ϊ²»Í¬µÄ¶¯Ì¬ÓïÑÔ°üº¬¶à¸ö»ùÓÚ
DLTK µÄÌØÐÔ£¬¾ÍºÜÈÝÒ׸ù¾Ý¸÷×ÔµÄÌØÕ÷Çø·ÖËüÃÇ¡£
µÚ¶þ¸ö·½·¨ createInterpreterDialog ¹¹ÔìÒ»¸ö´°¿Ú£¬µ±Óû§ÔÚÊ×Ñ¡ÏîÒ³ÃæÉϵ¥»÷ Add
ʱµ¯³ö¡£Õâ¸ö´°¿Ú£¨¼ûͼ 7£©±ØÐëÖÁÉÙ°üº¬ 4 ¸öÐÅÏ¢Ö®Ò»£º¿ÉÖ´ÐнâÊÍÆ÷µÄλÖᢽâÊÍÆ÷µÄÃû³Æ¡¢½âÊÍÆ÷µÄÀàÐÍ£¬ÒÔ¼°½âÊÍÆ÷ÐèÒªÖ´ÐеĿâµÄλÖá£Òª¹¹ÔìÕâ¸ö´°¿Ú£¬createInterpreterDialog
·½·¨ÐèÒª DLTK Àà AddScriptInterpreterDialog µÄÒ»¸öʵÀý¡£
AddScriptInterpreterDialog ¹¹ÔìÆ÷½ÓÊÜÒ»¸ö½âÊÍÆ÷ÀàÐ͵ÄÊý×éºÍÒ»¸öʵÏÖ IInterpreterInstall
µÄ¶ÔÏó¡£¾ßÓжà¸ö½âÊÍÆ÷ÀàÐÍʹ IDE Äܹ»Ö§³ÖͬһÓïÑԵĶà¸ö½âÊÍÆ÷¡£Octave IDE ½öÖ§³ÖÒ»ÖÖ°²×°ÀàÐÍ£¬²¢ÇÒʹÓÃ
org.eclipse.dltk.launching.interpreterInstallTypes µÄÒ»¸öÀ©Õ¹ÔÚ
plugin.xml Öбêʶ¸ÃÀàÐÍ¡£ÕâЩÊ×Ñ¡ÏîÀ©Õ¹ÈçÇåµ¥ 12 Ëùʾ¡£
Çåµ¥ 12. Octave Ê×Ñ¡ÏîÀ©Õ¹
<extension point="org.eclipse.dltk.launching.interpreterInstallTypes"> <interpreterInstallType class="org.dworks.octaveide.launch.OctaveInterpreterInstallType" id="org.dworks.octaveide.launch.OctaveInterpreterInstallType"> </interpreterInstallType> </extension> |
class ÊôÐÔ±êʶһ¸öʵÏÖ IInterpreterInstallType µÄ¶ÔÏó¡£Ã¿¸ö°²×°ÀàÐͶ¼ÓÐÒ»¸öÃû³Æ¡¢ID
ºÍÌØÕ÷£¨Ò»¸öÓÃÓÚ±êʶ½âÊÍÆ÷ºÍÔ´ÀàÐ굀 String£©£¬ÒÔ¼°½âÊÍÆ÷ºÍËùÓбØÐè¿âµÄλÖá£ÁíÍ⣬ÿ¸ö IInterpreterInstallType
±ØÐë´´½¨Ò»¸öÒÔÉ쵀 IInterpreterInstall ¶ÔÏó¡£
¾¡¹Ü IInterpreterInstallType ¶ÔÏó¶¨ÒåÁ˽âÊÍÆ÷°²×°µÄÒ»¸öÀ࣬µ«»¹±ØÐëΪÿ¸öÌØ¶¨°²×°´´½¨Ò»¸ö
IInterpreterInstall ¶ÔÏó¡£Õâ¸ö¶ÔÏóÓÃ×÷½âÊÍÆ÷µÄÖ÷Êý¾Ý´æ´¢¶ÔÏó£¬Ëü°üº¬ÒÔÏÂÐÅÏ¢£º
1.Ãû³Æ
½âÊÍÆ÷°²×°µÄ±êÇ©
2.ID
½âÊÍÆ÷°²×°µÄÂß¼±êʶ·û
3.ÌØÕ÷
IDE µÄÂß¼±êʶ·û£¨½âÊÍÆ÷ºÍÔ´ÎļþµÈ£©
4.°²×°Î»ÖÃ
½âÊÍÆ÷°²×°µÄ·¾¶
5.¿âµÄλÖÃ
½âÊÍÆ÷ËùÐèµÄ¿âµÄ·¾¶
6.Ö´Ðл·¾³
»·¾³±äÁ¿ºÍ½ø³ÌÅäÖÃ
7.½âÊÍÆ÷²ÎÊý
Ö¸Ïò½âÊÍÆ÷µÄ²ÎÊý
×îºó£¬Ã¿¸ö IInterpreterInstall ±ØÐëÌṩ¶Ô IInterpreterRunner
¶ÔÏóµÄ·ÃÎÊ¡£Õâ¸ö¶ÔÏó¸ºÔðʵ¼ÊÆô¶¯½âÊÍÆ÷£¬ÏÂһС½Ú²»½öÌÖÂÛËüµÄ¹¤×÷·½Ê½£¬»¹ÌÖÂÛËüÈçºÎÈÚÈëµ½½âÊÍÆ÷-IDE
½»»¥ÖС£
DLTK ½âÊÍÆ÷ºÍ¿ØÖÆÌ¨
DLTK Ó¦ÓóÌÐòµÄ×îÖØÒªÌØÐÔ²»ÊÇÎı¾±à¼Æ÷»òÊ×Ñ¡Ï¶øÊÇʵÏÖͨ¹ýµ¥»÷°´Å¥Æô¶¯½âÊÍÆ÷ÒÔ¼°ÔÚ IDE ¿ØÖÆÌ¨Öв鿴ËüµÄÊä³ö¡£DLTK
½âÊÍÆ÷ºÍ¿ØÖÆÌ¨ÊǽôÃܹØÁªµÄ£¬Í¨¹ý´úÂë¹ÜÀíËüÃǷdz£¸´ÔÓ¡£ÔÚÉîÈëÁ˽âËùÓÐÀàºÍ½Ó¿Ú֮ǰ£¬ÏÖÔÚÏÈ´óÖÂÁ˽âһϵ±Óû§µ¥»÷
Run ʱ´¥·¢µÄʼþ£º
IDE ͨ¹ý´´½¨Ò»¸öÆô¶¯¶ÔÏóÀ´ÏìÓ¦µ¥»÷°´Å¥Ê¼þ£¬´Ó¶øÊÕ¼¯Æô¶¯ÐÅÏ¢²¢ÎªÆô¶¯Ìí¼ÓÒ»¸ö½ø³Ì¡£
Æô¶¯µÄ´´½¨½«Í¨ÖªËùÓÐÆô¶¯¼àÌýÆ÷£¬°üÀ¨ DLTK ¿ØÖÆÌ¨¹ÜÀíÆ÷¡£
¿ØÖÆÌ¨¹ÜÀíÆ÷»ñµÃÆô¶¯ÐÅÏ¢£¬²¢Ê¹ÓøÃÐÅÏ¢´´½¨ 3 ¸ö¶ÔÏó£ºÒ»¸ö¿ØÖÆÌ¨·þÎñÆ÷£¬Ò»¸ö½âÊÍÆ÷¶ÔÏóºÍÒ»¸ö¿ØÖÆÌ¨¹¤³§¡£
¿ØÖÆÌ¨·þÎñÆ÷´´½¨Ò»¸öÌ×½Ó×Ö£¨Ä¬È϶˿ÚÊÇ 25000£©£¬È»ºóµÈ´ýÁ¬½Ó¡£
¿ØÖÆÌ¨¹¤³§Æô¶¯½âÊÍÆ÷²¢´´½¨Ò»¸ö¿ØÖÆÌ¨¡£
¿ØÖÆÌ¨¹ÜÀíÆ÷·ÃÎÊ Eclipse ¿ØÖÆÌ¨²å¼þ²¢Ìí¼ÓеĿØÖÆÌ¨¡£
DLTK Àà´¦Àí´ó²¿·ÖÊÂÇ飬µ«ÄúÈÔÈ»ÐèÒªÍê³ÉһЩÊÂÇé¡£Octave IDE ±ØÐëÖ§³ÖÓë Octave
Ïà¹ØµÄÆô¶¯£¬È»ºóÐèÒªÌØ¶¨ÓÚ Octave µÄÀàÀ´¹ÜÀí¿ØÖÆÌ¨ºÍ½âÊÍÆ÷¡£ÕâÀォÖðÒ»ÌÖÂÛÕâЩÖ÷Ìâ¡£
ÅäÖà DLTK Æô¶¯
ÔÚ Eclipse ÖУ¬Æô¶¯Ó¦ÓóÌÐòµÄ¹ý³Ì³ÆÎªÔÚ Run Ä£ÐÍÏÂÆô¶¯Ó¦ÓóÌÐò¡£ÓÉÓÚ Eclipse Ö§³ÖÐí¶àÆô¶¯Ö´ÐÐÎļþ£¬ËùÒÔÄúҪȷ±£µ±Óû§Ö´ÐÐ
Octave ½Å±¾Ê±Æô¶¯ Octave ½âÊÍÆ÷¡£ÕâÖÖ¹ØÁªÍ¨¹ýÆô¶¯ÅäÖÃÀàÐÍ À´ÊµÏÖ£¬²¢ÇÒͨ¹ýÔÚ Eclipse
Öе¥»÷ Run > Run ¿ÉÒÔ¿´µ½ËùÓпÉÓõÄÀàÐÍ¡£Í¼ 8 ÏÔʾÁËÆô¶¯ÅäÖÃÀàÐÍ¡£

ͼ 8. Octave Æô¶¯ÅäÖÃÀàÐÍ
ҪΪ Octave ´´½¨Æô¶¯ÅäÖÃÀàÐÍ£¬µÚÒ»²½¾ÍÊǽ« org.eclipse.debug.core.launchConfigurationTypes
µÄÒ»¸öÀ©Õ¹Ìí¼Óµ½ plugin.xml¡£ÔÚͼ 8 ÖУ¬¿ÉÒÔ¿´µ½ÔÚ´°¿ÚÖÐÑ¡ÖÐµÄ Octave ÅäÖÃÀàÐÍ¡£Çåµ¥
13 ¸ø³öÁ˶¨ÒåÕâ¸öÐÂÀàÐ͵ÄÀ©Õ¹¡£
Æô¶¯ 13. ¶¨Òå Octave Æô¶¯ÅäÖÃÀàÐÍ
<extension point="org.eclipse.debug.core.launchConfigurationTypes"> <launchConfigurationType id="org.dworks.octaveide.launch.OctaveLaunchConfigurationType" delegate="org.dworks.octaveide.launch.OctaveLaunchConfigurationDelegate" modes="run" public="true" name="%OctaveLaunchConfigurationType.name" </launchConfigurationType> </extension> |
ʾÀýÏîÄ¿»áÖ´ÐÐ Octave ½Å±¾£¬µ«²»µ÷ÊÔËüÃÇ¡£Òò´Ë£¬ÐèÒª½« modes ÊôÐÔÉèÖÃΪ run ¶ø²»ÊÇ
run,debug¡£×îÖØÒªµÄÊôÐÔÊÇ delegate£¬Ëü±êʶʵÏÖ ILaunchConfigurationDelegate
µÄÀà¡£Õâ¸ö½Ó¿Ú¶¨ÒåÒ»¸ö·½·¨ launch£¬µ±Óû§´´½¨Æô¶¯ÅäÖò¢µ¥»÷ Run ʱ»áµ÷Óø÷½·¨¡£
DLTK ÌṩËü×Ô¼ºµÄ ILaunchConfigurationDelegate ʵÏÖ£¬³ÆÎª AbstractScriptLaunchConfigurationDelegate¡£µ±Õâ¸öÀàµÄ
launch ·½·¨±»µ÷ÓÃʱ£¬Ëü»áµ÷Óà 3 ¸öÖØÒªµÄ·½·¨£º
createInterpreterConfig
Õâ¸ö·½·¨¹¹ÔìÒ»¸ö InterpreterConfig ¶ÔÏó£¬Ëü½ÓÊÕÀ´×ÔÆô¶¯ÅäÖõÄËùÓÐÐÅÏ¢¡£
getInterpreterRunner
Õâ¸ö·½·¨·ÃÎÊÓɽâÊÍÆ÷°²×°ÀàÐÍ´´½¨µÄ IInterpreterInstall
¶ÔÏ󣬲¢Ê¹ÓÃËü¹¹ÔìÒ»¸ö IInterpreterRunner¡£
runRunner
Õâ¸ö·½·¨Îª½âÊÍÆ÷´´½¨Ò»¸ö½ø³Ì£¬²¢½«ÆäÌí¼Óµ½Æô¶¯ÖС£
Õâ¸ö¹ý³Ì¿´ÆðÀ´ÓÐЩ¸´ÔÓ£¬µ«Ç°Á½¸ö·½·¨½ö×éÖ¯Á˹ØÓÚÆô¶¯µÄÐÅÏ¢£»InterpreterConfig
´æ´¢À´×ÔÆô¶¯ÅäÖõÄÐÅÏ¢£¬¶ø IInterpreterInstall ´æ´¢À´×ÔÊ×Ñ¡ÏîµÄÐÅÏ¢¡£µÚ 3 ¸ö·½·¨²¢Ã»ÓÐ
ʵ¼ÊÆô¶¯½âÊÍÆ÷£¬Àí½âÕâµãºÜÖØÒª¡£ËüΪ½âÊÍÆ÷´´½¨Ò»¸ö IProcess£¬²¢½«ÆäÌí¼Óµ½ Launch ¶ÔÏó¡£
DLTK ¿ØÖÆÌ¨¹ÜÀíÆ÷
µ± DLTK ²å¼þ org.eclipse.dltk.console.ui
Æô¶¯Ê±£¬Ëü½«·ÃÎÊ Eclipse Debug UI ²å¼þ£¬²¢Ìí¼ÓÒ»¸ö ScriptConsoleManager
ʵÀý×÷ΪÆô¶¯¼àÌýÆ÷¡£µ±Ìí¼Ó¡¢¸ü¸Ä»òɾ³ýÆô¶¯Ê±£¬¶¼»á֪ͨÕâЩ¼àÌýÆ÷¡£ScriptConsoleManager
½öÏìÓ¦Ìí¼ÓµÄÆô¶¯£¬ËüµÄµÚÒ»¸öÈÎÎñÊǼì²éÆô¶¯ÊÇ·ñ¾ßÓпÉʶ±ðµÄÌØÕ÷¡£Èç¹ûÊǵϰ£¬¸Ã¹ÜÀíÆ÷½«´´½¨ 3 ¸öÖØÒªµÄ¶ÔÏó£ºÒ»¸ö¿ØÖÆÌ¨·þÎñÆ÷¡¢Ò»¸ö½âÊÍÆ÷¶ÔÏóºÍÒ»¸ö¿ØÖÆÌ¨¹¤³§¡£
¹ÜÀíÆ÷´´½¨Ò»¸ö ScriptConsoleServer À´¹ÜÀí½âÊÍÆ÷ºÍ¿ØÖÆÌ¨Ö®¼äµÄͨÐÅ¡£ÔÚ³õʼ»¯ÆÚ¼ä£¬·þÎñÆ÷½«Ò»¸ö
ServerSocket °ó¶¨µ½¶Ë¿Ú 25000£¬²¢¸æËßËüµÈ´ý½øÀ´µÄÁ¬½ÓÇëÇó¡£ÕâЩÇëÇóÒÔ ConsoleRequest
¶ÔÏóµÄÐÎʽ³öÏÖ£¬²¢ÇÒµ±·þÎñÆ÷½ÓÊܵ½ÐµÄÇëÇóʱ£¬Ëü½«µ÷ÓÃÿ¸öÐÂÇëÇóµÄ consoleConnected ·½·¨¡£
´´½¨·þÎñÆ÷Ö®ºó£¬ScriptConsoleManager ·ÃÎÊÒ»¸ö±íʾ½âÊÍÆ÷µÄ
ConsoleRequest¡£Ëüͨ¹ýÔÚ plugin.xml ÖÐËÑË÷ org.eclipse.dltk.console.scriptInterpreter
µÄÀ©Õ¹µãÀ´ÊµÏÖÕâ¸öÄ¿µÄ¡£Õâ¸öÀ©Õ¹µã±êʶһ¸öÌØÕ÷Ä¿±êºÍÒ»¸öʵÏÖ IScriptInterpreter£¨ConsoleRequest
µÄ×Ó½Ó¿Ú£©µÄÀà¡£¿ØÖÆÌ¨¹ÜÀíÆ÷ÔÚ»ñÈ¡½âÊÍÆ÷¶ÔÏóÖ®ºó£¬¾Í¿ÉÒÔ¿ªÊ¼´´½¨¿ØÖÆÌ¨ÁË¡£Îª´Ë£¬ÐèÒªµ÷Óù¤×÷̨¹¤³§¡£
¿ØÖÆÌ¨¹¤³§ºÍ¿ØÖÆÌ¨
ͨ³££¬Èç¹ûÄúÏë´Ó²å¼þ·ÃÎÊ Eclipse ¿ØÖÆÌ¨£¬½öÐèÀ©Õ¹?¸öÀ©Õ¹µã£ºorg.eclipse.ui.console.consoleFactories¡£Õâ¸öÀ©Õ¹±ØÐë±êʶһ¸öʵÏÖ
IConsoleFactory µÄÀࡣȻºó£¬µ±ÔÚ Console ÊÓͼÖе¥»÷ Open Console
ʱ£¬Eclipse ½«µ÷ÓÃÕâ¸öÀàµÄ openConsole ·½·¨´´½¨Ò»¸öеĿØÖÆÌ¨¡£
DLTK ÈÃÊÂÇé±äµÃ¸´ÔÓһЩ¡£DLTK ScriptConsoleManager
Ò²ÐèÒª·ÃÎÊ¿ØÖÆÌ¨¹¤³§£¬µ«ËüÐèÒªÒ»¸öʵÏÖ IScriptConsoleFactory µÄÀà¡£IConsoleFactory
ºÍ IScriptConsoleFactory ¶¼ÐèÒªÏàͬµÄ openConsole ·½·¨£¬ÕâºÜ·½±ã¡£²»¹ý£¬ÄúÐèÒª´´½¨Á½¸öÀ©Õ¹µã£ºÒ»¸öÓÃÓÚ
Eclipse ¿ØÖÆÌ¨¹¤³§£¬Ò»¸öÓÃÓÚ DLTK ¿ØÖÆÌ¨¹¤³§¡£Çåµ¥ 14 չʾÁËÕâÁ½¸ö Octave IDE
À©Õ¹µã¡£
Çåµ¥ 14. ±êʶ Octave ¿ØÖÆÌ¨¹¤³§
<extension point="org.eclipse.dltk.console.ui.scriptConsole"> <scriptConsole class="org.dworks.octaveide.launch.OctaveConsoleFactory" natureID="org.dworks.octaveide.nature" /> </extension> <extension point="org.eclipse.ui.console.consoleFactories"> <consoleFactory class="org.dworks.octaveide.launch.OctaveConsoleFactory" icon="icons/oct.gif" label="%OctaveConsole.Console" /> </extension> |
µ± ScriptConsoleManager ·ÃÎÊÒ»¸ö½Å±¾¿ØÖÆÌ¨¹¤³§Ê±£¬Ëüµ÷Óøù¤³§µÄ
openConsole ·½·¨£¬²¢Í¨¹ýËü´´½¨×îÖØÒªµÄ ScriptConsole ¶ÔÏó¡£¾ÍÏñ Eclipse
Îı¾±à¼Æ÷Ò»Ñù£¬Õâ¸ö¿ØÖÆÌ¨Ê¹ÓûùÓÚÎĵµµÄ·½·¨ÏÔʾÎı¾£»ËüÓÐÒ»¸ö ConsoleDocument¡¢Ò»¸ö IConsoleDocumentPartitioner
ÒÔ¼°Ò»Ð© Position ºÍ Region Êý×é¡£
´´½¨ ScriptConsole Ö®ºó£¬Ëü½«µ÷ÓÃÒýÓÃÓÉ¿ØÖÆÌ¨´´½¨µÄ IScriptInterpreter
¶ÔÏóµÄ setInterpreter¡£Õâ¸ö·½·¨ÒÔ InitialStreamReader µÄÐÎʽÔÚ¿ØÖÆÌ¨ºÍ½âÊÍÆ÷Ö®¼ä´´½¨Ò»¸öÁ¬½Ó¡£Õâ¸öÁ÷ÔĶÁÆ÷ͨ¹ýµ÷ÓÃ
IScriptInterpreter.getInitialOutputStream ½«×ÔÉíÁ¬½Óµ½½âÊÍÆ÷¡£½ÓÏÂÀ´£¬InitialStreamReader
¶ÁÈ¡½âÊÍÆ÷Êä³öµÄÿÐÐÄÚÈÝ£¬²¢·¢Ë͵½¿ØÖÆÌ¨½øÐÐÏÔʾ¡£ÏÔʾÎı¾Ö®ºó£¬¿ØÖÆÌ¨»áÊä³öÒ»¸öÌáʾ£¬²¢½øÈë¿É±à¼Ä£Ê½¡£
ÔÚ´´½¨ ScriptConsole Ö®ºó£¬ScriptConsoleManager
½«·ÃÎÊ Eclipse ConsoleManager£¬²¢Ïò¿ÉÓÿØÖÆÌ¨ÁбíÌí¼ÓеĶÔÏó¡£ÏÖÔÚ£¬ÐµĿØÖÆÌ¨¶ÔÓû§ÊǿɼûµÄ£¬²¢ÇÒ½âÊÍÆ÷Ò²¿ÉÒÔ·ÃÎÊËü¡£
ÔËÐнâÊÍÆ÷
ÎÒÃÇ×Ðϸ¿´¿´ÓÉ ScriptConsoleManager ´´½¨µÄ IScriptInterpreter
¶ÔÏó¡£Õâ¸ö½Ó¿ÚÀ©Õ¹ ConsoleRequest ½Ó¿Ú£¬ÕâÒâζ×Å¿ÉÒÔ½«ËüÌá½»¸ø ScriptConsoleServer
ÒÔ½øÐд¦Àí¡£¿ØÖÆÌ¨¹ÜÀíÆ÷´¦ÀíÕâ¸öÌá½»£¬²¢ÇÒµ±·þÎñÆ÷ÊÕµ½½âÊÍÆ÷µÄÇëÇóʱ£¬Ëü½«µ÷Óà IScriptInterpreter.consoleConnected(IScriptConsoleIO
protocol)¡£
Õâ¸ö·½·¨µ£ÈÎÁ½¸öÖØÒªµÄ½ÇÉ«£ºËü¹¹ÔìʵÏÖÔÚ¿ØÖÆÌ¨ºÍ½âÊÍÆ÷Ö®¼ä´«ÊäÊý¾ÝµÄ InitialStreamReader£¬²¢ÇÒÕâ¸ö·½·¨µÄ²ÎÊý±êʶÓÃÓÚͨÐŵÄÐÒé¡£IScriptConsoleIO
¶¨ÒåÁ½¸ö´Ó½âÊÍÆ÷½ÓÊÕÊý¾ÝµÄÖØÒª·½·¨£º
InterpreterResponse execInterpreter(String
command)
Ïò½âÊÍÆ÷·¢ËÍÒ»¸ö½Å±¾ÃüÁȻºó½ÓÊÕÒ»¸öÏìÓ¦
ShellResponse execShell(String command,
String[] args)
Ïò½âÊÍÆ÷·¢ËÍÒ»¸ö shell ÃüÁȻºó½ÓÊÕÒ»¸öÏìÓ¦
ÕâÁ½¸öº¯Êý½«ÃüÁîÖ¸Ïò½âÊÍÆ÷²¢½ÓÊÕ½âÊÍÆ÷µÄÊä³ö¡£Ã¿¸ö IScriptConsoleIO
ÐÒé¶ÔÏó¶¼Ê¹Óà InputStream ºÍ OutputStream ½øÐгõʼ»¯¡£µ± execInterpreter
±»µ÷ÓÃʱ£¬ÐÒ齫ÃüÁî·¢Ë͸ø½âÊÍÆ÷µÄ OutputStream¡£µ±½âÊÍÆ÷½øÐÐÏìӦʱ£¬ÐÒé½ÓÊÕ InterpreterResponse£¨Êµ¼ÊÉÏÊÇÒ»¸ö
String£©²¢Í¨¹ý InputStream ½«Æä·¢Ë͵½¿ØÖÆÌ¨¡£
ËùÓÐÓë½âÊÍÆ÷½øÐеÄͨÐŶ¼ÒÀÀµÓÚÐÒéµÄ·½·¨¡£ÀýÈ磬IScriptInterpreter
½Ó¿Ú°üº¬½«ÃüÁî·¢Ë͵½½âÊÍÆ÷µÄ exec(String command) ·½·¨¡£Õâ¸öÃüÁîͨ¹ýµ÷Óà IScriptConsoleIO.execInterpreter
À´Ìá½»ÃüÁͬÑù£¬½âÊÍÆ÷µÄ close ·½·¨Ò²ÒÀÀµÓÚ IScriptConsoleIO.execShell¡£
½áÊøÓï
ÕýÈç±¾½Ì³ÌËùʾ£¬DLTK ÌṩÐí¶àÓÃÓÚΪ¶¯Ì¬ÓïÑÔ´´½¨¿ª·¢»·¾³µÄÌØÐÔ¡£´´½¨ÕâЩ»·¾³²»ÐèÒª±àдºÜ¶à´úÂ룬µ«ÄúÒªÃ÷È·×Ô¼ºµÄÄ¿µÄ¡£ÎªÁËÅäÖÃÎı¾±íʾ£¬Äú±ØÐëÀí½â±à¼Æ÷¡¢²é¿´Æ÷ºÍÎĵµÖ®¼äÊÇÈçºÎ½»»¥µÄ£¬²¢ÇÒÒª´óÌåÁ˽â»ùÓÚ¹æÔòµÄ·ÖÇøºÍɨÃè¡£ÒªÖ§³ÖÓû§Ê×Ñ¡ÏÄú±ØÐëÀí½â
Eclipse preference pages ºÍ DLTK configuration blocks
ÀàµÄÆæ¹Ö²ã´Î½á¹¹¡£ÒªÆô¶¯¶¯Ì¬ÓïÑÔÏîÄ¿£¬Äú±ØÐë´¦ÀíʵÏÖ¿ØÖÆÌ¨ºÍ½Å±¾½âÊÍÆ÷Ö®¼äµÄͨÐŵÄÏ̡߳¢Á÷ºÍÐÒé·½·¨¡£
ÕÆÎÕ DLTK ²»Ì«ÈÝÒ×£¬Òª¾«Í¨ËüÔò¸ü¼ÓÀ§ÄÑ¡£µ«ÊÇÈç¹ûÄúÒªÎªÌØ¶¨µÄ½Å±¾ÓïÑÔ¹¹½¨¹¦ÄÜÍêÕûµÄ
IDE£¬¾ÍûÓбÈËü¸üºÃµÄ¹¤¾ß¼¯ÁË¡£³ýÁ˱¾½Ì³ÌÖеIJÄÁÏÖ®Í⣬DLTK »¹Îª PHP ºÍ Tcl µÈÓïÑÔÌṩÐí¶àʾÀý
IDE¡£
|