[SCM] jedit - Java plugin-based editor for programmers branch, master, updated. upstream/4.3.2+dfsg-17-gb7dd5f2
Gabriele Giacone
gg0-guest at alioth.debian.org
Fri Aug 12 22:19:33 UTC 2011
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "jedit - Java plugin-based editor for programmers".
The branch, master has been updated
via b7dd5f2aefcc6796fb33ae366b2163d161bf8629 (commit)
via 548500dce3ed05214866e9944296898203152dd0 (commit)
via a79dc29c90bc842f39bc8ec9e4c0bd02e7b8e61d (commit)
via bce25050bbf495a74de2a830cbc52f6174189d7b (commit)
via 85e23a8049f8fc7576c2d59c2b872498869153b9 (commit)
via 7a97b16f26f21d80ae9355dadc0c1aa3d3cd81b8 (commit)
via 4502a45c7d3f657315e66bc9f5a16096ab0cffab (commit)
via ad6ec8cc8c1d90282498554aa9630eb574f195ba (commit)
from 3d7fe1507cd0eb9d545d1a4b8d00d2adbb90a536 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit b7dd5f2aefcc6796fb33ae366b2163d161bf8629
Author: Gabriele Giacone <1o5g4r8o at gmail.com>
Date: Fri Aug 12 22:15:19 2011 +0200
Remove article from short desc.
commit 548500dce3ed05214866e9944296898203152dd0
Author: Gabriele Giacone <1o5g4r8o at gmail.com>
Date: Fri Aug 12 22:15:05 2011 +0200
Bump Standards-Version to 3.9.2.
commit a79dc29c90bc842f39bc8ec9e4c0bd02e7b8e61d
Author: Gabriele Giacone <1o5g4r8o at gmail.com>
Date: Fri Aug 12 21:57:19 2011 +0200
Update doc-base.
commit bce25050bbf495a74de2a830cbc52f6174189d7b
Author: Gabriele Giacone <1o5g4r8o at gmail.com>
Date: Fri Aug 12 21:42:51 2011 +0200
Add docbook-xml as B-D. Add docbook.catalog in build.properties.
commit 85e23a8049f8fc7576c2d59c2b872498869153b9
Author: Gabriele Giacone <1o5g4r8o at gmail.com>
Date: Fri Aug 12 21:24:27 2011 +0200
Refresh debian/patches/02build.xml
commit 7a97b16f26f21d80ae9355dadc0c1aa3d3cd81b8
Merge: ad6ec8c 4502a45
Author: Gabriele Giacone <1o5g4r8o at gmail.com>
Date: Fri Aug 12 20:39:14 2011 +0200
Merge commit 'upstream/4.4.1+dfsg'
commit ad6ec8cc8c1d90282498554aa9630eb574f195ba
Author: Gabriele Giacone <1o5g4r8o at gmail.com>
Date: Fri Aug 12 19:55:47 2011 +0200
New upstream release 4.4.1
-----------------------------------------------------------------------
Summary of changes:
build-support/README.txt | 12 +-
build-support/build.properties.sample | 340 +-
build-support/ci/ci_release.groovy | 97 +
build-support/ci/copy_properties.groovy | 53 +
build-support/eclipse-formatting.xml | 492 +-
build-support/ivysettings.properties | 1 +
build-support/ivysettings.xml | 13 +
build-support/plugin-build.xml | 1203 +-
build-support/users-guide.xsl | 456 +-
debian/build.properties | 1 +
debian/changelog | 8 +
debian/control | 7 +-
debian/jedit.doc-base.3 | 6 +-
debian/patches/02build.xml | 22 +-
jEdit/.idea/ant.xml | 31 +
jEdit/.idea/compiler.xml | 25 +
jEdit/.idea/copyright/GPL_v2.xml | 9 +
jEdit/.idea/copyright/profiles_settings.xml | 61 +
jEdit/.idea/encodings.xml | 7 +
jEdit/.idea/misc.xml | 437 +
jEdit/.idea/modules.xml | 11 +
jEdit/.idea/projectCodeStyle.xml | 103 +
jEdit/.idea/runConfigurations/jEdit.xml | 37 +
.../runConfigurations/jEdit__background_mode_.xml | 30 +
jEdit/.idea/uiDesigner.xml | 125 +
jEdit/.idea/vcs.xml | 17 +
jEdit/README.SRC.txt | 405 +-
jEdit/build.properties.sample | 168 +-
jEdit/build.xml | 3103 +++--
jEdit/com/microstar/xml/HandlerBase.java | 192 -
jEdit/com/microstar/xml/XmlException.java | 85 -
jEdit/com/microstar/xml/XmlHandler.java | 241 -
jEdit/com/microstar/xml/XmlParser.java | 4377 ------
jEdit/com/microstar/xml/package.html | 6 -
jEdit/de/masters_of_disaster/ant/tasks/ar/Ar.java | 936 +-
.../ant/tasks/ar/ArConstants.java | 124 +-
.../masters_of_disaster/ant/tasks/ar/ArEntry.java | 710 +-
.../ant/tasks/ar/ArOutputStream.java | 334 +-
.../masters_of_disaster/ant/tasks/ar/ArUtils.java | 310 +-
.../ant/tasks/calculatesize/CalculateSize.java | 188 +-
.../de/masters_of_disaster/ant/tasks/deb/Deb.java | 705 +-
jEdit/doc/Apache.LICENSE.txt | 100 +-
jEdit/doc/CHANGES.txt | 3784 +-----
jEdit/doc/COPYING.DOC.txt | 710 +-
jEdit/doc/COPYING.PLUGINS.txt | 42 +-
jEdit/doc/COPYING.txt | 678 +-
jEdit/doc/CORE_GUIDELINES.txt | 124 +-
jEdit/doc/FAQ/faq-contrib.xml | 84 +-
jEdit/doc/FAQ/faq-general.xml | 1297 +-
jEdit/doc/FAQ/faq-install.xml | 558 +-
jEdit/doc/FAQ/faq-intro.xml | 62 +-
jEdit/doc/FAQ/faq-legal.xml | 48 +-
jEdit/doc/FAQ/faq-macros.xml | 266 +-
jEdit/doc/FAQ/faq-plugins.xml | 340 +-
jEdit/doc/FAQ/faq-problems.xml | 840 +-
jEdit/doc/FAQ/faq-use.xml | 1430 +-
jEdit/doc/FAQ/faq.xml | 376 +-
jEdit/doc/README.txt | 235 +-
jEdit/doc/TODO.txt | 453 +-
jEdit/doc/jeditfo.xsl | 114 +-
jEdit/doc/jedithtml.xsl | 510 +-
jEdit/doc/news43/news.xml | 331 -
jEdit/doc/news44/news.xml | 34 +
jEdit/doc/release-procedure.txt | 54 +-
jEdit/doc/tips/tip0.html | 12 +-
jEdit/doc/tips/tip1.html | 4 +-
jEdit/doc/tips/tip10.html | 8 +-
jEdit/doc/tips/tip11.html | 4 +-
jEdit/doc/tips/tip12.html | 4 +-
jEdit/doc/tips/tip13.html | 4 +-
jEdit/doc/tips/tip14.html | 4 +-
jEdit/doc/tips/tip15.html | 24 +-
jEdit/doc/tips/tip16.html | 18 +-
jEdit/doc/tips/tip17.html | 26 +-
jEdit/doc/tips/tip18.html | 6 +-
jEdit/doc/tips/tip19.html | 8 +-
jEdit/doc/tips/tip2.html | 34 +-
jEdit/doc/tips/tip20.html | 4 +-
jEdit/doc/tips/tip21.html | 6 +-
jEdit/doc/tips/tip22.html | 8 +-
jEdit/doc/tips/tip23.html | 4 +-
jEdit/doc/tips/tip24.html | 8 +-
jEdit/doc/tips/tip25.html | 6 +-
jEdit/doc/tips/tip26.html | 4 +-
jEdit/doc/tips/tip27.html | 8 +-
jEdit/doc/tips/tip28.html | 8 +-
jEdit/doc/tips/tip29.html | 26 +-
jEdit/doc/tips/tip3.html | 4 +-
jEdit/doc/tips/tip30.html | 26 +-
jEdit/doc/tips/tip31.html | 24 +-
jEdit/doc/tips/tip32.html | 12 +-
jEdit/doc/tips/tip33.html | 8 +-
jEdit/doc/tips/tip34.html | 44 +-
jEdit/doc/tips/tip35.html | 12 +-
jEdit/doc/tips/tip36.html | 12 +-
jEdit/doc/tips/tip37.html | 6 +-
jEdit/doc/tips/tip38.html | 6 +-
jEdit/doc/tips/tip39.html | 8 +-
jEdit/doc/tips/tip4.html | 10 +-
jEdit/doc/tips/tip40.html | 8 +-
jEdit/doc/tips/tip41.html | 6 +-
jEdit/doc/tips/tip42.html | 2 +-
jEdit/doc/tips/tip43.html | 4 +-
jEdit/doc/tips/tip44.html | 6 +-
jEdit/doc/tips/tip45.html | 20 +-
jEdit/doc/tips/tip46.html | 8 +-
jEdit/doc/tips/tip47.html | 8 +-
jEdit/doc/tips/tip48.html | 8 +-
jEdit/doc/tips/tip49.html | 10 +-
jEdit/doc/tips/tip5.html | 4 +-
jEdit/doc/tips/tip50.html | 8 +-
jEdit/doc/tips/tip51.html | 2 +-
jEdit/doc/tips/tip52.html | 10 +-
jEdit/doc/tips/tip53.html | 8 +-
jEdit/doc/tips/tip54.html | 6 +-
jEdit/doc/tips/tip55.html | 34 +-
jEdit/doc/tips/tip56.html | 34 +-
jEdit/doc/tips/tip57.html | 10 +-
jEdit/doc/tips/tip58.html | 12 +-
jEdit/doc/tips/tip59.html | 38 +-
jEdit/doc/tips/tip6.html | 4 +-
jEdit/doc/tips/tip60.html | 16 +-
jEdit/doc/tips/tip61.html | 12 +-
jEdit/doc/tips/tip62.html | 10 +-
jEdit/doc/tips/tip63.html | 10 +-
jEdit/doc/tips/tip64.html | 4 +-
jEdit/doc/tips/tip65.html | 16 +-
jEdit/doc/tips/tip66.html | 4 +-
jEdit/doc/tips/tip67.html | 10 +-
jEdit/doc/tips/tip68.html | 6 +-
jEdit/doc/tips/tip69.html | 44 +-
jEdit/doc/tips/tip7.html | 4 +-
jEdit/doc/tips/tip70.html | 8 +-
jEdit/doc/tips/tip71.html | 6 +-
jEdit/doc/tips/tip72.html | 16 +-
jEdit/doc/tips/tip73.html | 12 +-
jEdit/doc/tips/tip74.html | 14 +-
jEdit/doc/tips/tip75.html | 38 +-
jEdit/doc/tips/tip76.html | 10 +-
jEdit/doc/tips/tip77.html | 6 +-
jEdit/doc/tips/tip78.html | 4 +-
jEdit/doc/tips/tip79.html | 12 +-
jEdit/doc/tips/tip8.html | 30 +-
jEdit/doc/tips/tip80.html | 16 +-
jEdit/doc/tips/tip81.html | 12 +-
jEdit/doc/tips/tip82.html | 14 +-
jEdit/doc/tips/tip83.html | 10 +-
jEdit/doc/tips/tip84.html | 10 +-
jEdit/doc/tips/tip85.html | 18 +-
jEdit/doc/tips/tip86.html | 10 +-
jEdit/doc/tips/tip87.html | 24 +-
jEdit/doc/tips/tip88.html | 4 +-
jEdit/doc/tips/tip89.html | 52 +-
jEdit/doc/tips/tip9.html | 10 +-
jEdit/doc/tips/tip90.html | 54 +-
jEdit/doc/tips/tip91.html | 20 +-
jEdit/doc/tips/tip92.html | 6 +-
jEdit/doc/tips/tip93.html | 40 +-
jEdit/doc/tips/tip94.html | 38 +-
jEdit/doc/tips/tip95.html | 2 +-
jEdit/doc/tips/tip96.html | 2 +-
jEdit/doc/tips/tip97.html | 20 +-
jEdit/doc/tips/tip98.html | 8 +-
jEdit/doc/users-guide/activity-log.xml | 112 +-
jEdit/doc/users-guide/basics.xml | 1054 +-
jEdit/doc/users-guide/bsh-commands.xml | 1436 +-
jEdit/doc/users-guide/conventions.xml | 239 +-
jEdit/doc/users-guide/customizing.xml | 1320 +-
jEdit/doc/users-guide/dialog-macro.xml | 1290 +-
jEdit/doc/users-guide/files.xml | 1386 +-
jEdit/doc/users-guide/globs.xml | 272 +-
jEdit/doc/users-guide/history.xml | 94 +-
jEdit/doc/users-guide/installing-modes.xml | 145 +-
jEdit/doc/users-guide/launcher-guide.xml | 1072 +-
jEdit/doc/users-guide/macro-basics.xml | 1532 +-
jEdit/doc/users-guide/macro-index.xml | 1494 ++-
jEdit/doc/users-guide/macro-tips.xml | 1840 ++--
jEdit/doc/users-guide/plugin-implement.xml | 2561 ++--
jEdit/doc/users-guide/plugin-intro.xml | 262 +-
jEdit/doc/users-guide/plugin-tips.xml | 320 +-
jEdit/doc/users-guide/regexps.xml | 507 +-
jEdit/doc/users-guide/shortcuts.xml | 1976 ++--
jEdit/doc/users-guide/source-edit.xml | 1242 +-
jEdit/doc/users-guide/starting.xml | 731 +-
jEdit/doc/users-guide/text-edit.xml | 2495 ++--
jEdit/doc/users-guide/updating-modes.xml | 176 +-
jEdit/doc/users-guide/users-guide.xml | 388 +-
jEdit/doc/users-guide/using-macros.xml | 366 +-
jEdit/doc/users-guide/using-plugins.xml | 284 +-
jEdit/doc/users-guide/writing-modes.xml | 1824 ++--
jEdit/doc/welcome.html | 58 +-
jEdit/doclet/GenerateTocXML.java | 232 +-
jEdit/installer/BZip2Constants.java | 168 +-
jEdit/installer/CBZip2InputStream.java | 1906 ++--
jEdit/installer/CBZip2OutputStream.java | 4042 +++---
jEdit/installer/CRC.java | 226 +-
jEdit/installer/ConsoleInstall.java | 276 +-
jEdit/installer/ConsoleProgress.java | 88 +-
jEdit/installer/Install.java | 326 +-
jEdit/installer/InstallThread.java | 228 +-
jEdit/installer/InvalidHeaderException.java | 84 +-
jEdit/installer/NonInteractiveInstall.java | 182 +-
jEdit/installer/OperatingSystem.java | 752 +-
jEdit/installer/Progress.java | 60 +-
jEdit/installer/ServerKiller.java | 266 +-
jEdit/installer/SwingInstall.java | 1568 +-
jEdit/installer/TarBuffer.java | 968 +-
jEdit/installer/TarEntry.java | 1458 +-
jEdit/installer/TarHeader.java | 844 +-
jEdit/installer/TarInputStream.java | 1038 +-
jEdit/installer/TarOutputStream.java | 660 +-
jEdit/installer/VariableGridLayout.java | 334 -
jEdit/installer/done-HalfAnOS.html | 16 +-
jEdit/installer/done-MacOS.html | 26 +-
jEdit/installer/done-Unix.html | 24 +-
jEdit/installer/done-VMS.html | 26 +-
jEdit/installer/done-Windows.html | 14 +-
jEdit/installer/gpl.html | 942 +-
jEdit/installer/install.mf | 2 +-
jEdit/installer/install.props | 132 +-
jEdit/installer/readme.html | 50 +-
jEdit/jEdit.iml | 1 +
jEdit/jEdit.ipr | 1736 ---
jEdit/jars/LatestVersion/LatestVersion.html | 18 -
jEdit/jars/LatestVersion/LatestVersion.iml | 13 -
jEdit/jars/LatestVersion/LatestVersion.props | 42 -
jEdit/jars/LatestVersion/LatestVersion.txt | 1 -
jEdit/jars/LatestVersion/LatestVersionPlugin.java | 99 -
jEdit/jars/LatestVersion/actions.xml | 11 -
jEdit/jars/LatestVersion/build.xml | 23 -
jEdit/jars/MacOSX/MacOSX.iml | 26 +-
jEdit/jars/MacOSX/macosx/MacOSXPlugin.java | 2 +-
jEdit/jars/QuickNotepad/QuickNotepad.iml | 26 +-
jEdit/jars/QuickNotepad/QuickNotepad.java | 488 +-
jEdit/jars/QuickNotepad/QuickNotepad.props | 134 +-
jEdit/jars/QuickNotepad/QuickNotepadActions.java | 60 +-
.../jars/QuickNotepad/QuickNotepadOptionPane.java | 254 +-
jEdit/jars/QuickNotepad/QuickNotepadPlugin.java | 68 +-
jEdit/jars/QuickNotepad/QuickNotepadTextArea.java | 66 +-
jEdit/jars/QuickNotepad/QuickNotepadToolPanel.java | 200 +-
jEdit/jars/QuickNotepad/README.txt | 24 +-
jEdit/jars/QuickNotepad/actions.xml | 58 +-
jEdit/jars/QuickNotepad/build.xml | 46 +-
jEdit/jars/QuickNotepad/changes40.txt | 198 +-
jEdit/jars/QuickNotepad/changes42.txt | 52 +-
jEdit/jars/QuickNotepad/description.html | 16 +-
jEdit/jars/QuickNotepad/dockables.xml | 30 +-
jEdit/jars/QuickNotepad/users-guide.xml | 552 +-
jEdit/macros/C/Include_Guard.bsh | 148 +-
jEdit/macros/C/Toggle_Header_Source.bsh | 362 +-
jEdit/macros/Clipboard/Copy_Lines.bsh | 72 +-
jEdit/macros/Clipboard/Copy_Lines_Containing.bsh | 56 +-
jEdit/macros/Clipboard/Copy_Visible_Lines.bsh | 68 +-
jEdit/macros/Clipboard/Cut_Lines.bsh | 82 +-
jEdit/macros/Clipboard/Cut_Lines_Containing.bsh | 72 +-
jEdit/macros/Editing/Emacs_Ctrl-K.bsh | 134 +-
jEdit/macros/Editing/Emacs_Next_Line.bsh | 86 +-
jEdit/macros/Editing/Emacs_Previous_Line.bsh | 90 +-
jEdit/macros/Editing/Go_to_Column.bsh | 102 +-
jEdit/macros/Editing/Greedy_Backspace.bsh | 162 +-
jEdit/macros/Editing/Greedy_Delete.bsh | 174 +-
jEdit/macros/Editing/Greedy_Left.bsh | 160 +-
jEdit/macros/Editing/Greedy_Right.bsh | 172 +-
jEdit/macros/Editing/Keywords_to_Upper_Case.bsh | 94 +-
jEdit/macros/Editing/Mode_Switcher.bsh | 386 +-
jEdit/macros/Editing/Move_Lines_Down.bsh | 212 +-
jEdit/macros/Editing/Move_Lines_Up.bsh | 220 +-
jEdit/macros/Files/Browse_Directory.bsh | 102 +-
jEdit/macros/Files/Buffer_Switcher.bsh | 522 +-
jEdit/macros/Files/Close_All_Except_Active.bsh | 114 +-
jEdit/macros/Files/Copy_Name_to_Clipboard.bsh | 56 +-
jEdit/macros/Files/Copy_Path_to_Clipboard.bsh | 54 +-
jEdit/macros/Files/Delete_Current.bsh | 150 +-
jEdit/macros/Files/Glob_Close.bsh | 96 +-
jEdit/macros/Files/Insert_Selection.bsh | 106 +-
jEdit/macros/Files/Next_Dirty_Buffer.bsh | 88 +-
jEdit/macros/Files/Open_Path.bsh | 98 +-
jEdit/macros/Files/Open_Selection.bsh | 108 +-
jEdit/macros/Files/Toggle_ReadOnly.bsh | 174 +-
jEdit/macros/Interface/Decrease_Font_Size.bsh | 76 +-
jEdit/macros/Interface/Increase_Font_Size.bsh | 76 +-
jEdit/macros/Interface/Open_Context_Menu.bsh | 56 +-
jEdit/macros/Interface/Reset_TextArea.bsh | 14 +-
jEdit/macros/Interface/Splitpane_Grow.bsh | 115 +-
.../Interface/Toggle_Bottom_Docking_Area.bsh | 88 +-
.../macros/Interface/Toggle_Left_Docking_Area.bsh | 72 +-
.../macros/Interface/Toggle_Right_Docking_Area.bsh | 72 +-
jEdit/macros/Interface/Toggle_Top_Docking_Area.bsh | 72 +-
jEdit/macros/Java/Create_Constructor.bsh | 442 +-
jEdit/macros/Java/Get_Class_Name.bsh | 184 +-
jEdit/macros/Java/Get_Package_Name.bsh | 272 +-
jEdit/macros/Java/Java_File_Save.bsh | 284 +-
jEdit/macros/Java/Make_Get_and_Set_Methods.bsh | 634 +-
.../Java/Preview_JavaDoc_Of_Current_Buffer.bsh | 1648 ++--
jEdit/macros/Misc/Debug_BufferSets.bsh | 18 +-
jEdit/macros/Misc/Display_Abbreviations.bsh | 782 +-
jEdit/macros/Misc/Display_Actions.bsh | 152 +-
jEdit/macros/Misc/Display_Character_Code.bsh | 56 +-
jEdit/macros/Misc/Display_Shortcuts.bsh | 614 +-
jEdit/macros/Misc/Evaluate_Buffer_in_BeanShell.bsh | 122 +-
jEdit/macros/Misc/Hex_Convert.bsh | 212 +-
.../macros/Misc/HyperSearch_Results_to_Buffer.bsh | 196 +-
jEdit/macros/Misc/Make_Bug_Report.bsh | 236 +-
jEdit/macros/Misc/Run_Script.bsh | 252 +-
jEdit/macros/Misc/Show_Threads.bsh | 300 +-
.../Properties/Create_Plugin_Announcement.bsh | 777 +-
.../macros/Properties/Insert_Buffer_Properties.bsh | 452 +-
.../macros/Properties/Look_and_Feel_Properties.bsh | 116 +-
jEdit/macros/Properties/System_Properties.bsh | 110 +-
jEdit/macros/Properties/jEdit_Properties.bsh | 116 +-
jEdit/macros/Text/Add_Prefix_and_Suffix.bsh | 320 +-
jEdit/macros/Text/Color_Picker.bsh | 104 +-
jEdit/macros/Text/Duplicate_Line.bsh | 140 +-
jEdit/macros/Text/Insert_Date.bsh | 160 +-
jEdit/macros/Text/Insert_Tag.bsh | 124 +-
jEdit/macros/Text/Next_Char.bsh | 146 +-
jEdit/macros/Text/Reverse_Lines.bsh | 188 +-
jEdit/macros/Text/Single_Space_Buffer.bsh | 102 +-
jEdit/modes/actionscript.xml | 1658 ++--
jEdit/modes/ada95.xml | 448 +-
jEdit/modes/ant.xml | 348 +
jEdit/modes/antlr.xml | 204 +-
jEdit/modes/apacheconf.xml | 2014 ++--
jEdit/modes/apdl.xml |15072 ++++++++++----------
jEdit/modes/applescript.xml | 560 +-
jEdit/modes/asp.xml | 1036 +-
jEdit/modes/aspect-j.xml | 334 +-
jEdit/modes/assembly-m68k.xml | 1016 +-
jEdit/modes/assembly-macro32.xml | 1154 +-
jEdit/modes/assembly-mcs51.xml | 474 +-
jEdit/modes/assembly-parrot.xml | 276 +-
jEdit/modes/assembly-r2000.xml | 518 +-
jEdit/modes/assembly-x86.xml | 1728 ++--
jEdit/modes/awk.xml | 230 +-
jEdit/modes/b.xml | 406 +-
jEdit/modes/batch.xml | 344 +-
jEdit/modes/bbj.xml | 616 +-
jEdit/modes/bcel.xml | 640 +-
jEdit/modes/bibtex.xml | 1920 ++--
jEdit/modes/c.xml | 818 +-
jEdit/modes/catalog | 1136 +-
jEdit/modes/chill.xml | 268 +-
jEdit/modes/cil.xml | 770 +-
jEdit/modes/clips.xml | 868 +-
jEdit/modes/clojure.xml | 1002 +-
jEdit/modes/cobol.xml | 1996 ++--
jEdit/modes/coldfusion.xml | 1288 +-
jEdit/modes/cplusplus.xml | 250 +-
jEdit/modes/csharp.xml | 376 +-
jEdit/modes/css.xml | 1350 +-
jEdit/modes/csv.xml | 280 +-
jEdit/modes/cvs-commit.xml | 50 +-
jEdit/modes/d.xml | 424 +-
jEdit/modes/django.xml | 404 +-
jEdit/modes/dot.xml | 1248 +-
jEdit/modes/doxygen.xml | 674 +-
jEdit/modes/dsssl.xml | 306 +-
jEdit/modes/eiffel.xml | 230 +-
jEdit/modes/embperl.xml | 102 +-
jEdit/modes/erlang.xml | 534 +-
jEdit/modes/factor.xml | 198 +-
jEdit/modes/fhtml.xml | 50 +-
jEdit/modes/forth.xml | 306 +-
jEdit/modes/fortran.xml | 504 +-
jEdit/modes/foxpro.xml | 3716 +++---
jEdit/modes/freemarker.xml | 408 +-
jEdit/modes/gcbasic.xml | 1788 ++--
jEdit/modes/gettext.xml | 116 +-
jEdit/modes/gnuplot.xml | 540 +-
jEdit/modes/go.xml | 174 +
jEdit/modes/groovy.xml | 524 +-
jEdit/modes/haskell.xml | 300 +-
jEdit/modes/haxe.xml | 177 +
jEdit/modes/hex.xml | 40 +-
jEdit/modes/hlsl.xml | 956 +-
jEdit/modes/htaccess.xml | 1134 +-
jEdit/modes/html.xml | 384 +-
jEdit/modes/hxml.xml | 63 +
jEdit/modes/i4gl.xml | 1330 +-
jEdit/modes/icon.xml | 396 +-
jEdit/modes/idl.xml | 316 +-
jEdit/modes/inform.xml | 410 +-
jEdit/modes/ini.xml | 40 +-
jEdit/modes/inno-setup.xml | 812 +-
jEdit/modes/interlis.xml | 524 +-
jEdit/modes/io.xml | 306 +-
jEdit/modes/java.xml | 556 +-
jEdit/modes/javacc.xml | 137 +-
jEdit/modes/javascript.xml | 1118 +-
jEdit/modes/jcl.xml | 134 +-
jEdit/modes/jhtml.xml | 288 +-
jEdit/modes/jmk.xml | 134 +-
jEdit/modes/json.xml | 28 +
jEdit/modes/jsp.xml | 510 +-
jEdit/modes/latex.xml | 463 +-
jEdit/modes/lilypond.xml | 5359 ++++----
jEdit/modes/lisp.xml | 2074 ++--
jEdit/modes/literate-haskell.xml | 74 +-
jEdit/modes/logtalk.xml | 397 +
jEdit/modes/lotos.xml | 250 +-
jEdit/modes/lua.xml | 476 +-
jEdit/modes/mail.xml | 70 +-
jEdit/modes/makefile.xml | 202 +-
jEdit/modes/maple.xml | 1470 +-
jEdit/modes/maven.xml | 372 +
jEdit/modes/ml.xml | 432 +-
jEdit/modes/modula3.xml | 356 +-
jEdit/modes/moin.xml | 222 +-
jEdit/modes/mqsc.xml | 460 +-
jEdit/modes/myghty.xml | 260 +-
jEdit/modes/mysql.xml | 488 +-
jEdit/modes/n3.xml | 172 +-
jEdit/modes/netrexx.xml | 828 +-
jEdit/modes/nqc.xml | 436 +-
jEdit/modes/nsis2.xml | 969 +-
jEdit/modes/objective-c.xml | 238 +-
jEdit/modes/objectrexx.xml | 490 +-
jEdit/modes/occam.xml | 520 +-
jEdit/modes/omnimark.xml | 910 +-
jEdit/modes/pascal.xml | 442 +-
jEdit/modes/patch.xml | 36 +-
jEdit/modes/perl.xml | 1630 ++--
jEdit/modes/php.xml |10281 +++++++-------
jEdit/modes/pike.xml | 482 +-
jEdit/modes/pl-sql.xml | 1004 +-
jEdit/modes/pl1.xml | 1192 +-
jEdit/modes/plaintex.xml | 2886 ++++
jEdit/modes/pop11.xml | 524 +-
jEdit/modes/postscript.xml | 194 +-
jEdit/modes/povray.xml | 1036 +-
jEdit/modes/powerdynamo.xml | 928 +-
jEdit/modes/progress.xml | 7496 +++++-----
jEdit/modes/prolog.xml | 390 +-
jEdit/modes/props.xml | 54 +-
jEdit/modes/psp.xml | 252 +-
jEdit/modes/ptl.xml | 64 +-
jEdit/modes/pure.xml | 215 +-
jEdit/modes/pvwave.xml | 1444 +-
jEdit/modes/pyrex.xml | 76 +-
jEdit/modes/python.xml | 796 +-
jEdit/modes/quake.xml | 970 +-
jEdit/modes/rcp.xml | 636 +-
jEdit/modes/rd.xml | 140 +-
jEdit/modes/rebol.xml | 1092 +-
jEdit/modes/redcode.xml | 252 +-
jEdit/modes/regex.xml | 121 +
jEdit/modes/relax-ng-compact.xml | 148 +-
jEdit/modes/rest.xml | 270 +-
jEdit/modes/rfc.xml | 56 +-
jEdit/modes/rhtml.xml | 216 +-
jEdit/modes/rib.xml | 438 +-
jEdit/modes/rpmspec.xml | 260 +-
jEdit/modes/rtf.xml | 40 +-
jEdit/modes/ruby.xml | 938 +-
jEdit/modes/rview.xml | 434 +-
jEdit/modes/sas.xml | 899 +-
jEdit/modes/scheme.xml | 472 +-
jEdit/modes/sdl_pr.xml | 456 +-
jEdit/modes/sgml.xml | 94 +-
jEdit/modes/shellscript.xml | 339 +-
jEdit/modes/shtml.xml | 234 +-
jEdit/modes/sip.xml | 102 +
jEdit/modes/slate.xml | 86 +-
jEdit/modes/slax.xml | 150 +
jEdit/modes/smalltalk.xml | 156 +-
jEdit/modes/smarty.xml | 531 +
jEdit/modes/smi-mib.xml | 262 +-
jEdit/modes/splus.xml | 162 +-
jEdit/modes/sql-loader.xml | 244 +-
jEdit/modes/sqr.xml | 304 +-
jEdit/modes/squidconf.xml | 454 +-
jEdit/modes/ssharp.xml | 290 +-
jEdit/modes/stata.xml | 2979 ++++
jEdit/modes/stataado.xml | 2691 ----
jEdit/modes/statado.xml | 2691 ----
jEdit/modes/svn-commit.xml | 44 +-
jEdit/modes/swig.xml | 68 +-
jEdit/modes/tcl.xml | 1370 +-
jEdit/modes/tex.xml | 214 +-
jEdit/modes/texinfo.xml | 40 +-
jEdit/modes/text.xml | 22 +-
jEdit/modes/tld.xml | 260 +
jEdit/modes/tpl.xml | 188 +-
jEdit/modes/tsp.xml | 538 +-
jEdit/modes/tsql.xml | 2038 ++--
jEdit/modes/tthtml.xml | 532 +-
jEdit/modes/turbobasic.xml | 736 +-
jEdit/modes/twiki.xml | 306 +-
jEdit/modes/typoscript.xml | 162 +-
jEdit/modes/url.xml | 166 +
jEdit/modes/uscript.xml | 320 +-
jEdit/modes/vbscript.xml | 1478 +-
jEdit/modes/velocity.xml | 230 +-
jEdit/modes/verilog.xml | 438 +-
jEdit/modes/vhdl.xml | 914 +-
jEdit/modes/visualbasic.xml | 1163 ++
jEdit/modes/xml.xml | 322 +-
jEdit/modes/xq.xml | 918 +-
jEdit/modes/xsl.xml | 894 +-
jEdit/modes/yab.xml | 636 +-
jEdit/modes/yaml.xml | 166 +-
jEdit/modes/zpt.xml | 342 +-
.../jarbundler/AppBundleProperties.java | 674 +-
jEdit/net/sourceforge/jarbundler/DocumentType.java | 376 +-
jEdit/net/sourceforge/jarbundler/HelpBook.java | 142 +-
jEdit/net/sourceforge/jarbundler/JarBundler.java | 2960 ++--
jEdit/net/sourceforge/jarbundler/JavaProperty.java | 128 +-
.../sourceforge/jarbundler/PropertyListWriter.java | 884 +-
jEdit/net/sourceforge/jarbundler/Service.java | 408 +-
jEdit/org/gjt/sp/jedit/Abbrevs.java | 1188 +-
jEdit/org/gjt/sp/jedit/AbstractOptionPane.java | 832 +-
jEdit/org/gjt/sp/jedit/ActionContext.java | 142 +-
jEdit/org/gjt/sp/jedit/ActionListHandler.java | 394 +-
jEdit/org/gjt/sp/jedit/ActionSet.java | 670 +-
jEdit/org/gjt/sp/jedit/Autosave.java | 220 +-
jEdit/org/gjt/sp/jedit/BeanShell.java | 1174 +-
jEdit/org/gjt/sp/jedit/BeanShellAction.java | 408 +-
jEdit/org/gjt/sp/jedit/BeanShellFacade.java | 662 +-
jEdit/org/gjt/sp/jedit/Buffer.java | 4473 +++---
jEdit/org/gjt/sp/jedit/BufferHistory.java | 926 +-
jEdit/org/gjt/sp/jedit/Debug.java | 304 +-
jEdit/org/gjt/sp/jedit/EBComponent.java | 112 +-
jEdit/org/gjt/sp/jedit/EBMessage.java | 198 +-
jEdit/org/gjt/sp/jedit/EBPlugin.java | 116 +-
jEdit/org/gjt/sp/jedit/EditAction.java | 449 +-
jEdit/org/gjt/sp/jedit/EditBus.java | 880 +-
jEdit/org/gjt/sp/jedit/EditPane.java | 2716 ++--
jEdit/org/gjt/sp/jedit/EditPlugin.java | 1700 ++--
jEdit/org/gjt/sp/jedit/EditServer.java | 750 +-
jEdit/org/gjt/sp/jedit/GUIUtilities.java | 4068 +++---
jEdit/org/gjt/sp/jedit/IPropertyManager.java | 78 +-
jEdit/org/gjt/sp/jedit/JARClassLoader.java | 1095 +-
.../org/gjt/sp/jedit/JEditAbstractEditAction.java | 210 +-
jEdit/org/gjt/sp/jedit/JEditActionContext.java | 362 +-
jEdit/org/gjt/sp/jedit/JEditActionSet.java | 943 +-
jEdit/org/gjt/sp/jedit/JEditBeanShellAction.java | 412 +-
jEdit/org/gjt/sp/jedit/JEditKillRing.java | 400 +-
jEdit/org/gjt/sp/jedit/JEditMode.java | 258 +-
jEdit/org/gjt/sp/jedit/JEditRegisterSaver.java | 392 +-
jEdit/org/gjt/sp/jedit/JEditRegistersListener.java | 72 +-
jEdit/org/gjt/sp/jedit/Macros.java | 2083 ++--
jEdit/org/gjt/sp/jedit/Marker.java | 238 +-
jEdit/org/gjt/sp/jedit/MiscUtilities.java | 3731 +++---
jEdit/org/gjt/sp/jedit/Mode.java | 905 +-
jEdit/org/gjt/sp/jedit/ModeCatalogHandler.java | 210 +-
jEdit/org/gjt/sp/jedit/OperatingSystem.java | 748 +-
jEdit/org/gjt/sp/jedit/OptionGroup.java | 406 +-
jEdit/org/gjt/sp/jedit/OptionPane.java | 124 +-
jEdit/org/gjt/sp/jedit/PerspectiveManager.java | 733 +-
jEdit/org/gjt/sp/jedit/PluginJAR.java | 3497 +++---
jEdit/org/gjt/sp/jedit/PropertyManager.java | 380 +-
jEdit/org/gjt/sp/jedit/RegisterSaver.java | 66 +-
jEdit/org/gjt/sp/jedit/Registers.java | 1554 ++-
jEdit/org/gjt/sp/jedit/RegistersListener.java | 62 +-
jEdit/org/gjt/sp/jedit/ServiceListHandler.java | 322 +-
jEdit/org/gjt/sp/jedit/ServiceManager.java | 754 +-
jEdit/org/gjt/sp/jedit/SettingsReloader.java | 189 +-
jEdit/org/gjt/sp/jedit/SettingsXML.java | 386 +-
jEdit/org/gjt/sp/jedit/TextUtilities.java | 2024 ++--
jEdit/org/gjt/sp/jedit/View.java | 4629 +++---
jEdit/org/gjt/sp/jedit/actions.dtd | 32 +-
jEdit/org/gjt/sp/jedit/actions.xml | 3149 +++--
jEdit/org/gjt/sp/jedit/browser.actions.xml | 445 +-
.../gjt/sp/jedit/browser/AbstractBrowserTask.java | 127 +
.../gjt/sp/jedit/browser/BrowserCommandsMenu.java | 638 +-
.../org/gjt/sp/jedit/browser/BrowserIORequest.java | 686 +-
.../org/gjt/sp/jedit/browser/BrowserListener.java | 96 +-
jEdit/org/gjt/sp/jedit/browser/BrowserView.java | 1498 +-
.../org/gjt/sp/jedit/browser/FileCellRenderer.java | 582 +-
.../sp/jedit/browser/ListDirectoryBrowserTask.java | 119 +
jEdit/org/gjt/sp/jedit/browser/VFSBrowser.java | 4232 +++---
.../sp/jedit/browser/VFSDirectoryEntryTable.java | 1327 +-
.../jedit/browser/VFSDirectoryEntryTableModel.java | 946 +-
.../gjt/sp/jedit/browser/VFSFileChooserDialog.java | 1187 +-
.../org/gjt/sp/jedit/browser/VFSFileNameField.java | 572 +-
jEdit/org/gjt/sp/jedit/browser/package.html | 2 +-
jEdit/org/gjt/sp/jedit/buffer/BufferAdapter.java | 277 +-
.../gjt/sp/jedit/buffer/BufferChangeAdapter.java | 252 +-
.../gjt/sp/jedit/buffer/BufferChangeListener.java | 536 +-
jEdit/org/gjt/sp/jedit/buffer/BufferListener.java | 300 +-
.../gjt/sp/jedit/buffer/BufferUndoListener.java | 144 +-
jEdit/org/gjt/sp/jedit/buffer/ContentManager.java | 485 +-
.../jedit/buffer/DefaultFoldHandlerProvider.java | 138 +-
.../org/gjt/sp/jedit/buffer/DummyFoldHandler.java | 112 +-
.../gjt/sp/jedit/buffer/ExplicitFoldHandler.java | 198 +-
jEdit/org/gjt/sp/jedit/buffer/FoldHandler.java | 324 +-
.../gjt/sp/jedit/buffer/FoldHandlerProvider.java | 96 +-
.../org/gjt/sp/jedit/buffer/IndentFoldHandler.java | 272 +-
jEdit/org/gjt/sp/jedit/buffer/JEditBuffer.java | 5586 ++++----
jEdit/org/gjt/sp/jedit/buffer/KillRing.java | 600 +-
jEdit/org/gjt/sp/jedit/buffer/LineManager.java | 724 +-
jEdit/org/gjt/sp/jedit/buffer/PositionManager.java | 418 +-
jEdit/org/gjt/sp/jedit/buffer/UndoManager.java | 1005 +-
jEdit/org/gjt/sp/jedit/buffer/package.html | 4 +-
.../sp/jedit/bufferio/BufferAutosaveRequest.java | 236 +-
.../org/gjt/sp/jedit/bufferio/BufferIORequest.java | 936 +-
.../gjt/sp/jedit/bufferio/BufferInsertRequest.java | 250 +-
.../gjt/sp/jedit/bufferio/BufferLoadRequest.java | 788 +-
.../gjt/sp/jedit/bufferio/BufferSaveRequest.java | 465 +-
.../gjt/sp/jedit/bufferio/MarkersSaveRequest.java | 292 +-
jEdit/org/gjt/sp/jedit/bufferset/BufferSet.java | 112 +-
.../gjt/sp/jedit/bufferset/BufferSetManager.java | 417 +-
jEdit/org/gjt/sp/jedit/catalog.dtd | 20 +-
.../gjt/sp/jedit/datatransfer/JEditDataFlavor.java | 35 +
.../gjt/sp/jedit/datatransfer/JEditRichText.java | 58 +
.../sp/jedit/datatransfer/JEditTransferable.java | 61 +
.../datatransfer/JEditTransferableService.java | 36 +
.../datatransfer/ListVFSFileTransferable.java | 93 +
.../RichJEditTextTransferableService.java | 43 +
.../jedit/datatransfer/RichTextTransferable.java | 62 +
.../datatransfer/StringTransferableService.java | 43 +
.../gjt/sp/jedit/datatransfer/TransferHandler.java | 78 +
jEdit/org/gjt/sp/jedit/dockables.dtd | 22 +-
jEdit/org/gjt/sp/jedit/dockables.xml | 52 +-
jEdit/org/gjt/sp/jedit/gui/AbbrevEditor.java | 462 +-
jEdit/org/gjt/sp/jedit/gui/AboutDialog.java | 652 +-
.../sp/jedit/gui/AbstractContextOptionPane.java | 634 +-
jEdit/org/gjt/sp/jedit/gui/ActionBar.java | 1112 +-
jEdit/org/gjt/sp/jedit/gui/AddAbbrevDialog.java | 252 +-
jEdit/org/gjt/sp/jedit/gui/AnimatedIcon.java | 272 +-
.../org/gjt/sp/jedit/gui/BeanShellErrorDialog.java | 100 +-
jEdit/org/gjt/sp/jedit/gui/BufferOptions.java | 282 +-
jEdit/org/gjt/sp/jedit/gui/BufferSwitcher.java | 239 +-
jEdit/org/gjt/sp/jedit/gui/CloseDialog.java | 522 +-
jEdit/org/gjt/sp/jedit/gui/ColorWellButton.java | 410 +-
jEdit/org/gjt/sp/jedit/gui/CompleteWord.java | 1018 +-
jEdit/org/gjt/sp/jedit/gui/CompletionPopup.java | 1002 +-
jEdit/org/gjt/sp/jedit/gui/ContextAddDialog.java | 39 +-
.../gjt/sp/jedit/gui/DefaultFocusComponent.java | 82 +-
.../org/gjt/sp/jedit/gui/DefaultInputHandler.java | 490 +-
jEdit/org/gjt/sp/jedit/gui/DockableLayout.java | 940 +-
jEdit/org/gjt/sp/jedit/gui/DockablePanel.java | 634 +-
jEdit/org/gjt/sp/jedit/gui/DockableWindow.java | 42 +-
.../gjt/sp/jedit/gui/DockableWindowContainer.java | 72 +-
.../gjt/sp/jedit/gui/DockableWindowFactory.java | 1140 +-
.../gjt/sp/jedit/gui/DockableWindowManager.java | 1500 +-
.../sp/jedit/gui/DockableWindowManagerImpl.java | 98 +-
jEdit/org/gjt/sp/jedit/gui/EditAbbrevDialog.java | 352 +-
jEdit/org/gjt/sp/jedit/gui/EnhancedButton.java | 228 +-
jEdit/org/gjt/sp/jedit/gui/EnhancedDialog.java | 344 +-
jEdit/org/gjt/sp/jedit/gui/ErrorListDialog.java | 438 +-
jEdit/org/gjt/sp/jedit/gui/ExtendedGridLayout.java | 2448 ++--
.../jedit/gui/ExtendedGridLayoutConstraints.java | 952 +-
.../org/gjt/sp/jedit/gui/FilePropertiesDialog.java | 23 +-
jEdit/org/gjt/sp/jedit/gui/FilesChangedDialog.java | 874 +-
jEdit/org/gjt/sp/jedit/gui/FilteredListModel.java | 556 +-
jEdit/org/gjt/sp/jedit/gui/FilteredTableModel.java | 596 +-
.../gjt/sp/jedit/gui/FloatingWindowContainer.java | 436 +-
jEdit/org/gjt/sp/jedit/gui/FontSelector.java | 661 +-
jEdit/org/gjt/sp/jedit/gui/FontSelectorDialog.java | 386 +
jEdit/org/gjt/sp/jedit/gui/GrabKeyDialog.java | 1110 +-
jEdit/org/gjt/sp/jedit/gui/HistoryModel.java | 404 +-
jEdit/org/gjt/sp/jedit/gui/HistoryModelSaver.java | 70 +-
jEdit/org/gjt/sp/jedit/gui/HistoryText.java | 740 +-
jEdit/org/gjt/sp/jedit/gui/HistoryTextArea.java | 402 +-
jEdit/org/gjt/sp/jedit/gui/HistoryTextField.java | 826 +-
jEdit/org/gjt/sp/jedit/gui/IOProgressMonitor.java | 434 +-
jEdit/org/gjt/sp/jedit/gui/InputHandler.java | 1056 +-
jEdit/org/gjt/sp/jedit/gui/JCheckBoxList.java | 700 +-
.../gjt/sp/jedit/gui/JEditHistoryModelSaver.java | 448 +-
jEdit/org/gjt/sp/jedit/gui/KeyEventTranslator.java | 1076 +-
jEdit/org/gjt/sp/jedit/gui/KeyEventWorkaround.java | 785 +-
jEdit/org/gjt/sp/jedit/gui/LogViewer.java | 928 +-
jEdit/org/gjt/sp/jedit/gui/MarkerViewer.java | 568 +-
jEdit/org/gjt/sp/jedit/gui/MutableListModel.java | 58 +-
jEdit/org/gjt/sp/jedit/gui/OptionsDialog.java | 1438 +-
.../org/gjt/sp/jedit/gui/PanelWindowContainer.java | 1906 ++--
.../org/gjt/sp/jedit/gui/PasteFromListDialog.java | 524 +-
jEdit/org/gjt/sp/jedit/gui/PasteSpecialDialog.java | 154 +
jEdit/org/gjt/sp/jedit/gui/PingPongList.java | 342 +
jEdit/org/gjt/sp/jedit/gui/RegisterViewer.java | 811 +-
jEdit/org/gjt/sp/jedit/gui/RolloverButton.java | 310 +-
jEdit/org/gjt/sp/jedit/gui/SelectLineRange.java | 368 +-
.../sp/jedit/gui/ShortcutPrefixActiveEvent.java | 288 +-
jEdit/org/gjt/sp/jedit/gui/SplashScreen.java | 418 +-
jEdit/org/gjt/sp/jedit/gui/StatusBar.java | 986 +-
jEdit/org/gjt/sp/jedit/gui/StyleEditor.java | 417 +-
jEdit/org/gjt/sp/jedit/gui/TaskMonitor.java | 278 +
jEdit/org/gjt/sp/jedit/gui/TextAreaDialog.java | 268 +-
jEdit/org/gjt/sp/jedit/gui/TipOfTheDay.java | 334 +-
jEdit/org/gjt/sp/jedit/gui/ToolBarManager.java | 244 +-
jEdit/org/gjt/sp/jedit/gui/VariableGridLayout.java | 1286 +-
jEdit/org/gjt/sp/jedit/gui/package.html | 2 +-
.../gui/statusbar/BufferSetWidgetFactory.java | 315 +-
.../sp/jedit/gui/statusbar/ClockWidgetFactory.java | 306 +-
.../jedit/gui/statusbar/EncodingWidgetFactory.java | 178 +-
.../sp/jedit/gui/statusbar/FoldWidgetFactory.java | 178 +-
.../jedit/gui/statusbar/LineSepWidgetFactory.java | 230 +-
.../gui/statusbar/MemoryStatusWidgetFactory.java | 502 +-
.../sp/jedit/gui/statusbar/ModeWidgetFactory.java | 180 +-
.../gui/statusbar/MultiSelectWidgetFactory.java | 219 +-
.../gui/statusbar/OverwriteWidgetFactory.java | 230 +-
.../gui/statusbar/RectSelectWidgetFactory.java | 222 +-
.../statusbar/SelectionLengthWidgetFactory.java | 23 +-
.../jedit/gui/statusbar/StatusWidgetFactory.java | 82 +-
.../gjt/sp/jedit/gui/statusbar/ToolTipLabel.java | 82 +-
jEdit/org/gjt/sp/jedit/gui/statusbar/Widget.java | 94 +-
.../sp/jedit/gui/statusbar/WrapWidgetFactory.java | 223 +-
jEdit/org/gjt/sp/jedit/help/HelpHistoryModel.java | 494 +-
.../sp/jedit/help/HelpHistoryModelListener.java | 66 +-
jEdit/org/gjt/sp/jedit/help/HelpIndex.java | 788 +-
jEdit/org/gjt/sp/jedit/help/HelpSearchPanel.java | 598 +-
jEdit/org/gjt/sp/jedit/help/HelpTOCPanel.java | 972 +-
jEdit/org/gjt/sp/jedit/help/HelpViewer.java | 1120 +-
.../org/gjt/sp/jedit/help/HelpViewerInterface.java | 80 +-
jEdit/org/gjt/sp/jedit/help/HistoryButton.java | 364 +-
jEdit/org/gjt/sp/jedit/help/package.html | 16 +-
.../org/gjt/sp/jedit/indent/BracketIndentRule.java | 418 +-
.../sp/jedit/indent/CloseBracketIndentRule.java | 358 +-
jEdit/org/gjt/sp/jedit/indent/DeepIndentRule.java | 462 +-
jEdit/org/gjt/sp/jedit/indent/IndentAction.java | 444 +-
jEdit/org/gjt/sp/jedit/indent/IndentRule.java | 98 +-
.../org/gjt/sp/jedit/indent/IndentRuleFactory.java | 180 +-
.../gjt/sp/jedit/indent/OpenBracketIndentRule.java | 182 +-
.../org/gjt/sp/jedit/indent/RegexpIndentRule.java | 350 +-
jEdit/org/gjt/sp/jedit/indent/WhitespaceRule.java | 160 +-
.../gjt/sp/jedit/input/AbstractInputHandler.java | 852 +-
.../jedit/input/DefaultInputHandlerProvider.java | 86 +-
.../gjt/sp/jedit/input/InputHandlerProvider.java | 62 +-
.../gjt/sp/jedit/input/TextAreaInputHandler.java | 764 +-
jEdit/org/gjt/sp/jedit/io/AutoDetection.java | 454 +-
jEdit/org/gjt/sp/jedit/io/CharsetEncoding.java | 162 +-
jEdit/org/gjt/sp/jedit/io/CopyFileWorker.java | 161 +-
jEdit/org/gjt/sp/jedit/io/Encoding.java | 128 +-
jEdit/org/gjt/sp/jedit/io/EncodingDetector.java | 90 +-
jEdit/org/gjt/sp/jedit/io/EncodingServer.java | 328 +-
jEdit/org/gjt/sp/jedit/io/EncodingWithBOM.java | 364 +-
jEdit/org/gjt/sp/jedit/io/FavoritesVFS.java | 416 +-
jEdit/org/gjt/sp/jedit/io/FileRootsVFS.java | 346 +-
jEdit/org/gjt/sp/jedit/io/FileVFS.java | 1375 +-
jEdit/org/gjt/sp/jedit/io/GlobVFSFileFilter.java | 186 +-
.../org/gjt/sp/jedit/io/RegexEncodingDetector.java | 210 +-
jEdit/org/gjt/sp/jedit/io/UrlVFS.java | 178 +-
jEdit/org/gjt/sp/jedit/io/VFS.java | 2419 ++--
jEdit/org/gjt/sp/jedit/io/VFSFile.java | 1024 +-
jEdit/org/gjt/sp/jedit/io/VFSFileFilter.java | 114 +-
jEdit/org/gjt/sp/jedit/io/VFSManager.java | 946 +-
jEdit/org/gjt/sp/jedit/io/XMLEncodingDetector.java | 202 +-
jEdit/org/gjt/sp/jedit/io/package.html | 2 +-
jEdit/org/gjt/sp/jedit/jEdit.java | 8760 ++++++------
jEdit/org/gjt/sp/jedit/jedit.manifest | 2 +-
jEdit/org/gjt/sp/jedit/jedit.props | 955 +-
jEdit/org/gjt/sp/jedit/jedit_gui.props | 5248 ++++----
jEdit/org/gjt/sp/jedit/jedit_keys.props | 468 +-
jEdit/org/gjt/sp/jedit/killring.dtd | 10 +-
jEdit/org/gjt/sp/jedit/menu/DirectoryProvider.java | 354 +-
.../org/gjt/sp/jedit/menu/DynamicMenuProvider.java | 104 +-
.../sp/jedit/menu/EnhancedCheckBoxMenuItem.java | 380 +-
jEdit/org/gjt/sp/jedit/menu/EnhancedMenu.java | 377 +-
jEdit/org/gjt/sp/jedit/menu/EnhancedMenuItem.java | 391 +-
jEdit/org/gjt/sp/jedit/menu/FavoritesProvider.java | 204 +-
jEdit/org/gjt/sp/jedit/menu/MacrosProvider.java | 178 +-
jEdit/org/gjt/sp/jedit/menu/MarkersProvider.java | 368 +-
jEdit/org/gjt/sp/jedit/menu/PluginsProvider.java | 378 +-
.../sp/jedit/menu/RecentDirectoriesProvider.java | 274 +-
.../org/gjt/sp/jedit/menu/RecentFilesProvider.java | 403 +-
.../sp/jedit/menu/ReloadWithEncodingProvider.java | 318 +-
jEdit/org/gjt/sp/jedit/msg/BufferChanging.java | 132 +-
jEdit/org/gjt/sp/jedit/msg/BufferUpdate.java | 294 +-
.../org/gjt/sp/jedit/msg/DockableWindowUpdate.java | 216 +-
jEdit/org/gjt/sp/jedit/msg/DynamicMenuChanged.java | 138 +-
jEdit/org/gjt/sp/jedit/msg/EditPaneUpdate.java | 202 +-
.../org/gjt/sp/jedit/msg/EditorExitRequested.java | 148 +-
jEdit/org/gjt/sp/jedit/msg/EditorExiting.java | 84 +-
jEdit/org/gjt/sp/jedit/msg/EditorStarted.java | 88 +-
jEdit/org/gjt/sp/jedit/msg/PluginUpdate.java | 269 +-
jEdit/org/gjt/sp/jedit/msg/PositionChanging.java | 90 +-
jEdit/org/gjt/sp/jedit/msg/PropertiesChanged.java | 95 +-
jEdit/org/gjt/sp/jedit/msg/PropertiesChanging.java | 124 +-
jEdit/org/gjt/sp/jedit/msg/RegisterChanged.java | 122 +-
.../gjt/sp/jedit/msg/SearchSettingsChanged.java | 84 +-
jEdit/org/gjt/sp/jedit/msg/VFSPathSelected.java | 98 +-
jEdit/org/gjt/sp/jedit/msg/VFSUpdate.java | 124 +-
jEdit/org/gjt/sp/jedit/msg/ViewUpdate.java | 202 +-
jEdit/org/gjt/sp/jedit/msg/package.html | 2 +-
.../gjt/sp/jedit/options/AbbrevsOptionPane.java | 1014 +-
.../gjt/sp/jedit/options/AppearanceOptionPane.java | 583 +-
.../sp/jedit/options/BrowserColorsOptionPane.java | 814 +-
.../gjt/sp/jedit/options/BrowserOptionPane.java | 340 +-
.../org/gjt/sp/jedit/options/BufferOptionPane.java | 676 +-
.../gjt/sp/jedit/options/ContextOptionPane.java | 123 +-
.../gjt/sp/jedit/options/DockingOptionPane.java | 774 +-
.../gjt/sp/jedit/options/EditingOptionPane.java | 896 +-
.../gjt/sp/jedit/options/EncodingsOptionPane.java | 429 +-
.../gjt/sp/jedit/options/FirewallOptionPane.java | 262 +-
.../gjt/sp/jedit/options/GeneralOptionPane.java | 520 +-
jEdit/org/gjt/sp/jedit/options/GlobalOptions.java | 244 +-
.../org/gjt/sp/jedit/options/GutterOptionPane.java | 824 +-
jEdit/org/gjt/sp/jedit/options/IconTheme.java | 52 +-
.../org/gjt/sp/jedit/options/MouseOptionPane.java | 306 +-
.../sp/jedit/options/PluginManagerOptionPane.java | 771 +-
jEdit/org/gjt/sp/jedit/options/PluginOptions.java | 290 +-
.../org/gjt/sp/jedit/options/PrintOptionPane.java | 248 +-
.../gjt/sp/jedit/options/SaveBackupOptionPane.java | 380 +-
.../gjt/sp/jedit/options/ShortcutsOptionPane.java | 934 +-
.../gjt/sp/jedit/options/StatusBarOptionPane.java | 1016 +-
.../sp/jedit/options/SyntaxHiliteOptionPane.java | 610 +-
.../gjt/sp/jedit/options/TextAreaOptionPane.java | 701 +-
.../gjt/sp/jedit/options/ToolBarOptionPane.java | 1539 +-
jEdit/org/gjt/sp/jedit/options/ViewOptionPane.java | 531 +-
jEdit/org/gjt/sp/jedit/options/mirrors.dtd | 30 +-
jEdit/org/gjt/sp/jedit/options/package.html | 2 +-
jEdit/org/gjt/sp/jedit/package.html | 62 +-
jEdit/org/gjt/sp/jedit/perspective.dtd | 78 +-
jEdit/org/gjt/sp/jedit/pluginmgr/InstallPanel.java | 2310 ++--
.../gjt/sp/jedit/pluginmgr/KeyboardCommand.java | 31 +
jEdit/org/gjt/sp/jedit/pluginmgr/ManagePanel.java | 2678 ++--
jEdit/org/gjt/sp/jedit/pluginmgr/MirrorList.java | 395 +-
.../gjt/sp/jedit/pluginmgr/MirrorListHandler.java | 310 +-
.../gjt/sp/jedit/pluginmgr/PluginDetailPanel.java | 194 +-
jEdit/org/gjt/sp/jedit/pluginmgr/PluginList.java | 1136 +-
.../gjt/sp/jedit/pluginmgr/PluginListHandler.java | 554 +-
.../org/gjt/sp/jedit/pluginmgr/PluginManager.java | 685 +-
.../sp/jedit/pluginmgr/PluginManagerProgress.java | 472 +-
jEdit/org/gjt/sp/jedit/pluginmgr/Roster.java | 966 +-
jEdit/org/gjt/sp/jedit/pluginmgr/package.html | 2 +-
jEdit/org/gjt/sp/jedit/pluginmgr/plugins.dtd | 80 +-
jEdit/org/gjt/sp/jedit/print/BufferPrintable.java | 834 +-
jEdit/org/gjt/sp/jedit/print/BufferPrinter1_3.java | 226 +-
jEdit/org/gjt/sp/jedit/print/BufferPrinter1_4.java | 388 +-
jEdit/org/gjt/sp/jedit/print/package.html | 2 +-
.../gjt/sp/jedit/proto/jeditresource/Handler.java | 98 +-
.../jeditresource/PluginResURLConnection.java | 260 +-
.../gjt/sp/jedit/proto/jeditresource/package.html | 8 +-
jEdit/org/gjt/sp/jedit/recent.dtd | 24 +-
jEdit/org/gjt/sp/jedit/registers.dtd | 12 +-
jEdit/org/gjt/sp/jedit/search/AllBufferSet.java | 214 +-
.../sp/jedit/search/BoyerMooreSearchMatcher.java | 615 +-
jEdit/org/gjt/sp/jedit/search/BufferListSet.java | 284 +-
.../org/gjt/sp/jedit/search/CurrentBufferSet.java | 132 +-
.../org/gjt/sp/jedit/search/DirectoryListSet.java | 348 +-
.../gjt/sp/jedit/search/HyperSearchFileNode.java | 224 +-
.../gjt/sp/jedit/search/HyperSearchFolderNode.java | 112 +-
jEdit/org/gjt/sp/jedit/search/HyperSearchNode.java | 74 +-
.../sp/jedit/search/HyperSearchOperationNode.java | 472 +-
.../gjt/sp/jedit/search/HyperSearchRequest.java | 601 +-
.../org/gjt/sp/jedit/search/HyperSearchResult.java | 483 +-
.../gjt/sp/jedit/search/HyperSearchResults.java | 2224 ++--
.../jedit/search/HyperSearchTreeNodeCallback.java | 68 +-
.../gjt/sp/jedit/search/PatternSearchMatcher.java | 472 +-
.../org/gjt/sp/jedit/search/SearchAndReplace.java | 2782 ++--
jEdit/org/gjt/sp/jedit/search/SearchBar.java | 948 +-
jEdit/org/gjt/sp/jedit/search/SearchDialog.java | 2166 ++--
jEdit/org/gjt/sp/jedit/search/SearchFileSet.java | 118 +-
jEdit/org/gjt/sp/jedit/search/SearchMatcher.java | 127 +-
jEdit/org/gjt/sp/jedit/search/package.html | 2 +-
jEdit/org/gjt/sp/jedit/services.dtd | 16 +-
jEdit/org/gjt/sp/jedit/services.xml | 305 +-
jEdit/org/gjt/sp/jedit/syntax/Chunk.java | 961 +-
.../gjt/sp/jedit/syntax/DefaultTokenHandler.java | 280 +-
.../gjt/sp/jedit/syntax/DisplayTokenHandler.java | 494 +-
.../org/gjt/sp/jedit/syntax/DummyTokenHandler.java | 136 +-
jEdit/org/gjt/sp/jedit/syntax/KeywordMap.java | 494 +-
jEdit/org/gjt/sp/jedit/syntax/ModeProvider.java | 495 +-
jEdit/org/gjt/sp/jedit/syntax/ParserRule.java | 811 +-
jEdit/org/gjt/sp/jedit/syntax/ParserRuleSet.java | 794 +-
jEdit/org/gjt/sp/jedit/syntax/SyntaxStyle.java | 162 +-
jEdit/org/gjt/sp/jedit/syntax/SyntaxUtilities.java | 130 +-
jEdit/org/gjt/sp/jedit/syntax/Token.java | 328 +-
jEdit/org/gjt/sp/jedit/syntax/TokenHandler.java | 116 +-
jEdit/org/gjt/sp/jedit/syntax/TokenMarker.java | 1909 ++--
jEdit/org/gjt/sp/jedit/syntax/XModeHandler.java | 1532 +-
jEdit/org/gjt/sp/jedit/syntax/package.html | 26 +-
jEdit/org/gjt/sp/jedit/syntax/xmode.dtd | 332 +-
jEdit/org/gjt/sp/jedit/textarea/Anchor.java | 310 +-
jEdit/org/gjt/sp/jedit/textarea/AntiAlias.java | 178 +-
jEdit/org/gjt/sp/jedit/textarea/BufferHandler.java | 914 +-
jEdit/org/gjt/sp/jedit/textarea/ChunkCache.java | 1664 ++--
.../org/gjt/sp/jedit/textarea/DisplayManager.java | 1736 ++--
.../gjt/sp/jedit/textarea/ExtensionManager.java | 372 +-
jEdit/org/gjt/sp/jedit/textarea/FirstLine.java | 728 +-
jEdit/org/gjt/sp/jedit/textarea/FoldPainter.java | 6 +-
jEdit/org/gjt/sp/jedit/textarea/Gutter.java | 2265 ++--
.../gjt/sp/jedit/textarea/InputMethodSupport.java | 580 +-
jEdit/org/gjt/sp/jedit/textarea/JEditTextArea.java | 1284 +-
jEdit/org/gjt/sp/jedit/textarea/MouseActions.java | 116 +-
.../sp/jedit/textarea/MouseActionsProvider.java | 66 +-
jEdit/org/gjt/sp/jedit/textarea/MouseHandler.java | 354 +-
jEdit/org/gjt/sp/jedit/textarea/RangeMap.java | 972 +-
.../gjt/sp/jedit/textarea/ScreenLineManager.java | 298 +-
jEdit/org/gjt/sp/jedit/textarea/ScrollLayout.java | 406 +-
.../org/gjt/sp/jedit/textarea/ScrollLineCount.java | 126 +-
.../org/gjt/sp/jedit/textarea/ScrollListener.java | 66 +-
jEdit/org/gjt/sp/jedit/textarea/Selection.java | 1530 +-
.../gjt/sp/jedit/textarea/SelectionManager.java | 860 +-
.../gjt/sp/jedit/textarea/ShapedFoldPainter.java | 6 +-
.../gjt/sp/jedit/textarea/StandaloneTextArea.java | 37 +-
.../org/gjt/sp/jedit/textarea/StatusListener.java | 80 +-
.../gjt/sp/jedit/textarea/StructureMatcher.java | 478 +-
jEdit/org/gjt/sp/jedit/textarea/TextArea.java |12698 +++++++++---------
.../org/gjt/sp/jedit/textarea/TextAreaBorder.java | 112 +-
.../gjt/sp/jedit/textarea/TextAreaDropHandler.java | 197 +-
.../gjt/sp/jedit/textarea/TextAreaException.java | 74 +-
.../gjt/sp/jedit/textarea/TextAreaExtension.java | 258 +-
.../sp/jedit/textarea/TextAreaMouseHandler.java | 1200 +-
.../org/gjt/sp/jedit/textarea/TextAreaPainter.java | 2758 ++--
.../sp/jedit/textarea/TextAreaTransferHandler.java | 969 +-
.../gjt/sp/jedit/textarea/TriangleFoldPainter.java | 4 +-
jEdit/org/gjt/sp/jedit/textarea/package.html | 58 +-
.../org/gjt/sp/jedit/textarea/textarea.actions.xml | 18 +
jEdit/org/gjt/sp/jedit/visitors/JEditVisitor.java | 120 +-
.../gjt/sp/jedit/visitors/JEditVisitorAdapter.java | 124 +-
.../sp/jedit/visitors/SaveCaretInfoVisitor.java | 76 +-
jEdit/org/gjt/sp/util/HtmlUtilities.java | 192 +
jEdit/org/gjt/sp/util/IOUtilities.java | 583 +-
jEdit/org/gjt/sp/util/IntegerArray.java | 178 +-
jEdit/org/gjt/sp/util/Log.java | 1252 +-
jEdit/org/gjt/sp/util/ProgressObserver.java | 114 +-
jEdit/org/gjt/sp/util/PropertiesBean.java | 564 +-
jEdit/org/gjt/sp/util/ReadWriteLock.java | 193 +-
jEdit/org/gjt/sp/util/ReverseCharSequence.java | 134 +-
jEdit/org/gjt/sp/util/SegmentBuffer.java | 140 +-
jEdit/org/gjt/sp/util/SegmentCharSequence.java | 178 +-
jEdit/org/gjt/sp/util/StandardUtilities.java | 1464 +-
jEdit/org/gjt/sp/util/StringList.java | 314 +-
jEdit/org/gjt/sp/util/SyntaxUtilities.java | 460 +-
jEdit/org/gjt/sp/util/Task.java | 154 +
jEdit/org/gjt/sp/util/TaskListener.java | 38 +
jEdit/org/gjt/sp/util/TaskManager.java | 167 +
jEdit/org/gjt/sp/util/ThreadAbortMonitor.java | 62 +-
jEdit/org/gjt/sp/util/ThreadUtilities.java | 177 +
jEdit/org/gjt/sp/util/WorkRequest.java | 267 +-
jEdit/org/gjt/sp/util/WorkThread.java | 489 +-
jEdit/org/gjt/sp/util/WorkThreadPool.java | 972 +-
.../gjt/sp/util/WorkThreadProgressListener.java | 70 +-
jEdit/org/gjt/sp/util/XMLUtilities.java | 404 +-
jEdit/org/gjt/sp/util/package.html | 4 +-
jEdit/package-files/linux/deb/control | 19 +-
jEdit/package-files/linux/deb/jedit.desktop | 1 +
jEdit/package-files/linux/jedit | 2 +-
jEdit/package-files/linux/jedit.1 | 4 +-
jEdit/package-files/linux/rpm/jedit.spec | 3 -
jEdit/package-files/os2/jedit.cmd | 144 +-
jEdit/package-files/windows/jEdit.url | 3 +
jEdit/package-files/windows/jedit.bat | 2 -
jEdit/package-files/windows/jedit.l4j.ini | 1 +
jEdit/package-files/windows/jedit.launch4j.xml | 35 +
jEdit/package-files/windows/win32installer.iss | 619 +-
jEdit/properties/README.txt | 14 +-
jEdit/startup/README.txt | 14 +-
jEdit/startup/startup.bsh | 268 +-
941 files changed, 250387 insertions(+), 250037 deletions(-)
diff --git a/build-support/README.txt b/build-support/README.txt
index 858a83e..eec6224 100644
--- a/build-support/README.txt
+++ b/build-support/README.txt
@@ -1,6 +1,6 @@
-This directory contains common ant build tasks for
-building plugins.
-
-eclipse-formatting.xml is a java formatting file which you can import into
-Eclipse to make your Java code confirm to Slava's style.
-
+This directory contains common ant build tasks for
+building plugins.
+
+eclipse-formatting.xml is a java formatting file which you can import into
+Eclipse to make your Java code confirm to Slava's style.
+
diff --git a/build-support/build.properties.sample b/build-support/build.properties.sample
index 8b02124..034156b 100644
--- a/build-support/build.properties.sample
+++ b/build-support/build.properties.sample
@@ -1,170 +1,170 @@
-# Default properties for plugin-build.xml
-# Uncomment properties and set to desired values.
-# Save to a file named build.properties in one of these locations:
-# - The plugin's main directory (e.g., "plugins/XML/build.properties")
-# - The plugin's parent directory (e.g., "plugins/build.properties")
-# - Your home directory (with or without a leading dot)
-
-
-# jEdit & plugins directory settings
-
-# jEdit install directory
-#jedit.install.dir=../../jEdit
-
-# location where your jars are installed
-#install.dir=${jedit.install.dir}/jars
-
-# Location where the plugins are. This property used when defining dependencies on other plugins.
-# Eg. In your plugin's classpath.
-# <path id="project.class.path">
-# <pathelement location="${jedit.plugins.dir}/ErrorList.jar" />
-# </path>
-#jedit.plugins.dir=${install.dir}
-
-# Location to find built jars (for dependencies)
-#jedit.jars.dir=${install.dir}
-
-# User settings directory
-#jedit.user.home=${user.home}/.jedit
-
-# Top-level of the plugins source tree
-#plugins.srcdir=..
-
-
-# Generic plugin build options
-
-# Where the plugin source is located
-#src.dir=.
-
-# The name of the JAR file
-#jar.file=${ant.project.name}.jar
-
-# The name of the source ZIP file
-#src.zip.file=${ant.project.name}.zip
-
-# The target run when running dist
-#dist.target=dist.nojavadoc
-
-# Where to put temporary build files
-#build.dir=build
-
-# Where to put compiled classes
-#build.classes=${build.dir}/classes
-
-# Where to put generated documentation
-#build.docs=${build.dir}/docs
-
-# Where to put generated javadoc
-#build.javadoc=${build.docs}/javadoc
-
-# Where to put other files
-#build.extras=${build.dir}/extras
-
-# Default compiler flags
-
-# Generate debugging code
-#compiler.debug=off
-#compiler.debuglevel=lines,vars,source
-
-# Generate optimized code
-#compiler.optimize=off
-
-# Deprecation warnings.
-#compiler.deprecation=off
-
-# Verbose compiler messages
-#compiler.verbose=off
-
-# Disable compiler warnings
-#compiler.nowarn=off
-
-# Target JVM version
-#compiler.target=1.4
-
-# Java version of the source files
-#compiler.source=1.4
-
-# List files being compiled
-#compiler.listfiles=no
-
-# Fork the javac compiler
-#compiler.fork=no
-
-# Location for rt.jar and ext dir. By default, these are set to the
-# appropriate value for the running jvm. These are necessary, for example,
-# when compiling a Java 1.5 compatible plugin while running Java 1.6.
-#compiler.bootclasspath=${java.home}/lib/rt.jar
-#compiler.extdirs=${java.ext.dirs}
-
-
-# Documentation build options
-
-# What target to use for the docs
-#docs-proc.target=xsltproc
-
-# Stylesheet file to use
-#user-doc.xsl=${build.support}/users-guide.xsl
-
-# Documentation docbook source
-#user-doc.xml=${basedir}/docs/users-guide.xml
-
-# Documentation output file
-#user-doc.out=${build.docs}/index.html
-
-# Title for javadoc documentation
-#javadoc.title=${ant.project.name} API
-
-# If xsltproc is in your path, uncomment this:
-#xsltproc.executable=xsltproc
-
-# You can specify the absolute path of the win32 or cygwin binary
-# (from the "libxslt" package) of xsltproc here:
-#xsltproc.executable=C:/ppApps/xsltproc/xsltproc.exe
-
-### For generating the docs, adjust the following to your local paths
-### For xsltproc to work, the path to the DocBook stuff MUST NOT contain spaces!
-
-# cygwin "docbook-xml44" and "docbook-xsl" packages
-# can be used to install docbook-xml and docbook-dtd
-# (example windows locations):
-#docbook.catalog=c:/cygwin/usr/share/xml/docbook/4.4/docbook.cat
-#docbook.xsl=c:/cygwin/usr/share/docbook-xsl
-
-# Debian location
-#docbook.xsl=/usr/share/xml/docbook/stylesheet/nwalsh
-#docbook.catalog=/usr/share/xml/docbook/schema/dtd/4.4/docbook.cat
-
-# Fink (Mac OS/X) location
-#docbook.catalog=/sw/share/xml/dtd/docbookx/4.4.0/docbook.cat
-#docbook.xsl=/sw/share/xml/xsl/docbook-xsl
-
-# The name of the xsl stylesheet (without the path info)
-#docbook.xsl.sheet=html/chunk.xsl
-
-# The path to the style sheet to use.
-#docs.style.sheet=${docbook.xsl}/${docbook.xsl.sheet}
-
-# The path to the xsltproc executable
-#xsltproc.executable=C:\\Programme\\xsltproc\\xsltproc.exe
-
-# JUnit options
-
-# Where to find jUnit
-#junit.jar=junit.jar
-
-# The name of the jUnit Testcase
-#junit.testcase=${ant.project.name}TestSuite
-
-# Whether to print a summary
-#junit.printsummary=on
-
-# Whether to halt if an error occurs
-#junit.haltonfailure=off
-
-# Ant Contrib
-
-# Where to find the ant-contrib jar.
-#ant-contrib.jar=ant-contrib-1.0b1.jar
-
-# Where to find the findbugs lib dir.
-#findbugs.lib.dir=<findbugs-install-dir>/lib
+# Default properties for plugin-build.xml
+# Uncomment properties and set to desired values.
+# Save to a file named build.properties in one of these locations:
+# - The plugin's main directory (e.g., "plugins/XML/build.properties")
+# - The plugin's parent directory (e.g., "plugins/build.properties")
+# - Your home directory (with or without a leading dot)
+
+
+# jEdit & plugins directory settings
+
+# jEdit install directory
+#jedit.install.dir=../../jEdit
+
+# location where your jars are installed
+#install.dir=${jedit.install.dir}/jars
+
+# Location where the plugins are. This property used when defining dependencies on other plugins.
+# Eg. In your plugin's classpath.
+# <path id="project.class.path">
+# <pathelement location="${jedit.plugins.dir}/ErrorList.jar" />
+# </path>
+#jedit.plugins.dir=${install.dir}
+
+# Location to find built jars (for dependencies)
+#jedit.jars.dir=${install.dir}
+
+# User settings directory
+#jedit.user.home=${user.home}/.jedit
+
+# Top-level of the plugins source tree
+#plugins.srcdir=..
+
+
+# Generic plugin build options
+
+# Where the plugin source is located
+#src.dir=.
+
+# The name of the JAR file
+#jar.file=${ant.project.name}.jar
+
+# The name of the source ZIP file
+#src.zip.file=${ant.project.name}.zip
+
+# The target run when running dist
+#dist.target=dist.nojavadoc
+
+# Where to put temporary build files
+#build.dir=build
+
+# Where to put compiled classes
+#build.classes=${build.dir}/classes
+
+# Where to put generated documentation
+#build.docs=${build.dir}/docs
+
+# Where to put generated javadoc
+#build.javadoc=${build.docs}/javadoc
+
+# Where to put other files
+#build.extras=${build.dir}/extras
+
+# Default compiler flags
+
+# Generate debugging code
+#compiler.debug=off
+#compiler.debuglevel=lines,vars,source
+
+# Generate optimized code
+#compiler.optimize=off
+
+# Deprecation warnings.
+#compiler.deprecation=off
+
+# Verbose compiler messages
+#compiler.verbose=off
+
+# Disable compiler warnings
+#compiler.nowarn=off
+
+# Target JVM version
+#compiler.target=1.4
+
+# Java version of the source files
+#compiler.source=1.4
+
+# List files being compiled
+#compiler.listfiles=no
+
+# Fork the javac compiler
+#compiler.fork=no
+
+# Location for rt.jar and ext dir. By default, these are set to the
+# appropriate value for the running jvm. These are necessary, for example,
+# when compiling a Java 1.5 compatible plugin while running Java 1.6.
+#compiler.bootclasspath=${java.home}/lib/rt.jar
+#compiler.extdirs=${java.ext.dirs}
+
+
+# Documentation build options
+
+# What target to use for the docs
+#docs-proc.target=xsltproc
+
+# Stylesheet file to use
+#user-doc.xsl=${build.support}/users-guide.xsl
+
+# Documentation docbook source
+#user-doc.xml=${basedir}/docs/users-guide.xml
+
+# Documentation output file
+#user-doc.out=${build.docs}/index.html
+
+# Title for javadoc documentation
+#javadoc.title=${ant.project.name} API
+
+# If xsltproc is in your path, uncomment this:
+#xsltproc.executable=xsltproc
+
+# You can specify the absolute path of the win32 or cygwin binary
+# (from the "libxslt" package) of xsltproc here:
+#xsltproc.executable=C:/ppApps/xsltproc/xsltproc.exe
+
+### For generating the docs, adjust the following to your local paths
+### For xsltproc to work, the path to the DocBook stuff MUST NOT contain spaces!
+
+# cygwin "docbook-xml44" and "docbook-xsl" packages
+# can be used to install docbook-xml and docbook-dtd
+# (example windows locations):
+#docbook.catalog=c:/cygwin/usr/share/xml/docbook/4.4/docbook.cat
+#docbook.xsl=c:/cygwin/usr/share/docbook-xsl
+
+# Debian location
+#docbook.xsl=/usr/share/xml/docbook/stylesheet/nwalsh
+#docbook.catalog=/usr/share/xml/docbook/schema/dtd/4.4/docbook.cat
+
+# Fink (Mac OS/X) location
+#docbook.catalog=/sw/share/xml/dtd/docbookx/4.4.0/docbook.cat
+#docbook.xsl=/sw/share/xml/xsl/docbook-xsl
+
+# The name of the xsl stylesheet (without the path info)
+#docbook.xsl.sheet=html/chunk.xsl
+
+# The path to the style sheet to use.
+#docs.style.sheet=${docbook.xsl}/${docbook.xsl.sheet}
+
+# The path to the xsltproc executable
+#xsltproc.executable=C:\\Programme\\xsltproc\\xsltproc.exe
+
+# JUnit options
+
+# Where to find jUnit
+#junit.jar=junit.jar
+
+# The name of the jUnit Testcase
+#junit.testcase=${ant.project.name}TestSuite
+
+# Whether to print a summary
+#junit.printsummary=on
+
+# Whether to halt if an error occurs
+#junit.haltonfailure=off
+
+# Ant Contrib
+
+# Where to find the ant-contrib jar.
+#ant-contrib.jar=ant-contrib-1.0b1.jar
+
+# Where to find the findbugs lib dir.
+#findbugs.lib.dir=<findbugs-install-dir>/lib
diff --git a/build-support/ci/ci_release.groovy b/build-support/ci/ci_release.groovy
new file mode 100644
index 0000000..75f5914
--- /dev/null
+++ b/build-support/ci/ci_release.groovy
@@ -0,0 +1,97 @@
+#!/usr/bin/env groovy
+
+/**
+ * The Command class makes it easy to create a command line command and execute it.
+ */
+class Command {
+ String name
+ Map options
+ File directory
+
+ Map execute() {
+ run(toParts())
+ }
+
+ protected Map run(List<String> commandParts) {
+ println "Executing: ${commandParts}"
+ def out = new StringBuffer()
+ def err = new StringBuffer()
+ def p = null;
+ long start = System.nanoTime()
+ try {
+ def pb = new ProcessBuilder()
+ pb.command(commandParts.toArray() as String[])
+ pb.directory(directory)
+ p = pb.start()
+ } catch (Exception e) {
+ StringWriter writer = new StringWriter()
+ e.printStackTrace(new PrintWriter(writer))
+ err.append(writer.toString())
+ }
+ p?.waitForProcessOutput(out, err)
+ long end = System.nanoTime()
+ long runtime = end - start
+ def output = [value: p?.exitValue(), out: out.toString(), err: err.toString()]
+ output.execution = [start: start, end: end, runtime: runtime]
+ return output
+ }
+
+ List<String> toParts() {
+ def parts = [name] + options.collect {
+ if(it.value) {
+ if(it.value instanceof Collection) {
+ [it.key, it.value.flatten()]
+ } else {
+ [it.key, it.value]
+ }
+ } else {
+ [it.key]
+ }
+ }
+ parts.flatten()
+ }
+
+ String toString() {
+ return toParts().join(" ")
+ }
+}
+
+
+def props = System.properties
+def env = System.env
+
+String baseUrl = "https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit"
+
+String workspace = props.get("user.dir")
+
+// Delete tag if it already exists
+String tagUrl = "${baseUrl}/branches/ci_release_test/${env.release_tag_name}"
+def command = new Command(name: "svn", options: [
+ "delete": tagUrl,
+ "-m": '"Tag deleted by Hudson CI to be recreated."'
+])
+def output = command.execute()
+// we ignore the output. The tag will be created regardless.
+
+// Create tag
+command = new Command(name: "svn", options: [
+ "copy": ["${baseUrl}/${env.release_branch}", "${tagUrl}"],
+ "-m": "\"Tag created by Hudson CI - Version: ${env.release_version}\""
+])
+output = command.execute()
+
+if(output.value != 0) {
+ println " code: ${output.value}"
+ println " err: ${output.err}"
+ println " out: ${output.out}"
+ System.exit(output.value)
+}
+
+// checkout the new tag.
+command = new Command(name: "svn", options: [
+ "co": [tagUrl, "jedit"]
+])
+output = command.execute()
+if(output.value == 0) {
+ println "Tag checked out into 'jedit' directory"
+}
diff --git a/build-support/ci/copy_properties.groovy b/build-support/ci/copy_properties.groovy
new file mode 100644
index 0000000..93c5bc9
--- /dev/null
+++ b/build-support/ci/copy_properties.groovy
@@ -0,0 +1,53 @@
+#!/usr/bin/env groovy
+/* This script copies properties provided as System properties in Hudson into actual properties files used by jEdit's
+ * Build process.
+ */
+
+def props = System.properties
+def env = System.env
+
+String workspace = props.get("user.dir")
+String storeComment = "## THIS FILE IS GENERATED BASED ON SYSTEM PROPERTIES SUPPLIED TO HUDSON, AND IS USUALLY REPLACED ON EACH BUILD."
+
+println "Copying properties over to appropriate directories"
+def coreProps = new Properties()
+def pluginProps = new Properties()
+props.each { key, value ->
+ if(key.startsWith("je.ci.")) {
+ println "jEdit CI prop found - ${key}: ${value}"
+ if(key.startsWith("je.ci.pl.")) {
+ def cleanKey = key - 'je.ci.pl.'
+ println " clean key: ${cleanKey}"
+ pluginProps.setProperty(cleanKey, value)
+ } else {
+ def cleanKey = key - 'je.ci.'
+ println " clean key: ${cleanKey}"
+ coreProps.setProperty(cleanKey, value)
+ }
+ }
+}
+File corePropsFile = new File(workspace, "jedit/build.properties")
+// make sure stuff exists.
+corePropsFile.parentFile.exists() ?: corePropsFile.parentFile.mkdirs() ?: {
+ System.err.println("'${corePropsFile.parentFile}' did not exist, and could not be created. Exiting.")
+ System.exit(1)
+}()
+corePropsFile.exists() ?: corePropsFile.createNewFile() ?: {
+ System.err.println("'${corePropsFile}' did not exist, and could not be created. Exiting.")
+ System.exit(1)
+}()
+coreProps.store(corePropsFile.newWriter(), storeComment)
+
+File pluginPropsFile = new File(workspace, "jedit/jars/build.properties")
+// make sure stuff exists.
+pluginPropsFile.parentFile.exists() ?: pluginPropsFile.parentFile.mkdirs() ?: {
+ System.err.println("'${pluginPropsFile.parentFile}' did not exist, and could not be created. Exiting.")
+ System.exit(1)
+}()
+pluginPropsFile.exists() ?: pluginPropsFile.createNewFile() ?: {
+ System.err.println("'${pluginPropsFile}' did not exist, and could not be created. Exiting.")
+ System.exit(1)
+}()
+pluginProps.putAll(coreProps)
+pluginProps.store(pluginPropsFile.newWriter(), storeComment)
+/* ::mode=groovy:noTabs=true:maxLineLen=120:wrap=soft:: */
diff --git a/build-support/eclipse-formatting.xml b/build-support/eclipse-formatting.xml
index 67751f4..b03ee7e 100644
--- a/build-support/eclipse-formatting.xml
+++ b/build-support/eclipse-formatting.xml
@@ -1,246 +1,246 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<profiles version="8">
-<profile name="jedit conventions" version="8">
-<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="0"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="1"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="next_line"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="next_line"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="next_line"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="next_line"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="next_line"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="next_line"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="next_line"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="next_line"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="next_line"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="next_line"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.format_comments" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="80"/>
-<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="1"/>
-<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="1"/>
-<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="100"/>
-<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>
-<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
-<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="tab"/>
-<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="8"/>
-<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
-</profile>
-</profiles>
+<?xml version="1.0" encoding="UTF-8"?>
+<profiles version="8">
+<profile name="jedit conventions" version="8">
+<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="next_line"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="next_line"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="next_line"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="next_line"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="next_line"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="next_line"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="next_line"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="next_line"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="next_line"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="next_line"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_comments" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="80"/>
+<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="100"/>
+<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="tab"/>
+<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="8"/>
+<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
+</profile>
+</profiles>
diff --git a/build-support/ivysettings.properties b/build-support/ivysettings.properties
new file mode 100644
index 0000000..dc610f8
--- /dev/null
+++ b/build-support/ivysettings.properties
@@ -0,0 +1 @@
+mirror=ovh
\ No newline at end of file
diff --git a/build-support/ivysettings.xml b/build-support/ivysettings.xml
new file mode 100644
index 0000000..a1842e4
--- /dev/null
+++ b/build-support/ivysettings.xml
@@ -0,0 +1,13 @@
+<ivysettings>
+ <properties file="ivysettings.properties"/>
+ <resolvers>
+ <ibiblio name="maven" m2compatible="true" usepoms="false"/>
+ <url name="jedit-plugins-resolver">
+ <artifact pattern="jar:http://${mirror}.dl.sourceforge.net/sourceforge/jedit-plugins/[artifact]-[revision]-bin.zip!/[artifact].jar" />
+ </url>
+ </resolvers>
+ <modules>
+ <module organisation="jedit-plugins" name=".*" resolver="jedit-plugins-resolver"/>
+ <module organisation="*" name=".*" resolver="maven"/>
+ </modules>
+</ivysettings>
\ No newline at end of file
diff --git a/build-support/plugin-build.xml b/build-support/plugin-build.xml
index 437f822..0eba4b5 100644
--- a/build-support/plugin-build.xml
+++ b/build-support/plugin-build.xml
@@ -1,575 +1,628 @@
-<project name="jEditPlugin" default="build">
-
- <!-- {{{ Top-Level build file for jEdit plugins. ====== -->
- <!--
- Version: $Id: plugin-build.xml 17425 2010-03-04 04:31:01Z vanza $
- Requires apache Ant 1.6, including optional tasks, and xerces.
-
- :tabSize=4:indentSize=4:noTabs=true:
- :folding=explicit:collapseFolds=2:
-
- To use this file, use the "import" task from ant
- on your plugin's build file, like this:
-
- <import file="../build-support/plugin-build.xml" />
-
- The use of the property is to ease the work of the plugin
- packagers.
-
- General tips:
- - To override properties, either use the several
- options for build.properties files, or declare
- them in you plugin's build file *before* the
- import statement.
- - To override paths and selectors, declare them in
- your build file *after* the import statement.
-
- Some tasks require the ant-contrib library available from
- http://ant-contrib.sourceforge.net. If you have the
- library, specify a property named "ant-contrib.jar" with
- the location of the library. The tasks that need ant-contrib
- are the tasks related to plugin dependencies.
-
- For JUnit support, make sure you have the ant-junit.jar
- library in Ant's lib directory. Specify the location of
- the junit jar file using the property "junit.jar".
- -->
- <!-- ===============================================}}} -->
-
- <!-- {{{ Property definitions ========================= -->
- <!-- First loads options from the user's optional
- build.properties files in the following order:
- current dir, parent dir, $HOME/.build.properties
- and finally $HOME/build.properties . The defines
- several default properties used by the different
- targets. -->
- <!-- ================================================== -->
-
- <property file="${basedir}/build.properties" />
- <property file="${basedir}/../build.properties" />
- <property file="${user.home}/.build.properties" />
- <property file="${user.home}/build.properties" />
- <echo>${java.home}</echo>
- <!-- where to find jEdit and plugins -->
- <property name="sourceforge.user.name"
- value="${user.name}" />
- <property name="jedit.install.dir" value="../../jEdit" />
- <property name="jedit.user.home" value="${user.home}/.jedit" />
- <property name="plugins.srcdir" value=".." />
- <property name="install.dir" value=".." />
-
- <!-- some info about the plugin and where to put it -->
- <property name="src.dir" value="." />
- <property name="jar.file" value="${ant.project.name}.jar" />
- <property name="src.zip.file" value="${ant.project.name}.zip" />
- <property name="dist.target" value="dist.nojavadoc" />
-
- <!-- where files will go -->
- <property name="build.dir" value="build" />
- <property name="build.classes" value="${build.dir}/classes" />
- <property name="build.docs" value="${build.dir}/docs" />
- <property name="build.javadoc" value="${build.docs}/javadoc" />
- <property name="build.extras" value="${build.dir}/extras" />
-
- <!-- default compiler flags -->
- <property name="compiler.debug" value="off" />
- <property name="compiler.debuglevel" value="lines,vars,source" />
- <property name="compiler.optimize" value="off" />
- <property name="compiler.deprecation" value="off" />
- <property name="compiler.verbose" value="off" />
- <property name="compiler.nowarn" value="off" />
- <property name="compiler.target" value="1.5" />
- <property name="compiler.source" value="1.5" />
- <property name="compiler.listfiles" value="no" />
- <property name="compiler.fork" value="no" />
- <property name="compiler.bootclasspath" value="${java.home}/lib/rt.jar"/>
- <property name="compiler.extdirs" value="${java.ext.dirs}"/>
- <property name="compiler.userargs" value="" />
-
- <!-- default documentation options -->
- <property name="docs-proc.target" value="xsltproc" />
- <property name="docbookx.dtd" value="../XML/xml/dtds/docbookx.dtd" />
- <dirname property="build.support" file="${ant.file.jEditPlugin}" />
- <property name="user-doc.xsl" location="${build.support}/users-guide.xsl" />
- <property name="user-doc.xml" value="docs/users-guide.xml" />
- <property name="user-doc.out" value="users-guide.html" />
- <property name="javadoc.title" value="${ant.project.name} API" />
- <property name="docbook.xsl.sheet" value="html/onechunk.xsl" />
- <pathconvert property="docs.style.sheet"
- dirsep="/">
- <path location="${docbook.xsl}/${docbook.xsl.sheet}" />
- </pathconvert>
-
- <property name="xsltproc.executable" value="xsltproc" />
-
- <!-- default junit options -->
- <property name="junit.jar" value="junit.jar" />
- <property name="junit.testcase" value="${ant.project.name}TestSuite" />
- <property name="junit.printsummary" value="on" />
- <property name="junit.haltonfailure" value="off" />
-
- <fail message="The jedit JAR (jedit.jar) is not available in "${jedit.install.dir}"">
- <condition>
- <not>
- <available file="${jedit.install.dir}/jedit.jar"
- type="file" />
- </not>
- </condition>
- </fail>
-
- <!-- default class path; try not to override this,
- since the intention is to add here anything that
- might be needed by all the plugins (such as the
- jedit.jar file and any other jar files that
- jEdit might use in the future. -->
- <path id="default.class.path">
- <pathelement location="${jedit.install.dir}/jedit.jar" />
- <pathelement location="${junit.jar}" />
- </path>
-
- <!-- this is the classpath used by the "compile"
- target. Override this one if you need to. You don't
- need to reference "default.class.path" here - it's added
- automatically to the javac command. -->
- <path id="project.class.path" />
-
- <!-- {{{ Load ant-contrib library ===================== -->
- <taskdef resource="net/sf/antcontrib/antcontrib.properties" onerror="ignore">
- <classpath>
- <pathelement location="${ant-contrib.jar}"/>
- </classpath>
- </taskdef>
- <!-- ===============================================}}} -->
-
- <!-- ===============================================}}} -->
-
- <!-- {{{ Custom javac task ============================ -->
- <presetdef name="jp.javac">
- <javac destdir="${build.classes}"
- debug="${compiler.debug}"
- debuglevel="${compiler.debuglevel}"
- optimize="${compiler.optimize}"
- deprecation="${compiler.deprecation}"
- verbose="${compiler.verbose}"
- nowarn="${compiler.nowarn}"
- target="${compiler.target}"
- source="${compiler.source}"
- listfiles="${compiler.listfiles}"
- fork="${compiler.fork}"
- bootclasspath="${compiler.bootclasspath}"
- extdirs="${compiler.extdirs}"
- >
- <src location="${src.dir}" />
- <compilerarg line="${compiler.userargs}" />
- <classpath refid="default.class.path" />
- <classpath refid="project.class.path" />
- </javac>
- </presetdef>
- <!-- }}} ============================================== -->
-
- <!-- {{{ Compilation and building ===================== -->
-
- <!-- This selector defines the files that will be
- compiled by the "compile" target. Define here which
- files under ${src.dir} will be compiled when the
- "compile" task is called. -->
- <selector id="compileFiles">
- <filename name="**/*.java" />
- </selector>
-
- <!-- This selector defines extra files to be included
- in the plugin's JAR file. The context of the
- selector is the plugin's directory (${basedir}),
- so it will not work for files outside the plugin
- directory. For those cases, use the "build.prepare"
- target. By default, it's empty. -->
- <selector id="packageFiles">
- <size value="0" when="less" />
- </selector>
-
- <!-- This selector defines the doc source files
- The context of the selector is the plugin's directory (${basedir}),
- so it will not work for files outside the plugin
- directory. For those cases, use the "build.prepare"
- target. By default, docs/users-guide.xml is selected. -->
- <selector id="docSrcFiles">
- <filename name="docs/users-guide.xml" />
- </selector>
-
- <!-- This selector defines other files that should be packaged
- in the plugin's jar file; by default it contains actions.xml,
- dockables.xml, services.xml, any files ending in ".props",
- "LICENSE" and "README". The context is "${basedir}". Override
- it if your plugin needs special treatment for these files. -->
- <selector id="extraFiles">
- <and>
- <or>
- <filename name="**/actions.xml" />
- <filename name="**/browser.actions.xml" />
- <filename name="**/dockables.xml" />
- <filename name="**/services.xml" />
- <filename name="**/*.props" />
- <filename name="**/LICENSE" />
- <filename name="**/README" />
- </or>
- </and>
- </selector>
-
- <!-- {{{ Target: compile ============================== -->
- <!-- Compiles all the ".java" files present in the
- directory pointed by the "src.dir" property
- defined above. Classes are put in the directory
- designated in the "build.classes" property.
- The following properties control the behavior of
- the compiler (relates to options to the javac
- ant task, defaults in parethesis):
- compiler.debug: the debug option (off)
- compiler.debuglevel: the debug level (lines,source)
- compiler.optimize: the optimize option (off)
- compiler.deprecation: deprecation option (off)
- compiler.verbose: the verbose option (off)
- compiler.nowarn: the nowarn option (off)
- compiler.target: the target option (1.5)
- compiler.source: the source option (1.5)
- compiler.listfiles: the listfiles option (no) -->
- <target name="compile"
- description="Compile the plugin's classes">
-
- <mkdir dir="${build.classes}" />
- <jp.javac>
- <selector refid="compileFiles" />
- </jp.javac>
-
- </target>
- <!-- ===============================================}}} -->
-
- <!-- {{{ Target: clean ================================ -->
- <!-- Removes the directory defined in the "build"
- property, the "docbook-wrapper.xsl" file and the
- file defined by the property "jar.file" in the
- directory defined by "install.dir". -->
- <target name="clean" description="Cleans project directories">
- <delete dir="${build.dir}" quiet="true" />
- </target>
- <!-- ===============================================}}} -->
-
- <!-- {{{ Target: build ================================ -->
- <!-- This target build the plugin JAR file. It
- depends on two other targets: "compile", defined
- above, and "build.prepare", which is empty in
- this file but can be overriden by the plugin's
- build file.
- This target does the following after that:
- * Copies all files defined by the extraFiles selector
- to the staging area.
- * Copies all files defined by the packageFiles selector
- to the staging area.
- * Creates a JAR with the name defined in
- "jar.file" in the directory defined by
- "install.dir". This JAR will contain the
- contents of the directories defined by
- "build.classes", "build.docs" and "build.extras"
- If you need to have any other files added to the
- JAR, override the "build.prepare" target and use
- it to copy files to one of those three
- directories, or redefine the "extraFiles"
- selector. -->
-
- <target name="build"
- depends="build.prepare,compile"
- description="Builds the plugin JAR file (no docs)">
-
- <mkdir dir="${build.classes}" />
- <mkdir dir="${build.docs}" />
- <delete dir="${build.extras}" failonerror="false" />
- <mkdir dir="${build.extras}" />
- <mkdir dir="${install.dir}" />
-
- <copy todir="${build.extras}" includeEmptyDirs="false">
- <fileset dir="${basedir}">
- <selector refid="extraFiles" />
- </fileset>
- </copy>
-
- <copy todir="${build.extras}" includeEmptyDirs="false">
- <fileset dir="${basedir}">
- <selector refid="packageFiles" />
- </fileset>
- </copy>
-
- <jar jarfile="${install.dir}/${jar.file}">
- <fileset dir="${build.classes}" />
- <fileset dir="${build.docs}" />
- <fileset dir="${build.extras}" />
- </jar>
-
- <antcall target="build.post" />
-
- </target>
- <!-- ===============================================}}} -->
-
- <!-- {{{ Target: build.prepare ======================== -->
- <!-- This implementation does nothing. See the
- "build" target for details. -->
- <target name="build.prepare" />
- <!-- ===============================================}}} -->
-
- <!-- {{{ Target: build.post =========================== -->
- <!-- Called after the build process is finished.
- Plugins can use this to copy extra jar files the
- plugin needs to ${install.dir}.
- By default does nothing. -->
- <target name="build.post" />
- <!-- ===============================================}}} -->
-
- <!-- {{{ Target: dist.nojavadoc ======================= -->
- <!-- Meta-task that builds the user documentation and
- builds the plugin JAR file, but not the javadoc. -->
- <target name="dist.nojavadoc" depends="userdocs,build" />
- <!-- =============================================== }}} -->
-
- <!-- {{{ Target: dist.complete ======================== -->
- <!-- Meta-task that builds the user documentation,
- javadoc documentation and builds the plugin JAR
- file. -->
- <target name="dist.complete" depends="docs,build" />
- <!-- ===============================================}}} -->
-
- <!-- {{{ Target: dist ================================= -->
- <!-- This task calls the target defined in the
- property "dist.target" to build the plugin and
- package it for distribution. Before proceeding,
- it cleans the build directory. -->
- <target name="dist" depends="clean" description="Builds JAR file, with docs">
- <antcall target="${dist.target}" />
- </target>
- <!-- =============================================== }}} -->
-
- <!-- {{{ Target: dist.source ========================== -->
- <!-- Creates a ZIP file of the plugin's source. The
- name of the file is defined in the property
- "src.zip.file" and will be created in the
- directory defined by "install.dir". -->
- <target name="dist.source">
- <delete file="${install.dir}/${src.zip.file}" quiet="true" />
- <zip destfile="${install.dir}/${src.zip.file}">
- <fileset dir="${src.dir}">
- <include name="**/*.*" />
- <exclude name="${build.dir}/**" />
- </fileset>
- </zip>
- </target>
- <!-- ===============================================}}} -->
-
- <!-- {{{ Target: package ============================== -->
- <!-- Convenience target that calls both "docs" and
- "build" to create the plugin jar file. -->
- <target name="package" depends="docs,build" />
- <!-- =============================================== }}} -->
-
- <!-- =============================================== }}} -->
-
- <!-- {{{ Documentation ================================ -->
-
- <!-- {{{ Target: docs ================================= -->
- <!-- Meta-task that calls javadoc and userdocs. -->
- <target name="docs"
- depends="javadoc,userdocs"
- description="Build the User's Guide and Javadoc documentation" />
- <!-- =============================================== }}} -->
-
- <!-- {{{ Target: userdocs ============================= -->
- <target name="userdocs"
- description="Builds the user's guide.">
- <mkdir dir="${build.docs}" />
- <copy todir="${build.docs}" includeEmptyDirs="false">
- <fileset dir="${basedir}">
- <selector refid="docSrcFiles" />
- </fileset>
- </copy>
- <copy tofile="${build.docs}/users-guide.xsl"
- flatten="true"
- file="${user-doc.xsl}">
- <filterset>
- <filter token="docs.style.sheet"
- value="${docs.style.sheet}" />
- </filterset>
- </copy>
- <antcall target="docs-${docs-proc.target}" />
- <antcall target="error-catalog" />
- <delete file="${build.docs}/users-guide.xsl" />
- <delete>
- <fileset dir="${build.docs}">
- <selector refid="docSrcFiles" />
- </fileset>
- </delete>
- </target>
-
- <!-- =============================================== }}} -->
-
- <target name="upload.docs" depends="javadoc, userdocs"
- description="upload documentation to plugins.jedit.org site" >
- <exec dir="${build.docs}" executable="rsync">
- <arg line="-avz ./ ${sourceforge.user.name}@plugins.jedit.org:/home/groups/j/je/jedit-plugins/htdocs/plugindoc/${ant.project.name}" />
- </exec>
- </target>
-
-
- <!-- {{{ Target: javadoc ============================== -->
- <!-- Builds the javadoc documentation for the plugin,
- placing it under "build.javadoc". Your plugin
- build file *must* define a property called
- named "javadoc.packagenames" to be used as the
- "packagenames" option of ant's javadoc task.
- This property is not defined in this file and
- execition will probably fail if it's not defined.
- The title of the documentation is defined in the
- "javadoc.title" property. -->
- <target name="javadoc"
- description="Generates javadoc sourcecode documentation"
- if="javadoc.packagenames">
- <mkdir dir="${build.javadoc}" />
- <javadoc sourcepath="${src.dir}"
- destdir="${build.javadoc}"
- locale="en"
- packagenames="${javadoc.packagenames}"
- windowtitle="${javadoc.title}">
- <classpath refid="default.class.path" />
- <classpath refid="project.class.path" />
- </javadoc>
- </target>
- <!-- =============================================== }}} -->
-
- <!-- {{{ Target: docs-xsltproc ======================== -->
- <!-- Generate docs with xsltproc tool from
- www.xmlsoft.org. This task creates a temporary
- file called "docbook.catalog" containing a
- reference to the Docbook DTD defined in the
- property "docbookx.dtd" above. The style sheet
- used is defined by the property "user-doc.xsl",
- and defaults to "docbook-wrapper.xsl". The XML
- document to be processed is defined by the
- "user-doc.xml" property, and defaults to
- "docs/users-guide.xml". The output is defined in
- the "user-doc.out" property. -->
- <target name="docs-xsltproc" description="Generate user documentation in html format with xsltproc" if="docbook.catalog">
- <exec executable="${xsltproc.executable}" dir="${build.docs}" failonerror="true">
- <arg value="--output" />
- <arg value="${user-doc.out}" />
- <arg value="--catalogs" />
- <arg value="users-guide.xsl" />
- <arg value="${user-doc.xml}" />
- <env key="SGML_CATALOG_FILES"
- file="${docbook.catalog}" />
- </exec>
- </target>
-
- <target name="error-catalog" unless="docbook.catalog" >
- <echo message="docbook.catalog not set" />
- </target>
-
- <!-- ===============================================}}} -->
-
- <target name="docs-none"
- description="no xslt step - HTML docs" />
-
- <!-- {{{ Target: docs-xalan =========================== -->
- <!-- Generate docs with Xalan tool from
- xml.apache.org . Same properties as the
- "docs-xsltproc" target apply here. -->
- <target name="docs-xalan"
- if="docbookx.dtd"
- description="Generate user documentation in html format with xalan (not working)">
- <xslt basedir="."
- destdir="${build.docs}"
- style="${build.docs}/users-guide.xsl"
- includes="${user-doc.xml}">
- <xmlcatalog>
- <dtd publicId="-//OASIS//DTD DocBook XML V4.2//EN"
- location="${docbookx.dtd}" />
- </xmlcatalog>
- </xslt>
- </target>
- <!-- ===============================================}}} -->
-
- <!-- =============================================== }}} -->
-
- <!-- {{{ Unit testing ================================= -->
-
- <!-- {{{ Target: test ================================= -->
- <!-- Meta-task that calls the defined test target. -->
- <target name="test"
- description="Runs the plugin's unit tests.">
- <antcall target="${unit.test.target}" />
- </target>
- <!-- ===============================================}}} -->
-
- <!-- {{{ Target: test-junit============================ -->
- <!-- Executes a jUnit test case defined by the plugin's
- build file. The classpath for the test will be the
- ${build.class} directory, the ${junit.jar} file and
- the default.class.path and project.class.path path
- structures.
- -->
- <target name="test-junit"
- description="Runs the plugin's jUnit tests."
- if="junit.testcase,junit.jar">
-
- <junit printsummary="${junit.printsummary}"
- haltonfailure="${junit.haltonfailure}">
-
- <classpath>
- <pathelement location="${junit.jar}" />
- <pathelement location="${build.classes}" />
- <path refid="default.class.path" />
- <path refid="project.class.path" />
- </classpath>
-
- <test name="${junit.testcase}" />
- </junit>
-
- </target>
- <!-- ===============================================}}} -->
-
- <!-- ===============================================}}} -->
-
- <!--{{{ Dependencies ================================= -->
-
-
- <!-- {{{ Target: build.dependencies =================== -->
- <target name="build.dependencies"
- description="Builds the needed plugins from the available source code."
- if="plugin.dependencies,ant-contrib.jar">
- <foreach list="${plugin.dependencies}"
- target="build.other"
- param="plugin.name"
- delimiter=","
- trim="true" />
- </target>
- <!-- ===============================================}}} -->
-
- <!-- {{{ Target: build.other=========================== -->
- <!-- Builds a plugin from the code available in its
- directory under "plugins.srcdir". This will call
- the "build" target of that plugin's build file.
- Expects the "plugin.name" parameter with the name
- of the plugin's directory. -->
- <target name="build.other">
- <fail message="Can't find plugin: ${plugin.name}">
- <condition>
- <not>
- <available file="${plugins.srcdir}/${plugin.name}/build.xml" />
- </not>
- </condition>
- </fail>
- <ant antfile="${plugins.srcdir}/${plugin.name}/build.xml"
- target="build"
- inheritAll="false"
- inheritRefs="false" />
- </target>
- <!-- ===============================================}}} -->
-
- <!-- ================================================== }}}-->
-
-</project>
-
+<project xmlns:ivy="antlib:org.apache.ivy.ant" name="jEditPlugin" default="build">
+
+ <!-- {{{ Top-Level build file for jEdit plugins. ====== -->
+ <!--
+ Version: $Id: plugin-build.xml 18807 2010-10-21 11:54:20Z kpouer $
+ Requires apache Ant 1.6, including optional tasks, and xerces.
+
+ :tabSize=4:indentSize=4:noTabs=true:
+ :folding=explicit:collapseFolds=2:
+
+ To use this file, use the "import" task from ant
+ on your plugin's build file, like this:
+
+ <import file="../build-support/plugin-build.xml" />
+
+ The use of the property is to ease the work of the plugin
+ packagers.
+
+ General tips:
+ - To override properties, either use the several
+ options for build.properties files, or declare
+ them in you plugin's build file *before* the
+ import statement.
+ - To override paths and selectors, declare them in
+ your build file *after* the import statement.
+
+ Some tasks require the ant-contrib library available from
+ http://ant-contrib.sourceforge.net. If you have the
+ library, specify a property named "ant-contrib.jar" with
+ the location of the library. The tasks that need ant-contrib
+ are the tasks related to plugin dependencies.
+
+ For JUnit support, make sure you have the ant-junit.jar
+ library in Ant's lib directory. Specify the location of
+ the junit jar file using the property "junit.jar".
+ -->
+ <!-- ===============================================}}} -->
+
+ <!-- {{{ Property definitions ========================= -->
+ <!-- First loads options from the user's optional
+ build.properties files in the following order:
+ current dir, parent dir, $HOME/.build.properties
+ and finally $HOME/build.properties . The defines
+ several default properties used by the different
+ targets. -->
+ <!-- ================================================== -->
+
+ <property file="${basedir}/build.properties" />
+ <property file="${basedir}/../build.properties" />
+ <property file="${user.home}/.build.properties" />
+ <property file="${user.home}/build.properties" />
+ <echo>${java.home}</echo>
+ <!-- where to find jEdit and plugins -->
+ <property name="sourceforge.user.name"
+ value="${user.name}" />
+ <property name="jedit.install.dir" value="../../jEdit" />
+ <property name="jedit.user.home" value="${user.home}/.jedit" />
+ <property name="plugins.srcdir" value=".." />
+ <property name="install.dir" value=".." />
+
+ <!-- some info about the plugin and where to put it -->
+ <property name="src.dir" value="." />
+ <property name="jar.file" value="${ant.project.name}.jar" />
+ <property name="src.zip.file" value="${ant.project.name}.zip" />
+ <property name="dist.target" value="dist.nojavadoc" />
+
+ <!-- where files will go -->
+ <property name="build.dir" value="build" />
+ <property name="build.classes" value="${build.dir}/classes" />
+ <property name="build.docs" value="${build.dir}/docs" />
+ <property name="build.javadoc" value="${build.docs}/javadoc" />
+ <property name="build.extras" value="${build.dir}/extras" />
+ <property name="build.lib" value="${build.dir}/lib" />
+
+ <!-- default compiler flags -->
+ <property name="compiler.debug" value="off" />
+ <property name="compiler.debuglevel" value="lines,vars,source" />
+ <property name="compiler.optimize" value="off" />
+ <property name="compiler.deprecation" value="off" />
+ <property name="compiler.verbose" value="off" />
+ <property name="compiler.nowarn" value="off" />
+ <property name="compiler.target" value="1.5" />
+ <property name="compiler.source" value="1.5" />
+ <property name="compiler.listfiles" value="no" />
+ <property name="compiler.fork" value="no" />
+ <property name="compiler.bootclasspath" value="${java.home}/lib/rt.jar"/>
+ <property name="compiler.extdirs" value="${java.ext.dirs}"/>
+ <property name="compiler.userargs" value="" />
+
+ <!-- default documentation options -->
+ <property name="docs-proc.target" value="xsltproc" />
+ <property name="docbookx.dtd" value="../XML/xml/dtds/docbookx.dtd" />
+ <dirname property="build.support" file="${ant.file.jEditPlugin}" />
+ <property name="user-doc.xsl" location="${build.support}/users-guide.xsl" />
+ <property name="user-doc.xml" value="docs/users-guide.xml" />
+ <property name="user-doc.out" value="users-guide.html" />
+ <property name="javadoc.title" value="${ant.project.name} API" />
+ <property name="docbook.xsl.sheet" value="html/onechunk.xsl" />
+ <pathconvert property="docs.style.sheet"
+ dirsep="/">
+ <path location="${docbook.xsl}/${docbook.xsl.sheet}" />
+ </pathconvert>
+
+ <property name="xsltproc.executable" value="xsltproc" />
+
+ <!-- default junit options -->
+ <property name="junit.jar" value="junit.jar" />
+ <property name="junit.testcase" value="${ant.project.name}TestSuite" />
+ <property name="junit.printsummary" value="on" />
+ <property name="junit.haltonfailure" value="off" />
+
+ <fail message="The jedit JAR (jedit.jar) is not available in "${jedit.install.dir}"">
+ <condition>
+ <not>
+ <available file="${jedit.install.dir}/jedit.jar"
+ type="file" />
+ </not>
+ </condition>
+ </fail>
+
+ <!-- default class path; try not to override this,
+ since the intention is to add here anything that
+ might be needed by all the plugins (such as the
+ jedit.jar file and any other jar files that
+ jEdit might use in the future. -->
+ <path id="default.class.path">
+ <pathelement location="${jedit.install.dir}/jedit.jar" />
+ <pathelement location="${junit.jar}" />
+ <fileset dir="${build.dir}">
+ <include name="lib/*.jar"/>
+ </fileset>
+ </path>
+
+ <!-- this is the classpath used by the "compile"
+ target. Override this one if you need to. You don't
+ need to reference "default.class.path" here - it's added
+ automatically to the javac command. -->
+ <path id="project.class.path" />
+
+ <!-- {{{ Load ant-contrib library ===================== -->
+ <taskdef resource="net/sf/antcontrib/antcontrib.properties" onerror="ignore">
+ <classpath>
+ <pathelement location="${ant-contrib.jar}"/>
+ </classpath>
+ </taskdef>
+ <!-- ===============================================}}} -->
+
+ <!-- ===============================================}}} -->
+
+ <!-- {{{ Custom javac task ============================ -->
+ <presetdef name="jp.javac">
+ <javac destdir="${build.classes}"
+ debug="${compiler.debug}"
+ debuglevel="${compiler.debuglevel}"
+ optimize="${compiler.optimize}"
+ deprecation="${compiler.deprecation}"
+ verbose="${compiler.verbose}"
+ nowarn="${compiler.nowarn}"
+ target="${compiler.target}"
+ source="${compiler.source}"
+ listfiles="${compiler.listfiles}"
+ fork="${compiler.fork}"
+ bootclasspath="${compiler.bootclasspath}"
+ extdirs="${compiler.extdirs}"
+ >
+ <src location="${src.dir}" />
+ <compilerarg line="${compiler.userargs}" />
+ <classpath refid="default.class.path" />
+ <classpath refid="project.class.path" />
+ </javac>
+ </presetdef>
+ <!-- }}} ============================================== -->
+
+ <!-- {{{ Compilation and building ===================== -->
+
+ <!-- This selector defines the files that will be
+ compiled by the "compile" target. Define here which
+ files under ${src.dir} will be compiled when the
+ "compile" task is called. -->
+ <selector id="compileFiles">
+ <filename name="**/*.java" />
+ </selector>
+
+ <!-- This selector defines extra files to be included
+ in the plugin's JAR file. The context of the
+ selector is the plugin's directory (${basedir}),
+ so it will not work for files outside the plugin
+ directory. For those cases, use the "build.prepare"
+ target. By default, it's empty. -->
+ <selector id="packageFiles">
+ <size value="0" when="less" />
+ </selector>
+
+ <!-- This selector defines the doc source files
+ The context of the selector is the plugin's directory (${basedir}),
+ so it will not work for files outside the plugin
+ directory. For those cases, use the "build.prepare"
+ target. By default, docs/users-guide.xml is selected. -->
+ <selector id="docSrcFiles">
+ <filename name="docs/users-guide.xml" />
+ </selector>
+
+ <!-- This selector defines other files that should be packaged
+ in the plugin's jar file; by default it contains actions.xml,
+ dockables.xml, services.xml, any files ending in ".props",
+ "LICENSE" and "README". The context is "${basedir}". Override
+ it if your plugin needs special treatment for these files. -->
+ <selector id="extraFiles">
+ <and>
+ <or>
+ <filename name="**/actions.xml" />
+ <filename name="**/browser.actions.xml" />
+ <filename name="**/dockables.xml" />
+ <filename name="**/services.xml" />
+ <filename name="**/*.props" />
+ <filename name="**/LICENSE" />
+ <filename name="**/README" />
+ </or>
+ </and>
+ </selector>
+
+ <!--{{{ Ivy setup *****============================== -->
+ <property name="ivy.install.version" value="2.2.0" />
+ <condition property="ivy.home" value="${env.IVY_HOME}">
+ <isset property="env.IVY_HOME" />
+ </condition>
+ <property name="ivy.home" value="${user.home}/.ant" />
+ <property name="ivy.jar.dir" value="${ivy.home}/lib" />
+ <property name="ivy.jar.file" value="${ivy.jar.dir}/ivy.jar" />
+ <property name="ivy.settings.file" value="${build.support}/ivysettings.xml" />
+
+ <target name="download-ivy" unless="offline">
+
+ <mkdir dir="${ivy.jar.dir}"/>
+ <!-- download Ivy from web site so that it can be used even without any special installation -->
+ <get src="http://repo2.maven.org/maven2/org/apache/ivy/ivy/${ivy.install.version}/ivy-${ivy.install.version}.jar"
+ dest="${ivy.jar.file}" usetimestamp="true"/>
+ </target>
+
+ <target name="init-ivy" depends="download-ivy">
+ <!-- try to load ivy here from ivy home, in case the user has not already dropped
+ it into ant's lib dir (note that the latter copy will always take precedence).
+ We will not fail as long as local lib dir exists (it may be empty) and
+ ivy is in at least one of ant's lib dir or the local lib dir. -->
+ <path id="ivy.lib.path">
+ <fileset dir="${ivy.jar.dir}" includes="*.jar"/>
+
+ </path>
+ <taskdef resource="org/apache/ivy/ant/antlib.xml"
+ uri="antlib:org.apache.ivy.ant" classpathref="ivy.lib.path"/>
+ </target>
+ <!--}}}-->
+
+ <!--{{{ Target: resolve ============================== -->
+ <target name="checkIvy">
+ <condition property="ivyPresent">
+ <available file="ivy.xml" type="file"/>
+ </condition>
+ </target>
+ <target name="resolve" description="Retrieve dependencies"
+ depends="checkIvy,init-ivy" if="ivyPresent">
+ <echo>ivy.xml present, retrieving dependencies</echo>
+ <ivy:retrieve pattern="${build.lib}/[artifact].[ext]"/>
+ </target>
+ <!-- ===============================================}}} -->
+
+ <!-- {{{ Target: compile ============================== -->
+ <!-- Compiles all the ".java" files present in the
+ directory pointed by the "src.dir" property
+ defined above. Classes are put in the directory
+ designated in the "build.classes" property.
+ The following properties control the behavior of
+ the compiler (relates to options to the javac
+ ant task, defaults in parethesis):
+ compiler.debug: the debug option (off)
+ compiler.debuglevel: the debug level (lines,source)
+ compiler.optimize: the optimize option (off)
+ compiler.deprecation: deprecation option (off)
+ compiler.verbose: the verbose option (off)
+ compiler.nowarn: the nowarn option (off)
+ compiler.target: the target option (1.5)
+ compiler.source: the source option (1.5)
+ compiler.listfiles: the listfiles option (no) -->
+ <target name="compile"
+ description="Compile the plugin's classes" depends="resolve">
+
+ <mkdir dir="${build.classes}" />
+ <jp.javac>
+ <selector refid="compileFiles" />
+ </jp.javac>
+
+ </target>
+ <!-- ===============================================}}} -->
+
+ <!-- {{{ Target: clean ================================ -->
+ <!-- Removes the directory defined in the "build"
+ property, the "docbook-wrapper.xsl" file and the
+ file defined by the property "jar.file" in the
+ directory defined by "install.dir". -->
+ <target name="clean" description="Cleans project directories">
+ <delete dir="${build.dir}" quiet="true" />
+ </target>
+ <!-- ===============================================}}} -->
+
+ <!-- {{{ Target: build ================================ -->
+ <!-- This target build the plugin JAR file. It
+ depends on two other targets: "compile", defined
+ above, and "build.prepare", which is empty in
+ this file but can be overriden by the plugin's
+ build file.
+ This target does the following after that:
+ * Copies all files defined by the extraFiles selector
+ to the staging area.
+ * Copies all files defined by the packageFiles selector
+ to the staging area.
+ * Creates a JAR with the name defined in
+ "jar.file" in the directory defined by
+ "install.dir". This JAR will contain the
+ contents of the directories defined by
+ "build.classes", "build.docs" and "build.extras"
+ If you need to have any other files added to the
+ JAR, override the "build.prepare" target and use
+ it to copy files to one of those three
+ directories, or redefine the "extraFiles"
+ selector. -->
+
+ <target name="build"
+ depends="build.prepare,compile"
+ description="Builds the plugin JAR file (no docs)">
+
+ <mkdir dir="${build.classes}" />
+ <mkdir dir="${build.docs}" />
+ <delete dir="${build.extras}" failonerror="false" />
+ <mkdir dir="${build.extras}" />
+ <mkdir dir="${install.dir}" />
+
+ <copy todir="${build.extras}" includeEmptyDirs="false">
+ <fileset dir="${basedir}">
+ <selector refid="extraFiles" />
+ </fileset>
+ </copy>
+
+ <copy todir="${build.extras}" includeEmptyDirs="false">
+ <fileset dir="${basedir}">
+ <selector refid="packageFiles" />
+ </fileset>
+ </copy>
+
+ <jar jarfile="${install.dir}/${jar.file}">
+ <fileset dir="${build.classes}" />
+ <fileset dir="${build.docs}" />
+ <fileset dir="${build.extras}" />
+ </jar>
+
+ <antcall target="build.post" />
+
+ </target>
+ <!-- ===============================================}}} -->
+
+ <!-- {{{ Target: build.prepare ======================== -->
+ <!-- This implementation does nothing. See the
+ "build" target for details. -->
+ <target name="build.prepare" />
+ <!-- ===============================================}}} -->
+
+ <!-- {{{ Target: build.post =========================== -->
+ <!-- Called after the build process is finished.
+ Plugins can use this to copy extra jar files the
+ plugin needs to ${install.dir}.
+ By default does nothing. -->
+ <target name="build.post" />
+ <!-- ===============================================}}} -->
+
+ <!-- {{{ Target: dist.nojavadoc ======================= -->
+ <!-- Meta-task that builds the user documentation and
+ builds the plugin JAR file, but not the javadoc. -->
+ <target name="dist.nojavadoc" depends="userdocs,build" />
+ <!-- =============================================== }}} -->
+
+ <!-- {{{ Target: dist.complete ======================== -->
+ <!-- Meta-task that builds the user documentation,
+ javadoc documentation and builds the plugin JAR
+ file. -->
+ <target name="dist.complete" depends="docs,build" />
+ <!-- ===============================================}}} -->
+
+ <!-- {{{ Target: dist ================================= -->
+ <!-- This task calls the target defined in the
+ property "dist.target" to build the plugin and
+ package it for distribution. Before proceeding,
+ it cleans the build directory. -->
+ <target name="dist" depends="clean" description="Builds JAR file, with docs">
+ <antcall target="${dist.target}" />
+ </target>
+ <!-- =============================================== }}} -->
+
+ <!-- {{{ Target: dist.source ========================== -->
+ <!-- Creates a ZIP file of the plugin's source. The
+ name of the file is defined in the property
+ "src.zip.file" and will be created in the
+ directory defined by "install.dir". -->
+ <target name="dist.source">
+ <delete file="${install.dir}/${src.zip.file}" quiet="true" />
+ <zip destfile="${install.dir}/${src.zip.file}">
+ <fileset dir="${src.dir}">
+ <include name="**/*.*" />
+ <exclude name="${build.dir}/**" />
+ </fileset>
+ </zip>
+ </target>
+ <!-- ===============================================}}} -->
+
+ <!-- {{{ Target: package ============================== -->
+ <!-- Convenience target that calls both "docs" and
+ "build" to create the plugin jar file. -->
+ <target name="package" depends="docs,build" />
+ <!-- =============================================== }}} -->
+
+ <!-- =============================================== }}} -->
+
+ <!-- {{{ Documentation ================================ -->
+
+ <!-- {{{ Target: docs ================================= -->
+ <!-- Meta-task that calls javadoc and userdocs. -->
+ <target name="docs"
+ depends="javadoc,userdocs"
+ description="Build the User's Guide and Javadoc documentation" />
+ <!-- =============================================== }}} -->
+
+ <!-- {{{ Target: userdocs ============================= -->
+ <target name="userdocs"
+ description="Builds the user's guide.">
+ <mkdir dir="${build.docs}" />
+ <copy todir="${build.docs}" includeEmptyDirs="false">
+ <fileset dir="${basedir}">
+ <selector refid="docSrcFiles" />
+ </fileset>
+ </copy>
+ <copy tofile="${build.docs}/users-guide.xsl"
+ flatten="true"
+ file="${user-doc.xsl}">
+ <filterset>
+ <filter token="docs.style.sheet"
+ value="${docs.style.sheet}" />
+ </filterset>
+ </copy>
+ <antcall target="docs-${docs-proc.target}" />
+ <delete file="${build.docs}/users-guide.xsl" />
+ <delete>
+ <fileset dir="${build.docs}">
+ <selector refid="docSrcFiles" />
+ </fileset>
+ </delete>
+ </target>
+
+ <!-- =============================================== }}} -->
+
+ <target name="upload.docs" depends="javadoc, userdocs"
+ description="upload documentation to plugins.jedit.org site" >
+ <exec dir="${build.docs}" executable="rsync">
+ <arg line="-avz ./ ${sourceforge.user.name}@plugins.jedit.org:/home/groups/j/je/jedit-plugins/htdocs/plugindoc/${ant.project.name}" />
+ </exec>
+ </target>
+
+
+ <!-- {{{ Target: javadoc ============================== -->
+ <!-- Builds the javadoc documentation for the plugin,
+ placing it under "build.javadoc". Your plugin
+ build file *must* define a property called
+ named "javadoc.packagenames" to be used as the
+ "packagenames" option of ant's javadoc task.
+ This property is not defined in this file and
+ execition will probably fail if it's not defined.
+ The title of the documentation is defined in the
+ "javadoc.title" property. -->
+ <target name="javadoc"
+ description="Generates javadoc sourcecode documentation"
+ if="javadoc.packagenames">
+ <mkdir dir="${build.javadoc}" />
+ <javadoc sourcepath="${src.dir}"
+ destdir="${build.javadoc}"
+ locale="en"
+ packagenames="${javadoc.packagenames}"
+ windowtitle="${javadoc.title}">
+ <classpath refid="default.class.path" />
+ <classpath refid="project.class.path" />
+ </javadoc>
+ </target>
+ <!-- =============================================== }}} -->
+
+ <!-- {{{ Target: docs-xsltproc ======================== -->
+ <!-- Generate docs with xsltproc tool from
+ www.xmlsoft.org. This task creates a temporary
+ file called "docbook.catalog" containing a
+ reference to the Docbook DTD defined in the
+ property "docbookx.dtd" above. The style sheet
+ used is defined by the property "user-doc.xsl",
+ and defaults to "docbook-wrapper.xsl". The XML
+ document to be processed is defined by the
+ "user-doc.xml" property, and defaults to
+ "docs/users-guide.xml". The output is defined in
+ the "user-doc.out" property. -->
+ <target name="docs-xsltproc" description="Generate user documentation in html format with xsltproc">
+ <fail message="Please set the "docbook.catalog" in build.properties"
+ unless="docbook.catalog" />
+ <fail message="Please set "docbook.xsl" in build.properties"
+ unless="docbook.xsl" />
+
+ <exec executable="${xsltproc.executable}" dir="${build.docs}" failonerror="true">
+ <arg value="--output" />
+ <arg value="${user-doc.out}" />
+ <arg value="--catalogs" />
+ <arg value="users-guide.xsl" />
+ <arg value="${user-doc.xml}" />
+ <env key="SGML_CATALOG_FILES"
+ file="${docbook.catalog}" />
+ </exec>
+ </target>
+
+ <!-- ===============================================}}} -->
+
+ <target name="docs-none"
+ description="no xslt step - HTML docs" />
+
+ <!-- {{{ Target: docs-xalan =========================== -->
+ <!-- Generate docs with Xalan tool from
+ xml.apache.org . Same properties as the
+ "docs-xsltproc" target apply here. -->
+ <target name="docs-xalan"
+ description="Generate user documentation in html format with xalan (not working)">
+ <fail message="Please set the "docbookx.dtd" in build.properties"
+ unless="docbookx.dtd" />
+ <fail message="Please set "docbook.xsl" in build.properties"
+ unless="docbook.xsl" />
+
+ <xslt basedir="."
+ destdir="${build.docs}"
+ style="${build.docs}/users-guide.xsl"
+ includes="${user-doc.xml}">
+ <xmlcatalog>
+ <dtd publicId="-//OASIS//DTD DocBook XML V4.2//EN"
+ location="${docbookx.dtd}" />
+ </xmlcatalog>
+ </xslt>
+ </target>
+ <!-- ===============================================}}} -->
+
+ <!-- =============================================== }}} -->
+
+ <!-- {{{ Unit testing ================================= -->
+
+ <!-- {{{ Target: test ================================= -->
+ <!-- Meta-task that calls the defined test target. -->
+ <target name="test"
+ description="Runs the plugin's unit tests.">
+ <antcall target="${unit.test.target}" />
+ </target>
+ <!-- ===============================================}}} -->
+
+ <!-- {{{ Target: test-junit============================ -->
+ <!-- Executes a jUnit test case defined by the plugin's
+ build file. The classpath for the test will be the
+ ${build.class} directory, the ${junit.jar} file and
+ the default.class.path and project.class.path path
+ structures.
+ -->
+ <target name="test-junit"
+ description="Runs the plugin's jUnit tests."
+ if="junit.testcase,junit.jar">
+
+ <junit printsummary="${junit.printsummary}"
+ haltonfailure="${junit.haltonfailure}">
+
+ <classpath>
+ <pathelement location="${junit.jar}" />
+ <pathelement location="${build.classes}" />
+ <path refid="default.class.path" />
+ <path refid="project.class.path" />
+ </classpath>
+
+ <test name="${junit.testcase}" />
+ </junit>
+
+ </target>
+ <!-- ===============================================}}} -->
+
+ <!-- ===============================================}}} -->
+
+ <!--{{{ Dependencies ================================= -->
+
+
+ <!-- {{{ Target: build.dependencies =================== -->
+ <target name="build.dependencies"
+ description="Builds the needed plugins from the available source code."
+ if="plugin.dependencies,ant-contrib.jar">
+ <foreach list="${plugin.dependencies}"
+ target="build.other"
+ param="plugin.name"
+ delimiter=","
+ trim="true" />
+ </target>
+ <!-- ===============================================}}} -->
+
+ <!-- {{{ Target: build.other=========================== -->
+ <!-- Builds a plugin from the code available in its
+ directory under "plugins.srcdir". This will call
+ the "build" target of that plugin's build file.
+ Expects the "plugin.name" parameter with the name
+ of the plugin's directory. -->
+ <target name="build.other">
+ <fail message="Can't find plugin: ${plugin.name}">
+ <condition>
+ <not>
+ <available file="${plugins.srcdir}/${plugin.name}/build.xml" />
+ </not>
+ </condition>
+ </fail>
+ <ant antfile="${plugins.srcdir}/${plugin.name}/build.xml"
+ target="build"
+ inheritAll="false"
+ inheritRefs="false" />
+ </target>
+ <!-- ===============================================}}} -->
+
+ <!-- ================================================== }}}-->
+
+</project>
+
diff --git a/build-support/users-guide.xsl b/build-support/users-guide.xsl
index cd566ef..72269fd 100644
--- a/build-support/users-guide.xsl
+++ b/build-support/users-guide.xsl
@@ -1,228 +1,228 @@
-<?xml version='1.0'?>
-
-<!-- You should use this XSL stylesheet to create plugin documentation.
-
- If you want all output in a single HTML file, specify the path to
- your DocBook-XSL "html/docbook.xsl" file in the <xsl:import>
- statement below. If you want each chapter to have its own file,
- specify the path to your "html/chunk.xsl".
-
- This stylesheet assumes the user's guide XML source is in a
- subdirectory of the plugin's main dir (e.g., "docs/users-guide.xml").
--->
-
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- version='1.0'
- xmlns="http://www.w3.org/TR/xhtml1/transitional"
- exclude-result-prefixes="#default">
-
-<xsl:import href="file:///@docs.style.sheet@" />
-
-<!-- Swing HTML control doesn't support “ and ” -->
-<xsl:template match="quote">"<xsl:apply-templates/>"</xsl:template>
-
-<xsl:template match="guibutton">
- <xsl:call-template name="inline.boldseq"/>
-</xsl:template>
-
-<xsl:template match="guiicon">
- <xsl:call-template name="inline.boldseq"/>
-</xsl:template>
-
-<xsl:template match="guilabel">
- <xsl:call-template name="inline.boldseq"/>
-</xsl:template>
-
-<xsl:template match="guimenu">
- <xsl:call-template name="inline.boldseq"/>
-</xsl:template>
-
-<xsl:template match="guimenuitem">
- <xsl:call-template name="inline.boldseq"/>
-</xsl:template>
-
-<xsl:template match="guisubmenu">
- <xsl:call-template name="inline.boldseq"/>
-</xsl:template>
-
-<xsl:template match="image">
- <p><center><img src="{src}" /></center></p>
-</xsl:template>
-
-<xsl:template match="br">
- <br />
-</xsl:template>
-
-<xsl:param name="toc.list.type">ul</xsl:param>
-<xsl:param name="use.id.as.filename">1</xsl:param>
-<xsl:param name="shade.verbatim">1</xsl:param>
-
-<xsl:param name="funcsynopsis.style">ansi</xsl:param>
-<xsl:template match="void"><xsl:apply-templates/></xsl:template>
-
-
-<xsl:param name="chunk.first.sections">1</xsl:param>
-
-<xsl:template match="*" mode="object.title.markup.textonly">
- <xsl:variable name="title">
- <xsl:apply-templates select="." mode="title.markup"/>
- </xsl:variable>
- <xsl:value-of select="$title"/>
-</xsl:template>
-
-<!-- {{{ TOC generation -->
-<xsl:template match="/">
- <xsl:call-template name="toc"/>
-</xsl:template>
-
-<xsl:template name="toc">
- <xsl:apply-templates/>
- <xsl:call-template name="write.chunk">
- <xsl:with-param name="filename" select="'toc.xml'"/>
- <xsl:with-param name="method" select="'xml'"/>
- <xsl:with-param name="indent" select="'yes'"/>
- <xsl:with-param name="content">
- <xsl:call-template name="toc.content"/>
- </xsl:with-param>
- </xsl:call-template>
-</xsl:template>
-
-<xsl:template name="toc.content">
- <TOC>
- <xsl:apply-templates select="." mode="my.toc"/>
- </TOC>
-</xsl:template>
-
-<xsl:template match="set" mode="my.toc">
- <ENTRY>
- <xsl:attribute name="HREF">
- <xsl:call-template name="href.target">
- <xsl:with-param name="object" select="."/>
- </xsl:call-template>
- </xsl:attribute>
- <TITLE>
- <xsl:apply-templates mode="title.markup" select="."/>
- </TITLE>
- <xsl:apply-templates select="book" mode="my.toc"/>
- </ENTRY>
-</xsl:template>
-
-<xsl:template match="book" mode="my.toc">
- <ENTRY>
- <xsl:attribute name="HREF">
- <xsl:call-template name="href.target">
- <xsl:with-param name="object" select="."/>
- </xsl:call-template>
- </xsl:attribute>
- <TITLE>
- <xsl:apply-templates mode="title.markup" select="."/>
- </TITLE>
- <xsl:apply-templates select="part|reference|preface|chapter|appendix|article|colophon"
- mode="my.toc"/>
- </ENTRY>
-</xsl:template>
-
-<xsl:template match="part|reference|preface|chapter|appendix|article"
- mode="my.toc">
- <ENTRY>
- <xsl:attribute name="HREF">
- <xsl:call-template name="href.target">
- <xsl:with-param name="object" select="."/>
- </xsl:call-template>
- </xsl:attribute>
- <TITLE>
- <xsl:apply-templates mode="title.markup" select="."/>
- </TITLE>
- <xsl:apply-templates
- select="preface|chapter|appendix|refentry|section|sect1"
- mode="my.toc"/>
- </ENTRY>
-</xsl:template>
-
-<xsl:template match="section" mode="my.toc">
- <ENTRY>
- <xsl:attribute name="HREF">
- <xsl:call-template name="href.target">
- <xsl:with-param name="object" select="."/>
- </xsl:call-template>
- </xsl:attribute>
- <TITLE>
- <xsl:apply-templates mode="title.markup" select="."/>
- </TITLE>
- <xsl:apply-templates select="section" mode="my.toc"/>
- </ENTRY>
-</xsl:template>
-
-<xsl:template match="sect1" mode="my.toc">
- <ENTRY>
- <xsl:attribute name="HREF">
- <xsl:call-template name="href.target">
- <xsl:with-param name="object" select="."/>
- </xsl:call-template>
- </xsl:attribute>
- <TITLE>
- <xsl:apply-templates mode="title.markup" select="."/>
- </TITLE>
- <xsl:apply-templates select="sect2" mode="my.toc"/>
- </ENTRY>
-</xsl:template>
-
-<xsl:template match="sect2" mode="my.toc">
- <ENTRY>
- <xsl:attribute name="HREF">
- <xsl:call-template name="href.target">
- <xsl:with-param name="object" select="."/>
- </xsl:call-template>
- </xsl:attribute>
- <TITLE>
- <xsl:apply-templates mode="title.markup" select="."/>
- </TITLE>
- <xsl:apply-templates select="sect3" mode="my.toc"/>
- </ENTRY>
-</xsl:template>
-
-<xsl:template match="sect3" mode="my.toc">
- <ENTRY>
- <xsl:attribute name="HREF">
- <xsl:call-template name="href.target">
- <xsl:with-param name="object" select="."/>
- </xsl:call-template>
- </xsl:attribute>
- <TITLE>
- <xsl:apply-templates mode="title.markup" select="."/>
- </TITLE>
- <xsl:apply-templates select="sect4" mode="my.toc"/>
- </ENTRY>
-</xsl:template>
-
-<xsl:template match="sect4" mode="my.toc">
- <ENTRY>
- <xsl:attribute name="HREF">
- <xsl:call-template name="href.target">
- <xsl:with-param name="object" select="."/>
- </xsl:call-template>
- </xsl:attribute>
- <TITLE>
- <xsl:apply-templates mode="title.markup" select="."/>
- </TITLE>
- <xsl:apply-templates select="sect5" mode="my.toc"/>
- </ENTRY>
-</xsl:template>
-
-<xsl:template match="sect5|colophon" mode="my.toc">
- <ENTRY>
- <xsl:attribute name="HREF">
- <xsl:call-template name="href.target">
- <xsl:with-param name="object" select="."/>
- </xsl:call-template>
- </xsl:attribute>
- <TITLE>
- <xsl:apply-templates mode="title.markup" select="."/>
- </TITLE>
- </ENTRY>
-</xsl:template>
-
-<!-- }}} -->
-
-
-</xsl:stylesheet>
+<?xml version='1.0'?>
+
+<!-- You should use this XSL stylesheet to create plugin documentation.
+
+ If you want all output in a single HTML file, specify the path to
+ your DocBook-XSL "html/docbook.xsl" file in the <xsl:import>
+ statement below. If you want each chapter to have its own file,
+ specify the path to your "html/chunk.xsl".
+
+ This stylesheet assumes the user's guide XML source is in a
+ subdirectory of the plugin's main dir (e.g., "docs/users-guide.xml").
+-->
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version='1.0'
+ xmlns="http://www.w3.org/TR/xhtml1/transitional"
+ exclude-result-prefixes="#default">
+
+<xsl:import href="file:///@docs.style.sheet@" />
+
+<!-- Swing HTML control doesn't support “ and ” -->
+<xsl:template match="quote">"<xsl:apply-templates/>"</xsl:template>
+
+<xsl:template match="guibutton">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="guiicon">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="guilabel">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="guimenu">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="guimenuitem">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="guisubmenu">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="image">
+ <p><center><img src="{src}" /></center></p>
+</xsl:template>
+
+<xsl:template match="br">
+ <br />
+</xsl:template>
+
+<xsl:param name="toc.list.type">ul</xsl:param>
+<xsl:param name="use.id.as.filename">1</xsl:param>
+<xsl:param name="shade.verbatim">1</xsl:param>
+
+<xsl:param name="funcsynopsis.style">ansi</xsl:param>
+<xsl:template match="void"><xsl:apply-templates/></xsl:template>
+
+
+<xsl:param name="chunk.first.sections">1</xsl:param>
+
+<xsl:template match="*" mode="object.title.markup.textonly">
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:variable>
+ <xsl:value-of select="$title"/>
+</xsl:template>
+
+<!-- {{{ TOC generation -->
+<xsl:template match="/">
+ <xsl:call-template name="toc"/>
+</xsl:template>
+
+<xsl:template name="toc">
+ <xsl:apply-templates/>
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="'toc.xml'"/>
+ <xsl:with-param name="method" select="'xml'"/>
+ <xsl:with-param name="indent" select="'yes'"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="toc.content"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="toc.content">
+ <TOC>
+ <xsl:apply-templates select="." mode="my.toc"/>
+ </TOC>
+</xsl:template>
+
+<xsl:template match="set" mode="my.toc">
+ <ENTRY>
+ <xsl:attribute name="HREF">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <TITLE>
+ <xsl:apply-templates mode="title.markup" select="."/>
+ </TITLE>
+ <xsl:apply-templates select="book" mode="my.toc"/>
+ </ENTRY>
+</xsl:template>
+
+<xsl:template match="book" mode="my.toc">
+ <ENTRY>
+ <xsl:attribute name="HREF">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <TITLE>
+ <xsl:apply-templates mode="title.markup" select="."/>
+ </TITLE>
+ <xsl:apply-templates select="part|reference|preface|chapter|appendix|article|colophon"
+ mode="my.toc"/>
+ </ENTRY>
+</xsl:template>
+
+<xsl:template match="part|reference|preface|chapter|appendix|article"
+ mode="my.toc">
+ <ENTRY>
+ <xsl:attribute name="HREF">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <TITLE>
+ <xsl:apply-templates mode="title.markup" select="."/>
+ </TITLE>
+ <xsl:apply-templates
+ select="preface|chapter|appendix|refentry|section|sect1"
+ mode="my.toc"/>
+ </ENTRY>
+</xsl:template>
+
+<xsl:template match="section" mode="my.toc">
+ <ENTRY>
+ <xsl:attribute name="HREF">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <TITLE>
+ <xsl:apply-templates mode="title.markup" select="."/>
+ </TITLE>
+ <xsl:apply-templates select="section" mode="my.toc"/>
+ </ENTRY>
+</xsl:template>
+
+<xsl:template match="sect1" mode="my.toc">
+ <ENTRY>
+ <xsl:attribute name="HREF">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <TITLE>
+ <xsl:apply-templates mode="title.markup" select="."/>
+ </TITLE>
+ <xsl:apply-templates select="sect2" mode="my.toc"/>
+ </ENTRY>
+</xsl:template>
+
+<xsl:template match="sect2" mode="my.toc">
+ <ENTRY>
+ <xsl:attribute name="HREF">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <TITLE>
+ <xsl:apply-templates mode="title.markup" select="."/>
+ </TITLE>
+ <xsl:apply-templates select="sect3" mode="my.toc"/>
+ </ENTRY>
+</xsl:template>
+
+<xsl:template match="sect3" mode="my.toc">
+ <ENTRY>
+ <xsl:attribute name="HREF">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <TITLE>
+ <xsl:apply-templates mode="title.markup" select="."/>
+ </TITLE>
+ <xsl:apply-templates select="sect4" mode="my.toc"/>
+ </ENTRY>
+</xsl:template>
+
+<xsl:template match="sect4" mode="my.toc">
+ <ENTRY>
+ <xsl:attribute name="HREF">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <TITLE>
+ <xsl:apply-templates mode="title.markup" select="."/>
+ </TITLE>
+ <xsl:apply-templates select="sect5" mode="my.toc"/>
+ </ENTRY>
+</xsl:template>
+
+<xsl:template match="sect5|colophon" mode="my.toc">
+ <ENTRY>
+ <xsl:attribute name="HREF">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <TITLE>
+ <xsl:apply-templates mode="title.markup" select="."/>
+ </TITLE>
+ </ENTRY>
+</xsl:template>
+
+<!-- }}} -->
+
+
+</xsl:stylesheet>
diff --git a/debian/build.properties b/debian/build.properties
index 9f1f3f6..39c38ad 100644
--- a/debian/build.properties
+++ b/debian/build.properties
@@ -5,6 +5,7 @@
### For generating the docs
config.docbook.xsl=/usr/share/xml/docbook/stylesheet/nwalsh
config.xsltproc.executable=/usr/bin/xsltproc
+config.docbook.catalog=/usr/share/xml/docbook/schema/dtd/4.4/catalog.xml
config.build.debug=true
config.build.debuglevel=lines,vars,source
diff --git a/debian/changelog b/debian/changelog
index 1e0ac83..dcac928 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,11 @@
+jedit (4.4.1+dfsg-1) unstable; urgency=low
+
+ * New upstream release.
+ * Bump Standards-Version to 3.9.2.
+ * Add docbook-xml as B-D.
+
+ -- Gabriele Giacone <1o5g4r8o at gmail.com> Fri, 12 Aug 2011 22:14:44 +0200
+
jedit (4.3.2+dfsg-3) unstable; urgency=low
* Updated bsh-src version required (Closes: #591153).
diff --git a/debian/control b/debian/control
index eb6bbe1..0745d6f 100644
--- a/debian/control
+++ b/debian/control
@@ -4,9 +4,10 @@ Priority: optional
Maintainer: Debian Java Maintainers <pkg-java-maintainers at lists.alioth.debian.org>
Uploaders: Gabriele Giacone <1o5g4r8o at gmail.com>
Build-Depends: debhelper (>= 7.0.50~), javahelper (>= 0.24), ant, ant-optional,
- docbook-xsl, xsltproc, imagemagick, quilt (>= 0.46-7~), bsh-src (>= 2.0b4-11)
+ docbook-xsl, xsltproc, imagemagick, quilt (>= 0.46-7~), bsh-src (>= 2.0b4-11),
+ docbook-xml
Build-Depends-Indep: openjdk-6-jdk | sun-java6-jdk
-Standards-Version: 3.9.1
+Standards-Version: 3.9.2
DM-Upload-Allowed: yes
Vcs-Git: git://git.debian.org/pkg-java/jedit.git
Vcs-Browser: http://git.debian.org/?p=pkg-java/jedit.git
@@ -15,7 +16,7 @@ Homepage: http://www.jedit.org/
Package: jedit
Architecture: all
Depends: ${misc:Depends}, openjdk-6-jre | sun-java6-jre, java-wrappers (>= 0.1.14)
-Description: A plugin-based editor for programmers
+Description: Plugin-based editor for programmers
As one of the most feature rich editors available, jEdit boasts support for
syntax highlighting in more than 140 languages. jEdit combines the power of
Emacs, the user-friendliness of Kate, and the advanced editing features
diff --git a/debian/jedit.doc-base.3 b/debian/jedit.doc-base.3
index 376d9bb..28770c7 100644
--- a/debian/jedit.doc-base.3
+++ b/debian/jedit.doc-base.3
@@ -1,9 +1,9 @@
Document: jedit-news
Title: jEdit NEWS
Author: Contributors <jedit-devel at lists.sourceforge.net>
-Abstract: What's New in jEdit 4.3
+Abstract: What's New in jEdit 4.4
Section: Editors
Format: HTML
-Index: /usr/share/doc/jedit/news43/index.html
-Files: /usr/share/doc/jedit/news43/*.html
+Index: /usr/share/doc/jedit/news44/index.html
+Files: /usr/share/doc/jedit/news44/*.html
diff --git a/debian/patches/02build.xml b/debian/patches/02build.xml
index 460c73c..00e3080 100644
--- a/debian/patches/02build.xml
+++ b/debian/patches/02build.xml
@@ -4,14 +4,14 @@ Author: Gabriele Giacone <1o5g4r8o at gmail.com>
--- a/jEdit/build.xml
+++ b/jEdit/build.xml
-@@ -122,6 +122,10 @@
- compiler="modern"
- encoding="UTF-8">
- <include name="org/**" />
-+ <exclude name="org/gjt/sp/jedit/bsh/servlet/*"/>
-+ <exclude name="org/gjt/sp/jedit/bsh/util/*"/>
-+ <exclude name="org/gjt/sp/jedit/bsh/util/**/*"/>
-+ <exclude name="org/gjt/sp/jedit/bsh/Console.java"/>
- <include name="com/**" />
- <compilerarg line="${config.build.compilerarg}" />
- </javac>
+@@ -143,6 +143,10 @@
+ encoding="UTF-8"
+ includeAntRuntime="false">
+ <include name="org/**"/>
++ <exclude name="org/gjt/sp/jedit/bsh/servlet/*"/>
++ <exclude name="org/gjt/sp/jedit/bsh/util/*"/>
++ <exclude name="org/gjt/sp/jedit/bsh/util/**/*"/>
++ <exclude name="org/gjt/sp/jedit/bsh/Console.java"/>
+ <include name="com/**"/>
+ <compilerarg line="${config.build.compilerarg}"/>
+ </javac>
diff --git a/jEdit/.idea/ant.xml b/jEdit/.idea/ant.xml
new file mode 100644
index 0000000..4d20dd3
--- /dev/null
+++ b/jEdit/.idea/ant.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="AntConfiguration">
+ <defaultAnt bundledAnt="true" />
+ <buildFile url="file://$PROJECT_DIR$/build.xml">
+ <additionalClassPath />
+ <antReference projectDefault="true" />
+ <customJdkName value="" />
+ <maximumHeapSize value="128" />
+ <maximumStackSize value="2" />
+ <properties />
+ </buildFile>
+ <buildFile url="file://$PROJECT_DIR$/jars/MacOSX/build.xml">
+ <additionalClassPath />
+ <antReference projectDefault="true" />
+ <customJdkName value="" />
+ <maximumHeapSize value="128" />
+ <maximumStackSize value="2" />
+ <properties />
+ </buildFile>
+ <buildFile url="file://$PROJECT_DIR$/jars/QuickNotepad/build.xml">
+ <additionalClassPath />
+ <antReference projectDefault="true" />
+ <customJdkName value="" />
+ <maximumHeapSize value="128" />
+ <maximumStackSize value="2" />
+ <properties />
+ </buildFile>
+ </component>
+</project>
+
diff --git a/jEdit/.idea/compiler.xml b/jEdit/.idea/compiler.xml
new file mode 100644
index 0000000..688274d
--- /dev/null
+++ b/jEdit/.idea/compiler.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="CompilerConfiguration">
+ <option name="DEFAULT_COMPILER" value="Javac" />
+ <resourceExtensions>
+ <entry name=".+\.(properties|xml|html|dtd|tld)" />
+ <entry name=".+\.(gif|png|jpeg|jpg)" />
+ </resourceExtensions>
+ <wildcardResourcePatterns>
+ <entry name="?*.properties" />
+ <entry name="?*.props" />
+ <entry name="?*.xml" />
+ <entry name="?*.gif" />
+ <entry name="?*.png" />
+ <entry name="?*.jpeg" />
+ <entry name="?*.jpg" />
+ <entry name="?*.html" />
+ <entry name="?*.dtd" />
+ <entry name="?*.tld" />
+ <entry name="?*.ftl" />
+ </wildcardResourcePatterns>
+ <annotationProcessing enabled="false" useClasspath="true" />
+ </component>
+</project>
+
diff --git a/jEdit/.idea/copyright/GPL_v2.xml b/jEdit/.idea/copyright/GPL_v2.xml
new file mode 100644
index 0000000..26e0ef2
--- /dev/null
+++ b/jEdit/.idea/copyright/GPL_v2.xml
@@ -0,0 +1,9 @@
+<component name="CopyrightManager">
+ <copyright>
+ <option name="notice" value="jEdit - Programmer's Text Editor
:tabSize=8:indentSize=8:noTabs=false:
:folding=explicit:collapseFolds=1:
Copyright © $today.year jEdit contributors
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA." />
+ <option name="keyword" value="Copyright" />
+ <option name="allowReplaceKeyword" value="" />
+ <option name="myName" value="GPL v2" />
+ <option name="myLocal" value="true" />
+ </copyright>
+</component>
\ No newline at end of file
diff --git a/jEdit/.idea/copyright/profiles_settings.xml b/jEdit/.idea/copyright/profiles_settings.xml
new file mode 100644
index 0000000..6d49799
--- /dev/null
+++ b/jEdit/.idea/copyright/profiles_settings.xml
@@ -0,0 +1,61 @@
+<component name="CopyrightManager">
+ <settings default="GPL v2">
+ <module2copyright />
+ <LanguageOptions name="HTML">
+ <option name="fileTypeOverride" value="2" />
+ <option name="relativeBefore" value="true" />
+ <option name="addBlankAfter" value="true" />
+ <option name="fileLocation" value="2" />
+ <option name="block" value="true" />
+ <option name="separateBefore" value="false" />
+ <option name="separateAfter" value="false" />
+ <option name="prefixLines" value="true" />
+ <option name="lenBefore" value="80" />
+ <option name="lenAfter" value="80" />
+ <option name="box" value="false" />
+ <option name="filler" value=" " />
+ </LanguageOptions>
+ <LanguageOptions name="JSP">
+ <option name="fileTypeOverride" value="2" />
+ <option name="relativeBefore" value="true" />
+ <option name="addBlankAfter" value="true" />
+ <option name="fileLocation" value="2" />
+ <option name="block" value="true" />
+ <option name="separateBefore" value="false" />
+ <option name="separateAfter" value="false" />
+ <option name="prefixLines" value="true" />
+ <option name="lenBefore" value="80" />
+ <option name="lenAfter" value="80" />
+ <option name="box" value="false" />
+ <option name="filler" value=" " />
+ </LanguageOptions>
+ <LanguageOptions name="JSPX">
+ <option name="fileTypeOverride" value="2" />
+ <option name="relativeBefore" value="true" />
+ <option name="addBlankAfter" value="true" />
+ <option name="fileLocation" value="2" />
+ <option name="block" value="true" />
+ <option name="separateBefore" value="false" />
+ <option name="separateAfter" value="false" />
+ <option name="prefixLines" value="true" />
+ <option name="lenBefore" value="80" />
+ <option name="lenAfter" value="80" />
+ <option name="box" value="false" />
+ <option name="filler" value=" " />
+ </LanguageOptions>
+ <LanguageOptions name="XML">
+ <option name="fileTypeOverride" value="2" />
+ <option name="relativeBefore" value="true" />
+ <option name="addBlankAfter" value="true" />
+ <option name="fileLocation" value="2" />
+ <option name="block" value="true" />
+ <option name="separateBefore" value="false" />
+ <option name="separateAfter" value="false" />
+ <option name="prefixLines" value="true" />
+ <option name="lenBefore" value="80" />
+ <option name="lenAfter" value="80" />
+ <option name="box" value="false" />
+ <option name="filler" value=" " />
+ </LanguageOptions>
+ </settings>
+</component>
\ No newline at end of file
diff --git a/jEdit/.idea/encodings.xml b/jEdit/.idea/encodings.xml
new file mode 100644
index 0000000..86366af
--- /dev/null
+++ b/jEdit/.idea/encodings.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="Encoding" useUTFGuessing="true" native2AsciiForPropertiesFiles="true" defaultCharsetForPropertiesFiles="ISO-8859-1">
+ <file url="PROJECT" charset="UTF-8" />
+ </component>
+</project>
+
diff --git a/jEdit/.idea/misc.xml b/jEdit/.idea/misc.xml
new file mode 100644
index 0000000..28c2f23
--- /dev/null
+++ b/jEdit/.idea/misc.xml
@@ -0,0 +1,437 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="DependencyValidationManager">
+ <scope name="jEdit Sourcefiles" pattern="file[jEdit]:org//*.java" />
+ <scope name="Modes" pattern="file[jEdit]:modes//*.xml" />
+ <scope name="Macros" pattern="file[jEdit]:macros//*.bsh" />
+ <scope name="MacOSX Sourcefiles" pattern="file[MacOSX]:macosx//*.java" />
+ <scope name="QuickNotepad Sourcefiles" pattern="file[QuickNotepad]:*.java" />
+ <option name="SKIP_IMPORT_STATEMENTS" value="false" />
+ </component>
+ <component name="IdProvider" IDEtalkID="F2207F966C6969E072D5CD57D729D7EA" />
+ <component name="JavadocGenerationManager">
+ <option name="OUTPUT_DIRECTORY" />
+ <option name="OPTION_SCOPE" value="protected" />
+ <option name="OPTION_HIERARCHY" value="true" />
+ <option name="OPTION_NAVIGATOR" value="true" />
+ <option name="OPTION_INDEX" value="true" />
+ <option name="OPTION_SEPARATE_INDEX" value="true" />
+ <option name="OPTION_DOCUMENT_TAG_USE" value="false" />
+ <option name="OPTION_DOCUMENT_TAG_AUTHOR" value="false" />
+ <option name="OPTION_DOCUMENT_TAG_VERSION" value="false" />
+ <option name="OPTION_DOCUMENT_TAG_DEPRECATED" value="true" />
+ <option name="OPTION_DEPRECATED_LIST" value="true" />
+ <option name="OTHER_OPTIONS" value="" />
+ <option name="HEAP_SIZE" />
+ <option name="LOCALE" />
+ <option name="OPEN_IN_BROWSER" value="true" />
+ </component>
+ <component name="ProjectDetails">
+ <option name="projectName" value="jEdit" />
+ </component>
+ <component name="ProjectRootManager" version="2" languageLevel="JDK_1_6" assert-keyword="true" jdk-15="true" project-jdk-name="1.6" project-jdk-type="JavaSDK">
+ <output url="file://$PROJECT_DIR$/build/idea" />
+ </component>
+ <component name="SvnBranchConfigurationManager">
+ <option name="myConfigurationMap">
+ <map>
+ <entry key="$PROJECT_DIR$">
+ <value>
+ <SvnBranchConfiguration>
+ <option name="branchMap">
+ <map>
+ <entry key="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/branches">
+ <value>
+ <list>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1218396639209" />
+ <option name="revision" value="13258" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/branches/docking_framework" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1176951697724" />
+ <option name="revision" value="9462" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/branches/jedit43_nostrings" />
+ </SvnBranchItem>
+ </list>
+ </value>
+ </entry>
+ <entry key="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags">
+ <value>
+ <list>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1226862920462" />
+ <option name="revision" value="14070" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-3-pre16" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1224211014440" />
+ <option name="revision" value="13896" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-3-pre15" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1209312241226" />
+ <option name="revision" value="12514" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-3-pre14" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1205435718427" />
+ <option name="revision" value="12215" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-3-pre13" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1197063574015" />
+ <option name="revision" value="11207" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-3-pre12" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1191436781626" />
+ <option name="revision" value="10791" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-3-pre11" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1184190109800" />
+ <option name="revision" value="10009" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-3-pre10" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1172940160439" />
+ <option name="revision" value="9074" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-0-pre1" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1172938815897" />
+ <option name="revision" value="9072" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-3-2-2" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1172934922377" />
+ <option name="revision" value="9070" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-1-final" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1172934620160" />
+ <option name="revision" value="9069" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-1-pre7" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1172934093879" />
+ <option name="revision" value="9068" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-1-pre5" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1172933950791" />
+ <option name="revision" value="9067" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-1-pre4" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1172930175040" />
+ <option name="revision" value="9066" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-2-pre12" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1172929632216" />
+ <option name="revision" value="9065" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-2-pre9" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1172929477203" />
+ <option name="revision" value="9064" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-2-pre8" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1172929096756" />
+ <option name="revision" value="9063" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-2-pre5" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1169312622101" />
+ <option name="revision" value="8692" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-3-pre9" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1163001311391" />
+ <option name="revision" value="7992" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-3-pre8" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1159851355117" />
+ <option name="revision" value="7163" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-3-pre7" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1155747706518" />
+ <option name="revision" value="6701" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-3-pre6" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1152311295000" />
+ <option name="revision" value="5556" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/after_bsh-2-0b4" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1152266138000" />
+ <option name="revision" value="5554" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/before_bsh-2-0b4" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1152181828000" />
+ <option name="revision" value="5542" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-3-pre5" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1152180149000" />
+ <option name="revision" value="5540" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-0-pre3" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1152122425000" />
+ <option name="revision" value="5531" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-0-pre2" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1150397246000" />
+ <option name="revision" value="5442" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit_43_with_gnuregexp_microstarxml" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1147475209000" />
+ <option name="revision" value="5388" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-3-pre4" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1136173007000" />
+ <option name="revision" value="5329" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-3-pre3" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1110595434000" />
+ <option name="revision" value="5202" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-3-pre2" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1108074918000" />
+ <option name="revision" value="5182" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/before-fast-scroll" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1104528786000" />
+ <option name="revision" value="5165" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-3-pre1" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1094326374000" />
+ <option name="revision" value="5129" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/before-selection-manager" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1094264677000" />
+ <option name="revision" value="5124" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/before-screen-line-refactoring" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1093748323000" />
+ <option name="revision" value="5111" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-2-final" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1090047563000" />
+ <option name="revision" value="5085" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-2-pre15" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1086297068000" />
+ <option name="revision" value="5058" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-2-pre14" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1084575691000" />
+ <option name="revision" value="5043" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-2-pre13" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1079804107000" />
+ <option name="revision" value="5002" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-2-pre11" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1079764835000" />
+ <option name="revision" value="5000" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-2-pre10" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1072501334000" />
+ <option name="revision" value="4944" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/beanshell-2-0b1" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1070236854000" />
+ <option name="revision" value="4927" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-2-pre7" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1067201848000" />
+ <option name="revision" value="4907" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-2-pre6" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1061570577000" />
+ <option name="revision" value="4867" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/crazy-pos-mgr" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1059967153000" />
+ <option name="revision" value="4844" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-2-pre4" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1058223654000" />
+ <option name="revision" value="4827" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/bsh-13b2-merge" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1057542014000" />
+ <option name="revision" value="4821" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-2-pre3" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1054263177000" />
+ <option name="revision" value="4749" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-2-pre2" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1052174343000" />
+ <option name="revision" value="4685" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/beanshell-1-3" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1051837211000" />
+ <option name="revision" value="4676" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-2-pre1" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1045976885000" />
+ <option name="revision" value="4511" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/macos-2_0_4" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1045871364000" />
+ <option name="revision" value="4508" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-1-pre11" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1045820614000" />
+ <option name="revision" value="4504" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/macos-2_0_3" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1045271361000" />
+ <option name="revision" value="4482" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-1-pre10" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1043802516000" />
+ <option name="revision" value="4451" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-1-pre9" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1042258598000" />
+ <option name="revision" value="4425" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-1-pre8" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1037919166000" />
+ <option name="revision" value="4380" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-1-pre6" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1029873100000" />
+ <option name="revision" value="4318" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-1-pre3" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1024812657000" />
+ <option name="revision" value="4284" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-1-pre2" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1024133719000" />
+ <option name="revision" value="4256" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-1-pre1" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1018587320000" />
+ <option name="revision" value="4140" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-0-final" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1017715362000" />
+ <option name="revision" value="4125" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-0-pre9" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1017050868000" />
+ <option name="revision" value="4114" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-0-pre8" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1015742549000" />
+ <option name="revision" value="4084" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-0-pre7" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1014103275000" />
+ <option name="revision" value="4052" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-0-pre6" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1012890490000" />
+ <option name="revision" value="4013" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-0-pre5" />
+ </SvnBranchItem>
+ <SvnBranchItem>
+ <option name="creationDateMillis" value="1011744082000" />
+ <option name="revision" value="3993" />
+ <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-0-pre4" />
+ </SvnBranchItem>
+ </list>
+ </value>
+ </entry>
+ </map>
+ </option>
+ <option name="branchUrls">
+ <list>
+ <option value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/branches" />
+ <option value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags" />
+ </list>
+ </option>
+ <option name="trunkUrl" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/trunk" />
+ </SvnBranchConfiguration>
+ </value>
+ </entry>
+ </map>
+ </option>
+ <option name="myVersion" value="124" />
+ <option name="mySupportsUserInfoFilter" value="true" />
+ </component>
+ <component name="VcsRevisionGraphProjectComponent">
+ <option name="_useTwoTagConvention" value="true" />
+ <option name="_showTags" value="true" />
+ <option name="_tagNaming" value="TAG_$T_MERGE_$S_TO_$D" />
+ <option name="_tagFilter" value="" />
+ <option name="_branchFilter" />
+ <option name="_showRevisionFilter" value="false" />
+ <option name="_afterDateTimeFilter" value="false" />
+ <option name="_beforeDateTimeFilter" value="false" />
+ <option name="_afterDateTime" value="" />
+ <option name="_beforeDateTime" value="" />
+ <option name="_projectRoot" value="<Use repository root>" />
+ <option name="_trunk" value="trunk" />
+ <option name="_branches" value="branches" />
+ <option name="_tags" value="tags" />
+ <option name="_showTagFilter" value="false" />
+ <option name="_showBranchFilter" value="false" />
+ </component>
+ <component name="WebServicesPlugin" addRequiredLibraries="true" />
+</project>
+
diff --git a/jEdit/.idea/modules.xml b/jEdit/.idea/modules.xml
new file mode 100644
index 0000000..9eec59d
--- /dev/null
+++ b/jEdit/.idea/modules.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="ProjectModuleManager">
+ <modules>
+ <module fileurl="file://$PROJECT_DIR$/jars/MacOSX/MacOSX.iml" filepath="$PROJECT_DIR$/jars/MacOSX/MacOSX.iml" />
+ <module fileurl="file://$PROJECT_DIR$/jars/QuickNotepad/QuickNotepad.iml" filepath="$PROJECT_DIR$/jars/QuickNotepad/QuickNotepad.iml" />
+ <module fileurl="file://$PROJECT_DIR$/jEdit.iml" filepath="$PROJECT_DIR$/jEdit.iml" />
+ </modules>
+ </component>
+</project>
+
diff --git a/jEdit/.idea/projectCodeStyle.xml b/jEdit/.idea/projectCodeStyle.xml
new file mode 100644
index 0000000..1c478ff
--- /dev/null
+++ b/jEdit/.idea/projectCodeStyle.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="CodeStyleSettingsManager">
+ <option name="PER_PROJECT_SETTINGS">
+ <value>
+ <option name="OTHER_INDENT_OPTIONS">
+ <value>
+ <option name="INDENT_SIZE" value="8" />
+ <option name="CONTINUATION_INDENT_SIZE" value="8" />
+ <option name="TAB_SIZE" value="8" />
+ <option name="USE_TAB_CHARACTER" value="true" />
+ <option name="SMART_TABS" value="false" />
+ <option name="LABEL_INDENT_SIZE" value="0" />
+ <option name="LABEL_INDENT_ABSOLUTE" value="false" />
+ </value>
+ </option>
+ <ADDITIONAL_INDENT_OPTIONS fileType="groovy">
+ <option name="INDENT_SIZE" value="2" />
+ <option name="CONTINUATION_INDENT_SIZE" value="8" />
+ <option name="TAB_SIZE" value="4" />
+ <option name="USE_TAB_CHARACTER" value="false" />
+ <option name="SMART_TABS" value="false" />
+ <option name="LABEL_INDENT_SIZE" value="0" />
+ <option name="LABEL_INDENT_ABSOLUTE" value="false" />
+ </ADDITIONAL_INDENT_OPTIONS>
+ <ADDITIONAL_INDENT_OPTIONS fileType="gsp">
+ <option name="INDENT_SIZE" value="2" />
+ <option name="CONTINUATION_INDENT_SIZE" value="8" />
+ <option name="TAB_SIZE" value="4" />
+ <option name="USE_TAB_CHARACTER" value="false" />
+ <option name="SMART_TABS" value="false" />
+ <option name="LABEL_INDENT_SIZE" value="0" />
+ <option name="LABEL_INDENT_ABSOLUTE" value="false" />
+ </ADDITIONAL_INDENT_OPTIONS>
+ <ADDITIONAL_INDENT_OPTIONS fileType="java">
+ <option name="INDENT_SIZE" value="8" />
+ <option name="CONTINUATION_INDENT_SIZE" value="8" />
+ <option name="TAB_SIZE" value="8" />
+ <option name="USE_TAB_CHARACTER" value="true" />
+ <option name="SMART_TABS" value="false" />
+ <option name="LABEL_INDENT_SIZE" value="0" />
+ <option name="LABEL_INDENT_ABSOLUTE" value="true" />
+ </ADDITIONAL_INDENT_OPTIONS>
+ <ADDITIONAL_INDENT_OPTIONS fileType="js">
+ <option name="INDENT_SIZE" value="4" />
+ <option name="CONTINUATION_INDENT_SIZE" value="8" />
+ <option name="TAB_SIZE" value="4" />
+ <option name="USE_TAB_CHARACTER" value="false" />
+ <option name="SMART_TABS" value="false" />
+ <option name="LABEL_INDENT_SIZE" value="0" />
+ <option name="LABEL_INDENT_ABSOLUTE" value="false" />
+ </ADDITIONAL_INDENT_OPTIONS>
+ <ADDITIONAL_INDENT_OPTIONS fileType="jsp">
+ <option name="INDENT_SIZE" value="4" />
+ <option name="CONTINUATION_INDENT_SIZE" value="8" />
+ <option name="TAB_SIZE" value="4" />
+ <option name="USE_TAB_CHARACTER" value="false" />
+ <option name="SMART_TABS" value="false" />
+ <option name="LABEL_INDENT_SIZE" value="0" />
+ <option name="LABEL_INDENT_ABSOLUTE" value="false" />
+ </ADDITIONAL_INDENT_OPTIONS>
+ <ADDITIONAL_INDENT_OPTIONS fileType="php">
+ <option name="INDENT_SIZE" value="4" />
+ <option name="CONTINUATION_INDENT_SIZE" value="8" />
+ <option name="TAB_SIZE" value="4" />
+ <option name="USE_TAB_CHARACTER" value="false" />
+ <option name="SMART_TABS" value="false" />
+ <option name="LABEL_INDENT_SIZE" value="0" />
+ <option name="LABEL_INDENT_ABSOLUTE" value="false" />
+ </ADDITIONAL_INDENT_OPTIONS>
+ <ADDITIONAL_INDENT_OPTIONS fileType="sql">
+ <option name="INDENT_SIZE" value="2" />
+ <option name="CONTINUATION_INDENT_SIZE" value="8" />
+ <option name="TAB_SIZE" value="4" />
+ <option name="USE_TAB_CHARACTER" value="false" />
+ <option name="SMART_TABS" value="false" />
+ <option name="LABEL_INDENT_SIZE" value="0" />
+ <option name="LABEL_INDENT_ABSOLUTE" value="false" />
+ </ADDITIONAL_INDENT_OPTIONS>
+ <ADDITIONAL_INDENT_OPTIONS fileType="xml">
+ <option name="INDENT_SIZE" value="8" />
+ <option name="CONTINUATION_INDENT_SIZE" value="8" />
+ <option name="TAB_SIZE" value="8" />
+ <option name="USE_TAB_CHARACTER" value="true" />
+ <option name="SMART_TABS" value="false" />
+ <option name="LABEL_INDENT_SIZE" value="0" />
+ <option name="LABEL_INDENT_ABSOLUTE" value="false" />
+ </ADDITIONAL_INDENT_OPTIONS>
+ <ADDITIONAL_INDENT_OPTIONS fileType="yml">
+ <option name="INDENT_SIZE" value="2" />
+ <option name="CONTINUATION_INDENT_SIZE" value="8" />
+ <option name="TAB_SIZE" value="4" />
+ <option name="USE_TAB_CHARACTER" value="false" />
+ <option name="SMART_TABS" value="false" />
+ <option name="LABEL_INDENT_SIZE" value="0" />
+ <option name="LABEL_INDENT_ABSOLUTE" value="false" />
+ </ADDITIONAL_INDENT_OPTIONS>
+ </value>
+ </option>
+ <option name="USE_PER_PROJECT_SETTINGS" value="true" />
+ </component>
+</project>
+
diff --git a/jEdit/.idea/runConfigurations/jEdit.xml b/jEdit/.idea/runConfigurations/jEdit.xml
new file mode 100644
index 0000000..a05dc50
--- /dev/null
+++ b/jEdit/.idea/runConfigurations/jEdit.xml
@@ -0,0 +1,37 @@
+<component name="ProjectRunConfigurationManager">
+ <configuration default="false" name="jEdit" type="Application" factoryName="Application">
+ <log_file path="$PROJECT_DIR$/build/settings/activity.log" checked="true" skipped="true" show_all="false" alias="Activity Log" />
+ <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="emma" />
+ <extension name="snapshooter" />
+ <option name="MAIN_CLASS_NAME" value="org.gjt.sp.jedit.jEdit" />
+ <option name="VM_PARAMETERS" value="-Xmx192M" />
+ <option name="PROGRAM_PARAMETERS" value="-settings="$PROJECT_DIR$/build/settings"" />
+ <option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
+ <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+ <option name="ALTERNATIVE_JRE_PATH" value="" />
+ <option name="ENABLE_SWING_INSPECTOR" value="false" />
+ <option name="ENV_VARIABLES" />
+ <option name="PASS_PARENT_ENVS" value="true" />
+ <module name="jEdit" />
+ <envs />
+ <RunnerSettings RunnerId="Debug">
+ <option name="DEBUG_PORT" value="1341" />
+ <option name="TRANSPORT" value="0" />
+ <option name="LOCAL" value="true" />
+ </RunnerSettings>
+ <RunnerSettings RunnerId="JProfiler">
+ <option name="WINDOW" value="false" />
+ <option name="JVMPI" value="false" />
+ <option name="INTERPRETED" value="false" />
+ </RunnerSettings>
+ <RunnerSettings RunnerId="Run" />
+ <ConfigurationWrapper RunnerId="Debug" />
+ <ConfigurationWrapper RunnerId="JProfiler" />
+ <ConfigurationWrapper RunnerId="Run" />
+ <method>
+ <option name="AntTarget" enabled="true" antfile="file://$PROJECT_DIR$/build.xml" target="build" />
+ <option name="Make" enabled="false" />
+ <option name="Run Ant target" value="true" />
+ </method>
+ </configuration>
+</component>
\ No newline at end of file
diff --git a/jEdit/.idea/runConfigurations/jEdit__background_mode_.xml b/jEdit/.idea/runConfigurations/jEdit__background_mode_.xml
new file mode 100644
index 0000000..cdc8629
--- /dev/null
+++ b/jEdit/.idea/runConfigurations/jEdit__background_mode_.xml
@@ -0,0 +1,30 @@
+<component name="ProjectRunConfigurationManager">
+ <configuration default="false" name="jEdit (background mode)" type="Application" factoryName="Application">
+ <log_file path="$PROJECT_DIR$/build/settings/activity.log" checked="true" skipped="true" show_all="false" alias="Activity Log" />
+ <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="emma" />
+ <extension name="snapshooter" />
+ <option name="MAIN_CLASS_NAME" value="org.gjt.sp.jedit.jEdit" />
+ <option name="VM_PARAMETERS" value="-Xmx192M" />
+ <option name="PROGRAM_PARAMETERS" value="-settings="$PROJECT_DIR$/build/settings" -background" />
+ <option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
+ <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+ <option name="ALTERNATIVE_JRE_PATH" value="" />
+ <option name="ENABLE_SWING_INSPECTOR" value="false" />
+ <option name="ENV_VARIABLES" />
+ <option name="PASS_PARENT_ENVS" value="true" />
+ <module name="jEdit" />
+ <envs />
+ <RunnerSettings RunnerId="JProfiler">
+ <option name="WINDOW" value="false" />
+ <option name="JVMPI" value="false" />
+ <option name="INTERPRETED" value="false" />
+ </RunnerSettings>
+ <RunnerSettings RunnerId="Run" />
+ <ConfigurationWrapper RunnerId="Run" />
+ <method>
+ <option name="AntTarget" enabled="true" antfile="file://$PROJECT_DIR$/build.xml" target="build" />
+ <option name="Make" enabled="false" />
+ <option name="Run Ant target" value="true" />
+ </method>
+ </configuration>
+</component>
\ No newline at end of file
diff --git a/jEdit/.idea/uiDesigner.xml b/jEdit/.idea/uiDesigner.xml
new file mode 100644
index 0000000..3b00020
--- /dev/null
+++ b/jEdit/.idea/uiDesigner.xml
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="Palette2">
+ <group name="Swing">
+ <item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
+ <default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
+ </item>
+ <item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
+ <default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
+ </item>
+ <item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
+ <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
+ </item>
+ <item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
+ <default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
+ </item>
+ <item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
+ <default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
+ <initial-values>
+ <property name="text" value="Button" />
+ </initial-values>
+ </item>
+ <item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
+ <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+ <initial-values>
+ <property name="text" value="RadioButton" />
+ </initial-values>
+ </item>
+ <item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
+ <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+ <initial-values>
+ <property name="text" value="CheckBox" />
+ </initial-values>
+ </item>
+ <item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
+ <default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
+ <initial-values>
+ <property name="text" value="Label" />
+ </initial-values>
+ </item>
+ <item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
+ <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+ <preferred-size width="150" height="-1" />
+ </default-constraints>
+ </item>
+ <item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
+ <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+ <preferred-size width="150" height="-1" />
+ </default-constraints>
+ </item>
+ <item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
+ <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+ <preferred-size width="150" height="-1" />
+ </default-constraints>
+ </item>
+ <item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
+ <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+ <preferred-size width="150" height="50" />
+ </default-constraints>
+ </item>
+ <item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
+ <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+ <preferred-size width="150" height="50" />
+ </default-constraints>
+ </item>
+ <item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
+ <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+ <preferred-size width="150" height="50" />
+ </default-constraints>
+ </item>
+ <item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
+ <default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
+ </item>
+ <item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
+ <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+ <preferred-size width="150" height="50" />
+ </default-constraints>
+ </item>
+ <item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
+ <default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
+ <preferred-size width="150" height="50" />
+ </default-constraints>
+ </item>
+ <item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
+ <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+ <preferred-size width="150" height="50" />
+ </default-constraints>
+ </item>
+ <item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
+ <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+ <preferred-size width="200" height="200" />
+ </default-constraints>
+ </item>
+ <item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
+ <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+ <preferred-size width="200" height="200" />
+ </default-constraints>
+ </item>
+ <item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
+ <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+ </item>
+ <item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
+ <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+ </item>
+ <item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
+ <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
+ </item>
+ <item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
+ <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
+ </item>
+ <item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
+ <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
+ <preferred-size width="-1" height="20" />
+ </default-constraints>
+ </item>
+ <item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
+ <default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
+ </item>
+ <item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
+ <default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
+ </item>
+ </group>
+ </component>
+</project>
+
diff --git a/jEdit/.idea/vcs.xml b/jEdit/.idea/vcs.xml
new file mode 100644
index 0000000..81ec500
--- /dev/null
+++ b/jEdit/.idea/vcs.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="IssueNavigationConfiguration">
+ <option name="links">
+ <list>
+ <IssueNavigationLink>
+ <option name="issueRegexp" value="\d+" />
+ <option name="linkRegexp" value="http://sourceforge.net/support/tracker.php?aid=$0" />
+ </IssueNavigationLink>
+ </list>
+ </option>
+ </component>
+ <component name="VcsDirectoryMappings">
+ <mapping directory="" vcs="svn" />
+ </component>
+</project>
+
diff --git a/jEdit/README.SRC.txt b/jEdit/README.SRC.txt
index 9787c69..cf9ee1d 100644
--- a/jEdit/README.SRC.txt
+++ b/jEdit/README.SRC.txt
@@ -1,187 +1,218 @@
-SOURCE CODE NOTES
-
-This file only contains information about compiling from source.
-General jEdit documentation can be found in the 'doc' directory.
-
-* Requirements
-
- For all tasks:
-
- - Apache Ant. I use version 1.7; older or newer versions might or might not
- work. If an older version doesn't work, install an update. If a newer
- version doesn't work, please submit a bug report.
- Get it from <http://ant.apache.org>.
- - The Ant-nodeps package. This is included in the download from ants website,
- as well as the AntPlugin from the Plugin Manager,
- but not in some default installs on various *nix systems.
- There you should get the ant-nodeps package through your
- package management system.
- - Configure the build.properties.sample file with your local paths and save it
- as build.properties.
- - Make sure you also have the build-support module.
- - Configure the build.properties.sample file from build-support with your
- local paths and save it as build.properties in the folder jars.
-
- For building jEdit, the API documentation or any of the
- distribution files except of the source package:
-
- - A Java compiler of at least version 1.5, such as Sun's javac
- which is included in the JDK. Get it from <http://java.sun.com/downloads/>
-
- For building the API documentation:
-
- - Sun's javadoc tool, which is included in the JDK.
- Get it from <http://java.sun.com/downloads/>
-
- For building the online help in either HTML- or PDF-format:
-
- - DocBook XML 4.4. called "docbook-dtd" or "docbook-xml" from package managers.
- Get it from <http://www.docbook.org/xml/4.4/>. Contains catalog information.
- - DocBook XSL. Called "docbook-xsl" in package managers.
- Contains style sheets for transformation into HTML or FO.
- Don't use a ".0" version, these are experimental releases.
- <http://www.sourceforge.net/project/showfiles.php?group_id=21935&package_id=16608>
- - xsltproc. sometimes packaged as "libxslt" from package managers:
- This is originally a *nix program, but there are ports
- e. g. for Windows too. Get it from <http://www.xmlsoft.org/XSLT/downloads.html>
- or <http://www.zlatkovic.com/libxml.en.html>.
-
- For building the online help in PDF-format:
-
- - Apache FOP 0.20.5. The 0.92 beta version will NOT work!
- Get it from <http://xmlgraphics.apache.org/fop/download.html>
-
- For building the windows installer (for the final step):
-
- - Inno Setup. Get it from <http://www.jrsoftware.org/isdl.php>
- - A box running windows.
-
- For building the Mac OS X disk image (DMG) for easy distribution (for the final step):
-
- - A box running Mac OS X
-
-
-* Tasks
-
- If all necessary tools are installed and set up, you can use ant with a couple of targets.
- The default target if you just run "ant" is "build", like running "ant build".
-
- - build build the jEdit JAR-file with full debug-information
- builds jEdit in the build-folder, configured in build.properties,
- with full debug information included.
-
- - run run jEdit
- runs the jEdit-version in the build-folder, configured in build.properties.
- If there isn't any, it builds it in front of execution.
-
- - docs-html generate HTML docs (needs xsltproc)
- builds the online help in HTML-format in the build-folder, configured in build.properties.
-
- - docs-javadoc generate JavaDoc API docs
- builds the API documentation in the build-folder, configured in build.properties.
-
- - docs-pdf-USletter generate PDF users-guide with US letter paper size (needs xsltproc and fop)
- builds the User's Guide in PDF-format with US letter page size
- in the build-folder, configured in build.properties.
-
- - docs-pdf-a4 generate PDF users-guide with A4 paper size (needs xsltproc and fop)
- builds the User's Guide in PDF-format with A4 page size
- in the build-folder, configured in build.properties.
-
- - dist build all distribution files
- builds all distribution files or prepares the final step for some of them (Win and Mac)
- in the dist-folder, configured in build.properties.
-
- - dist-deb build the DEB Package
- builds the DEB Debian package in the dist-folder, configured in build.properties.
-
- - dist-java build the Java-installer
- builds the Java installer in the dist-folder, configured in build.properties.
-
- - dist-mac build the Mac OS X disk image (DMG-file)
- builds the Mac OS X internet-enabled disk image (DMG-file) if building on a box
- running Mac OS X. If building on a box running something else, there will be a file
- called jedit<version_here>-dist-mac-finish.tar.bz2 in the dist-folder,
- configured in build.properties. Give that to someone running Mac OS X and ask him
- to extract the archive and to execute "ant dist-mac-finish".
- The only thing that needs to be installed for this final step is Apache Ant.
-
- - dist-mac-finish finish building the Mac OS X disk image (DMG-file) on Mac OS X
- builds the Mac OS X internet-enabled disk image (DMG-file) in the dist-folder,
- configured in build.properties if building on a box running Mac OS X.
- This target is normally only run directly, if someone just has to do
- the final step that was prepared by "dist-mac" or "dist".
-
- - dist-manuals build the PDF-manuals
- builds the User's Guide in PDF-format with both, USletter and A4 page size
- in the dist-folder, configured in build.properties.
-
- - dist-slackware build the Slackware Package
- builds the Slackware TGZ package in the dist-folder, configured in build.properties.
-
- - dist-src build the src-archive
- builds the source package in the dist-folder, configured in build.properties.
-
- - dist-win build the Windows installer (EXE-file)
- builds the windows installer in the dist-folder, configured in build.properties,
- on a box running Windows. If building on a box running something else, there will be
- a file called jedit<version_here>-dist-win-finish.tar.bz2 in the dist-folder,
- configured in build.properties. Give that to someone running Windows and ask him
- to extract the archive and to execute "ant dist-win-finish".
- The only things that need to be installed for this final step is Apache Ant, and
- Inno Setup. Prior to running "ant dist-win-finish", the helper has to set up the
- build.properties file with the path to his Inno Setup installation.
-
- - dist-win-finish finish building the Windows installer (EXE-file) on Windows
- build the windows installer in the dist-folder, configured in build.properties if
- building on a box running Winows. This target is normally only run directly, if
- someone just has to do the final step that was prepared by "dist-win" or "dist".
-
- - clean clean up build.dir and dist.dir
- cleans up the temporary files from the build- and dist-folder, configured in build.properties.
- Leaves the runnable jEdit, and the distribution files in place.
-
- - clean-all clean up build.dir and dist.dir completely
- cleans up all files from the build- and dist-folder, configured in build.properties,
- and the folders itself too.
-
-
-
-* Interesting algorithms and tricks
-
- - org.gjt.sp.jedit.browser.VFSDirectoryEntryTable: a tree table control.
-
- - org.gjt.sp.jedit.buffer.LineManager: the "gap" optimization allows
- update operations to be performed in O(1) time in certain
- circumstances.
-
- - org.gjt.sp.jedit.buffer.KillRing: uses a hash to speed up comparisons
- with sets of strings.
-
- - org.gjt.sp.jedit.search.BoyerMooreSearchMatcher: fast text search.
-
- - org.gjt.sp.jedit.syntax.TokenMarker: generic tokenizer driven by rules
- defined in an XML file.
-
- - org.gjt.sp.jedit.textarea.DisplayManager: the fold visibility map
- looks like an RLE-compressed bit set but does lookups in O(log n).
-
- - org.gjt.sp.util.WorkThreadPool: a pool of threads executing requests
- from a queue, enforcing various concurrency requirements.
-
-
-
-* Tips for Eclipse/NetBeans/IDE users:
-
-Some of the source directories are only needed for building packages on
-certain platforms. If you add jEdit source to an IDE like Eclipse that tries
-to build everything, you'll get some errors from these directories unless
-you have the right libraries. However, if you tell Eclipse to exclude these
-directories, you can still build and run/debug jEdit from source.
-Follow these steps:
-
- - Project properties - Java build path
- - Source - Excluded dirs - Edit - Add multiple
- - Add these subdirs: jars, net, de, build
-
-
+SOURCE CODE NOTES
+
+This file only contains information about compiling from source.
+General jEdit documentation can be found in the 'doc' directory.
+
+* Requirements
+
+ For all tasks:
+
+ - Apache Ant. I use version 1.7; older or newer versions might or might not
+ work. If an older version doesn't work, install an update. If a newer
+ version doesn't work, please submit a bug report.
+ Get it from <http://ant.apache.org>.
+ - The Ant Optional package. This is included in the download from ants website,
+ as well as the AntPlugin from the Plugin Manager,
+ but not in some default installs on various *nix systems.
+ There you should get the ant-optional package through your
+ package management system.
+ - Configure the build.properties.sample file with your local paths and save it
+ as build.properties.
+ - Make sure you also have the build-support module.
+ - Configure the build.properties.sample file from build-support with your
+ local paths and save it as build.properties in the folder jars.
+
+ For building jEdit, the API documentation or any of the
+ distribution files except of the source package:
+
+ - A Java compiler of at least version 1.6, such as Sun's javac
+ which is included in the JDK. Get it from <http://www.java.com/download> or
+ from your package manager - e. g. sun-java6-jdk.
+
+ For building the API documentation:
+
+ - Sun's javadoc tool, which is included in the JDK.
+ Get it from <http://www.java.com/download> or from your package
+ manager - e. g. sun-java6-jdk.
+
+ For building the online help in either HTML- or PDF-format:
+
+ - DocBook XML 4.4. Get it from <http://www.docbook.org/xml/4.4/> or from your
+ package manager - e. g. "docbook-xml" or "docbook-dtd". This contains
+ the DocBook definition and catalog information.
+ - DocBook XSL.
+ Get it from <http://sourceforge.net/projects/docbook/files/docbook-xsl/> or
+ from your package manager - e. g. "docbook-xsl". This contains style sheets
+ for transformation into HTML or FO (for PDF).
+ Don't use a ".0" version, these are experimental releases. They are normally
+ followed by a ".1" version short time after release of the ".0" version.
+ - Set the "docbook.catalog" property in build.properties to the path of the
+ catalog.xml catalog file. Examples for various OS can be found in
+ build.properties.sample.
+ - Set the "docbook.xsl" property in build.properties to the installation path
+ of the DocBook XSL files. Examples for various OS can be found in
+ build.properties.sample.
+ - xsltproc. This is originally a *nix program, but there are ports e. g. for
+ Windows too. Get it from <http://www.xmlsoft.org/XSLT/downloads.html> or
+ from your package manager.
+ - Set the "xsltproc.executable" property in build.properties to the path of
+ your xsltproc executable. If it is in your PATH environment variable,
+ "xsltproc" is sufficient as value. Examples for various OS can be found in
+ build.properties.sample.
+
+ For building the online help in PDF-format:
+
+ - Apache FOP. Get it from <http://xmlgraphics.apache.org/fop/download.html> or
+ from your package manager. The old 0.20.5 release will not work anymore with
+ our files. 0.93 or newer has to be used.
+
+ For building the windows EXE launcher:
+
+ - Launch4j. Get it from <http://sourceforge.net/projects/launch4j/files/>
+
+ For building the windows installer (for the final step):
+
+ - Unicode Inno Setup. Get it from <http://www.jrsoftware.org/isdl.php>
+ - A box running windows or wine, e. g. on *nix. If Inno Setup should be
+ run via wine, a wine version of at least 1.3.10 is required because
+ of a bug in earlier wine versions.
+
+ For building the Mac OS X disk image (DMG) for easy distribution
+ (for the final step):
+
+ - A box running Mac OS X
+
+
+* Tasks
+
+ If all necessary tools are installed and set up, you can use ant with a couple of targets.
+ The default target if you just run "ant" is "build", like running "ant build".
+
+ - build build the jEdit JAR-file with full debug-information
+ builds jEdit in the build-folder, configured in build.properties,
+ with full debug information included.
+
+ - build-exe-launcher build the EXE launcher
+ builds the EXE launcher in the build-folder, configured in build.properties.
+
+ - run run jEdit
+ runs the jEdit-version in the build-folder, configured in build.properties.
+ If there isn't any, it builds it in front of execution.
+
+ - run-debug run jEdit with debug listening enabled
+ runs the jEdit-version in the build-folder, configured in build.properties.
+ If there isn't any, it builds it in front of execution.
+ The debug listening for this JVM is enabled.
+
+ - docs-html generate HTML docs (needs xsltproc)
+ builds the online help in HTML-format in the build-folder, configured in build.properties.
+
+ - docs-javadoc generate JavaDoc API docs
+ builds the API documentation in the build-folder, configured in build.properties.
+
+ - docs-pdf-USletter generate PDF users-guide with US letter paper size (needs xsltproc and fop)
+ builds the User's Guide in PDF-format with US letter page size
+ in the build-folder, configured in build.properties.
+
+ - docs-pdf-a4 generate PDF users-guide with A4 paper size (needs xsltproc and fop)
+ builds the User's Guide in PDF-format with A4 page size
+ in the build-folder, configured in build.properties.
+
+ - dist build all distribution files
+ builds all distribution files or prepares the final step for some of them (Win and Mac)
+ in the dist-folder, configured in build.properties.
+
+ - dist-deb build the DEB Package
+ builds the DEB Debian package in the dist-folder, configured in build.properties.
+
+ - dist-java build the Java-installer
+ builds the Java installer in the dist-folder, configured in build.properties.
+
+ - dist-mac build the Mac OS X disk image (DMG-file)
+ builds the Mac OS X internet-enabled disk image (DMG-file) if building on a box
+ running Mac OS X. If building on a box running something else, there will be a file
+ called jedit<version_here>-dist-mac-finish.tar.bz2 in the dist-folder,
+ configured in build.properties. Give that to someone running Mac OS X and ask him
+ to extract the archive and to execute "ant dist-mac-finish".
+ The only thing that needs to be installed for this final step is Apache Ant.
+
+ - dist-mac-finish finish building the Mac OS X disk image (DMG-file) on Mac OS X
+ builds the Mac OS X internet-enabled disk image (DMG-file) in the dist-folder,
+ configured in build.properties if building on a box running Mac OS X.
+ This target is normally only run directly, if someone just has to do
+ the final step that was prepared by "dist-mac" or "dist".
+
+ - dist-manuals build the PDF-manuals
+ builds the User's Guide in PDF-format with both, USletter and A4 page size
+ in the dist-folder, configured in build.properties.
+
+ - dist-slackware build the Slackware Package
+ builds the Slackware TGZ package in the dist-folder, configured in build.properties.
+
+ - dist-src build the src-archive
+ builds the source package in the dist-folder, configured in build.properties.
+
+ - dist-win build the Windows installer (EXE-file)
+ builds the windows installer in the dist-folder, configured in build.properties,
+ on a box running Windows. If building on a box running something else, there will be
+ a file called jedit<version_here>-dist-win-finish.tar.bz2 in the dist-folder,
+ configured in build.properties. Give that to someone running Windows and ask him
+ to extract the archive and to execute "ant dist-win-finish".
+ The only things that need to be installed for this final step is Apache Ant
+ and Inno Setup. Prior to running "ant dist-win-finish", the helper has to set
+ up the build.properties file with the path to his Inno Setup installation.
+
+ - dist-win-finish finish building the Windows installer (EXE-file) on Windows or via wine
+ build the windows installer in the dist-folder, configured in build.properties if
+ building on a box running Windows or via wine. This target is normally only run directly, if
+ someone just has to do the final step that was prepared by "dist-win" or "dist".
+
+ - clean clean up build.dir and dist.dir
+ cleans up the temporary files from the build- and dist-folder, configured in build.properties.
+ Leaves the runnable jEdit, and the distribution files in place.
+
+ - clean-all clean up build.dir and dist.dir completely
+ cleans up all files from the build- and dist-folder, configured in build.properties,
+ and the folders itself too.
+
+
+
+* Interesting algorithms and tricks
+
+ - org.gjt.sp.jedit.browser.VFSDirectoryEntryTable: a tree table control.
+
+ - org.gjt.sp.jedit.buffer.LineManager: the "gap" optimization allows
+ update operations to be performed in O(1) time in certain
+ circumstances.
+
+ - org.gjt.sp.jedit.buffer.KillRing: uses a hash to speed up comparisons
+ with sets of strings.
+
+ - org.gjt.sp.jedit.search.BoyerMooreSearchMatcher: fast text search.
+
+ - org.gjt.sp.jedit.syntax.TokenMarker: generic tokenizer driven by rules
+ defined in an XML file.
+
+ - org.gjt.sp.jedit.textarea.DisplayManager: the fold visibility map
+ looks like an RLE-compressed bit set but does lookups in O(log n).
+
+ - org.gjt.sp.util.WorkThreadPool: a pool of threads executing requests
+ from a queue, enforcing various concurrency requirements.
+
+
+
+* Tips for Eclipse/NetBeans/IDE users:
+
+Some of the source directories are only needed for building packages on
+certain platforms. If you add jEdit source to an IDE like Eclipse that tries
+to build everything, you'll get some errors from these directories unless
+you have the right libraries. However, if you tell Eclipse to exclude these
+directories, you can still build and run/debug jEdit from source.
+Follow these steps:
+
+ - Project properties - Java build path
+ - Source - Excluded dirs - Edit - Add multiple
+ - Add these subdirs: jars, net, de, build
+
+The "eclipse-formatting.xml" file can be used to set the
+code format style to be the same as what is currently used here.
diff --git a/jEdit/build.properties.sample b/jEdit/build.properties.sample
index 32e3e05..010a669 100644
--- a/jEdit/build.properties.sample
+++ b/jEdit/build.properties.sample
@@ -1,62 +1,106 @@
-###
-### Build property file for jEdit
-###
-
-### The directory where to put the build-files
-### Use a directory exclusive used for that,
-### because the target "clean-all" will delete
-### it with all its content. (So don't use your
-### home-directory or your project-directory
-### if you don't want to loose all your files!)
-### This has to be a relative directory.
-#build.dir=build
-
-### The directory where to put the distribution-files
-### Use a directory exclusive used for that,
-### because the target "clean-all" will delete
-### it with all its content. (So don't use your
-### home-directory or your project-directory
-### if you don't want to loose all your files!)
-### This has to be a relative directory.
-#dist.dir=dist
-
-### The name of the Inno Setup command line compiler
-### executable for building the Windows installer.
-#innosetup.compiler.executable=C:\\Programme\\Inno Setup 5\\ISCC.exe
-
-# If xsltproc is in your path, uncomment this:
-#xsltproc.executable=xsltproc
-
-### For generating the docs, adjust the following to your local paths
-### For xsltproc to work, the path to the DocBook stuff MUST NOT contain spaces!
-
-# cygwin "docbook-xml44" and "docbook-xsl" packages
-# can be used to install docbook-xml and docbook-dtd
-# (example windows locations):
-#docbook.catalog=c:/cygwin/usr/share/xml/docbook/4.4/docbook.cat
-#docbook.xsl=c:/cygwin/usr/share/docbook-xsl
-#xsltproc.executable=C:/cygwin/usr/bin/xsltproc.exe
-
-# Example Debian locations
-#docbook.xsl=/usr/share/xml/docbook/stylesheet/nwalsh
-#docbook.catalog=/usr/share/xml/docbook/schema/dtd/4.4/docbook.cat
-
-# Example Fink (Mac OS/X) locations
-#docbook.catalog=/sw/share/xml/dtd/docbookx/4.4.0/docbook.cat
-#docbook.xsl=/sw/share/xml/xsl/docbook-xsl
-
-### For uploading the docs to the public webserver
-### adjust the following to your local path
-#rsync.executable=C:\\Programme\\cwRsync\\bin\\rsync.exe
-# If it's in your path, this is sufficient:
-#rsync.executable=rsync
-
-### If you want to build the PDF user's guide,
-### set this to your local FOP install directory.
-### (the above three properties are needed also)
-#fop.dir=C:\\Programme\\FOP
-
-# debug settings
-build.debug=true
-build.debuglevel=lines,vars,source
-
+###
+### Build property file for jEdit
+###
+
+### The directory where to put the build-files
+### Use a directory exclusive used for that,
+### because the target "clean-all" will delete
+### it with all its content. (So don't use your
+### home-directory or your project-directory
+### if you don't want to loose all your files!)
+### This has to be a relative directory.
+#build.dir=build
+
+### The directory where to put the distribution-files
+### Use a directory exclusive used for that,
+### because the target "clean-all" will delete
+### it with all its content. (So don't use your
+### home-directory or your project-directory
+### if you don't want to loose all your files!)
+### This has to be a relative directory.
+#dist.dir=dist
+
+### The name of the wine executable for building the Windows installer on *nix.
+#wine.executable=wine
+
+### The name of the winepath executable for translating paths for wine.
+#winepath.executable=winepath
+
+### The name of the Inno Setup command line compiler
+### executable for building the Windows installer.
+
+# Example Windows location
+#innosetup.compiler.executable=C:\\Program Files\\Inno Setup 5\\ISCC.exe
+
+# Example wine location
+#innosetup.compiler.executable=/home/vampire/.wine/drive_c/Program Files/Inno Setup 5/ISCC.exe
+#innosetup.via.wine=true
+
+### For generating the docs, adjust the following to your local paths
+### Prefer xml over sgml packages if available.
+### For xsltproc to work, the path to the DocBook stuff MUST NOT contain spaces!
+### If you need multiple catalogs, then use a space as separator
+
+# Example Windows locations
+#xsltproc.executable=C:\\Programme\\xsltproc\\xsltproc.exe
+#docbook.xsl=C:\\Programme\\DocBook\\XSL\\1.75.2\\
+#docbook.catalog=C:\\Programme\\DocBook\\XML\\4.4\\catalog.xml
+
+# Example Cygwin locations
+#xsltproc.executable=C:\\cygwin\\usr\\bin\\xsltproc.exe
+#docbook.xsl=c:\\cygwin\\usr\\share\\docbook-xsl
+#docbook.catalog=c:\\cygwin\\usr\\share\\xml\\docbook\\4.4\\catalog.xml
+
+# Example Debian and Ubuntu locations
+#xsltproc.executable=xsltproc
+#docbook.xsl=/usr/share/xml/docbook/stylesheet/docbook-xsl
+#docbook.xsl=/usr/share/xml/docbook/stylesheet/nwalsh
+#docbook.catalog=/usr/share/xml/docbook/schema/dtd/4.4/catalog.xml
+
+# Example Fedora Core locations
+#xsltproc.executable=xsltproc
+#docbook.xsl=/usr/share/sgml/docbook/xsl-stylesheets
+#docbook.catalog=/usr/share/sgml/docbook/xml-dtd-4.4-1.0-48.fc12/catalog
+
+# Example Fink (Mac OS/X) locations
+#xsltproc.executable=xsltproc
+#docbook.catalog=/sw/share/xml/dtd/docbookx/4.4.0/docbook.cat
+#docbook.xsl=/sw/share/xml/xsl/docbook-xsl
+
+### For uploading the docs to the public webserver
+### adjust the following to your local path
+#rsync.executable=C:\\Programme\\cwRsync\\bin\\rsync.exe
+# If it's in your path, this is sufficient:
+#rsync.executable=rsync
+
+### If you want to build the PDF user's guide,
+### set this to your local FOP install directory.
+### (the above three properties are needed also)
+
+# Example Windows location
+#fop.dir=C:\\Programme\\FOP
+
+# Example Linux location
+#fop.dir=/opt/fop-1.0
+
+# Example Debian and Ubuntu location
+#fop.dir=/usr/share/java
+
+### For generating the Windows executable file, make sure to install
+### Launch4j and set the path to Launch4j install directory here
+
+# Example Windows location
+#launch4j.dir=C:\\Programme\\launch4j
+
+# Example Linux location
+#launch4j.dir=/opt/launch4j
+
+# debug settings
+#build.debug=true
+#build.debuglevel=lines,vars,source
+#docbook.catalog.debug=1
+
+# warning settings
+#build.nowarn=false
+#build.deprecation=true
+#build.compilerarg=-Xlint:unchecked
diff --git a/jEdit/build.xml b/jEdit/build.xml
index 5f543f6..c11e3d3 100644
--- a/jEdit/build.xml
+++ b/jEdit/build.xml
@@ -1,1475 +1,1628 @@
-<?xml version="1.0"?>
-<project name="jedit"
- default="build">
- <description>
- This is an ant build.xml file for building jEdit - Programmer's Text Editor.
- </description>
-
- <property file="build.properties"
- prefix="config" />
-
- <!-- jEdit Version -->
- <property name="jedit.version"
- value="4.3.2" />
- <property name="jedit.build.number"
- value="04.03.99.02" />
-
- <!-- Target Java Versions -->
- <property name="target.java.version"
- value="1.5" />
- <property name="mac.target.java.version"
- value="1.5+" />
- <property name="slackware.target.java.version"
- value="1_5_0_07-i586-1" />
-
- <!-- Various Paths -->
- <property name="config.build.dir"
- value="build" />
- <property name="config.dist.dir"
- value="dist" />
- <property name="build.dir"
- location="${config.build.dir}" />
- <property name="dist.dir"
- location="${config.dist.dir}" />
- <property name="classes.dir"
- location="${build.dir}/classes" />
- <property name="jar.location"
- location="${build.dir}" />
-
- <property name="textAreaPackage" location="../textarea" />
- <!-- Various Filenames -->
- <property name="jar.filename"
- value="${ant.project.name}.jar" />
- <property name="dist.jar.filename"
- value="jedit${jedit.version}install.jar" />
- <property name="manual.filename.prefix"
- value="jedit${jedit.version}manual-" />
- <property name="src.archive.filename"
- value="jedit${jedit.version}source.tar.bz2" />
- <property name="win.filename"
- value="jedit${jedit.version}install" />
- <property name="mac.disk.image.filename"
- value="jedit${jedit.version}install.dmg" />
-
- <!-- Miscellaneous -->
- <property name="config.build.debuglevel"
- value="lines,vars,source" />
- <property name="config.build.deprecation"
- value="true" />
- <property name="config.build.compilerarg"
- value="-Xlint:unchecked" />
-
- <!-- Cygwin detection (xsltproc needs special arguments) -->
- <dirname property="xsltproc.dir" file="${config.xsltproc.executable}" />
- <available file="${xsltproc.dir}/cygcheck.exe" property="xsltproc.cygwin" />
- <condition property="xsltproc.cygwin.arg" value="--path /usr/share/docbook-xsl/html/" else="">
- <isset property="xsltproc.cygwin" />
- </condition>
-
- <target name="init"
- unless="init.done">
- <echo message="Buildfile for ${ant.project.name} (${ant.file})"
- level="info" />
- <fail message="The ant-optional package is needed for jEdit to build, please install it and rerun">
- <condition>
- <not>
- <available classname="org.apache.tools.ant.taskdefs.optional.depend.Depend" />
- </not>
- </condition>
- </fail>
- <property name="init.done"
- value="true" />
- </target>
-
- <target name="clean"
- depends="init"
- description="clean up intermediate files">
- <delete includeemptydirs="true"
- failonerror="false">
- <fileset dir="${build.dir}/classes" />
- <fileset dir="${dist.dir}/classes" />
- <fileset dir="doc"
- includes="docbook-wrapper-*.xsl" />
- </delete>
- </target>
-
- <target name="clean-all"
- depends="init"
- description="clean up build.dir and dist.dir completely">
- <delete includeemptydirs="true"
- failonerror="false">
- <fileset dir="${build.dir}" />
- <fileset dir="${dist.dir}" />
- <fileset dir="${textAreaPackage}/build" />
- <fileset dir="doc"
- includes="docbook-wrapper-*.xsl" />
- </delete>
- </target>
-
- <target name="compile"
- depends="init">
- <mkdir dir="${classes.dir}/core" />
- <depend srcDir="."
- destDir="${classes.dir}/core"
- cache="${classes.dir}" />
- <javac srcdir="."
- destdir="${classes.dir}/core"
- debug="true"
- debuglevel="${config.build.debuglevel}"
- deprecation="${config.build.deprecation}"
- source="${target.java.version}"
- target="${target.java.version}"
- compiler="modern"
- encoding="UTF-8">
- <include name="org/**" />
- <include name="com/**" />
- <compilerarg line="${config.build.compilerarg}" />
- </javac>
- </target>
-
- <target name="prepare-textArea"
- depends="init">
- <delete includeemptydirs="true"
- failonerror="false">
- <fileset dir="${textAreaPackage}/src"/>
- </delete>
-
- <mkdir dir="${textAreaPackage}/src" />
- <copy todir="${textAreaPackage}/src">
- <fileset dir=".">
- <include name="modes/*"/>
- <include name="org/gjt/sp/jedit/bsh/*"/>
- <include name="org/gjt/sp/jedit/bsh/**/*"/>
-
- <include name="org/gjt/sp/jedit/buffer/BufferAdapter.java"/>
- <include name="org/gjt/sp/jedit/buffer/BufferListener.java"/>
- <include name="org/gjt/sp/jedit/buffer/BufferSegment.java"/>
- <include name="org/gjt/sp/jedit/buffer/ContentManager.java"/>
- <include name="org/gjt/sp/jedit/buffer/DefaultFoldHandlerProvider.java"/>
- <include name="org/gjt/sp/jedit/buffer/DummyFoldHandler.java"/>
- <include name="org/gjt/sp/jedit/buffer/ExplicitFoldHandler.java"/>
- <include name="org/gjt/sp/jedit/buffer/FoldHandler.java"/>
- <include name="org/gjt/sp/jedit/buffer/FoldHandlerProvider.java"/>
- <include name="org/gjt/sp/jedit/buffer/IndentFoldHandler.java"/>
- <include name="org/gjt/sp/jedit/buffer/JEditBuffer.java"/>
- <include name="org/gjt/sp/jedit/buffer/KillRing.java"/>
- <include name="org/gjt/sp/jedit/buffer/LineManager.java"/>
- <include name="org/gjt/sp/jedit/buffer/PositionManager.java"/>
- <include name="org/gjt/sp/jedit/buffer/UndoManager.java"/>
-
- <include name="org/gjt/sp/jedit/gui/KeyEventTranslator.java"/>
- <include name="org/gjt/sp/jedit/gui/KeyEventWorkaround.java"/>
- <include name="org/gjt/sp/jedit/gui/MutableListModel.java"/>
- <include name="org/gjt/sp/jedit/gui/ShortcutPrefixActiveEvent.java"/>
- <include name="org/gjt/sp/jedit/gui/HistoryModel.java"/>
- <include name="org/gjt/sp/jedit/gui/HistoryModelSaver.java"/>
- <include name="org/gjt/sp/jedit/indent/*.java"/>
-
- <include name="org/gjt/sp/jedit/input/AbstractInputHandler.java"/>
- <include name="org/gjt/sp/jedit/input/DefaultInputHandlerProvider.java"/>
- <include name="org/gjt/sp/jedit/input/InputHandlerProvider.java"/>
- <include name="org/gjt/sp/jedit/input/TextAreaInputHandler.java"/>
-
- <include name="org/gjt/sp/jedit/syntax/*.java"/>
- <include name="org/gjt/sp/jedit/syntax/xmode.dtd"/>
-
- <include name="org/gjt/sp/jedit/textarea/Anchor.java"/>
- <include name="org/gjt/sp/jedit/textarea/AntiAlias.java"/>
- <include name="org/gjt/sp/jedit/textarea/BufferHandler.java"/>
- <include name="org/gjt/sp/jedit/textarea/ChunkCache.java"/>
- <include name="org/gjt/sp/jedit/textarea/DisplayManager.java"/>
- <include name="org/gjt/sp/jedit/textarea/ExtensionManager.java"/>
- <include name="org/gjt/sp/jedit/textarea/FastRepaintManager.java"/>
- <include name="org/gjt/sp/jedit/textarea/FirstLine.java"/>
- <include name="org/gjt/sp/jedit/textarea/FoldPainter.java"/>
- <include name="org/gjt/sp/jedit/textarea/Gutter.java"/>
- <include name="org/gjt/sp/jedit/textarea/GutterPopupHandler.java"/>
- <include name="org/gjt/sp/jedit/textarea/InputMethodSupport.java"/>
- <include name="org/gjt/sp/jedit/textarea/MouseActions.java"/>
- <include name="org/gjt/sp/jedit/textarea/MouseActionsProvider.java"/>
- <include name="org/gjt/sp/jedit/textarea/RangeMap.java"/>
- <include name="org/gjt/sp/jedit/textarea/Selection.java"/>
- <include name="org/gjt/sp/jedit/textarea/SelectionManager.java"/>
- <include name="org/gjt/sp/jedit/textarea/ScreenLineManager.java"/>
- <include name="org/gjt/sp/jedit/textarea/ScrollLayout.java"/>
- <include name="org/gjt/sp/jedit/textarea/ScrollLineCount.java"/>
- <include name="org/gjt/sp/jedit/textarea/ScrollListener.java"/>
- <include name="org/gjt/sp/jedit/textarea/StandaloneTextArea.java"/>
- <include name="org/gjt/sp/jedit/textarea/StatusListener.java"/>
- <include name="org/gjt/sp/jedit/textarea/StructureMatcher.java"/>
- <include name="org/gjt/sp/jedit/textarea/TextArea.java"/>
- <include name="org/gjt/sp/jedit/textarea/TextAreaBorder.java"/>
- <include name="org/gjt/sp/jedit/textarea/TextAreaDropHandler.java"/>
- <include name="org/gjt/sp/jedit/textarea/TextAreaException.java"/>
- <include name="org/gjt/sp/jedit/textarea/TextAreaExtension.java"/>
- <include name="org/gjt/sp/jedit/textarea/TextAreaMouseHandler.java"/>
- <include name="org/gjt/sp/jedit/textarea/TextAreaPainter.java"/>
- <include name="org/gjt/sp/jedit/textarea/textarea.actions.xml"/>
- <include name="org/gjt/sp/jedit/textarea/TriangleFoldPainter.java"/>
-
- <include name="org/gjt/sp/jedit/ActionListHandler.java"/>
- <include name="org/gjt/sp/jedit/BeanShellFacade.java"/>
- <include name="org/gjt/sp/jedit/Debug.java"/>
- <include name="org/gjt/sp/jedit/IPropertyManager.java"/>
- <include name="org/gjt/sp/jedit/JEditAbstractEditAction.java"/>
- <include name="org/gjt/sp/jedit/JEditActionSet.java"/>
- <include name="org/gjt/sp/jedit/JEditActionContext.java"/>
- <include name="org/gjt/sp/jedit/JEditBeanShellAction.java"/>
- <include name="org/gjt/sp/jedit/Mode.java"/>
- <include name="org/gjt/sp/jedit/OperatingSystem.java"/>
- <include name="org/gjt/sp/jedit/RegistersListener.java"/>
- <include name="org/gjt/sp/jedit/RegistersListener.java"/>
- <include name="org/gjt/sp/jedit/Registers.java"/>
- <include name="org/gjt/sp/jedit/RegisterSaver.java"/>
- <include name="org/gjt/sp/jedit/SelectionManager.java"/>
- <include name="org/gjt/sp/jedit/TextUtilities.java"/>
- <include name="org/gjt/sp/jedit/TextUtilities.java"/>
- <include name="org/gjt/sp/jedit/actions.dtd"/>
- <include name="org/gjt/sp/jedit/jedit.props"/>
- <include name="org/gjt/sp/jedit/jedit_keys.props"/>
- <include name="modes/*"/>
-
-
- <include name="org/gjt/sp/util/Log*.java"/>
- <include name="org/gjt/sp/util/IntegerArray.java"/>
- <include name="org/gjt/sp/util/IOUtilities.java"/>
- <include name="org/gjt/sp/util/ProgressObserver.java"/>
- <include name="org/gjt/sp/util/SegmentCharSequence.java"/>
- <include name="org/gjt/sp/util/StandardUtilities.java"/>
- <include name="org/gjt/sp/util/SyntaxUtilities.java"/>
- <include name="org/gjt/sp/util/XMLUtilities.java"/>
- </fileset>
- </copy>
-
- </target>
-
- <target name="compile-textArea"
- depends="init,prepare-textArea">
- <mkdir dir="${textAreaPackage}/build" />
- <javac srcdir="${textAreaPackage}/src"
- destdir="${textAreaPackage}/build"
- debug="true"
- debuglevel="${config.build.debuglevel}"
- deprecation="${config.build.deprecation}"
- source="${target.java.version}"
- target="${target.java.version}"
- compiler="modern"
- encoding="UTF-8">
- </javac>
- </target>
-
- <target name="build"
- depends="init,compile"
- description="build the jEdit JAR-file with full debug-information">
- <mkdir dir="${jar.location}" />
- <jar destfile="${jar.location}/${jar.filename}"
- basedir="${classes.dir}/core"
- compress="false"
- manifest="org/gjt/sp/jedit/jedit.manifest"
- duplicate="fail"
- index="true">
- <fileset dir=".">
- <include name="org/gjt/sp/jedit/bsh/commands/*.bsh" />
- <include name="org/gjt/sp/jedit/**/*.dtd" />
- <include name="org/gjt/sp/jedit/default.abbrevs" />
- <include name="org/gjt/sp/jedit/*.props" />
- <include name="org/gjt/sp/jedit/*.xml" />
- <include name="org/gjt/sp/jedit/textarea/*.xml" />
- <include name="org/gjt/sp/jedit/icons/**/*.gif" />
- <include name="org/gjt/sp/jedit/icons/**/*.jpg" />
- <include name="org/gjt/sp/jedit/icons/**/*.png" />
- </fileset>
- </jar>
- <copy todir="${jar.location}">
- <fileset dir=".">
- <include name="macros/**" />
- <include name="modes/**" />
- <include name="properties/**" />
- <include name="startup/**" />
- </fileset>
- </copy>
- </target>
-
- <target name="build-textArea"
- depends="init,compile-textArea"
- description="build the textArea JAR-file with full debug-information">
- <mkdir dir="${jar.location}" />
- <jar destfile="${jar.location}/${ant.project.name}-textArea.jar"
- compress="false"
- duplicate="fail"
- index="true">
- <fileset dir="${textAreaPackage}/build/" />
- <fileset dir="${textAreaPackage}/src">
- <include name="org/gjt/sp/jedit/textarea/*.xml"/>
- <include name="org/gjt/sp/jedit/syntax/xmode.dtd"/>
- <include name="org/gjt/sp/jedit/actions.dtd"/>
- <include name="org/gjt/sp/jedit/jedit.props"/>
- <include name="org/gjt/sp/jedit/jedit_keys.props"/>
- <include name="modes/*"/>
- </fileset>
- <manifest>
- <attribute name="Main-Class" value="org.gjt.sp.jedit.textarea.StandaloneTextArea"/>
- </manifest>
- </jar>
- </target>
-
- <target name="run"
- depends="init,build"
- description="run jEdit">
- <java jar="${jar.location}/${jar.filename}"
- fork="true"
- spawn="true"
- maxmemory="192M">
- <arg value="-settings=${build.dir}/settings" />
- </java>
- </target>
-
- <target name="run-debug"
- depends="init,build"
- description="run jEdit with debug listening enabled">
- <java jar="${jar.location}/${jar.filename}"
- fork="true"
- spawn="true"
- maxmemory="192M">
- <jvmarg value="-agentlib:jdwp=transport=dt_socket,server=y,address=localhost:5005,timeout=60000" />
- <arg value="-settings=${build.dir}/settings" />
- </java>
- </target>
-
- <target name="generate-docbook-wrapper"
- if="format"
- depends="init">
- <fail message="Please set the "docbook.xsl" in build.properties"
- unless="config.docbook.xsl" />
- <pathconvert property="absolute-stylesheet"
- dirsep="/">
- <path location="${config.docbook.xsl}/${stylesheet}" />
- </pathconvert>
- <echo message="<?xml version="1.0"?>${line.separator}"
- file="doc/docbook-wrapper-${format}.xsl"
- level="error" />
- <echo message="<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"${line.separator}"
- file="doc/docbook-wrapper-${format}.xsl"
- append="true"
- level="error" />
- <echo message=" version="1.0">${line.separator}"
- file="doc/docbook-wrapper-${format}.xsl"
- append="true"
- level="error" />
- <echo message=" <xsl:import href="file:///${absolute-stylesheet}" />${line.separator}"
- file="doc/docbook-wrapper-${format}.xsl"
- append="true"
- level="error" />
- <echo message="</xsl:stylesheet>${line.separator}"
- file="doc/docbook-wrapper-${format}.xsl"
- append="true"
- level="error" />
- </target>
-
- <target name="generate-doc-faq"
- depends="init"
- if="doc.output.location"
- unless="faq.is.up.to.date">
- <fail message="Please set the "xsltproc.executable" in build.properties"
- unless="config.xsltproc.executable" />
- <mkdir dir="${doc.output.location}/FAQ" />
- <exec executable="${config.xsltproc.executable}"
- dir="doc"
- failonerror="true">
- <arg line="${xsltproc.cygwin.arg}" />
- <arg value="--output" />
- <arg value="../${doc.output.location}/FAQ/" />
- <arg value="jedithtml.xsl" />
- <arg value="FAQ/faq.xml" />
- </exec>
- </target>
-
- <target name="generate-doc-news"
- depends="init"
- if="doc.output.location"
- unless="news.is.up.to.date">
- <fail message="Please set the "xsltproc.executable" in build.properties"
- unless="config.xsltproc.executable" />
- <mkdir dir="${doc.output.location}/news43" />
- <exec executable="${config.xsltproc.executable}"
- dir="doc"
- failonerror="true">
- <arg line="${xsltproc.cygwin.arg}" />
- <arg value="--output" />
- <arg value="../${doc.output.location}/news43/" />
- <arg value="jedithtml.xsl" />
- <arg value="news43/news.xml" />
- </exec>
- </target>
-
- <target name="generate-doc-users-guide"
- depends="init"
- if="doc.output.location"
- unless="users-guide.is.up.to.date">
- <fail message="Please set the "xsltproc.executable" in build.properties"
- unless="config.xsltproc.executable" />
- <mkdir dir="${doc.output.location}/users-guide" />
- <exec executable="${config.xsltproc.executable}"
- dir="doc"
- failonerror="true">
- <arg line="${xsltproc.cygwin.arg}" />
- <arg value="--output" />
- <arg value="../${doc.output.location}/users-guide/" />
- <arg value="jedithtml.xsl" />
- <arg value="users-guide/users-guide.xml" />
- </exec>
- </target>
-
- <target name="userdocs"
- depends="init,docs-html,docs-javadoc"
- description="generate HTML and JavaDoc API docs (needs xsltproc)" />
-
- <target name="docs-upload"
- depends="userdocs"
- description="upload generated documentation to public website (needs xsltproc and rsync)" >
- <fail message="Please set the "rsync.executable" in build.properties"
- unless="config.rsync.executable" />
- <exec executable="${config.rsync.executable}"
- dir="${jar.location}/doc/"
- failonerror="true">
- <arg value="-avz" />
- <arg value="api" />
- <arg value="FAQ" />
- <arg value="users-guide" />
- <arg value="plugins.jedit.org:/home/groups/j/je/jedit/htdocs/" />
- </exec>
- </target>
-
- <target name="docs-html"
- depends="init"
- description="generate HTML docs (needs xsltproc)">
- <antcall target="generate-docbook-wrapper">
- <param name="format"
- value="html" />
- <param name="stylesheet"
- value="html/chunk.xsl" />
- </antcall>
- <pathconvert property="doc.output.location"
- dirsep="/">
- <path location="${jar.location}/doc" />
- <globmapper from="${basedir}/*"
- to="*"
- handledirsep="true" />
- </pathconvert>
- <dependset>
- <srcfileset dir="doc/FAQ" />
- <targetfileset dir="${doc.output.location}/FAQ" />
- </dependset>
- <available property="faq.is.up.to.date"
- file="${doc.output.location}/FAQ/toc.xml"
- type="file" />
- <antcall target="generate-doc-faq" />
- <dependset>
- <srcfileset dir="doc/news43" />
- <targetfileset dir="${doc.output.location}/news43" />
- </dependset>
- <available property="news.is.up.to.date"
- file="${doc.output.location}/news43/toc.xml"
- type="file" />
- <antcall target="generate-doc-news" />
- <dependset>
- <srcfileset dir="doc/users-guide" />
- <targetfileset dir="${doc.output.location}/users-guide" />
- </dependset>
- <available property="users-guide.is.up.to.date"
- file="${doc.output.location}/users-guide/toc.xml"
- type="file" />
- <antcall target="generate-doc-users-guide" />
- <delete file="doc/docbook-wrapper-html.xsl"
- failonerror="false" />
- <copy todir="${doc.output.location}">
- <fileset dir="doc">
- <include name="*.txt" />
- <include name="*.html" />
- <include name="*.png" />
- <include name="tips/**" />
- </fileset>
- </copy>
- </target>
-
- <target name="generate-javadoc"
- depends="init"
- unless="javadoc.is.up.to.date">
- <mkdir dir="${classes.dir}/javadoc" />
- <javac srcdir="."
- destdir="${classes.dir}/javadoc"
- includes="doclet/**"
- debug="true"
- debuglevel="${config.build.debuglevel}"
- deprecation="${config.build.deprecation}"
- source="${target.java.version}"
- target="${target.java.version}"
- compiler="modern">
- <compilerarg line="${config.build.compilerarg}" />
- </javac>
- <javadoc sourcepath="."
- destdir="${classes.dir}/javadoc/api"
- packagenames="org.*,com.*"
- classpath="${classes.dir}/core"
- doclet="doclet.GenerateTocXML"
- docletpath="${classes.dir}/javadoc"
- version="true"
- use="true"
- author="true"
- splitindex="true"
- locale="en"
- windowtitle="jEdit API"
- doctitle="jEdit API"
- failonerror="true"
- source="${target.java.version}">
- <group title="jEdit"
- packages="org.gjt.sp*" />
- <group title="Microstar XML Parser"
- packages="com.microstar.xml*" />
- </javadoc>
- </target>
-
- <target name="docs-javadoc"
- depends="init"
- description="generate JavaDoc API docs">
- <dependset>
- <srcfileset dir=".">
- <include name="doclet/**/*.java" />
- <include name="org/**/*.java" />
- <include name="org/**/package.html" />
- <include name="com/**/*.java" />
- <include name="com/**/package.html" />
- </srcfileset>
- <targetfileset dir="${classes.dir}/javadoc" />
- </dependset>
- <available property="javadoc.is.up.to.date"
- file="${classes.dir}/javadoc/api/toc.xml"
- type="file" />
- <antcall target="generate-javadoc" />
- <copy todir="${jar.location}/doc">
- <fileset dir="${classes.dir}/javadoc"
- includes="api/**"
- excludes="api/**/*.html" />
- </copy>
- <copy todir="${jar.location}/doc">
- <fileset dir="${classes.dir}/javadoc"
- includes="api/**/*.html" />
- <filterchain>
- <tokenfilter>
- <replacestring from="<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">"
- to="<TD BGCOLOR="#00008B" CLASS="NavBarCell1Rev">" />
- </tokenfilter>
- <tokenfilter>
- <filetokenizer />
- <replaceregex pattern="(<SCRIPT type="text/javascript">.*?</SCRIPT>|onload=".*?")"
- flags="gs" />
- </tokenfilter>
- </filterchain>
- </copy>
- </target>
-
- <target name="generate-pdf-users-guide"
- depends="init"
- if="paper.type"
- unless="pdf-users-guide.is.up.to.date">
- <fail message="Please set the "xsltproc.executable" in build.properties"
- unless="config.xsltproc.executable" />
- <fail message="Please set the "fop.dir" in build.properties"
- unless="config.fop.dir" />
- <antcall target="generate-docbook-wrapper">
- <param name="format"
- value="fo" />
- <param name="stylesheet"
- value="fo/docbook.xsl" />
- </antcall>
- <pathconvert property="docs-pdf.classes.dir"
- dirsep="/">
- <path location="${classes.dir}/docs-pdf" />
- <globmapper from="${basedir}/*"
- to="*"
- handledirsep="true" />
- </pathconvert>
- <mkdir dir="${docs-pdf.classes.dir}" />
- <exec executable="${config.xsltproc.executable}"
- dir="doc"
- failonerror="true">
- <arg line="${xsltproc.cygwin.arg}" />
- <arg value="--stringparam" />
- <arg value="paper.type" />
- <arg value=""${paper.type}"" />
- <arg value="--output" />
- <arg value="../${docs-pdf.classes.dir}/${manual.filename.prefix}${manual.filename.paper.type}.fot" />
- <arg value="jeditfo.xsl" />
- <arg value="users-guide/users-guide.xml" />
- </exec>
- <delete file="doc/docbook-wrapper-fo.xsl"
- failonerror="false" />
- <taskdef name="fop"
- classname="org.apache.fop.tools.anttasks.Fop"
- classpath="${config.fop.dir}/build/fop.jar">
- <classpath>
- <fileset dir="${config.fop.dir}/lib"
- includes="*.jar" />
- </classpath>
- </taskdef>
- <fop fofile="${docs-pdf.classes.dir}/${manual.filename.prefix}${manual.filename.paper.type}.fot"
- outfile="${jar.location}/${manual.filename.prefix}${manual.filename.paper.type}.pdf"
- format="application/pdf"
- messagelevel="info" />
- </target>
-
- <target name="docs-pdf"
- depends="init"
- if="paper.type">
- <condition property="manual.filename.paper.type"
- value="a4">
- <equals arg1="A4"
- arg2="${paper.type}" />
- </condition>
- <condition property="manual.filename.paper.type"
- value="letter"
- else="${paper.type}">
- <equals arg1="USletter"
- arg2="${paper.type}" />
- </condition>
- <dependset>
- <srcfileset dir="doc/users-guide" />
- <targetfilelist dir="${classes.dir}/docs-pdf"
- files="${manual.filename.prefix}${manual.filename.paper.type}.fot" />
- <targetfilelist dir="${jar.location}"
- files="${manual.filename.prefix}${manual.filename.paper.type}.pdf" />
- </dependset>
- <available property="pdf-users-guide.is.up.to.date"
- file="${jar.location}/${manual.filename.prefix}${manual.filename.paper.type}.pdf"
- type="file" />
- <antcall target="generate-pdf-users-guide" />
- </target>
-
- <target name="docs-pdf-a4"
- depends="init"
- description="generate PDF users-guide with A4 paper size (needs xsltproc and fop)">
- <antcall target="docs-pdf">
- <param name="paper.type"
- value="A4" />
- </antcall>
- </target>
-
- <target name="docs-pdf-USletter"
- depends="init"
- description="generate PDF users-guide with US letter paper size (needs xsltproc and fop)">
- <antcall target="docs-pdf">
- <param name="paper.type"
- value="USletter" />
- </antcall>
- </target>
-
- <target name="compile-installer"
- depends="init">
- <mkdir dir="${classes.dir}/installer" />
- <depend srcDir="."
- destDir="${classes.dir}/installer"
- cache="${classes.dir}" />
- <javac srcdir="."
- destdir="${classes.dir}/installer"
- includes="installer/**"
- debug="true"
- debuglevel="${config.build.debuglevel}"
- deprecation="${config.build.deprecation}"
- source="${target.java.version}"
- target="${target.java.version}"
- compiler="modern">
- <compilerarg line="${config.build.compilerarg}" />
- </javac>
- </target>
-
- <target name="compile-default-plugins-for-dist"
- depends="init">
- <ant dir="jars/LatestVersion"
- target="dist"
- inheritAll="false">
- <property name="jedit.install.dir"
- value="${dist.dir}" />
- </ant>
- <ant dir="jars/LatestVersion"
- target="clean"
- inheritAll="false">
- <property name="jedit.install.dir"
- value="${dist.dir}" />
- </ant>
- <ant dir="jars/QuickNotepad"
- target="dist"
- inheritAll="false">
- <property name="jedit.install.dir"
- value="${dist.dir}" />
- </ant>
- <ant dir="jars/QuickNotepad"
- target="clean"
- inheritAll="false">
- <property name="jedit.install.dir"
- value="${dist.dir}" />
- </ant>
- <ant dir="jars/MacOSX"
- target="dist"
- inheritAll="false">
- <property name="jedit.install.dir"
- value="${dist.dir}" />
- </ant>
- <ant dir="jars/MacOSX"
- target="clean"
- inheritAll="false">
- <property name="jedit.install.dir"
- value="${dist.dir}" />
- </ant>
- </target>
-
- <target name="dist-java"
- depends="init"
- description="build the Java-installer">
- <antcall target="prepare-dist-files" />
- <tar destfile="${dist.dir}/jedit-macros.tar.bz2"
- compression="bzip2">
- <tarfileset id="jedit-macros"
- dir="${dist.dir}"
- includes="macros/**" />
- </tar>
- <tar destfile="${dist.dir}/jedit-program.tar.bz2"
- compression="bzip2">
- <tarfileset id="jedit-program"
- dir="${dist.dir}"
- includes="doc/**
- jars/LatestVersion.jar
- jars/QuickNotepad.jar
- modes/**
- properties/**
- startup/**
- ${jar.filename}"
- excludes="doc/api/**" />
- </tar>
- <tar destfile="${dist.dir}/jedit-mac.tar.bz2"
- compression="bzip2">
- <tarfileset id="jedit-mac"
- dir="${dist.dir}"
- includes="jars/MacOSX.jar" />
- </tar>
- <tar destfile="${dist.dir}/jedit-api.tar.bz2"
- compression="bzip2">
- <tarfileset id="jedit-api"
- dir="${dist.dir}"
- includes="doc/api/**" />
- </tar>
- <tar destfile="${dist.dir}/jedit-os2.tar.bz2"
- compression="bzip2">
- <tarfileset id="jedit-os2"
- dir="package-files/os2"
- includes="jedit.cmd" />
- </tar>
- <antcall target="compile-installer">
- <param name="config.build.debuglevel"
- value="lines,source" />
- <param name="classes.dir"
- location="${dist.dir}/classes" />
- </antcall>
- <antcall target="compile-calculatesize">
- <param name="config.build.debuglevel"
- value="lines,source" />
- <param name="classes.dir"
- location="${dist.dir}/classes" />
- </antcall>
- <taskdef name="calculatesize"
- classname="de.masters_of_disaster.ant.tasks.calculatesize.CalculateSize"
- classpath="${dist.dir}/classes/calculatesize" />
- <calculatesize realsizeproperty="jedit-macros.realsize"
- disksizeproperty="jedit-macros.disksize">
- <fileset refid="jedit-macros" />
- </calculatesize>
- <calculatesize realsizeproperty="jedit-program.realsize"
- disksizeproperty="jedit-program.disksize">
- <fileset refid="jedit-program" />
- </calculatesize>
- <calculatesize realsizeproperty="jedit-mac.realsize"
- disksizeproperty="jedit-mac.disksize">
- <fileset refid="jedit-mac" />
- </calculatesize>
- <calculatesize realsizeproperty="jedit-api.realsize"
- disksizeproperty="jedit-api.disksize">
- <fileset refid="jedit-api" />
- </calculatesize>
- <calculatesize realsizeproperty="jedit-os2.realsize"
- disksizeproperty="jedit-os2.disksize">
- <fileset refid="jedit-os2" />
- </calculatesize>
- <copy todir="${dist.dir}/classes/installer/installer"
- overwrite="true">
- <fileset file="installer/install.props" />
- <filterset>
- <filter token="jedit.version"
- value="${jedit.version}" />
- <filter token="jedit-macros.realsize"
- value="${jedit-macros.realsize}" />
- <filter token="jedit-macros.disksize"
- value="${jedit-macros.disksize}" />
- <filter token="jedit-program.realsize"
- value="${jedit-program.realsize}" />
- <filter token="jedit-program.disksize"
- value="${jedit-program.disksize}" />
- <filter token="jedit-mac.realsize"
- value="${jedit-mac.realsize}" />
- <filter token="jedit-mac.disksize"
- value="${jedit-mac.disksize}" />
- <filter token="jedit-api.realsize"
- value="${jedit-api.realsize}" />
- <filter token="jedit-api.disksize"
- value="${jedit-api.disksize}" />
- <filter token="jedit-os2.realsize"
- value="${jedit-os2.realsize}" />
- <filter token="jedit-os2.disksize"
- value="${jedit-os2.disksize}" />
- </filterset>
- </copy>
- <jar destfile="${dist.dir}/${dist.jar.filename}"
- basedir="${dist.dir}/classes/installer"
- compress="true"
- manifest="installer/install.mf"
- duplicate="fail"
- index="true">
- <fileset dir=".">
- <include name="installer/*.html" />
- </fileset>
- <fileset dir="${dist.dir}/classes/package-files/linux">
- <include name="jedit.1" />
- </fileset>
- <zipfileset dir="${dist.dir}"
- includes="jedit-api.tar.bz2
- jedit-mac.tar.bz2
- jedit-macros.tar.bz2
- jedit-os2.tar.bz2
- jedit-program.tar.bz2"
- prefix="installer" />
- </jar>
- <condition property="wipe.dist.files">
- <not>
- <isset property="config.dont.wipe.dist.files" />
- </not>
- </condition>
- <antcall target="dist-cleanup" />
- </target>
-
- <target name="dist-manuals"
- depends="init"
- description="build the PDF-manuals">
- <antcall target="docs-pdf-a4">
- <param name="classes.dir"
- location="${dist.dir}/classes" />
- <param name="jar.location"
- location="${dist.dir}" />
- </antcall>
- <antcall target="docs-pdf-USletter">
- <param name="classes.dir"
- location="${dist.dir}/classes" />
- <param name="jar.location"
- location="${dist.dir}" />
- </antcall>
- <condition property="wipe.dist.files">
- <not>
- <isset property="config.dont.wipe.dist.files" />
- </not>
- </condition>
- <antcall target="dist-cleanup" />
- </target>
-
- <target name="dist-src"
- depends="init"
- description="build the src-archive">
- <mkdir dir="${dist.dir}" />
- <tar destfile="${dist.dir}/${src.archive.filename}"
- compression="bzip2">
- <tarfileset dir="."
- excludes="${config.build.dir}/**
- ${config.dist.dir}/**
- **/build.properties
- doc/docbook-wrapper-*.xsl"
- prefix="jEdit/" />
- <tarfileset dir="../build-support"
- prefix="build-support/" />
- </tar>
- </target>
-
- <target name="compile-jarbundler"
- depends="init">
- <mkdir dir="${classes.dir}/jarbundler" />
- <depend srcDir="."
- destDir="${classes.dir}/jarbundler"
- cache="${classes.dir}" />
- <javac srcdir="."
- destdir="${classes.dir}/jarbundler"
- includes="net/**"
- debug="true"
- debuglevel="${config.build.debuglevel}"
- deprecation="${config.build.deprecation}"
- source="1.4"
- target="1.4"
- compiler="modern">
- <compilerarg line="${config.build.compilerarg}" />
- </javac>
- </target>
-
- <target name="dist-mac-finish"
- depends="init"
- unless="build.on.non.mac"
- description="finish building the Mac OS X disk image (DMG-file) on Mac OS X">
- <fail message="The disk image (DMG-file) for easy distribution on Mac OS X can only be built on Mac OS X currently">
- <condition>
- <not>
- <os family="mac" />
- </not>
- </condition>
- </fail>
- <taskdef name="jarbundler"
- classname="net.sourceforge.jarbundler.JarBundler"
- classpath="${dist.dir}/classes/jarbundler" />
- <tstamp>
- <format property="current.year"
- pattern="yyyy" />
- </tstamp>
- <mkdir dir="${dist.dir}/classes/mac" />
- <jarbundler dir="${dist.dir}/classes/mac"
- name="jEdit"
- mainclass="org.gjt.sp.jedit.jEdit"
- jar="${dist.dir}/${jar.filename}"
- arguments="-background"
- build="${jedit.build.number}"
- bundleid="org.gjt.sp.jedit"
- extraclasspath="/System/Library/Java"
- icon="icons/icon.icns"
- infostring="jEdit ${jedit.version}, Copyright © 1998-${current.year} Contributors"
- jvmversion="${mac.target.java.version}"
- shortname="jEdit"
- signature="JESP"
- stubfile="jedit"
- version="${jedit.version}"
- vmoptions="-Xmx192M">
- <javaproperty name="apple.awt.antialiasing" value="true" />
- <javaproperty name="apple.awt.textantialiasing" value="true" />
- <javaproperty name="apple.laf.useScreenMenuBar" value="true" />
- <!-- Comented due https://sourceforge.net/tracker/?func=detail&atid=100588&aid=2820535&group_id=588 discussion -->
- <!--javaproperty name="apple.awt.graphics.UseQuartz" value="true" />
- <javaproperty name="apple.awt.rendering" value="speed" /-->
- <javafileset dir="${dist.dir}"
- includes="doc/**
- jars/**
- macros/**
- modes/**
- properties/**
- startup/**" />
- <documenttype name="jEdit TEXT Document"
- extensions="*"
- ostypes="TEXT ****"
- iconfile="icons/file.icns"
- role="Editor" />
- <service message="openFile"
- menuitem="jEdit/Open Files"
- sendtypes="NSStringPboardType,NSFilenamesPboardType" />
- <service message="insertSelection"
- menuitem="jEdit/Insert Text"
- sendtypes="NSStringPboardType" />
- <service message="openSelection"
- menuitem="jEdit/New Buffer with Text"
- sendtypes="NSStringPboardType" />
- </jarbundler>
- <delete file="${dist.dir}/${mac.disk.image.filename}"
- failonerror="false" />
- <exec executable="hdiutil"
- failonerror="true">
- <arg value="create" />
- <arg value="-quiet" />
- <arg value="-volname" />
- <arg value="jEdit ${jedit.version}" />
- <arg value="-srcfolder" />
- <arg file="${dist.dir}/classes/mac/jEdit.app" />
- <arg file="${dist.dir}/${mac.disk.image.filename}" />
- </exec>
- <exec executable="hdiutil"
- failonerror="true">
- <arg value="internet-enable" />
- <arg value="-quiet" />
- <arg file="${dist.dir}/${mac.disk.image.filename}" />
- </exec>
- <condition property="wipe.dist.files">
- <not>
- <isset property="config.dont.wipe.dist.files" />
- </not>
- </condition>
- <antcall target="dist-cleanup" />
- </target>
-
- <target name="prepare-dist-mac-finish"
- depends="init"
- if="build.on.non.mac">
- <tar destfile="${dist.dir}/jedit${jedit.version}-dist-mac-finish.tar.bz2"
- basedir="."
- includes="build.xml
- icons/file.icns
- icons/icon.icns
- ${config.dist.dir}/${jar.filename}
- ${config.dist.dir}/classes/jarbundler/**
- ${config.dist.dir}/doc/**
- ${config.dist.dir}/jars/**
- ${config.dist.dir}/macros/**
- ${config.dist.dir}/modes/**
- ${config.dist.dir}/properties/**
- ${config.dist.dir}/startup/**"
- compression="bzip2" />
- </target>
-
- <target name="dist-mac"
- depends="init"
- description="build the Mac OS X disk image (DMG-file)">
- <antcall target="prepare-dist-files" />
- <antcall target="compile-jarbundler">
- <param name="config.build.debuglevel"
- value="lines,source" />
- <param name="classes.dir"
- location="${dist.dir}/classes" />
- </antcall>
- <condition property="build.on.non.mac">
- <not>
- <os family="mac" />
- </not>
- </condition>
- <antcall target="dist-mac-finish">
- <param name="config.dont.wipe.dist.files"
- value="true" />
- </antcall>
- <antcall target="prepare-dist-mac-finish" />
- <condition property="wipe.dist.files">
- <not>
- <isset property="config.dont.wipe.dist.files" />
- </not>
- </condition>
- <antcall target="dist-cleanup" />
- </target>
-
- <target name="prepare-dist-files"
- depends="init">
- <antcall target="build">
- <param name="config.build.debuglevel"
- value="lines,source" />
- <param name="classes.dir"
- location="${dist.dir}/classes" />
- <param name="jar.location"
- location="${dist.dir}" />
- </antcall>
- <antcall target="docs-html">
- <param name="config.build.debuglevel"
- value="lines,source" />
- <param name="classes.dir"
- location="${dist.dir}/classes" />
- <param name="jar.location"
- location="${dist.dir}" />
- </antcall>
- <antcall target="docs-javadoc">
- <param name="config.build.debuglevel"
- value="lines,source" />
- <param name="classes.dir"
- location="${dist.dir}/classes" />
- <param name="jar.location"
- location="${dist.dir}" />
- </antcall>
- <antcall target="compile-default-plugins-for-dist" />
- <copy todir="${dist.dir}/classes/package-files"
- overwrite="true">
- <fileset dir="package-files" />
- <filterset>
- <filter token="jar.filename"
- value="${jar.filename}" />
- <filter token="jedit.version"
- value="${jedit.version}" />
- <filter token="jedit.build.number"
- value="${jedit.build.number}" />
- <filter token="slackware.target.java.version"
- value="${slackware.target.java.version}" />
- </filterset>
- </copy>
- <gzip src="${dist.dir}/classes/package-files/linux/jedit.1"
- destfile="${dist.dir}/classes/package-files/linux/jedit.1.gz" />
- </target>
-
- <target name="dist-slackware"
- depends="init"
- description="build the Slackware Package">
- <antcall target="prepare-dist-files" />
- <tar destfile="${dist.dir}/jedit-${jedit.version}-noarch-1sao.tgz"
- compression="gzip">
- <tarfileset file="."
- username="root"
- group="root"
- fullpath="./" />
- <tarfileset dir="${dist.dir}/classes/package-files/linux/slackware"
- includes="doinst.sh
- slack-desc
- slack-required"
- username="root"
- group="root"
- prefix="install/" />
- <tarfileset file="${dist.dir}/classes/package-files/linux/jedit"
- mode="755"
- username="root"
- group="bin"
- fullpath="usr/bin/jedit" />
- <tarfileset dir="${dist.dir}/doc"
- includes="*.txt"
- username="root"
- group="root"
- prefix="usr/doc/jedit-${jedit.version}/" />
- <tarfileset file="${dist.dir}/classes/package-files/linux/jedit.1.gz"
- username="root"
- group="root"
- fullpath="usr/man/man1/jedit.1.gz" />
- <tarfileset file="${dist.dir}/classes/package-files/linux/slackware/jEdit.desktop"
- username="root"
- group="root"
- fullpath="usr/share/applications/jEdit.desktop" />
- <tarfileset dir="${dist.dir}"
- includes="doc/**
- jars/LatestVersion.jar
- jars/QuickNotepad.jar
- macros/**
- modes/**
- properties/**
- startup/**
- ${jar.filename}"
- username="root"
- group="root"
- prefix="usr/share/jedit-${jedit.version}/" />
- <tarfileset dir="icons"
- includes="jedit-file48.png
- jedit-icon48.png"
- username="root"
- group="root"
- prefix="usr/share/pixmaps/" />
- </tar>
- <condition property="wipe.dist.files">
- <not>
- <isset property="config.dont.wipe.dist.files" />
- </not>
- </condition>
- <antcall target="dist-cleanup" />
- </target>
-
- <target name="compile-ar"
- depends="init">
- <mkdir dir="${classes.dir}/ar" />
- <depend srcDir="."
- destDir="${classes.dir}/ar"
- cache="${classes.dir}" />
- <javac srcdir="."
- destdir="${classes.dir}/ar"
- includes="de/masters_of_disaster/ant/tasks/ar/**"
- debug="true"
- debuglevel="${config.build.debuglevel}"
- deprecation="${config.build.deprecation}"
- source="${target.java.version}"
- target="${target.java.version}"
- compiler="modern">
- <compilerarg line="${config.build.compilerarg}" />
- </javac>
- </target>
-
- <target name="compile-deb"
- depends="init">
- <mkdir dir="${classes.dir}/deb" />
- <depend srcDir="."
- destDir="${classes.dir}/deb"
- cache="${classes.dir}" />
- <javac srcdir="."
- destdir="${classes.dir}/deb"
- includes="de/masters_of_disaster/ant/tasks/deb/**"
- debug="true"
- debuglevel="${config.build.debuglevel}"
- deprecation="${config.build.deprecation}"
- source="${target.java.version}"
- target="${target.java.version}"
- compiler="modern">
- <compilerarg line="${config.build.compilerarg}" />
- </javac>
- </target>
-
- <target name="compile-calculatesize"
- depends="init">
- <mkdir dir="${classes.dir}/calculatesize" />
- <depend srcDir="."
- destDir="${classes.dir}/calculatesize"
- cache="${classes.dir}" />
- <javac srcdir="."
- destdir="${classes.dir}/calculatesize"
- includes="de/masters_of_disaster/ant/tasks/calculatesize/**"
- debug="true"
- debuglevel="${config.build.debuglevel}"
- deprecation="${config.build.deprecation}"
- source="${target.java.version}"
- target="${target.java.version}"
- compiler="modern">
- <compilerarg line="${config.build.compilerarg}" />
- </javac>
- </target>
-
- <target name="dist-deb"
- depends="init"
- description="build the DEB Package">
- <antcall target="prepare-dist-files" />
- <antcall target="compile-ar">
- <param name="config.build.debuglevel"
- value="lines,source" />
- <param name="classes.dir"
- location="${dist.dir}/classes" />
- </antcall>
- <antcall target="compile-deb">
- <param name="config.build.debuglevel"
- value="lines,source" />
- <param name="classes.dir"
- location="${dist.dir}/classes" />
- </antcall>
- <taskdef name="deb"
- classname="de.masters_of_disaster.ant.tasks.deb.Deb"
- classpath="${dist.dir}/classes/deb" />
- <antcall target="compile-calculatesize">
- <param name="config.build.debuglevel"
- value="lines,source" />
- <param name="classes.dir"
- location="${dist.dir}/classes" />
- </antcall>
- <taskdef name="calculatesize"
- classname="de.masters_of_disaster.ant.tasks.calculatesize.CalculateSize"
- classpath="${dist.dir}/classes/calculatesize" />
- <calculatesize realsizeproperty="deb.installed.size">
- <fileset dir="${dist.dir}/doc"
- includes="*.txt" />
- <fileset dir="${dist.dir}"
- includes="classes/package-files/linux/jedit
- classes/package-files/linux/deb/jedit
- classes/package-files/linux/deb/jedit.desktop
- classes/package-files/linux/jedit.1.gz
- doc/**
- jars/LatestVersion.jar
- jars/QuickNotepad.jar
- macros/**
- modes/**
- properties/**
- startup/**
- ${jar.filename}" />
- </calculatesize>
- <copy todir="${dist.dir}/classes/package-files/linux/deb"
- overwrite="true">
- <fileset file="package-files/linux/deb/control" />
- <filterset>
- <filter token="jedit.build.number"
- value="${jedit.build.number}" />
- <filter token="deb.installed.size"
- value="${deb.installed.size}" />
- </filterset>
- </copy>
- <deb destfile="${dist.dir}/jedit_${jedit.version}_all.deb"
- tempDir="${dist.dir}/classes/deb"
- deleteTempFiles="false"
- includeMd5sums="true">
- <controlfileset file="${dist.dir}/classes/package-files/linux/deb/control" />
- <controlfileset dir="${dist.dir}/classes/package-files/linux/deb"
- includes="postinst
- postrm"
- mode="755" />
- <datafileset file="."
- fullpath="usr/" />
- <datafileset file="."
- fullpath="usr/bin/" />
- <datafileset file="${dist.dir}/classes/package-files/linux/jedit"
- fullpath="usr/bin/jedit"
- mode="755" />
- <datafileset file="."
- fullpath="usr/lib/" />
- <datafileset file="."
- fullpath="usr/lib/menu/" />
- <datafileset file="${dist.dir}/classes/package-files/linux/deb/jedit"
- fullpath="usr/lib/menu/jedit" />
- <datafileset file="."
- fullpath="usr/share/" />
- <datafileset file="."
- fullpath="usr/share/applications/" />
- <datafileset file="${dist.dir}/classes/package-files/linux/deb/jedit.desktop"
- fullpath="usr/share/applications/jedit.desktop" />
- <datafileset file="."
- fullpath="usr/share/doc/" />
- <datafileset file="."
- fullpath="usr/share/doc/jEdit/" />
- <datafileset dir="${dist.dir}/doc"
- includes="*.txt"
- prefix="usr/share/doc/jEdit/" />
- <datafileset file="."
- fullpath="usr/share/jEdit/" />
- <datafileset dir="${dist.dir}"
- includes="doc/**
- macros/**
- modes/**
- properties/**
- startup/**
- ${jar.filename}"
- prefix="usr/share/jEdit/" />
- <datafileset file="."
- fullpath="usr/share/jEdit/jars/" />
- <datafileset dir="${dist.dir}/jars"
- includes="LatestVersion.jar
- QuickNotepad.jar"
- prefix="usr/share/jEdit/jars/" />
- <datafileset file="."
- fullpath="usr/share/man/" />
- <datafileset file="."
- fullpath="usr/share/man/man1/" />
- <datafileset file="${dist.dir}/classes/package-files/linux/jedit.1.gz"
- fullpath="usr/share/man/man1/jedit.1.gz" />
- </deb>
- <condition property="wipe.dist.files">
- <not>
- <isset property="config.dont.wipe.dist.files" />
- </not>
- </condition>
- <antcall target="dist-cleanup" />
- </target>
-
- <target name="dist-win-finish"
- depends="init"
- unless="build.on.non.win"
- description="finish building the Windows installer (EXE-file) on Windows">
- <fail message="The Windows installer (EXE-file) can only be built on Windows currently">
- <condition>
- <not>
- <os family="windows" />
- </not>
- </condition>
- </fail>
- <fail message="Please set the innosetup.compiler.executable in build.properties"
- unless="config.innosetup.compiler.executable" />
- <tstamp>
- <format property="current.year"
- pattern="yyyy" />
- </tstamp>
- <copy todir="${dist.dir}/classes/package-files/windows"
- overwrite="true">
- <fileset file="package-files/windows/win32installer.iss" />
- <filterset>
- <filter token="jar.filename"
- value="${jar.filename}" />
- <filter token="jedit.version"
- value="${jedit.version}" />
- <filter token="jedit.build.number"
- value="${jedit.build.number}" />
- <filter token="win.filename"
- value="${win.filename}" />
- <filter token="dist.dir"
- value="${dist.dir}" />
- <filter token="base.dir"
- value="${basedir}" />
- <filter token="current.year"
- value="${current.year}" />
- </filterset>
- </copy>
- <exec executable="${config.innosetup.compiler.executable}"
- failonerror="true">
- <arg file="${dist.dir}/classes/package-files/windows/win32installer.iss" />
- </exec>
- <condition property="wipe.dist.files">
- <not>
- <isset property="config.dont.wipe.dist.files" />
- </not>
- </condition>
- <antcall target="dist-cleanup" />
- </target>
-
- <target name="prepare-dist-win-finish"
- depends="init"
- if="build.on.non.win">
- <tar destfile="${dist.dir}/jedit${jedit.version}-dist-win-finish.tar.bz2"
- basedir="."
- includes="build.xml
- icons/jedit.ico
- icons/WindowsInstallerSmallImage.bmp
- icons/WindowsInstallerImage.bmp
- package-files/windows/win32installer.iss
- ${config.dist.dir}/${jar.filename}
- ${config.dist.dir}/classes/package-files/windows/**
- ${config.dist.dir}/doc/**
- ${config.dist.dir}/jars/LatestVersion.jar
- ${config.dist.dir}/jars/QuickNotepad.jar
- ${config.dist.dir}/macros/**
- ${config.dist.dir}/modes/**
- ${config.dist.dir}/properties/**
- ${config.dist.dir}/startup/**"
- compression="bzip2" />
- </target>
-
- <target name="dist-win"
- depends="init"
- description="build the Windows installer (EXE-file)">
- <antcall target="prepare-dist-files" />
- <condition property="build.on.non.win">
- <not>
- <os family="windows" />
- </not>
- </condition>
- <antcall target="dist-win-finish">
- <param name="config.dont.wipe.dist.files"
- value="true" />
- </antcall>
- <antcall target="prepare-dist-win-finish" />
- <condition property="wipe.dist.files">
- <not>
- <isset property="config.dont.wipe.dist.files" />
- </not>
- </condition>
- <antcall target="dist-cleanup" />
- </target>
-
- <target name="dist"
- depends="init"
- description="build all distribution files">
- <property name="config.dont.wipe.dist.files"
- value="true" />
- <antcall target="dist-java" />
- <antcall target="dist-manuals" />
- <antcall target="dist-src" />
- <antcall target="dist-slackware" />
- <antcall target="dist-deb" />
- <antcall target="dist-mac" />
- <antcall target="dist-win" />
- <property name="wipe.dist.files"
- value="true" />
- <antcall target="dist-cleanup" />
- </target>
-
- <target name="dist-cleanup"
- depends="init">
- <delete includeemptydirs="true">
- <fileset dir="${dist.dir}">
- <selector if="wipe.dist.files">
- <or>
- <filename name="macros/**" />
- <filename name="doc/**" />
- <filename name="jars/**" />
- <filename name="modes/**" />
- <filename name="properties/**" />
- <filename name="startup/**" />
- <filename name="${jar.filename}" />
- <and>
- <filename name="*.tar.bz2" />
- <filename name="${src.archive.filename}"
- negate="true" />
- <filename name="jedit${jedit.version}-dist-mac-finish.tar.bz2"
- negate="true" />
- <filename name="jedit${jedit.version}-dist-win-finish.tar.bz2"
- negate="true" />
- </and>
- <filename name="classes/**" />
- </or>
- </selector>
- </fileset>
- </delete>
- </target>
-</project>
+<?xml version="1.0"?>
+<project name="jedit"
+ default="build">
+ <description>
+ This is an ant build.xml file for building jEdit - Programmer's Text Editor.
+ </description>
+
+ <property file="build.properties"
+ prefix="config"/>
+
+ <!-- jEdit Version -->
+ <property name="jedit.version"
+ value="4.4.1"/>
+ <property name="jedit.build.number"
+ value="04.04.99.01"/>
+
+ <!-- Target Java Versions -->
+ <property name="target.java.version"
+ value="1.6"/>
+ <property name="mac.target.java.version"
+ value="1.6+"/>
+ <!-- based on http://packages.slackverse.org/?v=1&p=92 -->
+ <property name="slackware.target.java.version"
+ value="1_6_0_20-i586-1"/>
+
+ <!-- Various Paths -->
+ <property name="config.build.dir"
+ value="build"/>
+ <property name="config.dist.dir"
+ value="dist"/>
+ <property name="build.dir"
+ location="${config.build.dir}"/>
+ <property name="dist.dir"
+ location="${config.dist.dir}"/>
+ <property name="classes.dir"
+ location="${build.dir}/classes"/>
+ <property name="jar.location"
+ location="${build.dir}"/>
+ <property name="textAreaPackage"
+ location="../textarea"/>
+
+ <!-- Various Filenames -->
+ <property name="jar.filename"
+ value="${ant.project.name}.jar"/>
+ <property name="dist.jar.filename"
+ value="jedit${jedit.version}install.jar"/>
+ <property name="manual.filename.prefix"
+ value="jedit${jedit.version}manual-"/>
+ <property name="src.archive.filename"
+ value="jedit${jedit.version}source.tar.bz2"/>
+ <property name="win.filename"
+ value="jedit${jedit.version}install"/>
+ <property name="mac.disk.image.filename"
+ value="jedit${jedit.version}install.dmg"/>
+
+ <!-- Miscellaneous -->
+ <property name="config.build.debuglevel"
+ value="lines,vars,source"/>
+ <property name="config.build.nowarn"
+ value="false"/>
+ <property name="config.build.deprecation"
+ value="true"/>
+ <property name="config.build.compilerarg"
+ value="-Xlint:unchecked"/>
+ <property name="config.docbook.catalog.debug"
+ value="1"/>
+
+ <!-- Cygwin detection (xsltproc needs special arguments) -->
+ <dirname property="xsltproc.dir"
+ file="${config.xsltproc.executable}"/>
+ <condition property="xsltproc.cygwin.arg"
+ value="--path /usr/share/sgml/docbook/xsl-stylesheets/html/">
+ <and>
+ <available file="${xsltproc.dir}/cygcheck.exe"/>
+ <available file="${xsltproc.dir}/../usr/share/sgml/docbook/xsl-stylesheets/html/docbook.xsl"/>
+ </and>
+ </condition>
+ <condition property="xsltproc.cygwin.arg"
+ value="--path /usr/share/docbook-xsl/html/">
+ <and>
+ <available file="${xsltproc.dir}/cygcheck.exe"/>
+ <available file="${xsltproc.dir}/../usr/share/docbook-xsl/html/docbook.xsl"/>
+ </and>
+ </condition>
+ <property name="xsltproc.cygwin.arg"
+ value=""/>
+
+ <target name="init"
+ unless="init.done">
+ <echo message="Buildfile for ${ant.project.name} (${ant.file})"
+ level="info"/>
+ <fail message="The ant-optional package is needed for jEdit to build, please install it and rerun">
+ <condition>
+ <not>
+ <available classname="org.apache.tools.ant.taskdefs.optional.depend.Depend"/>
+ </not>
+ </condition>
+ </fail>
+ <property name="init.done"
+ value="true"/>
+ </target>
+
+ <target name="clean"
+ depends="init"
+ description="clean up intermediate files">
+ <delete includeemptydirs="true"
+ failonerror="false">
+ <fileset dir="${build.dir}/classes"/>
+ <fileset dir="${dist.dir}/classes"/>
+ <fileset dir="doc"
+ includes="docbook-wrapper-*.xsl"/>
+ </delete>
+ </target>
+
+ <target name="clean-all"
+ depends="init"
+ description="clean up build.dir and dist.dir completely">
+ <delete includeemptydirs="true"
+ failonerror="false">
+ <fileset dir="${build.dir}"/>
+ <fileset dir="${dist.dir}"/>
+ <fileset dir="${textAreaPackage}/build"/>
+ <fileset dir="doc"
+ includes="docbook-wrapper-*.xsl"/>
+ </delete>
+ </target>
+
+ <target name="compile"
+ depends="init">
+ <mkdir dir="${classes.dir}/core"/>
+ <depend srcDir="."
+ destDir="${classes.dir}/core"
+ cache="${classes.dir}"/>
+ <javac srcdir="."
+ destdir="${classes.dir}/core"
+ debug="true"
+ debuglevel="${config.build.debuglevel}"
+ nowarn="${config.build.nowarn}"
+ deprecation="${config.build.deprecation}"
+ source="${target.java.version}"
+ target="${target.java.version}"
+ compiler="modern"
+ encoding="UTF-8"
+ includeAntRuntime="false">
+ <include name="org/**"/>
+ <include name="com/**"/>
+ <compilerarg line="${config.build.compilerarg}"/>
+ </javac>
+ </target>
+
+ <target name="prepare-textArea"
+ depends="init">
+ <delete includeemptydirs="true"
+ failonerror="false">
+ <fileset dir="${textAreaPackage}/src"/>
+ </delete>
+
+ <mkdir dir="${textAreaPackage}/src"/>
+ <copy todir="${textAreaPackage}/src">
+ <fileset dir=".">
+ <include name="modes/*"/>
+ <include name="org/gjt/sp/jedit/bsh/*"/>
+ <include name="org/gjt/sp/jedit/bsh/**/*"/>
+
+ <include name="org/gjt/sp/jedit/buffer/BufferAdapter.java"/>
+ <include name="org/gjt/sp/jedit/buffer/BufferListener.java"/>
+ <include name="org/gjt/sp/jedit/buffer/BufferSegment.java"/>
+ <include name="org/gjt/sp/jedit/buffer/ContentManager.java"/>
+ <include name="org/gjt/sp/jedit/buffer/DefaultFoldHandlerProvider.java"/>
+ <include name="org/gjt/sp/jedit/buffer/DummyFoldHandler.java"/>
+ <include name="org/gjt/sp/jedit/buffer/ExplicitFoldHandler.java"/>
+ <include name="org/gjt/sp/jedit/buffer/FoldHandler.java"/>
+ <include name="org/gjt/sp/jedit/buffer/FoldHandlerProvider.java"/>
+ <include name="org/gjt/sp/jedit/buffer/IndentFoldHandler.java"/>
+ <include name="org/gjt/sp/jedit/buffer/JEditBuffer.java"/>
+ <include name="org/gjt/sp/jedit/buffer/KillRing.java"/>
+ <include name="org/gjt/sp/jedit/buffer/LineManager.java"/>
+ <include name="org/gjt/sp/jedit/buffer/PositionManager.java"/>
+ <include name="org/gjt/sp/jedit/buffer/UndoManager.java"/>
+
+ <include name="org/gjt/sp/jedit/gui/KeyEventTranslator.java"/>
+ <include name="org/gjt/sp/jedit/gui/KeyEventWorkaround.java"/>
+ <include name="org/gjt/sp/jedit/gui/MutableListModel.java"/>
+ <include name="org/gjt/sp/jedit/gui/ShortcutPrefixActiveEvent.java"/>
+ <include name="org/gjt/sp/jedit/gui/HistoryModel.java"/>
+ <include name="org/gjt/sp/jedit/gui/HistoryModelSaver.java"/>
+
+ <include name="org/gjt/sp/jedit/indent/*.java"/>
+
+ <include name="org/gjt/sp/jedit/input/AbstractInputHandler.java"/>
+ <include name="org/gjt/sp/jedit/input/DefaultInputHandlerProvider.java"/>
+ <include name="org/gjt/sp/jedit/input/InputHandlerProvider.java"/>
+ <include name="org/gjt/sp/jedit/input/TextAreaInputHandler.java"/>
+
+ <include name="org/gjt/sp/jedit/syntax/*.java"/>
+ <include name="org/gjt/sp/jedit/syntax/xmode.dtd"/>
+
+ <include name="org/gjt/sp/jedit/datatransfer/JEditDataFlavor.java"/>
+ <include name="org/gjt/sp/jedit/datatransfer/JEditRichText.java"/>
+ <include name="org/gjt/sp/jedit/datatransfer/JEditTransferable.java"/>
+ <include name="org/gjt/sp/jedit/datatransfer/JEditTransferableService.java"/>
+ <include name="org/gjt/sp/jedit/datatransfer/RichJEditTextTransferableService.java"/>
+ <include name="org/gjt/sp/jedit/datatransfer/RichTextTransferable.java"/>
+ <include name="org/gjt/sp/jedit/datatransfer/StringTransferableService.java"/>
+ <include name="org/gjt/sp/jedit/datatransfer/TransferHandler.java"/>
+
+ <include name="org/gjt/sp/jedit/textarea/Anchor.java"/>
+ <include name="org/gjt/sp/jedit/textarea/AntiAlias.java"/>
+ <include name="org/gjt/sp/jedit/textarea/BufferHandler.java"/>
+ <include name="org/gjt/sp/jedit/textarea/ChunkCache.java"/>
+ <include name="org/gjt/sp/jedit/textarea/DisplayManager.java"/>
+ <include name="org/gjt/sp/jedit/textarea/ExtensionManager.java"/>
+ <include name="org/gjt/sp/jedit/textarea/FastRepaintManager.java"/>
+ <include name="org/gjt/sp/jedit/textarea/FirstLine.java"/>
+ <include name="org/gjt/sp/jedit/textarea/FoldPainter.java"/>
+ <include name="org/gjt/sp/jedit/textarea/Gutter.java"/>
+ <include name="org/gjt/sp/jedit/textarea/GutterPopupHandler.java"/>
+ <include name="org/gjt/sp/jedit/textarea/InputMethodSupport.java"/>
+ <include name="org/gjt/sp/jedit/textarea/MouseActions.java"/>
+ <include name="org/gjt/sp/jedit/textarea/MouseActionsProvider.java"/>
+ <include name="org/gjt/sp/jedit/textarea/RangeMap.java"/>
+ <include name="org/gjt/sp/jedit/textarea/Selection.java"/>
+ <include name="org/gjt/sp/jedit/textarea/SelectionManager.java"/>
+ <include name="org/gjt/sp/jedit/textarea/ScreenLineManager.java"/>
+ <include name="org/gjt/sp/jedit/textarea/ScrollLayout.java"/>
+ <include name="org/gjt/sp/jedit/textarea/ScrollLineCount.java"/>
+ <include name="org/gjt/sp/jedit/textarea/ScrollListener.java"/>
+ <include name="org/gjt/sp/jedit/textarea/StandaloneTextArea.java"/>
+ <include name="org/gjt/sp/jedit/textarea/StatusListener.java"/>
+ <include name="org/gjt/sp/jedit/textarea/StructureMatcher.java"/>
+ <include name="org/gjt/sp/jedit/textarea/TextArea.java"/>
+ <include name="org/gjt/sp/jedit/textarea/TextAreaBorder.java"/>
+ <include name="org/gjt/sp/jedit/textarea/TextAreaDropHandler.java"/>
+ <include name="org/gjt/sp/jedit/textarea/TextAreaException.java"/>
+ <include name="org/gjt/sp/jedit/textarea/TextAreaExtension.java"/>
+ <include name="org/gjt/sp/jedit/textarea/TextAreaMouseHandler.java"/>
+ <include name="org/gjt/sp/jedit/textarea/TextAreaPainter.java"/>
+ <include name="org/gjt/sp/jedit/textarea/textarea.actions.xml"/>
+ <include name="org/gjt/sp/jedit/textarea/TriangleFoldPainter.java"/>
+
+ <include name="org/gjt/sp/jedit/ActionListHandler.java"/>
+ <include name="org/gjt/sp/jedit/BeanShellFacade.java"/>
+ <include name="org/gjt/sp/jedit/Debug.java"/>
+ <include name="org/gjt/sp/jedit/IPropertyManager.java"/>
+ <include name="org/gjt/sp/jedit/JEditAbstractEditAction.java"/>
+ <include name="org/gjt/sp/jedit/JEditActionSet.java"/>
+ <include name="org/gjt/sp/jedit/JEditActionContext.java"/>
+ <include name="org/gjt/sp/jedit/JEditBeanShellAction.java"/>
+ <include name="org/gjt/sp/jedit/Mode.java"/>
+ <include name="org/gjt/sp/jedit/OperatingSystem.java"/>
+ <include name="org/gjt/sp/jedit/RegistersListener.java"/>
+ <include name="org/gjt/sp/jedit/Registers.java"/>
+ <include name="org/gjt/sp/jedit/RegisterSaver.java"/>
+ <include name="org/gjt/sp/jedit/SelectionManager.java"/>
+ <include name="org/gjt/sp/jedit/TextUtilities.java"/>
+ <include name="org/gjt/sp/jedit/actions.dtd"/>
+ <include name="org/gjt/sp/jedit/jedit.props"/>
+ <include name="org/gjt/sp/jedit/jedit_keys.props"/>
+
+ <include name="modes/*"/>
+
+ <include name="org/gjt/sp/util/Log*.java"/>
+ <include name="org/gjt/sp/util/IntegerArray.java"/>
+ <include name="org/gjt/sp/util/IOUtilities.java"/>
+ <include name="org/gjt/sp/util/ProgressObserver.java"/>
+ <include name="org/gjt/sp/util/SegmentCharSequence.java"/>
+ <include name="org/gjt/sp/util/StandardUtilities.java"/>
+ <include name="org/gjt/sp/util/Task.java"/>
+ <include name="org/gjt/sp/util/TaskManager.java"/>
+ <include name="org/gjt/sp/util/TaskListener.java"/>
+ <include name="org/gjt/sp/util/ThreadUtilities.java"/>
+ <include name="org/gjt/sp/util/SyntaxUtilities.java"/>
+ <include name="org/gjt/sp/util/XMLUtilities.java"/>
+ </fileset>
+ </copy>
+
+ </target>
+
+ <target name="compile-textArea"
+ depends="init,prepare-textArea">
+ <mkdir dir="${textAreaPackage}/build"/>
+ <javac srcdir="${textAreaPackage}/src"
+ destdir="${textAreaPackage}/build"
+ debug="true"
+ debuglevel="${config.build.debuglevel}"
+ nowarn="${config.build.nowarn}"
+ deprecation="${config.build.deprecation}"
+ source="${target.java.version}"
+ target="${target.java.version}"
+ compiler="modern"
+ encoding="UTF-8">
+ </javac>
+ </target>
+
+ <target name="build"
+ depends="init,compile"
+ description="build the jEdit JAR-file with full debug-information">
+ <mkdir dir="${jar.location}"/>
+ <jar destfile="${jar.location}/${jar.filename}"
+ basedir="${classes.dir}/core"
+ compress="false"
+ manifest="org/gjt/sp/jedit/jedit.manifest"
+ duplicate="fail"
+ index="true">
+ <fileset dir=".">
+ <include name="org/gjt/sp/jedit/bsh/commands/*.bsh"/>
+ <include name="org/gjt/sp/jedit/**/*.dtd"/>
+ <include name="org/gjt/sp/jedit/default.abbrevs"/>
+ <include name="org/gjt/sp/jedit/*.props"/>
+ <include name="org/gjt/sp/jedit/*.xml"/>
+ <include name="org/gjt/sp/jedit/textarea/*.xml"/>
+ <include name="org/gjt/sp/jedit/icons/**/*.gif"/>
+ <include name="org/gjt/sp/jedit/icons/**/*.jpg"/>
+ <include name="org/gjt/sp/jedit/icons/**/*.png"/>
+ </fileset>
+ </jar>
+ <copy todir="${jar.location}">
+ <fileset dir=".">
+ <include name="macros/**"/>
+ <include name="modes/**"/>
+ <include name="properties/**"/>
+ <include name="startup/**"/>
+ </fileset>
+ </copy>
+ </target>
+
+ <target name="build-exe-launcher"
+ depends="init,filter-package-files"
+ description="build the EXE launcher">
+ <fail message="Please set the property "launch4j.dir" in build.properties, you may find example values in build.properties.sample"
+ unless="config.launch4j.dir"/>
+ <taskdef name="launch4j"
+ classname="net.sf.launch4j.ant.Launch4jTask"
+ classpath="${config.launch4j.dir}/launch4j.jar"/>
+ <launch4j configFile="${classes.dir}/package-files/windows/jedit.launch4j.xml"
+ outfile="${jar.location}/jedit.exe"/>
+ </target>
+
+ <target name="build-textArea"
+ depends="init,compile-textArea"
+ description="build the textArea JAR-file with full debug-information">
+ <mkdir dir="${jar.location}"/>
+ <jar destfile="${jar.location}/${ant.project.name}-textArea.jar"
+ compress="false"
+ duplicate="fail"
+ index="true">
+ <fileset dir="${textAreaPackage}/build/"/>
+ <fileset dir="${textAreaPackage}/src">
+ <include name="org/gjt/sp/jedit/textarea/*.xml"/>
+ <include name="org/gjt/sp/jedit/syntax/xmode.dtd"/>
+ <include name="org/gjt/sp/jedit/actions.dtd"/>
+ <include name="org/gjt/sp/jedit/jedit.props"/>
+ <include name="org/gjt/sp/jedit/jedit_keys.props"/>
+ <include name="modes/*"/>
+ </fileset>
+ <manifest>
+ <attribute name="Main-Class"
+ value="org.gjt.sp.jedit.textarea.StandaloneTextArea"/>
+ </manifest>
+ </jar>
+ </target>
+
+ <target name="run"
+ depends="init,build"
+ description="run jEdit">
+ <java jar="${jar.location}/${jar.filename}"
+ fork="true"
+ spawn="true"
+ maxmemory="192M">
+ <arg value="-settings=${build.dir}/settings"/>
+ </java>
+ </target>
+
+ <target name="run-debug"
+ depends="init,build"
+ description="run jEdit with debug listening enabled">
+ <java jar="${jar.location}/${jar.filename}"
+ fork="true"
+ spawn="true"
+ maxmemory="192M">
+ <jvmarg value="-agentlib:jdwp=transport=dt_socket,server=y,address=localhost:5005,timeout=60000"/>
+ <arg value="-settings=${build.dir}/settings"/>
+ </java>
+ </target>
+
+ <target name="generate-docbook-wrapper"
+ if="format"
+ depends="init">
+ <fail message="Please set the property "docbook.xsl" in build.properties, you may find example values in build.properties.sample"
+ unless="config.docbook.xsl"/>
+ <pathconvert property="absolute-stylesheet"
+ dirsep="/">
+ <path location="${config.docbook.xsl}/${stylesheet}"/>
+ </pathconvert>
+ <echo message="<?xml version="1.0"?>${line.separator}"
+ file="doc/docbook-wrapper-${format}.xsl"
+ level="error"/>
+ <echo message="<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"${line.separator}"
+ file="doc/docbook-wrapper-${format}.xsl"
+ append="true"
+ level="error"/>
+ <echo message=" version="1.0">${line.separator}"
+ file="doc/docbook-wrapper-${format}.xsl"
+ append="true"
+ level="error"/>
+ <echo message=" <xsl:import href="file:///${absolute-stylesheet}" />${line.separator}"
+ file="doc/docbook-wrapper-${format}.xsl"
+ append="true"
+ level="error"/>
+ <echo message="</xsl:stylesheet>${line.separator}"
+ file="doc/docbook-wrapper-${format}.xsl"
+ append="true"
+ level="error"/>
+ </target>
+
+ <target name="generate-doc-faq"
+ depends="init"
+ if="doc.output.location"
+ unless="faq.is.up.to.date">
+ <fail message="Please set the property "xsltproc.executable" in build.properties, you may find example values in build.properties.sample"
+ unless="config.xsltproc.executable"/>
+ <fail message="Please set the property "docbook.catalog" in build.properties, you may find example values in build.properties.sample"
+ unless="config.docbook.catalog"/>
+ <mkdir dir="${doc.output.location}/FAQ"/>
+ <exec executable="${config.xsltproc.executable}"
+ dir="doc"
+ failonerror="true">
+ <arg line="${xsltproc.cygwin.arg}"/>
+ <arg value="--output"/>
+ <arg value="../${doc.output.location}/FAQ/"/>
+ <arg value="jedithtml.xsl"/>
+ <arg value="FAQ/faq.xml"/>
+ <env key="XML_CATALOG_FILES"
+ value="${config.docbook.catalog}"/>
+ <env key="XML_DEBUG_CATALOG"
+ value="${config.docbook.catalog.debug}"/>
+ </exec>
+ </target>
+
+ <target name="generate-doc-news"
+ depends="init"
+ if="doc.output.location"
+ unless="news.is.up.to.date">
+ <fail message="Please set the property "xsltproc.executable" in build.properties, you may find example values in build.properties.sample"
+ unless="config.xsltproc.executable"/>
+ <fail message="Please set the property "docbook.catalog" in build.properties, you may find example values in build.properties.sample"
+ unless="config.docbook.catalog"/>
+ <mkdir dir="${doc.output.location}/news44"/>
+ <exec executable="${config.xsltproc.executable}"
+ dir="doc"
+ failonerror="true">
+ <arg line="${xsltproc.cygwin.arg}"/>
+ <arg value="--output"/>
+ <arg value="../${doc.output.location}/news44/"/>
+ <arg value="jedithtml.xsl"/>
+ <arg value="news44/news.xml"/>
+ <env key="XML_CATALOG_FILES"
+ value="${config.docbook.catalog}"/>
+ <env key="XML_DEBUG_CATALOG"
+ value="${config.docbook.catalog.debug}"/>
+ </exec>
+ </target>
+
+ <target name="generate-doc-users-guide"
+ depends="init"
+ if="doc.output.location"
+ unless="users-guide.is.up.to.date">
+ <fail message="Please set the property "xsltproc.executable" in build.properties, you may find example values in build.properties.sample"
+ unless="config.xsltproc.executable"/>
+ <fail message="Please set the property "docbook.catalog" in build.properties, you may find example values in build.properties.sample"
+ unless="config.docbook.catalog"/>
+ <mkdir dir="${doc.output.location}/users-guide"/>
+ <exec executable="${config.xsltproc.executable}"
+ dir="doc"
+ failonerror="true">
+ <arg line="${xsltproc.cygwin.arg}"/>
+ <arg value="--output"/>
+ <arg value="../${doc.output.location}/users-guide/"/>
+ <arg value="jedithtml.xsl"/>
+ <arg value="users-guide/users-guide.xml"/>
+ <env key="XML_CATALOG_FILES"
+ value="${config.docbook.catalog}"/>
+ <env key="XML_DEBUG_CATALOG"
+ value="${config.docbook.catalog.debug}"/>
+ </exec>
+ </target>
+
+ <target name="userdocs"
+ depends="init,docs-html,docs-javadoc"
+ description="generate HTML and JavaDoc API docs (needs xsltproc)"/>
+
+ <target name="docs-upload"
+ depends="userdocs"
+ description="upload generated documentation to public website (needs xsltproc and rsync)">
+ <fail message="Please set the property "rsync.executable" in build.properties, you may find example values in build.properties.sample"
+ unless="config.rsync.executable"/>
+ <exec executable="${config.rsync.executable}"
+ dir="${jar.location}/doc/"
+ failonerror="true">
+ <arg value="-avz"/>
+ <arg value="api"/>
+ <arg value="FAQ"/>
+ <arg value="users-guide"/>
+ <arg value="plugins.jedit.org:/home/groups/j/je/jedit/htdocs/"/>
+ </exec>
+ </target>
+
+ <target name="docs-html"
+ depends="init"
+ description="generate HTML docs (needs xsltproc)">
+ <antcall target="generate-docbook-wrapper">
+ <param name="format"
+ value="html"/>
+ <param name="stylesheet"
+ value="html/chunk.xsl"/>
+ </antcall>
+ <pathconvert property="doc.output.location"
+ dirsep="/">
+ <path location="${jar.location}/doc"/>
+ <globmapper from="${basedir}/*"
+ to="*"
+ handledirsep="true"/>
+ </pathconvert>
+ <dependset>
+ <srcfileset dir="doc/FAQ"/>
+ <targetfileset dir="${doc.output.location}/FAQ"/>
+ </dependset>
+ <available property="faq.is.up.to.date"
+ file="${doc.output.location}/FAQ/toc.xml"
+ type="file"/>
+ <antcall target="generate-doc-faq"/>
+ <dependset>
+ <srcfileset dir="doc/news44"/>
+ <targetfileset dir="${doc.output.location}/news44"/>
+ </dependset>
+ <available property="news.is.up.to.date"
+ file="${doc.output.location}/news44/toc.xml"
+ type="file"/>
+ <antcall target="generate-doc-news"/>
+ <dependset>
+ <srcfileset dir="doc/users-guide"/>
+ <targetfileset dir="${doc.output.location}/users-guide"/>
+ </dependset>
+ <available property="users-guide.is.up.to.date"
+ file="${doc.output.location}/users-guide/toc.xml"
+ type="file"/>
+ <antcall target="generate-doc-users-guide"/>
+ <delete file="doc/docbook-wrapper-html.xsl"
+ failonerror="false"/>
+ <copy todir="${doc.output.location}">
+ <fileset dir="doc">
+ <include name="*.txt"/>
+ <include name="*.html"/>
+ <include name="*.png"/>
+ <include name="tips/**"/>
+ </fileset>
+ </copy>
+ </target>
+
+ <target name="generate-javadoc"
+ depends="init"
+ unless="javadoc.is.up.to.date">
+ <mkdir dir="${classes.dir}/javadoc"/>
+ <javac srcdir="."
+ destdir="${classes.dir}/javadoc"
+ includes="doclet/**"
+ debug="true"
+ debuglevel="${config.build.debuglevel}"
+ nowarn="${config.build.nowarn}"
+ deprecation="${config.build.deprecation}"
+ source="${target.java.version}"
+ target="${target.java.version}"
+ compiler="modern">
+ <compilerarg line="${config.build.compilerarg}"/>
+ </javac>
+ <javadoc sourcepath="."
+ destdir="${classes.dir}/javadoc/api"
+ packagenames="org.*,com.*"
+ classpath="${classes.dir}/core"
+ doclet="doclet.GenerateTocXML"
+ docletpath="${classes.dir}/javadoc"
+ version="true"
+ use="true"
+ author="true"
+ splitindex="true"
+ locale="en"
+ windowtitle="jEdit API"
+ doctitle="jEdit API"
+ failonerror="true"
+ source="${target.java.version}">
+ <group title="jEdit"
+ packages="org.gjt.sp*"/>
+ <group title="BeanShell"
+ packages="org.gjt.sp.jedit.bsh*"/>
+ </javadoc>
+ </target>
+
+ <target name="docs-javadoc"
+ depends="init"
+ description="generate JavaDoc API docs">
+ <dependset>
+ <srcfileset dir=".">
+ <include name="doclet/**/*.java"/>
+ <include name="org/**/*.java"/>
+ <include name="org/**/package.html"/>
+ <include name="com/**/*.java"/>
+ <include name="com/**/package.html"/>
+ </srcfileset>
+ <targetfileset dir="${classes.dir}/javadoc"/>
+ </dependset>
+ <available property="javadoc.is.up.to.date"
+ file="${classes.dir}/javadoc/api/toc.xml"
+ type="file"/>
+ <antcall target="generate-javadoc"/>
+ <copy todir="${jar.location}/doc">
+ <fileset dir="${classes.dir}/javadoc"
+ includes="api/**"
+ excludes="api/**/*.html"/>
+ </copy>
+ <copy todir="${jar.location}/doc">
+ <fileset dir="${classes.dir}/javadoc"
+ includes="api/**/*.html"/>
+ <filterchain>
+ <tokenfilter>
+ <replacestring
+ from="<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">"
+ to="<TD BGCOLOR="#00008B" CLASS="NavBarCell1Rev">"/>
+ </tokenfilter>
+ <tokenfilter>
+ <filetokenizer/>
+ <replaceregex
+ pattern="(<SCRIPT type="text/javascript">.*?</SCRIPT>|onload=".*?")"
+ flags="gs"/>
+ </tokenfilter>
+ </filterchain>
+ </copy>
+ </target>
+
+ <target name="generate-pdf-users-guide"
+ depends="init"
+ if="paper.type"
+ unless="pdf-users-guide.is.up.to.date">
+ <fail message="Please set the property "xsltproc.executable" in build.properties, you may find example values in build.properties.sample"
+ unless="config.xsltproc.executable"/>
+ <fail message="Please set the property "fop.dir" in build.properties, you may find example values in build.properties.sample"
+ unless="config.fop.dir"/>
+ <antcall target="generate-docbook-wrapper">
+ <param name="format"
+ value="fo"/>
+ <param name="stylesheet"
+ value="fo/docbook.xsl"/>
+ </antcall>
+ <pathconvert property="docs-pdf.classes.dir"
+ dirsep="/">
+ <path location="${classes.dir}/docs-pdf"/>
+ <globmapper from="${basedir}/*"
+ to="*"
+ handledirsep="true"/>
+ </pathconvert>
+ <mkdir dir="${docs-pdf.classes.dir}"/>
+ <exec executable="${config.xsltproc.executable}"
+ dir="doc"
+ failonerror="true">
+ <arg line="${xsltproc.cygwin.arg}"/>
+ <arg value="--stringparam"/>
+ <arg value="paper.type"/>
+ <arg value="${paper.type}"/>
+ <arg value="--output"/>
+ <arg value="../${docs-pdf.classes.dir}/${manual.filename.prefix}${manual.filename.paper.type}.fot"/>
+ <arg value="jeditfo.xsl"/>
+ <arg value="users-guide/users-guide.xml"/>
+ </exec>
+ <delete file="doc/docbook-wrapper-fo.xsl"
+ failonerror="false"/>
+ <taskdef name="fop"
+ classname="org.apache.fop.tools.anttasks.Fop">
+ <classpath>
+ <fileset dir="${config.fop.dir}"
+ includes="build/fop.jar
+ lib/*.jar
+ *.jar"/>
+ </classpath>
+ </taskdef>
+ <fop fofile="${docs-pdf.classes.dir}/${manual.filename.prefix}${manual.filename.paper.type}.fot"
+ outfile="${jar.location}/${manual.filename.prefix}${manual.filename.paper.type}.pdf"
+ format="application/pdf"
+ messagelevel="info"/>
+ </target>
+
+ <target name="docs-pdf"
+ depends="init"
+ if="paper.type">
+ <condition property="manual.filename.paper.type"
+ value="a4">
+ <equals arg1="A4"
+ arg2="${paper.type}"/>
+ </condition>
+ <condition property="manual.filename.paper.type"
+ value="letter"
+ else="${paper.type}">
+ <equals arg1="USletter"
+ arg2="${paper.type}"/>
+ </condition>
+ <dependset>
+ <srcfileset dir="doc/users-guide"/>
+ <targetfilelist dir="${classes.dir}/docs-pdf"
+ files="${manual.filename.prefix}${manual.filename.paper.type}.fot"/>
+ <targetfilelist dir="${jar.location}"
+ files="${manual.filename.prefix}${manual.filename.paper.type}.pdf"/>
+ </dependset>
+ <available property="pdf-users-guide.is.up.to.date"
+ file="${jar.location}/${manual.filename.prefix}${manual.filename.paper.type}.pdf"
+ type="file"/>
+ <antcall target="generate-pdf-users-guide"/>
+ </target>
+
+ <target name="docs-pdf-a4"
+ depends="init"
+ description="generate PDF users-guide with A4 paper size (needs xsltproc and fop)">
+ <antcall target="docs-pdf">
+ <param name="paper.type"
+ value="A4"/>
+ </antcall>
+ </target>
+
+ <target name="docs-pdf-USletter"
+ depends="init"
+ description="generate PDF users-guide with US letter paper size (needs xsltproc and fop)">
+ <antcall target="docs-pdf">
+ <param name="paper.type"
+ value="USletter"/>
+ </antcall>
+ </target>
+
+ <target name="compile-installer"
+ depends="init">
+ <mkdir dir="${classes.dir}/installer"/>
+ <depend srcDir="."
+ destDir="${classes.dir}/installer"
+ cache="${classes.dir}"/>
+ <javac srcdir="."
+ destdir="${classes.dir}/installer"
+ includes="installer/**"
+ debug="true"
+ debuglevel="${config.build.debuglevel}"
+ nowarn="${config.build.nowarn}"
+ deprecation="${config.build.deprecation}"
+ source="${target.java.version}"
+ target="${target.java.version}"
+ compiler="modern">
+ <compilerarg line="${config.build.compilerarg}"/>
+ </javac>
+ </target>
+
+ <target name="compile-default-plugins-for-dist"
+ depends="init">
+ <ant dir="jars/QuickNotepad"
+ target="dist"
+ inheritAll="false">
+ <property name="jedit.install.dir"
+ value="${dist.dir}"/>
+ <property name="install.dir"
+ value="${dist.dir}/jars"/>
+ </ant>
+ <ant dir="jars/QuickNotepad"
+ target="clean"
+ inheritAll="false">
+ <property name="jedit.install.dir"
+ value="${dist.dir}"/>
+ <property name="install.dir"
+ value="${dist.dir}/jars"/>
+ </ant>
+ <ant dir="jars/MacOSX"
+ target="dist"
+ inheritAll="false">
+ <property name="jedit.install.dir"
+ value="${dist.dir}"/>
+ <property name="install.dir"
+ value="${dist.dir}/jars"/>
+ </ant>
+ <ant dir="jars/MacOSX"
+ target="clean"
+ inheritAll="false">
+ <property name="jedit.install.dir"
+ value="${dist.dir}"/>
+ <property name="install.dir"
+ value="${dist.dir}/jars"/>
+ </ant>
+ </target>
+
+ <target name="dist-java"
+ depends="init"
+ description="build the Java-installer">
+ <antcall target="prepare-dist-files"/>
+ <tar destfile="${dist.dir}/jedit-macros.tar.bz2"
+ compression="bzip2">
+ <tarfileset id="jedit-macros"
+ dir="${dist.dir}"
+ includes="macros/**"/>
+ </tar>
+ <tar destfile="${dist.dir}/jedit-program.tar.bz2"
+ compression="bzip2">
+ <tarfileset id="jedit-program"
+ dir="${dist.dir}"
+ includes="doc/**
+ jars/QuickNotepad.jar
+ modes/**
+ properties/**
+ startup/**
+ ${jar.filename}"
+ excludes="doc/api/**"/>
+ </tar>
+ <tar destfile="${dist.dir}/jedit-windows.tar.bz2"
+ compression="bzip2">
+ <tarfileset id="jedit-windows"
+ dir="${dist.dir}"
+ includes="jedit.exe"/>
+ </tar>
+ <tar destfile="${dist.dir}/jedit-mac.tar.bz2"
+ compression="bzip2">
+ <tarfileset id="jedit-mac"
+ dir="${dist.dir}"
+ includes="jars/MacOSX.jar"/>
+ </tar>
+ <tar destfile="${dist.dir}/jedit-api.tar.bz2"
+ compression="bzip2">
+ <tarfileset id="jedit-api"
+ dir="${dist.dir}"
+ includes="doc/api/**"/>
+ </tar>
+ <tar destfile="${dist.dir}/jedit-os2.tar.bz2"
+ compression="bzip2">
+ <tarfileset id="jedit-os2"
+ dir="${dist.dir}/classes/package-files/os2"
+ includes="jedit.cmd"/>
+ </tar>
+ <antcall target="compile-installer">
+ <param name="config.build.debuglevel"
+ value="lines,source"/>
+ <param name="classes.dir"
+ location="${dist.dir}/classes"/>
+ </antcall>
+ <antcall target="compile-calculatesize">
+ <param name="config.build.debuglevel"
+ value="lines,source"/>
+ <param name="classes.dir"
+ location="${dist.dir}/classes"/>
+ </antcall>
+ <taskdef name="calculatesize"
+ classname="de.masters_of_disaster.ant.tasks.calculatesize.CalculateSize"
+ classpath="${dist.dir}/classes/calculatesize"/>
+ <calculatesize realsizeproperty="jedit-macros.realsize"
+ disksizeproperty="jedit-macros.disksize">
+ <fileset refid="jedit-macros"/>
+ </calculatesize>
+ <calculatesize realsizeproperty="jedit-program.realsize"
+ disksizeproperty="jedit-program.disksize">
+ <fileset refid="jedit-program"/>
+ </calculatesize>
+ <calculatesize realsizeproperty="jedit-windows.realsize"
+ disksizeproperty="jedit-windows.disksize">
+ <fileset refid="jedit-windows"/>
+ </calculatesize>
+ <calculatesize realsizeproperty="jedit-mac.realsize"
+ disksizeproperty="jedit-mac.disksize">
+ <fileset refid="jedit-mac"/>
+ </calculatesize>
+ <calculatesize realsizeproperty="jedit-api.realsize"
+ disksizeproperty="jedit-api.disksize">
+ <fileset refid="jedit-api"/>
+ </calculatesize>
+ <calculatesize realsizeproperty="jedit-os2.realsize"
+ disksizeproperty="jedit-os2.disksize">
+ <fileset refid="jedit-os2"/>
+ </calculatesize>
+ <copy todir="${dist.dir}/classes/installer/installer"
+ encoding="UTF-8"
+ overwrite="true">
+ <fileset file="installer/install.props"/>
+ <filterset>
+ <filter token="jedit.version"
+ value="${jedit.version}"/>
+ <filter token="jedit-macros.realsize"
+ value="${jedit-macros.realsize}"/>
+ <filter token="jedit-macros.disksize"
+ value="${jedit-macros.disksize}"/>
+ <filter token="jedit-program.realsize"
+ value="${jedit-program.realsize}"/>
+ <filter token="jedit-program.disksize"
+ value="${jedit-program.disksize}"/>
+ <filter token="jedit-windows.realsize"
+ value="${jedit-windows.realsize}"/>
+ <filter token="jedit-windows.disksize"
+ value="${jedit-windows.disksize}"/>
+ <filter token="jedit-mac.realsize"
+ value="${jedit-mac.realsize}"/>
+ <filter token="jedit-mac.disksize"
+ value="${jedit-mac.disksize}"/>
+ <filter token="jedit-api.realsize"
+ value="${jedit-api.realsize}"/>
+ <filter token="jedit-api.disksize"
+ value="${jedit-api.disksize}"/>
+ <filter token="jedit-os2.realsize"
+ value="${jedit-os2.realsize}"/>
+ <filter token="jedit-os2.disksize"
+ value="${jedit-os2.disksize}"/>
+ </filterset>
+ </copy>
+ <jar destfile="${dist.dir}/${dist.jar.filename}"
+ basedir="${dist.dir}/classes/installer"
+ compress="true"
+ manifest="installer/install.mf"
+ duplicate="fail"
+ index="true">
+ <fileset dir=".">
+ <include name="installer/*.html"/>
+ </fileset>
+ <fileset dir="${dist.dir}/classes/package-files/linux">
+ <include name="jedit.1"/>
+ </fileset>
+ <zipfileset dir="${dist.dir}"
+ includes="jedit-api.tar.bz2
+ jedit-mac.tar.bz2
+ jedit-macros.tar.bz2
+ jedit-os2.tar.bz2
+ jedit-windows.tar.bz2
+ jedit-program.tar.bz2"
+ prefix="installer"/>
+ </jar>
+ <condition property="wipe.dist.files">
+ <not>
+ <isset property="dont.wipe.dist.files"/>
+ </not>
+ </condition>
+ <antcall target="dist-cleanup"/>
+ </target>
+
+ <target name="dist-manuals"
+ depends="init"
+ description="build the PDF-manuals">
+ <antcall target="docs-pdf-a4">
+ <param name="classes.dir"
+ location="${dist.dir}/classes"/>
+ <param name="jar.location"
+ location="${dist.dir}"/>
+ </antcall>
+ <antcall target="docs-pdf-USletter">
+ <param name="classes.dir"
+ location="${dist.dir}/classes"/>
+ <param name="jar.location"
+ location="${dist.dir}"/>
+ </antcall>
+ <condition property="wipe.dist.files">
+ <not>
+ <isset property="dont.wipe.dist.files"/>
+ </not>
+ </condition>
+ <antcall target="dist-cleanup"/>
+ </target>
+
+ <target name="dist-src"
+ depends="init"
+ description="build the src-archive">
+ <mkdir dir="${dist.dir}"/>
+ <tar destfile="${dist.dir}/${src.archive.filename}"
+ compression="bzip2">
+ <tarfileset dir="."
+ excludes="${config.build.dir}/**
+ ${config.dist.dir}/**
+ **/build.properties
+ doc/docbook-wrapper-*.xsl"
+ prefix="jEdit/"/>
+ <tarfileset dir="../build-support"
+ prefix="build-support/"/>
+ </tar>
+ </target>
+
+ <target name="compile-jarbundler"
+ depends="init">
+ <mkdir dir="${classes.dir}/jarbundler"/>
+ <depend srcDir="."
+ destDir="${classes.dir}/jarbundler"
+ cache="${classes.dir}"/>
+ <javac srcdir="."
+ destdir="${classes.dir}/jarbundler"
+ includes="net/**"
+ debug="true"
+ debuglevel="${config.build.debuglevel}"
+ nowarn="${config.build.nowarn}"
+ deprecation="${config.build.deprecation}"
+ source="1.4"
+ target="1.4"
+ compiler="modern">
+ <compilerarg line="${config.build.compilerarg}"/>
+ </javac>
+ </target>
+
+ <target name="dist-mac-finish"
+ depends="init"
+ unless="build.on.non.mac"
+ description="finish building the Mac OS X disk image (DMG-file) on Mac OS X">
+ <fail message="The disk image (DMG-file) for easy distribution on Mac OS X can only be built on Mac OS X currently">
+ <condition>
+ <not>
+ <os family="mac"/>
+ </not>
+ </condition>
+ </fail>
+ <taskdef name="jarbundler"
+ classname="net.sourceforge.jarbundler.JarBundler"
+ classpath="${dist.dir}/classes/jarbundler"/>
+ <tstamp>
+ <format property="current.year"
+ pattern="yyyy"/>
+ </tstamp>
+ <mkdir dir="${dist.dir}/classes/mac"/>
+ <jarbundler dir="${dist.dir}/classes/mac"
+ name="jEdit"
+ mainclass="org.gjt.sp.jedit.jEdit"
+ jar="${dist.dir}/${jar.filename}"
+ arguments="-background"
+ build="${jedit.build.number}"
+ bundleid="org.gjt.sp.jedit"
+ extraclasspath="/System/Library/Java"
+ icon="icons/icon.icns"
+ infostring="jEdit ${jedit.version}, Copyright © 1998-${current.year} Contributors"
+ jvmversion="${mac.target.java.version}"
+ shortname="jEdit"
+ signature="JESP"
+ stubfile="jedit"
+ version="${jedit.version}"
+ vmoptions="-Xmx192M">
+ <javaproperty name="apple.awt.antialiasing" value="true"/>
+ <javaproperty name="apple.awt.textantialiasing" value="true"/>
+ <javaproperty name="apple.laf.useScreenMenuBar" value="true"/>
+ <!-- Comented due https://sourceforge.net/tracker/?func=detail&atid=100588&aid=2820535&group_id=588 discussion -->
+ <!--javaproperty name="apple.awt.graphics.UseQuartz" value="true" />
+ <javaproperty name="apple.awt.rendering" value="speed" /-->
+ <javafileset dir="${dist.dir}"
+ includes="doc/**
+ jars/**
+ macros/**
+ modes/**
+ properties/**
+ startup/**"/>
+ <documenttype name="jEdit TEXT Document"
+ extensions="*"
+ ostypes="TEXT ****"
+ iconfile="icons/file.icns"
+ role="Editor"/>
+ <service message="openFile"
+ menuitem="jEdit/Open Files"
+ sendtypes="NSStringPboardType,NSFilenamesPboardType"/>
+ <service message="insertSelection"
+ menuitem="jEdit/Insert Text"
+ sendtypes="NSStringPboardType"/>
+ <service message="openSelection"
+ menuitem="jEdit/New Buffer with Text"
+ sendtypes="NSStringPboardType"/>
+ </jarbundler>
+ <delete file="${dist.dir}/${mac.disk.image.filename}"
+ failonerror="false"/>
+ <exec executable="hdiutil"
+ failonerror="true">
+ <arg value="create"/>
+ <arg value="-quiet"/>
+ <arg value="-volname"/>
+ <arg value="jEdit ${jedit.version}"/>
+ <arg value="-srcfolder"/>
+ <arg file="${dist.dir}/classes/mac/jEdit.app"/>
+ <arg file="${dist.dir}/${mac.disk.image.filename}"/>
+ </exec>
+ <exec executable="hdiutil"
+ failonerror="true">
+ <arg value="internet-enable"/>
+ <arg value="-quiet"/>
+ <arg file="${dist.dir}/${mac.disk.image.filename}"/>
+ </exec>
+ <condition property="wipe.dist.files">
+ <not>
+ <isset property="dont.wipe.dist.files"/>
+ </not>
+ </condition>
+ <antcall target="dist-cleanup"/>
+ </target>
+
+ <target name="prepare-dist-mac-finish"
+ depends="init"
+ if="build.on.non.mac">
+ <tar destfile="${dist.dir}/jedit${jedit.version}-dist-mac-finish.tar.bz2"
+ basedir="."
+ includes="build.xml
+ icons/file.icns
+ icons/icon.icns
+ ${config.dist.dir}/${jar.filename}
+ ${config.dist.dir}/classes/jarbundler/**
+ ${config.dist.dir}/doc/**
+ ${config.dist.dir}/jars/**
+ ${config.dist.dir}/macros/**
+ ${config.dist.dir}/modes/**
+ ${config.dist.dir}/properties/**
+ ${config.dist.dir}/startup/**"
+ compression="bzip2"/>
+ </target>
+
+ <target name="dist-mac"
+ depends="init"
+ description="build the Mac OS X disk image (DMG-file)">
+ <antcall target="prepare-dist-files"/>
+ <antcall target="compile-jarbundler">
+ <param name="config.build.debuglevel"
+ value="lines,source"/>
+ <param name="classes.dir"
+ location="${dist.dir}/classes"/>
+ </antcall>
+ <condition property="build.on.non.mac">
+ <not>
+ <os family="mac"/>
+ </not>
+ </condition>
+ <antcall target="dist-mac-finish">
+ <param name="dont.wipe.dist.files"
+ value="true"/>
+ </antcall>
+ <antcall target="prepare-dist-mac-finish"/>
+ <condition property="wipe.dist.files">
+ <not>
+ <isset property="dont.wipe.dist.files"/>
+ </not>
+ </condition>
+ <antcall target="dist-cleanup"/>
+ </target>
+
+ <target name="translate-paths-for-wine"
+ if="config.winepath.executable">
+ <exec executable="${config.winepath.executable}"
+ outputproperty="basedir.for.wine"
+ failonerror="true">
+ <arg value="-w"/>
+ <arg value="${basedir}"/>
+ </exec>
+ <exec executable="${config.winepath.executable}"
+ outputproperty="dist.dir.for.wine"
+ failonerror="true">
+ <arg value="-w"/>
+ <arg value="${dist.dir}"/>
+ </exec>
+ </target>
+
+ <target name="filter-package-files"
+ depends="init,translate-paths-for-wine">
+ <fail message="Please set the property "winepath.executable" in build.properties, you may find example values in build.properties.sample">
+ <condition>
+ <and>
+ <istrue value="${config.innosetup.via.wine}"/>
+ <not>
+ <isset property="config.winepath.executable"/>
+ </not>
+ </and>
+ </condition>
+ </fail>
+ <condition property="basedir.possibly.for.wine"
+ value="${basedir.for.wine}"
+ else="${basedir}">
+ <istrue value="${config.innosetup.via.wine}"/>
+ </condition>
+ <condition property="dist.dir.possibly.for.wine"
+ value="${dist.dir.for.wine}"
+ else="${dist.dir}">
+ <istrue value="${config.innosetup.via.wine}"/>
+ </condition>
+ <tstamp>
+ <format property="current.year"
+ pattern="yyyy"/>
+ </tstamp>
+ <copy todir="${classes.dir}/package-files"
+ encoding="UTF-8"
+ overwrite="true">
+ <fileset dir="package-files"/>
+ <filterset id="package-files-filter">
+ <filter token="base.dir"
+ value="${basedir}"/>
+ <filter token="base.dir.possibly.for.wine"
+ value="${basedir.possibly.for.wine}"/>
+ <filter token="current.year"
+ value="${current.year}"/>
+ <filter token="dist.dir.possibly.for.wine"
+ value="${dist.dir.possibly.for.wine}"/>
+ <filter token="jar.filename"
+ value="${jar.filename}"/>
+ <filter token="jedit.build.number"
+ value="${jedit.build.number}"/>
+ <filter token="jedit.version"
+ value="${jedit.version}"/>
+ <filter token="slackware.target.java.version"
+ value="${slackware.target.java.version}"/>
+ <filter token="target.java.version"
+ value="${target.java.version}"/>
+ <filter token="win.filename"
+ value="${win.filename}"/>
+ </filterset>
+ </copy>
+ </target>
+
+ <target name="prepare-dist-files"
+ depends="init">
+ <antcall target="build">
+ <param name="config.build.debuglevel"
+ value="lines,source"/>
+ <param name="classes.dir"
+ location="${dist.dir}/classes"/>
+ <param name="jar.location"
+ location="${dist.dir}"/>
+ </antcall>
+ <antcall target="docs-html">
+ <param name="config.build.debuglevel"
+ value="lines,source"/>
+ <param name="classes.dir"
+ location="${dist.dir}/classes"/>
+ <param name="jar.location"
+ location="${dist.dir}"/>
+ </antcall>
+ <antcall target="docs-javadoc">
+ <param name="config.build.debuglevel"
+ value="lines,source"/>
+ <param name="classes.dir"
+ location="${dist.dir}/classes"/>
+ <param name="jar.location"
+ location="${dist.dir}"/>
+ </antcall>
+ <antcall target="compile-default-plugins-for-dist"/>
+ <antcall target="filter-package-files">
+ <param name="classes.dir"
+ location="${dist.dir}/classes"/>
+ </antcall>
+ <antcall target="build-exe-launcher">
+ <param name="classes.dir"
+ location="${dist.dir}/classes"/>
+ <param name="jar.location"
+ location="${dist.dir}"/>
+ </antcall>
+ <gzip src="${dist.dir}/classes/package-files/linux/jedit.1"
+ destfile="${dist.dir}/classes/package-files/linux/jedit.1.gz"/>
+ </target>
+
+ <target name="dist-slackware"
+ depends="init"
+ description="build the Slackware Package">
+ <antcall target="prepare-dist-files"/>
+ <tar destfile="${dist.dir}/jedit-${jedit.version}-noarch-1sao.tgz"
+ compression="gzip">
+ <tarfileset file="."
+ username="root"
+ group="root"
+ fullpath="./"/>
+ <tarfileset dir="${dist.dir}/classes/package-files/linux/slackware"
+ includes="doinst.sh
+ slack-desc
+ slack-required"
+ username="root"
+ group="root"
+ prefix="install/"/>
+ <tarfileset file="${dist.dir}/classes/package-files/linux/jedit"
+ mode="755"
+ username="root"
+ group="bin"
+ fullpath="usr/bin/jedit"/>
+ <tarfileset dir="${dist.dir}/doc"
+ includes="*.txt"
+ username="root"
+ group="root"
+ prefix="usr/doc/jedit-${jedit.version}/"/>
+ <tarfileset file="${dist.dir}/classes/package-files/linux/jedit.1.gz"
+ username="root"
+ group="root"
+ fullpath="usr/man/man1/jedit.1.gz"/>
+ <tarfileset file="${dist.dir}/classes/package-files/linux/slackware/jEdit.desktop"
+ username="root"
+ group="root"
+ fullpath="usr/share/applications/jEdit.desktop"/>
+ <tarfileset dir="${dist.dir}"
+ includes="doc/**
+ jars/QuickNotepad.jar
+ macros/**
+ modes/**
+ properties/**
+ startup/**
+ ${jar.filename}"
+ username="root"
+ group="root"
+ prefix="usr/share/jedit-${jedit.version}/"/>
+ <tarfileset dir="icons"
+ includes="jedit-file48.png
+ jedit-icon48.png"
+ username="root"
+ group="root"
+ prefix="usr/share/pixmaps/"/>
+ </tar>
+ <condition property="wipe.dist.files">
+ <not>
+ <isset property="dont.wipe.dist.files"/>
+ </not>
+ </condition>
+ <antcall target="dist-cleanup"/>
+ </target>
+
+ <target name="compile-ar"
+ depends="init">
+ <mkdir dir="${classes.dir}/ar"/>
+ <depend srcDir="."
+ destDir="${classes.dir}/ar"
+ cache="${classes.dir}"/>
+ <javac srcdir="."
+ destdir="${classes.dir}/ar"
+ includes="de/masters_of_disaster/ant/tasks/ar/**"
+ debug="true"
+ debuglevel="${config.build.debuglevel}"
+ nowarn="${config.build.nowarn}"
+ deprecation="${config.build.deprecation}"
+ source="${target.java.version}"
+ target="${target.java.version}"
+ compiler="modern">
+ <compilerarg line="${config.build.compilerarg}"/>
+ </javac>
+ </target>
+
+ <target name="compile-deb"
+ depends="init">
+ <mkdir dir="${classes.dir}/deb"/>
+ <depend srcDir="."
+ destDir="${classes.dir}/deb"
+ cache="${classes.dir}"/>
+ <javac srcdir="."
+ destdir="${classes.dir}/deb"
+ includes="de/masters_of_disaster/ant/tasks/deb/**"
+ debug="true"
+ debuglevel="${config.build.debuglevel}"
+ nowarn="${config.build.nowarn}"
+ deprecation="${config.build.deprecation}"
+ source="${target.java.version}"
+ target="${target.java.version}"
+ compiler="modern">
+ <compilerarg line="${config.build.compilerarg}"/>
+ </javac>
+ </target>
+
+ <target name="compile-calculatesize"
+ depends="init">
+ <mkdir dir="${classes.dir}/calculatesize"/>
+ <depend srcDir="."
+ destDir="${classes.dir}/calculatesize"
+ cache="${classes.dir}"/>
+ <javac srcdir="."
+ destdir="${classes.dir}/calculatesize"
+ includes="de/masters_of_disaster/ant/tasks/calculatesize/**"
+ debug="true"
+ debuglevel="${config.build.debuglevel}"
+ nowarn="${config.build.nowarn}"
+ deprecation="${config.build.deprecation}"
+ source="${target.java.version}"
+ target="${target.java.version}"
+ compiler="modern">
+ <compilerarg line="${config.build.compilerarg}"/>
+ </javac>
+ </target>
+
+ <target name="dist-deb"
+ depends="init"
+ description="build the DEB Package">
+ <antcall target="prepare-dist-files"/>
+ <antcall target="compile-ar">
+ <param name="config.build.debuglevel"
+ value="lines,source"/>
+ <param name="classes.dir"
+ location="${dist.dir}/classes"/>
+ </antcall>
+ <antcall target="compile-deb">
+ <param name="config.build.debuglevel"
+ value="lines,source"/>
+ <param name="classes.dir"
+ location="${dist.dir}/classes"/>
+ </antcall>
+ <taskdef name="deb"
+ classname="de.masters_of_disaster.ant.tasks.deb.Deb"
+ classpath="${dist.dir}/classes/deb"/>
+ <antcall target="compile-calculatesize">
+ <param name="config.build.debuglevel"
+ value="lines,source"/>
+ <param name="classes.dir"
+ location="${dist.dir}/classes"/>
+ </antcall>
+ <taskdef name="calculatesize"
+ classname="de.masters_of_disaster.ant.tasks.calculatesize.CalculateSize"
+ classpath="${dist.dir}/classes/calculatesize"/>
+ <calculatesize realsizeproperty="deb.installed.size">
+ <fileset dir="${dist.dir}/doc"
+ includes="*.txt"/>
+ <fileset dir="${dist.dir}"
+ includes="classes/package-files/linux/jedit
+ classes/package-files/linux/deb/jedit
+ classes/package-files/linux/deb/jedit.desktop
+ classes/package-files/linux/jedit.1.gz
+ doc/**
+ jars/QuickNotepad.jar
+ macros/**
+ modes/**
+ properties/**
+ startup/**
+ ${jar.filename}"/>
+ </calculatesize>
+ <copy todir="${dist.dir}/classes/package-files/linux/deb"
+ encoding="UTF-8"
+ overwrite="true">
+ <fileset file="package-files/linux/deb/control"/>
+ <filterset>
+ <filter token="jedit.build.number"
+ value="${jedit.build.number}"/>
+ <filter token="deb.installed.size"
+ value="${deb.installed.size}"/>
+ </filterset>
+ </copy>
+ <deb destfile="${dist.dir}/jedit_${jedit.version}_all.deb"
+ tempDir="${dist.dir}/classes/deb"
+ deleteTempFiles="false"
+ includeMd5sums="true">
+ <controlfileset file="${dist.dir}/classes/package-files/linux/deb/control"/>
+ <controlfileset dir="${dist.dir}/classes/package-files/linux/deb"
+ includes="postinst
+ postrm"
+ mode="755"/>
+ <datafileset file="."
+ fullpath="usr/"/>
+ <datafileset file="."
+ fullpath="usr/bin/"/>
+ <datafileset file="${dist.dir}/classes/package-files/linux/jedit"
+ fullpath="usr/bin/jedit"
+ mode="755"/>
+ <datafileset file="."
+ fullpath="usr/lib/"/>
+ <datafileset file="."
+ fullpath="usr/lib/menu/"/>
+ <datafileset file="${dist.dir}/classes/package-files/linux/deb/jedit"
+ fullpath="usr/lib/menu/jedit"/>
+ <datafileset file="."
+ fullpath="usr/share/"/>
+ <datafileset file="."
+ fullpath="usr/share/applications/"/>
+ <datafileset file="${dist.dir}/classes/package-files/linux/deb/jedit.desktop"
+ fullpath="usr/share/applications/jedit.desktop"/>
+ <datafileset file="."
+ fullpath="usr/share/doc/"/>
+ <datafileset file="."
+ fullpath="usr/share/doc/jEdit/"/>
+ <datafileset dir="${dist.dir}/doc"
+ includes="*.txt"
+ prefix="usr/share/doc/jEdit/"/>
+ <datafileset file="."
+ fullpath="usr/share/jEdit/"/>
+ <datafileset dir="${dist.dir}"
+ includes="doc/**
+ macros/**
+ modes/**
+ properties/**
+ startup/**
+ ${jar.filename}"
+ prefix="usr/share/jEdit/"/>
+ <datafileset file="."
+ fullpath="usr/share/jEdit/jars/"/>
+ <datafileset dir="${dist.dir}/jars"
+ includes="QuickNotepad.jar"
+ prefix="usr/share/jEdit/jars/"/>
+ <datafileset file="."
+ fullpath="usr/share/man/"/>
+ <datafileset file="."
+ fullpath="usr/share/man/man1/"/>
+ <datafileset file="${dist.dir}/classes/package-files/linux/jedit.1.gz"
+ fullpath="usr/share/man/man1/jedit.1.gz"/>
+ </deb>
+ <condition property="wipe.dist.files">
+ <not>
+ <isset property="dont.wipe.dist.files"/>
+ </not>
+ </condition>
+ <antcall target="dist-cleanup"/>
+ </target>
+
+ <target name="dist-win-finish"
+ depends="init"
+ unless="build.on.non.win"
+ description="finish building the Windows installer (EXE-file) on Windows or via wine">
+ <fail message="The Windows installer (EXE-file) can only be built on Windows or via wine currently">
+ <condition>
+ <not>
+ <or>
+ <os family="windows"/>
+ <istrue value="${config.innosetup.via.wine}"/>
+ </or>
+ </not>
+ </condition>
+ </fail>
+ <fail message="Please set the property "innosetup.compiler.executable" in build.properties, you may find example values in build.properties.sample"
+ unless="config.innosetup.compiler.executable"/>
+ <fail message="Please set the property "wine.executable" in build.properties, you may find example values in build.properties.sample">
+ <condition>
+ <and>
+ <istrue value="${config.innosetup.via.wine}"/>
+ <not>
+ <isset property="config.wine.executable"/>
+ </not>
+ </and>
+ </condition>
+ </fail>
+ <condition property="innosetup.compiler.executable"
+ value="${config.wine.executable}"
+ else="${config.innosetup.compiler.executable}">
+ <istrue value="${config.innosetup.via.wine}"/>
+ </condition>
+ <condition property="innosetup.compiler.argument"
+ value=""${config.innosetup.compiler.executable}""
+ else="">
+ <istrue value="${config.innosetup.via.wine}"/>
+ </condition>
+ <exec executable="${innosetup.compiler.executable}"
+ dir="${dist.dir}"
+ failonerror="true">
+ <arg line="${innosetup.compiler.argument}"/>
+ <arg value="classes/package-files/windows/win32installer.iss"/>
+ </exec>
+ <condition property="wipe.dist.files">
+ <not>
+ <isset property="dont.wipe.dist.files"/>
+ </not>
+ </condition>
+ <antcall target="dist-cleanup"/>
+ </target>
+
+ <target name="prepare-dist-win-finish"
+ depends="init"
+ if="build.on.non.win">
+ <tar destfile="${dist.dir}/jedit${jedit.version}-dist-win-finish.tar.bz2"
+ basedir="."
+ includes="build.xml
+ icons/jedit.ico
+ icons/WindowsInstallerSmallImage.bmp
+ icons/WindowsInstallerImage.bmp
+ ${config.dist.dir}/${jar.filename}
+ ${config.dist.dir}/classes/package-files/windows/**
+ ${config.dist.dir}/doc/**
+ ${config.dist.dir}/jars/QuickNotepad.jar
+ ${config.dist.dir}/macros/**
+ ${config.dist.dir}/modes/**
+ ${config.dist.dir}/properties/**
+ ${config.dist.dir}/startup/**"
+ compression="bzip2"/>
+ </target>
+
+ <target name="dist-win"
+ depends="init"
+ description="build the Windows installer (EXE-file)">
+ <antcall target="prepare-dist-files"/>
+ <condition property="build.on.non.win">
+ <not>
+ <or>
+ <os family="windows"/>
+ <istrue value="${config.innosetup.via.wine}"/>
+ </or>
+ </not>
+ </condition>
+ <antcall target="dist-win-finish">
+ <param name="dont.wipe.dist.files"
+ value="true"/>
+ </antcall>
+ <antcall target="prepare-dist-win-finish"/>
+ <condition property="wipe.dist.files">
+ <not>
+ <isset property="dont.wipe.dist.files"/>
+ </not>
+ </condition>
+ <antcall target="dist-cleanup"/>
+ </target>
+
+ <target name="dist"
+ depends="init"
+ description="build all distribution files">
+ <property name="dont.wipe.dist.files"
+ value="true"/>
+ <antcall target="dist-java"/>
+ <antcall target="dist-manuals"/>
+ <antcall target="dist-src"/>
+ <antcall target="dist-slackware"/>
+ <antcall target="dist-deb"/>
+ <antcall target="dist-mac"/>
+ <antcall target="dist-win"/>
+ <property name="wipe.dist.files"
+ value="true"/>
+ <antcall target="dist-cleanup"/>
+ </target>
+
+ <target name="dist-cleanup"
+ depends="init">
+ <delete includeemptydirs="true">
+ <fileset dir="${dist.dir}">
+ <selector if="wipe.dist.files">
+ <or>
+ <filename name="macros/**"/>
+ <filename name="doc/**"/>
+ <filename name="jars/**"/>
+ <filename name="modes/**"/>
+ <filename name="properties/**"/>
+ <filename name="startup/**"/>
+ <filename name="${jar.filename}"/>
+ <filename name="jedit.exe"/>
+ <and>
+ <filename name="*.tar.bz2"/>
+ <filename name="${src.archive.filename}"
+ negate="true"/>
+ <filename name="jedit${jedit.version}-dist-mac-finish.tar.bz2"
+ negate="true"/>
+ <filename name="jedit${jedit.version}-dist-win-finish.tar.bz2"
+ negate="true"/>
+ </and>
+ <filename name="classes/**"/>
+ </or>
+ </selector>
+ </fileset>
+ </delete>
+ </target>
+</project>
diff --git a/jEdit/com/microstar/xml/HandlerBase.java b/jEdit/com/microstar/xml/HandlerBase.java
deleted file mode 100644
index f53f3ba..0000000
--- a/jEdit/com/microstar/xml/HandlerBase.java
+++ /dev/null
@@ -1,192 +0,0 @@
-// HandlerBase.java: Simple base class for AElfred processors.
-// NO WARRANTY! See README, and copyright below.
-// $Id: HandlerBase.java 12845 2008-06-13 19:42:59Z ezust $
-
-package com.microstar.xml;
-
-import com.microstar.xml.XmlHandler;
-import com.microstar.xml.XmlException;
-import java.io.Reader;
-
-
-/**
- * Convenience base class for AElfred handlers.
- * <p>This base class implements the XmlHandler interface with
- * (mostly empty) default handlers. You are not required to use this,
- * but if you need to handle only a few events, you might find
- * it convenient to extend this class rather than implementing
- * the entire interface. This example overrides only the
- * <code>charData</code> method, using the defaults for the others:
- * <pre>
- * import com.microstar.xml.HandlerBase;
- *
- * public class MyHandler extends HandlerBase {
- * public void charData (char ch[], int start, int length)
- * {
- * System.out.println("Data: " + new String (ch, start, length));
- * }
- * }
- * </pre>
- * <p>This class is optional, but if you use it, you must also
- * include the <code>XmlException</code> class.
- * <p>Do not extend this if you are using SAX; extend
- * <code>org.xml.sax.HandlerBase</code> instead.
- * @author Copyright (c) 1998 by Microstar Software Ltd.
- * @author written by David Megginson <dmeggins at microstar.com>
- * @version 1.1
- * @see XmlHandler
- * @see XmlException
- * @see org.xml.sax.HandlerBase
- * @deprecated use org.xml.sax.helpers.DefaultHandler
- */
-public class HandlerBase implements XmlHandler {
-
- /**
- * Handle the start of the document.
- * <p>The default implementation does nothing.
- * @see com.microstar.xml.XmlHandler#startDocument
- * @exception java.lang.Exception Derived methods may throw exceptions.
- */
- public void startDocument ()
- throws java.lang.Exception
- {
- }
-
- /**
- * Handle the end of the document.
- * <p>The default implementation does nothing.
- * @see com.microstar.xml.XmlHandler#endDocument
- * @exception java.lang.Exception Derived methods may throw exceptions.
- */
- public void endDocument ()
- throws java.lang.Exception
- {
- }
-
- /**
- * Resolve an external entity.
- * <p>The default implementation simply returns the supplied
- * system identifier.
- * @see com.microstar.xml.XmlHandler#resolveEntity
- * @exception java.lang.Exception Derived methods may throw exceptions.
- */
- public Object resolveEntity (String publicId, String systemId)
- throws java.lang.Exception
- {
- return null;
- }
-
-
- /**
- * Handle the start of an external entity.
- * <p>The default implementation does nothing.
- * @see com.microstar.xml.XmlHandler#startExternalEntity
- * @exception java.lang.Exception Derived methods may throw exceptions.
- */
- public void startExternalEntity (String systemId)
- throws java.lang.Exception
- {
- }
-
- /**
- * Handle the end of an external entity.
- * <p>The default implementation does nothing.
- * @see com.microstar.xml.XmlHandler#endExternalEntity
- * @exception java.lang.Exception Derived methods may throw exceptions.
- */
- public void endExternalEntity (String systemId)
- throws java.lang.Exception
- {
- }
-
- /**
- * Handle a document type declaration.
- * <p>The default implementation does nothing.
- * @see com.microstar.xml.XmlHandler#doctypeDecl
- * @exception java.lang.Exception Derived methods may throw exceptions.
- */
- public void doctypeDecl (String name, String publicId, String systemId)
- throws java.lang.Exception
- {
- }
-
- /**
- * Handle an attribute assignment.
- * <p>The default implementation does nothing.
- * @see com.microstar.xml.XmlHandler#attribute
- * @exception java.lang.Exception Derived methods may throw exceptions.
- */
- public void attribute (String aname, String value, boolean isSpecified)
- throws java.lang.Exception
- {
- }
-
- /**
- * Handle the start of an element.
- * <p>The default implementation does nothing.
- * @see com.microstar.xml.XmlHandler#startElement
- * @exception java.lang.Exception Derived methods may throw exceptions.
- */
- public void startElement (String elname)
- throws java.lang.Exception
- {
- }
-
- /**
- * Handle the end of an element.
- * <p>The default implementation does nothing.
- * @see com.microstar.xml.XmlHandler#endElement
- * @exception java.lang.Exception Derived methods may throw exceptions.
- */
- public void endElement (String elname)
- throws java.lang.Exception
- {
- }
-
- /**
- * Handle character data.
- * <p>The default implementation does nothing.
- * @see com.microstar.xml.XmlHandler#charData
- * @exception java.lang.Exception Derived methods may throw exceptions.
- */
- public void charData (char ch[], int start, int length)
- throws java.lang.Exception
- {
- }
-
- /**
- * Handle ignorable whitespace.
- * <p>The default implementation does nothing.
- * @see com.microstar.xml.XmlHandler#ignorableWhitespace
- * @exception java.lang.Exception Derived methods may throw exceptions.
- */
- public void ignorableWhitespace (char ch[], int start, int length)
- throws java.lang.Exception
- {
- }
-
- /**
- * Handle a processing instruction.
- * <p>The default implementation does nothing.
- * @see com.microstar.xml.XmlHandler#processingInstruction
- * @exception java.lang.Exception Derived methods may throw exceptions.
- */
- public void processingInstruction (String target, String data)
- throws java.lang.Exception
- {
- }
-
- /**
- * Throw an exception for a fatal error.
- * <p>The default implementation throws <code>XmlException</code>.
- * @see com.microstar.xml.XmlHandler#error
- * @exception com.microstar.xml.XmlException A specific parsing error.
- * @exception java.lang.Exception Derived methods may throw exceptions.
- */
- public void error (String message, String systemId, int line, int column)
- throws XmlException, java.lang.Exception
- {
- throw new XmlException(message, systemId, line, column);
- }
-
-}
diff --git a/jEdit/com/microstar/xml/XmlException.java b/jEdit/com/microstar/xml/XmlException.java
deleted file mode 100644
index d82f36a..0000000
--- a/jEdit/com/microstar/xml/XmlException.java
+++ /dev/null
@@ -1,85 +0,0 @@
-// XmlException.java: Simple base class for AElfred processors.
-// NO WARRANTY! See README, and copyright below.
-// $Id: XmlException.java 12845 2008-06-13 19:42:59Z ezust $
-
-package com.microstar.xml;
-
-
-/**
- * Convenience exception class for reporting XML parsing errors.
- * <p>This is an exception class that you can use to encapsulate all
- * of the information from Ælfred's <code>error</code> callback.
- * This is not necessary for routine use of Ælfred, but it
- * is used by the optional <code>HandlerBase</code> class.
- * <p>Note that the core Ælfred classes do <em>not</em>
- * use this exception.
- * @author Copyright (c) 1998 by Microstar Software Ltd.
- * @author written by David Megginson <dmeggins at microstar.com>
- * @version 1.1
- * @see XmlHandler#error
- * @see HandlerBase
- * @deprecated use import org.xml.sax.SAXParseException
- */
-public class XmlException extends Exception
-{
- private String message;
- private String systemId;
- private int line;
- private int column;
-
-
- /**
- * Construct a new XML parsing exception.
- * @param message The error message from the parser.
- * @param systemId The URI of the entity containing the error.
- * @param line The line number where the error appeared.
- * @param column The column number where the error appeared.
- */
- public XmlException (String message, String systemId, int line, int column)
- {
- this.message = message;
- this.systemId = systemId;
- this.line = line;
- this.column = column;
- }
-
-
- /**
- * Get the error message from the parser.
- * @return A string describing the error.
- */
- public String getMessage ()
- {
- return message;
- }
-
-
- /**
- * Get the URI of the entity containing the error.
- * @return The URI as a string.
- */
- public String getSystemId ()
- {
- return systemId;
- }
-
-
- /**
- * Get the line number containing the error.
- * @return The line number as an integer.
- */
- public int getLine ()
- {
- return line;
- }
-
- /**
- * Get the column number containing the error.
- * @return The column number as an integer.
- */
- public int getColumn ()
- {
- return column;
- }
-
-}
diff --git a/jEdit/com/microstar/xml/XmlHandler.java b/jEdit/com/microstar/xml/XmlHandler.java
deleted file mode 100644
index 1d7f480..0000000
--- a/jEdit/com/microstar/xml/XmlHandler.java
+++ /dev/null
@@ -1,241 +0,0 @@
-// XmlHandler.java: the callback interface.
-// NO WARRANTY! See README, and copyright below.
-// $Id: XmlHandler.java 14583 2009-02-06 05:38:53Z ezust $
-
-package com.microstar.xml;
-
-/**
- * XML Processing Interface.
- * <p>Whenever you parse an XML document, you must provide an object
- * from a class that implements this interface to receive the parsing
- * events.
- * <p>If you do not want to implement this entire interface, you
- * can extend the <code>HandlerBase</code> convenience class and
- * then implement only what you need.
- * <p>If you are using SAX, you should implement the SAX handler
- * interfaces rather than this one.
- * @author Copyright (c) 1997, 1998 by Microstar Software Ltd.
- * @author written by David Megginson <dmeggins at microstar.com>
- * @version 1.1
- * @see org.xml.sax.EntityHandler
- * @see org.xml.sax.DocumentHandler
- * @see org.xml.sax.ErrorHandler
- * @deprecated
- */
-public interface XmlHandler {
-
- /**
- * Start the document.
- * <p>Ælfred will call this method just before it
- * attempts to read the first entity (the root of the document).
- * It is guaranteed that this will be the first method called.
- * @exception java.lang.Exception The handler may throw any exception.
- * @see #endDocument
- */
- public void startDocument ()
- throws java.lang.Exception;
-
-
- /**
- * End the document.
- * <p>Ælfred will call this method once, when it has
- * finished parsing the XML document.
- * It is guaranteed that this will be the last method called.
- * @exception java.lang.Exception The handler may throw any exception.
- * @see #startDocument
- */
- public void endDocument ()
- throws java.lang.Exception;
-
-
- /**
- * Resolve an External Entity.
- * <p>Give the handler a chance to redirect external entities
- * to different URIs. Ælfred will call this method for the
- * top-level document entity, for external text (XML) entities,
- * and the external DTD subset (if any).
- * @param publicId The public identifier, or null if none was supplied.
- * @param systemId The system identifier.
- * @return The replacement system identifier, or null to use
- * the default.
- * @exception java.lang.Exception The handler may throw any exception.
- * @see #startExternalEntity
- * @see #endExternalEntity
- */
- public Object resolveEntity (String publicId, String systemId)
- throws java.lang.Exception;
-
-
- /**
- * Begin an external entity.
- * <p>Ælfred will call this method at the beginning of
- * each external entity, including the top-level document entity
- * and the external DTD subset (if any).
- * <p>If necessary, you can use this method to track the location
- * of the current entity so that you can resolve relative URIs
- * correctly.
- * @param systemId The URI of the external entity that is starting.
- * @exception java.lang.Exception The handler may throw any exception.
- * @see #endExternalEntity
- * @see #resolveEntity
- */
- public void startExternalEntity (String systemId)
- throws java.lang.Exception;
-
-
- /**
- * End an external entity.
- * <p>Ælfred will call this method at the end of
- * each external entity, including the top-level document entity
- * and the external DTD subset.
- * <p>If necessary, you can use this method to track the location
- * of the current entity so that you can resolve relative URIs
- * correctly.
- * @param systemId The URI of the external entity that is ending.
- * @exception java.lang.Exception The handler may throw any exception.
- * @see #startExternalEntity
- * @see #resolveEntity
- */
- public void endExternalEntity (String systemId)
- throws java.lang.Exception;
-
-
- /**
- * Document type declaration.
- * <p>Ælfred will call this method when or if it encounters
- * the document type (DOCTYPE) declaration.
- * <p>Please note that the public and system identifiers will
- * not always be a reliable indication of the DTD in use.
- * @param name The document type name.
- * @param publicId The public identifier, or null if unspecified.
- * @param systemId The system identifier, or null if unspecified.
- * @exception java.lang.Exception The handler may throw any exception.
- */
- public void doctypeDecl (String name, String publicId, String systemId)
- throws java.lang.Exception;
-
-
- /**
- * Attribute.
- * <p>Ælfred will call this method once for each attribute
- * (specified or defaulted) before reporting a startElement event.
- * It is up to your handler to collect the attributes, if
- * necessary.
- * <p>You may use XmlParser.getAttributeType() to find the attribute's
- * declared type.
- * @param name The name of the attribute.
- * @param value The value of the attribute, or null if the attribute
- * is <code>#IMPLIED</code>.
- * @param isSpecified True if the value was specified, false if it
- * was defaulted from the DTD.
- * @exception java.lang.Exception The handler may throw any exception.
- * @see #startElement
- * @see XmlParser#declaredAttributes
- * @see XmlParser#getAttributeType
- * @see XmlParser#getAttributeDefaultValue
- */
- public void attribute (String name, String value, boolean isSpecified)
- throws java.lang.Exception;
-
-
- /**
- * Start an element.
- * <p>Ælfred will call this method at the beginning of each
- * element. By the time this is called, all of the attributes
- * for the element will already have been reported using the
- * <code>attribute</code> method.
- * @param elname The element type name.
- * @exception java.lang.Exception The handler may throw any exception.
- * @see #attribute
- * @see #endElement
- * @see XmlParser#declaredElements
- * @see XmlParser#getElementContentType
- */
- public void startElement (String elname)
- throws java.lang.Exception;
-
-
- /**
- * End an element.
- * <p>Ælfred will call this method at the end of each element
- * (including EMPTY elements).
- * @param elname The element type name.
- * @exception java.lang.Exception The handler may throw any exception.
- * @see #startElement
- * @see XmlParser#declaredElements
- * @see XmlParser#getElementContentType
- */
- public void endElement (String elname)
- throws java.lang.Exception;
-
-
- /**
- * Character data.
- * <p>Ælfred will call this method once for each chunk of
- * character data found in the contents of elements. Note that
- * the parser may break up a long sequence of characters into
- * smaller chunks and call this method once for each chunk.
- * <p>Do <em>not</em> attempt to read more than <var>length</var>
- * characters from the array, or to read before the
- * <var>start</var> position.
- * @param ch The character data.
- * @param start The starting position in the array.
- * @param length The number of characters available.
- * @exception java.lang.Exception The handler may throw any exception.
- */
- public void charData (char ch[], int start, int length)
- throws java.lang.Exception;
-
-
- /**
- * Ignorable whitespace.
- * <p>Ælfred will call this method once for each sequence
- * of ignorable whitespace in element content (never in mixed content).
- * <p>For details, see section 2.10 of the XML 1.0 recommendation.
- * <p>Do <em>not</em> attempt to read more than <var>length</var>
- * characters from the array or to read before the <var>start</var>
- * position.
- * @param ch The literal whitespace characters.
- * @param start The starting position in the array.
- * @param length The number of whitespace characters available.
- * @exception java.lang.Exception The handler may throw any exception.
- */
- public void ignorableWhitespace (char ch[], int start, int length)
- throws java.lang.Exception;
-
-
- /**
- * Processing instruction.
- * <p>Ælfred will call this method once for each
- * processing instruction. Note that processing instructions may
- * appear outside of the top-level element. The
- * @param target The target (the name at the start of the PI).
- * @param data The data, if any (the rest of the PI).
- * @exception java.lang.Exception The handler may throw any exception.
- */
- public void processingInstruction (String target, String data)
- throws java.lang.Exception;
-
-
- /**
- * Fatal XML parsing error.
- * <p>Ælfred will call this method whenever it encounters
- * a serious error. The parser will attempt to continue past this
- * point so that you can find more possible error points, but if
- * this method is called you should assume that the document is
- * corrupt and you should not try to use its contents.
- * <p>Note that you can use the <code>XmlException</code> class
- * to encapsulate all of the information provided, though the
- * use of the class is not mandatory.
- * @param message The error message.
- * @param systemId The system identifier of the entity that
- * contains the error.
- * @param line The approximate line number of the error.
- * @param column The approximate column number of the error.
- * @exception java.lang.Exception The handler may throw any exception.
- * @see XmlException
- */
- public void error (String message, String systemId, int line, int column)
- throws java.lang.Exception;
-
-}
diff --git a/jEdit/com/microstar/xml/XmlParser.java b/jEdit/com/microstar/xml/XmlParser.java
deleted file mode 100644
index b7ca124..0000000
--- a/jEdit/com/microstar/xml/XmlParser.java
+++ /dev/null
@@ -1,4377 +0,0 @@
-// XmlParser.java: the main parser class.
-// NO WARRANTY! See README, and copyright below.
-// $Id: XmlParser.java 14583 2009-02-06 05:38:53Z ezust $
-
-package com.microstar.xml;
-
-import java.io.BufferedInputStream;
-import java.io.EOFException;
-import java.io.InputStream;
-import java.io.Reader;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.Stack;
-
-
-/**
- * Parse XML documents and return parse events through call-backs.
- * <p>You need to define a class implementing the <code>XmlHandler</code>
- * interface: an object belonging to this class will receive the
- * callbacks for the events. (As an alternative to implementing
- * the full XmlHandler interface, you can simply extend the
- * <code>HandlerBase</code> convenience class.)
- * <p>Usage (assuming that <code>MyHandler</code> is your implementation
- * of the <code>XmlHandler</code> interface):
- * <pre>
- * XmlHandler handler = new MyHandler();
- * XmlParser parser = new XmlParser();
- * parser.setHandler(handler);
- * try {
- * parser.parse("http://www.host.com/doc.xml", null);
- * } catch (Exception e) {
- * [do something interesting]
- * }
- * </pre>
- * @author Copyright (c) 1997, 1998 by Microstar Software Ltd.
- * @author Written by David Megginson <dmeggins at microstar.com>
- * @version 1.1
- * @deprecated use org.xml.sax.XMLReader
- */
-public class XmlParser {
-
- //
- // Use special cheats that speed up the code (currently about 50%),
- // but may cause problems with future maintenance and add to the
- // class file size (about 500 bytes).
- //
- private final static boolean USE_CHEATS = true;
-
-
-
- //////////////////////////////////////////////////////////////////////
- // Constructors.
- ////////////////////////////////////////////////////////////////////////
-
-
- /**
- * Construct a new parser with no associated handler.
- * @see #setHandler
- * @see #parse
- */
- public XmlParser ()
- {
- }
-
-
- /**
- * Set the handler that will receive parsing events.
- * @param handler The handler to receive callback events.
- * @see #parse
- * @see XmlHandler
- */
- public void setHandler (XmlHandler handler)
- {
- this.handler = handler;
- }
-
-
- /**
- * Parse an XML document from a URI.
- * <p>You may parse a document more than once, but only one thread
- * may call this method for an object at one time.
- * @param systemId The URI of the document.
- * @param publicId The public identifier of the document, or null.
- * @param encoding The suggested encoding, or null if unknown.
- * @exception java.lang.Exception Any exception thrown by your
- * own handlers, or any derivation of java.io.IOException
- * thrown by the parser itself.
- */
- public void parse (String systemId, String publicId, String encoding)
- throws java.lang.Exception
- {
- doParse(systemId, publicId, null, null, encoding);
- }
-
-
- /**
- * Parse an XML document from a byte stream.
- * <p>The URI that you supply will become the base URI for
- * resolving relative links, but Ælfred will actually read
- * the document from the supplied input stream.
- * <p>You may parse a document more than once, but only one thread
- * may call this method for an object at one time.
- * @param systemId The base URI of the document, or null if not
- * known.
- * @param publicId The public identifier of the document, or null
- * if not known.
- * @param stream A byte input stream.
- * @param encoding The suggested encoding, or null if unknown.
- * @exception java.lang.Exception Any exception thrown by your
- * own handlers, or any derivation of java.io.IOException
- * thrown by the parser itself.
- */
- public void parse (String systemId, String publicId,
- InputStream stream, String encoding)
- throws java.lang.Exception
- {
- doParse(systemId, publicId, null, stream, encoding);
- }
-
-
- /**
- * Parse an XML document from a character stream.
- * <p>The URI that you supply will become the base URI for
- * resolving relative links, but Ælfred will actually read
- * the document from the supplied input stream.
- * <p>You may parse a document more than once, but only one thread
- * may call this method for an object at one time.
- * @param systemId The base URI of the document, or null if not
- * known.
- * @param publicId The public identifier of the document, or null
- * if not known.
- * @param reader A character stream.
- * @exception java.lang.Exception Any exception thrown by your
- * own handlers, or any derivation of java.io.IOException
- * thrown by the parser itself.
- */
- public void parse (String systemId, String publicId, Reader reader)
- throws java.lang.Exception
- {
- doParse(systemId, publicId, reader, null, null);
- }
-
-
- private synchronized void doParse (String systemId, String publicId,
- Reader reader, InputStream stream,
- String encoding)
- throws java.lang.Exception
- {
- basePublicId = publicId;
- baseURI = systemId;
- baseReader = reader;
- baseInputStream = stream;
-
- initializeVariables();
-
- // Set the default entities here.
- setInternalEntity(intern("amp"), "&");
- setInternalEntity(intern("lt"), "<");
- setInternalEntity(intern("gt"), ">");
- setInternalEntity(intern("apos"), "'");
- setInternalEntity(intern("quot"), """);
-
- if (handler != null) {
- handler.startDocument();
- }
-
- pushURL("[document]", basePublicId, baseURI, baseReader, baseInputStream,
- encoding);
-
- parseDocument();
-
- if (handler != null) {
- handler.endDocument();
- }
- cleanupVariables();
- }
-
-
-
- ////////////////////////////////////////////////////////////////////////
- // Constants.
- ////////////////////////////////////////////////////////////////////////
-
- //
- // Constants for element content type.
- //
-
- /**
- * Constant: an element has not been declared.
- * @see #getElementContentType
- */
- public final static int CONTENT_UNDECLARED = 0;
-
- /**
- * Constant: the element has a content model of ANY.
- * @see #getElementContentType
- */
- public final static int CONTENT_ANY = 1;
-
- /**
- * Constant: the element has declared content of EMPTY.
- * @see #getElementContentType
- */
- public final static int CONTENT_EMPTY = 2;
-
- /**
- * Constant: the element has mixed content.
- * @see #getElementContentType
- */
- public final static int CONTENT_MIXED = 3;
-
- /**
- * Constant: the element has element content.
- * @see #getElementContentType
- */
- public final static int CONTENT_ELEMENTS = 4;
-
-
- //
- // Constants for the entity type.
- //
-
- /**
- * Constant: the entity has not been declared.
- * @see #getEntityType
- */
- public final static int ENTITY_UNDECLARED = 0;
-
- /**
- * Constant: the entity is internal.
- * @see #getEntityType
- */
- public final static int ENTITY_INTERNAL = 1;
-
- /**
- * Constant: the entity is external, non-XML data.
- * @see #getEntityType
- */
- public final static int ENTITY_NDATA = 2;
-
- /**
- * Constant: the entity is external XML data.
- * @see #getEntityType
- */
- public final static int ENTITY_TEXT = 3;
-
-
- //
- // Constants for attribute type.
- //
-
- /**
- * Constant: the attribute has not been declared for this element type.
- * @see #getAttributeType
- */
- public final static int ATTRIBUTE_UNDECLARED = 0;
-
- /**
- * Constant: the attribute value is a string value.
- * @see #getAttributeType
- */
- public final static int ATTRIBUTE_CDATA = 1;
-
- /**
- * Constant: the attribute value is a unique identifier.
- * @see #getAttributeType
- */
- public final static int ATTRIBUTE_ID = 2;
-
- /**
- * Constant: the attribute value is a reference to a unique identifier.
- * @see #getAttributeType
- */
- public final static int ATTRIBUTE_IDREF = 3;
-
- /**
- * Constant: the attribute value is a list of ID references.
- * @see #getAttributeType
- */
- public final static int ATTRIBUTE_IDREFS = 4;
-
- /**
- * Constant: the attribute value is the name of an entity.
- * @see #getAttributeType
- */
- public final static int ATTRIBUTE_ENTITY = 5;
-
- /**
- * Constant: the attribute value is a list of entity names.
- * @see #getAttributeType
- */
- public final static int ATTRIBUTE_ENTITIES = 6;
-
- /**
- * Constant: the attribute value is a name token.
- * @see #getAttributeType
- */
- public final static int ATTRIBUTE_NMTOKEN = 7;
-
- /**
- * Constant: the attribute value is a list of name tokens.
- * @see #getAttributeType
- */
- public final static int ATTRIBUTE_NMTOKENS = 8;
-
- /**
- * Constant: the attribute value is a token from an enumeration.
- * @see #getAttributeType
- */
- public final static int ATTRIBUTE_ENUMERATED = 9;
-
- /**
- * Constant: the attribute is the name of a notation.
- * @see #getAttributeType
- */
- public final static int ATTRIBUTE_NOTATION = 10;
-
-
- //
- // When the class is loaded, populate the hash table of
- // attribute types.
- //
-
- /**
- * Hash table of attribute types.
- */
- private static Hashtable attributeTypeHash;
- static {
- attributeTypeHash = new Hashtable();
- attributeTypeHash.put("CDATA", new Integer(ATTRIBUTE_CDATA));
- attributeTypeHash.put("ID", new Integer(ATTRIBUTE_ID));
- attributeTypeHash.put("IDREF", new Integer(ATTRIBUTE_IDREF));
- attributeTypeHash.put("IDREFS", new Integer(ATTRIBUTE_IDREFS));
- attributeTypeHash.put("ENTITY", new Integer(ATTRIBUTE_ENTITY));
- attributeTypeHash.put("ENTITIES", new Integer(ATTRIBUTE_ENTITIES));
- attributeTypeHash.put("NMTOKEN", new Integer(ATTRIBUTE_NMTOKEN));
- attributeTypeHash.put("NMTOKENS", new Integer(ATTRIBUTE_NMTOKENS));
- attributeTypeHash.put("NOTATION", new Integer(ATTRIBUTE_NOTATION));
- }
-
-
- //
- // Constants for supported encodings.
- //
- private final static int ENCODING_UTF_8 = 1;
- private final static int ENCODING_ISO_8859_1 = 2;
- private final static int ENCODING_UCS_2_12 = 3;
- private final static int ENCODING_UCS_2_21 = 4;
- private final static int ENCODING_UCS_4_1234 = 5;
- private final static int ENCODING_UCS_4_4321 = 6;
- private final static int ENCODING_UCS_4_2143 = 7;
- private final static int ENCODING_UCS_4_3412 = 8;
-
-
- //
- // Constants for attribute default value.
- //
-
- /**
- * Constant: the attribute is not declared.
- * @see #getAttributeDefaultValueType
- */
- public final static int ATTRIBUTE_DEFAULT_UNDECLARED = 0;
-
- /**
- * Constant: the attribute has a literal default value specified.
- * @see #getAttributeDefaultValueType
- * @see #getAttributeDefaultValue
- */
- public final static int ATTRIBUTE_DEFAULT_SPECIFIED = 1;
-
- /**
- * Constant: the attribute was declared #IMPLIED.
- * @see #getAttributeDefaultValueType
- */
- public final static int ATTRIBUTE_DEFAULT_IMPLIED = 2;
-
- /**
- * Constant: the attribute was declared #REQUIRED.
- * @see #getAttributeDefaultValueType
- */
- public final static int ATTRIBUTE_DEFAULT_REQUIRED = 3;
-
- /**
- * Constant: the attribute was declared #FIXED.
- * @see #getAttributeDefaultValueType
- * @see #getAttributeDefaultValue
- */
- public final static int ATTRIBUTE_DEFAULT_FIXED = 4;
-
-
- //
- // Constants for input.
- //
- private final static int INPUT_NONE = 0;
- private final static int INPUT_INTERNAL = 1;
- private final static int INPUT_EXTERNAL = 2;
- private final static int INPUT_STREAM = 3;
- private final static int INPUT_BUFFER = 4;
- private final static int INPUT_READER = 5;
-
-
- //
- // Flags for reading literals.
- //
- private final static int LIT_CHAR_REF = 1;
- private final static int LIT_ENTITY_REF = 2;
- private final static int LIT_PE_REF = 4;
- private final static int LIT_NORMALIZE = 8;
-
-
- //
- // Flags for parsing context.
- //
- private final static int CONTEXT_NONE = 0;
- private final static int CONTEXT_DTD = 1;
- private final static int CONTEXT_ENTITYVALUE = 2;
- private final static int CONTEXT_ATTRIBUTEVALUE = 3;
-
-
-
- //////////////////////////////////////////////////////////////////////
- // Error reporting.
- //////////////////////////////////////////////////////////////////////
-
-
- /**
- * Report an error.
- * @param message The error message.
- * @param textFound The text that caused the error (or null).
- * @see XmlHandler#error
- * @see #line
- */
- void error (String message, String textFound, String textExpected)
- throws java.lang.Exception
- {
- errorCount++;
- if (textFound != null) {
- message = message + " (found \"" + textFound + "\")";
- }
- if (textExpected != null) {
- message = message + " (expected \"" + textExpected + "\")";
- }
- if (handler != null) {
- String uri = null;
-
- if (externalEntity != null) {
- uri = externalEntity.getURL().toString();
- }
- handler.error(message, uri, line, column);
- }
- }
-
-
- /**
- * Report a serious error.
- * @param message The error message.
- * @param textFound The text that caused the error (or null).
- */
- void error (String message, char textFound, String textExpected)
- throws java.lang.Exception
- {
- error(message, new Character(textFound).toString(), textExpected);
- }
-
-
-
- //////////////////////////////////////////////////////////////////////
- // Major syntactic productions.
- //////////////////////////////////////////////////////////////////////
-
-
- /**
- * Parse an XML document.
- * <pre>
- * [1] document ::= prolog element Misc*
- * </pre>
- * <p>This is the top-level parsing function for a single XML
- * document. As a minimum, a well-formed document must have
- * a document element, and a valid document must have a prolog
- * as well.
- */
- void parseDocument ()
- throws java.lang.Exception
- {
- char c;
-
- parseProlog();
- require('<');
- parseElement();
- try
- {
- parseMisc(); //skip all white, PIs, and comments
- c=readCh(); //if this doesn't throw an exception...
- error("unexpected characters after document end",c,null);
- }
- catch (EOFException e)
- {return;}
- }
-
-
- /**
- * Skip a comment.
- * <pre>
- * [18] Comment ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* "-->"
- * </pre>
- * <p>(The <code><!--</code> has already been read.)
- */
- void parseComment ()
- throws java.lang.Exception
- {
- skipUntil("-->");
- }
-
-
- /**
- * Parse a processing instruction and do a call-back.
- * <pre>
- * [19] PI ::= '<?' Name (S (Char* - (Char* '?>' Char*)))? '?>'
- * </pre>
- * <p>(The <code><?</code> has already been read.)
- * <p>An XML processing instruction <em>must</em> begin with
- * a Name, which is the instruction's target.
- */
- void parsePI ()
- throws java.lang.Exception
- {
- String name;
-
- name = readNmtoken(true);
- if (!tryRead("?>")) {
- requireWhitespace();
- parseUntil("?>");
- }
- if (handler != null) {
- handler.processingInstruction(name, dataBufferToString());
- }
- }
-
-
- /**
- * Parse a CDATA marked section.
- * <pre>
- * [20] CDSect ::= CDStart CData CDEnd
- * [21] CDStart ::= '<![CDATA['
- * [22] CData ::= (Char* - (Char* ']]>' Char*))
- * [23] CDEnd ::= ']]>'
- * </pre>
- * <p>(The '<![CDATA[' has already been read.)
- * <p>Note that this just appends characters to the dataBuffer,
- * without actually generating an event.
- */
- void parseCDSect ()
- throws java.lang.Exception
- {
- parseUntil("]]>");
- }
-
-
- /**
- * Parse the prolog of an XML document.
- * <pre>
- * [24] prolog ::= XMLDecl? Misc* (Doctypedecl Misc*)?
- * </pre>
- * <p>There are a couple of tricks here. First, it is necessary to
- * declare the XML default attributes after the DTD (if present)
- * has been read. Second, it is not possible to expand general
- * references in attribute value literals until after the entire
- * DTD (if present) has been parsed.
- * <p>We do not look for the XML declaration here, because it is
- * handled by pushURL().
- * @see pushURL
- */
- void parseProlog ()
- throws java.lang.Exception
- {
- parseMisc();
-
- if (tryRead("<!DOCTYPE")) {
- parseDoctypedecl();
- parseMisc();
- }
- }
-
-
- /**
- * Parse the XML declaration.
- * <pre>
- * [25] XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>'
- * [26] VersionInfo ::= S 'version' Eq ('"1.0"' | "'1.0'")
- * [33] SDDecl ::= S 'standalone' Eq "'" ('yes' | 'no') "'"
- * | S 'standalone' Eq '"' ("yes" | "no") '"'
- * [78] EncodingDecl ::= S 'encoding' Eq QEncoding
- * </pre>
- * <p>([80] to [82] are also significant.)
- * <p>(The <code><?xml</code> and whitespace have already been read.)
- * <p>TODO: validate value of standalone.
- * @see #parseTextDecl
- * @see #checkEncoding
- */
- void parseXMLDecl (boolean ignoreEncoding)
- throws java.lang.Exception
- {
- String version;
- String encodingName = null;
- String standalone = null;
-
- // Read the version.
- require("version");
- parseEq();
- version = readLiteral(0);
- if (!version.equals("1.0")) {
- error("unsupported XML version", version, "1.0");
- }
-
- // Try reading an encoding declaration.
- skipWhitespace();
- if (tryRead("encoding")) {
- parseEq();
- encodingName = readLiteral(0);
- checkEncoding(encodingName, ignoreEncoding);
- }
-
- // Try reading a standalone declaration
- skipWhitespace();
- if (tryRead("standalone")) {
- parseEq();
- standalone = readLiteral(0);
- }
-
- skipWhitespace();
- require("?>");
- }
-
-
- /**
- * Parse the Encoding PI.
- * <pre>
- * [78] EncodingDecl ::= S 'encoding' Eq QEncoding
- * [79] EncodingPI ::= '<?xml' S 'encoding' Eq QEncoding S? '?>'
- * [80] QEncoding ::= '"' Encoding '"' | "'" Encoding "'"
- * [81] Encoding ::= LatinName
- * [82] LatinName ::= [A-Za-z] ([A-Za-z0-9._] | '-')*
- * </pre>
- * <p>(The <code><?xml</code>' and whitespace have already been read.)
- * @see #parseXMLDecl
- * @see #checkEncoding
- */
- void parseTextDecl (boolean ignoreEncoding)
- throws java.lang.Exception
- {
- String encodingName = null;
-
- // Read an optional version.
- if (tryRead("version")) {
- String version;
- parseEq();
- version = readLiteral(0);
- if (!version.equals("1.0")) {
- error("unsupported XML version", version, "1.0");
- }
- requireWhitespace();
- }
-
-
- // Read the encoding.
- require("encoding");
- parseEq();
- encodingName = readLiteral(0);
- checkEncoding(encodingName, ignoreEncoding);
-
- skipWhitespace();
- require("?>");
- }
-
-
- /**
- * Check that the encoding specified makes sense.
- * <p>Compare what the author has specified in the XML declaration
- * or encoding PI with what we have detected.
- * <p>This is also important for distinguishing among the various
- * 7- and 8-bit encodings, such as ISO-LATIN-1 (I cannot autodetect
- * those).
- * @param encodingName The name of the encoding specified by the user.
- * @see #parseXMLDecl
- * @see #parseTextDecl
- */
- void checkEncoding (String encodingName, boolean ignoreEncoding)
- throws java.lang.Exception
- {
- encodingName = encodingName.toUpperCase();
-
- if (ignoreEncoding) {
- return;
- }
-
- switch (encoding) {
- // 8-bit encodings
- case ENCODING_UTF_8:
- if (encodingName.equals("ISO-8859-1")) {
- encoding = ENCODING_ISO_8859_1;
- } else if (!encodingName.equals("UTF-8")) {
- error("unsupported 8-bit encoding",
- encodingName,
- "UTF-8 or ISO-8859-1");
- }
- break;
- // 16-bit encodings
- case ENCODING_UCS_2_12:
- case ENCODING_UCS_2_21:
- if (!encodingName.equals("ISO-10646-UCS-2") &&
- !encodingName.equals("UTF-16")) {
- error("unsupported 16-bit encoding",
- encodingName,
- "ISO-10646-UCS-2");
- }
- break;
- // 32-bit encodings
- case ENCODING_UCS_4_1234:
- case ENCODING_UCS_4_4321:
- case ENCODING_UCS_4_2143:
- case ENCODING_UCS_4_3412:
- if (!encodingName.equals("ISO-10646-UCS-4")) {
- error("unsupported 32-bit encoding",
- encodingName,
- "ISO-10646-UCS-4");
- }
- }
- }
-
-
- /**
- * Parse miscellaneous markup outside the document element and DOCTYPE
- * declaration.
- * <pre>
- * [27] Misc ::= Comment | PI | S
- * </pre>
- */
- void parseMisc ()
- throws java.lang.Exception
- {
- while (true)
- {
- skipWhitespace();
- if (tryRead("<?"))
- {parsePI();}
- else if (tryRead("<!--"))
- {parseComment();}
- else
- {return;}
- }
- }
-
-
- /**
- * Parse a document type declaration.
- * <pre>
- * [28] doctypedecl ::= '<!DOCTYPE' S Name (S ExternalID)? S?
- * ('[' %markupdecl* ']' S?)? '>'
- * </pre>
- * <p>(The <code><!DOCTYPE</code> has already been read.)
- */
- void parseDoctypedecl ()
- throws java.lang.Exception
- {
- char c;
- String doctypeName, ids[];
-
- // Read the document type name.
- requireWhitespace();
- doctypeName = readNmtoken(true);
-
- // Read the ExternalIDs.
- skipWhitespace();
- ids = readExternalIds(false);
-
- // Look for a declaration subset.
- skipWhitespace();
- if (tryRead('[')) {
-
- // loop until the subset ends
- while (true) {
- context = CONTEXT_DTD;
- skipWhitespace();
- context = CONTEXT_NONE;
- if (tryRead(']')) {
- break; // end of subset
- } else {
- context = CONTEXT_DTD;
- parseMarkupdecl();
- context = CONTEXT_NONE;
- }
- }
- }
-
- // Read the external subset, if any
- if (ids[1] != null) {
- pushURL("[external subset]", ids[0], ids[1], null, null, null);
-
- // Loop until we end up back at '>'
- while (true) {
- context = CONTEXT_DTD;
- skipWhitespace();
- context = CONTEXT_NONE;
- if (tryRead('>')) {
- break;
- } else {
- context = CONTEXT_DTD;
- parseMarkupdecl();
- context = CONTEXT_NONE;
- }
- }
- } else {
- // No external subset.
- skipWhitespace();
- require('>');
- }
-
- if (handler != null) {
- handler.doctypeDecl(doctypeName, ids[0], ids[1]);
- }
-
- // Expand general entities in
- // default values of attributes.
- // (Do this after the doctypeDecl
- // event!).
- // expandAttributeDefaultValues();
- }
-
-
- /**
- * Parse a markup declaration in the internal or external DTD subset.
- * <pre>
- * [29] markupdecl ::= ( %elementdecl | %AttlistDecl | %EntityDecl |
- * %NotationDecl | %PI | %S | %Comment |
- * InternalPERef )
- * [30] InternalPERef ::= PEReference
- * [31] extSubset ::= (%markupdecl | %conditionalSect)*
- * </pre>
- */
- void parseMarkupdecl ()
- throws java.lang.Exception
- {
- if (tryRead("<!ELEMENT")) {
- parseElementdecl();
- } else if (tryRead("<!ATTLIST")) {
- parseAttlistDecl();
- } else if (tryRead("<!ENTITY")) {
- parseEntityDecl();
- } else if (tryRead("<!NOTATION")) {
- parseNotationDecl();
- } else if (tryRead("<?")) {
- parsePI();
- } else if (tryRead("<!--")) {
- parseComment();
- } else if (tryRead("<![")) {
- parseConditionalSect();
- } else {
- error("expected markup declaration", null, null);
- }
- }
-
-
- /**
- * Parse an element, with its tags.
- * <pre>
- * [33] STag ::= '<' Name (S Attribute)* S? '>' [WFC: unique Att spec]
- * [38] element ::= EmptyElement | STag content ETag
- * [39] EmptyElement ::= '<' Name (S Attribute)* S? '/>'
- * [WFC: unique Att spec]
- * </pre>
- * <p>(The '<' has already been read.)
- * <p>NOTE: this method actually chains onto parseContent(), if necessary,
- * and parseContent() will take care of calling parseETag().
- */
- void parseElement ()
- throws java.lang.Exception
- {
- String gi;
- char c;
- int oldElementContent = currentElementContent;
- String oldElement = currentElement;
-
- // This is the (global) counter for the
- // array of specified attributes.
- tagAttributePos = 0;
-
- // Read the element type name.
- gi = readNmtoken(true);
-
- // Determine the current content type.
- currentElement = gi;
- currentElementContent = getElementContentType(gi);
- if (currentElementContent == CONTENT_UNDECLARED) {
- currentElementContent = CONTENT_ANY;
- }
-
- // Read the attributes, if any.
- // After this loop, we should be just
- // in front of the closing delimiter.
- skipWhitespace();
- c = readCh();
- while (c != '/' && c != '>') {
- unread(c);
- parseAttribute(gi);
- skipWhitespace();
- c = readCh();
- }
- unread(c);
-
- // Supply any defaulted attributes.
- Enumeration atts = declaredAttributes(gi);
- if (atts != null) {
- String aname;
- loop: while (atts.hasMoreElements()) {
- aname = (String)atts.nextElement();
- // See if it was specified.
- for (int i = 0; i < tagAttributePos; i++) {
- if (tagAttributes[i] == aname) {
- continue loop;
- }
- }
- // I guess not...
- if (handler != null) {
- handler.attribute(aname,
- getAttributeExpandedValue(gi, aname),
- false);
- }
- }
- }
-
- // Figure out if this is a start tag
- // or an empty element, and dispatch an
- // event accordingly.
- c = readCh();
- switch (c) {
- case '>':
- if (handler != null) {
- handler.startElement(gi);
- }
- parseContent();
- break;
- case '/':
- require('>');
- if (handler != null) {
- handler.startElement(gi);
- handler.endElement(gi);
- }
- break;
- }
-
- // Restore the previous state.
- currentElement = oldElement;
- currentElementContent = oldElementContent;
- }
-
-
- /**
- * Parse an attribute assignment.
- * <pre>
- * [34] Attribute ::= Name Eq AttValue
- * </pre>
- * @param name The name of the attribute's element.
- * @see XmlHandler#attribute
- */
- void parseAttribute (String name)
- throws java.lang.Exception
- {
- String aname;
- int type;
- String value;
-
- // Read the attribute name.
- aname = readNmtoken(true).intern();
- type = getAttributeDefaultValueType(name, aname);
-
- // Parse '='
- parseEq();
-
- // Read the value, normalizing whitespace
- // if it is not CDATA.
- if (type == ATTRIBUTE_CDATA || type == ATTRIBUTE_UNDECLARED) {
- value = readLiteral(LIT_CHAR_REF | LIT_ENTITY_REF);
- } else {
- value = readLiteral(LIT_CHAR_REF | LIT_ENTITY_REF | LIT_NORMALIZE);
- }
-
- // Inform the handler about the
- // attribute.
- if (handler != null) {
- handler.attribute(aname, value, true);
- }
- dataBufferPos = 0;
-
- // Note that the attribute has been
- // specified.
- if (tagAttributePos == tagAttributes.length) {
- String newAttrib[] = new String[tagAttributes.length * 2];
- System.arraycopy(tagAttributes, 0, newAttrib, 0, tagAttributePos);
- tagAttributes = newAttrib;
- }
- tagAttributes[tagAttributePos++] = aname;
- }
-
-
- /**
- * Parse an equals sign surrounded by optional whitespace.
- * [35] Eq ::= S? '=' S?
- */
- void parseEq ()
- throws java.lang.Exception
- {
- skipWhitespace();
- require('=');
- skipWhitespace();
- }
-
-
- /**
- * Parse an end tag.
- * [36] ETag ::= '</' Name S? '>'
- * *NOTE: parseContent() chains to here.
- */
- void parseETag ()
- throws java.lang.Exception
- {
- String name;
- name = readNmtoken(true);
- if (name != currentElement) {
- error("mismatched end tag", name, currentElement);
- }
- skipWhitespace();
- require('>');
- if (handler != null) {
- handler.endElement(name);
- }
- }
-
-
- /**
- * Parse the content of an element.
- * [37] content ::= (element | PCData | Reference | CDSect | PI | Comment)*
- * [68] Reference ::= EntityRef | CharRef
- */
- void parseContent ()
- throws java.lang.Exception
- {
- String data;
- char c;
-
- while (true) {
-
- switch (currentElementContent) {
- case CONTENT_ANY:
- case CONTENT_MIXED:
- parsePCData();
- break;
- case CONTENT_ELEMENTS:
- parseWhitespace();
- break;
- }
-
- // Handle delimiters
- c = readCh();
- switch (c) {
-
- case '&': // Found "&"
- c = readCh();
- if (c == '#') {
- parseCharRef();
- } else {
- unread(c);
- parseEntityRef(true);
- }
- break;
-
- case '<': // Found "<"
-
- c = readCh();
- switch (c) {
-
- case '!': // Found "<!"
- c = readCh();
- switch (c) {
- case '-': // Found "<!-"
- require('-');
- parseComment();
- break;
- case '[': // Found "<!["
- require("CDATA[");
- parseCDSect();
- break;
- default:
- error("expected comment or CDATA section", c, null);
- break;
- }
- break;
-
- case '?': // Found "<?"
- dataBufferFlush();
- parsePI();
- break;
-
- case '/': // Found "</"
- dataBufferFlush();
- parseETag();
- return;
-
- default: // Found "<" followed by something else
- dataBufferFlush();
- unread(c);
- parseElement();
- break;
- }
- }
- }
- }
-
-
- /**
- * Parse an element type declaration.
- * [40] elementdecl ::= '<!ELEMENT' S %Name S (%S S)? %contentspec S? '>'
- * [VC: Unique Element Declaration]
- * *NOTE: the '<!ELEMENT' has already been read.
- */
- void parseElementdecl ()
- throws java.lang.Exception
- {
- String name;
-
- requireWhitespace();
- // Read the element type name.
- name = readNmtoken(true);
-
- requireWhitespace();
- // Read the content model.
- parseContentspec(name);
-
- skipWhitespace();
- require('>');
- }
-
-
- /**
- * Content specification.
- * [41] contentspec ::= 'EMPTY' | 'ANY' | Mixed | elements
- */
- void parseContentspec (String name)
- throws java.lang.Exception
- {
- if (tryRead("EMPTY")) {
- setElement(name, CONTENT_EMPTY, null, null);
- return;
- } else if (tryRead("ANY")) {
- setElement(name, CONTENT_ANY, null, null);
- return;
- } else {
- require('(');
- dataBufferAppend('(');
- skipWhitespace();
- if (tryRead("#PCDATA")) {
- dataBufferAppend("#PCDATA");
- parseMixed();
- setElement(name, CONTENT_MIXED, dataBufferToString(), null);
- } else {
- parseElements();
- setElement(name, CONTENT_ELEMENTS, dataBufferToString(), null);
- }
- }
- }
-
-
- /**
- * Parse an element-content model.
- * [42] elements ::= (choice | seq) ('?' | '*' | '+')?
- * [44] cps ::= S? %cp S?
- * [45] choice ::= '(' S? %ctokplus (S? '|' S? %ctoks)* S? ')'
- * [46] ctokplus ::= cps ('|' cps)+
- * [47] ctoks ::= cps ('|' cps)*
- * [48] seq ::= '(' S? %stoks (S? ',' S? %stoks)* S? ')'
- * [49] stoks ::= cps (',' cps)*
- * *NOTE: the opening '(' and S have already been read.
- * *TODO: go over parameter entity boundaries more carefully.
- */
- void parseElements ()
- throws java.lang.Exception
- {
- char c;
- char sep;
-
- // Parse the first content particle
- skipWhitespace();
- parseCp();
-
- // Check for end or for a separator.
- skipWhitespace();
- c = readCh();
- switch (c) {
- case ')':
- dataBufferAppend(')');
- c = readCh();
- switch (c) {
- case '*':
- case '+':
- case '?':
- dataBufferAppend(c);
- break;
- default:
- unread(c);
- }
- return;
- case ',': // Register the separator.
- case '|':
- sep = c;
- dataBufferAppend(c);
- break;
- default:
- error("bad separator in content model", c, null);
- return;
- }
-
- // Parse the rest of the content model.
- while (true) {
- skipWhitespace();
- parseCp();
- skipWhitespace();
- c = readCh();
- if (c == ')') {
- dataBufferAppend(')');
- break;
- } else if (c != sep) {
- error("bad separator in content model", c, null);
- return;
- } else {
- dataBufferAppend(c);
- }
- }
-
- // Check for the occurrence indicator.
- c = readCh();
- switch (c) {
- case '?':
- case '*':
- case '+':
- dataBufferAppend(c);
- return;
- default:
- unread(c);
- return;
- }
- }
-
-
- /**
- * Parse a content particle.
- * [43] cp ::= (Name | choice | seq) ('?' | '*' | '+')
- * *NOTE: I actually use a slightly different production here:
- * cp ::= (elements | (Name ('?' | '*' | '+')?))
- */
- void parseCp ()
- throws java.lang.Exception
- {
- char c;
-
- if (tryRead('(')) {
- dataBufferAppend('(');
- parseElements();
- } else {
- dataBufferAppend(readNmtoken(true));
- c = readCh();
- switch (c) {
- case '?':
- case '*':
- case '+':
- dataBufferAppend(c);
- break;
- default:
- unread(c);
- break;
- }
- }
- }
-
-
- /**
- * Parse mixed content.
- * [50] Mixed ::= '(' S? %( %'#PCDATA' (S? '|' S? %Mtoks)* ) S? ')*'
- * | '(' S? %('#PCDATA') S? ')'
- * [51] Mtoks ::= %Name (S? '|' S? %Name)*
- * *NOTE: the S and '#PCDATA' have already been read.
- */
- void parseMixed ()
- throws java.lang.Exception
- {
- char c;
-
- // Check for PCDATA alone.
- skipWhitespace();
- if (tryRead(')')) {
- dataBufferAppend(")*");
- tryRead('*');
- return;
- }
-
- // Parse mixed content.
- skipWhitespace();
- while (!tryRead(")*")) {
- require('|');
- dataBufferAppend('|');
- skipWhitespace();
- dataBufferAppend(readNmtoken(true));
- skipWhitespace();
- }
- dataBufferAppend(")*");
- }
-
-
- /**
- * Parse an attribute list declaration.
- * [52] AttlistDecl ::= '<!ATTLIST' S %Name S? %AttDef+ S? '>'
- * *NOTE: the '<!ATTLIST' has already been read.
- */
- void parseAttlistDecl ()
- throws java.lang.Exception
- {
- String elementName;
-
- requireWhitespace();
- elementName = readNmtoken(true);
- requireWhitespace();
- while (!tryRead('>')) {
- parseAttDef(elementName);
- skipWhitespace();
- }
- }
-
-
- /**
- * Parse a single attribute definition.
- * [53] AttDef ::= S %Name S %AttType S %Default
- */
- void parseAttDef (String elementName)
- throws java.lang.Exception
- {
- String name;
- int type;
- String enumeration = null;
-
- // Read the attribute name.
- name = readNmtoken(true);
-
- // Read the attribute type.
- requireWhitespace();
- type = readAttType();
-
- // Get the string of enumerated values
- // if necessary.
- if (type == ATTRIBUTE_ENUMERATED || type == ATTRIBUTE_NOTATION) {
- enumeration = dataBufferToString();
- }
-
- // Read the default value.
- requireWhitespace();
- parseDefault(elementName, name, type, enumeration);
- }
-
-
- /**
- * Parse the attribute type.
- * [54] AttType ::= StringType | TokenizedType | EnumeratedType
- * [55] StringType ::= 'CDATA'
- * [56] TokenizedType ::= 'ID' | 'IDREF' | 'IDREFS' | 'ENTITY' | 'ENTITIES' |
- * 'NMTOKEN' | 'NMTOKENS'
- * [57] EnumeratedType ::= NotationType | Enumeration
- * *TODO: validate the type!!
- */
- int readAttType ()
- throws java.lang.Exception
- {
- String typeString;
- Integer type;
-
- if (tryRead('(')) {
- parseEnumeration();
- return ATTRIBUTE_ENUMERATED;
- } else {
- typeString = readNmtoken(true);
- if (typeString.equals("NOTATION")) {
- parseNotationType();
- }
- type = (Integer)attributeTypeHash.get(typeString);
- if (type == null) {
- error("illegal attribute type", typeString, null);
- return ATTRIBUTE_UNDECLARED;
- } else {
- return type.intValue();
- }
- }
- }
-
-
- /**
- * Parse an enumeration.
- * [60] Enumeration ::= '(' S? %Etoks (S? '|' S? %Etoks)* S? ')'
- * [61] Etoks ::= %Nmtoken (S? '|' S? %Nmtoken)*
- * *NOTE: the '(' has already been read.
- */
- void parseEnumeration ()
- throws java.lang.Exception
- {
- char c;
-
- dataBufferAppend('(');
-
- // Read the first token.
- skipWhitespace();
- dataBufferAppend(readNmtoken(true));
- // Read the remaining tokens.
- skipWhitespace();
- while (!tryRead(')')) {
- require('|');
- dataBufferAppend('|');
- skipWhitespace();
- dataBufferAppend(readNmtoken(true));
- skipWhitespace();
- }
- dataBufferAppend(')');
- }
-
-
- /**
- * Parse a notation type for an attribute.
- * [58] NotationType ::= %'NOTATION' S '(' S? %Ntoks (S? '|' S? %Ntoks)*
- * S? ')'
- * [59] Ntoks ::= %Name (S? '|' S? %Name)
- * *NOTE: the 'NOTATION' has already been read
- */
- void parseNotationType ()
- throws java.lang.Exception
- {
- requireWhitespace();
- require('(');
-
- parseEnumeration();
- }
-
-
- /**
- * Parse the default value for an attribute.
- * [62] Default ::= '#REQUIRED' | '#IMPLIED' | ((%'#FIXED' S)? %AttValue
- */
- void parseDefault (String elementName, String name, int type, String enumeration)
- throws java.lang.Exception
- {
- int valueType = ATTRIBUTE_DEFAULT_SPECIFIED;
- String value = null;
- boolean normalizeWSFlag;
-
- if (tryRead('#')) {
- if (tryRead("FIXED")) {
- valueType = ATTRIBUTE_DEFAULT_FIXED;
- requireWhitespace();
- context = CONTEXT_ATTRIBUTEVALUE;
- value = readLiteral(LIT_CHAR_REF);
- context = CONTEXT_DTD;
- } else if (tryRead("REQUIRED")) {
- valueType = ATTRIBUTE_DEFAULT_REQUIRED;
- } else if (tryRead("IMPLIED")) {
- valueType = ATTRIBUTE_DEFAULT_IMPLIED;
- } else {
- error("illegal keyword for attribute default value", null, null);
- }
- } else {
- context = CONTEXT_ATTRIBUTEVALUE;
- value = readLiteral(LIT_CHAR_REF);
- context = CONTEXT_DTD;
- }
- setAttribute(elementName, name, type, enumeration, value, valueType);
- }
-
-
- /**
- * Parse a conditional section.
- * [63] conditionalSect ::= includeSect || ignoreSect
- * [64] includeSect ::= '<![' %'INCLUDE' '[' (%markupdecl*)* ']]>'
- * [65] ignoreSect ::= '<![' %'IGNORE' '[' ignoreSectContents* ']]>'
- * [66] ignoreSectContents ::= ((SkipLit | Comment | PI) -(Char* ']]>'))
- * | ('<![' ignoreSectContents* ']]>')
- * | (Char - (']' | [<'"]))
- * | ('<!' (Char - ('-' | '[')))
- * *NOTE: the '<![' has already been read.
- * *TODO: verify that I am handling ignoreSectContents right.
- */
- void parseConditionalSect ()
- throws java.lang.Exception
- {
- skipWhitespace();
- if (tryRead("INCLUDE")) {
- skipWhitespace();
- require('[');
- skipWhitespace();
- while (!tryRead("]]>")) {
- parseMarkupdecl();
- skipWhitespace();
- }
- } else if (tryRead("IGNORE")) {
- skipWhitespace();
- require('[');
- int nesting = 1;
- char c;
- for (int nest = 1; nest > 0; ) {
- c = readCh();
- switch (c) {
- case '<':
- if (tryRead("![")) {
- nest++;
- }
- case ']':
- if (tryRead("]>")) {
- nest--;
- }
- }
- }
- } else {
- error("conditional section must begin with INCLUDE or IGNORE",
- null, null);
- }
- }
-
-
- /**
- * Read a character reference.
- * [67] CharRef ::= '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';'
- * *NOTE: the '&#' has already been read.
- */
- void parseCharRef ()
- throws java.lang.Exception
- {
- int value = 0;
- char c;
-
- if (tryRead('x')) {
- loop1: while (true) {
- c = readCh();
- switch (c) {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- case 'a':
- case 'A':
- case 'b':
- case 'B':
- case 'c':
- case 'C':
- case 'd':
- case 'D':
- case 'e':
- case 'E':
- case 'f':
- case 'F':
- value *= 16;
- value += Integer.parseInt(new Character(c).toString(), 16);
- break;
- case ';':
- break loop1;
- default:
- error("illegal character in character reference", c, null);
- break loop1;
- }
- }
- } else {
- loop2: while (true) {
- c = readCh();
- switch (c) {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- value *= 10;
- value += Integer.parseInt(new Character(c).toString(), 10);
- break;
- case ';':
- break loop2;
- default:
- error("illegal character in character reference", c, null);
- break loop2;
- }
- }
- }
-
- // Check for surrogates: 00000000 0000xxxx yyyyyyyy zzzzzzzz
- // (1101|10xx|xxyy|yyyy + 1101|11yy|zzzz|zzzz:
- if (value <= 0x0000ffff) {
- // no surrogates needed
- dataBufferAppend((char)value);
- } else if (value <= 0x000fffff) {
- // > 16 bits, surrogate needed
- dataBufferAppend((char)(0xd8 | ((value & 0x000ffc00) >> 10)));
- dataBufferAppend((char)(0xdc | (value & 0x0003ff)));
- } else {
- // too big for surrogate
- error("character reference " + value + " is too large for UTF-16",
- new Integer(value).toString(), null);
- }
- }
-
-
- /**
- * Parse a reference.
- * [69] EntityRef ::= '&' Name ';'
- * *NOTE: the '&' has already been read.
- * @param externalAllowed External entities are allowed here.
- */
- void parseEntityRef (boolean externalAllowed)
- throws java.lang.Exception
- {
- String name;
-
- name = readNmtoken(true);
- require(';');
- switch (getEntityType(name)) {
- case ENTITY_UNDECLARED:
- error("reference to undeclared entity", name, null);
- break;
- case ENTITY_INTERNAL:
- pushString(name, getEntityValue(name));
- break;
- case ENTITY_TEXT:
- if (externalAllowed) {
- pushURL(name, getEntityPublicId(name),
- getEntitySystemId(name),
- null, null, null);
- } else {
- error("reference to external entity in attribute value.", name, null);
- }
- break;
- case ENTITY_NDATA:
- if (externalAllowed) {
- error("data entity reference in content", name, null);
- } else {
- error("reference to external entity in attribute value.", name, null);
- }
- break;
- }
- }
-
-
- /**
- * Parse a parameter entity reference.
- * [70] PEReference ::= '%' Name ';'
- * *NOTE: the '%' has already been read.
- */
- void parsePEReference (boolean isEntityValue)
- throws java.lang.Exception
- {
- String name;
-
- name = "%" + readNmtoken(true);
- require(';');
- switch (getEntityType(name)) {
- case ENTITY_UNDECLARED:
- error("reference to undeclared parameter entity", name, null);
- break;
- case ENTITY_INTERNAL:
- if (isEntityValue) {
- pushString(name, getEntityValue(name));
- } else {
- pushString(name, " " + getEntityValue(name) + ' ');
- }
- break;
- case ENTITY_TEXT:
- if (isEntityValue) {
- pushString(null, " ");
- }
- pushURL(name, getEntityPublicId(name),
- getEntitySystemId(name),
- null, null, null);
- if (isEntityValue) {
- pushString(null, " ");
- }
- break;
- }
- }
-
-
- /**
- * Parse an entity declaration.
- * [71] EntityDecl ::= '<!ENTITY' S %Name S %EntityDef S? '>'
- * | '<!ENTITY' S '%' S %Name S %EntityDef S? '>'
- * [72] EntityDef ::= EntityValue | ExternalDef
- * [73] ExternalDef ::= ExternalID %NDataDecl?
- * [74] ExternalID ::= 'SYSTEM' S SystemLiteral
- * | 'PUBLIC' S PubidLiteral S SystemLiteral
- * [75] NDataDecl ::= S %'NDATA' S %Name
- * *NOTE: the '<!ENTITY' has already been read.
- */
- void parseEntityDecl ()
- throws java.lang.Exception
- {
- char c;
- boolean peFlag = false;
- String name, value, notationName, ids[];
-
- // Check for a parameter entity.
- requireWhitespace();
- if (tryRead('%')) {
- peFlag = true;
- requireWhitespace();
- }
-
- // Read the entity name, and prepend
- // '%' if necessary.
- name = readNmtoken(true);
- if (peFlag) {
- name = "%" + name;
- }
-
- // Read the entity value.
- requireWhitespace();
- c = readCh();
- unread(c);
- if (c == '"' || c == '\'') {
- // Internal entity.
- context = CONTEXT_ENTITYVALUE;
- value = readLiteral(LIT_CHAR_REF|LIT_PE_REF);
- context = CONTEXT_DTD;
- setInternalEntity(name,value);
- } else {
- // Read the external IDs
- ids = readExternalIds(false);
- if (ids[1] == null) {
- error("system identifer missing", name, null);
- }
-
- // Check for NDATA declaration.
- skipWhitespace();
- if (tryRead("NDATA")) {
- requireWhitespace();
- notationName = readNmtoken(true);
- setExternalDataEntity(name, ids[0], ids[1], notationName);
- } else {
- setExternalTextEntity(name, ids[0], ids[1]);
- }
- }
-
- // Finish the declaration.
- skipWhitespace();
- require('>');
- }
-
-
- /**
- * Parse a notation declaration.
- * [81] NotationDecl ::= '<!NOTATION' S %Name S %ExternalID S? '>'
- * *NOTE: the '<!NOTATION' has already been read.
- */
- void parseNotationDecl ()
- throws java.lang.Exception
- {
- String nname, ids[];
-
-
- requireWhitespace();
- nname = readNmtoken(true);
-
- requireWhitespace();
-
- // Read the external identifiers.
- ids = readExternalIds(true);
- if (ids[0] == null && ids[1] == null) {
- error("external identifer missing", nname, null);
- }
-
- // Register the notation.
- setNotation(nname, ids[0], ids[1]);
-
- skipWhitespace();
- require('>');
- }
-
-
- /**
- * Parse PCDATA.
- * <pre>
- * [16] PCData ::= [^<&]*
- * </pre>
- * <p>The trick here is that the data stays in the dataBuffer without
- * necessarily being converted to a string right away.
- */
- void parsePCData ()
- throws java.lang.Exception
- {
- char c;
-
- // Start with a little cheat -- in most
- // cases, the entire sequence of
- // character data will already be in
- // the readBuffer; if not, fall through to
- // the normal approach.
- if (USE_CHEATS) {
- int lineAugment = 0;
- int columnAugment = 0;
-
- loop: for (int i = readBufferPos; i < readBufferLength; i++) {
- switch (readBuffer[i]) {
- case '\n':
- lineAugment++;
- columnAugment = 0;
- break;
- case '&':
- case '<':
- int start = readBufferPos;
- columnAugment++;
- readBufferPos = i;
- if (lineAugment > 0) {
- line += lineAugment;
- column = columnAugment;
- } else {
- column += columnAugment;
- }
- dataBufferAppend(readBuffer, start, i-start);
- return;
- default:
- columnAugment++;
- }
- }
- }
-
- // OK, the cheat didn't work; start over
- // and do it by the book.
- while (true) {
- c = readCh();
- switch (c) {
- case '<':
- case '&':
- unread(c);
- return;
- default:
- dataBufferAppend(c);
- break;
- }
- }
- }
-
-
-
- //////////////////////////////////////////////////////////////////////
- // High-level reading and scanning methods.
- //////////////////////////////////////////////////////////////////////
-
- /**
- * Require whitespace characters.
- * [1] S ::= (#x20 | #x9 | #xd | #xa)+
- */
- void requireWhitespace ()
- throws java.lang.Exception
- {
- char c = readCh();
- if (isWhitespace(c)) {
- skipWhitespace();
- } else {
- error("whitespace expected", c, null);
- }
- }
-
-
- /**
- * Parse whitespace characters, and leave them in the data buffer.
- */
- void parseWhitespace ()
- throws java.lang.Exception
- {
- char c = readCh();
- while (isWhitespace(c)) {
- dataBufferAppend(c);
- c = readCh();
- }
- unread(c);
- }
-
-
- /**
- * Skip whitespace characters.
- * [1] S ::= (#x20 | #x9 | #xd | #xa)+
- */
- void skipWhitespace ()
- throws java.lang.Exception
- {
- // Start with a little cheat. Most of
- // the time, the white space will fall
- // within the current read buffer; if
- // not, then fall through.
- if (USE_CHEATS) {
- int lineAugment = 0;
- int columnAugment = 0;
-
- loop: for (int i = readBufferPos; i < readBufferLength; i++) {
- switch (readBuffer[i]) {
- case ' ':
- case '\t':
- case '\r':
- columnAugment++;
- break;
- case '\n':
- lineAugment++;
- columnAugment = 0;
- break;
- case '%':
- if (context == CONTEXT_DTD || context == CONTEXT_ENTITYVALUE) {
- break loop;
- } // else fall through...
- default:
- readBufferPos = i;
- if (lineAugment > 0) {
- line += lineAugment;
- column = columnAugment;
- } else {
- column += columnAugment;
- }
- return;
- }
- }
- }
-
- // OK, do it by the book.
- char c = readCh();
- while (isWhitespace(c)) {
- c = readCh();
- }
- unread(c);
- }
-
-
- /**
- * Read a name or name token.
- * [5] Name ::= (Letter | '_' | ':') (NameChar)*
- * [7] Nmtoken ::= (NameChar)+
- * *NOTE: [6] is implemented implicitly where required.
- */
- String readNmtoken (boolean isName)
- throws java.lang.Exception
- {
- char c;
-
- if (USE_CHEATS) {
- loop: for (int i = readBufferPos; i < readBufferLength; i++) {
- switch (readBuffer[i]) {
- case '%':
- if (context == CONTEXT_DTD || context == CONTEXT_ENTITYVALUE) {
- break loop;
- } // else fall through...
- case '<':
- case '>':
- case '&':
- case ',':
- case '|':
- case '*':
- case '+':
- case '?':
- case ')':
- case '=':
- case '\'':
- case '"':
- case '[':
- case ' ':
- case '\t':
- case '\r':
- case '\n':
- case ';':
- case '/':
- case '#':
- int start = readBufferPos;
- if (i == start) {
- error("name expected", readBuffer[i], null);
- }
- readBufferPos = i;
- return intern(readBuffer, start, i - start);
- }
- }
- }
-
- nameBufferPos = 0;
-
- // Read the first character.
- loop: while (true) {
- c = readCh();
- switch (c) {
- case '%':
- case '<':
- case '>':
- case '&':
- case ',':
- case '|':
- case '*':
- case '+':
- case '?':
- case ')':
- case '=':
- case '\'':
- case '"':
- case '[':
- case ' ':
- case '\t':
- case '\n':
- case '\r':
- case ';':
- case '/':
- unread(c);
- if (nameBufferPos == 0) {
- error("name expected", null, null);
- }
- String s = intern(nameBuffer,0,nameBufferPos);
- nameBufferPos = 0;
- return s;
- default:
- nameBuffer =
- (char[])extendArray(nameBuffer, nameBuffer.length, nameBufferPos);
- nameBuffer[nameBufferPos++] = c;
- }
- }
- }
-
-
- /**
- * Read a literal.
- * [10] AttValue ::= '"' ([^<&"] | Reference)* '"'
- * | "'" ([^<&'] | Reference)* "'"
- * [11] SystemLiteral ::= '"' URLchar* '"' | "'" (URLchar - "'")* "'"
- * [13] PubidLiteral ::= '"' PubidChar* '"' | "'" (PubidChar - "'")* "'"
- * [9] EntityValue ::= '"' ([^%&"] | PEReference | Reference)* '"'
- * | "'" ([^%&'] | PEReference | Reference)* "'"
- */
- String readLiteral (int flags)
- throws java.lang.Exception
- {
- char delim, c;
- int startLine = line;
-
- // Find the delimiter.
- delim = readCh();
- if (delim != '"' && delim != '\'' && delim != (char)0) {
- error("expected '\"' or \"'\"", delim, null);
- return null;
- }
-
- // Read the literal.
- try {
- c = readCh();
-
- loop: while (c != delim) {
- switch (c) {
- // Literals never have line ends
- case '\n':
- case '\r':
- c = ' ';
- break;
- // References may be allowed
- case '&':
- if ((flags & LIT_CHAR_REF) > 0) {
- c = readCh();
- if (c == '#') {
- parseCharRef();
- c = readCh();
- continue loop; // check the next character
- } else if ((flags & LIT_ENTITY_REF) > 0) {
- unread(c);
- parseEntityRef(false);
- c = readCh();
- continue loop;
- } else {
- dataBufferAppend('&');
- }
- }
- break;
-
- default:
- break;
- }
- dataBufferAppend(c);
- c = readCh();
- }
- } catch (EOFException e) {
- error("end of input while looking for delimiter (started on line "
- + startLine + ')', null, new Character(delim).toString());
- }
-
- // Normalise whitespace if necessary.
- if ((flags & LIT_NORMALIZE) > 0) {
- dataBufferNormalize();
- }
-
- // Return the value.
- return dataBufferToString();
- }
-
-
- /**
- * Try reading external identifiers.
- * <p>The system identifier is not required for notations.
- * @param inNotation Are we in a notation?
- * @return A two-member String array containing the identifiers.
- */
- String[] readExternalIds (boolean inNotation)
- throws java.lang.Exception
- {
- char c;
- String ids[] = new String[2];
-
- if (tryRead("PUBLIC")) {
- requireWhitespace();
- ids[0] = readLiteral(LIT_NORMALIZE); // public id
- if (inNotation) {
- skipWhitespace();
- if (tryRead('"') || tryRead('\'')) {
- ids[1] = readLiteral(0);
- }
- } else {
- requireWhitespace();
- ids[1] = readLiteral(0); // system id
- }
- } else if (tryRead("SYSTEM")) {
- requireWhitespace();
- ids[1] = readLiteral(0); // system id
- }
-
- return ids;
- }
-
-
- /**
- * Test if a character is whitespace.
- * <pre>
- * [1] S ::= (#x20 | #x9 | #xd | #xa)+
- * </pre>
- * @param c The character to test.
- * @return true if the character is whitespace.
- */
- final boolean isWhitespace (char c)
- {
- switch ((int)c) {
- case 0x20:
- case 0x09:
- case 0x0d:
- case 0x0a:
- return true;
- default:
- return false;
- }
- }
-
-
-
- //////////////////////////////////////////////////////////////////////
- // Utility routines.
- //////////////////////////////////////////////////////////////////////
-
-
- /**
- * Add a character to the data buffer.
- */
- void dataBufferAppend (char c)
- {
- // Expand buffer if necessary.
- dataBuffer =
- (char[])extendArray(dataBuffer, dataBuffer.length, dataBufferPos);
- dataBuffer[dataBufferPos++] = c;
- }
-
-
- /**
- * Add a string to the data buffer.
- */
- void dataBufferAppend (String s)
- {
- dataBufferAppend(s.toCharArray(), 0, s.length());
- }
-
-
- /**
- * Append (part of) a character array to the data buffer.
- */
- void dataBufferAppend (char ch[], int start, int length)
- {
- dataBuffer =
- (char[])extendArray(dataBuffer, dataBuffer.length,
- dataBufferPos + length);
- System.arraycopy((Object)ch, start,
- (Object)dataBuffer, dataBufferPos,
- length);
- dataBufferPos += length;
- }
-
-
- /**
- * Normalise whitespace in the data buffer.
- */
- void dataBufferNormalize ()
- {
- int i = 0;
- int j = 0;
- int end = dataBufferPos;
-
- // Skip whitespace at the start.
- while (j < end && isWhitespace(dataBuffer[j])) {
- j++;
- }
-
- // Skip whitespace at the end.
- while (end > j && isWhitespace(dataBuffer[end - 1])) {
- end --;
- }
-
- // Start copying to the left.
- while (j < end) {
-
- char c = dataBuffer[j++];
-
- // Normalise all other whitespace to
- // a single space.
- if (isWhitespace(c)) {
- while (j < end && isWhitespace(dataBuffer[j++])) {
- }
- dataBuffer[i++] = ' ';
- dataBuffer[i++] = dataBuffer[j-1];
- } else {
- dataBuffer[i++] = c;
- }
- }
-
- // The new length is <= the old one.
- dataBufferPos = i;
- }
-
-
- /**
- * Convert the data buffer to a string.
- * @param internFlag true if the contents should be interned.
- * @see #intern(char[],int,int)
- */
- String dataBufferToString ()
- {
- String s = new String(dataBuffer, 0, dataBufferPos);
- dataBufferPos = 0;
- return s;
- }
-
-
- /**
- * Flush the contents of the data buffer to the handler, if
- * appropriate, and reset the buffer for new input.
- */
- void dataBufferFlush ()
- throws java.lang.Exception
- {
- if (dataBufferPos > 0) {
- switch (currentElementContent) {
- case CONTENT_UNDECLARED:
- case CONTENT_EMPTY:
- // do nothing
- break;
- case CONTENT_MIXED:
- case CONTENT_ANY:
- if (handler != null) {
- handler.charData(dataBuffer, 0, dataBufferPos);
- }
- break;
- case CONTENT_ELEMENTS:
- if (handler != null) {
- handler.ignorableWhitespace(dataBuffer, 0, dataBufferPos);
- }
- break;
- }
- dataBufferPos = 0;
- }
- }
-
-
- /**
- * Require a string to appear, or throw an exception.
- */
- void require (String delim)
- throws java.lang.Exception
- {
- char ch[] = delim.toCharArray();
- for (int i = 0; i < ch.length; i++) {
- require(ch[i]);
- }
- }
-
-
- /**
- * Require a character to appear, or throw an exception.
- */
- void require (char delim)
- throws java.lang.Exception
- {
- char c = readCh();
-
- if (c != delim) {
- error("expected character", c, new Character(delim).toString());
- }
- }
-
-
- /**
- * Return an internalised version of a string.
- * <p>Ælfred uses this method to create an internalised version
- * of all names and attribute values, so that it can test equality
- * with <code>==</code> instead of <code>String.equals()</code>.
- * <p>If you want to be able to test for equality in the same way,
- * you can use this method to internalise your own strings first:
- * <pre>
- * String PARA = handler.intern("PARA");
- * </pre>
- * <p>Note that this will not return the same results as String.intern().
- * @param s The string to internalise.
- * @return An internalised version of the string.
- * @see #intern(char[],int,int)
- * @see java.lang.String#intern
- */
- public String intern (String s)
- {
- char ch[] = s.toCharArray();
- return intern(ch, 0, ch.length);
- }
-
-
- /**
- * Create an internalised string from a character array.
- * <p>This is much more efficient than constructing a non-internalised
- * string first, and then internalising it.
- * <p>Note that this will not return the same results as String.intern().
- * @param ch an array of characters for building the string.
- * @param start the starting position in the array.
- * @param length the number of characters to place in the string.
- * @return an internalised string.
- * @see #intern(String)
- * @see java.lang.String#intern
- */
- public String intern (char ch[], int start, int length)
- {
- int index;
- int hash = 0;
-
- // Generate a hash code.
- for (int i = start; i < start + length; i++) {
- hash = ((hash << 1) & 0xffffff) + (int)ch[i];
- }
-
- hash = hash % SYMBOL_TABLE_LENGTH;
-
- // Get the bucket.
- Object bucket[] = (Object[])symbolTable[hash];
- if (bucket == null) {
- symbolTable[hash] = bucket = new Object[8];
- }
-
- // Search for a matching tuple, and
- // return the string if we find one.
- for (index = 0; index < bucket.length; index += 2) {
- char chFound[] = (char[])bucket[index];
-
- // Stop when we hit a null index.
- if (chFound == null) {
- break;
- }
-
- // If they're the same length,
- // check for a match.
- // If the loop finishes, 'index' will
- // contain the current bucket
- // position.
- if (chFound.length == length) {
- for (int i = 0; i < chFound.length; i++) {
- // Stop if there are no more tuples.
- if (ch[start+i] != chFound[i]) {
- break;
- } else if (i == length-1) {
- // That's it, we have a match!
- return (String)bucket[index+1];
- }
- }
- }
- }
-
- // Not found -- we'll have to add it.
-
- // Do we have to grow the bucket?
- bucket =
- (Object[])extendArray(bucket, bucket.length, index);
-
- // OK, add it to the end of the
- // bucket.
- String s = new String(ch, start, length);
- bucket[index] = s.toCharArray();
- bucket[index+1] = s;
- symbolTable[hash] = bucket;
- return s;
- }
-
-
- /**
- * Ensure the capacity of an array, allocating a new one if
- * necessary.
- */
- Object extendArray (Object array, int currentSize, int requiredSize)
- {
- if (requiredSize < currentSize) {
- return array;
- } else {
- Object newArray = null;
- int newSize = currentSize * 2;
-
- if (newSize <= requiredSize) {
- newSize = requiredSize + 1;
- }
-
- if (array instanceof char[]) {
- newArray = new char[newSize];
- } else if (array instanceof Object[]) {
- newArray = new Object[newSize];
- }
-
- System.arraycopy(array, 0, newArray, 0, currentSize);
- return newArray;
- }
- }
-
-
-
- //////////////////////////////////////////////////////////////////////
- // XML query routines.
- //////////////////////////////////////////////////////////////////////
-
-
- //
- // Elements
- //
-
- /**
- * Get the declared elements for an XML document.
- * <p>The results will be valid only after the DTD (if any) has been
- * parsed.
- * @return An enumeration of all element types declared for this
- * document (as Strings).
- * @see #getElementContentType
- * @see #getElementContentModel
- */
- public Enumeration declaredElements ()
- {
- return elementInfo.keys();
- }
-
-
- /**
- * Look up the content type of an element.
- * @param name The element type name.
- * @return An integer constant representing the content type.
- * @see #getElementContentModel
- * @see #CONTENT_UNDECLARED
- * @see #CONTENT_ANY
- * @see #CONTENT_EMPTY
- * @see #CONTENT_MIXED
- * @see #CONTENT_ELEMENTS
- */
- public int getElementContentType (String name)
- {
- Object element[] = (Object[])elementInfo.get(name);
- if (element == null) {
- return CONTENT_UNDECLARED;
- } else {
- return ((Integer)element[0]).intValue();
- }
- }
-
-
- /**
- * Look up the content model of an element.
- * <p>The result will always be null unless the content type is
- * CONTENT_ELEMENTS or CONTENT_MIXED.
- * @param name The element type name.
- * @return The normalised content model, as a string.
- * @see #getElementContentType
- */
- public String getElementContentModel (String name)
- {
- Object element[] = (Object[])elementInfo.get(name);
- if (element == null) {
- return null;
- } else {
- return (String)element[1];
- }
- }
-
-
- /**
- * Register an element.
- * Array format:
- * element type
- * attribute hash table
- */
- void setElement (String name, int contentType,
- String contentModel, Hashtable attributes)
- throws java.lang.Exception
- {
- Object element[];
-
- // Try looking up the element
- element = (Object[])elementInfo.get(name);
-
- // Make a new one if necessary.
- if (element == null) {
- element = new Object[3];
- element[0] = new Integer(CONTENT_UNDECLARED);
- element[1] = null;
- element[2] = null;
- } else if (contentType != CONTENT_UNDECLARED &&
- ((Integer)element[0]).intValue() != CONTENT_UNDECLARED) {
- error("multiple declarations for element type", name, null);
- return;
- }
-
- // Insert the content type, if any.
- if (contentType != CONTENT_UNDECLARED) {
- element[0] = new Integer(contentType);
- }
-
- // Insert the content model, if any.
- if (contentModel != null) {
- element[1] = contentModel;
- }
-
- // Insert the attributes, if any.
- if (attributes != null) {
- element[2] =attributes;
- }
-
- // Save the element info.
- elementInfo.put(name,element);
- }
-
-
- /**
- * Look up the attribute hash table for an element.
- * The hash table is the second item in the element array.
- */
- Hashtable getElementAttributes (String name)
- {
- Object element[] = (Object[])elementInfo.get(name);
- if (element == null) {
- return null;
- } else {
- return (Hashtable)element[2];
- }
- }
-
-
-
- //
- // Attributes
- //
-
- /**
- * Get the declared attributes for an element type.
- * @param elname The name of the element type.
- * @return An Enumeration of all the attributes declared for
- * a specific element type. The results will be valid only
- * after the DTD (if any) has been parsed.
- * @see #getAttributeType
- * @see #getAttributeEnumeration
- * @see #getAttributeDefaultValueType
- * @see #getAttributeDefaultValue
- * @see #getAttributeExpandedValue
- */
- public Enumeration declaredAttributes (String elname)
- {
- Hashtable attlist = getElementAttributes(elname);
-
- if (attlist == null) {
- return null;
- } else {
- return attlist.keys();
- }
- }
-
-
- /**
- * Retrieve the declared type of an attribute.
- * @param name The name of the associated element.
- * @param aname The name of the attribute.
- * @return An integer constant representing the attribute type.
- * @see #ATTRIBUTE_UNDECLARED
- * @see #ATTRIBUTE_CDATA
- * @see #ATTRIBUTE_ID
- * @see #ATTRIBUTE_IDREF
- * @see #ATTRIBUTE_IDREFS
- * @see #ATTRIBUTE_ENTITY
- * @see #ATTRIBUTE_ENTITIES
- * @see #ATTRIBUTE_NMTOKEN
- * @see #ATTRIBUTE_NMTOKENS
- * @see #ATTRIBUTE_ENUMERATED
- * @see #ATTRIBUTE_NOTATION
- */
- public int getAttributeType (String name, String aname)
- {
- Object attribute[] = getAttribute(name, aname);
- if (attribute == null) {
- return ATTRIBUTE_UNDECLARED;
- } else {
- return ((Integer)attribute[0]).intValue();
- }
- }
-
-
- /**
- * Retrieve the allowed values for an enumerated attribute type.
- * @param name The name of the associated element.
- * @param aname The name of the attribute.
- * @return A string containing the token list.
- * @see #ATTRIBUTE_ENUMERATED
- * @see #ATTRIBUTE_NOTATION
- */
- public String getAttributeEnumeration (String name, String aname)
- {
- Object attribute[] = getAttribute(name, aname);
- if (attribute == null) {
- return null;
- } else {
- return (String)attribute[3];
- }
- }
-
-
- /**
- * Retrieve the default value of a declared attribute.
- * @param name The name of the associated element.
- * @param aname The name of the attribute.
- * @return The default value, or null if the attribute was
- * #IMPLIED or simply undeclared and unspecified.
- * @see #getAttributeExpandedValue
- */
- public String getAttributeDefaultValue (String name, String aname)
- {
- Object attribute[] = getAttribute(name, aname);
- if (attribute == null) {
- return null;
- } else {
- return (String)attribute[1];
- }
- }
-
-
- /**
- * Retrieve the expanded value of a declared attribute.
- * <p>All general entities will be expanded.
- * @param name The name of the associated element.
- * @param aname The name of the attribute.
- * @return The expanded default value, or null if the attribute was
- * #IMPLIED or simply undeclared
- * @see #getAttributeDefaultValue
- */
- public String getAttributeExpandedValue (String name, String aname)
- {
- Object attribute[] = getAttribute(name, aname);
- if (attribute == null) {
- return null;
- } else if (attribute[4] == null && attribute[1] != null) {
- try {
- pushString(null, (char)0 + (String)attribute[1] + (char)0);
- attribute[4] = readLiteral(LIT_NORMALIZE |
- LIT_CHAR_REF |
- LIT_ENTITY_REF);
- } catch (Exception e) {}
- }
- return (String)attribute[4];
- }
-
-
- /**
- * Retrieve the default value type of a declared attribute.
- * @see #ATTRIBUTE_DEFAULT_SPECIFIED
- * @see #ATTRIBUTE_DEFAULT_IMPLIED
- * @see #ATTRIBUTE_DEFAULT_REQUIRED
- * @see #ATTRIBUTE_DEFAULT_FIXED
- */
- public int getAttributeDefaultValueType (String name, String aname)
- {
- Object attribute[] = getAttribute(name, aname);
- if (attribute == null) {
- return ATTRIBUTE_DEFAULT_UNDECLARED;
- } else {
- return ((Integer)attribute[2]).intValue();
- }
- }
-
-
- /**
- * Register an attribute declaration for later retrieval.
- * Format:
- * - String type
- * - String default value
- * - int value type
- * *TODO: do something with attribute types.
- */
- void setAttribute (String elName, String name, int type, String enumeration,
- String value, int valueType)
- throws java.lang.Exception
- {
- Hashtable attlist;
- Object attribute[];
-
- // Create a new hashtable if necessary.
- attlist = getElementAttributes(elName);
- if (attlist == null) {
- attlist = new Hashtable();
- }
-
- // Check that the attribute doesn't
- // already exist!
- if (attlist.get(name) != null) {
- return;
- } else {
- attribute = new Object[5];
- attribute[0] = new Integer(type);
- attribute[1] = value;
- attribute[2] = new Integer(valueType);
- attribute[3] = enumeration;
- attribute[4] = null;
- attlist.put(name.intern(), attribute);
-
- // Use CONTENT_UNDECLARED to avoid overwriting
- // existing element declaration.
- setElement(elName,CONTENT_UNDECLARED, null, attlist);
- }
- }
-
-
- /**
- * Retrieve the three-member array representing an
- * attribute declaration.
- */
- Object[] getAttribute (String elName, String name)
- {
- Hashtable attlist;
- Object attribute[];
-
- attlist = getElementAttributes(elName);
- if (attlist == null) {
- return null;
- }
-
- attribute = (Object[])attlist.get(name);
- return attribute;
- }
-
-
- //
- // Entities
- //
-
- /**
- * Get declared entities.
- * @return An Enumeration of all the entities declared for
- * this XML document. The results will be valid only
- * after the DTD (if any) has been parsed.
- * @see #getEntityType
- * @see #getEntityPublicId
- * @see #getEntitySystemId
- * @see #getEntityValue
- * @see #getEntityNotationName
- */
- public Enumeration declaredEntities ()
- {
- return entityInfo.keys();
- }
-
-
- /**
- * Find the type of an entity.
- * @return An integer constant representing the entity type.
- * @see #ENTITY_UNDECLARED
- * @see #ENTITY_INTERNAL
- * @see #ENTITY_NDATA
- * @see #ENTITY_TEXT
- */
- public int getEntityType (String ename)
- {
- Object entity[] = (Object[])entityInfo.get(ename);
- if (entity == null) {
- return ENTITY_UNDECLARED;
- } else {
- return ((Integer)entity[0]).intValue();
- }
- }
-
-
- /**
- * Return an external entity's public identifier, if any.
- * @param ename The name of the external entity.
- * @return The entity's system identifier, or null if the
- * entity was not declared, if it is not an
- * external entity, or if no public identifier was
- * provided.
- * @see #getEntityType
- */
- public String getEntityPublicId (String ename)
- {
- Object entity[] = (Object[])entityInfo.get(ename);
- if (entity == null) {
- return null;
- } else {
- return (String)entity[1];
- }
- }
-
-
- /**
- * Return an external entity's system identifier.
- * @param ename The name of the external entity.
- * @return The entity's system identifier, or null if the
- * entity was not declared, or if it is not an
- * external entity.
- * @see #getEntityType
- */
- public String getEntitySystemId (String ename)
- {
- Object entity[] = (Object[])entityInfo.get(ename);
- if (entity == null) {
- return null;
- } else {
- return (String)entity[2];
- }
- }
-
-
- /**
- * Return the value of an internal entity.
- * @param ename The name of the internal entity.
- * @return The entity's value, or null if the entity was
- * not declared, or if it is not an internal entity.
- * @see #getEntityType
- */
- public String getEntityValue (String ename)
- {
- Object entity[] = (Object[])entityInfo.get(ename);
- if (entity == null) {
- return null;
- } else {
- return (String)entity[3];
- }
- }
-
-
- /**
- * Get the notation name associated with an NDATA entity.
- * @param eName The NDATA entity name.
- * @return The associated notation name, or null if the
- * entity was not declared, or if it is not an
- * NDATA entity.
- * @see #getEntityType
- */
- public String getEntityNotationName (String eName)
- {
- Object entity[] = (Object[])entityInfo.get(eName);
- if (entity == null) {
- return null;
- } else {
- return (String)entity[4];
- }
- }
-
-
- /**
- * Register an entity declaration for later retrieval.
- */
- void setInternalEntity (String eName, String value)
- {
- setEntity(eName, ENTITY_INTERNAL, null, null, value, null);
- }
-
-
- /**
- * Register an external data entity.
- */
- void setExternalDataEntity (String eName, String pubid,
- String sysid, String nName)
- {
- setEntity(eName, ENTITY_NDATA, pubid, sysid, null, nName);
- }
-
-
- /**
- * Register an external text entity.
- */
- void setExternalTextEntity (String eName, String pubid, String sysid)
- {
- setEntity(eName, ENTITY_TEXT, pubid, sysid, null, null);
- }
-
-
- /**
- * Register an entity declaration for later retrieval.
- */
- void setEntity (String eName, int eClass,
- String pubid, String sysid,
- String value, String nName)
- {
- Object entity[];
-
- if (entityInfo.get(eName) == null) {
- entity = new Object[5];
- entity[0] = new Integer(eClass);
- entity[1] = pubid;
- entity[2] = sysid;
- entity[3] = value;
- entity[4] = nName;
-
- entityInfo.put(eName,entity);
- }
- }
-
-
- //
- // Notations.
- //
-
- /**
- * Get declared notations.
- * @return An Enumeration of all the notations declared for
- * this XML document. The results will be valid only
- * after the DTD (if any) has been parsed.
- * @see #getNotationPublicId
- * @see #getNotationSystemId
- */
- public Enumeration declaredNotations ()
- {
- return notationInfo.keys();
- }
-
-
- /**
- * Look up the public identifier for a notation.
- * You will normally use this method to look up a notation
- * that was provided as an attribute value or for an NDATA entity.
- * @param nname The name of the notation.
- * @return A string containing the public identifier, or null
- * if none was provided or if no such notation was
- * declared.
- * @see #getNotationSystemId
- */
- public String getNotationPublicId (String nname)
- {
- Object notation[] = (Object[])notationInfo.get(nname);
- if (notation == null) {
- return null;
- } else {
- return (String)notation[0];
- }
- }
-
-
- /**
- * Look up the system identifier for a notation.
- * You will normally use this method to look up a notation
- * that was provided as an attribute value or for an NDATA entity.
- * @param nname The name of the notation.
- * @return A string containing the system identifier, or null
- * if no such notation was declared.
- * @see #getNotationPublicId
- */
- public String getNotationSystemId (String nname)
- {
- Object notation[] = (Object[])notationInfo.get(nname);
- if (notation == null) {
- return null;
- } else {
- return (String)notation[1];
- }
- }
-
-
- /**
- * Register a notation declaration for later retrieval.
- * Format:
- * - public id
- * - system id
- */
- void setNotation (String nname, String pubid, String sysid)
- throws java.lang.Exception
- {
- Object notation[];
-
- if (notationInfo.get(nname) == null) {
- notation = new Object[2];
- notation[0] = pubid;
- notation[1] = sysid;
- notationInfo.put(nname,notation);
- } else {
- error("multiple declarations of notation", nname, null);
- }
- }
-
-
- //
- // Location.
- //
-
-
- /**
- * Return the current line number.
- */
- public int getLineNumber ()
- {
- return line;
- }
-
-
- /**
- * Return the current column number.
- */
- public int getColumnNumber ()
- {
- return column;
- }
-
-
-
- //////////////////////////////////////////////////////////////////////
- // High-level I/O.
- //////////////////////////////////////////////////////////////////////
-
-
- /**
- * Read a single character from the readBuffer.
- * <p>The readDataChunk() method maintains the buffer.
- * <p>If we hit the end of an entity, try to pop the stack and
- * keep going.
- * <p>(This approach doesn't really enforce XML's rules about
- * entity boundaries, but this is not currently a validating
- * parser).
- * <p>This routine also attempts to keep track of the current
- * position in external entities, but it's not entirely accurate.
- * @return The next available input character.
- * @see #unread(char)
- * @see #unread(String)
- * @see #readDataChunk
- * @see #readBuffer
- * @see #line
- * @return The next character from the current input source.
- */
- char readCh ()
- throws java.lang.Exception
- {
- char c;
-
- // As long as there's nothing in the
- // read buffer, try reading more data
- // (for an external entity) or popping
- // the entity stack (for either).
- while (readBufferPos >= readBufferLength)
- {
- switch (sourceType)
- {
- case INPUT_READER:
- case INPUT_EXTERNAL:
- case INPUT_STREAM:
- readDataChunk();
- while (readBufferLength < 1)
- {
- popInput();
- if (readBufferLength <1)
- {
- readDataChunk();
- }
- }
- break;
-
- default:
- popInput();
- break;
- }
- }
-
- c = readBuffer[readBufferPos++];
-
- // This is a particularly nasty bit
- // of code, that checks for a parameter
- // entity reference but peeks ahead to
- // catch the '%' in parameter entity
- // declarations.
- if
- (
- c == '%' &&
- (context == CONTEXT_DTD || context == CONTEXT_ENTITYVALUE)
- )
- {
- char c2 = readCh();
- unread(c2);
- if (!isWhitespace(c2))
- {
- parsePEReference(context == CONTEXT_ENTITYVALUE);
- return readCh();
- }
- }
-
- if (c == '\n')
- {
- line++;
- column = 0;
- }
- else
- {
- column++;
- }
-
- return c;
- }
-
-
- /**
- * Push a single character back onto the current input stream.
- * <p>This method usually pushes the character back onto
- * the readBuffer, while the unread(String) method treats the
- * string as a new internal entity.
- * <p>I don't think that this would ever be called with
- * readBufferPos = 0, because the methods always reads a character
- * before unreading it, but just in case, I've added a boundary
- * condition.
- * @param c The character to push back.
- * @see #readCh
- * @see #unread(String)
- * @see #unread(char[])
- * @see #readBuffer
- */
- void unread (char c)
- throws java.lang.Exception
- {
- // Normal condition.
- if (c == '\n')
- {
- line--;
- column = -1;
- }
- if (readBufferPos > 0)
- {
- readBuffer[--readBufferPos] = c;
- }
- else
- {
- pushString(null, new Character(c).toString());
- }
- }
-
-
- /**
- * Push a char array back onto the current input stream.
- * <p>NOTE: you must <em>never</em> push back characters that you
- * haven't actually read: use pushString() instead.
- * @see #readCh
- * @see #unread(char)
- * @see #unread(String)
- * @see #readBuffer
- * @see #pushString
- */
- void unread (char ch[], int length)
- throws java.lang.Exception
- {
- for (int i = 0; i < length; i++)
- {
- if (ch[i] == '\n')
- {line--;column = -1;}
- }
- if (length < readBufferPos)
- {readBufferPos -= length;}
- else
- {
- pushCharArray(null, ch, 0, length);
- sourceType = INPUT_BUFFER;
- }
- }
-
-
- /**
- * Push a new external input source.
- * <p>The source will be either an external text entity, or the DTD
- * external subset.
- * <p>TO DO: Right now, this method always attempts to autodetect
- * the encoding; in the future, it should allow the caller to
- * request an encoding explicitly, and it should also look at the
- * headers with an HTTP connection.
- * @param url The java.net.URL object for the entity.
- * @see XmlHandler#resolveEntity
- * @see #pushString
- * @see #sourceType
- * @see #pushInput
- * @see #detectEncoding
- * @see #sourceType
- * @see #readBuffer
- */
- void pushURL (String ename, String publicId, String systemId,
- Reader reader, InputStream stream, String encoding)
- throws java.lang.Exception
- {
- URL url;
- boolean ignoreEncoding = false;
-
- // Push the existing status.
- pushInput(ename);
-
- // Create a new read buffer.
- // (Note the four-character margin)
- readBuffer = new char[READ_BUFFER_MAX+4];
- readBufferPos = 0;
- readBufferLength = 0;
- readBufferOverflow = -1;
- is = null;
- line = 1;
-
- currentByteCount = 0;
-
- // Flush any remaining data.
- dataBufferFlush();
-
- // Make the URL absolute.
- if (systemId != null && externalEntity != null) {
- systemId = new URL(externalEntity.getURL(), systemId).toString();
- } else if (baseURI != null) {
- try {
- systemId = new URL(new URL(baseURI), systemId).toString();
- } catch (Exception e) {}
- }
-
- // See if the application wants to
- // redirect the system ID and/or
- // supply its own character stream.
- if (systemId != null && handler != null) {
- Object input = handler.resolveEntity(publicId, systemId);
- if (input != null) {
- if (input instanceof String) {
- systemId = (String)input;
- } else if (input instanceof InputStream) {
- stream = (InputStream)input;
- } else if (input instanceof Reader) {
- reader = (Reader)input;
- }
- }
- }
-
- // Start the entity.
- if (handler != null) {
- if (systemId != null) {
- handler.startExternalEntity(systemId);
- } else {
- handler.startExternalEntity("[external stream]");
- }
- }
-
- // Figure out what we're reading from.
- if (reader != null) {
- // There's an explicit character stream.
- sourceType = INPUT_READER;
- this.reader = reader;
- tryEncodingDecl(true);
- return;
- } else if (stream != null) {
- sourceType = INPUT_STREAM;
- is = stream;
- } else {
- // We have to open our own stream
- // to the URL.
-
- // Set the new status
- sourceType = INPUT_EXTERNAL;
- url = new URL(systemId);
-
- externalEntity = url.openConnection();
- externalEntity.connect();
- is = externalEntity.getInputStream();
- }
-
- // If we get to here, there must be
- // an InputStream available.
- if (!is.markSupported()) {
- is = new BufferedInputStream(is);
- }
-
- // Attempt to detect the encoding.
- if (encoding == null && externalEntity != null) {
- encoding = externalEntity.getContentEncoding();
- }
-
- if (encoding != null) {
- checkEncoding(encoding, false);
- ignoreEncoding = true;
- } else {
- detectEncoding();
- ignoreEncoding = false;
- }
-
- // Read an XML or text declaration.
- tryEncodingDecl(ignoreEncoding);
- }
-
-
- /**
- * Check for an encoding declaration.
- */
- void tryEncodingDecl (boolean ignoreEncoding)
- throws java.lang.Exception
- {
- // Read the XML/Encoding declaration.
- if (tryRead("<?xml")) {
- if (tryWhitespace()) {
- if (inputStack.size() > 0) {
- parseTextDecl(ignoreEncoding);
- } else {
- parseXMLDecl(ignoreEncoding);
- }
- } else {
- unread("xml".toCharArray(), 3);
- parsePI();
- }
- }
- }
-
-
- /**
- * Attempt to detect the encoding of an entity.
- * <p>The trick here (as suggested in the XML standard) is that
- * any entity not in UTF-8, or in UCS-2 with a byte-order mark,
- * <b>must</b> begin with an XML declaration or an encoding
- * declaration; we simply have to look for "<?XML" in various
- * encodings.
- * <p>This method has no way to distinguish among 8-bit encodings.
- * Instead, it assumes UTF-8, then (possibly) revises its assumption
- * later in checkEncoding(). Any ASCII-derived 8-bit encoding
- * should work, but most will be rejected later by checkEncoding().
- * <p>I don't currently detect EBCDIC, since I'm concerned that it
- * could also be a valid UTF-8 sequence; I'll have to do more checking
- * later.
- * @see #tryEncoding(byte[], byte, byte, byte, byte)
- * @see #tryEncoding(byte[], byte, byte)
- * @see #checkEncoding
- * @see #read8bitEncodingDeclaration
- */
- void detectEncoding ()
- throws java.lang.Exception
- {
- byte signature[] = new byte[4];
-
- // Read the first four bytes for
- // autodetection.
- is.mark(4);
- is.read(signature);
- is.reset();
-
- // Look for a known signature.
- if (tryEncoding(signature, (byte)0x00, (byte)0x00,
- (byte)0x00, (byte)0x3c)) {
- // UCS-4 must begin with "<!XML"
- // 0x00 0x00 0x00 0x3c: UCS-4, big-endian (1234)
- encoding = ENCODING_UCS_4_1234;
- } else if (tryEncoding(signature, (byte)0x3c, (byte)0x00,
- (byte)0x00, (byte)0x00)) {
- // UCS-4 must begin with "<!XML"
- // 0x3c 0x00 0x00 0x00: UCS-4, little-endian (4321)
- encoding = ENCODING_UCS_4_4321;
- } else if (tryEncoding(signature, (byte)0x00, (byte)0x00,
- (byte)0x3c, (byte)0x00)) {
- // UCS-4 must begin with "<!XML"
- // 0x00 0x00 0x3c 0x00: UCS-4, unusual (2143)
- encoding = ENCODING_UCS_4_2143;
- } else if (tryEncoding(signature, (byte)0x00, (byte)0x3c,
- (byte)0x00, (byte)0x00)) {
- // UCS-4 must begin with "<!XML"
- // 0x00 0x3c 0x00 0x00: UCS-4, unusual (3421)
- encoding = ENCODING_UCS_4_3412;
- } else if (tryEncoding(signature, (byte)0xfe, (byte)0xff)) {
- // UCS-2 with a byte-order marker.
- // 0xfe 0xff: UCS-2, big-endian (12)
- encoding = ENCODING_UCS_2_12;
- is.read(); is.read();
- } else if (tryEncoding(signature, (byte)0xff, (byte)0xfe)) {
- // UCS-2 with a byte-order marker.
- // 0xff 0xfe: UCS-2, little-endian (21)
- encoding = ENCODING_UCS_2_21;
- is.read(); is.read();
- } else if (tryEncoding(signature, (byte)0x00, (byte)0x3c,
- (byte)0x00, (byte)0x3f)) {
- // UCS-2 without a BOM must begin with "<?XML"
- // 0x00 0x3c 0x00 0x3f: UCS-2, big-endian, no byte-order mark
- encoding = ENCODING_UCS_2_12;
- error("no byte-order mark for UCS-2 entity", null, null);
- } else if (tryEncoding(signature, (byte)0x3c, (byte)0x00,
- (byte)0x3f, (byte)0x00)) {
- // UCS-2 without a BOM must begin with "<?XML"
- // 0x3c 0x00 0x3f 0x00: UCS-2, little-endian, no byte-order mark
- encoding = ENCODING_UCS_2_21;
- error("no byte-order mark for UCS-2 entity", null, null);
- } else if (tryEncoding(signature, (byte)0x3c, (byte)0x3f,
- (byte)0x78, (byte)0x6d)) {
- // Some kind of 8-bit encoding with "<?XML"
- // 0x3c 0x3f 0x78 0x6d: UTF-8 or other 8-bit markup (read ENCODING)
- encoding = ENCODING_UTF_8;
- read8bitEncodingDeclaration();
- } else {
- // Some kind of 8-bit encoding without "<?XML"
- // (otherwise) UTF-8 without encoding/XML declaration
- encoding = ENCODING_UTF_8;
- }
- }
-
-
- /**
- * Check for a four-byte signature.
- * <p>Utility routine for detectEncoding().
- * <p>Always looks for some part of "<?XML" in a specific encoding.
- * @param sig The first four bytes read.
- * @param b1 The first byte of the signature
- * @param b2 The second byte of the signature
- * @param b3 The third byte of the signature
- * @param b4 The fourth byte of the signature
- * @see #detectEncoding
- */
- boolean tryEncoding (byte sig[], byte b1, byte b2, byte b3, byte b4)
- {
- return (sig[0] == b1 && sig[1] == b2 && sig[2] == b3 && sig[3] == b4);
- }
-
-
- /**
- * Check for a two-byte signature.
- * <p>Looks for a UCS-2 byte-order mark.
- * <p>Utility routine for detectEncoding().
- * @param sig The first four bytes read.
- * @param b1 The first byte of the signature
- * @param b2 The second byte of the signature
- * @see #detectEncoding
- */
- boolean tryEncoding (byte sig[], byte b1, byte b2)
- {
- return ((sig[0] == b1) && (sig[1] == b2));
- }
-
-
- /**
- * This method pushes a string back onto input.
- * <p>It is useful either as the expansion of an internal entity,
- * or for backtracking during the parse.
- * <p>Call pushCharArray() to do the actual work.
- * @param s The string to push back onto input.
- * @see #pushCharArray
- */
- void pushString (String ename, String s)
- throws java.lang.Exception
- {
- char ch[] = s.toCharArray();
- pushCharArray(ename, ch, 0, ch.length);
- }
-
-
- /**
- * Push a new internal input source.
- * <p>This method is useful for expanding an internal entity,
- * or for unreading a string of characters. It creates a new
- * readBuffer containing the characters in the array, instead
- * of characters converted from an input byte stream.
- * <p>I've added a couple of optimisations: don't push zero-
- * length strings, and just push back a single character
- * for 1-character strings; this should save some time and memory.
- * @param ch The char array to push.
- * @see #pushString
- * @see #pushURL
- * @see #readBuffer
- * @see #sourceType
- * @see #pushInput
- */
- void pushCharArray (String ename, char ch[], int start, int length)
- throws java.lang.Exception
- {
- // Push the existing status
- pushInput(ename);
- sourceType = INPUT_INTERNAL;
- readBuffer = ch;
- readBufferPos = start;
- readBufferLength = length;
- readBufferOverflow = -1;
- }
-
-
- /**
- * Save the current input source onto the stack.
- * <p>This method saves all of the global variables associated with
- * the current input source, so that they can be restored when a new
- * input source has finished. It also tests for entity recursion.
- * <p>The method saves the following global variables onto a stack
- * using a fixed-length array:
- * <ol>
- * <li>sourceType
- * <li>externalEntity
- * <li>readBuffer
- * <li>readBufferPos
- * <li>readBufferLength
- * <li>line
- * <li>encoding
- * </ol>
- * @param ename The name of the entity (if any) causing the new input.
- * @see #popInput
- * @see #sourceType
- * @see #externalEntity
- * @see #readBuffer
- * @see #readBufferPos
- * @see #readBufferLength
- * @see #line
- * @see #encoding
- */
- void pushInput (String ename)
- throws java.lang.Exception
- {
- Object input[] = new Object[12];
-
- // Check for entity recursion.
- if (ename != null) {
- Enumeration entities = entityStack.elements();
- while (entities.hasMoreElements()) {
- String e = (String)entities.nextElement();
- if (e == ename) {
- error("recursive reference to entity", ename, null);
- }
- }
- }
- entityStack.push(ename);
-
- // Don't bother if there is no input.
- if (sourceType == INPUT_NONE) {
- return;
- }
-
- // Set up a snapshot of the current
- // input source.
- input[0] = new Integer(sourceType);
- input[1] = externalEntity;
- input[2] = readBuffer;
- input[3] = new Integer(readBufferPos);
- input[4] = new Integer(readBufferLength);
- input[5] = new Integer(line);
- input[6] = new Integer(encoding);
- input[7] = new Integer(readBufferOverflow);
- input[8] = is;
- input[9] = new Integer(currentByteCount);
- input[10] = new Integer(column);
- input[11] = reader;
-
- // Push it onto the stack.
- inputStack.push(input);
- }
-
-
- /**
- * Restore a previous input source.
- * <p>This method restores all of the global variables associated with
- * the current input source.
- * @exception java.io.EOFException
- * If there are no more entries on the input stack.
- * @see #pushInput
- * @see #sourceType
- * @see #externalEntity
- * @see #readBuffer
- * @see #readBufferPos
- * @see #readBufferLength
- * @see #line
- * @see #encoding
- */
- void popInput ()
- throws java.lang.Exception
- {
- Object input[];
-
-
- switch (sourceType) {
-
- case INPUT_EXTERNAL:
- dataBufferFlush();
- if (handler != null && externalEntity != null) {
- handler.endExternalEntity(externalEntity.getURL().toString());
- }
- break;
- case INPUT_STREAM:
- dataBufferFlush();
- if (baseURI != null) {
- if (handler != null) {
- handler.endExternalEntity(baseURI);
- }
- }
- break;
- case INPUT_READER:
- dataBufferFlush();
- if (baseURI != null) {
- if (handler != null) {
- handler.endExternalEntity(baseURI);
- }
- }
- break;
- }
-
- // Throw an EOFException if there
- // is nothing else to pop.
- if (inputStack.isEmpty()) {
- throw new EOFException();
- } else {
- String s;
- input = (Object[])inputStack.pop();
- s = (String)entityStack.pop();
- }
-
- sourceType = ((Integer)input[0]).intValue();
- externalEntity = (URLConnection)input[1];
- readBuffer = (char[])input[2];
- readBufferPos = ((Integer)input[3]).intValue();
- readBufferLength = ((Integer)input[4]).intValue();
- line = ((Integer)input[5]).intValue();
- encoding = ((Integer)input[6]).intValue();
- readBufferOverflow = ((Integer)input[7]).intValue();
- is = (InputStream)input[8];
- currentByteCount = ((Integer)input[9]).intValue();
- column = ((Integer)input[10]).intValue();
- reader = (Reader)input[11];
- }
-
-
- /**
- * Return true if we can read the expected character.
- * <p>Note that the character will be removed from the input stream
- * on success, but will be put back on failure. Do not attempt to
- * read the character again if the method succeeds.
- * @param delim The character that should appear next. For a
- * insensitive match, you must supply this in upper-case.
- * @return true if the character was successfully read, or false if
- * it was not.
- * @see #tryRead(String)
- */
- boolean tryRead (char delim)
- throws java.lang.Exception
- {
- char c;
-
- // Read the character
- c = readCh();
-
- // Test for a match, and push the character
- // back if the match fails.
- if (c == delim) {
- return true;
- } else {
- unread(c);
- return false;
- }
- }
-
-
- /**
- * Return true if we can read the expected string.
- * <p>This is simply a convenience method.
- * <p>Note that the string will be removed from the input stream
- * on success, but will be put back on failure. Do not attempt to
- * read the string again if the method succeeds.
- * <p>This method will push back a character rather than an
- * array whenever possible (probably the majority of cases).
- * <p><b>NOTE:</b> This method currently has a hard-coded limit
- * of 100 characters for the delimiter.
- * @param delim The string that should appear next.
- * @return true if the string was successfully read, or false if
- * it was not.
- * @see #tryRead(char)
- */
- boolean tryRead (String delim)
- throws java.lang.Exception
- {
- char ch[] = delim.toCharArray();
- char c;
-
- // Compare the input, character-
- // by character.
-
- for (int i = 0; i < ch.length; i++)
- {
- c=readCh();
- if (c!=ch[i])
- {
- unread(c);
- if (i!=0)
- {unread(ch,i);}
- return false;
- }
- }
- return true;
- }
-
-
-
- /**
- * Return true if we can read some whitespace.
- * <p>This is simply a convenience method.
- * <p>This method will push back a character rather than an
- * array whenever possible (probably the majority of cases).
- * @return true if whitespace was found.
- */
- boolean tryWhitespace ()
- throws java.lang.Exception
- {
- char c;
- c = readCh();
- if (isWhitespace(c)) {
- skipWhitespace();
- return true;
- } else {
- unread(c);
- return false;
- }
- }
-
-
- /**
- * Read all data until we find the specified string.
- * <p>This is especially useful for scanning marked sections.
- * <p>This is a a little inefficient right now, since it calls tryRead()
- * for every character.
- * @param delim The string delimiter
- * @see #tryRead(String, boolean)
- * @see #readCh
- */
- void parseUntil (String delim)
- throws java.lang.Exception
- {
- char c;
- int startLine = line;
-
- try {
- while (!tryRead(delim)) {
- c = readCh();
- dataBufferAppend(c);
- }
- } catch (EOFException e) {
- error("end of input while looking for delimiter (started on line " +
- startLine + ')', null, delim);
- }
- }
-
-
- /**
- * Skip all data until we find the specified string.
- * <p>This is especially useful for scanning comments.
- * <p>This is a a little inefficient right now, since it calls tryRead()
- * for every character.
- * @param delim The string delimiter
- * @see #tryRead(String, boolean)
- * @see #readCh
- */
- void skipUntil (String delim)
- throws java.lang.Exception
- {
- while (!tryRead(delim)) {
- readCh();
- }
- }
-
-
- /**
- * Read just the encoding declaration (or XML declaration) at the
- * start of an external entity.
- * When this method is called, we know that the declaration is
- * present (or appears to be). We also know that the entity is
- * in some sort of ASCII-derived 8-bit encoding.
- * The idea of this is to let us read what the 8-bit encoding is
- * before we've committed to converting any more of the file; the
- * XML or encoding declaration must be in 7-bit ASCII, so we're
- * safe as long as we don't go past it.
- */
- void read8bitEncodingDeclaration ()
- throws java.lang.Exception
- {
- int ch;
- readBufferPos = readBufferLength = 0;
-
- while (true) {
- ch = is.read();
- readBuffer[readBufferLength++] = (char)ch;
- switch (ch) {
- case (int)'>':
- return;
- case -1:
- error("end of file before end of XML or encoding declaration.",
- null, "?>");
- return;
- }
- if (readBuffer.length == readBufferLength) {
- error("unfinished XML or encoding declaration", null, null);
- }
- }
- }
-
-
-
- //////////////////////////////////////////////////////////////////////
- // Low-level I/O.
- //////////////////////////////////////////////////////////////////////
-
-
- /**
- * Read a chunk of data from an external input source.
- * <p>This is simply a front-end that fills the rawReadBuffer
- * with bytes, then calls the appropriate encoding handler.
- * @see #encoding
- * @see #rawReadBuffer
- * @see #readBuffer
- * @see #filterCR
- * @see #copyUtf8ReadBuffer
- * @see #copyIso8859_1ReadBuffer
- * @see #copyUcs_2ReadBuffer
- * @see #copyUcs_4ReadBuffer
- */
- void readDataChunk ()
- throws java.lang.Exception
- {
- int count, i, j;
-
- // See if we have any overflow.
- if (readBufferOverflow > -1)
- {
- readBuffer[0] = (char)readBufferOverflow;
- readBufferOverflow = -1;
- readBufferPos = 1;
- sawCR = true;
- }
- else
- {
- readBufferPos = 0;
- sawCR = false;
- }
-
- // Special situation -- we're taking
- // input from a character stream.
- if (sourceType == INPUT_READER)
- {
- count = reader.read(readBuffer, readBufferPos, READ_BUFFER_MAX-1);
- if (count < 0)
- {readBufferLength = -1;}
- else
- {
- readBufferLength = readBufferPos+count;
- filterCR();
- sawCR = false;
- }
- return;
- }
-
- // Read as many bytes as possible
- // into the read buffer.
- count = is.read(rawReadBuffer, 0, READ_BUFFER_MAX);
-
- // Dispatch to an encoding-specific
- // reader method to populate the
- // readBuffer.
- switch (encoding)
- {
- case ENCODING_UTF_8:
- copyUtf8ReadBuffer(count);
- break;
-
- case ENCODING_ISO_8859_1:
- copyIso8859_1ReadBuffer(count);
- break;
-
- case ENCODING_UCS_2_12:
- copyUcs2ReadBuffer(count, 8, 0);
- break;
-
- case ENCODING_UCS_2_21:
- copyUcs2ReadBuffer(count, 0, 8);
- break;
-
- case ENCODING_UCS_4_1234:
- copyUcs4ReadBuffer(count, 24, 16, 8, 0);
- break;
-
- case ENCODING_UCS_4_4321:
- copyUcs4ReadBuffer(count, 0, 8, 16, 24);
- break;
-
- case ENCODING_UCS_4_2143:
- copyUcs4ReadBuffer(count, 16, 24, 0, 8);
- break;
-
- case ENCODING_UCS_4_3412:
- copyUcs4ReadBuffer(count, 8, 0, 24, 16);
- break;
- }
-
- // Filter out all carriage returns
- // if we've seen any.
- if (sawCR)
- {
- filterCR();
- sawCR = false;
- }
-
- // Reset the position.
- readBufferPos = 0;
- currentByteCount += count;
- }
-
-
- /**
- * Filter carriage returns in the read buffer.
- * <p>CRLF becomes LF; CR becomes LF.
- * @see #readDataChunk
- * @see #readBuffer
- * @see #readBufferOverflow
- */
- void filterCR ()
- {
- int i, j;
-
- readBufferOverflow = -1;
-
- loop: for (i = 0, j = 0; j < readBufferLength; i++, j++)
- {
- switch (readBuffer[j])
- {
- case '\r':
- if (j == readBufferLength - 1)
- {
- readBufferOverflow = '\r';
- readBufferLength--;
- break loop;
- }
- else if (readBuffer[j+1] == '\n')
- {j++;}
- readBuffer[i] = '\n';
- break;
-
- case '\n':
- default:
- readBuffer[i] = readBuffer[j];
- break;
- }
- }
- readBufferLength = i;
- }
-
-
- /**
- * Convert a buffer of UTF-8-encoded bytes into UTF-16 characters.
- * <p>When readDataChunk() calls this method, the raw bytes are in
- * rawReadBuffer, and the final characters will appear in
- * readBuffer.
- * <p>The tricky part of this is dealing with UTF-8 multi-byte
- * sequences, but it doesn't seem to slow things down too much.
- * @param count The number of bytes to convert.
- * @see #readDataChunk
- * @see #rawReadBuffer
- * @see #readBuffer
- * @see #getNextUtf8Byte
- */
- void copyUtf8ReadBuffer (int count)
- throws java.lang.Exception
- {
- int i = 0;
- int j = readBufferPos;
- int b1;
- boolean isSurrogate = false;
- while (i < count) {
- b1 = rawReadBuffer[i++];
- isSurrogate = false;
-
- // Determine whether we are dealing
- // with a one-, two-, three-, or four-
- // byte sequence.
- if ((b1 & 0x80) == 0) {
- // 1-byte sequence: 000000000xxxxxxx = 0xxxxxxx
- readBuffer[j++] = (char)b1;
- } else if ((b1 & 0xe0) == 0xc0) {
- // 2-byte sequence: 00000yyyyyxxxxxx = 110yyyyy 10xxxxxx
- readBuffer[j++] =
- (char)(((b1 & 0x1f) << 6) |
- getNextUtf8Byte(i++, count));
- } else if ((b1 & 0xf0) == 0xe0) {
- // 3-byte sequence: zzzzyyyyyyxxxxxx = 1110zzzz 10yyyyyy 10xxxxxx
- readBuffer[j++] =
- (char)(((b1 & 0x0f) << 12) |
- (getNextUtf8Byte(i++, count) << 6) |
- getNextUtf8Byte(i++, count));
- } else if ((b1 & 0xf8) == 0xf0) {
- // 4-byte sequence: 11101110wwwwzzzzyy + 110111yyyyxxxxxx
- // = 11110uuu 10uuzzzz 10yyyyyy 10xxxxxx
- // (uuuuu = wwww + 1)
- isSurrogate = true;
- int b2 = getNextUtf8Byte(i++, count);
- int b3 = getNextUtf8Byte(i++, count);
- int b4 = getNextUtf8Byte(i++, count);
- readBuffer[j++] =
- (char)(0xd800 |
- ((((b1 & 0x07) << 2) | ((b2 & 0x30) >> 4) - 1) << 6) |
- ((b2 & 0x0f) << 2) |
- ((b3 & 0x30) >> 4));
- readBuffer[j++] =
- (char)(0xdc |
- ((b3 & 0x0f) << 6) |
- b4);
- // TODO: test that surrogate value is legal.
- } else {
- // Otherwise, the 8th bit may not be set in UTF-8
- encodingError("bad start for UTF-8 multi-byte sequence", b1, i);
- }
- if (readBuffer[j-1] == '\r') {
- sawCR = true;
- }
- }
- // How many characters have we read?
- readBufferLength = j;
- }
-
-
- /**
- * Return the next byte value in a UTF-8 sequence.
- * If it is not possible to get a byte from the current
- * entity, throw an exception.
- * @param pos The current position in the rawReadBuffer.
- * @param count The number of bytes in the rawReadBuffer
- * @return The significant six bits of a non-initial byte in
- * a UTF-8 sequence.
- * @exception EOFException If the sequence is incomplete.
- */
- int getNextUtf8Byte (int pos, int count)
- throws java.lang.Exception
- {
- int val;
-
- // Take a character from the buffer
- // or from the actual input stream.
- if (pos < count) {
- val = rawReadBuffer[pos];
- } else {
- val = is.read();
- if (val == -1) {
- encodingError("unfinished multi-byte UTF-8 sequence at EOF", -1, pos);
- }
- }
-
- // Check for the correct bits at the
- // start.
- if ((val & 0xc0) != 0x80) {
- encodingError("bad continuation of multi-byte UTF-8 sequence", val,
- pos + 1);
- }
-
- // Return the significant bits.
- return (val & 0x3f);
- }
-
-
- /**
- * Convert a buffer of ISO-8859-1-encoded bytes into UTF-16 characters.
- * <p>When readDataChunk() calls this method, the raw bytes are in
- * rawReadBuffer, and the final characters will appear in
- * readBuffer.
- * <p>This is a direct conversion, with no tricks.
- * @param count The number of bytes to convert.
- * @see #readDataChunk
- * @see #rawReadBuffer
- * @see #readBuffer
- */
- void copyIso8859_1ReadBuffer (int count)
- {
- int i, j;
- for (i = 0, j = readBufferPos; i < count; i++, j++) {
- readBuffer[j] = (char)(rawReadBuffer[i] & 0xff);
- if (readBuffer[j] == '\r') {
- sawCR = true;
- }
- }
- readBufferLength = j;
- }
-
-
- /**
- * Convert a buffer of UCS-2-encoded bytes into UTF-16 characters.
- * <p>When readDataChunk() calls this method, the raw bytes are in
- * rawReadBuffer, and the final characters will appear in
- * readBuffer.
- * @param count The number of bytes to convert.
- * @param shift1 The number of bits to shift byte 1.
- * @param shift2 The number of bits to shift byte 2
- * @see #readDataChunk
- * @see #rawReadBuffer
- * @see #readBuffer
- */
- void copyUcs2ReadBuffer (int count, int shift1, int shift2)
- throws java.lang.Exception
- {
- int j = readBufferPos;
-
- if (count > 0 && (count % 2) != 0) {
- encodingError("odd number of bytes in UCS-2 encoding", -1, count);
- }
- for (int i = 0; i < count; i+=2) {
- readBuffer[j++] =
- (char)(((rawReadBuffer[i] & 0xff) << shift1) |
- ((rawReadBuffer[i+1] & 0xff) << shift2));
- if (readBuffer[j-1] == '\r') {
- sawCR = true;
- }
- }
- readBufferLength = j;
- }
-
-
- /**
- * Convert a buffer of UCS-4-encoded bytes into UTF-16 characters.
- * <p>When readDataChunk() calls this method, the raw bytes are in
- * rawReadBuffer, and the final characters will appear in
- * readBuffer.
- * <p>Java has 16-bit chars, but this routine will attempt to use
- * surrogates to encoding values between 0x00010000 and 0x000fffff.
- * @param count The number of bytes to convert.
- * @param shift1 The number of bits to shift byte 1.
- * @param shift2 The number of bits to shift byte 2
- * @param shift3 The number of bits to shift byte 2
- * @param shift4 The number of bits to shift byte 2
- * @see #readDataChunk
- * @see #rawReadBuffer
- * @see #readBuffer
- */
- void copyUcs4ReadBuffer (int count, int shift1, int shift2,
- int shift3, int shift4)
- throws java.lang.Exception
- {
- int j = readBufferPos;
- int value;
-
- if (count > 0 && (count % 4) != 0) {
- encodingError("number of bytes in UCS-4 encoding not divisible by 4",
- -1, count);
- }
- for (int i = 0; i < count; i+=4) {
- value = (((rawReadBuffer[i] & 0xff) << shift1) |
- ((rawReadBuffer[i+1] & 0xff) << shift2) |
- ((rawReadBuffer[i+2] & 0xff) << shift3) |
- ((rawReadBuffer[i+3] & 0xff) << shift4));
- if (value < 0x0000ffff) {
- readBuffer[j++] = (char)value;
- if (value == (int)'\r') {
- sawCR = true;
- }
- } else if (value < 0x000fffff) {
- readBuffer[j++] = (char)(0xd8 | ((value & 0x000ffc00) >> 10));
- readBuffer[j++] = (char)(0xdc | (value & 0x0003ff));
- } else {
- encodingError("value cannot be represented in UTF-16",
- value, i);
- }
- }
- readBufferLength = j;
- }
-
-
- /**
- * Report a character encoding error.
- */
- void encodingError (String message, int value, int offset)
- throws java.lang.Exception
- {
- String uri;
-
- if (value >= 0) {
- message = message + " (byte value: 0x" +
- Integer.toHexString(value) + ')';
- }
- if (externalEntity != null) {
- uri = externalEntity.getURL().toString();
- } else {
- uri = baseURI;
- }
- handler.error(message, uri, -1, offset + currentByteCount);
- }
-
-
-
- //////////////////////////////////////////////////////////////////////
- // Local Variables.
- //////////////////////////////////////////////////////////////////////
-
- /**
- * Re-initialize the variables for each parse.
- */
- void initializeVariables ()
- {
- // No errors; first line
- errorCount = 0;
- line = 1;
- column = 0;
-
- // Set up the buffers for data and names
- dataBufferPos = 0;
- dataBuffer = new char[DATA_BUFFER_INITIAL];
- nameBufferPos = 0;
- nameBuffer = new char[NAME_BUFFER_INITIAL];
-
- // Set up the DTD hash tables
- elementInfo = new Hashtable();
- entityInfo = new Hashtable();
- notationInfo = new Hashtable();
-
- // Set up the variables for the current
- // element context.
- currentElement = null;
- currentElementContent = CONTENT_UNDECLARED;
-
- // Set up the input variables
- sourceType = INPUT_NONE;
- inputStack = new Stack();
- entityStack = new Stack();
- externalEntity = null;
- tagAttributePos = 0;
- tagAttributes = new String[100];
- rawReadBuffer = new byte[READ_BUFFER_MAX];
- readBufferOverflow = -1;
-
- context = CONTEXT_NONE;
-
- symbolTable = new Object[SYMBOL_TABLE_LENGTH];
- }
-
-
- /**
- * Clean up after the parse to allow some garbage collection.
- * Leave around anything that might be useful for queries.
- */
- void cleanupVariables ()
- {
- errorCount = -1;
- line = -1;
- column = -1;
- dataBuffer = null;
- nameBuffer = null;
- currentElement = null;
- currentElementContent = CONTENT_UNDECLARED;
- sourceType = INPUT_NONE;
- inputStack = null;
- externalEntity = null;
- entityStack = null;
- }
-
- //
- // The current XML handler interface.
- //
- XmlHandler handler;
-
- //
- // I/O information.
- //
- private Reader reader; // current reader
- private InputStream is; // current input stream
- private int line; // current line number
- private int column; // current column number
- private int sourceType; // type of input source
- private Stack inputStack; // stack of input soruces
- private URLConnection externalEntity; // current external entity
- private int encoding; // current character encoding.
- private int currentByteCount; // how many bytes read from current source.
-
- //
- // Maintain a count of errors.
- //
- private int errorCount;
-
- //
- // Buffers for decoded but unparsed character input.
- //
- private final static int READ_BUFFER_MAX = 16384;
- private char readBuffer[];
- private int readBufferPos;
- private int readBufferLength;
- private int readBufferOverflow; // overflow character from last data chunk.
-
-
- //
- // Buffer for undecoded raw byte input.
- //
- private byte rawReadBuffer[];
-
-
- //
- // Buffer for parsed character data.
- //
- private static int DATA_BUFFER_INITIAL = 4096;
- private char dataBuffer[];
- private int dataBufferPos;
-
- //
- // Buffer for parsed names.
- //
- private static int NAME_BUFFER_INITIAL = 1024;
- private char nameBuffer[];
- private int nameBufferPos;
-
-
- //
- // Hashtables for DTD information on elements, entities, and notations.
- //
- private Hashtable elementInfo;
- private Hashtable entityInfo;
- private Hashtable notationInfo;
-
-
- //
- // Element type currently in force.
- //
- private String currentElement;
- private int currentElementContent;
-
- //
- // Base external identifiers for resolution.
- //
- private String basePublicId;
- private String baseURI;
- private int baseEncoding;
- private Reader baseReader;
- private InputStream baseInputStream;
- private char baseInputBuffer[];
- private int baseInputBufferStart;
- private int baseInputBufferLength;
-
- //
- // Stack of entity names, to help detect recursion.
- //
- private Stack entityStack;
-
- //
- // Are we in a context where PEs are allowed?
- //
- private int context;
-
- //
- // Symbol table, for internalising names.
- //
- private Object symbolTable[];
- private final static int SYMBOL_TABLE_LENGTH = 1087;
-
- //
- // Hash table of attributes found in current start tag.
- //
- private String tagAttributes[];
- private int tagAttributePos;
-
- //
- // Utility flag: have we noticed a CR while reading the last
- // data chunk? If so, we will have to go back and normalise
- // CR/LF.
- //
- private boolean sawCR;
-}
diff --git a/jEdit/com/microstar/xml/package.html b/jEdit/com/microstar/xml/package.html
deleted file mode 100644
index 44b8973..0000000
--- a/jEdit/com/microstar/xml/package.html
+++ /dev/null
@@ -1,6 +0,0 @@
-
-<html>
-<body>
-An obsolete and deprecated XML parser. Please use a SAX2 compliant parser such as one from org.xml.sax.helpers.XMLReaderFactory, or a SAX1 parser from { @ref MiscUtilities.parseXML(). }. This package will be removed from jEdit before 4.4 final is released.
-</body>
-</html>
\ No newline at end of file
diff --git a/jEdit/de/masters_of_disaster/ant/tasks/ar/Ar.java b/jEdit/de/masters_of_disaster/ant/tasks/ar/Ar.java
index c4e8350..bc97798 100644
--- a/jEdit/de/masters_of_disaster/ant/tasks/ar/Ar.java
+++ b/jEdit/de/masters_of_disaster/ant/tasks/ar/Ar.java
@@ -1,468 +1,468 @@
-package de.masters_of_disaster.ant.tasks.ar;
-
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.Enumeration;
-import java.util.Vector;
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.DirectoryScanner;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.taskdefs.MatchingTask;
-import org.apache.tools.ant.types.EnumeratedAttribute;
-import org.apache.tools.ant.types.FileSet;
-import org.apache.tools.ant.util.FileUtils;
-import org.apache.tools.ant.util.MergingMapper;
-import org.apache.tools.ant.util.SourceFileScanner;
-import org.apache.tools.zip.UnixStat;
-
-/**
- * Creates an ar archive.
- *
- * @ant.task category="packaging"
- */
-public class Ar extends MatchingTask {
- File destFile;
- File baseDir;
-
- private ArLongFileMode longFileMode = new ArLongFileMode();
-
- Vector filesets = new Vector();
-
- /**
- * Indicates whether the user has been warned about long files already.
- */
- private boolean longWarningGiven = false;
-
- /**
- * Add a new fileset with the option to specify permissions
- * @return the ar fileset to be used as the nested element.
- */
- public ArFileSet createArFileSet() {
- ArFileSet fileset = new ArFileSet();
- filesets.addElement(fileset);
- return fileset;
- }
-
-
- /**
- * Set the name/location of where to create the ar file.
- * @param destFile The output of the tar
- */
- public void setDestFile(File destFile) {
- this.destFile = destFile;
- }
-
- /**
- * This is the base directory to look in for things to ar.
- * @param baseDir the base directory.
- */
- public void setBasedir(File baseDir) {
- this.baseDir = baseDir;
- }
-
- /**
- * Set how to handle long files, those with a name>16 chars or containing spaces.
- * Optional, default=warn.
- * <p>
- * Allowable values are
- * <ul>
- * <li> truncate - names are truncated to the maximum length, spaces are replaced by '_'
- * <li> fail - names greater than the maximum cause a build exception
- * <li> warn - names greater than the maximum cause a warning and TRUNCATE is used
- * <li> bsd - BSD variant is used if any names are greater than the maximum.
- * <li> gnu - GNU variant is used if any names are greater than the maximum.
- * <li> omit - files with a name greater than the maximum are omitted from the archive
- * </ul>
- * @param mode the mode to handle long file names.
- */
- public void setLongfile(ArLongFileMode mode) {
- this.longFileMode = mode;
- }
-
- /**
- * do the business
- * @throws BuildException on error
- */
- public void execute() throws BuildException {
- if (destFile == null) {
- throw new BuildException("destFile attribute must be set!",
- getLocation());
- }
-
- if (destFile.exists() && destFile.isDirectory()) {
- throw new BuildException("destFile is a directory!",
- getLocation());
- }
-
- if (destFile.exists() && !destFile.canWrite()) {
- throw new BuildException("Can not write to the specified destFile!",
- getLocation());
- }
-
- Vector savedFileSets = (Vector) filesets.clone();
- try {
- if (baseDir != null) {
- if (!baseDir.exists()) {
- throw new BuildException("basedir does not exist!",
- getLocation());
- }
-
- // add the main fileset to the list of filesets to process.
- ArFileSet mainFileSet = new ArFileSet(fileset);
- mainFileSet.setDir(baseDir);
- filesets.addElement(mainFileSet);
- }
-
- if (filesets.size() == 0) {
- throw new BuildException("You must supply either a basedir "
- + "attribute or some nested filesets.",
- getLocation());
- }
-
- // check if ar is out of date with respect to each
- // fileset
- boolean upToDate = true;
- for (Enumeration e = filesets.elements(); e.hasMoreElements();) {
- ArFileSet fs = (ArFileSet) e.nextElement();
- String[] files = fs.getFiles(getProject());
-
- if (!archiveIsUpToDate(files, fs.getDir(getProject()))) {
- upToDate = false;
- }
-
- for (int i = 0; i < files.length; ++i) {
- if (destFile.equals(new File(fs.getDir(getProject()),
- files[i]))) {
- throw new BuildException("An ar file cannot include "
- + "itself", getLocation());
- }
- }
- }
-
- if (upToDate) {
- log("Nothing to do: " + destFile.getAbsolutePath()
- + " is up to date.", Project.MSG_INFO);
- return;
- }
-
- log("Building ar: " + destFile.getAbsolutePath(), Project.MSG_INFO);
-
- ArOutputStream aOut = null;
- try {
- aOut = new ArOutputStream(
- new BufferedOutputStream(
- new FileOutputStream(destFile)));
- if (longFileMode.isTruncateMode()
- || longFileMode.isWarnMode()) {
- aOut.setLongFileMode(ArOutputStream.LONGFILE_TRUNCATE);
- } else if (longFileMode.isFailMode()
- || longFileMode.isOmitMode()) {
- aOut.setLongFileMode(ArOutputStream.LONGFILE_ERROR);
- } else if (longFileMode.isBsdMode()) {
- aOut.setLongFileMode(ArOutputStream.LONGFILE_BSD);
- } else {
- // GNU
- aOut.setLongFileMode(ArOutputStream.LONGFILE_GNU);
- }
-
- longWarningGiven = false;
- for (Enumeration e = filesets.elements();
- e.hasMoreElements();) {
- ArFileSet fs = (ArFileSet) e.nextElement();
- String[] files = fs.getFiles(getProject());
- if (files.length > 1 && fs.getFullpath().length() > 0) {
- throw new BuildException("fullpath attribute may only "
- + "be specified for "
- + "filesets that specify a "
- + "single file.");
- }
- for (int i = 0; i < files.length; i++) {
- File f = new File(fs.getDir(getProject()), files[i]);
- arFile(f, aOut, fs);
- }
- }
- } catch (IOException ioe) {
- String msg = "Problem creating AR: " + ioe.getMessage();
- throw new BuildException(msg, ioe, getLocation());
- } finally {
- FileUtils.close(aOut);
- }
- } finally {
- filesets = savedFileSets;
- }
- }
-
- /**
- * ar a file
- * @param file the file to ar
- * @param aOut the output stream
- * @param arFileSet the fileset that the file came from.
- * @throws IOException on error
- */
- protected void arFile(File file, ArOutputStream aOut, ArFileSet arFileSet)
- throws IOException {
- FileInputStream fIn = null;
-
- if (file.isDirectory()) {
- return;
- }
-
- String fileName = file.getName();
-
- String fullpath = arFileSet.getFullpath();
- if (fullpath.length() > 0) {
- fileName = fullpath.substring(fullpath.lastIndexOf('/'));
- }
-
- // don't add "" to the archive
- if (fileName.length() <= 0) {
- return;
- }
-
- try {
- if ((fileName.length() >= ArConstants.NAMELEN)
- || (-1 != fileName.indexOf(' '))) {
- if (longFileMode.isOmitMode()) {
- log("Omitting: " + fileName, Project.MSG_INFO);
- return;
- } else if (longFileMode.isWarnMode()) {
- if (!longWarningGiven) {
- log("Resulting ar file contains truncated or space converted filenames",
- Project.MSG_WARN);
- longWarningGiven = true;
- }
- log("Entry: \"" + fileName + "\" longer than "
- + ArConstants.NAMELEN + " characters or containing spaces.",
- Project.MSG_WARN);
- } else if (longFileMode.isFailMode()) {
- throw new BuildException("Entry: \"" + fileName
- + "\" longer than " + ArConstants.NAMELEN
- + "characters or containting spaces.", getLocation());
- }
- }
-
- ArEntry ae = new ArEntry(fileName);
- ae.setFileDate(file.lastModified());
- ae.setUserId(arFileSet.getUid());
- ae.setGroupId(arFileSet.getGid());
- ae.setMode(arFileSet.getMode());
- ae.setSize(file.length());
-
- aOut.putNextEntry(ae);
-
- fIn = new FileInputStream(file);
-
- byte[] buffer = new byte[8 * 1024];
- int count = 0;
- do {
- aOut.write(buffer, 0, count);
- count = fIn.read(buffer, 0, buffer.length);
- } while (count != -1);
-
- aOut.closeEntry();
- } finally {
- if (fIn != null) {
- fIn.close();
- }
- }
- }
-
- /**
- * Is the archive up to date in relationship to a list of files.
- * @param files the files to check
- * @param dir the base directory for the files.
- * @return true if the archive is up to date.
- */
- protected boolean archiveIsUpToDate(String[] files, File dir) {
- SourceFileScanner sfs = new SourceFileScanner(this);
- MergingMapper mm = new MergingMapper();
- mm.setTo(destFile.getAbsolutePath());
- return sfs.restrict(files, dir, null, mm).length == 0;
- }
-
- /**
- * This is a FileSet with the option to specify permissions
- * and other attributes.
- */
- public static class ArFileSet extends FileSet {
- private String[] files = null;
-
- private int fileMode = UnixStat.FILE_FLAG | UnixStat.DEFAULT_FILE_PERM;
- private int uid;
- private int gid;
- private String fullpath = "";
-
- /**
- * Creates a new <code>ArFileSet</code> instance.
- * Using a fileset as a constructor argument.
- *
- * @param fileset a <code>FileSet</code> value
- */
- public ArFileSet(FileSet fileset) {
- super(fileset);
- }
-
- /**
- * Creates a new <code>ArFileSet</code> instance.
- *
- */
- public ArFileSet() {
- super();
- }
-
- /**
- * Get a list of files and directories specified in the fileset.
- * @param p the current project.
- * @return a list of file and directory names, relative to
- * the baseDir for the project.
- */
- public String[] getFiles(Project p) {
- if (files == null) {
- DirectoryScanner ds = getDirectoryScanner(p);
- files = ds.getIncludedFiles();
- }
-
- return files;
- }
-
- /**
- * A 3 digit octal string, specify the user, group and
- * other modes in the standard Unix fashion;
- * optional, default=0644
- * @param octalString a 3 digit octal string.
- */
- public void setMode(String octalString) {
- this.fileMode =
- UnixStat.FILE_FLAG | Integer.parseInt(octalString, 8);
- }
-
- /**
- * @return the current mode.
- */
- public int getMode() {
- return fileMode;
- }
-
- /**
- * The UID for the ar entry; optional, default="0"
- * @param uid the id of the user for the ar entry.
- */
- public void setUid(int uid) {
- this.uid = uid;
- }
-
- /**
- * @return the UID for the ar entry
- */
- public int getUid() {
- return uid;
- }
-
- /**
- * The GID for the ar entry; optional, default="0"
- * @param gid the group id.
- */
- public void setGid(int gid) {
- this.gid = gid;
- }
-
- /**
- * @return the group identifier.
- */
- public int getGid() {
- return gid;
- }
-
- /**
- * If the fullpath attribute is set, the file in the fileset
- * is written with the last part of the path in the archive.
- * If the fullpath ends in '/' the file is omitted from the archive.
- * It is an error to have more than one file specified in such a fileset.
- * @param fullpath the path to use for the file in a fileset.
- */
- public void setFullpath(String fullpath) {
- this.fullpath = fullpath;
- }
-
- /**
- * @return the path to use for a single file fileset.
- */
- public String getFullpath() {
- return fullpath;
- }
- }
-
- /**
- * Set of options for long file handling in the task.
- */
- public static class ArLongFileMode extends EnumeratedAttribute {
- /** permissible values for longfile attribute */
- public static final String
- WARN = "warn",
- FAIL = "fail",
- TRUNCATE = "truncate",
- GNU = "gnu",
- BSD = "bsd",
- OMIT = "omit";
-
- private final String[] validModes = {WARN, FAIL, TRUNCATE, GNU, BSD, OMIT};
-
- /** Constructor, defaults to "warn" */
- public ArLongFileMode() {
- super();
- setValue(WARN);
- }
-
- /**
- * @return the possible values for this enumerated type.
- */
- public String[] getValues() {
- return validModes;
- }
-
- /**
- * @return true if value is "truncate".
- */
- public boolean isTruncateMode() {
- return TRUNCATE.equalsIgnoreCase(getValue());
- }
-
- /**
- * @return true if value is "warn".
- */
- public boolean isWarnMode() {
- return WARN.equalsIgnoreCase(getValue());
- }
-
- /**
- * @return true if value is "gnu".
- */
- public boolean isGnuMode() {
- return GNU.equalsIgnoreCase(getValue());
- }
-
- /**
- * @return true if value is "bsd".
- */
- public boolean isBsdMode() {
- return BSD.equalsIgnoreCase(getValue());
- }
-
- /**
- * @return true if value is "fail".
- */
- public boolean isFailMode() {
- return FAIL.equalsIgnoreCase(getValue());
- }
-
- /**
- * @return true if value is "omit".
- */
- public boolean isOmitMode() {
- return OMIT.equalsIgnoreCase(getValue());
- }
- }
-}
+package de.masters_of_disaster.ant.tasks.ar;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.Vector;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.DirectoryScanner;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.taskdefs.MatchingTask;
+import org.apache.tools.ant.types.EnumeratedAttribute;
+import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.util.FileUtils;
+import org.apache.tools.ant.util.MergingMapper;
+import org.apache.tools.ant.util.SourceFileScanner;
+import org.apache.tools.zip.UnixStat;
+
+/**
+ * Creates an ar archive.
+ *
+ * @ant.task category="packaging"
+ */
+public class Ar extends MatchingTask {
+ File destFile;
+ File baseDir;
+
+ private ArLongFileMode longFileMode = new ArLongFileMode();
+
+ Vector filesets = new Vector();
+
+ /**
+ * Indicates whether the user has been warned about long files already.
+ */
+ private boolean longWarningGiven = false;
+
+ /**
+ * Add a new fileset with the option to specify permissions
+ * @return the ar fileset to be used as the nested element.
+ */
+ public ArFileSet createArFileSet() {
+ ArFileSet fileset = new ArFileSet();
+ filesets.addElement(fileset);
+ return fileset;
+ }
+
+
+ /**
+ * Set the name/location of where to create the ar file.
+ * @param destFile The output of the tar
+ */
+ public void setDestFile(File destFile) {
+ this.destFile = destFile;
+ }
+
+ /**
+ * This is the base directory to look in for things to ar.
+ * @param baseDir the base directory.
+ */
+ public void setBasedir(File baseDir) {
+ this.baseDir = baseDir;
+ }
+
+ /**
+ * Set how to handle long files, those with a name>16 chars or containing spaces.
+ * Optional, default=warn.
+ * <p>
+ * Allowable values are
+ * <ul>
+ * <li> truncate - names are truncated to the maximum length, spaces are replaced by '_'
+ * <li> fail - names greater than the maximum cause a build exception
+ * <li> warn - names greater than the maximum cause a warning and TRUNCATE is used
+ * <li> bsd - BSD variant is used if any names are greater than the maximum.
+ * <li> gnu - GNU variant is used if any names are greater than the maximum.
+ * <li> omit - files with a name greater than the maximum are omitted from the archive
+ * </ul>
+ * @param mode the mode to handle long file names.
+ */
+ public void setLongfile(ArLongFileMode mode) {
+ this.longFileMode = mode;
+ }
+
+ /**
+ * do the business
+ * @throws BuildException on error
+ */
+ public void execute() throws BuildException {
+ if (destFile == null) {
+ throw new BuildException("destFile attribute must be set!",
+ getLocation());
+ }
+
+ if (destFile.exists() && destFile.isDirectory()) {
+ throw new BuildException("destFile is a directory!",
+ getLocation());
+ }
+
+ if (destFile.exists() && !destFile.canWrite()) {
+ throw new BuildException("Can not write to the specified destFile!",
+ getLocation());
+ }
+
+ Vector savedFileSets = (Vector) filesets.clone();
+ try {
+ if (baseDir != null) {
+ if (!baseDir.exists()) {
+ throw new BuildException("basedir does not exist!",
+ getLocation());
+ }
+
+ // add the main fileset to the list of filesets to process.
+ ArFileSet mainFileSet = new ArFileSet(fileset);
+ mainFileSet.setDir(baseDir);
+ filesets.addElement(mainFileSet);
+ }
+
+ if (filesets.size() == 0) {
+ throw new BuildException("You must supply either a basedir "
+ + "attribute or some nested filesets.",
+ getLocation());
+ }
+
+ // check if ar is out of date with respect to each
+ // fileset
+ boolean upToDate = true;
+ for (Enumeration e = filesets.elements(); e.hasMoreElements();) {
+ ArFileSet fs = (ArFileSet) e.nextElement();
+ String[] files = fs.getFiles(getProject());
+
+ if (!archiveIsUpToDate(files, fs.getDir(getProject()))) {
+ upToDate = false;
+ }
+
+ for (int i = 0; i < files.length; ++i) {
+ if (destFile.equals(new File(fs.getDir(getProject()),
+ files[i]))) {
+ throw new BuildException("An ar file cannot include "
+ + "itself", getLocation());
+ }
+ }
+ }
+
+ if (upToDate) {
+ log("Nothing to do: " + destFile.getAbsolutePath()
+ + " is up to date.", Project.MSG_INFO);
+ return;
+ }
+
+ log("Building ar: " + destFile.getAbsolutePath(), Project.MSG_INFO);
+
+ ArOutputStream aOut = null;
+ try {
+ aOut = new ArOutputStream(
+ new BufferedOutputStream(
+ new FileOutputStream(destFile)));
+ if (longFileMode.isTruncateMode()
+ || longFileMode.isWarnMode()) {
+ aOut.setLongFileMode(ArOutputStream.LONGFILE_TRUNCATE);
+ } else if (longFileMode.isFailMode()
+ || longFileMode.isOmitMode()) {
+ aOut.setLongFileMode(ArOutputStream.LONGFILE_ERROR);
+ } else if (longFileMode.isBsdMode()) {
+ aOut.setLongFileMode(ArOutputStream.LONGFILE_BSD);
+ } else {
+ // GNU
+ aOut.setLongFileMode(ArOutputStream.LONGFILE_GNU);
+ }
+
+ longWarningGiven = false;
+ for (Enumeration e = filesets.elements();
+ e.hasMoreElements();) {
+ ArFileSet fs = (ArFileSet) e.nextElement();
+ String[] files = fs.getFiles(getProject());
+ if (files.length > 1 && fs.getFullpath().length() > 0) {
+ throw new BuildException("fullpath attribute may only "
+ + "be specified for "
+ + "filesets that specify a "
+ + "single file.");
+ }
+ for (int i = 0; i < files.length; i++) {
+ File f = new File(fs.getDir(getProject()), files[i]);
+ arFile(f, aOut, fs);
+ }
+ }
+ } catch (IOException ioe) {
+ String msg = "Problem creating AR: " + ioe.getMessage();
+ throw new BuildException(msg, ioe, getLocation());
+ } finally {
+ FileUtils.close(aOut);
+ }
+ } finally {
+ filesets = savedFileSets;
+ }
+ }
+
+ /**
+ * ar a file
+ * @param file the file to ar
+ * @param aOut the output stream
+ * @param arFileSet the fileset that the file came from.
+ * @throws IOException on error
+ */
+ protected void arFile(File file, ArOutputStream aOut, ArFileSet arFileSet)
+ throws IOException {
+ FileInputStream fIn = null;
+
+ if (file.isDirectory()) {
+ return;
+ }
+
+ String fileName = file.getName();
+
+ String fullpath = arFileSet.getFullpath();
+ if (fullpath.length() > 0) {
+ fileName = fullpath.substring(fullpath.lastIndexOf('/'));
+ }
+
+ // don't add "" to the archive
+ if (fileName.length() <= 0) {
+ return;
+ }
+
+ try {
+ if ((fileName.length() >= ArConstants.NAMELEN)
+ || (-1 != fileName.indexOf(' '))) {
+ if (longFileMode.isOmitMode()) {
+ log("Omitting: " + fileName, Project.MSG_INFO);
+ return;
+ } else if (longFileMode.isWarnMode()) {
+ if (!longWarningGiven) {
+ log("Resulting ar file contains truncated or space converted filenames",
+ Project.MSG_WARN);
+ longWarningGiven = true;
+ }
+ log("Entry: \"" + fileName + "\" longer than "
+ + ArConstants.NAMELEN + " characters or containing spaces.",
+ Project.MSG_WARN);
+ } else if (longFileMode.isFailMode()) {
+ throw new BuildException("Entry: \"" + fileName
+ + "\" longer than " + ArConstants.NAMELEN
+ + "characters or containting spaces.", getLocation());
+ }
+ }
+
+ ArEntry ae = new ArEntry(fileName);
+ ae.setFileDate(file.lastModified());
+ ae.setUserId(arFileSet.getUid());
+ ae.setGroupId(arFileSet.getGid());
+ ae.setMode(arFileSet.getMode());
+ ae.setSize(file.length());
+
+ aOut.putNextEntry(ae);
+
+ fIn = new FileInputStream(file);
+
+ byte[] buffer = new byte[8 * 1024];
+ int count = 0;
+ do {
+ aOut.write(buffer, 0, count);
+ count = fIn.read(buffer, 0, buffer.length);
+ } while (count != -1);
+
+ aOut.closeEntry();
+ } finally {
+ if (fIn != null) {
+ fIn.close();
+ }
+ }
+ }
+
+ /**
+ * Is the archive up to date in relationship to a list of files.
+ * @param files the files to check
+ * @param dir the base directory for the files.
+ * @return true if the archive is up to date.
+ */
+ protected boolean archiveIsUpToDate(String[] files, File dir) {
+ SourceFileScanner sfs = new SourceFileScanner(this);
+ MergingMapper mm = new MergingMapper();
+ mm.setTo(destFile.getAbsolutePath());
+ return sfs.restrict(files, dir, null, mm).length == 0;
+ }
+
+ /**
+ * This is a FileSet with the option to specify permissions
+ * and other attributes.
+ */
+ public static class ArFileSet extends FileSet {
+ private String[] files = null;
+
+ private int fileMode = UnixStat.FILE_FLAG | UnixStat.DEFAULT_FILE_PERM;
+ private int uid;
+ private int gid;
+ private String fullpath = "";
+
+ /**
+ * Creates a new <code>ArFileSet</code> instance.
+ * Using a fileset as a constructor argument.
+ *
+ * @param fileset a <code>FileSet</code> value
+ */
+ public ArFileSet(FileSet fileset) {
+ super(fileset);
+ }
+
+ /**
+ * Creates a new <code>ArFileSet</code> instance.
+ *
+ */
+ public ArFileSet() {
+ super();
+ }
+
+ /**
+ * Get a list of files and directories specified in the fileset.
+ * @param p the current project.
+ * @return a list of file and directory names, relative to
+ * the baseDir for the project.
+ */
+ public String[] getFiles(Project p) {
+ if (files == null) {
+ DirectoryScanner ds = getDirectoryScanner(p);
+ files = ds.getIncludedFiles();
+ }
+
+ return files;
+ }
+
+ /**
+ * A 3 digit octal string, specify the user, group and
+ * other modes in the standard Unix fashion;
+ * optional, default=0644
+ * @param octalString a 3 digit octal string.
+ */
+ public void setMode(String octalString) {
+ this.fileMode =
+ UnixStat.FILE_FLAG | Integer.parseInt(octalString, 8);
+ }
+
+ /**
+ * @return the current mode.
+ */
+ public int getMode() {
+ return fileMode;
+ }
+
+ /**
+ * The UID for the ar entry; optional, default="0"
+ * @param uid the id of the user for the ar entry.
+ */
+ public void setUid(int uid) {
+ this.uid = uid;
+ }
+
+ /**
+ * @return the UID for the ar entry
+ */
+ public int getUid() {
+ return uid;
+ }
+
+ /**
+ * The GID for the ar entry; optional, default="0"
+ * @param gid the group id.
+ */
+ public void setGid(int gid) {
+ this.gid = gid;
+ }
+
+ /**
+ * @return the group identifier.
+ */
+ public int getGid() {
+ return gid;
+ }
+
+ /**
+ * If the fullpath attribute is set, the file in the fileset
+ * is written with the last part of the path in the archive.
+ * If the fullpath ends in '/' the file is omitted from the archive.
+ * It is an error to have more than one file specified in such a fileset.
+ * @param fullpath the path to use for the file in a fileset.
+ */
+ public void setFullpath(String fullpath) {
+ this.fullpath = fullpath;
+ }
+
+ /**
+ * @return the path to use for a single file fileset.
+ */
+ public String getFullpath() {
+ return fullpath;
+ }
+ }
+
+ /**
+ * Set of options for long file handling in the task.
+ */
+ public static class ArLongFileMode extends EnumeratedAttribute {
+ /** permissible values for longfile attribute */
+ public static final String
+ WARN = "warn",
+ FAIL = "fail",
+ TRUNCATE = "truncate",
+ GNU = "gnu",
+ BSD = "bsd",
+ OMIT = "omit";
+
+ private final String[] validModes = {WARN, FAIL, TRUNCATE, GNU, BSD, OMIT};
+
+ /** Constructor, defaults to "warn" */
+ public ArLongFileMode() {
+ super();
+ setValue(WARN);
+ }
+
+ /**
+ * @return the possible values for this enumerated type.
+ */
+ public String[] getValues() {
+ return validModes;
+ }
+
+ /**
+ * @return true if value is "truncate".
+ */
+ public boolean isTruncateMode() {
+ return TRUNCATE.equalsIgnoreCase(getValue());
+ }
+
+ /**
+ * @return true if value is "warn".
+ */
+ public boolean isWarnMode() {
+ return WARN.equalsIgnoreCase(getValue());
+ }
+
+ /**
+ * @return true if value is "gnu".
+ */
+ public boolean isGnuMode() {
+ return GNU.equalsIgnoreCase(getValue());
+ }
+
+ /**
+ * @return true if value is "bsd".
+ */
+ public boolean isBsdMode() {
+ return BSD.equalsIgnoreCase(getValue());
+ }
+
+ /**
+ * @return true if value is "fail".
+ */
+ public boolean isFailMode() {
+ return FAIL.equalsIgnoreCase(getValue());
+ }
+
+ /**
+ * @return true if value is "omit".
+ */
+ public boolean isOmitMode() {
+ return OMIT.equalsIgnoreCase(getValue());
+ }
+ }
+}
diff --git a/jEdit/de/masters_of_disaster/ant/tasks/ar/ArConstants.java b/jEdit/de/masters_of_disaster/ant/tasks/ar/ArConstants.java
index 0565314..6ebf8cc 100644
--- a/jEdit/de/masters_of_disaster/ant/tasks/ar/ArConstants.java
+++ b/jEdit/de/masters_of_disaster/ant/tasks/ar/ArConstants.java
@@ -1,62 +1,62 @@
-package de.masters_of_disaster.ant.tasks.ar;
-
-/**
- * This interface contains all the definitions used in the package.
- */
-
-public interface ArConstants {
- /**
- * The length of the name field in a file header.
- */
- int NAMELEN = 16;
-
- /**
- * The length of the file date field in a file header.
- */
- int FILEDATELEN = 12;
-
- /**
- * The length of the user id field in a file header.
- */
- int UIDLEN = 6;
-
- /**
- * The length of the group id field in a file header.
- */
- int GIDLEN = 6;
-
- /**
- * The length of the mode field in a file header.
- */
- int MODELEN = 8;
-
- /**
- * The length of the size field in a file header.
- */
- int SIZELEN = 10;
-
- /**
- * The length of the magic field in a file header.
- */
- int MAGICLEN = 2;
-
- /**
- * The magic tag put at the end of a file header.
- */
- String HEADERMAGIC = "`\n";
-
- /**
- * The headerlength of a file header.
- */
- int HEADERLENGTH = NAMELEN + FILEDATELEN + UIDLEN + GIDLEN + MODELEN + SIZELEN + MAGICLEN;
-
- /**
- * The length of the magic field in a file header.
- */
- byte[] PADDING = { '\n' };
-
- /**
- * The magic tag representing an ar archive.
- */
- byte[] ARMAGIC = { '!', '<', 'a', 'r', 'c', 'h', '>', '\n' };
-}
+package de.masters_of_disaster.ant.tasks.ar;
+
+/**
+ * This interface contains all the definitions used in the package.
+ */
+
+public interface ArConstants {
+ /**
+ * The length of the name field in a file header.
+ */
+ int NAMELEN = 16;
+
+ /**
+ * The length of the file date field in a file header.
+ */
+ int FILEDATELEN = 12;
+
+ /**
+ * The length of the user id field in a file header.
+ */
+ int UIDLEN = 6;
+
+ /**
+ * The length of the group id field in a file header.
+ */
+ int GIDLEN = 6;
+
+ /**
+ * The length of the mode field in a file header.
+ */
+ int MODELEN = 8;
+
+ /**
+ * The length of the size field in a file header.
+ */
+ int SIZELEN = 10;
+
+ /**
+ * The length of the magic field in a file header.
+ */
+ int MAGICLEN = 2;
+
+ /**
+ * The magic tag put at the end of a file header.
+ */
+ String HEADERMAGIC = "`\n";
+
+ /**
+ * The headerlength of a file header.
+ */
+ int HEADERLENGTH = NAMELEN + FILEDATELEN + UIDLEN + GIDLEN + MODELEN + SIZELEN + MAGICLEN;
+
+ /**
+ * The length of the magic field in a file header.
+ */
+ byte[] PADDING = { '\n' };
+
+ /**
+ * The magic tag representing an ar archive.
+ */
+ byte[] ARMAGIC = { '!', '<', 'a', 'r', 'c', 'h', '>', '\n' };
+}
diff --git a/jEdit/de/masters_of_disaster/ant/tasks/ar/ArEntry.java b/jEdit/de/masters_of_disaster/ant/tasks/ar/ArEntry.java
index 91aa68d..896bd34 100644
--- a/jEdit/de/masters_of_disaster/ant/tasks/ar/ArEntry.java
+++ b/jEdit/de/masters_of_disaster/ant/tasks/ar/ArEntry.java
@@ -1,355 +1,355 @@
-package de.masters_of_disaster.ant.tasks.ar;
-
-import java.io.File;
-import java.util.Date;
-
-/**
- * This class represents an entry in an Ar archive. It consists
- * of the entry's header, as well as the entry's File. Entries
- * can be instantiated in one of three ways, depending on how
- * they are to be used.
- * <p>
- * ArEntries that are created from the header bytes read from
- * an archive are instantiated with the ArEntry( byte[] )
- * constructor. These entries will be used when extracting from
- * or listing the contents of an archive. These entries have their
- * header filled in using the header bytes. They also set the File
- * to null, since they reference an archive entry not a file.
- * <p>
- * ArEntries that are created from Files that are to be written
- * into an archive are instantiated with the ArEntry( File )
- * constructor. These entries have their header filled in using
- * the File's information. They also keep a reference to the File
- * for convenience when writing entries.
- * <p>
- * Finally, ArEntries can be constructed from nothing but a name.
- * This allows the programmer to construct the entry by hand, for
- * instance when only an InputStream is available for writing to
- * the archive, and the header information is constructed from
- * other information. In this case the header fields are set to
- * defaults and the File is set to null.
- *
- * <p>
- * The C structure for an Ar Entry's header is:
- * <pre>
- * struct header {
- * char filename[16];
- * char filedate[12];
- * char uid[6];
- * char gid[6];
- * char mode[8];
- * char size[10];
- * char magic[2];
- * } header;
- * </pre>
- *
- */
-
-public class ArEntry implements ArConstants {
- /** The entry's filename. */
- private StringBuffer filename;
-
- /** The entry's file date. */
- private long fileDate;
-
- /** The entry's user id. */
- private int userId;
-
- /** The entry's group id. */
- private int groupId;
-
- /** The entry's permission mode. */
- private int mode;
-
- /** The entry's size. */
- private long size;
-
- /** The entry's magic tag. */
- private StringBuffer magic;
-
- /** The entry's file reference */
- private File file;
-
- /** Default permissions bits for files */
- public static final int DEFAULT_FILE_MODE = 0100644;
-
- /** Convert millis to seconds */
- public static final int MILLIS_PER_SECOND = 1000;
-
- /**
- * Construct an empty entry and prepares the header values.
- */
- private ArEntry () {
- this.magic = new StringBuffer(HEADERMAGIC);
- this.filename = new StringBuffer();
- this.userId = 0;
- this.groupId = 0;
- this.file = null;
- }
-
- /**
- * Construct an entry with only a name. This allows the programmer
- * to construct the entry's header "by hand". File is set to null.
- *
- * @param name the entry name
- */
- public ArEntry(String name) {
- this();
- if (name.endsWith("/")) {
- throw new IllegalArgumentException("ar archives can only contain files");
- }
- this.filename = new StringBuffer(name);
- this.mode = DEFAULT_FILE_MODE;
- this.userId = 0;
- this.groupId = 0;
- this.size = 0;
- this.fileDate = (new Date()).getTime() / MILLIS_PER_SECOND;
- }
-
- /**
- * Construct an entry for a file. File is set to file, and the
- * header is constructed from information from the file.
- *
- * @param file The file that the entry represents.
- */
- public ArEntry(File file) {
- this();
- if (file.isDirectory()) {
- throw new IllegalArgumentException("ar archives can only contain files");
- }
- this.file = file;
- this.filename = new StringBuffer(file.getName());
- this.fileDate = file.lastModified() / MILLIS_PER_SECOND;
- this.mode = DEFAULT_FILE_MODE;
- this.size = file.length();
- }
-
- /**
- * Construct an entry from an archive's header bytes. File is set
- * to null.
- *
- * @param headerBuf The header bytes from an ar archive entry.
- */
- public ArEntry(byte[] headerBuf) {
- this();
- this.parseArHeader(headerBuf);
- }
-
- /**
- * Determine if the two entries are equal. Equality is determined
- * by the header names being equal.
- *
- * @param it Entry to be checked for equality.
- * @return True if the entries are equal.
- */
- public boolean equals(ArEntry it) {
- return this.getFilename().equals(it.getFilename());
- }
-
- /**
- * Determine if the two entries are equal. Equality is determined
- * by the header names being equal.
- *
- * @param it Entry to be checked for equality.
- * @return True if the entries are equal.
- */
- public boolean equals(Object it) {
- if (it == null || getClass() != it.getClass()) {
- return false;
- }
- return equals((ArEntry) it);
- }
-
- /**
- * Hashcodes are based on entry names.
- *
- * @return the entry hashcode
- */
- public int hashCode() {
- return getFilename().hashCode();
- }
-
- /**
- * Get this entry's name.
- *
- * @return This entry's name.
- */
- public String getFilename() {
- return this.filename.toString();
- }
-
- /**
- * Set this entry's name.
- *
- * @param name This entry's new name.
- */
- public void setFilename(String filename) {
- this.filename = new StringBuffer(filename);
- }
-
- /**
- * Set the mode for this entry
- *
- * @param mode the mode for this entry
- */
- public void setMode(int mode) {
- this.mode = mode;
- }
-
- /**
- * Get this entry's user id.
- *
- * @return This entry's user id.
- */
- public int getUserId() {
- return this.userId;
- }
-
- /**
- * Set this entry's user id.
- *
- * @param userId This entry's new user id.
- */
- public void setUserId(int userId) {
- this.userId = userId;
- }
-
- /**
- * Get this entry's group id.
- *
- * @return This entry's group id.
- */
- public int getGroupId() {
- return this.groupId;
- }
-
- /**
- * Set this entry's group id.
- *
- * @param groupId This entry's new group id.
- */
- public void setGroupId(int groupId) {
- this.groupId = groupId;
- }
-
- /**
- * Convenience method to set this entry's group and user ids.
- *
- * @param userId This entry's new user id.
- * @param groupId This entry's new group id.
- */
- public void setIds(int userId, int groupId) {
- this.setUserId(userId);
- this.setGroupId(groupId);
- }
-
- /**
- * Set this entry's modification time. The parameter passed
- * to this method is in "Java time".
- *
- * @param time This entry's new modification time.
- */
- public void setFileDate(long time) {
- this.fileDate = time / MILLIS_PER_SECOND;
- }
-
- /**
- * Set this entry's modification time.
- *
- * @param time This entry's new modification time.
- */
- public void setFileDate(Date time) {
- this.fileDate = time.getTime() / MILLIS_PER_SECOND;
- }
-
- /**
- * Get this entry's modification time.
- *
- * @return time This entry's new modification time.
- */
- public Date getFileDate() {
- return new Date(this.fileDate * MILLIS_PER_SECOND);
- }
-
- /**
- * Get this entry's file.
- *
- * @return This entry's file.
- */
- public File getFile() {
- return this.file;
- }
-
- /**
- * Get this entry's mode.
- *
- * @return This entry's mode.
- */
- public int getMode() {
- return this.mode;
- }
-
- /**
- * Get this entry's file size.
- *
- * @return This entry's file size.
- */
- public long getSize() {
- return this.size;
- }
-
- /**
- * Set this entry's file size.
- *
- * @param size This entry's new file size.
- */
- public void setSize(long size) {
- this.size = size;
- }
-
- /**
- * Write an entry's header information to a header buffer.
- *
- * @param outbuf The tar entry header buffer to fill in.
- */
- public void writeEntryHeader(byte[] outbuf) {
- int offset = 0;
-
- offset = ArUtils.getNameBytes(this.filename, outbuf, offset, NAMELEN);
- offset = ArUtils.getLongBytes(this.fileDate, outbuf, offset, FILEDATELEN);
- offset = ArUtils.getIntegerBytes(this.userId, outbuf, offset, UIDLEN);
- offset = ArUtils.getIntegerBytes(this.groupId, outbuf, offset, GIDLEN);
- offset = ArUtils.getOctalBytes(this.mode, outbuf, offset, MODELEN);
- offset = ArUtils.getLongBytes(this.size, outbuf, offset, SIZELEN);
- offset = ArUtils.getNameBytes(this.magic, outbuf, offset, MAGICLEN);
-
- while (offset < outbuf.length) {
- outbuf[offset++] = 0;
- }
- }
-
- /**
- * Parse an entry's header information from a header buffer.
- *
- * @param header The ar entry header buffer to get information from.
- */
- public void parseArHeader(byte[] header) {
- throw new UnsupportedOperationException("parseArHeader(byte[]) not yet implmented");
-// int offset = 0;
-//
-// this.filename = TarUtils.parseName(header, offset, NAMELEN);
-// offset += NAMELEN;
-// this.fileDate = TarUtils.parseOctal(header, offset, FILEDATELEN);
-// offset += FILEDATELEN;
-// this.userId = (int) TarUtils.parseOctal(header, offset, UIDLEN);
-// offset += UIDLEN;
-// this.groupId = (int) TarUtils.parseOctal(header, offset, GIDLEN);
-// offset += GIDLEN;
-// this.mode = (int) TarUtils.parseOctal(header, offset, MODELEN);
-// offset += MODELEN;
-// this.size = TarUtils.parseOctal(header, offset, SIZELEN);
-// offset += SIZELEN;
-// this.magic = TarUtils.parseName(header, offset, MAGICLEN);
-// offset += MAGICLEN;
- }
-}
+package de.masters_of_disaster.ant.tasks.ar;
+
+import java.io.File;
+import java.util.Date;
+
+/**
+ * This class represents an entry in an Ar archive. It consists
+ * of the entry's header, as well as the entry's File. Entries
+ * can be instantiated in one of three ways, depending on how
+ * they are to be used.
+ * <p>
+ * ArEntries that are created from the header bytes read from
+ * an archive are instantiated with the ArEntry( byte[] )
+ * constructor. These entries will be used when extracting from
+ * or listing the contents of an archive. These entries have their
+ * header filled in using the header bytes. They also set the File
+ * to null, since they reference an archive entry not a file.
+ * <p>
+ * ArEntries that are created from Files that are to be written
+ * into an archive are instantiated with the ArEntry( File )
+ * constructor. These entries have their header filled in using
+ * the File's information. They also keep a reference to the File
+ * for convenience when writing entries.
+ * <p>
+ * Finally, ArEntries can be constructed from nothing but a name.
+ * This allows the programmer to construct the entry by hand, for
+ * instance when only an InputStream is available for writing to
+ * the archive, and the header information is constructed from
+ * other information. In this case the header fields are set to
+ * defaults and the File is set to null.
+ *
+ * <p>
+ * The C structure for an Ar Entry's header is:
+ * <pre>
+ * struct header {
+ * char filename[16];
+ * char filedate[12];
+ * char uid[6];
+ * char gid[6];
+ * char mode[8];
+ * char size[10];
+ * char magic[2];
+ * } header;
+ * </pre>
+ *
+ */
+
+public class ArEntry implements ArConstants {
+ /** The entry's filename. */
+ private StringBuffer filename;
+
+ /** The entry's file date. */
+ private long fileDate;
+
+ /** The entry's user id. */
+ private int userId;
+
+ /** The entry's group id. */
+ private int groupId;
+
+ /** The entry's permission mode. */
+ private int mode;
+
+ /** The entry's size. */
+ private long size;
+
+ /** The entry's magic tag. */
+ private StringBuffer magic;
+
+ /** The entry's file reference */
+ private File file;
+
+ /** Default permissions bits for files */
+ public static final int DEFAULT_FILE_MODE = 0100644;
+
+ /** Convert millis to seconds */
+ public static final int MILLIS_PER_SECOND = 1000;
+
+ /**
+ * Construct an empty entry and prepares the header values.
+ */
+ private ArEntry () {
+ this.magic = new StringBuffer(HEADERMAGIC);
+ this.filename = new StringBuffer();
+ this.userId = 0;
+ this.groupId = 0;
+ this.file = null;
+ }
+
+ /**
+ * Construct an entry with only a name. This allows the programmer
+ * to construct the entry's header "by hand". File is set to null.
+ *
+ * @param name the entry name
+ */
+ public ArEntry(String name) {
+ this();
+ if (name.endsWith("/")) {
+ throw new IllegalArgumentException("ar archives can only contain files");
+ }
+ this.filename = new StringBuffer(name);
+ this.mode = DEFAULT_FILE_MODE;
+ this.userId = 0;
+ this.groupId = 0;
+ this.size = 0;
+ this.fileDate = (new Date()).getTime() / MILLIS_PER_SECOND;
+ }
+
+ /**
+ * Construct an entry for a file. File is set to file, and the
+ * header is constructed from information from the file.
+ *
+ * @param file The file that the entry represents.
+ */
+ public ArEntry(File file) {
+ this();
+ if (file.isDirectory()) {
+ throw new IllegalArgumentException("ar archives can only contain files");
+ }
+ this.file = file;
+ this.filename = new StringBuffer(file.getName());
+ this.fileDate = file.lastModified() / MILLIS_PER_SECOND;
+ this.mode = DEFAULT_FILE_MODE;
+ this.size = file.length();
+ }
+
+ /**
+ * Construct an entry from an archive's header bytes. File is set
+ * to null.
+ *
+ * @param headerBuf The header bytes from an ar archive entry.
+ */
+ public ArEntry(byte[] headerBuf) {
+ this();
+ this.parseArHeader(headerBuf);
+ }
+
+ /**
+ * Determine if the two entries are equal. Equality is determined
+ * by the header names being equal.
+ *
+ * @param it Entry to be checked for equality.
+ * @return True if the entries are equal.
+ */
+ public boolean equals(ArEntry it) {
+ return this.getFilename().equals(it.getFilename());
+ }
+
+ /**
+ * Determine if the two entries are equal. Equality is determined
+ * by the header names being equal.
+ *
+ * @param it Entry to be checked for equality.
+ * @return True if the entries are equal.
+ */
+ public boolean equals(Object it) {
+ if (it == null || getClass() != it.getClass()) {
+ return false;
+ }
+ return equals((ArEntry) it);
+ }
+
+ /**
+ * Hashcodes are based on entry names.
+ *
+ * @return the entry hashcode
+ */
+ public int hashCode() {
+ return getFilename().hashCode();
+ }
+
+ /**
+ * Get this entry's name.
+ *
+ * @return This entry's name.
+ */
+ public String getFilename() {
+ return this.filename.toString();
+ }
+
+ /**
+ * Set this entry's name.
+ *
+ * @param name This entry's new name.
+ */
+ public void setFilename(String filename) {
+ this.filename = new StringBuffer(filename);
+ }
+
+ /**
+ * Set the mode for this entry
+ *
+ * @param mode the mode for this entry
+ */
+ public void setMode(int mode) {
+ this.mode = mode;
+ }
+
+ /**
+ * Get this entry's user id.
+ *
+ * @return This entry's user id.
+ */
+ public int getUserId() {
+ return this.userId;
+ }
+
+ /**
+ * Set this entry's user id.
+ *
+ * @param userId This entry's new user id.
+ */
+ public void setUserId(int userId) {
+ this.userId = userId;
+ }
+
+ /**
+ * Get this entry's group id.
+ *
+ * @return This entry's group id.
+ */
+ public int getGroupId() {
+ return this.groupId;
+ }
+
+ /**
+ * Set this entry's group id.
+ *
+ * @param groupId This entry's new group id.
+ */
+ public void setGroupId(int groupId) {
+ this.groupId = groupId;
+ }
+
+ /**
+ * Convenience method to set this entry's group and user ids.
+ *
+ * @param userId This entry's new user id.
+ * @param groupId This entry's new group id.
+ */
+ public void setIds(int userId, int groupId) {
+ this.setUserId(userId);
+ this.setGroupId(groupId);
+ }
+
+ /**
+ * Set this entry's modification time. The parameter passed
+ * to this method is in "Java time".
+ *
+ * @param time This entry's new modification time.
+ */
+ public void setFileDate(long time) {
+ this.fileDate = time / MILLIS_PER_SECOND;
+ }
+
+ /**
+ * Set this entry's modification time.
+ *
+ * @param time This entry's new modification time.
+ */
+ public void setFileDate(Date time) {
+ this.fileDate = time.getTime() / MILLIS_PER_SECOND;
+ }
+
+ /**
+ * Get this entry's modification time.
+ *
+ * @return time This entry's new modification time.
+ */
+ public Date getFileDate() {
+ return new Date(this.fileDate * MILLIS_PER_SECOND);
+ }
+
+ /**
+ * Get this entry's file.
+ *
+ * @return This entry's file.
+ */
+ public File getFile() {
+ return this.file;
+ }
+
+ /**
+ * Get this entry's mode.
+ *
+ * @return This entry's mode.
+ */
+ public int getMode() {
+ return this.mode;
+ }
+
+ /**
+ * Get this entry's file size.
+ *
+ * @return This entry's file size.
+ */
+ public long getSize() {
+ return this.size;
+ }
+
+ /**
+ * Set this entry's file size.
+ *
+ * @param size This entry's new file size.
+ */
+ public void setSize(long size) {
+ this.size = size;
+ }
+
+ /**
+ * Write an entry's header information to a header buffer.
+ *
+ * @param outbuf The tar entry header buffer to fill in.
+ */
+ public void writeEntryHeader(byte[] outbuf) {
+ int offset = 0;
+
+ offset = ArUtils.getNameBytes(this.filename, outbuf, offset, NAMELEN);
+ offset = ArUtils.getLongBytes(this.fileDate, outbuf, offset, FILEDATELEN);
+ offset = ArUtils.getIntegerBytes(this.userId, outbuf, offset, UIDLEN);
+ offset = ArUtils.getIntegerBytes(this.groupId, outbuf, offset, GIDLEN);
+ offset = ArUtils.getOctalBytes(this.mode, outbuf, offset, MODELEN);
+ offset = ArUtils.getLongBytes(this.size, outbuf, offset, SIZELEN);
+ offset = ArUtils.getNameBytes(this.magic, outbuf, offset, MAGICLEN);
+
+ while (offset < outbuf.length) {
+ outbuf[offset++] = 0;
+ }
+ }
+
+ /**
+ * Parse an entry's header information from a header buffer.
+ *
+ * @param header The ar entry header buffer to get information from.
+ */
+ public void parseArHeader(byte[] header) {
+ throw new UnsupportedOperationException("parseArHeader(byte[]) not yet implmented");
+// int offset = 0;
+//
+// this.filename = TarUtils.parseName(header, offset, NAMELEN);
+// offset += NAMELEN;
+// this.fileDate = TarUtils.parseOctal(header, offset, FILEDATELEN);
+// offset += FILEDATELEN;
+// this.userId = (int) TarUtils.parseOctal(header, offset, UIDLEN);
+// offset += UIDLEN;
+// this.groupId = (int) TarUtils.parseOctal(header, offset, GIDLEN);
+// offset += GIDLEN;
+// this.mode = (int) TarUtils.parseOctal(header, offset, MODELEN);
+// offset += MODELEN;
+// this.size = TarUtils.parseOctal(header, offset, SIZELEN);
+// offset += SIZELEN;
+// this.magic = TarUtils.parseName(header, offset, MAGICLEN);
+// offset += MAGICLEN;
+ }
+}
diff --git a/jEdit/de/masters_of_disaster/ant/tasks/ar/ArOutputStream.java b/jEdit/de/masters_of_disaster/ant/tasks/ar/ArOutputStream.java
index 2065c9c..4ea2a23 100644
--- a/jEdit/de/masters_of_disaster/ant/tasks/ar/ArOutputStream.java
+++ b/jEdit/de/masters_of_disaster/ant/tasks/ar/ArOutputStream.java
@@ -1,167 +1,167 @@
-package de.masters_of_disaster.ant.tasks.ar;
-
-import java.io.FilterOutputStream;
-import java.io.OutputStream;
-import java.io.IOException;
-
-/**
- * The ArOutputStream writes an ar archive as an OutputStream.
- * Methods are provided to put entries, and then write their contents
- * by writing to this stream using write().
- */
-public class ArOutputStream extends FilterOutputStream {
- /** Fail if a long file name is required in the archive or the name contains spaces. */
- public static final int LONGFILE_ERROR = 0;
-
- /** Long paths will be truncated in the archive. Spaces are replaced by '_' */
- public static final int LONGFILE_TRUNCATE = 1;
-
- /** GNU ar variant is used to store long file names and file names with spaced in the archive. */
- public static final int LONGFILE_GNU = 2;
-
- /** BSD ar variant is used to store long file names and file names with spaced in the archive. */
- public static final int LONGFILE_BSD = 3;
-
- protected int currSize;
- protected int currBytes;
- protected byte[] oneBuf;
- protected int longFileMode = LONGFILE_ERROR;
- protected boolean writingStarted = false;
- protected boolean inEntry = false;
-
- public ArOutputStream(OutputStream os) throws IOException {
- super(os);
- if (null == os) {
- throw new NullPointerException("os must not be null");
- }
- this.out.write(ArConstants.ARMAGIC,0,ArConstants.ARMAGIC.length);
- this.oneBuf = new byte[1];
- }
-
- public void setLongFileMode(int longFileMode) {
- if (writingStarted) {
- throw new IllegalStateException("longFileMode cannot be changed after writing to the archive has begun");
- }
- if (LONGFILE_GNU == longFileMode) {
- throw new UnsupportedOperationException("GNU variant isn't implemented yet");
- }
- if (LONGFILE_BSD == longFileMode) {
- throw new UnsupportedOperationException("BSD variant isn't implemented yet");
- }
- this.longFileMode = longFileMode;
- }
-
- /**
- * Put an entry on the output stream. This writes the entry's
- * header record and positions the output stream for writing
- * the contents of the entry. Once this method is called, the
- * stream is ready for calls to write() to write the entry's
- * contents. Once the contents are written, closeEntry()
- * <B>MUST</B> be called to ensure that all buffered data
- * is completely written to the output stream.
- *
- * @param entry The ArEntry to be written to the archive.
- */
- public void putNextEntry(ArEntry entry) throws IOException {
- writingStarted = true;
- if (inEntry) {
- throw new IOException("the current entry has to be closed before starting a new one");
- }
- String filename = entry.getFilename();
- if ((filename.length() >= ArConstants.NAMELEN)
- && (longFileMode != LONGFILE_TRUNCATE)) {
- throw new RuntimeException("file name \"" + entry.getFilename()
- + "\" is too long ( > "
- + ArConstants.NAMELEN + " bytes )");
- }
- if (-1 != filename.indexOf(' ')) {
- if (longFileMode == LONGFILE_TRUNCATE) {
- entry.setFilename(filename.replace(' ','_'));
- } else {
- throw new RuntimeException("file name \"" + entry.getFilename()
- + "\" contains spaces");
- }
- }
-
- byte[] headerBuf = new byte[ArConstants.HEADERLENGTH];
- entry.writeEntryHeader(headerBuf);
- this.out.write(headerBuf,0,ArConstants.HEADERLENGTH);
-
- this.currBytes = 0;
- this.currSize = (int) entry.getSize();
- inEntry = true;
- }
-
- /**
- * Close an entry. This method MUST be called for all file
- * entries that contain data. The reason is that we must
- * pad an entries data if it is of odd size.
- */
- public void closeEntry() throws IOException {
- if (!inEntry) {
- throw new IOException("we are not in an entry currently");
- }
-
- if (this.currBytes < this.currSize) {
- throw new IOException("entry closed at '" + this.currBytes
- + "' before the '" + this.currSize
- + "' bytes specified in the header were written");
- }
-
- if (1 == (this.currSize & 1)) {
- this.out.write(ArConstants.PADDING,0,1);
- }
-
- inEntry = false;
- }
-
- /**
- * Writes a byte to the current ar archive entry.
- *
- * This method simply calls write( byte[], int, int ).
- *
- * @param b The byte to write to the archive.
- */
- public void write(int b) throws IOException {
- this.oneBuf[0] = (byte) b;
- this.write(this.oneBuf, 0, 1);
- }
-
- /**
- * Writes bytes to the current ar archive entry.
- *
- * This method simply calls write( byte[], int, int ).
- *
- * @param wBuf The buffer to write to the archive.
- */
- public void write(byte[] wBuf) throws IOException {
- this.write(wBuf, 0, wBuf.length);
- }
-
- /**
- * Writes bytes to the current ar archive entry. This method
- * is aware of the current entry and will throw an exception if
- * you attempt to write bytes past the length specified for the
- * current entry.
- *
- * @param wBuf The buffer to write to the archive.
- * @param wOffset The offset in the buffer from which to get bytes.
- * @param numToWrite The number of bytes to write.
- */
- public void write(byte[] wBuf, int wOffset, int numToWrite) throws IOException {
- if (!inEntry) {
- throw new IOException("we are not in an entry currently");
- }
-
- if ((this.currBytes + numToWrite) > this.currSize) {
- throw new IOException("request to write '" + numToWrite
- + "' bytes exceeds size in header of '"
- + this.currSize + "' bytes");
- }
-
- if (numToWrite > 0) {
- this.out.write(wBuf,wOffset,numToWrite);
- this.currBytes += numToWrite;
- }
- }
-}
+package de.masters_of_disaster.ant.tasks.ar;
+
+import java.io.FilterOutputStream;
+import java.io.OutputStream;
+import java.io.IOException;
+
+/**
+ * The ArOutputStream writes an ar archive as an OutputStream.
+ * Methods are provided to put entries, and then write their contents
+ * by writing to this stream using write().
+ */
+public class ArOutputStream extends FilterOutputStream {
+ /** Fail if a long file name is required in the archive or the name contains spaces. */
+ public static final int LONGFILE_ERROR = 0;
+
+ /** Long paths will be truncated in the archive. Spaces are replaced by '_' */
+ public static final int LONGFILE_TRUNCATE = 1;
+
+ /** GNU ar variant is used to store long file names and file names with spaced in the archive. */
+ public static final int LONGFILE_GNU = 2;
+
+ /** BSD ar variant is used to store long file names and file names with spaced in the archive. */
+ public static final int LONGFILE_BSD = 3;
+
+ protected int currSize;
+ protected int currBytes;
+ protected byte[] oneBuf;
+ protected int longFileMode = LONGFILE_ERROR;
+ protected boolean writingStarted = false;
+ protected boolean inEntry = false;
+
+ public ArOutputStream(OutputStream os) throws IOException {
+ super(os);
+ if (null == os) {
+ throw new NullPointerException("os must not be null");
+ }
+ this.out.write(ArConstants.ARMAGIC,0,ArConstants.ARMAGIC.length);
+ this.oneBuf = new byte[1];
+ }
+
+ public void setLongFileMode(int longFileMode) {
+ if (writingStarted) {
+ throw new IllegalStateException("longFileMode cannot be changed after writing to the archive has begun");
+ }
+ if (LONGFILE_GNU == longFileMode) {
+ throw new UnsupportedOperationException("GNU variant isn't implemented yet");
+ }
+ if (LONGFILE_BSD == longFileMode) {
+ throw new UnsupportedOperationException("BSD variant isn't implemented yet");
+ }
+ this.longFileMode = longFileMode;
+ }
+
+ /**
+ * Put an entry on the output stream. This writes the entry's
+ * header record and positions the output stream for writing
+ * the contents of the entry. Once this method is called, the
+ * stream is ready for calls to write() to write the entry's
+ * contents. Once the contents are written, closeEntry()
+ * <B>MUST</B> be called to ensure that all buffered data
+ * is completely written to the output stream.
+ *
+ * @param entry The ArEntry to be written to the archive.
+ */
+ public void putNextEntry(ArEntry entry) throws IOException {
+ writingStarted = true;
+ if (inEntry) {
+ throw new IOException("the current entry has to be closed before starting a new one");
+ }
+ String filename = entry.getFilename();
+ if ((filename.length() >= ArConstants.NAMELEN)
+ && (longFileMode != LONGFILE_TRUNCATE)) {
+ throw new RuntimeException("file name \"" + entry.getFilename()
+ + "\" is too long ( > "
+ + ArConstants.NAMELEN + " bytes )");
+ }
+ if (-1 != filename.indexOf(' ')) {
+ if (longFileMode == LONGFILE_TRUNCATE) {
+ entry.setFilename(filename.replace(' ','_'));
+ } else {
+ throw new RuntimeException("file name \"" + entry.getFilename()
+ + "\" contains spaces");
+ }
+ }
+
+ byte[] headerBuf = new byte[ArConstants.HEADERLENGTH];
+ entry.writeEntryHeader(headerBuf);
+ this.out.write(headerBuf,0,ArConstants.HEADERLENGTH);
+
+ this.currBytes = 0;
+ this.currSize = (int) entry.getSize();
+ inEntry = true;
+ }
+
+ /**
+ * Close an entry. This method MUST be called for all file
+ * entries that contain data. The reason is that we must
+ * pad an entries data if it is of odd size.
+ */
+ public void closeEntry() throws IOException {
+ if (!inEntry) {
+ throw new IOException("we are not in an entry currently");
+ }
+
+ if (this.currBytes < this.currSize) {
+ throw new IOException("entry closed at '" + this.currBytes
+ + "' before the '" + this.currSize
+ + "' bytes specified in the header were written");
+ }
+
+ if (1 == (this.currSize & 1)) {
+ this.out.write(ArConstants.PADDING,0,1);
+ }
+
+ inEntry = false;
+ }
+
+ /**
+ * Writes a byte to the current ar archive entry.
+ *
+ * This method simply calls write( byte[], int, int ).
+ *
+ * @param b The byte to write to the archive.
+ */
+ public void write(int b) throws IOException {
+ this.oneBuf[0] = (byte) b;
+ this.write(this.oneBuf, 0, 1);
+ }
+
+ /**
+ * Writes bytes to the current ar archive entry.
+ *
+ * This method simply calls write( byte[], int, int ).
+ *
+ * @param wBuf The buffer to write to the archive.
+ */
+ public void write(byte[] wBuf) throws IOException {
+ this.write(wBuf, 0, wBuf.length);
+ }
+
+ /**
+ * Writes bytes to the current ar archive entry. This method
+ * is aware of the current entry and will throw an exception if
+ * you attempt to write bytes past the length specified for the
+ * current entry.
+ *
+ * @param wBuf The buffer to write to the archive.
+ * @param wOffset The offset in the buffer from which to get bytes.
+ * @param numToWrite The number of bytes to write.
+ */
+ public void write(byte[] wBuf, int wOffset, int numToWrite) throws IOException {
+ if (!inEntry) {
+ throw new IOException("we are not in an entry currently");
+ }
+
+ if ((this.currBytes + numToWrite) > this.currSize) {
+ throw new IOException("request to write '" + numToWrite
+ + "' bytes exceeds size in header of '"
+ + this.currSize + "' bytes");
+ }
+
+ if (numToWrite > 0) {
+ this.out.write(wBuf,wOffset,numToWrite);
+ this.currBytes += numToWrite;
+ }
+ }
+}
diff --git a/jEdit/de/masters_of_disaster/ant/tasks/ar/ArUtils.java b/jEdit/de/masters_of_disaster/ant/tasks/ar/ArUtils.java
index 3f6141e..6b97cb7 100644
--- a/jEdit/de/masters_of_disaster/ant/tasks/ar/ArUtils.java
+++ b/jEdit/de/masters_of_disaster/ant/tasks/ar/ArUtils.java
@@ -1,155 +1,155 @@
-package de.masters_of_disaster.ant.tasks.ar;
-
-/**
- * This class provides static utility methods to work with byte streams.
- */
-public class ArUtils {
- /**
- * Parse an octal string from a header buffer. This is used for the
- * file permission mode value.
- *
- * @param header The header buffer from which to parse.
- * @param offset The offset into the buffer from which to parse.
- * @param length The number of header bytes to parse.
- * @return The long value of the octal string.
- */
- public static long parseOctal(byte[] header, int offset, int length) {
- long result = 0;
- int end = offset + length;
-
- for (int i=offset ; i<end ; i++) {
- if (header[i] == (byte) ' ') {
- break;
- }
- result = (result << 3) + (header[i] - '0');
- }
-
- return result;
- }
-
- /**
- * Parse an entry name from a header buffer.
- *
- * @param header The header buffer from which to parse.
- * @param offset The offset into the buffer from which to parse.
- * @param length The number of header bytes to parse.
- * @return The header's entry name.
- */
- public static StringBuffer parseName(byte[] header, int offset, int length) {
- StringBuffer result = new StringBuffer(length);
- int end = offset + length;
-
- for (int i=offset ; i<end ; i++) {
- if (header[i] == ' ') {
- break;
- }
-
- result.append((char) header[i]);
- }
-
- return result;
- }
-
- /**
- * Write a name into a byte array.
- *
- * @param name The name to write.
- * @param buf The byte array into which to write.
- * @param offset The offset into the buffer from which to write.
- * @param length The number of header bytes to write.
- * @return The number of bytes written to the buffer.
- */
- public static int getNameBytes(StringBuffer name, byte[] buf, int offset, int length) {
- int i;
- int c = name.length();
-
- for (i=0 ; i<length && i<c ; i++) {
- buf[offset+i] = (byte) name.charAt(i);
- }
-
- while (i<length) {
- buf[offset+i] = (byte) ' ';
- i++;
- }
-
- return offset + length;
- }
-
- /**
- * Write a long value into a byte array.
- *
- * @param value The value to write.
- * @param buf The byte array into which to write.
- * @param offset The offset into the buffer from which to write.
- * @param length The number of header bytes to write.
- * @return The number of bytes written to the buffer.
- */
- public static int getLongBytes(long value, byte[] buf, int offset, int length) {
- int i;
- String tmp = Long.toString(value);
- int c = tmp.length();
-
- for (i=0 ; i<length && i<c ; i++) {
- buf[offset+i] = (byte) tmp.charAt(i);
- }
-
- while (i<length) {
- buf[offset+i] = (byte) ' ';
- i++;
- }
-
- return offset + length;
- }
-
- /**
- * Write an int value into a byte array.
- *
- * @param value The value to write.
- * @param buf The byte array into which to write.
- * @param offset The offset into the buffer from which to write.
- * @param length The number of header bytes to write.
- * @return The number of bytes written to the buffer.
- */
- public static int getIntegerBytes(int value, byte[] buf, int offset, int length) {
- int i;
- String tmp = Integer.toString(value);
- int c = tmp.length();
-
- for (i=0 ; i<length && i<c ; i++) {
- buf[offset+i] = (byte) tmp.charAt(i);
- }
-
- while (i<length) {
- buf[offset+i] = (byte) ' ';
- i++;
- }
-
- return offset + length;
- }
-
- /**
- * Write an octal value into a byte array.
- *
- * @param value The value to write.
- * @param buf The byte array into which to write.
- * @param offset The offset into the buffer from which to write.
- * @param length The number of header bytes to write.
- * @return The number of bytes written to the buffer.
- */
- public static int getOctalBytes(long value, byte[] buf, int offset, int length) {
- int i;
- String tmp = Long.toOctalString(value);
- int c = tmp.length();
-
- for (i=0 ; i<length && i<c ; i++) {
- buf[offset+i] = (byte) tmp.charAt(i);
- }
-
- while (i<length) {
- buf[offset+i] = (byte) ' ';
- i++;
- }
-
- return offset + length;
- }
-}
+package de.masters_of_disaster.ant.tasks.ar;
+
+/**
+ * This class provides static utility methods to work with byte streams.
+ */
+public class ArUtils {
+ /**
+ * Parse an octal string from a header buffer. This is used for the
+ * file permission mode value.
+ *
+ * @param header The header buffer from which to parse.
+ * @param offset The offset into the buffer from which to parse.
+ * @param length The number of header bytes to parse.
+ * @return The long value of the octal string.
+ */
+ public static long parseOctal(byte[] header, int offset, int length) {
+ long result = 0;
+ int end = offset + length;
+
+ for (int i=offset ; i<end ; i++) {
+ if (header[i] == (byte) ' ') {
+ break;
+ }
+ result = (result << 3) + (header[i] - '0');
+ }
+
+ return result;
+ }
+
+ /**
+ * Parse an entry name from a header buffer.
+ *
+ * @param header The header buffer from which to parse.
+ * @param offset The offset into the buffer from which to parse.
+ * @param length The number of header bytes to parse.
+ * @return The header's entry name.
+ */
+ public static StringBuffer parseName(byte[] header, int offset, int length) {
+ StringBuffer result = new StringBuffer(length);
+ int end = offset + length;
+
+ for (int i=offset ; i<end ; i++) {
+ if (header[i] == ' ') {
+ break;
+ }
+
+ result.append((char) header[i]);
+ }
+
+ return result;
+ }
+
+ /**
+ * Write a name into a byte array.
+ *
+ * @param name The name to write.
+ * @param buf The byte array into which to write.
+ * @param offset The offset into the buffer from which to write.
+ * @param length The number of header bytes to write.
+ * @return The number of bytes written to the buffer.
+ */
+ public static int getNameBytes(StringBuffer name, byte[] buf, int offset, int length) {
+ int i;
+ int c = name.length();
+
+ for (i=0 ; i<length && i<c ; i++) {
+ buf[offset+i] = (byte) name.charAt(i);
+ }
+
+ while (i<length) {
+ buf[offset+i] = (byte) ' ';
+ i++;
+ }
+
+ return offset + length;
+ }
+
+ /**
+ * Write a long value into a byte array.
+ *
+ * @param value The value to write.
+ * @param buf The byte array into which to write.
+ * @param offset The offset into the buffer from which to write.
+ * @param length The number of header bytes to write.
+ * @return The number of bytes written to the buffer.
+ */
+ public static int getLongBytes(long value, byte[] buf, int offset, int length) {
+ int i;
+ String tmp = Long.toString(value);
+ int c = tmp.length();
+
+ for (i=0 ; i<length && i<c ; i++) {
+ buf[offset+i] = (byte) tmp.charAt(i);
+ }
+
+ while (i<length) {
+ buf[offset+i] = (byte) ' ';
+ i++;
+ }
+
+ return offset + length;
+ }
+
+ /**
+ * Write an int value into a byte array.
+ *
+ * @param value The value to write.
+ * @param buf The byte array into which to write.
+ * @param offset The offset into the buffer from which to write.
+ * @param length The number of header bytes to write.
+ * @return The number of bytes written to the buffer.
+ */
+ public static int getIntegerBytes(int value, byte[] buf, int offset, int length) {
+ int i;
+ String tmp = Integer.toString(value);
+ int c = tmp.length();
+
+ for (i=0 ; i<length && i<c ; i++) {
+ buf[offset+i] = (byte) tmp.charAt(i);
+ }
+
+ while (i<length) {
+ buf[offset+i] = (byte) ' ';
+ i++;
+ }
+
+ return offset + length;
+ }
+
+ /**
+ * Write an octal value into a byte array.
+ *
+ * @param value The value to write.
+ * @param buf The byte array into which to write.
+ * @param offset The offset into the buffer from which to write.
+ * @param length The number of header bytes to write.
+ * @return The number of bytes written to the buffer.
+ */
+ public static int getOctalBytes(long value, byte[] buf, int offset, int length) {
+ int i;
+ String tmp = Long.toOctalString(value);
+ int c = tmp.length();
+
+ for (i=0 ; i<length && i<c ; i++) {
+ buf[offset+i] = (byte) tmp.charAt(i);
+ }
+
+ while (i<length) {
+ buf[offset+i] = (byte) ' ';
+ i++;
+ }
+
+ return offset + length;
+ }
+}
diff --git a/jEdit/de/masters_of_disaster/ant/tasks/calculatesize/CalculateSize.java b/jEdit/de/masters_of_disaster/ant/tasks/calculatesize/CalculateSize.java
index fb21b2f..d062426 100644
--- a/jEdit/de/masters_of_disaster/ant/tasks/calculatesize/CalculateSize.java
+++ b/jEdit/de/masters_of_disaster/ant/tasks/calculatesize/CalculateSize.java
@@ -1,94 +1,94 @@
-package de.masters_of_disaster.ant.tasks.calculatesize;
-
-import java.io.File;
-import java.util.Enumeration;
-import java.util.Vector;
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.taskdefs.MatchingTask;
-import org.apache.tools.ant.types.FileSet;
-
-/**
- * Calculates the "Installed-Size" of a deb package for the "control"-file.
- *
- * @ant.task category="packaging"
- */
-public class CalculateSize extends MatchingTask {
- String realSizeProperty = null;
- String diskSizeProperty = null;
- Vector fileSets = new Vector();
- File baseDir;
-
- /**
- * Add a new fileset
- *
- * @return the fileset to be used as the nested element.
- */
- public FileSet createFileSet() {
- FileSet fileSet = new FileSet();
- fileSets.addElement(fileSet);
- return fileSet;
- }
-
- /**
- * This is the base directory to look in for things to include.
- *
- * @param baseDir the base directory.
- */
- public void setBaseDir(File baseDir) {
- this.baseDir = baseDir;
- fileset.setDir(baseDir);
- }
-
- /**
- * This is the property to set to the real size.
- *
- * @param realSizeProperty The property to set to the real size
- */
- public void setRealSizeProperty(String realSizeProperty) {
- this.realSizeProperty = realSizeProperty;
- }
-
- /**
- * This is the property to set to the disk size.
- *
- * @param diskSizeProperty The property to set to the disk size
- */
- public void setDiskSizeProperty(String diskSizeProperty) {
- this.diskSizeProperty = diskSizeProperty;
- }
-
- /**
- * do the business
- *
- * @throws BuildException on error
- */
- public void execute() throws BuildException {
- if ((null == realSizeProperty) && (null == diskSizeProperty)) {
- throw new BuildException("realSizeProperty or diskSizeProperty must be set for <CalculateSize>");
- }
-
- if (null != baseDir) {
- // add the main fileset to the list of filesets to process.
- fileSets.addElement(fileset);
- }
-
- long realSize = 0;
- long diskSize = 0;
- for (Enumeration e=fileSets.elements() ; e.hasMoreElements() ; ) {
- FileSet fileSet = (FileSet)e.nextElement();
- String[] files = fileSet.getDirectoryScanner(getProject()).getIncludedFiles();
- File fileSetDir = fileSet.getDir(getProject());
- for (int i=0, c=files.length ; i<c ; i++) {
- long fileLength = new File(fileSetDir,files[i]).length();
- realSize += fileLength / 1024;
- diskSize += (fileLength / 4096 + 1) * 4;
- }
- }
- if (null != realSizeProperty) {
- getProject().setNewProperty(realSizeProperty,Long.toString(realSize));
- }
- if (null != diskSizeProperty) {
- getProject().setNewProperty(diskSizeProperty,Long.toString(diskSize));
- }
- }
-}
+package de.masters_of_disaster.ant.tasks.calculatesize;
+
+import java.io.File;
+import java.util.Enumeration;
+import java.util.Vector;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.taskdefs.MatchingTask;
+import org.apache.tools.ant.types.FileSet;
+
+/**
+ * Calculates the "Installed-Size" of a deb package for the "control"-file.
+ *
+ * @ant.task category="packaging"
+ */
+public class CalculateSize extends MatchingTask {
+ String realSizeProperty = null;
+ String diskSizeProperty = null;
+ Vector fileSets = new Vector();
+ File baseDir;
+
+ /**
+ * Add a new fileset
+ *
+ * @return the fileset to be used as the nested element.
+ */
+ public FileSet createFileSet() {
+ FileSet fileSet = new FileSet();
+ fileSets.addElement(fileSet);
+ return fileSet;
+ }
+
+ /**
+ * This is the base directory to look in for things to include.
+ *
+ * @param baseDir the base directory.
+ */
+ public void setBaseDir(File baseDir) {
+ this.baseDir = baseDir;
+ fileset.setDir(baseDir);
+ }
+
+ /**
+ * This is the property to set to the real size.
+ *
+ * @param realSizeProperty The property to set to the real size
+ */
+ public void setRealSizeProperty(String realSizeProperty) {
+ this.realSizeProperty = realSizeProperty;
+ }
+
+ /**
+ * This is the property to set to the disk size.
+ *
+ * @param diskSizeProperty The property to set to the disk size
+ */
+ public void setDiskSizeProperty(String diskSizeProperty) {
+ this.diskSizeProperty = diskSizeProperty;
+ }
+
+ /**
+ * do the business
+ *
+ * @throws BuildException on error
+ */
+ public void execute() throws BuildException {
+ if ((null == realSizeProperty) && (null == diskSizeProperty)) {
+ throw new BuildException("realSizeProperty or diskSizeProperty must be set for <CalculateSize>");
+ }
+
+ if (null != baseDir) {
+ // add the main fileset to the list of filesets to process.
+ fileSets.addElement(fileset);
+ }
+
+ long realSize = 0;
+ long diskSize = 0;
+ for (Enumeration e=fileSets.elements() ; e.hasMoreElements() ; ) {
+ FileSet fileSet = (FileSet)e.nextElement();
+ String[] files = fileSet.getDirectoryScanner(getProject()).getIncludedFiles();
+ File fileSetDir = fileSet.getDir(getProject());
+ for (int i=0, c=files.length ; i<c ; i++) {
+ long fileLength = new File(fileSetDir,files[i]).length();
+ realSize += fileLength / 1024;
+ diskSize += (fileLength / 4096 + 1) * 4;
+ }
+ }
+ if (null != realSizeProperty) {
+ getProject().setNewProperty(realSizeProperty,Long.toString(realSize));
+ }
+ if (null != diskSizeProperty) {
+ getProject().setNewProperty(diskSizeProperty,Long.toString(diskSize));
+ }
+ }
+}
diff --git a/jEdit/de/masters_of_disaster/ant/tasks/deb/Deb.java b/jEdit/de/masters_of_disaster/ant/tasks/deb/Deb.java
index 1aa5dd0..5caf47f 100644
--- a/jEdit/de/masters_of_disaster/ant/tasks/deb/Deb.java
+++ b/jEdit/de/masters_of_disaster/ant/tasks/deb/Deb.java
@@ -1,351 +1,354 @@
-package de.masters_of_disaster.ant.tasks.deb;
-
-import de.masters_of_disaster.ant.tasks.ar.Ar;
-import de.masters_of_disaster.ant.tasks.ar.Ar.ArFileSet;
-import java.io.File;
-import java.util.Enumeration;
-import java.util.Vector;
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.Task;
-import org.apache.tools.ant.taskdefs.Checksum;
-import org.apache.tools.ant.taskdefs.Echo;
-import org.apache.tools.ant.taskdefs.Echo.EchoLevel;
-import org.apache.tools.ant.taskdefs.Mkdir;
-import org.apache.tools.ant.taskdefs.MatchingTask;
-import org.apache.tools.ant.taskdefs.Tar;
-import org.apache.tools.ant.taskdefs.Tar.TarCompressionMethod;
-import org.apache.tools.ant.taskdefs.Tar.TarFileSet;
-import org.apache.tools.ant.util.FileUtils;
-import org.apache.tools.ant.util.MergingMapper;
-import org.apache.tools.ant.util.SourceFileScanner;
-
-/**
- * Creates a deb package.
- *
- * @ant.task category="packaging"
- */
-public class Deb extends MatchingTask {
- Vector controlFileSets = new Vector();
- Vector dataFileSets = new Vector();
- File baseDir;
- File destFile;
- File tempDir;
- boolean deleteTempFiles = true;
- boolean includeMd5sums = false;
- Tar controlTarGz = new Tar();
- Tar dataTarGz = new Tar();
- Ar debPackage = new Ar();
-
- {
- fileset = dataTarGz.createTarFileSet();
- }
-
- /**
- * Add a new fileset for the control files with the option to specify permissions
- *
- * @return the tar fileset to be used as the nested element.
- */
- public TarFileSet createControlFileSet() {
- TarFileSet fileSet = controlTarGz.createTarFileSet();
- controlFileSets.addElement(fileSet);
- return fileSet;
- }
-
- /**
- * Add a new fileset for the data files with the option to specify permissions
- *
- * @return the tar fileset to be used as the nested element.
- */
- public TarFileSet createDataFileSet() {
- TarFileSet fileSet = dataTarGz.createTarFileSet();
- dataFileSets.addElement(fileSet);
- return fileSet;
- }
-
- /**
- * Set the name/location of where to create the deb file.
- *
- * @param destFile The output of the deb
- */
- public void setDestFile(File destFile) {
- this.destFile = destFile;
- debPackage.setDestFile(destFile);
- }
-
- /**
- * This is the base directory to look in for things to include in the data files.
- *
- * @param baseDir the base directory.
- */
- public void setBaseDir(File baseDir) {
- this.baseDir = baseDir;
- fileset.setDir(baseDir);
- }
-
- /**
- * This is the temp directory where to create the temporary files.
- * If not set, the current projects baseDir is used.
- *
- * @param tempDir the temp directory.
- */
- public void setTempDir(File tempDir) {
- this.tempDir = tempDir;
- }
-
- /**
- * This specifies if the temporary files should get deleted.
- *
- * @param deleteTempFiles whether to delete the temporary files or not.
- */
- public void setDeleteTempFiles(boolean deleteTempFiles) {
- this.deleteTempFiles = deleteTempFiles;
- }
-
- /**
- * This specifies if the MD5 sums of the files in the data section should be
- * included in the file "md5sums" in the control section.
- *
- * @param includeMd5sums whether to include MD5 sums in the control section or not.
- */
- public void setIncludeMd5sums(boolean includeMd5sums) {
- this.includeMd5sums = includeMd5sums;
- }
-
- /**
- * do the business
- *
- * @throws BuildException on error
- */
- public void execute() throws BuildException {
- prepareTask(controlTarGz);
- prepareTask(dataTarGz);
- prepareTask(debPackage);
- TarFileSet tarFileSet = controlTarGz.createTarFileSet();
- tarFileSet.setFile(new File(System.getProperty("user.dir")));
- tarFileSet.setUserName("root");
- tarFileSet.setGroup("root");
- tarFileSet.setFullpath("./");
- tarFileSet = dataTarGz.createTarFileSet();
- tarFileSet.setFile(new File(System.getProperty("user.dir")));
- tarFileSet.setUserName("root");
- tarFileSet.setGroup("root");
- tarFileSet.setFullpath("./");
-
- if (null == tempDir) {
- tempDir = getProject().getBaseDir();
- }
-
- if (null != baseDir) {
- // add the main fileset to the list of filesets to process.
- dataFileSets.addElement(fileset);
- } else {
- fileset.setDir(new File(System.getProperty("user.dir")));
- fileset.setExcludes("**");
- }
-
- boolean controlFound = false;
- for (Enumeration e=controlFileSets.elements() ; e.hasMoreElements() ; ) {
- TarFileSet fileSet = (TarFileSet)e.nextElement();
- String[] files = fileSet.getFiles(getProject());
- int i = 0;
- int c;
-
- for (c=files.length ; i<c && !controlFound ; i++) {
- if (files[i].endsWith("control")
- && (new File(fileSet.getDir(getProject()),files[i])).isFile()) {
- controlFound = true;
- }
- }
- }
- if (!controlFound) {
- throw new BuildException("The control fileset must contain a file \"control\"", getLocation());
- }
-
- // check if deb is out of date with respect to each fileset
- boolean upToDate = true;
- for (Enumeration e=controlFileSets.elements() ; e.hasMoreElements() ; ) {
- TarFileSet fileSet = (TarFileSet)e.nextElement();
- String[] files = fileSet.getFiles(getProject());
-
- if (!packageIsUpToDate(files,fileSet.getDir(getProject()))) {
- upToDate = false;
- }
- }
-
- for (Enumeration e=dataFileSets.elements() ; e.hasMoreElements() ; ) {
- TarFileSet fileSet = (TarFileSet)e.nextElement();
- String[] files = fileSet.getFiles(getProject());
-
- if (!packageIsUpToDate(files,fileSet.getDir(getProject()))) {
- upToDate = false;
- }
- }
-
- if (upToDate) {
- log("Nothing to do: " + destFile.getAbsolutePath()
- + " is up to date.", Project.MSG_INFO);
- return;
- }
-
- log("Building deb: " + destFile.getAbsolutePath(), Project.MSG_INFO);
-
- Mkdir mkdir = new Mkdir();
- prepareTask(mkdir);
- mkdir.setDir(tempDir);
- mkdir.perform();
-
- Echo echo = new Echo();
- prepareTask(echo);
- EchoLevel echoLevel = new EchoLevel();
- echoLevel.setValue("error");
- File debianBinaryFile = new File(tempDir,"debian-binary");
- echo.setFile(debianBinaryFile);
- echo.setLevel(echoLevel);
- echo.setMessage("2.0\n");
- echo.perform();
-
- for (Enumeration e=controlFileSets.elements() ; e.hasMoreElements() ; ) {
- TarFileSet fileSet = (TarFileSet)e.nextElement();
- String prefix = fileSet.getPrefix();
- String fullpath = fileSet.getFullpath();
- if ("".equals(fullpath) && !prefix.startsWith("./")) {
- if (prefix.startsWith("/")) {
- fileSet.setPrefix("." + prefix);
- } else {
- fileSet.setPrefix("./" + prefix);
- }
- }
- if ((fullpath.length() > 0) && !fullpath.startsWith("./")) {
- fileSet.setPrefix("");
- if (fullpath.startsWith("/")) {
- fileSet.setFullpath("." + fullpath);
- } else {
- fileSet.setFullpath("./" + fullpath);
- }
- }
- if ((0 == fileSet.getUid()) && ("" == fileSet.getUserName())) {
- fileSet.setUserName("root");
- }
- if ((0 == fileSet.getGid()) && ("" == fileSet.getGroup())) {
- fileSet.setGroup("root");
- }
- }
-
- for (Enumeration e=dataFileSets.elements() ; e.hasMoreElements() ; ) {
- TarFileSet fileSet = (TarFileSet)e.nextElement();
- String prefix = fileSet.getPrefix();
- String fullpath = fileSet.getFullpath();
- if ("".equals(fullpath) && !prefix.startsWith("./")) {
- if (prefix.startsWith("/")) {
- fileSet.setPrefix("." + prefix);
- } else {
- fileSet.setPrefix("./" + prefix);
- }
- }
- if ((fullpath.length() > 0) && !fullpath.startsWith("./")) {
- fileSet.setPrefix("");
- if (fullpath.startsWith("/")) {
- fileSet.setFullpath("." + fullpath);
- } else {
- fileSet.setFullpath("./" + fullpath);
- }
- }
- if ((0 == fileSet.getUid()) && ("" == fileSet.getUserName())) {
- fileSet.setUserName("root");
- }
- if ((0 == fileSet.getGid()) && ("" == fileSet.getGroup())) {
- fileSet.setGroup("root");
- }
- }
-
- File md5sumsFile = new File(tempDir,"md5sums");
- if (includeMd5sums) {
- Checksum md5 = new Checksum();
- prepareTask(md5);
- int md5Count = 0;
- StringBuffer md5sums = new StringBuffer();
- for (Enumeration e=dataFileSets.elements() ; e.hasMoreElements() ; ) {
- TarFileSet fileSet = (TarFileSet)e.nextElement();
- String[] files = fileSet.getDirectoryScanner(getProject()).getIncludedFiles();
- File fileSetDir = fileSet.getDir(getProject());
- for (int i=0, c=files.length ; i<c ; i++) {
- md5.setFile(new File(fileSetDir,files[i]));
- md5.setProperty("md5_"+md5Count);
- md5.perform();
- md5sums.append(getProject().getProperty("md5_"+md5Count)).append(" ");
- String fullpath = fileSet.getFullpath();
- if (fullpath.length() > 0) {
- md5sums.append(fullpath.substring(2));
- } else {
- md5sums.append(fileSet.getPrefix().substring(2)).append(files[i].replace('\\','/'));
- }
- md5sums.append("\n");
- md5Count++;
- }
- }
- echo.setFile(md5sumsFile);
- echo.setMessage(md5sums.toString());
- echo.perform();
- tarFileSet = controlTarGz.createTarFileSet();
- tarFileSet.setFile(md5sumsFile);
- tarFileSet.setUserName("root");
- tarFileSet.setGroup("root");
- tarFileSet.setPrefix("./");
- }
-
- TarCompressionMethod tarCompressionMethod = new TarCompressionMethod();
- tarCompressionMethod.setValue("gzip");
- controlTarGz.setCompression(tarCompressionMethod);
- File controlTarGzFile = new File(tempDir,"control.tar.gz");
- controlTarGz.setDestFile(controlTarGzFile);
- controlTarGz.perform();
-
- dataTarGz.setCompression(tarCompressionMethod);
- File dataTarGzFile = new File(tempDir,"data.tar.gz");
- dataTarGz.setDestFile(dataTarGzFile);
- dataTarGz.perform();
-
- FileUtils.delete(destFile);
- ArFileSet fileSet = debPackage.createArFileSet();
- fileSet.setFile(debianBinaryFile);
- fileSet = debPackage.createArFileSet();
- fileSet.setFile(controlTarGzFile);
- fileSet = debPackage.createArFileSet();
- fileSet.setFile(dataTarGzFile);
- debPackage.perform();
-
- if (deleteTempFiles) {
- FileUtils.delete(debianBinaryFile);
- FileUtils.delete(controlTarGzFile);
- FileUtils.delete(dataTarGzFile);
- FileUtils.delete(md5sumsFile);
- }
- }
-
- /**
- * Checks whether the package is up to date in relationship to a list of files.
- *
- * @param files the files to check
- * @param dir the base directory for the files.
- * @return true if the archive is up to date.
- */
- protected boolean packageIsUpToDate(String[] files, File dir) {
- SourceFileScanner sfs = new SourceFileScanner(this);
- MergingMapper mm = new MergingMapper();
- mm.setTo(destFile.getAbsolutePath());
- return sfs.restrict(files, dir, null, mm).length == 0;
- }
-
- /**
- * Prepares a task for execution.
- *
- * @param task the task to prepare
- */
- protected void prepareTask(Task task) {
- task.setProject(getProject());
- task.setOwningTarget(getOwningTarget());
- task.setTaskName(getTaskName());
- task.setTaskType(getTaskType());
- }
-}
+package de.masters_of_disaster.ant.tasks.deb;
+
+import de.masters_of_disaster.ant.tasks.ar.Ar;
+import de.masters_of_disaster.ant.tasks.ar.Ar.ArFileSet;
+import java.io.File;
+import java.util.Enumeration;
+import java.util.Vector;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.taskdefs.Checksum;
+import org.apache.tools.ant.taskdefs.Echo;
+import org.apache.tools.ant.taskdefs.Echo.EchoLevel;
+import org.apache.tools.ant.taskdefs.Mkdir;
+import org.apache.tools.ant.taskdefs.MatchingTask;
+import org.apache.tools.ant.taskdefs.Tar;
+import org.apache.tools.ant.taskdefs.Tar.TarCompressionMethod;
+import org.apache.tools.ant.taskdefs.Tar.TarFileSet;
+import org.apache.tools.ant.util.FileUtils;
+import org.apache.tools.ant.util.MergingMapper;
+import org.apache.tools.ant.util.SourceFileScanner;
+
+/**
+ * Creates a deb package.
+ *
+ * @ant.task category="packaging"
+ */
+public class Deb extends MatchingTask {
+ Vector controlFileSets = new Vector();
+ Vector dataFileSets = new Vector();
+ File baseDir;
+ File destFile;
+ File tempDir;
+ boolean deleteTempFiles = true;
+ boolean includeMd5sums = false;
+ Tar controlTarGz = new Tar();
+ Tar dataTarGz = new Tar();
+ Ar debPackage = new Ar();
+
+ {
+ fileset = dataTarGz.createTarFileSet();
+ }
+
+ /**
+ * Add a new fileset for the control files with the option to specify permissions
+ *
+ * @return the tar fileset to be used as the nested element.
+ */
+ public TarFileSet createControlFileSet() {
+ TarFileSet fileSet = controlTarGz.createTarFileSet();
+ controlFileSets.addElement(fileSet);
+ return fileSet;
+ }
+
+ /**
+ * Add a new fileset for the data files with the option to specify permissions
+ *
+ * @return the tar fileset to be used as the nested element.
+ */
+ public TarFileSet createDataFileSet() {
+ TarFileSet fileSet = dataTarGz.createTarFileSet();
+ dataFileSets.addElement(fileSet);
+ return fileSet;
+ }
+
+ /**
+ * Set the name/location of where to create the deb file.
+ *
+ * @param destFile The output of the deb
+ */
+ public void setDestFile(File destFile) {
+ this.destFile = destFile;
+ debPackage.setDestFile(destFile);
+ }
+
+ /**
+ * This is the base directory to look in for things to include in the data files.
+ *
+ * @param baseDir the base directory.
+ */
+ public void setBaseDir(File baseDir) {
+ this.baseDir = baseDir;
+ fileset.setDir(baseDir);
+ }
+
+ /**
+ * This is the temp directory where to create the temporary files.
+ * If not set, the current projects baseDir is used.
+ *
+ * @param tempDir the temp directory.
+ */
+ public void setTempDir(File tempDir) {
+ this.tempDir = tempDir;
+ }
+
+ /**
+ * This specifies if the temporary files should get deleted.
+ *
+ * @param deleteTempFiles whether to delete the temporary files or not.
+ */
+ public void setDeleteTempFiles(boolean deleteTempFiles) {
+ this.deleteTempFiles = deleteTempFiles;
+ }
+
+ /**
+ * This specifies if the MD5 sums of the files in the data section should be
+ * included in the file "md5sums" in the control section.
+ *
+ * @param includeMd5sums whether to include MD5 sums in the control section or not.
+ */
+ public void setIncludeMd5sums(boolean includeMd5sums) {
+ this.includeMd5sums = includeMd5sums;
+ }
+
+ /**
+ * do the business
+ *
+ * @throws BuildException on error
+ */
+ public void execute() throws BuildException {
+ prepareTask(controlTarGz);
+ prepareTask(dataTarGz);
+ prepareTask(debPackage);
+ TarFileSet tarFileSet = controlTarGz.createTarFileSet();
+ tarFileSet.setFile(new File(System.getProperty("user.dir")));
+ tarFileSet.setUserName("root");
+ tarFileSet.setGroup("root");
+ tarFileSet.setFullpath("./");
+ tarFileSet = dataTarGz.createTarFileSet();
+ tarFileSet.setFile(new File(System.getProperty("user.dir")));
+ tarFileSet.setUserName("root");
+ tarFileSet.setGroup("root");
+ tarFileSet.setFullpath("./");
+
+ if (null == tempDir) {
+ tempDir = getProject().getBaseDir();
+ }
+
+ if (null != baseDir) {
+ // add the main fileset to the list of filesets to process.
+ dataFileSets.addElement(fileset);
+ } else {
+ fileset.setDir(new File(System.getProperty("user.dir")));
+ fileset.setExcludes("**");
+ }
+
+ boolean controlFound = false;
+ for (Enumeration e=controlFileSets.elements() ; e.hasMoreElements() ; ) {
+ TarFileSet fileSet = (TarFileSet)e.nextElement();
+ String[] files = fileSet.getFiles(getProject());
+ int i = 0;
+ int c;
+
+ for (c=files.length ; i<c && !controlFound ; i++) {
+ if (files[i].endsWith("control")
+ && (new File(fileSet.getDir(getProject()),files[i])).isFile()) {
+ controlFound = true;
+ }
+ }
+ }
+ if (!controlFound) {
+ throw new BuildException("The control fileset must contain a file \"control\"", getLocation());
+ }
+
+ // check if deb is out of date with respect to each fileset
+ boolean upToDate = true;
+ for (Enumeration e=controlFileSets.elements() ; e.hasMoreElements() ; ) {
+ TarFileSet fileSet = (TarFileSet)e.nextElement();
+ String[] files = fileSet.getFiles(getProject());
+
+ if (!packageIsUpToDate(files,fileSet.getDir(getProject()))) {
+ upToDate = false;
+ }
+ }
+
+ for (Enumeration e=dataFileSets.elements() ; e.hasMoreElements() ; ) {
+ TarFileSet fileSet = (TarFileSet)e.nextElement();
+ String[] files = fileSet.getFiles(getProject());
+
+ if (!packageIsUpToDate(files,fileSet.getDir(getProject()))) {
+ upToDate = false;
+ }
+ }
+
+ if (upToDate) {
+ log("Nothing to do: " + destFile.getAbsolutePath()
+ + " is up to date.", Project.MSG_INFO);
+ return;
+ }
+
+ log("Building deb: " + destFile.getAbsolutePath(), Project.MSG_INFO);
+
+ Mkdir mkdir = new Mkdir();
+ prepareTask(mkdir);
+ mkdir.setDir(tempDir);
+ mkdir.perform();
+
+ EchoLevel echoLevel = new EchoLevel();
+ echoLevel.setValue("error");
+ File debianBinaryFile = new File(tempDir,"debian-binary");
+ Echo echo = new Echo();
+ prepareTask(echo);
+ echo.setFile(debianBinaryFile);
+ echo.setLevel(echoLevel);
+ echo.setMessage("2.0\n");
+ echo.perform();
+
+ for (Enumeration e=controlFileSets.elements() ; e.hasMoreElements() ; ) {
+ TarFileSet fileSet = (TarFileSet)e.nextElement();
+ String prefix = fileSet.getPrefix();
+ String fullpath = fileSet.getFullpath();
+ if ("".equals(fullpath) && !prefix.startsWith("./")) {
+ if (prefix.startsWith("/")) {
+ fileSet.setPrefix("." + prefix);
+ } else {
+ fileSet.setPrefix("./" + prefix);
+ }
+ }
+ if ((fullpath.length() > 0) && !fullpath.startsWith("./")) {
+ fileSet.setPrefix("");
+ if (fullpath.startsWith("/")) {
+ fileSet.setFullpath("." + fullpath);
+ } else {
+ fileSet.setFullpath("./" + fullpath);
+ }
+ }
+ if ((0 == fileSet.getUid()) && ("" == fileSet.getUserName())) {
+ fileSet.setUserName("root");
+ }
+ if ((0 == fileSet.getGid()) && ("" == fileSet.getGroup())) {
+ fileSet.setGroup("root");
+ }
+ }
+
+ for (Enumeration e=dataFileSets.elements() ; e.hasMoreElements() ; ) {
+ TarFileSet fileSet = (TarFileSet)e.nextElement();
+ String prefix = fileSet.getPrefix();
+ String fullpath = fileSet.getFullpath();
+ if ("".equals(fullpath) && !prefix.startsWith("./")) {
+ if (prefix.startsWith("/")) {
+ fileSet.setPrefix("." + prefix);
+ } else {
+ fileSet.setPrefix("./" + prefix);
+ }
+ }
+ if ((fullpath.length() > 0) && !fullpath.startsWith("./")) {
+ fileSet.setPrefix("");
+ if (fullpath.startsWith("/")) {
+ fileSet.setFullpath("." + fullpath);
+ } else {
+ fileSet.setFullpath("./" + fullpath);
+ }
+ }
+ if ((0 == fileSet.getUid()) && ("" == fileSet.getUserName())) {
+ fileSet.setUserName("root");
+ }
+ if ((0 == fileSet.getGid()) && ("" == fileSet.getGroup())) {
+ fileSet.setGroup("root");
+ }
+ }
+
+ File md5sumsFile = new File(tempDir,"md5sums");
+ if (includeMd5sums) {
+ Checksum md5 = new Checksum();
+ prepareTask(md5);
+ int md5Count = 0;
+ StringBuffer md5sums = new StringBuffer();
+ for (Enumeration e=dataFileSets.elements() ; e.hasMoreElements() ; ) {
+ TarFileSet fileSet = (TarFileSet)e.nextElement();
+ String[] files = fileSet.getDirectoryScanner(getProject()).getIncludedFiles();
+ File fileSetDir = fileSet.getDir(getProject());
+ for (int i=0, c=files.length ; i<c ; i++) {
+ md5.setFile(new File(fileSetDir,files[i]));
+ md5.setProperty("md5_"+md5Count);
+ md5.perform();
+ md5sums.append(getProject().getProperty("md5_"+md5Count)).append(" ");
+ String fullpath = fileSet.getFullpath();
+ if (fullpath.length() > 0) {
+ md5sums.append(fullpath.substring(2));
+ } else {
+ md5sums.append(fileSet.getPrefix().substring(2)).append(files[i].replace('\\','/'));
+ }
+ md5sums.append("\n");
+ md5Count++;
+ }
+ }
+ echo = new Echo();
+ prepareTask(echo);
+ echo.setFile(md5sumsFile);
+ echo.setLevel(echoLevel);
+ echo.setMessage(md5sums.toString());
+ echo.perform();
+ tarFileSet = controlTarGz.createTarFileSet();
+ tarFileSet.setFile(md5sumsFile);
+ tarFileSet.setUserName("root");
+ tarFileSet.setGroup("root");
+ tarFileSet.setPrefix("./");
+ }
+
+ TarCompressionMethod tarCompressionMethod = new TarCompressionMethod();
+ tarCompressionMethod.setValue("gzip");
+ controlTarGz.setCompression(tarCompressionMethod);
+ File controlTarGzFile = new File(tempDir,"control.tar.gz");
+ controlTarGz.setDestFile(controlTarGzFile);
+ controlTarGz.perform();
+
+ dataTarGz.setCompression(tarCompressionMethod);
+ File dataTarGzFile = new File(tempDir,"data.tar.gz");
+ dataTarGz.setDestFile(dataTarGzFile);
+ dataTarGz.perform();
+
+ FileUtils.delete(destFile);
+ ArFileSet fileSet = debPackage.createArFileSet();
+ fileSet.setFile(debianBinaryFile);
+ fileSet = debPackage.createArFileSet();
+ fileSet.setFile(controlTarGzFile);
+ fileSet = debPackage.createArFileSet();
+ fileSet.setFile(dataTarGzFile);
+ debPackage.perform();
+
+ if (deleteTempFiles) {
+ FileUtils.delete(debianBinaryFile);
+ FileUtils.delete(controlTarGzFile);
+ FileUtils.delete(dataTarGzFile);
+ FileUtils.delete(md5sumsFile);
+ }
+ }
+
+ /**
+ * Checks whether the package is up to date in relationship to a list of files.
+ *
+ * @param files the files to check
+ * @param dir the base directory for the files.
+ * @return true if the archive is up to date.
+ */
+ protected boolean packageIsUpToDate(String[] files, File dir) {
+ SourceFileScanner sfs = new SourceFileScanner(this);
+ MergingMapper mm = new MergingMapper();
+ mm.setTo(destFile.getAbsolutePath());
+ return sfs.restrict(files, dir, null, mm).length == 0;
+ }
+
+ /**
+ * Prepares a task for execution.
+ *
+ * @param task the task to prepare
+ */
+ protected void prepareTask(Task task) {
+ task.setProject(getProject());
+ task.setOwningTarget(getOwningTarget());
+ task.setTaskName(getTaskName());
+ task.setTaskType(getTaskType());
+ }
+}
diff --git a/jEdit/doc/Apache.LICENSE.txt b/jEdit/doc/Apache.LICENSE.txt
index 99c1d1a..975c6ed 100644
--- a/jEdit/doc/Apache.LICENSE.txt
+++ b/jEdit/doc/Apache.LICENSE.txt
@@ -1,50 +1,50 @@
-/*
-
- ============================================================================
- The Apache Software License, Version 1.1
- ============================================================================
-
- Copyright (C) 2000-2002 The Apache Software Foundation. All rights reserved.
-
- Redistribution and use in source and binary forms, with or without modifica-
- tion, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
- 3. The end-user documentation included with the redistribution, if any, must
- include the following acknowledgment: "This product includes software
- developed by the Apache Software Foundation (http://www.apache.org/)."
- Alternately, this acknowledgment may appear in the software itself, if
- and wherever such third-party acknowledgments normally appear.
-
- 4. The names "Jakarta", "Avalon", "Excalibur" and "Apache Software Foundation"
- must not be used to endorse or promote products derived from this software
- without prior written permission. For written permission, please contact
- apache at apache.org.
-
- 5. Products derived from this software may not be called "Apache", nor may
- "Apache" appear in their name, without prior written permission of the
- Apache Software Foundation.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
- INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
- DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
- This software consists of voluntary contributions made by many individuals
- on behalf of the Apache Software Foundation and was originally created by
- Stefano Mazzocchi <stefano at apache.org>. For more information on the Apache
- Software Foundation, please see <http://www.apache.org/>.
-
-*/
+/*
+
+ ============================================================================
+ The Apache Software License, Version 1.1
+ ============================================================================
+
+ Copyright (C) 2000-2002 The Apache Software Foundation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modifica-
+ tion, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ 3. The end-user documentation included with the redistribution, if any, must
+ include the following acknowledgment: "This product includes software
+ developed by the Apache Software Foundation (http://www.apache.org/)."
+ Alternately, this acknowledgment may appear in the software itself, if
+ and wherever such third-party acknowledgments normally appear.
+
+ 4. The names "Jakarta", "Avalon", "Excalibur" and "Apache Software Foundation"
+ must not be used to endorse or promote products derived from this software
+ without prior written permission. For written permission, please contact
+ apache at apache.org.
+
+ 5. Products derived from this software may not be called "Apache", nor may
+ "Apache" appear in their name, without prior written permission of the
+ Apache Software Foundation.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
+ DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This software consists of voluntary contributions made by many individuals
+ on behalf of the Apache Software Foundation and was originally created by
+ Stefano Mazzocchi <stefano at apache.org>. For more information on the Apache
+ Software Foundation, please see <http://www.apache.org/>.
+
+*/
diff --git a/jEdit/doc/CHANGES.txt b/jEdit/doc/CHANGES.txt
index 55dae3e..fceb835 100644
--- a/jEdit/doc/CHANGES.txt
+++ b/jEdit/doc/CHANGES.txt
@@ -1,3331 +1,453 @@
-JEDIT 4.3 VERSION HISTORY
-
-{{{ Version 4.3.2
-
-Thanks to Björn "Vampire" Kautler, Matthieu Casanova, Shlomy Reinstein,
-Kazutoshi Satoda, oman002, and Eric Le Lay for contributing to this release.
-
-{{{ Bug Fixes
-
-- Fixed Standalone TextArea build target (Shlomy Reinstein)
-
-- Fixed a NPE that happens when an error occurs before the view is loaded
- (Matthieu Casanova #2905487)
-
-- Fixed bug #2927555: beanshell load() fails w/ exception (Shlomy Reinstein)
-
-- Fixed a memory leak which held closed View and EditPane when using
- global bufferset scope. (Kazutoshi Satoda)
-
-- When removing text from the buffer, the event contentRemoved was sent before
- making the buffer dirty (oman002 #2944145)
-
-- Fixed leaky memory usage after some specific text operations.
- (Kazutoshi Satoda)
-
-- Worked around a memory leak in Sun Java 6 where the sun.font.GlyphLayout is
- cached and reused while holding an instance to the char array
- (Björn "Vampire" Kautler)
-
-- When setting a new message in the status bar in a macro called from the
- Macro menu the message was cleared immediately (Matthieu Casanova #2964522)
-
-- don't log an error when the API docs are not available. Provide a link
- to the online docs instead (SF.net bug #1777806 - Eric Le Lay)
-
-- RFC edit mode was misplaced in catalog and was never matching anything because
- text edit mode glob was more global and checked first (Matthieu Casanova)
-
-- java installer refuses to install from a directory containing exclamation
- marks (SF.net bug #2065330 - Eric Le Lay)
-
-}}}
-{{{ Miscellaneous
-
-
-}}}
-{{{ API Changes
-
-- Applied patch #2932330 to suppress BufferUpdate messages from temporary
- buffers to improve performance. (Dale Anson)
-
-}}}
-{{{ Editing
-
-
-}}}
-
-}}}
-
-{{{ Version 4.3.1
-
-Thanks to Björn "Vampire" Kautler, Alan Ezust, Damien Radtke,
-Kazutoshi Satoda, Dale Anson, and Shlomy Reinstein for contributing
-to this release.
-
-{{{ Bug Fixes
-
-- Searching for regex "^\s*.*$" missed every second line of adjacent
- matching lines. (SF.net bug #2915720 - Kazutoshi Satoda)
-
-- Fix for 2924261, BufferLocal ignores request to change encoding. (Dale
-Anson)
-
-- Fix # 2921611 - PluginSets fail to load grand-dependencies. (Damien Radtke)
-
-- Fix # 2920287 - Macro recording for home/end actions fixed. (Alan Ezust)
-
-- Fixed #2920352: Can't disable "Restore previously open files on startup".
- (Shlomy Reinstein)
-
-}}}
-
-}}}
-
-{{{ Version 4.3
-
-Thanks to Björn "Vampire" Kautler, Marcelo Vanzin, Matthieu Casanova,
-Alan Ezust, Eric Berry, and Eric Le Lay for contributing to this release.
-
-{{{ Bug Fixes
-
-- Merged rev# 16624 from trunk, to fix printing which was broken by
- patch#2876132. (Eric Le Lay)
-
-- Applied patch #2876132 - anonymous instances of JARClassLoader will now
- resolve resources like instances associated with a JAR file (fix for Xerces).
- The context ClassLoader for jedit server thread is now a JARClassLoader.
- (Eric Le Lay)
-
-- Fixed bug #2907139: Upgrading from 4.2final to 4.3pre18 causes freeze at
- startup (Shlomy Reinstein)
-
-}}}
-{{{ Miscellaneous
-
-- When creating a new file from the VFS Browser, if a clean untitled buffer
- already exists but with another path it is now replaced by a new untitled
- buffer using the selected path (Matthieu Casanova)
-
-- Applied patch #2887515: Navigate in AboutDialog (contributed by spj).
- The name list in the about dialog can be scrolled faster using the up and
- down arrow keys, and the scrolling can be stopped using the right and left
- arrow keys or the escape key.
-
-- EnhancedButton have its name set to the last part of the action name,
- to facilitate unit-tests (e.g. the 'previous' button in the VFSBrowser
- has the action 'vfs.browser.previous', so will be named 'previous').
-
-}}}
-{{{ API Changes
-
-- Add support for type-specific EditBus message handlers. EditBus handlers
- don't need to implement EBComponent anymore; they just need to annotate their
- EditBus handler methods with the new "EBHandler" annotation. The methods
- should expect a single argument (an instance of any EBMessage type), and the
- method will be called whenever a message of a matching type is sent on the
- EditBus. Classes that still implement EBComponent will continue to work
- exactly like before, even if they include handlers using the new annotation.
- (Marcelo Vanzin)
-
-}}}
-{{{ Editing
-
-- Improved indenting rules of Python edit mode. (Björn "Vampire" Kautler)
-
-- Reverted a change for jsp mode, which was made on 4.3pre17 to fix a
- bug, since it doesn't work any more. (see SF.net bug #846913)
-
-}}}
-
-}}}
-
-{{{ Version 4.3pre18
-
-Thanks to Björn "Vampire" Kautler, Shlomy Reinstein, Alan Ezust, Chepel
-Matthieu Casanova, Denis Dzenskevich, Dennis Sheil, Jim Lawton and
-Suraj Kurapati for contributing to this release.
-
-{{{ Bug Fixes
-- When using the quick syntax edition, if the operation is cancelled, do not
- send a propertiesChanged event (Matthieu Casanova)
-
-- Fixed bug #2882702 - Right Click menu shows up to the left of the mouse
- pointer in a multiple monitor environment.
-
-- Fixed bug #2881152 - Bufferset Order is incorrect after a "save as".
- (#2882756 - Shlomy Reinstein)
-
-- Fixed bug #2806043: Token.tokenToString() throws
- ArrayIndexOutOfBoundsException on the END token. (Shlomy Reinstein)
-
-- When switching back from fullscreen mode to normal, check property to decide
- whether to show status bar in normal or plain view. (Shlomy Reinstein)
-
-- Fixed restoring of view bounds from perspective.xml for dual-monitor
- environments. This was broken by a fix in the previous version for users who
- switch from a dual-monitor environment to a single-monitor environment, and
- now should be fixed indefinitely. (Shlomy Reinstein)
-
-- Fixed #2819701: DockableWindowManagerImpl causes NullPointerExceptions.
- (Shlomy Reinstein)
-
-- Fixed #2817321: Exceptions on startup.
- Caused by a backward-incompatibility that was introduced by the BufferSets
- feature, of the "split configuration" format in the perspective.xml file. This
- incompatibility prevented jEdit from starting up for users who upgrade from
- any non-BufferSet version. A workaround for this is to remove perspective.xml,
- but then the previous layout is not restored. With this fix, jEdit should
- start normally with an old perspective.xml file. (#2817321) (Shlomy Reinstein)
-
-- Fixed #2818261: Rectangular Selection Count wrong. (Shlomy Reinstein)
-
-- Fixed #2823909: action bar not visible in full screen mode. (Shlomy Reinstein)
-
-- Fixed #2825028: Plugins not properly unloaded during exit. (Shlomy Reinstein)
-
-- Fixed #2825203: BufferSets not restored correctly on startup.
- (Shlomy Reinstein)
-
-- Fixed the Java based installer not to use an undefined variable
- JAVA_HEAP_INIT_SIZE in Unix startup script. (Kazutoshi Satoda)
-
-- Fixed #2818327: Plugin Error Dialog issues - allow copying the text from
- the plugin error dialog. (Shlomy Reinstein).
-
-- Fixed #2833822: Selecting "View -> Line numbers" now shows the gutter if it
- was not shown before (otherwise, this has no effect).
-
-- # 2838679 - Support Cygwin xsltproc in build.xml for docs generation
- (Sebastian Schuberth).
-
-- Minor refactoring of Mode class to allow plugins to determine the mode of a
- file without having to necessarily read the first line of the file. This
- allows huge performance gains in plugins like TaskList that need to determine
- the mode of a large number of files that are not yet opened in jEdit.
- (Dale Anson)
-
-- Fixed #2834900: DockingLayoutManager recursion when handling EditBus msgs.
- Prevented such recursions by avoiding creation of a dockable if it is already
- being created. (Shlomy Reinstein)
-
-- Fixed syntax highlight when a " appear in a javadoc comment in java mode
- (#2818095) (Denis Dzenskevich)
-
-- Fixed #2808363 (patch #2827234): fix perl highlighting hanging on some
- operators. (Dennis Sheil)
-
-- Applied patch #2842678: Gutter selection problems (Shlomy Reinstein, patch
- provided by encorejane).
-
-- Applied patch #2846169: IndentFoldHandler - allow blank lines after start of
- fold. (Shlomy Reinstein, patch provided by Suraj Kurapati)
-
-- Applied patch #2844750: line height correction (disappearing underscores),
- using OpenJDK (Suraj Kurapati)
-
-}}}
-{{{ Miscellaneous
-- New Macro - "Text/Compose Tag". (Gordon Hollenbeck # 2644277)
-
-- New action: toggle buffer switcher - toggles visibility of buffer switcher,
- and enabled-ness of focus menu item and focuses if enabled. (ezust)
-
-- New (restored?) Actions: dumb "home" and "end": not as smart as smart
- home/end - stays on the same line always. (Alan Ezust)
-
-- Smarter Smart-end - uses syntax info to determine end of code (before
- start of comment), giving smart-end 4 states instead of the previous 3.
- (Gordon Hollenbeck #2646484).
-
-- New options to select the width and the background color of the selection area
- in the gutter (which is visible when line numbers are not shown).
-
-- New button in Hypersearch dockable panel to stop an hypersearch
- (patch #2842444) (encorejane)
-}}}
-{{{ API Changes
-
-- Renamed "EditPane.showBufferSwitcher()" to "focusBufferSwitcher", and the
- corresponding action that invokes it. (Alan Ezust)
-
-- New method: TextArea.goToEndOfCode() (Gordon Hollenbeck #2646484).
-
-- Removed deprecated TextAreaUpdate EBMessage. Use EditPaneUpdate instead.
- (Alan Ezust)
-
-- Moved EditorExiting ebmessage earlier, before the unloading of plugin jars
- so plugins can catch it and act appropriately during shutdown. (Alan Ezust)
-
-- Added support for undo-aware plugins:
- - A new interface: org.gjt.sp.jedit.buffer.BufferUndoListener
- This interface defines a listener that gets notified whenever undo/redo
- are performed on a buffer. The listener can be added to / removed from
- a buffer using:
- JEditBuffer.addBufferUndoListener(BufferUndoListener)
- JEditBuffer.removeBufferUndoListener(BufferUndoListener listener)
- - New methods in JEditBuffer: getUndoId(), canUndo(), canRedo()
- getUndoId() can be used during buffer content changes to find which
- changes are included in the same undo operation. The method returns a
- different undoId for each undo operation, and all changes included in the
- same undo operation get the same undoId. The other two methods return
- true if more items exist in the undo/redo list, respectively.
-
-- New method: FoldHandler.getPrecedingFoldLevels - allows a fold handler to
- specify fold levels of lines preceding a line whose content has changed, to
- support patch #2846169, which makes the fold levels of blank lines depend on
- the first non-whitespace-only line following them. (Shlomy Reinstein)
-}}}
-{{{ Editing
-- "try" keyword added to erlang edit mode (patch #2769870) (Chepel)
-
-- added assembly-agc (Apollo Guidance Computer) edit mode (patch #2848519)
- (Jim Lawton)
-
-- added assembly-ags (Apollo Abort Guidance System) edit mode (patch #2848519)
- (Jim Lawton)
-
-- added binsource-agc (Apollo Guidance Computer Binary) edit mode (Jim Lawton)
-
-- Ruby edit mode updated (patch #2846453) (Suraj Kurapati)
-
-- Added *.sv (System Verilog) extension to verilog edit mode (feature #2814425)
- (Matthieu Casanova)
-}}}
-
-}}}
-
-{{{ Version 4.3pre17
-
-Thanks to Björn "Vampire" Kautler, Matthieu Casanova, Dakshinamurthy Karra,
-Pascal Sancho, Victor Engmark, Alan Ezust, Dale Anson, Daniel Hahler,
-Kazutoshi Satoda, Shlomy Reinstein, Bernard Walle, Markus Laker, Seph Soliman,
-Sergey Mezentsev, Matthew Bakalar, Marcelo Vanzin and Matthew Gilbert for
-contributing to this release.
-
-{{{ Bug Fixes
-
-- Stop caret timer in text area on dispose (Bill Culp - # 2814857)
-
-- Fixed a possible case where an output stream is not closed (#2790435)
- (Matthew Bakalar)
-
-- The Password fields in Metal Look & Feel now follows the TextArea color scheme
- (Matthieu Casanova)
-
-- If you set - as path in the VFSBrowser it will be replaced by the path
- of the current buffer (#2218621) (Matthieu Casanova)
-
-- Loading a library from the PluginManager gives a NPE
- (#2779500) (Matthieu Casanova)
-
-- If the textarea is antialiased the gutter will also use the same antialiasing
- (Matthieu Casanova)
-
-- The autoreload option was not applied for existing buffers (#2587311)
- (Matthieu Casanova)
-
-- When restoring the perspective the EditPanes are created with the default
- bufferSet scope and it is changed after according to the perspective.xml.
- Now it is immediately created with the good scope (#2645056)
- (Matthieu Casanova)
-
-- Fixed horizontal mac scrolling with trackpad or Mighty Mouse (#2308694)
- (Seph Soliman)
-
-- Fixed scrolling bug : when the TextArea was smaller than one visible line,
- if a line was wrapped, moving the cursor up or down in this line will not make
- was not the textarea scrolling to see the cursor (#2596087)
- (Matthieu Casanova)
-
-- Fix for caret position display in status bar (tracker 2220033), relative
- position was not always correct. In conjunction with this, added checkboxes
- in the Status Bar option pane to make the various items in the caret position
- display configurable. (Dale Anson, Kazutoshi Satoda).
-
-- Fix for files in buffer switcher not ordered (tracker 2183929). Sorting is
- now immediate on changing the preferences in the option dialog (Dale Anson)
-
-- Fix for View->Show Buffer Switcher does not show the buffer switcher (tracker
- 2179149) (Dale Anson) This menu item is intended to show the buffer switcher
- drop down, which isn't necessary if the buffer switcher is not visible. Now
- the visibility of this menu item is the same as the visibility of the buffer
- switcher.
-
-- When having split view, dropping a file on the inactive textArea was opening
- it to the active textArea (#2321838) (Matthieu Casanova, Shlomy Reinstein)
-
-- MD5 hash calculated inside read-lock, and also after buffer saves (#2780652).
- (Alan Ezust)
-
-- Fix drag & drop in BufferTabs, which broke as a result of BufferSet ignoring
- changes in buffer index (#2100690) (Shlomy Reinstein).
-
-- Fix #1974620: Cannot use C+e C+BACK_QUOTE for close-docking-area.
- (Shlomy Reinstein)
-
-- Fixed a NPE which had prevented to switch from a loading buffer to
- another. (Kazutoshi Satoda)
-
-- Fix #2017514: Selection occasionally lost after right-click.
-
-- The status bar label did not follow the editor colors (Matthieu Casanova)
-
-- Fix #2519873: MyDoggyPlugin : the dockables are immediately loaded.
- Each plugin dockable that was configured by the properties file to be docked
- was immediately loaded and made visible when the plugin was loaded. Now, it
- uses lazy instantiation and only its anchor button is shown. (Shlomy Reinstein)
-
-- Fixed a bug in OperatingSystem.getScreenBounds() (Matthieu Casanova)
-
-- Fixed JVM detection that was broken with java 1.6 (Matthieu Casanova)
-
-- Fixed a NPE in Buffer.setMode() if the defaultMode is null (Matthieu Casanova)
-
-- Folded lines could become invisible if "delete-line" action was used
- at a collapsed fold. (SF.net bug #2548764 - Kazutoshi Satoda)
-
-- With non-global BufferSet scope, closing the first view of multiple
- views could loose dirty buffers.
- Now a confirmation dialog is shown on closing a view as well as
- exiting jEdit. (SF.net bug #2091052 - Kazutoshi Satoda)
-
-- With editpane BufferSet scope, buffers could be closed on unsplitting
- EditPanes.
- Now all buffers are kept on the remaining EditPane. (Kazutoshi Satoda)
-
-- Fixed #2688862: "Redo HyperSearch" uses title of last search.
- (Shlomy Reinstein)
-
-- Fixed #2712031: Index out of bounds exception in FilteredListModel.
- (Shlomy Reinstein)
-
-- Fixed #1633393: TextArea painting corruption when saving
- (Dale Anson)
-
-- Fixed #2609091: Windows appear out of view. Caused by starting jEdit in a
- single monitor environment, where last time it ran in the 2nd monitor of a
- dual monitor environment. (Shlomy Reinstein)
-
-- Fixed #1593576: Autoindenting should copy exact whitespaces.
- (Shlomy Reinstein)
-
-- Fixed #2744708: Deleted file doesn't show as dirty buffer. (Shlomy Reinstein)
-
-- Fixed #2777073: Fix gutter width for line numbers. Minimal number of digits
- to reserve for line numbers can be controlled using the Gutter option pane.
- (Shlomy Reinstein)
-}}}
-{{{ Miscellaneous
-
-- jEdit settings directory is now stored in a sane location on Mac
- (HOME/Library/jEdit). Old settings are moved to new location unless a custom
- location is set through (-settings=foo). (Seph Soliman)
-
-- Page-scrolling changed to CTRL+SHIFT+scroll instead of SHIFT+scroll
- due to Java on Mac.
- (Seph Soliman)
-
-- Removed redundant TextArea:EditPane map in EditPane.java in favor of a linear
- search through parent container linked list. (Alan Ezust)
-
-- Applied patch #2296738: File/Directory properties dialog for VFS browser.
- The context menu of the VFS browser now has a "Properties" menu item that
- shows the properties of the selected node(s) in a dialog.
-
-- Implemented feature request #2555956: Show presence of jedit server. The About
- dialog now shows the mode in which jEdit is running: server,
- server-background, or standalone. (Shlomy Reinstein)
-
-- New action: Toggle exclusive BufferSets (Alan Ezust # 2060078).
-
-- Added configurable highlighting of the matching text in hypersearch results,
- which is part of feature request #2446121. (Shlomy Reinstein)
-
-- The JarClassLoader now allows to open resources from another jar
- (Matthieu Casanova)
-
-- Implemented feature request #2668434: fullscreen-mode. (Shlomy Reinstein)
-
-- When creating a directory in the VFS Browser the parent directory is expanded
- if it was closed (Matthieu Casanova)
-
-- Implemented feature request #1730845: Select line from gutter.
- Added a selection area to the gutter when line numbers are not shown. The
- selection area can be used for selecting lines from the text area (left-click
- or left-click and drag) and for toggling markers (right-click).
- The selection area can be enabled or disabled from the Gutter option pane.
- (Shlomy Reinstein)
-
-- Added an option in the Gutter option pane to enable or disable the gutter.
- (Shlomy Reinstein)
-
-- Added an option to search all open buffers to build the completion list.
- (Matthew Gilbert - SF.net patch #2569381, #2570229)
-
-- Added macro: "Files/Send Buffer to Next Editpane" for use with EditPane
- bufferset scope (Alan Ezust).
-
-
-}}}
-{{{ API Changes
-
-- Removed deprecated org.gjt.sp.jedit.msg.CaretChanging. Use PositionChanging
- instead - the former is no longer being used. (Alan Ezust)
-
-- The keybindings are reloaded when the properties are changed in the standalone
- textarea, and the StandaloneActionSet now takes an url to the actions.xml
- as constructor parameter (patch #2304608) (Dakshinamurthy Karra)
-
-- Added jEdit.openFile(EditPane, ....) methods to explicitely choose an editPane
- to open a file (Matthieu Casanova)
-
-- Added jEdit.newFile(EditPane, ...) methods to explicitely choose an EditPane
- to create a new file (Matthieu Casanova)
-
-- Added org.gjt.sp.jedit.menu.MenuItemTextComparator as the preferred
- alternative for deprecated MiscUtilities.MenuItemCompare.
- (Eric Berry - SF.net patch #2308329)
-
-- Removed BufferSet#getScope(). The scope of bufferset is a property of
- EditPane. Added EditPane#getBufferSetScope() and setBufferSetScope().
- Also removed EditPane#setBufferSet(), which was the way to set the
- scope of buffer set. (Kazutoshi Satoda)
-
-- Moved access methods for BufferSet instances to be more straightforward.
- - jEdit.getBufferSetManager().getGlobalBufferSet()
- -> jEdit.getGlobalBufferSet()
- - jEdit.getViewBufferSet(view)
- -> view.getLocalBufferSet()
- - jEdit.getEditPaneBufferSet(editPane) /* this might be unused one */
- -> editPane.getBufferSet() /* this is currently used one */
-
-- Removed BufferSetManager#hasListeners() which had always returned true.
-
-- Removed BufferSetManager#clear() which just made inconsistent state.
-
-- Added a new method jEdit.moveBuffer() to explicitly move a buffer in
- a BufferSet.
- This can be used to replace a hacky call of BufferSet#addBufferAt()
- which is used to move the buffer.
-
-- Added OperatingSystem.hasJava16() method and made deprecated
- OperatingSystem.hasJava15() and OperatingSystem.hasJava14() since jEdit
- requires Java 1.5 at least (Matthieu Casanova)
-
-- Added a new interface for docking framework plugins to react to newly loaded
- dockables (fixed bug #2519873). (Shlomy Reinstein)
-
-- Added the API DockingArea.getDockables() to support the Docker plugin.
-
-- Added new constructor to OptionsDialog.OptionsTreeModel that allows setting
- the root group of the tree. (Marcelo Vanzin)
-
-
-}}}
-{{{ Editing
-
-- New powershell edit mode (patch #2734116) (Sergey Mezentsev)
-
-- New jedit-actions edit mode that delegates to beanshell the <CODE> tags
- (Romain François)
-
-- Javascript brace indentation patch (Eric Berry # 2808701)
-
-- New N3 edit mode (Jakub Roztocil # 2772966)
-
-- New stata/stata-ado modes (Goebbe # 2664474)
-
-- New YABasic edit mode (Ben Dutcher # 2716891)
-
-- Updated SAS edit mode (Ian Helgesen # 1806510, goebbe #2675761, #2793540).
-
-- New JavaFX edit mode (Matthieu Casanova)
-
-- Updated Antlr mode (LDiracDelta # 2013652 )
-
-- New Pure mode (http://code.google.com/p/pure-lang - asitdepends # 2716903)
-
-- new TurboBasic mode (Ben Dutcher - # 2716903)
-
-- New YAML editing mode (Jakub Roztocil - #2604705 )
-
-- Removed ML indenting from ML mode (Lucas Dixon - #2382013)
-
-- Updated Lilypond mode (Bertalan Fodor # 2538906)
-
-- New mode for GraphViz Dot (Kevin Hunter # 1991303)
-
-- New mode for Great Cow Basic (Mark Twomey # 2055913)
-
-- New mode for TSP (goebbe - #2155442)
-
-- New mode for VRML2 (Jimmy Chaw #2297731)
-
-- Improved Ada mode (Peter Chapin - # 2022589)
-
-- New mode for Clojure (David Moss # 2201893)
-
-- LineComment property for TCL mode (Albert Davidson Chou # 2119958)
-
-- Improved VHDL mode (M. Cesar R. Lacruz - # 2082454)
-
-- Fixes to XSLT mode (Pascal Sancho - # 1954810, Greg Knittl # 2148505)
-
-- New icalendar mode (Victor Engmark - #1934498)
-
-- Fix for java mode (tracker 737187), method name not always highlighted if
- there were one or more spaces or tabs following the method name (Dale Anson)
-
-- Fix for jsp mode (tracker 846913), syntax highlighting doesn't ignore comments
- and strings, where a single line java comment on the same line as a scriptlet
- terminator improperly highlighted the terminator as a comment (Dale Anson)
- (Note: This change was reverted on 4.3.0)
-
-- HTML mode: Fix delegation of "style" attribute to CSS mode and delegate
- on* attributes to JavaScript mode (Daniel Hahler)
-
-- SF Bug #1947324: Bring Perl mode up to date with Perl 5.10
- Add some new keywords and operators to the perl mode. (Markus Laker)
-
-- Added COMMENT3 in javascript mode (bug #2474585) (Matthieu Casanova)
-
-
-}}}
-
-}}}
-
-{{{ Version 4.3pre16
-
-Thanks to Björn "Vampire" Kautler, Kazutoshi Satoda, Dakshinamurthy Karra,
-Matthieu Casanova, Alan Ezust, Bernhard Walle, Shlomy Reinstein, Greg Merrill,
-Jeff Robertson, Kevin Hunter, and Eric Berry for contributing to this release.
-
-{{{ Bug Fixes
-
-- When the bufferSet were not sorted it was possible to have two time the same
- buffer in a bufferSet (Matthieu Casanova)
-
-- When changing the antialiasing mode to none, jEdit do not need to be restarted
- anymore (patch #2115400) (Dakshinamurthy Karra)
-
-- The standalone textarea reloads the properties of the buffer when properties
- are changed (patch #2115400) (Dakshinamurthy Karra)
-
-- When the close dialog is open with a list of dirty files, if one of those files
- is closed in jEdit by another thread, selecting will remove the file from the
- dialog (#2129419) (Matthieu Casanova)
-
-- It is not possible anymore to open more than one clean untitled buffer in
- a bufferSet (Matthieu Casanova)
-
-- Closed buffers were often kept in memory. (Kazutoshi Satoda)
-
-- Error "Invalid screen line count" was shown when scrolling in a
- compound edit. (SF.net patch #1990960 - Kazutoshi Satoda)
-
-- Folded lines sometimes became invisible after breaking the fold
- structure; like explicit fold markers, or indents.
- (SF.net patch #1999448 - Kazutoshi Satoda)
-
-- Fixed char escape in shellscript (#2080891) (Kevin Hunter)
-
-- When closing a view or an EditPane, the dirty buffers of it's bufferSet are
- now added to the previous EditPane (#2091052) (Matthieu Casanova)
-
-- A memory leak fixed in the Activity Log panel (#2100926) (Matthieu Casanova,
- Kazutoshi Satoda)
-
-- When starting jEdit without a settings directory an error happened when saving
- backup of setting files (Matthieu Casanova)
-
-- The action on new bufferSet creation was not stored correctly in properties
- causing sometimes NPE (Matthieu Casanova)
-
-- When a bufferSet is sorted, dragging a buffer in BufferTabs plugin was not
- possible (#2100690) (Matthieu Casanova)
-
-- # 1519924 - Pressing escape in Path: field gets rid of dock window.
- (#1854542 - Jeff Robertson - jefftbob)
-
-- Fixed occasional input problems after switching application focus.
- (SF.net bug #2093501, #1650718 - Kazutoshi Satoda)
-
-- Numpad keys (ADD, SUBTRACT, etc) had been not bindable since 4.3pre13.
- (SF.net bug #1936714 - Kazutoshi Satoda)
-
-- When launching jEdit with some files in the command line if the bufferSet was
- not global, the files were opened but not visible in the editPane
- (Matthieu Casanova)
-
-- #1766853: View is not plain with -newplainview on first launch.
- '-newplainview' now works also when jEdit is not running.
- (Shlomy Reinstein)
-
-- Fixed the released size shown by jEdit.showMemoryDialog() which was
- wrong when GC compacted the total heap size. (Kazutoshi Satoda)
-
-- Fixed a long delay (typically 7-10 seconds) when showing the context menu
- of the text area or the drop down of a history text field the first time.
- This long delay was experienced mostly on Windows, and was caused by the
- call to GraphicsDevice.getConfigurations()
-
-- The search and replace regex can now match an empty string.
- (SF.net bug #1671312 - Matthieu Casanova, Shlomy Reinstein,
- Kazutoshi Satoda)
-
-- Some regex replace, like "\b" -> "|", falled into infinite loop.
- (Kazutoshi Satoda)
-
-- Fixed an exception when searching within a selection for the regexp '$', if
- the last selection line is empty. (#2173112) (Shlomy Reinstein)
-
-- Replace in selection which ends at middle of line for regex which ends
- with "$" could wrongly match the end of selection. (Kazutoshi Satoda)
-
-- When splitting the view, using editpane scope for bufferSet the new editPane
- contained all buffers instead of having only buffers from the active EditPane
- (#2152509) (Matthieu Casanova)
-
-- killring.xml or other XML files could be corrupted with control characters.
- (Kazutoshi Satoda)
-
-- BeanShell codes could access non-public members by default.
- (Kazutoshi Satoda)
-
-}}}
-{{{ Miscellaneous
-
-- Disabled the MacOS plugin by default for now. (Björn "Vampire" Kautler)
-
-- Added the absolute caret position in the caret status of the status bar
- (Matthieu Casanova)
-
-- Added a widget for the statusbar that displays the length of the current
- selection (feature #1912735) (Matthieu Casanova)
-
-- Moved buffer list sorting options from General to View Option Pane
- with other bufferset options. (Alan Ezust)
-
-- Enabled reverse regex search.
- (SF.net patch #1923613 - Greg Merrill, Kazutoshi Satoda)
-
-- New option in saving/backup: Never mark untitled buffers dirty.
- Related to that, buffers with length=0 never marked dirty.
- (request # 2068307 - Alan Ezust)
-
-- New option in saving/backup: Calculate MD5 hash to see if the
- file as loaded from disk is the same as what is in the buffer.
- (Request # 2077326 - Alan Ezust, Kevin Hunter, K. Satoda)
-
-- New action new-file-in-mode, which opens a dialog listing the
- available modes, the user can select one and a new file is created
- under that mode. (SF.net patch #1829669 - Eric Berry)
-
-- Removed own back buffers for textarea, which were meant to speed up
- painting textarea, because the effect seemed to be not noticeable and
- not stable over runtime environments, while it broke Background plugin
- (SF.net Plugin Bugs #1620694) and consumed much memory.
- (Kazutoshi Satoda)
-
-- Improved rendering of complex text layout (like Indic text) in text
- area. (SF.net bug #981012 - Kazutoshi Satoda)
-
-- Added some new encoding detectors which reads some lines at the top of
- file and search for encoding declaration pattern in regex.
- - html: finds "\bcharset=(ENCODING)"
- - python: finds "coding[=:]\s*(ENCODING)"
- (Kazutoshi Satoda)
-
-- Abbreviated buffer path in MiscUtilities.abbreviate()
- Replaces homedir with tilde, and reverse-expands environment variables.
- (# 1910097 - Jakub Roztocil, Alan Ezust)
-
-- Angle Brackets are now also matched from find matching bracket.
- (encorejane - # 1849215)
-
-- ActionSet combobox in "add to context menu" is sorted and remembers previous
- selection. (Alan Ezust)
-
-- Added right click popup menu to the Error widget in the status bar to clear
- all errors (feature #2122926) (Matthieu Casanova)
-
-- Added two new fold styles: Square folds (Explorer style) and round folds
- (Scintilla style). Created a service to provide the fold painter, and a
- property to select the fold painter service to use. The fold style can be
- changed using a new option in Global Options -> Gutter. (feature #1747300)
- (Shlomy Reinstein)
-
-- Changed the "HyperSearch_Results_to_Buffer" macro to include the results of
- all searches, not just the last one, and also the search matcher of each
- search, in order to be able to "import" the search results from
- the buffer later.
- Added a new "Buffer_to_HyperSearch_Results" macro that reads a buffer that
- was previously created by the "HyperSearch_Results_to_Buffer" macro, and
- possibly manipulated manually later, and imports the results from the buffer
- into the HyperSearch Results dockable. This macro handles the
- "regular expression" and "ignore case" options correctly.
-
-- Added macro Editing/Toggle_Fold.bsh for toggling the current fold.
- (feature #2190064) (Shlomy Reinstein)
-
-- Added a combo box to the Docking option pane (in the Global Options dialog)
- for selecting the set of dockables to configure (plugin / core / all).
- (feature #2199003) (Shlomy Reinstein)
-
-- Removed a JVM option "-Xms64M" from installed startup commands/scripts,
- which consumed too much memory. (Kazutoshi Satoda)
-
-}}}
-{{{ Docker Plugin features merged into jEdit Core
-
-- New actions: View - Docking - Load|Save docking layout (of current mode)
- You can save named dockable layouts, analogous to Eclipse perspectives,
- on a global or per-mode basis. (Shlomy Reinstein)
-
-- New action: View - Docking - Toggle Docked Areas. (Alan Ezust)
-
-}}}
-{{{ API Changes
-
-- A public field buffer in HyperSearchFileNode was removed. Use
- getBuffer() instead. (Kazutoshi Satoda)
-
-- A new service, DockableWindowManagerProvider, makes it possible
- for plugins to offer alternate docking managers. (Shlomy Reinstein)
-
-- Embedded textarea refactoring for better usability.
- Now a software that wants to use the jEdit's textarea must instantiate the
- class StandaloneTextArea, and for use in a jEdit's plugin
- JEditEmbeddedTextArea (patch #2096752) (Dakshinamurthy Karra)
-
-- SearchMatcher#isMatchingEOL(), which was introduced at 4.3pre7, has been
- removed in favor of better fix for the problem. (Kazutoshi Satoda)
-
-}}}
-{{{ Editing
-
-- New cmake mode (patch #2011419) (Bernhard Walle)
-
-- More patterns for shellscript filenames (# 2056778 - Kevin Hunter (hunteke))
-
-- added htaccess keywords AuthBasicAuthoritative and AuthBasicProvider
- (#2108778) (Matthieu Casanova)
-
-- Added some indent rules in shellscript.xml (Matthieu Casanova)
-
-}}}
-
-}}}
-
-{{{ Version 4.3pre15
-
-Thanks to Björn "Vampire" Kautler, Marcelo Vanzin, Matthieu Casanova,
-Seph M. Soliman, Alan Ezust, Robert Schwenn, Nils Nordman,
-Dale Anson, and Daniel Hahler for contributing to this release.
-
-{{{ Bug Fixes
-
-- The autosave feature was broken (#1957237) (Matthieu Casanova)
-
-- Toolbar overhaul: Toolbar buttons were inconsistently sizes across different
- L&Fs. (#1954020)
- In addition, toolbar buttons and toolbars now use JToolBar instead of just
- JPanel. The Open File dialog was also modified to remove the margin around
- the toolbar. (Seph M. Soliman)
-
-- The shortcut to create a new file in the VFSBrowser is now ctrl+n instead of
- just 'n' (#1965114) (Matthieu Casanova)
-
-- Some NPE fixed in status bar widgets when the view do not have a textArea yet
- (#1965532) (Matthieu Casanova)
-
-- VFSFileChooserDialog: back-arrow in filename textbox used to go up a
- directory, but was also used for going back a space in the text field.
- Disabled first behavior. (#1694133 - Alan Ezust)
-
-- VFSBrowser: Added shortcut "A+Up" to go up a dir.
- New browser directory stack actions: next/previous (A+Left and A+Right).
- Reworked tab-keyboard focus traversal policy. (Alan Ezust)
-
-- New Action: Scroll-And-Center-Caret Action. Restored previous
- behavior of center-caret-on-screen. (#1910061 - Alan Ezust)
-
-- A NPE was happened when loading several buffers at the same time and if the
- collapseFold bufferlocal property is set to something else than 0
- (#1982663) (Matthieu Casanova)
-
-- The shortcuts were not working in the file chooser dialog table
- because the filename field was always requesting the focus.
- (Matthieu Casanova)
-
-- When assigning escape shortcut to close-docking-area, it didn't work in the
- hypersearch result panel because the JTree has the focus, and "escape"
- keypress is assigned to "hideTip" action by the Swing framework. I removed
- this default assignment because nobody care hiding tooltips (#1955140)
- (Matthieu Casanova)
-
-- When the parent directory list is selected in the VFSBrowser, the selected
- files were always empty (Matthieu Casanova)
-
-- when opening the save dialog, if the choosen path's VFS is not browseable,
- the default directory is opened instead (Matthieu Casanova)
-
-- Better field control on Appearance and Saving & backups option panes
- (#2015210) (Matthieu Casanova)
-
-}}}
-{{{ Miscellaneous
-
-- In the auto-indent code, use read-only "CharSequence" instances to avoid
- creating new strings (which results in a copy of the original data). This
- should reduce a little the memory usage of that code. Also change some other
- code that can avoid the user of strings (such as the word completion action).
- (Marcelo Vanzin)
-
-- New status bar ErrorWidget added to display the 10 last exceptions that
- happened in jEdit (Matthieu Casanova)
-
-- Toolbar and context menu can now be restored to default setting
- (Seph M. Soliman - #1961989)
-
-- New BufferSet api. The EditPanes can now manage their own list of buffers,
- or share this list with the editpanes from the same view, and of course as
- usual share the same list between all EditPanes (the default behavior)
- A bufferSet widget is available for the status bar
- (Matthieu Casanova)
-
-- New text macro "Line_Filter.bsh" added. It can filter the lines of a buffer
- to remove the lines that match or do not match a char sequence (patch #1981501)
- (Robert Schwenn)
-
-- New Mac OS X application icon (Seph M. Soliman)
-
-- The plain view can now have a status bar, a new option is added to choose it
- in the status bar option pane, and a new toggle menu is added to show/hide
- status bar in view menu (#1984974) (Matthieu Casanova)
-
-- New images for splash screen and about dialog to match the new visual feel
- (Seph M. Soliman)
-
-- New option to make the caret thicker. (SF.net Patch #1608486 - Nils Nordman)
-
-}}}
-{{{ Editing
-
-- SF Patch #1947143: remove the hack to support sub names with apostrophes in
- perl mode. Hopefully no one will complain (the hack had its own problems,
- as the SF entry shows). (Marcelo Vanzin)
-
-- PHP mode:
- - add new ruleset PHP_EXPRESSION to handle separate expressions better,
- e.g. new support for constructs like "$a->{'bar-'.substr($b,1)}"
- - handle function definitions (DEF_FUNCTION* rulesets), e.g.
- "function foo( array $bar = null )"
- - handle var-vars (e.g. $$foo)
- - stricter, consistent matching of variable names
- - other minor fixes/improvements
-
-- Fix word separators in LaTeX mode (SF #1982712)
-
-- Added "initialize" as a keyword in ruby mode.
- (SF.net Patch #1783765 - Suraj Kurapati)
-
-}}}
-{{{ API Changes
-
-- Deprecated com.microstar XML parser. (Alan Ezust)
-
-- New DynamicContextMenuService allowing plugins to offer actions in the
- TextArea contextmenu that depend on the state of the textarea. (Alan Ezust, Dale Anson)
-
-- New methods were added to jEditBuffer to return CharSequence instead of
- String. StandardUtilities / TextUtilities were enhanced to provide functions
- that are not present in the CharSequence class, or were only available for
- Strings before. (Marcelo Vanzin)
-
-- Removed deprecated CaretChanging message, which was never in jEdit 4.2 anyway.
-
-- Added new EBMessage, PositionChanging, base class for BufferChanging,
- for navigable position changes within the same buffer. Replaces CaretChanging.
- Search - FindNext sends it before finding next. (Alan Ezust)
-
-- Deprecated a constructor of SegmentCharSequence which has reverse flag,
- in favor of a new class ReverseCharSequence. (Kazutoshi Satoda)
-
-- SearchDialog.preloadSearchDialog(View) is now completely removed after being
- deprecated for 2 years (Matthieu Casanova)
-
-- Removed an undesired dependency to jEdit from buffer.UndoManager which
- breaks independant textarea. (Kazutoshi Satoda)
-
-- New NumericTextField class. It is a TextField that accept only numeric values
- (Matthieu Casanova)
-
-}}}
-
-}}}
-
-{{{ Version 4.3pre14
-
-Thanks to Björn "Vampire" Kautler, Seph M. Soliman, Dale Anson, elvez671
-Alan Ezust, Andrey Khalyavin, Chris Petersen, Marcelo Vanzin, Joerg Spieler,
-Michael Schlotter, and Kazutoshi Satoda for contributing to this release.
-
-{{{ Bug Fixes
-
-- SearchBar appear/disapper fixes (# 1894235 - elvez671) - addresses
- bug # 1887293
-
-- Fixed NPE with tokenMarker in jEditBuffer.java (Ezust)
-
-- Reworked fold expansions [patch #1945472], which addresses #1942313
- and #1538715 (Andrey Khalyavin)
-
-- Fixed NPE on SplashScreen init on NX and older X-window displays.
- (#1628432, #1930320 - ezust, marcelo vanzin).
-
-- Fixed an ArrayIndexOutOfBoundsException when opening search dialog on a fresh
- install (#1913979) (Matthieu Casanova)
-
-- When a digit is typed for a completion popup to select a completion,
- the digit was inserted after the completed word.
- (SF.net Bug #1931333 - Kazutoshi Satoda)
-
-- SF Bug #1873290: perl heredoc syntax highlighting is broken
- Thanks to Valeri Mytinski for pointing out that it was fixable with the
- current code. :-) The mode parser wasn't honoring AT_LINE_START for end
- tags, so that is fixed. Also, add AT_LINE_START="TRUE" to the perl and
- shellscript heredoc rules' END tags. (Marcelo Vanzin)
-
-- When typing quickly in the activity logs filter, some exceptions were happening
- (patch #1938174) (Dale Anson)
-
-}}}
-{{{ Miscellaneous
-
-- Edit History Text
- Clicking on "Previously Entered Strings" pops up a dialog that lets you
- edit previously entered strings (Joerg Spieler - 1818140)
-
-- New Tango icon set (Seph M. Soliman - # 1755992)
-
-- Change the behavior of the directory chooser dialog slightly.
- (SF Bug #1932733 - Marcelo Vanzin)
-
-- When a file could not be loaded due to strict error about encoding,
- the file is now loaded permissively. (Kazutoshi Satoda)
-
-}}}
-{{{ Editing
-
-- Move_Lines_(Up|Down).bsh replaced by Dale Anson to handle edge conditions
- (#1915824)
-
-- fortran.xml indentation fixed (patch # 1740179 - honestguvnor + Robert Schwenn)
-
-- Rewritten latex.xml mode (Patch # 1928855 - Michael Schlotter)
-
-- SF Patch #1845842: perl.xml qq([test) syntax higlighting broken
- The q and qr operators were being highlighted wrong. The right way to do it
- is kinda messy, though, requiring a separate delegate depending on which
- character was used to start the quoted sequence. Applied patch is very
- similar to one in SF.net, with fixes for handling escaped characters
- correctly. (Chris Petersen, Marcelo Vanzin)
-
-- Comments and literals are now filtered before matching with regexps in
- indentNextLines, indentNextLine, unindentThisLine, and unindentNextLines.
- COMMENT(1-4) tokens are replaced by space so that they are ignored by
- autoindenting. Similarly, LITERAL(1-4) tokens are replaced by '0' which
- which means a simple integer literal in most programming languages.
- (Kazutoshi Satoda - SF.net Patch #1868690)
-
-- Tweaks to deep indent: ignore anything inside comments and literals, so
- alignment is only appied to actual code. Also, deep indent rules, if enabled,
- should have precedence over the open/close bracket rules. (Marcelo Vanzin)
-
-- SF Bug #1927869: Perl edit mode: qr/"/ breaks highlighting
- If was not really qr/"/, but qr!"!. Added "!" to list of allowed characters
- to delimit quote operators. (Marcelo Vanzin)
-
-}}}
-{{{ API Changes
-
-- New status bar api (Matthieu Casanova)
-
-- Added a method getPermissiveTextReader() to the interface
- org.gjt.sp.jedit.io.Encoding. (Kazutoshi Satoda)
-
-}}}
-
-}}}
-
-{{{ Version 4.3pre13
-
-Thanks to Björn "Vampire" Kautler, Matthieu Casanova, xlinuks,
-Kazutoshi Satoda, Alan Ezust, Marcelo Vanzin, Jeff Robertson, Jim Morris
-Eric Le Lay, zoniie, and Daniel Hahler for contributing to this release.
-
-{{{ Bug Fixes
-
-- After some keystroke like alt+tab the numpad stopped working until another
- printable key is pressed (#1788460) (Matthieu Casanova)
-
-- Windows installer now look for javaw.exe in SysWOW64 directory before
- in System32. This is required on 64-bit Windows XP and Sun's
- JRE(1.6.0u3) though 64-bit package is installed. Nothing is changed on
- 32-bit environment because it doesn't have SysWOW64 directory.
- (Kazutoshi Satoda - SF.net Bug #1849762)
-
-- Installer kills jEdit before installing (Eric Le Lay - # 2328002, 1953252)
-
-- If the autosave file path do not exists, it is ignored silently. As soon as
- this path exists again it will work as it should (#1825720) (Kazutoshi Satoda)
-
-- (Mac OS X only?) Fixed a focus problem with Unsaved Changes dialog.
- Textarea had focus when the dialog pop up.
- (Jeff Robertson - SF.net Bug #1779849, Patch #1852805)
-
-- Files Changed on Disk dialog moved focus to textarea when a file is
- selected in the list. (Kazutoshi Satoda)
-
-- A NPE fixed when creating and clearing a register quickly in a macro if the
- Registers view is open (Matthieu Casanova)
-
-- When clearing a register, the listeners are now notified (Matthieu Casanova)
-
-- If you delete a plugin, the plugins that depends on will be unloaded (after a
- confirmation) (Matthieu Casanova)
-
-- Column cursor (zero width rectangular selection) is now kept after
- completion. Only the built in word completion (C+b by default) is
- changed. Other completions provided by some plugins are not changed.
- (Kazutoshi Satoda - SF.net Bug #1866836)
-
-- Fixed a bug where screens were shown off-screen because of a typo in
- GUIUtilities.adjustForScreenBounds() (Björn "Vampire" Kautler)
-
-- In the replace dialog, the replace string can now use capturing groups above 9
- (#1834620) (Matthieu Casanova)
-
-- Electric scrolling done where it should not (#1906301 - zoniie)
-
-- untitled buffer were not closed with 2 views (#1869978) (Matthieu Casanova)
-
-- When closing a dockable panel, the DockableWindowUpdate.DEACTIVATED message is
- sent (#1075058) (Matthieu Casanova)
-
-- ScrollLineCount was not calculated correctly (#1906288, #1868923)
- (Matthieu Casanova)
-}}}
-{{{ Miscellaneous
-
-- In a directory search, if you use a regex, it is tested before, before listing
- files (#1556663) Matthieu Casanova
-
-- Bugfixes for Installer related to obsolete JVMs and invalid
- pathnames. (Eric Le Layk - # 2327864, 979086, 2327736,
- 1817421, 2582492, 2328160)
-
-- Installer for *nix platforms - simplified startup script
- (#2098720 - Bernhard Walle)
-
-- Center Caret On Screen now scrolls your document so your caret doesn't
- change. [ 1883809 - ezust ]
-
-- [About jEdit] dialog is refined. It now performs smoother animation
- and fade out effect. (xlinuks)
-
-- [Macros] Copying/cutting/moving/duplicating multiple vs. single lines
- [ 1849180 - encorejane ]
- renamed Move_Line_(Down|Up) to Move_Lines_$1,
- renamed (Copy|Cut)_Selection_Or_Line to $1_Lines
- new macros: Duplicate_Lines_(Above|Below)
-
-- The VFS Browser has a new command to paste a file.
- After copying the path name of a file, you can paste it in any folder to
- copy the file (Matthieu Casanova)
-
-- When opening the search dialog if no text is selected the searched string will
- be filled with the previous entered string (feature #1500938) (Matthieu Casanova)
-
-- The Activity Log option panel now have a textfield filter
- (feature #1593375) (Matthieu Casanova)
-
-- In the plugin manager, a new panel shows detailed informations about the
- installed plugins (Matthieu Casanova)
-}}}
-{{{ Editing
-
-- SF Bug #1853797: perl syntax highlighting: broken '\' after var interpolation
- The rule for matching literals was wrongly highlighting perl variables.
- Fix is to use the same rule used in the main rule set to match those
- variables. (Marcelo Vanzin)
-
-- Handling of /regexp/ in ruby mode is refined. (Kazutoshi Satoda)
-
- NOTE: If a regexp begins with a whitespace (including a newline), the
- beginning "/" is wrongly treated as a division operator. But such regexp
- is rare enough and one can use %r notations or write like "/\ ..." to
- force jEdit to treat it as a regexp.
-
-- Added macro Files/Duplicate_Buffer.bsh
- It copies the current buffer in a new untitled buffer
- (Request #1849184) (Matthieu Casanova)
-
-- Added macro Clipboard/Paste_Indent.bsh that paste and indent the clipboard
- (Request #1827083) (Matthieu Casanova)
-
-- Improved auto indentation in Ruby edit mode. It now unindents things
- like else, end, require etc on the fly.
- (SF.net patch #1726646 - Jim Morris and Kazutoshi Satoda)
-
-- Improved PHP edit mode (Daniel Hahler):
- - handle "${foo}" (SF Bug 1818619) and other valid expressions in literal,
- backticks and heredoc blocks
- - fix comment props for HTML in TAGS ruleset (C-e C-c/range-comment uses
- proper comment syntax there now)
- - fix delegating back from various rulesets (OBJECT_PHP, ...) to PHP
- ruleset; includes fixed handling of comments
- - fix matching of PHP vars (using SEQ_REGEXP instead of MATCH_FOLLOWING),
- so that it does not match "$foo\" completely; now uses the exact regexp
- for valid variable names
- - add ruleset PHP_COMMENTS (re-factored)
-
-- tpl mode: delegate {php} tags to PHP mode (Daniel Hahler)
-
-- Added regex highlight in javascript mode (#1042013) (Matthieu Casanova)
-
-- assembly-mcs51 mode was missing in the catalog (#1887865) (Matthieu Casanova)
-
-- transact-sql (tsql) mode: Fix escaping in string literals (#1007881) and
- highlight identifiers (`foo`) as LITERAL2 (Daniel Hahler)
-}}}
-{{{ API Changes
-
-- Moved gnu.regexp out of jedit core and into the GNURegexp plugin.
-
-- Added class AbstractContextOptionPane for plugins which want to provide a
- panel similar to jEdit's context menu editor. The API is sort of restrictive
- right now, but can be enhanced later, if needed. (Marcelo Vanzin)
-
-- Added a new method View#setBuffer(Buffer, boolean, boolean). The third
- parameter "focus" specifies whether the textarea should request focus.
- (Jeff Robertson - SF.net Patch #1852805)
-
-- Added a new method View#showBuffer(Buffer), which is similer with
- goToBuffer() but doesn't move focus to the textarea.
- (Kazutoshi Satoda, based on Jeff Robertson's patch #1852805)
-
-- Some improvements are made in CompletionPopup.
- - Eliminated possibe undesired effects of setKeyEventInterceptor()
- while the popup is not shown yet or already disposed.
- - KeyEvents which are not consumed in keyTyped() now work as if they
- were passed to View.
- - Added a new constructor which does not require a position.
- (Kazutoshi Satoda)
-
-- Added org.gjt.sp.util.SyntaxUtilities that will contains some syntax methods
- most of them comes from GUIUtilities
- (Matthieu Casanova)
-
-- A new interface JEditVisitor is added and implements the pattern Visitor.
- It can visit the views, edit panes and textareas using the method
- jEdit.visit(JEditVisitor) or View.visit(JEditVisitor) (Matthieu Casanova)
-
-- New FilteredListModel class that helps creating a filtered JList
- (Matthieu Casanova)
-}}}
-
-}}}
-
-{{{ Version 4.3pre12
-
-Thanks to Björn "Vampire" Kautler, Joe Walp, Matthieu Casanova,
-Marcelo Vanzin and Daniel Hahler for contributing to this release.
-
-{{{ Bug Fixes
-
-- When removing a plugin that is not loaded, it's declared jars are now removed
- too (Matthieu Casanova)
-
-- jEdit will not crash anymore if a beanshell.jar is already in the classpath
- (#893349) (Matthieu Casanova)
-
-- The BufferHistory is now thread safe (#1808797) (Matthieu Casanova)
-
-- Parsing XML files now uses correct encoding (which is declared in its
- source or UTF-8 by default) instead of the system default encoding.
- (Kazutoshi Satoda)
-
- NOTE: Related to this fix, some XML files which are saved by older jEdit
- may not be correctly loaded. They used the system default encoding and
- didn't declare the encoding (meaning they should use UTF-8). recent.xml,
- perspective.xml and registers.xml are known (and fixed).
-
-- Changed the encodings of recent.xml, perspective.xml and registers.xml
- to UTF-8 to allow characters which are not covered by the system default
- encoding in them. (Kazutoshi Satoda)
-
-- SF Bug #1764090: Slight Error in jedit.desktop file
- There was actually an error in jEdit.java that caused it to hit an
- NPE when processing URLs provided in the command line. Fix it by not
- trying to find an open buffer when trying to parse an URL in the
- openFile() method. (Marcelo Vanzin)
-
-- SF Bug #1729313: BeanShell Error on Loading jEdit 4.3pre9
- We need to force the default encoding to UTF-8 when running startup scripts,
- otherwise jEdit will fail to run the scripts shiped with it. On the flip
- side, if the user wants to use a different (non-compatible) encoding that
- is not trivially detected (such as anything with a BOM), a buffer-local
- property defining the encoding should be provided. (Marcelo Vanzin)
-
-- registers.dtd now allow zero ENTRY element in ENTRIES. It required at
- least one ENTRY while jEdit creates zero ENTRY case in registers.xml.
- (Kazutoshi Satoda)
-
-- Fix escape handling in the syntax highlighter. The handling of escape rules
- is now much more simplified: it's not only a lot less code but it's much
- easier to understand what it's actually doing. This fixes the following
- bugs: 1812205, 1807549, 1760646 and 1600458 (although the last one is fixed
- as a side effect, not because the root cause of the bug was fixed.)
- (Marcelo Vanzin)
-
-- Binding simple "+" (not VK_ADD nor VK_PLUS) as a shortcut is now possible.
- (SF.net Bug #1166530 - Kazutoshi Satoda)
-
-- Windows installer now prefer the path of javaw.exe in system directory
- to JDK/JRE directory, which was dependant on Java's version. Now you can
- update Java without reinstalling jEdit.
- (SF.net bug #1227497 - Kazutoshi Satoda)
-
-- Manually changed edit mode was reset by the mode in recent files at
- saving the buffer. (Kazutoshi Satoda)
-
-- Explicit "mode" value in props for jEdit.openFile() or
- jEdit.openTemporary() was overwritten by the mode in recent files.
- (Kazutoshi Satoda)
-
-}}}
-{{{ Miscellaneous
-
-- After an hypersearch, if a result is on the caret line, it is automatically selected
- in the tree (Matthieu Casanova)
-
-- If you remove the last node of the HyperSearch dockable, it will hide
- (Feature Request #1593526) (Matthieu Casanova)
-
-- A new option introduced in Saving & backups option panel to turn off autosave
- of untitled buffers (Feature Request #1520769) (Matthieu Casanova)
-
-- New option in General Options: Check for File Change upon. Many options
- to customize when jEdit checks for file changes, especially useful when many
- files are mounted on remote/slow file systems. (Joe Walp - Patch # 1768638)
-
-- A new button is introduced in the plugin manager : "Find Orphans".
- It will find the jars that are in your jars directory and do not belong to any
- plugin. Be careful some plugins like SQL can use jars without declaring them
- like the JDBC drivers (Matthieu Casanova)
-
-- A new option is introduced in the general option panel. Now jEdit will ask
- the user if he wants to stop hypersearch if a result count limit is reached.
- By default the count is 1000. It checks the limit before each file so it is
- possible that a few more results are found before asking (Matthieu Casanova)
-
-- The release date in the plugin install panel is now aligned to the right (Matthieu Casanova)
-}}}
-{{{ Editing
-
-- Some enhancements to the IDL mode, and made some definitions in the C mode
- more reusable. (Marcelo Vanzin)
-
-- NO_ESCAPE is now deprecated and ignored by the parsing engine. ESCAPE is now
- a valid attribute for SPAN and SPAN_REGEXP rules. All mode files updated to
- follow the new escape rule semantics. (Marcelo Vanzin)
-
-- Use MARKUP for tags in HTML mode and delegate css "style" attributes to the
- CSS mode. (Daniel Hahler - Patch # 1783634)
-
-- Improved ml mode. (Lucas Dixon - Patch # 1834109)
-
-}}}
-{{{ API Changes
-
-- The bsh package was refactored to org.gjt.sp.jedit.bsh, all plugins that uses
- classes from this package will have to be repaired. This was necessary to fix
- bug (893349) (Matthieu Casanova)
-
-- A new GUIUtilities.listConfirm() method that returns also the selected items
- in the list (Matthieu Casanova)
-
-- JEditBuffer.undo() and JEditBuffer.redo() now takes a
- org.gjt.sp.jedit.textarea.TextArea as parameter (Matthieu Casanova)
-
-- Cleaned up org.gjt.sp.jedit.buffer.KillRing to improve independence
- from jEdit's core. This narrowed a few parts of API. This can break
- some existing macros or plugins.
- - It no longer has any protected data field. Use public or protected
- methods including a new protected method reset() instead.
- - KillRing.KillRingHandler was removed because it should be a part
- of the core which does save the killring into a XML file. It
- became a private part of the core.
- (Kazutoshi Satoda)
-
-- Dropped some concrete classes from API. They are just implementation
- details of the core. Use more abstract base classes or interfaces
- instead.
- - org.gjt.sp.jedit.bufferio.JEditKillRing
- -> org.gjt.sp.jedit.buffer.KillRing
- - org.gjt.sp.jedit.JEditMode
- -> org.gjt.sp.jedit.Mode
- - org.gjt.sp.jedit.JEditRegisterSaver
- -> org.gjt.sp.jedit.RegisterSaver
- - org.gjt.sp.jedit.JEditRegistersListener
- -> org.gjt.sp.jedit.RegistersListener
- (Kazutoshi Satoda)
-
-- Added a new method ModeProvider.getModeForFile() that will try to find an
- appropriate mode for a filename (Matthieu Casanova)
-
-- Added a new method EditPane.initPainter() that can be used when using a
- TextArea in the core or a plugin (Matthieu Casanova)
-
-- Added a new method GUIUtilities.getShortcutLabel() that makes a label
- string to show users what shortcut are assigned to an action.
-
-}}}
-
-}}}
-
-{{{ Version 4.3pre11
-
-Thanks to Matthieu Casanova, Kazutoshi Satoda, Shlomy Reinstein,
-Björn "Vampire" Kautler, Marcelo Vanzin, Daniel Hahler, strank, Adam Sawicki,
-Scott LeBaron, Seph M. Soliman, Joerg Spieler, Alan Ezust, xlinuks,
-Orhan Alkan and Krassimir Berov
-for contributing to this release.
-
-{{{ Bug Fixes
-
-- NPE in scroll code when deleting some content with no wrap but some
- closed folds (#1763932) (Matthieu Casanova)
-
-- If the cached plugin list xml is broken, it is deleted and reloaded
- (Matthieu Casanova)
-
-- Fixed a bug when calling a macro during macro recording (#1765738)
- (Matthieu Casanova)
-
-- When removing content in a buffer when having softwrap on a NPE was
- happenning in some case (#1775258) (Matthieu Casanova)
-
-- When changing download mirror, the plugin list cache was not refreshed
- (Matthieu Casanova)
-
-- Reload/ReloadAll now ignores buffers with the UNTITLED flag set (instead
- of NEW_FILE). (#1720572) (Matthieu Casanova)
-
-- SF Bug #1760646: perl colorization
- Escape rules for child rule sets were being ignored. Since the perl mode
- doesn't define a top-level escape char, escaped sequences inside strings
- were not being properly recognized. Fix looks for the contextual escape
- rule before trying to delegate to the parent's escape rule. (Marcelo Vanzin)
-
-- Explicit folds are now expanded when deleting the '{' at the fold start
- (#1193683) (Matthieu Casanova)
-
-- Folds are now expanded when inserting new line at the fold start,
- and when breaking explicit fold start (#950961) (Matthieu Casanova)
-
-- The format-paragraph action was not recorded in macros (#1726207)
- (Matthieu Casanova)
-
-- Changed the encoding of "history" file to UTF-8.
- (SF.net Bug #1691638 - Kazutoshi Satoda)
-
-- Fixed ArrayOutOfBoundsException when adding explicit fold at the end of
- a buffer with a mode that has a "line comment" property (#1560584)
- (Matthieu Casanova)
-
-- 1755430 - HistoryTextField looks bad with native GTK+ LnF (Seph M. Soliman)
-
-- SF Bug #1742250: use of DELEGATE in mode rules can cause rules to be
- missing. (Daniel Hahler)
-
-- Failure of autosave which was silently ignored is now handled and reported.
- (SF.net Bug #1775281 - Kazutoshi Satoda)
-
-- IllegalCharsetNameException was not handled. It could be thrown for XML
- encoding declaration or [Reload with Encoding] action. (Kazutoshi Satoda)
- (This bug was reported by Andre Rudlaff as SF.net Patch #1789707)
-
-- Removed hard coded "C:\Program Files" from Java based installer. It now
- uses %ProgramFiles% (a builin environment variable) instead.
- (SF.net Bug #917669 - Kazutoshi Satoda)
-
-- Changed the default mirror from NONE to switch.
- (bug #1757229) (Björn "Vampire" Kautler)
-
-- Fixed the "Evaluate Buffer in BeanShell" macro so that it does what its
- description states, that is evaluating the buffer in current state. Before
- the macro used the last saved state. Additionally the result of the toString()
- method of the return value of the scirpt, if any, is added to the newly
- created buffer in a new line. (bug #1554769) (Björn "Vampire" Kautler)
-
-- Fixed inconsistent indentation which happened when adjacent lines both
- match with "unindentThisLine" pattern and they should be placed at first
- column. (Kazutoshi Satoda)
-
-- Dropping files was broken when using Gnome Nautilus (patch #1795592)
- (xlinuks)
-
-}}}
-{{{ Miscellaneous
-
-- ViewUpdate.CLOSED is now sent for all views. Previously, the view from where
- the exit request originated would fail to send a ViewUpdate.CLOSED message.
- (Marcelo Vanzin)
-
-- New Interface: DockableWindow.java, an interface for jEdit dockable windows.
-
-- When clearing all hypersearch results the HyperSearch Results dockable panel
- will hide (feature #1593526) (Matthieu Casanova)
-
-- The release note of the plugins in the PluginManager install panel now displays
- html (Matthieu Casanova)
-
-- PluginManager InstallPanel: All columns are sortable in either directions (#1781853 - Joerg Spieler)
-
-- When dropping a directory on the textarea, the VFSBrowser will now browse to it
- (Matthieu Casanova)
-
-- A new action "edit-syntax-style" that opens a dialog to change the token
- under the caret (patch #1788847) (Shlomy Reinstein)
-
-- The plugin install panel now has a sortable column containing the release date
- of the plugin (Matthieu Casanova)
-
-- When editing toolbar the dialog now remembers the last action set
- (#1538743) (Matthieu Casanova)
-
-- The shortcuts option panel now have a textfield filter
- (Matthieu Casanova, Shlomy Reinstein)
-
-- The recent files now remembers the edit mode (feature #1593543)
- (Matthieu Casanova)
-
-- The Deb Ant Task now works with Ant 1.7 too. (Björn "Vampire" Kautler)
-
-}}}
-{{{ Editing
-
-- Improvements to PHP edit mode (patch #1740618, bugs #1716134, #1504855)
- (Daniel Hahler)
-
-- Added RFC edit mode (Matthieu Casanova)
-
-- reST mode: improved handling of comments and literal blocks (SF: #1748471)
- (strank)
-
-- Added HLSL edit mode (SF: #1724921) (Adam Sawicki)
-
-- Added CLIPS edit mode (SF: #1745999) (Orhan Alkan)
-
-- Added Template Toolkit edit mode (SF: #1738800) (Krassimir Berov)
-
-- Added macros Editing/Open_Line_(Above|Below).bsh (Scott LeBaron) (sf: 1746798)
-
-- Added "self" keyword in python edit mode (Matthieu Casanova)
-
-- Added the "indent" properties to pl-sql edit mode (Matthieu Casanova)
-
-}}}
-{{{ API Changes
-
-- new class: org.gjt.sp.jedit.msg.VFSPathSelected EBMessage gets sent
- whenever a node in the VFSBrowser is clicked. (#1730075 - Alan Ezust)
-
-- org.gjt.sp.jedit.gui.CompletionPopup has been extracted to provide basic
- UI of word completion. (SF.net patch #1752044 - Kazutoshi Satoda).
-
-- org.gjt.sp.jedit.io.VFS.BROWSE_CAP is not deprecated anymore and browseable
- VFS must define this property (Matthieu Casanova)
-
-- A new boolean attribute, 'MOVABLE', can now be specified for <DOCKABLE> tags
- in the 'dockables.xml' file. (1782091 - Shlomy Reinstein)
-
-- A new interface, DockableWindow, is introduced for MOVABLE dockable windows to
- be notified before their docking position is changed. (1782091 - Shlomy Reinstein)
-
-- The BufferListener has a new method preContentInserted() (Matthieu Casanova)
-
-- New FilteredTableModel class that helps creating a filtered JTable
- (Matthieu Casanova, Shlomy Reinstein)
-
-}}}
-
-}}}
-
-{{{ Version 4.3pre10
-
-Thanks to Björn "Vampire" Kautler, Alan Ezust, Jakub Roztocil,
-Matthieu Casanova, Nicholas O'Leary, Marcelo Vanzin, Kazutoshi Satoda,
-Joseph Erickson, David Moss, Horst Eff, Daniel Hahler, Stephen Co,
-Shlomy Reinstein, Daniel Johnson, javacorner, Chris Grindstaff,
-and Mike Gorski for contributing to this release.
-
-{{{ Bug Fixes
-
-- On windows the read-only flag on folders is ignored now for finding
- the two-stage save name because it has not write protecting function
- in windows. (bug #1719711) (Björn "Vampire" Kautler)
-
-- Menu Shorcuts are displayed with the L&F font now if one is
- present for accelerator keys. (patch #1733221) (Daniel Johnson)
-
-- Memory leak in jEdit.closeView() fixed (Chris Grindstaff).
-
-- typing in multiple select works now. (#1724940) (Shlomy Reinstein)
-
-- When clicking on an hypersearch result, if the buffer was not opened,
- the BufferUpdate.LOADED message was sent with a null view
- (patch 1744674) (Shlomy Reinstein)
-
-- 1592085 - Now able to abort collection of files for search in directory
- (Alan Ezust)
-
-- A minor bug of cursor changing when dragging dockable panels
- using non continuous layout (Matthieu Casanova)
-
-- special characters in file:// URLs passed on to jEdit.openFile()
- were not being properly decoded (1663617).
-
-- Gutter line number interval highlighting corrected
- when used with soft wrap (patch 1687147 - Stephen Co).
-
-- 1667659 - Fix for FTP I/O regression in 4.3pre9 (Kazutoshi Satoda)
-
-- HyperSearch Results does not lose focus on enter (Bug 1260023,
- Patch 1646058) (Kazutoshi Satoda)
-
-- Improved handling of file encoding (patch 1687684) (Kazutoshi Satoda)
-
-- Use encoding in buffer histories for temporary buffers (Patch
- 1687284) (Kazutoshi Satoda)
-
-- In the logviewer if the tail checkbox is on,
- the last line was not visible after resizing the panel
- (Matthieu Casanova)
-
-- Autoreload buffer without notification was not available in
- General option pane (bug #1641997) (Matthieu Casanova)
-
-- When saving a buffer, if the encoding is unsupported,
- an error dialog appears (Matthieu Casanova)
-
-- A bug when loading a plugin the dependency check had errors :
- for example when you have Sidekick, JavaSidekick and another plugin
- that requires Sidekick (PHPParser, XML ...)
- in your jar folder, all unloaded, try to load the third one,
- the dependency check will try to load JavaSidekick instead of
- Sidekick (Matthieu Casanova)
-
-- VFSBrowser.filesActivated() - passed proper View to jEdit.openFile()
- from FSB open action (Alan Ezust).
-
-- jEdit shell scripts and batch files didn't handle spaces
- in filenames (#1649695) (Björn "Vampire" Kautler)
-
-- Macro Single_Space_Buffer was broken (#1525313) (Matthieu Casanova)
-
-- Scrolling up broken after content removing (#1584436) (Matthieu Casanova)
-
-- SF Patch #1663901: Improve performance in TokenMarker.handleRule()
- Daniel Hahler reported that jProfiler found some unoptimized code in
- TokenMarker.handleRule(). Instead of applying his patch directly, I
- implemented another approach and also took care of the other case
- of allocating a new string to do a comparison. (Marcelo Vanzin)
-
-- SF Patch #1656225: Disable encoding auto detection which overrides a selection
- When reloading a file with a specific encoding or changing the encoding in
- the buffer options, disable encoding auto-detection for the buffer.
- (Kazutoshi Satoda)
-
-- SF Bug #1664900: Auto-indent breaks if previous line is a single line indent
- The "collapse" action used as a hint for the OpenBracketIndentRule needs to
- differentiate between the actions being triggered by code in the previous
- line or by code in the "previous previous" line. This way, for example, a
- "for" declared after an "if" that didn't use brackets will, correctly, not
- be indented one level below the if. See the bug for more "graphical"
- depictions. (Marcelo Vanzin)
-
-- Some bugfixes and improvements to ExtendedGridLayout. (Björn "Vampire" Kautler)
-
-- Fixed that files were shown in VFSBrowser in choose directory mode.
- (Björn "Vampire" Kautler)
-
-- Saving a buffer to another VFS was not working (some bugs with markers)
- (bug #1644479) (Matthieu Casanova)
-
-- SF Bug #1668893: Wrong conversion to UTF-16 (with BOM)
- A previous change of mine trying to fix another UTF-16 issue actually
- implemented the reverse of what the spec says: UTF-16LE and UTF-16BE don't
- have a BOM, while UTF-16 needs a BOM at the start. (Marcelo Vanzin)
-
-- SF Patch #1649033: Correct the focus after choosing the directory to search
- Focus the search dialog after choosing the search directory, instead of
- focusing the view. (Kazutoshi Satoda)
-
-- Fixed a problem with escape sequences where a delegate has the same as
- its parent and so the parents got overridden and was not able to
- escape the delegates end sequence. (bug #1630805) (Björn "Vampire" Kautler)
-
-- Correctly send a ViewUpdate.ACTIVATED message when the user closes a view
- and focuses the first opened view. (Marcelo Vanzin)
-
-- Fixed deep indent : now the deep indent works with the chars found in
- unalignedOpenBrackets property of the edit mode, and the matching
- end char is automatically set. (bug #1666815) (Matthieu Casanova)
-
-- Brackets in comments or literals (in terms of token types in edit mode)
- are now ignored for indent. (SF.net bugs #747769, #1229283, #1592989)
- (Kazutoshi Satoda)
-
-- Encodings option pane rewritten using a JCheckBoxList, fixed the too small
- scroll amount and enabled/disabled the buttons where appropriate.
- (bug #1540578) (Björn "Vampire" Kautler)
-
-}}}
-{{{ Miscellaneous
-
-- Plugin Manager: persistent Plugin Install Sets (1748509 - Alan Ezust)
-
-- Plugin Manager: Option to cache PluginList for a period of minutes
- (Alan Ezust)
-
-- Moved Encodings options out of General and into Encodings option pane.
-
-- New View option: amount of maximum visible rows in buffer switcher
- (Patch #1642574) (Jakub Roztocil)
-
-- The dockable panel splitter can now use continuous layout
- (Matthieu Casanova)
-
-- The plugin manager now shows you the size of the data stored by
- each plugin that use the new plugin home folder (Matthieu Casanova)
-
-- GeneralOptionPane - new checkbox (restore remote files on startup)
- (Alan Ezust)
-
-- New popup menu in the plugin manager to remove plugin data when
- the plugin uses the new plugin api (Matthieu Casanova)
-
-- New LayoutManager ExtendedGridLayout added. For further explanations see
- its JavaDoc. (Björn "Vampire" Kautler)
-
-- New popup menu in Register dockable panel (Matthieu Casanova)
-
-- Removed the calls to begin- and endCompoundEdit() in macros as
- macroinvokations are always automatically embedded inside a compound
- edit. (Björn "Vampire" Kautler)
-
-- Refactored the use of hypersearch-results.file-caption and
- hypersearch-results.result-caption to only use one property instead of three
- depending on the amount of found occurrences. (Björn "Vampire" Kautler)
-
-- SF Patch #1678608: Improve performace in findMatchingBracket
- Return earlier if matching bracket is unknown. (Daniel Hahler)
-
-- Added the time in Log._log() so that events and exceptions could easier be
- assigned to interactions. (Björn "Vampire" Kautler)
-
-- SF Patch #1469586: Allow setting Mac OS type and creator to be optional
- Change to MacOS plugin. (Mike Gorski)
-
-- Some HelpViewer usability fixes. Now only one node is selectable in the TOC,
- Enter key opens the selected topic, on topic changing the focus travels to
- the JEditorPane and the arrow keys can be used to scroll horizontally and
- vertically instead of moving the invisible caret which scrolls only when
- the invisible caret hits page boundaries. Additionally the history remembers
- the vertical scroll position now. (Björn "Vampire" Kautler)
-
-- Added a new option "List of encoding autodetectors" in Encodings option pane
- to extend encoding autodetection with the new EncodingDetector services.
- (Kazutoshi Satoda)
-
-- Allow jEdit to autodetect :encoding= properties in the loaded buffer
- (only in the 10 first lines) by adding "buffer-local-property" to
- the new option "List of encoding autodetectors" in Encodings option pane.
- (Matthieu Casanova and Kazutoshi Satoda)
-
-- Improved the error message of encoding errors on saving. It now shows
- the first guilty character with column number, line number and the name
- of actual encoding. (Kazutoshi Satoda)
-
-- A new action on the popup menu in the Hypersearch dockable panel to redo the
- hypersearch (Matthieu Casanova)
-
-- When calling "line-comment" action, if the edit mode doesn't have a line
- comment property, the lines are surrounded by range comments
- (Matthieu Casanova)
-
-- SF Bug 1723506: Context menu key not functional on Windows
- There was no action to show the popup menu. Added one such action, and
- bound it to CONTEXT_MENU by default. (Marcelo Vanzin)
-
-- Added a new option "List of fallback encodings" in Encodings option pane
- to automate trial-and-error cycle with a known set of encodings to load
- a buffer. (Kazutoshi Satoda)
-
-- Glob translation to regexes got a new feature. If you start a glob now
- with the sequence "(re)" this prefix is discarded and the remaining
- string is interpreted unchanged as regex. If you need a glob starting
- with "(re)" you have to escape it and write "\(re)" instead. So now you
- can use EVERYWHERE a glob is expected a normal regex instead and use
- their full power. (Björn "Vampire" Kautler)
-
-}}}
-{{{ Editing
-
-- New Edit Mode: sql-loader (David Moss)
-
-- New edit mode: csv (jaco de groot).
-
-- Make the auto-indent code more friendly to languages where whitespace matters
- more than usual, such as Python. A new mode property (ignoreWhitespace) was
- added, which, when false, triggers some whitespace-related indent rules. Right
- now it's tuned to Python, since I'm not familiar with other languages that
- share the same characteristics. This also fixes SF bug #1382388. There are
- some cases when some weird behavior still happens, when deep indent is
- turned on. (Marcelo Vanzin)
-
-- Applied SF Patch #1663485: perl.xml patch for variables
-
-- Applied SF patch #1667234: clearer comments in certain parts of perl.xml
-
-- Change the way perl "quote operators" are matched. See SF Patch #1659666
- for discussion. The fix is twofold: first, add a new "special" value for the
- end tag in SPAN_REGEXP, "~[digit]", which tries to find the matching bracket
- of the matched reference (if can't find the matching bracket, just use the tag
- body as a literal string). Second, add a new rule that highlights everything
- as "LITERAL1", used to maintain balanced brackets, and use it to highlight
- everything inside a "q" operator. This probably needs more tweaking, i.e.,
- supporting quote operators that allow interpolation, and change the other
- operators that look like "q" (such as tr). (Marcelo Vanzin)
-
-- Added some support to EL and better css and javascript coloration
- in jsp.xml (Matthieu Casanova)
-
-- SF Patch #1666690: No Undo past file save option
- Add option to reset the "undos" when a buffer is saved. (Joseph Erickson)
-
-- SF Patch #1676041: "CamelHumps" words
- Add option to enable separating camel cased words when selecting with the
- keyboard. (Horst Eff)
-
-- New attribute "MATCH_TYPE" that substitutes "EXCLUDE_MATCH" in mode files,
- and code to handle it in the ParserRule and TokenMarker classes. This allows
- highlighting the matched region with a different type as the rest of the
- region the rule applies to; so, for example, it's possible to use
- MARK_PREVIOUS on "foobar(" and highlight the function name as "FUNCTION" and
- the parenthesis as "OPERATOR". There are two special values for the
- attribute: "DEFAULT" is the default type for the current rule set (same
- behavior as EXCLUDE_MATCH="TRUE"), and "RULE", the default value, is the same
- type as the current rule (same as EXCLUDE_MATCH="FALSE"). This is part 1 of
- the fix for SF Bug #1658252. (Marcelo Vanzin)
-
-- New mode for C, and refactored the C++ and Objective-C modes to take
- advantage of the new C mode. This is part 2 of the fix for
- SF Bug #1658252. (Kazutoshi Satoda and Marcelo Vanzin)
-
-- Added an option to deactivate that rectangular selection mode
- is active if Ctrl is pressed. (Björn "Vampire" Kautler)
-
-}}}
-{{{ API Changes
-
-- ReadWriteLock in org.gjt.sp.util is deprecated in favor
- of java.util.concurrent.locks.ReentrantReadWriteLock (1687268 - Kazutoshi Satoda).
-
-- VFS.isMarkersFileSupported() added to give a VFS the chance to tell
- jEdit that no markers file should be saved or loaded to/from this VFS.
- (Björn "Vampire" Kautler)
-
-- Deprecated VFS.showBrowseDialog() as it is not used in the jEdit core anymore,
- so it doesn't have to be provided anymore. (Björn "Vampire" Kautler)
-
-- Removed class VFSBrowser.PluginsMenuButton.ActionHandler as it isn't used
- anymore. (Björn "Vampire" Kautler)
-
-- New static methods EditPlugin.getPluginHome(Class<? extends EditPlugin>) and
- EditPlugin.getPluginHome(EditPlugin) that return the path where a plugin
- should store it's data. It can be null if running without settings.
- (Matthieu Casanova)
-
-- New static methods
- EditPlugin.getResourceAsStream(Class<? extends EditPlugin>,String) and
- EditPlugin.getResourceAsStream(EditPlugin,String) that return a stream on a
- file in the plugin home directory. It can be null if running without settings.
- (Matthieu Casanova)
-
-- New static methods
- EditPlugin.getResourceAsOutputStream(Class<? extends EditPlugin>,String) and
- EditPlugin.getResourceAsOutputStream(EditPlugin,String) that return
- a stream on a file in the plugin home directory.
- It can be null if running without settings. (Matthieu Casanova)
-
-- New static methods
- EditPlugin.getResourcePath(Class<? extends EditPlugin>,String) and
- EditPlugin.getResourcePath(EditPlugin,String) that return the path of a file
- in the plugin home directory. It can be null if running without settings.
- (Matthieu Casanova)
-
-- New method IOUtilities.fileLength() that computes a file or directory length.
- (Matthieu Casanova)
-
-- GUIUtilities.centerOnScreen() method is deprecated, use
- javax.swing.JWindow#setLocationRelativeTo(java.awt.Component) instead.
- (Matthieu Casanova)
-
-- plugin.className.files added as property for plugins. This property specifies
- external non-JAR files, e. g. libraries, which are in the jars directory.
- (Björn "Vampire" Kautler)
-
-- ParserRule.hashChar and ParserRule.hashChars have been removed, since they
- weren't used anywhere. (Marcelo Vanzin)
-
-- In Buffer.java, the private "mode" field was moved to JEditBuffer.java as
- a protected field. (Marcelo Vanzin)
-
-- New IndentRule (WhitespaceRule) and new indent action (NoIncrease)
- were added. (Marcelo Vanzin)
-
-- new method: SearchAndReplace.replaceAll(View,boolean) to do a replace all,
- but not open files that were not open before. (Björn "Vampire" Kautler)
-
-- Buffer.getMarkersPath(VFS) deprecated and replaced by static method
- Buffer.getMarkersPath(VFS,path), see bug #1644479 (Matthieu Casanova)
-
-- Added a new GUIUtilities.showVFSFileDialog() methods that can use a dialog
- or a Window as the browser's parent, instead of the view. (Kazutoshi Satoda)
-
-- Added two new builtin service interfaces org.gjt.sp.jedit.io.Encoding
- and org.gjt.sp.jedit.io.EncodingDetector. (Kazutoshi Satoda)
-
-- MiscUtilities.isBinary(Reader) is now deprecated in favor of a new
- method MiscUtilities.isBinary(InputStream). (Kazutoshi Satoda)
-
-- Added JEditTextArea.showPopupMenu(), which pops up the context menu
- at the current caret position.
-
-- For TextArea, userInput('\b') now behaves as backspace(), and
- userInput('\u007F') now behaves as delete(). See background of this
- change at SF.net patch #1692315. (Kazutoshi Satoda)
-
-- New method EditorExitRequested.cancelExit() that allows EBMessage listeners to
- cancel jEdit exit request (patch #1737563) (javacorner)
-}}}
-
-}}}
-
-{{{ Version 4.3pre9
-
-Thanks to Björn "Vampire" Kautler, Akber Choudhry, Matthieu Casanova
-Jean-Francois Larvoire, Martin Raspe, Kazutoshi Satoda, Alan Ezust, Marcelo
-Vanzin, and Nicholas O'Leary for contributing to this release.
-
-{{{ Bug Fixes
-
-- avoid NPE from getIndentRules (patch #1611766) (Kazutoshi Satoda)
-
-- bufferio operations are now exception-safe (patch #1597168) (Kazutoshi Satoda)
-
-- Encoding errors properly reported on save (patch #1601830) (Kazutoshi Satoda)
-
-- Filter Box lose focus bug (patch #1608948) (kuljc)
-
-- Fixed the broken quick copy behaviour (Björn "Vampire" Kautler)
-
-- Fixed the wrong text in SearchAndReplace Dialog (bug #1592529)
- (Björn "Vampire" Kautler)
-
-- Fixed wrong highlighting of multiline strings in cobol editmode
- (bug #785290) (Björn "Vampire" Kautler)
-
-- Plugins in plugins options are now sorted case-insentively
- (bug #1593410) (Matthieu Casanova)
-
-- Fixed the not resolved IMPORTs in IMPORTs (bug #1569735)
- (Björn "Vampire" Kautler)
-
-- Fix SF Bug #1596756: Annoying problem with file system browser in 4.3pre7
- When reopening the "recent" files on startup, a buffer might fail to
- load (because, e.g., it's on a FTP server and the user canceled the
- password dialog). So ignore the buffer if it's null when restoring the
- view. (Marcelo Vanzin)
-
-- Fix SF Bug #1590250: Bad EOF handling code in CBzip2InputStream
- The code seems to have other error handling problems, but at least
- now it doesn't compare a char to -1. It would be interesting to see
- what happens if we have a corrupted jar file... (Marcelo Vanzin)
-
-- Fix SF Bug #1571752: 'Add Explicit Fold' in PHP mode - wrong comments
- Be smarter when inserting explicit folds in mode boundaries by trying
- harder to use the comment characters for the mode of the text that
- is being wrapped. Also do some tweaking for when to insert new lines
- and when not to. (Marcelo Vanzin)
-
-- Fix SF Bug #1594910: Indentation of Javascript embedded in HTML is broken
- The fix is more generic than what the bug suggest. The indent rules
- were being kept locally by each buffer, and reflected the "top level"
- mode's rules. So rules for sections of the buffer that were delegated
- to other modes were ignored. The fix keeps the indent rules in the mode
- instance, and the buffers retrieve the context-sensitive rules when
- applying auto-indentation. (Marcelo Vanzin)
-
-- When deactivating a plugin if the VFS Browser was open but it's menubar
- disabled, a NPE occured (#1593392) (Matthieu Casanova)
-
-- Fixed a bug I introduced with the new HASH_CHAR handling
- (bug #1600380) (Björn "Vampire" Kautler)
-
-- Fixed another bug with the new HASH_CHAR handling
- (bug #1600401) (Björn "Vampire" Kautler)
-
-- Fixed precedence of Recent Files List caretposition over commandline
- supplied caret position (Björn "Vampire" Kautler)
-
-- SearchMatcher in SearchAndReplace cannot match empty Strings anymore
- (#1601718) (Matthieu Casanova)
-
-- If you use two stage save and your file is writeable but in a folder
- where you cannot write, a dialog will ask you if you want to save using
- normal method (#1609303) (Matthieu Casanova)
-
-- Fixed that ESCAPE sequence of RULES tag couldn't appear at the beginning
- of a rule. Now this is possible. Also added documentation about the
- ESCAPE attribute. (Björn "Vampire" Kautler)
-
-- Hypersearch now report occurences count and line count (#1565447)
- (Matthieu Casanova)
-
-- Several exceptions fixed in plugin manager after update or remove plugins
- (Matthieu Casanova)
-
-- When simplified keyboard handling was off, typing Alt+F o to open
- a file, the o was also written in the textarea. (#1593359) (Matthieu Casanova)
-
-- VariableGridLayout resized Components to sizes bigger than their maximum size,
- now it resizes it only up to its maximum size and positions the Components
- according to their alignmentX/alignmentY values if the cell is bigger than
- the Component's size. (Björn "Vampire" Kautler)
-
-- Horizontal scrollbar in the textarea was not always updated
- (#1534016, #1617483) (Matthieu Casanova)
-
-- In hypersearch when switching to flat nodes, the full path is displayed
- correctly (#1593523) (Matthieu Casanova)
-
-- The VFS Browser filter was not working as expected
- (#1617509) (Matthieu Casanova)
-
-- When reloading a buffer, the markers were not saved for each EditPanes
- (Matthieu Casanova)
-
-- When closing an untitled buffer is is removed from the CaretInfo map
- of the EditPanes (Matthieu Casanova)
-
-- When a buffer is renamed the key is changed in the CaretInfo map
- of the EditPanes (Matthieu Casanova)
-
-- Memory tooltip in status bar reports wrong values (#1538051) (Matthieu Casanova)
-
-- Better handling of plugin optional dependencies (Matthieu Casanova)
-
-- Fixed some cursor changes when dragging the dockable panel split bar
- (Matthieu Casanova)
-
-}}}
-{{{ Editing
-
-- New edit mode: quake.xml
-
-- Updated TCL edit mode (Jean-Francois Larvoire)
-
-- Updated Lilypond edit mode (Bertalan Fodor)
-
-- Fixed some invalid mode files (Björn "Vampire" Kautler)
-
-- Updated some mode files that were still in jEdit 4.0 syntax (Björn "Vampire" Kautler)
-
-- Perl edit mode - support for fully qualified variable names like $Some::Module::test.
- (Martin Raspe)
-
-- Updated python edit mode to unindent lines after "pass" (Matthieu Casanova)
-
-- Better highlighting of function calls in makefiles. (Marcelo Vanzin)
-
-- Updated PL/SQL Mode. (David Moss)
-
-}}}
-{{{ Miscellaneous
-
-- BufferSwitcher has a hovertip to give you full filename
- (request # 1628053) (Alan Ezust)
-
-- Textfield for filtering recent files menu (Patch # 1546200)
- (Joerg - spj)
-
-- FSB deletes directories recursively now
- (bug #1593389) (patch #1593900) (Akber Choudhry)
-
-- Added a FIRST_LINE_GLOB to the "awk" mode in modes catalog (fr #1582241)
- (Björn "Vampire" Kautler)
-
-- Incremental searchbar now use the invalid syntax color to show if the searched
- text was found (Matthieu Casanova)
-
-- FR #1599024: add a submenu to the file menu that allows reloading the
- current buffer with a specific encoding.
-
-- HASH_CHAR in mode-files is now optional and multicharacter
- (Björn "Vampire" Kautler)
-
-- HASH_CHARS got invented for mode-files as alternative to HASH_CHAR,
- whereby HASH_CHARS lists possible first characters of the matched
- result literally (Björn "Vampire" Kautler)
-
-- Fixed some wrong documentation and added some new
- about HASH_CHAR and HASH_CHARS (Björn "Vampire" Kautler)
-
-- SplashScreen change : more step added for progress bar and it tells now
- what jEdit is doing (Matthieu Casanova)
-
-- When closing the current buffer, if there is only one buffer, untitled and
- not dirty it is not closed (not needed since another one would be created)
- (Matthieu Casanova)
-
-- The Files change dialog has now an ignore button to set the
- autoreload and autoreloaddialog flags to false (Matthieu Casanova)
-
-- VariableGridLayout, two new capabilities: it can
- take minimum and maximum sizes of a Component into account when
- distributing free space and you can supply distances to the borders
- of the Container. The new capabilites are useable by the two new
- constructors. For more information, see the JavaDoc documentation.
- (Björn "Vampire" Kautler)
-
-- Reload/ReloadAll now ignores buffers with the NEW_FILE flag set. This
- was causing IO error messages when the Untitled buffers could not
- be reloaded. (Nicholas O'Leary)
-
-- More infos about the socket connection when the plugin manager updates it's
- plugin list (Matthieu Casanova)
-
-- Now the multiple selection and rectangular selection flags are saved
- for each buffer on each edit pane. So you can now in a textarea edit
- a buffer using rectangular selection, and use normal selection with another one
- (Matthieu Casanova)
-
-- Option panes are now in a JScrollPane (feature #1593735) (Matthieu Casanova)
-
-- New option for the File System Manager : use default icons.
- If you uncheck the checkbox, some custom icons can be used.
- At this time only local file system have custom icons (feature #1593464)
- (Matthieu Casanova)
-
-- Buffer saving is now buffered, it changes everything with large files
- (Matthieu Casanova)
-
-- jEdit can now use continuous layout in it's JSplitPane.
- You can change this option in the Appearance panel (#1638642)
- (Matthieu Casanova)
-
-- The update panel of the plugin manager now shows the installed version
- and the version existing on the plugin central server (Matthieu Casanova)
-
-}}}
-{{{ API Changes
-
-- Refactored the manually implemented HashSet of LinkedLists to use the
- Java Collections HashSet and ArrayList. Therefore the ParserRule.next
- and the ParserRuleSet.getRules(char) got deprecated in favor of
- ParserRuleSet.getRules(Character) (Björn "Vampire" Kautler)
-
-- Deprecated JEditBuffer.isElectricKey(char).
- Added JEditBuffer.isElectricKey(char, int) to replace it.
- (Marcelo Vanzin)
-
-- Deprecated some of the ParserRule.createXXX() methods which accepted
- only one character HASH_CHAR, while introduced new ones that accept
- whole Strings. Additionally new ones for accepting HASH_CHARS got
- added. (Björn "Vampire" Kautler)
-
-- SearchDialog.preloadSearchDialog(View) is deprecated, this is
- not necessary on our big computers and JVM with JIT (Matthieu Casanova)
-
-- VariableGridLayout has two new constructors to use the new capabilites.
- For more information see section Miscellaneous. (Björn "Vampire" Kautler)
-
-- PluginManager.getPluginList() is not public anymore. It was not useful
- since the PluginList class cannot be accessed outside of it's package
- (Matthieu Casanova)
-
-- MiscUtilities.moveFile(File, File) is deprecated, use
- IOUtilities.moveFile(File, File) instead (Matthieu Casanova)
-
-- Plugin API : now the EditPlugin has two new methods :
- EditPlugin.getPluginHome() that will returns the path where the plugin
- should write it's data (it can return null if you run with nosettings).
- It is a folder build like that
- jEditSettingsDirectory/plugins/pluginClassName
- ex :
- ~/.jedit/plugins/sidekick.SidekickPlugin
- I hope this will help to make some cleanup in the jEdit settings directory folder
- (this folder is not created by jEdit, plugin developers must create it themselves)
- The second method is EditPlugin.usePluginHome()
- that plugin developers should overload to tell jEdit if they use this new folder
- The default is false (Matthieu Casanova)
-
-- VFSFile.getIcon() and VFSFile.getDefaultIcon(). The getIcon() method
- can be override to use a custom icon for some VFS (Matthieu Casanova)
-
-- Added org.gjt.sp.jedit.msg.PropertiesChanging; an EditBus message that is
- sent right before the global options dialog is shown, to allow plugins to
- flush any data that might be used by the option panes.
- (Marcelo Vanzin)
-
-- OptionsDialog.init(String,String) was made protected (was private).
- (Marcelo Vanzin)
-
-- New GUIUtilities.initContinuousLayout(JSplitPane) method that will
- init the JSplitPane with the appearance.continuousLayout property.
- It can be used by plugins that has JSplitPane when receiving a PropertiesChanged
-
-}}}
-
-}}}
-
-{{{ Version 4.3pre8
-
-Thanks to Matthieu Casanova, Martin Raspe, Marcelo Vanzin, Alan Ezust
-and Björn "Vampire" Kautler for contributing to this release.
-
-{{{ Bug Fixes
-
-- Fixed the impossibility to ReplaceAndFind if matching "$"
- (Björn "Vampire" Kautler)
-
-- Fixed incorrect highlighting if in soft-wrap and rectangular selection
- mode if drag highlighting with the mouse. (bug #1589360)
- (Björn "Vampire" Kautler)
-
-- Fix SF Bug #1574562: 4.3pre7 regex find/replace fails
- When adjusting the offset after an EOL match, need to check whether
- the new value is larger than the end of the search region and break
- the loop. (Marcelo Vanzin)
-
-- When having a single word selected, join line was doing nothing.
- (#1575505) (Matthieu Casanova)
-
-- Filters in the VFS Browser were not applied on Windows (#1571629)
- (Martin Raspe)
-
-- Fix SF Bug #1585327: Perl mode curly brackets highlighting and matching broken
- There was a broken rule in perl.xml. (Marcelo Vanzin)
-
-- Fix SF Bug #1588002: Perl Mode - sub foo($) { broken
- Correctly handle perl subroutine prototypes. (Marcelo Vanzin)
-
-}}}
-{{{ Miscellaneous
-
-- Buffer options were factored out to a dedicated BufferOptionPane and
- moved to .options (Martin Raspe)
-
-- Automatic reloading of buffers without notification is now possible.
- The autoreload behaviour can now be set individually for each buffer
- on the buffer option pane. Autoreload settings for open buffers are now
- saved to and restored from "perspective.xml" (#1578785) (Martin Raspe)
-
-- VFS browser column headers now have little arrow icons indicating the
- sorted column and sort direction. Clicking on the "Type" column header
- now sorts the files by extension (Martin Raspe)
-
-- When the plugin manager fail to download a plugin or to read the downloaded
- file, a new message dialog suggest the user to try another mirror
- (Matthieu Casanova)
-
-- ToggleHeaderSource.bsh (macros/C) now will find and open an already-open
- buffer with the correct filename even if it is from another directory.
- (Alan Ezust)
-
-}}}
-{{{ API Changes
-
-- OptionsDialog - currentPane and paneTree are protected now,
- to make it easier to extend it in SideKick plugin. (Alan Ezust)
-
-}}}
-
-}}}
-
-{{{ Version 4.3pre7
-
-Thanks to Matthieu Casanova, Marcelo Vanzin, Nicholas O'Leary,
-Marcin Orlowski, Martin Raspe, Kazutoshi Satoda, Alan Ezust,
-and Björn "Vampire" Kautler for contributing to this release.
-
-{{{ API Changes
-
- {{{ EditAction changes:
-
-- Instances now inherit a protected Object[] args;
- Added a convenience function invoke(View view, Object[] newArgs) which
- sets args and calls invoke(view). Sf.net feature request # 1548301.
-
-- Made getCode() concrete (before it was abstract) and added
- a sensible implementation so that people extending from it
- are no longer required to write a function that returns beanshell code
- as long as they override the invoke(View) method with valid Java code.
- (Alan Ezust)
-
-- Made getLabel() non-final, so that people can override it and make
- more interesting EditActions. If args is set, getLabel() uses them
- for the label. (Alan Ezust)
-
- }}}
- {{{ GUIUtilities changes:
-
-- Added GUIUtilities.loadMenuItem(EditAction, boolean) - calls
- EditAction.getLabel() to get the label instead of getting properties
- directly (Alan Ezust)
-
-- GUIUtilities.addSizeSaver(Frame parent, String name) changed to
- GUIUtilities.addSizeSaver(Frame frame, Container parent, String name)
- and refactored to use saveGeometry(). Saves/restores
- sizes relative to a parent container. if parent==null, behaves
- as before. (Björn "Vampire" Kautler)
-
- }}}
- {{{ PluginJAR changes
-
-- jEdit.getPlugin(className, bool) now will search for and
- load plugins that were not yet loaded, given a className to search
- for. (Alan Ezust)
-
-- added PluginJAR.findPlugin() which is used by the above method (Alan Ezust).
-
-- added PluginJAR.load(), formerly a private method moved
- from the ManagePanel class. Also moved transitiveClosure() into
- the PluginJAR class. General refactoring to make the
- plugin management code more centrally located. (Alan Ezust)
-
- }}}
-
-- added new class org.gjt.sp.jedit.bufferio.MarkersSaveRequest; fixed 1527419:
- Setting or deleting markers does not dirty buffer anymore. Handling of
- the markers file is now factored out from BufferSaveRequest.
- (Martin Raspe)
-
-- added SearchMatcher.isMatchingEOL(); indicates whether the matched
- region ends at an EOL character. Part of bug fix for SF Bug #1541009.
- (Marcelo Vanzin)
-
-- added new class org.gjt.sp.jedit.io.VFSFileFilter; an interface that
- defines a filter used by the VFS browser. (Marcelo Vanzin)
-
-- added VFSBrowser.addVFSFileFilter() and VFSBrowser.getVFSFileFilter().
- Deprecated VFSBrowser.getFilenameFilter(). (Marcelo Vanzin)
-
-- added VFS._listDirectory(Object,String,VFSFileFilter,boolean,Component,boolean,boolean)
- (Marcelo Vanzin)
-
-- moved MiscUtilities.globToRE() to StandardUtilities. (Marcelo Vanzin)
-
-- added org.gjt.sp.util.PropertiesBean. See javadoc for details.
- (Marcelo Vanzin)
-
-- added JEditTextArea.collapseFold(int line) to collapse the fold at the
- given line (Matthieu Casanova)
-
-- New method KillRing.setInstance() that allow you to replace the default KillRing.
- jEdit now uses a custom KillRing : JEditKillRing. The only difference is that it
- can save itself to the disk (Matthieu Casanova)
-}}}
-{{{ Syntax Highlighting
-
-- Interlis mode updated to version 2.3 (patch # 1464779)
-
-- Progress mode supports nested comments (patch# 1211534)
-
-- New edit mode: Pilrc *rcp mode by Marcin Orlowski (#1519983)
-
-- Perl.xml mode fixes: (#1549412, #1020484), infinite loops in regexp,
- transliteration and hash highlighting, added several new features
-
-}}}
-{{{ Bug Fixes
-
-- JEditTextArea now supports Java Input Methods. See
- http://java.sun.com/j2se/1.5.0/docs/guide/imf/index.html
- (#735962, #1555403) (Kazutoshi Satoda)
-
-- Plugin Manager: fixed some bugs about broken or missing behaviour
- + toggle behaviour of spacebar (bug #1538700)
- + closing behaviour of enter if in list (bug #1538695)
- + disposing behaviour of ESC (bug #1538693)
- + broken/weird focus behaviour (bug #1538692)
- + now keeps selection if you cancel the installation or an I/O-Error
- occures while installing or updating (bug #1538689)
- + selection and checked state of plugins is now remembered if going to
- other tabpanes or to the settings (feature request #974759)
- + Install and Update Panels support now multiple selections too
- (Björn "Vampire" Kautler)
-
-- Plugin Manager: Automatically loads unloaded dependent plugins.
- (#1538702) (Alan Ezust)
-
-- File System Browser now recognizes Backspace, DEL and F2 to
- go to parent dir, delete and rename files respectively.
- The "path:" textarea accepts environment variables and expands them too.
- (1542365) (Alan Ezust)
-
-- SplashScreen is now in the middle of the screen, instead of between
- 2 screens (Alan Ezust)
-
-- GuiUtilities.load/save geometry now saves x and y coordinates
- relative to the parent component. Changed core to make dialogs
- and floating dockables pop up in a place relative to the parent
- view. (#1292706) (Alan Ezust)
-
-- Memory dialog reports wrong values (#1538051) (Matthieu Casanova)
-
-- Shortcut sorting was broken (#1538452) (Matthieu Casanova)
-
-- Actions to-lower and to-upper now selects the word at caret if
- there is no selection (#1538720) (Matthieu Casanova)
-
-- Quicklist of dockables windows is now sorted (#1538728)
- (Matthieu Casanova)
-
-- Updated text in Search dialog to reflect reality (#1542029)
- (Nicholas O'Leary)
-
-- SF Bug #1541009: 4.3pre6 regexp find: hangs + huge memory waste
- "$" matches right before the end of line; so we need to adjust the end
- of the matched region when that is used. To do this and still maintain
- the expected replace behavior, a new method was added to
- SearchMatcher, and users of that class should adjust the offsets of
- subsequent searches when an EOL is matched. (Marcelo Vanzin)
-
-- Formatting an empty paragraph do not throw a StringIndexOutOfBoundsException
- anymore (#1548902) (Matthieu Casanova)
-
-- Clearing a register is now persistent (#1541821) (Matthieu Casanova)
-
-- When collapsing a fold, if the caret is inside, it
- is moved to the first line of the fold (#1541372) (Matthieu Casanova)
-
-- action collapse-fold now works fine even if the caret is not on the
- first line of the fold (#1538712) (Matthieu Casanova)
-
-- When saving a readonly buffer it will ask you if you want a two stage save.
- If you say no it will not display any error dialog anymore.
- (#1549282) (Matthieu Casanova)
-
-- ArrayOutOfBoundException fixed in VFS browser when choosing to delete, rename
- or browse in right click popupmenu when no file are selected
- (#1565286) (Matthieu Casanova)
-
-}}}
-{{{ Miscellaneous
-
-- VFS browser is now able to sort files by double-clicking on column headers.
- Files can be sorted by name, size and last modification date. Clicking again on
- the same column header will reverse the sort order (#1442812) (Martin Raspe)
-
-- VFS browser is not restricted to the built-in "glob" filter anymore.
- Plugins can register new filters to be used by the browser by
- implementing the "VFSFileFilter" interface and providing a service
- entry in service.xml, or by directly calling
- VFSBrowser.addVFSFileFilter(). (Marcelo Vanzin)
-
-- Updated FAQ for jEdit 4.3 (ezust)
-
-- Save and Backup Option Panel : the backup directory has now a button to browse using
- VFS file browser (#1540730) (Matthieu Casanova)
-
-
-- The PluginManager options do not allow anymore to ask for a mirror list update
- twice (Matthieu Casanova)
-
-- The mirror list of the plugin manager is now stored in a file : mirrorList.xml
- and read from here where you open the option panel. The Update mirror list button
- will refresh it from the web.
- (Matthieu Casanova)
-
-}}}
-
-}}}
-
-{{{ Version 4.3pre6
-
-Thanks to Björn "Vampire" Kautler, Alan Ezust,
-Matthieu Casanova, Nicholas O'Leary, Ollie Rutherfurd, and
-Marcelo Vanzin for contributing to this release.
-
-{{{ API Changes
-- MiscUtilities.getEncodings(boolean getSelected) added
- to get only the user-chosen encodings, e. g. in encoding dialogs.
- getEncodings() is deprecated in favor of getEncodings(false).
- (Björn "Vampire" Kautler)
-
-- DockableWindowManager.closeListener(String dockableName) - a new
- convenience method for creating keyboard listeners for floating
- dockables to respond to the "close-current-area" action. (Alan Ezust)
-
-- GUIUtilities.addSizeSaver(Frame frame, String name) added to
- save a Frames size and position correctly, even if it gets
- maximized. (Björn "Vampire" Kautler)
-
-- EditPane.setBuffer(final Buffer buffer, boolean requestFocus) that allow
- to set a buffer without requesting the focus (default is to request focus)
- (Matthieu Casanova)
-
-- BufferHistory.clear() to clear the recent file list
- (Matthieu Casanova)
-
-- MiscUtilities.stringCompare() and MiscUtilities.CompareString are moved to
- StandardUtilities (Matthieu Casanova)
-
-- Added XMLUtilities class for XML-related utility methods. Move some
- methods from MiscUtilities to this class, and deprecate the old ones.
- (Marcelo Vanzin)
-
-- Moved MiscUtilities.objectsEqual() method to StandardUtilities()
- (Matthieu Casanova)
-
-
-}}}
-{{{ Miscellaneous
-
-- Ability to clear the Recent Files List from menu (Matthieu Casanova)
-
-- Beanshell 2.0b4 bundled (Matthieu Casanova)
-
-- Added an OptionPane "Encodings" to select which encodings to
- show in encoding dialogs. (Björn "Vampire" Kautler)
-
-- Improved DockableWindowManager.closeCurrentArea() - closes more
- docked dockables than it did before. (Alan Ezust)
-
-- Fixed the storing of Frame size and position
- if the Frame gets maximized. (bug #1325358)
- (Björn "Vampire" Kautler)
-
-- Fixed VFS.copy() method when the returned session is null
- (Matthieu Casanova)
-
-- When adding explicit folds, and using a line comment for the end line,
- insert a line break after the fold end if the line is not empty,
- avoiding commenting out existing code. (Marcelo Vanzin)
-
-- Added option to not print collapsed folds. (Nicholas O'Leary)
-
-- Added paste and clear buttons to the Registers dockable.
- (Nicholas O'Leary)
-
-- The behavior of JARClassLoader now is different than in previous
- versions of jEdit. JARClassLoader will now delegate class loading
- to the parent class loader before looking in its cache. This means
- that, by default, plugins can't override classes in the JVM's
- boot classpath. The behavior is configurable on a per-plugin
- basis (see javadoc for details). This fixes SF Bug #1509218.
- (Marcelo Vanzin)
-
-- SF Bug #1527824: Perl Syntax Highlighting hangs 4.3pre6
- More activity on my favorite edit mode. :-)
- The [^\p{Alpha}\p{Space}] rule at the start of Perl's "y/.../" syntax
- was not entirely correct; some other characters, mainly operators like
- +, -, etc, and also underscore, are not allowed either. But since the
- regexp was still trying to be matched against such strings, it would
- have two effects: a very long pause (the "hang"), and strings like
- "y_something_something" being highlighted incorrectly. By adding a few
- extra characters to that exclusion, things seem to be much better.
- (Marcelo Vanzin)
-
-}}}
-{{{ Bug Fixes
-
-- (jedit-Bugs-1518537) FSB keyboard handling bugs fixed.
- Arrow keys, backspace, and return all do sensible things
- from the table as well as the list view. (Ezust)
-
-- (jedit-bugs 1533925) Alpha-numerics are no longer being "passed through"
- from the FSB to the editpane. (Alan Ezust)
-
-- When multiple views are open, closing a buffer will not change the active view
- (Bug #1518400) (Matthieu Casanova)
-
-- Fixed Untitled buffer added to the Recent file list (Bug #1518620)
- (Matthieu Casanova)
-
-- MiscUtilities.canonPath() now trim redundant / and \ at the end of the path
- of Dos derived OS (bug that can be seen when typing some / in the end of the
- path field of VFS browser) (Matthieu Casanova)
-
-- SF bug 1526487: ArrayOutOfBoundException in VFS Browser. (Matthieu Casanova)
-
-- SF bug 1519237: Regular Expression Search in 4.3pre5
- regexp search should be done with Pattern.MULTILINE enabled, otherwise
- ^ and $ will only match the start and end of the buffer. (Marcelo Vanzin)
-
-- SF bug 1517395: Wrong character encoding in killring.xml
- fix bug in Java 1.5 by saving ASCII control characters as character
- entities; since 1.4 doesn't support XML 1.1, if killring.xml has
- character entities it will fail (so the bug will still be there
- when running on 1.4). (Marcelo Vanzin)
-
-- SF bug 1523261: "Regular expression " and "Ignore case"
- There was a stray "flags" variable in PatternSearchMatcher.nextMatch()
- that was clobbering the instance variable with the same name (that
- actually contained the needed flags for the compiled pattern).
- (Marcelo Vanzin)
-
-- SF bug 1523117: Add explicit fold in PHP mode inserts wrong comments
- The "DEF_CLASS" rule set in the php mode file didn't have any line
- or range comments declared in the props section; so the code was now
- picking up the porperties for the default rule set, which had the
- HTML-style range comment instead of the PHP line comment. This is
- probably due to the XML parser change - the old code was probably
- propagating some property of another rule set to the DEF_CLASS rule
- set, since it used global variables for a bunch of things. So this
- might show up in other places, and might need a better fix...
- (Marcelo Vanzin)
-
-- SF bug 1524032: Line number not highlighted when the line is selected
- (Nicholas O'Leary)
-
-- SF bug 1524155: replace all within selection doesn't give feedback
- (Nicholas O'Leary)
-
-- SF bug 1524191: s() method from startup.bsh doesn't work
- (Nicholas O'Leary)
-
-- SF bug 1516994: Fixed infinite recursion possibility
- in ManagePanel.java when unloading certain plugins
- with circular dependencies due to services. (Alan Ezust)
-
-- No exception thrown when adding an explicit fold to a read only buffer.
- (#1549282) (Matthieu Casanova)
-
-- Deep indent fixed when using tabs (Matthieu Casanova)
-}}}
-{{{ Syntax Highlighting
-- Added mysql mode.
-- Added django templates mode. (Ollie Rutherfurd)
-}}}
-}}}
-
-{{{ Version 4.3pre5
-
-Thanks to Alan Ezust, Jeffrey Hoyt, Daniel Hahler, Dale Anson,
-Björn "Vampire" Kautler, Matthieu Casanova, Xuön Baldauf,
-Nicholas O'Leary and Marcelo Vanzin for contributing to this release.
-
-{{{ Reinstall required
-- Gnu.regexp is no longer used by jEdit, in favor of java.util.regex
- Since the regexp removal has also affected the modes handling and thus
- the files in the "modes" directory, just updating "jedit.jar" of an
- existing jEdit installation does not suffice. You would get weird
- errors in this case. Thus, a full reinstall is required.
-}}}
-{{{ API Changes
-
-- DockableWindowManager has a new method, setDockableTitle()
- which allows you to set the string in the title bar
- for floating dockables. Now docked buttons use the dockableName.label
- property instead of the .title. This way, we can have have long titles
- in the floater, and short strings on the dock button. (Alan Ezust)
-
-- Macros.Macro.invoke() has been rewritten to begin the compoundEdit on the buffer that is
- active buffer before the macro gets invoked, and end the compoundEdit on the buffer that is active
- after the macro is invoked opposed to end the compoundEdit on the buffer it was started on.
- JEditTextArea.setBuffer() has been rewritten to end a compoundEdit on the old buffer and start
- a new compoundEdit on the new buffer if there were a compoundEdit in progress.
- (bug #1469996). (Björn "Vampire" Kautler )
-
-- MiscUtilities.isBinaryFile() method that will check if a file is binary or not (Matthieu Casanova)
-
-- MiscUtilities.autodetect() this method tries to autodetect the file encoding. It was moved
- from BufferIORequest (Matthieu Casanova)
-
-- New utility class : IOUtilities that will contains static IO methods that
- depends only on JDK. (Matthieu Casanova)
-
-- New utility class : StandardUtilities that will contains static
- methods that depends only on JDK (Matthieu Casanova)
-
-- jEditBuffer.getRegexProperty() has been removed;
- jEditBuffer.getPatternProperty() was added to replace it.
- (Marcelo Vanzin)
-
-- MiscUtilities.quickSort() methods and MiscUtilities.Compare class are now deprecated
- use Arrays.sort() and Collections.sort() (Matthieu Casanova)
-
-- MiscUtilities.parseXML() and MiscUtilities.findEntity() were added.
- They're mainly used internally to ease XML parsing, but can safely
- be used by other people. Please refer to the javadoc documentation
- about how these methods operate. (Marcelo Vanzin)
-
-- org.gjt.sp.jedit.search.RESearchMatcher has been removed as part
- of the gnu.regexp removal; it didn't make sense to write extra
- code to keep that class working. (Marcelo Vanzin)
-
-- due to the change to support java.util.regex, the signature for
- org.gjt.sp.jedit.search.SearchMatcher.nextMatch() has changed.
- This means that any plugin that uses SearchMatcher or one of its
- implementations directly will break. (Marcelo Vanzin)
-
-- Added Log.log(urgency, source, message, exception). (Xuön Baldauf)
-
-}}}
-{{{ Miscellaneous
-- SearchReplace dialog now supports additional options,
- for Directory Search: "skipHidden" and "skipBinary".
- Now you can skip over hidden directories/files, as well
- as binary files. (Matthieu Casanova & Alan Ezust)
-
-- Updated Ruby Edit-mode to v0.6.2
- The Ruby-Mode now highlights numbers correctly (bug #1489847). (Björn "Vampire" Kautler)
-
-- The "Recent files" menu can now be reaches with the keystroke sequence
- "Alt+F F" (bug 1488066) (Xuön Baldauf)
-
-- The "Recent files" menu displays pathname information in the status
- line now also in cases the keyboard is used to choose menu items
- (bug 1488060) (Xuön Baldauf)
-
-- Drag&Drop now accepts multiple files in KDE environment. (bug 1487647)
- (Xuön Baldauf)
-
-- Mode_Switcher macro fixed to stop InvocationTargetException
- (Nicholas O'Leary)
-
-- Add explicit fold when start and end of selection are in different edit mode
- (bug #1159659) (Matthieu Casanova)
-
-- Caret position of previously edited files is restored on startup (bug # 1486706)
- (Dale Anson)
-
-- When saving a file with .gz extension the buffer is gzipped (it was not working when using two stage save.)
- It also remove GZIPPED property if the buffer name was ending with .gz and is not anymore
- (Matthieu Casanova)
-
-- All classes using the gnu.regexp packages have been changed to use
- java.util.regexp. This needed some refactoring of a few components
- inside the syntax highlighting and search subsystems. This means
- that mode files using regexps and searches now should use the
- java.util.regex syntax instead of the old syntax.
- (Marcelo Vanzin)
-
-- All classes using the com.microstar.xml packages have been changed to
- use JAXP to parse XML. Which means that some classes have different
- base classes now, but I don't expect anyone to be inheriting from any
- of those. Also, this means that XML parsing will be a little bit more
- "correct" now, in the sense that it will check the files against their
- DTDs (this needed some changes to the DTDs shipped with jEdit since
- some of them had errors). (Marcelo Vanzin)
-
-- The build.xml got rebuilt to allow building the MacOS-Plugin on any platform
- and to make it easier to build the distribution files (DEB, Java-Installer,
- Mac OS X DMG, TGZ Slackware Package, Windows-Installer, SRC-package, PDF-Manuals).
- (Björn "Vampire" Kautler)
-}}}
-}}}
-
-{{{ Version 4.3pre4
-
-Thanks to Neil Bertram, Onur Turgay, Ollie Rutherfurd, Dale Anson, Xuön Balduf,
-Nathan Blair, Peter Adolphs, Carmine Lucarelli, Matthieu Casanova, Alan Ezust,
-Daniel Hahler, Marcello Vanzin, Slava Pestov, Björn "Vampire" Kautler, and Jeffrey Hoyt for
-contributing to this release.
-
-{{{ Syntax Highlighting
-
-- TypoScript syntax highlighting (Neil Bertram).
-- Myghty template syntax highlighting (Ollie Rutherfurd)
-- JavaCC syntax highlighting (Dale Anson)
-
-}}}
-{{{ API Changes
-
-- better fix for 1449909:
- Create a new message (ViewUpdate.ACTIVATED) to indicate that a different
- view was activated. (Marcello Vanzin)
-
-- send a ViewUpdate.EDIT_PANE_CHANGED when changing the active view.
- (Marcello Vanzin)
-
-- EditAction now has a setName() method, allowing one to change the name.
-
-- New BufferChanging class, extends EditPaneUpdate with a getBuffer()
- method which returns the about-to-be opened buffer. (Alan Ezust)
-
-}}}
-{{{ Miscellaneous
-
-
-- TextAreaTransferHandler patch 1487647 Drag 'n' drop from KDE now works. (Xuön Baldauf)
-
-- GUIUtilities patch 1275607 for "find" dialog (Xuön Baldauf)
-
-- GUIUtilities patch 1467821 for dual-head displays applied (Nathan Blair)
-
-- patch 1467311 applied (Peter Adolphs) Restore previously open files on startup
-
-- Macro list is now sorted so that directories show up first
- (carmine.lucarelli)
-
-- jEdit now supports LCD Subpixel Anti-Aliasing (JDK 1.6 only).
- Global Options -> TextArea -> Anti-Aliased Smooth Text -> Subpixel
- (Onur Turgay / Alan Ezust)
-
-- jEdit will ask for confirmation before overwriting read only files.
- If yes, it will activate two stage save if the VFS is capable of
- renaming files. If no, the file will not be saved (Matthieu Casanova).
-
--IO progress monitor are indeterminate if the maximum value of the WorkThread is 0
- (Matthieu Casanova)
-
--Hyper search result panel now indicates the processed files
- (Matthieu Casanova)
-
-}}}
-{{{ Bug Fixes
-
-- Fix a deadlock when using directory search (Slava Pestov).
-
--Deep indent was broken since 4.3pre2 and is now fixed (Matthieu Casanova)
-
-}}}
-
-}}}
-
-{{{ Version 4.3pre3
-
-Thanks to Bertalan Fodor, Björn "Vampire" Kautler, David Chan, James Turk,
-Loren Charnley, Matthieu Casanova, Michael Macnair, Nicholas O'Leary,
-Alan Ezust, Slava Pestov, Ollie Rutherfurd, Jeffrey Hoyt, Marcelo Vanzin,
-Rob (copy_paste), and Simon Ruggier for contributing to this release.
-
-
-{{{ Search and Replace
-
-- HyperSearch results can now be displayed in a folder hierarchy tree
- view. This makes it easier to see file locations when there are matches
- for many different files from a deep folder structure. To activate,
- right click on the top search node in the result tree and select
- "Toggle Tree View". If multiple results is enabled, the tree view is
- only toggled for the selected search.
-
- There are also new context menu options for the result tree
- that only display in tree view mode when a folder node is selected.
- There are options to expand/collapse all child nodes, and another to
- exeucte a "New Search From Here", which displays the search dialog
- initialized with the path from the selected result tree folder node.
-
-}}}
-{{{ Syntax Highlighting
-
-- Gnuplot syntax highlighting (Loren Charnley).
-
-- Updated PHP syntax highlighting (Matthieu Casanova).
-
-- Fixed end token of heredoc that must start at beginning of the line in
- PHP (Matthieu Casanova)
-
-- Updated MIPS R2000 assembly syntax highlighting (James Turk).
-
-- Updated Java and LaTeX syntax highlighting (Alexander Klimetschek).
-
-}}}
-{{{ File System Browser
-
-- Pressing / and BACKSPACE in the filename field no longer does
- completion. Now, you must press TAB to complete.
-
-}}}
-{{{ Miscellaneous
-
-- JARClassLoader now reports package information (Bertalan Fodor).
-
-- A new macro, SplitPane grow, was added to the macros/interface
- directory. (Alan Ezust)
-
-- A new macro, ToggleHeaderSource, for C/C++ editing. (alan ezust)
-
-- A single-line selection no longer hides the line highlight, for
- better readability.
-
-- The selection is now saved between buffer switches.
-
-- ActionContext now remembers overridden actions, so another plugin
- can override builtin actions (via listing one in actions.xml with the same name).
- When the plugin is unloaded, the original action will be restored. (alan ezust)
- plugins that use this feature: infoviewer, xsearch, and optional.
-
-- Updated "Display Abbreviations", "Hex Convert" and "HyperSearch
- Results to Buffer" macros.
-
-- Updated "Insert Buffer Properties" macro (Björn "Vampire" Kautler).
-
-- The plugin manager option pane now displays the name of the mirror
- currently used (Matthieu Casanova).
-
-- URLs dragged into the textarea are loaded rather than the URL pasted
- (Nicholas O'Leary).
-
-- Deselecting a plugin in the Plugin Manager persists between reloads of
- jEdit (Nicholas O'Leary).
-
-- Help Browser has an improved history model with drop-down style
- forward and back buttons.
-
-- Can specify caret column number in addition to line number when
- opening a file (+line:<line>,<column>) (Bertalan Fodor).
-
-- Added a new EventListener to notify subscribing plugins when jEdit was
- looking for prefix completions and when it was done. These
- notifications are for the ShortcutDisplay plugin.
-
-}}}
-{{{ Bug Fixes
-
-- The following Java code did not indent properly:
-
- if(foo)
- {
- foo(bar,
- baz);
- }
-
-- The following Java code did not indent properly:
-
- foo(bar(
- <--- should not have two levels of indent here
-
-- The soft wrap state is no longer reset when a buffer is saved. This
- was pointless and slowed down the editor.
-
-- Screen line management had an off-by-one error, so in some situations
- the vertical scroll bar state would become inconsistent.
-
-- Registers dockable window had a few problems (Nicholas O'Leary).
-
-- Word count would show -1 for an empty buffer (Michael Macnair).
-
-- Fixed corrupted cursor image problem on Mac OS X.
-
-- Complete word popup is now always positioned within the screen bounds.
-
-- The last physical line index was not updated when saving files
- sometimes, resulting in exceptions when clicking in the text area.
-
-- If rectangular selection mode was enabled and you clicked beyond the
- end of the line in a read-only buffer, jEdit would beep.
-
-- Using 'Delete Lines' with folding could mess up the vertical scroll
- bar.
-
-- File system browser's right click menu now contains the "Plugins" menu
- (Nicholas O'Leary).
-
-- Fixed file system browser's left arrow key behavior (David Chan).
-
-- The startup script created by the Java-based installer on Mac OS X now
- adds the Cocoa classes to jEdit's class path, so the Mac OS plugin
- should work with no further tweaking.
-
-- Fix race condition when there were buffers in the perspective, as well
- as buffers specified to open on the command line.
-
-- If windows were docked in the top docking area, the action bar would
- display in the wrong place.
-
-- After receiving a PropertiesChanged on EditBus, the PluginManager will
- check if the mirror was changed before updating the plugin list
- (Matthieu Casanova).
-
-- Fix for drag'n'copy text to lower position in same textarea - #1246823
- (Nicholas O'Leary)
-
-- Register Viewer fixes (Nicholas O'Leary).
-
-- Bug 1173630 fixed : Format paragraph with the caret at the end of it
- (Matthieu Casanova).
-
-- Mixed parser rules are detected when adding explicit fold
- (Matthieu Casanova).
-
-- Bug 1085135 fixed : when typing ctrl+S jEdit will not ask the user if
- he wants to override the read only flag on the file
- (Matthieu Casanova)
-
-- NPE fixed when removing hyper search result that aren't cached
-(Matthieu Casanova)
-
-- NPE fixed when using turkish locale (889520)
-
-}}}
-{{{ API Changes
-
-- bug 1386702: DockableWindowManager now sends an EditBus message
- DockableWindowUpdate.ACTIVATED when a dockable is activated.
- And a corresponding DEACTIVATED message when it is deactivated. (alan ezust)
-
-- A new EditBus message has been introduced: EditPaneUpdate.CHANGING
- for Navigator (or other EBPlugins) to catch caret positions
- just before buffers are changed. (Alan ezust)
-
-- A new EditBus message has been introduced: BufferUpdate.CLOSING
- for EBPlugins to catch events just before buffers are closed.
- (Alan ezust)
-
-- Selecting multiple directories in the file chooser dialog box is now
- supported; just pass true as the last parameter (Matthieu Casanova):
-
- GUIUtilities.showVFSFileDialog(view,null,
- VFSBrowser.CHOOSE_DIRECTORY_DIALOG,true)
-
-- Now that the text area is independent of the rest of jEdit, various
- text area-related APIs that used to take org.gjt.sp.jedit.Buffer
- instances now take org.gjt.sp.jedit.buffer.JEditBuffers:
-
- - BufferChangeListener and BufferChangeAdapter are now deprecated. Use
- BufferListener instead.
-
- - FoldHandler.getFoldLevel() now takes a JEditBuffer as a parameter.
-
- - VFS.copy() methods added (Matthieu Casanova).
-
- - MiscUtilities.copyStream() and MiscUtilities.closeQuietly() methods
- added (Matthieu Casanova).
-
-}}}
-
-}}}
-
-{{{ Version 4.3pre2
-
-Thanks to Bertalan Fodor, Dirk Moebius. Jarek Tuszynski, Joshua Gertzen,
-Nicholas O'Leary, and Simon Ruggier for contributing to this release.
-
-{{{ Auto Indent
-
-- The auto indent engine has been rewritten from scratch to provide
- more accurate indentation for a variety of languages, including Java,
- Common Lisp, and Factor.
-
-- Aligned bracket indent is done as before with "indentOpenBrackets" and
- "indentCloseBrackets" properties. Unaligned indent was previously
- enabled by setting "lineUpClosingBrackets" to "false". Now, you must
- specify "unalignedOpenBrackets" and "unalignedCloseBrackets"
- properties.
-
- The upside is that both aligned and unaligned indent can be used in
- the same edit mode. For example, in Java source, the following piece
- of code is indented correctly:
-
- public void apply(Buffer buffer, int thisLineIndex,
- int prevLineIndex, int prevPrevLineIndex,
- List indentActions)
- {
- // ...
- }
-
-- The new "unindentThisLine" property, whose value is a regexp, allows
- indentation of Java switch/case constructs:
-
- switch(foo) {
- case bar:
- hello();
- default:
- yo();
- }
-
-- In order to immediately re-indent the line as soon as the case or
- default statement is terminated with a :, the "electricKeys" property
- is set to a list of characters whose input triggers a re-indent of the
- current line.
-
-- The new "unindentNextLines" property, whose value is a regexp, allows
- indentation of Factor colon definitions -- in particular, after the ;
- everything must be unindented:
-
- : refers? ( to obj -- ? )
- f swap [ pick eq? or ] each-slot nip ;
- ! Indent returns here
-
-}}}
-{{{ Syntax Highlighting
-
-- Updated LilyPond syntax highlighting (Bertalan Fodor).
-
-- Rd syntax highlighting (Jarek Tuszynski).
-
-- Updated ASP syntax highlighting (Simon Ruggier).
-
-- Slate (http://slate.tunes.org) syntax highlighting.
-
-}}}
-{{{ File System Browser
-
-- The file system now lazily retreives file system attributes. For
- plugins that use the VFS API, this has important implications; see
- the below "API Changes" section. (Joshua Gertzen).
-
-- Previously, file system browser columns would resize to fit all the
- attributes of all visible files. Now, this is not possible, so instead
- columns can be resized manually and their size is preserved.
-
-}}}
-{{{ Miscellaneous
-
-- When an item from the "Paste Previous" or "Paste Deleted" dialog boxes
- is inserted, it is moved to the top of the list.
-
-- Pasting now preserves the tall caret.
-
-- New text areas viewing a buffer inherit the fold visibility map from a
- previous text area.
-
-- The right-click popup for HyperSearch results nodes has three new
- entries:
-
- - Open
- - Open in New View
- - Open in New Plain View
- - Open in New Split
-
-- On Mac OS X, the close box is shown with a different appearance if a
- visible buffer has unsaved changes.
-
-- Dropping text into the text area now selects it (Nicholas O'Leary).
-
-- The cursor is hidden when you start typing.
-
-- Renamed 'Delete Line' to 'Delete Lines'; now does the right thing if
- more than one line is selected. Same for 'Join Lines' versus
- 'Join Line'.
-
-- When the search bar loses focus, the currently entered text is added
- to the history.
-
-- "Format Paragraph" now preserves the caret position.
-
-}}}
-{{{ Bug Fixes
-
-- Fix NullPointerException in file system roots list.
-
-- Search and replace dialog's "Search subdirectories" checkbox did not
- have an Alt-key mnemonic.
-
-- Binding actions to numeric keypad keys should now work better.
-
-- Pressing something like A+f l where A+f was a prefix but A+f l was
- not bound would insert l into the buffer, which was undesirable.
-
-- The plugin manager did not select a plugin's dependencies when the
- plugin was selected for installation.
-
-- Invoking 'Expand Fold' when the fold is expanded would move the caret
- to the wrong place.
-
-- Changing the wrap mode didn't update screen line counts, causing
- various problems.
-
-- The custom history text field border with the popup widget is back.
-
-- Fixed a memory leak. Token markers were retaining the line segment
- they were given to tokenize -- in some cases, this line segment could
- hang around for a while, and was huge.
-
-- Fix performance regression when deleting text; too many lines were
- being repainted.
-
-- 'Cut Append' and 'Copy Append' commands did not update the Registers
- dockable.
-
-- Fix Control key on Mac OS X.
-
-- Changing the font size did not update the vertical scrollbar.
-
-- JSwat plugin did not work when running under Java 5 due to a bug in
- jEdit's JARClassLoader (Dirk Moebius).
-
-- Fix some problems with paths that end with multiple file separators.
-
-- Inserting a long line of text did not always scroll horizontally as
- required.
-
-- Split panes now have resize weight, ensuring more intuitive behavior
- when a split view is resized.
-
-- If autosave kicked in while the 'Close All Buffers' dialog was open,
- then the perspective would be saved, and the wrong buffer would be
- restored on the next startup.
-
-- Fix an exception from being shown when loading a file with a malformed
- .marks file.
-
-- Fix possible ArrayIndexOutOfBoundsException when deleting text after
- decreasing the number of history elements.
-
-- Double clicking the middle mouse button now pastes twice, instead of
- pasting and selecting a word.
-
-}}}
-{{{ API Changes
-
-- View.updateTitle() is now public.
-
-- VFS.DirectoryEntry has been deprecated because its interface is not
- conductive to lazy initialization. Virtual file systems should now
- return instances of org.gjt.sp.jedit.io.VFSFile, and instead of
- reading/writing the public fields of that class (they are public but
- deprecated for VFS.DirectoryEntry compatibility), you should call the
- accessor/mutator methods.
-
-- A new MiscUtilities.pathsEqual() method has been added to check for
- equality of path names while ignoring case sensitivity on Windows.
-
-}}}
-
-}}}
-
-{{{ Version 4.3pre1
-
-Thanks to Cameron Morrison, Igor Lesik, Jim Lawton, Marcelo Vanzin,
-Nicholas O'Leary and Trevor Harmon for contributing to this release.
-
-{{{ Search and Replace
-
-- When invoking "Find", "Incremental Search for Word" or "HyperSearch
- for Word" actions, if regular expression search is on, any special
- characters in the selection are automatically escaped.
-
-- Find dialog box now has fields that accept multi-line input. Pressing
- ENTER activates the "Find" button; press C+ENTER to insert lines in
- the field.
-
-- Variables such as "view", "buffer" and "textArea" can now be used from
- BeanShell replace expressions.
-
-}}}
-{{{ Syntax Highlighting
-
-- Literate Haskell syntax highlighting (Cameron Morrison).
-
-- Updated D syntax highlighting (Jim Lawton).
-
-- Forth syntax highlighting.
-
-- Motorola 68000 assembler syntax highlighting (Igor Lesik).
-
-}}}
-{{{ Scripting
-
-- Macros written in the UTF-8Y and UTF-16 encodings are auto-detected.
-
-- Added Macros->Repeat Last Macro command. This used to be in 4.1, but
- got removed in 4.2, and now its back due to popular demand.
-
-}}}
-{{{ Miscellaneous
-
-- jEdit no longer runs with Java 2 version 1.3. Java 2 version 1.4 or
- 1.5 is now required.
-
-- If the wrap margin is set to 0 and soft wrap is enabled, wrapping is
- now performed at the text area width. This used to be in 4.1, but
- got removed in 4.2, and now its back due to popular demand.
-
-- Rename Autosave & Backup option pane to Save & Backup, move some
- options from General pane there (Marcelo Vanzin).
-
-- Added Ant target for building a MacOS X .app package (Trevor Harmon).
-
-- Added Register and Marker dockables (Nicholas O'Leary).
-
-- "Rectangular Selection" command now changes the state of the current
- selection to match the flag.
-
-- "Select All" preserves current scroll position.
-
-- When closing jEdit, open buffers are not added to the "Recent Files"
- list if the "Restore previously open files on startup" option is on.
-
-- View.goToBuffer() will try to find a non-zero height text area if
- possible.
-
-- Pressing TAB now preserves the tall caret, if there is one.
-
-- When a directory is reloaded, it is no longer moved to the top of the
- file system browser's history list.
-
-- Added View->Splitting->Restore Split action -- it recreates a
- split pane configuration as it was before the most recent 'Unsplit'.
-
-}}}
-{{{ Bug Fixes
-
-- "Backup directory" feature now works if the file being edited is on a
- different filesystem than the backup directory (Marcelo Vanzin).
-
-- Don't use two-stage save if the file's parent directory is not
- writeable (Marcelo Vanzin).
-
-- Minor fix for handling of the recent buffer when the current buffer
- was closed.
-
-- Fix StringIndexOutOfBoundsException when opening files with a
- malformed XML PI.
-
-- Removing open files from the favorites list didn't work.
-
-- calling readNextChar() no longer clears the status bar after the
- script returns.
-
-- Fix potential ArrayIndexOutOfBoundsException when indenting lines
- containing unmatched brackets.
-
-- The "deselecting this plugin will deselect dependencies" message did
- not give the actual list of dependencies.
-
-- Fixed NullPointerException when selecting QuickNotepad menu items
- before opening QuickNotepad first.
-
-- Register persistence was broken and didn't work in many cases.
-
-}}}
-{{{ API Changes
-
-- New org.gjt.sp.jedit.gui.HistoryTextArea class can be used by
- plugins.
-
-- Removed EditPlugin.JAR, deprecated since 4.2.
-
-- Removed Buffer.getRootElements(), Buffer.getParagraphElement() and
- Buffer.getDefaultRootElement() methods, deprecated since jEdit 4.0.
-
-}}}
-
-}}}
-
-jEdit buffer local properties:
-:mode=text:maxLineLen=80:indentSize=2:
-:folding=explicit:collapseFolds=2:
-:encoding=ISO-8859-1:
+jEdit 4.4 version history
+ (changes since jEdit 4.3)
+:encoding=UTF-8:
+
+{{{ Version 4.4.1
+
+Thanks to Björn "Vampire" Kautler, Kazutoshi Satoda, Alan Ezust,
+and Matthieu Casanova for contributing to this release.
+
+{{{ Bug Fixes
+
+- Collapsing all folds will move the caret outside any fold if necessary
+ (Matthieu Casanova)
+
+- Fixed an exception that occurs when opening jEdit from command line
+ with some files to open as argument if a jEdit server is running
+ (#3173669 - Matthieu Casanova)
+
+- jEdit now force drops from external applications to be COPY and not
+ MOVE drops. It prevents ftp explorer from deleting dropped files
+ (#1208598 - Matthieu Casanova)
+
+- Changing bufferset scopes now saved to properties as default scope.
+ (#3316329 - Matthieu Casanova)
+
+- Buffersets no longer populated with open files when creating new view.
+ (#2990965 - Matthieu Casanova and Alan Ezust)
+
+- BufferSet contents of new Plain View #3317405 fixed (Matthieu Casanova)
+
+- When the cursor was at a start (or end) of non-top (non-bottom) line,
+ Find Next (Previous) for a non-empty regex starting with "^" (ending
+ with "$") wrongly skipped the occurrence at the cursor.
+ (SF.net bug #2953604 - Kazutoshi Satoda)
+
+- Corrected a wrong specifications (javadoc comments) of
+ SearchMatcher#nextMatch(). (SF.net bug #2953604 - Kazutoshi Satoda)
+
+- Fixed an exception that prevent from opening properties dialog of non local
+ files in the VFS Browser (#3199876 - Matthieu Casanova)
+
+- Remove sending to background from the Linux start script, otherwise it cannot
+ be used properly as commit editor with the -wait option or to get the -usage
+ output on the commandline properly (Björn "Vampire" Kautler)
+
+- Improve integration with Unity Launcher. Without this change if you pin jEdit
+ to the Launcher and then run it, a separate icon for the running instance is
+ shown. With this change this is correctly merged with the pinned starter.
+ (Björn "Vampire" Kautler)
+
+}}}
+
+}}}
+
+{{{ Version 4.4pre1
+
+Thanks to Björn "Vampire" Kautler, Alan Ezust, Eric Berry,
+Shlomy Reinstein, Damien Radtke, Dale Anson, Matthieu Casanova,
+Eric Le Lay, Bernhard Walle, Joerg Spieler, Kevin Hunter, François Rey,
+Dion Whitehead, Marcelo Vanzin, Jesse Pavel, Jakub RoztoÄil,
+Kazutoshi Satoda, Anshal Shukla, Milutin JovanoviÄ, Vadim Voituk,
+goebbe, James Nicholl, Uwe donovaly, Sergey Mezentsev, Jim Lawton,
+Suraj Kurapati, Paulo Moura, curtis_call, Rowan Collins,
+Stephen Blackheath, asitdepends, Michael Schlotter, Robin Neatherway,
+strank, and Hisateru Tanaka for contributing to this release.
+
+{{{ Bug fixes
+
+- Fixed an exception when trying to add new menu items to the context menu
+ if some ActionSets have been unloaded (plugin deactivation)
+ (Matthieu Casanova #3071355)
+
+
+- Windows installer tries to quit existing jEdit instance before trying to
+ install (Björn "Vampire" Kautler)
+
+- Closes menus when toggling dockables. (#3022084 - Anshal Shukla)
+
+- VFSBrowser escape handling fixed when used as a dialog (#3101808 - Alan Ezust)
+
+- Context menu sorted when adding toolbar buttons (#3074164 - Alan Ezust)
+
+- Fixed an exception when clicking ok while adding new action to the context
+ menu if no action has been selected (Matthieu Casanova #3072546)
+
+- Fixed TextArea.selectBlock() when the block is at offset 0
+ (Jesse Pavel #3062072)
+
+- Fixed a memory leak in the beanshell snippet replacement
+ (Matthieu Casanova #3043132)
+
+- The "buffer" variable is always the current buffer and not the buffer
+ where the replacement occurs when using beanshell snippet replacement
+ (Matthieu Casanova #3043118)
+
+- Removed workaround in drag & drop code of TextArea that doesn't seem
+ useful anymore on Ubuntu and cause exceptions when dropping a Transferable
+ that is not a String but has a java.io.InputStream as representation class
+ (Matthieu Casanova)
+
+- Fixed caret going to the wrong position when adding explicit folds
+ in a buffer that uses an edit mode that has no line comment
+ (Matthieu Casanova #2138160)
+
+- Fixed caret going after the explicit folds when adding explicit folds
+ to the wrong position when adding explicit folds while having no
+ selection, in any edit mode (Matthieu Casanova)
+
+- When saving a buffer the autoreload option of the buffer was overridden
+ by global settings (Matthieu Casanova #2999966)
+
+- Improve indentation settings of the shellscript edit mode.
+ (Björn "Vampire" Kautler #3005463)
+
+- Removed the duplicated "Architecture" line from the Debian control file.
+ (Björn "Vampire" Kautler #2999456)
+
+- In the manage panel, when selecting a library, the description panel do
+ not contains "null" for every fields and the title is set to the jar name
+ instead of "null" (Matthieu Casanova)
+
+- Update of textarea scrollbars and bufferSwitcher are now done in
+ EventQueue thread (Matthieu Casanova #2946031)
+
+- Removed unnecessary popup warnings from InstallPanel when loading a
+ pluginset. (Alan Ezust)
+
+- fix #1439605 - remove installer.VariableGridLayout (r16596).
+
+- Fixed bug in "selection-length" status bar widget: The widget was not added
+ to the edit bus, so it wasn't updated when the edit pane changed.
+ (Shlomy Reinstein)
+
+- Removed write capability to the UrlVFS. Now http:// files are marked
+ read-only. (Eric Le Lay #2805986)
+
+- When having two monitors the About dialog was appearing between them, one half
+ on each monitor. Now it's position is relative to the active View
+ (Matthieu Casanova)
+
+- Selection foreground color broken when soft wrap. (Shlomy Reinstein #2946203)
+
+- Using regex style encoding auto detectors, StringIndexOutOfBoundsException
+ could happen when loading a file. (Kazutoshi Satoda)
+
+- The encoding could be less accurate when opening a file from
+ File System Browser. (SF.net bug #1524181,1721796 - Kazutoshi Satoda)
+
+- ALT key typing with Windows Look&Feel (for menu bar interaction) now
+ behaves a bit closer to native Windows applications.
+ NOTE: It's still incomplete due to some problems in JVM.
+ http://bugs.sun.com/view_bug.do?bug_id=6923687
+ http://bugs.sun.com/view_bug.do?bug_id=6458497
+ ALT key typing is disabled on TextArea for now to prevent the latter
+ problem.
+ (SF.net bug #2795635 - Kazutoshi Satoda)
+
+- HelpViewer loads pages asynchronously (SF.net bug #1231914 - Eric Le Lay)
+
+- Don't replace colons by slashes in canonPath() on Mac OS X
+ (SF.net bug #1488911 - Eric Le Lay - r17754)
+
+- Fix Angle brackets showing up in plugin descriptions in plugin manager
+ (SF.net bug #1963667 - Eric Le Lay)
+
+- Fix SOCKS proxy accessing wrong property.
+ Therefore, SOCKS proxy was never getting enabled.
+ (SF.net patch #2820969 - Milutin JovanoviÄ)
+
+- CopyFileWorker now throws a FileNotFoundException instead of a NPE if
+ the target path is not a directory and it's parent doesn't exists.
+ (Matthieu Casanova)
+
+- CopyFileWorker do not accept that the source and target are the same
+ (Matthieu Casanova)
+
+- Changed GUIUtilities.confirm() to work also from worker threads, by
+ deferring the confirmation dialog to the EDT. This fixes threading
+ issues with HyperSearchRequest, if the number of results exceeds the
+ "max results" option. (Shlomy Reinstein)
+
+- Fix "-reuseview" not bringing the view to the front.
+ (Sf.net bug #1510651 - Shlomy Reinstein)
+
+- Show search bar in full screen mode. (Sf.net bug #2944752 - Shlomy Reinstein)
+
+- Got rid of extra Component created as parent of every JToolBar in
+ GuiUtilities.loadToolBar() (#2114751 - Alan Ezust)
+
+- After using save-as action on a read-only buffer the new buffer is no longer
+ read-only (#3148102 - Matthieu Casanova)
+
+}}}
+{{{ API changes
+
+- API made public:
+ org.gjt.sp.jedit.browser.VFSFileNameField (Marcelo Vanzin)
+
+- Added methods to manage the cursor if the TextArea :
+ In the TextAreaPainter class, added
+ resetCursor()
+ setCursor(Cursor)
+ The cursor behavior is the following :
+ when the cursor is the default one : TEXT_CURSOR,
+ when typing text it is hidden, after moving the mouse it reappears.
+ If a plugin calls setCursor() to replace it for whatever reason,
+ the cursor will not disappear anymore when typing or be changed to
+ TEXT_CURSOR until resetCursor() is called (Matthieu Casanova)
+
+- Introduction of a new ThreadUtilities class implementing a
+ threadpool using Java 1.6 Concurrent API. Use this instead of
+ VFSManager's WorkThreadPool, which is now deprecated.
+ Related: A new Task Monitor dockable which will eventually replace
+ the I/O progress monitor, for showing progress of tasks.
+ Still TODO: rewrite VFSManager + all plugins to use ThreadUtilities
+ instead of WorkThreadPool. (Matthieu Casanova)
+
+- Made method TextUtilities.getCharType() public (Matthieu Casanova)
+
+- Method MiscUtilities.formatFileSize() moved to StandardUtilities
+ (Matthieu Casanova)
+
+- New method E ServiceManager.getService(Class<E> clazz, String name) to get
+ service instance (Matthieu Casanova)
+
+- Register api changed, it now contains Transferable (Matthieu Casanova)
+
+- Added ThreadUtilities utility class (Matthieu Casanova)
+
+- Removed deprecated objectfactory xml parser.
+
+- File System Browser dynamic menu support (#2938170 - François Rey)
+
+- Added a method for unregistering macro handlers: Macros.unregisterHandler().
+
+- bufferSet api rewritten. Now each editPane have its own bufferSet,
+ does not share it with other editPanes. The bufferset scope is the
+ same for all EditPanes. (Matthieu Casanova)
+
+- Status bar widget : it is now possible to use labels starting with letters
+ in status bar. (Matthieu Casanova)
+
+- Removed long deprecated TextArea#isDragInProgress() and
+ TextArea#setDragInProgress(). (SF.net patch #2809776,2936146 - Kevin Hunter)
+
+- EditBus.send() will now always deliver messages on the AWT thread, although
+ it can be called from any thread. (Marcelo Vanzin)
+
+- Added EditBus.sendAsync(): this just enqueues messages to be send over
+ the EditBus as soon as the AWT thread is not busy, and returns immediately.
+ (Marcelo Vanzin)
+
+- Added ability to tag classes with EditBus.EBHandler. This is only useful
+ when tagging an EditPlugin class, and makes the plugin instance behave
+ as if it implemented EBComponent (it's added to the bus when the plugin
+ is activated). (Marcelo Vanzin)
+
+- RFC edit mode was misplaced in catalog and was never matching anything because
+ text edit mode glob was more global and checked first (Matthieu Casanova)
+
+- New ping-pong list component org.gjt.sp.jedit.gui.PingPongList
+ (Matthieu Casanova)
+
+- PluginUpdate bus message now have a method getPluginVersion() that returns
+ the plugin version if there is one (Matthieu Casanova #2953163)
+
+- Added StyleEditor.invokeForCaret(textArea) which does same as
+ buffer.editSyntaxStyle(textArea) did, but can be invoked without
+ specifying the buffer object carefully. (Kazutoshi Satoda)
+
+- HistoryModel's max size is no more defined globally : replaced the static
+ max variable by a per-instance max variable and a static defaultMax variable
+ (Eric Le Lay)
+
+- The JeditBuffer class now have thread-safe getText() params-less convenience
+ method (Vadim Voituk)
+
+- Patch 3008954 to Mode and ModeProvider to allow an exact filename
+ match when selecting the mode for a file. (Patch provided by Bernhard Walle)
+
+- Patch 3022084 added View.closeAllMenus(). (Anshal Shukla)
+
+}}}
+{{{ Editing
+
+- Update for Stata-edit mode (goebbe, # 3019042)
+
+- Added "using" keyword to haXe edit mode (patch #3081482 from Bad Sector,
+ Matthieu Casanova)
+
+- Added visualbasic.xml edit mode (Anonymous submitter, #3031412)
+
+- Added haxe.xml and hxml mode files to support haXe language
+ (Dion Whitehead, François Rey, # 2922986)
+
+- Added plaintex.xml mode file, for plain tex files. (# 2787012 - James Nicholl)
+
+- nsis2.xml update (#2653404 Uwe donovaly)
+
+- sas.xml update (#2926121, 3015899 - goebbe)
+
+- html.erb added to rhtml mode catalog entry. (# 2734062 Sergey Mezentsev)
+
+- Added Go edit mode (#2898646 - Jim Lawton)
+
+- When pasting text copied from the textarea, if the target textarea has
+ no edit mode, the edit mode from the source is copied (Matthieu Casanova)
+
+- Added the missing doxygen commands for doxygen v1.6.1
+ (bug #2895272 - report and patch from Bernhard Walle).
+ doxygen now highlights quoted strings in comments.
+
+- Ruby mode - keyword highlighting bug fix ( # 2868654 - Suraj Kurapati)
+
+- Updated logtalk.xml file (# 2937909 - Paulo Moura)
+
+- Slax Edit Mode ( # 2883030 - curtis_call )
+
+- Json edit mode ( # 2979745 - Dale Anson )
+
+- PHP Smarty Templates Mode ( # 2969956 - Rowan Collins)
+
+- Haskell edit mode rewrite ( # 2993269 - Stephen Blackheath)
+
+- Pure edit mode updates ( # 2988741 - asitdepends)
+
+- url.xml mode (# 1991306 - Kevin Hunter)
+
+- LaTeX mode - code indentation (2872638 - Michael Schlotter)
+
+- 'dot.xml' mode file indent{Open,Close}Brackets wrong
+ (#3008614 - Robin Neatherway)
+
+- Added logtalk.xml mode file (#1945284 - Paulo Moura)
+
+- Added regex.xml mode file (#2782258 - Kevin Hunter)
+
+- Added sip.xml mode file to read sip messages (Matthieu Casanova)
+
+- New paste special action accessible from menu
+ Edit->More clipboard->Paste Special that will suggest different mode to paste
+ data from clipboard, currently plain text, rich jEdit text
+ (plain text + edit mode) and mime type html are supported (Matthieu Casanova)
+
+- Added Ant mode file for Ant build files. (#3016053 - Dale Anson)
+
+- Added TLD mode file for JSP Tag Definition Library files. (#3016054 - Dale Anson)
+
+- Added Maven mode file for Maven pom.xml files. (#3016057 - Dale Anson)
+
+- Updated javacc mode to better highlight keywords and regular expressions. (Dale Anson)
+
+- Updated Django temlate mode to Django 1.2, added missing keywords
+ and better integration with HTML, CSS and JS (Jakub RoztoÄil)
+
+}}}
+{{{ Miscellaneous
+
+- Made the Windows installer buildable completely via wine on non-Windows
+ systems (Björn "Vampire" Kautler)
+
+- Included the Windows launcher in the Java installer (Björn "Vampire" Kautler)
+
+- Made the Windows installer correctly show special characters like german
+ umlauts (Björn "Vampire" Kautler)
+
+- Made the filter tasks use UTF-8 encoding as all our files are UTF-8 encoded
+ (Björn "Vampire" Kautler)
+
+- build files and properties cleanup (Björn "Vampire" Kautler)
+
+- Wrap mode tooltip in status bar now indicates the current wrap mode (Matthieu Casanova)
+
+- Made the Deb Ant task compatible to Ant 1.8+ (Björn "Vampire" Kautler)
+
+- It is now possible to copy several files in the VFS Browser at the same time,
+ and copy from/to the OS explorer (Matthieu Casanova)
+
+- Removed LatestVersion plugin.
+
+- HelpViewer font can be configured via Appearance Option Pane. (#3002186 - Alan Ezust)
+
+- Added actions for eating whitespace at word ends in both directions
+ for findWordStart. (#1953341 - strank)
+
+- Added a configurable selection foreground color. If set, this color will be
+ used for the selection foreground instead of the syntax highlighting color.
+ The new option can be set from Global Options -> Text Area.
+ (Shlomy Reinstein)
+
+- Implemented feature request #2919875: Namable views. You can now specify a
+ name for each view using View -> Set view title. The name is persistent in the
+ perspective.xml file.
+
+- In Hypersearch results panel, the query string length is now limited to 100
+ chars by default for display (Matthieu Casanova)
+
+- Applied patch #2887520: Allow filtering the recent file list using file globs,
+ e.g. "*.java" or "{*.c,*.h}". (Patch provided by Joerg Spieler)
+
+- New status bar widget design (Matthieu Casanova #1540560)
+
+- New Encodings option pane using drag & drop (Matthieu Casanova)
+
+- Parsing buffer local properties is limited to the first 10000 characters of
+ the first and last 10 lines. This is a performance enhancement when loading
+ buffers containing very long lines (Matthieu Casanova)
+
+- Added a new option to perform font substitution in the text area when the
+ current configured font can't display characters in the buffer. It's disabled
+ by default, and can be enabled in the text area option pane, along with the
+ option to choose preferred fonts for substitution. This makes reading files
+ which contain text in multiple scripts more bearable. (Marcelo Vanzin)
+
+- Fixed ModeCatalogHandler so if an edit mode in the user-specific catalog has
+ the same name as an edit mode in the system catalog, the version in the
+ user-specific catalog will override the system default. This is what the
+ documentation for writing an edit mode has stated is true for some time, now
+ it is. (Dale Anson)
+
+- Gave better priorities within modes which matches with a file at the
+ same time, as the following order:
+ - exact filename match
+ - both the filename glob and the first line glob
+ - only the filename glob
+ - the first line glob (Dale Anson)
+
+- In status bar option pane, when adding a widget only widgets that are not
+ already in the bar will be proposed (Matthieu Casanova feature #2937286)
+
+- Added jedit.exe in the Windows installer, so that users can invoke
+ jEdit more like a native application.
+ (Feature Request #2661227, Patch #2984552 - Hisateru Tanaka,
+ and Björn "Vampire" Kautler)
+
+- Added some more encoding detectors as default. (Kazutoshi Satoda)
+
+- Added settings to Activity Log to adjust colors and filter by message type.
+ (Dale Anson)
+
+- Updated 'Make Get and Set' macro. (Dale Anson)
+
+- Ctrl-P and Ctrl-N work from completion popups now (#3080463 - Damien Radtke)
+
+- Added "Replace" button to Search and Replace dialog. This allows a 'replace
+ once' as opposed to 'replace and find'. (#3084224 - Dale Anson)
+
+}}}
+
+}}}
+
+jEdit buffer local properties:
+:folding=explicit:collapseFolds=2:
diff --git a/jEdit/doc/COPYING.DOC.txt b/jEdit/doc/COPYING.DOC.txt
index 96e8e88..b42936b 100644
--- a/jEdit/doc/COPYING.DOC.txt
+++ b/jEdit/doc/COPYING.DOC.txt
@@ -1,355 +1,355 @@
- GNU Free Documentation License
- Version 1.1, March 2000
-
- Copyright (C) 2000 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-
-0. PREAMBLE
-
-The purpose of this License is to make a manual, textbook, or other
-written document "free" in the sense of freedom: to assure everyone
-the effective freedom to copy and redistribute it, with or without
-modifying it, either commercially or noncommercially. Secondarily,
-this License preserves for the author and publisher a way to get
-credit for their work, while not being considered responsible for
-modifications made by others.
-
-This License is a kind of "copyleft", which means that derivative
-works of the document must themselves be free in the same sense. It
-complements the GNU General Public License, which is a copyleft
-license designed for free software.
-
-We have designed this License in order to use it for manuals for free
-software, because free software needs free documentation: a free
-program should come with manuals providing the same freedoms that the
-software does. But this License is not limited to software manuals;
-it can be used for any textual work, regardless of subject matter or
-whether it is published as a printed book. We recommend this License
-principally for works whose purpose is instruction or reference.
-
-
-1. APPLICABILITY AND DEFINITIONS
-
-This License applies to any manual or other work that contains a
-notice placed by the copyright holder saying it can be distributed
-under the terms of this License. The "Document", below, refers to any
-such manual or work. Any member of the public is a licensee, and is
-addressed as "you".
-
-A "Modified Version" of the Document means any work containing the
-Document or a portion of it, either copied verbatim, or with
-modifications and/or translated into another language.
-
-A "Secondary Section" is a named appendix or a front-matter section of
-the Document that deals exclusively with the relationship of the
-publishers or authors of the Document to the Document's overall subject
-(or to related matters) and contains nothing that could fall directly
-within that overall subject. (For example, if the Document is in part a
-textbook of mathematics, a Secondary Section may not explain any
-mathematics.) The relationship could be a matter of historical
-connection with the subject or with related matters, or of legal,
-commercial, philosophical, ethical or political position regarding
-them.
-
-The "Invariant Sections" are certain Secondary Sections whose titles
-are designated, as being those of Invariant Sections, in the notice
-that says that the Document is released under this License.
-
-The "Cover Texts" are certain short passages of text that are listed,
-as Front-Cover Texts or Back-Cover Texts, in the notice that says that
-the Document is released under this License.
-
-A "Transparent" copy of the Document means a machine-readable copy,
-represented in a format whose specification is available to the
-general public, whose contents can be viewed and edited directly and
-straightforwardly with generic text editors or (for images composed of
-pixels) generic paint programs or (for drawings) some widely available
-drawing editor, and that is suitable for input to text formatters or
-for automatic translation to a variety of formats suitable for input
-to text formatters. A copy made in an otherwise Transparent file
-format whose markup has been designed to thwart or discourage
-subsequent modification by readers is not Transparent. A copy that is
-not "Transparent" is called "Opaque".
-
-Examples of suitable formats for Transparent copies include plain
-ASCII without markup, Texinfo input format, LaTeX input format, SGML
-or XML using a publicly available DTD, and standard-conforming simple
-HTML designed for human modification. Opaque formats include
-PostScript, PDF, proprietary formats that can be read and edited only
-by proprietary word processors, SGML or XML for which the DTD and/or
-processing tools are not generally available, and the
-machine-generated HTML produced by some word processors for output
-purposes only.
-
-The "Title Page" means, for a printed book, the title page itself,
-plus such following pages as are needed to hold, legibly, the material
-this License requires to appear in the title page. For works in
-formats which do not have any title page as such, "Title Page" means
-the text near the most prominent appearance of the work's title,
-preceding the beginning of the body of the text.
-
-
-2. VERBATIM COPYING
-
-You may copy and distribute the Document in any medium, either
-commercially or noncommercially, provided that this License, the
-copyright notices, and the license notice saying this License applies
-to the Document are reproduced in all copies, and that you add no other
-conditions whatsoever to those of this License. You may not use
-technical measures to obstruct or control the reading or further
-copying of the copies you make or distribute. However, you may accept
-compensation in exchange for copies. If you distribute a large enough
-number of copies you must also follow the conditions in section 3.
-
-You may also lend copies, under the same conditions stated above, and
-you may publicly display copies.
-
-
-3. COPYING IN QUANTITY
-
-If you publish printed copies of the Document numbering more than 100,
-and the Document's license notice requires Cover Texts, you must enclose
-the copies in covers that carry, clearly and legibly, all these Cover
-Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
-the back cover. Both covers must also clearly and legibly identify
-you as the publisher of these copies. The front cover must present
-the full title with all words of the title equally prominent and
-visible. You may add other material on the covers in addition.
-Copying with changes limited to the covers, as long as they preserve
-the title of the Document and satisfy these conditions, can be treated
-as verbatim copying in other respects.
-
-If the required texts for either cover are too voluminous to fit
-legibly, you should put the first ones listed (as many as fit
-reasonably) on the actual cover, and continue the rest onto adjacent
-pages.
-
-If you publish or distribute Opaque copies of the Document numbering
-more than 100, you must either include a machine-readable Transparent
-copy along with each Opaque copy, or state in or with each Opaque copy
-a publicly-accessible computer-network location containing a complete
-Transparent copy of the Document, free of added material, which the
-general network-using public has access to download anonymously at no
-charge using public-standard network protocols. If you use the latter
-option, you must take reasonably prudent steps, when you begin
-distribution of Opaque copies in quantity, to ensure that this
-Transparent copy will remain thus accessible at the stated location
-until at least one year after the last time you distribute an Opaque
-copy (directly or through your agents or retailers) of that edition to
-the public.
-
-It is requested, but not required, that you contact the authors of the
-Document well before redistributing any large number of copies, to give
-them a chance to provide you with an updated version of the Document.
-
-
-4. MODIFICATIONS
-
-You may copy and distribute a Modified Version of the Document under
-the conditions of sections 2 and 3 above, provided that you release
-the Modified Version under precisely this License, with the Modified
-Version filling the role of the Document, thus licensing distribution
-and modification of the Modified Version to whoever possesses a copy
-of it. In addition, you must do these things in the Modified Version:
-
-A. Use in the Title Page (and on the covers, if any) a title distinct
- from that of the Document, and from those of previous versions
- (which should, if there were any, be listed in the History section
- of the Document). You may use the same title as a previous version
- if the original publisher of that version gives permission.
-B. List on the Title Page, as authors, one or more persons or entities
- responsible for authorship of the modifications in the Modified
- Version, together with at least five of the principal authors of the
- Document (all of its principal authors, if it has less than five).
-C. State on the Title page the name of the publisher of the
- Modified Version, as the publisher.
-D. Preserve all the copyright notices of the Document.
-E. Add an appropriate copyright notice for your modifications
- adjacent to the other copyright notices.
-F. Include, immediately after the copyright notices, a license notice
- giving the public permission to use the Modified Version under the
- terms of this License, in the form shown in the Addendum below.
-G. Preserve in that license notice the full lists of Invariant Sections
- and required Cover Texts given in the Document's license notice.
-H. Include an unaltered copy of this License.
-I. Preserve the section entitled "History", and its title, and add to
- it an item stating at least the title, year, new authors, and
- publisher of the Modified Version as given on the Title Page. If
- there is no section entitled "History" in the Document, create one
- stating the title, year, authors, and publisher of the Document as
- given on its Title Page, then add an item describing the Modified
- Version as stated in the previous sentence.
-J. Preserve the network location, if any, given in the Document for
- public access to a Transparent copy of the Document, and likewise
- the network locations given in the Document for previous versions
- it was based on. These may be placed in the "History" section.
- You may omit a network location for a work that was published at
- least four years before the Document itself, or if the original
- publisher of the version it refers to gives permission.
-K. In any section entitled "Acknowledgements" or "Dedications",
- preserve the section's title, and preserve in the section all the
- substance and tone of each of the contributor acknowledgements
- and/or dedications given therein.
-L. Preserve all the Invariant Sections of the Document,
- unaltered in their text and in their titles. Section numbers
- or the equivalent are not considered part of the section titles.
-M. Delete any section entitled "Endorsements". Such a section
- may not be included in the Modified Version.
-N. Do not retitle any existing section as "Endorsements"
- or to conflict in title with any Invariant Section.
-
-If the Modified Version includes new front-matter sections or
-appendices that qualify as Secondary Sections and contain no material
-copied from the Document, you may at your option designate some or all
-of these sections as invariant. To do this, add their titles to the
-list of Invariant Sections in the Modified Version's license notice.
-These titles must be distinct from any other section titles.
-
-You may add a section entitled "Endorsements", provided it contains
-nothing but endorsements of your Modified Version by various
-parties--for example, statements of peer review or that the text has
-been approved by an organization as the authoritative definition of a
-standard.
-
-You may add a passage of up to five words as a Front-Cover Text, and a
-passage of up to 25 words as a Back-Cover Text, to the end of the list
-of Cover Texts in the Modified Version. Only one passage of
-Front-Cover Text and one of Back-Cover Text may be added by (or
-through arrangements made by) any one entity. If the Document already
-includes a cover text for the same cover, previously added by you or
-by arrangement made by the same entity you are acting on behalf of,
-you may not add another; but you may replace the old one, on explicit
-permission from the previous publisher that added the old one.
-
-The author(s) and publisher(s) of the Document do not by this License
-give permission to use their names for publicity for or to assert or
-imply endorsement of any Modified Version.
-
-
-5. COMBINING DOCUMENTS
-
-You may combine the Document with other documents released under this
-License, under the terms defined in section 4 above for modified
-versions, provided that you include in the combination all of the
-Invariant Sections of all of the original documents, unmodified, and
-list them all as Invariant Sections of your combined work in its
-license notice.
-
-The combined work need only contain one copy of this License, and
-multiple identical Invariant Sections may be replaced with a single
-copy. If there are multiple Invariant Sections with the same name but
-different contents, make the title of each such section unique by
-adding at the end of it, in parentheses, the name of the original
-author or publisher of that section if known, or else a unique number.
-Make the same adjustment to the section titles in the list of
-Invariant Sections in the license notice of the combined work.
-
-In the combination, you must combine any sections entitled "History"
-in the various original documents, forming one section entitled
-"History"; likewise combine any sections entitled "Acknowledgements",
-and any sections entitled "Dedications". You must delete all sections
-entitled "Endorsements."
-
-
-6. COLLECTIONS OF DOCUMENTS
-
-You may make a collection consisting of the Document and other documents
-released under this License, and replace the individual copies of this
-License in the various documents with a single copy that is included in
-the collection, provided that you follow the rules of this License for
-verbatim copying of each of the documents in all other respects.
-
-You may extract a single document from such a collection, and distribute
-it individually under this License, provided you insert a copy of this
-License into the extracted document, and follow this License in all
-other respects regarding verbatim copying of that document.
-
-
-7. AGGREGATION WITH INDEPENDENT WORKS
-
-A compilation of the Document or its derivatives with other separate
-and independent documents or works, in or on a volume of a storage or
-distribution medium, does not as a whole count as a Modified Version
-of the Document, provided no compilation copyright is claimed for the
-compilation. Such a compilation is called an "aggregate", and this
-License does not apply to the other self-contained works thus compiled
-with the Document, on account of their being thus compiled, if they
-are not themselves derivative works of the Document.
-
-If the Cover Text requirement of section 3 is applicable to these
-copies of the Document, then if the Document is less than one quarter
-of the entire aggregate, the Document's Cover Texts may be placed on
-covers that surround only the Document within the aggregate.
-Otherwise they must appear on covers around the whole aggregate.
-
-
-8. TRANSLATION
-
-Translation is considered a kind of modification, so you may
-distribute translations of the Document under the terms of section 4.
-Replacing Invariant Sections with translations requires special
-permission from their copyright holders, but you may include
-translations of some or all Invariant Sections in addition to the
-original versions of these Invariant Sections. You may include a
-translation of this License provided that you also include the
-original English version of this License. In case of a disagreement
-between the translation and the original English version of this
-License, the original English version will prevail.
-
-
-9. TERMINATION
-
-You may not copy, modify, sublicense, or distribute the Document except
-as expressly provided for under this License. Any other attempt to
-copy, modify, sublicense or distribute the Document is void, and will
-automatically terminate your rights under this License. However,
-parties who have received copies, or rights, from you under this
-License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-
-10. FUTURE REVISIONS OF THIS LICENSE
-
-The Free Software Foundation may publish new, revised versions
-of the GNU Free Documentation License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns. See
-http://www.gnu.org/copyleft/.
-
-Each version of the License is given a distinguishing version number.
-If the Document specifies that a particular numbered version of this
-License "or any later version" applies to it, you have the option of
-following the terms and conditions either of that specified version or
-of any later version that has been published (not as a draft) by the
-Free Software Foundation. If the Document does not specify a version
-number of this License, you may choose any version ever published (not
-as a draft) by the Free Software Foundation.
-
-
-ADDENDUM: How to use this License for your documents
-
-To use this License in a document you have written, include a copy of
-the License in the document and put the following copyright and
-license notices just after the title page:
-
- Copyright (c) YEAR YOUR NAME.
- Permission is granted to copy, distribute and/or modify this document
- under the terms of the GNU Free Documentation License, Version 1.1
- or any later version published by the Free Software Foundation;
- with the Invariant Sections being LIST THEIR TITLES, with the
- Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
- A copy of the license is included in the section entitled "GNU
- Free Documentation License".
-
-If you have no Invariant Sections, write "with no Invariant Sections"
-instead of saying which ones are invariant. If you have no
-Front-Cover Texts, write "no Front-Cover Texts" instead of
-"Front-Cover Texts being LIST"; likewise for Back-Cover Texts.
-
-If your document contains nontrivial examples of program code, we
-recommend releasing these examples in parallel under your choice of
-free software license, such as the GNU General Public License,
-to permit their use in free software.
+ GNU Free Documentation License
+ Version 1.1, March 2000
+
+ Copyright (C) 2000 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+0. PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+written document "free" in the sense of freedom: to assure everyone
+the effective freedom to copy and redistribute it, with or without
+modifying it, either commercially or noncommercially. Secondarily,
+this License preserves for the author and publisher a way to get
+credit for their work, while not being considered responsible for
+modifications made by others.
+
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense. It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does. But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book. We recommend this License
+principally for works whose purpose is instruction or reference.
+
+
+1. APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work that contains a
+notice placed by the copyright holder saying it can be distributed
+under the terms of this License. The "Document", below, refers to any
+such manual or work. Any member of the public is a licensee, and is
+addressed as "you".
+
+A "Modified Version" of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A "Secondary Section" is a named appendix or a front-matter section of
+the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall subject
+(or to related matters) and contains nothing that could fall directly
+within that overall subject. (For example, if the Document is in part a
+textbook of mathematics, a Secondary Section may not explain any
+mathematics.) The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The "Invariant Sections" are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License.
+
+The "Cover Texts" are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License.
+
+A "Transparent" copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, whose contents can be viewed and edited directly and
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters. A copy made in an otherwise Transparent file
+format whose markup has been designed to thwart or discourage
+subsequent modification by readers is not Transparent. A copy that is
+not "Transparent" is called "Opaque".
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input format, SGML
+or XML using a publicly available DTD, and standard-conforming simple
+HTML designed for human modification. Opaque formats include
+PostScript, PDF, proprietary formats that can be read and edited only
+by proprietary word processors, SGML or XML for which the DTD and/or
+processing tools are not generally available, and the
+machine-generated HTML produced by some word processors for output
+purposes only.
+
+The "Title Page" means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page. For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+
+2. VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License. You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute. However, you may accept
+compensation in exchange for copies. If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+
+3. COPYING IN QUANTITY
+
+If you publish printed copies of the Document numbering more than 100,
+and the Document's license notice requires Cover Texts, you must enclose
+the copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover. Both covers must also clearly and legibly identify
+you as the publisher of these copies. The front cover must present
+the full title with all words of the title equally prominent and
+visible. You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a publicly-accessible computer-network location containing a complete
+Transparent copy of the Document, free of added material, which the
+general network-using public has access to download anonymously at no
+charge using public-standard network protocols. If you use the latter
+option, you must take reasonably prudent steps, when you begin
+distribution of Opaque copies in quantity, to ensure that this
+Transparent copy will remain thus accessible at the stated location
+until at least one year after the last time you distribute an Opaque
+copy (directly or through your agents or retailers) of that edition to
+the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+
+4. MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it. In addition, you must do these things in the Modified Version:
+
+A. Use in the Title Page (and on the covers, if any) a title distinct
+ from that of the Document, and from those of previous versions
+ (which should, if there were any, be listed in the History section
+ of the Document). You may use the same title as a previous version
+ if the original publisher of that version gives permission.
+B. List on the Title Page, as authors, one or more persons or entities
+ responsible for authorship of the modifications in the Modified
+ Version, together with at least five of the principal authors of the
+ Document (all of its principal authors, if it has less than five).
+C. State on the Title page the name of the publisher of the
+ Modified Version, as the publisher.
+D. Preserve all the copyright notices of the Document.
+E. Add an appropriate copyright notice for your modifications
+ adjacent to the other copyright notices.
+F. Include, immediately after the copyright notices, a license notice
+ giving the public permission to use the Modified Version under the
+ terms of this License, in the form shown in the Addendum below.
+G. Preserve in that license notice the full lists of Invariant Sections
+ and required Cover Texts given in the Document's license notice.
+H. Include an unaltered copy of this License.
+I. Preserve the section entitled "History", and its title, and add to
+ it an item stating at least the title, year, new authors, and
+ publisher of the Modified Version as given on the Title Page. If
+ there is no section entitled "History" in the Document, create one
+ stating the title, year, authors, and publisher of the Document as
+ given on its Title Page, then add an item describing the Modified
+ Version as stated in the previous sentence.
+J. Preserve the network location, if any, given in the Document for
+ public access to a Transparent copy of the Document, and likewise
+ the network locations given in the Document for previous versions
+ it was based on. These may be placed in the "History" section.
+ You may omit a network location for a work that was published at
+ least four years before the Document itself, or if the original
+ publisher of the version it refers to gives permission.
+K. In any section entitled "Acknowledgements" or "Dedications",
+ preserve the section's title, and preserve in the section all the
+ substance and tone of each of the contributor acknowledgements
+ and/or dedications given therein.
+L. Preserve all the Invariant Sections of the Document,
+ unaltered in their text and in their titles. Section numbers
+ or the equivalent are not considered part of the section titles.
+M. Delete any section entitled "Endorsements". Such a section
+ may not be included in the Modified Version.
+N. Do not retitle any existing section as "Endorsements"
+ or to conflict in title with any Invariant Section.
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant. To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version. Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity. If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+
+5. COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy. If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections entitled "History"
+in the various original documents, forming one section entitled
+"History"; likewise combine any sections entitled "Acknowledgements",
+and any sections entitled "Dedications". You must delete all sections
+entitled "Endorsements."
+
+
+6. COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+
+7. AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, does not as a whole count as a Modified Version
+of the Document, provided no compilation copyright is claimed for the
+compilation. Such a compilation is called an "aggregate", and this
+License does not apply to the other self-contained works thus compiled
+with the Document, on account of their being thus compiled, if they
+are not themselves derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one quarter
+of the entire aggregate, the Document's Cover Texts may be placed on
+covers that surround only the Document within the aggregate.
+Otherwise they must appear on covers around the whole aggregate.
+
+
+8. TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections. You may include a
+translation of this License provided that you also include the
+original English version of this License. In case of a disagreement
+between the translation and the original English version of this
+License, the original English version will prevail.
+
+
+9. TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License. Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License. However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+
+10. FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns. See
+http://www.gnu.org/copyleft/.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation. If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+
+
+ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+ Copyright (c) YEAR YOUR NAME.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.1
+ or any later version published by the Free Software Foundation;
+ with the Invariant Sections being LIST THEIR TITLES, with the
+ Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+ A copy of the license is included in the section entitled "GNU
+ Free Documentation License".
+
+If you have no Invariant Sections, write "with no Invariant Sections"
+instead of saying which ones are invariant. If you have no
+Front-Cover Texts, write "no Front-Cover Texts" instead of
+"Front-Cover Texts being LIST"; likewise for Back-Cover Texts.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
diff --git a/jEdit/doc/COPYING.PLUGINS.txt b/jEdit/doc/COPYING.PLUGINS.txt
index 95289f2..c779c32 100644
--- a/jEdit/doc/COPYING.PLUGINS.txt
+++ b/jEdit/doc/COPYING.PLUGINS.txt
@@ -1,21 +1,21 @@
-Linking jEdit statically or dynamically with other modules is making a
-combined work based on jEdit. Thus, the terms and conditions of the GNU
-General Public License cover the whole combination.
-
-As a special exception, the copyright holders of jEdit give you
-permission to link jEdit with independent modules that communicate with
-jEdit solely through the plugin interface, regardless of the license
-terms of these independent modules, and to copy and distribute the
-resulting combined work under terms of your choice, provided that
-every copy of the combined work is accompanied by a complete copy of
-the source code of jEdit (the version of jEdit used to produce the
-combined work), being distributed under the terms of the GNU General
-Public License plus this exception. An independent module is a module
-which is not derived from or based on jEdit.
-
-Note that people who make modified versions of jEdit are not obligated
-to grant this special exception for their modified versions; it is
-their choice whether to do so. The GNU General Public License gives
-permission to release a modified version without this exception; this
-exception also makes it possible to release a modified version which
-carries forward this exception.
+Linking jEdit statically or dynamically with other modules is making a
+combined work based on jEdit. Thus, the terms and conditions of the GNU
+General Public License cover the whole combination.
+
+As a special exception, the copyright holders of jEdit give you
+permission to link jEdit with independent modules that communicate with
+jEdit solely through the plugin interface, regardless of the license
+terms of these independent modules, and to copy and distribute the
+resulting combined work under terms of your choice, provided that
+every copy of the combined work is accompanied by a complete copy of
+the source code of jEdit (the version of jEdit used to produce the
+combined work), being distributed under the terms of the GNU General
+Public License plus this exception. An independent module is a module
+which is not derived from or based on jEdit.
+
+Note that people who make modified versions of jEdit are not obligated
+to grant this special exception for their modified versions; it is
+their choice whether to do so. The GNU General Public License gives
+permission to release a modified version without this exception; this
+exception also makes it possible to release a modified version which
+carries forward this exception.
diff --git a/jEdit/doc/COPYING.txt b/jEdit/doc/COPYING.txt
index 9285110..a43ea21 100644
--- a/jEdit/doc/COPYING.txt
+++ b/jEdit/doc/COPYING.txt
@@ -1,339 +1,339 @@
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 675 Mass Ave, Cambridge, MA 02139, USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
- 1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
- 2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
- 5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- Appendix: How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) 19yy <name of author>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) 19yy name of author
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
- <signature of Ty Coon>, 1 April 1989
- Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
-Public License instead of this License.
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ Appendix: How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/jEdit/doc/CORE_GUIDELINES.txt b/jEdit/doc/CORE_GUIDELINES.txt
index e92cdf3..4130b07 100644
--- a/jEdit/doc/CORE_GUIDELINES.txt
+++ b/jEdit/doc/CORE_GUIDELINES.txt
@@ -1,62 +1,62 @@
-Guide to jEdit's core development
-
-
-{{{Independant textarea
-
-First the dependencies with jEdit must be removed.
-It will contains packages
-
-- org.gjt.sp.jedit.buffer
-- org.gjt.sp.jedit.ident
-- org.gjt.sp.jedit.textarea
-- org.gjt.sp.jedit.syntax
-
-
-}}}
-
-{{{Package dependencies requirement
-This part contains the packages and the allowed dependencies for them,
-and their status.
-
-{{{Default dependencies (always allowed)
-- org.gjt.sp.util.*
-- org.gjt.sp.util.jedit.Debug
-- org.gjt.sp.util.jedit.Log
-}}}
-
-
--org.gjt.sp.jedit.TextUtilities (org.gjt.sp.jedit.buffer,
- org.gjt.sp.jedit.syntax)
-
-- org.gjt.sp.util : No dependency (OK)
-
-- org.gjt.sp.jedit.indent : (OK)
- {{{ imports
- -org.gjt.sp.jedit.buffer.*
- -org.gjt.sp.jedit.TextUtilities }}}
-
-
-- org.gjt.sp.jedit.syntax : No dependency (OK)
-
-- org.gjt.sp.jedit.buffer : (NOK)
- {{{ imports
- -org.gjt.sp.jedit.textarea.*
- -org.gjt.sp.jedit.syntax.* }}}
- {{{ misc informations
- -BufferChangeAdapter will not be part of the independent TextArea
- -BufferChangeListener will not be part of the independent TextArea
- JEditBuffer has a dependency on jEdit that must be removed }}}
-
-
-- org.gjt.sp.jedit.textarea : (NOK)
- {{{ imports
- -org.gjt.sp.jedit.buffer.*
- -org.gjt.sp.jedit.syntax.* }}}
-
-
-
-}}}
-
-jEdit buffer local properties:
-:wrap=hard:maxLineLen=72:indentSize=2:
-:folding=explicit:collapseFolds=2:
+Guide to jEdit's core development
+
+
+{{{Independant textarea
+
+First the dependencies with jEdit must be removed.
+It will contains packages
+
+- org.gjt.sp.jedit.buffer
+- org.gjt.sp.jedit.ident
+- org.gjt.sp.jedit.textarea
+- org.gjt.sp.jedit.syntax
+
+
+}}}
+
+{{{Package dependencies requirement
+This part contains the packages and the allowed dependencies for them,
+and their status.
+
+{{{Default dependencies (always allowed)
+- org.gjt.sp.util.*
+- org.gjt.sp.util.jedit.Debug
+- org.gjt.sp.util.jedit.Log
+}}}
+
+
+-org.gjt.sp.jedit.TextUtilities (org.gjt.sp.jedit.buffer,
+ org.gjt.sp.jedit.syntax)
+
+- org.gjt.sp.util : No dependency (OK)
+
+- org.gjt.sp.jedit.indent : (OK)
+ {{{ imports
+ -org.gjt.sp.jedit.buffer.*
+ -org.gjt.sp.jedit.TextUtilities }}}
+
+
+- org.gjt.sp.jedit.syntax : No dependency (OK)
+
+- org.gjt.sp.jedit.buffer : (NOK)
+ {{{ imports
+ -org.gjt.sp.jedit.textarea.*
+ -org.gjt.sp.jedit.syntax.* }}}
+ {{{ misc informations
+ -BufferChangeAdapter will not be part of the independent TextArea
+ -BufferChangeListener will not be part of the independent TextArea
+ JEditBuffer has a dependency on jEdit that must be removed }}}
+
+
+- org.gjt.sp.jedit.textarea : (NOK)
+ {{{ imports
+ -org.gjt.sp.jedit.buffer.*
+ -org.gjt.sp.jedit.syntax.* }}}
+
+
+
+}}}
+
+jEdit buffer local properties:
+:wrap=hard:maxLineLen=72:indentSize=2:
+:folding=explicit:collapseFolds=2:
diff --git a/jEdit/doc/FAQ/faq-contrib.xml b/jEdit/doc/FAQ/faq-contrib.xml
index cff4db8..6077598 100644
--- a/jEdit/doc/FAQ/faq-contrib.xml
+++ b/jEdit/doc/FAQ/faq-contrib.xml
@@ -1,43 +1,43 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<appendix id="appendix">
- <title>Contributors</title>
-
- <!-- jEdit buffer-local properties: -->
-
- <!-- :indentSize=4:noTabs=false:maxLineLen=72:tabSize=4: -->
-
- <!-- :xml.root=faq.xml: -->
-
- <!-- jEdit FAQ -->
-
- <!-- Copyright (C) 2003 John Gellene, Kris Kopicki -->
-
- <para>Thanks to those who contributed both questions and answers, including
- the following:</para>
-
- <itemizedlist>
- <listitem>
- <para>Mike Dillon</para>
- </listitem>
-
- <listitem>
- <para>Kris Kopicki</para>
- </listitem>
-
- <listitem>
- <para>Slava Pestov</para>
- </listitem>
-
- <listitem>
- <para>Frank Rocca</para>
- </listitem>
-
- <listitem>
- <para>Maik Schreiber</para>
- </listitem>
-
- <listitem>
- <para>Dominic Stolerman</para>
- </listitem>
- </itemizedlist>
+<?xml version="1.0" encoding="UTF-8"?>
+<appendix id="appendix">
+ <title>Contributors</title>
+
+ <!-- jEdit buffer-local properties: -->
+
+ <!-- :indentSize=4:noTabs=false:maxLineLen=72:tabSize=4: -->
+
+ <!-- :xml.root=faq.xml: -->
+
+ <!-- jEdit FAQ -->
+
+ <!-- Copyright (C) 2003 John Gellene, Kris Kopicki -->
+
+ <para>Thanks to those who contributed both questions and answers, including
+ the following:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>Mike Dillon</para>
+ </listitem>
+
+ <listitem>
+ <para>Kris Kopicki</para>
+ </listitem>
+
+ <listitem>
+ <para>Slava Pestov</para>
+ </listitem>
+
+ <listitem>
+ <para>Frank Rocca</para>
+ </listitem>
+
+ <listitem>
+ <para>Maik Schreiber</para>
+ </listitem>
+
+ <listitem>
+ <para>Dominic Stolerman</para>
+ </listitem>
+ </itemizedlist>
</appendix>
\ No newline at end of file
diff --git a/jEdit/doc/FAQ/faq-general.xml b/jEdit/doc/FAQ/faq-general.xml
index 735c9e1..433c030 100644
--- a/jEdit/doc/FAQ/faq-general.xml
+++ b/jEdit/doc/FAQ/faq-general.xml
@@ -1,650 +1,649 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<sect1 id="general">
- <title>General Questions</title>
- <!-- jEdit buffer-local properties: -->
- <!-- :indentSize=4:noTabs=false:maxLineLen=72:tabSize=4: -->
- <!-- :xml.root=faq.xml: -->
- <!-- jEdit FAQ -->
- <!-- Copyright (C) 2003 John Gellene, Kris Kopicki -->
- <!-- Copyright (C) 2006 Alan Ezust -->
- <para>This section deals with some background information, how to obtain the
- latest version of jEdit and how to obtain further information/help.</para>
- <qandaset defaultlabel="qanda">
- <qandadiv id="about">
- <title>About jEdit</title>
- <qandaentry>
- <question id="whatis">
- <para>What is jEdit?</para>
- </question>
- <answer>
- <para>jEdit is a programmer's text editor written in Java,
- originally developed by Slava Pestov, now maintained by
- others. It has an easy to use interface that resembles that
- of many other Windows and MacOS text editors. It is also
- highly customizable, and contains a <quote>plugin</quote>
- architecture that allows its features to be extended by
- additional programs.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="difftext">
- <para>What is the difference between a text editor and a
- word processor?</para>
- </question>
- <answer>
- <para>These categories are not absolute but refer to the
- primary purpose of an editing program and the focus of its
- features.</para>
- <para>A text editor is an application that edits files
- containing plain text without automatically formatting the
- text for printing or other publication. Typically the
- contents of such a file consists of data used by another
- application - for example, source code that a compiler will
- process or markup text that a web browser will display. A
- word processor deals with the preparation of documents for
- printing or similar publication. Besides editing text, a
- modern word processor allows the user to choose multiple
- fonts, margin sizes, line spacing, indentation, and a
- variety of other details that affect the appearance of the
- document being edited. In a text editor, these features are
- present, if at all, only in a basic form, and for the
- limited purpose of helping the user compose and organize the
- text. In place of word processing features, a text editor
- contains many features that allow the user to prepare and
- work with text quickly and efficiently.</para>
- <para>The jEdit application is a text editor, not a word
- processor. It contains a large assortment of features for
- manipulating source code, markup text, and other text files.
- As a programmer's text editor, it also has many features to
- help programmers manage their projects and work with other
- programming tools.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="features">
- <para>What features does jEdit have?</para>
- </question>
- <answer>
- <para>The short answer is, too many to list here. There is a
- detailed list available on the <ulink
- url="http://www.jedit.org/index.php?page=features">jEdit web
- site</ulink>, but here are some of the major
- features:</para>
- <itemizedlist>
- <listitem>
- <para>Comprehensive online help</para>
- </listitem>
- <listitem>
- <para>Multiple editor windows and split editing panes
- within a single editing window</para>
- </listitem>
- <listitem>
- <para>Unlimited undo/redo</para>
- </listitem>
- <listitem>
- <para>Copy and paste with an unlimited number of
- clipboards (known as <quote>registers</quote>)</para>
- </listitem>
- <listitem>
- <para><quote>Markers</quote> for remembering
- positions in files to return to later</para>
- </listitem>
- <listitem>
- <para>Rectangular selection</para>
- </listitem>
- <listitem>
- <para>Multiple selection for manipulating several
- chunks of text at once</para>
- </listitem>
- <listitem>
- <para>Syntax highlighting for more than 80 file
- types</para>
- </listitem>
- <listitem>
- <para>Intelligent bracket matching that skips quoted
- literals and comments</para>
- </listitem>
- <listitem>
- <para>Auto indent and word wrap</para>
- </listitem>
- <listitem>
- <para>Abbreviations</para>
- </listitem>
- <listitem>
- <para><quote>Folding</quote> display mode that hides
- levels of indented text specified by the user</para>
- </listitem>
- <listitem>
- <para>Search and replace using both literal text and
- regular expressions</para>
- </listitem>
- <listitem>
- <para><quote>HyperSearch</quote> option to show all
- found matches in a list</para>
- </listitem>
- <listitem>
- <para>File management functions available from within
- jEdit, including deleting and renaming files and
- creating new directories</para>
- </listitem>
- <listitem>
- <para>Choice of character encoding for loading and
- saving files</para>
- </listitem>
- <listitem>
- <para>Automatic compression and decompression of
- GZipped (.gz) files</para>
- </listitem>
- <listitem>
- <para>Plugin support for loading files from ZIP and
- TAR archives</para>
- </listitem>
- <listitem>
- <para>Plugin support for loading and saving files on
- FTP servers</para>
- </listitem>
- <listitem>
- <para>Fully customizable keyboard shortcuts, tool bar
- and right-click context menu</para>
- </listitem>
- <listitem>
- <para>Macro system permitting recording and writing
- of macros in the BeanShell scripting language</para>
- </listitem>
- <listitem>
- <para>An internal <quote>plugin manager</quote> that
- downloads and installs new and updated plugins from
- within jEdit</para>
- </listitem>
- </itemizedlist>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="what-plugin">
- <para>What is a jEdit <quote>plugin</quote>?</para>
- </question>
- <answer>
- <para>A plugin is an application that is designed to work
- with jEdit by providing additional features that can be used
- from within the main program. Often the plugin will provide
- a visible user interface in a window that can be docked to
- jEdit's main view window.</para>
- <para>There are currently over 120 publicly available
- plugins that provide such services as a Java source code
- browser, a command-line shell, templated text insertion, and
- source code project management. They can be downloaded,
- installed, and kept current from within jEdit's
- <quote>Plugin Manager</quote>. There is also a section of
- the jEdit web site called <ulink
- url="http://plugins.jedit.org/">Plugin Central</ulink> that
- maintains a descriptive index and download links for all
- publicly available plugins.</para>
- <para>Additional questions and answers regarding plugins may
- be found in the section of this document entitled
- <quote>Working with Plugins</quote>.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="get-doc">
- <para>How do I get documentation on jEdit?</para>
- </question>
- <answer>
- <para>There is a comprehensive User's Guide available from
- within the program using the <guimenu>Help</guimenu> menu.
- The User's Guide can also be downloaded from the <ulink
- url="http://www.jedit.org/index.php?page=download&platform=source">
- jEdit web site</ulink> in Portable Document Format (PDF),
- suitable for online display or printing.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="is-newsgroup">
- <para>Is there a newsgroup or mailing list devoted to
- jEdit?</para>
- </question>
- <answer>
- <para>Currently there is no newsgroup devoted to jEdit.
- There are three active mailing lists that are freely
- available by subscription:</para>
- <itemizedlist>
- <listitem>
- <para>The <ulink
- url="http://lists.sourceforge.net/lists/listinfo/jedit-users">
- jedit-users list</ulink>, for comments and questions
- about using jEdit and its features</para>
- </listitem>
- <listitem>
- <para>The <ulink
- url="http://lists.sourceforge.net/lists/listinfo/jedit-devel">
- jedit-devel list</ulink>, for discussion of
- development issues by members of the developer team
- and other interested persons</para>
- </listitem>
- <listitem>
- <para>The <ulink
- url="http://lists.sourceforge.net/lists/listinfo/jedit-announce">
- jedit-announce list</ulink>, a low-volume list used
- for announcing new releases of jEdit and
- plugins</para>
- </listitem>
- </itemizedlist>
- <para>Each of these lists can be obtained on a full-text
- message or a daily digest basis. The daily digest bundles
- groups of postings in a single email message.</para>
- <para>If you are only interested in version announcements
- and plugin updates, <ulink
- url="http://lists.sourceforge.net/lists/listinfo/jedit-announce">
- subscribe to the jedit-announce list</ulink>. If you would
- like to participate in discussion or ask questions regarding
- jEdit, <ulink
- url="http://lists.sourceforge.net/lists/listinfo/jedit-users">subscribe
- to the jedit-users list</ulink>. If you are interested in
- jEdit's development or want to write plugins, <ulink
- url="http://lists.sourceforge.net/lists/listinfo/jedit-devel">
- subscribe to jedit-devel</ulink>.</para>
- <para>Do not cross-post to both lists. All jEdit developers
- are subscribed to both the jedit-users and jedit-devel
- lists, so a post to jedit-users will be seen by most members
- of both lists. Also, keep in mind that both jEdit-users and
- jEdit-devel are high-traffic lists, and can fill up your
- mailbox unless you check your email regularly.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="is-website">
- <para>Is there a web site devoted to jEdit?</para>
- </question>
- <answer>
- <para>There are several. The official <ulink
- url="http://www.jedit.org">jEdit web site</ulink> contains
- extensive information on all things having to do with jEdit.
- There are also resources available for those interested in
- jEdit development on the <ulink
- url="http://sourceforge.net/projects/jedit">jEdit project
- page</ulink> of the <ulink
- url="http://sourceforge.net">SourceForge web
- site</ulink>.</para>
- <para>The <ulink url="http://community.jedit.org">jEdit
- Community</ulink> web site has articles on jEdit and related
- topics, user-submitted macros and other download resources,
- and listings of web links of interest to jEdit users. It has
- a message board system to allow users to ask questions and
- provide feedback on the project without having to subscribe
- to jEdit's mailing lists. Because the message boards have
- relatively low volume, using the mailing lists will often be
- a more effective approach.</para>
- <para>The jEdit Community site also has an
- <quote>Interactive FAQ</quote> facility that allows you to
- post questions to be answered by other users, and a
- screenshot gallery containing images submitted by
- users.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="copyright">
- <para>Are there copyright restrictions on the use of
- jEdit?</para>
- </question>
- <answer>
- <para>The jEdit application is free, <quote>Open
- Source</quote> software released under the <ulink
- url="http://www.gnu.org/licenses/old-licenses/gpl-2.0.html">
- GNU General Public License 2.0</ulink>. This ensures that
- jEdit and its source code remains freely available for use
- and distribution by the public. For specific copyright
- questions, you should review the GPL 2.0 and seek
- appropriate advice. Broadly speaking, there are no
- restrictions on the use of the program as a text editor, and
- its source code can be copied or modified for use in another
- program that is governed by the General Public
- License.</para>
- <para>Plugin application that are available using jEdit's
- Plugin Manager facility, as well as plugins available
- through the <ulink url="http://plugins.jedit.org">Plugin
- Central</ulink> web site or <ulink
- url="http://community.jedit.org">jEdit Community</ulink>,
- are governed either by the General Public License or another
- commonly recognized <quote>Open Source</quote> software
- license. This means that use of the application, including
- use for commercial purposes, is unrestricted without any
- requirement of royalty or license fee payments. To
- incorporate source code or an application or plugin as a
- whole in another application, you must consult the specific
- license terms to determine whether and on what basis you are
- permitted to do so.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="java-only">
- <para>Is jEdit only useful for programming in Java?</para>
- </question>
- <answer>
- <para>Absolutely not. Many of the jEdit's plugin
- applications, and a few of the macros distributed with the
- program, target the Java language or integrate tools used in
- Java development. However, the core application is designed
- to work with any programming or markup language. Included
- with jEdit are packages providing syntax highlighting,
- abbreviations and other programming support for over 60
- programming languages and file types, including C, C++, C#,
- Cobol, HTML, Java, Javascript, Lisp, Pascal, Perl, PHP,
- Python, Ruby, TCL, Visual Basic and XML. The full list can
- be found on the <ulink
- url="http://www.jedit.org/index.php?page=features">jEdit web
- site</ulink>.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="knowing-java">
- <para>Do I need to know Java to use jEdit?</para>
- </question>
- <answer>
- <para>No. In fact, you do not need to know any specific
- programming language other than the ones with which you
- work.</para>
- <para>At some point in your use of jEdit, you will no doubt
- want to write your own macros to execute long or complex
- routines with a single command or keyboard shortcut. Macros
- in jEdit are written in a simplified dialect of Java called
- <ulink url="http://www.beanshell.org"> BeanShell</ulink>.
- Its syntax will be familiar to users of Java, C++ and other
- object-oriented languages, and it is not hard to learn even
- if you have no experience with those languages. The User's
- Guide provided with jEdit contains an extensive tutorial on
- writing macros.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="needed-software">
- <para>What software do I need to install and run
- jEdit?</para>
- </question>
- <answer>
- <para>Since jEdit runs on a Java platform, at a minimum you
- will need a Java Runtime Environment (JRE) package. If you
- are planning to use jEdit to program in Java, you will need
- a full Java Development Kit (JDK) package. We recommend
- obtaining a JDK package.</para>
- <para>The current version of jEdit, version 4.3, requires a
- Java runtime environment having a release version of 1.5 or
- greater. It will not run on versions 1.4 or 1.3. The <ulink
- url="http://www.jedit.org/index.php?page=compatibility">jEdit
- web site</ulink> contains a detailed discussion on the
- compatibility of various publicly available JDK's for the
- major operating systems.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="just-learning">
- <para>I've just started to learn programming. Is jEdit a
- good choice for my first text editor?</para>
- </question>
- <answer>
- <para>It is an excellent choice. Its basic features are
- extremely easy to use, and you will find things like
- abbreviations, keyboard shortcuts and macros to be great
- time-savers. It has built-in packages called <quote>edit
- modes</quote> that automatically display keywords, tags, and
- other program elements in different colors, making it easier
- to view and organize your code. It works well with many Open
- Source and proprietary programming tools. Because of its
- extensive customization features, it can adapt to your
- preferences and work patterns as you become more
- experienced. Finally, it's free, so you can buy a lot of
- programming texts with the money you will save.</para>
- </answer>
- </qandaentry>
- </qandadiv>
- <!--******************************************************** Answers -->
- <qandadiv id="get-answers-div">
- <title>Getting answers</title>
- <qandaentry>
- <question id="get-answers">
- <para>How do I get answers to my questions about
- jEdit?</para>
- </question>
- <answer>
- <para>You should look for answers in the following
- places:</para>
- <itemizedlist>
- <listitem>
- <para>The User's Guide available from the
- application's <guimenu>Help</guimenu> menu.</para>
- </listitem>
- <listitem>
- <para>This FAQ document.</para>
- </listitem>
- <listitem>
- <para>The archives of jEdit's mailing lists. Archives
- for both the <ulink
- url="http://www.geocrawler.com/redir-sf.php3?list=jedit-users">
- jedit-users list</ulink> and the <ulink
- url="http://www.geocrawler.com/redir-sf.php3?list=jedit-devel">
- jedit-devel list</ulink> are available.</para>
- </listitem>
- </itemizedlist>
- <para>If you cannot find help using those resources, post
- your question to the <ulink
- url="mailto:jedit-users at lists.sourceforge.net"> jedit-users
- list</ulink>. You will have to <ulink
- url="http://lists.sourceforge.net/lists/listinfo/jedit-users">
- subscribe to the mailing list</ulink> in order to post, but
- it is well worth it, and you can elect to have daily bundles
- of messages sent to you to keep email traffic down. Many
- questions are answered on the mailing list within 24 hours.
- The developers who respond to user questions generally do
- not send direct replies, so you will need to monitor
- messages from the mailing list is order to obtain an
- answer.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="interactive-help">
- <para>Where can I get interactive help for jEdit?</para>
- </question>
- <answer>
- <para>There is an IRC channel, <filename>#jedit</filename>,
- available on the irc.freenode.net server that is dedicated
- to jEdit support and discussion among developers. You can
- reach it using any IRC client (including Chatzilla), as well
- as the IRC plugin for jEdit.</para>
- <para>There is almost always someone from the developer team
- signed on the channel. Just say hello and describe your
- problem.</para>
- </answer>
- </qandaentry>
- </qandadiv>
- <qandadiv id="bugs">
- <title>Reporting bugs</title>
- <qandaentry>
- <question id="report-bugs">
- <para>How do I report a bug I have found in jEdit?</para>
- </question>
- <answer>
- <para>To be as helpful as possible to the jEdit developer
- team and other users, you should use the <ulink
- url="http://sourceforge.net/tracker/index.php?group_id=588&atid=100588">
- bug tracker database</ulink> that the jEdit project
- maintains on the <ulink
- url="http://sourceforge.net/">SourceForge web site</ulink>.
- You need to be a SourceForge member to post a bug
- report.</para>
- <para>Before posting a bug report, spend a few moments
- searching the bug database to see if a similar report has
- already been made. The bug tracker has a search facility
- that will let search for bug reports using a variety of
- criteria. If you find a similar bug report, and you have
- additional information to contribute, post a comment to the
- report. If you do not find a similar bug report, submit a
- new report.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="bug-report">
- <para>What information should I include in a bug
- report?</para>
- </question>
- <answer>
- <para>The form in the bug tracker report provides several
- fields for submitting information. If you are unsure about a
- particular item, leave it at the default setting provided in
- the form.</para>
- <para>The more important fields are <quote>Category</quote>,
- <quote>Summary</quote> and the <quote>Initial
- comment</quote>. When you write your initial comment
- describing the bug, you should specify the versions of
- jEdit, the Java platform and operating system you are using,
- because bugs often arise that are specific to particular
- versions. Sometimes the bug arises from the Java runtime
- environment or even the operating system, and knowing these
- details helps the developer team design testing and other
- debugging strategies.</para>
- <para>One of the macros installed with jEdit is called
- <guimenuitem>Make Bug Report</guimenuitem>. You will it find
- under the <guimenuitem>Misc</guimenuitem> category of the
- <guimenu>Macros </guimenu> menu. This macro extracts
- information regarding your jEdit installation and a stack
- trace from the last error recorded by jEdit's Activity Log
- and places it in a new text buffer. In many cases, the
- information furnished by the macro is all that is necessary
- to provide a helpful description of a bug. You can simply
- cut and paste the output of the macro into the
- <quote>Initial comment</quote> field of the bug report
- form.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="bug-track">
- <para>How do I track the status of a jEdit bug
- report?</para>
- </question>
- <answer>
- <para>If you know the bug report number, go to this web
- address:
- <userinput>http://sourceforge.net/tracker/index.php?func=detail&aid=######&group_id=588&atid=100588</userinput>,
- where <userinput>######</userinput> is the bug report
- number. If you don't know the bug report number, you can
- browse and search the <ulink
- url="http://sourceforge.net/tracker/index.php?group_id=588&atid=100588">
- bug database</ulink> to find the problem in which you are
- interested.</para>
- </answer>
- </qandaentry>
- </qandadiv>
- <qandadiv id="contact">
- <title>Contacting jEdit developers</title>
- <qandaentry>
- <question id="contact-team">
- <para>How do I contact members of the jEdit developer
- team?</para>
- </question>
- <answer>
- <para>If you want to ask a question, make a feature request
- or offer other general comments, the easiest way is to join
- and post a message to the <ulink
- url="mailto:jedit-users at lists.sourceforge.net"> jedit-users
- mailing list</ulink>. All developers are members. If you are
- interested in working on jEdit or writing a plugin for it,
- use the <ulink
- url="mailto:jedit-users at lists.sourceforge.net"> jedit-devel
- list</ulink>. Email addresses for individual developers can
- be found on the <ulink
- url="http://sourceforge.net/project/memberlist.php?group_id=588">
- SourceForge web site</ulink>.</para>
- </answer>
- </qandaentry>
- </qandadiv>
- <qandadiv id="latest-version">
- <title>Getting the latest version</title>
- <qandaentry>
- <question id="get-latest-version">
- <para>How do I obtain the latest version of jEdit?</para>
- </question>
- <answer>
- <para>The program is in a continuing state of evolution. It
- is usually available in two versions, a
- <quote>stable</quote> version and a
- <quote>development</quote> version. A stable version
- represents a release of jEdit that is considered to be free
- of serious bugs or performance problems and suitable for
- general use. A <quote>development</quote> version includes
- new features or new elements of program design that require
- testing and possible further refinement. A development
- version contains the token <quote>pre</quote> in its version
- number, as in <literal>4.3pre5</literal>.</para>
- <para>The latest stable and development versions of jEdit
- are always available from the <ulink
- url="http://www.jedit.org">jEdit web site</ulink> and from
- the <ulink
- url="http://sourceforge.net/ projects/jedit">jEdit
- project page</ulink> of the <ulink
- url="http://sourceforge.net">SourceForge web site</ulink>,
- which hosts jEdit's development resources.</para>
- <para>In addition, a plugin named <application>Check jEdit
- Version</application> can be run from within jEdit by
- selecting <guimenuitem>Check jEdit Version</guimenuitem>
- from the application's <guimenu>Plugins</guimenu> menu. It
- queries the jEdit web site, compares version information
- with the version of the currently running instance of jEdit,
- and reports the result to the user in a message box. It will
- tell you if you do not have the latest version of jEdit,
- regardless of whether that version is in
- <quote>stable</quote> or <quote>development</quote>
- form.</para>
- <para>Finally, if you subscribe to the <ulink
- url="http://lists.sourceforge.net/lists/listinfo/jedit-announce">
- jedit-announce</ulink> or <ulink
- url="http://lists.sourceforge.net/lists/listinfo/jedit-users">
- jedit-users</ulink> mailing lists, you will receive an email
- whenever a new release of jEdit becomes available.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="get-source">
- <para>How do I obtain a copy of the jEdit source
- code?</para>
- </question>
- <answer>
- <para>The latest version of jEdit's source code is available
- from the <ulink
- url="http://www.jedit.org/index.php?page=download&platform=source">
- jEdit web site</ulink> or the <ulink
- url="http://sourceforge.net/project/showfiles.php?group_id=588">
- SourceForge web site</ulink>. The web site provides the
- source code for the latest stable and development version,
- while the SourceForge site has a more extensive archive
- covering earlier versions.</para>
- <para>If you are interested in testing the absolutely latest
- changes to jEdit, and you are familiar with compiling your
- own Java programs and working with Subversion, you can
- download the current code maintained in the <ulink
- url="http://jedit.svn.sourceforge.net/viewvc/jedit/">SourceForge
- SVN repository</ulink>.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="get-latest-faq">
- <para>Where can I get the latest version of this
- document?</para>
- </question>
- <answer>
- <para>The latest release of this document is available on
- the <ulink url="http://www.jedit.org/FAQ/index.html">jEdit
- web site</ulink>.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="jedit-compile">
- <para>How do you set the classpath and compile the Java
- files in jEdit?</para>
- </question>
- <answer>
- <para>Consult an article on the <ulink
- url="http://community.jedit.org">jEdit Community</ulink> web
- site entitled <quote>Build jEdit yourself: the 'Open' in
- Open Source</quote>.</para>
- </answer>
- </qandaentry>
- </qandadiv>
- </qandaset>
+<?xml version="1.0" encoding="UTF-8"?>
+<sect1 id="general">
+ <title>General Questions</title>
+ <!-- jEdit buffer-local properties: -->
+ <!-- :indentSize=4:noTabs=false:maxLineLen=72:tabSize=4: -->
+ <!-- :xml.root=faq.xml: -->
+ <!-- jEdit FAQ -->
+ <!-- Copyright (C) 2003 John Gellene, Kris Kopicki -->
+ <!-- Copyright (C) 2006 Alan Ezust -->
+ <para>This section deals with some background information, how to obtain the
+ latest version of jEdit and how to obtain further information/help.</para>
+ <qandaset defaultlabel="qanda">
+ <qandadiv id="about">
+ <title>About jEdit</title>
+ <qandaentry>
+ <question id="whatis">
+ <para>What is jEdit?</para>
+ </question>
+ <answer>
+ <para>jEdit is a programmer's text editor written in Java,
+ originally developed by Slava Pestov, now maintained by
+ others. It has an easy to use interface that resembles that
+ of many other Windows and MacOS text editors. It is also
+ highly customizable, and contains a <quote>plugin</quote>
+ architecture that allows its features to be extended by
+ additional programs.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="difftext">
+ <para>What is the difference between a text editor and a
+ word processor?</para>
+ </question>
+ <answer>
+ <para>These categories are not absolute but refer to the
+ primary purpose of an editing program and the focus of its
+ features.</para>
+ <para>A text editor is an application that edits files
+ containing plain text without automatically formatting the
+ text for printing or other publication. Typically the
+ contents of such a file consists of data used by another
+ application - for example, source code that a compiler will
+ process or markup text that a web browser will display. A
+ word processor deals with the preparation of documents for
+ printing or similar publication. Besides editing text, a
+ modern word processor allows the user to choose multiple
+ fonts, margin sizes, line spacing, indentation, and a
+ variety of other details that affect the appearance of the
+ document being edited. In a text editor, these features are
+ present, if at all, only in a basic form, and for the
+ limited purpose of helping the user compose and organize the
+ text. In place of word processing features, a text editor
+ contains many features that allow the user to prepare and
+ work with text quickly and efficiently.</para>
+ <para>The jEdit application is a text editor, not a word
+ processor. It contains a large assortment of features for
+ manipulating source code, markup text, and other text files.
+ As a programmer's text editor, it also has many features to
+ help programmers manage their projects and work with other
+ programming tools.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="features">
+ <para>What features does jEdit have?</para>
+ </question>
+ <answer>
+ <para>The short answer is, too many to list here. There is a
+ detailed list available on the <ulink
+ url="http://www.jedit.org/index.php?page=features">jEdit web
+ site</ulink>, but here are some of the major
+ features:</para>
+ <itemizedlist>
+ <listitem>
+ <para>Comprehensive online help</para>
+ </listitem>
+ <listitem>
+ <para>Multiple editor windows and split editing panes
+ within a single editing window</para>
+ </listitem>
+ <listitem>
+ <para>Unlimited undo/redo</para>
+ </listitem>
+ <listitem>
+ <para>Copy and paste with an unlimited number of
+ clipboards (known as <quote>registers</quote>)</para>
+ </listitem>
+ <listitem>
+ <para><quote>Markers</quote> for remembering
+ positions in files to return to later</para>
+ </listitem>
+ <listitem>
+ <para>Rectangular selection</para>
+ </listitem>
+ <listitem>
+ <para>Multiple selection for manipulating several
+ chunks of text at once</para>
+ </listitem>
+ <listitem>
+ <para>Syntax highlighting for more than 80 file
+ types</para>
+ </listitem>
+ <listitem>
+ <para>Intelligent bracket matching that skips quoted
+ literals and comments</para>
+ </listitem>
+ <listitem>
+ <para>Auto indent and word wrap</para>
+ </listitem>
+ <listitem>
+ <para>Abbreviations</para>
+ </listitem>
+ <listitem>
+ <para><quote>Folding</quote> display mode that hides
+ levels of indented text specified by the user</para>
+ </listitem>
+ <listitem>
+ <para>Search and replace using both literal text and
+ regular expressions</para>
+ </listitem>
+ <listitem>
+ <para><quote>HyperSearch</quote> option to show all
+ found matches in a list</para>
+ </listitem>
+ <listitem>
+ <para>File management functions available from within
+ jEdit, including deleting and renaming files and
+ creating new directories</para>
+ </listitem>
+ <listitem>
+ <para>Choice of character encoding for loading and
+ saving files</para>
+ </listitem>
+ <listitem>
+ <para>Automatic compression and decompression of
+ GZipped (.gz) files</para>
+ </listitem>
+ <listitem>
+ <para>Plugin support for loading files from ZIP and
+ TAR archives</para>
+ </listitem>
+ <listitem>
+ <para>Plugin support for loading and saving files on
+ FTP servers</para>
+ </listitem>
+ <listitem>
+ <para>Fully customizable keyboard shortcuts, tool bar
+ and right-click context menu</para>
+ </listitem>
+ <listitem>
+ <para>Macro system permitting recording and writing
+ of macros in the BeanShell scripting language</para>
+ </listitem>
+ <listitem>
+ <para>An internal <quote>plugin manager</quote> that
+ downloads and installs new and updated plugins from
+ within jEdit</para>
+ </listitem>
+ </itemizedlist>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="what-plugin">
+ <para>What is a jEdit <quote>plugin</quote>?</para>
+ </question>
+ <answer>
+ <para>A plugin is an application that is designed to work
+ with jEdit by providing additional features that can be used
+ from within the main program. Often the plugin will provide
+ a visible user interface in a window that can be docked to
+ jEdit's main view window.</para>
+ <para>There are currently over 120 publicly available
+ plugins that provide such services as a Java source code
+ browser, a command-line shell, templated text insertion, and
+ source code project management. They can be downloaded,
+ installed, and kept current from within jEdit's
+ <quote>Plugin Manager</quote>. There is also a section of
+ the jEdit web site called <ulink
+ url="http://plugins.jedit.org/">Plugin Central</ulink> that
+ maintains a descriptive index and download links for all
+ publicly available plugins.</para>
+ <para>Additional questions and answers regarding plugins may
+ be found in the section of this document entitled
+ <quote>Working with Plugins</quote>.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="get-doc">
+ <para>How do I get documentation on jEdit?</para>
+ </question>
+ <answer>
+ <para>There is a comprehensive User's Guide available from
+ within the program using the <guimenu>Help</guimenu> menu.
+ The User's Guide can also be downloaded from the <ulink
+ url="http://www.jedit.org/index.php?page=download&platform=source">
+ jEdit web site</ulink> in Portable Document Format (PDF),
+ suitable for online display or printing.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="is-newsgroup">
+ <para>Is there a newsgroup or mailing list devoted to
+ jEdit?</para>
+ </question>
+ <answer>
+ <para>Currently there is no newsgroup devoted to jEdit.
+ There are three active mailing lists that are freely
+ available by subscription:</para>
+ <itemizedlist>
+ <listitem>
+ <para>The <ulink
+ url="http://lists.sourceforge.net/lists/listinfo/jedit-users">
+ jedit-users list</ulink>, for comments and questions
+ about using jEdit and its features</para>
+ </listitem>
+ <listitem>
+ <para>The <ulink
+ url="http://lists.sourceforge.net/lists/listinfo/jedit-devel">
+ jedit-devel list</ulink>, for discussion of
+ development issues by members of the developer team
+ and other interested persons</para>
+ </listitem>
+ <listitem>
+ <para>The <ulink
+ url="http://lists.sourceforge.net/lists/listinfo/jedit-announce">
+ jedit-announce list</ulink>, a low-volume list used
+ for announcing new releases of jEdit and
+ plugins</para>
+ </listitem>
+ </itemizedlist>
+ <para>Each of these lists can be obtained on a full-text
+ message or a daily digest basis. The daily digest bundles
+ groups of postings in a single email message.</para>
+ <para>If you are only interested in version announcements
+ and plugin updates, <ulink
+ url="http://lists.sourceforge.net/lists/listinfo/jedit-announce">
+ subscribe to the jedit-announce list</ulink>. If you would
+ like to participate in discussion or ask questions regarding
+ jEdit, <ulink
+ url="http://lists.sourceforge.net/lists/listinfo/jedit-users">subscribe
+ to the jedit-users list</ulink>. If you are interested in
+ jEdit's development or want to write plugins, <ulink
+ url="http://lists.sourceforge.net/lists/listinfo/jedit-devel">
+ subscribe to jedit-devel</ulink>.</para>
+ <para>Do not cross-post to both lists. All jEdit developers
+ are subscribed to both the jedit-users and jedit-devel
+ lists, so a post to jedit-users will be seen by most members
+ of both lists. Also, keep in mind that both jEdit-users and
+ jEdit-devel are high-traffic lists, and can fill up your
+ mailbox unless you check your email regularly.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="is-website">
+ <para>Is there a web site devoted to jEdit?</para>
+ </question>
+ <answer>
+ <para>There are several. The official <ulink
+ url="http://www.jedit.org">jEdit web site</ulink> contains
+ extensive information on all things having to do with jEdit.
+ There are also resources available for those interested in
+ jEdit development on the <ulink
+ url="http://sourceforge.net/projects/jedit">jEdit project
+ page</ulink> of the <ulink
+ url="http://sourceforge.net">SourceForge web
+ site</ulink>.</para>
+ <para>The <ulink url="http://community.jedit.org">jEdit
+ Community</ulink> web site has articles on jEdit and related
+ topics, user-submitted macros and other download resources,
+ and listings of web links of interest to jEdit users. It has
+ a message board system to allow users to ask questions and
+ provide feedback on the project without having to subscribe
+ to jEdit's mailing lists. Because the message boards have
+ relatively low volume, using the mailing lists will often be
+ a more effective approach.</para>
+ <para>The jEdit Community site also has an
+ <quote>Interactive FAQ</quote> facility that allows you to
+ post questions to be answered by other users, and a
+ screenshot gallery containing images submitted by
+ users.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="copyright">
+ <para>Are there copyright restrictions on the use of
+ jEdit?</para>
+ </question>
+ <answer>
+ <para>The jEdit application is free, <quote>Open
+ Source</quote> software released under the <ulink
+ url="http://www.gnu.org/licenses/old-licenses/gpl-2.0.html">
+ GNU General Public License 2.0</ulink>. This ensures that
+ jEdit and its source code remains freely available for use
+ and distribution by the public. For specific copyright
+ questions, you should review the GPL 2.0 and seek
+ appropriate advice. Broadly speaking, there are no
+ restrictions on the use of the program as a text editor, and
+ its source code can be copied or modified for use in another
+ program that is governed by the General Public
+ License.</para>
+ <para>Plugin application that are available using jEdit's
+ Plugin Manager facility, as well as plugins available
+ through the <ulink url="http://plugins.jedit.org">Plugin
+ Central</ulink> web site or <ulink
+ url="http://community.jedit.org">jEdit Community</ulink>,
+ are governed either by the General Public License or another
+ commonly recognized <quote>Open Source</quote> software
+ license. This means that use of the application, including
+ use for commercial purposes, is unrestricted without any
+ requirement of royalty or license fee payments. To
+ incorporate source code or an application or plugin as a
+ whole in another application, you must consult the specific
+ license terms to determine whether and on what basis you are
+ permitted to do so.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="java-only">
+ <para>Is jEdit only useful for programming in Java?</para>
+ </question>
+ <answer>
+ <para>Absolutely not. Many of the jEdit's plugin
+ applications, and a few of the macros distributed with the
+ program, target the Java language or integrate tools used in
+ Java development. However, the core application is designed
+ to work with any programming or markup language. Included
+ with jEdit are packages providing syntax highlighting,
+ abbreviations and other programming support for over 60
+ programming languages and file types, including C, C++, C#,
+ Cobol, HTML, Java, Javascript, Lisp, Pascal, Perl, PHP,
+ Python, Ruby, TCL, Visual Basic and XML. The full list can
+ be found on the <ulink
+ url="http://www.jedit.org/index.php?page=features">jEdit web
+ site</ulink>.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="knowing-java">
+ <para>Do I need to know Java to use jEdit?</para>
+ </question>
+ <answer>
+ <para>No. In fact, you do not need to know any specific
+ programming language other than the ones with which you
+ work.</para>
+ <para>At some point in your use of jEdit, you will no doubt
+ want to write your own macros to execute long or complex
+ routines with a single command or keyboard shortcut. Macros
+ in jEdit are written in a simplified dialect of Java called
+ <ulink url="http://www.beanshell.org"> BeanShell</ulink>.
+ Its syntax will be familiar to users of Java, C++ and other
+ object-oriented languages, and it is not hard to learn even
+ if you have no experience with those languages. The User's
+ Guide provided with jEdit contains an extensive tutorial on
+ writing macros.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="needed-software">
+ <para>What software do I need to install and run
+ jEdit?</para>
+ </question>
+ <answer>
+ <para>Since jEdit runs on a Java platform, at a minimum you
+ will need a Java Runtime Environment (JRE) package. If you
+ are planning to use jEdit to program in Java, you will need
+ a full Java Development Kit (JDK) package. We recommend
+ obtaining a JDK package.</para>
+ <para>The current version of jEdit requires a
+ Java runtime environment having a release version of 1.6 or greater. The <ulink
+ url="http://www.jedit.org/index.php?page=compatibility">jEdit
+ web site</ulink> contains a detailed discussion on the
+ compatibility of various publicly available JDK's for the
+ major operating systems.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="just-learning">
+ <para>I've just started to learn programming. Is jEdit a
+ good choice for my first text editor?</para>
+ </question>
+ <answer>
+ <para>It is an excellent choice. Its basic features are
+ extremely easy to use, and you will find things like
+ abbreviations, keyboard shortcuts and macros to be great
+ time-savers. It has built-in packages called <quote>edit
+ modes</quote> that automatically display keywords, tags, and
+ other program elements in different colors, making it easier
+ to view and organize your code. It works well with many Open
+ Source and proprietary programming tools. Because of its
+ extensive customization features, it can adapt to your
+ preferences and work patterns as you become more
+ experienced. Finally, it's free, so you can buy a lot of
+ programming texts with the money you will save.</para>
+ </answer>
+ </qandaentry>
+ </qandadiv>
+ <!--******************************************************** Answers -->
+ <qandadiv id="get-answers-div">
+ <title>Getting answers</title>
+ <qandaentry>
+ <question id="get-answers">
+ <para>How do I get answers to my questions about
+ jEdit?</para>
+ </question>
+ <answer>
+ <para>You should look for answers in the following
+ places:</para>
+ <itemizedlist>
+ <listitem>
+ <para>The User's Guide available from the
+ application's <guimenu>Help</guimenu> menu.</para>
+ </listitem>
+ <listitem>
+ <para>This FAQ document.</para>
+ </listitem>
+ <listitem>
+ <para>The archives of jEdit's mailing lists. Archives
+ for both the <ulink
+ url="http://www.geocrawler.com/redir-sf.php3?list=jedit-users">
+ jedit-users list</ulink> and the <ulink
+ url="http://www.geocrawler.com/redir-sf.php3?list=jedit-devel">
+ jedit-devel list</ulink> are available.</para>
+ </listitem>
+ </itemizedlist>
+ <para>If you cannot find help using those resources, post
+ your question to the <ulink
+ url="mailto:jedit-users at lists.sourceforge.net"> jedit-users
+ list</ulink>. You will have to <ulink
+ url="http://lists.sourceforge.net/lists/listinfo/jedit-users">
+ subscribe to the mailing list</ulink> in order to post, but
+ it is well worth it, and you can elect to have daily bundles
+ of messages sent to you to keep email traffic down. Many
+ questions are answered on the mailing list within 24 hours.
+ The developers who respond to user questions generally do
+ not send direct replies, so you will need to monitor
+ messages from the mailing list is order to obtain an
+ answer.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="interactive-help">
+ <para>Where can I get interactive help for jEdit?</para>
+ </question>
+ <answer>
+ <para>There is an IRC channel, <filename>#jedit</filename>,
+ available on the irc.freenode.net server that is dedicated
+ to jEdit support and discussion among developers. You can
+ reach it using any IRC client (including Chatzilla), as well
+ as the IRC plugin for jEdit.</para>
+ <para>There is almost always someone from the developer team
+ signed on the channel. Just say hello and describe your
+ problem.</para>
+ </answer>
+ </qandaentry>
+ </qandadiv>
+ <qandadiv id="bugs">
+ <title>Reporting bugs</title>
+ <qandaentry>
+ <question id="report-bugs">
+ <para>How do I report a bug I have found in jEdit?</para>
+ </question>
+ <answer>
+ <para>To be as helpful as possible to the jEdit developer
+ team and other users, you should use the <ulink
+ url="http://sourceforge.net/tracker/index.php?group_id=588&atid=100588">
+ bug tracker database</ulink> that the jEdit project
+ maintains on the <ulink
+ url="http://sourceforge.net/">SourceForge web site</ulink>.
+ You need to be a SourceForge member to post a bug
+ report.</para>
+ <para>Before posting a bug report, spend a few moments
+ searching the bug database to see if a similar report has
+ already been made. The bug tracker has a search facility
+ that will let search for bug reports using a variety of
+ criteria. If you find a similar bug report, and you have
+ additional information to contribute, post a comment to the
+ report. If you do not find a similar bug report, submit a
+ new report.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="bug-report">
+ <para>What information should I include in a bug
+ report?</para>
+ </question>
+ <answer>
+ <para>The form in the bug tracker report provides several
+ fields for submitting information. If you are unsure about a
+ particular item, leave it at the default setting provided in
+ the form.</para>
+ <para>The more important fields are <quote>Category</quote>,
+ <quote>Summary</quote> and the <quote>Initial
+ comment</quote>. When you write your initial comment
+ describing the bug, you should specify the versions of
+ jEdit, the Java platform and operating system you are using,
+ because bugs often arise that are specific to particular
+ versions. Sometimes the bug arises from the Java runtime
+ environment or even the operating system, and knowing these
+ details helps the developer team design testing and other
+ debugging strategies.</para>
+ <para>One of the macros installed with jEdit is called
+ <guimenuitem>Make Bug Report</guimenuitem>. You will it find
+ under the <guimenuitem>Misc</guimenuitem> category of the
+ <guimenu>Macros </guimenu> menu. This macro extracts
+ information regarding your jEdit installation and a stack
+ trace from the last error recorded by jEdit's Activity Log
+ and places it in a new text buffer. In many cases, the
+ information furnished by the macro is all that is necessary
+ to provide a helpful description of a bug. You can simply
+ cut and paste the output of the macro into the
+ <quote>Initial comment</quote> field of the bug report
+ form.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="bug-track">
+ <para>How do I track the status of a jEdit bug
+ report?</para>
+ </question>
+ <answer>
+ <para>If you know the bug report number, go to this web
+ address:
+ <userinput>http://sourceforge.net/tracker/index.php?func=detail&aid=######&group_id=588&atid=100588</userinput>,
+ where <userinput>######</userinput> is the bug report
+ number. If you don't know the bug report number, you can
+ browse and search the <ulink
+ url="http://sourceforge.net/tracker/index.php?group_id=588&atid=100588">
+ bug database</ulink> to find the problem in which you are
+ interested.</para>
+ </answer>
+ </qandaentry>
+ </qandadiv>
+ <qandadiv id="contact">
+ <title>Contacting jEdit developers</title>
+ <qandaentry>
+ <question id="contact-team">
+ <para>How do I contact members of the jEdit developer
+ team?</para>
+ </question>
+ <answer>
+ <para>If you want to ask a question, make a feature request
+ or offer other general comments, the easiest way is to join
+ and post a message to the <ulink
+ url="mailto:jedit-users at lists.sourceforge.net"> jedit-users
+ mailing list</ulink>. All developers are members. If you are
+ interested in working on jEdit or writing a plugin for it,
+ use the <ulink
+ url="mailto:jedit-users at lists.sourceforge.net"> jedit-devel
+ list</ulink>. Email addresses for individual developers can
+ be found on the <ulink
+ url="http://sourceforge.net/project/memberlist.php?group_id=588">
+ SourceForge web site</ulink>.</para>
+ </answer>
+ </qandaentry>
+ </qandadiv>
+ <qandadiv id="latest-version">
+ <title>Getting the latest version</title>
+ <qandaentry>
+ <question id="get-latest-version">
+ <para>How do I obtain the latest version of jEdit?</para>
+ </question>
+ <answer>
+ <para>The program is in a continuing state of evolution. It
+ is usually available in two versions, a
+ <quote>stable</quote> version and a
+ <quote>development</quote> version. A stable version
+ represents a release of jEdit that is considered to be free
+ of serious bugs or performance problems and suitable for
+ general use. A <quote>development</quote> version includes
+ new features or new elements of program design that require
+ testing and possible further refinement. A development
+ version contains the token <quote>pre</quote> in its version
+ number, as in <literal>4.5pre1</literal>.</para>
+ <para>The latest stable and development versions of jEdit
+ are always available from the <ulink
+ url="http://www.jedit.org">jEdit web site</ulink> and from
+ the <ulink
+ url="http://sourceforge.net/ projects/jedit">jEdit
+ project page</ulink> of the <ulink
+ url="http://sourceforge.net">SourceForge web site</ulink>,
+ which hosts jEdit's development resources.</para>
+ <para>In addition, a plugin named <application>Check jEdit
+ Version</application> can be run from within jEdit by
+ selecting <guimenuitem>Check jEdit Version</guimenuitem>
+ from the application's <guimenu>Plugins</guimenu> menu. It
+ queries the jEdit web site, compares version information
+ with the version of the currently running instance of jEdit,
+ and reports the result to the user in a message box. It will
+ tell you if you do not have the latest version of jEdit,
+ regardless of whether that version is in
+ <quote>stable</quote> or <quote>development</quote>
+ form.</para>
+ <para>Finally, if you subscribe to the <ulink
+ url="http://lists.sourceforge.net/lists/listinfo/jedit-announce">
+ jedit-announce</ulink> or <ulink
+ url="http://lists.sourceforge.net/lists/listinfo/jedit-users">
+ jedit-users</ulink> mailing lists, you will receive an email
+ whenever a new release of jEdit becomes available.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="get-source">
+ <para>How do I obtain a copy of the jEdit source
+ code?</para>
+ </question>
+ <answer>
+ <para>The latest version of jEdit's source code is available
+ from the <ulink
+ url="http://www.jedit.org/index.php?page=download&platform=source">
+ jEdit web site</ulink> or the <ulink
+ url="http://sourceforge.net/project/showfiles.php?group_id=588">
+ SourceForge web site</ulink>. The web site provides the
+ source code for the latest stable and development version,
+ while the SourceForge site has a more extensive archive
+ covering earlier versions.</para>
+ <para>If you are interested in testing the absolutely latest
+ changes to jEdit, and you are familiar with compiling your
+ own Java programs and working with Subversion, you can
+ download the current code maintained in the <ulink
+ url="http://jedit.svn.sourceforge.net/viewvc/jedit/">SourceForge
+ SVN repository</ulink>.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="get-latest-faq">
+ <para>Where can I get the latest version of this
+ document?</para>
+ </question>
+ <answer>
+ <para>The latest release of this document is available on
+ the <ulink url="http://www.jedit.org/FAQ/index.html">jEdit
+ web site</ulink>.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="jedit-compile">
+ <para>How do you set the classpath and compile the Java
+ files in jEdit?</para>
+ </question>
+ <answer>
+ <para>Consult an article on the <ulink
+ url="http://community.jedit.org">jEdit Community</ulink> web
+ site entitled <quote>Build jEdit yourself: the 'Open' in
+ Open Source</quote>.</para>
+ </answer>
+ </qandaentry>
+ </qandadiv>
+ </qandaset>
</sect1>
\ No newline at end of file
diff --git a/jEdit/doc/FAQ/faq-install.xml b/jEdit/doc/FAQ/faq-install.xml
index 18f2eef..0b1b15a 100644
--- a/jEdit/doc/FAQ/faq-install.xml
+++ b/jEdit/doc/FAQ/faq-install.xml
@@ -1,281 +1,279 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<sect1 id="installation">
- <title>Installation Questions</title>
-
- <!-- jEdit buffer-local properties: -->
-
- <!-- :indentSize=4:noTabs=false:maxLineLen=72:tabSize=4: -->
-
- <!-- :xml.root=faq.xml: -->
-
- <!-- jEdit FAQ -->
-
- <!-- Copyright (C) 2003 John Gellene, Kris Kopicki -->
-
- <para>This section deals with installing jEdit using the Java-based
- installation program, as well as installation issues that are specific to
- particular operating systems.</para>
-
- <qandaset defaultlabel="qanda">
- <qandadiv id="install-general">
- <title>General installation questions</title>
-
- <qandaentry>
- <question id="easy-howto-install">
- <para>What is the easiest way to install jEdit?</para>
- </question>
-
- <answer>
- <para>First, make sure you have a working installation of
- the Java platform. To run jEdit, you will a platform package
- having a version number of at least 1.5.0_06. If you do not
- have the Java platform, we recommend downloading the larger
- <quote>Software Development Kit</quote> (SDK), instead of
- the smaller <quote>Java Runtime Environment</quote> (JRE),
- because you will need the tools supplied with the SDK if you
- will be using Java for development. You will need to know
- the path of the Java application launcher, which is called
- <filename>java.exe</filename> on Windows systems and simply
- <filename>java</filename> on others.</para>
-
- <para>Next, decide whether you want the current stable
- version or the latest development version. As a general
- rule, the stable version is a good choice for first-time
- users. However, jEdit 4.3pre7 has been in development for a
- couple of years now, and it is definitely "stable" enough
- for beginners. Download the Java installer for the version
- you have chosen from the jEdit web site; it consists of a
- single file with a name in the style
- <filename>jeditXXXinstall.jar</filename>. This file is a
- compressed archive containing all of the files you need for
- jEdit to run as well as an installer application written in
- Java. You can put this file anywhere on your hard disk that
- is convenient.</para>
-
- <para>To run the installer, do whatever you normally do to
- run a Java jar archive. If this is your first time, follow
- these steps:</para>
-
- <procedure>
- <step>
- <para>Open a terminal or command interpreter
- window.</para>
- </step>
-
- <step>
- <para>Change the current directory to the directory
- in which you have stored the jEdit installer
- file.</para>
- </step>
-
- <step>
- <para>Run this command: <userinput>[full path to java
- application launcher] -jar
- jeditXXXinstall.jar</userinput></para>
- </step>
- </procedure>
-
- <para>The installer will load and display a series of
- dialogs for selecting a few simple options, including the
- directory in which you wish jEdit installed. It will also
- tell you how much disk space you need for the main program
- and various installation options.</para>
-
- <para>If this is your first download of jEdit, you should
- definitely install the set of macros that come with the
- application. Many of them are useful for all programmers,
- and even the ones you don't use can serve as models when you
- eventually begin writing your own macros.</para>
-
- <para>The installation process is very short. If you are
- installing the program on Windows and you select the
- jEditLauncher option, you should be able to start jEdit by
- clicking on any of the icons that the installation program
- provides. On other systems, you can enter
- <userinput>jedit</userinput> in a terminal window or create
- your own desktop or menu shortcut.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="java-web-start">
- <para>Why is there no Java Web Start version of
- jEdit?</para>
- </question>
-
- <answer>
- <para>In Java Web Start, dynamically-loaded classes (ie,
- plugins) run in a sandbox unless they are explicitly signed.
- Also, the protocol handler API prevents protocol handlers
- from being added if they are not loaded via the system class
- loader (i.e via the Java Web Start class loader). So the
- lack of plugin support and jeditresource protocol makes it
- useless.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="install-upgrade">
- <para>How do I upgrade from one release of jEdit to
- another?</para>
- </question>
-
- <answer>
- <para>Simply delete the existing jEdit directory and run the
- installer (if any) to install the new version. Settings are
- kept in <filename>~/.jedit</filename>, and will not be
- affected.</para>
- </answer>
- </qandaentry>
- </qandadiv>
-
- <qandadiv id="install-mac">
- <title>Installing jEdit on MacOS</title>
-
- <qandaentry>
- <question id="install.mac9-basic">
- <para>How do I install jEdit on MacOS 8 or MacOS 9? s</para>
- </question>
-
- <answer>
- <para>The latest version of jEdit, version 4.3, requires
- MacOS X (preferably 10.4 or later), because the Java
- platforms of earlier MacOS version out outdated.</para>
-
- <para>Once you have completed installing jEdit locate the
- jedit.jar file and do the following:</para>
-
- <procedure>
- <step>
- <para>Drag the <filename>jedit.jar</filename> to
- JBinary and JBinary will launch.</para>
- </step>
-
- <step>
- <para>In the Command window in the Class path box
- replace <userinput>jedit</userinput> with
- <userinput>org.gjt.sp.jedit.jEdit</userinput>.</para>
- </step>
-
- <step>
- <para>Then click the Save settings button. It will
- ask for an application name and will create a
- double-clickable icon on your desktop.</para>
- </step>
-
- <step>
- <para>Double-click on your icon to launch
- jEdit.</para>
- </step>
- </procedure>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>How do I uninstall jEdit for Mac OS?</para>
- </question>
-
- <answer>
- <para>There are no system files, so simply drop the jEdit
- folder in the trash. If you want to remove the settings
- directory used by jEdit you will find it at
- <filename>~/.jedit</filename>. It is hidden, so you will
- need to remove it from the command line, or use one of the
- various uilities available that will let you see it.</para>
- </answer>
- </qandaentry>
- </qandadiv>
-
- <qandadiv id="install-windows">
- <title>Installing jEdit on Windows</title>
-
- <qandaentry>
- <question id="install-windows-basic">
- <para>Is there anything different about installing jEdit on
- Windows?</para>
- </question>
-
- <answer>
- <para>For the Microsoft Windows family of operating systems,
- jEdit provides an additional package of features called
- jEditLauncher. These features include: <itemizedlist>
- <listitem>
- <para>Built-in shortcut icons for launching
- jEdit;</para>
- </listitem>
-
- <listitem>
- <para>Support for opening files in jEdit using custom
- entries in the context (right-click) menu of the
- Windows shell;</para>
- </listitem>
-
- <listitem>
- <para>Support for running BeanShell scripts in jEdit
- from outside the application;</para>
- </listitem>
-
- <listitem>
- <para>Support for launching jEdit and loading files
- using scripting languages such as VBScript, Perl and
- Python;</para>
- </listitem>
-
- <listitem>
- <para>Automatic uninstallation of jEdit using the
- <quote>Add/Remove Programs</quote> applet in Control
- Panel.</para>
- </listitem>
- </itemizedlist> The package is a recommended option that
- is selected by default when you install jEdit. The Java
- installer application launches a separate Windows installer
- module for the native Windows executables that comprise the
- jEditLauncher package. If the installation involves an
- upgrade, you may be asked to reboot your computer to
- complete the process.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="install-windows-components">
- <para>Do I need any special Windows components to run
- jEditLauncher?</para>
- </question>
-
- <answer>
- <para>Regardless of the version of Windows that you use, if
- you have kept it reasonably up-to-date with service packs or
- component upgrades from Microsoft, you should have no
- trouble running jEditLauncher. Users of Windows 98, Windows
- ME, Windows NT (version 4.0), Windows 2000 and Windows XP
- have not reported problems involving missing
- components.</para>
-
- <para>Some users of older versions of Windows 95 may need to
- upgrade their version of the Windows Sockets package. Others
- may be missing Microsoft's package for supporting DCOM
- (Distributed Component Object Model) components on Windows
- 95. Both the <ulink
- url="http://www.microsoft.com/windows95/downloads/contents/wuadmintools/s_wunetworkingtools/w95sockets2/">
- Windows Sockets upgrade</ulink> and the <ulink
- url="http://www.microsoft.com/com/dcom/dcom95/dcom1_3.asp">
- DCOM package</ulink> are available for download from
- Microsoft.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="install-windows-vm">
- <para>Can I run jEdit on Microsoft's virtual machine?</para>
- </question>
-
- <answer>
- <para>The latest version of jEdit, version 4.3, requires at
- least version 1.5 of the Java 2 platform, and therefore may
- not be compatible with 3rd party virtual machines.</para>
- </answer>
- </qandaentry>
- </qandadiv>
- </qandaset>
+<?xml version="1.0" encoding="UTF-8"?>
+<sect1 id="installation">
+ <title>Installation Questions</title>
+
+ <!-- jEdit buffer-local properties: -->
+
+ <!-- :indentSize=4:noTabs=false:maxLineLen=72:tabSize=4: -->
+
+ <!-- :xml.root=faq.xml: -->
+
+ <!-- jEdit FAQ -->
+
+ <!-- Copyright (C) 2003 John Gellene, Kris Kopicki -->
+
+ <para>This section deals with installing jEdit using the Java-based
+ installation program, as well as installation issues that are specific to
+ particular operating systems.</para>
+
+ <qandaset defaultlabel="qanda">
+ <qandadiv id="install-general">
+ <title>General installation questions</title>
+
+ <qandaentry>
+ <question id="easy-howto-install">
+ <para>What is the easiest way to install jEdit?</para>
+ </question>
+
+ <answer>
+ <para>First, make sure you have a working installation of
+ the Java platform. To run jEdit, you will a platform package
+ having a version number of at least 1.6. If you do not
+ have the Java platform, we recommend downloading the larger
+ <quote>Software Development Kit</quote> (SDK), instead of
+ the smaller <quote>Java Runtime Environment</quote> (JRE),
+ because you will need the tools supplied with the SDK if you
+ will be using Java for development. You will need to know
+ the path of the Java application launcher, which is called
+ <filename>java.exe</filename> on Windows systems and simply
+ <filename>java</filename> on others.</para>
+
+ <para>Next, decide whether you want the current "stable"
+ version or the latest development version. As a general
+ rule, the stable version is a good choice for first-time
+ users. Download the Java installer for the version
+ you have chosen from the jEdit web site; it consists of a
+ single file with a name in the style
+ <filename>jeditXXXinstall.jar</filename>. This file is a
+ compressed archive containing all of the files you need for
+ jEdit to run as well as an installer application written in
+ Java. You can put this file anywhere on your hard disk that
+ is convenient.</para>
+
+ <para>To run the installer, do whatever you normally do to
+ run a Java jar archive. If this is your first time, follow
+ these steps:</para>
+
+ <procedure>
+ <step>
+ <para>Open a terminal or command interpreter
+ window.</para>
+ </step>
+
+ <step>
+ <para>Change the current directory to the directory
+ in which you have stored the jEdit installer
+ file.</para>
+ </step>
+
+ <step>
+ <para>Run this command: <userinput>[full path to java
+ application launcher] -jar
+ jeditXXXinstall.jar</userinput></para>
+ </step>
+ </procedure>
+
+ <para>The installer will load and display a series of
+ dialogs for selecting a few simple options, including the
+ directory in which you wish jEdit installed. It will also
+ tell you how much disk space you need for the main program
+ and various installation options.</para>
+
+ <para>If this is your first download of jEdit, you should
+ definitely install the set of macros that come with the
+ application. Many of them are useful for all programmers,
+ and even the ones you don't use can serve as models when you
+ eventually begin writing your own macros.</para>
+
+ <para>The installation process is very short. If you are
+ installing the program on Windows and you select the
+ jEditLauncher option, you should be able to start jEdit by
+ clicking on any of the icons that the installation program
+ provides. On other systems, you can enter
+ <userinput>jedit</userinput> in a terminal window or create
+ your own desktop or menu shortcut.</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="java-web-start">
+ <para>Why is there no Java Web Start version of
+ jEdit?</para>
+ </question>
+
+ <answer>
+ <para>In Java Web Start, dynamically-loaded classes (ie,
+ plugins) run in a sandbox unless they are explicitly signed.
+ Also, the protocol handler API prevents protocol handlers
+ from being added if they are not loaded via the system class
+ loader (i.e via the Java Web Start class loader). So the
+ lack of plugin support and jeditresource protocol makes it
+ useless.</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="install-upgrade">
+ <para>How do I upgrade from one release of jEdit to
+ another?</para>
+ </question>
+
+ <answer>
+ <para>Simply delete the existing jEdit directory and run the
+ installer (if any) to install the new version. Settings are
+ kept in <filename>~/.jedit</filename>, and will not be
+ affected.</para>
+ </answer>
+ </qandaentry>
+ </qandadiv>
+
+ <qandadiv id="install-mac">
+ <title>Installing jEdit on MacOS</title>
+
+ <qandaentry>
+ <question id="install.mac9-basic">
+ <para>How do I install jEdit on MacOS 8 or MacOS 9? s</para>
+ </question>
+
+ <answer>
+ <para>The latest version of jEdit requires
+ MacOS X (preferably 10.5 or later), because the Java
+ platforms of earlier MacOS versions are outdated.</para>
+
+ <para>Once you have completed installing jEdit locate the
+ jedit.jar file and do the following:</para>
+
+ <procedure>
+ <step>
+ <para>Drag the <filename>jedit.jar</filename> to
+ JBinary and JBinary will launch.</para>
+ </step>
+
+ <step>
+ <para>In the Command window in the Class path box
+ replace <userinput>jedit</userinput> with
+ <userinput>org.gjt.sp.jedit.jEdit</userinput>.</para>
+ </step>
+
+ <step>
+ <para>Then click the Save settings button. It will
+ ask for an application name and will create a
+ double-clickable icon on your desktop.</para>
+ </step>
+
+ <step>
+ <para>Double-click on your icon to launch
+ jEdit.</para>
+ </step>
+ </procedure>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question>
+ <para>How do I uninstall jEdit for Mac OS?</para>
+ </question>
+
+ <answer>
+ <para>There are no system files, so simply drop the jEdit
+ folder in the trash. If you want to remove the settings
+ directory used by jEdit you will find it at
+ <filename>~/.jedit</filename>. It is hidden, so you will
+ need to remove it from the command line, or use one of the
+ various uilities available that will let you see it.</para>
+ </answer>
+ </qandaentry>
+ </qandadiv>
+
+ <qandadiv id="install-windows">
+ <title>Installing jEdit on Windows</title>
+
+ <qandaentry>
+ <question id="install-windows-basic">
+ <para>Is there anything different about installing jEdit on
+ Windows?</para>
+ </question>
+
+ <answer>
+ <para>For the Microsoft Windows family of operating systems,
+ jEdit provides an additional package of features called
+ jEditLauncher. These features include: <itemizedlist>
+ <listitem>
+ <para>Built-in shortcut icons for launching
+ jEdit;</para>
+ </listitem>
+
+ <listitem>
+ <para>Support for opening files in jEdit using custom
+ entries in the context (right-click) menu of the
+ Windows shell;</para>
+ </listitem>
+
+ <listitem>
+ <para>Support for running BeanShell scripts in jEdit
+ from outside the application;</para>
+ </listitem>
+
+ <listitem>
+ <para>Support for launching jEdit and loading files
+ using scripting languages such as VBScript, Perl and
+ Python;</para>
+ </listitem>
+
+ <listitem>
+ <para>Automatic uninstallation of jEdit using the
+ <quote>Add/Remove Programs</quote> applet in Control
+ Panel.</para>
+ </listitem>
+ </itemizedlist> The package is a recommended option that
+ is selected by default when you install jEdit. The Java
+ installer application launches a separate Windows installer
+ module for the native Windows executables that comprise the
+ jEditLauncher package. If the installation involves an
+ upgrade, you may be asked to reboot your computer to
+ complete the process.</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="install-windows-components">
+ <para>Do I need any special Windows components to run
+ jEditLauncher?</para>
+ </question>
+
+ <answer>
+ <para>Regardless of the version of Windows that you use, if
+ you have kept it reasonably up-to-date with service packs or
+ component upgrades from Microsoft, you should have no
+ trouble running jEditLauncher. Users of Windows 98, Windows
+ ME, Windows NT (version 4.0), Windows 2000 and Windows XP
+ have not reported problems involving missing
+ components.</para>
+
+ <para>Some users of older versions of Windows 95 may need to
+ upgrade their version of the Windows Sockets package. Others
+ may be missing Microsoft's package for supporting DCOM
+ (Distributed Component Object Model) components on Windows
+ 95. Both the <ulink
+ url="http://www.microsoft.com/windows95/downloads/contents/wuadmintools/s_wunetworkingtools/w95sockets2/">
+ Windows Sockets upgrade</ulink> and the <ulink
+ url="http://www.microsoft.com/com/dcom/dcom95/dcom1_3.asp">
+ DCOM package</ulink> are available for download from
+ Microsoft.</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="install-windows-vm">
+ <para>Can I run jEdit on Microsoft's virtual machine?</para>
+ </question>
+
+ <answer>
+ <para>The latest version of jEdit requires at
+ least version 1.6 of the Java 2 platform, and therefore may
+ not be compatible with 3rd party virtual machines.</para>
+ </answer>
+ </qandaentry>
+ </qandadiv>
+ </qandaset>
</sect1>
\ No newline at end of file
diff --git a/jEdit/doc/FAQ/faq-intro.xml b/jEdit/doc/FAQ/faq-intro.xml
index e726bbd..3823531 100644
--- a/jEdit/doc/FAQ/faq-intro.xml
+++ b/jEdit/doc/FAQ/faq-intro.xml
@@ -1,32 +1,32 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<sect1 id="intro">
- <title>Introduction</title>
-
- <!-- jEdit buffer-local properties: -->
-
- <!-- :indentSize=4:noTabs=false:maxLineLen=72:tabSize=4: -->
-
- <!-- :xml.root=faq.xml: -->
-
- <!-- jEdit FAQ -->
-
- <!-- Copyright (C) 2003 John Gellene, Kris Kopicki -->
-
- <para>This document explains many of the basic features of jEdit and
- provides solutions for commonly encountered problems. It is not the
- principal resource for learning how to use and customize jEdit. The
- application includes an extensive User's Guide available from within jEdit
- by selecting <guimenuitem>jEdit Help</guimenuitem> on the
- <guimenu>Help</guimenu> menu.</para>
-
- <para>The User's Guide includes tutorials on writing macros and plugins as
- well as an annotated guide to jEdit's Application Programming Interface
- (API). It is worth browsing through the User's Guide to get a full sense of
- what jEdit has to offer. This document is intended to supplement the User's
- Guide by focusing on specific, relatively narrow topics in the traditional
- question-and-answer format.</para>
-
- <para>Each section of this document deals with a different category of
- topics, and each begins with a listing of the questions covered. This should
- allow you to find the information you are seeking quickly.</para>
+<?xml version="1.0" encoding="UTF-8"?>
+<sect1 id="intro">
+ <title>Introduction</title>
+
+ <!-- jEdit buffer-local properties: -->
+
+ <!-- :indentSize=4:noTabs=false:maxLineLen=72:tabSize=4: -->
+
+ <!-- :xml.root=faq.xml: -->
+
+ <!-- jEdit FAQ -->
+
+ <!-- Copyright (C) 2003 John Gellene, Kris Kopicki -->
+
+ <para>This document explains many of the basic features of jEdit and
+ provides solutions for commonly encountered problems. It is not the
+ principal resource for learning how to use and customize jEdit. The
+ application includes an extensive User's Guide available from within jEdit
+ by selecting <guimenuitem>jEdit Help</guimenuitem> on the
+ <guimenu>Help</guimenu> menu.</para>
+
+ <para>The User's Guide includes tutorials on writing macros and plugins as
+ well as an annotated guide to jEdit's Application Programming Interface
+ (API). It is worth browsing through the User's Guide to get a full sense of
+ what jEdit has to offer. This document is intended to supplement the User's
+ Guide by focusing on specific, relatively narrow topics in the traditional
+ question-and-answer format.</para>
+
+ <para>Each section of this document deals with a different category of
+ topics, and each begins with a listing of the questions covered. This should
+ allow you to find the information you are seeking quickly.</para>
</sect1>
\ No newline at end of file
diff --git a/jEdit/doc/FAQ/faq-legal.xml b/jEdit/doc/FAQ/faq-legal.xml
index e331e8e..9c2486b 100644
--- a/jEdit/doc/FAQ/faq-legal.xml
+++ b/jEdit/doc/FAQ/faq-legal.xml
@@ -1,25 +1,25 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<appendix id="legal-notice">
- <title>Legal Notice</title>
-
- <!-- jEdit buffer-local properties: -->
-
- <!-- :indentSize=4:noTabs=false:maxLineLen=72:tabSize=4: -->
-
- <!-- :xml.root=faq.xml: -->
-
- <!-- jEdit FAQ -->
-
- <!-- Copyright (C) 2003 John Gellene, Kris Kopicki -->
-
- <!-- Copyright (C) 2006 Alan Ezust -->
-
- <para>Permission is granted to copy, distribute and/or modify this document
- under the terms of the <ulink url="http://www.gnu.org/licenses/fdl.html">
- GNU Free Documentation License</ulink>, Version 1.1 or any later version
- published by the Free Software Foundation; with no <quote>Invariant
- Sections</quote>, <quote>Front-Cover Texts</quote> or <quote>Back-Cover
- Texts</quote>, each as defined in the license. A copy of the license is
- contained in the file <filename>COPYING.DOC.txt</filename> included with
- jEdit.</para>
+<?xml version="1.0" encoding="UTF-8"?>
+<appendix id="legal-notice">
+ <title>Legal Notice</title>
+
+ <!-- jEdit buffer-local properties: -->
+
+ <!-- :indentSize=4:noTabs=false:maxLineLen=72:tabSize=4: -->
+
+ <!-- :xml.root=faq.xml: -->
+
+ <!-- jEdit FAQ -->
+
+ <!-- Copyright (C) 2003 John Gellene, Kris Kopicki -->
+
+ <!-- Copyright (C) 2006 Alan Ezust -->
+
+ <para>Permission is granted to copy, distribute and/or modify this document
+ under the terms of the <ulink url="http://www.gnu.org/licenses/fdl.html">
+ GNU Free Documentation License</ulink>, Version 1.1 or any later version
+ published by the Free Software Foundation; with no <quote>Invariant
+ Sections</quote>, <quote>Front-Cover Texts</quote> or <quote>Back-Cover
+ Texts</quote>, each as defined in the license. A copy of the license is
+ contained in the file <filename>COPYING.DOC.txt</filename> included with
+ jEdit.</para>
</appendix>
\ No newline at end of file
diff --git a/jEdit/doc/FAQ/faq-macros.xml b/jEdit/doc/FAQ/faq-macros.xml
index ce5d47d..9c4548c 100644
--- a/jEdit/doc/FAQ/faq-macros.xml
+++ b/jEdit/doc/FAQ/faq-macros.xml
@@ -1,134 +1,134 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<sect1 id="macros">
- <title>Macros</title>
-
- <!-- jEdit buffer-local properties: -->
-
- <!-- :indentSize=4:noTabs=false:maxLineLen=72:tabSize=4: -->
-
- <!-- :xml.root=faq.xml: -->
-
- <!-- jEdit FAQ -->
-
- <!-- Copyright (C) 2003 John Gellene, Kris Kopicki -->
-
- <para>This section deals with questions on writing and running
- macros.</para>
-
- <qandaset defaultlabel="qanda">
- <qandadiv id="macro-using">
- <title>Using macros</title>
-
- <qandaentry>
- <question id="macro-getting">
- <para>Where can I get macro's from?</para>
- </question>
-
- <answer>
- <para>There is a plugin available called MacroManager that
- will provide a similar interface to jEdit's plugin manager
- for installing new macros. The plugin downloads the macros
- from the jEdit Community site, so an internet connection is
- necessary.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="macro-new-store">
- <para>I just wrote a new macro for myself. Where should I
- save the file?</para>
- </question>
-
- <answer>
- <para>There is a <filename>macros</filename> directory in
- your user settings directory. If you store your macro there
- it will appear in jEdit's <guimenu>Macros</guimenu> menu
- under the name you have given to the macro's source code
- file. The <filename>.bsh</filename> will be deleted in the
- macro entry, and underscore characters will be converted to
- whitespace, so that the file
- <filename>My_New_Macro.bsh</filename> will be displayed as
- <guimenuitem>My New Macro</guimenuitem>.</para>
-
- <para>You can create additional subdirectories in the
- <filename>macros</filename>to organize your personal macros
- by category. Each subdirectory will correspond to a submenu
- under the application's <guimenu>Macros</guimenu> menu. This
- is helpful to reduce the screen space used to display the
- macros menu at any one time.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="macro-new-ext">
- <para>Do I have to use the <filename>.bsh</filename> file
- extension when I save one of my own macro scripts?</para>
- </question>
-
- <answer>
- <para>You need the <filename>.bsh</filename> extension in
- order for jEdit to detect and display the name of the macro
- in its <guimenu>Macros</guimenu> menu. The macro must also
- be in the <filename>macros</filename> directory of either
- the jEdit installation directory or the user settings
- directory.</para>
-
- <para>You do not need the extension to run a macro, however.
- By selecting <guimenu>Macros</guimenu>><guimenuitem>Run
- Other Macro...</guimenuitem>, you can choose any file to be
- run as a macro. While in a macro, you can call
- <userinput>source("full_path")</userinput> to do the same
- thing.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="macro-temp">
- <para>How can I store the result of a macro so that the next
- time I run it the macro can retrieve the value?</para>
- </question>
-
- <answer>
- <para>You can use either
- <userinput>jEdit.setProperty(String, String)</userinput> or
- <userinput>jEdit.setTemporaryProperty(String,
- String)</userinput>. Both methods take
- <classname>String</classname> values for the name of the
- property and its value. If you use
- <userinput>setProperty()</userinput>, the property will
- remain in jEdit's property store permanently, so if you only
- need the value during the course of a single editing
- session, use
- <userinput>setTemporaryProperty()</userinput>.</para>
-
- <para>To ensure that your value can be stored regardless of
- its type, use the following syntax:<programlisting>jEdit.setTemporaryProperty("myValueName", myValue.toString());</programlisting>
- and remember to convert the <quote>myValueName</quote>
- property back to its intended type when you retrieve
- it.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="macro-exec">
- <para>In a macro I'd like to exec an external program (e.g.
- jmk, javac) and capture its output to a buffer. I'd also
- like to see this output as the external program runs or be
- able to interact with the program. So when I exec, what
- happens to System.in/out/err of the exec'd program?</para>
- </question>
-
- <answer>
- <para>Use the <filename>runInSystemShell()</filename> or the
- <filename>runCommandToBuffer()</filename> script methods
- that come bundled with the Console plugin. The help
- documentation for Console provides details on these methods.
- Currently the Console's System shell is not interactive
- during execution of a command, but it does receive and
- display the standard output and error streams of the
- external process.</para>
- </answer>
- </qandaentry>
- </qandadiv>
- </qandaset>
+<?xml version="1.0" encoding="UTF-8"?>
+<sect1 id="macros">
+ <title>Macros</title>
+
+ <!-- jEdit buffer-local properties: -->
+
+ <!-- :indentSize=4:noTabs=false:maxLineLen=72:tabSize=4: -->
+
+ <!-- :xml.root=faq.xml: -->
+
+ <!-- jEdit FAQ -->
+
+ <!-- Copyright (C) 2003 John Gellene, Kris Kopicki -->
+
+ <para>This section deals with questions on writing and running
+ macros.</para>
+
+ <qandaset defaultlabel="qanda">
+ <qandadiv id="macro-using">
+ <title>Using macros</title>
+
+ <qandaentry>
+ <question id="macro-getting">
+ <para>Where can I get macro's from?</para>
+ </question>
+
+ <answer>
+ <para>There is a plugin available called MacroManager that
+ will provide a similar interface to jEdit's plugin manager
+ for installing new macros. The plugin downloads the macros
+ from the jEdit Community site, so an internet connection is
+ necessary.</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="macro-new-store">
+ <para>I just wrote a new macro for myself. Where should I
+ save the file?</para>
+ </question>
+
+ <answer>
+ <para>There is a <filename>macros</filename> directory in
+ your user settings directory. If you store your macro there
+ it will appear in jEdit's <guimenu>Macros</guimenu> menu
+ under the name you have given to the macro's source code
+ file. The <filename>.bsh</filename> will be deleted in the
+ macro entry, and underscore characters will be converted to
+ whitespace, so that the file
+ <filename>My_New_Macro.bsh</filename> will be displayed as
+ <guimenuitem>My New Macro</guimenuitem>.</para>
+
+ <para>You can create additional subdirectories in the
+ <filename>macros</filename>to organize your personal macros
+ by category. Each subdirectory will correspond to a submenu
+ under the application's <guimenu>Macros</guimenu> menu. This
+ is helpful to reduce the screen space used to display the
+ macros menu at any one time.</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="macro-new-ext">
+ <para>Do I have to use the <filename>.bsh</filename> file
+ extension when I save one of my own macro scripts?</para>
+ </question>
+
+ <answer>
+ <para>You need the <filename>.bsh</filename> extension in
+ order for jEdit to detect and display the name of the macro
+ in its <guimenu>Macros</guimenu> menu. The macro must also
+ be in the <filename>macros</filename> directory of either
+ the jEdit installation directory or the user settings
+ directory.</para>
+
+ <para>You do not need the extension to run a macro, however.
+ By selecting <guimenu>Macros</guimenu>><guimenuitem>Run
+ Other Macro...</guimenuitem>, you can choose any file to be
+ run as a macro. While in a macro, you can call
+ <userinput>source("full_path")</userinput> to do the same
+ thing.</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="macro-temp">
+ <para>How can I store the result of a macro so that the next
+ time I run it the macro can retrieve the value?</para>
+ </question>
+
+ <answer>
+ <para>You can use either
+ <userinput>jEdit.setProperty(String, String)</userinput> or
+ <userinput>jEdit.setTemporaryProperty(String,
+ String)</userinput>. Both methods take
+ <classname>String</classname> values for the name of the
+ property and its value. If you use
+ <userinput>setProperty()</userinput>, the property will
+ remain in jEdit's property store permanently, so if you only
+ need the value during the course of a single editing
+ session, use
+ <userinput>setTemporaryProperty()</userinput>.</para>
+
+ <para>To ensure that your value can be stored regardless of
+ its type, use the following syntax:<programlisting>jEdit.setTemporaryProperty("myValueName", myValue.toString());</programlisting>
+ and remember to convert the <quote>myValueName</quote>
+ property back to its intended type when you retrieve
+ it.</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="macro-exec">
+ <para>In a macro I'd like to exec an external program (e.g.
+ jmk, javac) and capture its output to a buffer. I'd also
+ like to see this output as the external program runs or be
+ able to interact with the program. So when I exec, what
+ happens to System.in/out/err of the exec'd program?</para>
+ </question>
+
+ <answer>
+ <para>Use the <filename>runInSystemShell()</filename> or the
+ <filename>runCommandToBuffer()</filename> script methods
+ that come bundled with the Console plugin. The help
+ documentation for Console provides details on these methods.
+ Currently the Console's System shell is not interactive
+ during execution of a command, but it does receive and
+ display the standard output and error streams of the
+ external process.</para>
+ </answer>
+ </qandaentry>
+ </qandadiv>
+ </qandaset>
</sect1>
\ No newline at end of file
diff --git a/jEdit/doc/FAQ/faq-plugins.xml b/jEdit/doc/FAQ/faq-plugins.xml
index 301a180..3f286ce 100644
--- a/jEdit/doc/FAQ/faq-plugins.xml
+++ b/jEdit/doc/FAQ/faq-plugins.xml
@@ -1,171 +1,171 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<sect1 id="plugins">
- <title>Plugin Questions</title>
- <!-- jEdit buffer-local properties: -->
- <!-- :indentSize=4:noTabs=false:maxLineLen=80:tabSize=4: -->
- <!-- :xml.root=faq.xml: -->
- <!-- jEdit FAQ -->
- <!-- Copyright (C) 2003 John Gellene, Kris Kopicki -->
- <para>This section deals with questions concerning the use of jEdit's
- plugins. Plugins are applications that share jEdit's memory space and user
- interface and provide a wide variety of functions and services.</para>
- <qandaset defaultlabel="qanda">
- <qandadiv id="plugin-general">
- <title>General plugin questions</title>
- <qandaentry>
- <question id="plugins-latest-official">
- <para>Where can I get information on the latest available
- <quote>official</quote> plugins?</para>
- </question>
- <answer>
- <para>To get a listing of the latest plugins available for
- downloading from jEdit Plugin Central, use the
- <guimenuitem>Plugin Manager</guimenuitem> feature on jEdit's
- <guimenu>Plugin</guimenu> menu. You can also get more
- detailed descriptions of the plugins from the <ulink
- url="http://plugins.jedit.org">Plugin Central</ulink> web
- site.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="plugins-latest-beta">
- <para>Where can I get information on new plugins under
- development?</para>
- </question>
- <answer>
- <para>We encourage plugin developers to join the
- <email>jedit-devel at lists.sourceforge.net</email> mailing
- list. There, you will find the greatest concentration of
- people who are also familiar with the core and its
- plugins.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="plugin-install-manual">
- <para>How do I install a plugin manually, without using the
- Plugin Manager?</para>
- </question>
- <answer>
- <para>Copy the plugin's jar archive file (or files, if there
- are more than one) to the <filename>/jars</filename>
- subdirectory of either (a) the directory in which jEdit is
- installed, or (b) your user settings directory (which you
- can find by evaluating the BeanShell expression
- <userinput>jEdit.getSettingsDirectory()</userinput>.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="plugins-developing">
- <para>How do I write a plugin?</para>
- </question>
- <answer>
- <para>Writing a plugin requires a working knowledge of Java
- and some familiarity with jEdit's Plugin API. There is a
- tutorial on plugin development in the jEdit User's Guide.
- The source code distribution for jEdit also includes the
- source for an example plugin, <application>Quick
- Notepad</application>, which is discussed in the
- tutorial.</para>
- <para>To learn more about plugin development, take a look at
- the source code for other plugins, particularly those whose
- features or user interface you might use as a model. The
- <ulink url="mailto:jedit-devel at lists.sourceforge.net">jedit-devel mailing
- list</ulink> and the message boards at <ulink
- url="http://community.jedit.org">jEdit Community</ulink> are
- also available for specific questions.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="plugin-irc">
- <para>Is there an IRC (Internet Relay Chat) plugin for
- jEdit?</para>
- </question>
- <answer>
- <para>Yes. Open the Plugin Manager, then select
- <guimenuitem>Install plugins</guimenuitem>. You will find
- the IRC plugin which you can select for installation.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="plugin-console-execute">
- <para>Is it possible to execute my application from within
- jEdit?</para>
- </question>
- <answer>
- <para>Yes. You can use the System shell of the Console
- plugin to run your application.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="plugin-cvs">
- <para>Can I work with cvs/svn/Perforce/cogito/mercurial
- under jEdit? Is there a plugin for my favorite SCCS system?
- How can I send a command from jEdit to cvs/svn without
- leaving my editor?</para>
- </question>
- <answer>
- <para>The SVNPlugin supports Subversion browsing, diffing
- (via JDiff) and other common operations.</para>
- <para>With *NIX (or cygwin), the Console plugin
- documentation has some ideas on how to use jEdit as the
- <literal>VISUAL</literal> editor when called from the
- cvs/svn/hg command-line tools, all of which can be run from
- the Console dockable.</para>
- <para>The ProjectViewer plugin has some support for reading
- the "entries" file for each directory, to decide which files
- to import. CVS/SVN are built-in.</para>
- <para>The P4Plugin adds Perforce support to ProjectViewer,
- and has some other advanced features for working with
- Perforce repositories.</para>
- <para>You can use jEdit as your default editor from WinCVS:
- specify <userinput>jedit.exe</userinput> as your default
- viewer and editor to automate the opening of file.</para>
- <para>GruntSpud and jEditCvs are not maintained, but do
- offer CVS support on jEdit 4.2final.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="plugin-debugger">
- <para>Is there a debugger plugin?</para>
- </question>
- <answer>
- <para>A plugin based on the version 1.4 of the JSwat
- debugger application is currently available for download
- using jEdit's Plugin Manager feature. The JDebugger plugin
- is also available. JPyDebugger offers debugging for Python.
- The GdbPlugin provides gdb/mi support for C/C++
- programs. Also, the Console BeanShell can be used to debug Java classes in the current running JVM. See <xref linkend="plugin-debugging" /> for more info. </para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="plugins-xslt">
- <para>Any development on integrating an XSL parser? It would
- be great to have the possibility to do XSL + XSLT ->
- XHTML development in the same environment as other
- development.</para>
- </question>
- <answer>
- <para>There is currently one plugin available called XSLT.
- The XSLT plugin provides features for: transforming XML
- using XSL transformation stylesheets; evaluating XPath
- expressions on XML and displaying results; and indenting
- XML.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="plugins-ssh">
- <para>Is there a plugin to enable editing of remote files
- over FTP or SSH?</para>
- </question>
- <answer>
- <para>The FTP plugin allows remote editing of files over the
- <literal>SFTP://</literal> and <literal>FTP://</literal>
- protocols. <literal>HTTP://</literal> is supported natively
- in jEdit. The <literal>FTPS://</literal> and
- <literal>FISH://</literal> protocols are not supported
- yet.</para>
- </answer>
- </qandaentry>
- </qandadiv>
- </qandaset>
+<?xml version="1.0" encoding="UTF-8"?>
+<sect1 id="plugins">
+ <title>Plugin Questions</title>
+ <!-- jEdit buffer-local properties: -->
+ <!-- :indentSize=4:noTabs=false:maxLineLen=80:tabSize=4: -->
+ <!-- :xml.root=faq.xml: -->
+ <!-- jEdit FAQ -->
+ <!-- Copyright (C) 2003 John Gellene, Kris Kopicki -->
+ <para>This section deals with questions concerning the use of jEdit's
+ plugins. Plugins are applications that share jEdit's memory space and user
+ interface and provide a wide variety of functions and services.</para>
+ <qandaset defaultlabel="qanda">
+ <qandadiv id="plugin-general">
+ <title>General plugin questions</title>
+ <qandaentry>
+ <question id="plugins-latest-official">
+ <para>Where can I get information on the latest available
+ <quote>official</quote> plugins?</para>
+ </question>
+ <answer>
+ <para>To get a listing of the latest plugins available for
+ downloading from jEdit Plugin Central, use the
+ <guimenuitem>Plugin Manager</guimenuitem> feature on jEdit's
+ <guimenu>Plugin</guimenu> menu. You can also get more
+ detailed descriptions of the plugins from the <ulink
+ url="http://plugins.jedit.org">Plugin Central</ulink> web
+ site.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="plugins-latest-beta">
+ <para>Where can I get information on new plugins under
+ development?</para>
+ </question>
+ <answer>
+ <para>We encourage plugin developers to join the
+ <email>jedit-devel at lists.sourceforge.net</email> mailing
+ list. There, you will find the greatest concentration of
+ people who are also familiar with the core and its
+ plugins.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="plugin-install-manual">
+ <para>How do I install a plugin manually, without using the
+ Plugin Manager?</para>
+ </question>
+ <answer>
+ <para>Copy the plugin's jar archive file (or files, if there
+ are more than one) to the <filename>/jars</filename>
+ subdirectory of either (a) the directory in which jEdit is
+ installed, or (b) your user settings directory (which you
+ can find by evaluating the BeanShell expression
+ <userinput>jEdit.getSettingsDirectory()</userinput>.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="plugins-developing">
+ <para>How do I write a plugin?</para>
+ </question>
+ <answer>
+ <para>Writing a plugin requires a working knowledge of Java
+ and some familiarity with jEdit's Plugin API. There is a
+ tutorial on plugin development in the jEdit User's Guide.
+ The source code distribution for jEdit also includes the
+ source for an example plugin, <application>Quick
+ Notepad</application>, which is discussed in the
+ tutorial.</para>
+ <para>To learn more about plugin development, take a look at
+ the source code for other plugins, particularly those whose
+ features or user interface you might use as a model. The
+ <ulink url="mailto:jedit-devel at lists.sourceforge.net">jedit-devel mailing
+ list</ulink> and the message boards at <ulink
+ url="http://community.jedit.org">jEdit Community</ulink> are
+ also available for specific questions.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="plugin-irc">
+ <para>Is there an IRC (Internet Relay Chat) plugin for
+ jEdit?</para>
+ </question>
+ <answer>
+ <para>Yes. Open the Plugin Manager, then select
+ <guimenuitem>Install plugins</guimenuitem>. You will find
+ the IRC plugin which you can select for installation.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="plugin-console-execute">
+ <para>Is it possible to execute my application from within
+ jEdit?</para>
+ </question>
+ <answer>
+ <para>Yes. You can use the System shell of the Console
+ plugin to run your application.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="plugin-cvs">
+ <para>Can I work with cvs/svn/Perforce/cogito/mercurial
+ under jEdit? Is there a plugin for my favorite SCCS system?
+ How can I send a command from jEdit to cvs/svn without
+ leaving my editor?</para>
+ </question>
+ <answer>
+ <para>The SVNPlugin supports Subversion browsing, diffing
+ (via JDiff) and other common operations.</para>
+ <para>With *NIX (or cygwin), the Console plugin
+ documentation has some ideas on how to use jEdit as the
+ <literal>VISUAL</literal> editor when called from the
+ cvs/svn/hg command-line tools, all of which can be run from
+ the Console dockable.</para>
+ <para>The ProjectViewer plugin has some support for reading
+ the "entries" file for each directory, to decide which files
+ to import. CVS/SVN are built-in.</para>
+ <para>The P4Plugin adds Perforce support to ProjectViewer,
+ and has some other advanced features for working with
+ Perforce repositories.</para>
+ <para>You can use jEdit as your default editor from WinCVS:
+ specify <userinput>jedit.exe</userinput> as your default
+ viewer and editor to automate the opening of file.</para>
+ <para>GruntSpud and jEditCvs are not maintained, but do
+ offer CVS support on jEdit 4.2final.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="plugin-debugger">
+ <para>Is there a debugger plugin?</para>
+ </question>
+ <answer>
+ <para>A plugin based on the version 1.4 of the JSwat
+ debugger application is currently available for download
+ using jEdit's Plugin Manager feature. The JavaDebugger plugin
+ is also available (for jEdit 4.2 only). JPyDebugger offers debugging for Python.
+ The GdbPlugin provides gdb/mi support for C/C++
+ programs. Also, the Console BeanShell can be used to debug Java classes in the current running JVM.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="plugins-xslt">
+ <para>Any development on integrating an XSL parser? It would
+ be great to have the possibility to do XSL + XSLT ->
+ XHTML development in the same environment as other
+ development.</para>
+ </question>
+ <answer>
+ <para>There is currently one plugin available called XSLT.
+ The XSLT plugin provides features for: transforming XML
+ using XSL transformation stylesheets; evaluating XPath
+ expressions on XML and displaying results; and indenting
+ XML.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="plugins-ssh">
+ <para>Is there a plugin to enable editing of remote files
+ over FTP or SSH?</para>
+ </question>
+ <answer>
+ <para>The FTP plugin allows remote editing of files over the
+ <literal>SFTP://</literal> and <literal>FTP://</literal>
+ protocols. <literal>HTTP://</literal> is supported natively
+ in jEdit. The <literal>FTPS://</literal> and
+ <literal>FISH://</literal> protocols are not supported
+ yet.</para>
+ </answer>
+ </qandaentry>
+ </qandadiv>
+ </qandaset>
</sect1>
\ No newline at end of file
diff --git a/jEdit/doc/FAQ/faq-problems.xml b/jEdit/doc/FAQ/faq-problems.xml
index 2b49f1a..e7a1a52 100644
--- a/jEdit/doc/FAQ/faq-problems.xml
+++ b/jEdit/doc/FAQ/faq-problems.xml
@@ -1,421 +1,421 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<sect1 id="problems">
- <title>Problems</title>
- <!-- jEdit buffer-local properties: -->
- <!-- :indentSize=4:noTabs=false:maxLineLen=80:tabSize=4: -->
- <!-- :xml.root=faq.xml: -->
- <!-- jEdit FAQ -->
- <!-- Copyright (C) 2003 John Gellene, Kris Kopicki -->
- <para>This section deals with problems you may experience while using or
- installing jEdit. Problems that aren't OS specific are listed under <link
- linkend="general-problems"><quote>General Problems</quote></link>.</para>
- <qandaset defaultlabel="qanda">
- <qandadiv id="general-problems">
- <title>General Problems</title>
- <qandaentry>
- <question id="wont-start">
- <para>jEdit won't start. What should I do?</para>
- </question>
- <answer>
- <para>If you don't have a clue as to why you cannot run
- jEdit, it's best to perform a step-by-step diagnosis. If it
- never worked before, begin by finding the Java application
- loader you are using: <filename>java.exe</filename>,
- <filename>javaw.exe</filename> or <filename>java</filename>.
- Make sure it is running by entering its full path with the
- <userinput>-h</userinput> parameter in a terminal or console
- window. If you can't find the Java application loader, your
- Java runtime environment package may be missing or
- incomplete.</para>
- <para>Next, find where you have installed jEdit. You should
- look for the file <filename>jedit.jar</filename> which
- contains all of the application's Java class files in a
- compressed archive.</para>
- <para>Once you have both files, run the Java loader with the
- <userinput>-jar</userinput> option and with
- <filename>jedit.jar</filename> as the target. Make sure that
- you either specify full paths for both files or that the
- directories for the files are part of your
- <filename>PATH</filename> environment variable. If jEdit
- does not load at this point, the likely problem is a corrupt
- <filename>jedit.jar</filename> file. Try downloading the
- application again.</para>
- <para>If jEdit does load using this procedure, you need to
- examine the <quote>shortcut</quote> loading mechanism you
- wish to use.</para>
- <para>On Linux and MacOS X, you need to find and examine the
- <filename>jedit</filename> shell script provided by the
- installation routine to confirm that the script's commands
- target the correct files and locations, and that variables
- like <filename>JAVA_HOME</filename> are either defined in
- the script or elsewhere in your shell's environment. Don't
- forget to make sure that the script's file permissions allow
- you to execute it as a shell script.</para>
- <para>On Windows, if you are using a batch script to run
- jEdit, the same points (other than file permissions) apply
- to examining <filename>jedit.bat</filename>. If you are
- using jEditLauncher, run <userinput>jedit /p</userinput> in
- jEdit's installation directory from a command line to get
- the custom loader's setup dialog. Here you can check the
- paths for both the Java application loader and jEdit as well
- as any command line parameters for both programs. Make sure
- that you have placed Java and jEdit options in the correct
- input fields. If the parameters seems correct but jEdit will
- not load with the Windows launcher, try uninstalling and
- reinstalling the launcher by running <userinput>jedit
- /u</userinput> followed by <userinput>jedit
- /i</userinput>.</para>
- <bridgehead>But it worked before! It just stopped working
- after an upgrade. What should I do?</bridgehead>
- <para>If it used to work for an older version and no longer
- works, it could be that you have some old crud in your jEdit
- settings directory (<literal>$HOME/.jedit</literal>). You
- may want to try renaming the offending file/subdirectory to
- something else, and restarting jEdit with fresh settings.
- You can later copy the old settings back into the previous
- location if you find you are missing things. Many files in
- your settings directory directory are (or should be)
- human-readable/editable, so you are encouraged to examine
- them and see what is there. You can wipe out
- <literal>.jedit/jars-cache</literal> while jEdit is not
- actually running, and it will be rebuilt next time you start
- it.</para>
- <para>If at this point you're still stuck, ask for help on
- the jedit-users mailing list, the jEdit Community
- <quote>Installation</quote> message board or on IRC. You're
- bound to find someone quickly.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="start-missing-plugins">
- <para>After jEdit starts, I can't see all of the plugins I
- have downloaded. How can I make them appear?</para>
- </question>
- <answer>
- <para>If you use jEdit's Plugin Manager to download and
- install plugins, your plugins will be found in the
- <filename>jars</filename> subdirectory of one of two
- directories: either the directory in which jEdit is
- installed, or the current user's settings directory. These
- are the only location jEdit examines when it loads plugins
- at startup.</para>
- <para>The default location of the settings directory depends
- on your operating system. You can find out its location
- during a jEdit session by evaluating
- <userinput>jedit.getSettingsDirectory()</userinput> in
- BeanShell.</para>
- <para>The settings directory can be changed by using the
- <userinput>-settings</userinput> command line parameter. If
- you change the location of the settings directory with this
- parameter, jEdit will not be able to find plugin archive
- files in the old location. If you use or change the
- <userinput>-settings</userinput> parameter, make sure your
- plugins don't get left behind.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="problems-out-of-memory">
- <para>During an editing session I get an error message about
- an <quote>OutOfMemoryError</quote> while working with a
- large file or performing a lengthy operation. The message
- reappears every time I retry the operation. How can I
- prevent this?</para>
- </question>
- <answer>
- <para>One solution that often works is to set or increase
- the allocation of memory to the heap for Java objects
- created by the Java Virtual Machine in which jEdit is
- running. Add the command line option
- <userinput>-mxXXm</userinput> to the options passed to the
- version of the Java application loader you are using (such
- as <filename>java</filename>, <filename>java.exe</filename>
- or <filename>javaw.exe</filename>). In place of the
- <userinput>XX</userinput> in the option, use a multiple of
- 16 between 32 and 256. If you already are using the option,
- increase the numeric portion of the
- <userinput>-mxXXm</userinput> parameter in increments of
- 64.</para>
- <para>If you are using the <userinput>-jar</userinput>
- command line option with Java to run jEdit, remember that
- the <userinput>-jar</userinput> parameter must be the last
- Java option, followed immediately by the path to
- <filename>jedit.jar</filename> and then any jEdit command
- line options.</para>
- <para>If out of memory errors occur while running a build or
- compilation operation from within jEdit, you can also have
- the operation run in an external process rather than inside
- the same Java Virtual Machine running jEdit. The AntFarm
- plugin, for example, lets you select this approach as a
- configuration option. In other cases, you can run an
- external program using the command line interface of the
- Console plugin, which will capture and display the output of
- the external process and in many cases parse the output for
- error information.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="textarea-corruption">
- <para>My textarea gets confused about the end of the buffer or in some other way corrupted (the characters are in the wrong place on the screen) every now and then. What
- should I do?</para>
- </question>
- <answer>
- <para>It happens to me sometimes too. I have this macro to work around it for now:
-<programlisting>
-/** Reset_TextArea.bsh */
-view.splitVertically();
-view.unsplitCurrent();
-</programlisting>
- Run this, and jEdit creates
- a new TextArea for you, and that one won't be confused. This
- can help avoid the need to restart jEdit. If you can
- reproduce the steps you took to cause this, please submit a
- bug report that details what plugins/versions you were
- using, and how to reproduce it. It may be specific to a file you are editing, or a particular combination of settings you are using, or sequence of actions you performed. </para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="general-borders">
- <para>Why is jEdit's window movement and resizing so
- buggy?</para>
- </question>
- <answer>
- <para>Perhaps the option to let Java draw window borders is
- enabled. This option can lead to strange behavior on some
- Java versions and operating systems. Disable it in the
- <guilabel>Appearance</guilabel> tab of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="antialiased-text-everywhere">
- <para>How can I get antialiased text everywhere? </para>
- </question>
- <answer>
- <para>For the text area, go to <guimenuitem>Global Options - TextArea - Anti Aliased Smooth Text</guimenuitem>. Note that "Standard" works over Microsoft remote desktop, while "subpixel" does not. <guimenuitem> Fractional Font Metrics</guimenuitem>, a very old option, combined with Subpixel does not seem to do anything good. </para>
- <para>Also, starting <command>java</command> with command line options <literal>"-Dawt.useSystemAAFontSettings=on" "-Dswing.aatext=true"</literal> will give you antialiased text everywhere else. You can add these options to the batch file or shell script line that starts jEdit. </para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="install-no-such-file">
- <para>What should I do when the installer displays the
- message, <screen>No such file or directory</screen>?</para>
- </question>
- <answer>
- <para>The full message that you may receive from the Java
- application launcher begins as follows: <screen>Exception in thread "main" java.util.zip.ZipException: No such file or directory
-...</screen> This means that the Java application launcher cannot read the jar
- archive file that you specified on the command line. If your
- Java runtime environment otherwise runs properly, then
- either you have named the incorrect file name or the
- installation file is corrupt or incomplete. Check the file
- name, download the installer again if necessary, and be sure
- to follow any specific instructions for your operating
- system posted on the <ulink url="http://www.jedit.org">jEdit
- web site</ulink>.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="install-noclassdef">
- <para>After downloading
- <filename>jeditXXXinstall.jar</filename> (the
- <filename>XXX</filename> represents the version number), I
- tried to run <userinput>java
- jeditXXXinstall.jar</userinput>, but got the error message,
- <screen>Exception in main(), NoClassDefFoundError: jeditXXXinstall/jar.</screen>
- What am I doing wrong?</para>
- </question>
- <answer>
- <para>You need to specify the <userinput>-jar</userinput>
- option for the Java application loader so that the loader
- will search the installation archive for the starting class
- file. Without the option, it treats the archive as a single
- class file (which it is not!), thus producing the error. The
- correct command line would be <userinput>java -jar
- jeditXXXinstall.jar</userinput>.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="jedit-crashed">
- <para>jEdit crashed the JVM, what gives?</para>
- </question>
- <answer>
- <para>It's important to realise that java applications
- should never do this. The problem is almost certainly a bug
- in the JVM. Problems of this nature are often tricky to
- solve. Depending on your platform, there should be
- information logged about what caused the crash to occur. For
- Unix type systems you will likely get an error in the
- console (and for Mac OS X you may also get a report in
- ~/Library/Logs/CrashReporter/JavaApplicationStub.crash.log).
- </para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="general-slowstart">
- <para>Why is jEdit so slow to start up?</para>
- </question>
- <answer>
- <para>Some plugins require a lot of setup - chances are if
- you disable one, you will be able to determine the culprit.
- jEdit normally starts up quite quickly without
- plugins.</para>
- <procedure>
- <step>
- <para>To go the <guimenu>Utilities</guimenu> menu and
- select <guimenuitem>Activity
- Log</guimenuitem>.</para>
- </step>
- <step>
- <para>Scroll to the area where you see lines like
- <quote>[notice] JARClassLoader: Starting plugin
- XXX</quote>.</para>
- </step>
- </procedure>
- <para>You should be able to see which (if any) plugins are
- causing an excesively long delay.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="general-slow">
- <para>Why is jEdit so slow?</para>
- </question>
- <answer>
- <para>There may be many causes for this. Java by nature is
- more demanding on hardware than native applications. Modern
- computers should not have much problem with this.</para>
- <para>The most likely cause is plugins that parse buffers or
- do other computationally expensive operations. These include
- XML, JavaSideKick, and CodeAid. If performance is important
- to you, installing a whole batch of plugins in one go is
- probably not a very good idea. Install them one at a time,
- so you can evaluate the effects of each. </para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="general-docking">
- <para>Go to left/top/bottom/right docking area does not work
- for some plugins?</para>
- </question>
- <answer>
- <para>The plugin is missing a
- <methodname>requestDefaultFocus()</methodname> method.
- Plugin updates will be available from time to time, or you
- can email the author of the plugin to let them know of the
- problem.</para>
- </answer>
- </qandaentry>
- </qandadiv>
- <qandadiv id="unix-problems">
- <title>Unix/Linux Problems</title>
- <qandaentry>
- <question id="using-older-jre">
- <para>I'm trying to install jEdit on Linux, but I keep getting strange error messages.
- </para>
-<programlisting>
-Exception in thread "main" java.lang.UnsupportedClassVersionError:
-installer/Install (Unsupported major.minor version 49.0)
-Exception in thread "main" java.awt.AWTError: Cannot load AWT toolkit: gnu.java.awt.peer.gtk.GtkToolkit
-</programlisting>
- </question>
- <answer>
- <para> Make sure the version of Java you are running is Sun Java 1.5 or higher. Default installations of Linux still include a gij compiler which is only 1.4 compliant or not fully Sun compliant.
- Some do not include a java5 jre or even jdk, so you may need to install it manually. In debian/ubuntu,
- <literal> apt-get install sun-java5-jdk </literal>
- </para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="install-jedit-home">
- <para>After installing jEdit on Linux, running the
- <userinput>jedit</userinput> command causes the error
- message: <screen>Warning: JAVA_HOME environment variable not set</screen>
- How can I fix this?</para>
- </question>
- <answer>
- <para>Your <filename>jedit</filename> shell script should be
- modified to set the <userinput>JAVA_HOME</userinput>
- variable to the directory containing the executables of your
- desired Java runtime environment (JRE).</para>
- </answer>
- </qandaentry>
- </qandadiv>
- <!--******************************************************** Windows -->
- <qandadiv id="windows-problems">
- <title>Windows Problems</title>
- <qandaentry>
- <question id="install-windows-errmessage">
- <para>When I try to run <filename>jedit.exe</filename> I get
- the message <screen>The JEditLauncher component does not appear to be installed.</screen></para>
- </question>
- <answer>
- <para>The dialog presenting this message asks if you would
- like to install the launcher. Select
- <userinput>Yes</userinput> and supply further information as
- prompted. A file named <filename>install.log</filename> is
- generated in the same directory as
- <filename>jedit.exe</filename> that contains information on
- the launcher's installation. You can send this file along
- with jEdit's Activity Log if you continue to have problems
- running jEdit with the launcher package.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="install-error-regkey">
- <para>When I try to run the jEdit installation package in
- Windows, I get an error message, <screen>Error opening registration key
- "software\javasoft\java runtime environment".</screen> How can I fix
- this?</para>
- </question>
- <answer>
- <para>The problem is not with jEdit but may be caused by
- your installation of the Java runtime environment. Under
- Windows, Sun's Java application loader relies on entries in
- the Windows registry to find the files that create the
- runtime environment and a Java virtual machine. The loader
- (<filename>java.exe</filename>e or
- <filename>javaw.exe</filename>) is unable to find the
- necessary registration entry and therefore sends the error
- message. The best approach to fixing this is to uninstall
- and reinstall the JDK.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="install-windows-badcommand">
- <para>When trying to install jEdit on Windows Me with an
- MS-DOS prompt, after entering <userinput>java -jar
- jeditXXXinstall.jar</userinput> I get the message
- <userinput>bad command or file name</userinput>. I have
- tried various alternatives but still cannot install.</para>
- </question>
- <answer>
- <para>You should confirm that you have a Java runtime
- environment installed, which will include
- <filename>java.exe</filename> and the version that omits a
- separate terminal window, <filename>javaw.exe</filename>.
- Make sure that the directory containing
- <filename>java.exe</filename> or
- <filename>javaw.exe</filename>is found in the value of your
- <filename>PATH</filename> environment variable. Otherwise
- you should give the full path to the chosen loader on your
- command line.</para>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="general-windows-ddraw">
- <para>When I run jEdit on Windows, it flashes, blinks, and
- doesn't display correctly! Why is your program so
- buggy?</para>
- </question>
- <answer>
- <para>A frequent cause of this problem is buggy video
- drivers and/or a buggy DirectDraw implementation. A
- workaround is to disable Java's use of DirectDraw by adding
- the following option to the Java virtual machine command
- line:</para>
- <programlisting>-Dsun.java2d.noddraw=true</programlisting>
- </answer>
- </qandaentry>
- </qandadiv>
- </qandaset>
+<?xml version="1.0" encoding="UTF-8"?>
+<sect1 id="problems">
+ <title>Problems</title>
+ <!-- jEdit buffer-local properties: -->
+ <!-- :indentSize=4:noTabs=false:maxLineLen=80:tabSize=4: -->
+ <!-- :xml.root=faq.xml: -->
+ <!-- jEdit FAQ -->
+ <!-- Copyright (C) 2003 John Gellene, Kris Kopicki -->
+ <para>This section deals with problems you may experience while using or
+ installing jEdit. Problems that aren't OS specific are listed under <link
+ linkend="general-problems"><quote>General Problems</quote></link>.</para>
+ <qandaset defaultlabel="qanda">
+ <qandadiv id="general-problems">
+ <title>General Problems</title>
+ <qandaentry>
+ <question id="wont-start">
+ <para>jEdit won't start. What should I do?</para>
+ </question>
+ <answer>
+ <para>If you don't have a clue as to why you cannot run
+ jEdit, it's best to perform a step-by-step diagnosis. If it
+ never worked before, begin by finding the Java application
+ loader you are using: <filename>java.exe</filename>,
+ <filename>javaw.exe</filename> or <filename>java</filename>.
+ Make sure it is running by entering its full path with the
+ <userinput>-h</userinput> parameter in a terminal or console
+ window. If you can't find the Java application loader, your
+ Java runtime environment package may be missing or
+ incomplete.</para>
+ <para>Next, find where you have installed jEdit. You should
+ look for the file <filename>jedit.jar</filename> which
+ contains all of the application's Java class files in a
+ compressed archive.</para>
+ <para>Once you have both files, run the Java loader with the
+ <userinput>-jar</userinput> option and with
+ <filename>jedit.jar</filename> as the target. Make sure that
+ you either specify full paths for both files or that the
+ directories for the files are part of your
+ <filename>PATH</filename> environment variable. If jEdit
+ does not load at this point, the likely problem is a corrupt
+ <filename>jedit.jar</filename> file. Try downloading the
+ application again.</para>
+ <para>If jEdit does load using this procedure, you need to
+ examine the <quote>shortcut</quote> loading mechanism you
+ wish to use.</para>
+ <para>On Linux and MacOS X, you need to find and examine the
+ <filename>jedit</filename> shell script provided by the
+ installation routine to confirm that the script's commands
+ target the correct files and locations, and that variables
+ like <filename>JAVA_HOME</filename> are either defined in
+ the script or elsewhere in your shell's environment. Don't
+ forget to make sure that the script's file permissions allow
+ you to execute it as a shell script.</para>
+ <para>On Windows, if you are using a batch script to run
+ jEdit, the same points (other than file permissions) apply
+ to examining <filename>jedit.bat</filename>. If you are
+ using jEditLauncher, run <userinput>jedit /p</userinput> in
+ jEdit's installation directory from a command line to get
+ the custom loader's setup dialog. Here you can check the
+ paths for both the Java application loader and jEdit as well
+ as any command line parameters for both programs. Make sure
+ that you have placed Java and jEdit options in the correct
+ input fields. If the parameters seems correct but jEdit will
+ not load with the Windows launcher, try uninstalling and
+ reinstalling the launcher by running <userinput>jedit
+ /u</userinput> followed by <userinput>jedit
+ /i</userinput>.</para>
+ <bridgehead>But it worked before! It just stopped working
+ after an upgrade. What should I do?</bridgehead>
+ <para>If it used to work for an older version and no longer
+ works, it could be that you have some old crud in your jEdit
+ settings directory (<literal>$HOME/.jedit</literal>). You
+ may want to try renaming the offending file/subdirectory to
+ something else, and restarting jEdit with fresh settings.
+ You can later copy the old settings back into the previous
+ location if you find you are missing things. Many files in
+ your settings directory directory are (or should be)
+ human-readable/editable, so you are encouraged to examine
+ them and see what is there. You can wipe out
+ <literal>.jedit/jars-cache</literal> while jEdit is not
+ actually running, and it will be rebuilt next time you start
+ it.</para>
+ <para>If at this point you're still stuck, ask for help on
+ the jedit-users mailing list, the jEdit Community
+ <quote>Installation</quote> message board or on IRC. You're
+ bound to find someone quickly.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="start-missing-plugins">
+ <para>After jEdit starts, I can't see all of the plugins I
+ have downloaded. How can I make them appear?</para>
+ </question>
+ <answer>
+ <para>If you use jEdit's Plugin Manager to download and
+ install plugins, your plugins will be found in the
+ <filename>jars</filename> subdirectory of one of two
+ directories: either the directory in which jEdit is
+ installed, or the current user's settings directory. These
+ are the only location jEdit examines when it loads plugins
+ at startup.</para>
+ <para>The default location of the settings directory depends
+ on your operating system. You can find out its location
+ during a jEdit session by evaluating
+ <userinput>jedit.getSettingsDirectory()</userinput> in
+ BeanShell.</para>
+ <para>The settings directory can be changed by using the
+ <userinput>-settings</userinput> command line parameter. If
+ you change the location of the settings directory with this
+ parameter, jEdit will not be able to find plugin archive
+ files in the old location. If you use or change the
+ <userinput>-settings</userinput> parameter, make sure your
+ plugins don't get left behind.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="problems-out-of-memory">
+ <para>During an editing session I get an error message about
+ an <quote>OutOfMemoryError</quote> while working with a
+ large file or performing a lengthy operation. The message
+ reappears every time I retry the operation. How can I
+ prevent this?</para>
+ </question>
+ <answer>
+ <para>One solution that often works is to set or increase
+ the allocation of memory to the heap for Java objects
+ created by the Java Virtual Machine in which jEdit is
+ running. Add the command line option
+ <userinput>-mxXXm</userinput> to the options passed to the
+ version of the Java application loader you are using (such
+ as <filename>java</filename>, <filename>java.exe</filename>
+ or <filename>javaw.exe</filename>). In place of the
+ <userinput>XX</userinput> in the option, use a multiple of
+ 16 between 32 and 256. If you already are using the option,
+ increase the numeric portion of the
+ <userinput>-mxXXm</userinput> parameter in increments of
+ 64.</para>
+ <para>If you are using the <userinput>-jar</userinput>
+ command line option with Java to run jEdit, remember that
+ the <userinput>-jar</userinput> parameter must be the last
+ Java option, followed immediately by the path to
+ <filename>jedit.jar</filename> and then any jEdit command
+ line options.</para>
+ <para>If out of memory errors occur while running a build or
+ compilation operation from within jEdit, you can also have
+ the operation run in an external process rather than inside
+ the same Java Virtual Machine running jEdit. The AntFarm
+ plugin, for example, lets you select this approach as a
+ configuration option. In other cases, you can run an
+ external program using the command line interface of the
+ Console plugin, which will capture and display the output of
+ the external process and in many cases parse the output for
+ error information.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="textarea-corruption">
+ <para>My textarea gets confused about the end of the buffer or in some other way corrupted (the characters are in the wrong place on the screen) every now and then. What
+ should I do?</para>
+ </question>
+ <answer>
+ <para>It happens to me sometimes too. I have this macro to work around it for now:
+<programlisting>
+/** Reset_TextArea.bsh */
+view.splitVertically();
+view.unsplitCurrent();
+</programlisting>
+ Run this, and jEdit creates
+ a new TextArea for you, and that one won't be confused. This
+ can help avoid the need to restart jEdit. If you can
+ reproduce the steps you took to cause this, please submit a
+ bug report that details what plugins/versions you were
+ using, and how to reproduce it. It may be specific to a file you are editing, or a particular combination of settings you are using, or sequence of actions you performed. </para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="general-borders">
+ <para>Why is jEdit's window movement and resizing so
+ buggy?</para>
+ </question>
+ <answer>
+ <para>Perhaps the option to let Java draw window borders is
+ enabled. This option can lead to strange behavior on some
+ Java versions and operating systems. Disable it in the
+ <guilabel>Appearance</guilabel> tab of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="antialiased-text-everywhere">
+ <para>How can I get antialiased text everywhere? </para>
+ </question>
+ <answer>
+ <para>For the text area, go to <guimenuitem>Global Options - TextArea - Anti Aliased Smooth Text</guimenuitem>. Note that "Standard" works over Microsoft remote desktop, while "subpixel" does not. <guimenuitem> Fractional Font Metrics</guimenuitem>, a very old option, combined with Subpixel does not seem to do anything good. </para>
+ <para>Also, starting <command>java</command> with command line options <literal>"-Dawt.useSystemAAFontSettings=on" "-Dswing.aatext=true"</literal> will give you antialiased text everywhere else. You can add these options to the batch file or shell script line that starts jEdit. </para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="install-no-such-file">
+ <para>What should I do when the installer displays the
+ message, <screen>No such file or directory</screen>?</para>
+ </question>
+ <answer>
+ <para>The full message that you may receive from the Java
+ application launcher begins as follows: <screen>Exception in thread "main" java.util.zip.ZipException: No such file or directory
+...</screen> This means that the Java application launcher cannot read the jar
+ archive file that you specified on the command line. If your
+ Java runtime environment otherwise runs properly, then
+ either you have named the incorrect file name or the
+ installation file is corrupt or incomplete. Check the file
+ name, download the installer again if necessary, and be sure
+ to follow any specific instructions for your operating
+ system posted on the <ulink url="http://www.jedit.org">jEdit
+ web site</ulink>.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="install-noclassdef">
+ <para>After downloading
+ <filename>jeditXXXinstall.jar</filename> (the
+ <filename>XXX</filename> represents the version number), I
+ tried to run <userinput>java
+ jeditXXXinstall.jar</userinput>, but got the error message,
+ <screen>Exception in main(), NoClassDefFoundError: jeditXXXinstall/jar.</screen>
+ What am I doing wrong?</para>
+ </question>
+ <answer>
+ <para>You need to specify the <userinput>-jar</userinput>
+ option for the Java application loader so that the loader
+ will search the installation archive for the starting class
+ file. Without the option, it treats the archive as a single
+ class file (which it is not!), thus producing the error. The
+ correct command line would be <userinput>java -jar
+ jeditXXXinstall.jar</userinput>.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="jedit-crashed">
+ <para>jEdit crashed the JVM, what gives?</para>
+ </question>
+ <answer>
+ <para>It's important to realise that java applications
+ should never do this. The problem is almost certainly a bug
+ in the JVM. Problems of this nature are often tricky to
+ solve. Depending on your platform, there should be
+ information logged about what caused the crash to occur. For
+ Unix type systems you will likely get an error in the
+ console (and for Mac OS X you may also get a report in
+ ~/Library/Logs/CrashReporter/JavaApplicationStub.crash.log).
+ </para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="general-slowstart">
+ <para>Why is jEdit so slow to start up?</para>
+ </question>
+ <answer>
+ <para>Some plugins require a lot of setup - chances are if
+ you disable one, you will be able to determine the culprit.
+ jEdit normally starts up quite quickly without
+ plugins.</para>
+ <procedure>
+ <step>
+ <para>To go the <guimenu>Utilities</guimenu> menu and
+ select <guimenuitem>Activity
+ Log</guimenuitem>.</para>
+ </step>
+ <step>
+ <para>Scroll to the area where you see lines like
+ <quote>[notice] JARClassLoader: Starting plugin
+ XXX</quote>.</para>
+ </step>
+ </procedure>
+ <para>You should be able to see which (if any) plugins are
+ causing an excesively long delay.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="general-slow">
+ <para>Why is jEdit so slow?</para>
+ </question>
+ <answer>
+ <para>There may be many causes for this. Java by nature is
+ more demanding on hardware than native applications. Modern
+ computers should not have much problem with this.</para>
+ <para>The most likely cause is plugins that parse buffers or
+ do other computationally expensive operations. These include
+ XML, JavaSideKick, and CodeAid. If performance is important
+ to you, installing a whole batch of plugins in one go is
+ probably not a very good idea. Install them one at a time,
+ so you can evaluate the effects of each. </para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="general-docking">
+ <para>Go to left/top/bottom/right docking area does not work
+ for some plugins?</para>
+ </question>
+ <answer>
+ <para>The plugin is missing a
+ <methodname>requestDefaultFocus()</methodname> method.
+ Plugin updates will be available from time to time, or you
+ can email the author of the plugin to let them know of the
+ problem.</para>
+ </answer>
+ </qandaentry>
+ </qandadiv>
+ <qandadiv id="unix-problems">
+ <title>Unix/Linux Problems</title>
+ <qandaentry>
+ <question id="using-older-jre">
+ <para>I'm trying to install jEdit on Linux, but I keep getting strange error messages.
+ </para>
+<programlisting>
+Exception in thread "main" java.lang.UnsupportedClassVersionError:
+installer/Install (Unsupported major.minor version 49.0)
+Exception in thread "main" java.awt.AWTError: Cannot load AWT toolkit: gnu.java.awt.peer.gtk.GtkToolkit
+</programlisting>
+ </question>
+ <answer>
+ <para> Make sure the version of Java you are running is Sun Java 1.6 or higher.
+ In debian/ubuntu,
+ <literal> apt-get install sun-java6-jdk </literal>
+ </para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="install-jedit-home">
+ <para>After installing jEdit on Linux, running the
+ <userinput>jedit</userinput> command causes the error
+ message: <screen>Warning: JAVA_HOME environment variable not set</screen>
+ How can I fix this?</para>
+ </question>
+ <answer>
+ <para>Your <filename>jedit</filename> shell script should be
+ modified to set the <userinput>JAVA_HOME</userinput>
+ variable to the directory containing the executables of your
+ desired Java runtime environment (JRE).</para>
+ </answer>
+ </qandaentry>
+ </qandadiv>
+ <!--******************************************************** Windows -->
+ <qandadiv id="windows-problems">
+ <title>Windows Problems</title>
+ <qandaentry>
+ <question id="install-windows-errmessage">
+ <para>When I try to run <filename>jedit.exe</filename> I get
+ the message <screen>The JEditLauncher component does not appear to be installed.</screen></para>
+ </question>
+ <answer>
+ <para>The dialog presenting this message asks if you would
+ like to install the launcher. Select
+ <userinput>Yes</userinput> and supply further information as
+ prompted. A file named <filename>install.log</filename> is
+ generated in the same directory as
+ <filename>jedit.exe</filename> that contains information on
+ the launcher's installation. You can send this file along
+ with jEdit's Activity Log if you continue to have problems
+ running jEdit with the launcher package.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="install-error-regkey">
+ <para>When I try to run the jEdit installation package in
+ Windows, I get an error message, <screen>Error opening registration key
+ "software\javasoft\java runtime environment".</screen> How can I fix
+ this?</para>
+ </question>
+ <answer>
+ <para>The problem is not with jEdit but may be caused by
+ your installation of the Java runtime environment. Under
+ Windows, Sun's Java application loader relies on entries in
+ the Windows registry to find the files that create the
+ runtime environment and a Java virtual machine. The loader
+ (<filename>java.exe</filename>e or
+ <filename>javaw.exe</filename>) is unable to find the
+ necessary registration entry and therefore sends the error
+ message. The best approach to fixing this is to uninstall
+ and reinstall the JDK.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="install-windows-badcommand">
+ <para>When trying to install jEdit on Windows Me with an
+ MS-DOS prompt, after entering <userinput>java -jar
+ jeditXXXinstall.jar</userinput> I get the message
+ <userinput>bad command or file name</userinput>. I have
+ tried various alternatives but still cannot install.</para>
+ </question>
+ <answer>
+ <para>You should confirm that you have a Java runtime
+ environment installed, which will include
+ <filename>java.exe</filename> and the version that omits a
+ separate terminal window, <filename>javaw.exe</filename>.
+ Make sure that the directory containing
+ <filename>java.exe</filename> or
+ <filename>javaw.exe</filename>is found in the value of your
+ <filename>PATH</filename> environment variable. Otherwise
+ you should give the full path to the chosen loader on your
+ command line.</para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="general-windows-ddraw">
+ <para>When I run jEdit on Windows, it flashes, blinks, and
+ doesn't display correctly! Why is your program so
+ buggy?</para>
+ </question>
+ <answer>
+ <para>A frequent cause of this problem is buggy video
+ drivers and/or a buggy DirectDraw implementation. A
+ workaround is to disable Java's use of DirectDraw by adding
+ the following option to the Java virtual machine command
+ line:</para>
+ <programlisting>-Dsun.java2d.noddraw=true</programlisting>
+ </answer>
+ </qandaentry>
+ </qandadiv>
+ </qandaset>
</sect1>
\ No newline at end of file
diff --git a/jEdit/doc/FAQ/faq-use.xml b/jEdit/doc/FAQ/faq-use.xml
index 329e616..5630dbd 100644
--- a/jEdit/doc/FAQ/faq-use.xml
+++ b/jEdit/doc/FAQ/faq-use.xml
@@ -1,715 +1,715 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<sect1 id="usage">
- <title>Usage Questions</title>
-
- <!-- jEdit buffer-local properties: -->
-
- <!-- :indentSize=4:noTabs=false:tabSize=4: -->
-
- <!-- :xml.root=faq.xml: -->
-
- <!-- jEdit FAQ -->
-
- <!-- Copyright (C) 2003 John Gellene, Kris Kopicki -->
-
- <para>This section deals general usage of jEdit, including
- customisation.</para>
-
- <qandaset defaultlabel="qanda">
- <!--********************************************************* Abrevs -->
-
- <qandadiv id="text-abbrev">
- <title>Abbreviations</title>
-
- <qandaentry>
- <question id="abbrevs-create-onfly">
- <para>How can I create abbreviations <quote>on the
- fly</quote> as I type?</para>
- </question>
-
- <answer>
- <para>Type the form of abbreviation you wish to use, then
- without pressing the <keycap>SPACE</keycap> key, press
- <keycombo action="simul">
- <keycap>CTRL</keycap>
-
- <keycap>;</keycap>
- </keycombo>. A dialog will appear for entering text that
- goes before and after the editing caret. For example, you
- can insert an opening HTML or XML tag before the cursor and
- its corresponding closing tag after the cursor. Use the
- mouse to select <guilabel>Add global</guilabel> or
- <guilabel>Add mode-specific</guilabel>. The first choice
- makes the abbreviation available for all documents; the
- second makes it available only in documents with the same
- editing mode as the current document. In this way, you can
- add abbreviations that operate only a particular class of
- documents, for example, Java source files or XML markup.
- Either way, the abbreviation will be stored for future
- use.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="abbrevs-expand-type">
- <para>How can I have abbreviations expanded automatically as
- I type?</para>
- </question>
-
- <answer>
- <para>Select
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem>, then select the
- <guimenuitem>Abbreviations</guimenuitem> option pane. You
- will see a checkbox option for <quote>Space bar expands
- abbrevs</quote>. Here you can also add, modify and delete
- abbreviations on a global basis or for individual editing
- modes.</para>
- </answer>
- </qandaentry>
- </qandadiv>
-
- <!--********************************************************* Clippy -->
-
- <qandadiv id="text-clipboard">
- <title>Clipboard features</title>
-
- <qandaentry>
- <question id="clip-multiple">
- <para>Can I copy selections from more than one location in a
- document (or more than one document) and paste the aggregate
- text in one operation?</para>
- </question>
-
- <answer>
- <para>The <guimenuitem>Cut Append</guimenuitem> (<keycombo
- action="simul">
- <keycap>CTRL</keycap>
-
- <keycap>E</keycap>
- </keycombo> <keycombo action="simul">
- <keycap>CTRL</keycap>
-
- <keycap>U</keycap>
- </keycombo>) and <guimenuitem>Copy Append</guimenuitem>
- (<keycombo action="simul">
- <keycap>CTRL</keycap>
-
- <keycap>E</keycap>
- </keycombo> <keycombo action="simul">
- <keycap>CTRL</keycap>
-
- <keycap>A</keycap>
- </keycombo>) both add the selected text to the existing
- contents of the Clipboard. A single
- <guimenuitem>Paste</guimenuitem> (<keycombo action="simul">
- <keycap>CTRL</keycap>
-
- <keycap>V</keycap>
- </keycombo>) command will insert the aggregated text at
- the cursor or in place of an existing selection.</para>
- </answer>
- </qandaentry>
- </qandadiv>
-
- <!--********************************************************* Attrib -->
-
- <qandadiv id="file-attributes">
- <title>File Attributes</title>
-
- <qandaentry>
- <question id="file-owner-preserve">
- <para>Does jEdit preserve file ownership and permissions
- when it saves files?</para>
- </question>
-
- <answer>
- <para>One reason this can be an issue is that by default,
- jEdit adopts the conservative approach of saving a file to a
- temporary name before renaming that file to the desired
- name. This procedure minimizes the risk of crashes causing
- loss of data, and works without reported problems on local
- file systems. However, when files are served remotely by
- FTP, Samba or other means, it may not be possible to
- preserve file attributes on the server because the newly
- created temporary file's owner may differ from the owner of
- the original file on the server.</para>
-
- <para>To avoid this problem, you can disable the two-step
- file saving routine. Select
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem>, then under <guimenuitem>Loading &
- Saving</guimenuitem>, clear the checkbox for
- <guimenuitem>Two-stage save</guimenuitem>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="file-linesep-choice">
- <para>Why does jEdit ignore my choice for line separator
- characters when I save a file?</para>
- </question>
-
- <answer>
- <para>When jEdit saves an existing file, it uses the line
- separator already used by the file. The line separator
- designated in the buffer options or elsewhere is used only
- for new files.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="file-autodetect-encoding">
- <para>Can jEdit auto-detect character encodings when it
- opens a file?</para>
- </question>
-
- <answer>
- <para>Only Unicode can be detected when a file is loaded.
- For other encodings, you must specify the encoding when the
- file is loaded if you do not wish to use the default
- encoding for your operating system.</para>
-
- <para>There are a few features that can help you navigate
- through encoding issues. You can select the encoding you
- wish to use from <guisubmenu> Encoding</guisubmenu> in the
- <guimenu>Commands</guimenu> menu of the File System Browser.
- You can also designate a default encoding in the
- <guimenuitem>Loading & Saving</guimenuitem> pane of the
- Global Options dialog; if you do not, jEdit adopts your
- operating system's default encoding as its own default. You
- can change the encoding used to save an individual file by
- selecting
- <guimenu>Utilities</guimenu>><guimenuitem>Buffer
- Options</guimenuitem> and changing the current buffer's
- properties. Finally, jEdit keeps track of the encodings used
- in the files named in the
- <guimenu>File</guimenu>><guimenuitem>Recent
- Files</guimenuitem> drop-down list.</para>
-
- <para>These features allow you to minimize the attention
- given to character encodings, but you must still pay some
- attention if you do not want to use default settings.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="file-euro-char">
- <para>I'm using the iso-8859-1 character encoding. How do I
- type and save the Euro sign (<quote>â¬</quote>)?</para>
- </question>
-
- <answer>
- <para>You need to use instead the iso-8859-15 character set,
- which is a modification of iso-8859-1 that includes the Euro
- sign and some Finnish and French characters. The Euro sign
- represents character value 0xA4 in this 8-bit set. To open a
- file manually using this encoding, select
- <guimenu>File</guimenu>><guimenuitem>Open...
- </guimenuitem>, and select
- <guimenuitem>ISO8859_15</guimenuitem> from <guimenu>
- Commands</guimenu>><guisubmenu>Enconding</guisubmenu>
- before opening the file.</para>
-
- <para>There is a startup script in the
- <quote>Downloads</quote> area of <ulink
- url="http://community.jedit.org">jEdit Community</ulink>
- named <filename>euro.bsh</filename> that can be used as a
- startup script to help simplify the insertion of the Euro
- symbol if your keyboard currently lacks a dedicated
- key.</para>
- </answer>
- </qandaentry>
- </qandadiv>
-
- <!--********************************************************** Files -->
-
- <qandadiv id="file-manage">
- <title>File Management</title>
-
- <qandaentry>
- <question id="open-dnd">
- <para>How can I open files in jEdit using drag and
- drop?</para>
- </question>
-
- <answer>
- <para>Try installing the Drag and Drop plugin using the
- Plugin Manager feature. It works with most (but not all)
- combinations of operating systems and current Java runtime
- environments.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="add-favorites">
- <para>How do I add and remove directories to the list of
- <quote>favorites</quote> in jEdit's File System
- Browser?</para>
- </question>
-
- <answer>
- <para>To add a directory to the list of favorites, navigate
- so that the directory is at the top of the tree displayed in
- the File System Browser window, click the
- <guimenuitem>Favorites</guimenuitem> button, and select
- <guimenuitem>Add to favorites</guimenuitem> from the
- resulting menu. To delete a directory from the favorites
- list, use the same menu to go to the favorites list.
- Right-click on the directory to be deleted and select
- <guimenuitem>Delete</guimenuitem>. This operation will
- delete the directory from the list of favorites but will
- have no effect on the directory itself.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="associate-files">
- <para>How do I associate particular file types with jEdit so
- I can open them by double clicking their icons in Windows
- Explorer?</para>
- </question>
-
- <answer>
- <para>You associate the file extension with
- <userinput><replaceable><jEdit installation
- directory></replaceable>\jedit.bat</userinput>.
- This can be done from the <guimenuitem>File Types</guimenuitem>
- tab in the Windows Explorer's <guimenuitem>Tools</guimenuitem>
- -> <guimenuitem>Folder options...</guimenuitem> menu.</para>
-
- <para>The EXE-installer for Windows includes a
- custom context menu handler. It will provide menu items for
- using jEdit any time you right-click on a file icon in
- Windows Explorer. This feature does
- not interfere with any existing file associations.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="open-restrict-dir">
- <para>Can I restrict jEdit to opening and saving files in a
- single directory without changing file permissions?</para>
- </question>
-
- <answer>
- <para>The easiest way to get this kind of behavior is to use
- macros that open the Virtual File Browser to a specific,
- fixed directory, and then change the default keyboard
- shortcuts for opening and saving files to run these
- macros.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="filename-uc-to-lc">
- <para>On Windows, how can I change the name of my file from
- <filename>myfile.txt</filename> to
- <filename>MyFile.txt</filename>?</para>
- </question>
-
- <answer>
- <para>The Windows native file system deals with file names
- in a case-insensitive manner, so
- <filename>myfile.txt</filename> and
- <filename>MyFile.txt</filename> refer to the same file. As a
- result, the jEdit file browser treats both spellings
- identically and does not make a name change. Using our
- example, the easiest workaround is to rename the file in two
- steps: first to <filename>_myfile.txt</filename>, then to
- <filename>MyFile.txt</filename>.</para>
- </answer>
- </qandaentry>
- </qandadiv>
-
- <!--*********************************************************** Text -->
-
- <qandadiv id="text-format">
- <title>Formatting text</title>
-
- <qandaentry>
- <question id="text-indent">
- <para>How do I indent or unindent selections of text?</para>
- </question>
-
- <answer>
- <para>Using jEdit's default configuration, you can indent a
- selection of text by pressing <keycombo action="simul">
- <keycap>ALT</keycap>
-
- <keycap>RIGHT</keycap>
- </keycombo>. Unindent a selection by pressing <keycombo
- action="simul">
- <keycap>ALT</keycap>
-
- <keycap>LEFT</keycap>
- </keycombo>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="text-line-numbers">
- <para>Is there a way to automatically view line numbers when
- a buffer is opened?</para>
- </question>
-
- <answer>
- <para><guimenuitem>Select Utilities>Global
- Options</guimenuitem>, and in the
- <guimenuitem>Gutter</guimenuitem> option pane select the
- <guimenuitem>Line Numbering</guimenuitem> check box.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="smart-quote">
- <para>Does jEdit know smart quotes? In .tex files I would
- like to use <userinput>``</userinput> or
- <userinput>''</userinput> instead of
- <userinput>"</userinput>.</para>
- </question>
-
- <answer>
- <para>While jEdit can display any character provided by a
- supported encoding set and enter any character supported by
- a keyboard driver, it does not have the ability to insert
- <quote>smart quote</quote> pairs automatically as some word
- processors do. This would require a BeanShell macro to
- modify quoted text.</para>
-
- <para>The Accents and CharacterMap plugins can also help you
- type international characters.</para>
-
- <para>You also have the option of using a TeX macro (or, in
- LaTeX, a pair of environment tags) to have the standard
- double quotation mark <userinput>"</userinput> transformed
- into the appropriate opening or closing smart quotes without
- the need to keep track of when quoted text opens or
- closes.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="text-softwrap">
- <para>Does jEdit have a <quote>soft</quote> wrap text
- mode?</para>
- </question>
-
- <answer>
- <para>jEdit's 4.3's soft wrap mode, and especially its wrap
- to margin=0, is one of its many features that just works
- better than it does in most other editing environments. Soft
- Wrap with margin=0 was unavailable in jEdit 4.2, but users
- of 4.1 will remember it well. When you set SOFT WRAP with a
- margin=0, you don't need to use the horizontal scroller
- anymore. It's just as simple as that.</para>
-
- <para>jEdit wrap capability can be activated for a specific
- buffer, specific editing modes, or for all documents by
- default. In prior versions, both the text wrap feature and
- the <guimenuitem>Edit>Text>Format
- Paragraph</guimenuitem> command insert <quote>hard</quote>
- end of line characters. This <quote>hard wrap</quote>
- feature remains available as an option for buffers and
- editing modes.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="text-display-spaces">
- <para>The display of spaces as a character in the editor is
- annoying. How can I disable those small square boxes?</para>
- </question>
-
- <answer>
- <para>This is controlled by the WhiteSpace plugin. To change
- your settings to disable display of whitespace characters,
- select <guimenuitem>Utilities>Global
- Options</guimenuitem>, then select <guimenuitem>Plugin
- options>WhiteSpace</guimenuitem>. You can separately
- configure the display of spaces, tabs, and other whitespace
- characters.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="text-i18n">
- <para>Does jEdit support i18n?</para>
- </question>
-
- <answer>
- <para>When editing text documents, jEdit supports any
- available encoding scheme, and can open files with a
- specified encoding other than the default encoding of your
- operating system using the
- <guimenu>Commands</guimenu>><guisubmenu>Encoding
- </guisubmenu> from the File System Browser.</para>
-
- <para>With respect to menu labels, message strings and other
- GUI elements, the jEdit project team currently does not have
- the resources to maintain multiple property sets in
- languages other than English, particularly since the
- development effort is continuing at a rapid pace. There has
- not been great demand for this in any event. This may be
- because jEdit is primarily a tool for programmers, and the
- use of English as a common first or second language is
- widespread in the global programming community. This
- decision may be reconsidered when the application has
- further matured and if more individuals express a
- willingness to be involved in translation work.</para>
- </answer>
- </qandaentry>
- </qandadiv>
-
- <!--********************************************************* Source -->
-
- <qandadiv id="source-compile">
- <title>Compiling source code</title>
-
- <qandaentry>
- <question id="compile-java">
- <para>How do I compile my Java source in JEdit?</para>
- </question>
-
- <answer>
- <para>There are a number of plugins that you can use to
- compile Java source code. You can run a Java compiler on the
- command line in the <quote>System</quote> shell of the
- <application>Console</application> plugin. If you are using
- the JCompiler plugin, you will have a
- <quote>JCompiler</quote> shell in the
- <application>Console</application> plugin, and you can run
- the <userinput>compile</userinput> command for the current
- file, or the <userinput>compilepkg</userinput> command on
- all of the current directory's source code files. You can
- also use the <quote>Ant</quote> commandos from the
- <application>Console</application> plugin or the
- <application>AntFarm</application> plugin to run complex
- builds on a project of source code files, using a
- <filename>build.xml</filename> file to specify build
- commands and dependencies.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="source-new-editmode">
- <para>How do I create a new edit mode?</para>
- </question>
-
- <answer>
- <para>Take a look at the <quote>Writing Edit Modes</quote>
- section of the User's Guide. Basically, you have to write an
- XML file containing data on the mode's file extensions and
- buffer and syntax highlighting properties, then add
- information about the new mode file to a second XML file
- containing a catalog of modes.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="source-docbook">
- <para>Does jEdit support DocBook tags?</para>
- </question>
-
- <answer>
- <para>The application contains editing modes for both SGML
- and XML. Using jEdit abbreviations, you can quickly insert
- commonly-typed tags with a couple of keystroke. There are a
- number of abbreviations in the XML and SGML modes that
- create pairs of DocBook tags on the fly.</para>
-
- <para>You can get validation, tree-browsing, auto-complete,
- and auto-closing tags with the XML plugin, a very advanced
- XML editing tool.</para>
-
- <para>With whe XInsert or Template plugin you can create
- multi-layered DocBook elements.</para>
-
- <para>There are other macros targeting DocBook available
- from the <ulink url="http://community.jedit.org">jEdit
- Community</ulink> web site that you can use or adapt for
- your own purposes.</para>
- </answer>
- </qandaentry>
- </qandadiv>
-
- <!--******************************************************* Settings -->
-
- <qandadiv id="emacs-tricks">
- <title>Tips for Emacs users</title>
-
- <para>For more emacs help, check out <ulink
- url="http://www.clapper.org/software/jedit/">this site</ulink> for
- more emacs macros.</para>
-
- <qandaentry>
- <question id="settings-emacstab">
- <para>Can I have an emacs style tab key (tab anywhere in a
- line re-indents it)?</para>
- </question>
-
- <answer>
- <para>Yes. You can do this by rebinding the
- <keycode>tab</keycode> key to <command>Indent Selected
- Lines</command> in the <guimenuitem>Global
- Options</guimenuitem>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="settings-emacsctrle">
- <para>How do I map Ctrl-E to go to the end of the
- line?</para>
- </question>
-
- <answer>
- <para>jEdit has it set up as a 2-key shortcut. In order to
- make Ctrl-E a one-key shortcut again, you first have to
- redefine all of the Ctrl-E prefix shortcuts to mean
- something else.</para>
-
- <para><literal>jedit_keys.props</literal> shows you all of
- the current keyboard bindings. As you can see, Ctrl-e is
- used for many things in jEdit. If you want to redefine it to
- be a single-key shortcut, first thing you need to do is
- decide on another Ctrl-key to use as a prefix, to redefine
- jEdit's fold features. I recommend using Ctrl-Q as the
- prefix, and if you want to use Ctrl-Q to quit, you have to
- hit Ctrl-Q twice. Cut and paste the below shortcuts into
- your own properties file.</para>
-
- <programlisting>
-# emacs end of line
-end.shortcut2=C+e
-# Ctrl-Q twice to quit
-exit.shortcut=C+q C+q
-# C+q is our new C+e prefix
-#{{{ C+q C+X
-
-# Unused: f, h, q, y
-copy-append.shortcut=C+q C+a
-search-in-open-buffers.shortcut=C+q C+b
-range-comment.shortcut=C+q C+c
-search-in-directory.shortcut=C+q C+d
-replace-and-find-next.shortcut=C+q C+g
-ignore-case.shortcut=C+q C+i
-scroll-to-current-line.shortcut=C+q C+j
-line-comment.shortcut=C+q C+k
-select-line-range.shortcut=C+q C+l
-add-marker.shortcut=C+q C+m
-center-caret.shortcut=C+q C+n
-open-path.shortcut=C+q C+o
-vertical-paste.shortcut=C+q C+p
-replace-in-selection.shortcut=C+q C+r
-save-all.shortcut=C+q C+s
-toggle-line-numbers.shortcut=C+q C+t
-cut-append.shortcut=C+q C+u
-paste-previous.shortcut=C+q C+v
-close-all.shortcut=C+q C+w
-regexp.shortcut=C+q C+x
-paste-deleted.shortcut=C+q C+y
-redo.shortcut=C+q C+z
-#}}}
-
-#{{{ C+q C+non-alpha
-left-docking-area.shortcut=C+q C+LEFT
-top-docking-area.shortcut=C+q C+UP
-right-docking-area.shortcut=C+q C+RIGHT
-bottom-docking-area.shortcut=C+q C+DOWN
-
-prev-marker.shortcut=C+q C+COMMA
-next-marker.shortcut=C+q C+PERIOD
-prev-bracket.shortcut=C+q C+OPEN_BRACKET
-next-bracket.shortcut=C+q C+CLOSE_BRACKET
-close-docking-area.shortcut=C+q C+BACK_QUOTE
-#}}}
-
-#{{{ C+q X
-# Unused: b e g h j k m o q t y z
-add-explicit-fold.shortcut=C+q a
-collapse-all-folds.shortcut=C+q c
-delete-paragraph.shortcut=C+q d
-format-paragraph.shortcut=C+q f
-find-previous.shortcut=C+q g
-invert-selection.shortcut=C+q i
-select-line.shortcut=C+q l
-narrow-to-fold.shortcut=C+q n n
-narrow-to-selection.shortcut=C+q n s
-select-paragraph.shortcut=C+q p
-remove-trailing-ws.shortcut=C+q r
-select-fold.shortcut=C+q s
-insert-literal.shortcut=C+q v
-select-word.shortcut=C+q w
-parent-fold.shortcut=C+q u
-expand-all-folds.shortcut=C+q x
-#}}}
-</programlisting>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="emacs-ctrl-k">
- <para>What about ctrl-K?</para>
- </question>
-
- <answer>
- <para>Check out <literal>macros/Emacs_Ctrl_K.bsh</literal>.
- Bind it to Ctrl-k from the shortcuts option pane.</para>
- </answer>
- </qandaentry>
- </qandadiv>
-
- <qandadiv id="customize-other">
- <title>Other Settings and Options</title>
-
- <qandaentry>
- <question id="settings-change-font">
- <para>How can I change the font used for menu labels and
- other elements of jEdit's user interface?</para>
- </question>
-
- <answer>
- <para>Select
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem>, then the
- <guimenuitem>Appearance</guimenuitem> option pane. When you
- select the <quote>Metal</quote> look and feel you can also
- select the fonts used for various displayed items.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="settings-add-classpath">
- <para>I want to add a directory to the classpath. I did this
- in the standalone BeanShell with ease by using the
- <classname>addClassPath(String)</classname> method. but this
- doesn't work in a macro. How could I manage the classpath in
- jEdit?</para>
- </question>
-
- <answer>
- <para>The implementation of BeanShell used in jEdit does not
- use BeanShell's class loader. The script method contained in
- loadJarClasses.bsh (found in the Downloads section of <ulink
- url="http://community.jedit.org">jEdit Community</ulink>)
- should work if you know the path to a specific class file or
- class archive.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="settings-unlisted">
- <para>Are there any hidden features?</para>
- </question>
-
- <answer>
- <para>Yes. You can access them by binding a shortcut to the
- action in question. You will find a complete list of
- available commands under the
- <guimenuitem>Shortcuts</guimenuitem> area in the
- <guimenuitem>Global Options</guimenuitem>.</para>
- </answer>
- </qandaentry>
- </qandadiv>
- </qandaset>
-</sect1>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?>
+<sect1 id="usage">
+ <title>Usage Questions</title>
+
+ <!-- jEdit buffer-local properties: -->
+
+ <!-- :indentSize=4:noTabs=false:tabSize=4: -->
+
+ <!-- :xml.root=faq.xml: -->
+
+ <!-- jEdit FAQ -->
+
+ <!-- Copyright (C) 2003 John Gellene, Kris Kopicki -->
+
+ <para>This section deals general usage of jEdit, including
+ customisation.</para>
+
+ <qandaset defaultlabel="qanda">
+ <!--********************************************************* Abrevs -->
+
+ <qandadiv id="text-abbrev">
+ <title>Abbreviations</title>
+
+ <qandaentry>
+ <question id="abbrevs-create-onfly">
+ <para>How can I create abbreviations <quote>on the
+ fly</quote> as I type?</para>
+ </question>
+
+ <answer>
+ <para>Type the form of abbreviation you wish to use, then
+ without pressing the <keycap>SPACE</keycap> key, press
+ <keycombo action="simul">
+ <keycap>CTRL</keycap>
+
+ <keycap>;</keycap>
+ </keycombo>. A dialog will appear for entering text that
+ goes before and after the editing caret. For example, you
+ can insert an opening HTML or XML tag before the cursor and
+ its corresponding closing tag after the cursor. Use the
+ mouse to select <guilabel>Add global</guilabel> or
+ <guilabel>Add mode-specific</guilabel>. The first choice
+ makes the abbreviation available for all documents; the
+ second makes it available only in documents with the same
+ editing mode as the current document. In this way, you can
+ add abbreviations that operate only a particular class of
+ documents, for example, Java source files or XML markup.
+ Either way, the abbreviation will be stored for future
+ use.</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="abbrevs-expand-type">
+ <para>How can I have abbreviations expanded automatically as
+ I type?</para>
+ </question>
+
+ <answer>
+ <para>Select
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem>, then select the
+ <guimenuitem>Abbreviations</guimenuitem> option pane. You
+ will see a checkbox option for <quote>Space bar expands
+ abbrevs</quote>. Here you can also add, modify and delete
+ abbreviations on a global basis or for individual editing
+ modes.</para>
+ </answer>
+ </qandaentry>
+ </qandadiv>
+
+ <!--********************************************************* Clippy -->
+
+ <qandadiv id="text-clipboard">
+ <title>Clipboard features</title>
+
+ <qandaentry>
+ <question id="clip-multiple">
+ <para>Can I copy selections from more than one location in a
+ document (or more than one document) and paste the aggregate
+ text in one operation?</para>
+ </question>
+
+ <answer>
+ <para>The <guimenuitem>Cut Append</guimenuitem> (<keycombo
+ action="simul">
+ <keycap>CTRL</keycap>
+
+ <keycap>E</keycap>
+ </keycombo> <keycombo action="simul">
+ <keycap>CTRL</keycap>
+
+ <keycap>U</keycap>
+ </keycombo>) and <guimenuitem>Copy Append</guimenuitem>
+ (<keycombo action="simul">
+ <keycap>CTRL</keycap>
+
+ <keycap>E</keycap>
+ </keycombo> <keycombo action="simul">
+ <keycap>CTRL</keycap>
+
+ <keycap>A</keycap>
+ </keycombo>) both add the selected text to the existing
+ contents of the Clipboard. A single
+ <guimenuitem>Paste</guimenuitem> (<keycombo action="simul">
+ <keycap>CTRL</keycap>
+
+ <keycap>V</keycap>
+ </keycombo>) command will insert the aggregated text at
+ the cursor or in place of an existing selection.</para>
+ </answer>
+ </qandaentry>
+ </qandadiv>
+
+ <!--********************************************************* Attrib -->
+
+ <qandadiv id="file-attributes">
+ <title>File Attributes</title>
+
+ <qandaentry>
+ <question id="file-owner-preserve">
+ <para>Does jEdit preserve file ownership and permissions
+ when it saves files?</para>
+ </question>
+
+ <answer>
+ <para>One reason this can be an issue is that by default,
+ jEdit adopts the conservative approach of saving a file to a
+ temporary name before renaming that file to the desired
+ name. This procedure minimizes the risk of crashes causing
+ loss of data, and works without reported problems on local
+ file systems. However, when files are served remotely by
+ FTP, Samba or other means, it may not be possible to
+ preserve file attributes on the server because the newly
+ created temporary file's owner may differ from the owner of
+ the original file on the server.</para>
+
+ <para>To avoid this problem, you can disable the two-step
+ file saving routine. Select
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem>, then under <guimenuitem>Loading &
+ Saving</guimenuitem>, clear the checkbox for
+ <guimenuitem>Two-stage save</guimenuitem>.</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="file-linesep-choice">
+ <para>Why does jEdit ignore my choice for line separator
+ characters when I save a file?</para>
+ </question>
+
+ <answer>
+ <para>When jEdit saves an existing file, it uses the line
+ separator already used by the file. The line separator
+ designated in the buffer options or elsewhere is used only
+ for new files.</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="file-autodetect-encoding">
+ <para>Can jEdit auto-detect character encodings when it
+ opens a file?</para>
+ </question>
+
+ <answer>
+ <para>Only Unicode can be detected when a file is loaded.
+ For other encodings, you must specify the encoding when the
+ file is loaded if you do not wish to use the default
+ encoding for your operating system.</para>
+
+ <para>There are a few features that can help you navigate
+ through encoding issues. You can select the encoding you
+ wish to use from <guisubmenu> Encoding</guisubmenu> in the
+ <guimenu>Commands</guimenu> menu of the File System Browser.
+ You can also designate a default encoding in the
+ <guimenuitem>Loading & Saving</guimenuitem> pane of the
+ Global Options dialog; if you do not, jEdit adopts your
+ operating system's default encoding as its own default. You
+ can change the encoding used to save an individual file by
+ selecting
+ <guimenu>Utilities</guimenu>><guimenuitem>Buffer
+ Options</guimenuitem> and changing the current buffer's
+ properties. Finally, jEdit keeps track of the encodings used
+ in the files named in the
+ <guimenu>File</guimenu>><guimenuitem>Recent
+ Files</guimenuitem> drop-down list.</para>
+
+ <para>These features allow you to minimize the attention
+ given to character encodings, but you must still pay some
+ attention if you do not want to use default settings.</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="file-euro-char">
+ <para>I'm using the iso-8859-1 character encoding. How do I
+ type and save the Euro sign (<quote>â¬</quote>)?</para>
+ </question>
+
+ <answer>
+ <para>You need to use instead the iso-8859-15 character set,
+ which is a modification of iso-8859-1 that includes the Euro
+ sign and some Finnish and French characters. The Euro sign
+ represents character value 0xA4 in this 8-bit set. To open a
+ file manually using this encoding, select
+ <guimenu>File</guimenu>><guimenuitem>Open...
+ </guimenuitem>, and select
+ <guimenuitem>ISO8859_15</guimenuitem> from <guimenu>
+ Commands</guimenu>><guisubmenu>Enconding</guisubmenu>
+ before opening the file.</para>
+
+ <para>There is a startup script in the
+ <quote>Downloads</quote> area of <ulink
+ url="http://community.jedit.org">jEdit Community</ulink>
+ named <filename>euro.bsh</filename> that can be used as a
+ startup script to help simplify the insertion of the Euro
+ symbol if your keyboard currently lacks a dedicated
+ key.</para>
+ </answer>
+ </qandaentry>
+ </qandadiv>
+
+ <!--********************************************************** Files -->
+
+ <qandadiv id="file-manage">
+ <title>File Management</title>
+
+ <qandaentry>
+ <question id="open-dnd">
+ <para>How can I open files in jEdit using drag and
+ drop?</para>
+ </question>
+
+ <answer>
+ <para>Try installing the Drag and Drop plugin using the
+ Plugin Manager feature. It works with most (but not all)
+ combinations of operating systems and current Java runtime
+ environments.</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="add-favorites">
+ <para>How do I add and remove directories to the list of
+ <quote>favorites</quote> in jEdit's File System
+ Browser?</para>
+ </question>
+
+ <answer>
+ <para>To add a directory to the list of favorites, navigate
+ so that the directory is at the top of the tree displayed in
+ the File System Browser window, click the
+ <guimenuitem>Favorites</guimenuitem> button, and select
+ <guimenuitem>Add to favorites</guimenuitem> from the
+ resulting menu. To delete a directory from the favorites
+ list, use the same menu to go to the favorites list.
+ Right-click on the directory to be deleted and select
+ <guimenuitem>Delete</guimenuitem>. This operation will
+ delete the directory from the list of favorites but will
+ have no effect on the directory itself.</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="associate-files">
+ <para>How do I associate particular file types with jEdit so
+ I can open them by double clicking their icons in Windows
+ Explorer?</para>
+ </question>
+
+ <answer>
+ <para>You associate the file extension with
+ <userinput><replaceable><jEdit installation
+ directory></replaceable>\jedit.exe</userinput>.
+ This can be done from the <guimenuitem>File Types</guimenuitem>
+ tab in the Windows Explorer's <guimenuitem>Tools</guimenuitem>
+ -> <guimenuitem>Folder options...</guimenuitem> menu.</para>
+
+ <para>The EXE-installer for Windows includes a
+ custom context menu handler. It will provide menu items for
+ using jEdit any time you right-click on a file icon in
+ Windows Explorer. This feature does
+ not interfere with any existing file associations.</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="open-restrict-dir">
+ <para>Can I restrict jEdit to opening and saving files in a
+ single directory without changing file permissions?</para>
+ </question>
+
+ <answer>
+ <para>The easiest way to get this kind of behavior is to use
+ macros that open the Virtual File Browser to a specific,
+ fixed directory, and then change the default keyboard
+ shortcuts for opening and saving files to run these
+ macros.</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="filename-uc-to-lc">
+ <para>On Windows, how can I change the name of my file from
+ <filename>myfile.txt</filename> to
+ <filename>MyFile.txt</filename>?</para>
+ </question>
+
+ <answer>
+ <para>The Windows native file system deals with file names
+ in a case-insensitive manner, so
+ <filename>myfile.txt</filename> and
+ <filename>MyFile.txt</filename> refer to the same file. As a
+ result, the jEdit file browser treats both spellings
+ identically and does not make a name change. Using our
+ example, the easiest workaround is to rename the file in two
+ steps: first to <filename>_myfile.txt</filename>, then to
+ <filename>MyFile.txt</filename>.</para>
+ </answer>
+ </qandaentry>
+ </qandadiv>
+
+ <!--*********************************************************** Text -->
+
+ <qandadiv id="text-format">
+ <title>Formatting text</title>
+
+ <qandaentry>
+ <question id="text-indent">
+ <para>How do I indent or unindent selections of text?</para>
+ </question>
+
+ <answer>
+ <para>Using jEdit's default configuration, you can indent a
+ selection of text by pressing <keycombo action="simul">
+ <keycap>ALT</keycap>
+
+ <keycap>RIGHT</keycap>
+ </keycombo>. Unindent a selection by pressing <keycombo
+ action="simul">
+ <keycap>ALT</keycap>
+
+ <keycap>LEFT</keycap>
+ </keycombo>.</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="text-line-numbers">
+ <para>Is there a way to automatically view line numbers when
+ a buffer is opened?</para>
+ </question>
+
+ <answer>
+ <para><guimenuitem>Select Utilities>Global
+ Options</guimenuitem>, and in the
+ <guimenuitem>Gutter</guimenuitem> option pane select the
+ <guimenuitem>Line Numbering</guimenuitem> check box.</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="smart-quote">
+ <para>Does jEdit know smart quotes? In .tex files I would
+ like to use <userinput>``</userinput> or
+ <userinput>''</userinput> instead of
+ <userinput>"</userinput>.</para>
+ </question>
+
+ <answer>
+ <para>While jEdit can display any character provided by a
+ supported encoding set and enter any character supported by
+ a keyboard driver, it does not have the ability to insert
+ <quote>smart quote</quote> pairs automatically as some word
+ processors do. This would require a BeanShell macro to
+ modify quoted text.</para>
+
+ <para>The Accents and CharacterMap plugins can also help you
+ type international characters.</para>
+
+ <para>You also have the option of using a TeX macro (or, in
+ LaTeX, a pair of environment tags) to have the standard
+ double quotation mark <userinput>"</userinput> transformed
+ into the appropriate opening or closing smart quotes without
+ the need to keep track of when quoted text opens or
+ closes.</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="text-softwrap">
+ <para>Does jEdit have a <quote>soft</quote> wrap text
+ mode?</para>
+ </question>
+
+ <answer>
+ <para>jEdit's 4.3's soft wrap mode, and especially its wrap
+ to margin=0, is one of its many features that just works
+ better than it does in most other editing environments. Soft
+ Wrap with margin=0 was unavailable in jEdit 4.2, but users
+ of 4.1 will remember it well. When you set SOFT WRAP with a
+ margin=0, you don't need to use the horizontal scroller
+ anymore. It's just as simple as that.</para>
+
+ <para>jEdit wrap capability can be activated for a specific
+ buffer, specific editing modes, or for all documents by
+ default. In prior versions, both the text wrap feature and
+ the <guimenuitem>Edit>Text>Format
+ Paragraph</guimenuitem> command insert <quote>hard</quote>
+ end of line characters. This <quote>hard wrap</quote>
+ feature remains available as an option for buffers and
+ editing modes.</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="text-display-spaces">
+ <para>The display of spaces as a character in the editor is
+ annoying. How can I disable those small square boxes?</para>
+ </question>
+
+ <answer>
+ <para>This is controlled by the WhiteSpace plugin. To change
+ your settings to disable display of whitespace characters,
+ select <guimenuitem>Utilities>Global
+ Options</guimenuitem>, then select <guimenuitem>Plugin
+ options>WhiteSpace</guimenuitem>. You can separately
+ configure the display of spaces, tabs, and other whitespace
+ characters.</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="text-i18n">
+ <para>Does jEdit support i18n?</para>
+ </question>
+
+ <answer>
+ <para>When editing text documents, jEdit supports any
+ available encoding scheme, and can open files with a
+ specified encoding other than the default encoding of your
+ operating system using the
+ <guimenu>Commands</guimenu>><guisubmenu>Encoding
+ </guisubmenu> from the File System Browser.</para>
+
+ <para>With respect to menu labels, message strings and other
+ GUI elements, the jEdit project team currently does not have
+ the resources to maintain multiple property sets in
+ languages other than English, particularly since the
+ development effort is continuing at a rapid pace. There has
+ not been great demand for this in any event. This may be
+ because jEdit is primarily a tool for programmers, and the
+ use of English as a common first or second language is
+ widespread in the global programming community. This
+ decision may be reconsidered when the application has
+ further matured and if more individuals express a
+ willingness to be involved in translation work.</para>
+ </answer>
+ </qandaentry>
+ </qandadiv>
+
+ <!--********************************************************* Source -->
+
+ <qandadiv id="source-compile">
+ <title>Compiling source code</title>
+
+ <qandaentry>
+ <question id="compile-java">
+ <para>How do I compile my Java source in JEdit?</para>
+ </question>
+
+ <answer>
+ <para>There are a number of plugins that you can use to
+ compile Java source code. You can run a Java compiler on the
+ command line in the <quote>System</quote> shell of the
+ <application>Console</application> plugin. If you are using
+ the JCompiler plugin, you will have a
+ <quote>JCompiler</quote> shell in the
+ <application>Console</application> plugin, and you can run
+ the <userinput>compile</userinput> command for the current
+ file, or the <userinput>compilepkg</userinput> command on
+ all of the current directory's source code files. You can
+ also use the <quote>Ant</quote> commandos from the
+ <application>Console</application> plugin or the
+ <application>AntFarm</application> plugin to run complex
+ builds on a project of source code files, using a
+ <filename>build.xml</filename> file to specify build
+ commands and dependencies.</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="source-new-editmode">
+ <para>How do I create a new edit mode?</para>
+ </question>
+
+ <answer>
+ <para>Take a look at the <quote>Writing Edit Modes</quote>
+ section of the User's Guide. Basically, you have to write an
+ XML file containing data on the mode's file extensions and
+ buffer and syntax highlighting properties, then add
+ information about the new mode file to a second XML file
+ containing a catalog of modes.</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="source-docbook">
+ <para>Does jEdit support DocBook tags?</para>
+ </question>
+
+ <answer>
+ <para>The application contains editing modes for both SGML
+ and XML. Using jEdit abbreviations, you can quickly insert
+ commonly-typed tags with a couple of keystroke. There are a
+ number of abbreviations in the XML and SGML modes that
+ create pairs of DocBook tags on the fly.</para>
+
+ <para>You can get validation, tree-browsing, auto-complete,
+ and auto-closing tags with the XML plugin, a very advanced
+ XML editing tool.</para>
+
+ <para>With whe XInsert or Template plugin you can create
+ multi-layered DocBook elements.</para>
+
+ <para>There are other macros targeting DocBook available
+ from the <ulink url="http://community.jedit.org">jEdit
+ Community</ulink> web site that you can use or adapt for
+ your own purposes.</para>
+ </answer>
+ </qandaentry>
+ </qandadiv>
+
+ <!--******************************************************* Settings -->
+
+ <qandadiv id="emacs-tricks">
+ <title>Tips for Emacs users</title>
+
+ <para>For more emacs help, check out <ulink
+ url="http://www.clapper.org/software/jedit/">this site</ulink> for
+ more emacs macros.</para>
+
+ <qandaentry>
+ <question id="settings-emacstab">
+ <para>Can I have an emacs style tab key (tab anywhere in a
+ line re-indents it)?</para>
+ </question>
+
+ <answer>
+ <para>Yes. You can do this by rebinding the
+ <keycode>tab</keycode> key to <command>Indent Selected
+ Lines</command> in the <guimenuitem>Global
+ Options</guimenuitem>.</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="settings-emacsctrle">
+ <para>How do I map Ctrl-E to go to the end of the
+ line?</para>
+ </question>
+
+ <answer>
+ <para>jEdit has it set up as a 2-key shortcut. In order to
+ make Ctrl-E a one-key shortcut again, you first have to
+ redefine all of the Ctrl-E prefix shortcuts to mean
+ something else.</para>
+
+ <para><literal>jedit_keys.props</literal> shows you all of
+ the current keyboard bindings. As you can see, Ctrl-e is
+ used for many things in jEdit. If you want to redefine it to
+ be a single-key shortcut, first thing you need to do is
+ decide on another Ctrl-key to use as a prefix, to redefine
+ jEdit's fold features. I recommend using Ctrl-Q as the
+ prefix, and if you want to use Ctrl-Q to quit, you have to
+ hit Ctrl-Q twice. Cut and paste the below shortcuts into
+ your own properties file.</para>
+
+ <programlisting>
+# emacs end of line
+end.shortcut2=C+e
+# Ctrl-Q twice to quit
+exit.shortcut=C+q C+q
+# C+q is our new C+e prefix
+#{{{ C+q C+X
+
+# Unused: f, h, q, y
+copy-append.shortcut=C+q C+a
+search-in-open-buffers.shortcut=C+q C+b
+range-comment.shortcut=C+q C+c
+search-in-directory.shortcut=C+q C+d
+replace-and-find-next.shortcut=C+q C+g
+ignore-case.shortcut=C+q C+i
+scroll-to-current-line.shortcut=C+q C+j
+line-comment.shortcut=C+q C+k
+select-line-range.shortcut=C+q C+l
+add-marker.shortcut=C+q C+m
+center-caret.shortcut=C+q C+n
+open-path.shortcut=C+q C+o
+vertical-paste.shortcut=C+q C+p
+replace-in-selection.shortcut=C+q C+r
+save-all.shortcut=C+q C+s
+toggle-line-numbers.shortcut=C+q C+t
+cut-append.shortcut=C+q C+u
+paste-previous.shortcut=C+q C+v
+close-all.shortcut=C+q C+w
+regexp.shortcut=C+q C+x
+paste-deleted.shortcut=C+q C+y
+redo.shortcut=C+q C+z
+#}}}
+
+#{{{ C+q C+non-alpha
+left-docking-area.shortcut=C+q C+LEFT
+top-docking-area.shortcut=C+q C+UP
+right-docking-area.shortcut=C+q C+RIGHT
+bottom-docking-area.shortcut=C+q C+DOWN
+
+prev-marker.shortcut=C+q C+COMMA
+next-marker.shortcut=C+q C+PERIOD
+prev-bracket.shortcut=C+q C+OPEN_BRACKET
+next-bracket.shortcut=C+q C+CLOSE_BRACKET
+close-docking-area.shortcut=C+q C+BACK_QUOTE
+#}}}
+
+#{{{ C+q X
+# Unused: b e g h j k m o q t y z
+add-explicit-fold.shortcut=C+q a
+collapse-all-folds.shortcut=C+q c
+delete-paragraph.shortcut=C+q d
+format-paragraph.shortcut=C+q f
+find-previous.shortcut=C+q g
+invert-selection.shortcut=C+q i
+select-line.shortcut=C+q l
+narrow-to-fold.shortcut=C+q n n
+narrow-to-selection.shortcut=C+q n s
+select-paragraph.shortcut=C+q p
+remove-trailing-ws.shortcut=C+q r
+select-fold.shortcut=C+q s
+insert-literal.shortcut=C+q v
+select-word.shortcut=C+q w
+parent-fold.shortcut=C+q u
+expand-all-folds.shortcut=C+q x
+#}}}
+</programlisting>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="emacs-ctrl-k">
+ <para>What about ctrl-K?</para>
+ </question>
+
+ <answer>
+ <para>Check out <literal>macros/Emacs_Ctrl_K.bsh</literal>.
+ Bind it to Ctrl-k from the shortcuts option pane.</para>
+ </answer>
+ </qandaentry>
+ </qandadiv>
+
+ <qandadiv id="customize-other">
+ <title>Other Settings and Options</title>
+
+ <qandaentry>
+ <question id="settings-change-font">
+ <para>How can I change the font used for menu labels and
+ other elements of jEdit's user interface?</para>
+ </question>
+
+ <answer>
+ <para>Select
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem>, then the
+ <guimenuitem>Appearance</guimenuitem> option pane. When you
+ select the <quote>Metal</quote> look and feel you can also
+ select the fonts used for various displayed items.</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="settings-add-classpath">
+ <para>I want to add a directory to the classpath. I did this
+ in the standalone BeanShell with ease by using the
+ <classname>addClassPath(String)</classname> method. but this
+ doesn't work in a macro. How could I manage the classpath in
+ jEdit?</para>
+ </question>
+
+ <answer>
+ <para>The implementation of BeanShell used in jEdit does not
+ use BeanShell's class loader. The script method contained in
+ loadJarClasses.bsh (found in the Downloads section of <ulink
+ url="http://community.jedit.org">jEdit Community</ulink>)
+ should work if you know the path to a specific class file or
+ class archive.</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="settings-unlisted">
+ <para>Are there any hidden features?</para>
+ </question>
+
+ <answer>
+ <para>Yes. You can access them by binding a shortcut to the
+ action in question. You will find a complete list of
+ available commands under the
+ <guimenuitem>Shortcuts</guimenuitem> area in the
+ <guimenuitem>Global Options</guimenuitem>.</para>
+ </answer>
+ </qandaentry>
+ </qandadiv>
+ </qandaset>
+</sect1>
diff --git a/jEdit/doc/FAQ/faq.xml b/jEdit/doc/FAQ/faq.xml
index a7df9d4..c8f398b 100644
--- a/jEdit/doc/FAQ/faq.xml
+++ b/jEdit/doc/FAQ/faq.xml
@@ -1,189 +1,189 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- jEdit buffer-local properties: -->
-<!-- :indentSize=1 -->
-<!-- -->
-<!-- jEdit FAQ -->
-<!-- Copyright (C) 2001-2002 John Gellene -->
-<!-- $Id: faq.xml 10448 2007-08-29 06:09:55Z ezust $
--->
-<!-- Changes required for posting on jEdit Community: -->
-<!-- Title should be <h2> without class; -->
-<!-- all <h1> headings should be changed to <h2> -->
-<!-- Command line for processing: -->
-<!-- -->
-<!-- xsltproc -catalogs -output .\html\ faq.xsl faq.xml -->
-<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
-<!-- Changes required for posting on jEdit Community: -->
-<!-- Title should be <h2> without class; -->
-<!-- all <h1> headings should be changed to <h2> -->
-
-<!ENTITY faq-intro SYSTEM "faq-intro.xml">
-<!ENTITY faq-general SYSTEM "faq-general.xml">
-<!ENTITY faq-install SYSTEM "faq-install.xml">
-<!ENTITY faq-use SYSTEM "faq-use.xml">
-<!ENTITY faq-macros SYSTEM "faq-macros.xml">
-<!ENTITY faq-plugins SYSTEM "faq-plugins.xml">
-<!ENTITY faq-problems SYSTEM "faq-problems.xml">
-<!ENTITY faq-contrib SYSTEM "faq-contrib.xml">
-<!ENTITY faq-legal SYSTEM "faq-legal.xml">
-]>
-<article class="faq" id="faq">
- <articleinfo>
- <author>
- <firstname>John</firstname>
-
- <surname>Gellene</surname>
-
- <affiliation>
- <address><email>jgellene at nyc.rr.com</email></address>
- </affiliation>
- </author>
-
- <author>
- <firstname>Kris</firstname>
-
- <surname>Kopicki</surname>
-
- <affiliation>
- <address><email>krisko at users.sourceforge.net</email></address>
- </affiliation>
- </author>
-
- <author>
- <firstname>Alan</firstname>
-
- <surname>Ezust</surname>
-
- <affiliation>
- <address><email>ezust at users.sourceforge.net</email></address>
- </affiliation>
- </author>
-
- <copyright>
- <year>2002</year>
-
- <holder>John Gellene</holder>
- </copyright>
-
- <copyright>
- <year>2007</year>
-
- <holder>Alan Ezust</holder>
- </copyright>
-
- <legalnotice>
- <title>Legal Notice</title>
-
- <para>Permission is granted to copy, distribute and/or modify this
- document under the terms of the GNU Free Documentation License,
- Version 1.1 or any later version published by the Free Software
- Foundation; with no <quote>Invariant Sections</quote>,
- <quote>Front-Cover Texts</quote> or <quote>Back-Cover Texts</quote>,
- each as defined in the license. A copy of the license is contained
- in the file <filename>COPYING.DOC.txt</filename> included with
- jEdit.</para>
- </legalnotice>
-
- <title>jEdit Frequently Asked Questions</title>
-
- <revhistory>
- <!-- <revision>
- <revnumber>0.1</revnumber>
- <date>Sept. 23, 2001</date>
- <revremark>Initial draft.</revremark>
- </revision>
- <revision>
- <revnumber>0.2</revnumber>
- <date>Sept. 25, 2001</date>
- <revremark>Sections 1-3 prepared.</revremark>
- </revision>
- <revision>
- <revnumber>0.3</revnumber>
- <date>Sept. 27, 2001</date>
- <revremark>Section 4 prepared.</revremark>
- </revision>
- <revision>
- <revnumber>0.4</revnumber>
- <date>Oct. 16, 2001</date>
- <revremark>Sections 1-4 completed.</revremark>
- </revision>
- <revision>
- <revnumber>0.5</revnumber>
- <date>Oct. 17, 2001</date>
- <revremark>Sections 1-5 completed.</revremark>
- </revision>
-
- <revision>
- <revnumber>0.6</revnumber>
- <date>Oct. 31, 2001</date>
- <revremark>Sections 1-5 completed; section 6 begun.</revremark>
- </revision>
- <revision>
- <revnumber>0.7</revnumber>
- <date>Jan. 15, 2002</date>
- <revremark>Inclusion of material from jEdit Community
- Interactive FAQ</revremark>
- </revision>
--->
-
- <revision>
- <revnumber>0.8</revnumber>
-
- <date>Feb. 17, 2002</date>
-
- <revremark>Additional revisions for jEdit 4.0
- release</revremark>
- </revision>
-
- <revision>
- <revnumber>0.9</revnumber>
-
- <date>Feb. 9, 2003</date>
-
- <revremark>Additional revisions for jEdit 4.1
- release</revremark>
- </revision>
-
- <revision>
- <revnumber>1.0</revnumber>
-
- <date>Feb. 18, 2003</date>
-
- <revremark>New format & additions for jEdit 4.1
- release</revremark>
- </revision>
-
- <revision>
- <revnumber>1.1</revnumber>
-
- <date>September 6, 2006</date>
-
- <revremark>Revised for jEdit 4.3 release</revremark>
- </revision>
- </revhistory>
-
- <releaseinfo><emphasis>Note: </emphasis> This draft incorporates some
- material from the Interactive FAQ section of the <ulink
- url="http://community.jedit.org/modules.php?op=modload&name=faq&file=index">jEdit
- Community web site</ulink>.</releaseinfo>
- </articleinfo>
-
- &faq-intro;
-
- &faq-general;
-
- &faq-install;
-
- &faq-use;
-
- &faq-macros;
-
- &faq-plugins;
-
- &faq-problems;
-
- &faq-contrib;
-
- &faq-legal;
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- jEdit buffer-local properties: -->
+<!-- :indentSize=1 -->
+<!-- -->
+<!-- jEdit FAQ -->
+<!-- Copyright (C) 2001-2002 John Gellene -->
+<!-- $Id: faq.xml 17727 2010-05-03 08:10:13Z kerik-sf $
+-->
+<!-- Changes required for posting on jEdit Community: -->
+<!-- Title should be <h2> without class; -->
+<!-- all <h1> headings should be changed to <h2> -->
+<!-- Command line for processing: -->
+<!-- -->
+<!-- xsltproc -catalogs -output .\html\ faq.xsl faq.xml -->
+<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN"
+"http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
+<!-- Changes required for posting on jEdit Community: -->
+<!-- Title should be <h2> without class; -->
+<!-- all <h1> headings should be changed to <h2> -->
+
+<!ENTITY faq-intro SYSTEM "faq-intro.xml">
+<!ENTITY faq-general SYSTEM "faq-general.xml">
+<!ENTITY faq-install SYSTEM "faq-install.xml">
+<!ENTITY faq-use SYSTEM "faq-use.xml">
+<!ENTITY faq-macros SYSTEM "faq-macros.xml">
+<!ENTITY faq-plugins SYSTEM "faq-plugins.xml">
+<!ENTITY faq-problems SYSTEM "faq-problems.xml">
+<!ENTITY faq-contrib SYSTEM "faq-contrib.xml">
+<!ENTITY faq-legal SYSTEM "faq-legal.xml">
+]>
+<article class="faq" id="faq">
+ <articleinfo>
+ <author>
+ <firstname>John</firstname>
+
+ <surname>Gellene</surname>
+
+ <affiliation>
+ <address><email>jgellene at nyc.rr.com</email></address>
+ </affiliation>
+ </author>
+
+ <author>
+ <firstname>Kris</firstname>
+
+ <surname>Kopicki</surname>
+
+ <affiliation>
+ <address><email>krisko at users.sourceforge.net</email></address>
+ </affiliation>
+ </author>
+
+ <author>
+ <firstname>Alan</firstname>
+
+ <surname>Ezust</surname>
+
+ <affiliation>
+ <address><email>ezust at users.sourceforge.net</email></address>
+ </affiliation>
+ </author>
+
+ <copyright>
+ <year>2002</year>
+
+ <holder>John Gellene</holder>
+ </copyright>
+
+ <copyright>
+ <year>2007</year>
+
+ <holder>Alan Ezust</holder>
+ </copyright>
+
+ <legalnotice>
+ <title>Legal Notice</title>
+
+ <para>Permission is granted to copy, distribute and/or modify this
+ document under the terms of the GNU Free Documentation License,
+ Version 1.1 or any later version published by the Free Software
+ Foundation; with no <quote>Invariant Sections</quote>,
+ <quote>Front-Cover Texts</quote> or <quote>Back-Cover Texts</quote>,
+ each as defined in the license. A copy of the license is contained
+ in the file <filename>COPYING.DOC.txt</filename> included with
+ jEdit.</para>
+ </legalnotice>
+
+ <title>jEdit Frequently Asked Questions</title>
+
+ <revhistory>
+ <!-- <revision>
+ <revnumber>0.1</revnumber>
+ <date>Sept. 23, 2001</date>
+ <revremark>Initial draft.</revremark>
+ </revision>
+ <revision>
+ <revnumber>0.2</revnumber>
+ <date>Sept. 25, 2001</date>
+ <revremark>Sections 1-3 prepared.</revremark>
+ </revision>
+ <revision>
+ <revnumber>0.3</revnumber>
+ <date>Sept. 27, 2001</date>
+ <revremark>Section 4 prepared.</revremark>
+ </revision>
+ <revision>
+ <revnumber>0.4</revnumber>
+ <date>Oct. 16, 2001</date>
+ <revremark>Sections 1-4 completed.</revremark>
+ </revision>
+ <revision>
+ <revnumber>0.5</revnumber>
+ <date>Oct. 17, 2001</date>
+ <revremark>Sections 1-5 completed.</revremark>
+ </revision>
+
+ <revision>
+ <revnumber>0.6</revnumber>
+ <date>Oct. 31, 2001</date>
+ <revremark>Sections 1-5 completed; section 6 begun.</revremark>
+ </revision>
+ <revision>
+ <revnumber>0.7</revnumber>
+ <date>Jan. 15, 2002</date>
+ <revremark>Inclusion of material from jEdit Community
+ Interactive FAQ</revremark>
+ </revision>
+-->
+
+ <revision>
+ <revnumber>0.8</revnumber>
+
+ <date>Feb. 17, 2002</date>
+
+ <revremark>Additional revisions for jEdit 4.0
+ release</revremark>
+ </revision>
+
+ <revision>
+ <revnumber>0.9</revnumber>
+
+ <date>Feb. 9, 2003</date>
+
+ <revremark>Additional revisions for jEdit 4.1
+ release</revremark>
+ </revision>
+
+ <revision>
+ <revnumber>1.0</revnumber>
+
+ <date>Feb. 18, 2003</date>
+
+ <revremark>New format & additions for jEdit 4.1
+ release</revremark>
+ </revision>
+
+ <revision>
+ <revnumber>1.1</revnumber>
+
+ <date>September 6, 2006</date>
+
+ <revremark>Revised for jEdit 4.3 release</revremark>
+ </revision>
+ </revhistory>
+
+ <releaseinfo><emphasis>Note: </emphasis> This draft incorporates some
+ material from the Interactive FAQ section of the <ulink
+ url="http://community.jedit.org/modules.php?op=modload&name=faq&file=index">jEdit
+ Community web site</ulink>.</releaseinfo>
+ </articleinfo>
+
+ &faq-intro;
+
+ &faq-general;
+
+ &faq-install;
+
+ &faq-use;
+
+ &faq-macros;
+
+ &faq-plugins;
+
+ &faq-problems;
+
+ &faq-contrib;
+
+ &faq-legal;
</article>
\ No newline at end of file
diff --git a/jEdit/doc/README.txt b/jEdit/doc/README.txt
index 9c64b40..ffb0434 100644
--- a/jEdit/doc/README.txt
+++ b/jEdit/doc/README.txt
@@ -1,125 +1,110 @@
-JEDIT 4.3 README
-
-* About jEdit
-
-jEdit is a cross platform programmer's text editor written in Java.
-
-jEdit 4.3 requires Java 2 version 1.5 or later.
-It will not run with earlier versions.
-
-jEdit comes with full online help; to read it, select 'jEdit Help' from
-jEdit's 'Help' menu or point your web browser to the file named
-'index.html' in the 'doc/users-guide/' directory of the jEdit
-distribution.
-
-A PDF (Adobe Acrobat) version of the user's guide be downloaded from
-<http://www.jedit.org>.
-
-A list of people who contributed to jEdit, either by submitting code or
-edit modes to the core, or writing plugins can be viewed by selecting
-'About jEdit' from jEdit's 'Help' menu.
-
-* License
-
-jEdit is free software, and you are welcome to redistribute and modify
-it under the terms of the GNU General Public License (either version 2
-or any later version). See the file COPYING.txt for details.
-
-The jEdit installer is released under a public domain license and may be
-used for any purpose.
-
-A number of plugins are available for jEdit. Unless otherwise stated in
-the plugin's documentation, each of the plugins is licensed for use and
-redistribution under the terms of the GNU General Public License (either
-version 2 or any later version, at the user's election).
-
-The user's guide is released under the terms of the GNU Free
-Documentation License, Version 1.1 or any later version published by the
-Free Software Foundation; with no "Invariant Sections", "Front-Cover
-Texts" or "Back-Cover Texts", each as defined in the license. A copy of
-the license can be found in the file COPYING.DOC.txt.
-
-The class libraries shipped with jEdit each have their own license; see
-the 'Libraries' section below.
-
-* jEdit on the Internet
-
-The jEdit homepage, located at <http://www.jedit.org> contains the
-latest version of jEdit, along with plugin downloads. There is also a
-user-oriented site, <http://community.jedit.org>. Check it out.
-
-If you would like to report a bug, first take a look at the 'jEdit
-Frequently Asked Questions' document, accessible from either jEdit's
-online help or by pointing your web browser to the file named
-'index.html' in the 'doc/FAQ/' directory of the jEdit distribution.
-
-If the FAQ doesn't answer your question, report a bug with our bug
-tracker, located at <http://www.jedit.org/?page=feedback>.
-
-When writing a bug report, please try to be as specific as possible. You
-should specify your jEdit version, Java version, operating system, any
-relevant output from the activity log, and an e-mail address, in case we
-need further information from you to fix the bug.
-
-The 'Make Bug Report' macro included with jEdit, which can be found in
-the 'Misc' submenu of the 'Macros' menu, might be useful when preparing
-a bug report.
-
-If you would like to discuss jEdit and be informed when new versions are
-released, you should subscribe to the mailing lists; see
-<http://www.jedit.org/?page=feedback> for details.
-
-If you would like to discuss the BeanShell scripting language, subscribe
-to one of the BeanShell mailing lists by visiting
-<http://www.beanshell.org/contact.html>.
-
-Finally, if you want to chat about jEdit with other users and
-developers, come join the #jedit channel on irc.freenode.net. You
-can use the IRC plugin, available from <http://plugins.jedit.org>, for
-this purpose.
-
-* Libraries
-
-jEdit bundles the following libraries:
-
-- AElfred XML parser by Microstar corporation.
- This class is also DEPRECATED in favor of JDK 1.5's XmlReaderFactory class,
- or the supplied XMLUtilities helper classes.
-
- This class library is released under its own, non-GPL license,
- which reads as follows:
-
- "AElfred is free for both commercial and non-commercial use and
- redistribution, provided that Microstar's copyright and disclaimer are
- retained intact. You are free to modify AElfred for your own use and
- to redistribute AElfred with your modifications, provided that the
- modifications are clearly documented."
-
- The AElfred web site is <http://www.microstar.com>.
-
-- BeanShell scripting language, by Pat Niemeyer. jEdit bundles BeanShell
- version 2.0b4 with the bsh.util and bsh.classpath packages removed.
-
- BeanShell is released under a dual Sun Public License/GNU LGPL
- license. See the BeanShell homepage for details.
-
- The BeanShell web site is <http://www.beanshell.org>.
-
-- ASM bytecode generation library from Objectweb. This class library is
- released under the 'GNU Lesser General Public License'.
- The ASM homepage can be found at <http://asm.objectweb.org/>.
- The library is in org/gjt/sp/jedit/bsh/org/objectweb/asm/.
-
-The jEdit installer bundles the following libraries:
-
-- org.apache.excalibur.bzip2 compression library. This library is
- released under the Apache license, which can be found in
- doc/Apache.LICENSE.txt.
-
- The org.apache.excalibur.bzip2 web site is
- <http://jakarta.apache.org/avalon/excalibur/bzip2/>.
-
-- com.ice.tar, by Tim Endres. This code is in the public domain.
-
- The com.ice.tar web site is <http://www.trustice.com/java/tar/>.
-
+jEdit README
+
+* About jEdit
+
+jEdit is a cross platform programmer's text editor written in Java.
+
+jEdit 4.4 requires Java 2 version 1.6 or later.
+It will not run with earlier versions.
+
+jEdit comes with full online help; to read it, select 'jEdit Help' from
+jEdit's 'Help' menu or point your web browser to the file named
+'index.html' in the 'doc/users-guide/' directory of the jEdit
+distribution.
+
+A PDF (Adobe Acrobat) version of the user's guide be downloaded from
+<http://www.jedit.org>.
+
+A list of people who contributed to jEdit, either by submitting code or
+edit modes to the core, or writing plugins can be viewed by selecting
+'About jEdit' from jEdit's 'Help' menu.
+
+* License
+
+jEdit is free software, and you are welcome to redistribute and modify
+it under the terms of the GNU General Public License (either version 2
+or any later version). See the file COPYING.txt for details.
+
+The jEdit installer is released under a public domain license and may be
+used for any purpose.
+
+A number of plugins are available for jEdit. Unless otherwise stated in
+the plugin's documentation, each of the plugins is licensed for use and
+redistribution under the terms of the GNU General Public License (either
+version 2 or any later version, at the user's election).
+
+The user's guide is released under the terms of the GNU Free
+Documentation License, Version 1.1 or any later version published by the
+Free Software Foundation; with no "Invariant Sections", "Front-Cover
+Texts" or "Back-Cover Texts", each as defined in the license. A copy of
+the license can be found in the file COPYING.DOC.txt.
+
+The class libraries shipped with jEdit each have their own license; see
+the 'Libraries' section below.
+
+* jEdit on the Internet
+
+The jEdit homepage, located at <http://www.jedit.org> contains the
+latest version of jEdit, along with plugin downloads. There is also a
+user-oriented site, <http://community.jedit.org>. Check it out.
+
+If you would like to report a bug, first take a look at the 'jEdit
+Frequently Asked Questions' document, accessible from either jEdit's
+online help or by pointing your web browser to the file named
+'index.html' in the 'doc/FAQ/' directory of the jEdit distribution.
+
+If the FAQ doesn't answer your question, report a bug with our bug
+tracker, located at <http://www.jedit.org/?page=feedback>.
+
+When writing a bug report, please try to be as specific as possible. You
+should specify your jEdit version, Java version, operating system, any
+relevant output from the activity log, and an e-mail address, in case we
+need further information from you to fix the bug.
+
+The 'Make Bug Report' macro included with jEdit, which can be found in
+the 'Misc' submenu of the 'Macros' menu, might be useful when preparing
+a bug report.
+
+If you would like to discuss jEdit and be informed when new versions are
+released, you should subscribe to the mailing lists; see
+<http://www.jedit.org/?page=feedback> for details.
+
+If you would like to discuss the BeanShell scripting language, subscribe
+to one of the BeanShell mailing lists by visiting
+<http://www.beanshell.org/contact.html>.
+
+Finally, if you want to chat about jEdit with other users and
+developers, come join the #jedit channel on irc.freenode.net. You
+can use the IRC plugin, available from <http://plugins.jedit.org>, for
+this purpose.
+
+* Libraries
+
+jEdit bundles the following libraries:
+
+- BeanShell scripting language, by Pat Niemeyer. jEdit bundles BeanShell
+ version 2.0b4 with the bsh.util and bsh.classpath packages removed.
+
+ BeanShell is released under a dual Sun Public License/GNU LGPL
+ license. See the BeanShell homepage for details.
+
+ The BeanShell web site is <http://www.beanshell.org>.
+
+- ASM bytecode generation library from Objectweb. This class library is
+ released under the 'GNU Lesser General Public License'.
+ The ASM homepage can be found at <http://asm.objectweb.org/>.
+ The library is in org/gjt/sp/jedit/bsh/org/objectweb/asm/.
+
+The jEdit installer bundles the following libraries:
+
+- org.apache.excalibur.bzip2 compression library. This library is
+ released under the Apache license, which can be found in
+ doc/Apache.LICENSE.txt.
+
+ The org.apache.excalibur.bzip2 web site is
+ <http://jakarta.apache.org/avalon/excalibur/bzip2/>.
+
+- com.ice.tar, by Tim Endres. This code is in the public domain.
+
+ The com.ice.tar web site is <http://www.trustice.com/java/tar/>.
+
diff --git a/jEdit/doc/TODO.txt b/jEdit/doc/TODO.txt
index 07292ff..d246478 100644
--- a/jEdit/doc/TODO.txt
+++ b/jEdit/doc/TODO.txt
@@ -1,258 +1,195 @@
-[error] ExtensionManager: java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 379
-[error] ExtensionManager: at org.gjt.sp.jedit.Buffer.getLineOfOffset(Buffer.java:892)
-[error] ExtensionManager: at errorlist.DefaultErrorSource$DefaultError.getLineNumber(DefaultErrorSource.java:510)
-[error] ExtensionManager: at errorlist.DefaultErrorSource.findError(DefaultErrorSource.java:330)
-[error] ExtensionManager: at errorlist.DefaultErrorSource.getLineErrors(DefaultErrorSource.java:134)
-[error] ExtensionManager: at errorlist.ErrorHighlight.paintValidLine(ErrorHighlight.java:53)
-[error] ExtensionManager: at org.gjt.sp.jedit.textarea.TextAreaExtension.paintScreenLineRange(TextAreaExtension.java:70)
-[error] ExtensionManager: at org.gjt.sp.jedit.textarea.ExtensionManager.paintScreenLineRange(ExtensionManager.java:146)
-[error] ExtensionManager: at org.gjt.sp.jedit.textarea.ExtensionManager.paintScreenLineRange(ExtensionManager.java:106)
-[error] ExtensionManager: at org.gjt.sp.jedit.textarea.TextAreaPainter.paint(TextAreaPainter.java:699)
-
-[error] ExtensionManager: java.lang.NullPointerException
-[error] ExtensionManager: at org.gjt.sp.jedit.Buffer.markTokens(Buffer.java:2161)
-[error] ExtensionManager: at org.gjt.sp.jedit.textarea.ChunkCache.lineToChunkList(ChunkCache.java:760)
-[error] ExtensionManager: at org.gjt.sp.jedit.textarea.ChunkCache.updateChunksUpTo(ChunkCache.java:635)
-[error] ExtensionManager: at org.gjt.sp.jedit.textarea.ChunkCache.getLineInfo(ChunkCache.java:244)
-[error] ExtensionManager: at org.gjt.sp.jedit.textarea.TextAreaPainter$PaintText.paintValidLine(TextAreaPainter.java:1039)
-[error] ExtensionManager: at org.gjt.sp.jedit.textarea.TextAreaExtension.paintScreenLineRange(TextAreaExtension.java:70)
-[error] ExtensionManager: at org.gjt.sp.jedit.textarea.ExtensionManager.paintScreenLineRange(ExtensionManager.java:146)
-[error] ExtensionManager: at org.gjt.sp.jedit.textarea.ExtensionManager.paintScreenLineRange(ExtensionManager.java:106)
-[error] ExtensionManager: at org.gjt.sp.jedit.textarea.TextAreaPainter.paint(TextAreaPainter.java:699)
-
-
-TO DO
-
-absolute path completion
-
-does not indent properly:
-
-1000 [
- [
- [
- [
- 50000 cons-a-lot
- ] 4 10 make-trash
- ] 4 10 make-trash
- ] 4 10 make-trash 0 swap [ [ + ] when* ] tree-each drop
-] times
-
-Note that this is not a complete to do list. It mostly only lists bugs
-and quirks that I need to fix eventually.
-
-splitting messes up last physical line in the newly created text area
-
-console: cd / repeatedly on windows
-
-ok [error] ExtensionManager: java.lang.NullPointerException
-[error] ExtensionManager: at org.gjt.sp.jedit.textarea.StructureMatcher$Highlight.getOffsets(StructureMatcher.java:181)
-[error] ExtensionManager: at org.gjt.sp.jedit.textarea.StructureMatcher$Highlight.paintHighlight(StructureMatcher.java:207)
-[error] ExtensionManager: at org.gjt.sp.jedit.textarea.StructureMatcher$Highlight.paintValidLine(StructureMatcher.java:147)
-[error] ExtensionManager: at org.gjt.sp.jedit.textarea.TextAreaExtension.paintScreenLineRange(TextAreaExtension.java:70)
-[error] ExtensionManager: at org.gjt.sp.jedit.textarea.ExtensionManager.paintScreenLineRange(ExtensionManager.java:146)
-[error] ExtensionManager: at org.gjt.sp.jedit.textarea.ExtensionManager.paintScreenLineRange(ExtensionManager.java:106)
-[error] ExtensionManager: at org.gjt.sp.jedit.textarea.TextAreaPainter.paint(TextAreaPainter.java:699)
-
-+ text area:
-
- - click&drag breaks fast scroll
- - format: doesn't wrap right if selection starts in the middle of the
- line
- - ruleset importing trick
- - expand fold: try to expand even if already expanded
- - backspace with virtual caret: needs tweaks
- - independent text area component
- - gutter: has a depenency on View to do focus highlight, and Marker
- - text area: depends on view for input handling,
- smart home/end macro record, showing dialog boxes, abbrevs
- - mouse handler: registers
- - text area transfer handler: opening files dependency
- - new file: explicit folding: type {{{: fold marker doesn't appear
- - finish code to hide caret on user input; enter/backspace is a problem
- maybe listen for KeyTyped instead
- - indent folding: fold marker not always updated
- - format: preserve comment chars at start
- - tabs to spaces with rect select
- - input methods
- - remove-marker, select-next/prev-marker/bracket
- - format -- instead of \n\n, what if it has \n \n?
- - DnD still dosn't work as expected when draging from the same buffer,
- but differen text area (for example droping at the position where drag
- was started erases text)- no support for vertical pasting
- - anoying cursor blinking (responsible for this is scrolling option :
- textArea.moveCaretPosition(pos,JEditTextArea.ELECTRIC_SCROLL) in
- dragOver() method)
-
-Ideas: a lot of the code in the jedit text area can be simplified
- for example, i'm not sure we really need the ChunkCache anymore
- just keep the chunks for the currently
- painting line around, to speed up the multiple offsetToX()
- calls that happen during painting
- also, you might want to rip out the text area's
- scrolling code, and put in a JScrollPane
-
-
-+ auto indent:
-
- - ? : do not unindent
- - deep indent
- - Common Lisp &body forms
- - pressing enter: carry over * from prev line in javadoc
- - javadoc indent: if prev line was /* or *, unindent if prev line is
- */
- if(foo)
- while(bar)
- {
- //
- }
- <--- cursor here
- - option to disable electric keys
- - unindentThisAndFollowing
- - indent & syntax tokens
-
-+ vfs browser:
-
- - test keyboard completion with expanded/collapsed tree
- - test keyboard completion with high latency VFS
- - fsb default size
- - don't show 'new directory' in favorites:
- - file system browser column widths are not saved
-
-+ misc:
-
- - kill ring still being reversed
- - jEdit.checkBufferStatus() fucks with split panes
-
- - there is a comment in browser.actions.xml:
- /* NOTE: I do NOT want plugins creating check box menu items
- * in jEdit 4.2! The API is not stable, note the _comp hack...
- * in 4.3 I will finish the full action API refactoring and
- * IS_SELECTED blocks in browser actions will have access to
- * the browser variable just like the CODE block above.
- *
- * Love, Slava */
-
- - option to disable buffer local properties
- - CA+PLUS +: bad
- - jedit -encoding
- - goToBuffer() -- if any parent has zero height or zero width...
- - deferred loading API for macro handlers
- - S+INS, etc in swing controls
- - vfs: a way of running awt requests not all at end
- - wrapped dock buttons broken
-
-+ beanshell:
-
- ; after else if()
- longs not read correctly if prefixed with 0x
-
-+ docs:
-
-- vfs browser changes
-- auto indent
-- save help index
-- document optional dependencies
-- deferred loading mention.
-- addCommandPath()
-- API thread safety
-- add note to documentation about exponential-time regexps
-- document deep indent
-- note about dependencies
-- plugin tutorial:
- - plugin build environment docs
- - auto-created actions
- - link to jEdit devel page
- - quicknotepad class -- links to API docs
- - functions - links to API docs
- - quicknotepad docs
-- plugin tips and techniques:
- - common. properties, using properties for UI strings
- - cutting down on startup time
- - canned dialog boxes in GUIUtilities
- - tools.jar
- - string comparison in MiscUtilities
- - writing a macro handler
- - writing a fold handler
- - OperatingSystem class
- - option groups
- - listening for buffer changes
- - canned controls:
- animated icon, color well button, enhanced dialog,
- font selector, history text field,
- jcheckboxlist, rolloverbutton,
- variablegridlayout
- - displaying a help viewer
- - canned icons
- - vfs implementation
- - running stuff in i/o threads
- - multi-threaded i/o
- - jeditresource: protocol
- - getting line syntax info, textutilities.getTokenAtOffset()
- - text area extensions
- - text area caret & scroll listeners
- - status bar messages & readNextChar()
-- vfs javadoc: invokeAndWait() example for createVFSSession()
-
-check tips of the day
-- help:
- - titles in search are fucked
-- sidebars: need a border or some sort
-
-[error] WorkThread: java.lang.ClassCastException
-[error] WorkThread: at archive.ArchiveVFS.getDirectories(Unknown Source)
-[error] WorkThread: at archive.ArchiveVFS.cacheDirectories(Unknown Source)
-[error] WorkThread: at archive.ArchiveVFS._listDirectory(Unknown Source)
-[error] WorkThread: at org.gjt.sp.jedit.browser.BrowserIORequest.listDirectory(BrowserIORequest.java:159)
-[error] WorkThread: at org.gjt.sp.jedit.browser.BrowserIORequest.run(BrowserIORequest.java:90)
-[error] WorkThread: at org.gjt.sp.util.WorkThread.doRequest(WorkThread.java:194)
-[error] WorkThread: at org.gjt.sp.util.WorkThread.doRequests(WorkThread.java:161)
-[error] WorkThread: at org.gjt.sp.util.WorkThread.run(WorkThread.java:135)
-
-[error] ChunkCache: BUG: skew=1,out.size()=0
-[error] ChunkCache: BUG: skew=1,out.size()=1
-
-- C+d & killring
-- plugin mgr inspection of not-loaded plugins
-- history text field tweak
-
-+ obscure:
-
-- no need to wait for requests after newFile()
-- class loading problems
-- motif l&f: shortcuts in menu items
-- some JLists do not auto-scroll on keystroke
-- how to handle S+0-9?
-- invoking action bar command twice
-- backup time distance setting
-- if A depends on B but A is loaded before B and B breaks, A ends up
- being loaded. Solution: load plugins in order of dependencies?
-
-+ performance:
-
-- 7000 line lisp file: window resize is slow
-- closing lots of files is slow -- esp. with close all dialog box!
-- menu drag: slow
-- bracket matching: no delay for current line match??
-- final optimization for OffsetManager: scan to zero or scan to end
-- do buffer load AWT half immediately after work thread half
-- replace all in a directory could be faster
-- buffer.setMode() slow
-- eliminate redundant scans and events when loading buffer
-- don't repaint whole selection when resizing
-- could make non-soft wrap chunk merge even faster!
-- syntax SPAN::END substitution: String --> char[] --> String
-- is getScreenLineOfOffset() called often?
-- if caret is at the end of a buffer when doing a replace all, a lot of
- repaint() and getLineOfOffset() calls are made
-- optimize for no folding & no soft wrap case:
- - reset() and changed() don't need to scan
- - scroll/physUp/Down() simpler
-- inserting lines repaints whole text area
-- see if getLineOfOffset() can be optimized
-- optimize 1 long line case
-- two repaints in line insert
-- redundant calls to recalculateLastPhysicalLines()/updateScrollBars()
-- redundant updateChunksUpTo() calls
-
-jEdit buffer local properties:
-:wrap=hard:maxLineLen=72:indentSize=2:
+TO DO
+
+Note that this is not a current to do list. It mostly only lists bugs
+and quirks that Slava wanted to fix before he stopped development. All
+of these items should eventually be removed or converted into tracker
+items if they are not out of date.
+
+splitting messes up last physical line in the newly created text area
+
++ text area:
+
+ - click&drag breaks fast scroll
+ - format: doesn't wrap right if selection starts in the middle of the
+ line
+ - ruleset importing trick
+ - expand fold: try to expand even if already expanded
+ - backspace with virtual caret: needs tweaks
+ - independent text area component
+ - gutter: has a depenency on View to do focus highlight, and Marker
+ - text area: depends on view for input handling,
+ smart home/end macro record, showing dialog boxes, abbrevs
+ - mouse handler: registers
+ - text area transfer handler: opening files dependency
+ - new file: explicit folding: type {{{: fold marker doesn't appear
+ - finish code to hide caret on user input; enter/backspace is a problem
+ maybe listen for KeyTyped instead
+ - indent folding: fold marker not always updated
+ - format: preserve comment chars at start
+ - tabs to spaces with rect select
+ - input methods
+ - remove-marker, select-next/prev-marker/bracket
+ - format -- instead of \n\n, what if it has \n \n?
+ - DnD still dosn't work as expected when draging from the same buffer,
+ but differen text area (for example droping at the position where drag
+ was started erases text)- no support for vertical pasting
+ - anoying cursor blinking (responsible for this is scrolling option :
+ textArea.moveCaretPosition(pos,JEditTextArea.ELECTRIC_SCROLL) in
+ dragOver() method)
+
+Ideas: a lot of the code in the jedit text area can be simplified
+ for example, i'm not sure we really need the ChunkCache anymore
+ just keep the chunks for the currently
+ painting line around, to speed up the multiple offsetToX()
+ calls that happen during painting
+ also, you might want to rip out the text area's
+ scrolling code, and put in a JScrollPane
+
+
++ auto indent:
+
+ - ? : do not unindent
+ - deep indent
+ - Common Lisp &body forms
+ - pressing enter: carry over * from prev line in javadoc
+ - javadoc indent: if prev line was /* or *, unindent if prev line is
+ */
+ if(foo)
+ while(bar)
+ {
+ //
+ }
+ <--- cursor here
+ - option to disable electric keys
+ - unindentThisAndFollowing
+ - indent & syntax tokens
+
++ vfs browser:
+
+ - test keyboard completion with expanded/collapsed tree
+ - test keyboard completion with high latency VFS
+ - fsb default size
+ - file system browser column widths are not saved
+
++ misc:
+
+ - kill ring still being reversed
+ - jEdit.checkBufferStatus() fucks with split panes
+
+ - there is a comment in browser.actions.xml:
+ /* NOTE: I do NOT want plugins creating check box menu items
+ * in jEdit 4.2! The API is not stable, note the _comp hack...
+ * in 4.3 I will finish the full action API refactoring and
+ * IS_SELECTED blocks in browser actions will have access to
+ * the browser variable just like the CODE block above.
+ *
+ * Love, Slava */
+
+ - option to disable buffer local properties
+ - CA+PLUS +: bad
+ - goToBuffer() -- if any parent has zero height or zero width...
+ - deferred loading API for macro handlers
+ - S+INS, etc in swing controls
+ - vfs: a way of running awt requests not all at end
+ - wrapped dock buttons broken
+
++ beanshell:
+
+ ; after else if()
+ longs not read correctly if prefixed with 0x
+
++ docs:
+
+- vfs browser changes
+- auto indent
+- save help index
+- document optional dependencies
+- deferred loading mention.
+- addCommandPath()
+- API thread safety
+- add note to documentation about exponential-time regexps
+- document deep indent
+- note about dependencies
+- plugin tutorial:
+ - link to jEdit devel page
+ - quicknotepad class -- links to API docs
+ - functions - links to API docs
+ - quicknotepad docs
+- plugin tips and techniques:
+ - common. properties, using properties for UI strings
+ - cutting down on startup time
+ - canned dialog boxes in GUIUtilities
+ - tools.jar
+ - string comparison in MiscUtilities
+ - writing a macro handler
+ - writing a fold handler
+ - OperatingSystem class
+ - option groups
+ - listening for buffer changes
+ - canned controls:
+ animated icon, color well button, enhanced dialog,
+ font selector, history text field,
+ jcheckboxlist, rolloverbutton,
+ variablegridlayout
+ - displaying a help viewer
+ - canned icons
+ - vfs implementation
+ - running stuff in i/o threads
+ - multi-threaded i/o
+ - jeditresource: protocol
+ - getting line syntax info, textutilities.getTokenAtOffset()
+ - text area extensions
+ - text area caret & scroll listeners
+ - status bar messages & readNextChar()
+- vfs javadoc: invokeAndWait() example for createVFSSession()
+
+check tips of the day
+- help:
+ - titles in search are fucked
+- sidebars: need a border or some sort
+
+- C+d & killring
+- plugin mgr inspection of not-loaded plugins
+- history text field tweak
+
++ obscure:
+
+- no need to wait for requests after newFile()
+- class loading problems
+- motif l&f: shortcuts in menu items
+- some JLists do not auto-scroll on keystroke
+- how to handle S+0-9?
+- invoking action bar command twice
+- backup time distance setting
+- if A depends on B but A is loaded before B and B breaks, A ends up
+ being loaded. Solution: load plugins in order of dependencies?
+
++ performance:
+
+- 7000 line lisp file: window resize is slow
+- closing lots of files is slow -- esp. with close all dialog box!
+- menu drag: slow
+- bracket matching: no delay for current line match??
+- final optimization for OffsetManager: scan to zero or scan to end
+- do buffer load AWT half immediately after work thread half
+- replace all in a directory could be faster
+- buffer.setMode() slow
+- eliminate redundant scans and events when loading buffer
+- don't repaint whole selection when resizing
+- could make non-soft wrap chunk merge even faster!
+- syntax SPAN::END substitution: String --> char[] --> String
+- is getScreenLineOfOffset() called often?
+- if caret is at the end of a buffer when doing a replace all, a lot of
+ repaint() and getLineOfOffset() calls are made
+- optimize for no folding & no soft wrap case:
+ - reset() and changed() don't need to scan
+ - scroll/physUp/Down() simpler
+- inserting lines repaints whole text area
+- see if getLineOfOffset() can be optimized
+- optimize 1 long line case
+- two repaints in line insert
+- redundant calls to recalculateLastPhysicalLines()/updateScrollBars()
+- redundant updateChunksUpTo() calls
+
+jEdit buffer local properties:
+:wrap=hard:maxLineLen=72:indentSize=2:
diff --git a/jEdit/doc/jeditfo.xsl b/jEdit/doc/jeditfo.xsl
index fde4716..9d4c5af 100644
--- a/jEdit/doc/jeditfo.xsl
+++ b/jEdit/doc/jeditfo.xsl
@@ -1,57 +1,57 @@
-<?xml version='1.0'?>
-
-<!-- :folding=explicit:collapseFolds=1: -->
-
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- version='1.0'>
-
-<xsl:import href="docbook-wrapper-fo.xsl"/>
-
-<xsl:template match="guibutton">
- <xsl:call-template name="inline.boldseq"/>
-</xsl:template>
-
-<xsl:template match="guiicon">
- <xsl:call-template name="inline.boldseq"/>
-</xsl:template>
-
-<xsl:template match="guilabel">
- <xsl:call-template name="inline.boldseq"/>
-</xsl:template>
-
-<xsl:template match="guimenu">
- <xsl:call-template name="inline.boldseq"/>
-</xsl:template>
-
-<xsl:template match="guimenuitem">
- <xsl:call-template name="inline.boldseq"/>
-</xsl:template>
-
-<xsl:template match="guisubmenu">
- <xsl:call-template name="inline.boldseq"/>
-</xsl:template>
-
-<xsl:template match="keycap">
- <xsl:call-template name="inline.monoseq"/>
-</xsl:template>
-
-<xsl:template match="property">
- <xsl:call-template name="inline.monoseq"/>
-</xsl:template>
-
-<xsl:param name="funcsynopsis.style">ansi</xsl:param>
-
-<xsl:param name="generate.toc">
-book toc
-part nop
-</xsl:param>
-
-<xsl:param name="fop.extensions" select="1"></xsl:param>
-
-<xsl:param name="ulink.show" select="0"></xsl:param>
-<xsl:param name="ulink.footnotes" select="1"></xsl:param>
-
-<xsl:param name="alignment">left</xsl:param>
-<xsl:param name="hyphenate">false</xsl:param>
-
-</xsl:stylesheet>
+<?xml version='1.0'?>
+
+<!-- :folding=explicit:collapseFolds=1: -->
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version='1.0'>
+
+<xsl:import href="docbook-wrapper-fo.xsl"/>
+
+<xsl:template match="guibutton">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="guiicon">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="guilabel">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="guimenu">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="guimenuitem">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="guisubmenu">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="keycap">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="property">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:param name="funcsynopsis.style">ansi</xsl:param>
+
+<xsl:param name="generate.toc">
+book toc
+part nop
+</xsl:param>
+
+<xsl:param name="fop1.extensions" select="1"></xsl:param>
+
+<xsl:param name="ulink.show" select="0"></xsl:param>
+<xsl:param name="ulink.footnotes" select="1"></xsl:param>
+
+<xsl:param name="alignment">left</xsl:param>
+<xsl:param name="hyphenate">false</xsl:param>
+
+</xsl:stylesheet>
diff --git a/jEdit/doc/jedithtml.xsl b/jEdit/doc/jedithtml.xsl
index ee81b9c..4f88ff2 100644
--- a/jEdit/doc/jedithtml.xsl
+++ b/jEdit/doc/jedithtml.xsl
@@ -1,255 +1,255 @@
-<?xml version='1.0'?>
-
-<!-- :folding=explicit:collapseFolds=1: -->
-
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- version='1.0'>
-
-<xsl:import href="docbook-wrapper-html.xsl"/>
-
-<!-- {{{ Various customizations -->
-
-<xsl:template match="guibutton">
- <xsl:call-template name="inline.boldseq"/>
-</xsl:template>
-
-<xsl:template match="guiicon">
- <xsl:call-template name="inline.boldseq"/>
-</xsl:template>
-
-<xsl:template match="guilabel">
- <xsl:call-template name="inline.boldseq"/>
-</xsl:template>
-
-<xsl:template match="guimenu">
- <xsl:call-template name="inline.boldseq"/>
-</xsl:template>
-
-<xsl:template match="guimenuitem">
- <xsl:call-template name="inline.boldseq"/>
-</xsl:template>
-
-<xsl:template match="guisubmenu">
- <xsl:call-template name="inline.boldseq"/>
-</xsl:template>
-
-<xsl:template match="keycap">
- <xsl:call-template name="inline.monoseq"/>
-</xsl:template>
-
-<xsl:template match="property">
- <xsl:call-template name="inline.monoseq"/>
-</xsl:template>
-
-<xsl:param name="use.id.as.filename">1</xsl:param>
-
-<xsl:param name="toc.list.type">ul</xsl:param>
-
-<xsl:param name="funcsynopsis.style">ansi</xsl:param>
-<!-- xsl:template match="void"><xsl:text>();</xsl:text></xsl:template -->
-
-<xsl:param name="chunk.first.sections">1</xsl:param>
-
-<!-- xsl:template match="*" mode="object.title.markup.textonly">
- <xsl:variable name="title">
- <xsl:apply-templates select="." mode="title.markup"/>
- </xsl:variable>
- <xsl:value-of select="$title"/>
-</xsl:template -->
-
-<!-- xsl:template name="header.navigation">
-</xsl:template>
-
-<xsl:template name="footer.navigation">
-</xsl:template -->
-
-<!-- }}} -->
-
-<!-- {{{ Stuff for FAQ -->
-
-<!-- <xsl:param name="generate.qandaset.toc">1</xsl:param> -->
-<!-- <xsl:param name="generate.qandaset.div">1</xsl:param> -->
-
-<!-- xsl:param name="local.l10n.xml" select="document('')"/ -->
-
-<!-- }}} -->
-
-<!-- {{{ Swing HTML control doesn't support “ and ” -->
-<!-- i18n:i18n xmlns:i18n="http://docbook.sourceforge.net/xmlns/l10n/1.0">
-<i18n:l10n language="en">
-
-<i18n:dingbat key="startquote" text="""/>
-<i18n:dingbat key="endquote" text="""/>
-<i18n:dingbat key="nestedstartquote" text="""/>
-<i18n:dingbat key="nestedendquote" text="""/>
-
-<i18n:context name="section-xref">
- <i18n:template name="bridgehead" text="the section called "%t""/>
- <i18n:template name="sect1" text="the section called "%t""/>
- <i18n:template name="sect2" text="the section called "%t""/>
- <i18n:template name="sect3" text="the section called "%t""/>
- <i18n:template name="sect4" text="the section called "%t""/>
- <i18n:template name="sect5" text="the section called "%t""/>
- <i18n:template name="section" text="the section called "%t""/>
- <i18n:template name="simplesect" text="the section called "%t""/>
-</i18n:context>
-
-</i18n:l10n>
-</i18n:i18n -->
-<!-- }}} -->
-
-<!-- {{{ TOC generation -->
-<xsl:template match="/">
- <xsl:call-template name="toc"/>
-</xsl:template>
-
-<xsl:template name="toc">
- <xsl:apply-templates/>
- <xsl:call-template name="write.chunk">
- <xsl:with-param name="filename" select="'toc.xml'"/>
- <xsl:with-param name="method" select="'xml'"/>
- <xsl:with-param name="indent" select="'yes'"/>
- <xsl:with-param name="content">
- <xsl:call-template name="toc.content"/>
- </xsl:with-param>
- </xsl:call-template>
-</xsl:template>
-
-<xsl:template name="toc.content">
- <TOC>
- <xsl:apply-templates select="." mode="my.toc"/>
- </TOC>
-</xsl:template>
-
-<xsl:template match="set" mode="my.toc">
- <ENTRY>
- <xsl:attribute name="HREF">
- <xsl:call-template name="href.target">
- <xsl:with-param name="object" select="."/>
- </xsl:call-template>
- </xsl:attribute>
- <TITLE>
- <xsl:apply-templates mode="title.markup" select="."/>
- </TITLE>
- <xsl:apply-templates select="book" mode="my.toc"/>
- </ENTRY>
-</xsl:template>
-
-<xsl:template match="book" mode="my.toc">
- <ENTRY>
- <xsl:attribute name="HREF">
- <xsl:call-template name="href.target">
- <xsl:with-param name="object" select="."/>
- </xsl:call-template>
- </xsl:attribute>
- <TITLE>
- <xsl:apply-templates mode="title.markup" select="."/>
- </TITLE>
- <xsl:apply-templates select="part|reference|preface|chapter|appendix|article|colophon"
- mode="my.toc"/>
- </ENTRY>
-</xsl:template>
-
-<xsl:template match="part|reference|preface|chapter|appendix|article"
- mode="my.toc">
- <ENTRY>
- <xsl:attribute name="HREF">
- <xsl:call-template name="href.target">
- <xsl:with-param name="object" select="."/>
- </xsl:call-template>
- </xsl:attribute>
- <TITLE>
- <xsl:apply-templates mode="title.markup" select="."/>
- </TITLE>
- <xsl:apply-templates
- select="preface|chapter|appendix|refentry|section|sect1"
- mode="my.toc"/>
- </ENTRY>
-</xsl:template>
-
-<xsl:template match="section" mode="my.toc">
- <ENTRY>
- <xsl:attribute name="HREF">
- <xsl:call-template name="href.target">
- <xsl:with-param name="object" select="."/>
- </xsl:call-template>
- </xsl:attribute>
- <TITLE>
- <xsl:apply-templates mode="title.markup" select="."/>
- </TITLE>
- <xsl:apply-templates select="section" mode="my.toc"/>
- </ENTRY>
-</xsl:template>
-
-<xsl:template match="sect1" mode="my.toc">
- <ENTRY>
- <xsl:attribute name="HREF">
- <xsl:call-template name="href.target">
- <xsl:with-param name="object" select="."/>
- </xsl:call-template>
- </xsl:attribute>
- <TITLE>
- <xsl:apply-templates mode="title.markup" select="."/>
- </TITLE>
- <xsl:apply-templates select="sect2" mode="my.toc"/>
- </ENTRY>
-</xsl:template>
-
-<xsl:template match="sect2" mode="my.toc">
- <ENTRY>
- <xsl:attribute name="HREF">
- <xsl:call-template name="href.target">
- <xsl:with-param name="object" select="."/>
- </xsl:call-template>
- </xsl:attribute>
- <TITLE>
- <xsl:apply-templates mode="title.markup" select="."/>
- </TITLE>
- <xsl:apply-templates select="sect3" mode="my.toc"/>
- </ENTRY>
-</xsl:template>
-
-<xsl:template match="sect3" mode="my.toc">
- <ENTRY>
- <xsl:attribute name="HREF">
- <xsl:call-template name="href.target">
- <xsl:with-param name="object" select="."/>
- </xsl:call-template>
- </xsl:attribute>
- <TITLE>
- <xsl:apply-templates mode="title.markup" select="."/>
- </TITLE>
- <xsl:apply-templates select="sect4" mode="my.toc"/>
- </ENTRY>
-</xsl:template>
-
-<xsl:template match="sect4" mode="my.toc">
- <ENTRY>
- <xsl:attribute name="HREF">
- <xsl:call-template name="href.target">
- <xsl:with-param name="object" select="."/>
- </xsl:call-template>
- </xsl:attribute>
- <TITLE>
- <xsl:apply-templates mode="title.markup" select="."/>
- </TITLE>
- <xsl:apply-templates select="sect5" mode="my.toc"/>
- </ENTRY>
-</xsl:template>
-
-<xsl:template match="sect5|colophon" mode="my.toc">
- <ENTRY>
- <xsl:attribute name="HREF">
- <xsl:call-template name="href.target">
- <xsl:with-param name="object" select="."/>
- </xsl:call-template>
- </xsl:attribute>
- <TITLE>
- <xsl:apply-templates mode="title.markup" select="."/>
- </TITLE>
- </ENTRY>
-</xsl:template>
-
-<!-- }}} -->
-
-</xsl:stylesheet>
+<?xml version='1.0'?>
+
+<!-- :folding=explicit:collapseFolds=1: -->
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version='1.0'>
+
+<xsl:import href="docbook-wrapper-html.xsl"/>
+
+<!-- {{{ Various customizations -->
+
+<xsl:template match="guibutton">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="guiicon">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="guilabel">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="guimenu">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="guimenuitem">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="guisubmenu">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="keycap">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="property">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:param name="use.id.as.filename">1</xsl:param>
+
+<xsl:param name="toc.list.type">ul</xsl:param>
+
+<xsl:param name="funcsynopsis.style">ansi</xsl:param>
+<!-- xsl:template match="void"><xsl:text>();</xsl:text></xsl:template -->
+
+<xsl:param name="chunk.first.sections">1</xsl:param>
+
+<!-- xsl:template match="*" mode="object.title.markup.textonly">
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:variable>
+ <xsl:value-of select="$title"/>
+</xsl:template -->
+
+<!-- xsl:template name="header.navigation">
+</xsl:template>
+
+<xsl:template name="footer.navigation">
+</xsl:template -->
+
+<!-- }}} -->
+
+<!-- {{{ Stuff for FAQ -->
+
+<!-- <xsl:param name="generate.qandaset.toc">1</xsl:param> -->
+<!-- <xsl:param name="generate.qandaset.div">1</xsl:param> -->
+
+<!-- xsl:param name="local.l10n.xml" select="document('')"/ -->
+
+<!-- }}} -->
+
+<!-- {{{ Swing HTML control doesn't support “ and ” -->
+<!-- i18n:i18n xmlns:i18n="http://docbook.sourceforge.net/xmlns/l10n/1.0">
+<i18n:l10n language="en">
+
+<i18n:dingbat key="startquote" text="""/>
+<i18n:dingbat key="endquote" text="""/>
+<i18n:dingbat key="nestedstartquote" text="""/>
+<i18n:dingbat key="nestedendquote" text="""/>
+
+<i18n:context name="section-xref">
+ <i18n:template name="bridgehead" text="the section called "%t""/>
+ <i18n:template name="sect1" text="the section called "%t""/>
+ <i18n:template name="sect2" text="the section called "%t""/>
+ <i18n:template name="sect3" text="the section called "%t""/>
+ <i18n:template name="sect4" text="the section called "%t""/>
+ <i18n:template name="sect5" text="the section called "%t""/>
+ <i18n:template name="section" text="the section called "%t""/>
+ <i18n:template name="simplesect" text="the section called "%t""/>
+</i18n:context>
+
+</i18n:l10n>
+</i18n:i18n -->
+<!-- }}} -->
+
+<!-- {{{ TOC generation -->
+<xsl:template match="/">
+ <xsl:call-template name="toc"/>
+</xsl:template>
+
+<xsl:template name="toc">
+ <xsl:apply-templates/>
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="'toc.xml'"/>
+ <xsl:with-param name="method" select="'xml'"/>
+ <xsl:with-param name="indent" select="'yes'"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="toc.content"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="toc.content">
+ <TOC>
+ <xsl:apply-templates select="." mode="my.toc"/>
+ </TOC>
+</xsl:template>
+
+<xsl:template match="set" mode="my.toc">
+ <ENTRY>
+ <xsl:attribute name="HREF">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <TITLE>
+ <xsl:apply-templates mode="title.markup" select="."/>
+ </TITLE>
+ <xsl:apply-templates select="book" mode="my.toc"/>
+ </ENTRY>
+</xsl:template>
+
+<xsl:template match="book" mode="my.toc">
+ <ENTRY>
+ <xsl:attribute name="HREF">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <TITLE>
+ <xsl:apply-templates mode="title.markup" select="."/>
+ </TITLE>
+ <xsl:apply-templates select="part|reference|preface|chapter|appendix|article|colophon"
+ mode="my.toc"/>
+ </ENTRY>
+</xsl:template>
+
+<xsl:template match="part|reference|preface|chapter|appendix|article"
+ mode="my.toc">
+ <ENTRY>
+ <xsl:attribute name="HREF">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <TITLE>
+ <xsl:apply-templates mode="title.markup" select="."/>
+ </TITLE>
+ <xsl:apply-templates
+ select="preface|chapter|appendix|refentry|section|sect1"
+ mode="my.toc"/>
+ </ENTRY>
+</xsl:template>
+
+<xsl:template match="section" mode="my.toc">
+ <ENTRY>
+ <xsl:attribute name="HREF">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <TITLE>
+ <xsl:apply-templates mode="title.markup" select="."/>
+ </TITLE>
+ <xsl:apply-templates select="section" mode="my.toc"/>
+ </ENTRY>
+</xsl:template>
+
+<xsl:template match="sect1" mode="my.toc">
+ <ENTRY>
+ <xsl:attribute name="HREF">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <TITLE>
+ <xsl:apply-templates mode="title.markup" select="."/>
+ </TITLE>
+ <xsl:apply-templates select="sect2" mode="my.toc"/>
+ </ENTRY>
+</xsl:template>
+
+<xsl:template match="sect2" mode="my.toc">
+ <ENTRY>
+ <xsl:attribute name="HREF">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <TITLE>
+ <xsl:apply-templates mode="title.markup" select="."/>
+ </TITLE>
+ <xsl:apply-templates select="sect3" mode="my.toc"/>
+ </ENTRY>
+</xsl:template>
+
+<xsl:template match="sect3" mode="my.toc">
+ <ENTRY>
+ <xsl:attribute name="HREF">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <TITLE>
+ <xsl:apply-templates mode="title.markup" select="."/>
+ </TITLE>
+ <xsl:apply-templates select="sect4" mode="my.toc"/>
+ </ENTRY>
+</xsl:template>
+
+<xsl:template match="sect4" mode="my.toc">
+ <ENTRY>
+ <xsl:attribute name="HREF">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <TITLE>
+ <xsl:apply-templates mode="title.markup" select="."/>
+ </TITLE>
+ <xsl:apply-templates select="sect5" mode="my.toc"/>
+ </ENTRY>
+</xsl:template>
+
+<xsl:template match="sect5|colophon" mode="my.toc">
+ <ENTRY>
+ <xsl:attribute name="HREF">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <TITLE>
+ <xsl:apply-templates mode="title.markup" select="."/>
+ </TITLE>
+ </ENTRY>
+</xsl:template>
+
+<!-- }}} -->
+
+</xsl:stylesheet>
diff --git a/jEdit/doc/news43/news.xml b/jEdit/doc/news43/news.xml
deleted file mode 100644
index 709337f..0000000
--- a/jEdit/doc/news43/news.xml
+++ /dev/null
@@ -1,331 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
-<book>
- <!-- :maxLineLen=76:wrap=hard: -->
- <bookinfo>
- <author>
- <firstname>Alan</firstname>
- <surname>Ezust</surname>
- </author>
- <legalnotice>
- <title>Legal Notice</title>
- <para>Permission is granted to copy, distribute and/or modify this
- document under the terms of the GNU Free Documentation License,
- Version 1.1 or any later version published by the Free Software
- Foundation; with no <quote>Invariant Sections</quote>,
- <quote>Front-Cover Texts</quote> or <quote>Back-Cover Texts</quote>,
- each as defined in the license. A copy of the license is included in
- the file <filename>COPYING.DOC.txt</filename> included with the
- jEdit distribution.</para>
- </legalnotice>
- <title>What's New in jEdit 4.3</title>
- </bookinfo>
- <preface id="preface">
- <title>Preface</title>
- <para>
- No longer will jEdit be called "pre" or "final":
- instead, we are moving over to straight-decimal x.y.z version
- numbering scheme.
- </para>
- <para>jEdit is a very mature text editor, and has gone through a very
- interesting phase of development. Left in a "prerelease" stage for about
- four years, it's had a long time to solifidy. Many of the original
- developers, including Slava Pestov, have stopped working directly on
- jEdit. Fortunately, because of the wonderful nature of open source,
- there are more and more eyeballs on this code than ever! We have
- received contributions of plugins, bugfixes, refactoring, and
- enhancements from around the globe, and our host, sourceforge.net <ulink
- url="http://sourceforge.net/project/stats/detail.php?group_id=588&ugn=jedit&type=prdownload&mode=year&package_id=0">reports</ulink>
- that there are on average at least a half-million downloads per year,
- and this has been true for the entire millenium.</para>
- <para>In terms of actual releases, there was a bit of a lull
- while Slava's absense was sinking in among the other members of the
- community, but in 2006, thanks to their generous donations of time,
- effort, and coding skills, we started releasing regular prereleases
- again, fixing bugs in the core and each other's plugins, making jEdit
- more stable, coherent, and useful than ever.</para>
- <para>The thing that really excites me is seeing members of the
- community get more actively involved in improving jedit or its plugins.
- The core is huge, and there are over 164 plugins, so there is an endless
- source of things to do. I anticipate that the trackers will always have
- many open issues, but I see many of the old ones finally being closed,
- and that is very much satisfying. I can say with complete confidence
- that 4.4 is an improvement over 4.2 in every possible way. I hope that
- after you read this document, you will think so too, and perhaps want to
- join in on the development of future versions of jEdit or its
- plugins.</para>
- <para>I watch the tracker traffic (<literal>jedit-devel</literal>) and
- commit logs (in the <literal>jedit-commits</literal> mailing list) with
- fascination, learning new Java tricks, or new jEdit tricks. It's quite
- satisfying to be this intimate with code that I find I am using every
- day. I feel I am on a first-name basis with all of the active
- committers, and I've given and/or received help from every one of them.
- While it is true, there are parts of it that could be designed a little
- better, it is still the best open source editor I've seen. Thanks to the
- plugins themselves, because they are broken up into neat little
- packages, it is easier for us to isolate and fix bugs. As long as I am
- using it, I will be compelled to fix bugs that annoy me, be they in the
- core, or any of the plugins I happen to use.</para>
- </preface>
- <preface id="acknowledgements">
- <title>Acknowledgements</title>
- <para>This release would not have been possible if it were not for the
- frequent help and efforts of Dale Anson, Jeffrey Hoyt, Marcelo Vanzin,
- Matthieu Casanova, Kazutoshi Satoda, Shlomy Reinstein, Seph Soliman,
- Eric Berry, Robert Schwenn, and Björn "Vampire" Kautler.
- I would also like to give sincere thanks to all
- of the other core and plugin developers who
- have made <ulink url="../CHANGES.txt">significant contributions</ulink>
- to help keep this editor alive and on the cutting edge.</para>
- </preface>
- <chapter id="compatibility">
- <title>Java Compatibility</title>
- <para>jEdit 4.3 requires Sun
- Java 1.5.0 or later. Older versions of Java are not supported.</para>
- <para>If you want to use the new LCD Antialiasing feature of Java 1.6,
- it is supported. From <guimenuitem>Global Options - Text Area -
- Antialiased Smooth Text</guimenuitem>: select <emphasis
- role="bold">Subpixel</emphasis>, and un-check the <emphasis
- role="bold">Fractional Font Metrics</emphasis> checkbox.</para>
- </chapter>
- <chapter id="user-changes">
- <title>User-Visible Changes</title>
-
- <orderedlist>
- <listitem><para> Most likely, you'll notice first the new Tango icon set,
- used for the toolbar icons. If for some reason you are nostalgic
- for the old icon set, you can always switch back to it from the
- Appearance option pane. </para></listitem>
- <listitem><para> There is an enhanced Status Bar (and accompanying service API
- to allow plugins to add new status bar diaplay/controls). </para></listitem>
- <listitem><para>
- It is now possible to choose different, independent Buffer Sets
- for each EditPane buffer switcher. See <ulink
- url="../users-guide/buffersets.html">Buffer Sets</ulink> for more
- information. </para></listitem>
- <listitem><para> The Dockable Interface has been enhanced and made
- into a jEdit service, so it is possible for plugins to offer alternate
- dockable window managers. Some of them give jEdit a very
- Eclipse-like feel. In addition, it is now possible to save and load
- dockable layouts, which are analogous to Eclipse perspectives.
- </para></listitem>
- </orderedlist>
-
- <section id="readded">
- <title>Re-added Features</title>
- <para>Soft wrapping to the text area, one of my personal favorite
- features, is possible again, by setting the wrap width to zero.
- Thank you Slava! I really missed that feature. It's probably the
- main reason I started using, testing, and later developing jEdit
- 4.3.</para>
- </section>
- <section id="plugin-manager">
- <title>Plugin Manager</title>
- <para>The three panes of the PluginManager have all been reworked
- and made more keyboard friendly. They handle multiple selections,
- show more information, allow sorting on more columns, the checkbox
- states don't get lost when you switch panes, and the manage panel
- now automatically loads dependent plugins if they are already
- downloaded. Anyone who is used to 4.2's plugin manager will notice
- the difference immediately.</para>
- <para>From the Manage tab, it is now possible to save a set of
- installed plugins as a PluginSet. This is an XML file which can be
- located locally on your machine, or remotely on a network. Each time
- the Install tab is instantiated, the PluginSet is loaded and the set
- of plugins are checked for you to download and install.</para>
- <para>If you are a plugin developer, see <xref
- linkend="api-changes" />.</para>
- </section>
- <section id="editing">
- <title>Text Editing</title>
- <para><ulink
- url="http://java.sun.com/j2se/1.5.0/docs/guide/imf/index.html">Input
- Methods</ulink> are now supported in jEdit. This should make it much
- easier for people to use alternate keyboard input methods to use
- jEdit and enter Chinese/Korean/Japanese characters, as well as other
- alternative input devices. Thank you, Kazutoshi Satoda, for
- fixing that and many other encoding and internationalization problems that
- prevented non-English speaking users from using jEdit properly
- in their native language.</para>
- </section>
- <section id="syntax">
- <title>Syntax Highlighting</title>
- <para>Many syntax highlighting modes were updated or rewritten to
- use the java.util.regex instead of gnu.regexp. Some modes were
- added, bring the total now to 150 languages.</para>
- </section>
- <section id="regexp-changes">
- <title>Regular Expressions</title>
- <para>Most of the core code has been rewritten to use
- <literal>java.util.regex</literal> instead of
- <literal>gnu.regexp</literal>, so be sure to keep that in mind as
- you are composing your own regular expressions, whether they are in
- mode files, search expressions, or in your own plugins. XSearch
- plugin and others still use <literal>gnu.regexp</literal> plugin,
- which offers the legacy regex engine, in case the old behavior is
- still desired. </para>
- </section>
- <section id="search">
- <title>Search and Replace</title>
- <para>Added <guimenuitem>Skip Binary</guimenuitem> and
- <guimenuitem>Skip Hidden</guimenuitem> options for Directory
- Search.</para>
- </section>
- <section id="encodings">
- <title>Handling of Multiple Encodings</title>
- <para>A full list of encodings supported by your Java implementation
- is now shown in the file system browser's
- <guimenu>Commands</guimenu>><guimenuitem>Encoding</guimenuitem>
- menu and other places. Previously only a small list of common
- encodings was shown.</para>
- <para>You can choose which of this list you want to display in the
- Encodings general options pane. You can also choose the fallback
- order of encodings to try in the event of decode errors in the
- General option pane.</para>
- <para>The encoding used by XML files is (should be?) auto-detected
- if the file provides an XML declaration like the following:</para>
- <programlisting><?xml version="1.0" encoding="UTF-8"?></programlisting>
- </section>
- <section id="vfs.browser">
- <title>File System Browser</title>
- <para>The file system browser is much more keyboard friendly, and
- supports some common shortcuts set by default in KDE and Windows
- (del, f2, f5, A+Left and A+Right for history, A+up for parent dir).</para>
- </section>
- <section id="bundled-macros">
- <title>Bundled Macros</title>
- <para>There are a number of new bundled macros, and most of the
- existing ones have undergone enhancements and bug fixes. jEdit 4.2
- bundled 58 macros in 7 categories; jEdit 4.3 bundles 75 macros in 9
- categories.</para>
- <para>Of course you can create new macros of your own, either by
- recording actions or writing them from scratch.</para>
- </section>
- </chapter>
- <chapter id="api-changes">
- <title>API Changes</title>
- <para>There are quite a few API changes which are documented, in the
- source as well as the <ulink url="../CORE_GUIDELINES.txt">core
- guidelines</ulink> and the <ulink
- url="../CHANGES.txt">CHANGES.txt</ulink> documents. If ever you find
- that some of the API documentation is lacking or needs further
- explanation, please post a feature request or a question onto the -devel
- mailing list.</para>
- <section id="buffervsjeditbuffer">
- <title>Buffer vs jEditBuffer</title>
- <para>Now that the text area is independent of the rest of jEdit,
- various text area-related APIs that used to take
- org.gjt.sp.jedit.Buffer instances now take
- org.gjt.sp.jedit.buffer.JEditBuffers.</para>
- <para>BufferChangeListener and BufferChangeAdapter are now
- deprecated. Use BufferListener instead.</para>
- </section>
- <section id="api-plugins">
- <title>Plugin API changes</title>
- <para>jEdit 4.2 used to run plugins that were designed only for the
- 4.1 plugin API, but plugins that are missing the "activate" property
- will no longer load properly in 4.3.</para>
- <para>There are two new properties that all plugins can have:
- <literal>description</literal> and
- <literal>longdescription</literal>. The former is just a string
- property, while the latter is a reference to an html or text file.
- See EditPlugin API docs for details.</para>
- </section>
- <section id="dockable-interface">
- <title>Dockable Interface</title>
- <para>A new boolean attribute, <literal>MOVABLE</literal>, can now
- be specified for <literal>DOCKABLE</literal> tags in the
- <literal>dockables.xml</literal> file. This attribute specifies the
- behavior when the docking position of the dockable window is
- changed. If true, the existing instance of the dockable window is
- moved to the new docking position, thus maintaining its state after
- the move (this is the new behavior). If false, the BeanShell code is
- invoked to get the instance to put in the new docking position (this
- is the existing behavior). The BeanShell code typically returns a
- new instance of the dockable, cause the state to be lost as a result
- of the change in docking position. The default value of this
- attribute is false for backward compatibility.</para>
- <para>A new interface, <ulink
- url="../api/org/gjt/sp/jedit/gui/DockableWindow.html">DockableWindow</ulink>,
- is introduced for <literal>MOVABLE</literal> dockable windows to be
- notified before their docking position is changed. This enables
- dockable windows to react to this change, e.g. by changing their
- layout depending on whether they are docked at the top/bottom or the
- left/right. This interface is meaningless (for now) for non-MOVABLE
- dockable windows.</para>
- <para>A new Service, <ulink
- url="../api/org/gjt/sp/jedit/gui/DockableWindowManagerProvider.html">DockableWindowManagerProvier</ulink>
- is introduced to permit plugins to offer alternate dockable
- frameworks, replacing the legacy dockables that are starting to
- look rather old. </para>
- </section>
- </chapter>
- <chapter id="new-plugins">
- <title>The core plugins</title>
- <para>This chapter showcases the new(er) plugins that were under the
- most active development during jEdit 4.3. Some of them influenced the
- development of the jEdit core, and others are good enough to be
- incorporated into the core, but are left as separate plugins simply
- because it makes it easier for us to maintain and debug them.</para>
- <para>The latest version of <emphasis role="bold">Console</emphasis>
- has many improvements, and takes advantage of new features of jEdit. </para>
- <para>Navigator, providing a navigable history, is new and improved - it
- provides the user with Eclipse-like Navigation to previous locations,
- for each TextArea of each View. It uses new EditBus messages which
- are now available in the public API, PositionChanging and
- BufferChanging.</para>
- <bridgehead>ProjectViewer</bridgehead>
- <para>For managing groups of files and organizing them into trees,
- ProjectViewer is very useful. It's been under active development, and
- many bugs are fixed quickly after they are found. Its ability to filter
- its input set based on regular expressions or the contents of
- CVS/SVN/Perforce entries makes it especially handy for other plugins
- that use it, such as <emphasis role="bold">FastOpen</emphasis> and
- <emphasis role="bold">OpenIt</emphasis>, both of which are also recently
- updated for 4.3.</para>
- <para>ProjectViewer is also very important for language plugins that
- want to deal with file sets. It defines a project-wide property
- specification, that makes it possible to have different settings
- depending on what the active project is.</para>
- <bridgehead>SideKicks and Language Plugins</bridgehead>
- <para>SideKick has been debugged and the documentation has been
- improved. Further, there is a new combobox that lets you choose your
- parser, and a new SplitPane to show you the contents of the hovered
- element. The combobox is especially important since there are multiple
- parsers that can be used on a given file, especially when you are
- working with Python, PHP, HTML, XML, or JavaScript files.</para>
- <para>Many language-specific plugins have been redesigned to use the new
- and improved SideKick. In particular, CtagsSideKick (a replacement for
- CodeBrowser), JPyDebug, JythonInterpreter, RubyPlugin, PHPParser,
- JavaSideKick, XML, and PerlSideKick. Be sure to try them out.</para>
- <para>In case you're looking for JavaCore, JBrowse, CodeAid,
- DotComplete, or PropertySideKick, they have all been merged (in terms of
- functionality) into the new JavaSideKick plugin. Some other plugins that
- depend on these above plugins still need to be converted to use
- JavaSideKick instead of the old java plugins listed above. </para>
- <para>As for HtmlSideKick, JavaScriptSideKick, and XmlIndenter, they
- have all been merged into the new XML 2 plugin, which now includes two
- parsers for CSS, one for Ecmascript, and completion popups for elements
- and attributes in XML, CSS, and HTML.</para>
- <para>If you use many different languages, you should also try out the
- very clever ContextMenu plugin. </para>
- <para>The SVNPlugin is new, and the JDiff plugin is improved. Many
- other plugins have latest versions that require jEdit 4.3. </para>
-
- </chapter>
- <chapter id="futureplans">
- <title>Future Plans</title>
- <para>During this process of cleaning up jEdit, I started on many
- projects and did not finish them. They are still worthwhile projects,
- ones I would like to get back to. As always, if there are any volunteers
- who would like to help out with them, please join the
- <literal>jedit-devel</literal> mailing list, look at some unassigned
- bugs and feature requests, and see if you can do any of them. Feel free
- to ask for help if you are stuck. The other developers are always happy
- to initiate someone new into the code.</para>
- <para>Also take a look at the <ulink url="../TODO.txt">TODO</ulink> file
- for examples of some of the work that was started but not finished yet
- on the core. Some plugins also have their own TODO lists.</para>
- </chapter>
-</book>
\ No newline at end of file
diff --git a/jEdit/doc/news44/news.xml b/jEdit/doc/news44/news.xml
new file mode 100644
index 0000000..75995ef
--- /dev/null
+++ b/jEdit/doc/news44/news.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN"
+"http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd">
+<article>
+
+ <title> What's new in jEdit 4.4 </title>
+ <articleinfo>
+ <author>
+ <othername>The jEdit all-volunteer development team</othername>
+ </author>
+
+ </articleinfo>
+
+ <para> Detailed changes can always be found in the <ulink url="../CHANGES.txt">Detailed Change Log</ulink>,
+ but here are some of the major features of this version. </para>
+ <itemizedlist>
+ <listitem><para> jEdit 4.4 now requires Java 1.6. </para></listitem>
+ <listitem><para> Buffersets have been re-engineered, and simplified. All editpanes
+ have the same bufferset scope, so changes to the scope affects all editpanes
+ immediately. </para></listitem>
+ <listitem><para> Introduction of a new ThreadUtilities class implementing a
+ threadpool using Java 1.6 Concurrent API. Use this instead of
+ VFSManager's WorkThreadPool, which is now deprecated.
+ Related: A new Task Monitor dockable which will eventually replace
+ the I/O progress monitor, for showing progress of tasks.
+ Still TODO: rewrite VFSManager + all plugins to use ThreadUtilities
+ instead of WorkThreadPool.
+ </para></listitem>
+ <listitem><para> New DataTransfer API to allow for rich text copy/paste.
+ </para></listitem>
+ </itemizedlist>
+
+<!-- :maxLineLen=80:wrap=hard: -->
+</article>
diff --git a/jEdit/doc/release-procedure.txt b/jEdit/doc/release-procedure.txt
index 9e05c6b..77406cc 100644
--- a/jEdit/doc/release-procedure.txt
+++ b/jEdit/doc/release-procedure.txt
@@ -17,39 +17,63 @@ Release procedure of jEdit
listed as requirements in step 1, unless it slows to achieve the
requirements.
-3. Make a release branch. (ex. "/branches/M.N.x")
+3. Make a release branch from the trunk. (ex. "/branches/M.N.x")
- Anytime after this, the step 1 of the next release can be started.
+ To keep stabilizing the release, only the following changes are
+ allowed on the branch.
+ - Bumping up of the version number.
+ - Changes under "doc" directory.
+ - Merging of reviewed changes from the trunk or a separate branch.
+ See step 5 below for merging.
-4. Make a RC (release-candidate) from the branch. (ex. M.N-rc1)
+ Anytime after making the branch, the step 1 of the next release can be
+ started.
- The release of RCs is announced on jedit-devel, jedit-users,
+4. Make a public preview build from the branch.
+
+ The preview build is announced on jedit-devel, jedit-users,
jedit-announce, with a clear notice saying it is for testing.
-5. Receive bugs for the RC, and fix them.
+ For this purpose, daily build can be used. Daily builds are provided
+ by Eric Berry (elberry), here.
+ http://www.tellurianring.com/projects/jedit-daily/
+
+5. Receive bugs for preview builds, and fix them.
+
+ Basically, the fixes first applied on the trunk. If it seems also good
+ for a release branch, it can be submitted into the Merge Requests
+ tracker.
+ http://sourceforge.net/tracker/?group_id=588&atid=1235750&status=1
+
+ If a fix can't be applied on trunk (for example, the target code
+ doesn't exist in the trunk), it can be applied to a separate branch
+ which is created from the target release branch.
+
+ When submitting a merge request, please make sure
+ - to put the complete set of revision numbers which should be
+ merged, and
+ - to set the target branch by "Group".
- The fixes first applied on the trunk, and proposed as candidates of
- merge into the release branch. A candidate can be a revision, a group
- of revisions, or another branch to refine the fix. The proposed fixes
- are listed in a publicly visible file, with some comments,
- justifications, and status of review.
- (It maybe, PROPOSED_FIXES.txt in the branch, or a page in Wiki.)
+ If a fix can't be merged cleanly by just running "svn merge ...", the
+ submitter can make another branch (called as a backport branch) from a
+ stable branch to show how it can be merged. In this case, put the
+ branch name in the merge request.
The merge is done by another committer (reviewer) other than the
original committer of the fix. The fix is accepted only if
- the fix also works for the reviewer, and
- the reviewer is sure that the fix doesn't include unwanted changes
. If a fix was rejected, it can be proposed again with some
- refinements made on the trunk.
+ refinements made on the trunk or the backport branch.
This means each fix is reviewed at least two persons. This reduces
possibility of unexpected breakages, and achieves the stability of the
release branch.
- While this process, some RCs may be made for each two weeks or so.
+ While this process, some more preview builds may be made periodically.
-6. If no major bugs are reported against the RC for the last period,
- release from the branch as a stable release. (ex. M.N.0)
+6. If no major bugs are reported against the preview build for the last
+ period, release from the branch as a stable release. (ex. M.N.0)
7. After a stable release, bug fix continue as same as the step 5.
If some fixes are merged from the trunk, make a patch release.
diff --git a/jEdit/doc/tips/tip0.html b/jEdit/doc/tips/tip0.html
index a20007b..3ae9077 100644
--- a/jEdit/doc/tips/tip0.html
+++ b/jEdit/doc/tips/tip0.html
@@ -1,6 +1,6 @@
-<html><body>Using abbreviations saves a lot of time, by letting you
-enter long strings using a shorthand notation. To define an
-abbreviation, enter the desired shorthand string and press <b>C+;</b>.
-You will then be prompted for the expansion. Now, to enter the expansion
-in the buffer, all you have to do is type the shorthand and press
-<b>C+;</b> again.</body></html>
+<html><body>Using abbreviations saves a lot of time, by letting you
+enter long strings using a shorthand notation. To define an
+abbreviation, enter the desired shorthand string and press <b>C+;</b>.
+You will then be prompted for the expansion. Now, to enter the expansion
+in the buffer, all you have to do is type the shorthand and press
+<b>C+;</b> again.</body></html>
diff --git a/jEdit/doc/tips/tip1.html b/jEdit/doc/tips/tip1.html
index fba6cea..7891a6b 100644
--- a/jEdit/doc/tips/tip1.html
+++ b/jEdit/doc/tips/tip1.html
@@ -1,2 +1,2 @@
-<html><body>You can press <b>C+e C+v</b> to display a dialog box listing
-the 20 most recently copied and pasted strings.</body></html>
+<html><body>You can press <b>C+e C+v</b> to display a dialog box listing
+the 20 most recently copied and pasted strings.</body></html>
diff --git a/jEdit/doc/tips/tip10.html b/jEdit/doc/tips/tip10.html
index 10901e7..a797d03 100644
--- a/jEdit/doc/tips/tip10.html
+++ b/jEdit/doc/tips/tip10.html
@@ -1,4 +1,4 @@
-<html><body>You can use the BeanShell interpreter as a calculator. For
-example, try entering "3 / Math.sqrt(6)" in the
-<b>Utilities</b>><b>BeanShell</b>><b>Evaluate BeanShell Expression</b> dialog
-box.</body></html>
+<html><body>You can use the BeanShell interpreter as a calculator. For
+example, try entering "3 / Math.sqrt(6)" in the
+<b>Utilities</b>><b>BeanShell</b>><b>Evaluate BeanShell Expression</b> dialog
+box.</body></html>
diff --git a/jEdit/doc/tips/tip11.html b/jEdit/doc/tips/tip11.html
index 33610cd..40da88d 100644
--- a/jEdit/doc/tips/tip11.html
+++ b/jEdit/doc/tips/tip11.html
@@ -1,2 +1,2 @@
-<html><body>When you open a recent file, the caret is automatically
-restored to its previous position within that file.</body></html>
+<html><body>When you open a recent file, the caret is automatically
+restored to its previous position within that file.</body></html>
diff --git a/jEdit/doc/tips/tip12.html b/jEdit/doc/tips/tip12.html
index 8e8f397..6518df3 100644
--- a/jEdit/doc/tips/tip12.html
+++ b/jEdit/doc/tips/tip12.html
@@ -1,2 +1,2 @@
-<html><body>Try invoking the <b>View</b>><b>Line Numbers</b>
-command.</body></html>
+<html><body>Try invoking the <b>View</b>><b>Line Numbers</b>
+command.</body></html>
diff --git a/jEdit/doc/tips/tip13.html b/jEdit/doc/tips/tip13.html
index 488eedf..51788ac 100644
--- a/jEdit/doc/tips/tip13.html
+++ b/jEdit/doc/tips/tip13.html
@@ -1,2 +1,2 @@
-<html><body>You can press <b>C+PAGE_UP</b> and <b>C+PAGE_DOWN</b> to
-quickly switch between buffers.</body></html>
+<html><body>You can press <b>C+PAGE_UP</b> and <b>C+PAGE_DOWN</b> to
+quickly switch between buffers.</body></html>
diff --git a/jEdit/doc/tips/tip14.html b/jEdit/doc/tips/tip14.html
index 90b4928..7c00610 100644
--- a/jEdit/doc/tips/tip14.html
+++ b/jEdit/doc/tips/tip14.html
@@ -1,2 +1,2 @@
-<html><body>You can press <b>C+`</b> to switch between the two most
-recently edited buffers.</body></html>
+<html><body>You can press <b>C+`</b> to switch between the two most
+recently edited buffers.</body></html>
diff --git a/jEdit/doc/tips/tip15.html b/jEdit/doc/tips/tip15.html
index e8e8a95..965e960 100644
--- a/jEdit/doc/tips/tip15.html
+++ b/jEdit/doc/tips/tip15.html
@@ -1,12 +1,12 @@
-<html><body>If your computer has a large amount of memory, you can run
-jEdit in <i>background mode</i> by passing it the
-<code>-background</code> command-line switch. In background mode, jEdit
-will stay running and in memory even after all views are closed. This
-avoids the startup delay associated with starting jEdit multiple
-times.<p>
-
-If you also specify the <code>-nogui</code> switch, an initial view will
-not be opened; so jEdit will load, but remain invisible until another
-client instance is started. Using this switch, you can have jEdit loaded when
-your computer starts, ready for use later on.
-</body></html>
+<html><body>If your computer has a large amount of memory, you can run
+jEdit in <i>background mode</i> by passing it the
+<code>-background</code> command-line switch. In background mode, jEdit
+will stay running and in memory even after all views are closed. This
+avoids the startup delay associated with starting jEdit multiple
+times.<p>
+
+If you also specify the <code>-nogui</code> switch, an initial view will
+not be opened; so jEdit will load, but remain invisible until another
+client instance is started. Using this switch, you can have jEdit loaded when
+your computer starts, ready for use later on.
+</body></html>
diff --git a/jEdit/doc/tips/tip16.html b/jEdit/doc/tips/tip16.html
index 5effbbf..e7bb141 100644
--- a/jEdit/doc/tips/tip16.html
+++ b/jEdit/doc/tips/tip16.html
@@ -1,9 +1,9 @@
-<html><body>You can press <b>C+t <i>X</i></b> to save the current
-position to a marker with shortcut <i>X</i>, and <b>C+y <i>X</i></b> to return
-to the marker with shortcut <i>X</i>, where <i>X</i> is any key on your
-keyboard.<p>
-
-Marker positions are saved to <tt>.<i>file
-name</i>.marks</tt>. If you don't these files to be created,
-disable marker persistence in the <b>General</b> pane of
-the <b>Utilities</b>><b>Global Options</b> dialog box.</body></html>
+<html><body>You can press <b>C+t <i>X</i></b> to save the current
+position to a marker with shortcut <i>X</i>, and <b>C+y <i>X</i></b> to return
+to the marker with shortcut <i>X</i>, where <i>X</i> is any key on your
+keyboard.<p>
+
+Marker positions are saved to <tt>.<i>file
+name</i>.marks</tt>. If you don't these files to be created,
+disable marker persistence in the <b>General</b> pane of
+the <b>Utilities</b>><b>Global Options</b> dialog box.</body></html>
diff --git a/jEdit/doc/tips/tip17.html b/jEdit/doc/tips/tip17.html
index 6fcae2d..7659334 100644
--- a/jEdit/doc/tips/tip17.html
+++ b/jEdit/doc/tips/tip17.html
@@ -1,13 +1,13 @@
-<html><body>
-The action bar can provide quick keyboard access to editor features which do not have explicit keyboard shortcuts. Examples:
-
-<ul>
-<li><b>C+ENTER</b> <code>l-o</code> (automatically completed to
-<code>global-options</code>)
-<li><b>C+ENTER</b> <code>w-v</code> (automatically completed to
-<code>new-view</code>)
-<li><b>C+ENTER</b> <code>buffer.tabSize=4</code>
-<li><b>C+ENTER</b> <code>vfs.browser.dock-position=left</code>
-<li><b>C+ENTER</b> <code>vfs.browser.shortcut=F3</code>
-<li><b>C+ENTER</b> <code>view.fontsize=14</code>
-</body></html>
+<html><body>
+The action bar can provide quick keyboard access to editor features which do not have explicit keyboard shortcuts. Examples:
+
+<ul>
+<li><b>C+ENTER</b> <code>l-o</code> (automatically completed to
+<code>global-options</code>)
+<li><b>C+ENTER</b> <code>w-v</code> (automatically completed to
+<code>new-view</code>)
+<li><b>C+ENTER</b> <code>buffer.tabSize=4</code>
+<li><b>C+ENTER</b> <code>vfs.browser.dock-position=left</code>
+<li><b>C+ENTER</b> <code>vfs.browser.shortcut=F3</code>
+<li><b>C+ENTER</b> <code>view.fontsize=14</code>
+</body></html>
diff --git a/jEdit/doc/tips/tip18.html b/jEdit/doc/tips/tip18.html
index 0a9a5ff..2ed3ad2 100644
--- a/jEdit/doc/tips/tip18.html
+++ b/jEdit/doc/tips/tip18.html
@@ -1,3 +1,3 @@
-<html><body>In the file system browser and file selection dialog boxes,
-you can select a file by typing the first few characters of its
-name.</body></html>
+<html><body>In the file system browser and file selection dialog boxes,
+you can select a file by typing the first few characters of its
+name.</body></html>
diff --git a/jEdit/doc/tips/tip19.html b/jEdit/doc/tips/tip19.html
index 014d94c..5c228b7 100644
--- a/jEdit/doc/tips/tip19.html
+++ b/jEdit/doc/tips/tip19.html
@@ -1,4 +1,4 @@
-<html><body>You can customize the buttons shown on the tool bar (or disable it
-altogether) in the
-<b>Tool Bar</b> pane of the <b>Utilities</b>><b>Global Options</b>
-dialog box.</body></html>
+<html><body>You can customize the buttons shown on the tool bar (or disable it
+altogether) in the
+<b>Tool Bar</b> pane of the <b>Utilities</b>><b>Global Options</b>
+dialog box.</body></html>
diff --git a/jEdit/doc/tips/tip2.html b/jEdit/doc/tips/tip2.html
index edf1e7b..282a99b 100644
--- a/jEdit/doc/tips/tip2.html
+++ b/jEdit/doc/tips/tip2.html
@@ -1,17 +1,17 @@
-<html><body>Pressing <b>C+b</b> searches the current
-buffer and the current mode's keyword list for words beginning with
-the one before the caret.<p>
-
-This serves as a very basic code completion feature, for example:
-
-<ul>
-<li>When editing any kind of program source, enter the first few characters of
-a previously-declared identifier name, invoke <b>C+b</b>, and save yourself
-from having to type it out again.
-<li>When editing Javadoc comments in Java source code,
-enter "@" then press <b>C+b</b> to get a list of Javadoc tags.
-<li>In a PHP file, enter a few characters and press <b>C+b</b> to see
-a list of functions whose names start with what you entered.
-</ul>
-
-</body></html>
+<html><body>Pressing <b>C+b</b> searches the current
+buffer and the current mode's keyword list for words beginning with
+the one before the caret.<p>
+
+This serves as a very basic code completion feature, for example:
+
+<ul>
+<li>When editing any kind of program source, enter the first few characters of
+a previously-declared identifier name, invoke <b>C+b</b>, and save yourself
+from having to type it out again.
+<li>When editing Javadoc comments in Java source code,
+enter "@" then press <b>C+b</b> to get a list of Javadoc tags.
+<li>In a PHP file, enter a few characters and press <b>C+b</b> to see
+a list of functions whose names start with what you entered.
+</ul>
+
+</body></html>
diff --git a/jEdit/doc/tips/tip20.html b/jEdit/doc/tips/tip20.html
index e52a44c..928d153 100644
--- a/jEdit/doc/tips/tip20.html
+++ b/jEdit/doc/tips/tip20.html
@@ -1,2 +1,2 @@
-<html><body>jEdit comes with detailed online help which can be viewed
-from the <b>Help</b> menu. jEdit's online help is fully searchable.</body></html>
+<html><body>jEdit comes with detailed online help which can be viewed
+from the <b>Help</b> menu. jEdit's online help is fully searchable.</body></html>
diff --git a/jEdit/doc/tips/tip21.html b/jEdit/doc/tips/tip21.html
index 153cbc5..a9c1b36 100644
--- a/jEdit/doc/tips/tip21.html
+++ b/jEdit/doc/tips/tip21.html
@@ -1,3 +1,3 @@
-<html><body>You can repeat the next editor command any number of times
-by pressing <b>C+ENTER</b>, followed by the desired repeat count.
-</body></html>
+<html><body>You can repeat the next editor command any number of times
+by pressing <b>C+ENTER</b>, followed by the desired repeat count.
+</body></html>
diff --git a/jEdit/doc/tips/tip22.html b/jEdit/doc/tips/tip22.html
index 8e9a7d4..7278fc8 100644
--- a/jEdit/doc/tips/tip22.html
+++ b/jEdit/doc/tips/tip22.html
@@ -1,4 +1,4 @@
-<html><body>jEdit's register feature is a powerful extension of the clipboard
-metaphor. <b>C+r C+c <i>X</i></b> copies the selected text to register
-<i>X</i>. <b>C+r C+v <i>X</i></b> inserts the contents of register
-<i>X</i> into the buffer. Register contents are persistent between editing sessions.</body></html>
+<html><body>jEdit's register feature is a powerful extension of the clipboard
+metaphor. <b>C+r C+c <i>X</i></b> copies the selected text to register
+<i>X</i>. <b>C+r C+v <i>X</i></b> inserts the contents of register
+<i>X</i> into the buffer. Register contents are persistent between editing sessions.</body></html>
diff --git a/jEdit/doc/tips/tip23.html b/jEdit/doc/tips/tip23.html
index fd7b033..b803f12 100644
--- a/jEdit/doc/tips/tip23.html
+++ b/jEdit/doc/tips/tip23.html
@@ -1,2 +1,2 @@
-<html><body>To go to the bracket matching the one before the caret,
-press <b>C+]</b> or click the bracket scope indicator in the gutter.</body></html>
+<html><body>To go to the bracket matching the one before the caret,
+press <b>C+]</b> or click the bracket scope indicator in the gutter.</body></html>
diff --git a/jEdit/doc/tips/tip24.html b/jEdit/doc/tips/tip24.html
index ef6c771..b1e18bc 100644
--- a/jEdit/doc/tips/tip24.html
+++ b/jEdit/doc/tips/tip24.html
@@ -1,4 +1,4 @@
-<html><body><b>C+d</b> deletes the current line. <b>CS+BACK_SPACE</b>
-deletes from the caret position to the beginning of the line.
-<b>CS+DELETE</b> deletes from the caret position to the end of the
-line.</body></html>
+<html><body><b>C+d</b> deletes the current line. <b>CS+BACK_SPACE</b>
+deletes from the caret position to the beginning of the line.
+<b>CS+DELETE</b> deletes from the caret position to the end of the
+line.</body></html>
diff --git a/jEdit/doc/tips/tip25.html b/jEdit/doc/tips/tip25.html
index c95cd73..52ef06d 100644
--- a/jEdit/doc/tips/tip25.html
+++ b/jEdit/doc/tips/tip25.html
@@ -1,3 +1,3 @@
-<html><body>To select a bracketed code block, <b>Control</b>-click the
-bracket scope indicator in the gutter. To narrow the display to a bracketed code block, <b>Alt</b>-click the bracket scope indicator in the gutter.
-</body></html>
+<html><body>To select a bracketed code block, <b>Control</b>-click the
+bracket scope indicator in the gutter. To narrow the display to a bracketed code block, <b>Alt</b>-click the bracket scope indicator in the gutter.
+</body></html>
diff --git a/jEdit/doc/tips/tip26.html b/jEdit/doc/tips/tip26.html
index e5ec18f..ce8b390 100644
--- a/jEdit/doc/tips/tip26.html
+++ b/jEdit/doc/tips/tip26.html
@@ -1,2 +1,2 @@
-<html><body>The jEdit user's guide includes a keyboard shortcut
-quick reference. Print it out; it's very handy.</body></html>
+<html><body>The jEdit user's guide includes a keyboard shortcut
+quick reference. Print it out; it's very handy.</body></html>
diff --git a/jEdit/doc/tips/tip27.html b/jEdit/doc/tips/tip27.html
index f3a516c..0cd4b81 100644
--- a/jEdit/doc/tips/tip27.html
+++ b/jEdit/doc/tips/tip27.html
@@ -1,4 +1,4 @@
-<html><body>You can select multiple files for opening in the
-<b>Open File</b> dialog or <b>File System Browser</b> window
-by <b>Control</b>-clicking on the files in
-question.</body></html>
+<html><body>You can select multiple files for opening in the
+<b>Open File</b> dialog or <b>File System Browser</b> window
+by <b>Control</b>-clicking on the files in
+question.</body></html>
diff --git a/jEdit/doc/tips/tip28.html b/jEdit/doc/tips/tip28.html
index b1b5c57..ded5461 100644
--- a/jEdit/doc/tips/tip28.html
+++ b/jEdit/doc/tips/tip28.html
@@ -1,4 +1,4 @@
-<html><body>jEdit automatically decompresses GZipped files
-when loading, and compresses them again when saving. You can specify if
-a file is to be GZipped in the <b>Utilities</b>><b>Buffer Options</b>
-dialog box.</body></html>
+<html><body>jEdit automatically decompresses GZipped files
+when loading, and compresses them again when saving. You can specify if
+a file is to be GZipped in the <b>Utilities</b>><b>Buffer Options</b>
+dialog box.</body></html>
diff --git a/jEdit/doc/tips/tip29.html b/jEdit/doc/tips/tip29.html
index beeeab5..7f091c0 100644
--- a/jEdit/doc/tips/tip29.html
+++ b/jEdit/doc/tips/tip29.html
@@ -1,13 +1,13 @@
-<html><body>jEdit supports "folding"; a "fold" is a section of a
-buffer that can be hidden and shown by clicking in the gutter or
-using the commands in the <b>Folding</b> menu.
-Folds can be nested.<p>
-
-Two folding modes are supported; "indent" and "explicit". In the
-former, folds are created based on the leading indent of a line;
-in the latter, the buffer is parsed for the strings
-<code>{{{</code> and <code>}}}</code>.<p>
-
-Folding can be enabled in the <b>Buffer Options</b> and
-<b>Global Options</b> dialog boxes.
-</body></html>
+<html><body>jEdit supports "folding"; a "fold" is a section of a
+buffer that can be hidden and shown by clicking in the gutter or
+using the commands in the <b>Folding</b> menu.
+Folds can be nested.<p>
+
+Two folding modes are supported; "indent" and "explicit". In the
+former, folds are created based on the leading indent of a line;
+in the latter, the buffer is parsed for the strings
+<code>{{{</code> and <code>}}}</code>.<p>
+
+Folding can be enabled in the <b>Buffer Options</b> and
+<b>Global Options</b> dialog boxes.
+</body></html>
diff --git a/jEdit/doc/tips/tip3.html b/jEdit/doc/tips/tip3.html
index 22b8710..c1db95c 100644
--- a/jEdit/doc/tips/tip3.html
+++ b/jEdit/doc/tips/tip3.html
@@ -1,2 +1,2 @@
-<html><body>jEdit can be customized to suit your tastes in the
-<b>Utilities</b>><b>Global Options</b> dialog box.</body></html>
+<html><body>jEdit can be customized to suit your tastes in the
+<b>Utilities</b>><b>Global Options</b> dialog box.</body></html>
diff --git a/jEdit/doc/tips/tip30.html b/jEdit/doc/tips/tip30.html
index dfe16b4..1c7d25d 100644
--- a/jEdit/doc/tips/tip30.html
+++ b/jEdit/doc/tips/tip30.html
@@ -1,13 +1,13 @@
-<html><body>The
-<b>Folding</b>><b>Narrow to Fold</b> command hides
-all lines except those in the fold containing the caret.
-When editing a file with folding, this can be used to "focus" in on a block
-of code and create a less cluttered display. To
-display the entire buffer again, invoke the
-<b>Folding</b>><b>Expand All Folds</b> command.<p>
-
-<b>Folding</b>><b>Narrow to Selection</b> works in a similar manner,
-except it hides all lines except those in the selection, rather than
-those in the current fold.
-
-</body></html>
+<html><body>The
+<b>Folding</b>><b>Narrow to Fold</b> command hides
+all lines except those in the fold containing the caret.
+When editing a file with folding, this can be used to "focus" in on a block
+of code and create a less cluttered display. To
+display the entire buffer again, invoke the
+<b>Folding</b>><b>Expand All Folds</b> command.<p>
+
+<b>Folding</b>><b>Narrow to Selection</b> works in a similar manner,
+except it hides all lines except those in the selection, rather than
+those in the current fold.
+
+</body></html>
diff --git a/jEdit/doc/tips/tip31.html b/jEdit/doc/tips/tip31.html
index fbb48a6..54afbcc 100644
--- a/jEdit/doc/tips/tip31.html
+++ b/jEdit/doc/tips/tip31.html
@@ -1,12 +1,12 @@
-<html><body>
-Any scripts located in the <code>startup</code> subdirectory of the
-jEdit home and user settings directories will be run on jEdit startup. Scripts can
-be written in BeanShell or any scripting language for which the appropriate
-plugin is installed (for example, Python scripting is provided by the
-<b>JythonInterpreter</b> plugin).<p>
-
-Methods
-and variables defined in BeanShell scripts are available to all other uses of
-BeanShell in jEdit. This is different from macros; methods and variables defined
-in macros are lost after the macro finishes executing.
-</body></html>
+<html><body>
+Any scripts located in the <code>startup</code> subdirectory of the
+jEdit home and user settings directories will be run on jEdit startup. Scripts can
+be written in BeanShell or any scripting language for which the appropriate
+plugin is installed (for example, Python scripting is provided by the
+<b>JythonInterpreter</b> plugin).<p>
+
+Methods
+and variables defined in BeanShell scripts are available to all other uses of
+BeanShell in jEdit. This is different from macros; methods and variables defined
+in macros are lost after the macro finishes executing.
+</body></html>
diff --git a/jEdit/doc/tips/tip32.html b/jEdit/doc/tips/tip32.html
index cc247f0..7c70880 100644
--- a/jEdit/doc/tips/tip32.html
+++ b/jEdit/doc/tips/tip32.html
@@ -1,6 +1,6 @@
-<html><body>
-You can define up to two distinct keyboard shortcuts for each command
-in the <b>Shortcuts</b> pane of the
-<b>Utilities</b>><b>Global Options</b>
-dialog box.
-</body></html>
+<html><body>
+You can define up to two distinct keyboard shortcuts for each command
+in the <b>Shortcuts</b> pane of the
+<b>Utilities</b>><b>Global Options</b>
+dialog box.
+</body></html>
diff --git a/jEdit/doc/tips/tip33.html b/jEdit/doc/tips/tip33.html
index 4b05779..41044de 100644
--- a/jEdit/doc/tips/tip33.html
+++ b/jEdit/doc/tips/tip33.html
@@ -1,4 +1,4 @@
-<html><body>
-Pressing <b>S+ENTER</b> in the search bar will search
-backwards for the currently entered text.
-</body></html>
+<html><body>
+Pressing <b>S+ENTER</b> in the search bar will search
+backwards for the currently entered text.
+</body></html>
diff --git a/jEdit/doc/tips/tip34.html b/jEdit/doc/tips/tip34.html
index f77da5d..d629842 100644
--- a/jEdit/doc/tips/tip34.html
+++ b/jEdit/doc/tips/tip34.html
@@ -1,22 +1,22 @@
-<html><body>
-
-You can replace all occurrences of a specific string or regular
-expression with the return value of a BeanShell script if the
-<b>Return value of a BeanShell
-snippet</b> radio button is selected in the search dialog box.<p>
-
-You can use
-this, for example, to convert all tags in an HTML file to lower case, by
-searching for the following regular expression:
-
-<p>
-<code><(.+?)></code>
-
-<p>
-
-And entering the following in the replace text field:
-
-<p>
-<code>"<" + _1.toLowerCase() + ">"</code>
-
-</body></html>
+<html><body>
+
+You can replace all occurrences of a specific string or regular
+expression with the return value of a BeanShell script if the
+<b>Return value of a BeanShell
+snippet</b> radio button is selected in the search dialog box.<p>
+
+You can use
+this, for example, to convert all tags in an HTML file to lower case, by
+searching for the following regular expression:
+
+<p>
+<code><(.+?)></code>
+
+<p>
+
+And entering the following in the replace text field:
+
+<p>
+<code>"<" + _1.toLowerCase() + ">"</code>
+
+</body></html>
diff --git a/jEdit/doc/tips/tip35.html b/jEdit/doc/tips/tip35.html
index 58fb944..5fa9a00 100644
--- a/jEdit/doc/tips/tip35.html
+++ b/jEdit/doc/tips/tip35.html
@@ -1,6 +1,6 @@
-<html><body>
-If you are used to Unix text editors where a middle-mouse button
-click inserts the most recently selected text, enable <b>quick copy</b> in
-the <b>Text Area</b> pane of the <b>Utilities</b>><b>Global
-Options</b> dialog box.
-</body></html>
+<html><body>
+If you are used to Unix text editors where a middle-mouse button
+click inserts the most recently selected text, enable <b>quick copy</b> in
+the <b>Mouse</b> pane of the <b>Utilities</b>><b>Global
+Options</b> dialog box.
+</body></html>
diff --git a/jEdit/doc/tips/tip36.html b/jEdit/doc/tips/tip36.html
index 0d11eb3..68fc2b5 100644
--- a/jEdit/doc/tips/tip36.html
+++ b/jEdit/doc/tips/tip36.html
@@ -1,6 +1,6 @@
-<html><body>
-The <b>Cut Append</b> (<b>C+e C+u</b>) and <b>Copy Append</b>
-(<b>C+e C+a</b>) commands
-add the selected text to the clipboard without clearing the
-existing clipboard contents.
-</body></html>
+<html><body>
+The <b>Cut Append</b> (<b>C+e C+u</b>) and <b>Copy Append</b>
+(<b>C+e C+a</b>) commands
+add the selected text to the clipboard without clearing the
+existing clipboard contents.
+</body></html>
diff --git a/jEdit/doc/tips/tip37.html b/jEdit/doc/tips/tip37.html
index 98877ad..4e873c3 100644
--- a/jEdit/doc/tips/tip37.html
+++ b/jEdit/doc/tips/tip37.html
@@ -1,3 +1,3 @@
-<html><body>You can toggle the search bar's <b>Ignore Case</b> check
-box by pressing <b>C+e C+i</b>, and the
-<b>Regular Expressions</b> check box by pressing <b>C+e C+x</b>.</body></html>
+<html><body>You can toggle the search bar's <b>Ignore Case</b> check
+box by pressing <b>C+e C+i</b>, and the
+<b>Regular Expressions</b> check box by pressing <b>C+e C+x</b>.</body></html>
diff --git a/jEdit/doc/tips/tip38.html b/jEdit/doc/tips/tip38.html
index 83f1dbb..e39515d 100644
--- a/jEdit/doc/tips/tip38.html
+++ b/jEdit/doc/tips/tip38.html
@@ -1,3 +1,3 @@
-<html><body>Saving an edit mode definition or catalog
-file will cause jEdit to automatically reload it. This is helpful when
-writing your own edit modes.</body></html>
+<html><body>Saving an edit mode definition or catalog
+file will cause jEdit to automatically reload it. This is helpful when
+writing your own edit modes.</body></html>
diff --git a/jEdit/doc/tips/tip39.html b/jEdit/doc/tips/tip39.html
index cae2f28..b32cc2a 100644
--- a/jEdit/doc/tips/tip39.html
+++ b/jEdit/doc/tips/tip39.html
@@ -1,4 +1,4 @@
-<html><body>Selecting <b>Search in Directory</b> from the menu shown when
-right-clicking a directory in the file system browser
-displays a search and replace dialog box set up for searching
-in that directory.</body></html>
+<html><body>Selecting <b>Search in Directory</b> from the menu shown when
+right-clicking a directory in the file system browser
+displays a search and replace dialog box set up for searching
+in that directory.</body></html>
diff --git a/jEdit/doc/tips/tip4.html b/jEdit/doc/tips/tip4.html
index 87ed0f4..4c4c777 100644
--- a/jEdit/doc/tips/tip4.html
+++ b/jEdit/doc/tips/tip4.html
@@ -1,5 +1,5 @@
-<html><body>You can repeat a series of keystrokes or menu item
-selections any number of times. Press <b>C+m C+m</b>, followed by the
-keystrokes and menu item selections. Press <b>C+m C+s</b> when finished.
-Now, to repeat those actions, press <b>C+m C+p</b> as many times as
-necessary.</body></html>
+<html><body>You can repeat a series of keystrokes or menu item
+selections any number of times. Press <b>C+m C+m</b>, followed by the
+keystrokes and menu item selections. Press <b>C+m C+s</b> when finished.
+Now, to repeat those actions, press <b>C+m C+p</b> as many times as
+necessary.</body></html>
diff --git a/jEdit/doc/tips/tip40.html b/jEdit/doc/tips/tip40.html
index 73e3ff2..39aa708 100644
--- a/jEdit/doc/tips/tip40.html
+++ b/jEdit/doc/tips/tip40.html
@@ -1,4 +1,4 @@
-<html><body>If the current line contains hard tab characters, the
-status bar will show both the "file" column location (where each tab
-counts as one column) and "screen" column location (where each tab
-can count as a number of columns).</body></html>
+<html><body>If the current line contains hard tab characters, the
+status bar will show both the "file" column location (where each tab
+counts as one column) and "screen" column location (where each tab
+can count as a number of columns).</body></html>
diff --git a/jEdit/doc/tips/tip41.html b/jEdit/doc/tips/tip41.html
index 46812d4..9d9ab88 100644
--- a/jEdit/doc/tips/tip41.html
+++ b/jEdit/doc/tips/tip41.html
@@ -1,3 +1,3 @@
-<html><body>If you would prefer not to see icons in the file system browser,
-they can be disabled in the <b>File System Browser</b>><b>General</b> pane of the
-<b>Utilities</b>><b>Global Options</b> dialog box.</body></html>
+<html><body>If you would prefer not to see icons in the file system browser,
+they can be disabled in the <b>File System Browser</b>><b>General</b> pane of the
+<b>Utilities</b>><b>Global Options</b> dialog box.</body></html>
diff --git a/jEdit/doc/tips/tip42.html b/jEdit/doc/tips/tip42.html
index b1ae106..fe69b5d 100644
--- a/jEdit/doc/tips/tip42.html
+++ b/jEdit/doc/tips/tip42.html
@@ -1 +1 @@
-<html><body>Pressing <b>C+\</b> turns multiple selection on and off.</body></html>
+<html><body>Pressing <b>C+\</b> turns multiple selection on and off.</body></html>
diff --git a/jEdit/doc/tips/tip43.html b/jEdit/doc/tips/tip43.html
index a059c39..3a49fde 100644
--- a/jEdit/doc/tips/tip43.html
+++ b/jEdit/doc/tips/tip43.html
@@ -1,2 +1,2 @@
-<html><body>Font smoothing can be enabled in the <b>Text Area</b> pane of the
-<b>Utilities</b>><b>Global Options</b> dialog box.</body></html>
+<html><body>Font smoothing can be enabled in the <b>Text Area</b> pane of the
+<b>Utilities</b>><b>Global Options</b> dialog box.</body></html>
diff --git a/jEdit/doc/tips/tip44.html b/jEdit/doc/tips/tip44.html
index 29003b6..fdc6c5c 100644
--- a/jEdit/doc/tips/tip44.html
+++ b/jEdit/doc/tips/tip44.html
@@ -1,3 +1,3 @@
-<html><body>New syntax highlighting modes are very easy to add. See the
-<b>Writing Modes</b> part of the jEdit user's guide
-(<b>Help</b>><b>jEdit Help</b>) to find out how.</body></html>
+<html><body>New syntax highlighting modes are very easy to add. See the
+<b>Writing Modes</b> part of the jEdit user's guide
+(<b>Help</b>><b>jEdit Help</b>) to find out how.</body></html>
diff --git a/jEdit/doc/tips/tip45.html b/jEdit/doc/tips/tip45.html
index 40d07b2..53b3aa3 100644
--- a/jEdit/doc/tips/tip45.html
+++ b/jEdit/doc/tips/tip45.html
@@ -1,10 +1,10 @@
-<html><body>jEdit macros can
-be written in BeanShell or any scripting language for which the appropriate
-plugin is installed (for example, Python scripting is provided by the
-<b>JythonInterpreter</b> plugin).
-
-<p>
-See the
-<b>Writing Macros</b> part of the jEdit user's guide
-(<b>Help</b>><b>jEdit Help</b>) to find out more about
-BeanShell.</body></html>
+<html><body>jEdit macros can
+be written in BeanShell or any scripting language for which the appropriate
+plugin is installed (for example, Python scripting is provided by the
+<b>JythonInterpreter</b> plugin).
+
+<p>
+See the
+<b>Writing Macros</b> part of the jEdit user's guide
+(<b>Help</b>><b>jEdit Help</b>) to find out more about
+BeanShell.</body></html>
diff --git a/jEdit/doc/tips/tip46.html b/jEdit/doc/tips/tip46.html
index 5f2a88a..db3cd15 100644
--- a/jEdit/doc/tips/tip46.html
+++ b/jEdit/doc/tips/tip46.html
@@ -1,4 +1,4 @@
-<html><body>If you know how to program in Java, you will find jEdit
-plugins very easy to write. See the
-<b>Writing Plugins</b> part of the jEdit user's guide
-(<b>Help</b>><b>jEdit Help</b>) to find out how.</body></html>
+<html><body>If you know how to program in Java, you will find jEdit
+plugins very easy to write. See the
+<b>Writing Plugins</b> part of the jEdit user's guide
+(<b>Help</b>><b>jEdit Help</b>) to find out how.</body></html>
diff --git a/jEdit/doc/tips/tip47.html b/jEdit/doc/tips/tip47.html
index 6d9bff3..4d39dde 100644
--- a/jEdit/doc/tips/tip47.html
+++ b/jEdit/doc/tips/tip47.html
@@ -1,4 +1,4 @@
-<html><body>If you want to run compilers and other external programs
-from within jEdit, you should install the <b>Console</b> plugin. Plugins can
-be downloaded and installed from within jEdit using the plugin manager
-(<b>Plugins</b>><b>Plugin Manager</b>).</body></html>
+<html><body>If you want to run compilers and other external programs
+from within jEdit, you should install the <b>Console</b> plugin. Plugins can
+be downloaded and installed from within jEdit using the plugin manager
+(<b>Plugins</b>><b>Plugin Manager</b>).</body></html>
diff --git a/jEdit/doc/tips/tip48.html b/jEdit/doc/tips/tip48.html
index 38c2ebb..33fc4e7 100644
--- a/jEdit/doc/tips/tip48.html
+++ b/jEdit/doc/tips/tip48.html
@@ -1,4 +1,4 @@
-<html><body>If you use jEdit to edit HTML or XML files, you should install the
-<b>JTidy</b> and <b>XML</b> plugins. Plugins can
-be downloaded and installed from within jEdit using the plugin manager
-(<b>Plugins</b>><b>Plugin Manager</b>).</body></html>
+<html><body>If you use jEdit to edit HTML or XML files, you should install the
+<b>JTidy</b> and <b>XML</b> plugins. Plugins can
+be downloaded and installed from within jEdit using the plugin manager
+(<b>Plugins</b>><b>Plugin Manager</b>).</body></html>
diff --git a/jEdit/doc/tips/tip49.html b/jEdit/doc/tips/tip49.html
index 18a91c9..9812980 100644
--- a/jEdit/doc/tips/tip49.html
+++ b/jEdit/doc/tips/tip49.html
@@ -1,5 +1,5 @@
-<html><body>If you use jEdit to edit Java source, you should install the
-<b>JBrowse</b>, <b>JExplorer</b>, <b>JImporter</b> and <b>JTools</b> plugins.
-Plugins can
-be downloaded and installed from within jEdit using the plugin manager
-(<b>Plugins</b>><b>Plugin Manager</b>).</body></html>
+<html><body>If you use jEdit to edit Java source, you should install the
+<b>JBrowse</b>, <b>JExplorer</b>, <b>JImporter</b> and <b>JTools</b> plugins.
+Plugins can
+be downloaded and installed from within jEdit using the plugin manager
+(<b>Plugins</b>><b>Plugin Manager</b>).</body></html>
diff --git a/jEdit/doc/tips/tip5.html b/jEdit/doc/tips/tip5.html
index dd412ad..a981b66 100644
--- a/jEdit/doc/tips/tip5.html
+++ b/jEdit/doc/tips/tip5.html
@@ -1,2 +1,2 @@
-<html><body>You can close this dialog box by pressing <b>ENTER</b> or <b>ESCAPE</b>.
-</body></html>
+<html><body>You can close this dialog box by pressing <b>ENTER</b> or <b>ESCAPE</b>.
+</body></html>
diff --git a/jEdit/doc/tips/tip50.html b/jEdit/doc/tips/tip50.html
index a43cb62..feec8c0 100644
--- a/jEdit/doc/tips/tip50.html
+++ b/jEdit/doc/tips/tip50.html
@@ -1,4 +1,4 @@
-<html><body>The very handy <b>JDiff</b> plugin shows two files side-by-side,
-highlighting the differences. Plugins can
-be downloaded and installed from within jEdit using the plugin manager
-(<b>Plugins</b>><b>Plugin Manager</b>).</body></html>
+<html><body>The very handy <b>JDiff</b> plugin shows two files side-by-side,
+highlighting the differences. Plugins can
+be downloaded and installed from within jEdit using the plugin manager
+(<b>Plugins</b>><b>Plugin Manager</b>).</body></html>
diff --git a/jEdit/doc/tips/tip51.html b/jEdit/doc/tips/tip51.html
index e8554a3..f0cca96 100644
--- a/jEdit/doc/tips/tip51.html
+++ b/jEdit/doc/tips/tip51.html
@@ -1 +1 @@
-<html><body>You can use the favorites feature for quick access to frequently used files and directories. Look in the <b>Utilities</b>><b>Favorites</b> menu in jEdit's menu bar, or the <b>Favorites</b> menu in the file system browser.</body></html>
+<html><body>You can use the favorites feature for quick access to frequently used files and directories. Look in the <b>Utilities</b>><b>Favorites</b> menu in jEdit's menu bar, or the <b>Favorites</b> menu in the file system browser.</body></html>
diff --git a/jEdit/doc/tips/tip52.html b/jEdit/doc/tips/tip52.html
index e0ae35d..f3d8308 100644
--- a/jEdit/doc/tips/tip52.html
+++ b/jEdit/doc/tips/tip52.html
@@ -1,5 +1,5 @@
-<html><body>
-To stay up-to-date in the world of jEdit,
-subscribe to the mailing lists by visiting
-<font color="blue"><u>http://www.jedit.org/?page=feedback</u></font>.
-</body></html>
+<html><body>
+To stay up-to-date in the world of jEdit,
+subscribe to the mailing lists by visiting
+<font color="blue"><u>http://www.jedit.org/?page=feedback</u></font>.
+</body></html>
diff --git a/jEdit/doc/tips/tip53.html b/jEdit/doc/tips/tip53.html
index 3b08e49..bb1c0a9 100644
--- a/jEdit/doc/tips/tip53.html
+++ b/jEdit/doc/tips/tip53.html
@@ -1,4 +1,4 @@
-<html><body>
-The file system browser and many plugin windows can be docked into
-the view. Just click on the menu button in the top left corner of a dockable window and select the docking location from the popup menu shown.
-</body></html>
+<html><body>
+The file system browser and many plugin windows can be docked into
+the view. Just click on the menu button in the top left corner of a dockable window and select the docking location from the popup menu shown.
+</body></html>
diff --git a/jEdit/doc/tips/tip54.html b/jEdit/doc/tips/tip54.html
index 9119c8c..492c96c 100644
--- a/jEdit/doc/tips/tip54.html
+++ b/jEdit/doc/tips/tip54.html
@@ -1,3 +1,3 @@
-<html><body>
-The <b>Help</b>><b>About jEdit</b> dialog box is really cool.
-</body></html>
+<html><body>
+The <b>Help</b>><b>About jEdit</b> dialog box is really cool.
+</body></html>
diff --git a/jEdit/doc/tips/tip55.html b/jEdit/doc/tips/tip55.html
index 9a802fd..1d4b011 100644
--- a/jEdit/doc/tips/tip55.html
+++ b/jEdit/doc/tips/tip55.html
@@ -1,17 +1,17 @@
-<html><body>
-The <b>Utilities</b>><b>BeanShell</b>><b>Evaluate For Selected Lines</b> command
-evaluates the specified BeanShell expression for each selected line,
-replacing the contents of that line with the return value of the
-expression.<p>
-
-For example, you can use this to add a line number to each selected
-line, by evaluating the following expression:<p>
-
-<code>(index+1) + " " + text</code><p>
-
-Or you can add a prefix and suffix to each selected line, with this
-expression:<p>
-
-<code>"<listitem>" + text + "</listitem>"</code>
-
-</body></html>
+<html><body>
+The <b>Utilities</b>><b>BeanShell</b>><b>Evaluate For Selected Lines</b> command
+evaluates the specified BeanShell expression for each selected line,
+replacing the contents of that line with the return value of the
+expression.<p>
+
+For example, you can use this to add a line number to each selected
+line, by evaluating the following expression:<p>
+
+<code>(index+1) + " " + text</code><p>
+
+Or you can add a prefix and suffix to each selected line, with this
+expression:<p>
+
+<code>"<listitem>" + text + "</listitem>"</code>
+
+</body></html>
diff --git a/jEdit/doc/tips/tip56.html b/jEdit/doc/tips/tip56.html
index c3cd8da..d542764 100644
--- a/jEdit/doc/tips/tip56.html
+++ b/jEdit/doc/tips/tip56.html
@@ -1,17 +1,17 @@
-<html><body>
-You can click on various parts of the status bar:
-<ul>
-<li>Double-clicking the caret position display opens the <b>Go to Line</b>
-dialog box.
-<li>Double-clicking the edit mode, folding mode, or encoding indicator opens the
-<b>Buffer Options</b>
-dialog box.
-<li>Clicking the various status flags changes them.
-<li>Double-clicking the memory indicator opens the <b>Memory Status</b> dialog
-box.
-</ul>
-
-To configure what components are shown in the status bar, go to the
-<b>Status Bar</b> pane of the <b>Utilities</b>><b>Global Options</b> dialog
-box.
-</body></html>
+<html><body>
+You can click on various parts of the status bar:
+<ul>
+<li>Double-clicking the caret position display opens the <b>Go to Line</b>
+dialog box.
+<li>Double-clicking the edit mode, folding mode, or encoding indicator opens the
+<b>Buffer Options</b>
+dialog box.
+<li>Clicking the various status flags changes them.
+<li>Double-clicking the memory indicator opens the <b>Memory Status</b> dialog
+box.
+</ul>
+
+To configure what components are shown in the status bar, go to the
+<b>Status Bar</b> pane of the <b>Utilities</b>><b>Global Options</b> dialog
+box.
+</body></html>
diff --git a/jEdit/doc/tips/tip57.html b/jEdit/doc/tips/tip57.html
index d31dddb..560e86c 100644
--- a/jEdit/doc/tips/tip57.html
+++ b/jEdit/doc/tips/tip57.html
@@ -1,5 +1,5 @@
-<html><body>
-When sorting a set of text strings (for example, a file listing) jEdit
-treats numbers specially, so for example "My file 10" will be placed after
-"My file 2".
-</body></html>
+<html><body>
+When sorting a set of text strings (for example, a file listing) jEdit
+treats numbers specially, so for example "My file 10" will be placed after
+"My file 2".
+</body></html>
diff --git a/jEdit/doc/tips/tip58.html b/jEdit/doc/tips/tip58.html
index 4ed1b06..2f9cf01 100644
--- a/jEdit/doc/tips/tip58.html
+++ b/jEdit/doc/tips/tip58.html
@@ -1,6 +1,6 @@
-<html><body>
-The file system browser can mark different types of files with different
-colors to make file listings easier to read. You can edit the file types and colors
-in the <b>File System Browser</b>><b>Colors</b> pane of the
-<b>Utilities</b>><b>Global Options</b> dialog box.
-</body></html>
+<html><body>
+The file system browser can mark different types of files with different
+colors to make file listings easier to read. You can edit the file types and colors
+in the <b>File System Browser</b>><b>Colors</b> pane of the
+<b>Utilities</b>><b>Global Options</b> dialog box.
+</body></html>
diff --git a/jEdit/doc/tips/tip59.html b/jEdit/doc/tips/tip59.html
index 6d5e690..86abd30 100644
--- a/jEdit/doc/tips/tip59.html
+++ b/jEdit/doc/tips/tip59.html
@@ -1,19 +1,19 @@
-<html><body>
-jEdit's text editing commands become very powerful when used together.
-For example, here is one way, when programming in Java,
-to find all uses of an instance variable that are outside the current
-method:
-
-<ul>
-<li>Position the caret inside a method and invoke
-<b>Edit</b>><b>Source</b>><b>Select Code Block</b>.
-<li>Invoke <b>Edit</b>><b>Invert Selection</b> (<b>C+e i</b>).
-<li>Invoke <b>Search</b>><b>Find</b> (<b>C+f</b>).
-<li>Type in the variable name and press <b>Enter</b>.
-<li>Because text is selected, the <b>HyperSearch</b> and
-<b>Search in Selection</b> settings will be chosen by default.
-<li>The <b>HyperSearch Results</b> window will list all uses of
-that variable outside the selected method.
-</ul>
-
-</body></html>
+<html><body>
+jEdit's text editing commands become very powerful when used together.
+For example, here is one way, when programming in Java,
+to find all uses of an instance variable that are outside the current
+method:
+
+<ul>
+<li>Position the caret inside a method and invoke
+<b>Edit</b>><b>Source</b>><b>Select Code Block</b>.
+<li>Invoke <b>Edit</b>><b>Invert Selection</b> (<b>C+e i</b>).
+<li>Invoke <b>Search</b>><b>Find</b> (<b>C+f</b>).
+<li>Type in the variable name and press <b>Enter</b>.
+<li>Because text is selected, the <b>HyperSearch</b> and
+<b>Search in Selection</b> settings will be chosen by default.
+<li>The <b>HyperSearch Results</b> window will list all uses of
+that variable outside the selected method.
+</ul>
+
+</body></html>
diff --git a/jEdit/doc/tips/tip6.html b/jEdit/doc/tips/tip6.html
index 39e84f8..d53f37d 100644
--- a/jEdit/doc/tips/tip6.html
+++ b/jEdit/doc/tips/tip6.html
@@ -1,2 +1,2 @@
-<html><body>Try right-clicking on the text area. The menu that appears
-can be customized by selecting <b>Customize</b> from the menu.</body></html>
+<html><body>Try right-clicking on the text area. The menu that appears
+can be customized by selecting <b>Customize</b> from the menu.</body></html>
diff --git a/jEdit/doc/tips/tip60.html b/jEdit/doc/tips/tip60.html
index f3a8488..0712c1c 100644
--- a/jEdit/doc/tips/tip60.html
+++ b/jEdit/doc/tips/tip60.html
@@ -1,8 +1,8 @@
-<html><body>
-The <b>Search</b>><b>Find</b> command behaves differently when text is
-selected. If the selection spans multiple lines, the
-<b>Search in Selection</b> setting is selected by default. If the selection
-does not contain line breaks,
-the <b>Search in Current Buffer</b> setting is chosen, and the selection
-is copied into the search string field.
-</body></html>
+<html><body>
+The <b>Search</b>><b>Find</b> command behaves differently when text is
+selected. If the selection spans multiple lines, the
+<b>Search in Selection</b> setting is selected by default. If the selection
+does not contain line breaks,
+the <b>Search in Current Buffer</b> setting is chosen, and the selection
+is copied into the search string field.
+</body></html>
diff --git a/jEdit/doc/tips/tip61.html b/jEdit/doc/tips/tip61.html
index 4952d4f..4609389 100644
--- a/jEdit/doc/tips/tip61.html
+++ b/jEdit/doc/tips/tip61.html
@@ -1,6 +1,6 @@
-<html><body>
-If you are using the "Metal" look and feel (which is the default)
-you can change the user interface control font in the
-<b>Appearance</b> pane of the <b>Utilities</b>><b>Global Options</b>
-dialog box.
-</body></html>
+<html><body>
+If you are using the "Metal" look and feel (which is the default)
+you can change the user interface control font in the
+<b>Appearance</b> pane of the <b>Utilities</b>><b>Global Options</b>
+dialog box.
+</body></html>
diff --git a/jEdit/doc/tips/tip62.html b/jEdit/doc/tips/tip62.html
index 5e593b0..a51130b 100644
--- a/jEdit/doc/tips/tip62.html
+++ b/jEdit/doc/tips/tip62.html
@@ -1,5 +1,5 @@
-<html><body>
-Pressing <b>TAB</b> or <b>A+RIGHT</b>
-while a selection is active shifts each selected line
-to the right by one level of indent.
-</body></html>
+<html><body>
+Pressing <b>TAB</b> or <b>A+RIGHT</b>
+while a selection is active shifts each selected line
+to the right by one level of indent.
+</body></html>
diff --git a/jEdit/doc/tips/tip63.html b/jEdit/doc/tips/tip63.html
index 363f4a4..428ecb3 100644
--- a/jEdit/doc/tips/tip63.html
+++ b/jEdit/doc/tips/tip63.html
@@ -1,5 +1,5 @@
-<html><body>
-Pressing <b>S+TAB</b> or <b>A+LEFT</b>
-while a selection is active shifts each selected line
-to the left by one level of indent.
-</body></html>
+<html><body>
+Pressing <b>S+TAB</b> or <b>A+LEFT</b>
+while a selection is active shifts each selected line
+to the left by one level of indent.
+</body></html>
diff --git a/jEdit/doc/tips/tip64.html b/jEdit/doc/tips/tip64.html
index a911b49..25d8b1f 100644
--- a/jEdit/doc/tips/tip64.html
+++ b/jEdit/doc/tips/tip64.html
@@ -1,2 +1,2 @@
-<html><body>Check out <font color="blue"><u>http://www.jedit.org</u></font> and
-<font color="blue"><u>http://community.jedit.org</u></font>.</body></html>
+<html><body>Check out <font color="blue"><u>http://www.jedit.org</u></font> and
+<font color="blue"><u>http://community.jedit.org</u></font>.</body></html>
diff --git a/jEdit/doc/tips/tip65.html b/jEdit/doc/tips/tip65.html
index 86ede3f..2ab6f1f 100644
--- a/jEdit/doc/tips/tip65.html
+++ b/jEdit/doc/tips/tip65.html
@@ -1,8 +1,8 @@
-<html><body>The <b>ignore case</b> search and replace flag behaves
-in an intelligent manner when replacing occurrences of the search string.
-If the occurrence is all lower case, all upper case or title case,
-the replace string will be converted into the relevant case when
-inserted into the buffer.<p>
-
-This automatic conversion is only performed if the replacement
-string is all-lower case.</body></html>
+<html><body>The <b>ignore case</b> search and replace flag behaves
+in an intelligent manner when replacing occurrences of the search string.
+If the occurrence is all lower case, all upper case or title case,
+the replace string will be converted into the relevant case when
+inserted into the buffer.<p>
+
+This automatic conversion is only performed if the replacement
+string is all-lower case.</body></html>
diff --git a/jEdit/doc/tips/tip66.html b/jEdit/doc/tips/tip66.html
index a994c6b..be84870 100644
--- a/jEdit/doc/tips/tip66.html
+++ b/jEdit/doc/tips/tip66.html
@@ -1,2 +1,2 @@
-<html><body>Just like most Unix shells, jEdit interprets a tilde ("~") at the
-start of a path name as being the location of your home directory.</body></html>
+<html><body>Just like most Unix shells, jEdit interprets a tilde ("~") at the
+start of a path name as being the location of your home directory.</body></html>
diff --git a/jEdit/doc/tips/tip67.html b/jEdit/doc/tips/tip67.html
index 4b37b41..62234bc 100644
--- a/jEdit/doc/tips/tip67.html
+++ b/jEdit/doc/tips/tip67.html
@@ -1,5 +1,5 @@
-<html><body>By default, jEdit strips the final end of line character when
-loading a buffer, and re-adds it when saving.
-You can specify that the final end of line be always visible in the
-<b>General</b> pane of the
-<b>Utilities</b>><b>Buffer Options</b> dialog box.</body></html>
+<html><body>By default, jEdit strips the final end of line character when
+loading a buffer, and re-adds it when saving.
+You can specify that the final end of line be always visible in the
+<b>General</b> pane of the
+<b>Utilities</b>><b>Buffer Options</b> dialog box.</body></html>
diff --git a/jEdit/doc/tips/tip68.html b/jEdit/doc/tips/tip68.html
index 0eea300..1fdd735 100644
--- a/jEdit/doc/tips/tip68.html
+++ b/jEdit/doc/tips/tip68.html
@@ -1,3 +1,3 @@
-<html><body>To select a fold, <b>Control</b>-click the
-fold indicator in the gutter. To narrow the display to a fold, <b>Alt</b>-click the fold indicator in the gutter.
-</body></html>
+<html><body>To select a fold, <b>Control</b>-click the
+fold indicator in the gutter. To narrow the display to a fold, <b>Alt</b>-click the fold indicator in the gutter.
+</body></html>
diff --git a/jEdit/doc/tips/tip69.html b/jEdit/doc/tips/tip69.html
index ac1a44c..95a9a35 100644
--- a/jEdit/doc/tips/tip69.html
+++ b/jEdit/doc/tips/tip69.html
@@ -1,22 +1,22 @@
-<html><body>
-Using the search bar can be a real time saver in a lot of cases, especially
-when you need to jump around between different parts of a buffer.<p>
-
-By default, the search bar is only shown when
-one of the quick search commands are invoked; however you can specify that it
-always be shown in the <b>View</b> pane of the <b>Utilities</b>><b>Global
-Options</b> dialog box.<p>
-
-The following keyboard commands deal with the search bar; you will find it
-much easier to navigate around files if you memorize these:
-
-<ul>
-<li>Pressing <b>C+,</b> shows the search bar (if necessary) and sends keyboard
-focus there.</li>
-<li>Pressing <b>C+.</b> also shows the search bar, but pre-selects the
-<b>HyperSearch</b> check box.</li>
-<li>Pressing <b>A+,</b> puts the word at the caret location into the search bar.</li>
-<li>Pressing <b>A+.</b> performs a HyperSearch for the word at the caret location.</li>
-</ul>
-
-</body></html>
+<html><body>
+Using the search bar can be a real time saver in a lot of cases, especially
+when you need to jump around between different parts of a buffer.<p>
+
+By default, the search bar is only shown when
+one of the quick search commands are invoked; however you can specify that it
+always be shown in the <b>View</b> pane of the <b>Utilities</b>><b>Global
+Options</b> dialog box.<p>
+
+The following keyboard commands deal with the search bar; you will find it
+much easier to navigate around files if you memorize these:
+
+<ul>
+<li>Pressing <b>C+,</b> shows the search bar (if necessary) and sends keyboard
+focus there.</li>
+<li>Pressing <b>C+.</b> also shows the search bar, but pre-selects the
+<b>HyperSearch</b> check box.</li>
+<li>Pressing <b>A+,</b> puts the word at the caret location into the search bar.</li>
+<li>Pressing <b>A+.</b> performs a HyperSearch for the word at the caret location.</li>
+</ul>
+
+</body></html>
diff --git a/jEdit/doc/tips/tip7.html b/jEdit/doc/tips/tip7.html
index 34db984..3999372 100644
--- a/jEdit/doc/tips/tip7.html
+++ b/jEdit/doc/tips/tip7.html
@@ -1,2 +1,2 @@
-<html><body>You can browse directories and rename or delete files in the
-<b>Utilities</b>><b>File System Browser</b> window.</body></html>
+<html><body>You can browse directories and rename or delete files in the
+<b>Utilities</b>><b>File System Browser</b> window.</body></html>
diff --git a/jEdit/doc/tips/tip70.html b/jEdit/doc/tips/tip70.html
index 1dd580b..88acbb0 100644
--- a/jEdit/doc/tips/tip70.html
+++ b/jEdit/doc/tips/tip70.html
@@ -1,4 +1,4 @@
-<html><body>When you are editing a file with folds, you can use
-<b>A+UP</b> and <b>A+DOWN</b> to go to the previous and next fold,
-and <b>C+e u</b> to go to the fold containing the one at the caret
-position.</body></html>
+<html><body>When you are editing a file with folds, you can use
+<b>A+UP</b> and <b>A+DOWN</b> to go to the previous and next fold,
+and <b>C+e u</b> to go to the fold containing the one at the caret
+position.</body></html>
diff --git a/jEdit/doc/tips/tip71.html b/jEdit/doc/tips/tip71.html
index 115fb45..bc6ef51 100644
--- a/jEdit/doc/tips/tip71.html
+++ b/jEdit/doc/tips/tip71.html
@@ -1,3 +1,3 @@
-<html><body>The <b>Range Comment</b> and <b>Line Comment</b> commands
-are context-sensitive; so when editing an HTML file, for example, they
-behave differently in HTML text and inline JavaScript.</body></html>
+<html><body>The <b>Range Comment</b> and <b>Line Comment</b> commands
+are context-sensitive; so when editing an HTML file, for example, they
+behave differently in HTML text and inline JavaScript.</body></html>
diff --git a/jEdit/doc/tips/tip72.html b/jEdit/doc/tips/tip72.html
index fcb7a5e..eb91d27 100644
--- a/jEdit/doc/tips/tip72.html
+++ b/jEdit/doc/tips/tip72.html
@@ -1,8 +1,8 @@
-<html><body>jEdit supports word wrap, although it is disabled by
-default. You can enable it in the <b>Buffer Options</b> and
-<b>Global Options</b> dialog boxes.<p>
-
-Two wrapping modes are supported; "soft" and "hard". In the
-former, text is wrapped on the fly while being displayed; in the latter,
-newlines are automatically inserted into text while it is being typed.
-</body></html>
+<html><body>jEdit supports word wrap, although it is disabled by
+default. You can enable it in the <b>Buffer Options</b> and
+<b>Global Options</b> dialog boxes.<p>
+
+Two wrapping modes are supported; "soft" and "hard". In the
+former, text is wrapped on the fly while being displayed; in the latter,
+newlines are automatically inserted into text while it is being typed.
+</body></html>
diff --git a/jEdit/doc/tips/tip73.html b/jEdit/doc/tips/tip73.html
index 8d44279..80735ea 100644
--- a/jEdit/doc/tips/tip73.html
+++ b/jEdit/doc/tips/tip73.html
@@ -1,6 +1,6 @@
-<html><body>
-If you have a three-button mouse, you can middle-click files in the
-file system browser to open them, instead of double-clicking.
-Holding down <b>Shift</b> while double- or middle-clicking opens files
-in a new view.
-</body></html>
+<html><body>
+If you have a three-button mouse, you can middle-click files in the
+file system browser to open them, instead of double-clicking.
+Holding down <b>Shift</b> while double- or middle-clicking opens files
+in a new view.
+</body></html>
diff --git a/jEdit/doc/tips/tip74.html b/jEdit/doc/tips/tip74.html
index 14b2ae2..249760e 100644
--- a/jEdit/doc/tips/tip74.html
+++ b/jEdit/doc/tips/tip74.html
@@ -1,7 +1,7 @@
-<html><body>
-If you prefer Emacs-like auto indent behavior, where pressing
-<b>Tab</b> anywhere in a line sets its indent accordingly, try
-binding the <b>Indent Selected Lines</b> command to the <b>TAB</b> key in the
-<b>Shortcuts</b> pane of the
-<b>Utilities</b>><b>Global Options</b> dialog box.
-</body></html>
+<html><body>
+If you prefer Emacs-like auto indent behavior, where pressing
+<b>Tab</b> anywhere in a line sets its indent accordingly, try
+binding the <b>Indent Selected Lines</b> command to the <b>TAB</b> key in the
+<b>Shortcuts</b> pane of the
+<b>Utilities</b>><b>Global Options</b> dialog box.
+</body></html>
diff --git a/jEdit/doc/tips/tip75.html b/jEdit/doc/tips/tip75.html
index d2c953e..c7e5e69 100644
--- a/jEdit/doc/tips/tip75.html
+++ b/jEdit/doc/tips/tip75.html
@@ -1,19 +1,19 @@
-<html><body>
-If <b>quick copy</b> is enabled in
-the <b>Mouse</b> pane of the <b>Utilities</b>><b>Global
-Options</b> dialog box, dragging with the middle mouse button over some text
-inserts that text at the previous caret position.<p>
-
-This feature has some additional behavior you might not expect:
-
-<ul>
-<li>It can be used to transfer text between edit panes in a split view.
-<li>Holding down <b>Shift</b> while clicking the middle mouse button immediately duplicates all text between the caret position and the clicked location.
-<li>If there already is a selection when you start middle-dragging, the selection
-will be replaced with the region you marked with the mouse.</li>
-<li>Holding down <b>Control</b> while dragging the middle mouse button marks a
-rectangular area, and pastes it vertically at the caret location (or into the
-current selection).</li>
-</ul>
-
-</body></html>
+<html><body>
+If <b>quick copy</b> is enabled in
+the <b>Mouse</b> pane of the <b>Utilities</b>><b>Global
+Options</b> dialog box, dragging with the middle mouse button over some text
+inserts that text at the previous caret position.<p>
+
+This feature has some additional behavior you might not expect:
+
+<ul>
+<li>It can be used to transfer text between edit panes in a split view.
+<li>Holding down <b>Shift</b> while clicking the middle mouse button immediately duplicates all text between the caret position and the clicked location.
+<li>If there already is a selection when you start middle-dragging, the selection
+will be replaced with the region you marked with the mouse.</li>
+<li>Holding down <b>Control</b> while dragging the middle mouse button marks a
+rectangular area, and pastes it vertically at the caret location (or into the
+current selection).</li>
+</ul>
+
+</body></html>
diff --git a/jEdit/doc/tips/tip76.html b/jEdit/doc/tips/tip76.html
index c04f288..a6e460e 100644
--- a/jEdit/doc/tips/tip76.html
+++ b/jEdit/doc/tips/tip76.html
@@ -1,5 +1,5 @@
-<html><body>
-If you want to search for or replace with newline characters, enable
-regular expression search and insert <code>\n</code>
-somewhere in the search or replacement string.
-</body></html>
+<html><body>
+If you want to search for or replace with newline characters, enable
+regular expression search and insert <code>\n</code>
+somewhere in the search or replacement string.
+</body></html>
diff --git a/jEdit/doc/tips/tip77.html b/jEdit/doc/tips/tip77.html
index 714ce57..c9087b0 100644
--- a/jEdit/doc/tips/tip77.html
+++ b/jEdit/doc/tips/tip77.html
@@ -1,3 +1,3 @@
-<html><body>You can open a file in a new view or new split by
-right-clicking on it in the <b>Open File</b> dialog box and selecting
-the appropriate command from the menu.</body></html>
+<html><body>You can open a file in a new view or new split by
+right-clicking on it in the <b>Open File</b> dialog box and selecting
+the appropriate command from the menu.</body></html>
diff --git a/jEdit/doc/tips/tip78.html b/jEdit/doc/tips/tip78.html
index 740044f..49f7a96 100644
--- a/jEdit/doc/tips/tip78.html
+++ b/jEdit/doc/tips/tip78.html
@@ -1,2 +1,2 @@
-<html><body><b>View</b>><b>New Plain View</b> opens a new view without
-any docked windows or tool bars.</body></html>
+<html><body><b>View</b>><b>New Plain View</b> opens a new view without
+any docked windows or tool bars.</body></html>
diff --git a/jEdit/doc/tips/tip79.html b/jEdit/doc/tips/tip79.html
index 61a1d0a..82a5df4 100644
--- a/jEdit/doc/tips/tip79.html
+++ b/jEdit/doc/tips/tip79.html
@@ -1,6 +1,6 @@
-<html><body>
-If you use dockable windows, you might have noticed that the tool bar placement
-policy has changed in jEdit 4.1. If you would prefer to revert to the old
-jEdit 4.0 behavior, you can do so in the <b>View</b> pane of the
-<b>Utilities</b>><b>Global Options</b> dialog box.
-</body></html>
+<html><body>
+If you use dockable windows, you might have noticed that the tool bar placement
+policy has changed in jEdit 4.1. If you would prefer to revert to the old
+jEdit 4.0 behavior, you can do so in the <b>View</b> pane of the
+<b>Utilities</b>><b>Global Options</b> dialog box.
+</body></html>
diff --git a/jEdit/doc/tips/tip8.html b/jEdit/doc/tips/tip8.html
index 4940320..fc0f57f 100644
--- a/jEdit/doc/tips/tip8.html
+++ b/jEdit/doc/tips/tip8.html
@@ -1,15 +1,15 @@
-<html><body>
-
-You can change numbers from decimal to hexadecimal (or any other base for that matter) using the search and replace feature.<p>
-
-First select the number(s) to convert, and make sure <b>Search in selection</b> is selected in the search dialog box. Then
-search for the following regular expression:<p>
-
-<code>.*</code><p>
-
-And replace it with the following BeanShell snippet:<p>
-
-<code>Integer.toString(Integer.parseInt(_0),16)</code>
-
-</body>
-</html>
+<html><body>
+
+You can change numbers from decimal to hexadecimal (or any other base for that matter) using the search and replace feature.<p>
+
+First select the number(s) to convert, and make sure <b>Search in selection</b> is selected in the search dialog box. Then
+search for the following regular expression:<p>
+
+<code>.*</code><p>
+
+And replace it with the following BeanShell snippet:<p>
+
+<code>Integer.toString(Integer.parseInt(_0),16)</code>
+
+</body>
+</html>
diff --git a/jEdit/doc/tips/tip80.html b/jEdit/doc/tips/tip80.html
index 0017fa4..63c4a63 100644
--- a/jEdit/doc/tips/tip80.html
+++ b/jEdit/doc/tips/tip80.html
@@ -1,8 +1,8 @@
-<html><body>
-You can open files stored in various character encodings by changing the
-encoding in the file system browser's <b>Commands</b> menu before opening
-the file.<p>
-
-The encoding to use when saving a buffer can be changed in the
-<b>Utilities</b>><b>Buffer Options</b> dialog box.
-</body></html>
+<html><body>
+You can open files stored in various character encodings by changing the
+encoding in the file system browser's <b>Commands</b> menu before opening
+the file.<p>
+
+The encoding to use when saving a buffer can be changed in the
+<b>Utilities</b>><b>Buffer Options</b> dialog box.
+</body></html>
diff --git a/jEdit/doc/tips/tip81.html b/jEdit/doc/tips/tip81.html
index fc7770f..5167b3a 100644
--- a/jEdit/doc/tips/tip81.html
+++ b/jEdit/doc/tips/tip81.html
@@ -1,6 +1,6 @@
-<html><body>
-Before getting back to work, cook yourself up a delicious meal from the
-official jEdit cookbook:<p>
-
-<font color="blue">http://www.rutherfurd.net/cookbook/</font>
-</body></html>
+<html><body>
+Before getting back to work, cook yourself up a delicious meal from the
+official jEdit cookbook:<p>
+
+<font color="blue">http://www.rutherfurd.net/cookbook/</font>
+</body></html>
diff --git a/jEdit/doc/tips/tip82.html b/jEdit/doc/tips/tip82.html
index fe5bbbd..510fcf8 100644
--- a/jEdit/doc/tips/tip82.html
+++ b/jEdit/doc/tips/tip82.html
@@ -1,7 +1,7 @@
-<html><body>
-To open a new, floating, instance of a docked window, right-click on the dockable's button and select <b>New Floating Instance</b> from the resulting menu.<p>
-
-To open a new, floating, instance of a floating window, click the menu button in the top left corner of the window and select <b>New Floating Instance</b> from the resulting menu.<p>
-
-You can use this to open multiple file system browsers at once, for example.
-</body></html>
+<html><body>
+To open a new, floating, instance of a docked window, right-click on the dockable's button and select <b>New Floating Instance</b> from the resulting menu.<p>
+
+To open a new, floating, instance of a floating window, click the menu button in the top left corner of the window and select <b>New Floating Instance</b> from the resulting menu.<p>
+
+You can use this to open multiple file system browsers at once, for example.
+</body></html>
diff --git a/jEdit/doc/tips/tip83.html b/jEdit/doc/tips/tip83.html
index 2365898..4ce24cc 100644
--- a/jEdit/doc/tips/tip83.html
+++ b/jEdit/doc/tips/tip83.html
@@ -1,5 +1,5 @@
-<html><body>
-The directory search feature of the search dialog box supports searching inside
-virtual file systems such as ZIP or TAR archives (if the <b>Archive</b> plugin
-is installed) or FTP servers (if the <b>FTP</b> plugin is installed).
-</body></html>
+<html><body>
+The directory search feature of the search dialog box supports searching inside
+virtual file systems such as ZIP or TAR archives (if the <b>Archive</b> plugin
+is installed) or FTP servers (if the <b>FTP</b> plugin is installed).
+</body></html>
diff --git a/jEdit/doc/tips/tip84.html b/jEdit/doc/tips/tip84.html
index 3e9ab37..b3c6065 100644
--- a/jEdit/doc/tips/tip84.html
+++ b/jEdit/doc/tips/tip84.html
@@ -1,5 +1,5 @@
-<html><body>If you use a version control system, try the
-<b>Gruntspud</b> plugin (CVS), <b>SourceControl</b> (Perforce, Visual SourceSafe) or <b>ClearCase</b>.
-Plugins can
-be downloaded and installed from within jEdit using the plugin manager
-(<b>Plugins</b>><b>Plugin Manager</b>).</body></html>
+<html><body>If you use a version control system, try the
+<b>Gruntspud</b> plugin (CVS), <b>SourceControl</b> (Perforce, Visual SourceSafe) or <b>ClearCase</b>.
+Plugins can
+be downloaded and installed from within jEdit using the plugin manager
+(<b>Plugins</b>><b>Plugin Manager</b>).</body></html>
diff --git a/jEdit/doc/tips/tip85.html b/jEdit/doc/tips/tip85.html
index eb607f3..c1fff9b 100644
--- a/jEdit/doc/tips/tip85.html
+++ b/jEdit/doc/tips/tip85.html
@@ -1,9 +1,9 @@
-<html><body>The <b>SpellCheck</b> plugin lets you check spelling within
-jEdit if the <code>aspell</code> utility is installed. <code>aspell</code> can
-be found at <font color="blue"><u>http://aspell.sourceforge.net</u></font>.<p>
-
-<b>Jazzy</b> is alternative spelling checker plugin that does not rely on an external utility.<p>
-
-Plugins can
-be downloaded and installed from within jEdit using the plugin manager
-(<b>Plugins</b>><b>Plugin Manager</b>).</body></html>
+<html><body>The <b>SpellCheck</b> plugin lets you check spelling within
+jEdit if the <code>aspell</code> utility is installed. <code>aspell</code> can
+be found at <font color="blue"><u>http://aspell.sourceforge.net</u></font>.<p>
+
+<b>Jazzy</b> is alternative spelling checker plugin that does not rely on an external utility.<p>
+
+Plugins can
+be downloaded and installed from within jEdit using the plugin manager
+(<b>Plugins</b>><b>Plugin Manager</b>).</body></html>
diff --git a/jEdit/doc/tips/tip86.html b/jEdit/doc/tips/tip86.html
index 66e0bec..c1039de 100644
--- a/jEdit/doc/tips/tip86.html
+++ b/jEdit/doc/tips/tip86.html
@@ -1,5 +1,5 @@
-<html><body>To quickly switch the line separator and word wrap mode from
-the keyboard, assign shortcuts to the <b>Toggle Line Separator</b> and
-<b>Toggle Word Wrap</b> commands in the
-<b>Shortcuts</b> pane of the <b>Utilities</b>><b>Global Options</b>
-dialog box.</body></html>
+<html><body>To quickly switch the line separator and word wrap mode from
+the keyboard, assign shortcuts to the <b>Toggle Line Separator</b> and
+<b>Toggle Word Wrap</b> commands in the
+<b>Shortcuts</b> pane of the <b>Utilities</b>><b>Global Options</b>
+dialog box.</body></html>
diff --git a/jEdit/doc/tips/tip87.html b/jEdit/doc/tips/tip87.html
index 10043dd..1ce0907 100644
--- a/jEdit/doc/tips/tip87.html
+++ b/jEdit/doc/tips/tip87.html
@@ -1,12 +1,12 @@
-<html><body>If you have a mouse with a scroll wheel, you can use the
-wheel to scroll up and down in the text area. Various modifier keys
-change the action of the wheel:
-
-<ul>
-<li><b>Shift</b> - scrolls an entire page at a time.
-<li><b>Control</b> - scrolls a single line at a time.
-<li><b>Alt</b> - moves the caret up and down instead of scrolling.
-<li><b>Alt-Shift</b> - extends the selection up and down instead of scrolling.
-</ul>
-
-</body></html>
+<html><body>If you have a mouse with a scroll wheel, you can use the
+wheel to scroll up and down in the text area. Various modifier keys
+change the action of the wheel:
+
+<ul>
+<li><b>Shift</b> - scrolls an entire page at a time.
+<li><b>Control</b> - scrolls a single line at a time.
+<li><b>Alt</b> - moves the caret up and down instead of scrolling.
+<li><b>Alt-Shift</b> - extends the selection up and down instead of scrolling.
+</ul>
+
+</body></html>
diff --git a/jEdit/doc/tips/tip88.html b/jEdit/doc/tips/tip88.html
index e42d246..d52cf90 100644
--- a/jEdit/doc/tips/tip88.html
+++ b/jEdit/doc/tips/tip88.html
@@ -1,2 +1,2 @@
-<html><body>Pressing <b>C+e C+j</b> moves keyboard focus to the text area.
-</body></html>
+<html><body>Pressing <b>C+e C+j</b> moves keyboard focus to the text area.
+</body></html>
diff --git a/jEdit/doc/tips/tip89.html b/jEdit/doc/tips/tip89.html
index e4f2d8f..8574aa0 100644
--- a/jEdit/doc/tips/tip89.html
+++ b/jEdit/doc/tips/tip89.html
@@ -1,26 +1,26 @@
-<html><body>
-
-In jEdit 4.1, the "indent on enter" and "indent on tab"
-settings were removed. Now, the behavior of the <b>ENTER</b> and <b>TAB</b> keys
-can be configured in the <b>Shortcuts</b> pane of the <b>Global Options</b> dialog
-box, just as with any other key. The <b>ENTER</b> key can be bound to one of
-the following commands, for example:
-
-<ul>
-<li><b>Insert Newline</b>
-<li><b>Insert Newline and Indent</b> (default)
-</ul>
-
-The <b>TAB</b> key can be bound to one of these commands:
-
-<ul>
-<li><b>Insert Tab</b>
-<li><b>Insert Tab or Indent</b> (default)
-<li><b>Indent Selected Lines</b>
-</ul>
-
-Custom behavior can also be implemented by binding these keys to
-macros, etc.
-
-</body>
-</html>
+<html><body>
+
+In jEdit 4.1, the "indent on enter" and "indent on tab"
+settings were removed. Now, the behavior of the <b>ENTER</b> and <b>TAB</b> keys
+can be configured in the <b>Shortcuts</b> pane of the <b>Global Options</b> dialog
+box, just as with any other key. The <b>ENTER</b> key can be bound to one of
+the following commands, for example:
+
+<ul>
+<li><b>Insert Newline</b>
+<li><b>Insert Newline and Indent</b> (default)
+</ul>
+
+The <b>TAB</b> key can be bound to one of these commands:
+
+<ul>
+<li><b>Insert Tab</b>
+<li><b>Insert Tab or Indent</b> (default)
+<li><b>Indent Selected Lines</b>
+</ul>
+
+Custom behavior can also be implemented by binding these keys to
+macros, etc.
+
+</body>
+</html>
diff --git a/jEdit/doc/tips/tip9.html b/jEdit/doc/tips/tip9.html
index fdd91d7..a203e5c 100644
--- a/jEdit/doc/tips/tip9.html
+++ b/jEdit/doc/tips/tip9.html
@@ -1,5 +1,5 @@
-<html><body>You can view multiple buffers at a time, in one single view.
-<b>C+2</b> splits the view horizontally. <b>C+3</b> splits
-the view vertically. <b>C+1</b> removes all splits from the
-view. <b>C+0</b> removes the currently focused split from the view. jEdit remembers if the view was split between editing sessions.
-</body></html>
+<html><body>You can view multiple buffers at a time, in one single view.
+<b>C+2</b> splits the view horizontally. <b>C+3</b> splits
+the view vertically. <b>C+1</b> removes all splits from the
+view. <b>C+0</b> removes the currently focused split from the view. jEdit remembers if the view was split between editing sessions.
+</body></html>
diff --git a/jEdit/doc/tips/tip90.html b/jEdit/doc/tips/tip90.html
index 6885387..c519330 100644
--- a/jEdit/doc/tips/tip90.html
+++ b/jEdit/doc/tips/tip90.html
@@ -1,27 +1,27 @@
-<html><body>
-
-In jEdit 4.1, the "smart home/end" setting was removed. Now, the
-behavior of the <b>HOME</b> and <b>END</b> keys can be configured in the <b>Shortcuts</b>
-pane of the <b>Global Options</b> dialog box, just as with any other key. The
-HOME key can be bound to one of the following commands, for example:
-
-<ul>
-<li><b>Go to Start of Line</b>
-<li><b>Go to Start of White Space</b>
-<li><b>Go to Start of Buffer</b>
-<li><b>Smart Home</b> (default three-keystroke behavior)
-</ul>
-
-The <b>END</b> key can be bound to one of these commands:
-
-<ul>
-<li><b>Go to End of Line</b>
-<li><b>Go to End of White Space</b>
-<li><b>Go to End of Buffer</b>
-<li><b>Smart End</b> (default three-keystroke behavior)
-</ul>
-
-There are corresponding "Select to..." commands that can be bound to
-<b>S+HOME</b> and <b>S+END</b> too.
-
-</body></html>
+<html><body>
+
+In jEdit 4.1, the "smart home/end" setting was removed. Now, the
+behavior of the <b>HOME</b> and <b>END</b> keys can be configured in the <b>Shortcuts</b>
+pane of the <b>Global Options</b> dialog box, just as with any other key. The
+HOME key can be bound to one of the following commands, for example:
+
+<ul>
+<li><b>Go to Start of Line</b>
+<li><b>Go to Start of White Space</b>
+<li><b>Go to Start of Buffer</b>
+<li><b>Smart Home</b> (default three-keystroke behavior)
+</ul>
+
+The <b>END</b> key can be bound to one of these commands:
+
+<ul>
+<li><b>Go to End of Line</b>
+<li><b>Go to End of White Space</b>
+<li><b>Go to End of Buffer</b>
+<li><b>Smart End</b> (default three-keystroke behavior)
+</ul>
+
+There are corresponding "Select to..." commands that can be bound to
+<b>S+HOME</b> and <b>S+END</b> too.
+
+</body></html>
diff --git a/jEdit/doc/tips/tip91.html b/jEdit/doc/tips/tip91.html
index a707213..8e953d0 100644
--- a/jEdit/doc/tips/tip91.html
+++ b/jEdit/doc/tips/tip91.html
@@ -1,10 +1,10 @@
-<html><body>
-By rebinding commands in the <b>Shortcuts</b> pane of the <b>Global Options</b>
-dialog box, the <b>C+LEFT</b>/<b>C+RIGHT</b> commands can be reconfigured to skip
-whitespace, like they do in some other text editors.<p>
-
-The standard commands are named <b>Go to Previous/Next Word</b>; the
-alternative versions are named <b>Go to Previous/Next Word (Eat
-Whitespace)</b>. Corresponding <b>Select to...</b> commands exist for
-<b>CS+LEFT</b>/<b>RIGHT</b>.
-</body></html>
+<html><body>
+By rebinding commands in the <b>Shortcuts</b> pane of the <b>Global Options</b>
+dialog box, the <b>C+LEFT</b>/<b>C+RIGHT</b> commands can be reconfigured to skip
+whitespace, like they do in some other text editors.<p>
+
+The standard commands are named <b>Go to Previous/Next Word</b>; the
+alternative versions are named <b>Go to Previous/Next Word (Eat
+Whitespace)</b>. Corresponding <b>Select to...</b> commands exist for
+<b>CS+LEFT</b>/<b>RIGHT</b>.
+</body></html>
diff --git a/jEdit/doc/tips/tip92.html b/jEdit/doc/tips/tip92.html
index 916b72c..627ba62 100644
--- a/jEdit/doc/tips/tip92.html
+++ b/jEdit/doc/tips/tip92.html
@@ -1,3 +1,3 @@
-<html><body>
-You can press <b>A+`</b> to display the buffer switcher.
-</body></html>
+<html><body>
+You can press <b>A+`</b> to display the buffer switcher.
+</body></html>
diff --git a/jEdit/doc/tips/tip93.html b/jEdit/doc/tips/tip93.html
index 645b20f..7b7130f 100644
--- a/jEdit/doc/tips/tip93.html
+++ b/jEdit/doc/tips/tip93.html
@@ -1,20 +1,20 @@
-<html><body>
-
-You can replace all occurrences of a specific string or regular
-expression with the return value of a BeanShell script if the
-<b>Return value of a BeanShell
-snippet</b> radio button is selected in the search dialog box.<p>
-
-You can use
-this, for example, to replace each occurrence of <quote>Windows</quote> with
-<quote>Linux</quote>, and each occurrence of <quote>Linux</quote> with
-<quote>Windows</quote>, by searching for the following regular expression:<p>
-
-<code>(Windows|Linux)</code><p>
-
-And replacing it with the following BeanShell snippet:<p>
-
-<code>_1.equals("Windows") ? "Linux" : "Windows"</code>
-
-</body>
-</html>
+<html><body>
+
+You can replace all occurrences of a specific string or regular
+expression with the return value of a BeanShell script if the
+<b>Return value of a BeanShell
+snippet</b> radio button is selected in the search dialog box.<p>
+
+You can use
+this, for example, to replace each occurrence of <quote>Windows</quote> with
+<quote>Linux</quote>, and each occurrence of <quote>Linux</quote> with
+<quote>Windows</quote>, by searching for the following regular expression:<p>
+
+<code>(Windows|Linux)</code><p>
+
+And replacing it with the following BeanShell snippet:<p>
+
+<code>_1.equals("Windows") ? "Linux" : "Windows"</code>
+
+</body>
+</html>
diff --git a/jEdit/doc/tips/tip94.html b/jEdit/doc/tips/tip94.html
index 3b410c1..a4c9f34 100644
--- a/jEdit/doc/tips/tip94.html
+++ b/jEdit/doc/tips/tip94.html
@@ -1,19 +1,19 @@
-<html><body>
-
-File name globs that associate files with edit modes can be changed in
-the <b>Editing</b> pane of the <b>Utilities</b>><b>Global Options</b>
-dialog box.<p>
-
-For example, by default files matching "*.inc" are opened in PHP mode,
-but some Pascal implementations use this extension as well. If you find
-yourself with an urgent need to hack some Pascal, just remove "irc" from
-the PHP file name glob to get:
-
-<pre>*.{php3,php4,php,phtml}</pre>
-
-And add it to the Pascal file name glob:
-
-<pre>*.{pas,dpr,dpk}</pre>
-
-</body>
-</html>
+<html><body>
+
+File name globs that associate files with edit modes can be changed in
+the <b>Editing</b> pane of the <b>Utilities</b>><b>Global Options</b>
+dialog box.<p>
+
+For example, by default files matching "*.inc" are opened in PHP mode,
+but some Pascal implementations use this extension as well. If you find
+yourself with an urgent need to hack some Pascal, just remove "irc" from
+the PHP file name glob to get:
+
+<pre>*.{php3,php4,php,phtml}</pre>
+
+And add it to the Pascal file name glob:
+
+<pre>*.{pas,dpr,dpk}</pre>
+
+</body>
+</html>
diff --git a/jEdit/doc/tips/tip95.html b/jEdit/doc/tips/tip95.html
index 6a0a548..229276d 100644
--- a/jEdit/doc/tips/tip95.html
+++ b/jEdit/doc/tips/tip95.html
@@ -1 +1 @@
-<html><body>Suppose you delete a few lines of code, make some further changes, then realize you want the lines of code back. While you just could copy your changes to the clipboard, undo a bunch of times, and paste, there is an easier way. Simply press <b>C+e C+y</b> which will open a dialog box listing the 20 most recently deleted runs of text.</body></html>
+<html><body>Suppose you delete a few lines of code, make some further changes, then realize you want the lines of code back. While you just could copy your changes to the clipboard, undo a bunch of times, and paste, there is an easier way. Simply press <b>C+e C+y</b> which will open a dialog box listing the 20 most recently deleted runs of text.</body></html>
diff --git a/jEdit/doc/tips/tip96.html b/jEdit/doc/tips/tip96.html
index 9411ee7..5b70e8b 100644
--- a/jEdit/doc/tips/tip96.html
+++ b/jEdit/doc/tips/tip96.html
@@ -1 +1 @@
-<html><body>On startup, jEdit restores open buffers, open views and any splits within the views from the previous editing session.</body></html>
+<html><body>On startup, jEdit restores open buffers, open views and any splits within the views from the previous editing session.</body></html>
diff --git a/jEdit/doc/tips/tip97.html b/jEdit/doc/tips/tip97.html
index 24bd297..4f8e84b 100644
--- a/jEdit/doc/tips/tip97.html
+++ b/jEdit/doc/tips/tip97.html
@@ -1,10 +1,10 @@
-<html><body>
-You can insert a string at a specific column on a range of lines using rectangular selections. For example, suppose you want to insert <code>static</code> in front of each of these lines:
-
-<pre>int begin;
-int end;
-long balance;</pre>
-
-Simply <b>Control</b>-drag to form a rectangular selection of zero width at the desired column, and either <b>Paste</b>, or start typing. The text will be inserted in each line at once.
-
-</body></html>
+<html><body>
+You can insert a string at a specific column on a range of lines using rectangular selections. For example, suppose you want to insert <code>static</code> in front of each of these lines:
+
+<pre>int begin;
+int end;
+long balance;</pre>
+
+Simply <b>Control</b>-drag to form a rectangular selection of zero width at the desired column, and either <b>Paste</b>, or start typing. The text will be inserted in each line at once.
+
+</body></html>
diff --git a/jEdit/doc/tips/tip98.html b/jEdit/doc/tips/tip98.html
index ffc0b1c..22ce617 100644
--- a/jEdit/doc/tips/tip98.html
+++ b/jEdit/doc/tips/tip98.html
@@ -1,4 +1,4 @@
-<html><body>
-<b>Control</b>-clicking beyond the end of a line inserts the appropriate
-amount of whitespace necessary to position the caret at the clicked location.
-</body></html>
+<html><body>
+<b>Control</b>-clicking beyond the end of a line inserts the appropriate
+amount of whitespace necessary to position the caret at the clicked location.
+</body></html>
diff --git a/jEdit/doc/users-guide/activity-log.xml b/jEdit/doc/users-guide/activity-log.xml
index c49aed8..5edbce0 100644
--- a/jEdit/doc/users-guide/activity-log.xml
+++ b/jEdit/doc/users-guide/activity-log.xml
@@ -1,53 +1,61 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<appendix id="activity-log">
- <!-- jEdit buffer-local properties: -->
- <!-- :indentSize=4:noTabs=true: -->
- <!-- :xml.root=users-guide.xml: -->
- <title>The Activity Log</title>
-
- <para>The <firstterm>activity log</firstterm> is very useful for
- troubleshooting problems, and helps when developing plugins.</para>
-
- <para><guimenu>Utilities</guimenu>><guisubmenu>Troubleshooting</guisubmenu>><guimenuitem>Activity
- Log</guimenuitem> displays the last 500 lines of the activity log. By
- default, the activity log is shown in a floating window. This window can be
- docked using the commands in its top-left corner popup menu; see <xref
- linkend="docking" />.</para>
-
- <para>The complete log can be found in the <filename>activity.log</filename>
- file inside the jEdit settings directory, the path of which is shown inside
- the activity log window.</para>
-
- <para>jEdit writes the following information to the activity log:</para>
-
- <itemizedlist>
- <listitem>
- <para>Information about your Java implementation (version, operating
- system, architecture, etc).</para>
- </listitem>
-
- <listitem>
- <para>All error messages and runtime exceptions (most errors are
- shown in dialog boxes as well, but the activity log usually contains
- more detailed and technical information).</para>
- </listitem>
-
- <listitem>
- <para>All sorts of debugging information that can be helpful when
- tracking down bugs.</para>
- </listitem>
-
- <listitem>
- <para>Information about loaded plugins.</para>
- </listitem>
-
- </itemizedlist>
-
- <para>While jEdit is running, the log file on disk may not always accurately
- reflect what has been logged, due to buffering being done for performance
- reasons. To ensure the file on disk is up to date, invoke the
- <guimenu>Utilities</guimenu>><guisubmenu>Troubleshooting</guisubmenu>><guimenuitem>Update
- Activity Log on Disk</guimenuitem> command. The log file is also
- automatically updated on disk when jEdit exits.</para>
+<?xml version="1.0" encoding="UTF-8"?>
+
+<appendix id="activity-log">
+ <!-- jEdit buffer-local properties: -->
+ <!-- :indentSize=4:noTabs=true: -->
+ <!-- :xml.root=users-guide.xml: -->
+ <title>The Activity Log</title>
+
+ <para>The <firstterm>activity log</firstterm> is very useful for
+ troubleshooting problems, and helps when developing plugins.</para>
+
+ <para><guimenu>Utilities</guimenu>><guisubmenu>Troubleshooting</guisubmenu>><guimenuitem>Activity
+ Log</guimenuitem> displays the last 500 lines of the activity log. By
+ default, the activity log is shown in a floating window. This window can be
+ docked using the commands in its top-left corner popup menu; see <xref
+ linkend="docking" />.</para>
+
+ <para>The complete log can be found in the <filename>activity.log</filename>
+ file inside the jEdit settings directory, the path of which is shown inside
+ the activity log window.</para>
+
+ <para>jEdit writes the following information to the activity log:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>Information about your Java implementation (version, operating
+ system, architecture, etc).</para>
+ </listitem>
+
+ <listitem>
+ <para>All error messages and runtime exceptions (most errors are
+ shown in dialog boxes as well, but the activity log usually contains
+ more detailed and technical information).</para>
+ </listitem>
+
+ <listitem>
+ <para>All sorts of debugging information that can be helpful when
+ tracking down bugs.</para>
+ </listitem>
+
+ <listitem>
+ <para>Information about loaded plugins.</para>
+ </listitem>
+
+ </itemizedlist>
+
+ <para>While jEdit is running, the log file on disk may not always accurately
+ reflect what has been logged, due to buffering being done for performance
+ reasons. To ensure the file on disk is up to date, invoke the
+ <guimenu>Utilities</guimenu>><guisubmenu>Troubleshooting</guisubmenu>><guimenuitem>Update
+ Activity Log on Disk</guimenuitem> command. The log file is also
+ automatically updated on disk when jEdit exits.</para>
+
+ <para>
+ The "Settings" button in the Activity Log window shows a dialog that lets
+ you adjust the output colors, filter the messages by type, and lets you set
+ the maximum number of lines to display. Note that larger numbers will
+ decrease the overall performance of jEdit since these lines are kept in
+ memory.
+ </para>
</appendix>
\ No newline at end of file
diff --git a/jEdit/doc/users-guide/basics.xml b/jEdit/doc/users-guide/basics.xml
index b776630..d7e30a1 100644
--- a/jEdit/doc/users-guide/basics.xml
+++ b/jEdit/doc/users-guide/basics.xml
@@ -1,528 +1,526 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter id="basics">
- <title>jEdit Basics</title>
- <!-- jEdit buffer-local properties: -->
- <!-- :indentSize=1:noTabs=true: -->
- <!-- :xml.root=users-guide.xml: -->
-
- <section id="overview">
- <title>Interface Overview</title>
-
- <para>A <firstterm>View</firstterm> is the jEdit term for an editor main
- window. It is possible to have multiple views open at once, and each
- View can be split into multiple panes. jEdit remembers the state of open
- views between editing sessions.</para>
-
- <para>An open file is referred to as a <firstterm>Buffer</firstterm>.
- Unlike some editors where each buffer gets its own View, jEdit
- completely separates the two concepts. A buffer might be visible in
- several views, or none at all.</para>
-
- <para>A <firstterm>TextArea</firstterm> is an editor for a buffer.
- An <firstterm>EditPane</firstterm> contains a TextArea plus optional buffer switcher.
- A View contains one EditPane by default, and additional panes are created whenever
- the View is split. </para>
-
- <para>The drop-down buffer switcher list at the top of each EditPane shows
- a buffer set which by default includes all open buffers.
- Selecting a buffer on this list will make it visible in the TextArea. Different
- emblems are displayed next to buffer names in the list, depending the
- buffer's state; a red disk is shown for buffers with unsaved changes, a
- lock is shown for read-only buffers, and a spark is shown for new
- buffers which don't yet exist on disk.</para>
-
- <para>With the new Tango icon theme, these symbols are slightly different,
- a red square is shown for buffers with unsaved changes, a lock is shown for
- read-only buffers, and a yellow square is shown for new buffers which don't
- yet exist on disk.</para>
-
- <para>As with most other graphical applications, there is a tool bar at
- the top of the View which provides quick access to frequently-used
- commands. Also, clicking the TextArea with the right mouse button
- displays a popup menu which also facilitates quick access to various
- commands. Both the tool bar and the right-click menu can be completely
- customized to suit your tastes in the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box; see <xref linkend="context-pane" />
- and <xref linkend="toolbar-pane" />.</para>
-
- <para>Most of the View is taken up by the TextArea. If you've ever used
- a graphical user interface before, the TextArea will be instantly
- familiar. Text can be inserted simply by typing. More details on text
- insertion and deletion can be found in <xref
- linkend="entering-text" />.</para>
-
- <para>The strip on the left of the TextArea is called a
- <firstterm>gutter</firstterm>. The gutter displays marker and register
- locations, as well as folding arrows; it will also display line numbers
- if the <guimenu>View</guimenu>><guimenuitem>Line
- Numbers</guimenuitem> (shortcut: <keycap>C+e C+t</keycap>) command is
- invoked. Note this menu toggle action has the side-effect of changing the
- persistent jEdit properties for the Gutter, which can also
- be set from the <guilabel>Gutter</guilabel> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box.</para>
-
- <para> The gutter is divided into two sections. Right-clicking on the left side
- gives you a context menu, while right-clicking on the right side (where line numbers might be)
- toggles a marker at that position.
- Text can be selected by left-clicking and dragging on right side of the gutter,
- over the range of lines you wish to select.
- </para>
-
- </section>
-
- <section id="views">
- <title>Multiple Views</title>
-
- <para>As documented at the beginning of this chapter, multiple Views
- (main windows) can be open at once.</para>
-
- <para><guimenu>View</guimenu>><guimenuitem>New View</guimenuitem>
- creates a new View, or main window.</para>
-
- <para><guimenu>View</guimenu>><guimenuitem>New Plain
- View</guimenuitem> creates a new View but without any tool bars or
- dockable windows. This can be used to open a small window for taking notes
- and so on.</para>
-
- <para><guimenu>View</guimenu>><guimenuitem>Close View</guimenuitem>
- closes the current View. If only one View is open, closing it will exit
- jEdit, unless background mode is on; see <xref linkend="starting" /> for
- information about starting jEdit in background mode.</para>
-
- <para><guimenu>View</guimenu>><guimenuitem>Split
- Horizontally</guimenuitem> (shortcut: <keycap>C+2</keycap>) splits the
- View into two TextAreas, placed above each other.</para>
-
- <para><guimenu>View</guimenu>><guimenuitem>Split
- Vertically</guimenuitem> (shortcut: <keycap>C+3</keycap>) splits the
- View into two TextAreas, placed next to each other.</para>
-
- <para><guimenu>View</guimenu>><guimenuitem>Unsplit
- Current</guimenuitem> (shortcut: <keycap>C+0</keycap>) removes the split
- containing the current TextArea only.</para>
-
- <para><guimenu>View</guimenu>><guimenuitem>Unsplit All</guimenuitem>
- (shortcut: <keycap>C+1</keycap>) removes all splits from the View.</para>
-
- <para>When a View is split, editing commands operate on the TextArea
- that has keyboard focus. To give a TextArea keyboard focus, click in it
- with the mouse, or use the following commands.</para>
-
- <para><guimenu>View</guimenu>><guimenuitem>Go to Previous Text
- Area</guimenuitem> (shortcut: <keycap>A+PAGE_UP</keycap>) shifts
- keyboard focus to the previous TextArea.</para>
-
- <para><guimenu>View</guimenu>><guimenuitem>Go to Next Text
- Area</guimenuitem> (shortcut: <keycap>A+PAGE_DOWN</keycap>) shifts
- keyboard focus to the next TextArea.</para>
-
- <para><guimenu>Macros</guimenu>><guimenu>Interface</guimenu>>
- <guimenu>Splitpane Grow</guimenu> grows the size of the currently focused
- TextArea. </para>
-
- </section>
-
- <section id="buffers">
- <title>Switching Buffers</title>
-
- <para>Each EditPane has an optional drop-down BufferSwitcher at the top.
- The BufferSwitcher shows the current buffer and can also be used to
- switch the current buffer, using menu item commands and their keyboard shortcuts.</para>
-
- <para><guimenu>View</guimenu>><guimenuitem>Go to Previous
- Buffer</guimenuitem> (keyboard shortcut: <keycap>C+PAGE_UP</keycap>)
- switches to the previous buffer in the list.</para>
-
- <para><guimenu>View</guimenu>><guimenuitem>Go to Next
- Buffer</guimenuitem> (keyboard shortcut: <keycap>C+PAGE_DOWN</keycap>)
- switches to the next buffer in the list.</para>
-
- <para><guimenu>View</guimenu>><guimenuitem>Go to Recent
- Buffer</guimenuitem> (keyboard shortcut: <keycap>C+BACK_QUOTE</keycap>)
- flips between the two most recently edited buffers.</para>
-
- <para><guimenu>View</guimenu>><guimenuitem>Show Buffer
- Switcher</guimenuitem> (keyboard shortcut:
- <keycap>A+BACK_QUOTE</keycap>) has the same effect as clicking on the
- buffer switcher combo box.</para>
-
- <para>If you prefer an alternative graphical paradigm for switching
- buffers, take a look at one of these plugins:</para>
-
- <itemizedlist>
- <listitem>
- <para><application>BufferList</application></para>
- </listitem>
-
- <listitem>
- <para><application>BufferSelector</application></para>
- </listitem>
-
- <listitem>
- <para><application>BufferTabs</application></para>
- </listitem>
- </itemizedlist>
-
- <para>If you decide to use one of these plugins, you can hide the popup
- menu buffer switcher in the <guilabel>View</guilabel> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box.</para>
-
- <para>A number of plugins that implement fast keyboard-based buffer
- switching are available as well:</para>
-
- <itemizedlist>
- <listitem>
- <para><application>FastOpen</application></para>
- </listitem>
-
- <listitem>
- <para><application>OpenIt</application></para>
- </listitem>
-
- <listitem>
- <para><application>SwitchBuffer</application></para>
- </listitem>
- </itemizedlist>
- </section>
-
- <section id="buffersets">
- <title>Buffer Sets</title>
-
- <para> The buffer sets feature helps keep the buffer lists local and manageable when using
- jEdit in a multiple-View and multiple-EditPane environment. </para>
-
- <para> As mentioned in the previous section, each EditPane can show a Buffer Switcher, which
- displays the contents of a BufferSet. In jEdit 4.2, all EditPane buffer switchers
- showed the same BufferSet: a global list of all buffers that were opened from any EditPane in any View.
- When using many Views and EditPanes, this resulted in large lists of buffers, and made
- the next/previous buffer actions useless with many Views, EditPanes and Buffers.
- </para>
-
- <para> In jEdit 4.3, it is possible to have more narrow scopes for the BufferSets
- of an EditPane. This makes the 'next-buffer' and 'previous-buffer' actions switch
- between buffers that are local to the view or pane. </para>
-
- <para>
- The three BufferSet scopes are: </para>
-
- <orderedlist>
- <listitem><para> <emphasis role="bold">Global</emphasis>: Includes all buffers open from any EditPane. </para></listitem>
- <listitem><para> <emphasis role="bold">View</emphasis>: EditPanes in the same
- View share the same BufferSet. Opening a buffer in one View will not affect the
- other views. </para></listitem>
- <listitem><para><emphasis role="bold">EditPane</emphasis>: Each EditPane can have its
- own independent BufferSet.
- </para></listitem>
- </orderedlist>
-
- <para> The Buffer Set scope can be Global, View, or EditPane, and can be
- changed from many places. The default can be set from
- <guimenu>Utilities</guimenu>><guimenuitem>Global Options</guimenuitem>
- > <guimenuitem>View</guimenuitem> > <guilabel>BufferSet scope for new EditPanes</guilabel>.
- </para>
-
- <para> A new BufferSet can be created in a number of ways, such as when a new
- View is created (and the default BufferSet scope is not global) or when the
- View is split (and the default BufferSet scope is EditPane), or when the
- BufferSet scope is changed to EditPane via the statusbar or menu action. </para>
-
- <para> New BufferSets are initially empty, or populated with the current buffer only, or a copy of the
- existing BufferSet. This behavior can be changed from
- <guimenuitem>Global Options</guimenuitem> > <guimenuitem>View</guimenuitem> > <guilabel>New (View/EditPane) BufferSets contain: copies of current BufferSet/Current
- Buffer/Untitled Buffer </guilabel>.</para>
-
- <para> <guimenu>File</guimenu> > <guimenuitem>Close</guimenuitem> behavior has changed in 4.3pre15: now it will remove the current buffer from the EditPane's BufferSet only. If it
- was the last BufferSet to contain that buffer, the buffer is also closed. </para>
-
- <para> The <guimenu> File </guimenu> > <guimenuitem>Close (global)</guimenuitem> action closes the buffer in all EditPanes, as the regular <guimenu> File </guimenu> > <guimenuitem>Close</guimenuitem> action did before. </para>
-
- <para> When <guimenuitem>Exclusive Buffersets</guimenuitem> are enabled, any time a buffer is opened from one EditPane, it should be automatically closed in other EditPanes which use a disjoint (non-intersecting) BufferSet. </para>
-
- <para> <guimenuitem>Clear BufferSet except active</guimenuitem> will clear the BufferSet of the
- current EditPane by performing a <guimenuitem>Close</guimenuitem> on all items except those buffers which are displayed in another active EditPane. </para>
-
- <bridgehead> Switching Bufferset Scopes </bridgehead>
-
- <para> The statusbar shows you which BufferSet scope is active
- (look for the letter "G", "E" or "V"). Double-clicking on that
- will allow you to change the scope. Currently, it changes
- your scope for the current editpane, but this behavior will someday change
- and cause a global scope-change on all editapnes immediately.
- </para>
-
- <para> The scope for BufferSets can also be changed from <guimenu>View</guimenu>><guimenu>Buffer Sets</guimenu> >
- <guimenu>(Global|View|EditPane) Buffer Set</guimenu>. </para>
-
- </section>
-
- <section id="docking">
- <title>Window Docking</title>
-
- <para>Various jEdit and plugin windows can be docked into the View for
- convenience. Dockable windows have a popup button in their top-left
- corner. Clicking this button displays a menu with commands for docking
- the window in one of four sides of the View.</para>
-
- <para>On each side of the TextArea where there are docked windows, a
- strip of buttons is shown. There is a button for activating each docked
- window, as well as a close box and a popup menu button, which when
- clicked shows a menu for moving or undocking the currently selected
- window. The popup menu also contains a command for opening a new
- floating instance of the current window.</para>
-
- <para>The commands in the
- <guimenu>View</guimenu>><guisubmenu>Docking</guisubmenu> menu move
- keyboard focus between docking areas.</para>
-
- <para>Dockable windows can also be configured in the
- <guilabel>Docking</guilabel> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box.</para>
-
- <sidebar>
- <title>For power users</title>
-
- <para>Each dockable has three commands associated with it; one is
- part of the menu bar and opens the dockable. The other two commands
- are:</para>
-
- <itemizedlist>
- <listitem>
- <para><guimenuitem>Window Name (Toggle)</guimenuitem> -
- opens the dockable window if it is hidden, and hide it if
- its already open.</para>
- </listitem>
-
- <listitem>
- <para><guimenuitem>Window Name (New Floating
- Instance)</guimenuitem> - opens a new instance of the
- dockable in a floating window, regardless of the docking
- configuration. For example, this can be used to view two
- different directories side-by-side in two file system
- browser windows.</para>
-
- <para>A new floating instance can also be opened from the
- dockable window's popup menu.</para>
- </listitem>
- </itemizedlist>
-
- <para>These commands cannot be invoked from the menu bar. However,
- they can be added to the tool bar or context menu, and given
- keyboard shortcuts; see <xref linkend="global-opts" />.</para>
- </sidebar>
- </section>
-
- <section id="status-bar">
- <title>The Status Bar</title>
-
- <para>The <firstterm>status bar</firstterm> at the bottom of the View
- consists of the following components, from left to right:</para>
-
- <itemizedlist>
- <listitem>
- <para>Caret position information:</para>
- <itemizedlist>
- <listitem>
- <para>The offset of the caret from the beginning of the file</para>
- </listitem>
-
- <listitem>
- <para>The line number containing the caret</para>
- </listitem>
-
- <listitem>
- <para>The column position of the caret, with the leftmost column
- being 1.</para>
-
- <para>If the line contains tabs, the <firstterm>file</firstterm>
- position (where a hard tab is counted as one column) is shown
- first, followed by the <firstterm>screen</firstterm> position
- (where each tab counts for the number of columns until the next
- tab stop).</para>
- </listitem>
-
- <listitem>
- <para>The percent offset of the caret from the start of the file.
- This is based on the line number of the caret and the total number
- of lines in the file, so this is the same as the relative position
- of the right scroll bar in the main text area.</para>
- </listitem>
-
- </itemizedlist>
- <para>
- All of the above information is configurable in the Global Options
- for the status bar.
- </para>
- <para>Double-clicking on the caret location indicator displays
- the <guimenu>Edit</guimenu>><guimenuitem>Go to
- Line</guimenuitem> dialog box; see <xref
- linkend="lines" />.
- </para>
- </listitem>
-
- <listitem>
- <para>A message area where various prompts and status messages
- are shown.</para>
- </listitem>
-
- <listitem>
- <para>The current buffer's edit mode, fold mode, and character
- encoding. Double-clicking one of these displays the
- <guimenu>Utilities</guimenu>><guimenuitem>Buffer
- Options</guimenuitem> dialog box. For more information about
- these settings, see:</para>
-
- <itemizedlist>
- <listitem>
- <para><xref linkend="buffer-opts" /></para>
- </listitem>
-
- <listitem>
- <para><xref linkend="modes" /></para>
- </listitem>
-
- <listitem>
- <para><xref linkend="folding" /></para>
- </listitem>
-
- <listitem>
- <para><xref linkend="encodings" /></para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para>A set of flags which indicate various editor features and
- settings. Clicking each flag will toggle the feature in
- question; hovering the mouse over a flag will show a tool tip
- with an explanation:</para>
-
- <itemizedlist>
- <listitem>
- <para>Word wrap - see <xref
- linkend="word-wrap" />.</para>
- </listitem>
-
- <listitem>
- <para>Multiple selection - see <xref
- linkend="multi-select" />.</para>
- </listitem>
-
- <listitem>
- <para>Rectangular selection - see <xref
- linkend="rect-select" />.</para>
- </listitem>
-
- <listitem>
- <para>Overwrite mode - see <xref
- linkend="entering-text" />.</para>
- </listitem>
-
- <listitem>
- <para>Line separator - see <xref
- linkend="line-separators" />.</para>
- </listitem>
-
- <listitem>
- <para>Buffer Set Scope - see <xref
- linkend="buffersets" />.</para>
- </listitem>
-
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para>A Java heap memory usage indicator, that shows used and
- total heap memory, in megabytes. Double-clicking this indicator
- opens the
- <guimenu>Utilities</guimenu>><guisubmenu>Troubleshooting</guisubmenu>><guimenuitem>Memory
- Status</guimenuitem> dialog box.</para>
- </listitem>
- </itemizedlist>
-
- <para>The visibility of each of the above items can be controlled in the
- <guibutton>Status Bar</guibutton> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box; see <xref
- linkend="status-bar-pane" />.</para>
- </section>
-
- <section id="action-bar">
- <title>The Action Bar</title>
-
- <para>The action bar allows almost any editor feature to be accessed
- from the keyboard.</para>
-
- <para><guimenu>Utilities</guimenu>><guimenuitem>Action
- Bar</guimenuitem> (shortcut: <keycap>C+ENTER</keycap>) displays the
- action bar at the bottom of the View and gives it keyboard focus. The
- action bar remembers previously entered strings; see <xref
- linkend="history" /> for details.</para>
-
- <para>To use the action bar, input a command and press
- <keycap>Enter</keycap>. The following commands are supported:</para>
-
- <bridgehead renderas="section">Action invocations</bridgehead>
-
- <para>Each menu item and tool bar button is bound to an
- <firstterm>action</firstterm>. To find out the name of an action, invoke
- the menu item or click the tool bar button, and look in the action bar's
- history.</para>
-
- <para>If a substring or an action name is entered, pressing
- <keycap>Tab</keycap> shows a popup listing matching actions. An action
- can be selected using the <keycap>Up</keycap> and <keycap>Down</keycap>
- arrow keys, or by entering more characters of its name.</para>
-
- <para>Pressing <keycap>Enter</keycap> with an incomplete substring
- invokes the action that would be first in the completion popup's
- list.</para>
-
- <para>For example, entering <userinput>l-o</userinput> will match
- <userinput>global-options</userinput>, which has the same effect as
- invoking <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem>.</para>
-
- <bridgehead renderas="section">Buffer-local properties</bridgehead>
-
- <para>Entering <userinput>buffer.property=value</userinput> sets the
- value of the buffer-local property named <userinput>property</userinput>
- to <userinput>value</userinput>. Buffer-local properties are documented
- in <xref linkend="buffer-local" />.</para>
-
- <para>For example, entering <userinput>buffer.tabSize=4</userinput>
- changes the current buffer's tab size to 4.</para>
-
- <para>See <xref linkend="buffer-local" /> for information about
- buffer-local properties.</para>
-
- <bridgehead renderas="section">Global properties</bridgehead>
-
- <para>Entering <userinput>property=value</userinput> sets the value of
- the global property named <userinput>property</userinput> to
- <userinput>value</userinput>. This feature is primarily intended to help
- plugin developers, since the properties jEdit uses to store its settings
- are not currently documented.</para>
-
- <bridgehead renderas="section">Command repetition</bridgehead>
-
- <para>To repeat a command multiple times, enter a number in the action
- bar, then press the key-combination that invokes the command.
- For example,
- <quote><keycap>C+ENTER</keycap> <keycap>1</keycap> <keycap>4</keycap>
- <keycap>C+d</keycap></quote> will delete 14 lines;
- <quote><keycap>C+ENTER</keycap> <keycap>9</keycap>
- <keycap>#</keycap></quote> will insert <quote>#########</quote> in the
- buffer.
- Note: The space characters in these examples should not be typed;
- they are only here to visually separate the keys to be typed.</para>
-
- <para>If you specify a repeat count greater than 20, a confirmation
- dialog box will be displayed, asking if you really want to perform the
- action. This prevents you from hanging jEdit by executing a command too
- many times.</para>
- </section>
-</chapter>
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="basics">
+ <title>jEdit Basics</title>
+ <!-- jEdit buffer-local properties: -->
+ <!-- :indentSize=1:noTabs=true: -->
+ <!-- :xml.root=users-guide.xml: -->
+
+ <section id="overview">
+ <title>Interface Overview</title>
+
+ <para>A <firstterm>View</firstterm> is the jEdit term for an editor main
+ window. It is possible to have multiple views open at once, and each
+ View can be split into multiple panes. jEdit remembers the state of open
+ views between editing sessions.</para>
+
+ <para>An open file is referred to as a <firstterm>Buffer</firstterm>.
+ Unlike some editors where each buffer gets its own View, jEdit
+ completely separates the two concepts. A buffer might be visible in
+ several views, or none at all.</para>
+
+ <para>A <firstterm>TextArea</firstterm> is an editor for a buffer.
+ An <firstterm>EditPane</firstterm> contains a TextArea plus optional buffer switcher.
+ A View contains one EditPane by default, and additional panes are created whenever
+ the View is split. </para>
+
+ <para>The drop-down buffer switcher list at the top of each EditPane shows
+ a buffer set which by default includes all open buffers.
+ Selecting a buffer on this list will make it visible in the TextArea. Different
+ emblems are displayed next to buffer names in the list, depending the
+ buffer's state; a red disk is shown for buffers with unsaved changes, a
+ lock is shown for read-only buffers, and a spark is shown for new
+ buffers which don't yet exist on disk.</para>
+
+ <para>With the new Tango icon theme, these symbols are slightly different,
+ a red square is shown for buffers with unsaved changes, a lock is shown for
+ read-only buffers, and a yellow square is shown for new buffers which don't
+ yet exist on disk.</para>
+
+ <para>As with most other graphical applications, there is a tool bar at
+ the top of the View which provides quick access to frequently-used
+ commands. Also, clicking the TextArea with the right mouse button
+ displays a popup menu which also facilitates quick access to various
+ commands. Both the tool bar and the right-click menu can be completely
+ customized to suit your tastes in the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box; see <xref linkend="context-pane" />
+ and <xref linkend="toolbar-pane" />.</para>
+
+ <para>Most of the View is taken up by the TextArea. If you've ever used
+ a graphical user interface before, the TextArea will be instantly
+ familiar. Text can be inserted simply by typing. More details on text
+ insertion and deletion can be found in <xref
+ linkend="entering-text" />.</para>
+
+ <para>The strip on the left of the TextArea is called a
+ <firstterm>gutter</firstterm>. The gutter displays marker and register
+ locations, as well as folding arrows; it will also display line numbers
+ if the <guimenu>View</guimenu>><guimenuitem>Line
+ Numbers</guimenuitem> (shortcut: <keycap>C+e C+t</keycap>) command is
+ invoked. Note this menu toggle action has the side-effect of changing the
+ persistent jEdit properties for the Gutter, which can also
+ be set from the <guilabel>Gutter</guilabel> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box.</para>
+
+ <para> The gutter is divided into two sections. Right-clicking on the left side
+ gives you a context menu, while right-clicking on the right side (where line numbers might be)
+ toggles a marker at that position.
+ Text can be selected by left-clicking and dragging on right side of the gutter,
+ over the range of lines you wish to select.
+ </para>
+
+ </section>
+
+ <section id="views">
+ <title>Multiple Views</title>
+
+ <para>As documented at the beginning of this chapter, multiple Views
+ (main windows) can be open at once.</para>
+
+ <para><guimenu>View</guimenu>><guimenuitem>New View</guimenuitem>
+ creates a new View, or main window.</para>
+
+ <para><guimenu>View</guimenu>><guimenuitem>New Plain
+ View</guimenuitem> creates a new View but without any tool bars or
+ dockable windows. This can be used to open a small window for taking notes
+ and so on.</para>
+
+ <para><guimenu>View</guimenu>><guimenuitem>Close View</guimenuitem>
+ closes the current View. If only one View is open, closing it will exit
+ jEdit, unless background mode is on; see <xref linkend="starting" /> for
+ information about starting jEdit in background mode.</para>
+
+ <para><guimenu>View</guimenu>><guimenuitem>Split
+ Horizontally</guimenuitem> (shortcut: <keycap>C+2</keycap>) splits the
+ View into two TextAreas, placed above each other.</para>
+
+ <para><guimenu>View</guimenu>><guimenuitem>Split
+ Vertically</guimenuitem> (shortcut: <keycap>C+3</keycap>) splits the
+ View into two TextAreas, placed next to each other.</para>
+
+ <para><guimenu>View</guimenu>><guimenuitem>Unsplit
+ Current</guimenuitem> (shortcut: <keycap>C+0</keycap>) removes the split
+ containing the current TextArea only.</para>
+
+ <para><guimenu>View</guimenu>><guimenuitem>Unsplit All</guimenuitem>
+ (shortcut: <keycap>C+1</keycap>) removes all splits from the View.</para>
+
+ <para>When a View is split, editing commands operate on the TextArea
+ that has keyboard focus. To give a TextArea keyboard focus, click in it
+ with the mouse, or use the following commands.</para>
+
+ <para><guimenu>View</guimenu>><guimenuitem>Go to Previous Text
+ Area</guimenuitem> (shortcut: <keycap>A+PAGE_UP</keycap>) shifts
+ keyboard focus to the previous TextArea.</para>
+
+ <para><guimenu>View</guimenu>><guimenuitem>Go to Next Text
+ Area</guimenuitem> (shortcut: <keycap>A+PAGE_DOWN</keycap>) shifts
+ keyboard focus to the next TextArea.</para>
+
+ <para><guimenu>Macros</guimenu>><guimenu>Interface</guimenu>>
+ <guimenu>Splitpane Grow</guimenu> grows the size of the currently focused
+ TextArea. </para>
+
+ </section>
+
+ <section id="buffers">
+ <title>Switching Buffers</title>
+
+ <para>Each EditPane has an optional drop-down BufferSwitcher at the top.
+ The BufferSwitcher shows the current buffer and can also be used to
+ switch the current buffer, using menu item commands and their keyboard shortcuts.</para>
+
+ <para><guimenu>View</guimenu>><guimenuitem>Go to Previous
+ Buffer</guimenuitem> (keyboard shortcut: <keycap>C+PAGE_UP</keycap>)
+ switches to the previous buffer in the list.</para>
+
+ <para><guimenu>View</guimenu>><guimenuitem>Go to Next
+ Buffer</guimenuitem> (keyboard shortcut: <keycap>C+PAGE_DOWN</keycap>)
+ switches to the next buffer in the list.</para>
+
+ <para><guimenu>View</guimenu>><guimenuitem>Go to Recent
+ Buffer</guimenuitem> (keyboard shortcut: <keycap>C+BACK_QUOTE</keycap>)
+ flips between the two most recently edited buffers.</para>
+
+ <para><guimenu>View</guimenu>><guimenuitem>Show Buffer
+ Switcher</guimenuitem> (keyboard shortcut:
+ <keycap>A+BACK_QUOTE</keycap>) has the same effect as clicking on the
+ buffer switcher combo box.</para>
+
+ <para>If you prefer an alternative graphical paradigm for switching
+ buffers, take a look at one of these plugins:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><application>BufferList</application></para>
+ </listitem>
+
+ <listitem>
+ <para><application>BufferSelector</application></para>
+ </listitem>
+
+ <listitem>
+ <para><application>BufferTabs</application></para>
+ </listitem>
+ </itemizedlist>
+
+ <para>If you decide to use one of these plugins, you can hide the popup
+ menu buffer switcher in the <guilabel>View</guilabel> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box.</para>
+
+ <para>A number of plugins that implement fast keyboard-based buffer
+ switching are available as well:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><application>FastOpen</application></para>
+ </listitem>
+
+ <listitem>
+ <para><application>OpenIt</application></para>
+ </listitem>
+
+ <listitem>
+ <para><application>SwitchBuffer</application></para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section id="buffersets">
+ <title>Buffer Sets</title>
+
+ <para> The buffer sets feature helps keep the buffer lists local and manageable when using
+ jEdit in a multiple-View and multiple-EditPane environment. </para>
+
+ <para> As mentioned in the previous section, each EditPane can show a Buffer Switcher, which
+ displays the contents of a BufferSet. In jEdit 4.2, all EditPane buffer switchers
+ showed the same BufferSet: a global list of all buffers that were opened from any EditPane in any View.
+ When using many Views and EditPanes, this resulted in large lists of buffers, and made
+ the next/previous buffer actions useless with many Views, EditPanes and Buffers.
+ </para>
+
+ <para> In jEdit 4.3, it is possible to have more narrow scopes for the BufferSets
+ of an EditPane. This makes the 'next-buffer' and 'previous-buffer' actions switch
+ between buffers that are local to the view or pane. </para>
+
+ <para>
+ The three BufferSet scopes are: </para>
+
+ <orderedlist>
+ <listitem><para> <emphasis role="bold">Global</emphasis>: Includes all buffers open from any EditPane. </para></listitem>
+ <listitem><para> <emphasis role="bold">View</emphasis>: EditPanes in the same
+ View share the same BufferSet. Opening a buffer in one View will not affect the
+ other views. </para></listitem>
+ <listitem><para><emphasis role="bold">EditPane</emphasis>: Each EditPane can have its
+ own independent BufferSet.
+ </para></listitem>
+ </orderedlist>
+
+ <para> Bufferset scope can be set from <guimenu>Utilities</guimenu>><guimenuitem>Global Options</guimenuitem> > <guimenuitem>View</guimenuitem> >
+ <guilabel>BufferSet scope:</guilabel>.
+ </para>
+
+ <para> <guimenu>File</guimenu> > <guimenuitem>Close</guimenuitem> removes the current buffer from the EditPane's BufferSet only. If it was the last BufferSet to contain that buffer, the buffer is also closed. </para>
+
+ <para> The <guimenu> File </guimenu> > <guimenuitem>Close (global)</guimenuitem> action closes the buffer in all EditPanes, as the jEdit 4.2 <guimenu> File </guimenu> > <guimenuitem>Close</guimenuitem> action did before. </para>
+
+ <para> When <guimenuitem>Exclusive Buffersets</guimenuitem> are enabled, any time a buffer is opened from one EditPane, it should be automatically closed in other EditPanes which use a disjoint (non-intersecting) BufferSet. </para>
+
+ <para> <guimenuitem>Close Others</guimenuitem> will clear the BufferSet of the
+ current EditPane by performing a <guimenuitem>Close</guimenuitem> on all items except those buffers which are displayed in another active EditPane. </para>
+
+ <bridgehead> Switching Bufferset Scopes </bridgehead>
+
+ <para> The statusbar shows you which BufferSet scope is active
+ (look for the letter "G", "E" or "V"). Double-clicking on that
+ will allow you to change the scope without going into global options.
+
+ The BufferSet Scope can also be changed from
+ <guimenu>View</guimenu>><guimenu>Buffer Sets</guimenu> >
+ <guimenu>(Global|View|EditPane) Buffer Set</guimenu>.
+ Changes to the bufferset scope affects all editpanes immediately.
+ </para>
+
+ </section>
+
+ <section id="docking">
+ <title>Window Docking Layouts</title>
+
+ <para> A docking layout is similar to an Eclipse "Perspective" in that it describes a set of dockable windows that are visible to the user at any given time, hiding the rest. </para>
+
+ <para>Various jEdit and plugin windows can be docked into the View for
+ convenience. Dockable windows have a popup button in their top-left
+ corner. Clicking this button displays a menu with commands for docking
+ the window in one of four sides of the View.</para>
+
+ <para>On each side of the TextArea where there are docked windows, a
+ strip of buttons is shown. There is a button for activating each docked
+ window, as well as a close box and a popup menu button, which when
+ clicked shows a menu for moving or undocking the currently selected
+ window. The popup menu also contains a command for opening a new
+ floating instance of the current window.</para>
+
+ <para>The commands in the
+ <guimenu>View</guimenu>><guisubmenu>Docking</guisubmenu> menu move keyboard focus between docking areas.</para>
+
+
+ <para>
+ After you have customized the layout of your dockables and wish to save it for export/import, use the actions <guimenu>View</guimenu> - <guimenu>Docking</guimenu> - <guimenuitem>Save/Load Docking Layout</guimenuitem>. </para>
+ <para> It is possible to configure a Dockable layout for just one or a handful of edit modes. This makes it possible to save or load your dockable layout with the same keyboard shortcut (or automatically) based on the edit mode of your current buffer.
+ </para>
+
+ <para>
+ It is also possible to save/load a layout for a particular edit mode. The loading and saving can be done automatically, as configured in the global options docking pane when the mode of the buffer changes, or manually in response to invoking <guimenu>View</guimenu> - <guimenu>Docking</guimenu> - <guimenuitem>Save/Load Docking Layout for current mode.</guimenuitem>
+ </para>
+
+ <para>Dockable windows can be further configured in the
+ <guilabel>Docking</guilabel> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box. See <xref linkend="docking-pane"/> for details.
+ </para>
+
+
+ <sidebar>
+ <title>For keyboard/power users</title>
+
+ <para>Each dockable has three commands associated with it; one is part of the menu bar and opens the dockable. The other two commands are:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><guimenuitem>Window Name (Toggle)</guimenuitem> -
+ opens the dockable window if it is hidden, and hide it if
+ its already open.</para>
+ </listitem>
+
+ <listitem>
+ <para><guimenuitem>Window Name (New Floating
+ Instance)</guimenuitem> - opens a new instance of the
+ dockable in a floating window, regardless of the docking
+ configuration. For example, this can be used to view two
+ different directories side-by-side in two file system
+ browser windows.</para>
+
+ <para>A new floating instance can also be opened from the
+ dockable window's popup menu.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>These commands cannot be invoked from the menu bar. However,
+ they can be added to the tool bar or context menu, and given
+ keyboard shortcuts; see <xref linkend="global-opts" />.</para>
+ </sidebar>
+ </section>
+
+ <section id="status-bar">
+ <title>The Status Bar</title>
+
+ <para>The <firstterm>status bar</firstterm> at the bottom of the View
+ consists of the following components, from left to right:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>Caret position information:</para>
+ <itemizedlist>
+ <listitem>
+ <para>The offset of the caret from the beginning of the file</para>
+ </listitem>
+
+ <listitem>
+ <para>The line number containing the caret</para>
+ </listitem>
+
+ <listitem>
+ <para>The column position of the caret, with the leftmost column
+ being 1.</para>
+
+ <para>If the line contains tabs, the <firstterm>file</firstterm>
+ position (where a hard tab is counted as one column) is shown
+ first, followed by the <firstterm>screen</firstterm> position
+ (where each tab counts for the number of columns until the next
+ tab stop).</para>
+ </listitem>
+
+ <listitem>
+ <para>The percent offset of the caret from the start of the file.
+ This is based on the line number of the caret and the total number
+ of lines in the file, so this is the same as the relative position
+ of the right scroll bar in the main text area.</para>
+ </listitem>
+
+ </itemizedlist>
+ <para>
+ All of the above information is configurable in the Global Options
+ for the status bar.
+ </para>
+ <para>Double-clicking on the caret location indicator displays
+ the <guimenu>Edit</guimenu>><guimenuitem>Go to
+ Line</guimenuitem> dialog box; see <xref
+ linkend="lines" />.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>A message area where various prompts and status messages
+ are shown.</para>
+ </listitem>
+
+ <listitem>
+ <para>The current buffer's edit mode, fold mode, and character
+ encoding. Double-clicking one of these displays the
+ <guimenu>Utilities</guimenu>><guimenuitem>Buffer
+ Options</guimenuitem> dialog box. For more information about
+ these settings, see:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><xref linkend="buffer-opts" /></para>
+ </listitem>
+
+ <listitem>
+ <para><xref linkend="modes" /></para>
+ </listitem>
+
+ <listitem>
+ <para><xref linkend="folding" /></para>
+ </listitem>
+
+ <listitem>
+ <para><xref linkend="encodings" /></para>
+ </listitem>
+ </itemizedlist>
+ </listitem>
+
+ <listitem>
+ <para>A set of flags which indicate various editor features and
+ settings. Clicking each flag will toggle the feature in
+ question; hovering the mouse over a flag will show a tool tip
+ with an explanation:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>Word wrap - see <xref
+ linkend="word-wrap" />.</para>
+ </listitem>
+
+ <listitem>
+ <para>Multiple selection - see <xref
+ linkend="multi-select" />.</para>
+ </listitem>
+
+ <listitem>
+ <para>Rectangular selection - see <xref
+ linkend="rect-select" />.</para>
+ </listitem>
+
+ <listitem>
+ <para>Overwrite mode - see <xref
+ linkend="entering-text" />.</para>
+ </listitem>
+
+ <listitem>
+ <para>Line separator - see <xref
+ linkend="line-separators" />.</para>
+ </listitem>
+
+ <listitem>
+ <para>Buffer Set Scope - see <xref
+ linkend="buffersets" />.</para>
+ </listitem>
+
+ </itemizedlist>
+ </listitem>
+
+ <listitem>
+ <para>A Java heap memory usage indicator, that shows used and
+ total heap memory, in megabytes. Double-clicking this indicator
+ opens the
+ <guimenu>Utilities</guimenu>><guisubmenu>Troubleshooting</guisubmenu>><guimenuitem>Memory
+ Status</guimenuitem> dialog box.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>The visibility of each of the above items can be controlled in the
+ <guibutton>Status Bar</guibutton> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box; see <xref
+ linkend="status-bar-pane" />.</para>
+ </section>
+
+ <section id="action-bar">
+ <title>The Action Bar</title>
+
+ <para>The action bar allows almost any editor feature to be accessed
+ from the keyboard.</para>
+
+ <para><guimenu>Utilities</guimenu>><guimenuitem>Action
+ Bar</guimenuitem> (shortcut: <keycap>C+ENTER</keycap>) displays the
+ action bar at the bottom of the View and gives it keyboard focus. The
+ action bar remembers previously entered strings; see <xref
+ linkend="history" /> for details.</para>
+
+ <para>To use the action bar, input a command and press
+ <keycap>Enter</keycap>. The following commands are supported:</para>
+
+ <bridgehead>Action invocations</bridgehead>
+
+ <para>Each menu item and tool bar button is bound to an
+ <firstterm>action</firstterm>. To find out the name of an action, invoke
+ the menu item or click the tool bar button, and look in the action bar's
+ history.</para>
+
+ <para>If a substring or an action name is entered, pressing
+ <keycap>Tab</keycap> shows a popup listing matching actions. An action
+ can be selected using the <keycap>Up</keycap> and <keycap>Down</keycap>
+ arrow keys, or by entering more characters of its name.</para>
+
+ <para>Pressing <keycap>Enter</keycap> with an incomplete substring
+ invokes the action that would be first in the completion popup's
+ list.</para>
+
+ <para>For example, entering <userinput>l-o</userinput> will match
+ <userinput>global-options</userinput>, which has the same effect as
+ invoking <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem>.</para>
+
+ <bridgehead>Buffer-local properties</bridgehead>
+
+ <para>Entering <userinput>buffer.property=value</userinput> sets the
+ value of the buffer-local property named <userinput>property</userinput>
+ to <userinput>value</userinput>. Buffer-local properties are documented
+ in <xref linkend="buffer-local" />.</para>
+
+ <para>For example, entering <userinput>buffer.tabSize=4</userinput>
+ changes the current buffer's tab size to 4.</para>
+
+ <para>See <xref linkend="buffer-local" /> for information about
+ buffer-local properties.</para>
+
+ <bridgehead>Global properties</bridgehead>
+
+ <para>Entering <userinput>property=value</userinput> sets the value of
+ the global property named <userinput>property</userinput> to
+ <userinput>value</userinput>. This feature is primarily intended to help
+ plugin developers, since the properties jEdit uses to store its settings
+ are not currently documented.</para>
+
+ <bridgehead>Command repetition</bridgehead>
+
+ <para>To repeat a command multiple times, enter a number in the action
+ bar, then press the key-combination that invokes the command.
+ For example,
+ <quote><keycap>C+ENTER</keycap> <keycap>1</keycap> <keycap>4</keycap>
+ <keycap>C+d</keycap></quote> will delete 14 lines;
+ <quote><keycap>C+ENTER</keycap> <keycap>9</keycap>
+ <keycap>#</keycap></quote> will insert <quote>#########</quote> in the
+ buffer.
+ Note: The space characters in these examples should not be typed;
+ they are only here to visually separate the keys to be typed.</para>
+
+ <para>If you specify a repeat count greater than 20, a confirmation
+ dialog box will be displayed, asking if you really want to perform the
+ action. This prevents you from hanging jEdit by executing a command too
+ many times.</para>
+ </section>
+</chapter>
diff --git a/jEdit/doc/users-guide/bsh-commands.xml b/jEdit/doc/users-guide/bsh-commands.xml
index f6614b5..1465e13 100644
--- a/jEdit/doc/users-guide/bsh-commands.xml
+++ b/jEdit/doc/users-guide/bsh-commands.xml
@@ -1,719 +1,719 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter id="bsh-commands">
-<!-- jEdit buffer local properties:
- :indentSize=1:noTabs=yes:maxLineLen=72:tabSize=2:
- :xml.root=users-guide.xml:
- jEdit 3.2 Macro Guide, (C) 2001 John Gellene
- Thu Jun 21 23:49:14 EDT 2001 @200 /Internet Time/ -->
-
- <title>BeanShell Commands</title>
-
- <para>BeanShell includes a set of <firstterm>commands</firstterm>;
- subroutines that can be called from any script or macro. The following is a
- summary of those commands which may be useful within jEdit.</para>
-
- <note>
- <para>Java classes in plugins cannot make use of BeanShell commands
- directly. However, these commands can be called from BeanShell code that
- is part of a plugin, for example the snippets in
- <filename>actions.xml</filename>, or any BeanShell scripts shipped with
- the plugin and loaded on startup.</para>
- </note>
-
- <section id="bsh-commands-output">
- <title>Output Commands</title>
-
- <itemizedlist>
- <!-- one day jEdit will provide its own error() implementation -->
-
- <!-- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>void <function>error</function></funcdef>
- <paramdef>String <parameter>errorMsg</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
- <para>
- Writes the string represented by <parameter>errorMsg</parameter>
- to the error stream of the current process.
- </para>
- </listitem> -->
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>void <function>cat</function></funcdef>
-
- <paramdef>String
- <parameter>filename</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
-
- <para>Writes the contents of <parameter>filename</parameter> to
- the activity log.</para>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>void <function>javap</function></funcdef>
-
- <paramdef>String | Object | Class
- <parameter>target</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
-
- <para>Writes the public fields and methods of the specified
- class to the output stream of the current process. Requires Java
- 2 version 1.3 or greater.</para>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>void <function>print</function></funcdef>
-
- <paramdef><parameter>arg</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
-
- <para>Writes the string value of the argument to the activity
- log, or if run from the <application>Console</application>
- plugin, to the current output window. If
- <parameter>arg</parameter> is an array,
- <function>print</function> runs itself recursively on the
- array's elements.</para>
- </listitem>
- </itemizedlist>
- </section>
-
- <section id="bsh-commands-file">
- <title>File Management Commands</title>
-
- <itemizedlist>
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>void <function>cd</function></funcdef>
-
- <paramdef>String
- <parameter>dirname</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
-
- <para>Changes the working directory of the BeanShell interpreter
- to <parameter>dirname</parameter>.</para>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>void <function>cp</function></funcdef>
-
- <paramdef>String
- <parameter>fromFile</parameter></paramdef>
-
- <paramdef>String
- <parameter>toFile</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
-
- <para>Copy <parameter>fromFile</parameter> to
- <parameter>toFile</parameter>.</para>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>void <function>dir</function></funcdef>
-
- <paramdef>String
- <parameter>dirname</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
-
- <para>Displays the contents of directory
- <parameter>dirname</parameter>. The format of the display is
- similar to the Unix <function>ls -l</function> command.</para>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>void <function>mv</function></funcdef>
-
- <paramdef>String
- <parameter>fromFile</parameter></paramdef>
-
- <paramdef>String
- <parameter>toFile</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
-
- <para>Moves the file named by <parameter>fromFile</parameter> to
- <parameter>toFile</parameter>.</para>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>File <function>pathToFile</function></funcdef>
-
- <paramdef>String
- <parameter>filename</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
-
- <para>Create a <classname>File</classname> object corresponding
- to <function>filename</function>. Relative paths are resolved
- with reference to the BeanShell interpreter's working
- directory.</para>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>void <function>pwd</function></funcdef>
-
- <void />
- </funcprototype>
- </funcsynopsis>
-
- <para>Writes the current working directory of the BeanShell
- interpreter to the output stream of the current process.</para>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>void <function>rm</function></funcdef>
-
- <paramdef>String
- <parameter>pathname</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
-
- <para>Deletes the file name by
- <parameter>pathname</parameter>.</para>
- </listitem>
- </itemizedlist>
- </section>
-
- <section id="bsh-commands-serial">
- <title>Component Commands</title>
-
- <itemizedlist>
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>JFrame <function>frame</function></funcdef>
-
- <paramdef>Component
- <parameter>frame</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
-
- <para>Displays the component in a top-level
- <classname>JFrame</classname>, centered and packed. Returns the
- <classname>JFrame</classname> object.</para>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>Object <function>load</function></funcdef>
-
- <paramdef>String
- <parameter>filename</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
-
- <para>Loads and returns a serialized Java object from
- <parameter>filename</parameter>.</para>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>void <function>save</function></funcdef>
-
- <paramdef>Component
- <parameter>component</parameter></paramdef>
-
- <paramdef>String
- <parameter>filename</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
-
- <para>Saves <parameter>component</parameter> in serialized form
- to <parameter>filename</parameter>.</para>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>Font <function>setFont</function></funcdef>
-
- <paramdef>Component
- <parameter>comp</parameter></paramdef>
-
- <paramdef>int <parameter>ptsize</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
-
- <para>Set the font size of <parameter>component</parameter> to
- <parameter>ptsize</parameter> and returns the new font.</para>
- </listitem>
- </itemizedlist>
- </section>
-
- <section id="bsh-commands-resource">
- <title>Resource Management Commands</title>
-
- <itemizedlist>
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>URL <function>getResource</function></funcdef>
-
- <paramdef>String <parameter>path</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
-
- <para>Returns the resource specified by
- <parameter>path</parameter>. An absolute path must be used to
- return any resource available in the current classpath.</para>
- </listitem>
-
- <!-- bsh.classpath not supported in jEdit -->
-
- <!--
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>void <function>addClassPath</function></funcdef>
- <paramdef>String <parameter>path</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>void <function>addClassPath</function></funcdef>
- <paramdef>URL <parameter>path</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
- <para>
- Adds the directory or jar archive file specified by
- <parameter>path</parameter> to the classpath used by the
- interpreter.
- </para>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>void <function>setClassPath</function></funcdef>
- <paramdef>URL[] <parameter>paths</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
- <para>
- Changes the classpath for the BeanShell interpreter to the specified
- array of directories and/or archives.
- </para>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>URL[] <function>getClassPath</function></funcdef>
- <void/>
- </funcprototype>
- </funcsynopsis>
- <para>
- Returns an array containing the current classpath.
- </para>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>void <function>reloadClasses</function></funcdef>
- <paramdef>String <parameter>packagename</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>void <function>reloadClasses</function></funcdef>
- <void/>
- </funcprototype>
- </funcsynopsis>
- <para>
- Reloads the class or package specified by
- <parameter>packagename</parameter> in the BeanShell interpreter.
- If called without a parameter, reloads all classes
- in the interpreter's classpath.
- </para>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>Class <function>getClass</function></funcdef>
- <paramdef>String <parameter>classname</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
- <para>
- This method is similar to the <function>Class.forName()</function>
- method of the Java platform, but it uses the classpath of the
- current BeanShell interpreter, which can contain additional
- classes and packages as well as reloaded classes.
- </para>
- </listitem> -->
- </itemizedlist>
- </section>
-
- <section id="bsh-commands-script">
- <title>Script Execution Commands</title>
-
- <itemizedlist>
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>Thread <function>bg</function></funcdef>
-
- <paramdef>String
- <parameter>filename</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
-
- <para>Run the BeanShell script named by
- <parameter>filename</parameter> in a copy of the existing
- namespace and in a separate thread. Returns the
- <classname>Thread</classname> object so created.</para>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>void <function>exec</function></funcdef>
-
- <paramdef>String
- <parameter>cmdline</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
-
- <para>Start the external process by calling
- <function>Runtime.exec()</function> on
- <parameter>cmdline</parameter>. Any output is directed to the
- output stream of the calling process.</para>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>Object <function>eval</function></funcdef>
-
- <paramdef>String
- <parameter>expression</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
-
- <para>Evaluates the string <parameter>expression</parameter> as
- a BeanShell script in the interpreter's current namespace.
- Returns the result of the evaluation of
- <constant>null</constant>.</para>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>org.gjt.sp.jedit.bsh.This
- <function>run</function></funcdef>
-
- <paramdef>String
- <parameter>filename</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
-
- <para>Run the BeanShell script named by
- <parameter>filename</parameter> in a copy of the existing
- namespace. The return value represent the object context of the
- script, allowing you to access its variables and methods.</para>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>void
- <function>setAccessibility</function></funcdef>
-
- <paramdef>boolean <parameter>flag</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
-
- <para>If <parameter>flag</parameter> is <literal>true</literal>,
- BeanShell scripts are allowed to change and modify private
- variables, and call private methods. The default is
- <literal>false</literal>.</para>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>void
- <function>setStrictJava</function></funcdef>
-
- <paramdef>boolean <parameter>flag</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
-
- <para>If <parameter>flag</parameter> is <literal>true</literal>,
- BeanShell scripts must follow a much more strict, Java-like
- syntax, and are not able to use the convenience features
- described in <xref
- linkend="macro-tips-BeanShell-convenience" />.</para>
- </listitem>
-
- <!-- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>void <function>server</function></funcdef>
- <paramdef>int <parameter>port</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
- <para>
- Creates a <quote>server</quote> version of the BeanShell
- interpreter that shares the same namespace as the current
- interpreter. The server interpreter listens on the designated
- port.
- </para>
- <para>
- This requires the <classname>bsh.util</classname> package, which
- is not included with jEdit. It can be found in the stand-alone
- BeanShell distribution, available from <ulink
- url="http://www.beanshell.org">http://www.beanshell.org</ulink>.
- </para>
- <caution><para>
- Security of this port is not guaranteed. Use this command
- with extreme caution.
- </para></caution>
- </listitem> -->
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>void <function>source</function></funcdef>
-
- <paramdef>String
- <parameter>filename</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
-
- <para>Evaluates the contents of <parameter>filename</parameter>
- as a BeanShell script in the interpreter's current
- namespace.</para>
- </listitem>
- </itemizedlist>
- </section>
-
- <section id="bsh-commands-object">
- <title>BeanShell Object Management Commands</title>
-
- <itemizedlist>
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef><function>bind</function></funcdef>
-
- <paramdef>org.gjt.sp.jedit.bsh.This
- <parameter>ths</parameter></paramdef>
-
- <paramdef>org.gjt.sp.jedit.bsh.Namespace
- <parameter>namespace</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
-
- <para>Binds the scripted object <parameter>ths</parameter> to
- <parameter>namespace</parameter>.</para>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>void <function>clear</function></funcdef>
-
- <void />
- </funcprototype>
- </funcsynopsis>
-
- <para>Clear all variables, methods, and imports from this
- namespace. If this namespace is the root, it will be reset to
- the default imports.</para>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>org.gjt.sp.jedit.bsh.This
- <function>extend</function></funcdef>
-
- <paramdef>org.gjt.sp.jedit.bsh.This
- <parameter>object</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
-
- <para>Creates a new BeanShell <classname>This</classname>
- scripted object that is a child of the parameter
- <parameter>object</parameter>.</para>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>void
- <function>importObject</function></funcdef>
-
- <paramdef>Object
- <parameter>object</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
-
- <para>Import an object into this namespace. This is somewhat
- similar to Java 1.5 static class imports, except you can import
- the methods and fields of a Java object instance into a
- BeanShell namespace, for example:</para>
-
- <informalexample>
- <programlisting>Map map = new HashMap();
- importObject( map );
- put("foo", "bar");
- print( get("foo") ); // "bar"</programlisting>
- </informalexample>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>org.gjt.sp.jedit.bsh.This
- <function>object</function></funcdef>
-
- <void />
- </funcprototype>
- </funcsynopsis>
-
- <para>Creates a new BeanShell <classname>This</classname>
- scripted object which can hold data members. You can use this to
- create an object for storing miscellaneous crufties, like
- so:</para>
-
- <informalexample>
- <programlisting>crufties = object();
-crufties.foo = "hello world";
-crufties.counter = 5;
-...</programlisting>
- </informalexample>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef><function>setNameSpace</function></funcdef>
-
- <paramdef>org.gjt.sp.jedit.bsh.Namespace
- <parameter>namespace</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
-
- <para>Set the namespace of the current scope to
- <parameter>namespace</parameter>.</para>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>org.gjt.sp.jedit.bsh.This
- <function>super</function></funcdef>
-
- <paramdef>String
- <parameter>scopename</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
-
- <para>Returns a reference to the BeanShell
- <classname>This</classname> object representing the enclosing
- method scope specified by <parameter>scopename</parameter>. This
- method work similar to the <function>super</function> keyword
- but can refer to enclosing scope at higher levels in a hierarchy
- of scopes.</para>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>void <function>unset</function></funcdef>
-
- <paramdef>String <parameter>name</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
-
- <para>Removes the variable named by <parameter>name</parameter>
- from the current interpreter namespace. This has the effect of
- <quote>undefining</quote> the variable.</para>
- </listitem>
- </itemizedlist>
- </section>
-
- <section id="bsh-commands-other">
- <title>Other Commands</title>
-
- <itemizedlist>
- <!-- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>void <function>exit</function></funcdef>
- <void/>
- </funcprototype>
- </funcsynopsis>
- <para>
- Calls <function>System.exit(0)</function>.
- </para>
- <caution><para>
- While this command is available, you should always call
- <function>jEdit.exit()</function> instead so the application will
- shutdown in an orderly fashion.
- </para></caution>
- </listitem> -->
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>void <function>debug</function></funcdef>
-
- <void />
- </funcprototype>
- </funcsynopsis>
-
- <para>Toggles BeanShell's internal debug reporting to the output
- stream of the current process.</para>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef><function>getSourceFileInfo</function></funcdef>
-
- <void />
- </funcprototype>
- </funcsynopsis>
-
- <para>Returns the name of the file or other source from which
- the BeanShell interpreter is reading.</para>
- </listitem>
- </itemizedlist>
- </section>
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="bsh-commands">
+<!-- jEdit buffer local properties:
+ :indentSize=1:noTabs=yes:maxLineLen=72:tabSize=2:
+ :xml.root=users-guide.xml:
+ jEdit 3.2 Macro Guide, (C) 2001 John Gellene
+ Thu Jun 21 23:49:14 EDT 2001 @200 /Internet Time/ -->
+
+ <title>BeanShell Commands</title>
+
+ <para>BeanShell includes a set of <firstterm>commands</firstterm>;
+ subroutines that can be called from any script or macro. The following is a
+ summary of those commands which may be useful within jEdit.</para>
+
+ <note>
+ <para>Java classes in plugins cannot make use of BeanShell commands
+ directly. However, these commands can be called from BeanShell code that
+ is part of a plugin, for example the snippets in
+ <filename>actions.xml</filename>, or any BeanShell scripts shipped with
+ the plugin and loaded on startup.</para>
+ </note>
+
+ <section id="bsh-commands-output">
+ <title>Output Commands</title>
+
+ <itemizedlist>
+ <!-- one day jEdit will provide its own error() implementation -->
+
+ <!-- <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>void <function>error</function></funcdef>
+ <paramdef>String <parameter>errorMsg</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+ <para>
+ Writes the string represented by <parameter>errorMsg</parameter>
+ to the error stream of the current process.
+ </para>
+ </listitem> -->
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>void <function>cat</function></funcdef>
+
+ <paramdef>String
+ <parameter>filename</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>Writes the contents of <parameter>filename</parameter> to
+ the activity log.</para>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>void <function>javap</function></funcdef>
+
+ <paramdef>String | Object | Class
+ <parameter>target</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>Writes the public fields and methods of the specified
+ class to the output stream of the current process. Requires Java
+ 2 version 1.3 or greater.</para>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>void <function>print</function></funcdef>
+
+ <paramdef><parameter>arg</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>Writes the string value of the argument to the activity
+ log, or if run from the <application>Console</application>
+ plugin, to the current output window. If
+ <parameter>arg</parameter> is an array,
+ <function>print</function> runs itself recursively on the
+ array's elements.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section id="bsh-commands-file">
+ <title>File Management Commands</title>
+
+ <itemizedlist>
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>void <function>cd</function></funcdef>
+
+ <paramdef>String
+ <parameter>dirname</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>Changes the working directory of the BeanShell interpreter
+ to <parameter>dirname</parameter>.</para>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>void <function>cp</function></funcdef>
+
+ <paramdef>String
+ <parameter>fromFile</parameter></paramdef>
+
+ <paramdef>String
+ <parameter>toFile</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>Copy <parameter>fromFile</parameter> to
+ <parameter>toFile</parameter>.</para>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>void <function>dir</function></funcdef>
+
+ <paramdef>String
+ <parameter>dirname</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>Displays the contents of directory
+ <parameter>dirname</parameter>. The format of the display is
+ similar to the Unix <function>ls -l</function> command.</para>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>void <function>mv</function></funcdef>
+
+ <paramdef>String
+ <parameter>fromFile</parameter></paramdef>
+
+ <paramdef>String
+ <parameter>toFile</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>Moves the file named by <parameter>fromFile</parameter> to
+ <parameter>toFile</parameter>.</para>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>File <function>pathToFile</function></funcdef>
+
+ <paramdef>String
+ <parameter>filename</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>Create a <classname>File</classname> object corresponding
+ to <function>filename</function>. Relative paths are resolved
+ with reference to the BeanShell interpreter's working
+ directory.</para>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>void <function>pwd</function></funcdef>
+
+ <void />
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>Writes the current working directory of the BeanShell
+ interpreter to the output stream of the current process.</para>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>void <function>rm</function></funcdef>
+
+ <paramdef>String
+ <parameter>pathname</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>Deletes the file name by
+ <parameter>pathname</parameter>.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section id="bsh-commands-serial">
+ <title>Component Commands</title>
+
+ <itemizedlist>
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>JFrame <function>frame</function></funcdef>
+
+ <paramdef>Component
+ <parameter>frame</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>Displays the component in a top-level
+ <classname>JFrame</classname>, centered and packed. Returns the
+ <classname>JFrame</classname> object.</para>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>Object <function>load</function></funcdef>
+
+ <paramdef>String
+ <parameter>filename</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>Loads and returns a serialized Java object from
+ <parameter>filename</parameter>.</para>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>void <function>save</function></funcdef>
+
+ <paramdef>Component
+ <parameter>component</parameter></paramdef>
+
+ <paramdef>String
+ <parameter>filename</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>Saves <parameter>component</parameter> in serialized form
+ to <parameter>filename</parameter>.</para>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>Font <function>setFont</function></funcdef>
+
+ <paramdef>Component
+ <parameter>comp</parameter></paramdef>
+
+ <paramdef>int <parameter>ptsize</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>Set the font size of <parameter>component</parameter> to
+ <parameter>ptsize</parameter> and returns the new font.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section id="bsh-commands-resource">
+ <title>Resource Management Commands</title>
+
+ <itemizedlist>
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>URL <function>getResource</function></funcdef>
+
+ <paramdef>String <parameter>path</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>Returns the resource specified by
+ <parameter>path</parameter>. An absolute path must be used to
+ return any resource available in the current classpath.</para>
+ </listitem>
+
+ <!-- bsh.classpath not supported in jEdit -->
+
+ <!--
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>void <function>addClassPath</function></funcdef>
+ <paramdef>String <parameter>path</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>void <function>addClassPath</function></funcdef>
+ <paramdef>URL <parameter>path</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+ <para>
+ Adds the directory or jar archive file specified by
+ <parameter>path</parameter> to the classpath used by the
+ interpreter.
+ </para>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>void <function>setClassPath</function></funcdef>
+ <paramdef>URL[] <parameter>paths</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+ <para>
+ Changes the classpath for the BeanShell interpreter to the specified
+ array of directories and/or archives.
+ </para>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>URL[] <function>getClassPath</function></funcdef>
+ <void/>
+ </funcprototype>
+ </funcsynopsis>
+ <para>
+ Returns an array containing the current classpath.
+ </para>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>void <function>reloadClasses</function></funcdef>
+ <paramdef>String <parameter>packagename</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>void <function>reloadClasses</function></funcdef>
+ <void/>
+ </funcprototype>
+ </funcsynopsis>
+ <para>
+ Reloads the class or package specified by
+ <parameter>packagename</parameter> in the BeanShell interpreter.
+ If called without a parameter, reloads all classes
+ in the interpreter's classpath.
+ </para>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>Class <function>getClass</function></funcdef>
+ <paramdef>String <parameter>classname</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+ <para>
+ This method is similar to the <function>Class.forName()</function>
+ method of the Java platform, but it uses the classpath of the
+ current BeanShell interpreter, which can contain additional
+ classes and packages as well as reloaded classes.
+ </para>
+ </listitem> -->
+ </itemizedlist>
+ </section>
+
+ <section id="bsh-commands-script">
+ <title>Script Execution Commands</title>
+
+ <itemizedlist>
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>Thread <function>bg</function></funcdef>
+
+ <paramdef>String
+ <parameter>filename</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>Run the BeanShell script named by
+ <parameter>filename</parameter> in a copy of the existing
+ namespace and in a separate thread. Returns the
+ <classname>Thread</classname> object so created.</para>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>void <function>exec</function></funcdef>
+
+ <paramdef>String
+ <parameter>cmdline</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>Start the external process by calling
+ <function>Runtime.exec()</function> on
+ <parameter>cmdline</parameter>. Any output is directed to the
+ output stream of the calling process.</para>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>Object <function>eval</function></funcdef>
+
+ <paramdef>String
+ <parameter>expression</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>Evaluates the string <parameter>expression</parameter> as
+ a BeanShell script in the interpreter's current namespace.
+ Returns the result of the evaluation of
+ <constant>null</constant>.</para>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>org.gjt.sp.jedit.bsh.This
+ <function>run</function></funcdef>
+
+ <paramdef>String
+ <parameter>filename</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>Run the BeanShell script named by
+ <parameter>filename</parameter> in a copy of the existing
+ namespace. The return value represent the object context of the
+ script, allowing you to access its variables and methods.</para>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>void
+ <function>setAccessibility</function></funcdef>
+
+ <paramdef>boolean <parameter>flag</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>If <parameter>flag</parameter> is <literal>true</literal>,
+ BeanShell scripts are allowed to change and modify private
+ variables, and call private methods. The default is
+ <literal>false</literal>.</para>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>void
+ <function>setStrictJava</function></funcdef>
+
+ <paramdef>boolean <parameter>flag</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>If <parameter>flag</parameter> is <literal>true</literal>,
+ BeanShell scripts must follow a much more strict, Java-like
+ syntax, and are not able to use the convenience features
+ described in <xref
+ linkend="macro-tips-BeanShell-convenience" />.</para>
+ </listitem>
+
+ <!-- <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>void <function>server</function></funcdef>
+ <paramdef>int <parameter>port</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+ <para>
+ Creates a <quote>server</quote> version of the BeanShell
+ interpreter that shares the same namespace as the current
+ interpreter. The server interpreter listens on the designated
+ port.
+ </para>
+ <para>
+ This requires the <classname>bsh.util</classname> package, which
+ is not included with jEdit. It can be found in the stand-alone
+ BeanShell distribution, available from <ulink
+ url="http://www.beanshell.org">http://www.beanshell.org</ulink>.
+ </para>
+ <caution><para>
+ Security of this port is not guaranteed. Use this command
+ with extreme caution.
+ </para></caution>
+ </listitem> -->
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>void <function>source</function></funcdef>
+
+ <paramdef>String
+ <parameter>filename</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>Evaluates the contents of <parameter>filename</parameter>
+ as a BeanShell script in the interpreter's current
+ namespace.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section id="bsh-commands-object">
+ <title>BeanShell Object Management Commands</title>
+
+ <itemizedlist>
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef><function>bind</function></funcdef>
+
+ <paramdef>org.gjt.sp.jedit.bsh.This
+ <parameter>ths</parameter></paramdef>
+
+ <paramdef>org.gjt.sp.jedit.bsh.Namespace
+ <parameter>namespace</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>Binds the scripted object <parameter>ths</parameter> to
+ <parameter>namespace</parameter>.</para>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>void <function>clear</function></funcdef>
+
+ <void />
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>Clear all variables, methods, and imports from this
+ namespace. If this namespace is the root, it will be reset to
+ the default imports.</para>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>org.gjt.sp.jedit.bsh.This
+ <function>extend</function></funcdef>
+
+ <paramdef>org.gjt.sp.jedit.bsh.This
+ <parameter>object</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>Creates a new BeanShell <classname>This</classname>
+ scripted object that is a child of the parameter
+ <parameter>object</parameter>.</para>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>void
+ <function>importObject</function></funcdef>
+
+ <paramdef>Object
+ <parameter>object</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>Import an object into this namespace. This is somewhat
+ similar to Java 1.5 static class imports, except you can import
+ the methods and fields of a Java object instance into a
+ BeanShell namespace, for example:</para>
+
+ <informalexample>
+ <programlisting>Map map = new HashMap();
+ importObject( map );
+ put("foo", "bar");
+ print( get("foo") ); // "bar"</programlisting>
+ </informalexample>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>org.gjt.sp.jedit.bsh.This
+ <function>object</function></funcdef>
+
+ <void />
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>Creates a new BeanShell <classname>This</classname>
+ scripted object which can hold data members. You can use this to
+ create an object for storing miscellaneous crufties, like
+ so:</para>
+
+ <informalexample>
+ <programlisting>crufties = object();
+crufties.foo = "hello world";
+crufties.counter = 5;
+...</programlisting>
+ </informalexample>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef><function>setNameSpace</function></funcdef>
+
+ <paramdef>org.gjt.sp.jedit.bsh.Namespace
+ <parameter>namespace</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>Set the namespace of the current scope to
+ <parameter>namespace</parameter>.</para>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>org.gjt.sp.jedit.bsh.This
+ <function>super</function></funcdef>
+
+ <paramdef>String
+ <parameter>scopename</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>Returns a reference to the BeanShell
+ <classname>This</classname> object representing the enclosing
+ method scope specified by <parameter>scopename</parameter>. This
+ method work similar to the <function>super</function> keyword
+ but can refer to enclosing scope at higher levels in a hierarchy
+ of scopes.</para>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>void <function>unset</function></funcdef>
+
+ <paramdef>String <parameter>name</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>Removes the variable named by <parameter>name</parameter>
+ from the current interpreter namespace. This has the effect of
+ <quote>undefining</quote> the variable.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section id="bsh-commands-other">
+ <title>Other Commands</title>
+
+ <itemizedlist>
+ <!-- <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>void <function>exit</function></funcdef>
+ <void/>
+ </funcprototype>
+ </funcsynopsis>
+ <para>
+ Calls <function>System.exit(0)</function>.
+ </para>
+ <caution><para>
+ While this command is available, you should always call
+ <function>jEdit.exit()</function> instead so the application will
+ shutdown in an orderly fashion.
+ </para></caution>
+ </listitem> -->
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>void <function>debug</function></funcdef>
+
+ <void />
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>Toggles BeanShell's internal debug reporting to the output
+ stream of the current process.</para>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef><function>getSourceFileInfo</function></funcdef>
+
+ <void />
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>Returns the name of the file or other source from which
+ the BeanShell interpreter is reading.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
</chapter>
\ No newline at end of file
diff --git a/jEdit/doc/users-guide/conventions.xml b/jEdit/doc/users-guide/conventions.xml
index f58c118..606f12c 100644
--- a/jEdit/doc/users-guide/conventions.xml
+++ b/jEdit/doc/users-guide/conventions.xml
@@ -1,118 +1,121 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter id="conventions">
- <title>Conventions</title>
- <!-- jEdit buffer-local properties: -->
- <!-- :tabSize=1:indentSize=1:noTabs=true: -->
- <!-- :xml.root=users-guide.xml: -->
-
- <para>Several conventions are used throughout jEdit's user interface and
- this manual. They will be described here. Macintosh users should note how
- their modifier keys map to the terms used in the manual.</para>
-
- <informaltable>
- <tgroup cols="2">
- <tbody>
- <row>
- <entry><guimenu>View</guimenu>><guisubmenu>Scrolling</guisubmenu>><guimenuitem>Scroll
- to Current Line</guimenuitem></entry>
-
- <entry>The <guimenuitem>Scroll to Current Line</guimenuitem>
- command contained in the <guisubmenu>Scrolling</guisubmenu>
- submenu of the <guimenu>View</guimenu> menu.</entry>
- </row>
-
- <row>
- <entry><guimenu>Edit</guimenu>><guimenuitem>Go to
- Line...</guimenuitem></entry>
-
- <entry>Menu items that end with ellipsis (...) display
- dialog boxes.</entry>
- </row>
-
- <row>
- <entry><keycap>C</keycap></entry>
-
- <entry>The primary modifier key in jEdit. On MacOS X, this
- is actually the key known as <quote>Command</quote>. On most
- other keyboards, this key is labelled
- <quote>Control</quote>.</entry>
- </row>
-
- <row>
- <entry><keycap>A</keycap></entry>
-
- <entry>The secondary modifier key in jEdit. On MacOS X, this
- is actually the key labelled <quote>Control</quote>. On most
- other keyboards, this key is labelled
- <quote>Alt</quote>.</entry>
- </row>
-
- <row>
- <entry><keycap>S</keycap></entry>
-
- <entry>The standard <quote>Shift</quote> key.</entry>
- </row>
-
- <row>
- <entry><keycap>C+o</keycap></entry>
-
- <entry>Refers to pressing and holding the
- <keycap>Control</keycap> key, pressing and releasing
- <keycap>O</keycap>, and finally releasing the
- <keycap>Control</keycap> key.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e C+j</keycap></entry>
-
- <entry>Refers to holding down <keycap>Control</keycap>,
- pressing <keycap>E</keycap>, pressing <keycap>J</keycap>,
- and releasing <keycap>Control</keycap>.</entry>
- </row>
-
- <row>
- <entry>Default buttons</entry>
-
- <entry>In many dialog boxes, the default button (it has a
- heavy outline, or a special border, depending on the current
- Swing look and feel) can be activated by pressing
- <keycap>Enter</keycap>. Similarly, pressing
- <keycap>Escape</keycap> will usually close a dialog
- box.</entry>
- </row>
-
- <row>
- <entry><keycap>Alt</keycap>-key mnemonics</entry>
-
- <entry>Some user interface elements (menus, menu items,
- buttons) have a certain letter in their label underlined.
- Pressing this letter in combination with the
- <keycap>Alt</keycap> key activates the associated user
- interface widget. Note that this functionality is not
- available on MacOS X with the <quote>MacOS Adaptive</quote>
- look and feel. See <xref linkend="appearance-pane" /> for
- information on changing the look and feel.</entry>
- </row>
-
- <row>
- <entry>Right mouse button</entry>
-
- <entry>Used in jEdit to show context-sensitive menus. If you
- have a one button Macintosh mouse, a
- <keycap>Control</keycap>-click has the same effect.</entry>
- </row>
-
- <row>
- <entry>Middle mouse button</entry>
-
- <entry>Used by the quick copy feature (see <xref
- linkend="quick-copy" />). True 3-button mice are rare these
- days. If you have a wheel mouse, press down on the wheel
- without rolling it. On a Macintosh with a one-button mouse,
- <keycap>Option</keycap>-click. On other platforms without a
- three-button mouse, <keycap>Alt</keycap>-click.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-</chapter>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="conventions">
+ <title>Conventions</title>
+ <!-- jEdit buffer-local properties: -->
+ <!-- :tabSize=1:indentSize=1:noTabs=true: -->
+ <!-- :xml.root=users-guide.xml: -->
+
+ <para>Several conventions are used throughout jEdit's user interface and
+ this manual. They will be described here. Macintosh users should note how
+ their modifier keys map to the terms used in the manual.</para>
+
+ <informaltable>
+ <tgroup cols="2">
+ <colspec colwidth="*"/>
+ <colspec colwidth="*"/>
+
+ <tbody>
+ <row>
+ <entry><guimenu>View</guimenu>><guisubmenu>Scrolling</guisubmenu>><guimenuitem>Scroll
+ to Current Line</guimenuitem></entry>
+
+ <entry>The <guimenuitem>Scroll to Current Line</guimenuitem>
+ command contained in the <guisubmenu>Scrolling</guisubmenu>
+ submenu of the <guimenu>View</guimenu> menu.</entry>
+ </row>
+
+ <row>
+ <entry><guimenu>Edit</guimenu>><guimenuitem>Go to
+ Line...</guimenuitem></entry>
+
+ <entry>Menu items that end with ellipsis (...) display
+ dialog boxes.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C</keycap></entry>
+
+ <entry>The primary modifier key in jEdit. On MacOS X, this
+ is actually the key known as <quote>Command</quote>. On most
+ other keyboards, this key is labelled
+ <quote>Control</quote>.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>A</keycap></entry>
+
+ <entry>The secondary modifier key in jEdit. On MacOS X, this
+ is actually the key labelled <quote>Control</quote>. On most
+ other keyboards, this key is labelled
+ <quote>Alt</quote>.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>S</keycap></entry>
+
+ <entry>The standard <quote>Shift</quote> key.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+o</keycap></entry>
+
+ <entry>Refers to pressing and holding the
+ <keycap>Control</keycap> key, pressing and releasing
+ <keycap>O</keycap>, and finally releasing the
+ <keycap>Control</keycap> key.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e C+j</keycap></entry>
+
+ <entry>Refers to holding down <keycap>Control</keycap>,
+ pressing <keycap>E</keycap>, pressing <keycap>J</keycap>,
+ and releasing <keycap>Control</keycap>.</entry>
+ </row>
+
+ <row>
+ <entry>Default buttons</entry>
+
+ <entry>In many dialog boxes, the default button (it has a
+ heavy outline, or a special border, depending on the current
+ Swing look and feel) can be activated by pressing
+ <keycap>Enter</keycap>. Similarly, pressing
+ <keycap>Escape</keycap> will usually close a dialog
+ box.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>Alt</keycap>-key mnemonics</entry>
+
+ <entry>Some user interface elements (menus, menu items,
+ buttons) have a certain letter in their label underlined.
+ Pressing this letter in combination with the
+ <keycap>Alt</keycap> key activates the associated user
+ interface widget. Note that this functionality is not
+ available on MacOS X with the <quote>MacOS Adaptive</quote>
+ look and feel. See <xref linkend="appearance-pane" /> for
+ information on changing the look and feel.</entry>
+ </row>
+
+ <row>
+ <entry>Right mouse button</entry>
+
+ <entry>Used in jEdit to show context-sensitive menus. If you
+ have a one button Macintosh mouse, a
+ <keycap>Control</keycap>-click has the same effect.</entry>
+ </row>
+
+ <row>
+ <entry>Middle mouse button</entry>
+
+ <entry>Used by the quick copy feature (see <xref
+ linkend="quick-copy" />). True 3-button mice are rare these
+ days. If you have a wheel mouse, press down on the wheel
+ without rolling it. On a Macintosh with a one-button mouse,
+ <keycap>Option</keycap>-click. On other platforms without a
+ three-button mouse, <keycap>Alt</keycap>-click.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+</chapter>
diff --git a/jEdit/doc/users-guide/customizing.xml b/jEdit/doc/users-guide/customizing.xml
index b825d6b..b219543 100644
--- a/jEdit/doc/users-guide/customizing.xml
+++ b/jEdit/doc/users-guide/customizing.xml
@@ -1,639 +1,681 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter id="customizing">
- <title>Customizing jEdit</title>
- <!-- jEdit buffer-local properties: -->
- <!-- :tabSize=1:indentSize=1:noTabs=true:wrap=soft:maxLineLen=0: -->
- <!-- :xml.root=users-guide.xml: -->
-
- <section id="buffer-opts">
- <title>The Buffer Options Dialog Box</title>
-
- <para><guimenu>Utilities</guimenu>><guimenuitem>Buffer
- Options</guimenuitem> displays a dialog box for changing editor settings
- on a per-buffer basis. Changes made in this dialog box are not retained
- after the buffer is closed.</para>
-
- <para>The following settings can be changed here:</para>
-
- <itemizedlist>
- <listitem>
- <para>The line separator (see <xref
- linkend="line-separators" />)</para>
- </listitem>
-
- <listitem>
- <para>The character encoding (see <xref
- linkend="encodings" />)</para>
- </listitem>
-
- <listitem>
- <para>If the file should be GZipped on disk (see <xref
- linkend="opening" />)</para>
- </listitem>
-
- <listitem>
- <para>The edit mode (see <xref linkend="modes" />)</para>
- </listitem>
-
- <listitem>
- <para>The fold mode (see <xref linkend="folding" />)</para>
- </listitem>
-
- <listitem>
- <para>The wrap mode and margin (see <xref
- linkend="word-wrap" />)</para>
- </listitem>
-
- <listitem>
- <para>The tab width (see <xref linkend="indent" />)</para>
- </listitem>
-
- <listitem>
- <para>The indent width</para>
- </listitem>
-
- <listitem>
- <para>If soft tabs should be used (see <xref
- linkend="indent" />)</para>
- </listitem>
- </itemizedlist>
- </section>
-
- <section id="buffer-local">
- <title>Buffer-Local Properties</title>
-
- <para>Buffer-local properties provide an alternate way to change editor
- settings on a per-buffer basis. While changes made in the
- <guimenuitem>Buffer Options</guimenuitem> dialog box are lost after the
- buffer is closed, buffer-local properties take effect each time the file
- is opened, because they are embedded in the file itself.</para>
-
- <para>When jEdit loads a file, it checks the first and last 10 lines for
- colon-enclosed name/value pairs. For example, placing the following in a
- buffer changes the indent width to 4 characters, enables soft tabs, and
- activates the Perl edit mode:</para>
-
- <screen>:indentSize=4:noTabs=true:mode=perl:</screen>
-
- <para>Adding buffer-local properties to a buffer takes effect after the
- next time the buffer is saved.</para>
-
- <para>The following table describes each buffer-local property in
- detail.</para>
-
- <informaltable>
- <tgroup cols="2">
- <colspec colnum="1" colwidth="1.5in" />
-
- <thead>
- <row>
- <entry>Property name</entry>
-
- <entry>Description</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry><varname>collapseFolds</varname></entry>
-
- <entry>Folds with a level of this or higher will be
- collapsed when the buffer is opened. If set to zero, all
- folds will be expanded initially. See <xref
- linkend="folding" />.</entry>
- </row>
-
- <row>
- <entry><varname>deepIndent</varname></entry>
-
- <entry>When set to <quote>true</quote>, multiple-line
- expressions delimited by parentheses are aligned like
- so: <programlisting>retVal.x = (int)(horizontalOffset
- + Chunk.offsetToX(info.chunks,
- offset));</programlisting> With this setting disabled, the
- text would look like so: <programlisting>retVal.x = (int)(horizontalOffset
- + Chunk.offsetToX(info.chunks,
- offset));</programlisting></entry>
- </row>
-
- <row>
- <entry><varname>folding</varname></entry>
-
- <entry>The fold mode; one of <quote>none</quote>,
- <quote>indent</quote>, <quote>explicit</quote>, or the
- name of a plugin folding mode. See <xref
- linkend="folding" />.</entry>
- </row>
-
- <row>
- <entry><varname>indentSize</varname></entry>
-
- <entry>The width, in characters, of one indent. Must be
- an integer greater than 0. See <xref
- linkend="indent" />.</entry>
- </row>
-
- <row>
- <entry><varname>maxLineLen</varname></entry>
-
- <entry>The maximum line length and wrap column position.
- Inserting text beyond this column will automatically
- insert a line break at the appropriate position. See
- <xref linkend="entering-text" />.</entry>
- </row>
-
- <row>
- <entry><varname>mode</varname></entry>
-
- <entry>The default edit mode for the buffer. See <xref
- linkend="modes" />.</entry>
- </row>
-
- <row>
- <entry><varname>noTabs</varname></entry>
-
- <entry>If set to <quote>true</quote>, soft tabs
- (multiple space characters) will be used instead of
- <quote>real</quote> tabs. See <xref
- linkend="indent" />.</entry>
- </row>
-
- <row>
- <entry><varname>noWordSep</varname></entry>
-
- <entry>A list of non-alphanumeric characters that are
- <emphasis>not</emphasis> to be treated as word
- separators. Global default is <quote>_</quote>.</entry>
- </row>
-
- <row>
- <entry><varname>tabSize</varname></entry>
-
- <entry>The tab width. Must be an integer greater than 0.
- See <xref linkend="indent" />.</entry>
- </row>
-
- <row>
- <entry><varname>wordBreakChars</varname></entry>
-
- <entry>Characters, in addition to spaces and tabs, at
- which lines may be split when word wrapping. See <xref
- linkend="entering-text" />.</entry>
- </row>
-
- <row>
- <entry><varname>wrap</varname></entry>
-
- <entry>The word wrap mode; one of <quote>none</quote>,
- <quote>soft</quote>, or <quote>hard</quote>. See <xref
- linkend="word-wrap" />.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </section>
-
- <section id="global-opts">
- <title>The Global Options Dialog Box</title>
-
- <para><guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> displays the global options dialog box. The dialog
- box is divided into several panes, each pane containing a set of related
- options. Use the list on the left of the dialog box to switch between
- panes. Only panes created by jEdit are described here; some plugins add
- their own option panes, and information about them can be found in the
- documentation for the plugins in question.</para>
-
- <section id="general-pane">
- <title>The General Pane</title>
-
- <para>The <guibutton>General</guibutton> pane contains various
- settings, such as the default line separator, the number of recent
- files to remember, if the buffer list should be sorted, and so
- on.</para>
-
- </section>
-
- <section id="abbrevs-pane">
- <title>The Abbreviations Pane</title>
-
- <indexterm>
- <primary>Abbreviations</primary>
-
- <secondary>creating and editing</secondary>
- </indexterm>
-
- <para>The <guibutton>Abbreviations</guibutton> option pane can be
- used to enable or disable automatic abbreviation expansion, and to
- edit currently defined abbreviations.</para>
-
- <para>The combo box labelled <quote>Abbrev set</quote> selects the
- abbreviation set to edit. The first entry, <quote>global</quote>,
- contains abbreviations available in all edit modes. The subsequent
- entries correspond to each mode's local set of abbreviations.</para>
-
- <para>To change an abbreviation or its expansion, either
- double-click the appropriate table entry, or click a table entry and
- then click the <guibutton>Edit</guibutton> button. This will display
- a dialog box for modifying the abbreviation.</para>
-
- <para>The <guibutton>Add</guibutton> button displays a dialog box
- where you can define a new abbreviation. The
- <guibutton>Remove</guibutton> button removes the currently selected
- abbreviation from the list.</para>
-
- <para>See <xref linkend="positional-params" /> for information about
- positional parameters in abbreviations.</para>
- </section>
-
- <section id="appearance-pane">
- <title>The Appearance Pane</title>
-
- <para>The <guibutton>Appearance</guibutton> pane can be used to
- change the appearance of user interface controls such as buttons,
- labels and menus. It can also be used to change the docking
- framework (the dockable window manager). The number of items
- retained in history text fields can also be set here; see
- <xref linkend="history" />.</para>
-
- <para>Note that changes to certain settings such as the Swing look
- and feel and the docking framework require a restart of jEdit to
- take effect.</para>
- </section>
-
- <section id="autosave-backups-pane">
- <title>The Autosave and Backup Pane</title>
-
- <para>The <guibutton>Autosave</guibutton> option pane contains
- settings for the autosave and backup features. See <xref
- linkend="autosave" /> and <xref linkend="backups" />.</para>
- </section>
-
- <section id="context-pane">
- <title>The Context Menu Pane</title>
-
- <para>The <guibutton>Context Menu</guibutton> option pane edits the
- text area's right-click context menu. See <xref
- linkend="views" />.</para>
- </section>
-
- <section id="docking-pane">
- <title>The Docking Pane</title>
-
- <para>The <guibutton>Docking</guibutton> option pane specifies
- docking location for various dockable windows. Another way to
- specify docking locations is to use the popup menus associated with
- each dockable window; see <xref linkend="docking" />.</para>
- </section>
-
- <section id="editing-pane">
- <title>The Editing Pane</title>
-
- <para>The <guibutton>Editing</guibutton> option pane contains
- settings such as the tab size, syntax highlighting and soft tabs on
- a global or mode-specific basis. </para>
-
- <para>Changing options from this optionpane does not change XML mode definition files on disk; it merely writes values to the user properties file which
- override those set in mode files. To find out how to edit mode files directly, see <xref linkend="writing-modes-part" />. Some of these options can be further overridden on an individual file basis through the use of buffer-local properties. </para>
-
- <para>The <literal>File name
- glob</literal> and <literal>First line glob</literal> text
- fields let you specify a glob pattern that names and first lines of
- buffers will be matched against to determine the edit mode. See
- <xref linkend="globs" /> for information about glob patterns.</para>
-
- <para> The <literal>Extra Word Characters</literal> allows you to set the <literal>noLineSep</literal> buffer property on a mode-wide basis, allowing you to define what is considered part of a word when double-clicking on it in the text area.
- </para>
-
- <para> The <literal>Deep Indent</literal> option instructs jEdit to indent subsequent lines so that they line up with the open bracket on the previous line. </para>
-
-
- </section>
-
- <section id="encodings-pane">
- <title>The Encodings Pane</title>
-
- <para>This option pane is new to jEdit 4.3, and offers international
- users of jEdit many flexible options for defining how Encodings are
- handled in jEdit. See <xref linkend="encodings" /> for the
- basics.</para>
-
- <para> In previous versions of jEdit, there was very little encoding autodetection, so <guilabel>use autodetection when possible</guilabel> is an option you can switch on or off.
- </para>
-
- <para>The <literal>List of Encoding Autodetector Names</literal> is
- an experimental feature that allows for jEdit and plugins to offer
- additional encoding autodetector routines. At the moment, there are
- two techniques known by jEdit: the <literal>BOM</literal> (Byte
- Order Mark), and the <literal>XML-PI</literal> (XML processing
- instruction) techniques. Others can be defined as services and added
- to this space-separated list. See <ulink
- url="../api/org/gjt/sp/jedit/io/EncodingDetector.html">EncodingDetector</ulink>
- for details on how to offer this service. The order they appear in this
- list determines the order of detectors that are tried on each file. </para>
-
- <para>The <literal>List of Fallback Encodings</literal> is used when
- a file fails to open in the default encoding, and the Encoding
- Autodetectors also fail. The list order here determines the order of
- encodings that are tried. Each is separated by a space. This is
- especially handy when doing directory searches through files of
- different encodings. We suggest using <literal>UTF-8</literal> as
- either your default or one of the fallback encodings.</para>
-
- <para>While jEdit allows you to edit files in a variety of different
- encodings, the average user switches between only 2 or 3. In other
- parts of jEdit, where the list of encodings is displayed in a
- combobox (such as the buffer options) or a menu (such as
- <guimenuitem>File - Reload with Encoding</guimenuitem> submenu) it
- may be desirable to display only a subset of available encodings,
- those that are in common local use. The Encodings checkbox list
- allows the user to select the subset of supported encodings to
- display in other GUI components that list all of the
- encodings.</para>
- </section>
-
- <section id="gutter-pane">
- <title>The Gutter Pane</title>
-
- <para>The <guibutton>Gutter</guibutton> option pane contains
- settings to customize the appearance of the gutter. Some new options were added
- to jEdit 4.3, including "show gutter", "minimal number of digits to reserve for line numbers",
- and "fold style". See <xref linkend="overview" />.</para>
- </section>
-
- <section id="mouse-pane">
- <title>The Mouse Pane</title>
-
- <para>The <guibutton>Mouse</guibutton> option pane contains settings
- for toggling drag and drop of text, as well as gutter mouse click
- behavior.</para>
-
- <para> The only option that may not be self-explanatory is the <emphasis role="bold">Double-Click drag joins non-alphanumeric characters</emphasis>. This option means that double-click will select a region that includes the non-alphabetical characters, as defined for the current mode. The actual set of characters can be defined for an indiviual file via buffer-local properties (<literal>noWordSep</literal>) or on a mode-wide basis from the Editing option pane (<literal>Extra Word Characters</literal>). </para>
-
- </section>
-
- <section id="printing-pane">
- <title>The Printing Pane</title>
-
- <para>The <guibutton>Printing</guibutton> option pane contains
- settings to control the appearance of printed output. Workarounds
- that might be needed for your Java version to print correctly can
- also be enabled here. See <xref linkend="printing" />.</para>
- </section>
-
- <section id="pluginmgr-pane">
- <title>The Plugin Manager Pane</title>
-
- <para>The <guibutton>Plugin Manager</guibutton> pane contains a
- chooser for the desired download mirror, as well as various settings
- such as the directory where plugins are to be installed. In addition, you can set the time in minutes that the pluginlist can be cached from jedit.org, helping to reduce the server load. See <xref
- linkend="using-plugins" />.</para>
- </section>
-
- <section id="firewall-pane">
- <title>The Proxy Servers Pane</title>
-
- <para>The <guibutton>Proxy Servers</guibutton> option pane lets you
- specify HTTP and SOCKS proxy servers to use when jEdit makes network
- connections, for example when downloading plugins.</para>
- </section>
-
- <section id="shortcuts-pane">
- <title>The Shortcuts Pane</title>
-
- <para>The <guibutton>Shortcuts</guibutton> option pane associates
- keyboard shortcuts with commands. Each command can have up to two
- shortcuts associated with it.</para>
-
- <para>The combo box at the top of the option pane selects the
- command set to edit. Command sets include the set of all built-in
- commands, the commands of each plugin, and the set of macros.</para>
-
- <para>To change a shortcut, click the appropriate table entry and
- press the keys you want associated with that command in the
- resulting dialog box. The dialog box will warn you if the shortcut
- is already assigned.</para>
-
- <bridgehead> 2-key shortcut prefixes </bridgehead>
-
- <para> Some shortcuts, such as C+e, C+m, and C+r, are prefixes for two-keystroke shortcuts. Another keystroke may be used as a prefix in a 2-key shortcut, so for example, C+x can be redefined as a prefix to make it more emacs-like, by mapping any other action to a C+x prefixed shortcut.</para>
-
- <para> Conversely, emacs users will notice at first that C+e can not be mapped as a single key shortcut to go to the end of the line, unless all of the other actions that contain C+e prefixed shortcuts are remapped to other shortcuts first. After that, C+e can be bound to end-of-line. </para>
-
- <para> The default shortcuts can be found in <literal>jedit_keys.props</literal>. </para>
-
- </section>
-
- <section id="status-bar-pane">
- <title>The Status Bar Pane</title>
-
- <para>The <guibutton>Status Bar</guibutton> option pane contains
- settings to customize the status bar, or disable it completely. See
- <xref linkend="status-bar" />.</para>
- </section>
-
- <section id="syntax-hilite-pane">
- <title>The Syntax Highlighting Pane</title>
-
- <para>The <guibutton>Syntax Highlighting</guibutton> pane can be
- used to customize the fonts and colors for syntax highlighting. See
- <xref linkend="syntax-hilite" />.</para>
- </section>
-
- <section id="text-area-pane">
- <title>The Text Area Pane</title>
-
- <para>The <guibutton>Text Area</guibutton> pane contains settings to
- customize the appearance of the text area. See <xref
- linkend="overview" />.</para>
- </section>
-
- <section id="toolbar-pane">
- <title>The Tool Bar Pane</title>
-
- <para>The <guibutton>Tool Bar</guibutton> option pane lets you edit
- the tool bar, or disable it completely. See <xref
- linkend="views" />.</para>
- </section>
-
- <section id="view-pane">
- <title>The View Pane</title>
-
- <para>The <guibutton>View</guibutton> option pane lets you change
- various settings related to the editor window's appearance,
- including the arrangement of dockable windows, and if the search bar
- and buffer switcher should be visible. See <xref
- linkend="views" />.</para>
- </section>
-
- <section id="vfs-browser-pane">
- <title>The File System Browser Panes</title>
-
- <para>The <guibutton>File System Browser</guibutton> group contains
- two option panes, <guibutton>General</guibutton> and
- <guibutton>Colors</guibutton>. The former contains various file
- system browser settings. The latter configures glob patterns used
- for coloring the file list. See <xref linkend="vfs-browser" /> for
- more information.</para>
- </section>
- </section>
-
- <section id="settings-directory">
- <title>The jEdit Settings Directory</title>
-
- <para>jEdit stores settings, macros, and plugins as files inside the
- <firstterm>settings directory</firstterm>. In most cases, editing these
- files by hand is not necessary, since graphical tools and editor
- commands can do the job. However, being familiar with the structure of
- the settings directory still comes in handy in certain situations, for
- example when you want to copy jEdit settings between computers.</para>
-
- <para>The location of the settings directory is system-specific; it is
- printed to the activity log
- (<guimenu>Utilities</guimenu>><guisubmenu>Troubleshooting</guisubmenu>><guimenuitem>Activity
- Log</guimenuitem>). For example:</para>
-
- <screen>[message] jEdit: Settings directory is /home/slava/.jedit</screen>
-
- <para>Specifying the <userinput>-settings</userinput> switch on the
- command line instructs jEdit to store settings in a directory other than
- the default. For example, the following command will instruct jEdit to
- store all settings in the <filename>jedit</filename> subdirectory of the
- <filename>C:</filename> drive:</para>
-
- <screen><prompt>C:\jedit></prompt> <userinput>jedit -settings=C:\jedit</userinput></screen>
-
- <para>The <userinput>-nosettings</userinput> switch will force jEdit to
- not look for or create a settings directory; default settings will be
- used instead.</para>
-
- <!-- para>
- If you are using <application>jEditLauncher</application>
- to start jEdit on Windows, these parameters cannot be specified on the
- MS-DOS prompt command line when starting jEdit; they must be set as described
- in <xref linkend="launcher-starting" />.
- </para -->
-
- <para>jEdit creates the following files and directories inside the
- settings directory; plugins may add more:</para>
-
- <itemizedlist>
- <listitem>
- <para><filename>abbrevs</filename> - a plain text file which
- stores all defined abbreviations. See <xref
- linkend="abbrevs" />.</para>
- </listitem>
-
- <listitem>
- <para><filename>activity.log</filename> - a plain text file
- which contains the full activity log. See <xref
- linkend="activity-log" />.</para>
- </listitem>
-
- <listitem>
- <para><filename>history</filename> - a plain text file which
- stores history lists, used by history text fields and the
- <guimenu>Edit</guimenu>><guimenuitem>Paste
- Previous</guimenuitem> command. See <xref
- linkend="text-transfer" /> and <xref
- linkend="history" />.</para>
- </listitem>
-
- <listitem>
- <para><filename>jars</filename> - this directory contains
- plugins. See <xref linkend="using-plugins" />.</para>
- </listitem>
-
- <listitem>
- <para><filename>jars-cache</filename> - this directory contains
- plugin cache files which decrease the time to start jEdit. They
- are automatically updated when plugins are installed or
- updated.</para>
- </listitem>
-
- <listitem>
- <para><filename>killring.xml</filename> - stores recently
- deleted text. See <xref linkend="text-transfer" />.</para>
- </listitem>
-
- <listitem>
- <para><filename>macros</filename> - this directory contains
- macros. See <xref linkend="using-macros" />.</para>
- </listitem>
-
- <listitem>
- <para><filename>modes</filename> - this directory contains
- custom edit modes. See <xref
- linkend="writing-modes-part" />.</para>
- </listitem>
-
- <listitem>
- <para><filename>perspective.xml</filename> - an XML file that
- stores the list of open buffers and views used to maintain
- editor state between sessions.</para>
- </listitem>
-
- <listitem>
- <para><filename>PluginManager.download</filename> - this
- directory is usually empty. It only contains files while the
- plugin manager is downloading a plugin. For information about
- the plugin manager, see <xref linkend="using-plugins" />.</para>
- </listitem>
- <listitem><para>
- <filename>pluginMgr-Cached.xml.gz</filename> -
- this contains a cached copy of the last XML plugin list downloaded from plugin central. If you delete this file, a new one will be created next time you try to install a plugin via Plugin Manager. </para>
- </listitem>
-
- <listitem>
- <para><filename>printspec</filename> - a binary file that stores
- printing settings when running under Java 2 version 1.4.</para>
- </listitem>
-
- <listitem>
- <para><filename>properties</filename> - a plain text file that
- stores the majority of jEdit's and its plugins settings. For
- more information see <xref linkend="propertiesfile" />.</para>
- </listitem>
-
- <listitem>
- <para><filename>recent.xml</filename> - an XML file which stores
- the list of recently opened files. jEdit remembers the caret
- position and character encoding of each recent file, and
- automatically restores those values when one of the files is
- opened.</para>
- </listitem>
-
- <listitem>
- <para><filename>registers.xml</filename> - an XML file that
- stores register contents. See <xref linkend="registers" /> for
- more information about registers.</para>
- </listitem>
-
- <listitem>
- <para><filename>server</filename> - a plain text file that only
- exists while jEdit is running. The edit server's port number and
- authorization key is stored here. See <xref
- linkend="starting" />.</para>
- </listitem>
-
- <listitem>
- <para><filename>settings-backup</filename> - this directory
- contains numbered backups of all automatically-written settings
- files.</para>
- </listitem>
- </itemizedlist>
-
- <section id="propertiesfile">
- <title>The jEdit properties file</title>
-
- <para>The jEdit <literal>properties</literal> file uses the Java
- properties syntax to store key/value pairs. All of the values are
- stored as strings, but are interpreted as other types (such as
- integer or boolean) by plugins at runtime.</para>
-
- <para>Editing and saving this file while jEdit is running means that
- until you restart jEdit again, all other changed settings will be
- lost.</para>
- </section>
- </section>
-</chapter>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="customizing">
+ <title>Customizing jEdit</title>
+ <!-- jEdit buffer-local properties: -->
+ <!-- :tabSize=1:indentSize=1:noTabs=true:wrap=soft:maxLineLen=0: -->
+ <!-- :xml.root=users-guide.xml: -->
+
+ <section id="buffer-opts">
+ <title>The Buffer Options Dialog Box</title>
+
+ <para><guimenu>Utilities</guimenu>><guimenuitem>Buffer
+ Options</guimenuitem> displays a dialog box for changing editor settings
+ on a per-buffer basis. Changes made in this dialog box are not retained
+ after the buffer is closed.</para>
+
+ <para>The following settings can be changed here:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>The line separator (see <xref
+ linkend="line-separators" />)</para>
+ </listitem>
+
+ <listitem>
+ <para>The character encoding (see <xref
+ linkend="encodings" />)</para>
+ </listitem>
+
+ <listitem>
+ <para>If the file should be GZipped on disk (see <xref
+ linkend="opening" />)</para>
+ </listitem>
+
+ <listitem>
+ <para>The edit mode (see <xref linkend="modes" />)</para>
+ </listitem>
+
+ <listitem>
+ <para>The fold mode (see <xref linkend="folding" />)</para>
+ </listitem>
+
+ <listitem>
+ <para>The wrap mode and margin (see <xref
+ linkend="word-wrap" />)</para>
+ </listitem>
+
+ <listitem>
+ <para>The tab width (see <xref linkend="indent" />)</para>
+ </listitem>
+
+ <listitem>
+ <para>The indent width</para>
+ </listitem>
+
+ <listitem>
+ <para>If soft tabs should be used (see <xref
+ linkend="indent" />)</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section id="buffer-local">
+ <title>Buffer-Local Properties</title>
+
+ <para>Buffer-local properties provide an alternate way to change editor
+ settings on a per-buffer basis. While changes made in the
+ <guimenuitem>Buffer Options</guimenuitem> dialog box are lost after the
+ buffer is closed, buffer-local properties take effect each time the file
+ is opened, because they are embedded in the file itself.</para>
+
+ <para>When jEdit loads a file, it checks the first and last 10 lines for
+ colon-enclosed name/value pairs. For example, placing the following in a
+ buffer changes the indent width to 4 characters, enables soft tabs, and
+ activates the Perl edit mode:</para>
+
+ <screen>:indentSize=4:noTabs=true:mode=perl:</screen>
+
+ <para>Adding buffer-local properties to a buffer takes effect after the
+ next time the buffer is saved.</para>
+
+ <para>The following table describes each buffer-local property in
+ detail.</para>
+
+ <informaltable>
+ <tgroup cols="2">
+ <colspec colnum="1" colwidth="1.5in" />
+ <colspec colwidth="*"/>
+
+ <thead>
+ <row>
+ <entry>Property name</entry>
+
+ <entry>Description</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry><varname>collapseFolds</varname></entry>
+
+ <entry>Folds with a level of this or higher will be
+ collapsed when the buffer is opened. If set to zero, all
+ folds will be expanded initially. See <xref
+ linkend="folding" />.</entry>
+ </row>
+
+ <row>
+ <entry><varname>deepIndent</varname></entry>
+
+ <entry>When set to <quote>true</quote>, multiple-line
+ expressions delimited by parentheses are aligned like
+ so: <programlisting>retVal.x = (int)(horizontalOffset
+ + Chunk.offsetToX(info.chunks,
+ offset));</programlisting> With this setting disabled, the
+ text would look like so: <programlisting>retVal.x = (int)(horizontalOffset
+ + Chunk.offsetToX(info.chunks,
+ offset));</programlisting></entry>
+ </row>
+
+ <row>
+ <entry><varname>folding</varname></entry>
+
+ <entry>The fold mode; one of <quote>none</quote>,
+ <quote>indent</quote>, <quote>explicit</quote>, or the
+ name of a plugin folding mode. See <xref
+ linkend="folding" />.</entry>
+ </row>
+
+ <row>
+ <entry><varname>indentSize</varname></entry>
+
+ <entry>The width, in characters, of one indent. Must be
+ an integer greater than 0. See <xref
+ linkend="indent" />.</entry>
+ </row>
+
+ <row>
+ <entry><varname>maxLineLen</varname></entry>
+
+ <entry>The maximum line length and wrap column position.
+ Inserting text beyond this column will automatically
+ insert a line break at the appropriate position. See
+ <xref linkend="entering-text" />.</entry>
+ </row>
+
+ <row>
+ <entry><varname>mode</varname></entry>
+
+ <entry>The default edit mode for the buffer. See <xref
+ linkend="modes" />.</entry>
+ </row>
+
+ <row>
+ <entry><varname>noTabs</varname></entry>
+
+ <entry>If set to <quote>true</quote>, soft tabs
+ (multiple space characters) will be used instead of
+ <quote>real</quote> tabs. See <xref
+ linkend="indent" />.</entry>
+ </row>
+
+ <row>
+ <entry><varname>noWordSep</varname></entry>
+
+ <entry>A list of non-alphanumeric characters that are
+ <emphasis>not</emphasis> to be treated as word
+ separators. Global default is <quote>_</quote>.</entry>
+ </row>
+
+ <row>
+ <entry><varname>tabSize</varname></entry>
+
+ <entry>The tab width. Must be an integer greater than 0.
+ See <xref linkend="indent" />.</entry>
+ </row>
+
+ <row>
+ <entry><varname>wordBreakChars</varname></entry>
+
+ <entry>Characters, in addition to spaces and tabs, at
+ which lines may be split when word wrapping. See <xref
+ linkend="entering-text" />.</entry>
+ </row>
+
+ <row>
+ <entry><varname>wrap</varname></entry>
+
+ <entry>The word wrap mode; one of <quote>none</quote>,
+ <quote>soft</quote>, or <quote>hard</quote>. See <xref
+ linkend="word-wrap" />.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </section>
+
+ <section id="global-opts">
+ <title>The Global Options Dialog Box</title>
+
+ <para><guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> displays the global options dialog box. The dialog
+ box is divided into several panes, each pane containing a set of related
+ options. Use the list on the left of the dialog box to switch between
+ panes. Only panes created by jEdit are described here; some plugins add
+ their own option panes, and information about them can be found in the
+ documentation for the plugins in question.</para>
+
+ <section id="general-pane">
+ <title>The General Pane</title>
+
+ <para>The <guibutton>General</guibutton> pane contains various
+ settings, such as the default line separator, the number of recent
+ files to remember, if the buffer list should be sorted, and so
+ on.</para>
+
+ </section>
+
+ <section id="abbrevs-pane">
+ <title>The Abbreviations Pane</title>
+
+ <indexterm>
+ <primary>Abbreviations</primary>
+
+ <secondary>creating and editing</secondary>
+ </indexterm>
+
+ <para>The <guibutton>Abbreviations</guibutton> option pane can be
+ used to enable or disable automatic abbreviation expansion, and to
+ edit currently defined abbreviations.</para>
+
+ <para>The combo box labelled <quote>Abbrev set</quote> selects the
+ abbreviation set to edit. The first entry, <quote>global</quote>,
+ contains abbreviations available in all edit modes. The subsequent
+ entries correspond to each mode's local set of abbreviations.</para>
+
+ <para>To change an abbreviation or its expansion, either
+ double-click the appropriate table entry, or click a table entry and
+ then click the <guibutton>Edit</guibutton> button. This will display
+ a dialog box for modifying the abbreviation.</para>
+
+ <para>The <guibutton>Add</guibutton> button displays a dialog box
+ where you can define a new abbreviation. The
+ <guibutton>Remove</guibutton> button removes the currently selected
+ abbreviation from the list.</para>
+
+ <para>See <xref linkend="positional-params" /> for information about
+ positional parameters in abbreviations.</para>
+ </section>
+
+ <section id="appearance-pane">
+ <title>The Appearance Pane</title>
+
+ <para>The <guibutton>Appearance</guibutton> pane can be used to
+ change the appearance of user interface controls such as buttons,
+ labels and menus. It can also be used to change the docking
+ framework (the dockable window manager). The number of items
+ retained in history text fields can also be set here; see
+ <xref linkend="history" />.</para>
+
+ <para>Note that changes to certain settings such as the Swing look
+ and feel and the docking framework require a restart of jEdit to
+ take effect.</para>
+ </section>
+
+
+ <section id="context-pane">
+ <title>The Context Menu Pane</title>
+
+ <para>The <guibutton>Context Menu</guibutton> option pane edits the
+ text area's right-click context menu. See <xref
+ linkend="views" />.</para>
+ </section>
+
+ <section id="docking-pane">
+ <title>The Docking Pane</title>
+
+ <para>The <guibutton>Docking</guibutton> option pane shows a
+ list of available dockables, and allows you to specify
+ docking locations for each of them. Another way to
+ specify docking locations is to use the popup menus associated with each dockable window. </para>
+
+ <para> It is possible to configure jEdit to automatically load and/or save <emphasis role="bold">Docking Layouts</emphasis> (similar to eclipse perspectives) based on the edit mode of your current b uffer through the checkboxes in this pane. See <xref linkend="docking" />.
+ </para>
+
+
+ </section>
+
+ <section id="editing-pane">
+ <title>The Editing Pane</title>
+
+ <para>The <guibutton>Editing</guibutton> option pane contains
+ settings such as the tab size, syntax highlighting and soft tabs on
+ a global or mode-specific basis. </para>
+
+ <para>Changing options from this optionpane does not change XML mode definition files on disk; it merely writes values to the user properties file which
+ override those set in mode files. To find out how to edit mode files directly, see <xref linkend="writing-modes-part" />. Some of these options can be further overridden on an individual file basis through the use of buffer-local properties. </para>
+
+ <para>The <literal>File name
+ glob</literal> and <literal>First line glob</literal> text
+ fields let you specify a glob pattern that names and first lines of
+ buffers will be matched against to determine the edit mode. See
+ <xref linkend="globs" /> for information about glob patterns.</para>
+
+ <para> The <literal>Extra Word Characters</literal> allows you to set the <literal>noLineSep</literal> buffer property on a mode-wide basis, allowing you to define what is considered part of a word when double-clicking on it in the text area.
+ </para>
+
+ <para> The <literal>Deep Indent</literal> option instructs jEdit to indent subsequent lines so that they line up with the open bracket on the previous line. </para>
+
+
+ </section>
+
+ <section id="encodings-pane">
+ <title>The Encodings Pane</title>
+
+ <para>This option pane is new to jEdit 4.3, and offers international
+ users of jEdit many flexible options for defining how Encodings are
+ handled in jEdit. See <xref linkend="encodings" /> for the
+ basics.</para>
+
+ <para> In previous versions of jEdit, there was very little encoding autodetection, so <guilabel>use autodetection when possible</guilabel> is an option you can switch on or off.
+ </para>
+
+ <para>The <literal>List of Encoding Autodetector Names</literal>
+ can be used to control what encoding detections are used on each
+ file when it is loaded. The order they appear in this list
+ determines the order of detectors that are tried.
+ There are some detectors which are available with jEdit core:
+ <itemizedlist>
+ <listitem><para>
+ <literal>BOM</literal>:
+ detects <ulink url="http://www.unicode.org/faq/utf_bom.html#BOM">
+ Byte Order Mark</ulink>.
+ </para></listitem>
+ <listitem><para>
+ <literal>XML-PI</literal>:
+ detects <ulink url="http://www.w3.org/TR/REC-xml/#charencoding">
+ encoding declaration in XML Processing Instruction</ulink>.
+ </para></listitem>
+ <listitem><para>
+ <literal>html</literal>:
+ detects <ulink url="http://www.w3.org/TR/html4/struct/global.html#edef-META">
+ charset description in HTML META element</ulink>.
+ </para></listitem>
+ <listitem><para>
+ <literal>python</literal>:
+ detects <ulink url="http://docs.python.org/reference/lexical_analysis.html#encoding-declarations">
+ various encoding declaration accepted in Python</ulink>. This
+ accepts encoding declarations for GNU Emacs or Bram Moolenaar's
+ VIM.
+ </para></listitem>
+ <listitem><para>
+ <literal>buffer-local-property</literal>:
+ detects same syntax described at <xref linkend="buffer-local" />
+ for property name "encoding".
+ (The above "python" encoding detector also accepts this syntax.)
+ </para></listitem>
+ </itemizedlist>
+ Others can be defined in plugins as services and added to this
+ space-separated list. See <ulink
+ url="../api/org/gjt/sp/jedit/io/EncodingDetector.html">EncodingDetector</ulink>
+ for details on how to offer additional encoding autodetector.</para>
+
+ <para>The <literal>List of Fallback Encodings</literal> is used when
+ a file fails to open in the default encoding, and the Encoding
+ Autodetectors also fail. The list order here determines the order of
+ encodings that are tried. Each is separated by a space. This is
+ especially handy when doing directory searches through files of
+ different encodings. We suggest using <literal>UTF-8</literal> as
+ either your default or one of the fallback encodings.</para>
+
+ <para>While jEdit allows you to edit files in a variety of different
+ encodings, the average user switches between only 2 or 3. In other
+ parts of jEdit, where the list of encodings is displayed in a
+ combobox (such as the buffer options) or a menu (such as
+ <guimenuitem>File - Reload with Encoding</guimenuitem> submenu) it
+ may be desirable to display only a subset of available encodings,
+ those that are in common local use. The Encodings checkbox list
+ allows the user to select the subset of supported encodings to
+ display in other GUI components that list all of the
+ encodings.</para>
+ </section>
+
+ <section id="gutter-pane">
+ <title>The Gutter Pane</title>
+
+ <para>The <guibutton>Gutter</guibutton> option pane contains
+ settings to customize the appearance of the gutter. Some new options were added
+ to jEdit 4.3, including "show gutter", "minimal number of digits to reserve for line numbers",
+ and "fold style". See <xref linkend="overview" />.</para>
+ </section>
+
+ <section id="mouse-pane">
+ <title>The Mouse Pane</title>
+
+ <para>The <guibutton>Mouse</guibutton> option pane contains settings
+ for toggling drag and drop of text, as well as gutter mouse click
+ behavior.</para>
+
+ <para> The only option that may not be self-explanatory is the <emphasis role="bold">Double-Click drag joins non-alphanumeric characters</emphasis>. This option means that double-click will select a region that includes the non-alphabetical characters, as defined for the current mode. The actual set of characters can be defined for an indiviual file via buffer-local properties (<literal>noWordSep</literal>) or on a mode-wide basis from the Editing option pane (<literal>Extra Word Characters</literal>). </para>
+
+ </section>
+
+ <section id="printing-pane">
+ <title>The Printing Pane</title>
+
+ <para>The <guibutton>Printing</guibutton> option pane contains
+ settings to control the appearance of printed output. Workarounds
+ that might be needed for your Java version to print correctly can
+ also be enabled here. See <xref linkend="printing" />.</para>
+ </section>
+
+ <section id="pluginmgr-pane">
+ <title>The Plugin Manager Pane</title>
+
+ <para>The <guibutton>Plugin Manager</guibutton> pane contains a
+ chooser for the desired download mirror, as well as various settings
+ such as the directory where plugins are to be installed. In addition, you can set the time in minutes that the pluginlist can be cached from jedit.org, helping to reduce the server load. See <xref
+ linkend="using-plugins" />.</para>
+ </section>
+
+ <section id="firewall-pane">
+ <title>The Proxy Servers Pane</title>
+
+ <para>The <guibutton>Proxy Servers</guibutton> option pane lets you
+ specify HTTP and SOCKS proxy servers to use when jEdit makes network
+ connections, for example when downloading plugins.</para>
+ </section>
+
+ <section id="autosave-backups-pane">
+ <title>The Saving and Backup Pane</title>
+
+ <para>The <guibutton>Saving and Backup</guibutton> option pane contains
+ settings for the autosave and backup features. See <xref
+ linkend="autosave" /> and <xref linkend="backups" />.</para>
+ </section>
+
+ <section id="shortcuts-pane">
+ <title>The Shortcuts Pane</title>
+
+ <para>The <guibutton>Shortcuts</guibutton> option pane associates
+ keyboard shortcuts with commands. Each command can have up to two
+ shortcuts associated with it.</para>
+
+ <para>The combo box at the top of the option pane selects the
+ command set to edit. Command sets include the set of all built-in
+ commands, the commands of each plugin, and the set of macros.</para>
+
+ <para>To change a shortcut, click the appropriate table entry and
+ press the keys you want associated with that command in the
+ resulting dialog box. The dialog box will warn you if the shortcut
+ is already assigned.</para>
+
+ <bridgehead> 2-key shortcut prefixes </bridgehead>
+
+ <para> Some shortcuts, such as C+e, C+m, and C+r, are prefixes for two-keystroke shortcuts. Another keystroke may be used as a prefix in a 2-key shortcut, so for example, C+x can be redefined as a prefix to make it more emacs-like, by mapping any other action to a C+x prefixed shortcut.</para>
+
+ <para> Conversely, emacs users will notice at first that C+e can not be mapped as a single key shortcut to go to the end of the line, unless all of the other actions that contain C+e prefixed shortcuts are remapped to other shortcuts first. After that, C+e can be bound to end-of-line. </para>
+
+ <para> The default shortcuts can be found in <literal>jedit_keys.props</literal>. </para>
+
+ </section>
+
+ <section id="status-bar-pane">
+ <title>The Status Bar Pane</title>
+
+ <para>The <guibutton>Status Bar</guibutton>, its API, and its coprresponding option pane were redesigned in jEdit 4.3. Now, the pane contains settings to customize which widgets are in the status bar, their order, and what separators exist between them. Or, you can disable it completely, for regular and/or plain views. See <xref linkend="status-bar" />.</para>
+
+ <para> From the <literal>Options</literal> tab, you can
+ customize information about the caret display in the lower
+ left corner. </para>
+
+ <para> Selecting the <literal>Widgets</literal> tab of this option pane shows you what widgets on the right, and their order. You can add or remove widgets and separators/labels here. </para>
+
+ </section>
+
+
+ <section id="syntax-hilite-pane">
+ <title>The Syntax Highlighting Pane</title>
+
+ <para>The <guibutton>Syntax Highlighting</guibutton> pane can be
+ used to customize the fonts and colors for syntax highlighting. See
+ <xref linkend="syntax-hilite" />.</para>
+ </section>
+
+ <section id="text-area-pane">
+ <title>The Text Area Pane</title>
+
+ <para>The <guibutton>Text Area</guibutton> pane contains settings to
+ customize the appearance of the text area. See <xref
+ linkend="overview" />.</para>
+ </section>
+
+ <section id="toolbar-pane">
+ <title>The Tool Bar Pane</title>
+
+ <para>The <guibutton>Tool Bar</guibutton> option pane lets you edit
+ the tool bar, or disable it completely. See <xref
+ linkend="views" />.</para>
+ </section>
+
+ <section id="view-pane">
+ <title>The View Pane</title>
+
+ <para>The <guibutton>View</guibutton> option pane lets you change
+ various settings related to the editor window's appearance,
+ including the arrangement of dockable windows, and if the search bar
+ and buffer switcher should be visible. See <xref
+ linkend="views" />.</para>
+ </section>
+
+ <section id="vfs-browser-pane">
+ <title>The File System Browser Panes</title>
+
+ <para>The <guibutton>File System Browser</guibutton> group contains
+ two option panes, <guibutton>General</guibutton> and
+ <guibutton>Colors</guibutton>. The former contains various file
+ system browser settings. The latter configures glob patterns used
+ for coloring the file list. See <xref linkend="vfs-browser" /> for
+ more information.</para>
+ </section>
+ </section>
+
+ <section id="settings-directory">
+ <title>The jEdit Settings Directory</title>
+
+ <para>jEdit stores settings, macros, and plugins as files inside the
+ <firstterm>settings directory</firstterm>. In most cases, editing these
+ files by hand is not necessary, since graphical tools and editor
+ commands can do the job. However, being familiar with the structure of
+ the settings directory still comes in handy in certain situations, for
+ example when you want to copy jEdit settings between computers.</para>
+
+ <para>The location of the settings directory is system-specific; it is
+ printed to the activity log
+ (<guimenu>Utilities</guimenu>><guisubmenu>Troubleshooting</guisubmenu>><guimenuitem>Activity
+ Log</guimenuitem>). For example:</para>
+
+ <screen>[message] jEdit: Settings directory is /home/slava/.jedit</screen>
+
+ <para>Specifying the <userinput>-settings</userinput> switch on the
+ command line instructs jEdit to store settings in a directory other than
+ the default. For example, the following command will instruct jEdit to
+ store all settings in the <filename>jedit</filename> subdirectory of the
+ <filename>C:</filename> drive:</para>
+
+ <screen><prompt>C:\jedit></prompt> <userinput>jedit -settings=C:\jedit</userinput></screen>
+
+ <para>The <userinput>-nosettings</userinput> switch will force jEdit to
+ not look for or create a settings directory; default settings will be
+ used instead.</para>
+
+ <!-- para>
+ If you are using <application>jEditLauncher</application>
+ to start jEdit on Windows, these parameters cannot be specified on the
+ MS-DOS prompt command line when starting jEdit; they must be set as described
+ in <xref linkend="launcher-starting" />.
+ </para -->
+
+ <para>jEdit creates the following files and directories inside the
+ settings directory; plugins may add more:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><filename>abbrevs</filename> - a plain text file which
+ stores all defined abbreviations. See <xref
+ linkend="abbrevs" />.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>activity.log</filename> - a plain text file
+ which contains the full activity log. See <xref
+ linkend="activity-log" />.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>history</filename> - a plain text file which
+ stores history lists, used by history text fields and the
+ <guimenu>Edit</guimenu>><guimenuitem>Paste
+ Previous</guimenuitem> command. See <xref
+ linkend="text-transfer" /> and <xref
+ linkend="history" />.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>jars</filename> - this directory contains
+ plugins. See <xref linkend="using-plugins" />.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>jars-cache</filename> - this directory contains
+ plugin cache files which decrease the time to start jEdit. They
+ are automatically updated when plugins are installed or
+ updated.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>killring.xml</filename> - stores recently
+ deleted text. See <xref linkend="text-transfer" />.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>macros</filename> - this directory contains
+ macros. See <xref linkend="using-macros" />.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>modes</filename> - this directory contains
+ custom edit modes. See <xref
+ linkend="writing-modes-part" />.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>perspective.xml</filename> - an XML file that
+ stores the list of open buffers and views used to maintain
+ editor state between sessions.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>PluginManager.download</filename> - this
+ directory is usually empty. It only contains files while the
+ plugin manager is downloading a plugin. For information about
+ the plugin manager, see <xref linkend="using-plugins" />.</para>
+ </listitem>
+ <listitem><para>
+ <filename>pluginMgr-Cached.xml.gz</filename> -
+ this contains a cached copy of the last XML plugin list downloaded from plugin central. If you delete this file, a new one will be created next time you try to install a plugin via Plugin Manager. </para>
+ </listitem>
+
+ <listitem>
+ <para><filename>printspec</filename> - a binary file that stores
+ printing settings when running under Java 2 version 1.4.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>properties</filename> - a plain text file that
+ stores the majority of jEdit's and its plugins settings. For
+ more information see <xref linkend="propertiesfile" />.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>recent.xml</filename> - an XML file which stores
+ the list of recently opened files. jEdit remembers the caret
+ position and character encoding of each recent file, and
+ automatically restores those values when one of the files is
+ opened.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>registers.xml</filename> - an XML file that
+ stores register contents. See <xref linkend="registers" /> for
+ more information about registers.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>server</filename> - a plain text file that only
+ exists while jEdit is running. The edit server's port number and
+ authorization key is stored here. See <xref
+ linkend="starting" />.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>settings-backup</filename> - this directory
+ contains numbered backups of all automatically-written settings
+ files.</para>
+ </listitem>
+ </itemizedlist>
+
+ <section id="propertiesfile">
+ <title>The jEdit properties file</title>
+
+ <para>The jEdit <literal>properties</literal> file uses the Java
+ properties syntax to store key/value pairs. All of the values are
+ stored as strings, but are interpreted as other types (such as
+ integer or boolean) by plugins at runtime.</para>
+
+ <para>Editing and saving this file while jEdit is running means that
+ until you restart jEdit again, all other changed settings will be
+ lost.</para>
+ </section>
+ </section>
+</chapter>
diff --git a/jEdit/doc/users-guide/dialog-macro.xml b/jEdit/doc/users-guide/dialog-macro.xml
index 9ed63ae..70878c7 100644
--- a/jEdit/doc/users-guide/dialog-macro.xml
+++ b/jEdit/doc/users-guide/dialog-macro.xml
@@ -1,646 +1,646 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter id="dialog-macro">
- <title>A Dialog-Based Macro</title>
-
- <!-- jEdit 4.0 Macro Guide, (C) 2001, 2002 John Gellene -->
-
- <!-- jEdit buffer-local properties: -->
-
- <!-- :indentSize=1:noTabs=yes:maxLineLen=72:tabSize=2: -->
-
- <!-- :xml.root=users-guide.xml: -->
-
- <!-- This file contains an extended discussion of a -->
-
- <!-- dialog-based macro example "Add_Prefix_and_Suffix.bsh" -->
-
- <!-- $Id: dialog-macro.xml 16181 2009-09-08 19:26:57Z ezust $ -->
-
- <para>Now we will look at a more complicated macro which will demonstrate
- some useful techniques and BeanShell features.</para>
-
- <section id="dialog-macro-intro">
- <title>Use of the Macro</title>
-
- <para>Our new example adds prefix and suffix text to a series of
- selected lines. This macro can be used to reduce typing for a series of
- text items that must be preceded and following by identical text. In
- Java, for example, if we are interested in making a series of calls to
- <function>StringBuffer.append()</function> to construct a lengthy,
- formatted string, we could type the parameter for each call on
- successive lines as follows:</para>
-
- <screen>profileString_1
-secretThing.toString()
-name
-address
-addressSupp
-city
-<quote>state/province</quote>
-country</screen>
-
- <para>Our macro would ask for input for the common <quote>prefix</quote>
- and <quote>suffix</quote> to be applied to each line; in this case, the
- prefix is <userinput>ourStringBuffer.append(</userinput> and the suffix
- is <userinput>);</userinput>. After selecting these lines and running
- the macro, the resulting text would look like this:</para>
-
- <screen>ourStringBuffer.append(profileString_1);
-ourStringBuffer.append(secretThing.toString());
-ourStringBuffer.append(name);
-ourStringBuffer.append(address);
-ourStringBuffer.append(addressSupp);
-ourStringBuffer.append(city);
-ourStringBuffer.append(<quote>state/province</quote>);
-ourStringBuffer.append(country);</screen>
- </section>
-
- <section id="add-prefix-and-suffix">
- <title>Listing of the Macro</title>
-
- <para>The macro script follows. You can find it in the jEdit
- distribution in the <filename>Text</filename> subdirectory of the
- <filename>macros</filename> directory. You can also try it out by
- invoking
- <guimenu>Macros</guimenu>><guisubmenu>Text</guisubmenu>><guimenuitem>Add
- Prefix and Suffix</guimenuitem>.</para>
-
- <informalexample>
- <!-- <title>Add_Prefix_and_Suffix.bsh</title> -->
-
- <programlisting>// beginning of Add_Prefix_and_Suffix.bsh
-
-<anchor id="imports" />// import statement (see <xref linkend="explain-imports" />)
-import javax.swing.border.*;
-
-<anchor id="main-routine" />// main routine
-void prefixSuffixDialog()
-{
-<anchor id="create-dialog" /> // create dialog object (see <xref
- linkend="explain-create-dialog" />)
- title = <quote>Add prefix and suffix to selected lines</quote>;
- dialog = new JDialog(view, title, false);
- content = new JPanel(new BorderLayout());
- content.setBorder(new EmptyBorder(12, 12, 12, 12));
- content.setPreferredSize(new Dimension(320, 160));
- dialog.setContentPane(content);
-
-<anchor id="fields-panel" /> // add the text fields (see <xref
- linkend="explain-fields-panel" />)
- fieldPanel = new JPanel(new GridLayout(4, 1, 0, 6));
- prefixField = new HistoryTextField(<quote>macro.add-prefix</quote>);
- prefixLabel = new JLabel(<quote>Prefix to add:</quote>);
- suffixField = new HistoryTextField(<quote>macro.add-suffix</quote>);
- suffixLabel = new JLabel(<quote>Suffix to add:</quote>);
- fieldPanel.add(prefixLabel);
- fieldPanel.add(prefixField);
- fieldPanel.add(suffixLabel);
- fieldPanel.add(suffixField);
- content.add(fieldPanel, <quote>Center</quote>);
-
-<anchor id="button-panel" /> // add a panel containing the buttons (see <xref
- linkend="explain-button-panel" />)
- buttonPanel = new JPanel();
- buttonPanel.setLayout(new BoxLayout(buttonPanel,
- BoxLayout.X_AXIS));
- buttonPanel.setBorder(new EmptyBorder(12, 50, 0, 50));
- buttonPanel.add(Box.createGlue());
- ok = new JButton(<quote>OK</quote>);
- cancel = new JButton(<quote>Cancel</quote>);
- ok.setPreferredSize(cancel.getPreferredSize());
- dialog.getRootPane().setDefaultButton(ok);
- buttonPanel.add(ok);
- buttonPanel.add(Box.createHorizontalStrut(6));
- buttonPanel.add(cancel);
- buttonPanel.add(Box.createGlue());
- content.add(buttonPanel, <quote>South</quote>);
-
-<anchor id="add-listeners" /> // register this method as an ActionListener for
- // the buttons and text fields (see <xref linkend="explain-add-listeners" />)
- ok.addActionListener(this);
- cancel.addActionListener(this);
- prefixField.addActionListener(this);
- suffixField.addActionListener(this);
-
-<anchor id="set-visible" /> // locate the dialog in the center of the
- // editing pane and make it visible (see <xref linkend="explain-set-visible" />)
- dialog.pack();
- dialog.setLocationRelativeTo(view);
- dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
- dialog.setVisible(true);
-
-<anchor id="action-listener" /> // this method will be called when a button is clicked
- // or when ENTER is pressed (see <xref linkend="explain-action-listener" />)
- void actionPerformed(e)
- {
- if(e.getSource() != cancel)
- {
- processText();
- }
- dialog.dispose();
- }
-
-<anchor id="process-text" /> // this is where the work gets done to insert
- // the prefix and suffix (see <xref linkend="explain-process-text" />)
- void processText()
- {
- prefix = prefixField.getText();
- suffix = suffixField.getText();
- if(prefix.length() == 0 && suffix.length() == 0)
- return;
- prefixField.addCurrentToHistory();
- suffixField.addCurrentToHistory();
-
-<anchor id="jEdit-calls" /> // text manipulation begins here using calls
- // to jEdit methods (see <xref linkend="explain-jedit-calls" />)
- buffer.beginCompoundEdit();
- selectedLines = textArea.getSelectedLines();
- for(i = 0; i < selectedLines.length; ++i)
- {
- offsetBOL = textArea.getLineStartOffset(
- selectedLines[i]);
- textArea.setCaretPosition(offsetBOL);
- textArea.goToStartOfWhiteSpace(false);
- textArea.goToEndOfWhiteSpace(true);
- text = textArea.getSelectedText();
- if(text == null) text = "";
- textArea.setSelectedText(prefix + text + suffix);
- }
- buffer.endCompoundEdit();
- }
-}
-
-<anchor id="main" />// this single line of code is the script's main routine
-// (see <xref linkend="explain-main" />)
-prefixSuffixDialog();
-
-// end of Add_Prefix_and_Suffix.bsh</programlisting>
- </informalexample>
- </section>
-
- <section id="macro-analysis">
- <title>Analysis of the Macro</title>
-
- <section id="explain-imports">
- <title>Import Statements</title>
-
- <informalexample>
- <programlisting>// import statement
-import javax.swing.border.*;</programlisting>
- </informalexample>
-
- <para>This macro makes use of classes in the
- <literal>javax.swing.border</literal> package, which is not
- automatically imported. As we mentioned previously (see <xref
- linkend="first-example" />), jEdit's implementation of BeanShell
- causes a number of classes to be automatically imported. Classes
- that are not automatically imported must be identified by a full
- qualified name or be the subject of an <function>import</function>
- statement.</para>
- </section>
-
- <section id="explain-create-dialog">
- <title>Create the Dialog</title>
-
- <informalexample>
- <programlisting>// create dialog object
-title = <quote>Add prefix and suffix to selected lines</quote>;
-dialog = new JDialog(view, title, false);
-content = new JPanel(new BorderLayout());
-content.setBorder(new EmptyBorder(12, 12, 12, 12));
-dialog.setContentPane(content);</programlisting>
- </informalexample>
-
- <para>To get input for the macro, we need a dialog that provides for
- input of the prefix and suffix strings, an <guibutton>OK</guibutton>
- button to perform text insertion, and a
- <guibutton>Cancel</guibutton> button in case we change our mind. We
- have decided to make the dialog window non-modal. This will allow us
- to move around in the text buffer to find things we may need
- (including text to cut and paste) while the macro is running and the
- dialog is visible.</para>
-
- <para>The Java object we need is a <classname>JDialog</classname>
- object from the Swing package. To construct one, we use the
- <function>new</function> keyword and call a
- <glossterm>constructor</glossterm> function. The constructor we use
- takes three parameters: the owner of the new dialog, the title to be
- displayed in the dialog frame, and a <classname>boolean</classname>
- parameter (<constant>true</constant> or <constant>false</constant>)
- that specifies whether the dialog will be modal or non-modal. We
- define the variable <varname>title</varname> using a string literal,
- then use it immediately in the <classname>JDialog</classname>
- constructor.</para>
-
- <para>A <classname>JDialog</classname> object is a window containing
- a single object called a <glossterm>content pane</glossterm>. The
- content pane in turn contains the various visible components of the
- dialog. A <classname>JDialog</classname> creates an empty content
- pane for itself as during its construction. However, to control the
- dialog's appearance as much as possible, we will separately create
- our own content pane and attach it to the
- <classname>JDialog</classname>. We do this by creating a
- <classname>JPanel</classname> object. A
- <classname>JPanel</classname> is a lightweight container for other
- components that can be set to a given size and color. It also
- contains a <glossterm>layout</glossterm> scheme for arranging the
- size and position of its components. Here we are constructing a
- <classname>JPanel</classname> as a content pane with a
- <classname>BorderLayout</classname>. We put a
- <classname>EmptyBorder</classname> inside it to serve as a margin
- between the edge of the window and the components inside. We then
- attach the <classname>JPanel</classname> as the dialog's content
- pane, replacing the dialog's home-grown version.</para>
-
- <para>A <classname>BorderLayout</classname> is one of the simpler
- layout schemes available for container objects like
- <classname>JPanel</classname>. A <classname>BorderLayout</classname>
- divides the container into five sections: <quote>North</quote>,
- <quote>South</quote>, <quote>East</quote>, <quote>West</quote> and
- <quote>Center</quote>. Components are added to the layout using the
- container's <function>add</function> method, specifying the
- component to be added and the section to which it is assigned.
- Building a component like our dialog window involves building a set
- of nested containers and specifying the location of each of their
- member components. We have taken the first step by creating a
- <classname>JPanel</classname> as the dialog's content pane.</para>
- </section>
-
- <section id="explain-fields-panel">
- <title>Create the Text Fields</title>
-
- <informalexample>
- <programlisting>// add the text fields
-fieldPanel = new JPanel(new GridLayout(4, 1, 0, 6));
-prefixField = new HistoryTextField("macro.add-prefix");
-prefixLabel = new JLabel(<quote>Prefix to add</quote>:);
-suffixField = new HistoryTextField(<quote>macro.add-suffix</quote>);
-suffixLabel = new JLabel(<quote>Suffix to add:</quote>);
-fieldPanel.add(prefixLabel);
-fieldPanel.add(prefixField);
-fieldPanel.add(suffixLabel);
-fieldPanel.add(suffixField);
-content.add(fieldPanel, <quote>Center</quote>);</programlisting>
- </informalexample>
-
- <para>Next we shall create a smaller panel containing two fields for
- entering the prefix and suffix text and two labels identifying the
- input fields.</para>
-
- <para>For the text fields, we will use jEdit's <ulink
- url="../api/org/gjt/sp/jedit/gui/HistoryTextField.html">HistoryTextField</ulink>
- class. It is derived from the Java Swing class
- <classname>JTextField</classname>. This class offers the enhancement
- of a stored list of prior values used as text input. When the
- component has input focus, the up and down keys scroll through the
- prior values for the variable. <!-- The prior values are stored in a file named
- <filename>history</filename> located in the directory in which jEdit stores
- various user data. --></para>
-
- <para>To create the <ulink
- url="../api/org/gjt/sp/jedit/gui/HistoryTextField.html">HistoryTextField</ulink>
- objects we use a constructor method that takes a single parameter:
- the name of the tag under which history values will be stored. Here
- we choose names that are not likely to conflict with existing jEdit
- history items.</para>
-
- <para>The labels that accompany the text fields are
- <classname>JLabel</classname> objects from the Java Swing package.
- The constructor we use for both labels takes the label text as a
- single <classname>String</classname> parameter.</para>
-
- <para>We wish to arrange these four components from top to bottom,
- one after the other. To achieve that, we use a
- <classname>JPanel</classname> container object named
- <varname>fieldPanel</varname> that will be nested inside the
- dialog's content pane that we have already created. In the
- constructor for <varname>fieldPanel</varname>, we assign a new
- <classname>GridLayout</classname> with the indicated parameters:
- four rows, one column, zero spacing between columns (a meaningless
- element of a grid with only one column, but nevertheless a required
- parameter) and spacing of six pixels between rows. The spacing
- between rows spreads out the four <quote>grid</quote> elements.
- After the components, the panel and the layout are specified, the
- components are added to <varname>fieldPanel</varname> top to bottom,
- one <quote>grid cell</quote> at a time. Finally, the complete
- <varname>fieldPanel</varname> is added to the dialog's content pane
- to occupy the <quote>Center</quote> section of the content
- pane.</para>
- </section>
-
- <section id="explain-button-panel">
- <title>Create the Buttons</title>
-
- <informalexample>
- <programlisting>// add the buttons
-buttonPanel = new JPanel();
-buttonPanel.setLayout(new BoxLayout(buttonPanel,
- BoxLayout.X_AXIS));
-buttonPanel.setBorder(new EmptyBorder(12, 50, 0, 50));
-buttonPanel.add(Box.createGlue());
-ok = new JButton(<quote>OK</quote>);
-cancel = new JButton(<quote>Cancel</quote>);
-ok.setPreferredSize(cancel.getPreferredSize());
-dialog.getRootPane().setDefaultButton(ok);
-buttonPanel.add(ok);
-buttonPanel.add(Box.createHorizontalStrut(6));
-buttonPanel.add(cancel);
-buttonPanel.add(Box.createGlue());
-content.add(buttonPanel, <quote>South</quote>);</programlisting>
- </informalexample>
-
- <para>To create the dialog's buttons, we follow repeat the
- <quote>nested container</quote> pattern we used in creating the text
- fields. First, we create a new, nested panel. This time we use a
- <classname>BoxLayout</classname> that places components either in a
- single row or column, depending on the parameter passed to its
- constructor. This layout object is more flexible than a
- <classname>GridLayout</classname> in that variable spacing between
- elements can be specified easily. We put an
- <classname>EmptyBorder</classname> in the new panel to set margins
- for placing the buttons. Then we create the buttons, using a
- <classname>JButton</classname> constructor that specifies the button
- text. After setting the size of the <guilabel>OK</guilabel> button
- to equal the size of the <guilabel>Cancel</guilabel> button, we
- designate the <guilabel>OK</guilabel> button as the default button
- in the dialog. This causes the <guilabel>OK</guilabel> button to be
- outlined when the dialog if first displayed. Finally, we place the
- buttons side by side with a 6 pixel gap between them (for aesthetic
- reasons), and place the completed <varname>buttonPanel</varname> in
- the <quote>South</quote> section of the dialog's content
- pane.</para>
- </section>
-
- <section id="explain-add-listeners">
- <title>Register the Action Listeners</title>
-
- <informalexample>
- <programlisting>// register this method as an ActionListener for
-// the buttons and text fields
-ok.addActionListener(this);
-cancel.addActionListener(this);
-prefixField.addActionListener(this);
-suffixField.addActionListener(this);</programlisting>
- </informalexample>
-
- <para>In order to specify the action to be taken upon clicking a
- button or pressing the <keycap>Enter</keycap> key, we must register
- an <classname>ActionListener</classname> for each of the four active
- components of the dialog - the two <ulink
- url="../api/org/gjt/sp/jedit/HistoryTextField.html">HistoryTextField</ulink>
- components and the two buttons. In Java, an
- <classname>ActionListener</classname> is an
- <glossterm>interface</glossterm> - an abstract specification for a
- derived class to implement. The
- <classname>ActionListener</classname> interface contains a single
- method to be implemented:</para>
-
- <funcsynopsis>
- <funcprototype>
- <funcdef>public void
- <function>actionPerformed</function></funcdef>
-
- <paramdef>ActionEvent <parameter>e</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
-
- <para>BeanShell does not permit a script to create derived classes.
- However, BeanShell offers a useful substitute: a method can be used
- as a scripted object that can include nested methods implementing a
- number of Java interfaces. The method
- <function>prefixSuffixDialog()</function> that we are writing can
- thus be treated as an <classname>ActionListener</classname> object.
- To accomplish this, we call <function>addActionListener()</function>
- on each of the four components specifying <varname>this</varname> as
- the <classname>ActionListener</classname>. We still need to
- implement the interface. We will do that shortly.</para>
- </section>
-
- <section id="explain-set-visible">
- <title>Make the Dialog Visible</title>
-
- <informalexample>
- <programlisting>// locate the dialog in the center of the
-// editing pane and make it visible
-dialog.pack();
-dialog.setLocationRelativeTo(view);
-dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
-dialog.setVisible(true);</programlisting>
- </informalexample>
-
- <para>Here we do three things. First, we activate all the layout
- routines we have established by calling the
- <function>pack()</function> method for the dialog as the top-level
- window. Next we center the dialog's position in the active jEdit
- <varname>view</varname> by calling
- <function>setLocationRelativeTo()</function> on the dialog. We also
- call the <function>setDefaultCloseOperation()</function> function to
- specify that the dialog box should be immediately disposed if the
- user clicks the close box. Finally, we activate the dialog by
- calling <function>setVisible()</function>with the state parameter
- set to <constant>true</constant>.</para>
-
- <para>At this point we have a decent looking dialog window that
- doesn't do anything. Without more code, it will not respond to user
- input and will not accomplish any text manipulation. The remainder
- of the script deals with these two requirements.</para>
- </section>
-
- <section id="explain-action-listener">
- <title>The Action Listener</title>
-
- <informalexample>
- <programlisting>// this method will be called when a button is clicked
-// or when ENTER is pressed
-void actionPerformed(e)
-{
- if(e.getSource() != cancel)
- {
- processText();
- }
- dialog.dispose();
-}</programlisting>
- </informalexample>
-
- <para>The method <function>actionPerformed()</function> nested
- inside <function>prefixSuffixDialog()</function> implements the
- implicit <classname>ActionListener</classname> interface. It looks
- at the source of the <classname>ActionEvent</classname>, determined
- by a call to <function>getSource()</function>. What we do with this
- return value is straightforward: if the source is not the
- <guibutton>Cancel</guibutton> button, we call the
- <function>processText()</function> method to insert the prefix and
- suffix text. Then the dialog is closed by calling its
- <function>dispose()</function> method.</para>
-
- <para>The ability to implement interfaces like
- <classname>ActionListener</classname> inside a BeanShell script is
- one of the more powerful features of the BeanShell package. this
- technique is discussed in the next chapter; see <xref
- linkend="macro-tips-BeanShell-class" />.</para>
- </section>
-
- <section id="explain-process-text">
- <title>Get the User's Input</title>
-
- <informalexample>
- <programlisting>// this is where the work gets done to insert
-// the prefix and suffix
-void processText()
-{
- prefix = prefixField.getText();
- suffix = suffixField.getText();
- if(prefix.length() == 0 && suffix.length() == 0)
- return;
- prefixField.addCurrentToHistory();
- suffixField.addCurrentToHistory();</programlisting>
- </informalexample>
-
- <para>The method <function>processText()</function> does the work of
- our macro. First we obtain the input from the two text fields with a
- call to their <function>getText()</function> methods. If they are
- both empty, there is nothing to do, so the method returns. If there
- is input, any text in the field is added to that field's stored
- history list by calling <function>addCurrentToHistory()</function>.
- We do not need to test the <varname>prefixField</varname> or
- <varname>suffixField</varname> controls for
- <constant>null</constant> or empty values because
- <function>addCurrentToHistory()</function> does that
- internally.</para>
- </section>
-
- <section id="explain-jedit-calls">
- <title>Call jEdit Methods to Manipulate Text</title>
-
- <informalexample>
- <programlisting> // text manipulation begins here using calls
- // to jEdit methods
- buffer.beginCompoundEdit();
- selectedLines = textArea.getSelectedLines();
- for(i = 0; i < selectedLines.length; ++i)
- {
- offsetBOL = textArea.getLineStartOffset(
- selectedLines[i]);
- textArea.setCaretPosition(offsetBOL);
- textArea.goToStartOfWhiteSpace(false);
- textArea.goToEndOfWhiteSpace(true);
- text = textArea.getSelectedText();
- if(text == null) text = "";
- textArea.setSelectedText(prefix + text + suffix);
- }
- buffer.endCompoundEdit();
-}</programlisting>
- </informalexample>
-
- <para>The text manipulation routine loops through each selected line
- in the text buffer. We get the loop parameters by calling
- <function>textArea.getSelectedLines()</function>, which returns an
- array consisting of the line numbers of every selected line. The
- array includes the number of the current line, whether or not it is
- selected, and the line numbers are sorted in increasing order. We
- iterate through each member of the <varname>selectedLines</varname>
- array, which represents the number of a selected line, and apply the
- following routine:</para>
-
- <itemizedlist>
- <listitem>
- <para>Get the buffer position of the start of the line
- (expressed as a zero-based index from the start of the
- buffer) by calling
- <function>textArea.getLineStartOffset(selectedLines[i])</function>;</para>
- </listitem>
-
- <listitem>
- <para>Move the caret to that position by calling
- <function>textArea.setCaretPosition()</function>;</para>
- </listitem>
-
- <listitem>
- <para>Find the first and last non-whitespace characters on
- the line by calling
- <function>textArea.goToStartOfWhiteSpace()</function> and
- <function>textArea.goToEndOfWhiteSpace()</function>;</para>
-
- <para>The <function>goTo...</function> methods in <ulink
- url="../api/org/gjt/sp/jedit/textarea/JEditTextArea.html">JEditTextArea</ulink>
- take a single parameter which tells jEdit whether the text
- between the current caret position and the desired position
- should be selected. Here, we call
- <function>textArea.goToStartOfWhiteSpace(false)</function>
- so that no text is selected, then call
- <function>textArea.goToEndOfWhiteSpace(true)</function> so
- that all of the text between the beginning and ending
- whitespace is selected.</para>
- </listitem>
-
- <listitem>
- <para>Retrieve the selected text by storing the return value
- of <function>textArea.getSelectedText()</function> in a new
- variable <function>text</function>.</para>
-
- <para>If the line is empty,
- <function>getSelectedText()</function> will return
- <constant>null</constant>. In that case, we assign an empty
- string to <varname>text</varname> to avoid calling methods
- on a null object.</para>
- </listitem>
-
- <listitem>
- <para>Change the selected text to <varname>prefix + text +
- suffix</varname> by calling
- <function>textArea.setSelectedText()</function>. If there is
- no selected text (for example, if the line is empty), the
- prefix and suffix will be inserted without any intervening
- characters.</para>
- </listitem>
- </itemizedlist>
-
- <sidebar>
- <title>Compound edits</title>
-
- <para>Note the <function>beginCompoundEdit()</function> and
- <function>endCompoundEdit()</function> calls. These ensure that
- all edits performed between the two calls can be undone in one
- step. Normally, jEdit automatically wraps a macro call in these
- methods; however if the macro shows a non-modal dialog box, as
- far as jEdit is concerned the macro has finished executing by
- the time the dialog is shown, since control returns to the event
- dispatch thread.</para>
-
- <para>If you do not understand this, don't worry; just keep it
- in mind if your macro needs to show a non-modal dialog box for
- some reason; Most macros won't.</para>
- </sidebar>
-
- <!-- <para>
- The loop routine is bracketed by calls to
- <function>buffer.beginCompoundEdit()</function> and
- <function>buffer.endCompoundEdit()</function>. These methods
- modify the way in which jEdit's undo facility performs. Text
- operations done between calls to these functions will be
- treated as a single operation for undo purposes. A single undo
- command issued immediately after the macro completes will thus remove
- the prefix and suffix text from all of the previously selected lines.
- </para> -->
- </section>
-
- <section id="explain-main">
- <title>The Main Routine</title>
-
- <informalexample>
- <programlisting>// this single line of code is the script's main routine
-prefixSuffixDialog();</programlisting>
- </informalexample>
-
- <para>The call to <function>prefixSuffixDialog()</function>is the
- only line in the macro that is not inside an enclosing block.
- BeanShell treats such code as a top-level <function>main</function>
- method and begins execution with it.</para>
-
- <para>Our analysis of <filename>Add_Prefix_and_Suffix.bsh</filename>
- is now complete. In the next section, we look at other ways in which
- a macro can obtain user input, as well as other macro writing
- techniques.</para>
- </section>
- </section>
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="dialog-macro">
+ <title>A Dialog-Based Macro</title>
+
+ <!-- jEdit 4.0 Macro Guide, (C) 2001, 2002 John Gellene -->
+
+ <!-- jEdit buffer-local properties: -->
+
+ <!-- :indentSize=1:noTabs=yes:maxLineLen=72:tabSize=2: -->
+
+ <!-- :xml.root=users-guide.xml: -->
+
+ <!-- This file contains an extended discussion of a -->
+
+ <!-- dialog-based macro example "Add_Prefix_and_Suffix.bsh" -->
+
+ <!-- $Id: dialog-macro.xml 16181 2009-09-08 19:26:57Z ezust $ -->
+
+ <para>Now we will look at a more complicated macro which will demonstrate
+ some useful techniques and BeanShell features.</para>
+
+ <section id="dialog-macro-intro">
+ <title>Use of the Macro</title>
+
+ <para>Our new example adds prefix and suffix text to a series of
+ selected lines. This macro can be used to reduce typing for a series of
+ text items that must be preceded and following by identical text. In
+ Java, for example, if we are interested in making a series of calls to
+ <function>StringBuffer.append()</function> to construct a lengthy,
+ formatted string, we could type the parameter for each call on
+ successive lines as follows:</para>
+
+ <screen>profileString_1
+secretThing.toString()
+name
+address
+addressSupp
+city
+<quote>state/province</quote>
+country</screen>
+
+ <para>Our macro would ask for input for the common <quote>prefix</quote>
+ and <quote>suffix</quote> to be applied to each line; in this case, the
+ prefix is <userinput>ourStringBuffer.append(</userinput> and the suffix
+ is <userinput>);</userinput>. After selecting these lines and running
+ the macro, the resulting text would look like this:</para>
+
+ <screen>ourStringBuffer.append(profileString_1);
+ourStringBuffer.append(secretThing.toString());
+ourStringBuffer.append(name);
+ourStringBuffer.append(address);
+ourStringBuffer.append(addressSupp);
+ourStringBuffer.append(city);
+ourStringBuffer.append(<quote>state/province</quote>);
+ourStringBuffer.append(country);</screen>
+ </section>
+
+ <section id="add-prefix-and-suffix">
+ <title>Listing of the Macro</title>
+
+ <para>The macro script follows. You can find it in the jEdit
+ distribution in the <filename>Text</filename> subdirectory of the
+ <filename>macros</filename> directory. You can also try it out by
+ invoking
+ <guimenu>Macros</guimenu>><guisubmenu>Text</guisubmenu>><guimenuitem>Add
+ Prefix and Suffix</guimenuitem>.</para>
+
+ <informalexample>
+ <!-- <title>Add_Prefix_and_Suffix.bsh</title> -->
+
+ <programlisting>// beginning of Add_Prefix_and_Suffix.bsh
+
+<anchor id="imports" />// import statement (see <xref linkend="explain-imports" />)
+import javax.swing.border.*;
+
+<anchor id="main-routine" />// main routine
+void prefixSuffixDialog()
+{
+<anchor id="create-dialog" /> // create dialog object (see <xref
+ linkend="explain-create-dialog" />)
+ title = <quote>Add prefix and suffix to selected lines</quote>;
+ dialog = new JDialog(view, title, false);
+ content = new JPanel(new BorderLayout());
+ content.setBorder(new EmptyBorder(12, 12, 12, 12));
+ content.setPreferredSize(new Dimension(320, 160));
+ dialog.setContentPane(content);
+
+<anchor id="fields-panel" /> // add the text fields (see <xref
+ linkend="explain-fields-panel" />)
+ fieldPanel = new JPanel(new GridLayout(4, 1, 0, 6));
+ prefixField = new HistoryTextField(<quote>macro.add-prefix</quote>);
+ prefixLabel = new JLabel(<quote>Prefix to add:</quote>);
+ suffixField = new HistoryTextField(<quote>macro.add-suffix</quote>);
+ suffixLabel = new JLabel(<quote>Suffix to add:</quote>);
+ fieldPanel.add(prefixLabel);
+ fieldPanel.add(prefixField);
+ fieldPanel.add(suffixLabel);
+ fieldPanel.add(suffixField);
+ content.add(fieldPanel, <quote>Center</quote>);
+
+<anchor id="button-panel" /> // add a panel containing the buttons (see <xref
+ linkend="explain-button-panel" />)
+ buttonPanel = new JPanel();
+ buttonPanel.setLayout(new BoxLayout(buttonPanel,
+ BoxLayout.X_AXIS));
+ buttonPanel.setBorder(new EmptyBorder(12, 50, 0, 50));
+ buttonPanel.add(Box.createGlue());
+ ok = new JButton(<quote>OK</quote>);
+ cancel = new JButton(<quote>Cancel</quote>);
+ ok.setPreferredSize(cancel.getPreferredSize());
+ dialog.getRootPane().setDefaultButton(ok);
+ buttonPanel.add(ok);
+ buttonPanel.add(Box.createHorizontalStrut(6));
+ buttonPanel.add(cancel);
+ buttonPanel.add(Box.createGlue());
+ content.add(buttonPanel, <quote>South</quote>);
+
+<anchor id="add-listeners" /> // register this method as an ActionListener for
+ // the buttons and text fields (see <xref linkend="explain-add-listeners" />)
+ ok.addActionListener(this);
+ cancel.addActionListener(this);
+ prefixField.addActionListener(this);
+ suffixField.addActionListener(this);
+
+<anchor id="set-visible" /> // locate the dialog in the center of the
+ // editing pane and make it visible (see <xref linkend="explain-set-visible" />)
+ dialog.pack();
+ dialog.setLocationRelativeTo(view);
+ dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
+ dialog.setVisible(true);
+
+<anchor id="action-listener" /> // this method will be called when a button is clicked
+ // or when ENTER is pressed (see <xref linkend="explain-action-listener" />)
+ void actionPerformed(e)
+ {
+ if(e.getSource() != cancel)
+ {
+ processText();
+ }
+ dialog.dispose();
+ }
+
+<anchor id="process-text" /> // this is where the work gets done to insert
+ // the prefix and suffix (see <xref linkend="explain-process-text" />)
+ void processText()
+ {
+ prefix = prefixField.getText();
+ suffix = suffixField.getText();
+ if(prefix.length() == 0 && suffix.length() == 0)
+ return;
+ prefixField.addCurrentToHistory();
+ suffixField.addCurrentToHistory();
+
+<anchor id="jEdit-calls" /> // text manipulation begins here using calls
+ // to jEdit methods (see <xref linkend="explain-jedit-calls" />)
+ buffer.beginCompoundEdit();
+ selectedLines = textArea.getSelectedLines();
+ for(i = 0; i < selectedLines.length; ++i)
+ {
+ offsetBOL = textArea.getLineStartOffset(
+ selectedLines[i]);
+ textArea.setCaretPosition(offsetBOL);
+ textArea.goToStartOfWhiteSpace(false);
+ textArea.goToEndOfWhiteSpace(true);
+ text = textArea.getSelectedText();
+ if(text == null) text = "";
+ textArea.setSelectedText(prefix + text + suffix);
+ }
+ buffer.endCompoundEdit();
+ }
+}
+
+<anchor id="main" />// this single line of code is the script's main routine
+// (see <xref linkend="explain-main" />)
+prefixSuffixDialog();
+
+// end of Add_Prefix_and_Suffix.bsh</programlisting>
+ </informalexample>
+ </section>
+
+ <section id="macro-analysis">
+ <title>Analysis of the Macro</title>
+
+ <section id="explain-imports">
+ <title>Import Statements</title>
+
+ <informalexample>
+ <programlisting>// import statement
+import javax.swing.border.*;</programlisting>
+ </informalexample>
+
+ <para>This macro makes use of classes in the
+ <literal>javax.swing.border</literal> package, which is not
+ automatically imported. As we mentioned previously (see <xref
+ linkend="first-example" />), jEdit's implementation of BeanShell
+ causes a number of classes to be automatically imported. Classes
+ that are not automatically imported must be identified by a full
+ qualified name or be the subject of an <function>import</function>
+ statement.</para>
+ </section>
+
+ <section id="explain-create-dialog">
+ <title>Create the Dialog</title>
+
+ <informalexample>
+ <programlisting>// create dialog object
+title = <quote>Add prefix and suffix to selected lines</quote>;
+dialog = new JDialog(view, title, false);
+content = new JPanel(new BorderLayout());
+content.setBorder(new EmptyBorder(12, 12, 12, 12));
+dialog.setContentPane(content);</programlisting>
+ </informalexample>
+
+ <para>To get input for the macro, we need a dialog that provides for
+ input of the prefix and suffix strings, an <guibutton>OK</guibutton>
+ button to perform text insertion, and a
+ <guibutton>Cancel</guibutton> button in case we change our mind. We
+ have decided to make the dialog window non-modal. This will allow us
+ to move around in the text buffer to find things we may need
+ (including text to cut and paste) while the macro is running and the
+ dialog is visible.</para>
+
+ <para>The Java object we need is a <classname>JDialog</classname>
+ object from the Swing package. To construct one, we use the
+ <function>new</function> keyword and call a
+ <glossterm>constructor</glossterm> function. The constructor we use
+ takes three parameters: the owner of the new dialog, the title to be
+ displayed in the dialog frame, and a <classname>boolean</classname>
+ parameter (<constant>true</constant> or <constant>false</constant>)
+ that specifies whether the dialog will be modal or non-modal. We
+ define the variable <varname>title</varname> using a string literal,
+ then use it immediately in the <classname>JDialog</classname>
+ constructor.</para>
+
+ <para>A <classname>JDialog</classname> object is a window containing
+ a single object called a <glossterm>content pane</glossterm>. The
+ content pane in turn contains the various visible components of the
+ dialog. A <classname>JDialog</classname> creates an empty content
+ pane for itself as during its construction. However, to control the
+ dialog's appearance as much as possible, we will separately create
+ our own content pane and attach it to the
+ <classname>JDialog</classname>. We do this by creating a
+ <classname>JPanel</classname> object. A
+ <classname>JPanel</classname> is a lightweight container for other
+ components that can be set to a given size and color. It also
+ contains a <glossterm>layout</glossterm> scheme for arranging the
+ size and position of its components. Here we are constructing a
+ <classname>JPanel</classname> as a content pane with a
+ <classname>BorderLayout</classname>. We put a
+ <classname>EmptyBorder</classname> inside it to serve as a margin
+ between the edge of the window and the components inside. We then
+ attach the <classname>JPanel</classname> as the dialog's content
+ pane, replacing the dialog's home-grown version.</para>
+
+ <para>A <classname>BorderLayout</classname> is one of the simpler
+ layout schemes available for container objects like
+ <classname>JPanel</classname>. A <classname>BorderLayout</classname>
+ divides the container into five sections: <quote>North</quote>,
+ <quote>South</quote>, <quote>East</quote>, <quote>West</quote> and
+ <quote>Center</quote>. Components are added to the layout using the
+ container's <function>add</function> method, specifying the
+ component to be added and the section to which it is assigned.
+ Building a component like our dialog window involves building a set
+ of nested containers and specifying the location of each of their
+ member components. We have taken the first step by creating a
+ <classname>JPanel</classname> as the dialog's content pane.</para>
+ </section>
+
+ <section id="explain-fields-panel">
+ <title>Create the Text Fields</title>
+
+ <informalexample>
+ <programlisting>// add the text fields
+fieldPanel = new JPanel(new GridLayout(4, 1, 0, 6));
+prefixField = new HistoryTextField("macro.add-prefix");
+prefixLabel = new JLabel(<quote>Prefix to add</quote>:);
+suffixField = new HistoryTextField(<quote>macro.add-suffix</quote>);
+suffixLabel = new JLabel(<quote>Suffix to add:</quote>);
+fieldPanel.add(prefixLabel);
+fieldPanel.add(prefixField);
+fieldPanel.add(suffixLabel);
+fieldPanel.add(suffixField);
+content.add(fieldPanel, <quote>Center</quote>);</programlisting>
+ </informalexample>
+
+ <para>Next we shall create a smaller panel containing two fields for
+ entering the prefix and suffix text and two labels identifying the
+ input fields.</para>
+
+ <para>For the text fields, we will use jEdit's <ulink
+ url="../api/org/gjt/sp/jedit/gui/HistoryTextField.html">HistoryTextField</ulink>
+ class. It is derived from the Java Swing class
+ <classname>JTextField</classname>. This class offers the enhancement
+ of a stored list of prior values used as text input. When the
+ component has input focus, the up and down keys scroll through the
+ prior values for the variable. <!-- The prior values are stored in a file named
+ <filename>history</filename> located in the directory in which jEdit stores
+ various user data. --></para>
+
+ <para>To create the <ulink
+ url="../api/org/gjt/sp/jedit/gui/HistoryTextField.html">HistoryTextField</ulink>
+ objects we use a constructor method that takes a single parameter:
+ the name of the tag under which history values will be stored. Here
+ we choose names that are not likely to conflict with existing jEdit
+ history items.</para>
+
+ <para>The labels that accompany the text fields are
+ <classname>JLabel</classname> objects from the Java Swing package.
+ The constructor we use for both labels takes the label text as a
+ single <classname>String</classname> parameter.</para>
+
+ <para>We wish to arrange these four components from top to bottom,
+ one after the other. To achieve that, we use a
+ <classname>JPanel</classname> container object named
+ <varname>fieldPanel</varname> that will be nested inside the
+ dialog's content pane that we have already created. In the
+ constructor for <varname>fieldPanel</varname>, we assign a new
+ <classname>GridLayout</classname> with the indicated parameters:
+ four rows, one column, zero spacing between columns (a meaningless
+ element of a grid with only one column, but nevertheless a required
+ parameter) and spacing of six pixels between rows. The spacing
+ between rows spreads out the four <quote>grid</quote> elements.
+ After the components, the panel and the layout are specified, the
+ components are added to <varname>fieldPanel</varname> top to bottom,
+ one <quote>grid cell</quote> at a time. Finally, the complete
+ <varname>fieldPanel</varname> is added to the dialog's content pane
+ to occupy the <quote>Center</quote> section of the content
+ pane.</para>
+ </section>
+
+ <section id="explain-button-panel">
+ <title>Create the Buttons</title>
+
+ <informalexample>
+ <programlisting>// add the buttons
+buttonPanel = new JPanel();
+buttonPanel.setLayout(new BoxLayout(buttonPanel,
+ BoxLayout.X_AXIS));
+buttonPanel.setBorder(new EmptyBorder(12, 50, 0, 50));
+buttonPanel.add(Box.createGlue());
+ok = new JButton(<quote>OK</quote>);
+cancel = new JButton(<quote>Cancel</quote>);
+ok.setPreferredSize(cancel.getPreferredSize());
+dialog.getRootPane().setDefaultButton(ok);
+buttonPanel.add(ok);
+buttonPanel.add(Box.createHorizontalStrut(6));
+buttonPanel.add(cancel);
+buttonPanel.add(Box.createGlue());
+content.add(buttonPanel, <quote>South</quote>);</programlisting>
+ </informalexample>
+
+ <para>To create the dialog's buttons, we follow repeat the
+ <quote>nested container</quote> pattern we used in creating the text
+ fields. First, we create a new, nested panel. This time we use a
+ <classname>BoxLayout</classname> that places components either in a
+ single row or column, depending on the parameter passed to its
+ constructor. This layout object is more flexible than a
+ <classname>GridLayout</classname> in that variable spacing between
+ elements can be specified easily. We put an
+ <classname>EmptyBorder</classname> in the new panel to set margins
+ for placing the buttons. Then we create the buttons, using a
+ <classname>JButton</classname> constructor that specifies the button
+ text. After setting the size of the <guilabel>OK</guilabel> button
+ to equal the size of the <guilabel>Cancel</guilabel> button, we
+ designate the <guilabel>OK</guilabel> button as the default button
+ in the dialog. This causes the <guilabel>OK</guilabel> button to be
+ outlined when the dialog if first displayed. Finally, we place the
+ buttons side by side with a 6 pixel gap between them (for aesthetic
+ reasons), and place the completed <varname>buttonPanel</varname> in
+ the <quote>South</quote> section of the dialog's content
+ pane.</para>
+ </section>
+
+ <section id="explain-add-listeners">
+ <title>Register the Action Listeners</title>
+
+ <informalexample>
+ <programlisting>// register this method as an ActionListener for
+// the buttons and text fields
+ok.addActionListener(this);
+cancel.addActionListener(this);
+prefixField.addActionListener(this);
+suffixField.addActionListener(this);</programlisting>
+ </informalexample>
+
+ <para>In order to specify the action to be taken upon clicking a
+ button or pressing the <keycap>Enter</keycap> key, we must register
+ an <classname>ActionListener</classname> for each of the four active
+ components of the dialog - the two <ulink
+ url="../api/org/gjt/sp/jedit/HistoryTextField.html">HistoryTextField</ulink>
+ components and the two buttons. In Java, an
+ <classname>ActionListener</classname> is an
+ <glossterm>interface</glossterm> - an abstract specification for a
+ derived class to implement. The
+ <classname>ActionListener</classname> interface contains a single
+ method to be implemented:</para>
+
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>public void
+ <function>actionPerformed</function></funcdef>
+
+ <paramdef>ActionEvent <parameter>e</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>BeanShell does not permit a script to create derived classes.
+ However, BeanShell offers a useful substitute: a method can be used
+ as a scripted object that can include nested methods implementing a
+ number of Java interfaces. The method
+ <function>prefixSuffixDialog()</function> that we are writing can
+ thus be treated as an <classname>ActionListener</classname> object.
+ To accomplish this, we call <function>addActionListener()</function>
+ on each of the four components specifying <varname>this</varname> as
+ the <classname>ActionListener</classname>. We still need to
+ implement the interface. We will do that shortly.</para>
+ </section>
+
+ <section id="explain-set-visible">
+ <title>Make the Dialog Visible</title>
+
+ <informalexample>
+ <programlisting>// locate the dialog in the center of the
+// editing pane and make it visible
+dialog.pack();
+dialog.setLocationRelativeTo(view);
+dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
+dialog.setVisible(true);</programlisting>
+ </informalexample>
+
+ <para>Here we do three things. First, we activate all the layout
+ routines we have established by calling the
+ <function>pack()</function> method for the dialog as the top-level
+ window. Next we center the dialog's position in the active jEdit
+ <varname>view</varname> by calling
+ <function>setLocationRelativeTo()</function> on the dialog. We also
+ call the <function>setDefaultCloseOperation()</function> function to
+ specify that the dialog box should be immediately disposed if the
+ user clicks the close box. Finally, we activate the dialog by
+ calling <function>setVisible()</function>with the state parameter
+ set to <constant>true</constant>.</para>
+
+ <para>At this point we have a decent looking dialog window that
+ doesn't do anything. Without more code, it will not respond to user
+ input and will not accomplish any text manipulation. The remainder
+ of the script deals with these two requirements.</para>
+ </section>
+
+ <section id="explain-action-listener">
+ <title>The Action Listener</title>
+
+ <informalexample>
+ <programlisting>// this method will be called when a button is clicked
+// or when ENTER is pressed
+void actionPerformed(e)
+{
+ if(e.getSource() != cancel)
+ {
+ processText();
+ }
+ dialog.dispose();
+}</programlisting>
+ </informalexample>
+
+ <para>The method <function>actionPerformed()</function> nested
+ inside <function>prefixSuffixDialog()</function> implements the
+ implicit <classname>ActionListener</classname> interface. It looks
+ at the source of the <classname>ActionEvent</classname>, determined
+ by a call to <function>getSource()</function>. What we do with this
+ return value is straightforward: if the source is not the
+ <guibutton>Cancel</guibutton> button, we call the
+ <function>processText()</function> method to insert the prefix and
+ suffix text. Then the dialog is closed by calling its
+ <function>dispose()</function> method.</para>
+
+ <para>The ability to implement interfaces like
+ <classname>ActionListener</classname> inside a BeanShell script is
+ one of the more powerful features of the BeanShell package. this
+ technique is discussed in the next chapter; see <xref
+ linkend="macro-tips-BeanShell-class" />.</para>
+ </section>
+
+ <section id="explain-process-text">
+ <title>Get the User's Input</title>
+
+ <informalexample>
+ <programlisting>// this is where the work gets done to insert
+// the prefix and suffix
+void processText()
+{
+ prefix = prefixField.getText();
+ suffix = suffixField.getText();
+ if(prefix.length() == 0 && suffix.length() == 0)
+ return;
+ prefixField.addCurrentToHistory();
+ suffixField.addCurrentToHistory();</programlisting>
+ </informalexample>
+
+ <para>The method <function>processText()</function> does the work of
+ our macro. First we obtain the input from the two text fields with a
+ call to their <function>getText()</function> methods. If they are
+ both empty, there is nothing to do, so the method returns. If there
+ is input, any text in the field is added to that field's stored
+ history list by calling <function>addCurrentToHistory()</function>.
+ We do not need to test the <varname>prefixField</varname> or
+ <varname>suffixField</varname> controls for
+ <constant>null</constant> or empty values because
+ <function>addCurrentToHistory()</function> does that
+ internally.</para>
+ </section>
+
+ <section id="explain-jedit-calls">
+ <title>Call jEdit Methods to Manipulate Text</title>
+
+ <informalexample>
+ <programlisting> // text manipulation begins here using calls
+ // to jEdit methods
+ buffer.beginCompoundEdit();
+ selectedLines = textArea.getSelectedLines();
+ for(i = 0; i < selectedLines.length; ++i)
+ {
+ offsetBOL = textArea.getLineStartOffset(
+ selectedLines[i]);
+ textArea.setCaretPosition(offsetBOL);
+ textArea.goToStartOfWhiteSpace(false);
+ textArea.goToEndOfWhiteSpace(true);
+ text = textArea.getSelectedText();
+ if(text == null) text = "";
+ textArea.setSelectedText(prefix + text + suffix);
+ }
+ buffer.endCompoundEdit();
+}</programlisting>
+ </informalexample>
+
+ <para>The text manipulation routine loops through each selected line
+ in the text buffer. We get the loop parameters by calling
+ <function>textArea.getSelectedLines()</function>, which returns an
+ array consisting of the line numbers of every selected line. The
+ array includes the number of the current line, whether or not it is
+ selected, and the line numbers are sorted in increasing order. We
+ iterate through each member of the <varname>selectedLines</varname>
+ array, which represents the number of a selected line, and apply the
+ following routine:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>Get the buffer position of the start of the line
+ (expressed as a zero-based index from the start of the
+ buffer) by calling
+ <function>textArea.getLineStartOffset(selectedLines[i])</function>;</para>
+ </listitem>
+
+ <listitem>
+ <para>Move the caret to that position by calling
+ <function>textArea.setCaretPosition()</function>;</para>
+ </listitem>
+
+ <listitem>
+ <para>Find the first and last non-whitespace characters on
+ the line by calling
+ <function>textArea.goToStartOfWhiteSpace()</function> and
+ <function>textArea.goToEndOfWhiteSpace()</function>;</para>
+
+ <para>The <function>goTo...</function> methods in <ulink
+ url="../api/org/gjt/sp/jedit/textarea/JEditTextArea.html">JEditTextArea</ulink>
+ take a single parameter which tells jEdit whether the text
+ between the current caret position and the desired position
+ should be selected. Here, we call
+ <function>textArea.goToStartOfWhiteSpace(false)</function>
+ so that no text is selected, then call
+ <function>textArea.goToEndOfWhiteSpace(true)</function> so
+ that all of the text between the beginning and ending
+ whitespace is selected.</para>
+ </listitem>
+
+ <listitem>
+ <para>Retrieve the selected text by storing the return value
+ of <function>textArea.getSelectedText()</function> in a new
+ variable <function>text</function>.</para>
+
+ <para>If the line is empty,
+ <function>getSelectedText()</function> will return
+ <constant>null</constant>. In that case, we assign an empty
+ string to <varname>text</varname> to avoid calling methods
+ on a null object.</para>
+ </listitem>
+
+ <listitem>
+ <para>Change the selected text to <varname>prefix + text +
+ suffix</varname> by calling
+ <function>textArea.setSelectedText()</function>. If there is
+ no selected text (for example, if the line is empty), the
+ prefix and suffix will be inserted without any intervening
+ characters.</para>
+ </listitem>
+ </itemizedlist>
+
+ <sidebar>
+ <title>Compound edits</title>
+
+ <para>Note the <function>beginCompoundEdit()</function> and
+ <function>endCompoundEdit()</function> calls. These ensure that
+ all edits performed between the two calls can be undone in one
+ step. Normally, jEdit automatically wraps a macro call in these
+ methods; however if the macro shows a non-modal dialog box, as
+ far as jEdit is concerned the macro has finished executing by
+ the time the dialog is shown, since control returns to the event
+ dispatch thread.</para>
+
+ <para>If you do not understand this, don't worry; just keep it
+ in mind if your macro needs to show a non-modal dialog box for
+ some reason; Most macros won't.</para>
+ </sidebar>
+
+ <!-- <para>
+ The loop routine is bracketed by calls to
+ <function>buffer.beginCompoundEdit()</function> and
+ <function>buffer.endCompoundEdit()</function>. These methods
+ modify the way in which jEdit's undo facility performs. Text
+ operations done between calls to these functions will be
+ treated as a single operation for undo purposes. A single undo
+ command issued immediately after the macro completes will thus remove
+ the prefix and suffix text from all of the previously selected lines.
+ </para> -->
+ </section>
+
+ <section id="explain-main">
+ <title>The Main Routine</title>
+
+ <informalexample>
+ <programlisting>// this single line of code is the script's main routine
+prefixSuffixDialog();</programlisting>
+ </informalexample>
+
+ <para>The call to <function>prefixSuffixDialog()</function>is the
+ only line in the macro that is not inside an enclosing block.
+ BeanShell treats such code as a top-level <function>main</function>
+ method and begins execution with it.</para>
+
+ <para>Our analysis of <filename>Add_Prefix_and_Suffix.bsh</filename>
+ is now complete. In the next section, we look at other ways in which
+ a macro can obtain user input, as well as other macro writing
+ techniques.</para>
+ </section>
+ </section>
</chapter>
\ No newline at end of file
diff --git a/jEdit/doc/users-guide/files.xml b/jEdit/doc/users-guide/files.xml
index cdb3e31..2de0a35 100644
--- a/jEdit/doc/users-guide/files.xml
+++ b/jEdit/doc/users-guide/files.xml
@@ -1,693 +1,693 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter id="files">
- <title>Working With Files</title>
-
- <!-- jEdit buffer-local properties: -->
- <!-- :tabSize=1:indentSize=1:noTabs=true:wrap=soft:maxLineLen=80: -->
- <!-- :xml.root=users-guide.xml: -->
-
- <section id="creating">
- <title>Creating New Files</title>
-
- <para><guimenu>File</guimenu>><guimenuitem>New</guimenuitem>
- (shortcut: <keycap>C+n</keycap>) opens a new, empty, buffer. Another way
- to create a new file is to specify a non-existent file name when
- starting jEdit on the command line. A new file will be created on disk
- when the buffer is saved for the first time.</para>
- </section>
-
- <section id="opening">
- <title>Opening Files</title>
-
- <para><guimenu>File</guimenu>><guimenuitem>Open</guimenuitem>
- (shortcut: <keycap>C+o</keycap>) displays a file system browser dialog
- box and loads the specified file into a new buffer.</para>
-
- <para>Multiple files can be opened at once by holding down
- <keycap>Control</keycap> while clicking on them in the file system
- browser. The file system browser supports auto-completion; typing the
- first few characters of a listed file name will select the file.</para>
-
- <para>More advanced features of the file system browser are described in
- <xref linkend="vfs-browser" />.</para>
-
- <para>The <guimenu>File</guimenu>><guimenuitem>Recent
- Files</guimenuitem> menu lists recently viewed files. When a recent file
- is opened, the caret is automatically moved to its previous location in
- that file. The number of recent files to remember can be changed and
- caret position saving can be disabled in the
- <guibutton>General</guibutton> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box; see <xref
- linkend="general-pane" />.</para>
-
- <para>The <guimenu>Utilities</guimenu>><guimenuitem>Current
- Directory</guimenuitem> menu lists all files and directories in the
- current buffer's directory. Selecting a file opens it in a buffer for
- editing; selecting a directory opens it in the file system browser (see
- <xref linkend="vfs-browser" />).</para>
-
- <note>
- <para>Files that you do not have write access to are opened in
- read-only mode, where editing is not permitted.</para>
- </note>
-
- <tip>
- <para>jEdit supports transparent editing of GZipped files; if a file
- begins with the GZip <quote>magic number</quote>, it is
- automatically decompressed before loading and compressed when
- saving. To compress an existing file, you need to change a setting
- in the <guimenu>Utilities</guimenu>><guimenuitem>Buffer
- Options</guimenuitem> dialog box; see <xref linkend="buffer-opts" />
- for details.</para>
- </tip>
- </section>
-
- <section id="saving">
- <title>Saving Files</title>
-
- <para>Changed made in a buffer do not affect the file on disk until the
- buffer is <firstterm>saved</firstterm>.</para>
-
- <para><guimenu>File</guimenu>><guimenuitem>Save</guimenuitem>
- (shortcut: <keycap>C+s</keycap>) saves the current buffer to
- disk.</para>
-
- <para><guimenu>File</guimenu>><guimenuitem>Save As</guimenuitem>
- renames the buffer and saves it in a new location. Note that using this
- command to save over another open buffer will close the other buffer, to
- stop two buffers from being able to share the same path name.</para>
-
- <para><guimenu>File</guimenu>><guimenuitem>Save a Copy
- As</guimenuitem> saves the buffer to a different location but does not
- rename the buffer, and does not clear the
- <quote>modified</quote> flag. Note that using this command to save over
- another open buffer will automatically reload the other buffer.</para>
-
- <para><guimenu>File</guimenu>><guimenuitem>Save All</guimenuitem>
- (shortcut: <keycap>C+e C+s</keycap>) saves all open buffers to disk,
- asking for confirmation first. The confirmation dialog can be disabled
- in the <guilabel>General</guilabel> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box.</para>
-
- <section>
- <title>Two-Stage Save</title>
-
- <para>To prevent data loss in the unlikely case that jEdit should
- crash in the middle of saving a file, files are first saved to a
- temporary file named
- <filename>#<replaceable>filename</replaceable>#save#</filename>. If
- this operation is successful, the original file is replaced with the
- temporary file.</para>
-
- <para>However, in some situations, this behavior is undesirable. For
- example, on Unix this creates a new i-node so while jEdit retains
- file permissions, the owner and group of the file are reset, and if
- it is a hard link the link is broken. The <quote>two-stage
- save</quote> feature can be disabled in the
- <guibutton>General</guibutton> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box; see <xref
- linkend="general-pane" />.</para>
- </section>
-
- <section id="autosave">
- <title>Autosave and Crash Recovery</title>
-
- <para>The autosave feature protects your work from computer crashes
- and such. Every 30 seconds, all buffers with unsaved changes are
- written out to their respective file names, enclosed in hash
- (<quote>#</quote>) characters. For example,
- <filename>program.c</filename> will be autosaved to
- <filename>#program.c#</filename>.</para>
-
- <para>Saving a buffer using one of the commands in the previous
- section automatically deletes the autosave file, so they will only
- ever be visible in the unlikely event of a jEdit (or operating
- system) crash.</para>
-
- <para>If an autosave file is found while a buffer is being loaded,
- jEdit will offer to recover the autosaved data.</para>
-
- <para>The autosave interval can be changed in the
- <guibutton>Autosave and Backup</guibutton> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box; see <xref
- linkend="autosave-backups-pane" />.</para>
- </section>
-
- <section id="backups">
- <title>Backups</title>
-
- <para>The backup feature can be used to roll back to the previous
- version of a file after changes were made. When a buffer is saved
- for the first time after being opened, its original contents are
- <quote>backed up</quote> under a different file name.</para>
-
- <para>The behavior of the backup feature is specified in the
- <guibutton>Autosave and Backup</guibutton> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box; see <xref
- linkend="autosave-backups-pane" />.`</para>
-
- <para>The default behavior is to back up the original contents to
- the buffer's file name suffixed with a tilde (<quote>~</quote>). For
- example, a file named <filename>paper.tex</filename> is backed up to
- <filename>paper.tex~</filename>.</para>
-
- <itemizedlist>
- <listitem>
- <para>The <guilabel>Max number of backups</guilabel> setting
- determines the number of backups to save. Setting this to
- zero disables the backup feature. Settings this to more than
- one adds numbered suffixes to file names. By default only
- one backup is saved.</para>
- </listitem>
-
- <listitem>
- <para>If the <guilabel>Backup directory</guilabel> setting
- is non-empty, backups are saved in that location. Otherwise,
- they are saved in the same directory as the original file.
- The latter is the default behavior.</para>
- </listitem>
-
- <listitem>
- <para>The <guilabel>Backup filename prefix</guilabel>
- setting is the prefix that is added to the backed-up file
- name. This is empty by default.</para>
- </listitem>
-
- <listitem>
- <para>The <guilabel>Backup filename suffix</guilabel>
- setting is the suffix that is added to the backed-up file
- name. This is <quote>~</quote> by default.</para>
- </listitem>
-
- <listitem>
- <para>Backups can optionally be saved in a specified backup
- directory, instead of the directory of the original file.
- This can reduce clutter.</para>
- </listitem>
-
- <listitem>
- <para>The <guilabel>Backup on every save</guilabel> option
- is off by default, which results in a backup only being
- created the first time a buffer is saved in an editing
- session. If switched on, backups are created every time a
- buffer is saved.</para>
- </listitem>
- </itemizedlist>
- </section>
- </section>
-
- <section id="line-separators">
- <title>Line Separators</title>
-
- <para>Unix systems use newlines (<literal>\n</literal>) to mark line
- endings in text files. The MacOS uses carriage-returns
- (<literal>\r</literal>). Windows uses a carriage-return followed by a
- newline (<literal>\r\n</literal>). jEdit can read and write files in all
- three formats.</para>
-
- <para>The line separator used by the in-memory representation of file
- contents is always the newline character. When a file is being loaded,
- the line separator used in the file on disk is stored in a per-buffer
- property, and all line-endings are converted to newline characters for
- the in-memory representation. When the buffer is consequently saved, the
- value of the property replaces newline characters when the buffer is
- saved to disk.</para>
-
- <para>There are several ways to change a buffer's line separator:</para>
-
- <itemizedlist>
- <listitem>
- <para>In the <guimenu>Utilities</guimenu>><guimenuitem>Buffer
- Options</guimenuitem> dialog box. See <xref
- linkend="buffer-opts" />.</para>
- </listitem>
-
- <listitem>
- <para>By clicking the line separator indicator in the status
- bar. See <xref linkend="status-bar" />.</para>
- </listitem>
-
- <listitem>
- <para>From the keyboard, if a keyboard shortcut has been
- assigned to the <guimenuitem>Toggle Line Separator</guimenuitem>
- command in the <guibutton>Shortcuts</guibutton> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box. By default, this command does
- not have a keyboard shortcut.</para>
- </listitem>
- </itemizedlist>
-
- <para>By default, new files are saved with your operating system's
- native line separator. This can be changed in the
- <guibutton>General</guibutton> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box; see <xref linkend="general-pane" />.
- Note that changing this setting has no effect on existing files.</para>
- </section>
-
- <section id="encodings">
- <title>Character Encodings</title>
-
- <para>A character encoding is a mapping from a set of characters to
- their on-disk representation. jEdit can use any encoding supported by
- the Java platform.</para>
-
- <para>Buffers in memory are always stored in <literal>UTF-16</literal>
- encoding, which means each character is mapped to an integer between 0
- and 65535. <literal>UTF-16</literal> is the native encoding supported by
- Java, and has a large enough range of characters to support most modern
- languages.</para>
-
- <para>When a buffer is loaded, it is converted from its on-disk
- representation to <literal>UTF-16</literal> using a specified
- encoding.</para>
-
- <para>The default encoding, used to load files for which no other
- encoding is specified, can be set in the
- <guibutton>Encodings</guibutton> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box; see <xref linkend="encodings-pane" />.
- Unless you change this setting, it will be your operating system's
- native encoding, for example <literal>MacRoman</literal> on the MacOS,
- <literal>windows-1252</literal> on Windows, and
- <literal>ISO-8859-1</literal> on Unix.</para>
-
- <para>An encoding can be explicitly set when opening a file in the file
- system browser's
- <guimenu>Commands</guimenu>><guisubmenu>Encoding</guisubmenu>
- menu.</para>
-
- <para>Note that there is no general way to auto-detect the encoding used
- by a file, however in a few cases it is possible:</para>
-
- <itemizedlist>
- <listitem>
- <para><literal>UTF-16</literal> and <literal>UTF-8Y</literal>
- files are auto-detected, because they begin with a certain fixed
- character sequence. Note that plain UTF-8 does not mandate a
- specific header, and thus cannot be auto-detected, unless the
- file in question is an XML file.</para>
- </listitem>
-
- <listitem>
- <para>Encodings used in XML files with an XML PI like the
- following are auto-detected:</para>
-
- <programlisting><?xml version="1.0" encoding="UTF-8"></programlisting>
- </listitem>
- </itemizedlist>
-
- <para>The encoding that will be used to save the current buffer is shown
- in the status bar, and can be changed in the
- <guimenu>Utilities</guimenu>><guimenuitem>Buffer
- Options</guimenuitem> dialog box. Note that changing this setting has no
- effect on the buffer's contents; if you opened a file with the wrong
- encoding and got garbage, you will need to reload it.
- <guimenu>File</guimenu>><guimenuitem>Reload with
- Encoding</guimenuitem> is an easy way.</para>
-
- <para>If a file is opened without an explicit encoding specified and it
- appears in the recent file list, jEdit will use the encoding last used
- when working with that file; otherwise the default encoding will be
- used.</para>
-
- <section>
- <title>Commonly Used Encodings</title>
-
- <para>While the world is slowly converging on UTF-8 and UTF-16
- encodings for storing text, a wide range of older encodings are
- still in widespread use and Java supports most of them.</para>
-
- <para>The simplest character encoding still in use is ASCII, or
- <quote>American Standard Code for Information Interchange</quote>.
- ASCII encodes Latin letters used in English, in addition to numbers
- and a range of punctuation characters. Each ASCII character consists
- of 7 bits, there is a limit of 128 distinct characters, which makes
- it unsuitable for anything other than English text. jEdit will load
- and save files as ASCII if the <literal>US-ASCII</literal> encoding
- is used.</para>
-
- <para>Because ASCII is unsuitable for international use, most
- operating systems use an 8-bit extension of ASCII, with the first
- 128 values mapped to the ASCII characters, and the rest used to
- encode accents, umlauts, and various more esoteric used
- typographical marks. The three major operating systems all extend
- ASCII in a different way. Files written by Macintosh programs can be
- read using the <literal>MacRoman</literal> encoding; Windows text
- files are usually stored as <literal>windows-1252</literal>. In the
- Unix world, the <literal>8859_1</literal> character encoding has
- found widespread usage.</para>
-
- <para>On Windows, various other encodings, referred to as
- <firstterm>code pages</firstterm> and identified by number, are used
- to store non-English text. The corresponding Java encoding name is
- <literal>windows-</literal> followed by the code page number, for
- example <literal>windows-850</literal>.</para>
-
- <para>Many common cross-platform international character sets are
- also supported; <literal>KOI8_R</literal> for Russian text,
- <literal>Big5</literal> and <literal>GBK</literal> for Chinese, and
- <literal>SJIS</literal> for Japanese.</para>
- </section>
- </section>
-
- <section id="vfs-browser">
- <title>The File System Browser (FSB)</title>
-
- <para><guimenu>Utilities</guimenu>><guimenuitem>File System
- Browser</guimenuitem> displays the file system browser. By default, the
- file system browser is shown in a floating window. This window can be
- docked using the commands in its top-left corner popup menu; see <xref
- linkend="docking" />.</para>
-
- <para>The FSB can be customized in the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box; see <xref
- linkend="vfs-browser-pane" />.</para>
-
- <section>
- <title>Navigating the File System</title>
-
- <para>The directory to browse is specified in the
- <guibutton>Path</guibutton> text field. Clicking the mouse in the
- text field automatically selects its contents allowing a new path to
- be quickly typed in. If a relative path is entered, it will be
- resolved relative to the current path. This text field remembers
- previously entered strings; see <xref linkend="history" />. The same
- list of previously browsed directories is also listed in the
- <guimenu>Utilities</guimenu>><guisubmenu>Recent
- Directories</guisubmenu> menu; selecting one opens it in the file
- system browser.</para>
-
- <para>To browse a listed directory, double-click it (or if you have
- a three-button mouse, you can click the middle mouse button as
- well). Alternatively, click the disclosure widget next to a
- directory to list its contents in place. To browse higher up in the
- directory hierarchy, double-click one of the parent directories in
- the parent directory list.</para>
-
- <para>Files and directories in the file list are shown in different
- colors depending on what glob patterns their names match. The
- patterns and colors can be customized in the <guibutton>File System
- Browser</guibutton>><guibutton>Colors</guibutton> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box.</para>
-
- <para>The <guibutton>Path:</guibutton> Text Box can be used to
- navigate to a specific directory. Environment variables are expanded
- here, allowing for both <literal>$VARNAME</literal> or
- <literal>%VARNAME%</literal> syntax. </para>
-
- <para> <literal>A+Up</literal> is a keyboard shortcut that brings
- you to the parent directory. </para>
-
- <para> <literal>A+Left</literal> and <literal>A+Right</literal> navigate back and forward through the visited directory stacks, in a
- Netscape/Konqueror/IE like fashion. </para>
-
- <para>To see a specific set of files only (for example, those whose
- names end with <filename>.java</filename>), enter a glob pattern in
- the <guibutton>Filter</guibutton> text field. This text fields
- remembers previously entered strings. See <xref linkend="globs" />
- for information about glob patterns.</para>
-
- <para>Unopened files can be opened by double-clicking (or by
- clicking the middle mouse button). Open files have their names
- underlined, and can be selected by single-clicking. Holding down
- <keycap>Shift</keycap> while opening a file will open it in a new
- view.</para>
-
- <para>Clicking a file or directory with the right mouse button
- displays a popup menu containing various commands.
- <!-- Note that attempting to delete a directory containing files will give an error; only empty directories can be deleted. -->
- </para>
-
- <tip>
- <para>The file list sorting algorithm used in jEdit handles
- numbers in file names in an intelligent manner. For example, a
- file named <filename>section10.xml</filename> will be placed
- after a file named <filename>section5.xml</filename>. A
- conventional letter-by-letter sort would have placed these two
- files in the wrong order.</para>
- </tip>
-
-
- </section>
-
- <section>
- <title>The Tool Bar</title>
-
- <para>The file system browser has a tool bar containing a number of
- buttons. Each item in the <guibutton>Commands</guibutton> menu
- (described below) except <guimenuitem>Show Hidden
- Files</guimenuitem> and <guisubmenu>Encoding</guisubmenu> has a
- corresponding tool bar button.</para>
- </section>
-
- <section>
- <title>The Commands Menu</title>
-
- <para>Clicking the <guibutton>Commands</guibutton> button displays a
- menu containing the following items:</para>
-
- <itemizedlist>
- <listitem>
- <para><guimenuitem>Parent Directory</guimenuitem> - moves up
- in the directory hierarchy. The Alt+Left arrow keyboard shortcut achieves the same thing. </para>
- </listitem>
-
- <listitem>
- <para><guimenuitem>Reload Directory</guimenuitem> - reloads
- the file list from disk. F5 does this also. </para>
- </listitem>
-
- <listitem>
- <para><guimenuitem>Root Directory</guimenuitem> - on Unix,
- goes to the root directory (<filename>/</filename>). On
- Windows and MacOS X, lists all mounted drives and network
- shares. The forward slash (/) achieves this too. </para>
- </listitem>
-
- <listitem>
- <para><guimenuitem>Home Directory</guimenuitem> - displays
- your home directory. Keyboard shortcut: ~ </para>
- </listitem>
-
- <listitem>
- <para><guimenuitem>Directory of Current Buffer</guimenuitem>
- - displays the directory containing the currently active
- buffer. Shortcut: - </para>
- </listitem>
-
- <listitem>
- <para><guimenuitem>New File</guimenuitem> (Ctrl+N) - opens new, empty, buffer in the current directory. The file will not actually be created on disk until the buffer is
- saved.</para>
- </listitem>
-
- <listitem>
- <para><guimenuitem>New Directory</guimenuitem> - creates a
- new directory after prompting for the desired name.</para>
- </listitem>
-
- <listitem>
- <para><guimenuitem>Search in Directory</guimenuitem> -
- displays the search and replace dialog box set to search all
- files in the current directory. If a file is selected when
- this command is invoked, its extension becomes the file name
- filter for the search; otherwise, the file name filter
- entered in the browser is used. See <xref
- linkend="search-replace" /> for details.</para>
- </listitem>
-
- <listitem>
- <para><guimenuitem>Show Hidden Files</guimenuitem> - toggles
- if hidden files are to be shown in the file list.</para>
- </listitem>
-
- <listitem>
- <para><guisubmenu>Encoding</guisubmenu> - a menu for
- selecting the character encoding to use when opening files.
- See <xref linkend="encodings" />.</para>
- </listitem>
- </itemizedlist>
- </section>
-
- <section>
- <title>The Plugins Menu</title>
-
- <para>Clicking the <guibutton>Plugins</guibutton> button displays a
- menu containing plugin commands. For information about plugins, see
- <xref linkend="using-plugins" />.</para>
- </section>
-
- <section>
- <title>The Favorites Menu</title>
-
- <para>Clicking the <guibutton>Favorites</guibutton> button displays
- a menu showing all files and directories in the favorites list. The
- <guimenuitem>Add to Favorites</guimenuitem> item adds the currently
- selected file to the favorites list. If nothing is selected, the
- current directory is added. To remove a file from the favorites,
- invoke <guimenuitem>Edit Favorites</guimenuitem>, which will show
- the favorites list in the file system view, then select
- <guimenuitem>Delete</guimenuitem> from the right-click menu of the
- entry you want to remove.</para>
- </section>
-
- <section>
- <title>Keyboard Shortcuts</title>
-
- <para>Completion behaves differently in file dialogs than in the
- stand-alone file system browser window.</para>
-
- <para>In the file dialog, keyboard input goes in the file name field
- by default. Pressing <keycap>Enter</keycap> opens the file or
- directory path that is either fully or partially entered in the file
- name field. Typing the first few characters of a file's name selects
- that file. If the file name field is empty and nothing is selected,
- <keycap>/</keycap> lists the root directory on Unix and the list of
- drives on Windows. There are two handy abbreviations that may be
- used in file paths: <keycap>~</keycap> expands to the home
- directory, and <keycap>-</keycap> expands to the current buffer's
- directory.</para>
-
- <para>For example, to open a file
- <filename>/home/slava/jEdit/doc/TODO.txt</filename>, you might enter
- <filename>~/j/d/to</filename>.</para>
-
- <para>In the stand-alone file system browser, keyboard input is
- handled slightly differently. There is no file name field, instead
- shortcuts are active when the file tree has keyboard focus.
- Additionally, pressing <keycap>/</keycap>, <keycap>~</keycap> or
- <keycap>-</keycap> always immediately goes to the root, home and
- current buffer's directory, respectively.</para>
- </section>
- </section>
-
- <section id="reloading">
- <title>Reloading From Disk</title>
-
- <para>When a view is brought to the foreground, jEdit checks if any open
- buffers were modified on disk by another application. All affected
- buffers are listed in a dialog box. By default, buffers without unsaved
- changes are automatically reloaded. This feature can be disabled, or
- changed to prompt if files should be reloaded first, in the
- <guibutton>General</guibutton> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box; see <xref
- linkend="global-opts" />.</para>
-
- <para><guimenu>File</guimenu>><guimenuitem>Reload</guimenuitem> can
- be used to reload the current buffer from disk at any other time; a
- confirmation dialog box will be displayed first if the buffer has
- unsaved changes.</para>
-
- <para><guimenu>File</guimenu>><guimenuitem>Reload All</guimenuitem>
- discards unsaved changes in all open buffers and reload them from disk,
- asking for confirmation first.</para>
- </section>
-
- <section id="threaded-io">
- <title>Multi-Threaded I/O</title>
-
- <para>To improve responsiveness and perceived performance, jEdit
- executes all buffer input/output operations asynchronously. While I/O is
- in progress, the status bar displays the number of remaining I/O
- operations.</para>
-
- <para>The
- <guimenu>Utilities</guimenu>><guisubmenu>Troubleshooting</guisubmenu>><guimenuitem>I/O
- Progress Monitor</guimenuitem> command displays a window with more
- detailed status information and progress meters. By default, the
- <guimenuitem>I/O Progress Monitor</guimenuitem> is shown in a floating
- window. This window can be docked using the commands in its top-left
- corner popup menu; see <xref linkend="docking" />. I/O requests can also
- be aborted in this window, however note that aborting a buffer save can
- result in data loss.</para>
-
- <!-- <para>
- By default, four I/O threads are created, which means that up
- to four buffers can be loaded or saved simultaneously. The number of
- threads can be changed in the
- <guibutton>Loading and Saving</guibutton> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global Options</guimenuitem>
- dialog box; see <xref linkend="global-opts" />. Setting the number to zero
- disables multi-threaded I/O completely; doing this is not recommended.
- </para> -->
- </section>
-
- <section id="printing">
- <title>Printing</title>
-
- <para><guimenu>File</guimenu>><guimenuitem>Print</guimenuitem>
- (shortcut: <keycap>C+p</keycap>) prints the current buffer.</para>
-
- <para><guimenu>File</guimenu>><guimenuitem>Page Setup</guimenuitem>
- displays a dialog box for changing your operating system's print
- settings, such as margins, page size, print quality, and so on.</para>
-
- <para>The print output can be customized in the
- <guibutton>Printing</guibutton> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box; see <xref linkend="printing-pane" />.
- The following settings can be changed:</para>
-
- <itemizedlist>
- <listitem>
- <para>The font to use when printing.</para>
- </listitem>
-
- <listitem>
- <para>If a header with the file name should be printed on each
- page.</para>
- </listitem>
-
- <listitem>
- <para>If a footer with the page number and current date should
- be printed on each page.</para>
- </listitem>
-
- <listitem>
- <para>If line numbers should be printed.</para>
- </listitem>
-
- <listitem>
- <para>If the output should be color or black and white.</para>
- </listitem>
-
- <listitem>
- <para>The tab size to use when printing - this will usually be
- less than the text area tab size, to conserve space in the
- printed output.</para>
- </listitem>
-
- <listitem>
- <para>If folded regions should be printed.</para>
- </listitem>
- </itemizedlist>
- </section>
-
- <section id="closing-exiting">
- <title>Closing Files and Exiting jEdit</title>
-
- <para><guimenu>File</guimenu>><guimenuitem>Close</guimenuitem>
- (shortcut: <keycap>C+w</keycap>) closes the current buffer. If it has
- unsaved changes, jEdit will ask if they should be saved first.</para>
-
- <para><guimenu>File</guimenu>><guimenuitem>Close All</guimenuitem>
- (shortcut: <keycap>C+e C+w</keycap>) closes all buffers. If any buffers
- have unsaved changes, they will be listed in a dialog box where they can
- be saved or discarded. In the dialog box, multiple buffers to operate on
- at once can be selected by clicking on them in the list while holding
- down <keycap>Control</keycap>. After all buffers have been closed, a new
- untitled buffer is opened.</para>
-
- <para><guimenu>File</guimenu>><guimenuitem>Exit</guimenuitem>
- (shortcut: <keycap>C+q</keycap>) will completely exit jEdit, prompting
- if unsaved buffers should be saved first.</para>
- </section>
-</chapter>
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="files">
+ <title>Working With Files</title>
+
+ <!-- jEdit buffer-local properties: -->
+ <!-- :tabSize=1:indentSize=1:noTabs=true:wrap=soft:maxLineLen=80: -->
+ <!-- :xml.root=users-guide.xml: -->
+
+ <section id="creating">
+ <title>Creating New Files</title>
+
+ <para><guimenu>File</guimenu>><guimenuitem>New</guimenuitem>
+ (shortcut: <keycap>C+n</keycap>) opens a new, empty, buffer. Another way
+ to create a new file is to specify a non-existent file name when
+ starting jEdit on the command line. A new file will be created on disk
+ when the buffer is saved for the first time.</para>
+ </section>
+
+ <section id="opening">
+ <title>Opening Files</title>
+
+ <para><guimenu>File</guimenu>><guimenuitem>Open</guimenuitem>
+ (shortcut: <keycap>C+o</keycap>) displays a file system browser dialog
+ box and loads the specified file into a new buffer.</para>
+
+ <para>Multiple files can be opened at once by holding down
+ <keycap>Control</keycap> while clicking on them in the file system
+ browser. The file system browser supports auto-completion; typing the
+ first few characters of a listed file name will select the file.</para>
+
+ <para>More advanced features of the file system browser are described in
+ <xref linkend="vfs-browser" />.</para>
+
+ <para>The <guimenu>File</guimenu>><guimenuitem>Recent
+ Files</guimenuitem> menu lists recently viewed files. When a recent file
+ is opened, the caret is automatically moved to its previous location in
+ that file. The number of recent files to remember can be changed and
+ caret position saving can be disabled in the
+ <guibutton>General</guibutton> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box; see <xref
+ linkend="general-pane" />.</para>
+
+ <para>The <guimenu>Utilities</guimenu>><guimenuitem>Current
+ Directory</guimenuitem> menu lists all files and directories in the
+ current buffer's directory. Selecting a file opens it in a buffer for
+ editing; selecting a directory opens it in the file system browser (see
+ <xref linkend="vfs-browser" />).</para>
+
+ <note>
+ <para>Files that you do not have write access to are opened in
+ read-only mode, where editing is not permitted.</para>
+ </note>
+
+ <tip>
+ <para>jEdit supports transparent editing of GZipped files; if a file
+ begins with the GZip <quote>magic number</quote>, it is
+ automatically decompressed before loading and compressed when
+ saving. To compress an existing file, you need to change a setting
+ in the <guimenu>Utilities</guimenu>><guimenuitem>Buffer
+ Options</guimenuitem> dialog box; see <xref linkend="buffer-opts" />
+ for details.</para>
+ </tip>
+ </section>
+
+ <section id="saving">
+ <title>Saving Files</title>
+
+ <para>Changed made in a buffer do not affect the file on disk until the
+ buffer is <firstterm>saved</firstterm>.</para>
+
+ <para><guimenu>File</guimenu>><guimenuitem>Save</guimenuitem>
+ (shortcut: <keycap>C+s</keycap>) saves the current buffer to
+ disk.</para>
+
+ <para><guimenu>File</guimenu>><guimenuitem>Save As</guimenuitem>
+ renames the buffer and saves it in a new location. Note that using this
+ command to save over another open buffer will close the other buffer, to
+ stop two buffers from being able to share the same path name.</para>
+
+ <para><guimenu>File</guimenu>><guimenuitem>Save a Copy
+ As</guimenuitem> saves the buffer to a different location but does not
+ rename the buffer, and does not clear the
+ <quote>modified</quote> flag. Note that using this command to save over
+ another open buffer will automatically reload the other buffer.</para>
+
+ <para><guimenu>File</guimenu>><guimenuitem>Save All</guimenuitem>
+ (shortcut: <keycap>C+e C+s</keycap>) saves all open buffers to disk,
+ asking for confirmation first. The confirmation dialog can be disabled
+ in the <guilabel>General</guilabel> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box.</para>
+
+ <section>
+ <title>Two-Stage Save</title>
+
+ <para>To prevent data loss in the unlikely case that jEdit should
+ crash in the middle of saving a file, files are first saved to a
+ temporary file named
+ <filename>#<replaceable>filename</replaceable>#save#</filename>. If
+ this operation is successful, the original file is replaced with the
+ temporary file.</para>
+
+ <para>However, in some situations, this behavior is undesirable. For
+ example, on Unix this creates a new i-node so while jEdit retains
+ file permissions, the owner and group of the file are reset, and if
+ it is a hard link the link is broken. The <quote>two-stage
+ save</quote> feature can be disabled in the
+ <guibutton>General</guibutton> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box; see <xref
+ linkend="general-pane" />.</para>
+ </section>
+
+ <section id="autosave">
+ <title>Autosave and Crash Recovery</title>
+
+ <para>The autosave feature protects your work from computer crashes
+ and such. Every 30 seconds, all buffers with unsaved changes are
+ written out to their respective file names, enclosed in hash
+ (<quote>#</quote>) characters. For example,
+ <filename>program.c</filename> will be autosaved to
+ <filename>#program.c#</filename>.</para>
+
+ <para>Saving a buffer using one of the commands in the previous
+ section automatically deletes the autosave file, so they will only
+ ever be visible in the unlikely event of a jEdit (or operating
+ system) crash.</para>
+
+ <para>If an autosave file is found while a buffer is being loaded,
+ jEdit will offer to recover the autosaved data.</para>
+
+ <para>The autosave interval can be changed in the
+ <guibutton>Autosave and Backup</guibutton> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box; see <xref
+ linkend="autosave-backups-pane" />.</para>
+ </section>
+
+ <section id="backups">
+ <title>Backups</title>
+
+ <para>The backup feature can be used to roll back to the previous
+ version of a file after changes were made. When a buffer is saved
+ for the first time after being opened, its original contents are
+ <quote>backed up</quote> under a different file name.</para>
+
+ <para>The behavior of the backup feature is specified in the
+ <guibutton>Autosave and Backup</guibutton> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box; see <xref
+ linkend="autosave-backups-pane" />.`</para>
+
+ <para>The default behavior is to back up the original contents to
+ the buffer's file name suffixed with a tilde (<quote>~</quote>). For
+ example, a file named <filename>paper.tex</filename> is backed up to
+ <filename>paper.tex~</filename>.</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>The <guilabel>Max number of backups</guilabel> setting
+ determines the number of backups to save. Setting this to
+ zero disables the backup feature. Settings this to more than
+ one adds numbered suffixes to file names. By default only
+ one backup is saved.</para>
+ </listitem>
+
+ <listitem>
+ <para>If the <guilabel>Backup directory</guilabel> setting
+ is non-empty, backups are saved in that location. Otherwise,
+ they are saved in the same directory as the original file.
+ The latter is the default behavior.</para>
+ </listitem>
+
+ <listitem>
+ <para>The <guilabel>Backup filename prefix</guilabel>
+ setting is the prefix that is added to the backed-up file
+ name. This is empty by default.</para>
+ </listitem>
+
+ <listitem>
+ <para>The <guilabel>Backup filename suffix</guilabel>
+ setting is the suffix that is added to the backed-up file
+ name. This is <quote>~</quote> by default.</para>
+ </listitem>
+
+ <listitem>
+ <para>Backups can optionally be saved in a specified backup
+ directory, instead of the directory of the original file.
+ This can reduce clutter.</para>
+ </listitem>
+
+ <listitem>
+ <para>The <guilabel>Backup on every save</guilabel> option
+ is off by default, which results in a backup only being
+ created the first time a buffer is saved in an editing
+ session. If switched on, backups are created every time a
+ buffer is saved.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+ </section>
+
+ <section id="line-separators">
+ <title>Line Separators</title>
+
+ <para>Unix systems use newlines (<literal>\n</literal>) to mark line
+ endings in text files. The MacOS uses carriage-returns
+ (<literal>\r</literal>). Windows uses a carriage-return followed by a
+ newline (<literal>\r\n</literal>). jEdit can read and write files in all
+ three formats.</para>
+
+ <para>The line separator used by the in-memory representation of file
+ contents is always the newline character. When a file is being loaded,
+ the line separator used in the file on disk is stored in a per-buffer
+ property, and all line-endings are converted to newline characters for
+ the in-memory representation. When the buffer is consequently saved, the
+ value of the property replaces newline characters when the buffer is
+ saved to disk.</para>
+
+ <para>There are several ways to change a buffer's line separator:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>In the <guimenu>Utilities</guimenu>><guimenuitem>Buffer
+ Options</guimenuitem> dialog box. See <xref
+ linkend="buffer-opts" />.</para>
+ </listitem>
+
+ <listitem>
+ <para>By clicking the line separator indicator in the status
+ bar. See <xref linkend="status-bar" />.</para>
+ </listitem>
+
+ <listitem>
+ <para>From the keyboard, if a keyboard shortcut has been
+ assigned to the <guimenuitem>Toggle Line Separator</guimenuitem>
+ command in the <guibutton>Shortcuts</guibutton> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box. By default, this command does
+ not have a keyboard shortcut.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>By default, new files are saved with your operating system's
+ native line separator. This can be changed in the
+ <guibutton>General</guibutton> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box; see <xref linkend="general-pane" />.
+ Note that changing this setting has no effect on existing files.</para>
+ </section>
+
+ <section id="encodings">
+ <title>Character Encodings</title>
+
+ <para>A character encoding is a mapping from a set of characters to
+ their on-disk representation. jEdit can use any encoding supported by
+ the Java platform.</para>
+
+ <para>Buffers in memory are always stored in <literal>UTF-16</literal>
+ encoding, which means each character is mapped to an integer between 0
+ and 65535. <literal>UTF-16</literal> is the native encoding supported by
+ Java, and has a large enough range of characters to support most modern
+ languages.</para>
+
+ <para>When a buffer is loaded, it is converted from its on-disk
+ representation to <literal>UTF-16</literal> using a specified
+ encoding.</para>
+
+ <para>The default encoding, used to load files for which no other
+ encoding is specified, can be set in the
+ <guibutton>Encodings</guibutton> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box; see <xref linkend="encodings-pane" />.
+ Unless you change this setting, it will be your operating system's
+ native encoding, for example <literal>MacRoman</literal> on the MacOS,
+ <literal>windows-1252</literal> on Windows, and
+ <literal>ISO-8859-1</literal> on Unix.</para>
+
+ <para>An encoding can be explicitly set when opening a file in the file
+ system browser's
+ <guimenu>Commands</guimenu>><guisubmenu>Encoding</guisubmenu>
+ menu.</para>
+
+ <para>Note that there is no general way to auto-detect the encoding used
+ by a file, however in a few cases it is possible:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><literal>UTF-16</literal> and <literal>UTF-8Y</literal>
+ files are auto-detected, because they begin with a certain fixed
+ character sequence. Note that plain UTF-8 does not mandate a
+ specific header, and thus cannot be auto-detected, unless the
+ file in question is an XML file.</para>
+ </listitem>
+
+ <listitem>
+ <para>Encodings used in XML files with an XML PI like the
+ following are auto-detected:</para>
+
+ <programlisting><?xml version="1.0" encoding="UTF-8"></programlisting>
+ </listitem>
+ </itemizedlist>
+
+ <para>The encoding that will be used to save the current buffer is shown
+ in the status bar, and can be changed in the
+ <guimenu>Utilities</guimenu>><guimenuitem>Buffer
+ Options</guimenuitem> dialog box. Note that changing this setting has no
+ effect on the buffer's contents; if you opened a file with the wrong
+ encoding and got garbage, you will need to reload it.
+ <guimenu>File</guimenu>><guimenuitem>Reload with
+ Encoding</guimenuitem> is an easy way.</para>
+
+ <para>If a file is opened without an explicit encoding specified and it
+ appears in the recent file list, jEdit will use the encoding last used
+ when working with that file; otherwise the default encoding will be
+ used.</para>
+
+ <section>
+ <title>Commonly Used Encodings</title>
+
+ <para>While the world is slowly converging on UTF-8 and UTF-16
+ encodings for storing text, a wide range of older encodings are
+ still in widespread use and Java supports most of them.</para>
+
+ <para>The simplest character encoding still in use is ASCII, or
+ <quote>American Standard Code for Information Interchange</quote>.
+ ASCII encodes Latin letters used in English, in addition to numbers
+ and a range of punctuation characters. Each ASCII character consists
+ of 7 bits, there is a limit of 128 distinct characters, which makes
+ it unsuitable for anything other than English text. jEdit will load
+ and save files as ASCII if the <literal>US-ASCII</literal> encoding
+ is used.</para>
+
+ <para>Because ASCII is unsuitable for international use, most
+ operating systems use an 8-bit extension of ASCII, with the first
+ 128 values mapped to the ASCII characters, and the rest used to
+ encode accents, umlauts, and various more esoteric used
+ typographical marks. The three major operating systems all extend
+ ASCII in a different way. Files written by Macintosh programs can be
+ read using the <literal>MacRoman</literal> encoding; Windows text
+ files are usually stored as <literal>windows-1252</literal>. In the
+ Unix world, the <literal>8859_1</literal> character encoding has
+ found widespread usage.</para>
+
+ <para>On Windows, various other encodings, referred to as
+ <firstterm>code pages</firstterm> and identified by number, are used
+ to store non-English text. The corresponding Java encoding name is
+ <literal>windows-</literal> followed by the code page number, for
+ example <literal>windows-850</literal>.</para>
+
+ <para>Many common cross-platform international character sets are
+ also supported; <literal>KOI8_R</literal> for Russian text,
+ <literal>Big5</literal> and <literal>GBK</literal> for Chinese, and
+ <literal>SJIS</literal> for Japanese.</para>
+ </section>
+ </section>
+
+ <section id="vfs-browser">
+ <title>The File System Browser (FSB)</title>
+
+ <para><guimenu>Utilities</guimenu>><guimenuitem>File System
+ Browser</guimenuitem> displays the file system browser. By default, the
+ file system browser is shown in a floating window. This window can be
+ docked using the commands in its top-left corner popup menu; see <xref
+ linkend="docking" />.</para>
+
+ <para>The FSB can be customized in the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box; see <xref
+ linkend="vfs-browser-pane" />.</para>
+
+ <section>
+ <title>Navigating the File System</title>
+
+ <para>The directory to browse is specified in the
+ <guibutton>Path</guibutton> text field. Clicking the mouse in the
+ text field automatically selects its contents allowing a new path to
+ be quickly typed in. If a relative path is entered, it will be
+ resolved relative to the current path. This text field remembers
+ previously entered strings; see <xref linkend="history" />. The same
+ list of previously browsed directories is also listed in the
+ <guimenu>Utilities</guimenu>><guisubmenu>Recent
+ Directories</guisubmenu> menu; selecting one opens it in the file
+ system browser.</para>
+
+ <para>To browse a listed directory, double-click it (or if you have
+ a three-button mouse, you can click the middle mouse button as
+ well). Alternatively, click the disclosure widget next to a
+ directory to list its contents in place. To browse higher up in the
+ directory hierarchy, double-click one of the parent directories in
+ the parent directory list.</para>
+
+ <para>Files and directories in the file list are shown in different
+ colors depending on what glob patterns their names match. The
+ patterns and colors can be customized in the <guibutton>File System
+ Browser</guibutton>><guibutton>Colors</guibutton> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box.</para>
+
+ <para>The <guibutton>Path:</guibutton> Text Box can be used to
+ navigate to a specific directory. Environment variables are expanded
+ here, allowing for both <literal>$VARNAME</literal> or
+ <literal>%VARNAME%</literal> syntax. </para>
+
+ <para> <literal>A+Up</literal> is a keyboard shortcut that brings
+ you to the parent directory. </para>
+
+ <para> <literal>A+Left</literal> and <literal>A+Right</literal> navigate back and forward through the visited directory stacks, in a
+ Netscape/Konqueror/IE like fashion. </para>
+
+ <para>To see a specific set of files only (for example, those whose
+ names end with <filename>.java</filename>), enter a glob pattern in
+ the <guibutton>Filter</guibutton> text field. This text fields
+ remembers previously entered strings. See <xref linkend="globs" />
+ for information about glob patterns.</para>
+
+ <para>Unopened files can be opened by double-clicking (or by
+ clicking the middle mouse button). Open files have their names
+ underlined, and can be selected by single-clicking. Holding down
+ <keycap>Shift</keycap> while opening a file will open it in a new
+ view.</para>
+
+ <para>Clicking a file or directory with the right mouse button
+ displays a popup menu containing various commands.
+ <!-- Note that attempting to delete a directory containing files will give an error; only empty directories can be deleted. -->
+ </para>
+
+ <tip>
+ <para>The file list sorting algorithm used in jEdit handles
+ numbers in file names in an intelligent manner. For example, a
+ file named <filename>section10.xml</filename> will be placed
+ after a file named <filename>section5.xml</filename>. A
+ conventional letter-by-letter sort would have placed these two
+ files in the wrong order.</para>
+ </tip>
+
+
+ </section>
+
+ <section>
+ <title>The Tool Bar</title>
+
+ <para>The file system browser has a tool bar containing a number of
+ buttons. Each item in the <guibutton>Commands</guibutton> menu
+ (described below) except <guimenuitem>Show Hidden
+ Files</guimenuitem> and <guisubmenu>Encoding</guisubmenu> has a
+ corresponding tool bar button.</para>
+ </section>
+
+ <section>
+ <title>The Commands Menu</title>
+
+ <para>Clicking the <guibutton>Commands</guibutton> button displays a
+ menu containing the following items:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><guimenuitem>Parent Directory</guimenuitem> - moves up
+ in the directory hierarchy. The Alt+Left arrow keyboard shortcut achieves the same thing. </para>
+ </listitem>
+
+ <listitem>
+ <para><guimenuitem>Reload Directory</guimenuitem> - reloads
+ the file list from disk. F5 does this also. </para>
+ </listitem>
+
+ <listitem>
+ <para><guimenuitem>Root Directory</guimenuitem> - on Unix,
+ goes to the root directory (<filename>/</filename>). On
+ Windows and MacOS X, lists all mounted drives and network
+ shares. The forward slash (/) achieves this too. </para>
+ </listitem>
+
+ <listitem>
+ <para><guimenuitem>Home Directory</guimenuitem> - displays
+ your home directory. Keyboard shortcut: ~ </para>
+ </listitem>
+
+ <listitem>
+ <para><guimenuitem>Directory of Current Buffer</guimenuitem>
+ - displays the directory containing the currently active
+ buffer. Shortcut: - </para>
+ </listitem>
+
+ <listitem>
+ <para><guimenuitem>New File</guimenuitem> (Ctrl+N) - opens new, empty, buffer in the current directory. The file will not actually be created on disk until the buffer is
+ saved.</para>
+ </listitem>
+
+ <listitem>
+ <para><guimenuitem>New Directory</guimenuitem> - creates a
+ new directory after prompting for the desired name.</para>
+ </listitem>
+
+ <listitem>
+ <para><guimenuitem>Search in Directory</guimenuitem> -
+ displays the search and replace dialog box set to search all
+ files in the current directory. If a file is selected when
+ this command is invoked, its extension becomes the file name
+ filter for the search; otherwise, the file name filter
+ entered in the browser is used. See <xref
+ linkend="search-replace" /> for details.</para>
+ </listitem>
+
+ <listitem>
+ <para><guimenuitem>Show Hidden Files</guimenuitem> - toggles
+ if hidden files are to be shown in the file list.</para>
+ </listitem>
+
+ <listitem>
+ <para><guisubmenu>Encoding</guisubmenu> - a menu for
+ selecting the character encoding to use when opening files.
+ See <xref linkend="encodings" />.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section>
+ <title>The Plugins Menu</title>
+
+ <para>Clicking the <guibutton>Plugins</guibutton> button displays a
+ menu containing plugin commands. For information about plugins, see
+ <xref linkend="using-plugins" />.</para>
+ </section>
+
+ <section>
+ <title>The Favorites Menu</title>
+
+ <para>Clicking the <guibutton>Favorites</guibutton> button displays
+ a menu showing all files and directories in the favorites list. The
+ <guimenuitem>Add to Favorites</guimenuitem> item adds the currently
+ selected file to the favorites list. If nothing is selected, the
+ current directory is added. To remove a file from the favorites,
+ invoke <guimenuitem>Edit Favorites</guimenuitem>, which will show
+ the favorites list in the file system view, then select
+ <guimenuitem>Delete</guimenuitem> from the right-click menu of the
+ entry you want to remove.</para>
+ </section>
+
+ <section>
+ <title>Keyboard Shortcuts</title>
+
+ <para>Completion behaves differently in file dialogs than in the
+ stand-alone file system browser window.</para>
+
+ <para>In the file dialog, keyboard input goes in the file name field
+ by default. Pressing <keycap>Enter</keycap> opens the file or
+ directory path that is either fully or partially entered in the file
+ name field. Typing the first few characters of a file's name selects
+ that file. If the file name field is empty and nothing is selected,
+ <keycap>/</keycap> lists the root directory on Unix and the list of
+ drives on Windows. There are two handy abbreviations that may be
+ used in file paths: <keycap>~</keycap> expands to the home
+ directory, and <keycap>-</keycap> expands to the current buffer's
+ directory.</para>
+
+ <para>For example, to open a file
+ <filename>/home/slava/jEdit/doc/TODO.txt</filename>, you might enter
+ <filename>~/j/d/to</filename>.</para>
+
+ <para>In the stand-alone file system browser, keyboard input is
+ handled slightly differently. There is no file name field, instead
+ shortcuts are active when the file tree has keyboard focus.
+ Additionally, pressing <keycap>/</keycap>, <keycap>~</keycap> or
+ <keycap>-</keycap> always immediately goes to the root, home and
+ current buffer's directory, respectively.</para>
+ </section>
+ </section>
+
+ <section id="reloading">
+ <title>Reloading From Disk</title>
+
+ <para>When a view is brought to the foreground, jEdit checks if any open
+ buffers were modified on disk by another application. All affected
+ buffers are listed in a dialog box. By default, buffers without unsaved
+ changes are automatically reloaded. This feature can be disabled, or
+ changed to prompt if files should be reloaded first, in the
+ <guibutton>General</guibutton> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box; see <xref
+ linkend="global-opts" />.</para>
+
+ <para><guimenu>File</guimenu>><guimenuitem>Reload</guimenuitem> can
+ be used to reload the current buffer from disk at any other time; a
+ confirmation dialog box will be displayed first if the buffer has
+ unsaved changes.</para>
+
+ <para><guimenu>File</guimenu>><guimenuitem>Reload All</guimenuitem>
+ discards unsaved changes in all open buffers and reload them from disk,
+ asking for confirmation first.</para>
+ </section>
+
+ <section id="threaded-io">
+ <title>Multi-Threaded I/O</title>
+
+ <para>To improve responsiveness and perceived performance, jEdit
+ executes all buffer input/output operations asynchronously. While I/O is
+ in progress, the status bar displays the number of remaining I/O
+ operations.</para>
+
+ <para>The
+ <guimenu>Utilities</guimenu>><guisubmenu>Troubleshooting</guisubmenu>><guimenuitem>I/O
+ Progress Monitor</guimenuitem> command displays a window with more
+ detailed status information and progress meters. By default, the
+ <guimenuitem>I/O Progress Monitor</guimenuitem> is shown in a floating
+ window. This window can be docked using the commands in its top-left
+ corner popup menu; see <xref linkend="docking" />. I/O requests can also
+ be aborted in this window, however note that aborting a buffer save can
+ result in data loss.</para>
+
+ <!-- <para>
+ By default, four I/O threads are created, which means that up
+ to four buffers can be loaded or saved simultaneously. The number of
+ threads can be changed in the
+ <guibutton>Loading and Saving</guibutton> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global Options</guimenuitem>
+ dialog box; see <xref linkend="global-opts" />. Setting the number to zero
+ disables multi-threaded I/O completely; doing this is not recommended.
+ </para> -->
+ </section>
+
+ <section id="printing">
+ <title>Printing</title>
+
+ <para><guimenu>File</guimenu>><guimenuitem>Print</guimenuitem>
+ (shortcut: <keycap>C+p</keycap>) prints the current buffer.</para>
+
+ <para><guimenu>File</guimenu>><guimenuitem>Page Setup</guimenuitem>
+ displays a dialog box for changing your operating system's print
+ settings, such as margins, page size, print quality, and so on.</para>
+
+ <para>The print output can be customized in the
+ <guibutton>Printing</guibutton> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box; see <xref linkend="printing-pane" />.
+ The following settings can be changed:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>The font to use when printing.</para>
+ </listitem>
+
+ <listitem>
+ <para>If a header with the file name should be printed on each
+ page.</para>
+ </listitem>
+
+ <listitem>
+ <para>If a footer with the page number and current date should
+ be printed on each page.</para>
+ </listitem>
+
+ <listitem>
+ <para>If line numbers should be printed.</para>
+ </listitem>
+
+ <listitem>
+ <para>If the output should be color or black and white.</para>
+ </listitem>
+
+ <listitem>
+ <para>The tab size to use when printing - this will usually be
+ less than the text area tab size, to conserve space in the
+ printed output.</para>
+ </listitem>
+
+ <listitem>
+ <para>If folded regions should be printed.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section id="closing-exiting">
+ <title>Closing Files and Exiting jEdit</title>
+
+ <para><guimenu>File</guimenu>><guimenuitem>Close</guimenuitem>
+ (shortcut: <keycap>C+w</keycap>) closes the current buffer. If it has
+ unsaved changes, jEdit will ask if they should be saved first.</para>
+
+ <para><guimenu>File</guimenu>><guimenuitem>Close All</guimenuitem>
+ (shortcut: <keycap>C+e C+w</keycap>) closes all buffers. If any buffers
+ have unsaved changes, they will be listed in a dialog box where they can
+ be saved or discarded. In the dialog box, multiple buffers to operate on
+ at once can be selected by clicking on them in the list while holding
+ down <keycap>Control</keycap>. After all buffers have been closed, a new
+ untitled buffer is opened.</para>
+
+ <para><guimenu>File</guimenu>><guimenuitem>Exit</guimenuitem>
+ (shortcut: <keycap>C+q</keycap>) will completely exit jEdit, prompting
+ if unsaved buffers should be saved first.</para>
+ </section>
+</chapter>
diff --git a/jEdit/doc/users-guide/globs.xml b/jEdit/doc/users-guide/globs.xml
index 4540ec6..eb3d33e 100644
--- a/jEdit/doc/users-guide/globs.xml
+++ b/jEdit/doc/users-guide/globs.xml
@@ -1,137 +1,137 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<appendix id="globs">
- <title>Glob Patterns</title>
-
- <!-- jEdit buffer-local properties: -->
-
- <!-- :indentSize=1:noTabs=true: -->
-
- <!-- :xml.root=users-guide.xml: -->
-
- <para>jEdit uses glob patterns similar to those in the various Unix shells
- to implement file name filters in the file system browser. Glob patterns
- resemble regular expressions somewhat, but have a much simpler syntax. The
- following character sequences have special meaning within a glob
- pattern:</para>
-
- <itemizedlist>
- <listitem>
- <para><literal>?</literal> matches any one character</para>
- </listitem>
-
- <listitem>
- <para><literal>*</literal> matches any number of characters</para>
- </listitem>
-
- <listitem>
- <para><literal>{!<replaceable>glob</replaceable>}</literal> Matches
- anything that does <emphasis>not</emphasis> match
- <replaceable>glob</replaceable></para>
- </listitem>
-
- <listitem>
- <para><literal>{<replaceable>a</replaceable>,<replaceable>b</replaceable>,<replaceable>c</replaceable>}</literal>
- matches any one of <replaceable>a</replaceable>,
- <replaceable>b</replaceable> or <replaceable>c</replaceable></para>
- </listitem>
-
- <listitem>
- <para><literal>[<replaceable>abc</replaceable>]</literal> matches
- any character in the set <replaceable>a</replaceable>,
- <replaceable>b</replaceable> or <replaceable>c</replaceable></para>
- </listitem>
-
- <listitem>
- <para><literal>[^<replaceable>abc</replaceable>]</literal> matches
- any character not in the set <replaceable>a</replaceable>,
- <replaceable>b</replaceable> or <replaceable>c</replaceable></para>
- </listitem>
-
- <listitem>
- <para><literal>[<replaceable>a-z</replaceable>]</literal> matches
- any character in the range <replaceable>a</replaceable> to
- <replaceable>z</replaceable>, inclusive. A leading or trailing dash
- will be interpreted literally</para>
- </listitem>
- </itemizedlist>
-
- <para>Since we use <literal>java.util.regex</literal> patterns to implement
- globs, this means that in addition to the above, a number of
- <quote>character class metacharacters</quote> may be used. Keep in mind,
- their usefulness is limited since the regex quantifier metacharacters
- (asterisk, questionmark, and curly brackets) are redefined to mean something
- else in filename glob language, and the regex quantifiers are not available
- in glob language.</para>
-
- <itemizedlist>
- <listitem>
- <para><literal>\w</literal> matches any alphanumeric character or
- underscore</para>
- </listitem>
-
- <listitem>
- <para><literal>\s</literal> matches a space or horizontal tab</para>
- </listitem>
-
- <listitem>
- <para><literal>\S</literal> matches a printable
- non-whitespace.</para>
- </listitem>
-
- <listitem>
- <para><literal>\d</literal> matches a decimal digit</para>
- </listitem>
- </itemizedlist>
-
- <para>Here are some examples of glob patterns:</para>
-
- <itemizedlist>
- <listitem>
- <para><userinput>*</userinput> - all files.</para>
- </listitem>
-
- <listitem>
- <para><userinput>*.java</userinput> - all files whose names end with
- <quote>.java</quote>.</para>
- </listitem>
-
- <listitem>
- <para><userinput>*.[ch]</userinput> - all files whose names end with
- either <quote>.c</quote> or <quote>.h</quote>.</para>
- </listitem>
-
- <listitem>
- <para><userinput>*.{c,cpp,h,hpp,cxx,hxx}</userinput> - all C or C++
- files.</para>
- </listitem>
-
- <listitem>
- <para><userinput>[^#]*</userinput> - all files whose names do not
- start with <quote>#</quote>.</para>
- </listitem>
- </itemizedlist>
-
- <bridgehead>Using regexes instead of globs</bridgehead>
-
- <para>Sometimes it is desirable to use a regular expression instead of a
- glob for specifying file sets. This is because regular expressions are more
- powerful than globs and can provide the user with more specific filename
- matching criteria. To avoid the glob-to-regex transformation, prefix your
- pattern with the string <literal>(re)</literal>, which will tell jEdit to
- not translate the following pattern into a regex (since it already is one).
- For example:</para>
-
- <glosslist>
- <glossentry>
- <glossterm><literal> (re).*\.(h|c(c|pp)?) </literal></glossterm>
-
- <glossdef>
- <para>Matches *.c, *.cpp, *.h, *.cc</para>
- </glossdef>
- </glossentry>
- </glosslist>
-
- <para>If you need to match files that begin with the glob-translate-disable
- prefix <literal>(re)</literal>, you can escape it with a leading backslash
- and the metacharacters will be translated into globs as before.</para>
+<?xml version="1.0" encoding="UTF-8"?>
+<appendix id="globs">
+ <title>Glob Patterns</title>
+
+ <!-- jEdit buffer-local properties: -->
+
+ <!-- :indentSize=1:noTabs=true: -->
+
+ <!-- :xml.root=users-guide.xml: -->
+
+ <para>jEdit uses glob patterns similar to those in the various Unix shells
+ to implement file name filters in the file system browser. Glob patterns
+ resemble regular expressions somewhat, but have a much simpler syntax. The
+ following character sequences have special meaning within a glob
+ pattern:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><literal>?</literal> matches any one character</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>*</literal> matches any number of characters</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>{!<replaceable>glob</replaceable>}</literal> Matches
+ anything that does <emphasis>not</emphasis> match
+ <replaceable>glob</replaceable></para>
+ </listitem>
+
+ <listitem>
+ <para><literal>{<replaceable>a</replaceable>,<replaceable>b</replaceable>,<replaceable>c</replaceable>}</literal>
+ matches any one of <replaceable>a</replaceable>,
+ <replaceable>b</replaceable> or <replaceable>c</replaceable></para>
+ </listitem>
+
+ <listitem>
+ <para><literal>[<replaceable>abc</replaceable>]</literal> matches
+ any character in the set <replaceable>a</replaceable>,
+ <replaceable>b</replaceable> or <replaceable>c</replaceable></para>
+ </listitem>
+
+ <listitem>
+ <para><literal>[^<replaceable>abc</replaceable>]</literal> matches
+ any character not in the set <replaceable>a</replaceable>,
+ <replaceable>b</replaceable> or <replaceable>c</replaceable></para>
+ </listitem>
+
+ <listitem>
+ <para><literal>[<replaceable>a-z</replaceable>]</literal> matches
+ any character in the range <replaceable>a</replaceable> to
+ <replaceable>z</replaceable>, inclusive. A leading or trailing dash
+ will be interpreted literally</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>Since we use <literal>java.util.regex</literal> patterns to implement
+ globs, this means that in addition to the above, a number of
+ <quote>character class metacharacters</quote> may be used. Keep in mind,
+ their usefulness is limited since the regex quantifier metacharacters
+ (asterisk, questionmark, and curly brackets) are redefined to mean something
+ else in filename glob language, and the regex quantifiers are not available
+ in glob language.</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><literal>\w</literal> matches any alphanumeric character or
+ underscore</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>\s</literal> matches a space or horizontal tab</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>\S</literal> matches a printable
+ non-whitespace.</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>\d</literal> matches a decimal digit</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>Here are some examples of glob patterns:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><userinput>*</userinput> - all files.</para>
+ </listitem>
+
+ <listitem>
+ <para><userinput>*.java</userinput> - all files whose names end with
+ <quote>.java</quote>.</para>
+ </listitem>
+
+ <listitem>
+ <para><userinput>*.[ch]</userinput> - all files whose names end with
+ either <quote>.c</quote> or <quote>.h</quote>.</para>
+ </listitem>
+
+ <listitem>
+ <para><userinput>*.{c,cpp,h,hpp,cxx,hxx}</userinput> - all C or C++
+ files.</para>
+ </listitem>
+
+ <listitem>
+ <para><userinput>[^#]*</userinput> - all files whose names do not
+ start with <quote>#</quote>.</para>
+ </listitem>
+ </itemizedlist>
+
+ <bridgehead>Using regexes instead of globs</bridgehead>
+
+ <para>Sometimes it is desirable to use a regular expression instead of a
+ glob for specifying file sets. This is because regular expressions are more
+ powerful than globs and can provide the user with more specific filename
+ matching criteria. To avoid the glob-to-regex transformation, prefix your
+ pattern with the string <literal>(re)</literal>, which will tell jEdit to
+ not translate the following pattern into a regex (since it already is one).
+ For example:</para>
+
+ <glosslist>
+ <glossentry>
+ <glossterm><literal> (re).*\.(h|c(c|pp)?) </literal></glossterm>
+
+ <glossdef>
+ <para>Matches *.c, *.cpp, *.h, *.cc</para>
+ </glossdef>
+ </glossentry>
+ </glosslist>
+
+ <para>If you need to match files that begin with the glob-translate-disable
+ prefix <literal>(re)</literal>, you can escape it with a leading backslash
+ and the metacharacters will be translated into globs as before.</para>
</appendix>
\ No newline at end of file
diff --git a/jEdit/doc/users-guide/history.xml b/jEdit/doc/users-guide/history.xml
index c54f757..a5252ea 100644
--- a/jEdit/doc/users-guide/history.xml
+++ b/jEdit/doc/users-guide/history.xml
@@ -1,48 +1,48 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<appendix id="history">
- <title>History Text Fields</title>
-
- <!-- jEdit buffer-local properties: -->
-
- <!-- :indentSize=1:noTabs=true: -->
-
- <!-- :xml.root=users-guide.xml: -->
-
- <para>The text fields in many jEdit components, such as the file system
- browser, incremental search bar, and action bar, all remember the last 20
- entered strings by default. The number of strings to remember can be changed
- in the <guibutton>Appearance</guibutton> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global Options</guimenuitem>
- dialog box; see <xref linkend="appearance-pane" />.</para>
-
- <para>Pressing <keycap>UP</keycap> recalls previous strings. Pressing
- <keycap>DOWN</keycap> after recalling previous strings recalls later
- strings.</para>
-
- <para>Pressing <keycap>S+UP</keycap> or <keycap>S+DOWN</keycap> will search
- backwards or forwards, respectively, for strings beginning with the text
- already entered in the text field.</para>
-
- <para>Clicking the triangle to the right of the text field, or clicking with
- the right-mouse button anywhere else will display a pop-up menu of all
- previously entered strings; selecting one will input it into the text field.
- Selecting the first item, "previously entered strings:" pops up
- a dialog that lets you change previously entered strings.
- Holding down <keycap>Shift</keycap> while clicking will display a menu of
- all previously entered strings that begin with the text already
- entered.</para>
-
- <note>
- <title>Search and Replace fields</title>
-
- <para>In jEdit 4.3, the search/replace history fields are multi-line
- textareas, so they no longer use the same single-line history textfield
- described above. The multiline history textarea behaves a little
- differently: <keycap>UP</keycap> and <keycap>DOWN</keycap> arrows go up
- and down a line in the textarea, instead of through the previously
- entered strings. <keycap>PageUp</keycap> and <keycap>PageDown</keycap>
- are used instead to select history strings, and there is no arrow combo
- button, although right-click will still show you the history as a
- context menu.</para>
- </note>
+<?xml version="1.0" encoding="UTF-8"?>
+<appendix id="history">
+ <title>History Text Fields</title>
+
+ <!-- jEdit buffer-local properties: -->
+
+ <!-- :indentSize=1:noTabs=true: -->
+
+ <!-- :xml.root=users-guide.xml: -->
+
+ <para>The text fields in many jEdit components, such as the file system
+ browser, incremental search bar, and action bar, all remember the last 20
+ entered strings by default. The number of strings to remember can be changed
+ in the <guibutton>Appearance</guibutton> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global Options</guimenuitem>
+ dialog box; see <xref linkend="appearance-pane" />.</para>
+
+ <para>Pressing <keycap>UP</keycap> recalls previous strings. Pressing
+ <keycap>DOWN</keycap> after recalling previous strings recalls later
+ strings.</para>
+
+ <para>Pressing <keycap>S+UP</keycap> or <keycap>S+DOWN</keycap> will search
+ backwards or forwards, respectively, for strings beginning with the text
+ already entered in the text field.</para>
+
+ <para>Clicking the triangle to the right of the text field, or clicking with
+ the right-mouse button anywhere else will display a pop-up menu of all
+ previously entered strings; selecting one will input it into the text field.
+ Selecting the first item, "previously entered strings:" pops up
+ a dialog that lets you change previously entered strings.
+ Holding down <keycap>Shift</keycap> while clicking will display a menu of
+ all previously entered strings that begin with the text already
+ entered.</para>
+
+ <note>
+ <title>Search and Replace fields</title>
+
+ <para>In jEdit 4.3, the search/replace history fields are multi-line
+ textareas, so they no longer use the same single-line history textfield
+ described above. The multiline history textarea behaves a little
+ differently: <keycap>UP</keycap> and <keycap>DOWN</keycap> arrows go up
+ and down a line in the textarea, instead of through the previously
+ entered strings. <keycap>PageUp</keycap> and <keycap>PageDown</keycap>
+ are used instead to select history strings, and there is no arrow combo
+ button, although right-click will still show you the history as a
+ context menu.</para>
+ </note>
</appendix>
\ No newline at end of file
diff --git a/jEdit/doc/users-guide/installing-modes.xml b/jEdit/doc/users-guide/installing-modes.xml
index 4384833..28e4ab6 100644
--- a/jEdit/doc/users-guide/installing-modes.xml
+++ b/jEdit/doc/users-guide/installing-modes.xml
@@ -1,74 +1,73 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter id="installing-modes">
- <title>Installing Edit Modes</title>
-
- <!-- jEdit buffer-local properties: -->
-
- <!-- :indentSize=1:noTabs=true: -->
-
- <!-- :xml.root=users-guide.xml: -->
-
- <para>jEdit looks for edit modes in two locations; the
- <filename>modes</filename> subdirectory of the jEdit settings directory, and
- the <filename>modes</filename> subdirectory of the jEdit install directory.
- The location of the settings directory is system-specific; see <xref
- linkend="settings-directory" />.</para>
-
- <para>Each mode directory contains a <filename>catalog</filename> file. All
- edit modes contained in that directory must be listed in the catalog,
- otherwise they will not be available to jEdit.</para>
-
- <para>Catalogs, like modes themselves, are written in XML. They consist of a
- single <literal>MODES</literal> tag, with a number of
- <literal>MODE</literal> tags inside. Each mode tag associates a mode name
- with an XML file, and specifies the file name and first line pattern for the
- mode. A sample mode catalog looks as follows:</para>
-
- <programlisting><?xml version="1.0"?>
-<!DOCTYPE CATALOG SYSTEM "catalog.dtd">
-
-<MODES>
- <MODE NAME="shellscript" FILE="shellscript.xml"
- FILE_NAME_GLOB="*.sh"
- FIRST_LINE_GLOB="#!/*sh*" />
-</MODES></programlisting>
-
- <para>In the above example, a mode named <quote>shellscript</quote> is
- defined, and is used for files whose names end with
- <filename>.sh</filename>, or whose first line starts with <quote>#!/</quote>
- and contains <quote>sh</quote>.</para>
-
- <para>The <literal>MODE</literal> tag supports the following
- attributes:</para>
-
- <itemizedlist>
- <listitem>
- <para><literal>NAME</literal> - the name of the edit mode, as it
- will appear in the <guimenuitem>Buffer Options</guimenuitem> dialog
- box, the status bar, and so on.</para>
- </listitem>
-
- <listitem>
- <para><literal>FILE</literal> - the name of the XML file containing
- the mode definition.</para>
- </listitem>
-
- <listitem>
- <para><literal>FILE_NAME_GLOB</literal> - files whose names match
- this glob pattern will be opened in this edit mode.</para>
- </listitem>
-
- <listitem>
- <para><literal>FIRST_LINE_GLOB</literal> - files whose first line
- matches this glob pattern will be opened in this edit mode.</para>
- </listitem>
- </itemizedlist>
-
- <para>Glob pattern syntax is described in <xref linkend="globs" />.</para>
-
- <tip>
- <para>If an edit mode in the user-specific catalog has the same name as
- an edit mode in the system catalog, the version in the user-specific
- catalog will override the system default.</para>
- </tip>
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="installing-modes">
+ <title>Installing Edit Modes</title>
+
+ <!-- jEdit buffer-local properties: -->
+
+ <!-- :indentSize=1:noTabs=true: -->
+
+ <!-- :xml.root=users-guide.xml: -->
+ <para>jEdit looks for edit modes in two locations; the
+ <filename>modes</filename> subdirectory of the jEdit settings directory, and
+ the <filename>modes</filename> subdirectory of the jEdit install directory.
+ The location of the settings directory is system-specific; see <xref
+ linkend="settings-directory" />.</para>
+
+ <para>Each mode directory contains a <filename>catalog</filename> file. All
+ edit modes contained in that directory must be listed in the catalog,
+ otherwise they will not be available to jEdit.</para>
+
+ <para>Catalogs, like modes themselves, are written in XML. They consist of a
+ single <literal>MODES</literal> tag, with a number of
+ <literal>MODE</literal> tags inside. Each mode tag associates a mode name
+ with an XML file, and specifies the file name and first line pattern for the
+ mode. A sample mode catalog looks as follows:</para>
+
+ <programlisting><?xml version="1.0"?>
+<!DOCTYPE CATALOG SYSTEM "catalog.dtd">
+
+<MODES>
+ <MODE NAME="shellscript" FILE="shellscript.xml"
+ FILE_NAME_GLOB="*.sh"
+ FIRST_LINE_GLOB="#!/*sh*" />
+</MODES></programlisting>
+
+ <para>In the above example, a mode named <quote>shellscript</quote> is
+ defined, and is used for files whose names end with
+ <filename>.sh</filename>, or whose first line starts with <quote>#!/</quote>
+ and contains <quote>sh</quote>.</para>
+
+ <para>The <literal>MODE</literal> tag supports the following
+ attributes:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><literal>NAME</literal> - the name of the edit mode, as it
+ will appear in the <guimenuitem>Buffer Options</guimenuitem> dialog
+ box, the status bar, and so on.</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>FILE</literal> - the name of the XML file containing
+ the mode definition.</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>FILE_NAME_GLOB</literal> - files whose names match
+ this glob pattern will be opened in this edit mode.</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>FIRST_LINE_GLOB</literal> - files whose first line
+ matches this glob pattern will be opened in this edit mode.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>Glob pattern syntax is described in <xref linkend="globs" />.</para>
+
+ <tip>
+ <para>If an edit mode in the user-specific catalog has the same name as
+ an edit mode in the system catalog, the version in the user-specific
+ catalog will override the system default.</para>
+ </tip>
</chapter>
\ No newline at end of file
diff --git a/jEdit/doc/users-guide/launcher-guide.xml b/jEdit/doc/users-guide/launcher-guide.xml
index b280564..1e78cb7 100644
--- a/jEdit/doc/users-guide/launcher-guide.xml
+++ b/jEdit/doc/users-guide/launcher-guide.xml
@@ -1,537 +1,537 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- :xml.root=users-guide.xml: -->
-<appendix id="launcher-guide">
- <title>jEditLauncher for Windows</title>
- <!-- jEdit buffer-local properties: -->
- <!-- :tabSize=2:indentSize=1:noTabs=true:maxLineLen=72: -->
- <!-- jEditLauncher 4.0 (R2) Quick Guide -->
- <!-- Copyright (C) 2001, 2002 John Gellene -->
- <!-- $Id: launcher-guide.xml 16181 2009-09-08 19:26:57Z ezust $
--->
- <section id="launcher-intro">
- <title>Introduction</title>
-
- <para>The jEditLauncher package is a set of lightweight components for
- running jEdit under the Windows group of operating systems. The package
- is designed to run on Windows 95, Windows 98, Windows Me, Windows NT
- (versions 4.0 and greater), Windows 2000 and Windows XP.</para>
-
- <para>While jEdit does not make available a component-type interface, it
- does contains an <quote>EditServer</quote> that listens on a socket for
- requests to load scripts written in the BeanShell scripting language.
- When the server activates, it writes the server port number and a
- pseudo-random, numeric authorization key to a text file. By default, the
- file is named <filename>server</filename> and is located in the settings
- directory (see <xref linkend="settings-directory" />).</para>
-
- <para>The jEditLauncher component locates and reads this file, opens a
- socket and attempts to connect to the indicated port. If successful, it
- transmits the appropriate BeanShell script to the server. If
- unsuccessful, it attempts to start jEdit and repeats the socket
- transmission once it can obtain the port and key information. The
- component will abandon the effort to connect roughly twenty seconds
- after it launches the application.</para>
- </section>
-
- <section id="launcher-starting">
- <title>Starting jEdit</title>
-
- <para>The main component of the jEditLauncher package is a client
- application entitled <command>jedit.exe</command>. It may be executed
- either from either Windows Explorer, a shortcut icon or the command
- line. It uses the jEditLauncher COM component to open files in jEdit
- that are listed as command line parameters. It supports Windows and UNC
- file specifications as well as wild cards. If called without parameters,
- it will launch jEdit. If jEdit is already running<!-- and has an active
- EditServer -->, it will simply open a new, empty buffer.</para>
-
- <para><command>jedit.exe</command> supports five command-line options.
- Except for the <userinput>/1</userinput> option, if any of these options
- are invoked correctly, the application will not load files or execute
- jEdit.</para>
-
- <itemizedlist>
- <listitem>
- <para>The option <userinput>/h</userinput> causes a window to be
- displayed with a brief description of the application and its
- various options.</para>
- </listitem>
-
- <listitem>
- <para>The option <userinput>/p</userinput> will activate a
- dialog window displaying the command-line parameters to be used
- when calling jEdit. This option can also be triggered by
- selecting <guilabel>Set jEdit Parameters</guilabel> from the
- <guilabel>jEdit</guilabel> section of the Windows Programs menu,
- or by running the utility program
- <command>jedinit.exe</command></para>
-
- <para>Using the dialog, you can change parameters specifying the
- executable for the Java application loader (either
- <filename>java.exe</filename> or
- <filename>javaw.exe</filename>), the location of the jEdit
- archive file, <filename>jedit.jar</filename>, and command line
- options for both. <itemizedlist>
- <listitem>
- <para>The input fields for Java options and jEdit
- options are separate. If you insert an option in the
- wrong place it will not be properly executed.</para>
- </listitem>
-
- <listitem>
- <para>If the <userinput>-jar</userinput> option is
- not used with the Java application loader the
- principal jEdit class of
- <classname>org.gjt.sp.jedit.jEdit</classname> is set
- as fixed data.</para>
- </listitem>
-
- <listitem>
- <para>The working directory for the Java
- interpreter's process can also be specified.</para>
- </listitem>
- </itemizedlist> A read-only window at the bottom of the
- dialog displays the full command line that jEditLauncher will
- invoke.</para>
-
- <para>Before committing changes to the command line parameters,
- <command>jedit.exe</command> validates the paths for the Java
- and jEdit targets as well as the working directory. It will
- complain if the paths are invalid. It will not validate command
- line options, but it will warn you if it finds the
- <userinput>-noserver</userinput> option used for jEdit, since
- this will deactivate the edit server and make it impossible for
- jEditLauncher to open files.</para>
-
- <para>Note that due to the design of
- <application>jEditLauncher</application>, platform-independent
- command line options handled by jEdit itself (such as
- <userinput>-background</userinput> and
- <userinput>-norestore</userinput>) must be entered in the
- <quote>Set jEdit Parameters</quote> dialog box, and cannot be
- specified on the <command>jedit.exe</command> command line
- directly. For information about platform-independent command
- line options, see <xref linkend="cli-usage" />.</para>
- </listitem>
-
- <listitem>
- <para>The option <userinput>/1</userinput> is intended for use
- in circumstances where a single file name is passed to jEdit for
- opening, and quotation marks cannot be used to delimit file
- names containing whitespace. The launcher reads the entire
- command line following the <userinput>/1</userinput> options as
- a single file path, regardless of the presence of whitespace,
- and passes the resulting string as a single file name parameter
- to jEdit.</para>
-
- <para>This option allows jEdit to be used with version 5 or
- greater of Internet Explorer as an alternate text editor or as
- the target of the <guimenuitem>View Source</guimenuitem>
- command. Included with the jEditLauncher distribution is a file
- named <filename>jEdit_IE.reg.txt</filename> containing an
- example of a Window registry file that you can use to register
- jEdit as a HTML editor with Internet Explorer. Instructions for
- the file's use are included in the text.</para>
-
- <para>The use of the <userinput>/1</userinput> option with
- multiple file names or other parameters will lead to program
- errors or unpredictable results.</para>
- </listitem>
-
- <listitem>
- <para>The option <userinput>/i</userinput> is not mentioned in
- the help window for <filename>jedit.exe</filename>. It is
- intended primarily to be used in conjunction with jEdit's Java
- installer, but it can also be used to install or reinstall
- jEditLauncher manually. When accompanied by a second parameter
- specifying the directory where your preferred Java interpreter
- is located, jEditLauncher will install itself and set a
- reasonable initial set of command line parameters for executing
- jEdit. You can change these parameters later by running
- <filename>jedinit.exe</filename> or
- <filename>jedit.exe</filename> with the<userinput>/p</userinput>
- option.</para>
- </listitem>
-
- <listitem>
- <para>The option <userinput>/u</userinput> will cause
- jEditLauncher to be uninstalled by removing its registry
- entries. This option does not delete any jEditLauncher or jEdit
- files.</para>
- </listitem>
- </itemizedlist>
- </section>
-
- <section id="launcher-menu">
- <title>The Context Menu Handler</title>
-
- <para>The jEditLauncher package also implements a context menu handler
- for the Windows shell. It is intended to be be installed as a handler
- available for any file. When you right-click on a file or shortcut icon,
- the context menu that appears will include an item displaying the jEdit
- icon and captioned <guilabel>Open with jEdit</guilabel>. If the file has
- an extension, another item will appear captioned <guilabel>Open *.XXX
- with jEdit</guilabel>, where XXX is the extension of the selected file.
- Clicking this item will cause jEdit to load all files with the same
- extension in the same directory as the selected file. Multiple file
- selections are also supported; in this circumstance only the
- <guilabel>Open with jEdit</guilabel> item appears.</para>
-
- <para>If a single file with a <filename>.bsh</filename> extension is
- selected, the menu will also contain an item captioned <guilabel>Run
- script in jEdit</guilabel>. Selecting this item will cause jEditLauncher
- to run the selected file as a BeanShell script.</para>
-
- <para>If exactly two files are selected, the menu will contain an entry
- for <guilabel>Show diff in jEdit</guilabel>. Selecting this item will
- load the two files in jEdit and have them displayed side-by-side with
- their differences highlighted by the <application>JDiff</application>
- plugin. The file selected first will be treated as the base for
- comparison purposes. If the plugin is not installed, an error message
- will be displayed in jEdit. See <xref linkend="using-plugins" /> for
- more information about installing plugins.</para>
- </section>
-
- <!-- open section -->
-
- <section id="launcher-jedidiff">
- <title>Using jEdit and jEditLauncher as a Diff Utility</title>
-
- <para>As noted above, you can create a graphical diff display comparing
- the contents of two text files by selecting the two files in an Explorer
- window, right-clicking to produce a context menu, and selecting the
- <guimenuitem>Show diff in jEdit</guimenuitem> menu item. The utility
- <filename>jedidiff.exe</filename> allows you to perform this operation
- from a command line. The command takes the two files to be compared as
- parameters; they should be delimited by quotation marks if their paths
- contain whitespace.</para>
- </section>
-
- <section id="launcher-uninstall">
- <title>Uninstalling jEdit and jEditLauncher</title>
-
- <para></para>
-
- <para>There are three ways to uninstall jEdit and jEditLauncher.</para>
-
- <itemizedlist>
- <listitem>
- <para>First, you can run <filename>unlaunch.exe</filename> in
- the jEdit installation directory.</para>
- </listitem>
-
- <listitem>
- <para>Second, you can choose <guilabel>Uninstall
- jEdit</guilabel> from the <guilabel>jEdit</guilabel> section of
- the Programs menu. <!-- This will
- uninstall the <quote>primary</quote> version of jEdit (and will
- designate a new primary version if any versions remain). --></para>
- </listitem>
-
- <listitem>
- <para>Third, you can choose the uninstall option for jEdit in
- the Control Panel's Add/Remove Programs applet. <!-- This allows you to specify
- unambiguously the version of jEdit that you wish to remove. --></para>
- </listitem>
- </itemizedlist>
-
- <para>Each of these options will deactivate jEditLauncher and delete all
- files in jEdit's installation directory. As a safeguard, jEditLauncher
- displays a warning window and requires the user to confirm an uninstall
- operation. Because the user's settings directory can be set and changed
- from one jEdit session to another, user settings files must be deleted
- manually.</para>
-
- <para>To deactivate jEditLauncher without deleting any files, run
- <filename>jedit /u</filename> from any command prompt where the jEdit
- installation directory is in the search path. This will remove the
- entries for jEditLauncher from the Windows registry. It will also
- disable the context menu handler and the automatic launching and
- scripting capabilities. The package can reactivated by executing
- <command>jedit.exe</command> again, and jEdit can be started in the same
- manner as any other Java application on your system.</para>
- </section>
-
- <section id="launcher-interface">
- <title>The jEditLauncher Interface</title>
-
- <para>The core of the jEditLauncher package is a COM component that can
- communicate with the EditServer, or open jEdit if it is not running or
- is otherwise refusing a connection. The component supports both Windows
- and UNC file specifications, including wild cards. It will resolve
- shortcut links to identify and transmit the name of the underlying
- file.</para>
-
- <para>Because it is implemented with a <quote>dual interface</quote>,
- the functions of jEditLauncher are available to scripting languages in
- the Windows environment such as VBScript, JScript, Perl (using the
- Win32::OLE package) and Python (using the win32com.client
- package).</para>
-
- <para>The scriptable interface consists of two read-only properties and
- six functions:</para>
-
- <para><emphasis>Properties</emphasis></para>
-
- <itemizedlist>
- <listitem>
- <para><varname>ServerPort</varname> - a read-only property that
- returns the port number found in jEdit's server file; the value
- is not tested for authenticity. It returns zero if the server
- information file cannot be located.</para>
- </listitem>
-
- <listitem>
- <para><varname>ServerKey</varname> - a read-only property that
- returns the numeric authorization key found in jEdit's server
- file; the value is not tested for authenticity. It returns zero
- if the server information file cannot be located.</para>
- </listitem>
- </itemizedlist>
-
- <para><emphasis>Functions</emphasis></para>
-
- <itemizedlist>
- <listitem>
- <para><function>OpenFile</function> - a method that takes a
- single file name (with or without wild card characters) as a
- parameter.</para>
- </listitem>
-
- <listitem>
- <para><function>OpenFiles</function> - this method takes an
- array of file names (with or without wild card characters) as a
- parameter. The form of the array is that which is used for
- arrays in the scripting environment. In JScript, for example the
- data type of the <classname>VARIANT</classname> holding the
- array is <classname>VT_DISPATCH</classname>; in VBScript, it is
- <classname>VT_ARRAY | VT_VARIANT</classname>, with array members
- having data type <classname>VT_BSTR</classname>.</para>
- </listitem>
-
- <listitem>
- <para><function>Launch</function> - this method with no
- parameters attempts to open jEdit without loading additional
- files.</para>
- </listitem>
-
- <listitem>
- <para><function>RunScript</function> - this method takes a file
- name or full file path as a parameter and runs the referenced
- file as a BeanShell script in jEdit. The predefined variables
- <varname>view</varname>, <varname>editPane</varname>,
- <varname>textArea</varname> and <varname>buffer</varname> are
- available to the script. If more than one view is open, the
- variable are initialized with reference to the earliest opened
- view. If no path is given for the file it will use the working
- directory of the calling process.</para>
- </listitem>
-
- <listitem>
- <para><function>EvalScript</function> - this method takes a
- string as a parameter containing one or more BeanShell
- statements and runs the script in jEdit's BeanShell interpreter.
- The predefined variables are available on the same basis as in
- <function>RunScript</function>.</para>
- </listitem>
-
- <listitem>
- <para><function>RunDiff</function> - this method takes two
- strings representing file names as parameters. If the
- <application>JDiff</application> plugin is installed, this
- method will activate the JDiff plugin and display the two files
- in the plugin's graphical <quote>dual diff</quote> format. The
- first parameter is treated as the base for display purposes. If
- the <application>JDiff</application> plugin is not installed, a
- error message box will be displayed in jEdit.</para>
- </listitem>
- </itemizedlist>
- </section>
-
- <section id="launcher-examples">
- <title>Scripting Examples</title>
-
- <para>Here are some brief examples of scripts using jEditLauncher. The
- first two will run under Windows Script Host, which is either installed
- or available for download for 32-bit Windows operating systems. The next
- example is written in Perl and requires the Win32::OLE package. The last
- is written in Python and requires the win32gui and win32com.client
- extensions.</para>
-
- <para>If Windows Script Host is installed, you can run the first two
- scripts by typing the name of the file containing the script at a
- command prompt. In jEdit's <application>Console</application> plugin,
- you can type <userinput>cmd /c
- <replaceable>script_path</replaceable></userinput> or <userinput>wscript
- <replaceable>script_path</replaceable></userinput>.</para>
-
- <informalexample>
- <programlisting>' Example VBScript using jEditLauncher interface
-dim launcher
-set launcher = CreateObject("JEdit.JEditLauncher")
-a = Array("I:\Source Code Files\shellext\jeditshell\*.h", _
- "I:\Source Code Files\shellext\jeditshell\*.cpp")
-MsgBox "The server authorization code is " + _
- FormatNumber(launcher.ServerKey, 0, 0, 0, 0) + ".", _
- vbOKOnly + vbInformation, "jEditLauncher"
-launcher.openFiles(a)
-myScript = "jEdit.newFile(view); textArea.setSelectedText(" _
- & CHR(34) _
- & "Welcome to jEditLauncher." _
- & CHR(34) & ");"
-launcher.evalScript(myScript)</programlisting>
- </informalexample>
-
- <informalexample>
- <programlisting>/* Example JScript using jEditLauncher interface
- * Note: in contrast to VBScript, JScript does not
- * directly support message boxes outside a browser window
- */
-var launcher = WScript.createObject("JEdit.JEditLauncher");
-var a = new Array("I:\\weather.html", "I:\\test.txt");
-b = "I:\\*.pl";
-launcher.openFiles(a);
-launcher.openFile(b);
-c = "G:\\Program Files\\jEdit\\macros\\Misc"
- + "\\Properties\\System_properties.bsh";
-launcher.runScript(c);</programlisting>
- </informalexample>
-
- <informalexample>
- <programlisting># Example Perl script using jEditLauncher interface
-use Win32::OLE;
-$launcher = Win32::OLE->new('JEdit.JEditLauncher') ||
- die "JEditLauncher: not found !\n";
- at files = ();
-foreach $entry (@ARGV) {
- @new = glob($entry);
- push(@files, at new);
-}
-$launcher->openFiles(\@files);
-my($script) = "Macros.message(view, \"I found "
- .(scalar @files)." files.\");";
-$launcher->evalScript($script);</programlisting>
- </informalexample>
-
- <informalexample>
- <programlisting># Example Python script using jEditLauncher interface
-import win32gui
-import win32com.client
-o = win32com.client.Dispatch("JEdit.JEditLauncher")
-port = o.ServerPort
-if port == 0:
- port = "inactive. We will now launch jEdit"
-win32gui.MessageBox(0, "The server port is %s." % port,
- "jEditLauncher", 0)
-path = "C:\\WINNT\\Profiles\\Administrator\\Desktop\\"
-o.RunDiff(path + "Search.bsh", path + "Search2.bsh")
-</programlisting>
- </informalexample>
- </section>
-
- <!-- open section -->
-
- <section id="launcher-logging">
- <title>jEditLauncher Logging</title>
-
- <para>The jEditLauncher package has a logging facility that is separate
- from jEdit's Activity Log to provide a record of events occurring
- outside the Java virtual machine environment in which jEdit operates.
- The logging facility maintains two log files:
- <filename>jelaunch.log</filename> for events relating to starting jEdit,
- loading files and running scripts, and <filename>install.log</filename>
- for jEditLauncher installation activity. Both files are maintained in
- the directory in which jEdit is installed. They are cumulative from
- session to session, but may be manually deleted at any time without
- affecting program execution.</para>
- </section>
-
- <!-- <section id="launcher-install"><title>Standalone Installation</title>
- <para>
- Installation of jEditLauncher occurs as part of the installation of the
- jEdit package for Windows. If a full jEdit installation fails, you can
- install jEditLauncher by placing the following files in the same
- directory as <filename>jedit.jar</filename>, the archive containing the
- Java application:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <filename>jedit.exe</filename>
- </para>
- </listitem>
- <listitem>
- <para>
- <filename>jedinit.exe</filename>
- </para>
- </listitem>
- <listitem>
- <para>
- <filename>jeshlstb.dll</filename>
- </para>
- </listitem>
- <listitem>
- <para>
- <filename>jedinstl.dll</filename>
- </para>
- </listitem>
- <listitem>
- <para>
- <filename>jeditsvr.exe</filename>
- </para>
- </listitem>
- <listitem>
- <para>
- <filename>jeservps.dll</filename>
- </para>
- </listitem>
- <listitem>
- <para>
- <filename>unlaunch.exe</filename>
- </para>
- </listitem>
- </itemizedlist>
- <para>
- Anytime <filename>jedit.exe</filename> is executed (either directly or
- indirectly through a call to <filename>jedinit.exe</filename>),
- jEditLauncher checks to see if it is properly installed. If it is not,
- it will offer to install itself. If you agree, you will then be asked to
- supply the path to a Java interpreter. The directory you choose should
- contain <filename>javaw.exe</filename>, which the installer uses as a
- default; you can change the interpreter later with a call to
- <filename>jedinit.exe</filename>.
- </para>
-</section> -->
-
- <section id="launcher-legalnotice">
- <title>Legal Notice</title>
-
- <para>All source code and software distributed as the jEditLauncher
- package in which the author holds the copyright is made available under
- the GNU General Public License (<quote>GPL</quote>). A copy of the GPL
- is included in the file <filename>COPYING.txt</filename> included with
- jEdit.</para>
-
- <para>Notwithstanding the terms of the General Public License, the
- author grants permission to compile and link object code generated by
- the compilation of this program with object code and libraries that are
- not subject to the GNU General Public License, provided that the
- executable output of such compilation shall be distributed with source
- code on substantially the same basis as the jEditLauncher package of
- which this source code and software is a part. By way of example, a
- distribution would satisfy this condition if it included a working
- Makefile for any freely available make utility that runs on the Windows
- family of operating systems. This condition does not require a licensee
- of this software to distribute any proprietary software (including
- header files and libraries) that is licensed under terms prohibiting or
- limiting redistribution to third parties.</para>
-
- <para>The purpose of this specific permission is to allow a user to link
- files contained or generated by the source code with library and other
- files licensed to the user by Microsoft or other parties, whether or not
- that license conforms to the requirements of the GPL. This permission
- should not be construed to expand the terms of any license for any
- source code or other materials used in the creation of
- jEditLauncher.</para>
- </section>
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- :xml.root=users-guide.xml: -->
+<appendix id="launcher-guide">
+ <title>jEditLauncher for Windows</title>
+ <!-- jEdit buffer-local properties: -->
+ <!-- :tabSize=2:indentSize=1:noTabs=true:maxLineLen=72: -->
+ <!-- jEditLauncher 4.0 (R2) Quick Guide -->
+ <!-- Copyright (C) 2001, 2002 John Gellene -->
+ <!-- $Id: launcher-guide.xml 16181 2009-09-08 19:26:57Z ezust $
+-->
+ <section id="launcher-intro">
+ <title>Introduction</title>
+
+ <para>The jEditLauncher package is a set of lightweight components for
+ running jEdit under the Windows group of operating systems. The package
+ is designed to run on Windows 95, Windows 98, Windows Me, Windows NT
+ (versions 4.0 and greater), Windows 2000 and Windows XP.</para>
+
+ <para>While jEdit does not make available a component-type interface, it
+ does contains an <quote>EditServer</quote> that listens on a socket for
+ requests to load scripts written in the BeanShell scripting language.
+ When the server activates, it writes the server port number and a
+ pseudo-random, numeric authorization key to a text file. By default, the
+ file is named <filename>server</filename> and is located in the settings
+ directory (see <xref linkend="settings-directory" />).</para>
+
+ <para>The jEditLauncher component locates and reads this file, opens a
+ socket and attempts to connect to the indicated port. If successful, it
+ transmits the appropriate BeanShell script to the server. If
+ unsuccessful, it attempts to start jEdit and repeats the socket
+ transmission once it can obtain the port and key information. The
+ component will abandon the effort to connect roughly twenty seconds
+ after it launches the application.</para>
+ </section>
+
+ <section id="launcher-starting">
+ <title>Starting jEdit</title>
+
+ <para>The main component of the jEditLauncher package is a client
+ application entitled <command>jedit.exe</command>. It may be executed
+ either from either Windows Explorer, a shortcut icon or the command
+ line. It uses the jEditLauncher COM component to open files in jEdit
+ that are listed as command line parameters. It supports Windows and UNC
+ file specifications as well as wild cards. If called without parameters,
+ it will launch jEdit. If jEdit is already running<!-- and has an active
+ EditServer -->, it will simply open a new, empty buffer.</para>
+
+ <para><command>jedit.exe</command> supports five command-line options.
+ Except for the <userinput>/1</userinput> option, if any of these options
+ are invoked correctly, the application will not load files or execute
+ jEdit.</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>The option <userinput>/h</userinput> causes a window to be
+ displayed with a brief description of the application and its
+ various options.</para>
+ </listitem>
+
+ <listitem>
+ <para>The option <userinput>/p</userinput> will activate a
+ dialog window displaying the command-line parameters to be used
+ when calling jEdit. This option can also be triggered by
+ selecting <guilabel>Set jEdit Parameters</guilabel> from the
+ <guilabel>jEdit</guilabel> section of the Windows Programs menu,
+ or by running the utility program
+ <command>jedinit.exe</command></para>
+
+ <para>Using the dialog, you can change parameters specifying the
+ executable for the Java application loader (either
+ <filename>java.exe</filename> or
+ <filename>javaw.exe</filename>), the location of the jEdit
+ archive file, <filename>jedit.jar</filename>, and command line
+ options for both. <itemizedlist>
+ <listitem>
+ <para>The input fields for Java options and jEdit
+ options are separate. If you insert an option in the
+ wrong place it will not be properly executed.</para>
+ </listitem>
+
+ <listitem>
+ <para>If the <userinput>-jar</userinput> option is
+ not used with the Java application loader the
+ principal jEdit class of
+ <classname>org.gjt.sp.jedit.jEdit</classname> is set
+ as fixed data.</para>
+ </listitem>
+
+ <listitem>
+ <para>The working directory for the Java
+ interpreter's process can also be specified.</para>
+ </listitem>
+ </itemizedlist> A read-only window at the bottom of the
+ dialog displays the full command line that jEditLauncher will
+ invoke.</para>
+
+ <para>Before committing changes to the command line parameters,
+ <command>jedit.exe</command> validates the paths for the Java
+ and jEdit targets as well as the working directory. It will
+ complain if the paths are invalid. It will not validate command
+ line options, but it will warn you if it finds the
+ <userinput>-noserver</userinput> option used for jEdit, since
+ this will deactivate the edit server and make it impossible for
+ jEditLauncher to open files.</para>
+
+ <para>Note that due to the design of
+ <application>jEditLauncher</application>, platform-independent
+ command line options handled by jEdit itself (such as
+ <userinput>-background</userinput> and
+ <userinput>-norestore</userinput>) must be entered in the
+ <quote>Set jEdit Parameters</quote> dialog box, and cannot be
+ specified on the <command>jedit.exe</command> command line
+ directly. For information about platform-independent command
+ line options, see <xref linkend="cli-usage" />.</para>
+ </listitem>
+
+ <listitem>
+ <para>The option <userinput>/1</userinput> is intended for use
+ in circumstances where a single file name is passed to jEdit for
+ opening, and quotation marks cannot be used to delimit file
+ names containing whitespace. The launcher reads the entire
+ command line following the <userinput>/1</userinput> options as
+ a single file path, regardless of the presence of whitespace,
+ and passes the resulting string as a single file name parameter
+ to jEdit.</para>
+
+ <para>This option allows jEdit to be used with version 5 or
+ greater of Internet Explorer as an alternate text editor or as
+ the target of the <guimenuitem>View Source</guimenuitem>
+ command. Included with the jEditLauncher distribution is a file
+ named <filename>jEdit_IE.reg.txt</filename> containing an
+ example of a Window registry file that you can use to register
+ jEdit as a HTML editor with Internet Explorer. Instructions for
+ the file's use are included in the text.</para>
+
+ <para>The use of the <userinput>/1</userinput> option with
+ multiple file names or other parameters will lead to program
+ errors or unpredictable results.</para>
+ </listitem>
+
+ <listitem>
+ <para>The option <userinput>/i</userinput> is not mentioned in
+ the help window for <filename>jedit.exe</filename>. It is
+ intended primarily to be used in conjunction with jEdit's Java
+ installer, but it can also be used to install or reinstall
+ jEditLauncher manually. When accompanied by a second parameter
+ specifying the directory where your preferred Java interpreter
+ is located, jEditLauncher will install itself and set a
+ reasonable initial set of command line parameters for executing
+ jEdit. You can change these parameters later by running
+ <filename>jedinit.exe</filename> or
+ <filename>jedit.exe</filename> with the<userinput>/p</userinput>
+ option.</para>
+ </listitem>
+
+ <listitem>
+ <para>The option <userinput>/u</userinput> will cause
+ jEditLauncher to be uninstalled by removing its registry
+ entries. This option does not delete any jEditLauncher or jEdit
+ files.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section id="launcher-menu">
+ <title>The Context Menu Handler</title>
+
+ <para>The jEditLauncher package also implements a context menu handler
+ for the Windows shell. It is intended to be be installed as a handler
+ available for any file. When you right-click on a file or shortcut icon,
+ the context menu that appears will include an item displaying the jEdit
+ icon and captioned <guilabel>Open with jEdit</guilabel>. If the file has
+ an extension, another item will appear captioned <guilabel>Open *.XXX
+ with jEdit</guilabel>, where XXX is the extension of the selected file.
+ Clicking this item will cause jEdit to load all files with the same
+ extension in the same directory as the selected file. Multiple file
+ selections are also supported; in this circumstance only the
+ <guilabel>Open with jEdit</guilabel> item appears.</para>
+
+ <para>If a single file with a <filename>.bsh</filename> extension is
+ selected, the menu will also contain an item captioned <guilabel>Run
+ script in jEdit</guilabel>. Selecting this item will cause jEditLauncher
+ to run the selected file as a BeanShell script.</para>
+
+ <para>If exactly two files are selected, the menu will contain an entry
+ for <guilabel>Show diff in jEdit</guilabel>. Selecting this item will
+ load the two files in jEdit and have them displayed side-by-side with
+ their differences highlighted by the <application>JDiff</application>
+ plugin. The file selected first will be treated as the base for
+ comparison purposes. If the plugin is not installed, an error message
+ will be displayed in jEdit. See <xref linkend="using-plugins" /> for
+ more information about installing plugins.</para>
+ </section>
+
+ <!-- open section -->
+
+ <section id="launcher-jedidiff">
+ <title>Using jEdit and jEditLauncher as a Diff Utility</title>
+
+ <para>As noted above, you can create a graphical diff display comparing
+ the contents of two text files by selecting the two files in an Explorer
+ window, right-clicking to produce a context menu, and selecting the
+ <guimenuitem>Show diff in jEdit</guimenuitem> menu item. The utility
+ <filename>jedidiff.exe</filename> allows you to perform this operation
+ from a command line. The command takes the two files to be compared as
+ parameters; they should be delimited by quotation marks if their paths
+ contain whitespace.</para>
+ </section>
+
+ <section id="launcher-uninstall">
+ <title>Uninstalling jEdit and jEditLauncher</title>
+
+ <para></para>
+
+ <para>There are three ways to uninstall jEdit and jEditLauncher.</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>First, you can run <filename>unlaunch.exe</filename> in
+ the jEdit installation directory.</para>
+ </listitem>
+
+ <listitem>
+ <para>Second, you can choose <guilabel>Uninstall
+ jEdit</guilabel> from the <guilabel>jEdit</guilabel> section of
+ the Programs menu. <!-- This will
+ uninstall the <quote>primary</quote> version of jEdit (and will
+ designate a new primary version if any versions remain). --></para>
+ </listitem>
+
+ <listitem>
+ <para>Third, you can choose the uninstall option for jEdit in
+ the Control Panel's Add/Remove Programs applet. <!-- This allows you to specify
+ unambiguously the version of jEdit that you wish to remove. --></para>
+ </listitem>
+ </itemizedlist>
+
+ <para>Each of these options will deactivate jEditLauncher and delete all
+ files in jEdit's installation directory. As a safeguard, jEditLauncher
+ displays a warning window and requires the user to confirm an uninstall
+ operation. Because the user's settings directory can be set and changed
+ from one jEdit session to another, user settings files must be deleted
+ manually.</para>
+
+ <para>To deactivate jEditLauncher without deleting any files, run
+ <filename>jedit /u</filename> from any command prompt where the jEdit
+ installation directory is in the search path. This will remove the
+ entries for jEditLauncher from the Windows registry. It will also
+ disable the context menu handler and the automatic launching and
+ scripting capabilities. The package can reactivated by executing
+ <command>jedit.exe</command> again, and jEdit can be started in the same
+ manner as any other Java application on your system.</para>
+ </section>
+
+ <section id="launcher-interface">
+ <title>The jEditLauncher Interface</title>
+
+ <para>The core of the jEditLauncher package is a COM component that can
+ communicate with the EditServer, or open jEdit if it is not running or
+ is otherwise refusing a connection. The component supports both Windows
+ and UNC file specifications, including wild cards. It will resolve
+ shortcut links to identify and transmit the name of the underlying
+ file.</para>
+
+ <para>Because it is implemented with a <quote>dual interface</quote>,
+ the functions of jEditLauncher are available to scripting languages in
+ the Windows environment such as VBScript, JScript, Perl (using the
+ Win32::OLE package) and Python (using the win32com.client
+ package).</para>
+
+ <para>The scriptable interface consists of two read-only properties and
+ six functions:</para>
+
+ <para><emphasis>Properties</emphasis></para>
+
+ <itemizedlist>
+ <listitem>
+ <para><varname>ServerPort</varname> - a read-only property that
+ returns the port number found in jEdit's server file; the value
+ is not tested for authenticity. It returns zero if the server
+ information file cannot be located.</para>
+ </listitem>
+
+ <listitem>
+ <para><varname>ServerKey</varname> - a read-only property that
+ returns the numeric authorization key found in jEdit's server
+ file; the value is not tested for authenticity. It returns zero
+ if the server information file cannot be located.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para><emphasis>Functions</emphasis></para>
+
+ <itemizedlist>
+ <listitem>
+ <para><function>OpenFile</function> - a method that takes a
+ single file name (with or without wild card characters) as a
+ parameter.</para>
+ </listitem>
+
+ <listitem>
+ <para><function>OpenFiles</function> - this method takes an
+ array of file names (with or without wild card characters) as a
+ parameter. The form of the array is that which is used for
+ arrays in the scripting environment. In JScript, for example the
+ data type of the <classname>VARIANT</classname> holding the
+ array is <classname>VT_DISPATCH</classname>; in VBScript, it is
+ <classname>VT_ARRAY | VT_VARIANT</classname>, with array members
+ having data type <classname>VT_BSTR</classname>.</para>
+ </listitem>
+
+ <listitem>
+ <para><function>Launch</function> - this method with no
+ parameters attempts to open jEdit without loading additional
+ files.</para>
+ </listitem>
+
+ <listitem>
+ <para><function>RunScript</function> - this method takes a file
+ name or full file path as a parameter and runs the referenced
+ file as a BeanShell script in jEdit. The predefined variables
+ <varname>view</varname>, <varname>editPane</varname>,
+ <varname>textArea</varname> and <varname>buffer</varname> are
+ available to the script. If more than one view is open, the
+ variable are initialized with reference to the earliest opened
+ view. If no path is given for the file it will use the working
+ directory of the calling process.</para>
+ </listitem>
+
+ <listitem>
+ <para><function>EvalScript</function> - this method takes a
+ string as a parameter containing one or more BeanShell
+ statements and runs the script in jEdit's BeanShell interpreter.
+ The predefined variables are available on the same basis as in
+ <function>RunScript</function>.</para>
+ </listitem>
+
+ <listitem>
+ <para><function>RunDiff</function> - this method takes two
+ strings representing file names as parameters. If the
+ <application>JDiff</application> plugin is installed, this
+ method will activate the JDiff plugin and display the two files
+ in the plugin's graphical <quote>dual diff</quote> format. The
+ first parameter is treated as the base for display purposes. If
+ the <application>JDiff</application> plugin is not installed, a
+ error message box will be displayed in jEdit.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section id="launcher-examples">
+ <title>Scripting Examples</title>
+
+ <para>Here are some brief examples of scripts using jEditLauncher. The
+ first two will run under Windows Script Host, which is either installed
+ or available for download for 32-bit Windows operating systems. The next
+ example is written in Perl and requires the Win32::OLE package. The last
+ is written in Python and requires the win32gui and win32com.client
+ extensions.</para>
+
+ <para>If Windows Script Host is installed, you can run the first two
+ scripts by typing the name of the file containing the script at a
+ command prompt. In jEdit's <application>Console</application> plugin,
+ you can type <userinput>cmd /c
+ <replaceable>script_path</replaceable></userinput> or <userinput>wscript
+ <replaceable>script_path</replaceable></userinput>.</para>
+
+ <informalexample>
+ <programlisting>' Example VBScript using jEditLauncher interface
+dim launcher
+set launcher = CreateObject("JEdit.JEditLauncher")
+a = Array("I:\Source Code Files\shellext\jeditshell\*.h", _
+ "I:\Source Code Files\shellext\jeditshell\*.cpp")
+MsgBox "The server authorization code is " + _
+ FormatNumber(launcher.ServerKey, 0, 0, 0, 0) + ".", _
+ vbOKOnly + vbInformation, "jEditLauncher"
+launcher.openFiles(a)
+myScript = "jEdit.newFile(view); textArea.setSelectedText(" _
+ & CHR(34) _
+ & "Welcome to jEditLauncher." _
+ & CHR(34) & ");"
+launcher.evalScript(myScript)</programlisting>
+ </informalexample>
+
+ <informalexample>
+ <programlisting>/* Example JScript using jEditLauncher interface
+ * Note: in contrast to VBScript, JScript does not
+ * directly support message boxes outside a browser window
+ */
+var launcher = WScript.createObject("JEdit.JEditLauncher");
+var a = new Array("I:\\weather.html", "I:\\test.txt");
+b = "I:\\*.pl";
+launcher.openFiles(a);
+launcher.openFile(b);
+c = "G:\\Program Files\\jEdit\\macros\\Misc"
+ + "\\Properties\\System_properties.bsh";
+launcher.runScript(c);</programlisting>
+ </informalexample>
+
+ <informalexample>
+ <programlisting># Example Perl script using jEditLauncher interface
+use Win32::OLE;
+$launcher = Win32::OLE->new('JEdit.JEditLauncher') ||
+ die "JEditLauncher: not found !\n";
+ at files = ();
+foreach $entry (@ARGV) {
+ @new = glob($entry);
+ push(@files, at new);
+}
+$launcher->openFiles(\@files);
+my($script) = "Macros.message(view, \"I found "
+ .(scalar @files)." files.\");";
+$launcher->evalScript($script);</programlisting>
+ </informalexample>
+
+ <informalexample>
+ <programlisting># Example Python script using jEditLauncher interface
+import win32gui
+import win32com.client
+o = win32com.client.Dispatch("JEdit.JEditLauncher")
+port = o.ServerPort
+if port == 0:
+ port = "inactive. We will now launch jEdit"
+win32gui.MessageBox(0, "The server port is %s." % port,
+ "jEditLauncher", 0)
+path = "C:\\WINNT\\Profiles\\Administrator\\Desktop\\"
+o.RunDiff(path + "Search.bsh", path + "Search2.bsh")
+</programlisting>
+ </informalexample>
+ </section>
+
+ <!-- open section -->
+
+ <section id="launcher-logging">
+ <title>jEditLauncher Logging</title>
+
+ <para>The jEditLauncher package has a logging facility that is separate
+ from jEdit's Activity Log to provide a record of events occurring
+ outside the Java virtual machine environment in which jEdit operates.
+ The logging facility maintains two log files:
+ <filename>jelaunch.log</filename> for events relating to starting jEdit,
+ loading files and running scripts, and <filename>install.log</filename>
+ for jEditLauncher installation activity. Both files are maintained in
+ the directory in which jEdit is installed. They are cumulative from
+ session to session, but may be manually deleted at any time without
+ affecting program execution.</para>
+ </section>
+
+ <!-- <section id="launcher-install"><title>Standalone Installation</title>
+ <para>
+ Installation of jEditLauncher occurs as part of the installation of the
+ jEdit package for Windows. If a full jEdit installation fails, you can
+ install jEditLauncher by placing the following files in the same
+ directory as <filename>jedit.jar</filename>, the archive containing the
+ Java application:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ <filename>jedit.exe</filename>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <filename>jedinit.exe</filename>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <filename>jeshlstb.dll</filename>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <filename>jedinstl.dll</filename>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <filename>jeditsvr.exe</filename>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <filename>jeservps.dll</filename>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <filename>unlaunch.exe</filename>
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ Anytime <filename>jedit.exe</filename> is executed (either directly or
+ indirectly through a call to <filename>jedinit.exe</filename>),
+ jEditLauncher checks to see if it is properly installed. If it is not,
+ it will offer to install itself. If you agree, you will then be asked to
+ supply the path to a Java interpreter. The directory you choose should
+ contain <filename>javaw.exe</filename>, which the installer uses as a
+ default; you can change the interpreter later with a call to
+ <filename>jedinit.exe</filename>.
+ </para>
+</section> -->
+
+ <section id="launcher-legalnotice">
+ <title>Legal Notice</title>
+
+ <para>All source code and software distributed as the jEditLauncher
+ package in which the author holds the copyright is made available under
+ the GNU General Public License (<quote>GPL</quote>). A copy of the GPL
+ is included in the file <filename>COPYING.txt</filename> included with
+ jEdit.</para>
+
+ <para>Notwithstanding the terms of the General Public License, the
+ author grants permission to compile and link object code generated by
+ the compilation of this program with object code and libraries that are
+ not subject to the GNU General Public License, provided that the
+ executable output of such compilation shall be distributed with source
+ code on substantially the same basis as the jEditLauncher package of
+ which this source code and software is a part. By way of example, a
+ distribution would satisfy this condition if it included a working
+ Makefile for any freely available make utility that runs on the Windows
+ family of operating systems. This condition does not require a licensee
+ of this software to distribute any proprietary software (including
+ header files and libraries) that is licensed under terms prohibiting or
+ limiting redistribution to third parties.</para>
+
+ <para>The purpose of this specific permission is to allow a user to link
+ files contained or generated by the source code with library and other
+ files licensed to the user by Microsoft or other parties, whether or not
+ that license conforms to the requirements of the GPL. This permission
+ should not be construed to expand the terms of any license for any
+ source code or other materials used in the creation of
+ jEditLauncher.</para>
+ </section>
</appendix>
\ No newline at end of file
diff --git a/jEdit/doc/users-guide/macro-basics.xml b/jEdit/doc/users-guide/macro-basics.xml
index d72760f..ab53a4f 100644
--- a/jEdit/doc/users-guide/macro-basics.xml
+++ b/jEdit/doc/users-guide/macro-basics.xml
@@ -1,767 +1,767 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter id="macro-basics">
- <title>Macro Basics</title>
- <!-- jEdit 4.0 Macro Guide, (C) 2001, 2002 John Gellene -->
- <!-- jEdit buffer-local properties: -->
- <!-- :indentSize=1:noTabs=yes:maxLineLen=72:tabSize=2: -->
- <!-- :xml.root=users-guide.xml: -->
- <!-- This file cover the introductory section of the macro guide -->
- <!-- $Id: macro-basics.xml 16181 2009-09-08 19:26:57Z ezust $ -->
-
- <section id="beanshell-intro">
- <title>Introducing BeanShell</title>
-
- <para>Here is how BeanShell's author, Pat Niemeyer, describes his
- creation:</para>
-
- <blockquote>
- <para><quote>BeanShell is a small, free, embeddable, Java source
- interpreter with object scripting language features, written in
- Java. BeanShell executes standard Java statements and expressions,
- in addition to obvious scripting commands and syntax. BeanShell
- supports scripted objects as simple method closures like those in
- Perl and JavaScript.</quote></para>
- </blockquote>
-
- <para>You do not have to know anything about Java to begin writing your
- own jEdit macros. But if you know how to program in Java, you already
- know how to write BeanShell scripts. The major strength of using
- BeanShell with a program written in Java is that it allows the user to
- customize the program's behavior using the same interfaces designed and
- used by the program itself. BeanShell can turn a well-designed
- application into a powerful, extensible toolkit.</para>
-
- <para>This guide focuses on using BeanShell in macros. If you are
- interested in learning more about BeanShell generally, consult the
- <ulink url="http://www.beanshell.org">BeanShell web site</ulink>.
- Information on how to run and organize macros, whether included with the
- jEdit installation or written by you, can be found in <xref
- linkend="using-macros" />.</para>
- </section>
-
- <section id="single-macros">
- <title>Single Execution Macros</title>
-
- <para>As noted in <xref linkend="organizing-macros" />, you can save a
- BeanShell script of any length as a text file with the
- <filename>.bsh</filename> extension and run it from the
- <guimenu>Macros</guimenu> menu. There are three other ways jEdit lets
- you use BeanShell quickly, without saving a script to storage, on a
- <quote>one time only</quote> basis. You will find them in the
- <guimenu>Utilities</guimenu> menu.</para>
-
- <para><guimenu>Utilities</guimenu>><guisubmenu>BeanShell</guisubmenu>><guimenuitem>Evaluate
- BeanShell Expression</guimenuitem> displays a text input dialog that
- asks you to type a single line of BeanShell commands. You can type more
- than one BeanShell statement so long as each of them ends with a
- semicolon. If BeanShell successfully interprets your input, a message
- box will appear with the return value of the last statement.</para>
-
- <para><guimenu>Utilities</guimenu>><guisubmenu>BeanShell</guisubmenu>><guimenuitem>Evaluate
- For Selected Lines</guimenuitem> displays a text input dialog that asks
- you to type a single line of BeanShell commands. The commands are
- evaluated for each line of the selection. In addition to the standard
- set of variables described in <xref linkend="predefined-variables" />,
- this command defines the following:</para>
-
- <itemizedlist>
- <listitem>
- <para><varname>line</varname> - the line number, from the start
- of the buffer. The first line is numbered 0.</para>
- </listitem>
-
- <listitem>
- <para><varname>index</varname> - the line number, from the start
- of the selection. The first line is numbered 0.</para>
- </listitem>
-
- <listitem>
- <para><varname>text</varname> - the text of the line.</para>
- </listitem>
- </itemizedlist>
-
- <informalexample>
- <para>Try typing an expression like <userinput>(line + 1) + ": " +
- text</userinput> in the <guimenuitem>Evaluate For Selected
- Lines</guimenuitem> dialog box. This will add a line number to each
- selected line beginning with the number
- <userinput>1</userinput>.</para>
- </informalexample>
-
- <para>The BeanShell expression you enter will be evaluated and
- substituted in place of the entire text of a selected line. If you want
- to leave the line's current text as an element of the modified line, you
- must include the defined variable <userinput>text</userinput> as part of
- the BeanShell expression that you enter.</para>
-
- <para><guimenu>Utilities</guimenu>><guisubmenu>BeanShell</guisubmenu>><guimenuitem>Evaluate
- Selection</guimenuitem> evaluates the selected text as a BeanShell
- script and replaces it with the return value of the statement.</para>
-
- <para>Using <guimenuitem>Evaluate Selection</guimenuitem> is an easy way
- to do arithmetic calculations inline while editing. BeanShell uses
- numbers and arithmetic operations in an ordinary, intuitive way.</para>
-
- <informalexample>
- <para>Try typing an expression like
- <userinput>(3745*856)+74</userinput> in the buffer, select it, and
- choose
- <guimenu>Utilities</guimenu>><guisubmenu>BeanShell</guisubmenu>><guimenuitem>Evaluate
- Selection</guimenuitem>. The selected text will be replaced by the
- answer, <userinput>3205794</userinput>. <!-- Irrelevant? --> <!-- Since this is a text file
- and not a spreadsheet, the original values that BeanShell evaluated are
- not retained or saved as part of the buffer's contents. --></para>
- </informalexample>
-
- <sidebar>
- <title>Console plugin</title>
-
- <para>You can also do the same thing using the BeanShell interpreter
- option of the <application>Console</application> plugin.</para>
- </sidebar>
- </section>
-
- <section id="first-example">
- <title>The Mandatory First Example</title>
-
- <informalexample>
- <!-- <title>A first one-line macro</title> -->
-
- <programlisting>Macros.message(view, "Hello world!");</programlisting>
- </informalexample>
-
- <para>Running this one line script causes jEdit to display a message box
- (more precisely, a <classname>JOptionPane</classname> object) with the
- traditional beginner's message and an <guilabel>OK</guilabel> button.
- Let's see what is happening here.</para>
-
- <para>This statement calls a static method (or function) named
- <function>message</function> in jEdit's <ulink
- url="../api/org/gjt/sp/jedit/Macros.html">Macros</ulink> class. If you
- don't know anything about classes or static methods or Java (or C++,
- which employs the same concept), you will need to gain some
- understanding of a few terms. Obviously this is not the place for
- academic precision, but if you are entirely new to object-oriented
- programming, here are a few skeleton ideas to help you with
- BeanShell.</para>
-
- <itemizedlist>
- <listitem>
- <para>An <glossterm>object</glossterm> is a collection of data
- that can be initialized, accessed and manipulated in certain
- defined ways.</para>
- </listitem>
-
- <listitem>
- <para>A <glossterm>class</glossterm> is a specification of what
- data an object contains and what methods can be used to work
- with the data. A Java application consists of one or more
- classes (in the case of jEdit ,over 600 classes) written by the
- programmer that defines the application's behavior. A BeanShell
- macro uses these classes, along with built-in classes that are
- supplied with the Java platform, to define its own
- behavior.</para>
- </listitem>
-
- <listitem>
- <para>A <glossterm>subclass</glossterm> (or child class) is a
- class which uses (or <quote>inherits</quote>) the data and
- methods of its parent class along with additions or
- modifications that alter the subclass's behavior. Classes are
- typically organized in hierarchies of parent and child classes
- to organize program code, to define common behavior in shared
- parent class code, and to specify the types of similar behavior
- that child classes will perform in their own specific
- ways.</para>
- </listitem>
-
- <listitem>
- <para>A <glossterm>method</glossterm> (or function) is a
- procedure that works with data in a particular object, other
- data (including other objects) supplied as
- <glossterm>parameters</glossterm>, or both. Methods typically
- are applied to a particular object which is an
- <glossterm>instance</glossterm> of the class to which the method
- belongs.</para>
- </listitem>
-
- <listitem>
- <para>A <glossterm>static method</glossterm> differs from other
- methods in that it does not deal with the data in a particular
- object but is included within a class for the sake of
- convenience.</para>
- </listitem>
- </itemizedlist>
-
- <para>Java has a rich set of classes defined as part of the Java
- platform. Like all Java applications, jEdit is organized as a set of
- classes that are themselves derived from the Java platform's classes. We
- will refer to <firstterm>Java classes</firstterm> and <firstterm>jEdit
- classes</firstterm> to make this distinction. Some of jEdit's classes
- (such as those dealing with regular expressions and XML) are derived
- from or make use of classes in other open-source Java packages. Except
- for BeanShell itself, we won't be discussing them in this guide.</para>
-
- <para>In our one line script, the static method
- <function>Macros.message()</function> has two parameters because that is
- the way the method is defined in the <ulink
- url="../api/org/gjt/sp/jedit/Macros.html">Macros</ulink> class. You must
- specify both parameters when you call the function. The first parameter,
- <parameter>view</parameter>, is a variable naming the current, active
- <ulink url="../api/org/gjt/sp/jedit/View.html">View</ulink> object.
- Information about pre-defined variables can be found in <xref
- linkend="predefined-variables" />.</para>
-
- <para>The second parameter, which appears to be quoted text, is a
- <glossterm>string literal</glossterm> - a sequence of characters of
- fixed length and content. Behind the scenes, BeanShell and Java take
- this string literal and use it to create a <classname>String</classname>
- object. Normally, if you want to create an object in Java or BeanShell,
- you must construct the object using the <function>new</function> keyword
- and a <firstterm>constructor</firstterm> method that is part of the
- object's class. We'll show an example of that later. However, both Java
- and BeanShell let you use a string literal anytime a method's parameter
- calls for a <classname>String</classname>.</para>
-
- <para>If you are a Java programmer, you might wonder about a few things
- missing from this one line program. There is no class definition, for
- example. You can think of a BeanShell script as an implicit definition
- of a <function>main()</function> method in an anonymous class. That is
- in fact how BeanShell is implemented; the class is derived from a
- BeanShell class called <ulink url="../api/bsh/XThis.html">XThis</ulink>.
- If you don't find that helpful, just think of a script as one or more
- blocks of procedural statements conforming to Java syntax rules. You
- will also get along fine (for the most part) with C or C++ syntax if you
- leave out anything to do with pointers or memory management - Java and
- BeanShell do not have pointers and deal with memory management
- automatically.</para>
-
- <para>Another missing item from a Java perspective is a
- <function>package</function> statement. In Java, such a statement is
- used to bundle together a number of files so that their classes become
- visible to one another. Packages are not part of BeanShell, and you
- don't need to know anything about them to write BeanShell macros.</para>
-
- <para>Finally, there are no <function>import</function> statements in
- this script. In Java, an <function>import</function> statement makes
- public classes from other packages visible within the file in which the
- statement occurs without having to specify a fully qualified class name.
- Without an import statement or a fully qualified name, Java cannot
- identify most classes using a single name as an identifier.</para>
-
- <para>jEdit automatically imports a number of commonly-used packages
- into the namespace of every BeanShell script. Because of this, the
- script output of a recorded macro does not contain
- <function>import</function> statements. For the same reason, most
- BeanShell scripts you write will not require <function>import</function>
- statements.</para>
-
- <para>Java requires <literal>import</literal> statement to be located at
- the beginning of a source file. BeanShell allows you to place
- <literal>import</literal> statements anywhere in a script, including
- inside a block of statements. The <literal>import</literal> statement
- will cover all names used following the statement in the enclosing
- block.</para>
-
- <para>If you try to use a class that is not imported without its
- fully-qualified name, the BeanShell interpreter will complain with an
- error message relating to the offending line of code.</para>
-
- <sidebar>
- <para>Here is the full list of packages automatically imported by
- jEdit:</para>
-
- <programlisting>java.awt
-java.awt.event
-java.net
-java.util
-java.io
-java.lang
-javax.swing
-javax.swing.event
-org.gjt.sp.jedit
-org.gjt.sp.jedit.browser
-org.gjt.sp.jedit.buffer
-org.gjt.sp.jedit.gui
-org.gjt.sp.jedit.help
-org.gjt.sp.jedit.io
-org.gjt.sp.jedit.msg
-org.gjt.sp.jedit.options
-org.gjt.sp.jedit.pluginmgr
-org.gjt.sp.jedit.print
-org.gjt.sp.jedit.search
-org.gjt.sp.jedit.syntax
-org.gjt.sp.jedit.textarea
-org.gjt.sp.util</programlisting>
- </sidebar>
- </section>
-
- <section id="predefined-variables">
- <title>Predefined Variables in BeanShell</title>
-
- <para>The following variables are always available for use in BeanShell
- scripts:</para>
-
- <itemizedlist>
- <listitem>
- <para><varname>buffer</varname> - a <ulink
- url="../api/org/gjt/sp/jedit/Buffer.html">Buffer</ulink> object
- represents the contents of the currently visible open text
- file.</para>
- </listitem>
-
- <listitem>
- <para><varname>view</varname> - A <ulink
- url="../api/org/gjt/sp/jedit/View.html">View</ulink> represents
- the current top-level editor window, extending Java's
- <classname>JFrame</classname> class, that contains the various
- visible components of the program, including the text area, menu
- bar, toolbar, and any docked windows.</para>
-
- <para>This variable has the same value as the return value
- of:</para>
-
- <programlisting>jEdit.getActiveView()</programlisting>
- </listitem>
-
- <listitem>
- <para><varname>editPane</varname> - an <ulink
- url="../api/org/gjt/sp/jedit/EditPane.html">EditPane</ulink>
- object contains a text area and buffer switcher. A view can be
- split to display edit panes. Among other things, the <ulink
- url="../api/org/gjt/sp/jedit/EditPane.html">EditPane</ulink>
- class contains methods for selecting the buffer to edit.</para>
-
- <para>Most of the time your macros will manipulate the
- <varname>buffer</varname> or the <varname>textArea</varname>.
- Sometimes you will need to use <varname>view</varname> as a
- parameter in a method call. You will probably only need to use
- <varname>editPane</varname> if your macros work with split
- views.</para>
-
- <para>This variable has the same value as the return value
- of:</para>
-
- <programlisting>view.getEditPane()</programlisting>
- </listitem>
-
- <listitem>
- <para><varname>textArea</varname> - a <ulink
- url="../api/org/gjt/sp/jedit/textarea/JEditTextArea.html">JEditTextArea</ulink>
- is the visible component that displays the current
- buffer.</para>
-
- <para>This variable has the same value as the return value
- of:</para>
-
- <programlisting>editPane.getTextArea()</programlisting>
- </listitem>
-
- <listitem>
- <para><varname>wm</varname> - a <ulink
- url="../api/org/gjt/sp/jedit/gui/DockableWindowManager.html">DockableWindowManager</ulink>
- is the visible component that manages dockable windows in the
- current view. This class is discussed in detail in <xref
- linkend="writing-plugins-part" />. This object is useful for
- writing macros that interface with, open, or close plugin
- windows.</para>
-
- <para>This variable has the same value the return value
- of:</para>
-
- <programlisting>view.getDockableWindowManager()</programlisting>
- </listitem>
-
- <listitem>
- <para><varname>scriptPath</varname> - set to the full path of
- the script currently being executed.</para>
- </listitem>
-
- <listitem>
- <para><varname>scriptPath</varname> - set to the full path of
- the script currently being executed.</para>
- </listitem>
- </itemizedlist>
-
- <para>Note that these variables are set at the beginning of macro
- execution. If the macro switches views, buffers or edit panes, the
- variable values will be out of date. In that case, you can use the
- equivalent method calls.</para>
- </section>
-
- <section id="helpful-methods">
- <title>Helpful Methods in the Macros Class</title>
-
- <para>Including <function>message()</function>, there are five static
- methods in the <ulink
- url="../api/org/gjt/sp/jedit/Macros.html">Macros</ulink> class that
- allow you to converse easily with your macros. They all encapsulate
- calls to methods of the Java platform's
- <classname>JOptionPane</classname> class.</para>
-
- <itemizedlist>
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>public static void
- <function>message</function></funcdef>
-
- <paramdef>Component
- <parameter>comp</parameter></paramdef>
-
- <paramdef>String
- <parameter>message</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>public static void
- <function>error</function></funcdef>
-
- <paramdef>Component
- <parameter>comp</parameter></paramdef>
-
- <paramdef>String
- <parameter>message</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>public static String
- <function>input</function></funcdef>
-
- <paramdef>Component
- <parameter>comp</parameter></paramdef>
-
- <paramdef>String
- <parameter>prompt</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>public static String
- <function>input</function></funcdef>
-
- <paramdef>Component
- <parameter>comp</parameter></paramdef>
-
- <paramdef>String
- <parameter>prompt</parameter></paramdef>
-
- <paramdef>String
- <parameter>defaultValue</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
- </listitem>
-
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>public static int
- <function>confirm</function></funcdef>
-
- <paramdef>Component
- <parameter>comp</parameter></paramdef>
-
- <paramdef>String
- <parameter>prompt</parameter></paramdef>
-
- <paramdef>int <parameter>buttons</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
- </listitem>
- </itemizedlist>
-
- <para>The format of these four <glossterm>declarations</glossterm>
- provides a concise reference to the way in which the methods may be
- used. The keyword <function>public</function> means that the method can
- be used outside the <ulink
- url="../api/org/gjt/sp/jedit/Macros.html">Macros</ulink> class. The
- alternatives are <function>private</function> and
- <function>protected</function>. For purposes of BeanShell, you just have
- to know that BeanShell can only use public methods of other Java
- classes. The keyword <function>static</function> we have already
- discussed. It means that the method does not operate on a particular
- object. You call a static function using the name of the class (like
- <ulink url="../api/org/gjt/sp/jedit/Macros.html">Macros</ulink>) rather
- than the name of a particular object (like <varname>view</varname>). The
- third word is the type of the value returned by the method. The keyword
- <function>void</function> is Java's way of saying the the method does
- not have a return value.</para>
-
- <para>The <function>error()</function> method works just like
- <function>message()</function> but displays an error icon in the message
- box. The <function>input()</function> method furnishes a text field for
- input, an <guilabel>OK</guilabel> button and a
- <guilabel>Cancel</guilabel> button. If <guilabel>Cancel</guilabel> is
- pressed, the method returns <constant>null</constant>. If
- <guilabel>OK</guilabel> is pressed, a <classname>String</classname>
- containing the contents of the text field is returned. Note that there
- are two forms of the <function>input()</function> method; the first form
- with two parameters displays an empty input field, the other forms lets
- you specify an initial, default input value.</para>
-
- <para>For those without Java experience, it is important to know that
- <constant>null</constant> is <emphasis>not</emphasis> the same as an
- empty, <quote>zero-length</quote> <classname>String</classname>. It is
- Java's way of saying that there is no object associated with this
- variable. Whenever you seek to use a return value from
- <function>input()</function> in your macro, you should test it to see if
- it is <constant>null</constant>. In most cases, you will want to exit
- gracefully from the script with a <function>return</function> statement,
- because the presence of a null value for an input variable usually means
- that the user intended to cancel macro execution. BeanShell will
- complain if you call any methods on a <constant>null</constant>
- object.</para>
-
- <para>The <function>confirm()</function> method in the <ulink
- url="../api/org/gjt/sp/jedit/Macros.html">Macros</ulink> class is a
- little more complex. The <varname>buttons</varname> parameter has an
- <classname>int</classname> type, and the usual way to supply a value is
- to use one of the predefined values taken from Java's
- <classname>JOptionPane</classname> class. You can choose among
- <constant>JOptionPane.YES_NO_OPTION</constant>,
- <constant>JOptionPane.YES_NO_CANCEL_OPTION</constant>, or
- <constant>JOptionPane.OK_CANCEL_OPTION</constant>. The return value of
- the method is also an <classname>int</classname>, and should be tested
- against the value of other predefined constants:
- <constant>JOptionPane.YES_OPTION</constant>,
- <constant>JOptionPane.NO_OPTION</constant>,
- <constant>JOptionPane.OK_OPTION</constant> or
- <constant>JOptionPane.CANCEL_OPTION</constant>.</para>
-
- <para>We've looked at using <function>Macros.message()</function>. To
- use the other methods, you would write something like the
- following:</para>
-
- <informalexample>
- <!-- <title>Using <function>Macros.error()</function> and
- <function>Macros.input()</function></title> -->
-
- <programlisting>Macros.error(view, "Goodbye, cruel world!");
-
-String result = Macros.input(view, "Type something here.");
-
-String result = Macros.input(view, "When were you born?",
- "I don't remember, I was very young at the time");
-
-int result = Macros.confirm(view, "Do you really want to learn"
- + " about BeanShell?",JOptionPane.YES_NO_OPTION);
- </programlisting>
- </informalexample>
-
- <para>In the last three examples, placing the word
- <classname>String</classname> or <classname>int</classname> before the
- variable name <varname>result</varname> tells BeanShell that the
- variable refers to an integer or a <classname>String</classname> object,
- even before a particular value is assigned to the variable. In
- BeanShell, this <glossterm>declaration</glossterm> of the
- <glossterm>type</glossterm> of <varname>result</varname> is not
- necessary; BeanShell can figure it out when the macro runs. This can be
- helpful if you are not comfortable with specifying types and classes;
- just use your variables and let BeanShell worry about it.</para>
-
- <para>Note that macros are not limited to using these methods for
- presenting a user interface. In fact, full-blown user interfaces using
- the Java Swing APIs are also possible, and will be covered later on in
- <xref linkend="dialog-macro" />.</para>
- </section>
-
- <section id="dynamic-typing">
- <title>BeanShell Dynamic Typing</title>
-
- <para>Without an explicit <glossterm>type declaration</glossterm> like
- <classname>String</classname> <varname>result</varname>, BeanShell
- variables can change their type at runtime depending on the object or
- data assigned to it. This dynamic typing allows you to write code like
- this (if you really wanted to):</para>
-
- <informalexample>
- <!-- <title>Dynamic typing of variables</title> -->
-
- <programlisting>// note: no type declaration
-result = Macros.input(view, <quote>Type something here.</quote>);
-
-// this is our predefined, current View
-result = view;
-
-// this is an <quote>int</quote> (for integer);
-// in Java and BeanShell, int is one of a small number
-// of <quote>primitive</quote> data types which are not classes
-result = 14;</programlisting>
- </informalexample>
-
- <para>However, if you first declared <varname>result</varname> to be
- type <classname>String</classname> and and then tried these
- reassignments, BeanShell would complain. While avoiding explicit type
- declaration makes writing macro code simpler, using them can act as a
- check to make sure you are not using the wrong variable type of object
- at a later point in your script. It also makes it easier (if you are so
- inclined) to take a BeanShell <quote>prototype</quote> and incorporate
- it in a Java program.</para>
-
- <para>One last thing before we bury our first macro. The double slashes
- in the examples just above signify that everything following them on
- that line should be ignored by BeanShell as a comment. As in Java and
- C/C++, you can also embed comments in your BeanShell code by setting
- them off with pairs of <userinput>/* */</userinput>, as in the following
- example:</para>
-
- <informalexample>
- <programlisting>/* This is a long comment that covers several lines
-and will be totally ignored by BeanShell regardless of how
-many lines it covers */</programlisting>
- </informalexample>
- </section>
-
- <section id="something-useful">
- <title>Now For Something Useful</title>
-
- <para>Here is a macro that inserts the path of the current buffer in the
- text:</para>
-
- <informalexample>
- <!-- <title>Insert buffer path in text</title> -->
-
- <programlisting>String newText = buffer.getPath();
-textArea.setSelectedText(newText);</programlisting>
- </informalexample>
-
- <para>Unlike in our first macro example, here we are calling class
- methods on particular objects. First, we call
- <function>getPath()</function> on the current <ulink
- url="../api/org/gjt/sp/jedit/Buffer.html">Buffer</ulink> object to get
- the full path of the text file currently being edited. Next, we call
- <function>setSelectedText()</function> on the current text display
- component, specifying the text to be inserted as a parameter.</para>
-
- <para>In precise terms, the <function>setSelectedText()</function>
- method substitutes the contents of the <classname>String</classname>
- parameter for a range of selected text that includes the current caret
- position. If no text is selected at the caret position, the effect of
- this operation is simply to insert the new text at that position.</para>
-
- <para>Here's a few alternatives to the full file path that you could use
- to insert various useful things:</para>
-
- <informalexample>
- <!-- <title>Items to use with
- <function>setSelectedText()</function></title> -->
-
- <programlisting>// the file name (without full path)
-String newText = buffer.getName();
-
-// today's date
-import java.text.DateFormat;
-
-String newText = DateFormat.getDateInstance()
- .format(new Date());
-
-// a line count for the current buffer
-String newText = "This file contains "
- + textArea.getLineCount() + " lines.";</programlisting>
- </informalexample>
-
- <para>Here are brief comments on each:</para>
-
- <itemizedlist>
- <listitem>
- <para>In the first, the call to <function>getName()</function>
- invokes another method of the <ulink
- url="../api/org/gjt/sp/jedit/Buffer.html">Buffer</ulink>
- class.</para>
- </listitem>
-
- <listitem>
- <para>The syntax of the second example chains the results of
- several methods. You could write it this way:</para>
-
- <programlisting>import java.text.DateFormat;
-Date d = new Date();
-DateFormat df = DateFormat.getDateInstance();
-String result = df.format(d);
-</programlisting>
-
- <para>Taking the pieces in order:</para>
-
- <itemizedlist>
- <listitem>
- <para>A Java <classname>Date</classname> object is
- created using the <function>new</function> keyword. The
- empty parenthesis after <classname>Date</classname>
- signify a call on the <glossterm> constructor
- method</glossterm> of <classname>Date</classname> having
- no parameters; here, a <classname>Date</classname> is
- created representing the current date and time.</para>
- </listitem>
-
- <listitem>
- <para><function>DateFormat.getDateInstance()</function>
- is a static method that creates and returns a
- <classname>DateFormat</classname> object. As the name
- implies, <classname>DateFormat</classname> is a Java
- class that takes <classname>Date</classname> objects and
- produces readable text. The method
- <function>getDateInstance()</function> returns a
- <classname>DateFormat</classname> object that parses and
- formats dates. It will use the default
- <glossterm>locale</glossterm> or text format specified
- in the user's Java installation.</para>
- </listitem>
-
- <listitem>
- <para>Finally,
- <classname>DateFormat.format()</classname> is called on
- the new <classname>DateFormat</classname> object using
- the <classname>Date</classname> object as a parameter.
- The result is a <classname>String</classname> containing
- the date in the default locale.</para>
- </listitem>
-
- <listitem>
- <para>Note that the <classname>Date</classname> class is
- contained in the <literal>java.util</literal> package,
- so an explicit import statement is not required.
- However, <classname>DateFormat</classname> is part of
- the <literal>java.text</literal> package, which is not
- automatically imported, so an explicit
- <function>import</function> statement must be
- used.</para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para>The third example shows three items of note: <itemizedlist>
- <listitem>
- <para><function>getLineCount()</function> is a method
- in jEdit's <ulink
- url="../api/org/gjt/sp/jedit/textarea/JEditTextArea.html">JEditTextArea</ulink>
- class. It returns an <classname>int</classname>
- representing the number of lines in the current text
- buffer. We call it on <varname>textArea</varname>,
- the pre-defined, current <ulink
- url="../api/org/gjt/sp/jedit/textarea/JEditTextArea.html">JEditTextArea</ulink>
- object.</para>
- </listitem>
-
- <listitem>
- <para>The use of the <function>+</function> operator
- (which can be chained, as here) appends objects and
- string literals to return a single, concatenated
- <classname>String</classname>.</para>
- </listitem>
- </itemizedlist></para>
- </listitem>
- </itemizedlist>
- </section>
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="macro-basics">
+ <title>Macro Basics</title>
+ <!-- jEdit 4.0 Macro Guide, (C) 2001, 2002 John Gellene -->
+ <!-- jEdit buffer-local properties: -->
+ <!-- :indentSize=1:noTabs=yes:maxLineLen=72:tabSize=2: -->
+ <!-- :xml.root=users-guide.xml: -->
+ <!-- This file cover the introductory section of the macro guide -->
+ <!-- $Id: macro-basics.xml 16181 2009-09-08 19:26:57Z ezust $ -->
+
+ <section id="beanshell-intro">
+ <title>Introducing BeanShell</title>
+
+ <para>Here is how BeanShell's author, Pat Niemeyer, describes his
+ creation:</para>
+
+ <blockquote>
+ <para><quote>BeanShell is a small, free, embeddable, Java source
+ interpreter with object scripting language features, written in
+ Java. BeanShell executes standard Java statements and expressions,
+ in addition to obvious scripting commands and syntax. BeanShell
+ supports scripted objects as simple method closures like those in
+ Perl and JavaScript.</quote></para>
+ </blockquote>
+
+ <para>You do not have to know anything about Java to begin writing your
+ own jEdit macros. But if you know how to program in Java, you already
+ know how to write BeanShell scripts. The major strength of using
+ BeanShell with a program written in Java is that it allows the user to
+ customize the program's behavior using the same interfaces designed and
+ used by the program itself. BeanShell can turn a well-designed
+ application into a powerful, extensible toolkit.</para>
+
+ <para>This guide focuses on using BeanShell in macros. If you are
+ interested in learning more about BeanShell generally, consult the
+ <ulink url="http://www.beanshell.org">BeanShell web site</ulink>.
+ Information on how to run and organize macros, whether included with the
+ jEdit installation or written by you, can be found in <xref
+ linkend="using-macros" />.</para>
+ </section>
+
+ <section id="single-macros">
+ <title>Single Execution Macros</title>
+
+ <para>As noted in <xref linkend="organizing-macros" />, you can save a
+ BeanShell script of any length as a text file with the
+ <filename>.bsh</filename> extension and run it from the
+ <guimenu>Macros</guimenu> menu. There are three other ways jEdit lets
+ you use BeanShell quickly, without saving a script to storage, on a
+ <quote>one time only</quote> basis. You will find them in the
+ <guimenu>Utilities</guimenu> menu.</para>
+
+ <para><guimenu>Utilities</guimenu>><guisubmenu>BeanShell</guisubmenu>><guimenuitem>Evaluate
+ BeanShell Expression</guimenuitem> displays a text input dialog that
+ asks you to type a single line of BeanShell commands. You can type more
+ than one BeanShell statement so long as each of them ends with a
+ semicolon. If BeanShell successfully interprets your input, a message
+ box will appear with the return value of the last statement.</para>
+
+ <para><guimenu>Utilities</guimenu>><guisubmenu>BeanShell</guisubmenu>><guimenuitem>Evaluate
+ For Selected Lines</guimenuitem> displays a text input dialog that asks
+ you to type a single line of BeanShell commands. The commands are
+ evaluated for each line of the selection. In addition to the standard
+ set of variables described in <xref linkend="predefined-variables" />,
+ this command defines the following:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><varname>line</varname> - the line number, from the start
+ of the buffer. The first line is numbered 0.</para>
+ </listitem>
+
+ <listitem>
+ <para><varname>index</varname> - the line number, from the start
+ of the selection. The first line is numbered 0.</para>
+ </listitem>
+
+ <listitem>
+ <para><varname>text</varname> - the text of the line.</para>
+ </listitem>
+ </itemizedlist>
+
+ <informalexample>
+ <para>Try typing an expression like <userinput>(line + 1) + ": " +
+ text</userinput> in the <guimenuitem>Evaluate For Selected
+ Lines</guimenuitem> dialog box. This will add a line number to each
+ selected line beginning with the number
+ <userinput>1</userinput>.</para>
+ </informalexample>
+
+ <para>The BeanShell expression you enter will be evaluated and
+ substituted in place of the entire text of a selected line. If you want
+ to leave the line's current text as an element of the modified line, you
+ must include the defined variable <userinput>text</userinput> as part of
+ the BeanShell expression that you enter.</para>
+
+ <para><guimenu>Utilities</guimenu>><guisubmenu>BeanShell</guisubmenu>><guimenuitem>Evaluate
+ Selection</guimenuitem> evaluates the selected text as a BeanShell
+ script and replaces it with the return value of the statement.</para>
+
+ <para>Using <guimenuitem>Evaluate Selection</guimenuitem> is an easy way
+ to do arithmetic calculations inline while editing. BeanShell uses
+ numbers and arithmetic operations in an ordinary, intuitive way.</para>
+
+ <informalexample>
+ <para>Try typing an expression like
+ <userinput>(3745*856)+74</userinput> in the buffer, select it, and
+ choose
+ <guimenu>Utilities</guimenu>><guisubmenu>BeanShell</guisubmenu>><guimenuitem>Evaluate
+ Selection</guimenuitem>. The selected text will be replaced by the
+ answer, <userinput>3205794</userinput>. <!-- Irrelevant? --> <!-- Since this is a text file
+ and not a spreadsheet, the original values that BeanShell evaluated are
+ not retained or saved as part of the buffer's contents. --></para>
+ </informalexample>
+
+ <sidebar>
+ <title>Console plugin</title>
+
+ <para>You can also do the same thing using the BeanShell interpreter
+ option of the <application>Console</application> plugin.</para>
+ </sidebar>
+ </section>
+
+ <section id="first-example">
+ <title>The Mandatory First Example</title>
+
+ <informalexample>
+ <!-- <title>A first one-line macro</title> -->
+
+ <programlisting>Macros.message(view, "Hello world!");</programlisting>
+ </informalexample>
+
+ <para>Running this one line script causes jEdit to display a message box
+ (more precisely, a <classname>JOptionPane</classname> object) with the
+ traditional beginner's message and an <guilabel>OK</guilabel> button.
+ Let's see what is happening here.</para>
+
+ <para>This statement calls a static method (or function) named
+ <function>message</function> in jEdit's <ulink
+ url="../api/org/gjt/sp/jedit/Macros.html">Macros</ulink> class. If you
+ don't know anything about classes or static methods or Java (or C++,
+ which employs the same concept), you will need to gain some
+ understanding of a few terms. Obviously this is not the place for
+ academic precision, but if you are entirely new to object-oriented
+ programming, here are a few skeleton ideas to help you with
+ BeanShell.</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>An <glossterm>object</glossterm> is a collection of data
+ that can be initialized, accessed and manipulated in certain
+ defined ways.</para>
+ </listitem>
+
+ <listitem>
+ <para>A <glossterm>class</glossterm> is a specification of what
+ data an object contains and what methods can be used to work
+ with the data. A Java application consists of one or more
+ classes (in the case of jEdit ,over 600 classes) written by the
+ programmer that defines the application's behavior. A BeanShell
+ macro uses these classes, along with built-in classes that are
+ supplied with the Java platform, to define its own
+ behavior.</para>
+ </listitem>
+
+ <listitem>
+ <para>A <glossterm>subclass</glossterm> (or child class) is a
+ class which uses (or <quote>inherits</quote>) the data and
+ methods of its parent class along with additions or
+ modifications that alter the subclass's behavior. Classes are
+ typically organized in hierarchies of parent and child classes
+ to organize program code, to define common behavior in shared
+ parent class code, and to specify the types of similar behavior
+ that child classes will perform in their own specific
+ ways.</para>
+ </listitem>
+
+ <listitem>
+ <para>A <glossterm>method</glossterm> (or function) is a
+ procedure that works with data in a particular object, other
+ data (including other objects) supplied as
+ <glossterm>parameters</glossterm>, or both. Methods typically
+ are applied to a particular object which is an
+ <glossterm>instance</glossterm> of the class to which the method
+ belongs.</para>
+ </listitem>
+
+ <listitem>
+ <para>A <glossterm>static method</glossterm> differs from other
+ methods in that it does not deal with the data in a particular
+ object but is included within a class for the sake of
+ convenience.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>Java has a rich set of classes defined as part of the Java
+ platform. Like all Java applications, jEdit is organized as a set of
+ classes that are themselves derived from the Java platform's classes. We
+ will refer to <firstterm>Java classes</firstterm> and <firstterm>jEdit
+ classes</firstterm> to make this distinction. Some of jEdit's classes
+ (such as those dealing with regular expressions and XML) are derived
+ from or make use of classes in other open-source Java packages. Except
+ for BeanShell itself, we won't be discussing them in this guide.</para>
+
+ <para>In our one line script, the static method
+ <function>Macros.message()</function> has two parameters because that is
+ the way the method is defined in the <ulink
+ url="../api/org/gjt/sp/jedit/Macros.html">Macros</ulink> class. You must
+ specify both parameters when you call the function. The first parameter,
+ <parameter>view</parameter>, is a variable naming the current, active
+ <ulink url="../api/org/gjt/sp/jedit/View.html">View</ulink> object.
+ Information about pre-defined variables can be found in <xref
+ linkend="predefined-variables" />.</para>
+
+ <para>The second parameter, which appears to be quoted text, is a
+ <glossterm>string literal</glossterm> - a sequence of characters of
+ fixed length and content. Behind the scenes, BeanShell and Java take
+ this string literal and use it to create a <classname>String</classname>
+ object. Normally, if you want to create an object in Java or BeanShell,
+ you must construct the object using the <function>new</function> keyword
+ and a <firstterm>constructor</firstterm> method that is part of the
+ object's class. We'll show an example of that later. However, both Java
+ and BeanShell let you use a string literal anytime a method's parameter
+ calls for a <classname>String</classname>.</para>
+
+ <para>If you are a Java programmer, you might wonder about a few things
+ missing from this one line program. There is no class definition, for
+ example. You can think of a BeanShell script as an implicit definition
+ of a <function>main()</function> method in an anonymous class. That is
+ in fact how BeanShell is implemented; the class is derived from a
+ BeanShell class called <ulink url="../api/bsh/XThis.html">XThis</ulink>.
+ If you don't find that helpful, just think of a script as one or more
+ blocks of procedural statements conforming to Java syntax rules. You
+ will also get along fine (for the most part) with C or C++ syntax if you
+ leave out anything to do with pointers or memory management - Java and
+ BeanShell do not have pointers and deal with memory management
+ automatically.</para>
+
+ <para>Another missing item from a Java perspective is a
+ <function>package</function> statement. In Java, such a statement is
+ used to bundle together a number of files so that their classes become
+ visible to one another. Packages are not part of BeanShell, and you
+ don't need to know anything about them to write BeanShell macros.</para>
+
+ <para>Finally, there are no <function>import</function> statements in
+ this script. In Java, an <function>import</function> statement makes
+ public classes from other packages visible within the file in which the
+ statement occurs without having to specify a fully qualified class name.
+ Without an import statement or a fully qualified name, Java cannot
+ identify most classes using a single name as an identifier.</para>
+
+ <para>jEdit automatically imports a number of commonly-used packages
+ into the namespace of every BeanShell script. Because of this, the
+ script output of a recorded macro does not contain
+ <function>import</function> statements. For the same reason, most
+ BeanShell scripts you write will not require <function>import</function>
+ statements.</para>
+
+ <para>Java requires <literal>import</literal> statement to be located at
+ the beginning of a source file. BeanShell allows you to place
+ <literal>import</literal> statements anywhere in a script, including
+ inside a block of statements. The <literal>import</literal> statement
+ will cover all names used following the statement in the enclosing
+ block.</para>
+
+ <para>If you try to use a class that is not imported without its
+ fully-qualified name, the BeanShell interpreter will complain with an
+ error message relating to the offending line of code.</para>
+
+ <sidebar>
+ <para>Here is the full list of packages automatically imported by
+ jEdit:</para>
+
+ <programlisting>java.awt
+java.awt.event
+java.net
+java.util
+java.io
+java.lang
+javax.swing
+javax.swing.event
+org.gjt.sp.jedit
+org.gjt.sp.jedit.browser
+org.gjt.sp.jedit.buffer
+org.gjt.sp.jedit.gui
+org.gjt.sp.jedit.help
+org.gjt.sp.jedit.io
+org.gjt.sp.jedit.msg
+org.gjt.sp.jedit.options
+org.gjt.sp.jedit.pluginmgr
+org.gjt.sp.jedit.print
+org.gjt.sp.jedit.search
+org.gjt.sp.jedit.syntax
+org.gjt.sp.jedit.textarea
+org.gjt.sp.util</programlisting>
+ </sidebar>
+ </section>
+
+ <section id="predefined-variables">
+ <title>Predefined Variables in BeanShell</title>
+
+ <para>The following variables are always available for use in BeanShell
+ scripts:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><varname>buffer</varname> - a <ulink
+ url="../api/org/gjt/sp/jedit/Buffer.html">Buffer</ulink> object
+ represents the contents of the currently visible open text
+ file.</para>
+ </listitem>
+
+ <listitem>
+ <para><varname>view</varname> - A <ulink
+ url="../api/org/gjt/sp/jedit/View.html">View</ulink> represents
+ the current top-level editor window, extending Java's
+ <classname>JFrame</classname> class, that contains the various
+ visible components of the program, including the text area, menu
+ bar, toolbar, and any docked windows.</para>
+
+ <para>This variable has the same value as the return value
+ of:</para>
+
+ <programlisting>jEdit.getActiveView()</programlisting>
+ </listitem>
+
+ <listitem>
+ <para><varname>editPane</varname> - an <ulink
+ url="../api/org/gjt/sp/jedit/EditPane.html">EditPane</ulink>
+ object contains a text area and buffer switcher. A view can be
+ split to display edit panes. Among other things, the <ulink
+ url="../api/org/gjt/sp/jedit/EditPane.html">EditPane</ulink>
+ class contains methods for selecting the buffer to edit.</para>
+
+ <para>Most of the time your macros will manipulate the
+ <varname>buffer</varname> or the <varname>textArea</varname>.
+ Sometimes you will need to use <varname>view</varname> as a
+ parameter in a method call. You will probably only need to use
+ <varname>editPane</varname> if your macros work with split
+ views.</para>
+
+ <para>This variable has the same value as the return value
+ of:</para>
+
+ <programlisting>view.getEditPane()</programlisting>
+ </listitem>
+
+ <listitem>
+ <para><varname>textArea</varname> - a <ulink
+ url="../api/org/gjt/sp/jedit/textarea/JEditTextArea.html">JEditTextArea</ulink>
+ is the visible component that displays the current
+ buffer.</para>
+
+ <para>This variable has the same value as the return value
+ of:</para>
+
+ <programlisting>editPane.getTextArea()</programlisting>
+ </listitem>
+
+ <listitem>
+ <para><varname>wm</varname> - a <ulink
+ url="../api/org/gjt/sp/jedit/gui/DockableWindowManager.html">DockableWindowManager</ulink>
+ is the visible component that manages dockable windows in the
+ current view. This class is discussed in detail in <xref
+ linkend="writing-plugins-part" />. This object is useful for
+ writing macros that interface with, open, or close plugin
+ windows.</para>
+
+ <para>This variable has the same value the return value
+ of:</para>
+
+ <programlisting>view.getDockableWindowManager()</programlisting>
+ </listitem>
+
+ <listitem>
+ <para><varname>scriptPath</varname> - set to the full path of
+ the script currently being executed.</para>
+ </listitem>
+
+ <listitem>
+ <para><varname>scriptPath</varname> - set to the full path of
+ the script currently being executed.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>Note that these variables are set at the beginning of macro
+ execution. If the macro switches views, buffers or edit panes, the
+ variable values will be out of date. In that case, you can use the
+ equivalent method calls.</para>
+ </section>
+
+ <section id="helpful-methods">
+ <title>Helpful Methods in the Macros Class</title>
+
+ <para>Including <function>message()</function>, there are five static
+ methods in the <ulink
+ url="../api/org/gjt/sp/jedit/Macros.html">Macros</ulink> class that
+ allow you to converse easily with your macros. They all encapsulate
+ calls to methods of the Java platform's
+ <classname>JOptionPane</classname> class.</para>
+
+ <itemizedlist>
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>public static void
+ <function>message</function></funcdef>
+
+ <paramdef>Component
+ <parameter>comp</parameter></paramdef>
+
+ <paramdef>String
+ <parameter>message</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>public static void
+ <function>error</function></funcdef>
+
+ <paramdef>Component
+ <parameter>comp</parameter></paramdef>
+
+ <paramdef>String
+ <parameter>message</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>public static String
+ <function>input</function></funcdef>
+
+ <paramdef>Component
+ <parameter>comp</parameter></paramdef>
+
+ <paramdef>String
+ <parameter>prompt</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>public static String
+ <function>input</function></funcdef>
+
+ <paramdef>Component
+ <parameter>comp</parameter></paramdef>
+
+ <paramdef>String
+ <parameter>prompt</parameter></paramdef>
+
+ <paramdef>String
+ <parameter>defaultValue</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+ </listitem>
+
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>public static int
+ <function>confirm</function></funcdef>
+
+ <paramdef>Component
+ <parameter>comp</parameter></paramdef>
+
+ <paramdef>String
+ <parameter>prompt</parameter></paramdef>
+
+ <paramdef>int <parameter>buttons</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+ </listitem>
+ </itemizedlist>
+
+ <para>The format of these four <glossterm>declarations</glossterm>
+ provides a concise reference to the way in which the methods may be
+ used. The keyword <function>public</function> means that the method can
+ be used outside the <ulink
+ url="../api/org/gjt/sp/jedit/Macros.html">Macros</ulink> class. The
+ alternatives are <function>private</function> and
+ <function>protected</function>. For purposes of BeanShell, you just have
+ to know that BeanShell can only use public methods of other Java
+ classes. The keyword <function>static</function> we have already
+ discussed. It means that the method does not operate on a particular
+ object. You call a static function using the name of the class (like
+ <ulink url="../api/org/gjt/sp/jedit/Macros.html">Macros</ulink>) rather
+ than the name of a particular object (like <varname>view</varname>). The
+ third word is the type of the value returned by the method. The keyword
+ <function>void</function> is Java's way of saying the the method does
+ not have a return value.</para>
+
+ <para>The <function>error()</function> method works just like
+ <function>message()</function> but displays an error icon in the message
+ box. The <function>input()</function> method furnishes a text field for
+ input, an <guilabel>OK</guilabel> button and a
+ <guilabel>Cancel</guilabel> button. If <guilabel>Cancel</guilabel> is
+ pressed, the method returns <constant>null</constant>. If
+ <guilabel>OK</guilabel> is pressed, a <classname>String</classname>
+ containing the contents of the text field is returned. Note that there
+ are two forms of the <function>input()</function> method; the first form
+ with two parameters displays an empty input field, the other forms lets
+ you specify an initial, default input value.</para>
+
+ <para>For those without Java experience, it is important to know that
+ <constant>null</constant> is <emphasis>not</emphasis> the same as an
+ empty, <quote>zero-length</quote> <classname>String</classname>. It is
+ Java's way of saying that there is no object associated with this
+ variable. Whenever you seek to use a return value from
+ <function>input()</function> in your macro, you should test it to see if
+ it is <constant>null</constant>. In most cases, you will want to exit
+ gracefully from the script with a <function>return</function> statement,
+ because the presence of a null value for an input variable usually means
+ that the user intended to cancel macro execution. BeanShell will
+ complain if you call any methods on a <constant>null</constant>
+ object.</para>
+
+ <para>The <function>confirm()</function> method in the <ulink
+ url="../api/org/gjt/sp/jedit/Macros.html">Macros</ulink> class is a
+ little more complex. The <varname>buttons</varname> parameter has an
+ <classname>int</classname> type, and the usual way to supply a value is
+ to use one of the predefined values taken from Java's
+ <classname>JOptionPane</classname> class. You can choose among
+ <constant>JOptionPane.YES_NO_OPTION</constant>,
+ <constant>JOptionPane.YES_NO_CANCEL_OPTION</constant>, or
+ <constant>JOptionPane.OK_CANCEL_OPTION</constant>. The return value of
+ the method is also an <classname>int</classname>, and should be tested
+ against the value of other predefined constants:
+ <constant>JOptionPane.YES_OPTION</constant>,
+ <constant>JOptionPane.NO_OPTION</constant>,
+ <constant>JOptionPane.OK_OPTION</constant> or
+ <constant>JOptionPane.CANCEL_OPTION</constant>.</para>
+
+ <para>We've looked at using <function>Macros.message()</function>. To
+ use the other methods, you would write something like the
+ following:</para>
+
+ <informalexample>
+ <!-- <title>Using <function>Macros.error()</function> and
+ <function>Macros.input()</function></title> -->
+
+ <programlisting>Macros.error(view, "Goodbye, cruel world!");
+
+String result = Macros.input(view, "Type something here.");
+
+String result = Macros.input(view, "When were you born?",
+ "I don't remember, I was very young at the time");
+
+int result = Macros.confirm(view, "Do you really want to learn"
+ + " about BeanShell?",JOptionPane.YES_NO_OPTION);
+ </programlisting>
+ </informalexample>
+
+ <para>In the last three examples, placing the word
+ <classname>String</classname> or <classname>int</classname> before the
+ variable name <varname>result</varname> tells BeanShell that the
+ variable refers to an integer or a <classname>String</classname> object,
+ even before a particular value is assigned to the variable. In
+ BeanShell, this <glossterm>declaration</glossterm> of the
+ <glossterm>type</glossterm> of <varname>result</varname> is not
+ necessary; BeanShell can figure it out when the macro runs. This can be
+ helpful if you are not comfortable with specifying types and classes;
+ just use your variables and let BeanShell worry about it.</para>
+
+ <para>Note that macros are not limited to using these methods for
+ presenting a user interface. In fact, full-blown user interfaces using
+ the Java Swing APIs are also possible, and will be covered later on in
+ <xref linkend="dialog-macro" />.</para>
+ </section>
+
+ <section id="dynamic-typing">
+ <title>BeanShell Dynamic Typing</title>
+
+ <para>Without an explicit <glossterm>type declaration</glossterm> like
+ <classname>String</classname> <varname>result</varname>, BeanShell
+ variables can change their type at runtime depending on the object or
+ data assigned to it. This dynamic typing allows you to write code like
+ this (if you really wanted to):</para>
+
+ <informalexample>
+ <!-- <title>Dynamic typing of variables</title> -->
+
+ <programlisting>// note: no type declaration
+result = Macros.input(view, <quote>Type something here.</quote>);
+
+// this is our predefined, current View
+result = view;
+
+// this is an <quote>int</quote> (for integer);
+// in Java and BeanShell, int is one of a small number
+// of <quote>primitive</quote> data types which are not classes
+result = 14;</programlisting>
+ </informalexample>
+
+ <para>However, if you first declared <varname>result</varname> to be
+ type <classname>String</classname> and and then tried these
+ reassignments, BeanShell would complain. While avoiding explicit type
+ declaration makes writing macro code simpler, using them can act as a
+ check to make sure you are not using the wrong variable type of object
+ at a later point in your script. It also makes it easier (if you are so
+ inclined) to take a BeanShell <quote>prototype</quote> and incorporate
+ it in a Java program.</para>
+
+ <para>One last thing before we bury our first macro. The double slashes
+ in the examples just above signify that everything following them on
+ that line should be ignored by BeanShell as a comment. As in Java and
+ C/C++, you can also embed comments in your BeanShell code by setting
+ them off with pairs of <userinput>/* */</userinput>, as in the following
+ example:</para>
+
+ <informalexample>
+ <programlisting>/* This is a long comment that covers several lines
+and will be totally ignored by BeanShell regardless of how
+many lines it covers */</programlisting>
+ </informalexample>
+ </section>
+
+ <section id="something-useful">
+ <title>Now For Something Useful</title>
+
+ <para>Here is a macro that inserts the path of the current buffer in the
+ text:</para>
+
+ <informalexample>
+ <!-- <title>Insert buffer path in text</title> -->
+
+ <programlisting>String newText = buffer.getPath();
+textArea.setSelectedText(newText);</programlisting>
+ </informalexample>
+
+ <para>Unlike in our first macro example, here we are calling class
+ methods on particular objects. First, we call
+ <function>getPath()</function> on the current <ulink
+ url="../api/org/gjt/sp/jedit/Buffer.html">Buffer</ulink> object to get
+ the full path of the text file currently being edited. Next, we call
+ <function>setSelectedText()</function> on the current text display
+ component, specifying the text to be inserted as a parameter.</para>
+
+ <para>In precise terms, the <function>setSelectedText()</function>
+ method substitutes the contents of the <classname>String</classname>
+ parameter for a range of selected text that includes the current caret
+ position. If no text is selected at the caret position, the effect of
+ this operation is simply to insert the new text at that position.</para>
+
+ <para>Here's a few alternatives to the full file path that you could use
+ to insert various useful things:</para>
+
+ <informalexample>
+ <!-- <title>Items to use with
+ <function>setSelectedText()</function></title> -->
+
+ <programlisting>// the file name (without full path)
+String newText = buffer.getName();
+
+// today's date
+import java.text.DateFormat;
+
+String newText = DateFormat.getDateInstance()
+ .format(new Date());
+
+// a line count for the current buffer
+String newText = "This file contains "
+ + textArea.getLineCount() + " lines.";</programlisting>
+ </informalexample>
+
+ <para>Here are brief comments on each:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>In the first, the call to <function>getName()</function>
+ invokes another method of the <ulink
+ url="../api/org/gjt/sp/jedit/Buffer.html">Buffer</ulink>
+ class.</para>
+ </listitem>
+
+ <listitem>
+ <para>The syntax of the second example chains the results of
+ several methods. You could write it this way:</para>
+
+ <programlisting>import java.text.DateFormat;
+Date d = new Date();
+DateFormat df = DateFormat.getDateInstance();
+String result = df.format(d);
+</programlisting>
+
+ <para>Taking the pieces in order:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>A Java <classname>Date</classname> object is
+ created using the <function>new</function> keyword. The
+ empty parenthesis after <classname>Date</classname>
+ signify a call on the <glossterm> constructor
+ method</glossterm> of <classname>Date</classname> having
+ no parameters; here, a <classname>Date</classname> is
+ created representing the current date and time.</para>
+ </listitem>
+
+ <listitem>
+ <para><function>DateFormat.getDateInstance()</function>
+ is a static method that creates and returns a
+ <classname>DateFormat</classname> object. As the name
+ implies, <classname>DateFormat</classname> is a Java
+ class that takes <classname>Date</classname> objects and
+ produces readable text. The method
+ <function>getDateInstance()</function> returns a
+ <classname>DateFormat</classname> object that parses and
+ formats dates. It will use the default
+ <glossterm>locale</glossterm> or text format specified
+ in the user's Java installation.</para>
+ </listitem>
+
+ <listitem>
+ <para>Finally,
+ <classname>DateFormat.format()</classname> is called on
+ the new <classname>DateFormat</classname> object using
+ the <classname>Date</classname> object as a parameter.
+ The result is a <classname>String</classname> containing
+ the date in the default locale.</para>
+ </listitem>
+
+ <listitem>
+ <para>Note that the <classname>Date</classname> class is
+ contained in the <literal>java.util</literal> package,
+ so an explicit import statement is not required.
+ However, <classname>DateFormat</classname> is part of
+ the <literal>java.text</literal> package, which is not
+ automatically imported, so an explicit
+ <function>import</function> statement must be
+ used.</para>
+ </listitem>
+ </itemizedlist>
+ </listitem>
+
+ <listitem>
+ <para>The third example shows three items of note: <itemizedlist>
+ <listitem>
+ <para><function>getLineCount()</function> is a method
+ in jEdit's <ulink
+ url="../api/org/gjt/sp/jedit/textarea/JEditTextArea.html">JEditTextArea</ulink>
+ class. It returns an <classname>int</classname>
+ representing the number of lines in the current text
+ buffer. We call it on <varname>textArea</varname>,
+ the pre-defined, current <ulink
+ url="../api/org/gjt/sp/jedit/textarea/JEditTextArea.html">JEditTextArea</ulink>
+ object.</para>
+ </listitem>
+
+ <listitem>
+ <para>The use of the <function>+</function> operator
+ (which can be chained, as here) appends objects and
+ string literals to return a single, concatenated
+ <classname>String</classname>.</para>
+ </listitem>
+ </itemizedlist></para>
+ </listitem>
+ </itemizedlist>
+ </section>
</chapter>
\ No newline at end of file
diff --git a/jEdit/doc/users-guide/macro-index.xml b/jEdit/doc/users-guide/macro-index.xml
index 54c3640..57d0a68 100644
--- a/jEdit/doc/users-guide/macro-index.xml
+++ b/jEdit/doc/users-guide/macro-index.xml
@@ -1,692 +1,802 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<appendix id="macro-index">
- <title>Macros Included With jEdit</title>
- <!-- jEdit 4.0 Macro Guide, (C) 2001 John Gellene -->
- <!-- jEdit buffer-local properties: -->
- <!-- :indentSize=2:noTabs=yes:maxLineLen=80:tabSize=2: -->
- <!-- :xml.root=users-guide.xml: -->
- <!-- covers index to installed macro set -->
-
- <para>jEdit comes with a large number of sample macros that perform a
- variety of tasks. The following index provides short descriptions of each
- macro, in some cases accompanied by usage notes.</para>
-
- <para>In addition to the macros included with jEdit, a very large collection
- of user-contributed macros is available in the <quote>Downloads</quote>
- section of the <ulink
- url="http://community.jedit.org">community.jedit.org</ulink> web site. There
- are detailed descriptions for each macro as well as a search
- facility.</para>
-
- <section id="macros-c" >
- <title>C/C++ macros </title>
- <para> These macros are useful for C/C++ programming. </para>
- <itemizedlist>
- <listitem><para> <filename>Include_Guard.bsh</filename> </para>
- <para> Inserts conditional preprocessor directives around a header
- file, to prevent it from being included multiple times. </para>
- <para>The name of the generated preprocessor macro is based on the
- buffer's name. </para>
- </listitem>
-
- <listitem><para><filename> Toggle_Header_Source</filename></para>
- <para> Toggles between the header and the implementation file. Works for .c, .cxx, and .cpp extensions. </para>
- </listitem>
- </itemizedlist>
- </section>
-
-
- <section id="macros-clipboard">
- <title>Clipboard Macros</title>
-
- <para>These macros copy or cut text to the clipboard.</para>
-
- <itemizedlist>
- <listitem>
- <para><filename>Copy_Lines_Containing.bsh</filename></para>
-
- <para>Copies all lines from the current buffer, containing a
- user-supplied string, to the clipboard.</para>
- </listitem>
-
- <listitem>
- <para><filename>Cut_Lines_Containing.bsh</filename></para>
-
- <para>Cuts all lines from the current buffer, containing a
- user-supplied string, to the clipboard.</para>
- </listitem>
-
- <listitem>
- <para><filename>Copy_Selection_or_Line.bsh</filename></para>
-
- <para>If no text is selected, the current line is copied to the
- clipboard, otherwise the selected text is copied to the
- clipboard. Some editors have this has the default copy behavior.
- To achieve the same effect in jEdit, bind this macro to
- <keycap>C+c</keycap> in the <guibutton>Shortcuts</guibutton>
- pane of the <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box.</para>
- </listitem>
-
- <listitem>
- <para><filename>Cut_Selection_or_Line.bsh</filename></para>
-
- <para>If no text is selected, the current line is cut to the
- clipboard, otherwise the selected text is cut to the clipboard.
- Some editors have this has the default cut behavior. To achieve
- the same effect in jEdit, bind this macro to
- <keycap>C+x</keycap> in the <guibutton>Shortcuts</guibutton>
- pane of the <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box.</para>
- </listitem>
-
- <listitem>
- <para><filename>Copy_Visible_Lines.bsh</filename></para>
-
- <para>Copies the visible lines from the current buffer to the
- Clipboard. Lines that are not visible becuase they are folded
- are not copied.</para>
- </listitem>
- </itemizedlist>
- </section>
-
- <section id="macros-editing">
- <title>Editing Macros</title>
-
- <para>These macros automate various text editing tasks.</para>
-
- <itemizedlist>
- <listitem>
- <para><filename>Emacs_Ctrl-K.bsh</filename></para>
- <para>Cuts and appends text, from the cursor to the end of the line, into the copy buffer. </para>
- </listitem>
-
- <listitem>
- <para><filename>Emacs_Next_Line.bsh</filename></para>
-
- <para>Moves the cursor to the next line, centering the current
- line in the middle of the text area if the cursor is at the
- bottom of the text area.</para>
- </listitem>
-
- <listitem>
- <para><filename>Emacs_Previous_Line.bsh</filename></para>
-
- <para>Moves the cursor to the previous line, centering the
- current line in the middle of the text area if the cursor is at
- the top of the text area.</para>
- </listitem>
-
- <listitem>
- <para><filename>Go_to_Column.bsh</filename></para>
-
- <para>Prompts the user for a column position on the current
- line, then moves the caret there.</para>
- </listitem>
-
- <listitem>
- <para><filename>Greedy_Backspace.bsh</filename></para>
-
- <para>If buffer is using soft tabs, this macro will backspace to
- the previous tab stop, if all characters between the caret and
- the tab stop are spaces. In all other cases a single character
- is removed.</para>
- </listitem>
-
- <listitem>
- <para><filename>Greedy_Delete.bsh</filename></para>
-
- <para>If a buffer is using soft tabs, this macro will delete
- tabSize number of spaces, if all the characters between the
- caret and the next tab stop are spaces. In all other cases a
- single character is deleted.</para>
- </listitem>
-
- <listitem>
- <para><filename>Greedy_Left.bsh</filename></para>
-
- <para>If a buffer is using soft tabs, this macro will move the
- caret tabSize spaces to the left, if all the characters between
- the caret and the previous tab stop are all spaces. In all other
- cases, the caret is moved a single character to the left.</para>
- </listitem>
-
- <listitem>
- <para><filename>Greedy_Right.bsh</filename></para>
-
- <para>If a buffer is using soft tabs, this macro will move the
- caret tabSize spaces to the right, if all the characters between
- the caret and the next tab stop are all spaces. In all other
- cases, the caret is moved a single character to the
- right.</para>
- </listitem>
-
- <listitem>
- <para><filename>Keywords_to_Upper_Case.bsh</filename></para>
-
- <para>Converts all keywords in the current buffer to upper
- case.</para>
- </listitem>
-
- <listitem>
- <para><filename>Mode_Switcher.bsh</filename></para>
-
- <para>Displays a modal dialog with the current buffer's mode in
- a text field, allowing one to change the mode by typing in its
- name.</para>
-
- <para><keycap>ENTER</keycap> selects the current mode; if the
- text is not a valid mode, the dialog still dismisses, but a
- warning is logged to the activity log. <keycap>ESACPE</keycap>
- closes the dialog with no further action. <keycap>TAB</keycap>
- attempts to auto-complete the mode name. Pressing
- <keycap>TAB</keycap> repeatedly cycles through the possible
- completions. <keycap>SHIFT-TAB</keycap> cycles through the
- completions in reverse.</para>
- </listitem>
-
- <listitem>
- <para><filename>Move_Line_Down.bsh</filename></para>
-
- <para>Moves the current line down one, with automatic
- indentation.</para>
- </listitem>
-
- <listitem>
- <para><filename>Move_Line_Up.bsh</filename></para>
-
- <para>Moves the current line up one, with automatic
- indentation.</para>
- </listitem>
- </itemizedlist>
- </section>
-
- <section id="macros-files">
- <title>File Management Macros</title>
-
- <para>These macros automate the opening and closing of files.</para>
-
- <itemizedlist>
- <listitem>
- <para><filename>Browse_Directory.bsh</filename></para>
-
- <para>Opens a directory supplied by the user in the file system
- browser.</para>
- </listitem>
-
- <listitem>
- <para><filename>Buffer_Switcher.bsh</filename></para>
-
- <para>Displays a modal dialog listing all open buffers, allowing
- one to switch to and/or close buffers. <keycap>ENTER</keycap>
- switches to a buffer and closes the dialog,
- <keycap>DELETE</keycap> closes a buffer, <keycap>SPACE</keycap>
- switches to a buffer but does not close the dialog.</para>
- </listitem>
-
- <listitem>
- <para><filename>Close_All_Except_Active.bsh</filename></para>
-
- <para>Closes all files except the current buffer.</para>
-
- <para>Prompts the user to save any buffer containing unsaved
- changes.</para>
- </listitem>
-
- <listitem>
- <para><filename>Copy_Path_to_Clipboad.bsh</filename></para>
-
- <para>Copies the current buffer's path to the clipboard.</para>
- </listitem>
-
- <listitem>
- <para><filename>Copy_Name_to_Clipboad.bsh</filename></para>
-
- <para>Copies the current buffer's filename to the
- clipboard.</para>
- </listitem>
-
- <listitem>
- <para><filename>Delete_Current.bsh</filename></para>
-
- <para>Deletes the current buffer's file on disk, but doesn't
- close the buffer.</para>
- </listitem>
-
- <listitem>
- <para><filename>Glob_Close.bsh</filename></para>
-
- <para>Closes all open buffers matching a given glob
- pattern.</para>
- </listitem>
-
- <listitem>
- <para><filename>Insert_Selection.bsh</filename></para>
-
- <para>Assumes the current selection is file path and tries
- replaces the selection with the contents of the file. Does
- nothing if no text is selected or the selection spans multiple
- lines.</para>
- </listitem>
-
- <listitem>
- <para><filename>Next_Dirty_Buffer.bsh</filename></para>
-
- <para>Switches to the next dirty buffer, if there is one.</para>
- </listitem>
-
- <listitem>
- <para><filename>Open_Path.bsh</filename></para>
-
- <para>Opens the file supplied by the user in an input
- dialog.</para>
- </listitem>
-
- <listitem>
- <para><filename>Open_Selection.bsh</filename></para>
-
- <para>Opens the file named by the current buffer's selected
- text.</para>
- </listitem>
-
- <listitem>
- <para><filename>Toggle_ReadOnly.bsh</filename></para>
-
- <para>Toggles a local file's read-only flag. Uses
- platform-specific commands, so it only works on Windows, Unix
- and MacOS X.</para>
- </listitem>
- </itemizedlist>
- </section>
-
- <section id="macros-interface">
- <title>User Interface Macros</title>
-
- <para>Description.</para>
-
- <itemizedlist>
- <listitem>
- <para><filename>Decrease_Font_Size.bsh</filename></para>
-
- <para>Decreases the font size in the gutter and text area by 1
- point.</para>
- </listitem>
-
- <listitem>
- <para><filename>Increase_Font_Size.bsh</filename></para>
-
- <para>Increases the font size in the gutter and text area by 1
- point.</para>
- </listitem>
-
- <listitem>
- <para><filename>Open_Context_Menu.bsh</filename></para>
-
- <para>Opens the text area context menu just below and to the
- right of the caret.</para>
- </listitem>
-
- <listitem>
- <para><filename>Toggle_Bottom_Docking_Area.bsh</filename></para>
-
- <para>Expands or collapses the bottom docking area, depending on
- it's current state.</para>
- </listitem>
-
- <listitem>
- <para><filename>Splitpane_Grow</filename> </para>
- <para> When inside a split EditPane, this macro moves the
- splitter away from the cursor, effectively increasing the size of
- the currently active split pane. </para>
- </listitem>
-
-
- <listitem>
- <para><filename>Toggle_Left_Docking_Area.bsh</filename></para>
-
- <para>Expands or collapses the left docking area, depending on
- it's current state.</para>
- </listitem>
-
- <listitem>
- <para><filename>Toggle_Right_Docking_Area.bsh</filename></para>
-
- <para>Expands or collapses the right docking area, depending on
- it's current state.</para>
- </listitem>
-
- <listitem>
- <para><filename>Toggle_Top_Docking_Area.bsh</filename></para>
-
- <para>Expands or collapses the top docking area, depending on
- it's current state.</para>
- </listitem>
- </itemizedlist>
- </section>
-
- <section id="macros-java">
- <title>Java Code Macros</title>
-
- <para>These macros handle text formatting and generation tasks that are
- particularly useful in writing Java code.</para>
-
- <itemizedlist>
- <listitem>
- <para><filename>Create_Constructor.bsh</filename></para>
-
- <para>Inserts constructor for the class at the current caret
- position.</para>
- </listitem>
-
- <listitem>
- <para><filename>Get_Class_Name.bsh</filename></para>
-
- <para>Inserts a Java class name based upon the buffer's file
- name.</para>
- </listitem>
-
- <listitem>
- <para><filename>Get_Package_Name.bsh</filename></para>
-
- <para>Inserts a plausible Java package name for the current
- buffer.</para>
-
- <para>The macro compares the buffer's path name with the
- elements of the classpath being used by the jEdit session. An
- error message will be displayed if no suitable package name is
- found. This macro will not work if jEdit is being run as a JAR
- file without specifying a classpath; in that case the classpath
- seen by the macro consists solely of the JAR file.</para>
- </listitem>
-
- <listitem>
- <para><filename>Java_File_Save.bsh</filename></para>
-
- <abstract>
- <para>Acts as a wrapper script to the Save As action. If the
- buffer is a new file, it scans the first 250 lines for a
- Java class or interface declaration. On finding one, it
- extracts the appropriate filename to be used in the Save As
- dialog.</para>
- </abstract>
- </listitem>
-
- <listitem>
- <para><filename>Make_Get_and_Set_Methods.bsh</filename></para>
-
- <para>Creates <function>getXXX()</function> or
- <function>setXXX()</function> methods that can be pasted into
- the buffer text.</para>
-
- <para>This macro presents a dialog that will <quote>grab</quote>
- the names of instance variables from the caret line of the
- current buffer and paste a corresponding
- <function>getXXX()</function> or <function>setXXX()</function>
- method to one of two text areas in the dialog. The text can be
- edited in the dialog and then pasted into the current buffer
- using the <guilabel>Insert...</guilabel> buttons. If the caret
- is set to a line containing something other than an instance
- variable, the text grabbing routine is likely to generate
- nonsense.</para>
-
- <para>As explained in the notes accompanying the source code,
- the macro uses a global variable which can be set to configure
- the macro to work with either Java or C++ code. When set for use
- with C++ code, the macro will also write (in commented text)
- definitions of <function>getXXX()</function> or
- <function>setXXX()</function> suitable for inclusion in a header
- file.</para>
- </listitem>
-
- <listitem>
- <para><filename>Preview_Javadoc_of_Buffer.bsh</filename></para>
-
- <para>Create and display API documentation for the current
- buffer.</para>
-
- <para>The macro includes various configuration variables you can
- change; see the comment at the beginning of the macro source for
- details.</para>
- </listitem>
- </itemizedlist>
- </section>
-
- <section id="macros-misc">
- <title>Miscellaneous Macros</title>
-
- <para>While these macros do not fit easily into the other categories,
- they all provide interesting and useful functions.</para>
-
- <itemizedlist>
- <listitem>
- <para><filename>Display_Abbreviations.bsh</filename></para>
-
- <para>Displays the abbreviations registered for each of jEdit's
- editing modes.</para>
-
- <para>The macro provides a read-only view of the abbreviations
- contained in the <quote>Abbreviations</quote> option pane.
- Pressing a letter key will scroll the table to the first entry
- beginning with that letter. A further option is provided to
- write a selected mode's abbreviations or all abbreviations in a
- text buffer for printing as a reference. Notes in the source
- code listing point out some display options that are configured
- by modifying global variables.</para>
- </listitem>
-
- <listitem>
- <para><filename>Display_Actions.bsh</filename></para>
-
- <para>Displays a list of all the actions known to jEdit
- categorised by their action set.</para>
-
- <para>This macro can be a useful reference if you want to use
- the jEdit 4.2 action bar.</para>
- </listitem>
-
- <listitem>
- <para><filename>Display_Character_Code.bsh</filename></para>
-
- <para>Display int and hex values for the character at the caret,
- in the status bar.</para>
- </listitem>
-
- <listitem>
- <para><filename>Display_Shortcuts.bsh</filename></para>
-
- <para>Displays a sorted list of the keyboard shortcuts currently
- in effect.</para>
-
- <para>The macro provides a combined read-only view of command,
- macro and plugin shortcuts. Pressing a letter key will scroll
- the table to the first entry beginning with that letter. A
- further option is provided to write the shortcut assignments in
- a text buffer for printing as a reference. Notes in the source
- code listing point out some display options that are configured
- by modifying global variables.</para>
- </listitem>
-
- <listitem>
- <para><filename>Evaluate_Buffer_in_BeanShell.bsh</filename></para>
-
- <para>Evaluates contents of current buffer as a BeanShell
- script, and opens a new buffer to receive any text
- output.</para>
-
- <para>This is a quick way to test a macro script even before its
- text is saved to a file. Opening a new buffer for output is a
- precaution to prevent the macro from inadvertently erasing or
- overwriting itself. BeanShell scripts that operate on the
- contents of the current buffer will not work meaningfully when
- tested using this macro.</para>
- </listitem>
-
- <listitem>
- <para><filename>Hex_Convert.bsh</filename></para>
-
- <para>Converts byte characters to their hex equivalent, and vice
- versa.</para>
- </listitem>
-
- <listitem>
- <para><filename>HyperSearch_Results_to_Buffer.bsh</filename></para>
-
- <para>Writes HyperSeach results to a new buffer.</para>
- </listitem>
-
-
- <listitem>
- <para><filename>Make_Bug_Report.bsh</filename></para>
-
- <para>Creates a new buffer with installation and error
- information extracted from the activity log.</para>
-
- <para>The macro extracts initial messages written to the
- activity log describing the user's operating system, JDK, jEdit
- version and installed plugins. It then appends the last set of
- error messages written to the activity log. The new text buffer
- can be saved and attached to an email message or a bug report
- made on SourceForge.</para>
- </listitem>
-
- <listitem>
- <para><filename>Run_Script.bsh</filename></para>
-
- <para>Runs script using interpreter based upon buffer's editing
- mode (by default, determined using file extension). You must
- have the appropriate interpreter (such as Perl, Python, or
- Windows Script Host) installed on your system.</para>
- </listitem>
-
- <listitem>
- <para><filename>Show_Threads.bsh</filename></para>
-
- <para>Displays in a tree format all running Java threads of the
- current Java Virtual Machine.</para>
- </listitem>
- </itemizedlist>
- </section>
-
- <section id="macros-properties">
- <title>Property Macros</title>
-
- <para>These macros produce lists or tables containing properties used by
- the Java platform or jEdit itself.</para>
-
- <itemizedlist>
- <listitem>
- <para><filename>Insert_Buffer_Properties.bsh</filename></para>
-
- <para>Inserts buffer-local properties into the current
- buffer.</para>
-
- <para>If the buffer's mode has a line comment defined, or
- comment start and end defined, the inserted properties will be
- commented out.</para>
- </listitem>
-
- <listitem>
- <para><filename>jEdit_Properties.bsh</filename></para>
-
- <para>Writes an unsorted list of jEdit properties in a new
- buffer.</para>
- </listitem>
-
- <listitem>
- <para><filename>Look_and_Feel_Properties.bsh</filename></para>
-
- <para>Writes an unsorted list of the names of Java Look and Feel
- properties in a new buffer.</para>
- </listitem>
-
- <listitem>
- <para><filename>System_Properties.bsh</filename></para>
-
- <para>Writes an unsorted list of all Java system properties in a
- new buffer.</para>
- </listitem>
- </itemizedlist>
- </section>
-
- <section id="macros-text">
- <title>Text Macros</title>
-
- <para>These macros generate various forms of formatted text.</para>
-
- <itemizedlist>
- <listitem>
- <para><filename>Add_Prefix_and_Suffix.bsh</filename></para>
-
- <para>Adds user-supplied <quote>prefix</quote> and
- <quote>suffix</quote> text to each line in a group of selected
- lines.</para>
-
- <para>Text is added after leading whitespace and before trailing
- whitespace. A dialog window receives input and
- <quote>remembers</quote> past entries.</para>
- </listitem>
-
- <listitem>
- <para><filename>Color_Picker.bsh</filename></para>
-
- <para>Displays a color picker and inserts the selected color in
- hexadecimal format, prefixed with a <quote>#</quote>.</para>
- </listitem>
-
- <listitem>
- <para><filename>Duplicate_Line.bsh</filename></para>
-
- <para>Duplicates the line on which the caret lies immediately
- beneath it and moves the caret to the new line.</para>
- </listitem>
-
- <listitem>
- <para><filename>Insert_Date.bsh</filename></para>
-
- <para>Inserts the current date and time in the current
- buffer.</para>
-
- <para>The inserted text includes a representation of the time in
- the <quote>Internet Time</quote> format.</para>
- </listitem>
-
- <listitem>
- <para><filename>Insert_Tag.bsh</filename></para>
-
- <para>Inserts a balanced pair of HTML/SGML/XML markup tags as
- supplied in an input dialog. The tags will surround any selected
- text.</para>
- </listitem>
-
- <listitem>
- <para><filename>Next_Char.bsh</filename></para>
-
- <para>Finds next occurrence of character on current line.</para>
-
- <para>The macro takes the next character typed after macro
- execution as the character being searched. That character is not
- displayed. If the character does not appear in the balance of
- the current line, no action occurs.</para>
-
- <para>This macro illustrates the use of
- <function>InputHandler.readNextChar()</function> as a means of
- obtaining user input. See <xref
- linkend="macro-tips-single-char" />.</para>
- </listitem>
-
- <listitem>
- <para><filename>Reverse_Lines.bsh</filename></para>
-
- <para>Reverses the selected lines or the entire buffer if no
- lines are selected. Does not support Rectangular
- Selections.</para>
- </listitem>
-
- <listitem>
- <para><filename>Single_Space_Buffer.bsh</filename></para>
-
- <para>Removes every second line, if they are all blank.</para>
- </listitem>
- </itemizedlist>
- </section>
-</appendix>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?>
+<appendix id="macro-index">
+ <title>Macros Included With jEdit</title>
+ <!-- jEdit 4.0 Macro Guide, (C) 2001 John Gellene -->
+ <!-- jEdit 4.4 Macro Guide, (C) 2010 jedit-devs -->
+ <!-- jEdit buffer-local properties: -->
+ <!-- :indentSize=2:noTabs=yes:maxLineLen=80:tabSize=2: -->
+ <!-- :xml.root=users-guide.xml: -->
+ <!-- covers index to installed macro set -->
+
+ <para>jEdit comes with a large number of sample macros that perform a
+ variety of tasks. The following index provides short descriptions of each
+ macro, in some cases accompanied by usage notes.</para>
+
+ <para>In addition to the macros included with jEdit, a very large collection
+ of user-contributed macros is available in the <quote>Downloads</quote>
+ section of the <ulink
+ url="http://community.jedit.org">community.jedit.org</ulink> web site. There
+ are detailed descriptions for each macro as well as a search
+ facility.</para>
+
+ <section id="macros-c" >
+ <title>C/C++ macros </title>
+ <para> These macros are useful for C/C++ programming. </para>
+ <itemizedlist>
+ <listitem><para> <filename>Include_Guard.bsh</filename> </para>
+ <para> Inserts conditional preprocessor directives around a header
+ file, to prevent it from being included multiple times. </para>
+ <para>The name of the generated preprocessor macro is based on the
+ buffer's name. </para>
+ </listitem>
+
+ <listitem><para><filename> Toggle_Header_Source</filename></para>
+ <para> Toggles between the header and the implementation file. Works for .c, .cxx, and .cpp extensions. </para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+
+ <section id="macros-clipboard">
+ <title>Clipboard Macros</title>
+
+ <para>These macros copy or cut text to the clipboard.</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><filename>Copy_Lines_Containing.bsh</filename></para>
+
+ <para>Copies all lines from the current buffer, containing a
+ user-supplied string, to the clipboard.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Cut_Lines_Containing.bsh</filename></para>
+
+ <para>Cuts all lines from the current buffer, containing a
+ user-supplied string, to the clipboard.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Copy_Selection_or_Line.bsh</filename></para>
+
+ <para>If no text is selected, the current line is copied to the
+ clipboard, otherwise the selected text is copied to the
+ clipboard. Some editors have this has the default copy behavior.
+ To achieve the same effect in jEdit, bind this macro to
+ <keycap>C+c</keycap> in the <guibutton>Shortcuts</guibutton>
+ pane of the <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Cut_Selection_or_Line.bsh</filename></para>
+
+ <para>If no text is selected, the current line is cut to the
+ clipboard, otherwise the selected text is cut to the clipboard.
+ Some editors have this has the default cut behavior. To achieve
+ the same effect in jEdit, bind this macro to
+ <keycap>C+x</keycap> in the <guibutton>Shortcuts</guibutton>
+ pane of the <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Copy_Visible_Lines.bsh</filename></para>
+
+ <para>Copies the visible lines from the current buffer to the
+ Clipboard. Lines that are not visible becuase they are folded
+ are not copied.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Paste_Indent.bsh</filename></para>
+
+ <para>Pastes the content of the clipboard and indents it.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section id="macros-editing">
+ <title>Editing Macros</title>
+
+ <para>These macros automate various text editing tasks.</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><filename>Duplicate_Lines_Above.bsh</filename></para>
+
+ <para>Duplicates current/selected line(s) upward.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Duplicate_Lines_Below.bsh</filename></para>
+
+ <para>Duplicates current/selected line(s) downward.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Emacs_Ctrl-K.bsh</filename></para>
+
+ <para>Cuts and appends text, from the cursor to the end of the
+ line, into the copy buffer.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Emacs_Next_Line.bsh</filename></para>
+
+ <para>Moves the cursor to the next line, centering the current
+ line in the middle of the text area if the cursor is at the
+ bottom of the text area.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Emacs_Previous_Line.bsh</filename></para>
+
+ <para>Moves the cursor to the previous line, centering the
+ current line in the middle of the text area if the cursor is at
+ the top of the text area.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Go_to_Column.bsh</filename></para>
+
+ <para>Prompts the user for a column position on the current
+ line, then moves the caret there.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Greedy_Backspace.bsh</filename></para>
+
+ <para>If buffer is using soft tabs, this macro will backspace to
+ the previous tab stop, if all characters between the caret and
+ the tab stop are spaces. In all other cases a single character
+ is removed.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Greedy_Delete.bsh</filename></para>
+
+ <para>If a buffer is using soft tabs, this macro will delete
+ tabSize number of spaces, if all the characters between the
+ caret and the next tab stop are spaces. In all other cases a
+ single character is deleted.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Greedy_Left.bsh</filename></para>
+
+ <para>If a buffer is using soft tabs, this macro will move the
+ caret tabSize spaces to the left, if all the characters between
+ the caret and the previous tab stop are all spaces. In all other
+ cases, the caret is moved a single character to the left.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Greedy_Right.bsh</filename></para>
+
+ <para>If a buffer is using soft tabs, this macro will move the
+ caret tabSize spaces to the right, if all the characters between
+ the caret and the next tab stop are all spaces. In all other
+ cases, the caret is moved a single character to the
+ right.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Keywords_to_Upper_Case.bsh</filename></para>
+
+ <para>Converts all keywords in the current buffer to upper
+ case.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Mode_Switcher.bsh</filename></para>
+
+ <para>Displays a modal dialog with the current buffer's mode in
+ a text field, allowing one to change the mode by typing in its
+ name.</para>
+
+ <para><keycap>ENTER</keycap> selects the current mode; if the
+ text is not a valid mode, the dialog still dismisses, but a
+ warning is logged to the activity log. <keycap>ESACPE</keycap>
+ closes the dialog with no further action. <keycap>TAB</keycap>
+ attempts to auto-complete the mode name. Pressing
+ <keycap>TAB</keycap> repeatedly cycles through the possible
+ completions. <keycap>SHIFT-TAB</keycap> cycles through the
+ completions in reverse.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Move_Line_Down.bsh</filename></para>
+
+ <para>Moves the current line down one, with automatic
+ indentation.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Move_Line_Up.bsh</filename></para>
+
+ <para>Moves the current line up one, with automatic
+ indentation.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Open_Line_Above.bsh</filename></para>
+
+ <para>Adds a new blank line before the current/selected line(s).</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Open_Line_Below.bsh</filename></para>
+
+ <para>Adds a new blank line after the current/selected line(s).</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Toggle_Fold.bsh</filename></para>
+
+ <para>Toggles visibility of current fold.</para>
+
+ <para>This is especially useful for fold toggling via keyboard.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section id="macros-files">
+ <title>File Management Macros</title>
+
+ <para>These macros automate the opening and closing of files.</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><filename>Browse_Buffer_Directory.bsh</filename></para>
+
+ <para>Opens a the current buffer's directory in the file system
+ browser.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Browse_Directory.bsh</filename></para>
+
+ <para>Opens a directory supplied by the user in the file system
+ browser.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Buffer_Switcher.bsh</filename></para>
+
+ <para>Displays a modal dialog listing all open buffers, allowing
+ one to switch to and/or close buffers. <keycap>ENTER</keycap>
+ switches to a buffer and closes the dialog,
+ <keycap>DELETE</keycap> closes a buffer, <keycap>SPACE</keycap>
+ switches to a buffer but does not close the dialog.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Close_All_Except_Active.bsh</filename></para>
+
+ <para>Closes all files except the current buffer.</para>
+
+ <para>Prompts the user to save any buffer containing unsaved
+ changes.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Copy_Path_to_Clipboad.bsh</filename></para>
+
+ <para>Copies the current buffer's path to the clipboard.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Copy_Name_to_Clipboad.bsh</filename></para>
+
+ <para>Copies the current buffer's filename to the
+ clipboard.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Duplicate_Buffer.bsh</filename></para>
+
+ <para>Duplicates the current buffer into a new one.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Delete_Current.bsh</filename></para>
+
+ <para>Deletes the current buffer's file on disk, but doesn't
+ close the buffer.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Glob_Close.bsh</filename></para>
+
+ <para>Closes all open buffers matching a given glob
+ pattern.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Insert_Selection.bsh</filename></para>
+
+ <para>Assumes the current selection is file path and tries
+ replaces the selection with the contents of the file. Does
+ nothing if no text is selected or the selection spans multiple
+ lines.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Next_Dirty_Buffer.bsh</filename></para>
+
+ <para>Switches to the next dirty buffer, if there is one.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Open_Path.bsh</filename></para>
+
+ <para>Opens the file supplied by the user in an input
+ dialog.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Open_Selection.bsh</filename></para>
+
+ <para>Opens the file named by the current buffer's selected
+ text.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Send_Buffer_To_Next_Split.bsh</filename></para>
+
+ <para>If bufferset scope is set to EditPane, the current buffer
+ is added to the next Editpane's bufferset.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Toggle_ReadOnly.bsh</filename></para>
+
+ <para>Toggles a local file's read-only flag. Uses
+ platform-specific commands, so it only works on Windows, Unix
+ and MacOS X.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section id="macros-interface">
+ <title>User Interface Macros</title>
+
+ <para>Description.</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><filename>Decrease_Font_Size.bsh</filename></para>
+
+ <para>Decreases the font size in the gutter and text area by 1
+ point.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Increase_Font_Size.bsh</filename></para>
+
+ <para>Increases the font size in the gutter and text area by 1
+ point.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Open_Context_Menu.bsh</filename></para>
+
+ <para>Opens the text area context menu just below and to the
+ right of the caret.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Reset_TextArea.bsh</filename> </para>
+ <para>Performs a split and an unsplit of the current TextArea.
+ Useful for those occasions when your textarea is corrupt
+ (painting the incorrect characters on the screen).</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Splitpane_Grow.bsh</filename> </para>
+ <para>When inside a split EditPane, this macro moves the
+ splitter away from the cursor, effectively increasing the size of
+ the currently active split pane.</para>
+ </listitem>
+
+
+ <listitem>
+ <para><filename>Toggle_Bottom_Docking_Area.bsh</filename></para>
+
+ <para>Expands or collapses the bottom docking area, depending on
+ it's current state.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Toggle_Left_Docking_Area.bsh</filename></para>
+
+ <para>Expands or collapses the left docking area, depending on
+ it's current state.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Toggle_Right_Docking_Area.bsh</filename></para>
+
+ <para>Expands or collapses the right docking area, depending on
+ it's current state.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Toggle_Top_Docking_Area.bsh</filename></para>
+
+ <para>Expands or collapses the top docking area, depending on
+ it's current state.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section id="macros-java">
+ <title>Java Code Macros</title>
+
+ <para>These macros handle text formatting and generation tasks that are
+ particularly useful in writing Java code.</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><filename>Create_Constructor.bsh</filename></para>
+
+ <para>Inserts constructor for the class at the current caret
+ position.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Get_Class_Name.bsh</filename></para>
+
+ <para>Inserts a Java class name based upon the buffer's file
+ name.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Get_Package_Name.bsh</filename></para>
+
+ <para>Inserts a plausible Java package name for the current
+ buffer.</para>
+
+ <para>The macro compares the buffer's path name with the
+ elements of the classpath being used by the jEdit session. An
+ error message will be displayed if no suitable package name is
+ found. This macro will not work if jEdit is being run as a JAR
+ file without specifying a classpath; in that case the classpath
+ seen by the macro consists solely of the JAR file.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Java_File_Save.bsh</filename></para>
+
+ <abstract>
+ <para>Acts as a wrapper script to the Save As action. If the
+ buffer is a new file, it scans the first 250 lines for a
+ Java class or interface declaration. On finding one, it
+ extracts the appropriate filename to be used in the Save As
+ dialog.</para>
+ </abstract>
+ </listitem>
+
+ <listitem>
+ <para><filename>Make_Get_and_Set_Methods.bsh</filename></para>
+
+ <para>Creates <function>getXXX()</function> or
+ <function>setXXX()</function> methods that can be pasted into
+ the buffer text.</para>
+
+ <para>This macro presents a dialog that will <quote>grab</quote>
+ the names of instance variables from the caret line of the
+ current buffer and paste a corresponding
+ <function>getXXX()</function> or <function>setXXX()</function>
+ method to one of two text areas in the dialog. The text can be
+ edited in the dialog and then pasted into the current buffer
+ using the <guilabel>Insert...</guilabel> buttons. If the caret
+ is set to a line containing something other than an instance
+ variable, the text grabbing routine is likely to generate
+ nonsense.</para>
+
+ <para>As explained in the notes accompanying the source code,
+ the macro uses a global variable which can be set to configure
+ the macro to work with either Java or C++ code. When set for use
+ with C++ code, the macro will also write (in commented text)
+ definitions of <function>getXXX()</function> or
+ <function>setXXX()</function> suitable for inclusion in a header
+ file.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Preview_Javadoc_of_Buffer.bsh</filename></para>
+
+ <para>Create and display API documentation for the current
+ buffer.</para>
+
+ <para>The macro includes various configuration variables you can
+ change; see the comment at the beginning of the macro source for
+ details.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section id="macros-misc">
+ <title>Miscellaneous Macros</title>
+
+ <para>While these macros do not fit easily into the other categories,
+ they all provide interesting and useful functions.</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><filename>Buffer_to_HyperSearch_Results.bsh</filename></para>
+
+ <para>Reads HyperSearch results from a buffer that was
+ previously created by the HyperSearch_Results_to_Buffer macro and possibly
+ filtered manually, and imports them into the HyperSearch Results dockable.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Debug_BufferSets.bsh</filename></para>
+
+ <para>Display int and hex values for the character at the caret,
+ in the status bar.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Display_Abbreviations.bsh</filename></para>
+
+ <para>Displays the abbreviations registered for each of jEdit's
+ editing modes.</para>
+
+ <para>The macro provides a read-only view of the abbreviations
+ contained in the <quote>Abbreviations</quote> option pane.
+ Pressing a letter key will scroll the table to the first entry
+ beginning with that letter. A further option is provided to
+ write a selected mode's abbreviations or all abbreviations in a
+ text buffer for printing as a reference. Notes in the source
+ code listing point out some display options that are configured
+ by modifying global variables.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Display_Actions.bsh</filename></para>
+
+ <para>Displays a list of all the actions known to jEdit
+ categorised by their action set.</para>
+
+ <para>This macro can be a useful reference if you want to use
+ the jEdit 4.2 action bar.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Display_Character_Code.bsh</filename></para>
+
+ <para>Display int and hex values for the character at the caret,
+ in the status bar.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Display_Shortcuts.bsh</filename></para>
+
+ <para>Displays a sorted list of the keyboard shortcuts currently
+ in effect.</para>
+
+ <para>The macro provides a combined read-only view of command,
+ macro and plugin shortcuts. Pressing a letter key will scroll
+ the table to the first entry beginning with that letter. A
+ further option is provided to write the shortcut assignments in
+ a text buffer for printing as a reference. Notes in the source
+ code listing point out some display options that are configured
+ by modifying global variables.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Evaluate_Buffer_in_BeanShell.bsh</filename></para>
+
+ <para>Evaluates contents of current buffer as a BeanShell
+ script, and opens a new buffer to receive any text
+ output.</para>
+
+ <para>This is a quick way to test a macro script even before its
+ text is saved to a file. Opening a new buffer for output is a
+ precaution to prevent the macro from inadvertently erasing or
+ overwriting itself. BeanShell scripts that operate on the
+ contents of the current buffer will not work meaningfully when
+ tested using this macro.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Hex_Convert.bsh</filename></para>
+
+ <para>Converts byte characters to their hex equivalent, and vice
+ versa.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>HyperSearch_Results_to_Buffer.bsh</filename></para>
+
+ <para>Writes HyperSeach results to a new buffer.</para>
+
+ <para>This buffer can be re-imported to the HyperSearch Results dockable
+ by the Buffer_to_HyperSearch_Results macro.</para>
+ </listitem>
+
+
+ <listitem>
+ <para><filename>Make_Bug_Report.bsh</filename></para>
+
+ <para>Creates a new buffer with installation and error
+ information extracted from the activity log.</para>
+
+ <para>The macro extracts initial messages written to the
+ activity log describing the user's operating system, JDK, jEdit
+ version and installed plugins. It then appends the last set of
+ error messages written to the activity log. The new text buffer
+ can be saved and attached to an email message or a bug report
+ made on SourceForge.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Run_Script.bsh</filename></para>
+
+ <para>Runs script using interpreter based upon buffer's editing
+ mode (by default, determined using file extension). You must
+ have the appropriate interpreter (such as Perl, Python, or
+ Windows Script Host) installed on your system.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Show_Threads.bsh</filename></para>
+
+ <para>Displays in a tree format all running Java threads of the
+ current Java Virtual Machine.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section id="macros-properties">
+ <title>Property Macros</title>
+
+ <para>These macros produce lists or tables containing properties used by
+ the Java platform or jEdit itself.</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><filename>Create_Plugin_Announcement.bsh</filename></para>
+
+ <para>Creates an announcement for the Plugin Central Submission Tracker
+ based on the plugins *.props and description.html files.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Insert_Buffer_Properties.bsh</filename></para>
+
+ <para>Inserts buffer-local properties into the current
+ buffer.</para>
+
+ <para>If the buffer's mode has a line comment defined, or
+ comment start and end defined, the inserted properties will be
+ commented out.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>jEdit_Properties.bsh</filename></para>
+
+ <para>Writes an unsorted list of jEdit properties in a new
+ buffer.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Look_and_Feel_Properties.bsh</filename></para>
+
+ <para>Writes an unsorted list of the names of Java Look and Feel
+ properties in a new buffer.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>System_Properties.bsh</filename></para>
+
+ <para>Writes an unsorted list of all Java system properties in a
+ new buffer.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section id="macros-text">
+ <title>Text Macros</title>
+
+ <para>These macros generate various forms of formatted text.</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><filename>Add_Prefix_and_Suffix.bsh</filename></para>
+
+ <para>Adds user-supplied <quote>prefix</quote> and
+ <quote>suffix</quote> text to each line in a group of selected
+ lines.</para>
+
+ <para>Text is added after leading whitespace and before trailing
+ whitespace. A dialog window receives input and
+ <quote>remembers</quote> past entries.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Color_Picker.bsh</filename></para>
+
+ <para>Displays a color picker and inserts the selected color in
+ hexadecimal format, prefixed with a <quote>#</quote>.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Compose_Tag.bsh</filename></para>
+
+ <para>The selection is taken as tag name and replaced with a full xml tag.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Duplicate_Line.bsh</filename></para>
+
+ <para>Duplicates the line on which the caret lies immediately
+ beneath it and moves the caret to the new line.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Insert_Date.bsh</filename></para>
+
+ <para>Inserts the current date and time in the current
+ buffer.</para>
+
+ <para>The inserted text includes a representation of the time in
+ the <quote>Internet Time</quote> format.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Insert_Tag.bsh</filename></para>
+
+ <para>Inserts a balanced pair of HTML/SGML/XML markup tags as
+ supplied in an input dialog. The tags will surround any selected
+ text.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Line_Filter.bsh</filename></para>
+
+ <para>Filters lines of the current buffer due to a provided regular expression.
+ The resulting set of lines can be either removed from the buffer or written to a new buffer.</para>
+
+ <para>The filter works on a multiline selection (if there is one) otherwise on the whole buffer.
+ The resulting set of lines includes those lines that either match or not match the regular expression.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Next_Char.bsh</filename></para>
+
+ <para>Finds next occurrence of character on current line.</para>
+
+ <para>The macro takes the next character typed after macro
+ execution as the character being searched. That character is not
+ displayed. If the character does not appear in the balance of
+ the current line, no action occurs.</para>
+
+ <para>This macro illustrates the use of
+ <function>InputHandler.readNextChar()</function> as a means of
+ obtaining user input. See <xref
+ linkend="macro-tips-single-char" />.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Reverse_Lines.bsh</filename></para>
+
+ <para>Reverses the selected lines or the entire buffer if no
+ lines are selected. Does not support Rectangular
+ Selections.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>Single_Space_Buffer.bsh</filename></para>
+
+ <para>Removes every second line, if they are all blank.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+</appendix>
diff --git a/jEdit/doc/users-guide/macro-tips.xml b/jEdit/doc/users-guide/macro-tips.xml
index a5e5737..331978d 100644
--- a/jEdit/doc/users-guide/macro-tips.xml
+++ b/jEdit/doc/users-guide/macro-tips.xml
@@ -1,921 +1,921 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter id="macro-tips">
- <title>Macro Tips and Techniques</title>
-
- <!-- jEdit 4.0 Macro Guide, (C) 2001, 2002 John Gellene -->
-
- <!-- Wed Jun 20 16:56:26 EDT 2001 @914 /Internet Time/ -->
-
- <!-- -->
-
- <!-- jEdit buffer-local properties: -->
-
- <!-- :indentSize=1:noTabs=yes:maxLineLen=0:wrap=soft:tabSize=2: -->
-
- <!-- :xml.root=users-guide.xml: -->
-
- <!-- -->
-
- <!-- This file covers the chapter "Macro tips and techniques" -->
-
- <!-- $Id: macro-tips.xml 16181 2009-09-08 19:26:57Z ezust $
- -->
-
- <section id="macro-tips-input">
- <title>Getting Input for a Macro</title>
-
- <para>The dialog-based macro discussed in <xref
- linkend="dialog-macro" /> reflects a conventional approach to obtaining
- input in a Java program. Nevertheless, it can be too lengthy or tedious
- for someone trying to write a macro quickly. Not every macro needs a
- user interface specified in such detail; some macros require only a
- single keystroke or no input at all. In this section we outline some
- other techniques for obtaining input that will help you write macros
- quickly.</para>
-
- <section id="macro-tips-input-single-line">
- <title>Getting a Single Line of Text</title>
-
- <para>As mentioned earlier in <xref linkend="helpful-methods" />,
- the method <function>Macros.input()</function> offers a convenient
- way to obtain a single line of text input. Here is an example that
- inserts a pair of HTML markup tags specified by the user.</para>
-
- <informalexample>
- <programlisting>// Insert_Tag.bsh
-
-void insertTag()
-{
- caret = textArea.getCaretPosition();
- tag = Macros.input(view, <quote>Enter name of tag:</quote>);
- if( tag == null || tag.length() == 0) return;
- text = textArea.getSelectedText();
- if(text == null) text = <quote></quote>;
- sb = new StringBuffer();
- sb.append(<quote><</quote>).append(tag).append(<quote>></quote>);
- sb.append(text);
- sb.append(<quote></</quote>).append(tag).append(<quote>></quote>);
- textArea.setSelectedText(sb.toString());
- if(text.length() == 0)
- textArea.setCaretPosition(caret + tag.length() + 2);
-}
-
-insertTag();
-
-// end Insert_Tag.bsh</programlisting>
- </informalexample>
-
- <para>Here the call to <function>Macros.input()</function> seeks the
- name of the markup tag. This method sets the message box title to a
- fixed string, <quote>Macro input</quote>, but the specific message
- <guilabel>Enter name of tag</guilabel> provides all the information
- necessary. The return value <varname>tag</varname> must be tested to
- see if it is null. This would occur if the user presses the
- <guilabel>Cancel</guilabel> button or closes the dialog window
- displayed by <function>Macros.input()</function>.</para>
- </section>
-
- <section id="macro-tips-input-multiple-data">
- <title>Getting Multiple Data Items</title>
-
- <para>If more than one item of input is needed, a succession of
- calls to <function>Macros.input()</function> is a possible, but
- awkward approach, because it would not be possible to correct early
- input after the corresponding message box is dismissed. Where more
- is required, but a full dialog layout is either unnecessary or too
- much work, the Java method
- <function>JOptionPane.showConfirmDialog()</function> is available.
- The version to use has the following prototype:</para>
-
- <itemizedlist>
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>public static int
- <function>showConfirmDialog</function></funcdef>
-
- <paramdef>Component
- <parameter>parentComponent</parameter></paramdef>
-
- <paramdef>Object
- <parameter>message</parameter></paramdef>
-
- <paramdef>String
- <parameter>title</parameter></paramdef>
-
- <paramdef>int
- <parameter>optionType</parameter></paramdef>
-
- <paramdef>int
- <parameter>messageType</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
- </listitem>
- </itemizedlist>
-
- <para>The usefulness of this method arises from the fact that the
- <varname>message</varname> parameter can be an object of any Java
- class (since all classes are derived from
- <classname>Object</classname>), or any array of objects. The
- following example shows how this feature can be used.</para>
-
- <informalexample>
- <programlisting>// excerpt from Write_File_Header.bsh
-
-title = <quote>Write file header</quote>;
-
-currentName = buffer.getName();
-
-nameField = new JTextField(currentName);
-authorField = new JTextField(<quote>Your name here</quote>);
-descField = new JTextField(<quote></quote>, 25);
-
-namePanel = new JPanel(new GridLayout(1, 2));
-nameLabel = new JLabel(<quote>Name of file:</quote>, SwingConstants.LEFT);
-saveField = new JCheckBox(<quote>Save file when done</quote>,
- !buffer.isNewFile());
-namePanel.add(nameLabel);
-namePanel.add(saveField);
-
-
-message = new Object[9];
-message[0] = namePanel;
-message[1] = nameField;
-message[2] = Box.createVerticalStrut(10);
-message[3] = <quote>Author's name:</quote>;
-message[4] = authorField;
-message[5] = Box.createVerticalStrut(10);
-message[6] = <quote>Enter description:</quote>;
-message[7] = descField;
-message[8] = Box.createVerticalStrut(5);
-
-if( JOptionPane.OK_OPTION !=
- JOptionPane.showConfirmDialog(view, message, title,
- JOptionPane.OK_CANCEL_OPTION,
- JOptionPane.QUESTION_MESSAGE))
- return null;
-
-// *****remainder of macro script omitted*****
-
-// end excerpt from Write_File_Header.bsh</programlisting>
- </informalexample>
-
- <para>This macro takes several items of user input and produces a
- formatted file header at the beginning of the buffer. The full macro
- is included in the set of macros installed by jEdit. There are a
- number of input features of this excerpt worth noting.</para>
-
- <itemizedlist>
- <listitem>
- <para>The macro uses a total of seven visible components.
- Two of them are created behind the scenes by
- <function>showConfirmDialog()</function>, the rest are made
- by the macro. To arrange them, the script creates an array
- of <classname>Object</classname> objects and assigns
- components to each location in the array. This translates to
- a fixed, top-to-bottom arrangement in the message box
- created by <function>showConfirmDialog()</function>.</para>
- </listitem>
-
- <listitem>
- <para>The macro uses <classname>JTextField</classname>
- objects to obtain most of the input data. The fields
- <varname>nameField</varname> and
- <varname>authorField</varname> are created with constructors
- that take the initial, default text to be displayed in the
- field as a parameter. When the message box is displayed, the
- default text will appear and can be altered or deleted by
- the user.</para>
- </listitem>
-
- <listitem>
- <para>The text field <varname>descField</varname> uses an
- empty string for its initial value. The second parameter in
- its constructor sets the width of the text field component,
- expressed as the number of characters of
- <quote>average</quote> width. When
- <function>showConfirmDialog()</function> prepares the layout
- of the message box, it sets the width wide enough to
- accommodate the designated with of
- <varname>descField</varname>. This technique produces a
- message box and input text fields that are wide enough for
- your data with one line of code.</para>
- </listitem>
-
- <listitem>
- <para>The displayed message box includes a
- <classname>JCheckBox</classname> component that determines
- whether the buffer will be saved to disk immediately after
- the file header is written. To conserve space in the message
- box, we want to display the check box to the right of the
- label <guilabel>Name of file:</guilabel>. To do that, we
- create a <classname>JPanel</classname> object and populate
- it with the label and the checkbox in a left-to-right
- <classname>GridLayout</classname>. The
- <classname>JPanel</classname> containing the two components
- is then added to the beginning of <varname>message</varname>
- array.</para>
- </listitem>
-
- <listitem>
- <para>The two visible components created by
- <function>showConfirmDialog()</function> appear at positions
- 3 and 6 of the <varname>message</varname> array. Only the
- text is required; they are rendered as text labels.</para>
- </listitem>
-
- <listitem>
- <para>There are three invisible components created by
- <function>showConfirmDialog()</function>. Each of them
- involves a call to
- <function>Box.createVerticalStrut()</function>. The
- <classname>Box</classname> class is a sophisticated layout
- class that gives the user great flexibility in sizing and
- positioning components. Here we use a
- <function>static</function> method of the
- <classname>Box</classname> class that produces a vertical
- <glossterm>strut</glossterm>. This is a transparent
- component whose width expands to fill its parent component
- (in this case, the message box). The single parameter
- indicates the height of the strut in pixels. The last call
- to <function>createVerticalStrut()</function> separates the
- description text field from the <guilabel>OK</guilabel> and
- <guilabel>Cancel</guilabel> buttons that are automatically
- added by <function>showConfirmDialog()</function>.</para>
- </listitem>
-
- <listitem>
- <para>Finally, the call to
- <function>showConfirmDialog()</function> uses defined
- constants for the option type and the message type. The
- constants are the same as those used with the
- <function>Macros.confirm()</function> method; see <xref
- linkend="helpful-methods" />. The option type signifies the
- use of <guilabel>OK</guilabel> and
- <guilabel>Cancel</guilabel> buttons. The
- <constant>QUERY_MESSAGE</constant> message type causes the
- message box to display a question mark icon.</para>
-
- <para>The return value of the method is tested against the
- value <constant>OK_OPTION</constant>. If the return value is
- something else (because the <guilabel>Cancel</guilabel>
- button was pressed or because the message box window was
- closed without a button press), a <constant>null</constant>
- value is returned to a calling function, signaling that the
- user canceled macro execution. If the return value is
- <constant>OK_OPTION</constant>, each of the input components
- can yield their contents for further processing by calls to
- <function>JTextField.getText()</function> (or, in the case
- of the check box,
- <function>JCheckBox.isSelected()</function>).</para>
- </listitem>
- </itemizedlist>
- </section>
-
- <section id="tips-macro-input-combo">
- <title>Selecting Input From a List</title>
-
- <para>Another useful way to get user input for a macro is to use a
- combo box containing a number of pre-set options. If this is the
- only input required, one of the versions of
- <function>showInputDialog()</function> in the
- <classname>JOptionPane</classname> class provides a shortcut. Here
- is its prototype:</para>
-
- <itemizedlist>
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>public static Object
- <function>showInputDialog</function></funcdef>
-
- <paramdef>Component
- <parameter>parentComponent</parameter></paramdef>
-
- <paramdef>Object
- <parameter>message</parameter></paramdef>
-
- <paramdef>String
- <parameter>title</parameter></paramdef>
-
- <paramdef>int
- <parameter>messageType</parameter></paramdef>
-
- <paramdef>Icon <parameter>icon</parameter></paramdef>
-
- <paramdef>Object[]
- <parameter>selectionValues</parameter></paramdef>
-
- <paramdef>Object
- <parameter>initialSelectionValue</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
- </listitem>
- </itemizedlist>
-
- <para>This method creates a message box containing a drop-down list
- of the options specified in the method's parameters, along with
- <guilabel>OK</guilabel> and <guilabel>Cancel</guilabel> buttons.
- Compared to <function>showConfirmDialog()</function>, this method
- lacks an <varname>optionType</varname> parameter and has three
- additional parameters: an <varname>icon</varname> to display in the
- dialog (which can be set to <constant>null</constant>), an array of
- <varname>selectionValues</varname> objects, and a reference to one
- of the options as the <varname>initialSelectionValue</varname> to be
- displayed. In addition, instead of returning an
- <classname>int</classname> representing the user's action,
- <function>showInputDialog()</function> returns the
- <classname>Object</classname> corresponding to the user's selection,
- or <constant>null</constant> if the selection is canceled.</para>
-
- <para>The following macro fragment illustrates the use of this
- method.</para>
-
- <informalexample>
- <programlisting>// fragment illustrating use of showInputDialog()
-options = new Object[5];
-options[0] = "JLabel";
-options[1] = "JTextField";
-options[2] = "JCheckBox";
-options[3] = "HistoryTextField";
-options[4} = "-- other --";
-
-result = JOptionPane.showInputDialog(view,
- "Choose component class",
- "Select class for input component",
- JOptionPane.QUESTION_MESSAGE,
- null, options, options[0]);</programlisting>
- </informalexample>
-
- <para>The return value <varname>result</varname> will contain either
- the <classname>String</classname> object representing the selected
- text item or <constant>null</constant> representing no selection.
- Any further use of this fragment would have to test the value of
- <varname>result</varname> and likely exit from the macro if the
- value equaled <constant>null</constant>.</para>
-
- <para>A set of options can be similarly placed in a
- <classname>JComboBox</classname> component created as part of a
- larger dialog or <function>showMessageDialog()</function> layout.
- Here are some code fragments showing this approach:</para>
-
- <informalexample>
- <programlisting>// fragments from Display_Abbreviations.bsh
-// import statements and other code omitted
-
-// from main routine, this method call returns an array
-// of Strings representing the names of abbreviation sets
-
-abbrevSets = getActiveSets();
-
-...
-
-// from showAbbrevs() method
-
-combo = new JComboBox(abbrevSets);
-// set width to uniform size regardless of combobox contents
-Dimension dim = combo.getPreferredSize();
-dim.width = Math.max(dim.width, 120);
-combo.setPreferredSize(dim);
-combo.setSelectedItem(STARTING_SET); // defined as "global"
-
-// end fragments</programlisting>
- </informalexample>
- </section>
-
- <section id="macro-tips-single-char">
- <title>Using a Single Keypress as Input</title>
-
- <para>Some macros may choose to emulate the style of character-based
- text editors such as <application>emacs</application> or
- <application>vi</application>. They will require only a single
- keypress as input that would be handled by the macro but not
- displayed on the screen. If the keypress corresponds to a character
- value, jEdit can pass that value as a parameter to a BeanShell
- script.</para>
-
- <para>The jEdit class <ulink
- url="../api/org/gjt/sp/jedit/gui/InputHandler.html">InputHandler</ulink>
- is an abstract class that that manages associations between keyboard
- input and editing actions, along with the recording of macros.
- Keyboard input in jEdit is normally managed by the derived class
- <ulink
- url="../api/org/gjt/sp/jedit/gui/DefaultInputHandler.html">DefaultInputHandler</ulink>.
- One of the methods in the <ulink
- url="../api/org/gjt/sp/jedit/gui/InputHandler.html">InputHandler</ulink>
- class handles input from a single keypress:</para>
-
- <itemizedlist>
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>public void
- <function>readNextChar</function></funcdef>
-
- <paramdef>String
- <parameter>prompt</parameter></paramdef>
-
- <paramdef>String
- <parameter>code</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
- </listitem>
- </itemizedlist>
-
- <para>When this method is called, the contents of the
- <varname>prompt</varname> parameter is shown in the view's status
- bar. The method then waits for a key press, after which the contents
- of the <varname>code</varname> parameter will be run as a BeanShell
- script, with one important modification. Each time the string
- <varname>__char__</varname> appears in the parameter script, it will
- be substituted by the character pressed. The key press is
- <quote>consumed</quote> by <function>readNextChar()</function>. It
- will not be displayed on the screen or otherwise processed by
- jEdit.</para>
-
- <para>Using <function>readNextChar()</function> requires a macro
- within the macro, formatted as a single, potentially lengthy string
- literal. The following macro illustrates this technique. It selects
- a line of text from the current caret position to the first
- occurrence of the character next typed by the user. If the character
- does not appear on the line, no new selection occurs and the display
- remains unchanged.</para>
-
- <informalexample>
- <programlisting>// Next_Char.bsh
-
-script = new StringBuffer(512);
-script.append( "start = textArea.getCaretPosition();" );
-script.append( "line = textArea.getCaretLine();" );
-script.append( "end = textArea.getLineEndOffset(line) + 1;" );
-script.append( "text = buffer.getText(start, end - start);" );
-script.append( "match = text.indexOf(__char__, 1);" );
-script.append( "if(match != -1) {" );
-script.append( "if(__char__ != '\\n') ++match;" );
-script.append( "textArea.select(start, start + match - 1);" );
-script.append( "}" );
-
-view.getInputHandler().readNextChar("Enter a character",
- script.toString());
-
-// end Next_Char.bsh</programlisting>
- </informalexample>
-
- <para>Once again, here are a few comments on the macro's
- design.</para>
-
- <itemizedlist>
- <listitem>
- <para>A <classname>StringBuffer</classname> object is used
- for efficiency; it obviates multiple creation of
- fixed-length <classname>String</classname> objects. The
- parameter to the constructor of <varname>script</varname>
- specifies the initial size of the buffer that will receive
- the contents of the child script.</para>
- </listitem>
-
- <listitem>
- <para>Besides the quoting of the script code, the formatting
- of the macro is entirely optional but (hopefully) makes it
- easier to read.</para>
- </listitem>
-
- <listitem>
- <para>It is important that the child script be
- self-contained. It does not run in the same namespace as the
- <quote>parent</quote> macro
- <filename>Next_Char.bsh</filename> and therefore does not
- share variables, methods, or scripted objects defined in the
- parent macro.</para>
- </listitem>
-
- <listitem>
- <para>Finally, access to the <ulink
- url="../api/org/gjt/sp/jedit/gui/InputHandler.html">InputHandler</ulink>
- object used by jEdit is available by calling
- <function>getInputHandler()</function> on the current
- view.</para>
- </listitem>
- </itemizedlist>
- </section>
- </section>
-
- <section id="startup-scripts">
- <title>Startup Scripts</title>
-
- <para>On startup, jEdit runs any BeanShell scripts located in the
- <filename>startup</filename> subdirectory of the jEdit installation and
- user settings directories (see <xref linkend="settings-directory" />).
- As with macros, the scripts must have a <filename>.bsh</filename> file
- name extension. Startup scripts are run near the end of the startup
- sequence, after plugins, properties and such have been initialized, but
- before the first view is opened.</para>
-
- <para>Startup scripts can perform initialization tasks that cannot be
- handled by command line options or ordinary configuration options, such
- as customizing jEdit's user interface by changing entries in the Java
- platform's <classname>UIManager</classname> class.</para>
-
- <para>Startup scripts have an additional feature lacking in ordinary
- macros that can help you further customize jEdit. Variables and methods
- defined in a startup script are available in all instances of the
- BeanShell interpreter created in jEdit. This allows you to create a
- personal library of methods and objects that can be accessed at any time
- during the editing session in another macro, the BeanShell shell of the
- Console plugin, or menu items such as
- <guimenu>Utilities</guimenu>><guisubmenu>BeanShell</guisubmenu>><guimenuitem>Evaluate
- BeanShell Expression</guimenuitem>.</para>
-
- <para>The startup script routine will run script files in the
- installation directory first, followed by scripts in the user settings
- directory. In each case, scripts will be executed in alphabetical order,
- applied without regard to whether the file name contains upper or lower
- case characters.</para>
-
- <para>If a startup script throws an exception (because, for example, it
- attempts to call a method on a <constant>null</constant> object). jEdit
- will show an error dialog box and move on to the next startup script. If
- script bugs are causing jEdit to crash or hang on startup, you can use
- the <userinput>-nostartupscripts</userinput> command line option to
- disable them for that editing session.</para>
-
- <para>Another important difference between startup scripts and ordinary
- macros is that startup scripts cannot use the pre-defined variables
- <varname>view</varname>, <varname>textArea</varname>,
- <varname>editPane</varname> and <varname>buffer</varname>. This is
- because they are executed before the initial view is created.</para>
-
- <para>If you are writing a method in a startup script and wish to use
- one of the above variables, pass parameters of the appropriate type to
- the method, so that a macro calling them after startup can supply the
- appropriate values. For example, a startup script could include a
- method</para>
-
- <informalexample>
- <programlisting>void doSomethingWithView(View v, String s) {
- ...
-}</programlisting>
- </informalexample>
-
- <para>so that during the editing session another macro can call the
- method using</para>
-
- <informalexample>
- <programlisting>doSomethingWithView(view, "something");</programlisting>
- </informalexample>
-
- <sidebar>
- <title>Reloading startup scripts without restarting</title>
-
- <para>It is actually possible to reload startup scripts or load
- other scripts without restarting jEdit, using a BeanShell statement
- like the following:</para>
-
- <programlisting>BeanShell.runScript(view,<replaceable>path</replaceable>,null,false);</programlisting>
-
- <para>For <replaceable>path</replaceable>, you can substitute any
- string, or a method call such as
- <function>buffer.getPath()</function>.</para>
- </sidebar>
- </section>
-
- <section id="scripts-command-line">
- <title>Running Scripts from the Command Line</title>
-
- <para>The <userinput>-run</userinput> command line switch specifies a
- BeanShell script to run on startup:</para>
-
- <screen><prompt>$ </prompt><userinput>jedit -run=test.bsh</userinput></screen>
-
- <para>Note that just like with startup scripts, the
- <varname>view</varname>, <varname>textArea</varname>,
- <varname>editPane</varname> and <varname>buffer</varname> variables are
- not defined.</para>
-
- <para>If another instance is already running, the script will be run in
- that instance, and you will be able to use the
- <function>jEdit.getLastView()</function> method to obtain a view.
- However, if a new instance of jEdit is being started, the script will be
- run at the same time as all other startup scripts; that is, before the
- first view is opened.</para>
-
- <para>If your script needs a view instance to operate on, you can use
- the following code pattern to obtain one, no matter how or when the
- script is being run:</para>
-
- <programlisting>void doSomethingUseful()
-{
- void run()
- {
- view = jEdit.getLastView();
-
- // put actual script body here
- }
-
- if(jEdit.getLastView() == null)
- VFSManager.runInAWTThread(this);
- else
- run();
-}
-
-doSomethingUseful();</programlisting>
-
- <para>If the script is being run in a loaded instance, it can be invoked
- to perform its work immediately. However, if the script is running at
- startup, before an initial view exists, its operation must be delayed to
- allow the view object first to be created and displayed. In order to
- queue the macro's operation, the scripted <quote>closure</quote> named
- <function>doSomethingUseful()</function> implements the
- <classname>Runnable</classname> interface of the Java platform. That
- interface contains only a single <function>run()</function> method that
- takes no parameters and has no return value. The macro's implementation
- of the <function>run()</function> method contains the
- <quote>working</quote> portion of the macro. Then the scripted object,
- represented by a reference to <varname>this</varname>, is passed to the
- <function>runInAWTThread()</function> method. This schedules the macro's
- operations for execution after the startup routine is complete.</para>
-
- <para>As this example illustrates, the
- <function>runInAWTThread()</function> method can be used to ensure that
- a macro will perform operations after other operations have completed.
- If it is invoked during startup, it schedules the specified
- <classname>Runnable</classname> object to run after startup is complete.
- If invoked when jEdit is fully loaded, the
- <classname>Runnable</classname> object will execute after all pending
- input/output is complete, or immediately if there are no pending I/O
- operations. This will delay operations on a new buffer, for example,
- until after the buffer is loaded and displayed.</para>
- </section>
-
- <section id="macro-tips-BeanShell">
- <title>Advanced BeanShell Techniques</title>
-
- <para>BeanShell has a few advanced features that we haven't mentioned
- yet. They will be discussed in this section.</para>
-
- <section id="macro-tips-BeanShell-convenience">
- <title>BeanShell's Convenience Syntax</title>
-
- <para>We noted earlier that BeanShell syntax does not require that
- variables be declared or defined with their type, and that variables
- that are not typed when first used can have values of differing
- types assigned to them. In addition to this <quote>loose</quote>
- syntax, BeanShell allows a <quote>convenience</quote> syntax for
- dealing with the properties of JavaBeans. They may be accessed or
- set as if they were data members. They may also be accessed using
- the name of the property enclosed in quotation marks and curly
- brackets. For example, the following statement are all equivalent,
- assuming <varname>btn</varname> is a <classname>JButton</classname>
- instance:</para>
-
- <informalexample>
- <programlisting>b.setText("Choose");
-b.text = "Choose";
-b{"text"} = "Choose";
-</programlisting>
- </informalexample>
-
- <para>The last form can also be used to access a key-value pair of a
- <classname>Hashtable</classname> object.</para>
-
- <!-- actually, the following requires the bsh.classpath package, which
- is not included with jEdit at this point in time.
-
- a future release of jEdit will use bsh.classpath, and hence support
- 'import *'
-
-<para>
- Finally, when importing classes, BeanShell permits the following form
- to import all classes lying within the interpreter's classpath:
-</para>
-
-<informalexample><programlisting>import *;
-</programlisting></informalexample>
-
--->
- </section>
-
- <section id="macro-tips-BeanShell-keywords">
- <title>Special BeanShell Keywords</title>
-
- <para>BeanShell uses special keywords to refer to variables or
- methods defined in the current or an enclosing block's scope:</para>
-
- <itemizedlist>
- <listitem>
- <para>The keyword <function>this</function> refers to the
- current scope.</para>
- </listitem>
-
- <listitem>
- <para>The keyword <function>super</function> refers to the
- immediately enclosing scope.</para>
- </listitem>
-
- <listitem>
- <para>The keyword <function>global</function> refers to the
- top-level scope of the macro script.</para>
- </listitem>
- </itemizedlist>
-
- <para>The following script illustrates the use of these
- keywords:</para>
-
- <informalexample>
- <programlisting>a = "top\n";
-foo() {
- a = "middle\n";
- bar() {
- a = "bottom\n";
- textArea.setSelectedText(global.a);
- textArea.setSelectedText(super.a);
- // equivalent to textArea.setSelectedText(this.a):
- textArea.setSelectedText(a);
- }
-
- bar();
-}
-foo();</programlisting>
- </informalexample>
-
- <para>When the script is run, the following text is inserted in the
- current buffer:</para>
-
- <screen>top
-middle
-bottom</screen>
- </section>
-
- <section id="macro-tips-BeanShell-class">
- <title>Implementing Classes and Interfaces</title>
-
- <para>As discussed in the macro example in <xref
- linkend="dialog-macro" />, scripted objects can implicitly implement
- Java interfaces such as <classname>ActionListener</classname>. For
- example:</para>
-
- <programlisting>myRunnable() {
- run() {
- System.out.println("Hello world!");
- }
-
- return this;
-}
-
-Runnable r = myRunnable();
-new Thread(r).start();</programlisting>
-
- <para>Frequently it will not be necessary to implement all of the
- methods of a particular interface in order to specify the behavior
- of a scripted object. To prevent BeanShell from throwing exceptions
- for missing interface methods, implement the
- <function>invoke()</function> method, which is called when an
- undefined method is invoked on a scripted object. Typically, the
- implementation of this method will do nothing, as in the following
- example:</para>
-
- <informalexample>
- <programlisting>invoke(method, args) {}</programlisting>
- </informalexample>
-
- <para>In addition to the implicit interface definitions described
- above, BeanShell permits full-blown classes to be defined. Indeed,
- almost any Java class definition should work in BeanShell:</para>
-
- <programlisting>class Cons {
- // Long-live LISP!
- Object car;
- Object cdr;
-
- rplaca(Object car) {
- this.car = car;
- }
-
- rplacd(Object cdr) {
- this.cdr = cdr;
- }
-}</programlisting>
- </section>
- </section>
-
- <section id="macro-tips-debugging">
- <title>Debugging Macros</title>
-
- <para>Here are a few techniques that can prove helpful in debugging
- macros.</para>
-
- <section id="macro-tips-debugging-exceptions">
- <title>Identifying Exceptions</title>
-
- <para>An <glossterm>exception</glossterm> is a condition reflecting
- an error or other unusual result of program execution that requires
- interruption of normal program flow and some kind of special
- handling. Java has a rich (and extensible) collection of exception
- classes which represent such conditions.</para>
-
- <para>jEdit catches exceptions thrown by BeanShell scripts and
- displays them in a dialog box. In addition, the full traceback is
- written to the activity log (see <xref linkend="activity-log" /> for
- more information about the activity log).</para>
-
- <para>There are two broad categories of errors that will result in
- exceptions:</para>
-
- <itemizedlist>
- <listitem>
- <para><emphasis>Interpreter errors</emphasis>, which may
- arise from typing mistakes like mismatched brackets or
- missing semicolons, or from BeanShell's failure to find a
- class corresponding to a particular variable.</para>
-
- <para>Interpreter errors are usually accompanied by the line
- number in the script, along with the cause of the
- error.</para>
- </listitem>
-
- <listitem>
- <para><emphasis>Execution errors</emphasis>, which result
- from runtime exceptions thrown by the Java platform when
- macro code is executed.</para>
-
- <para>Some exceptions thrown by the Java platform can often
- seem cryptic. Nevertheless, examining the contents of the
- activity log may reveals clues as to the cause of the
- error.</para>
- </listitem>
- </itemizedlist>
- </section>
-
- <section id="macro-tips-debugging-log">
- <title>Using the Activity Log as a Tracing Tool</title>
-
- <para>Sometimes exception tracebacks will say what kind of error
- occurred but not where it arose in the script. In those cases, you
- can insert calls that log messages to the activity log in your
- macro. If the logged messages appear when the macro is run, it means
- that up to that point the macro is fine; but if an exception is
- logged first, it means the logging call is located after the cause
- of the error.</para>
-
- <para>To write a message to the activity log, use the following
- method of the <ulink
- url="../api/org/gjt/sp/util/Log.html">Log</ulink> class:</para>
-
- <itemizedlist>
- <listitem>
- <funcsynopsis>
- <funcprototype>
- <funcdef>public static void
- <function>log</function></funcdef>
-
- <paramdef>int
- <parameter>urgency</parameter></paramdef>
-
- <paramdef>Object
- <parameter>source</parameter></paramdef>
-
- <paramdef>Object
- <parameter>message</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
- </listitem>
- </itemizedlist>
-
- <para>See the documentation for the <ulink
- url="../api/org/gjt/sp/util/Log.html">Log</ulink> class for
- information about the method's parameters.</para>
-
- <para>The following code sends a typical debugging message to the
- activity log:</para>
-
- <informalexample>
- <programlisting>Log.log(Log.DEBUG, BeanShell.class,
- "counter = " + counter);</programlisting>
- </informalexample>
-
- <para>The corresponding activity log entry might read as
- follows:</para>
-
- <informalexample>
- <programlisting>[debug] BeanShell: counter = 15</programlisting>
- </informalexample>
-
- <sidebar>
- <title>Using message dialog boxes as a tracing tool</title>
-
- <para>If you would prefer not having to deal with the activity
- log, you can use the <function>Macros.message()</function>
- method as a tracing tool. Just insert calls like the following
- in the macro code:</para>
-
- <programlisting>Macros.message(view,"tracing");</programlisting>
-
- <para>Execution of the macro is halted until the message dialog
- box is closed. When you have finished debugging the macro, you
- should delete or comment out the debugging calls to
- <function>Macros.message()</function> in your final source
- code.</para>
- </sidebar>
- </section>
- </section>
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="macro-tips">
+ <title>Macro Tips and Techniques</title>
+
+ <!-- jEdit 4.0 Macro Guide, (C) 2001, 2002 John Gellene -->
+
+ <!-- Wed Jun 20 16:56:26 EDT 2001 @914 /Internet Time/ -->
+
+ <!-- -->
+
+ <!-- jEdit buffer-local properties: -->
+
+ <!-- :indentSize=1:noTabs=yes:maxLineLen=0:wrap=soft:tabSize=2: -->
+
+ <!-- :xml.root=users-guide.xml: -->
+
+ <!-- -->
+
+ <!-- This file covers the chapter "Macro tips and techniques" -->
+
+ <!-- $Id: macro-tips.xml 16181 2009-09-08 19:26:57Z ezust $
+ -->
+
+ <section id="macro-tips-input">
+ <title>Getting Input for a Macro</title>
+
+ <para>The dialog-based macro discussed in <xref
+ linkend="dialog-macro" /> reflects a conventional approach to obtaining
+ input in a Java program. Nevertheless, it can be too lengthy or tedious
+ for someone trying to write a macro quickly. Not every macro needs a
+ user interface specified in such detail; some macros require only a
+ single keystroke or no input at all. In this section we outline some
+ other techniques for obtaining input that will help you write macros
+ quickly.</para>
+
+ <section id="macro-tips-input-single-line">
+ <title>Getting a Single Line of Text</title>
+
+ <para>As mentioned earlier in <xref linkend="helpful-methods" />,
+ the method <function>Macros.input()</function> offers a convenient
+ way to obtain a single line of text input. Here is an example that
+ inserts a pair of HTML markup tags specified by the user.</para>
+
+ <informalexample>
+ <programlisting>// Insert_Tag.bsh
+
+void insertTag()
+{
+ caret = textArea.getCaretPosition();
+ tag = Macros.input(view, <quote>Enter name of tag:</quote>);
+ if( tag == null || tag.length() == 0) return;
+ text = textArea.getSelectedText();
+ if(text == null) text = <quote></quote>;
+ sb = new StringBuffer();
+ sb.append(<quote><</quote>).append(tag).append(<quote>></quote>);
+ sb.append(text);
+ sb.append(<quote></</quote>).append(tag).append(<quote>></quote>);
+ textArea.setSelectedText(sb.toString());
+ if(text.length() == 0)
+ textArea.setCaretPosition(caret + tag.length() + 2);
+}
+
+insertTag();
+
+// end Insert_Tag.bsh</programlisting>
+ </informalexample>
+
+ <para>Here the call to <function>Macros.input()</function> seeks the
+ name of the markup tag. This method sets the message box title to a
+ fixed string, <quote>Macro input</quote>, but the specific message
+ <guilabel>Enter name of tag</guilabel> provides all the information
+ necessary. The return value <varname>tag</varname> must be tested to
+ see if it is null. This would occur if the user presses the
+ <guilabel>Cancel</guilabel> button or closes the dialog window
+ displayed by <function>Macros.input()</function>.</para>
+ </section>
+
+ <section id="macro-tips-input-multiple-data">
+ <title>Getting Multiple Data Items</title>
+
+ <para>If more than one item of input is needed, a succession of
+ calls to <function>Macros.input()</function> is a possible, but
+ awkward approach, because it would not be possible to correct early
+ input after the corresponding message box is dismissed. Where more
+ is required, but a full dialog layout is either unnecessary or too
+ much work, the Java method
+ <function>JOptionPane.showConfirmDialog()</function> is available.
+ The version to use has the following prototype:</para>
+
+ <itemizedlist>
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>public static int
+ <function>showConfirmDialog</function></funcdef>
+
+ <paramdef>Component
+ <parameter>parentComponent</parameter></paramdef>
+
+ <paramdef>Object
+ <parameter>message</parameter></paramdef>
+
+ <paramdef>String
+ <parameter>title</parameter></paramdef>
+
+ <paramdef>int
+ <parameter>optionType</parameter></paramdef>
+
+ <paramdef>int
+ <parameter>messageType</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+ </listitem>
+ </itemizedlist>
+
+ <para>The usefulness of this method arises from the fact that the
+ <varname>message</varname> parameter can be an object of any Java
+ class (since all classes are derived from
+ <classname>Object</classname>), or any array of objects. The
+ following example shows how this feature can be used.</para>
+
+ <informalexample>
+ <programlisting>// excerpt from Write_File_Header.bsh
+
+title = <quote>Write file header</quote>;
+
+currentName = buffer.getName();
+
+nameField = new JTextField(currentName);
+authorField = new JTextField(<quote>Your name here</quote>);
+descField = new JTextField(<quote></quote>, 25);
+
+namePanel = new JPanel(new GridLayout(1, 2));
+nameLabel = new JLabel(<quote>Name of file:</quote>, SwingConstants.LEFT);
+saveField = new JCheckBox(<quote>Save file when done</quote>,
+ !buffer.isNewFile());
+namePanel.add(nameLabel);
+namePanel.add(saveField);
+
+
+message = new Object[9];
+message[0] = namePanel;
+message[1] = nameField;
+message[2] = Box.createVerticalStrut(10);
+message[3] = <quote>Author's name:</quote>;
+message[4] = authorField;
+message[5] = Box.createVerticalStrut(10);
+message[6] = <quote>Enter description:</quote>;
+message[7] = descField;
+message[8] = Box.createVerticalStrut(5);
+
+if( JOptionPane.OK_OPTION !=
+ JOptionPane.showConfirmDialog(view, message, title,
+ JOptionPane.OK_CANCEL_OPTION,
+ JOptionPane.QUESTION_MESSAGE))
+ return null;
+
+// *****remainder of macro script omitted*****
+
+// end excerpt from Write_File_Header.bsh</programlisting>
+ </informalexample>
+
+ <para>This macro takes several items of user input and produces a
+ formatted file header at the beginning of the buffer. The full macro
+ is included in the set of macros installed by jEdit. There are a
+ number of input features of this excerpt worth noting.</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>The macro uses a total of seven visible components.
+ Two of them are created behind the scenes by
+ <function>showConfirmDialog()</function>, the rest are made
+ by the macro. To arrange them, the script creates an array
+ of <classname>Object</classname> objects and assigns
+ components to each location in the array. This translates to
+ a fixed, top-to-bottom arrangement in the message box
+ created by <function>showConfirmDialog()</function>.</para>
+ </listitem>
+
+ <listitem>
+ <para>The macro uses <classname>JTextField</classname>
+ objects to obtain most of the input data. The fields
+ <varname>nameField</varname> and
+ <varname>authorField</varname> are created with constructors
+ that take the initial, default text to be displayed in the
+ field as a parameter. When the message box is displayed, the
+ default text will appear and can be altered or deleted by
+ the user.</para>
+ </listitem>
+
+ <listitem>
+ <para>The text field <varname>descField</varname> uses an
+ empty string for its initial value. The second parameter in
+ its constructor sets the width of the text field component,
+ expressed as the number of characters of
+ <quote>average</quote> width. When
+ <function>showConfirmDialog()</function> prepares the layout
+ of the message box, it sets the width wide enough to
+ accommodate the designated with of
+ <varname>descField</varname>. This technique produces a
+ message box and input text fields that are wide enough for
+ your data with one line of code.</para>
+ </listitem>
+
+ <listitem>
+ <para>The displayed message box includes a
+ <classname>JCheckBox</classname> component that determines
+ whether the buffer will be saved to disk immediately after
+ the file header is written. To conserve space in the message
+ box, we want to display the check box to the right of the
+ label <guilabel>Name of file:</guilabel>. To do that, we
+ create a <classname>JPanel</classname> object and populate
+ it with the label and the checkbox in a left-to-right
+ <classname>GridLayout</classname>. The
+ <classname>JPanel</classname> containing the two components
+ is then added to the beginning of <varname>message</varname>
+ array.</para>
+ </listitem>
+
+ <listitem>
+ <para>The two visible components created by
+ <function>showConfirmDialog()</function> appear at positions
+ 3 and 6 of the <varname>message</varname> array. Only the
+ text is required; they are rendered as text labels.</para>
+ </listitem>
+
+ <listitem>
+ <para>There are three invisible components created by
+ <function>showConfirmDialog()</function>. Each of them
+ involves a call to
+ <function>Box.createVerticalStrut()</function>. The
+ <classname>Box</classname> class is a sophisticated layout
+ class that gives the user great flexibility in sizing and
+ positioning components. Here we use a
+ <function>static</function> method of the
+ <classname>Box</classname> class that produces a vertical
+ <glossterm>strut</glossterm>. This is a transparent
+ component whose width expands to fill its parent component
+ (in this case, the message box). The single parameter
+ indicates the height of the strut in pixels. The last call
+ to <function>createVerticalStrut()</function> separates the
+ description text field from the <guilabel>OK</guilabel> and
+ <guilabel>Cancel</guilabel> buttons that are automatically
+ added by <function>showConfirmDialog()</function>.</para>
+ </listitem>
+
+ <listitem>
+ <para>Finally, the call to
+ <function>showConfirmDialog()</function> uses defined
+ constants for the option type and the message type. The
+ constants are the same as those used with the
+ <function>Macros.confirm()</function> method; see <xref
+ linkend="helpful-methods" />. The option type signifies the
+ use of <guilabel>OK</guilabel> and
+ <guilabel>Cancel</guilabel> buttons. The
+ <constant>QUERY_MESSAGE</constant> message type causes the
+ message box to display a question mark icon.</para>
+
+ <para>The return value of the method is tested against the
+ value <constant>OK_OPTION</constant>. If the return value is
+ something else (because the <guilabel>Cancel</guilabel>
+ button was pressed or because the message box window was
+ closed without a button press), a <constant>null</constant>
+ value is returned to a calling function, signaling that the
+ user canceled macro execution. If the return value is
+ <constant>OK_OPTION</constant>, each of the input components
+ can yield their contents for further processing by calls to
+ <function>JTextField.getText()</function> (or, in the case
+ of the check box,
+ <function>JCheckBox.isSelected()</function>).</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section id="tips-macro-input-combo">
+ <title>Selecting Input From a List</title>
+
+ <para>Another useful way to get user input for a macro is to use a
+ combo box containing a number of pre-set options. If this is the
+ only input required, one of the versions of
+ <function>showInputDialog()</function> in the
+ <classname>JOptionPane</classname> class provides a shortcut. Here
+ is its prototype:</para>
+
+ <itemizedlist>
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>public static Object
+ <function>showInputDialog</function></funcdef>
+
+ <paramdef>Component
+ <parameter>parentComponent</parameter></paramdef>
+
+ <paramdef>Object
+ <parameter>message</parameter></paramdef>
+
+ <paramdef>String
+ <parameter>title</parameter></paramdef>
+
+ <paramdef>int
+ <parameter>messageType</parameter></paramdef>
+
+ <paramdef>Icon <parameter>icon</parameter></paramdef>
+
+ <paramdef>Object[]
+ <parameter>selectionValues</parameter></paramdef>
+
+ <paramdef>Object
+ <parameter>initialSelectionValue</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+ </listitem>
+ </itemizedlist>
+
+ <para>This method creates a message box containing a drop-down list
+ of the options specified in the method's parameters, along with
+ <guilabel>OK</guilabel> and <guilabel>Cancel</guilabel> buttons.
+ Compared to <function>showConfirmDialog()</function>, this method
+ lacks an <varname>optionType</varname> parameter and has three
+ additional parameters: an <varname>icon</varname> to display in the
+ dialog (which can be set to <constant>null</constant>), an array of
+ <varname>selectionValues</varname> objects, and a reference to one
+ of the options as the <varname>initialSelectionValue</varname> to be
+ displayed. In addition, instead of returning an
+ <classname>int</classname> representing the user's action,
+ <function>showInputDialog()</function> returns the
+ <classname>Object</classname> corresponding to the user's selection,
+ or <constant>null</constant> if the selection is canceled.</para>
+
+ <para>The following macro fragment illustrates the use of this
+ method.</para>
+
+ <informalexample>
+ <programlisting>// fragment illustrating use of showInputDialog()
+options = new Object[5];
+options[0] = "JLabel";
+options[1] = "JTextField";
+options[2] = "JCheckBox";
+options[3] = "HistoryTextField";
+options[4} = "-- other --";
+
+result = JOptionPane.showInputDialog(view,
+ "Choose component class",
+ "Select class for input component",
+ JOptionPane.QUESTION_MESSAGE,
+ null, options, options[0]);</programlisting>
+ </informalexample>
+
+ <para>The return value <varname>result</varname> will contain either
+ the <classname>String</classname> object representing the selected
+ text item or <constant>null</constant> representing no selection.
+ Any further use of this fragment would have to test the value of
+ <varname>result</varname> and likely exit from the macro if the
+ value equaled <constant>null</constant>.</para>
+
+ <para>A set of options can be similarly placed in a
+ <classname>JComboBox</classname> component created as part of a
+ larger dialog or <function>showMessageDialog()</function> layout.
+ Here are some code fragments showing this approach:</para>
+
+ <informalexample>
+ <programlisting>// fragments from Display_Abbreviations.bsh
+// import statements and other code omitted
+
+// from main routine, this method call returns an array
+// of Strings representing the names of abbreviation sets
+
+abbrevSets = getActiveSets();
+
+...
+
+// from showAbbrevs() method
+
+combo = new JComboBox(abbrevSets);
+// set width to uniform size regardless of combobox contents
+Dimension dim = combo.getPreferredSize();
+dim.width = Math.max(dim.width, 120);
+combo.setPreferredSize(dim);
+combo.setSelectedItem(STARTING_SET); // defined as "global"
+
+// end fragments</programlisting>
+ </informalexample>
+ </section>
+
+ <section id="macro-tips-single-char">
+ <title>Using a Single Keypress as Input</title>
+
+ <para>Some macros may choose to emulate the style of character-based
+ text editors such as <application>emacs</application> or
+ <application>vi</application>. They will require only a single
+ keypress as input that would be handled by the macro but not
+ displayed on the screen. If the keypress corresponds to a character
+ value, jEdit can pass that value as a parameter to a BeanShell
+ script.</para>
+
+ <para>The jEdit class <ulink
+ url="../api/org/gjt/sp/jedit/gui/InputHandler.html">InputHandler</ulink>
+ is an abstract class that that manages associations between keyboard
+ input and editing actions, along with the recording of macros.
+ Keyboard input in jEdit is normally managed by the derived class
+ <ulink
+ url="../api/org/gjt/sp/jedit/gui/DefaultInputHandler.html">DefaultInputHandler</ulink>.
+ One of the methods in the <ulink
+ url="../api/org/gjt/sp/jedit/gui/InputHandler.html">InputHandler</ulink>
+ class handles input from a single keypress:</para>
+
+ <itemizedlist>
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>public void
+ <function>readNextChar</function></funcdef>
+
+ <paramdef>String
+ <parameter>prompt</parameter></paramdef>
+
+ <paramdef>String
+ <parameter>code</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+ </listitem>
+ </itemizedlist>
+
+ <para>When this method is called, the contents of the
+ <varname>prompt</varname> parameter is shown in the view's status
+ bar. The method then waits for a key press, after which the contents
+ of the <varname>code</varname> parameter will be run as a BeanShell
+ script, with one important modification. Each time the string
+ <varname>__char__</varname> appears in the parameter script, it will
+ be substituted by the character pressed. The key press is
+ <quote>consumed</quote> by <function>readNextChar()</function>. It
+ will not be displayed on the screen or otherwise processed by
+ jEdit.</para>
+
+ <para>Using <function>readNextChar()</function> requires a macro
+ within the macro, formatted as a single, potentially lengthy string
+ literal. The following macro illustrates this technique. It selects
+ a line of text from the current caret position to the first
+ occurrence of the character next typed by the user. If the character
+ does not appear on the line, no new selection occurs and the display
+ remains unchanged.</para>
+
+ <informalexample>
+ <programlisting>// Next_Char.bsh
+
+script = new StringBuffer(512);
+script.append( "start = textArea.getCaretPosition();" );
+script.append( "line = textArea.getCaretLine();" );
+script.append( "end = textArea.getLineEndOffset(line) + 1;" );
+script.append( "text = buffer.getText(start, end - start);" );
+script.append( "match = text.indexOf(__char__, 1);" );
+script.append( "if(match != -1) {" );
+script.append( "if(__char__ != '\\n') ++match;" );
+script.append( "textArea.select(start, start + match - 1);" );
+script.append( "}" );
+
+view.getInputHandler().readNextChar("Enter a character",
+ script.toString());
+
+// end Next_Char.bsh</programlisting>
+ </informalexample>
+
+ <para>Once again, here are a few comments on the macro's
+ design.</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>A <classname>StringBuffer</classname> object is used
+ for efficiency; it obviates multiple creation of
+ fixed-length <classname>String</classname> objects. The
+ parameter to the constructor of <varname>script</varname>
+ specifies the initial size of the buffer that will receive
+ the contents of the child script.</para>
+ </listitem>
+
+ <listitem>
+ <para>Besides the quoting of the script code, the formatting
+ of the macro is entirely optional but (hopefully) makes it
+ easier to read.</para>
+ </listitem>
+
+ <listitem>
+ <para>It is important that the child script be
+ self-contained. It does not run in the same namespace as the
+ <quote>parent</quote> macro
+ <filename>Next_Char.bsh</filename> and therefore does not
+ share variables, methods, or scripted objects defined in the
+ parent macro.</para>
+ </listitem>
+
+ <listitem>
+ <para>Finally, access to the <ulink
+ url="../api/org/gjt/sp/jedit/gui/InputHandler.html">InputHandler</ulink>
+ object used by jEdit is available by calling
+ <function>getInputHandler()</function> on the current
+ view.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+ </section>
+
+ <section id="startup-scripts">
+ <title>Startup Scripts</title>
+
+ <para>On startup, jEdit runs any BeanShell scripts located in the
+ <filename>startup</filename> subdirectory of the jEdit installation and
+ user settings directories (see <xref linkend="settings-directory" />).
+ As with macros, the scripts must have a <filename>.bsh</filename> file
+ name extension. Startup scripts are run near the end of the startup
+ sequence, after plugins, properties and such have been initialized, but
+ before the first view is opened.</para>
+
+ <para>Startup scripts can perform initialization tasks that cannot be
+ handled by command line options or ordinary configuration options, such
+ as customizing jEdit's user interface by changing entries in the Java
+ platform's <classname>UIManager</classname> class.</para>
+
+ <para>Startup scripts have an additional feature lacking in ordinary
+ macros that can help you further customize jEdit. Variables and methods
+ defined in a startup script are available in all instances of the
+ BeanShell interpreter created in jEdit. This allows you to create a
+ personal library of methods and objects that can be accessed at any time
+ during the editing session in another macro, the BeanShell shell of the
+ Console plugin, or menu items such as
+ <guimenu>Utilities</guimenu>><guisubmenu>BeanShell</guisubmenu>><guimenuitem>Evaluate
+ BeanShell Expression</guimenuitem>.</para>
+
+ <para>The startup script routine will run script files in the
+ installation directory first, followed by scripts in the user settings
+ directory. In each case, scripts will be executed in alphabetical order,
+ applied without regard to whether the file name contains upper or lower
+ case characters.</para>
+
+ <para>If a startup script throws an exception (because, for example, it
+ attempts to call a method on a <constant>null</constant> object). jEdit
+ will show an error dialog box and move on to the next startup script. If
+ script bugs are causing jEdit to crash or hang on startup, you can use
+ the <userinput>-nostartupscripts</userinput> command line option to
+ disable them for that editing session.</para>
+
+ <para>Another important difference between startup scripts and ordinary
+ macros is that startup scripts cannot use the pre-defined variables
+ <varname>view</varname>, <varname>textArea</varname>,
+ <varname>editPane</varname> and <varname>buffer</varname>. This is
+ because they are executed before the initial view is created.</para>
+
+ <para>If you are writing a method in a startup script and wish to use
+ one of the above variables, pass parameters of the appropriate type to
+ the method, so that a macro calling them after startup can supply the
+ appropriate values. For example, a startup script could include a
+ method</para>
+
+ <informalexample>
+ <programlisting>void doSomethingWithView(View v, String s) {
+ ...
+}</programlisting>
+ </informalexample>
+
+ <para>so that during the editing session another macro can call the
+ method using</para>
+
+ <informalexample>
+ <programlisting>doSomethingWithView(view, "something");</programlisting>
+ </informalexample>
+
+ <sidebar>
+ <title>Reloading startup scripts without restarting</title>
+
+ <para>It is actually possible to reload startup scripts or load
+ other scripts without restarting jEdit, using a BeanShell statement
+ like the following:</para>
+
+ <programlisting>BeanShell.runScript(view,<replaceable>path</replaceable>,null,false);</programlisting>
+
+ <para>For <replaceable>path</replaceable>, you can substitute any
+ string, or a method call such as
+ <function>buffer.getPath()</function>.</para>
+ </sidebar>
+ </section>
+
+ <section id="scripts-command-line">
+ <title>Running Scripts from the Command Line</title>
+
+ <para>The <userinput>-run</userinput> command line switch specifies a
+ BeanShell script to run on startup:</para>
+
+ <screen><prompt>$ </prompt><userinput>jedit -run=test.bsh</userinput></screen>
+
+ <para>Note that just like with startup scripts, the
+ <varname>view</varname>, <varname>textArea</varname>,
+ <varname>editPane</varname> and <varname>buffer</varname> variables are
+ not defined.</para>
+
+ <para>If another instance is already running, the script will be run in
+ that instance, and you will be able to use the
+ <function>jEdit.getLastView()</function> method to obtain a view.
+ However, if a new instance of jEdit is being started, the script will be
+ run at the same time as all other startup scripts; that is, before the
+ first view is opened.</para>
+
+ <para>If your script needs a view instance to operate on, you can use
+ the following code pattern to obtain one, no matter how or when the
+ script is being run:</para>
+
+ <programlisting>void doSomethingUseful()
+{
+ void run()
+ {
+ view = jEdit.getLastView();
+
+ // put actual script body here
+ }
+
+ if(jEdit.getLastView() == null)
+ VFSManager.runInAWTThread(this);
+ else
+ run();
+}
+
+doSomethingUseful();</programlisting>
+
+ <para>If the script is being run in a loaded instance, it can be invoked
+ to perform its work immediately. However, if the script is running at
+ startup, before an initial view exists, its operation must be delayed to
+ allow the view object first to be created and displayed. In order to
+ queue the macro's operation, the scripted <quote>closure</quote> named
+ <function>doSomethingUseful()</function> implements the
+ <classname>Runnable</classname> interface of the Java platform. That
+ interface contains only a single <function>run()</function> method that
+ takes no parameters and has no return value. The macro's implementation
+ of the <function>run()</function> method contains the
+ <quote>working</quote> portion of the macro. Then the scripted object,
+ represented by a reference to <varname>this</varname>, is passed to the
+ <function>runInAWTThread()</function> method. This schedules the macro's
+ operations for execution after the startup routine is complete.</para>
+
+ <para>As this example illustrates, the
+ <function>runInAWTThread()</function> method can be used to ensure that
+ a macro will perform operations after other operations have completed.
+ If it is invoked during startup, it schedules the specified
+ <classname>Runnable</classname> object to run after startup is complete.
+ If invoked when jEdit is fully loaded, the
+ <classname>Runnable</classname> object will execute after all pending
+ input/output is complete, or immediately if there are no pending I/O
+ operations. This will delay operations on a new buffer, for example,
+ until after the buffer is loaded and displayed.</para>
+ </section>
+
+ <section id="macro-tips-BeanShell">
+ <title>Advanced BeanShell Techniques</title>
+
+ <para>BeanShell has a few advanced features that we haven't mentioned
+ yet. They will be discussed in this section.</para>
+
+ <section id="macro-tips-BeanShell-convenience">
+ <title>BeanShell's Convenience Syntax</title>
+
+ <para>We noted earlier that BeanShell syntax does not require that
+ variables be declared or defined with their type, and that variables
+ that are not typed when first used can have values of differing
+ types assigned to them. In addition to this <quote>loose</quote>
+ syntax, BeanShell allows a <quote>convenience</quote> syntax for
+ dealing with the properties of JavaBeans. They may be accessed or
+ set as if they were data members. They may also be accessed using
+ the name of the property enclosed in quotation marks and curly
+ brackets. For example, the following statement are all equivalent,
+ assuming <varname>btn</varname> is a <classname>JButton</classname>
+ instance:</para>
+
+ <informalexample>
+ <programlisting>b.setText("Choose");
+b.text = "Choose";
+b{"text"} = "Choose";
+</programlisting>
+ </informalexample>
+
+ <para>The last form can also be used to access a key-value pair of a
+ <classname>Hashtable</classname> object.</para>
+
+ <!-- actually, the following requires the bsh.classpath package, which
+ is not included with jEdit at this point in time.
+
+ a future release of jEdit will use bsh.classpath, and hence support
+ 'import *'
+
+<para>
+ Finally, when importing classes, BeanShell permits the following form
+ to import all classes lying within the interpreter's classpath:
+</para>
+
+<informalexample><programlisting>import *;
+</programlisting></informalexample>
+
+-->
+ </section>
+
+ <section id="macro-tips-BeanShell-keywords">
+ <title>Special BeanShell Keywords</title>
+
+ <para>BeanShell uses special keywords to refer to variables or
+ methods defined in the current or an enclosing block's scope:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>The keyword <function>this</function> refers to the
+ current scope.</para>
+ </listitem>
+
+ <listitem>
+ <para>The keyword <function>super</function> refers to the
+ immediately enclosing scope.</para>
+ </listitem>
+
+ <listitem>
+ <para>The keyword <function>global</function> refers to the
+ top-level scope of the macro script.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>The following script illustrates the use of these
+ keywords:</para>
+
+ <informalexample>
+ <programlisting>a = "top\n";
+foo() {
+ a = "middle\n";
+ bar() {
+ a = "bottom\n";
+ textArea.setSelectedText(global.a);
+ textArea.setSelectedText(super.a);
+ // equivalent to textArea.setSelectedText(this.a):
+ textArea.setSelectedText(a);
+ }
+
+ bar();
+}
+foo();</programlisting>
+ </informalexample>
+
+ <para>When the script is run, the following text is inserted in the
+ current buffer:</para>
+
+ <screen>top
+middle
+bottom</screen>
+ </section>
+
+ <section id="macro-tips-BeanShell-class">
+ <title>Implementing Classes and Interfaces</title>
+
+ <para>As discussed in the macro example in <xref
+ linkend="dialog-macro" />, scripted objects can implicitly implement
+ Java interfaces such as <classname>ActionListener</classname>. For
+ example:</para>
+
+ <programlisting>myRunnable() {
+ run() {
+ System.out.println("Hello world!");
+ }
+
+ return this;
+}
+
+Runnable r = myRunnable();
+new Thread(r).start();</programlisting>
+
+ <para>Frequently it will not be necessary to implement all of the
+ methods of a particular interface in order to specify the behavior
+ of a scripted object. To prevent BeanShell from throwing exceptions
+ for missing interface methods, implement the
+ <function>invoke()</function> method, which is called when an
+ undefined method is invoked on a scripted object. Typically, the
+ implementation of this method will do nothing, as in the following
+ example:</para>
+
+ <informalexample>
+ <programlisting>invoke(method, args) {}</programlisting>
+ </informalexample>
+
+ <para>In addition to the implicit interface definitions described
+ above, BeanShell permits full-blown classes to be defined. Indeed,
+ almost any Java class definition should work in BeanShell:</para>
+
+ <programlisting>class Cons {
+ // Long-live LISP!
+ Object car;
+ Object cdr;
+
+ rplaca(Object car) {
+ this.car = car;
+ }
+
+ rplacd(Object cdr) {
+ this.cdr = cdr;
+ }
+}</programlisting>
+ </section>
+ </section>
+
+ <section id="macro-tips-debugging">
+ <title>Debugging Macros</title>
+
+ <para>Here are a few techniques that can prove helpful in debugging
+ macros.</para>
+
+ <section id="macro-tips-debugging-exceptions">
+ <title>Identifying Exceptions</title>
+
+ <para>An <glossterm>exception</glossterm> is a condition reflecting
+ an error or other unusual result of program execution that requires
+ interruption of normal program flow and some kind of special
+ handling. Java has a rich (and extensible) collection of exception
+ classes which represent such conditions.</para>
+
+ <para>jEdit catches exceptions thrown by BeanShell scripts and
+ displays them in a dialog box. In addition, the full traceback is
+ written to the activity log (see <xref linkend="activity-log" /> for
+ more information about the activity log).</para>
+
+ <para>There are two broad categories of errors that will result in
+ exceptions:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><emphasis>Interpreter errors</emphasis>, which may
+ arise from typing mistakes like mismatched brackets or
+ missing semicolons, or from BeanShell's failure to find a
+ class corresponding to a particular variable.</para>
+
+ <para>Interpreter errors are usually accompanied by the line
+ number in the script, along with the cause of the
+ error.</para>
+ </listitem>
+
+ <listitem>
+ <para><emphasis>Execution errors</emphasis>, which result
+ from runtime exceptions thrown by the Java platform when
+ macro code is executed.</para>
+
+ <para>Some exceptions thrown by the Java platform can often
+ seem cryptic. Nevertheless, examining the contents of the
+ activity log may reveals clues as to the cause of the
+ error.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section id="macro-tips-debugging-log">
+ <title>Using the Activity Log as a Tracing Tool</title>
+
+ <para>Sometimes exception tracebacks will say what kind of error
+ occurred but not where it arose in the script. In those cases, you
+ can insert calls that log messages to the activity log in your
+ macro. If the logged messages appear when the macro is run, it means
+ that up to that point the macro is fine; but if an exception is
+ logged first, it means the logging call is located after the cause
+ of the error.</para>
+
+ <para>To write a message to the activity log, use the following
+ method of the <ulink
+ url="../api/org/gjt/sp/util/Log.html">Log</ulink> class:</para>
+
+ <itemizedlist>
+ <listitem>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>public static void
+ <function>log</function></funcdef>
+
+ <paramdef>int
+ <parameter>urgency</parameter></paramdef>
+
+ <paramdef>Object
+ <parameter>source</parameter></paramdef>
+
+ <paramdef>Object
+ <parameter>message</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+ </listitem>
+ </itemizedlist>
+
+ <para>See the documentation for the <ulink
+ url="../api/org/gjt/sp/util/Log.html">Log</ulink> class for
+ information about the method's parameters.</para>
+
+ <para>The following code sends a typical debugging message to the
+ activity log:</para>
+
+ <informalexample>
+ <programlisting>Log.log(Log.DEBUG, BeanShell.class,
+ "counter = " + counter);</programlisting>
+ </informalexample>
+
+ <para>The corresponding activity log entry might read as
+ follows:</para>
+
+ <informalexample>
+ <programlisting>[debug] BeanShell: counter = 15</programlisting>
+ </informalexample>
+
+ <sidebar>
+ <title>Using message dialog boxes as a tracing tool</title>
+
+ <para>If you would prefer not having to deal with the activity
+ log, you can use the <function>Macros.message()</function>
+ method as a tracing tool. Just insert calls like the following
+ in the macro code:</para>
+
+ <programlisting>Macros.message(view,"tracing");</programlisting>
+
+ <para>Execution of the macro is halted until the message dialog
+ box is closed. When you have finished debugging the macro, you
+ should delete or comment out the debugging calls to
+ <function>Macros.message()</function> in your final source
+ code.</para>
+ </sidebar>
+ </section>
+ </section>
</chapter>
\ No newline at end of file
diff --git a/jEdit/doc/users-guide/plugin-implement.xml b/jEdit/doc/users-guide/plugin-implement.xml
index 0988e5d..cd695b4 100644
--- a/jEdit/doc/users-guide/plugin-implement.xml
+++ b/jEdit/doc/users-guide/plugin-implement.xml
@@ -1,1282 +1,1281 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<chapter id="plugin-implement">
- <!-- jEdit buffer-local properties: -->
- <!-- :xml.root=users-guide.xml: -->
- <!-- :maxLineLen=80:wrap=soft: -->
- <title>Implementing a Simple Plugin</title>
- <!-- jEdit 4.3 Plugin Guide, (C) 2005, 2007 Alan Ezust -->
- <!-- jEdit 4.0 Plugin Guide, (C) 2001, 2002 John Gellene -->
-
- <para>There are many applications for the leading operating systems that
- provide a <quote>scratch-pad</quote> or <quote>sticky note</quote> facility
- for the desktop display. A similar type of facility operating within the
- jEdit display would be a convenience. The use of dockable windows would
- allow the notepad to be displayed or hidden with a single mouse click or
- keypress (if a keyboard shortcut were defined). The contents of the notepad
- could be saved at program exit (or, if earlier, deactivation of the plugin)
- and retrieved at program startup or plugin activation.</para>
-
- <para>We will keep the capabilities of this plugin modest, but a few other
- features would be worthwhile. The user should be able to write the contents
- of the notepad to storage on demand. It should also be possible to choose
- the name and location of the file that will be used to hold the notepad
- text. This would allow the user to load other files into the notepad
- display. The path of the notepad file should be displayed in the plugin
- window, but will give the user the option to hide the file name. Finally,
- there should be an action by which a single click or keypress would cause
- the contents of the notepad to be written to the new text buffer for further
- processing.</para>
-
- <para>The full source code for QuickNotepad is contained in jEdit's source
- code distribution. We will provide excerpts in this discussion where it is
- helpful to illustrate specific points. You are invited to obtain the source
- code for further study or to use as a starting point for your own
- plugin.</para>
-
- <section id="plugin-load">
- <title><indexterm>
- <primary>Plugin API</primary>
-
- <secondary>loading at startup</secondary>
- </indexterm> How Plugins are Loaded</title>
-
- <para>We will discuss the implementation of the
- <application>QuickNotepad</application> plugin, along with the jEdit
- APIs it makes use of. But first, we describe how plugins are
- loaded.</para>
-
- <para>As part of its startup routine, jEdit's <function>main</function>
- method calls various methods to load and initialize plugins.</para>
-
- <para>Additionally, plugins using the jEdit 4.2 plugin API can be loaded
- and unloaded at any time. This is a great help when developing your own
- plugins -- there is no need to restart the editor after making changes
- (see <xref linkend="plugin-implement-reloading" /> ).</para>
-
- <para>Plugins are loaded from files with the <filename>.jar</filename>
- filename extension located in the <filename>jars</filename>
- subdirectories of the jEdit installation and user settings directories
- (see <xref linkend="settings-directory" />).</para>
-
- <para>For each JAR archive file it finds, jEdit scans its entries and
- performs the following tasks:</para>
-
- <itemizedlist>
- <listitem>
- <para>Adds to a collection maintained by jEdit a new object of
- type <ulink url="../api/org/gjt/sp/jedit/PluginJAR.html">
- <classname>PluginJAR</classname></ulink>. This is a data
- structure holding the name of the JAR archive file, a reference
- to the <ulink url="../api/org/gjt/sp/jedit/JARClassLoader.html">
- <classname>JARClassLoader</classname></ulink>, and a collection
- of plugins found in the archive file.</para>
- </listitem>
-
- <listitem>
- <para>Loads any properties defined in files ending with the
- extension <filename>.props</filename> that are contained in the
- archive. See <xref
- linkend="plugin-implement-properties" />.</para>
- </listitem>
-
- <listitem>
- <para>Reads action definitions from any file named
- <filename>actions.xml</filename> in the archive (the file need
- not be at the top level). See <xref
- linkend="plugin-implement-actions" />.</para>
- </listitem>
-
- <listitem>
- <para>Parses and loads the contents of any file named
- <filename>dockables.xml</filename> in the archive (the file need
- not be at the top level). This file contains BeanShell code for
- creating docking or floating windows that will contain the
- visible components of the plugin. Not all plugins define
- dockable windows, but those that do need a
- <filename>dockables.xml</filename> file. See <xref
- linkend="plugin-implement-dockables" />.</para>
- </listitem>
-
- <listitem>
- <para>Checks for a class name with a name ending with
- <filename>Plugin.class</filename>.</para>
-
- <para>Such a class is known as a <firstterm>plugin core
- class</firstterm> and must extend jEdit's abstract <ulink
- url="../api/org/gjt/sp/jedit/EditPlugin.html">
- <classname>EditPlugin</classname></ulink> class.</para>
-
- <para>The initialization routine checks the plugin's properties
- to see if it is subject to any dependencies. For example, a
- plugin may require that the version of the Java runtime
- environment or of jEdit itself be equal to or above some
- threshold version. A plugin can also require the presence of
- another plugin.</para>
-
- <para>If any dependency is not satisfied, the loader marks the
- plugin as <quote>broken</quote> and logs an error
- message.</para>
- </listitem>
- </itemizedlist>
-
- <para>After scanning the plugin JAR file and loading any resources, a
- new instance of the plugin core class is created and added to the
- collection maintained by the appropriate <ulink
- url="../api/org/gjt/sp/jedit/PluginJAR.html">
- <classname>PluginJAR</classname></ulink>. jEdit then calls the
- <function>start()</function> method of the plugin core class. The
- <function>start()</function> method can perform initialization of the
- object's data members. Because this method is defined as an empty
- <quote>no-op</quote> in the <ulink
- url="../api/org/gjt/sp/jedit/EditPlugin.html">
- <classname>EditPlugin</classname></ulink> abstract class, a plugin need
- not provide an implementation if no unique initialization is
- required.</para>
-
- <sidebar>
- <title>Updating 4.1 plugins</title>
-
- <para>Note that while jEdit 4.1 plugins were only loaded on startup,
- jEdit 4.2 plugins can be loaded at any time. As a result, the
- <function>start()</function> method needs to cope with being called
- at any time, and <function>stop()</function> needs to fully clean up
- after the plugin.</para>
- </sidebar>
- </section>
-
- <section id="plugin-implement-quicknotepadplugin">
- <title>The QuickNotepadPlugin Class</title>
-
- <para>The major issues encountered when writing a plugin core class
- arise from the developer's decisions on what features the plugin will
- make available. These issues have implications for other plugin elements
- as well.</para>
-
- <itemizedlist>
- <listitem>
- <para>Will the plugin provide for actions that the user can
- trigger using jEdit's menu items, toolbar buttons and keyboard
- shortcuts?</para>
- </listitem>
-
- <listitem>
- <para>Will the plugin have its own visible interface?</para>
- </listitem>
-
- <listitem>
- <para>Will the plugin have settings that the user can
- configure?</para>
- </listitem>
-
- <listitem>
- <para>Will the plugin respond to any messages reflecting changes
- in the host application's state?</para>
- </listitem>
-
- <listitem>
- <para>Should the plugin do something special when it gets
- focus?</para>
- </listitem>
- </itemizedlist>
-
- <para>Recall that the plugin core class must extend <ulink
- url="../api/org/gjt/sp/jedit/EditPlugin.html">
- <classname>EditPlugin</classname></ulink>. In QuickNotepad's plugin core
- class, there are no special initialization or shutdown chores to
- perform, so we will not need a <function>start()</function> or
- <function>stop()</function> method.</para>
-
- <para>The resulting plugin core class is lightweight and straightforward
- to implement:</para>
-
- <itemizedlist>
- <listitem>
- <informalexample>
- <programlisting>public class QuickNotepadPlugin extends EditPlugin {
- public static final String NAME = "quicknotepad";
- public static final String OPTION_PREFIX = "options.quicknotepad.";
-}
-</programlisting>
- </informalexample>
-
- <para>The class has been simplified since 4.1, and all we
- defined here were a couple of <classname>String</classname> data
- members to enforce consistent syntax for the name of properties
- we will use throughout the plugin.</para>
- </listitem>
-
- <listitem>
- <para>These names are used in <filename>actions.xml</filename>
- for each of the menu choices. This file is discussed in more
- detail in <xref linkend="plugin-implement-actions" />. Each
- action is a beanshell script.</para>
-
- <informalexample>
- <programlisting>
-<!DOCTYPE ACTIONS SYSTEM "actions.dtd">
-<ACTIONS>
- <ACTION NAME="quicknotepad.choose-file">
- <CODE>
- wm.addDockableWindow(QuickNotepadPlugin.NAME);
- wm.getDockableWindow(QuickNotepadPlugin.NAME).chooseFile();
- </CODE>
- </ACTION>
-
- <ACTION NAME="quicknotepad.save-file">
- <CODE>
- wm.addDockableWindow(QuickNotepadPlugin.NAME);
- wm.getDockableWindow(QuickNotepadPlugin.NAME).saveFile();
- </CODE>
- </ACTION>
-
- <ACTION NAME="quicknotepad.copy-to-buffer">
- <CODE>
- wm.addDockableWindow(QuickNotepadPlugin.NAME);
- wm.getDockableWindow(QuickNotepadPlugin.NAME).copyToBuffer();
- </CODE>
- </ACTION>
-</ACTIONS>
-</programlisting>
- </informalexample>
- </listitem>
-
- <listitem>
- <para>The names also come up in the properties file,
- <filename>QuickNotePad.props</filename> file. The properties
- define option panes and strings used by the plugin. It is
- explained in more detail in <xref
- linkend="plugin-implement-properties" /> and the <ulink
- url="../api/org/gjt/sp/jedit/EditPlugin.html">
- <classname>EditPlugin</classname></ulink> API docs.</para>
-
- <informalexample>
- <programlisting>
-# jEdit only needs to load the plugin the first time the user accesses it
-# the presence of this property also tells jEdit the plugin is using the new API
-plugin.QuickNotepadPlugin.activate=defer
-
-# These two properties are required for all plugins
-plugin.QuickNotepadPlugin.name=QuickNotepad
-plugin.QuickNotepadPlugin.author=John Gellene
-
-# version number == jEdit version number
-plugin.QuickNotepadPlugin.version=4.3
-
-# online help
-plugin.QuickNotepadPlugin.docs=index.html
-
-# we only have one dependency, jEdit 4.2final, since we use the new plugin API
-plugin.QuickNotepadPlugin.depend.0=jedit 04.02.99.00
-
-# plugin menu
-plugin.QuickNotepadPlugin.menu=quicknotepad \
- - \
- quicknotepad.choose-file \
- quicknotepad.save-file \
- quicknotepad.copy-to-buffer
-
-# action labels for actions supplied by dockables.xml
-quicknotepad.label=QuickNotepad
-
-# action labels for actions supplied by actions.xml
-quicknotepad.choose-file.label=Choose notepad file
-quicknotepad.save-file.label=Save notepad file
-quicknotepad.copy-to-buffer.label=Copy notepad to buffer
-
-# plugin option pane
-plugin.QuickNotepadPlugin.option-pane=quicknotepad
-
-# Option pane activation BeanShell snippet
-options.quicknotepad.code=new QuickNotepadOptionPane();
-
-# Option pane labels
-options.quicknotepad.label=QuickNotepad
-options.quicknotepad.file=File:
-options.quicknotepad.choose-file=Choose
-options.quicknotepad.choose-file.title=Choose a notepad file
-options.quicknotepad.choose-font=Font:
-options.quicknotepad.show-filepath.title=Display notepad file path
-
-# window title
-quicknotepad.title=QuickNotepad
-
-# window toolbar buttons
-quicknotepad.choose-file.icon=Open.png
-quicknotepad.save-file.icon=Save.png
-quicknotepad.copy-to-buffer.icon=CopyToBuffer.png
-
-# default settings
-options.quicknotepad.show-filepath=true
-options.quicknotepad.font=Monospaced
-options.quicknotepad.fontstyle=0
-options.quicknotepad.fontsize=14
-
-# Setting not defined but supplied for completeness
-options.quicknotepad.filepath=
-</programlisting>
- </informalexample>
- </listitem>
- </itemizedlist>
- </section>
-
- <section id="plugin-implement-properties">
- <title>The Property File</title>
-
- <para>jEdit maintains a list of <quote>properties</quote>, which are
- name/value pairs used to store human-readable strings, user settings,
- and various other forms of meta-data. During startup, jEdit loads the
- default set of properties, followed by plugin properties stored in
- plugin JAR files, finally followed by user properties.</para>
-
- <para>Some properties are used by the plugin API itself. Others are
- accessed by the plugin using methods in the <ulink
- url="../api/org/gjt/sp/jedit/jEdit.html">
- <classname>jEdit</classname></ulink> class. Others are accessed by the
- scripts used by plugin packagers <footnote>
- <para>See the <guimenuitem>Macros/Properties/Create Plugin
- Announcement</guimenuitem> macro for an example.</para>
- </footnote>.</para>
-
- <para>Property files contained in plugin JARs must end with the filename
- extension <filename>.props</filename>, and have a very simple syntax,
- which the following example illustrates:</para>
-
- <informalexample>
- <programlisting># Lines starting with '#' are ignored.
-name=value
-another.name=another value
-long.property=Long property value, split over \
- several lines
-escape.property=Newlines and tabs can be inserted \
- using the \t and \n escapes
-backslash.property=A backslash can be inserted by writing \\.</programlisting>
- </informalexample>
-
- <para>Now we look at a fragment from the
- <filename>QuickNotepad.props</filename> file <footnote>
- <para>Examine the actual file for a more complete example</para>
- </footnote> which contains properties for the QuickNotepad plugin.
- The first type of property data is information about the plugin itself;
- these are the only properties that must be specified in order for the
- plugin to load:</para>
-
- <informalexample>
- <programlisting># general plugin information
-plugin.QuickNotepadPlugin.activate=defer
-plugin.QuickNotepadPlugin.name=QuickNotepad
-plugin.QuickNotepadPlugin.author=John Gellene
-plugin.QuickNotepadPlugin.version=4.03
-plugin.QuickNotepadPlugin.docs=QuickNotepad.html
-# depends on jedit 4.2final
-plugin.QuickNotepadPlugin.depend.0=jedit 04.02.99.00
-plugin.QuickNotepadPlugin.description=A demo jEdit plugin that provides a notepad dockable.
-plugin.QuickNotepadPlugin.longdescription=description.html
-</programlisting>
- </informalexample>
-
- <para>These properties are each described in detail in the documentation
- for the <ulink url="../api/org/gjt/sp/jedit/EditPlugin.html">
- <classname>EditPlugin</classname></ulink> class and do not require
- further discussion here.</para>
-
- <para>Next in the file comes a property that sets the title of the
- plugin's dockable window. Dockable windows are discussed in detail in
- <xref linkend="plugin-implement-dockables" />.</para>
-
- <informalexample>
- <programlisting># dockable window name
-quicknotepad.title=QuickNotepad</programlisting>
- </informalexample>
-
- <para>Next, we see menu item labels for the plugin's actions. All of
- these but the first are defined in <literal>actions.xml</literal> file,
- and that is because the dockable itself has its own actions. Actions are
- discussed further in <xref linkend="plugin-implement-actions" />.</para>
-
- <informalexample>
- <programlisting># action labels
-# Dockable label
-quicknotepad.label=QuickNotepad
-# Additional strings extracted from the plugin java source
-quicknotepad.choose-file.label=Choose notepad file
-quicknotepad.save-file.label=Save notepad file
-quicknotepad.copy-to-buffer.label=Copy notepad to buffer
-</programlisting>
- </informalexample>
-
- <para>Next, the plugin's menu is defined. See <xref
- linkend="plugin-implement-quicknotepadplugin" />.</para>
-
- <informalexample>
- <programlisting># application menu items
-quicknotepad.menu.label=QuickNotepad
-quicknotepad.menu=quicknotepad - quicknotepad.choose-file \
- quicknotepad.save-file quicknotepad.copy-to-buffer</programlisting>
- </informalexample>
-
- <para>We have created a small toolbar as a component of QuickNotepad, so
- file names for the button icons follow:</para>
-
- <informalexample>
- <programlisting># plugin toolbar buttons
-quicknotepad.choose-file.icon=Open.png
-quicknotepad.save-file.icon=Save.png
-quicknotepad.copy-to-buffer.icon=Edit.png</programlisting>
- </informalexample>
-
- <para>The menu item labels corresponding to these icons will also serve
- as tooltip text.</para>
-
- <para>Finally, the properties file set forth the labels and settings
- used by the option pane:</para>
-
- <informalexample>
- <programlisting># Option pane labels
-options.quicknotepad.label=QuickNotepad
-options.quicknotepad.file=File:
-options.quicknotepad.choose-file=Choose
-options.quicknotepad.choose-file.title=Choose a notepad file
-options.quicknotepad.choose-font=Font:
-options.quicknotepad.show-filepath.title=Display notepad file path
-
-# Initial default font settings
-options.quicknotepad.show-filepath=true
-options.quicknotepad.font=Monospaced
-options.quicknotepad.fontstyle=0
-options.quicknotepad.fontsize=14
-
-# Setting not defined but supplied for completeness
-options.quicknotepad.filepath=</programlisting>
- </informalexample>
-
- <tip>
- <title>PropertySideKick</title>
-
- <para>There is a SideKick for Property files, provided in the
- JavaSideKick plugin. This gives you a compact and sorted tree view
- of property files.</para>
- </tip>
-
- <sidebar>
- <title>Updating 4.1 plugins</title>
-
- <para>jEdit 4.2 plugins are distinguished from jEdit 4.1 plugins by
- the presence of the
- <literal>plugin.<replaceable>name</replaceable>.activate</literal>
- property. If this property is set, the plugin is treated like a
- jEdit 4.2 plugin. Usually, this property should be set to
- <literal>defer</literal>. See the API documentation for the <ulink
- url="../api/org/gjt/sp/jedit/EditPlugin.html">
- <classname>EditPlugin</classname></ulink> class for details. jEdit
- 4.1 plugins which have not been updated to use the 4.2 API will not
- be supported in jEdit 4.3.</para>
- </sidebar>
- </section>
-
- <section id="plugin-implement-editbus">
- <title>The EditBus</title>
-
- <para>jEdit (and some plugins) generate several kinds of messages to
- alert plugins and other components of jedit-specific events. The message
- classes, all derived from <ulink
- url="../api/org/gjt/sp/jedit/EBMessage.html">
- <classname>EBMessage</classname></ulink> cover the opening and closing
- of the application, changes in the status of buffers and views, changes
- in user settings, as well as changes in the state of other program
- features. A full list of messages can be found in the <ulink
- url="../api/org/gjt/sp/jedit/msg/package-summary.html">org.gjt.sp.jedit.msg</ulink>
- package.</para>
-
-
-
- <para>For example, the ViewUpdate messages are all related to the jEdit
- View, or the top-level window. If the user creates multiple Views, a
- plugin may need to know when they are created or destroyed, so it would
- monitor ViewUpdate messages.</para>
-
- <para>BufferUpdate messages are all related to jEdit buffers. They let
- plugins know when a buffer has become dirty, when it is about to be
- closed, after it is closed, created, loaded, or saved. Each of these
- messages are described in further detail in the API docs.</para>
-
- <para>As another example, The Navigator plugin monitors a newly added
- (to jEdit 4.3) EBMessage of the kind <ulink
- url="../api/org/gjt/sp/jedit/BufferChanging.html">BufferChanging</ulink>.
- The BufferChanging event provides Navigator enough advance notice to
- save the TextArea's caret just before the current EditPane changes its
- active Buffer. The <literal>BufferChanged</literal> event, another
- <literal>EditPaneUpdate</literal> message, is thrown shortly afterward.
- This is not used by Navigator, but it is used by SideKick to determine
- when it is time to reparse the buffer.</para>
-
- <para>Plugins register <ulink
- url="../api/org/gjt/sp/jedit/EBComponent.html">
- <function>EBComponent</function></ulink> instances with the <ulink
- url="../api/org/gjt/sp/jedit/EditBus.html">
- <classname>EditBus</classname></ulink> to receive messages reflecting
- changes in jEdit's state.</para>
-
- <para><ulink url="../api/org/gjt/sp/jedit/EBComponent.html">
- <function>EBComponent</function></ulink>s are added and removed with the
- <ulink
- url="../api/org/gjt/sp/jedit/EditBus.html#addToBus(org.gjt.sp.jedit.EBComponent)">
- <function>EditBus.addToBus()</function></ulink> and <ulink
- url="../api/org/gjt/sp/jedit/EditBus.html#removeFromBus(org.gjt.sp.jedit.EBComponent)">
- <function>EditBus.removeFromBus()</function></ulink> methods.</para>
-
- <para>Typically, the <ulink
- url="../api/org/gjt/sp/jedit/EBComponent.html#handleMessage(org.gjt.sp.jedit.EBMessage)">
- <function>EBComponent.handleMessage()</function></ulink> method is
- implemented with one or more <function>if</function> blocks that test
- whether the message is an instance of a derived message class in which
- the component has an interest.</para>
-
- <programlisting>if(msg instanceof BufferUpdate) {
- // a buffer's state has changed!
-}
-else if(msg instanceof ViewUpdate) {
- // a view's state has changed!
-}
-// ... and so on</programlisting>
-
- <para>If a plugin core class will respond to EditBus messages, it can be
- derived from <ulink url="../api/org/gjt/sp/jedit/EBPlugin.html">
- <classname>EBPlugin</classname></ulink>, in which case no explicit
- <function>addToBus()</function> call is necessary. Otherwise, <ulink
- url="../api/org/gjt/sp/jedit/EditPlugin.html">
- <classname>EditPlugin</classname></ulink> will suffice as a plugin base
- class. Note that QuickNotepad uses the latter.</para>
-
- <tip>
- <title>Using the Activity Log to see the EditBus</title>
-
- <para> To determine precisely which EditBus messages are being sent by
- jEdit or the plugins, start up jEdit with an additional argument,
- <literal>-log=5</literal>. You can set an even lower log level to see
- further details (the default is 7). With a log level of 5 or lower, the
- Activity Log will include [notice]s, which will show us exactly which
- EditBus message is sent and when. See <xref linkend="activity-log" />
- for more details. </para> </tip>
-
- </section>
-
- <section id="plugin-implement-actions">
- <title>The Actions Catalog</title>
-
- <para>Actions define procedures that can be bound to a menu item, a
- toolbar button or a keyboard shortcut. Most plugin Actions <footnote>
- <para>Some plugins, such as Sidekick, Console, and
- ProjectViewer, create pure Java EditAction-derived Actions,
- based which services are available, or which files are found in
- a certain path. However, this is an advanced topic you can
- explore further in the source and API docs of those
- plugins.</para>
- </footnote> are short scripts written in BeanShell, jEdit's macro
- scripting language. These scripts either direct the action themselves,
- delegate to a method in one of the plugin's classes that encapsulates
- the action, or do a little of both. The scripts are usually short;
- elaborate action protocols are usually contained in compiled code,
- rather than an interpreted macro script, to speed execution.</para>
-
- <para>Actions are defined by creating an XML file entitled
- <filename>actions.xml</filename> and placing it in the plugin JAR
- file.</para>
-
- <para>The <filename>actions.xml</filename> file from the
- <application>QuickNotepad</application> plugin looks as follows:</para>
-
- <informalexample>
- <programlisting><ACTIONS>
- <ACTION NAME="quicknotepad.choose-file">
- <CODE>
- wm.addDockableWindow(QuickNotepadPlugin.NAME);
- wm.getDockableWindow(QuickNotepadPlugin.NAME).chooseFile();
- </CODE>
- </ACTION>
-
- <ACTION NAME="quicknotepad.save-file">
- <CODE>
- wm.addDockableWindow(QuickNotepadPlugin.NAME);
- wm.getDockableWindow(QuickNotepadPlugin.NAME).saveFile();
- </CODE>
- </ACTION>
-
- <ACTION NAME="quicknotepad.copy-to-buffer">
- <CODE>
- wm.addDockableWindow(QuickNotepadPlugin.NAME);
- wm.getDockableWindow(QuickNotepadPlugin.NAME).copyToBuffer();
- </CODE>
- </ACTION>
-</ACTIONS></programlisting>
- </informalexample>
-
- <para>This file defines three actions. They each use a built-in variable
- <literal>wm</literal>, which refers to the current view's <ulink
- url="../api/org/gjt/sp/jedit/gui/DockableWindowManager.html">
- <classname>DockableWindowManager</classname></ulink>. Whenever you need
- to obtain a reference to the current dockable, or create a new one, this
- is the class to use. We use the method <filename>addDockable() followed
- by getDockable()</filename> to create if necessary, and then bring up
- the QuickNotepad plugin dockable. This will be docked or floating,
- depending on how it was last used.</para>
-
- <para>When an action is invoked, the BeanShell scripts address the
- plugin through static methods, or if instance data is needed, the
- current <ulink url="../api/org/gjt/sp/jedit/View.html">
- <classname>View</classname></ulink>, its <ulink
- url="../api/org/gjt/sp/jedit/gui/DockableWindowManager.html">
- <classname>DockableWindowManager</classname></ulink>, and the plugin
- object return by the <filename>getDockable()</filename> method.</para>
-
- <para>If you are unfamiliar with BeanShell code, you may nevertheless
- notice that the code statements bear a strong resemblance to Java code,
- with one exception: the variable <varname>view</varname> is never
- assigned any value.</para>
-
- <para>For complete answers to this and other BeanShell mysteries, see
- <xref linkend="writing-macros-part" />; two observations will suffice
- here. First, the variable <varname>view</varname> is predefined by
- jEdit's implementation of BeanShell to refer to the current
- <classname>View</classname> object. Second, the BeanShell scripting
- language is based upon Java syntax, but allows variables to be typed at
- run time, so explicit types for variables need not be declared.</para>
-
- <para>A formal description of each element of the
- <filename>actions.xml</filename> file can be found in the documentation
- of the <ulink url="../api/org/gjt/sp/jedit/ActionSet.html">
- <classname>ActionSet</classname></ulink> class.</para>
- </section>
-
- <section id="plugin-implement-dockables">
- <title>The dockables.xml Window Catalog</title>
-
- <para>A Dockable is a window that can float like a dialog, or dock into
- jEdit's docking area. Each dockable needs a label (for display in menus,
- and on small buttons) and a title (for display in the floating window's
- title bar).</para>
-
- <para>The jEdit plugin API uses BeanShell to create the top-level
- visible container of a plugin's interface. The BeanShell code is
- contained in a file named <filename>dockables.xml</filename>. It usually
- is quite short, providing only a single BeanShell expression used to
- create a visible plugin window.</para>
-
- <para>The following example from the QuickNotepad plugin illustrates the
- requirements of the data file:</para>
-
- <informalexample>
- <programlisting><?xml version="1.0"?>
-
-<!DOCTYPE DOCKABLES SYSTEM "dockables.dtd">
-
-<DOCKABLES>
- <DOCKABLE NAME="quicknotepad">
- new QuickNotepad(view, position);
- </DOCKABLE>
-</DOCKABLES></programlisting>
- </informalexample>
-
- <para>In this example, the <classname><DOCKABLE></classname>
- element has a single attribute, the dockable window's identifier. This
- attribute is used to key a property where the window title is stored;
- see <xref linkend="plugin-implement-properties" />.</para>
-
- <para>For each dockable, jedit defines an action with the same name.
- This means you do not need to define an explicit action to create your
- dockable - in fact, jEdit defines three actions: "toggle", "get" and
- "new floating instance" for each.</para>
-
- <para>The contents of the <classname><DOCKABLE></classname>
- element itself is a BeanShell expression that constructs a new
- <classname>QuickNotepad</classname> object. The <varname>view</varname>
- and <varname>position</varname> are predefined by the plugin API as the
- view in which the plugin window will reside, and the docking position of
- the plugin. You can use <varname>position</varname> to customize the
- layout of your plugin depending on whether it appears on the sides, or
- the top/bottom, or as a floating dockable.</para>
-
- <para>A formal description of each element of the
- <filename>dockables.xml</filename> file can be found in the
- documentation of the <ulink
- url="../api/org/gjt/sp/jedit/gui/DockableWindowManager.html">
- <classname>DockableWindowManager</classname></ulink> class. This class
- also contains the public interface you should use for getting, showing,
- hiding, and other interactions with the plugin's top-level
- windows.</para>
- </section>
-
- <section id="plugin-implement-services">
- <title>The services.xml file</title>
-
- <para>A "service" is a mechanism by which one plugin can work with other
- plugins and avoid a bidirectional build-dependency. For example, the XML
- plugin "depends" on Sidekick, but in fact, it is SideKick which creates
- and operates on an object (a <literal>SideKickParser</literal>, in fact)
- defined in the XML plugin. In a way, the dependency is
- bidirectional.</para>
-
- <para>Similarly, the AntFarm plugin defines but does not instantiate a
- <literal>Shell</literal> object. It is the Console plugin which creates
- a specific shell for each available service. SideKick and Console use
- the ServiceManager to search for services offered by other
- plugins.</para>
-
- <para>Here is an example of a service from the XML plugin, which extends
- Sidekick:</para>
-
- <informalexample>
- <programlisting>
-<!DOCTYPE SERVICES SYSTEM "services.dtd">
-
-<SERVICES>
- <SERVICE CLASS="sidekick.SideKickParser" NAME="xml">
- new xml.parser.SAXParserImpl();
- </SERVICE>
-</SERVICES>
-</programlisting>
- </informalexample>
-
- <para>The object it returns tells Sidekick how it can parse files of a
- specific type. The API docs for SideKickParser indicate exactly which
- methods must be implemented in a plugin which offers this service. It
- should be enough information to let Sidekick, which has its own
- dockable, display the tree information in its own view.</para>
-
- <para>For more information about services, refer to the <ulink
- url="../api/org/gjt/sp/jedit/ServiceManager.html">ServiceManager</ulink>
- class API documentation. There, you can find out what the tags and
- attributes mean, as well as how to register and use services.</para>
- </section>
-
- <section id="plugin-implement-quicknotepad">
- <title>The QuickNotepad Class</title>
-
- <para>Here is where most of the features of the plugin will be
- implemented. To work with the dockable window API, the top level window
- will be a <classname>JPanel</classname>. The visible components reflect
- a simple layout. Inside the top-level panel we will place a scroll pane
- with a text area. Above the scroll pane we will place a panel containing
- a small tool bar and a label displaying the path of the current notepad
- file.</para>
-
- <para>We have identified three user actions that need implementation
- here: <function>chooseFile()</function>,
- <function>saveFile()</function>, and
- <function>copyToBuffer()</function>. As noted earlier, we also want the
- text area to change its appearance in immediate response to a change in
- user options settings. In order to do that, the window class must
- respond to a <classname>PropertiesChanged</classname> message from the
- EditBus.</para>
-
- <!-- <para>
- We could have the plugin core class receive and delegate
- <classname>PropertiesChanged</classname> messages to the window class.
- However, this would require the plugin core class to hold a reference
- to either the plugin window class or the visible window class and to
- update that reference when the user activates or deactivates the
- plugin. It is simpler to have the plugin window class subscribe to the
- EditBus directly; many plugins take this approach. This means that
- <classname>QuickNotepad</classname> must implement the
- <classname>EBComponent</classname> interface.
-</para> -->
-
- <para>Unlike the <classname>EBPlugin</classname> class, the
- <classname>EBComponent</classname> interface does not deal with the
- component's actual subscribing and unsubscribing to the EditBus. To
- accomplish this, we use a pair of methods inherited from the Java
- platform's <classname>JComponent</classname> class that are called when
- the window is made visible, and when it is hidden. These two methods,
- <function>addNotify()</function> and
- <function>removeNotify()</function>, are overridden to add and remove
- the visible window from the list of EditBus subscribers.</para>
-
- <para>We will provide for two minor features when the notepad is
- displayed in the floating window. First, when a floating plugin window
- is created, we will give the notepad text area input focus. Second, when
- the notepad if floating and has input focus, we will have the
- <keycap>Escape</keycap> key dismiss the notepad window. An
- <classname>AncestorListener</classname> and a
- <classname>KeyListener</classname> will implement these details.</para>
-
- <para>Here is the listing for the data members, the constructor, and the
- implementation of the <classname>EBComponent</classname>
- interface:</para>
-
- <informalexample>
- <programlisting>public class QuickNotepad extends JPanel
- implements EBComponent
-{
- private String filename;
- private String defaultFilename;
- private View view;
- private boolean floating;
-
- private QuickNotepadTextArea textArea;
- private QuickNotepadToolPanel toolPanel;
-
- //
- // Constructor
- //
-
- public QuickNotepad(View view, String position)
- {
- super(new BorderLayout());
-
- this.view = view;
- this.floating = position.equals(
- DockableWindowManager.FLOATING);
-
- this.filename = jEdit.getProperty(
- QuickNotepadPlugin.OPTION_PREFIX
- + "filepath");
- if(this.filename == null || this.filename.length() == 0)
- {
- this.filename = new String(jEdit.getSettingsDirectory()
- + File.separator + "qn.txt");
- jEdit.setProperty(QuickNotepadPlugin.OPTION_PREFIX
- + "filepath",this.filename);
- }
- this.defaultFilename = new String(this.filename);
-
- this.toolPanel = new QuickNotepadToolPanel(this);
- add(BorderLayout.NORTH, this.toolPanel);
-
- if(floating)
- this.setPreferredSize(new Dimension(500, 250));
-
- textArea = new QuickNotepadTextArea();
- textArea.setFont(QuickNotepadOptionPane.makeFont());
- textArea.addKeyListener(new KeyHandler());
- textArea.addAncestorListener(new AncestorHandler());
- JScrollPane pane = new JScrollPane(textArea);
- add(BorderLayout.CENTER, pane);
-
- readFile();
- }
-
- //
- // Attribute methods
- //
-
- // for toolBar display
- public String getFilename()
- {
- return filename;
- }
-
- //
- // EBComponent implementation
- //
-
- public void handleMessage(EBMessage message)
- {
- if (message instanceof PropertiesChanged)
- {
- propertiesChanged();
- }
- }
-
-
- private void propertiesChanged()
- {
- String propertyFilename = jEdit.getProperty(
- QuickNotepadPlugin.OPTION_PREFIX + "filepath");
- if(!defaultFilename.equals(propertyFilename))
- {
- saveFile();
- toolPanel.propertiesChanged();
- defaultFilename = propertyFilename.clone();
- filename = defaultFilename.clone();
- readFile();
- }
- Font newFont = QuickNotepadOptionPane.makeFont();
- if(!newFont.equals(textArea.getFont()))
- {
- textArea.setFont(newFont);
- textArea.invalidate();
- }
- }
-
- // These JComponent methods provide the appropriate points
- // to subscribe and unsubscribe this object to the EditBus
-
- public void addNotify()
- {
- super.addNotify();
- EditBus.addToBus(this);
- }
-
-
- public void removeNotify()
- {
- saveFile();
- super.removeNotify();
- EditBus.removeFromBus(this);
- }
-
- ...
-
-}</programlisting>
- </informalexample>
-
- <para>This listing refers to a
- <classname>QuickNotebookTextArea</classname> object. It is currently
- implemented as a <classname>JTextArea</classname> with word wrap and tab
- sizes hard-coded. Placing the object in a separate class will simply
- future modifications.</para>
- </section>
-
- <section id="plugin-implement-quicknotepadtoolbar">
- <title>The QuickNotepadToolBar Class</title>
-
- <para>There is nothing remarkable about the toolbar panel that is placed
- inside the <classname>QuickNotepad</classname> object. The constructor
- shows the continued use of items from the plugin's properties
- file.</para>
-
- <informalexample>
- <programlisting>public class QuickNotepadToolPanel extends JPanel
-{
- private QuickNotepad pad;
- private JLabel label;
-
- public QuickNotepadToolPanel(QuickNotepad qnpad)
- {
- pad = qnpad;
- JToolBar toolBar = new JToolBar();
- toolBar.setFloatable(false);
-
- toolBar.add(makeCustomButton("quicknotepad.choose-file",
- new ActionListener() {
- public void actionPerformed(ActionEvent evt) {
- QuickNotepadToolPanel.this.pad.chooseFile();
- }
- }));
- toolBar.add(makeCustomButton("quicknotepad.save-file",
- new ActionListener() {
- public void actionPerformed(ActionEvent evt) {
- QuickNotepadToolPanel.this.pad.saveFile();
- }
- }));
- toolBar.add(makeCustomButton("quicknotepad.copy-to-buffer",
- new ActionListener() {
- public void actionPerformed(ActionEvent evt) {
- QuickNotepadToolPanel.this.pad.copyToBuffer();
- }
- }));
- label = new JLabel(pad.getFilename(),
- SwingConstants.RIGHT);
- label.setForeground(Color.black);
- label.setVisible(jEdit.getProperty(
- QuickNotepadPlugin.OPTION_PREFIX
- + "show-filepath").equals("true"));
- this.setLayout(new BorderLayout(10, 0));
- this.add(BorderLayout.WEST, toolBar);
- this.add(BorderLayout.CENTER, label);
- this.setBorder(BorderFactory.createEmptyBorder(0, 0, 3, 10));
- }
-
- ...
-
-}</programlisting>
- </informalexample>
-
- <para>The method <classname>makeCustomButton()</classname> provides
- uniform attributes for the three toolbar buttons corresponding to three
- of the plugin's use actions. The menu titles for the user actions serve
- double duty as tooltip text for the buttons. There is also a
- <function>propertiesChanged()</function> method for the toolbar that
- sets the text and visibility of the label containing the notepad file
- path.</para>
- </section>
-
- <section id="plugin-implement-options">
- <title>The QuickNotepadOptionPane Class</title>
-
- <para>Using the default implementation provided by
- <classname>AbstractOptionPane</classname> reduces the preparation of an
- option pane to two principal tasks: writing a
- <function>_init()</function> method to layout and initialize the pane,
- and writing a <function>_save()</function> method to commit any settings
- changed by user input. If a button on the option pane should trigger
- another dialog, such as a <classname>JFileChooser</classname> or jEdit's
- own enhanced <classname>VFSFileChooserDialog</classname>, the option
- pane will also have to implement the
- <classname>ActionListener</classname> interface to display additional
- components.</para>
-
- <para>The QuickNotepad plugin has only three options to set: the path
- name of the file that will store the notepad text, the visibility of the
- path name on the tool bar, and the notepad's display font. Using the
- shortcut methods of the plugin API, the implementation of
- <function>_init()</function> looks like this:</para>
-
- <informalexample>
- <programlisting>public class QuickNotepadOptionPane extends AbstractOptionPane
- implements ActionListener
-{
- private JTextField pathName;
- private JButton pickPath;
- private FontSelector font;
-
- ...
-
- public void _init()
- {
- showPath = new JCheckBox(jEdit.getProperty(
- QuickNotepadPlugin.OPTION_PREFIX
- + "show-filepath.title"),
- jEdit.getProperty(
- QuickNotepadPlugin.OPTION_PREFIX + "show-filepath")
- .equals("true"));
- addComponent(showPath);
-
- pathName = new JTextField(jEdit.getProperty(
- QuickNotepadPlugin.OPTION_PREFIX
- + "filepath"));
- JButton pickPath = new JButton(jEdit.getProperty(
- QuickNotepadPlugin.OPTION_PREFIX
- + "choose-file"));
- pickPath.addActionListener(this);
-
- JPanel pathPanel = new JPanel(new BorderLayout(0, 0));
- pathPanel.add(pathName, BorderLayout.CENTER);
- pathPanel.add(pickPath, BorderLayout.EAST);
-
- addComponent(jEdit.getProperty(
- QuickNotepadPlugin.OPTION_PREFIX + "file"),
- pathPanel);
-
- font = new FontSelector(makeFont());
- addComponent(jEdit.getProperty(
- QuickNotepadPlugin.OPTION_PREFIX + "choose-font"),
- font);
- }
-
- ...
-
-}</programlisting>
- </informalexample>
-
- <para>Here we adopt the vertical arrangement offered by use of the
- <function>addComponent()</function> method with one embellishment. We
- want the first <quote>row</quote> of the option pane to contain a text
- field with the current notepad file path and a button that will trigger
- a file chooser dialog when pressed. To place both of them on the same
- line (along with an identifying label for the file option), we create a
- <classname>JPanel</classname> to contain both components and pass the
- configured panel to <function>addComponent()</function>.</para>
-
- <para>The <function>_init()</function> method uses properties from the
- plugin's property file to provide the names of label for the components
- placed in the option pane. It also uses a property whose name begins
- with <function>PROPERTY_PREFIX</function> as a persistent data item -
- the path of the current notepad file. The elements of the notepad's font
- are also extracted from properties using a static method of the option
- pane class.</para>
-
- <para>The <function>_save()</function> method extracts data from the
- user input components and assigns them to the plugin's properties. The
- implementation is straightforward:</para>
-
- <informalexample>
- <programlisting>public void _save()
-{
- jEdit.setProperty(QuickNotepadPlugin.OPTION_PREFIX
- + "filepath", pathName.getText());
- Font _font = font.getFont();
-
- jEdit.setProperty(QuickNotepadPlugin.OPTION_PREFIX
- + "font", _font.getFamily());
- jEdit.setProperty(QuickNotepadPlugin.OPTION_PREFIX
- + "fontsize", String.valueOf(_font.getSize()));
- jEdit.setProperty(QuickNotepadPlugin.OPTION_PREFIX
- + "fontstyle", String.valueOf(_font.getStyle()));
- jEdit.setProperty(QuickNotepadPlugin.OPTION_PREFIX
- + "show-filepath", String.valueOf(showPath.isSelected()));
-}</programlisting>
- </informalexample>
-
- <para>The class has only two other methods, one to display a file
- chooser dialog in response to user action, and the other to construct a
- <classname>Font</classname> object from the plugin's font properties.
- They do not require discussion here.</para>
- </section>
-
- <section id="plugin-implement-docs">
- <title>Plugin Documentation</title>
-
- <para>While not required by the plugin API, a help file is an essential
- element of any plugin written for public release. A single web page is
- often all that is required. There are no specific requirements on
- layout, but because of the design of jEdit's help viewer, the use of
- frames should be avoided. Topics that would be useful include the
- following:</para>
-
- <itemizedlist>
- <listitem>
- <para>a description of the purpose of the plugin;</para>
- </listitem>
-
- <listitem>
- <para>an explanation of the type of input the user can supply
- through its visible interface (such as mouse action or text
- entry in controls);</para>
- </listitem>
-
- <listitem>
- <para>a listing of available user actions that can be taken when
- the plugin does not have input focus;</para>
- </listitem>
-
- <listitem>
- <para>a summary of configuration options;</para>
- </listitem>
-
- <listitem>
- <para>information on development of the plugin (such as a change
- log, a list of <quote>to do</quote> items, and contact
- information for the plugin's author); and</para>
- </listitem>
-
- <listitem>
- <para>licensing information, including acknowledgments for any
- library software used by the plugin.</para>
- </listitem>
- </itemizedlist>
-
- <para>The location of the plugin's help file is stored in the
- <literal>plugin.QuickNotepad.docs</literal> property; see <xref
- linkend="plugin-implement-properties" />.</para>
- </section>
-
- <section id="plugin-implement-building">
- <title>The build.xml Ant build file</title>
-
- <para>We have already outlined the contents of the user action catalog,
- the properties file and the documentation file in our earlier
- discussion. The final step is to compile the source file and build the
- archive file that will hold the class files and the plugin's other
- resources.</para>
-
- <para>Publicly released plugins include with their source a makefile in
- XML format for the <application>Ant</application> utility. The format
- for this file requires few changes from plugin to plugin. Here is a
- version of <filename>build.xml</filename> that could be used by
- QuickNotepad:</para>
-
- <informalexample>
- <programlisting>
-<project name="QuickNotepad"
- default="build">
- <description>
- This is an ant build.xml file for building the QuickNotepad plugin for jEdit.
- </description>
- <property name="user-doc.xml"
- value="users-guide.xml" />
- <property file="build.properties" />
- <property file="../build.properties" />
- <property name="build.support"
- value="../../../build-support" />
- <import file="${build.support}/plugin-build.xml" />
-</project>
-</programlisting>
- </informalexample>
-
- <para>This build file imports another modular build file,
- <literal>plugin-build.xml</literal> from the <literal>build-support</literal>
- project. It is available as a package you can check out from subversion, or found online in the <ulink
- url="https://jedit.svn.sourceforge.net/svnroot/jedit/build-support/trunk/">jEdit's
- SVN repository</ulink>. It contains the common build steps used to build the core jEdit plugins, and some example <literal>build.properties.sample</literal> files which you can adapt for use with your development environment.</para>
-
-
- <para>Customizing this build file for a different plugin will likely
- only require three changes to build.xml file:</para>
-
- <itemizedlist>
- <listitem>
- <para>the name of the project</para>
- </listitem>
-
- <listitem>
- <para>the dependencies of the plugin</para>
- </listitem>
-
- <listitem>
- <para>The extra files that need to be copied into the
- jar.</para>
- </listitem>
- </itemizedlist>
-
- <para>Because this build file and the one of most plugins import a
- <literal>build.properties</literal> file from the current and the parent
- directories, it is possible to build most of jEdit's plugins in a
- uniform way by setting the common properties in a single
- <literal>build.properties</literal> file, placed in the plugin source's
- parent directory. </para>
-
- <tip> <para>For a full discussion of the <filename>Ant</filename> file
- format and command syntax, you should consult the <ulink
- url="http://jakarta.apache.org/ant/manual/index.html">Ant
- documentation</ulink>, also available through jEdit's help system if you
- installed the Ant Plugin. When editing Ant build files, the XML plugin
- gives you completion tips for both elements <emphasis>and</emphasis>
- attributes. The Console plugin provides you with an ANT button which you
- can bind to keyboard actions. In addition, there are the AntFarm and
- Antelope plugins which also proivde you with alternate means to execute
- Ant targets through the Console.</para> </tip> </section>
-
- <section id="plugin-implement-reloading">
- <title>Reloading the Plugin</title>
-
- <para>Once you have compiled your plugin, you will need to test its
- behavior when it is reloaded. Follow these steps to reload your plugin
- without restarting jEdit:</para>
-
- <itemizedlist>
- <listitem>
- <para>From the Plugins menu open the Plugin Manager.</para>
- </listitem>
-
- <listitem>
- <para>On the Manage tab uncheck Hide libraries. This will allow
- you to see plugins that are not loaded.</para>
- </listitem>
-
- <listitem>
- <para>Find the plugin on the Manage tab and uncheck it. This
- will unload the plugin. You will get a warning if this plugin
- does not support dynamic reloading. If you get that warning you
- will need to restart jEdit to reload the plugin until the plugin
- is converted over to the 4.2 API.</para>
- </listitem>
-
- <listitem>
- <para>Recheck the plugin to reload it.</para>
- </listitem>
- </itemizedlist>
-
- <tip>
- <para>The Activator plugin provides a very convenient (dockable) way
- to test the activating and reloading behavior of your plugin. Be
- sure to test your plugin's reloading behavior with both the
- Activator and the Reloader tabs.</para>
- </tip>
-
- <para>If you have reached this point in the text, you are probably
- serious about writing a plugin for jEdit. Good luck with your efforts,
- and thank you for contributing to the jEdit project.</para>
- </section>
-
- <section id="plugin-debugging" >
- <title> Tips for debugging plugins </title>
- <bridgehead> BeanShell </bridgehead>
- <para> jEdit includes a Beanshell interface into its currently running JVM at all times. You can access it a variety of ways, but one way is from <literal>Plugins - Console - Shells - BeanShell</literal>. From here, you can interactively inspect the values of any object in memory, call any of its member functions, or create new instances of any class that is currently loaded by jEdit or any of its plugins. All this, without setting any breakpoints!
- </para>
- <para> If you're too lazy to type each Beanshell statement interactively, you can also create debugging code snippets as macros and invoke them from <literal>utilities - beanshell - evaluate selection</literal>, or <literal>Macros - Misc - Evaluate Buffer in Beanshell</literal>, or place the file in your own macros directory and bind it to its own keyboard shortcut. </para>
- <bridgehead> Other useful tips </bridgehead>
- <para> This section is new but will be expanded shortly. Please post suggestions to the <literal>jedit-devel</literal> mailing list. </para>
- </section>
-
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="plugin-implement">
+ <!-- jEdit buffer-local properties: -->
+ <!-- :xml.root=users-guide.xml: -->
+ <!-- :maxLineLen=80:wrap=soft: -->
+ <title>Implementing a Simple Plugin</title>
+ <!-- jEdit 4 Plugin Guide, (C) 2001, 2002 John Gellene -->
+ <!-- jEdit 4.3 Plugin Guide, (C) 2005, 20010 Alan Ezust -->
+
+ <para>There are many applications for the leading operating systems that
+ provide a <quote>scratch-pad</quote> or <quote>sticky note</quote> facility
+ for the desktop display. A similar type of facility operating within the
+ jEdit display would be a convenience. The use of dockable windows would
+ allow the notepad to be displayed or hidden with a single mouse click or
+ keypress (if a keyboard shortcut were defined). The contents of the notepad
+ could be saved at program exit (or, if earlier, deactivation of the plugin)
+ and retrieved at program startup or plugin activation.</para>
+
+ <para>We will keep the capabilities of this plugin modest, but a few other
+ features would be worthwhile. The user should be able to write the contents
+ of the notepad to storage on demand. It should also be possible to choose
+ the name and location of the file that will be used to hold the notepad
+ text. This would allow the user to load other files into the notepad
+ display. The path of the notepad file should be displayed in the plugin
+ window, but will give the user the option to hide the file name. Finally,
+ there should be an action by which a single click or keypress would cause
+ the contents of the notepad to be written to the new text buffer for further
+ processing.</para>
+
+ <para>The full source code for QuickNotepad is contained in jEdit's source
+ code distribution. We will provide excerpts in this discussion where it is
+ helpful to illustrate specific points. You are invited to obtain the source
+ code for further study or to use as a starting point for your own
+ plugin.</para>
+
+ <section id="plugin-load">
+ <title><indexterm>
+ <primary>Plugin API</primary>
+
+ <secondary>loading at startup</secondary>
+ </indexterm> How Plugins are Loaded</title>
+
+ <para>We will discuss the implementation of the
+ <application>QuickNotepad</application> plugin, along with the jEdit
+ APIs it makes use of. But first, we describe how plugins are
+ loaded.</para>
+
+ <para>As part of its startup routine, jEdit's <function>main</function>
+ method calls various methods to load and initialize plugins.</para>
+
+ <para>Additionally, plugins using the jEdit 4.2 plugin API can be loaded
+ and unloaded at any time. This is a great help when developing your own
+ plugins -- there is no need to restart the editor after making changes
+ (see <xref linkend="plugin-implement-reloading" /> ).</para>
+
+ <para>Plugins are loaded from files with the <filename>.jar</filename>
+ filename extension located in the <filename>jars</filename>
+ subdirectories of the jEdit installation and user settings directories
+ (see <xref linkend="settings-directory" />).</para>
+
+ <para>For each JAR archive file it finds, jEdit scans its entries and
+ performs the following tasks:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>Adds to a collection maintained by jEdit a new object of
+ type <ulink url="../api/org/gjt/sp/jedit/PluginJAR.html">
+ <classname>PluginJAR</classname></ulink>. This is a data
+ structure holding the name of the JAR archive file, a reference
+ to the <ulink url="../api/org/gjt/sp/jedit/JARClassLoader.html">
+ <classname>JARClassLoader</classname></ulink>, and a collection
+ of plugins found in the archive file.</para>
+ </listitem>
+
+ <listitem>
+ <para>Loads any properties defined in files ending with the
+ extension <filename>.props</filename> that are contained in the
+ archive. See <xref
+ linkend="plugin-implement-properties" />.</para>
+ </listitem>
+
+ <listitem>
+ <para>Reads action definitions from any file named
+ <filename>actions.xml</filename> in the archive (the file need
+ not be at the top level). See <xref
+ linkend="plugin-implement-actions" />.</para>
+ </listitem>
+
+ <listitem>
+ <para>Parses and loads the contents of any file named
+ <filename>dockables.xml</filename> in the archive (the file need
+ not be at the top level). This file contains BeanShell code for
+ creating docking or floating windows that will contain the
+ visible components of the plugin. Not all plugins define
+ dockable windows, but those that do need a
+ <filename>dockables.xml</filename> file. See <xref
+ linkend="plugin-implement-dockables" />.</para>
+ </listitem>
+
+ <listitem>
+ <para>Checks for a class name with a name ending with
+ <filename>Plugin.class</filename>.</para>
+
+ <para>Such a class is known as a <firstterm>plugin core
+ class</firstterm> and must extend jEdit's abstract <ulink
+ url="../api/org/gjt/sp/jedit/EditPlugin.html">
+ <classname>EditPlugin</classname></ulink> class.</para>
+
+ <para>The initialization routine checks the plugin's properties
+ to see if it is subject to any dependencies. For example, a
+ plugin may require that the version of the Java runtime
+ environment or of jEdit itself be equal to or above some
+ threshold version. A plugin can also require the presence of
+ another plugin.</para>
+
+ <para>If any dependency is not satisfied, the loader marks the
+ plugin as <quote>broken</quote> and logs an error
+ message.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>After scanning the plugin JAR file and loading any resources, a
+ new instance of the plugin core class is created and added to the
+ collection maintained by the appropriate <ulink
+ url="../api/org/gjt/sp/jedit/PluginJAR.html">
+ <classname>PluginJAR</classname></ulink>. jEdit then calls the
+ <function>start()</function> method of the plugin core class. The
+ <function>start()</function> method can perform initialization of the
+ object's data members. Because this method is defined as an empty
+ <quote>no-op</quote> in the <ulink
+ url="../api/org/gjt/sp/jedit/EditPlugin.html">
+ <classname>EditPlugin</classname></ulink> abstract class, a plugin need
+ not provide an implementation if no unique initialization is
+ required.</para>
+
+ <sidebar>
+ <title>Updating 4.1 plugins</title>
+
+ <para>Note that while jEdit 4.1 plugins were only loaded on startup,
+ jEdit 4.2 plugins can be loaded at any time. As a result, the
+ <function>start()</function> method needs to cope with being called
+ at any time, and <function>stop()</function> needs to fully clean up
+ after the plugin.</para>
+ </sidebar>
+ </section>
+
+ <section id="plugin-implement-quicknotepadplugin">
+ <title>The QuickNotepadPlugin Class</title>
+
+ <para>The major issues encountered when writing a plugin core class
+ arise from the developer's decisions on what features the plugin will
+ make available. These issues have implications for other plugin elements
+ as well.</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>Will the plugin provide for actions that the user can
+ trigger using jEdit's menu items, toolbar buttons and keyboard
+ shortcuts?</para>
+ </listitem>
+
+ <listitem>
+ <para>Will the plugin have its own visible interface?</para>
+ </listitem>
+
+ <listitem>
+ <para>Will the plugin have settings that the user can
+ configure?</para>
+ </listitem>
+
+ <listitem>
+ <para>Will the plugin respond to any messages reflecting changes
+ in the host application's state?</para>
+ </listitem>
+
+ <listitem>
+ <para>Should the plugin do something special when it gets
+ focus?</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>Recall that the plugin core class must extend <ulink
+ url="../api/org/gjt/sp/jedit/EditPlugin.html">
+ <classname>EditPlugin</classname></ulink>. In QuickNotepad's plugin core
+ class, there are no special initialization or shutdown chores to
+ perform, so we will not need a <function>start()</function> or
+ <function>stop()</function> method.</para>
+
+ <para>The resulting plugin core class is lightweight and straightforward
+ to implement:</para>
+
+ <itemizedlist>
+ <listitem>
+ <informalexample>
+ <programlisting>public class QuickNotepadPlugin extends EditPlugin {
+ public static final String NAME = "quicknotepad";
+ public static final String OPTION_PREFIX = "options.quicknotepad.";
+}
+</programlisting>
+ </informalexample>
+
+ <para>The class has been simplified since 4.1, and all we
+ defined here were a couple of <classname>String</classname> data
+ members to enforce consistent syntax for the name of properties
+ we will use throughout the plugin.</para>
+ </listitem>
+
+ <listitem>
+ <para>These names are used in <filename>actions.xml</filename>
+ for each of the menu choices. This file is discussed in more
+ detail in <xref linkend="plugin-implement-actions" />. Each
+ action is a beanshell script.</para>
+
+ <informalexample>
+ <programlisting>
+<!DOCTYPE ACTIONS SYSTEM "actions.dtd">
+<ACTIONS>
+ <ACTION NAME="quicknotepad.choose-file">
+ <CODE>
+ wm.addDockableWindow(QuickNotepadPlugin.NAME);
+ wm.getDockableWindow(QuickNotepadPlugin.NAME).chooseFile();
+ </CODE>
+ </ACTION>
+
+ <ACTION NAME="quicknotepad.save-file">
+ <CODE>
+ wm.addDockableWindow(QuickNotepadPlugin.NAME);
+ wm.getDockableWindow(QuickNotepadPlugin.NAME).saveFile();
+ </CODE>
+ </ACTION>
+
+ <ACTION NAME="quicknotepad.copy-to-buffer">
+ <CODE>
+ wm.addDockableWindow(QuickNotepadPlugin.NAME);
+ wm.getDockableWindow(QuickNotepadPlugin.NAME).copyToBuffer();
+ </CODE>
+ </ACTION>
+</ACTIONS>
+</programlisting>
+ </informalexample>
+ </listitem>
+
+ <listitem>
+ <para>The names also come up in the properties file,
+ <filename>QuickNotePad.props</filename> file. The properties
+ define option panes and strings used by the plugin. It is
+ explained in more detail in <xref
+ linkend="plugin-implement-properties" /> and the <ulink
+ url="../api/org/gjt/sp/jedit/EditPlugin.html">
+ <classname>EditPlugin</classname></ulink> API docs.</para>
+
+ <informalexample>
+ <programlisting>
+# jEdit only needs to load the plugin the first time the user accesses it
+# the presence of this property also tells jEdit the plugin is using the new API
+plugin.QuickNotepadPlugin.activate=defer
+
+# These two properties are required for all plugins
+plugin.QuickNotepadPlugin.name=QuickNotepad
+plugin.QuickNotepadPlugin.author=John Gellene
+
+# version number == jEdit version number
+plugin.QuickNotepadPlugin.version=4.3
+
+# online help
+plugin.QuickNotepadPlugin.docs=index.html
+
+# we only have one dependency, jEdit 4.2final, since we use the new plugin API
+plugin.QuickNotepadPlugin.depend.0=jedit 04.02.99.00
+
+# plugin menu
+plugin.QuickNotepadPlugin.menu=quicknotepad \
+ - \
+ quicknotepad.choose-file \
+ quicknotepad.save-file \
+ quicknotepad.copy-to-buffer
+
+# action labels for actions supplied by dockables.xml
+quicknotepad.label=QuickNotepad
+
+# action labels for actions supplied by actions.xml
+quicknotepad.choose-file.label=Choose notepad file
+quicknotepad.save-file.label=Save notepad file
+quicknotepad.copy-to-buffer.label=Copy notepad to buffer
+
+# plugin option pane
+plugin.QuickNotepadPlugin.option-pane=quicknotepad
+
+# Option pane activation BeanShell snippet
+options.quicknotepad.code=new QuickNotepadOptionPane();
+
+# Option pane labels
+options.quicknotepad.label=QuickNotepad
+options.quicknotepad.file=File:
+options.quicknotepad.choose-file=Choose
+options.quicknotepad.choose-file.title=Choose a notepad file
+options.quicknotepad.choose-font=Font:
+options.quicknotepad.show-filepath.title=Display notepad file path
+
+# window title
+quicknotepad.title=QuickNotepad
+
+# window toolbar buttons
+quicknotepad.choose-file.icon=Open.png
+quicknotepad.save-file.icon=Save.png
+quicknotepad.copy-to-buffer.icon=CopyToBuffer.png
+
+# default settings
+options.quicknotepad.show-filepath=true
+options.quicknotepad.font=Monospaced
+options.quicknotepad.fontstyle=0
+options.quicknotepad.fontsize=14
+
+# Setting not defined but supplied for completeness
+options.quicknotepad.filepath=
+</programlisting>
+ </informalexample>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section id="plugin-implement-properties">
+ <title>The Property File</title>
+
+ <para>jEdit maintains a list of <quote>properties</quote>, which are
+ name/value pairs used to store human-readable strings, user settings,
+ and various other forms of meta-data. During startup, jEdit loads the
+ default set of properties, followed by plugin properties stored in
+ plugin JAR files, finally followed by user properties.</para>
+
+ <para>Some properties are used by the plugin API itself. Others are
+ accessed by the plugin using methods in the <ulink
+ url="../api/org/gjt/sp/jedit/jEdit.html">
+ <classname>jEdit</classname></ulink> class. Others are accessed by the
+ scripts used by plugin packagers <footnote>
+ <para>See the <guimenuitem>Macros/Properties/Create Plugin
+ Announcement</guimenuitem> macro for an example.</para>
+ </footnote>.</para>
+
+ <para>Property files contained in plugin JARs must end with the filename
+ extension <filename>.props</filename>, and have a very simple syntax,
+ which the following example illustrates:</para>
+
+ <informalexample>
+ <programlisting># Lines starting with '#' are ignored.
+name=value
+another.name=another value
+long.property=Long property value, split over \
+ several lines
+escape.property=Newlines and tabs can be inserted \
+ using the \t and \n escapes
+backslash.property=A backslash can be inserted by writing \\.</programlisting>
+ </informalexample>
+
+ <para>Now we look at a fragment from the
+ <filename>QuickNotepad.props</filename> file <footnote>
+ <para>Examine the actual file for a more complete example</para>
+ </footnote> which contains properties for the QuickNotepad plugin.
+ The first type of property data is information about the plugin itself;
+ these are the only properties that must be specified in order for the
+ plugin to load:</para>
+
+ <informalexample>
+ <programlisting># general plugin information
+plugin.QuickNotepadPlugin.activate=defer
+plugin.QuickNotepadPlugin.name=QuickNotepad
+plugin.QuickNotepadPlugin.author=John Gellene
+plugin.QuickNotepadPlugin.version=4.03
+plugin.QuickNotepadPlugin.docs=QuickNotepad.html
+# depends on jedit 4.2final
+plugin.QuickNotepadPlugin.depend.0=jedit 04.02.99.00
+plugin.QuickNotepadPlugin.description=A demo jEdit plugin that provides a notepad dockable.
+plugin.QuickNotepadPlugin.longdescription=description.html
+</programlisting>
+ </informalexample>
+
+ <para>These properties are each described in detail in the documentation
+ for the <ulink url="../api/org/gjt/sp/jedit/EditPlugin.html">
+ <classname>EditPlugin</classname></ulink> class and do not require
+ further discussion here.</para>
+
+ <para>Next in the file comes a property that sets the title of the
+ plugin's dockable window. Dockable windows are discussed in detail in
+ <xref linkend="plugin-implement-dockables" />.</para>
+
+ <informalexample>
+ <programlisting># dockable window name
+quicknotepad.title=QuickNotepad</programlisting>
+ </informalexample>
+
+ <para>Next, we see menu item labels for the plugin's actions. All of
+ these but the first are defined in <literal>actions.xml</literal> file,
+ and that is because the dockable itself has its own actions. Actions are
+ discussed further in <xref linkend="plugin-implement-actions" />.</para>
+
+ <informalexample>
+ <programlisting># action labels
+# Dockable label
+quicknotepad.label=QuickNotepad
+# Additional strings extracted from the plugin java source
+quicknotepad.choose-file.label=Choose notepad file
+quicknotepad.save-file.label=Save notepad file
+quicknotepad.copy-to-buffer.label=Copy notepad to buffer
+</programlisting>
+ </informalexample>
+
+ <para>Next, the plugin's menu is defined. See <xref
+ linkend="plugin-implement-quicknotepadplugin" />.</para>
+
+ <informalexample>
+ <programlisting># application menu items
+quicknotepad.menu.label=QuickNotepad
+quicknotepad.menu=quicknotepad - quicknotepad.choose-file \
+ quicknotepad.save-file quicknotepad.copy-to-buffer</programlisting>
+ </informalexample>
+
+ <para>We have created a small toolbar as a component of QuickNotepad, so
+ file names for the button icons follow:</para>
+
+ <informalexample>
+ <programlisting># plugin toolbar buttons
+quicknotepad.choose-file.icon=Open.png
+quicknotepad.save-file.icon=Save.png
+quicknotepad.copy-to-buffer.icon=Edit.png</programlisting>
+ </informalexample>
+
+ <para>The menu item labels corresponding to these icons will also serve
+ as tooltip text.</para>
+
+ <para>Finally, the properties file set forth the labels and settings
+ used by the option pane:</para>
+
+ <informalexample>
+ <programlisting># Option pane labels
+options.quicknotepad.label=QuickNotepad
+options.quicknotepad.file=File:
+options.quicknotepad.choose-file=Choose
+options.quicknotepad.choose-file.title=Choose a notepad file
+options.quicknotepad.choose-font=Font:
+options.quicknotepad.show-filepath.title=Display notepad file path
+
+# Initial default font settings
+options.quicknotepad.show-filepath=true
+options.quicknotepad.font=Monospaced
+options.quicknotepad.fontstyle=0
+options.quicknotepad.fontsize=14
+
+# Setting not defined but supplied for completeness
+options.quicknotepad.filepath=</programlisting>
+ </informalexample>
+
+ <tip>
+ <title>PropertySideKick</title>
+
+ <para>There is a SideKick for Property files, provided in the
+ JavaSideKick plugin. This gives you a compact and sorted tree view
+ of property files.</para>
+ </tip>
+
+ <sidebar>
+ <title>Updating 4.1 plugins</title>
+
+ <para>jEdit 4.2 plugins are distinguished from jEdit 4.1 plugins by
+ the presence of the
+ <literal>plugin.<replaceable>name</replaceable>.activate</literal>
+ property. If this property is set, the plugin is treated like a
+ jEdit 4.2 plugin. Usually, this property should be set to
+ <literal>defer</literal>. See the API documentation for the <ulink
+ url="../api/org/gjt/sp/jedit/EditPlugin.html">
+ <classname>EditPlugin</classname></ulink> class for details. jEdit
+ 4.1 plugins which have not been updated to use the 4.2 API will not
+ be supported in jEdit 4.3.</para>
+ </sidebar>
+ </section>
+
+ <section id="plugin-implement-editbus">
+ <title>The EditBus</title>
+
+ <para>jEdit (and some plugins) generate several kinds of messages to
+ alert plugins and other components of jedit-specific events. The message
+ classes, all derived from <ulink
+ url="../api/org/gjt/sp/jedit/EBMessage.html">
+ <classname>EBMessage</classname></ulink> cover the opening and closing
+ of the application, changes in the status of buffers and views, changes
+ in user settings, as well as changes in the state of other program
+ features. A full list of messages can be found in the <ulink
+ url="../api/org/gjt/sp/jedit/msg/package-summary.html">org.gjt.sp.jedit.msg</ulink>
+ package.</para>
+
+
+
+ <para>For example, the ViewUpdate messages are all related to the jEdit
+ View, or the top-level window. If the user creates multiple Views, a
+ plugin may need to know when they are created or destroyed, so it would
+ monitor ViewUpdate messages.</para>
+
+ <para>BufferUpdate messages are all related to jEdit buffers. They let
+ plugins know when a buffer has become dirty, when it is about to be
+ closed, after it is closed, created, loaded, or saved. Each of these
+ messages are described in further detail in the API docs.</para>
+
+ <para>As another example, The Navigator plugin monitors a newly added
+ (to jEdit 4.3) EBMessage of the kind <ulink
+ url="../api/org/gjt/sp/jedit/BufferChanging.html">BufferChanging</ulink>.
+ The BufferChanging event provides Navigator enough advance notice to
+ save the TextArea's caret just before the current EditPane changes its
+ active Buffer. The <literal>BufferChanged</literal> event, another
+ <literal>EditPaneUpdate</literal> message, is thrown shortly afterward.
+ This is not used by Navigator, but it is used by SideKick to determine
+ when it is time to reparse the buffer.</para>
+
+ <para>Plugins register <ulink
+ url="../api/org/gjt/sp/jedit/EBComponent.html">
+ <function>EBComponent</function></ulink> instances with the <ulink
+ url="../api/org/gjt/sp/jedit/EditBus.html">
+ <classname>EditBus</classname></ulink> to receive messages reflecting
+ changes in jEdit's state.</para>
+
+ <para><ulink url="../api/org/gjt/sp/jedit/EBComponent.html">
+ <function>EBComponent</function></ulink>s are added and removed with the
+ <ulink
+ url="../api/org/gjt/sp/jedit/EditBus.html#addToBus(org.gjt.sp.jedit.EBComponent)">
+ <function>EditBus.addToBus()</function></ulink> and <ulink
+ url="../api/org/gjt/sp/jedit/EditBus.html#removeFromBus(org.gjt.sp.jedit.EBComponent)">
+ <function>EditBus.removeFromBus()</function></ulink> methods.</para>
+
+ <para>Typically, the <ulink
+ url="../api/org/gjt/sp/jedit/EBComponent.html#handleMessage(org.gjt.sp.jedit.EBMessage)">
+ <function>EBComponent.handleMessage()</function></ulink> method is
+ implemented with one or more <function>if</function> blocks that test
+ whether the message is an instance of a derived message class in which
+ the component has an interest.</para>
+
+ <programlisting>if(msg instanceof BufferUpdate) {
+ // a buffer's state has changed!
+}
+else if(msg instanceof ViewUpdate) {
+ // a view's state has changed!
+}
+// ... and so on</programlisting>
+
+ <para>If a plugin core class will respond to EditBus messages, it can be
+ derived from <ulink url="../api/org/gjt/sp/jedit/EBPlugin.html">
+ <classname>EBPlugin</classname></ulink>, in which case no explicit
+ <function>addToBus()</function> call is necessary. Otherwise, <ulink
+ url="../api/org/gjt/sp/jedit/EditPlugin.html">
+ <classname>EditPlugin</classname></ulink> will suffice as a plugin base
+ class. Note that QuickNotepad uses the latter.</para>
+
+ <tip>
+ <title>Using the Activity Log to see the EditBus</title>
+
+ <para> To determine precisely which EditBus messages are being sent by
+ jEdit or the plugins, start up jEdit with an additional argument,
+ <literal>-log=5</literal>. You can set an even lower log level to see
+ further details (the default is 7). With a log level of 5 or lower, the
+ Activity Log will include [notice]s, which will show us exactly which
+ EditBus message is sent and when. See <xref linkend="activity-log" />
+ for more details. </para> </tip>
+
+ </section>
+
+ <section id="plugin-implement-actions">
+ <title>The Actions Catalog</title>
+
+ <para>Actions define procedures that can be bound to a menu item, a
+ toolbar button or a keyboard shortcut. Most plugin Actions <footnote>
+ <para>Some plugins, such as Sidekick, Console, and
+ ProjectViewer, create pure Java EditAction-derived Actions,
+ based which services are available, or which files are found in
+ a certain path. However, this is an advanced topic you can
+ explore further in the source and API docs of those
+ plugins.</para>
+ </footnote> are short scripts written in BeanShell, jEdit's macro
+ scripting language. These scripts either direct the action themselves,
+ delegate to a method in one of the plugin's classes that encapsulates
+ the action, or do a little of both. The scripts are usually short;
+ elaborate action protocols are usually contained in compiled code,
+ rather than an interpreted macro script, to speed execution.</para>
+
+ <para>Actions are defined by creating an XML file entitled
+ <filename>actions.xml</filename> and placing it in the plugin JAR
+ file.</para>
+
+ <para>The <filename>actions.xml</filename> file from the
+ <application>QuickNotepad</application> plugin looks as follows:</para>
+
+ <informalexample>
+ <programlisting><ACTIONS>
+ <ACTION NAME="quicknotepad.choose-file">
+ <CODE>
+ wm.addDockableWindow(QuickNotepadPlugin.NAME);
+ wm.getDockableWindow(QuickNotepadPlugin.NAME).chooseFile();
+ </CODE>
+ </ACTION>
+
+ <ACTION NAME="quicknotepad.save-file">
+ <CODE>
+ wm.addDockableWindow(QuickNotepadPlugin.NAME);
+ wm.getDockableWindow(QuickNotepadPlugin.NAME).saveFile();
+ </CODE>
+ </ACTION>
+
+ <ACTION NAME="quicknotepad.copy-to-buffer">
+ <CODE>
+ wm.addDockableWindow(QuickNotepadPlugin.NAME);
+ wm.getDockableWindow(QuickNotepadPlugin.NAME).copyToBuffer();
+ </CODE>
+ </ACTION>
+</ACTIONS></programlisting>
+ </informalexample>
+
+ <para>This file defines three actions. They each use a built-in variable
+ <literal>wm</literal>, which refers to the current view's <ulink
+ url="../api/org/gjt/sp/jedit/gui/DockableWindowManager.html">
+ <classname>DockableWindowManager</classname></ulink>. Whenever you need
+ to obtain a reference to the current dockable, or create a new one, this
+ is the class to use. We use the method <filename>addDockable() followed
+ by getDockable()</filename> to create if necessary, and then bring up
+ the QuickNotepad plugin dockable. This will be docked or floating,
+ depending on how it was last used.</para>
+
+ <para>When an action is invoked, the BeanShell scripts address the
+ plugin through static methods, or if instance data is needed, the
+ current <ulink url="../api/org/gjt/sp/jedit/View.html">
+ <classname>View</classname></ulink>, its <ulink
+ url="../api/org/gjt/sp/jedit/gui/DockableWindowManager.html">
+ <classname>DockableWindowManager</classname></ulink>, and the plugin
+ object return by the <filename>getDockable()</filename> method.</para>
+
+ <para>If you are unfamiliar with BeanShell code, you may nevertheless
+ notice that the code statements bear a strong resemblance to Java code,
+ with one exception: the variable <varname>view</varname> is never
+ assigned any value.</para>
+
+ <para>For complete answers to this and other BeanShell mysteries, see
+ <xref linkend="writing-macros-part" />; two observations will suffice
+ here. First, the variable <varname>view</varname> is predefined by
+ jEdit's implementation of BeanShell to refer to the current
+ <classname>View</classname> object. Second, the BeanShell scripting
+ language is based upon Java syntax, but allows variables to be typed at
+ run time, so explicit types for variables need not be declared.</para>
+
+ <para>A formal description of each element of the
+ <filename>actions.xml</filename> file can be found in the documentation
+ of the <ulink url="../api/org/gjt/sp/jedit/ActionSet.html">
+ <classname>ActionSet</classname></ulink> class.</para>
+ </section>
+
+ <section id="plugin-implement-dockables">
+ <title>The dockables.xml Window Catalog</title>
+
+ <para>A Dockable is a window that can float like a dialog, or dock into
+ jEdit's docking area. Each dockable needs a label (for display in menus,
+ and on small buttons) and a title (for display in the floating window's
+ title bar).</para>
+
+ <para>The jEdit plugin API uses BeanShell to create the top-level
+ visible container of a plugin's interface. The BeanShell code is
+ contained in a file named <filename>dockables.xml</filename>. It usually
+ is quite short, providing only a single BeanShell expression used to
+ create a visible plugin window.</para>
+
+ <para>The following example from the QuickNotepad plugin illustrates the
+ requirements of the data file:</para>
+
+ <informalexample>
+ <programlisting><?xml version="1.0"?>
+
+<!DOCTYPE DOCKABLES SYSTEM "dockables.dtd">
+
+<DOCKABLES>
+ <DOCKABLE NAME="quicknotepad">
+ new QuickNotepad(view, position);
+ </DOCKABLE>
+</DOCKABLES></programlisting>
+ </informalexample>
+
+ <para>In this example, the <classname><DOCKABLE></classname>
+ element has a single attribute, the dockable window's identifier. This
+ attribute is used to key a property where the window title is stored;
+ see <xref linkend="plugin-implement-properties" />.</para>
+
+ <para>For each dockable, jedit defines an action with the same name.
+ This means you do not need to define an explicit action to create your
+ dockable - in fact, jEdit defines three actions: "toggle", "get" and
+ "new floating instance" for each.</para>
+
+ <para>The contents of the <classname><DOCKABLE></classname>
+ element itself is a BeanShell expression that constructs a new
+ <classname>QuickNotepad</classname> object. The <varname>view</varname>
+ and <varname>position</varname> are predefined by the plugin API as the
+ view in which the plugin window will reside, and the docking position of
+ the plugin. You can use <varname>position</varname> to customize the
+ layout of your plugin depending on whether it appears on the sides, or
+ the top/bottom, or as a floating dockable.</para>
+
+ <para>A formal description of each element of the
+ <filename>dockables.xml</filename> file can be found in the
+ documentation of the <ulink
+ url="../api/org/gjt/sp/jedit/gui/DockableWindowManager.html">
+ <classname>DockableWindowManager</classname></ulink> class. This class
+ also contains the public interface you should use for getting, showing,
+ hiding, and other interactions with the plugin's top-level
+ windows.</para>
+ </section>
+
+ <section id="plugin-implement-services">
+ <title>The services.xml file</title>
+
+ <para>A "service" is a mechanism by which one plugin can work with other
+ plugins and avoid a bidirectional build-dependency. For example, the XML
+ plugin "depends" on Sidekick, but in fact, it is SideKick which creates
+ and operates on an object (a <literal>SideKickParser</literal>, in fact)
+ defined in the XML plugin. In a way, the dependency is
+ bidirectional.</para>
+
+ <para>Similarly, the AntFarm plugin defines but does not instantiate a
+ <literal>Shell</literal> object. It is the Console plugin which creates
+ a specific shell for each available service. SideKick and Console use
+ the ServiceManager to search for services offered by other
+ plugins.</para>
+
+ <para>Here is an example of a service from the XML plugin, which extends
+ Sidekick:</para>
+
+ <informalexample>
+ <programlisting>
+<!DOCTYPE SERVICES SYSTEM "services.dtd">
+
+<SERVICES>
+ <SERVICE CLASS="sidekick.SideKickParser" NAME="xml">
+ new xml.parser.SAXParserImpl();
+ </SERVICE>
+</SERVICES>
+</programlisting>
+ </informalexample>
+
+ <para>The object it returns tells Sidekick how it can parse files of a
+ specific type. The API docs for SideKickParser indicate exactly which
+ methods must be implemented in a plugin which offers this service. It
+ should be enough information to let Sidekick, which has its own
+ dockable, display the tree information in its own view.</para>
+
+ <para>For more information about services, refer to the <ulink
+ url="../api/org/gjt/sp/jedit/ServiceManager.html">ServiceManager</ulink>
+ class API documentation. There, you can find out what the tags and
+ attributes mean, as well as how to register and use services.</para>
+ </section>
+
+ <section id="plugin-implement-quicknotepad">
+ <title>The QuickNotepad Class</title>
+
+ <para>Here is where most of the features of the plugin will be
+ implemented. To work with the dockable window API, the top level window
+ will be a <classname>JPanel</classname>. The visible components reflect
+ a simple layout. Inside the top-level panel we will place a scroll pane
+ with a text area. Above the scroll pane we will place a panel containing
+ a small tool bar and a label displaying the path of the current notepad
+ file.</para>
+
+ <para>We have identified three user actions that need implementation
+ here: <function>chooseFile()</function>,
+ <function>saveFile()</function>, and
+ <function>copyToBuffer()</function>. As noted earlier, we also want the
+ text area to change its appearance in immediate response to a change in
+ user options settings. In order to do that, the window class must
+ respond to a <classname>PropertiesChanged</classname> message from the
+ EditBus.</para>
+
+ <!-- <para>
+ We could have the plugin core class receive and delegate
+ <classname>PropertiesChanged</classname> messages to the window class.
+ However, this would require the plugin core class to hold a reference
+ to either the plugin window class or the visible window class and to
+ update that reference when the user activates or deactivates the
+ plugin. It is simpler to have the plugin window class subscribe to the
+ EditBus directly; many plugins take this approach. This means that
+ <classname>QuickNotepad</classname> must implement the
+ <classname>EBComponent</classname> interface.
+</para> -->
+
+ <para>Unlike the <classname>EBPlugin</classname> class, the
+ <classname>EBComponent</classname> interface does not deal with the
+ component's actual subscribing and unsubscribing to the EditBus. To
+ accomplish this, we use a pair of methods inherited from the Java
+ platform's <classname>JComponent</classname> class that are called when
+ the window is made visible, and when it is hidden. These two methods,
+ <function>addNotify()</function> and
+ <function>removeNotify()</function>, are overridden to add and remove
+ the visible window from the list of EditBus subscribers.</para>
+
+ <para>We will provide for two minor features when the notepad is
+ displayed in the floating window. First, when a floating plugin window
+ is created, we will give the notepad text area input focus. Second, when
+ the notepad if floating and has input focus, we will have the
+ <keycap>Escape</keycap> key dismiss the notepad window. An
+ <classname>AncestorListener</classname> and a
+ <classname>KeyListener</classname> will implement these details.</para>
+
+ <para>Here is the listing for the data members, the constructor, and the
+ implementation of the <classname>EBComponent</classname>
+ interface:</para>
+
+ <informalexample>
+ <programlisting>public class QuickNotepad extends JPanel
+ implements EBComponent
+{
+ private String filename;
+ private String defaultFilename;
+ private View view;
+ private boolean floating;
+
+ private QuickNotepadTextArea textArea;
+ private QuickNotepadToolPanel toolPanel;
+
+ //
+ // Constructor
+ //
+
+ public QuickNotepad(View view, String position)
+ {
+ super(new BorderLayout());
+
+ this.view = view;
+ this.floating = position.equals(
+ DockableWindowManager.FLOATING);
+
+ this.filename = jEdit.getProperty(
+ QuickNotepadPlugin.OPTION_PREFIX
+ + "filepath");
+ if(this.filename == null || this.filename.length() == 0)
+ {
+ this.filename = new String(jEdit.getSettingsDirectory()
+ + File.separator + "qn.txt");
+ jEdit.setProperty(QuickNotepadPlugin.OPTION_PREFIX
+ + "filepath",this.filename);
+ }
+ this.defaultFilename = new String(this.filename);
+
+ this.toolPanel = new QuickNotepadToolPanel(this);
+ add(BorderLayout.NORTH, this.toolPanel);
+
+ if(floating)
+ this.setPreferredSize(new Dimension(500, 250));
+
+ textArea = new QuickNotepadTextArea();
+ textArea.setFont(QuickNotepadOptionPane.makeFont());
+ textArea.addKeyListener(new KeyHandler());
+ textArea.addAncestorListener(new AncestorHandler());
+ JScrollPane pane = new JScrollPane(textArea);
+ add(BorderLayout.CENTER, pane);
+
+ readFile();
+ }
+
+ //
+ // Attribute methods
+ //
+
+ // for toolBar display
+ public String getFilename()
+ {
+ return filename;
+ }
+
+ //
+ // EBComponent implementation
+ //
+
+ public void handleMessage(EBMessage message)
+ {
+ if (message instanceof PropertiesChanged)
+ {
+ propertiesChanged();
+ }
+ }
+
+
+ private void propertiesChanged()
+ {
+ String propertyFilename = jEdit.getProperty(
+ QuickNotepadPlugin.OPTION_PREFIX + "filepath");
+ if(!defaultFilename.equals(propertyFilename))
+ {
+ saveFile();
+ toolPanel.propertiesChanged();
+ defaultFilename = propertyFilename.clone();
+ filename = defaultFilename.clone();
+ readFile();
+ }
+ Font newFont = QuickNotepadOptionPane.makeFont();
+ if(!newFont.equals(textArea.getFont()))
+ {
+ textArea.setFont(newFont);
+ textArea.invalidate();
+ }
+ }
+
+ // These JComponent methods provide the appropriate points
+ // to subscribe and unsubscribe this object to the EditBus
+
+ public void addNotify()
+ {
+ super.addNotify();
+ EditBus.addToBus(this);
+ }
+
+
+ public void removeNotify()
+ {
+ saveFile();
+ super.removeNotify();
+ EditBus.removeFromBus(this);
+ }
+
+ ...
+
+}</programlisting>
+ </informalexample>
+
+ <para>This listing refers to a
+ <classname>QuickNotebookTextArea</classname> object. It is currently
+ implemented as a <classname>JTextArea</classname> with word wrap and tab
+ sizes hard-coded. Placing the object in a separate class will simply
+ future modifications.</para>
+ </section>
+
+ <section id="plugin-implement-quicknotepadtoolbar">
+ <title>The QuickNotepadToolBar Class</title>
+
+ <para>There is nothing remarkable about the toolbar panel that is placed
+ inside the <classname>QuickNotepad</classname> object. The constructor
+ shows the continued use of items from the plugin's properties
+ file.</para>
+
+ <informalexample>
+ <programlisting>public class QuickNotepadToolPanel extends JPanel
+{
+ private QuickNotepad pad;
+ private JLabel label;
+
+ public QuickNotepadToolPanel(QuickNotepad qnpad)
+ {
+ pad = qnpad;
+ JToolBar toolBar = new JToolBar();
+ toolBar.setFloatable(false);
+
+ toolBar.add(makeCustomButton("quicknotepad.choose-file",
+ new ActionListener() {
+ public void actionPerformed(ActionEvent evt) {
+ QuickNotepadToolPanel.this.pad.chooseFile();
+ }
+ }));
+ toolBar.add(makeCustomButton("quicknotepad.save-file",
+ new ActionListener() {
+ public void actionPerformed(ActionEvent evt) {
+ QuickNotepadToolPanel.this.pad.saveFile();
+ }
+ }));
+ toolBar.add(makeCustomButton("quicknotepad.copy-to-buffer",
+ new ActionListener() {
+ public void actionPerformed(ActionEvent evt) {
+ QuickNotepadToolPanel.this.pad.copyToBuffer();
+ }
+ }));
+ label = new JLabel(pad.getFilename(),
+ SwingConstants.RIGHT);
+ label.setForeground(Color.black);
+ label.setVisible(jEdit.getProperty(
+ QuickNotepadPlugin.OPTION_PREFIX
+ + "show-filepath").equals("true"));
+ this.setLayout(new BorderLayout(10, 0));
+ this.add(BorderLayout.WEST, toolBar);
+ this.add(BorderLayout.CENTER, label);
+ this.setBorder(BorderFactory.createEmptyBorder(0, 0, 3, 10));
+ }
+
+ ...
+
+}</programlisting>
+ </informalexample>
+
+ <para>The method <classname>makeCustomButton()</classname> provides
+ uniform attributes for the three toolbar buttons corresponding to three
+ of the plugin's use actions. The menu titles for the user actions serve
+ double duty as tooltip text for the buttons. There is also a
+ <function>propertiesChanged()</function> method for the toolbar that
+ sets the text and visibility of the label containing the notepad file
+ path.</para>
+ </section>
+
+ <section id="plugin-implement-options">
+ <title>The QuickNotepadOptionPane Class</title>
+
+ <para>Using the default implementation provided by
+ <classname>AbstractOptionPane</classname> reduces the preparation of an
+ option pane to two principal tasks: writing a
+ <function>_init()</function> method to layout and initialize the pane,
+ and writing a <function>_save()</function> method to commit any settings
+ changed by user input. If a button on the option pane should trigger
+ another dialog, such as a <classname>JFileChooser</classname> or jEdit's
+ own enhanced <classname>VFSFileChooserDialog</classname>, the option
+ pane will also have to implement the
+ <classname>ActionListener</classname> interface to display additional
+ components.</para>
+
+ <para>The QuickNotepad plugin has only three options to set: the path
+ name of the file that will store the notepad text, the visibility of the
+ path name on the tool bar, and the notepad's display font. Using the
+ shortcut methods of the plugin API, the implementation of
+ <function>_init()</function> looks like this:</para>
+
+ <informalexample>
+ <programlisting>public class QuickNotepadOptionPane extends AbstractOptionPane
+ implements ActionListener
+{
+ private JTextField pathName;
+ private JButton pickPath;
+ private FontSelector font;
+
+ ...
+
+ public void _init()
+ {
+ showPath = new JCheckBox(jEdit.getProperty(
+ QuickNotepadPlugin.OPTION_PREFIX
+ + "show-filepath.title"),
+ jEdit.getProperty(
+ QuickNotepadPlugin.OPTION_PREFIX + "show-filepath")
+ .equals("true"));
+ addComponent(showPath);
+
+ pathName = new JTextField(jEdit.getProperty(
+ QuickNotepadPlugin.OPTION_PREFIX
+ + "filepath"));
+ JButton pickPath = new JButton(jEdit.getProperty(
+ QuickNotepadPlugin.OPTION_PREFIX
+ + "choose-file"));
+ pickPath.addActionListener(this);
+
+ JPanel pathPanel = new JPanel(new BorderLayout(0, 0));
+ pathPanel.add(pathName, BorderLayout.CENTER);
+ pathPanel.add(pickPath, BorderLayout.EAST);
+
+ addComponent(jEdit.getProperty(
+ QuickNotepadPlugin.OPTION_PREFIX + "file"),
+ pathPanel);
+
+ font = new FontSelector(makeFont());
+ addComponent(jEdit.getProperty(
+ QuickNotepadPlugin.OPTION_PREFIX + "choose-font"),
+ font);
+ }
+
+ ...
+
+}</programlisting>
+ </informalexample>
+
+ <para>Here we adopt the vertical arrangement offered by use of the
+ <function>addComponent()</function> method with one embellishment. We
+ want the first <quote>row</quote> of the option pane to contain a text
+ field with the current notepad file path and a button that will trigger
+ a file chooser dialog when pressed. To place both of them on the same
+ line (along with an identifying label for the file option), we create a
+ <classname>JPanel</classname> to contain both components and pass the
+ configured panel to <function>addComponent()</function>.</para>
+
+ <para>The <function>_init()</function> method uses properties from the
+ plugin's property file to provide the names of label for the components
+ placed in the option pane. It also uses a property whose name begins
+ with <function>PROPERTY_PREFIX</function> as a persistent data item -
+ the path of the current notepad file. The elements of the notepad's font
+ are also extracted from properties using a static method of the option
+ pane class.</para>
+
+ <para>The <function>_save()</function> method extracts data from the
+ user input components and assigns them to the plugin's properties. The
+ implementation is straightforward:</para>
+
+ <informalexample>
+ <programlisting>public void _save()
+{
+ jEdit.setProperty(QuickNotepadPlugin.OPTION_PREFIX
+ + "filepath", pathName.getText());
+ Font _font = font.getFont();
+
+ jEdit.setProperty(QuickNotepadPlugin.OPTION_PREFIX
+ + "font", _font.getFamily());
+ jEdit.setProperty(QuickNotepadPlugin.OPTION_PREFIX
+ + "fontsize", String.valueOf(_font.getSize()));
+ jEdit.setProperty(QuickNotepadPlugin.OPTION_PREFIX
+ + "fontstyle", String.valueOf(_font.getStyle()));
+ jEdit.setProperty(QuickNotepadPlugin.OPTION_PREFIX
+ + "show-filepath", String.valueOf(showPath.isSelected()));
+}</programlisting>
+ </informalexample>
+
+ <para>The class has only two other methods, one to display a file
+ chooser dialog in response to user action, and the other to construct a
+ <classname>Font</classname> object from the plugin's font properties.
+ They do not require discussion here.</para>
+ </section>
+
+ <section id="plugin-implement-docs">
+ <title>Plugin Documentation</title>
+
+ <para>While not required by the plugin API, a help file is an essential
+ element of any plugin written for public release. A single web page is
+ often all that is required. There are no specific requirements on
+ layout, but because of the design of jEdit's help viewer, the use of
+ frames should be avoided. Topics that would be useful include the
+ following:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>a description of the purpose of the plugin;</para>
+ </listitem>
+
+ <listitem>
+ <para>an explanation of the type of input the user can supply
+ through its visible interface (such as mouse action or text
+ entry in controls);</para>
+ </listitem>
+
+ <listitem>
+ <para>a listing of available user actions that can be taken when
+ the plugin does not have input focus;</para>
+ </listitem>
+
+ <listitem>
+ <para>a summary of configuration options;</para>
+ </listitem>
+
+ <listitem>
+ <para>information on development of the plugin (such as a change
+ log, a list of <quote>to do</quote> items, and contact
+ information for the plugin's author); and</para>
+ </listitem>
+
+ <listitem>
+ <para>licensing information, including acknowledgments for any
+ library software used by the plugin.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>The location of the plugin's help file is stored in the
+ <literal>plugin.QuickNotepad.docs</literal> property; see <xref
+ linkend="plugin-implement-properties" />.</para>
+ </section>
+
+ <section id="plugin-implement-building">
+ <title>The build.xml Ant build file</title>
+
+ <para>We have already outlined the contents of the user action catalog,
+ the properties file and the documentation file in our earlier
+ discussion. The final step is to compile the source file and build the
+ archive file that will hold the class files and the plugin's other
+ resources.</para>
+
+ <para>Publicly released plugins include with their source a makefile in
+ XML format for the <application>Ant</application> utility. The format
+ for this file requires few changes from plugin to plugin. Here is a
+ version of <filename>build.xml</filename> that could be used by
+ QuickNotepad:</para>
+
+ <informalexample>
+ <programlisting>
+<project name="QuickNotepad"
+ default="build">
+ <description>
+ This is an ant build.xml file for building the QuickNotepad plugin for jEdit.
+ </description>
+ <property name="user-doc.xml"
+ value="users-guide.xml" />
+ <property file="build.properties" />
+ <property file="../build.properties" />
+ <property name="build.support"
+ value="../../../build-support" />
+ <import file="${build.support}/plugin-build.xml" />
+</project>
+</programlisting>
+ </informalexample>
+
+ <para>This build file imports another modular build file,
+ <literal>plugin-build.xml</literal> from the <literal>build-support</literal>
+ project. It is available as a package you can check out from subversion, or found online in the <ulink
+ url="https://jedit.svn.sourceforge.net/svnroot/jedit/build-support/trunk/">jEdit's
+ SVN repository</ulink>. It contains the common build steps used to build the core jEdit plugins, and some example <literal>build.properties.sample</literal> files which you can adapt for use with your development environment.</para>
+
+
+ <para>Customizing this build file for a different plugin will likely
+ only require three changes to build.xml file:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>the name of the project</para>
+ </listitem>
+
+ <listitem>
+ <para>the dependencies of the plugin</para>
+ </listitem>
+
+ <listitem>
+ <para>The extra files that need to be copied into the
+ jar.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>Because this build file and the one of most plugins import a
+ <literal>build.properties</literal> file from the current and the parent
+ directories, it is possible to build most of jEdit's plugins in a
+ uniform way by setting the common properties in a single
+ <literal>build.properties</literal> file, placed in the plugin source's
+ parent directory. </para>
+
+ <tip> <para>For a full discussion of the <filename>Ant</filename> file
+ format and command syntax, you should consult the <ulink
+ url="http://jakarta.apache.org/ant/manual/index.html">Ant
+ documentation</ulink>, also available through jEdit's help system if you
+ installed the Ant Plugin. When editing Ant build files, the XML plugin
+ gives you completion tips for both elements <emphasis>and</emphasis>
+ attributes. The Console plugin provides you with an ANT button which you
+ can bind to keyboard actions. In addition, there are the AntFarm and
+ Antelope plugins which also proivde you with alternate means to execute
+ Ant targets through the Console.</para> </tip> </section>
+
+ <section id="plugin-implement-reloading">
+ <title>Reloading the Plugin</title>
+
+ <para>Once you have compiled your plugin, you will need to test its
+ behavior when it is reloaded. Follow these steps to reload your plugin
+ without restarting jEdit:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>From the Plugins menu open the Plugin Manager.</para>
+ </listitem>
+
+ <listitem>
+ <para>On the Manage tab uncheck Hide libraries. This will allow
+ you to see plugins that are not loaded.</para>
+ </listitem>
+
+ <listitem>
+ <para>Find the plugin on the Manage tab and uncheck it. This
+ will unload the plugin. You will get a warning if this plugin
+ does not support dynamic reloading. If you get that warning you
+ will need to restart jEdit to reload the plugin until the plugin
+ is converted over to the 4.2 API.</para>
+ </listitem>
+
+ <listitem>
+ <para>Recheck the plugin to reload it.</para>
+ </listitem>
+ </itemizedlist>
+
+ <tip>
+ <para>The Activator plugin provides a very convenient (dockable) way
+ to test the activating and reloading behavior of your plugin. Be
+ sure to test your plugin's reloading behavior with both the
+ Activator and the Reloader tabs.</para>
+ </tip>
+
+ <para>If you have reached this point in the text, you are probably
+ serious about writing a plugin for jEdit. Good luck with your efforts,
+ and thank you for contributing to the jEdit project.</para>
+ </section>
+
+ <section id="plugin-debugging" >
+ <title> Tips for debugging plugins </title>
+ <bridgehead> BeanShell </bridgehead>
+ <para> jEdit includes a Beanshell interface into its currently running JVM at all times. You can access it a variety of ways, but one way is from <literal>Plugins - Console - Shells - BeanShell</literal>. From here, you can interactively inspect the values of any object in memory, call any of its member functions, or create new instances of any class that is currently loaded by jEdit or any of its plugins. All this, without setting any breakpoints!
+ </para>
+ <para> If you're too lazy to type each Beanshell statement interactively, you can also create debugging code snippets as macros and invoke them from <literal>utilities - beanshell - evaluate selection</literal>, or <literal>Macros - Misc - Evaluate Buffer in Beanshell</literal>, or place the file in your own macros directory and bind it to its own keyboard shortcut. </para>
+ <bridgehead> Other useful tips </bridgehead>
+ <para> This section is new but will be expanded shortly. Please post suggestions to the <literal>jedit-devel</literal> mailing list. </para>
+ </section>
+
</chapter>
\ No newline at end of file
diff --git a/jEdit/doc/users-guide/plugin-intro.xml b/jEdit/doc/users-guide/plugin-intro.xml
index 7e24b1a..e16217a 100644
--- a/jEdit/doc/users-guide/plugin-intro.xml
+++ b/jEdit/doc/users-guide/plugin-intro.xml
@@ -1,131 +1,131 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter id="plugin-intro">
- <title>Introducing the Plugin API</title>
- <!-- :indentSize=1:tabSize=2:noTabs=true:wrap=soft:maxLineLen=0: -->
- <!-- :xml.root=users-guide.xml: -->
- <!-- jEdit 4.0 Plugin Guide, (C) 2001, 2002 John Gellene -->
- <!-- jEdit buffer-local properties: -->
- <!-- This is the introduction of the jEdit 4.0 Plugin Guide -->
- <!-- $Id: plugin-intro.xml 9999 2007-07-11 18:15:37Z ezust $ -->
-
- <indexterm>
- <primary>Plugin API</primary>
- <secondary>introduction</secondary>
- </indexterm>
-
- <para>The <firstterm>jEdit Plugin API</firstterm> provides a framework for
- hosting plugin applications without imposing any requirements on the design
- or function of the plugin itself. You could write an application that
- performs spell checking, displays a clock or plays chess and turn it into a
- jEdit plugin. There are currently over 50 released plugins for jEdit. While
- none of them play chess, they perform a wide variety of editing and file
- management tasks.</para>
-
- <para>A detailed listing of available plugins is available at <ulink
- url="http://plugins.jedit.org">plugins.jedit.org</ulink>. You can also find
- beta versions of new plugins in the <quote>Downloads</quote> area of <ulink
- url="http://community.jedit.org">community.jedit.org</ulink>.</para>
-
- <para>Using the <quote>Plugin Manager</quote> feature of jEdit, users with
- an Internet connection can check for new or updated plugins and install and
- remove them without leaving jEdit. See <xref linkend="using-plugins" /> for
- details.</para>
-
- <para>Requirements for <quote>plugging in</quote> to jEdit are as
- follows:</para>
-
- <itemizedlist>
- <listitem>
- <para>This plugin must supply information about itself, such as its
- name, version, author, and compatibility with versions of
- jEdit.</para>
- </listitem>
-
- <listitem>
- <para>The plugin must provide for activating, displaying and
- deactivating itself upon direction from jEdit, typically in response
- to user input<footnote>
- <para>You should test your plugin by loading and unloading
- it from both the Plugin Manager, as well as the <emphasis
- role="bold">Activator Plugin</emphasis>.</para>
- </footnote>. Make sure you can continue to use both your plugin
- and the editor after it has been reloaded.</para>
- </listitem>
-
- <listitem>
- <para>Each Plugin has an ActionSet defined by jEdit, which is added
- to the main ActionContext. The ActionSet is a container for
- EditAction instances. The plugin may define
- <firstterm>actions</firstterm> in a number of ways. One way is
- explicitly, with an action definition file known as
- <literal>actions.xml</literal>. Another is implicitly, by defining
- dockable windows in <literal>dockables.xml</literal>.</para>
-
- <para>Most EditActions are small blocks of BeanShell code that jEdit
- will perform on behalf of the plugin upon user request. They provide
- the <quote>glue</quote> between user input and specific plugin
- routines.</para>
-
- <para>By convention, plugins display their available actions in
- submenus of jEdit's <guimenu>Plugins</guimenu> menu; each menu item
- corresponds to an action. Plugin authors do not define specific
- shortcuts - the user can/will assign EditActions to keyboard
- shortcuts, toolbar buttons, or entries in the text area's Context
- menu (right-click menu).</para>
- </listitem>
-
- <listitem>
- <para>The plugin may, but need not, provide a user interface.</para>
-
- <para>If the plugin has a visible interface, it can be shown in any
- object derived from one of Java top-level container classes:
- <classname>JWindow</classname>, <classname>JDialog</classname>, or
- <classname>JFrame</classname>. jEdit also provides a dockable window
- API, which allows plugin windows derived from the
- <classname>JComponent</classname> class to be docked into views or
- shown in top-level frames, at the user's request.</para>
-
- <para>Plugins can also act directly upon jEdit's text area. They can
- add graphical elements to the text display (like error highlighting
- in the case of the <application>ErrorList</application> plugin) or
- decorations surrounding the text area (like the
- <application>JDiff</application> plugin's summary views). These
- plugins are dependent on the JEditTextArea class, which is currently
- getting refactored.</para>
- </listitem>
-
- <listitem>
- <para>Plugins may provide a range of options that the user can
- modify to alter their configuration.</para>
-
- <para>If a plugin provides configuration options in accordance with
- the plugin API, jEdit will make them available in the
- <guilabel>Global Options</guilabel> dialog box.</para>
- </listitem>
-
- <listitem>
- <para>While it is not required, plugins are encouraged to provide
- documentation.</para>
- </listitem>
- </itemizedlist>
-
- <para>As noted, many of these features are optional; it is possible to write
- a plugin that does not provide actions, configuration options, or dockable
- windows. The majority of plugins, however, provide most of these
- services.</para>
-
- <sidebar>
- <title>Plugins and different jEdit versions</title>
-
- <para>As jEdit continues to evolve and improve, elements of the API may
- change with a new jEdit release.</para>
-
- <para>On occasion an API change will break code used by plugins,
- although efforts are made to maintain or deprecate plugin-related code
- on a transitional basis. While the majority of plugins are unaffected by
- most changes and will continue working, it is a good idea to monitor the
- jEdit change log, and join the <literal>jedit-devel</literal> mailing list, to keep updated on changes and bug reports, so that you will know when your
- plugin needs to be updated.
- </para>
- </sidebar>
-</chapter>
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="plugin-intro">
+ <title>Introducing the Plugin API</title>
+ <!-- :indentSize=1:tabSize=2:noTabs=true:wrap=soft:maxLineLen=0: -->
+ <!-- :xml.root=users-guide.xml: -->
+ <!-- jEdit 4 Plugin Guide, (C) 2001, 2002 John Gellene -->
+ <!-- jEdit buffer-local properties: -->
+ <!-- This is the introduction of the jEdit 4 Plugin Guide -->
+ <!-- $Id: plugin-intro.xml 17179 2010-02-02 05:56:07Z ezust $ -->
+
+ <indexterm>
+ <primary>Plugin API</primary>
+ <secondary>introduction</secondary>
+ </indexterm>
+
+ <para>The <firstterm>jEdit Plugin API</firstterm> provides a framework for
+ hosting plugin applications without imposing any requirements on the design
+ or function of the plugin itself. You could write an application that
+ performs spell checking, displays a clock or plays chess and turn it into a
+ jEdit plugin. There are currently over 50 released plugins for jEdit. While
+ none of them play chess, they perform a wide variety of editing and file
+ management tasks.</para>
+
+ <para>A detailed listing of available plugins is available at <ulink
+ url="http://plugins.jedit.org">plugins.jedit.org</ulink>. You can also find
+ beta versions of new plugins in the <quote>Downloads</quote> area of <ulink
+ url="http://community.jedit.org">community.jedit.org</ulink>.</para>
+
+ <para>Using the <quote>Plugin Manager</quote> feature of jEdit, users with
+ an Internet connection can check for new or updated plugins and install and
+ remove them without leaving jEdit. See <xref linkend="using-plugins" /> for
+ details.</para>
+
+ <para>Requirements for <quote>plugging in</quote> to jEdit are as
+ follows:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>This plugin must supply information about itself, such as its
+ name, version, author, and compatibility with versions of
+ jEdit.</para>
+ </listitem>
+
+ <listitem>
+ <para>The plugin must provide for activating, displaying and
+ deactivating itself upon direction from jEdit, typically in response
+ to user input<footnote>
+ <para>You should test your plugin by loading and unloading
+ it from both the Plugin Manager, as well as the <emphasis
+ role="bold">Activator Plugin</emphasis>.</para>
+ </footnote>. Make sure you can continue to use both your plugin
+ and the editor after it has been reloaded.</para>
+ </listitem>
+
+ <listitem>
+ <para>Each Plugin has an ActionSet defined by jEdit, which is added
+ to the main ActionContext. The ActionSet is a container for
+ EditAction instances. The plugin may define
+ <firstterm>actions</firstterm> in a number of ways. One way is
+ explicitly, with an action definition file known as
+ <literal>actions.xml</literal>. Another is implicitly, by defining
+ dockable windows in <literal>dockables.xml</literal>.</para>
+
+ <para>Most EditActions are small blocks of BeanShell code that jEdit
+ will perform on behalf of the plugin upon user request. They provide
+ the <quote>glue</quote> between user input and specific plugin
+ routines.</para>
+
+ <para>By convention, plugins display their available actions in
+ submenus of jEdit's <guimenu>Plugins</guimenu> menu; each menu item
+ corresponds to an action. Plugin authors do not define specific
+ shortcuts - the user can/will assign EditActions to keyboard
+ shortcuts, toolbar buttons, or entries in the text area's Context
+ menu (right-click menu).</para>
+ </listitem>
+
+ <listitem>
+ <para>The plugin may, but need not, provide a user interface.</para>
+
+ <para>If the plugin has a visible interface, it can be shown in any
+ object derived from one of Java top-level container classes:
+ <classname>JWindow</classname>, <classname>JDialog</classname>, or
+ <classname>JFrame</classname>. jEdit also provides a dockable window
+ API, which allows plugin windows derived from the
+ <classname>JComponent</classname> class to be docked into views or
+ shown in top-level frames, at the user's request.</para>
+
+ <para>Plugins can also act directly upon jEdit's text area. They can
+ add graphical elements to the text display (like error highlighting
+ in the case of the <application>ErrorList</application> plugin) or
+ decorations surrounding the text area (like the
+ <application>JDiff</application> plugin's summary views). These
+ plugins are dependent on the JEditTextArea class, which is currently
+ getting refactored.</para>
+ </listitem>
+
+ <listitem>
+ <para>Plugins may provide a range of options that the user can
+ modify to alter their configuration.</para>
+
+ <para>If a plugin provides configuration options in accordance with
+ the plugin API, jEdit will make them available in the
+ <guilabel>Global Options</guilabel> dialog box.</para>
+ </listitem>
+
+ <listitem>
+ <para>While it is not required, plugins are encouraged to provide
+ documentation.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>As noted, many of these features are optional; it is possible to write
+ a plugin that does not provide actions, configuration options, or dockable
+ windows. The majority of plugins, however, provide most of these
+ services.</para>
+
+ <sidebar>
+ <title>Plugins and different jEdit versions</title>
+
+ <para>As jEdit continues to evolve and improve, elements of the API may
+ change with a new jEdit release.</para>
+
+ <para>On occasion an API change will break code used by plugins,
+ although efforts are made to maintain or deprecate plugin-related code
+ on a transitional basis. While the majority of plugins are unaffected by
+ most changes and will continue working, it is a good idea to monitor the
+ jEdit change log, and join the <literal>jedit-devel</literal> mailing list, to keep updated on changes and bug reports, so that you will know when your
+ plugin needs to be updated.
+ </para>
+ </sidebar>
+</chapter>
diff --git a/jEdit/doc/users-guide/plugin-tips.xml b/jEdit/doc/users-guide/plugin-tips.xml
index 3b22a31..914463d 100644
--- a/jEdit/doc/users-guide/plugin-tips.xml
+++ b/jEdit/doc/users-guide/plugin-tips.xml
@@ -1,160 +1,160 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter id="plugin-tips">
- <title>Plugin Tips and Techniques</title>
- <!-- jEdit buffer-local properties: -->
- <!-- :tabSize=1:indentSize=1:noTabs=true: -->
- <!-- :xml.root=users-guide.xml: -->
-
- <section id="plugin-tips-libraries">
- <title>Bundling Additional Class Libraries</title>
-
- <para>Recall that any class whose name ends with
- <classname>Plugin.class</classname> is called a plugin core class. JAR
- files with no plugin core classes are also loaded by jEdit; the classes
- they contain are made available to other plugins. Many plugins that rely
- on third-party class libraries ship them as separate JAR files. The
- libraries will be available inside the jEdit environment but are not
- part of a general classpath or library collection when running other
- Java applications.</para>
-
- <para>A plugin that bundles extra JAR files must list them in the
- <filename>plugin.<replaceable>class name</replaceable>.jars</filename>
- property. See the documentation for the <ulink
- url="../api/org/gjt/sp/jedit/EditPlugin.html">
- <classname>EditPlugin</classname></ulink> class for details.</para>
- </section>
-
- <section id="plugin-tips-non-java-libraries">
- <title>Bundling Additional Non-Java Libraries</title>
-
- <para>If your plugin bundles non-Java files, like native libraries, you
- need to list them in the <filename>plugin.<replaceable>class
- name</replaceable>.files</filename> property. If you don't do so, they
- don't get deleted if the plugin is uninstalled. See the documentation
- for the <ulink url="../api/org/gjt/sp/jedit/EditPlugin.html">
- <classname>EditPlugin</classname></ulink> class for details.</para>
- </section>
-
- <section id="plugin-tips-plugin-data">
- <title>Storing plugin data</title>
-
- <para>If your plugin needs to create files and store data in the
- filesystem, you should use the <methodname>getPluginHome()</methodname>
- API of the <classname>EditPlugin</classname> class. To signal that you
- use the plugin home API you have to set the
- <filename>plugin.<replaceable>class
- name</replaceable>.usePluginHome</filename> property to
- <constant>true</constant>. Even if your plugin doesn't create any files,
- you should set the property to <constant>true</constant>, so that e. g.
- the plugin manager knows that there is actually no data in favor of not
- knowing if there is any data and thus displaying that it doesn't know
- the data size. See the documentation for the <ulink
- url="../api/org/gjt/sp/jedit/EditPlugin.html"><classname>EditPlugin</classname></ulink>
- class for details.</para>
- </section>
-
- <section id="plugin-tips-colors">
- <title>Plugin colors</title>
- <para>There are a number of colors used by the View that should also be
- used by plugins where possible. This helps promote a consistent color
- scheme throughout jEdit.
- </para><para>
- The main color properties are:
- </para>
- <itemizedlist>
- <listitem><para><literal>view.bgColor</literal> - the background color of the main text area</para></listitem>
- <listitem><para><literal>view.fgColor</literal> - the base foreground color for text in the main text area</para></listitem>
- <listitem><para><literal>view.lineHighlightColor</literal> - color of the current line highlight</para></listitem>
- <listitem><para><literal>view.selectionColor</literal> - the color of selected text in the main text area</para></listitem>
- <listitem><para><literal>view.caretColor</literal> - the color of the caret in the main text area</para></listitem>
- <listitem><para><literal>view.eolMarkerColor</literal> - the color of the end-of-line marker</para></listitem>
- </itemizedlist>
- <para>
- To use these colors in your plugin, use
- <programlisting>jEdit.getColorProperty("view.whatever", default_color)</programlisting>
- </para>
- <para>
- For example, the QuickNotepad example should have lines like this:
- </para>
- <programlisting>
- textarea.setBackground(jEdit.getColorProperty("view.bgColor", Color.WHITE);
- textarea.setForeground(jEdit.getColorProperty("view.fgColor", Color.BLACK);
- </programlisting><para>
- This sets the foreground and background colors of QuickNotepad to be the same
- as those in the View.
- </para>
- <para>
- There are other color properties that may be useful, depending on what your
- plugin displays.
- </para>
- <para>
- Gutter colors:
- </para><itemizedlist>
- <listitem><para><literal>view.gutter.bgColor</literal></para></listitem>
- <listitem><para><literal>view.gutter.currentLineColor</literal></para></listitem>
- <listitem><para><literal>view.gutter.fgColor</literal></para></listitem>
- <listitem><para><literal>view.gutter.focusBorderColor</literal></para></listitem>
- <listitem><para><literal>view.gutter.foldColor</literal></para></listitem>
- <listitem><para><literal>view.gutter.highlightColor</literal></para></listitem>
- <listitem><para><literal>view.gutter.markerColor</literal></para></listitem>
- <listitem><para><literal>view.gutter.noFocusBorderColor</literal></para></listitem>
- <listitem><para><literal>view.gutter.registerColor</literal></para></listitem>
- <listitem><para><literal>view.gutter.structureHighlightColor</literal></para></listitem>
- </itemizedlist>
- <para>
- Status bar colors:
- </para>
- <itemizedlist>
- <listitem><para><literal>view.status.background</literal></para></listitem>
- <listitem><para><literal>view.status.foreground</literal></para></listitem>
- <listitem><para><literal>view.status.memory.background</literal></para></listitem>
- <listitem><para><literal>view.status.memory.foreground</literal></para></listitem>
- </itemizedlist>
- <para>
- </para><para>
- Structure highlight colors:
- </para><itemizedlist>
- <listitem><para><literal>view.structureHighlightColor</literal></para></listitem>
- <listitem><para><literal>view.structureHighlightColor</literal></para></listitem>
- </itemizedlist>
- <para>
- Style colors. Use <classname>GUIUtilities.parseStyle</classname> for these.
- </para>
- <itemizedlist>
- <listitem><para><literal>view.style.comment1</literal></para></listitem>
- <listitem><para><literal>view.style.comment2</literal></para></listitem>
- <listitem><para><literal>view.style.comment3</literal></para></listitem>
- <listitem><para><literal>view.style.comment4</literal></para></listitem>
- <listitem><para><literal>view.style.digit</literal></para></listitem>
- <listitem><para><literal>view.style.foldLine.0</literal></para></listitem>
- <listitem><para><literal>view.style.foldLine.1</literal></para></listitem>
- <listitem><para><literal>view.style.foldLine.2</literal></para></listitem>
- <listitem><para><literal>view.style.foldLine.3</literal></para></listitem>
- <listitem><para><literal>view.style.function</literal></para></listitem>
- <listitem><para><literal>view.style.invalid</literal></para></listitem>
- <listitem><para><literal>view.style.keyword1</literal></para></listitem>
- <listitem><para><literal>view.style.keyword2</literal></para></listitem>
- <listitem><para><literal>view.style.keyword3</literal></para></listitem>
- <listitem><para><literal>view.style.keyword4</literal></para></listitem>
- <listitem><para><literal>view.style.label</literal></para></listitem>
- <listitem><para><literal>view.style.literal1</literal></para></listitem>
- <listitem><para><literal>view.style.literal2</literal></para></listitem>
- <listitem><para><literal>view.style.literal3</literal></para></listitem>
- <listitem><para><literal>view.style.literal4</literal></para></listitem>
- <listitem><para><literal>view.style.markup</literal></para></listitem>
- <listitem><para><literal>view.style.operator</literal></para></listitem>
- <listitem><para><literal>view.wrapGuideColor</literal></para></listitem>
- </itemizedlist>
- <para>
- For example, here is a setting for a fold line color:
- </para>
- <programlisting>
- view.style.foldLine.0=color\:\#000000 bgColor\:\#f5deb8 style\:b
- </programlisting>
- <para>
- Passing the value to <classname>GUIUtilities.parseStyle</classname> will
- return a SyntaxStyle object, which you can query for background color,
- foreground color, and font.
- </para>
- </section>
-</chapter>
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="plugin-tips">
+ <title>Plugin Tips and Techniques</title>
+ <!-- jEdit buffer-local properties: -->
+ <!-- :tabSize=1:indentSize=1:noTabs=true: -->
+ <!-- :xml.root=users-guide.xml: -->
+
+ <section id="plugin-tips-libraries">
+ <title>Bundling Additional Class Libraries</title>
+
+ <para>Recall that any class whose name ends with
+ <classname>Plugin.class</classname> is called a plugin core class. JAR
+ files with no plugin core classes are also loaded by jEdit; the classes
+ they contain are made available to other plugins. Many plugins that rely
+ on third-party class libraries ship them as separate JAR files. The
+ libraries will be available inside the jEdit environment but are not
+ part of a general classpath or library collection when running other
+ Java applications.</para>
+
+ <para>A plugin that bundles extra JAR files must list them in the
+ <filename>plugin.<replaceable>class name</replaceable>.jars</filename>
+ property. See the documentation for the <ulink
+ url="../api/org/gjt/sp/jedit/EditPlugin.html">
+ <classname>EditPlugin</classname></ulink> class for details.</para>
+ </section>
+
+ <section id="plugin-tips-non-java-libraries">
+ <title>Bundling Additional Non-Java Libraries</title>
+
+ <para>If your plugin bundles non-Java files, like native libraries, you
+ need to list them in the <filename>plugin.<replaceable>class
+ name</replaceable>.files</filename> property. If you don't do so, they
+ don't get deleted if the plugin is uninstalled. See the documentation
+ for the <ulink url="../api/org/gjt/sp/jedit/EditPlugin.html">
+ <classname>EditPlugin</classname></ulink> class for details.</para>
+ </section>
+
+ <section id="plugin-tips-plugin-data">
+ <title>Storing plugin data</title>
+
+ <para>If your plugin needs to create files and store data in the
+ filesystem, you should use the <methodname>getPluginHome()</methodname>
+ API of the <classname>EditPlugin</classname> class. To signal that you
+ use the plugin home API you have to set the
+ <filename>plugin.<replaceable>class
+ name</replaceable>.usePluginHome</filename> property to
+ <constant>true</constant>. Even if your plugin doesn't create any files,
+ you should set the property to <constant>true</constant>, so that e. g.
+ the plugin manager knows that there is actually no data in favor of not
+ knowing if there is any data and thus displaying that it doesn't know
+ the data size. See the documentation for the <ulink
+ url="../api/org/gjt/sp/jedit/EditPlugin.html"><classname>EditPlugin</classname></ulink>
+ class for details.</para>
+ </section>
+
+ <section id="plugin-tips-colors">
+ <title>Plugin colors</title>
+ <para>There are a number of colors used by the View that should also be
+ used by plugins where possible. This helps promote a consistent color
+ scheme throughout jEdit.
+ </para><para>
+ The main color properties are:
+ </para>
+ <itemizedlist>
+ <listitem><para><literal>view.bgColor</literal> - the background color of the main text area</para></listitem>
+ <listitem><para><literal>view.fgColor</literal> - the base foreground color for text in the main text area</para></listitem>
+ <listitem><para><literal>view.lineHighlightColor</literal> - color of the current line highlight</para></listitem>
+ <listitem><para><literal>view.selectionColor</literal> - the color of selected text in the main text area</para></listitem>
+ <listitem><para><literal>view.caretColor</literal> - the color of the caret in the main text area</para></listitem>
+ <listitem><para><literal>view.eolMarkerColor</literal> - the color of the end-of-line marker</para></listitem>
+ </itemizedlist>
+ <para>
+ To use these colors in your plugin, use
+ <programlisting>jEdit.getColorProperty("view.whatever", default_color)</programlisting>
+ </para>
+ <para>
+ For example, the QuickNotepad example should have lines like this:
+ </para>
+ <programlisting>
+ textarea.setBackground(jEdit.getColorProperty("view.bgColor", Color.WHITE);
+ textarea.setForeground(jEdit.getColorProperty("view.fgColor", Color.BLACK);
+ </programlisting><para>
+ This sets the foreground and background colors of QuickNotepad to be the same
+ as those in the View.
+ </para>
+ <para>
+ There are other color properties that may be useful, depending on what your
+ plugin displays.
+ </para>
+ <para>
+ Gutter colors:
+ </para><itemizedlist>
+ <listitem><para><literal>view.gutter.bgColor</literal></para></listitem>
+ <listitem><para><literal>view.gutter.currentLineColor</literal></para></listitem>
+ <listitem><para><literal>view.gutter.fgColor</literal></para></listitem>
+ <listitem><para><literal>view.gutter.focusBorderColor</literal></para></listitem>
+ <listitem><para><literal>view.gutter.foldColor</literal></para></listitem>
+ <listitem><para><literal>view.gutter.highlightColor</literal></para></listitem>
+ <listitem><para><literal>view.gutter.markerColor</literal></para></listitem>
+ <listitem><para><literal>view.gutter.noFocusBorderColor</literal></para></listitem>
+ <listitem><para><literal>view.gutter.registerColor</literal></para></listitem>
+ <listitem><para><literal>view.gutter.structureHighlightColor</literal></para></listitem>
+ </itemizedlist>
+ <para>
+ Status bar colors:
+ </para>
+ <itemizedlist>
+ <listitem><para><literal>view.status.background</literal></para></listitem>
+ <listitem><para><literal>view.status.foreground</literal></para></listitem>
+ <listitem><para><literal>view.status.memory.background</literal></para></listitem>
+ <listitem><para><literal>view.status.memory.foreground</literal></para></listitem>
+ </itemizedlist>
+ <para>
+ </para><para>
+ Structure highlight colors:
+ </para><itemizedlist>
+ <listitem><para><literal>view.structureHighlightColor</literal></para></listitem>
+ <listitem><para><literal>view.structureHighlightColor</literal></para></listitem>
+ </itemizedlist>
+ <para>
+ Style colors. Use <classname>GUIUtilities.parseStyle</classname> for these.
+ </para>
+ <itemizedlist>
+ <listitem><para><literal>view.style.comment1</literal></para></listitem>
+ <listitem><para><literal>view.style.comment2</literal></para></listitem>
+ <listitem><para><literal>view.style.comment3</literal></para></listitem>
+ <listitem><para><literal>view.style.comment4</literal></para></listitem>
+ <listitem><para><literal>view.style.digit</literal></para></listitem>
+ <listitem><para><literal>view.style.foldLine.0</literal></para></listitem>
+ <listitem><para><literal>view.style.foldLine.1</literal></para></listitem>
+ <listitem><para><literal>view.style.foldLine.2</literal></para></listitem>
+ <listitem><para><literal>view.style.foldLine.3</literal></para></listitem>
+ <listitem><para><literal>view.style.function</literal></para></listitem>
+ <listitem><para><literal>view.style.invalid</literal></para></listitem>
+ <listitem><para><literal>view.style.keyword1</literal></para></listitem>
+ <listitem><para><literal>view.style.keyword2</literal></para></listitem>
+ <listitem><para><literal>view.style.keyword3</literal></para></listitem>
+ <listitem><para><literal>view.style.keyword4</literal></para></listitem>
+ <listitem><para><literal>view.style.label</literal></para></listitem>
+ <listitem><para><literal>view.style.literal1</literal></para></listitem>
+ <listitem><para><literal>view.style.literal2</literal></para></listitem>
+ <listitem><para><literal>view.style.literal3</literal></para></listitem>
+ <listitem><para><literal>view.style.literal4</literal></para></listitem>
+ <listitem><para><literal>view.style.markup</literal></para></listitem>
+ <listitem><para><literal>view.style.operator</literal></para></listitem>
+ <listitem><para><literal>view.wrapGuideColor</literal></para></listitem>
+ </itemizedlist>
+ <para>
+ For example, here is a setting for a fold line color:
+ </para>
+ <programlisting>
+ view.style.foldLine.0=color\:\#000000 bgColor\:\#f5deb8 style\:b
+ </programlisting>
+ <para>
+ Passing the value to <classname>GUIUtilities.parseStyle</classname> will
+ return a SyntaxStyle object, which you can query for background color,
+ foreground color, and font.
+ </para>
+ </section>
+</chapter>
diff --git a/jEdit/doc/users-guide/regexps.xml b/jEdit/doc/users-guide/regexps.xml
index a5fab29..6ab6983 100644
--- a/jEdit/doc/users-guide/regexps.xml
+++ b/jEdit/doc/users-guide/regexps.xml
@@ -1,252 +1,257 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<appendix id="regexps">
- <title>Regular Expressions</title>
-
- <!-- jEdit buffer-local properties: -->
-
- <!-- :indentSize=1:noTabs=yes: -->
-
- <!-- :xml.root=users-guide.xml: -->
-
- <para>jEdit 4.3pre5 and later uses regular expressions from <ulink
- url="http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html">java.util.regex.Pattern</ulink>
- to implement inexact search and replace. Click there to see a complete
- reference guide to all supported meta-characters.</para>
-
- <para>A regular expression consists of a string where some characters are
- given special meaning with regard to pattern matching.</para>
-
- <note>
- <title>Inside XML files</title>
-
- <para>Inside XML files (such as Jedit mode files), it is important that
- you escape XML special characters, such as &, <, >, etc. You
- can use the XML plugin's "characters to entities" to perform this
- mapping.</para>
- </note>
-
- <note>
- <title>Inside Java / beanshell / properties files</title>
-
- <para>Java strings are always parsed by java before they are processed
- by the regular expression engine, so you must make sure that backslashes
- are escaped by an extra backslash (<literal>\\</literal>)</para>
- </note>
-
- <para>Within a regular expression, the following characters have special
- meaning:</para>
-
- <bridgehead renderas="section">Positional Operators</bridgehead>
-
- <itemizedlist>
- <listitem>
- <para><literal>^</literal> matches at the beginning of a line</para>
- </listitem>
-
- <listitem>
- <para><literal>$</literal> matches at the end of a line</para>
- </listitem>
-
- <listitem>
- <para><literal>\B</literal> matches at a non-word break</para>
- </listitem>
-
- <listitem>
- <para><literal>\b</literal> matches at a word boundary</para>
- </listitem>
- </itemizedlist>
-
- <bridgehead renderas="section">One-Character Operators</bridgehead>
-
- <itemizedlist>
- <listitem>
- <para><literal>.</literal> matches any single character</para>
- </listitem>
-
- <listitem>
- <para><literal>\d</literal> matches any decimal digit</para>
- </listitem>
-
- <listitem>
- <para><literal>\D</literal> matches any non-digit</para>
- </listitem>
-
- <listitem>
- <para><literal>\n</literal> matches the newline character</para>
- </listitem>
-
- <listitem>
- <para><literal>\s</literal> matches any whitespace character</para>
- </listitem>
-
- <listitem>
- <para><literal>\S</literal> matches any non-whitespace
- character</para>
- </listitem>
-
- <listitem>
- <para><literal>\t</literal> matches a horizontal tab
- character</para>
- </listitem>
-
- <listitem>
- <para><literal>\w</literal> matches any word (alphanumeric)
- character</para>
- </listitem>
-
- <listitem>
- <para><literal>\W</literal> matches any non-word (alphanumeric)
- character</para>
- </listitem>
-
- <listitem>
- <para><literal>\\</literal> matches the backslash (<quote>\</quote>)
- character</para>
- </listitem>
- </itemizedlist>
-
- <bridgehead renderas="section">Character Class Operator</bridgehead>
-
- <itemizedlist>
- <listitem>
- <para><literal>[<replaceable>abc</replaceable>]</literal> matches
- any character in the set <replaceable>a</replaceable>,
- <replaceable>b</replaceable> or <replaceable>c</replaceable></para>
- </listitem>
-
- <listitem>
- <para><literal>[^<replaceable>abc</replaceable>]</literal> matches
- any character not in the set <replaceable>a</replaceable>,
- <replaceable>b</replaceable> or <replaceable>c</replaceable></para>
- </listitem>
-
- <listitem>
- <para><literal>[<replaceable>a-z</replaceable>]</literal> matches
- any character in the range <replaceable>a</replaceable> to
- <replaceable>z</replaceable>, inclusive. A leading or trailing dash
- will be interpreted literally</para>
- </listitem>
- </itemizedlist>
-
- <bridgehead renderas="section">Subexpressions and Backreferences</bridgehead>
-
- <itemizedlist>
- <listitem>
- <para><literal>(<replaceable>abc</replaceable>)</literal> matches
- whatever the expression <replaceable>abc</replaceable> would match,
- and saves it as a subexpression. Also used for grouping</para>
- </listitem>
-
- <listitem>
- <para><literal>(?:<replaceable>...</replaceable>)</literal> pure
- grouping operator, does not save contents</para>
- </listitem>
-
- <listitem>
- <para><literal>(?#<replaceable>...</replaceable>)</literal> embedded
- comment, ignored by engine</para>
- </listitem>
-
- <listitem>
- <para><literal>(?=<replaceable>...</replaceable>)</literal> positive
- lookahead; the regular expression will match if the text in the
- brackets matches, but that text will not be considered part of the
- match</para>
- </listitem>
-
- <listitem>
- <para><literal>(?!<replaceable>...</replaceable>)</literal> negative
- lookahead; the regular expression will match if the text in the
- brackets does not match, and that text will not be considered part
- of the match</para>
- </listitem>
-
- <listitem>
- <para><literal>\<replaceable>n</replaceable></literal> where 0 <
- <replaceable>n</replaceable> < 10, matches the same thing the
- <replaceable>n</replaceable>th subexpression matched. Can only be
- used in the search string</para>
- </listitem>
-
- <listitem>
- <para><literal>$<replaceable>n</replaceable></literal> where 0 <
- <replaceable>n</replaceable> < 10, substituted with the text
- matched by the <replaceable>n</replaceable>th subexpression. Can
- only be used in the replacement string</para>
- </listitem>
- </itemizedlist>
-
- <bridgehead renderas="section">Branching (Alternation) Operator</bridgehead>
-
- <itemizedlist>
- <listitem>
- <para><literal><replaceable>a</replaceable>|<replaceable>b</replaceable></literal>
- matches whatever the expression <replaceable>a</replaceable> would
- match, or whatever the expression <replaceable>b</replaceable> would
- match.</para>
- </listitem>
- </itemizedlist>
-
- <bridgehead renderas="section">Repeating Operators</bridgehead>
-
- <para>These symbols operate on the previous atomic expression.</para>
-
- <itemizedlist>
- <listitem>
- <para><literal>?</literal> matches the preceding expression or the
- null string</para>
- </listitem>
-
- <listitem>
- <para><literal>*</literal> matches the null string or any number of
- repetitions of the preceding expression</para>
- </listitem>
-
- <listitem>
- <para><literal>+</literal> matches one or more repetitions of the
- preceding expression</para>
- </listitem>
-
- <listitem>
- <para><literal>{<replaceable>m</replaceable>}</literal> matches
- exactly <replaceable>m</replaceable> repetitions of the
- one-character expression</para>
- </listitem>
-
- <listitem>
- <para><literal>{<replaceable>m</replaceable>,<replaceable>n</replaceable>}</literal>
- matches between <replaceable>m</replaceable> and
- <replaceable>n</replaceable> repetitions of the preceding
- expression, inclusive</para>
- </listitem>
-
- <listitem>
- <para><literal>{<replaceable>m</replaceable>,}</literal> matches
- <replaceable>m</replaceable> or more repetitions of the preceding
- expression</para>
- </listitem>
- </itemizedlist>
-
- <bridgehead renderas="section">Stingy (Minimal) Matching</bridgehead>
-
- <para>If a repeating operator (above) is immediately followed by a
- <literal>?</literal>, the repeating operator will stop at the smallest
- number of repetitions that can complete the rest of the match.</para>
- <note>
- <title>On regex search</title>
-
- <para>There are some known issues with the
- <literal>java.util.regex</literal> library, as it stands in
- Sun's Java 1.5 and 1.6. In particular, it is possible to create
- regular expressions that hang the JVM, or cause stack overflow
- errors, which was not as easy to accomplish using the legacy
- <literal>gnu.regexp</literal> library. If you find that
- <literal>gnu.regexp</literal>, used in jEdit 4.2 and earlier, is
- more suitable for your search/replace needs, you can try the
- <emphasis role="bold">XSearch plugin</emphasis>, which still
- uses it and can provide a replacement to the built-in search
- dialog.</para>
- </note>
-
-
+<?xml version="1.0" encoding="UTF-8"?>
+<appendix id="regexps">
+ <title>Regular Expressions</title>
+
+ <!-- jEdit buffer-local properties: -->
+
+ <!-- :indentSize=1:noTabs=yes: -->
+
+ <!-- :xml.root=users-guide.xml: -->
+
+ <para>jEdit 4.3pre5 and later uses regular expressions from <ulink
+ url="http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html">java.util.regex.Pattern</ulink>
+ to implement inexact search and replace. Click there to see a complete
+ reference guide to all supported meta-characters.</para>
+
+ <para>A regular expression consists of a string where some characters are
+ given special meaning with regard to pattern matching.</para>
+
+ <note>
+ <title>Inside XML files</title>
+
+ <para>Inside XML files (such as Jedit mode files), it is important that
+ you escape XML special characters, such as &, <, >, etc. You
+ can use the XML plugin's "characters to entities" to perform this
+ mapping.</para>
+ </note>
+
+ <note>
+ <title>Inside Java / beanshell / properties files</title>
+
+ <para>Java strings are always parsed by java before they are processed
+ by the regular expression engine, so you must make sure that backslashes
+ are escaped by an extra backslash (<literal>\\</literal>)</para>
+ </note>
+
+ <para>Within a regular expression, the following characters have special
+ meaning:</para>
+
+ <bridgehead>Positional Operators</bridgehead>
+
+ <itemizedlist>
+ <listitem>
+ <para><literal>^</literal> matches at the beginning of a line</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>$</literal> matches at the end of a line</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>\B</literal> matches at a non-word break</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>\b</literal> matches at a word boundary</para>
+ </listitem>
+ </itemizedlist>
+
+ <bridgehead>One-Character Operators</bridgehead>
+
+ <itemizedlist>
+ <listitem>
+ <para><literal>.</literal> matches any single character</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>\d</literal> matches any decimal digit</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>\D</literal> matches any non-digit</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>\n</literal> matches the newline character</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>\s</literal> matches any whitespace character</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>\xNN</literal> matches hexadecimal character code <literal>NN</literal></para>
+ </listitem>
+
+
+ <listitem>
+ <para><literal>\S</literal> matches any non-whitespace
+ character</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>\t</literal> matches a horizontal tab
+ character</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>\w</literal> matches any word (alphanumeric)
+ character</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>\W</literal> matches any non-word (alphanumeric)
+ character</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>\\</literal> matches the backslash (<quote>\</quote>)
+ character</para>
+ </listitem>
+ </itemizedlist>
+
+ <bridgehead>Character Class Operator</bridgehead>
+
+ <itemizedlist>
+ <listitem>
+ <para><literal>[<replaceable>abc</replaceable>]</literal> matches
+ any character in the set <replaceable>a</replaceable>,
+ <replaceable>b</replaceable> or <replaceable>c</replaceable></para>
+ </listitem>
+
+ <listitem>
+ <para><literal>[^<replaceable>abc</replaceable>]</literal> matches
+ any character not in the set <replaceable>a</replaceable>,
+ <replaceable>b</replaceable> or <replaceable>c</replaceable></para>
+ </listitem>
+
+ <listitem>
+ <para><literal>[<replaceable>a-z</replaceable>]</literal> matches
+ any character in the range <replaceable>a</replaceable> to
+ <replaceable>z</replaceable>, inclusive. A leading or trailing dash
+ will be interpreted literally</para>
+ </listitem>
+ </itemizedlist>
+
+ <bridgehead>Subexpressions and Backreferences</bridgehead>
+
+ <itemizedlist>
+ <listitem>
+ <para><literal>(<replaceable>abc</replaceable>)</literal> matches
+ whatever the expression <replaceable>abc</replaceable> would match,
+ and saves it as a subexpression. Also used for grouping</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>(?:<replaceable>...</replaceable>)</literal> pure
+ grouping operator, does not save contents</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>(?#<replaceable>...</replaceable>)</literal> embedded
+ comment, ignored by engine</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>(?=<replaceable>...</replaceable>)</literal> positive
+ lookahead; the regular expression will match if the text in the
+ brackets matches, but that text will not be considered part of the
+ match</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>(?!<replaceable>...</replaceable>)</literal> negative
+ lookahead; the regular expression will match if the text in the
+ brackets does not match, and that text will not be considered part
+ of the match</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>\<replaceable>n</replaceable></literal> where 0 <
+ <replaceable>n</replaceable> < 10, matches the same thing the
+ <replaceable>n</replaceable>th subexpression matched. Can only be
+ used in the search string</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>$<replaceable>n</replaceable></literal> where 0 <
+ <replaceable>n</replaceable> < 10, substituted with the text
+ matched by the <replaceable>n</replaceable>th subexpression. Can
+ only be used in the replacement string</para>
+ </listitem>
+ </itemizedlist>
+
+ <bridgehead>Branching (Alternation) Operator</bridgehead>
+
+ <itemizedlist>
+ <listitem>
+ <para><literal><replaceable>a</replaceable>|<replaceable>b</replaceable></literal>
+ matches whatever the expression <replaceable>a</replaceable> would
+ match, or whatever the expression <replaceable>b</replaceable> would
+ match.</para>
+ </listitem>
+ </itemizedlist>
+
+ <bridgehead>Repeating Operators</bridgehead>
+
+ <para>These symbols operate on the previous atomic expression.</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><literal>?</literal> matches the preceding expression or the
+ null string</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>*</literal> matches the null string or any number of
+ repetitions of the preceding expression</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>+</literal> matches one or more repetitions of the
+ preceding expression</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>{<replaceable>m</replaceable>}</literal> matches
+ exactly <replaceable>m</replaceable> repetitions of the
+ one-character expression</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>{<replaceable>m</replaceable>,<replaceable>n</replaceable>}</literal>
+ matches between <replaceable>m</replaceable> and
+ <replaceable>n</replaceable> repetitions of the preceding
+ expression, inclusive</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>{<replaceable>m</replaceable>,}</literal> matches
+ <replaceable>m</replaceable> or more repetitions of the preceding
+ expression</para>
+ </listitem>
+ </itemizedlist>
+
+ <bridgehead>Stingy (Minimal) Matching</bridgehead>
+
+ <para>If a repeating operator (above) is immediately followed by a
+ <literal>?</literal>, the repeating operator will stop at the smallest
+ number of repetitions that can complete the rest of the match.</para>
+ <note>
+ <title>On regex search</title>
+
+ <para>There are some known issues with the
+ <literal>java.util.regex</literal> library, as it stands in
+ Sun's Java 1.5 and 1.6. In particular, it is possible to create
+ regular expressions that hang the JVM, or cause stack overflow
+ errors, which was not as easy to accomplish using the legacy
+ <literal>gnu.regexp</literal> library. If you find that
+ <literal>gnu.regexp</literal>, used in jEdit 4.2 and earlier, is
+ more suitable for your search/replace needs, you can try the
+ <emphasis role="bold">XSearch plugin</emphasis>, which still
+ uses it and can provide a replacement to the built-in search
+ dialog.</para>
+ </note>
+
+
</appendix>
\ No newline at end of file
diff --git a/jEdit/doc/users-guide/shortcuts.xml b/jEdit/doc/users-guide/shortcuts.xml
index 0daade5..e30e467 100644
--- a/jEdit/doc/users-guide/shortcuts.xml
+++ b/jEdit/doc/users-guide/shortcuts.xml
@@ -1,981 +1,995 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<appendix id="shortcuts">
- <title>Keyboard Shortcuts</title>
-
- <!-- jEdit buffer-local properties: -->
-
- <!-- :tabSize=1:indentSize=1:noTabs=true: -->
-
- <!-- :xml.root=users-guide.xml: -->
-
- <para>This appendix documents the default set of keyboard shortcuts. They
- can be customized to suit your taste in the <guibutton>Shortcuts</guibutton>
- pane of the <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box; see <xref linkend="global-opts" />.</para>
-
- <bridgehead renderas="section">Files</bridgehead>
-
- <para>For details, see <xref linkend="buffers" />, <xref linkend="views" />
- and <xref linkend="files" />.</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <colspec colnum="1" colwidth="2.2in" />
-
- <tbody>
- <row>
- <entry><keycap>C+n</keycap></entry>
-
- <entry>New file.</entry>
- </row>
-
- <row>
- <entry><keycap>C+o</keycap></entry>
-
- <entry>Open file.</entry>
- </row>
-
- <row>
- <entry><keycap>C+w</keycap></entry>
-
- <entry>Close buffer.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e C+w</keycap></entry>
-
- <entry>Close all buffers.</entry>
- </row>
-
- <row>
- <entry><keycap>C+s</keycap></entry>
-
- <entry>Save buffer.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e C+s</keycap></entry>
-
- <entry>Save all buffers.</entry>
- </row>
-
- <row>
- <entry><keycap>C+p</keycap></entry>
-
- <entry>Print buffer.</entry>
- </row>
-
- <row>
- <entry><keycap>C+PAGE_UP</keycap></entry>
-
- <entry>Go to previous buffer.</entry>
- </row>
-
- <row>
- <entry><keycap>C+PAGE_DOWN</keycap></entry>
-
- <entry>Go to next buffer.</entry>
- </row>
-
- <row>
- <entry><keycap>C+`</keycap></entry>
-
- <entry>Go to recent buffer.</entry>
- </row>
-
- <row>
- <entry><keycap>A+`</keycap></entry>
-
- <entry>Show buffer switcher.</entry>
- </row>
-
- <row>
- <entry><keycap>C+q</keycap></entry>
-
- <entry>Exit jEdit.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <bridgehead renderas="section">Views</bridgehead>
-
- <para>For details, see <xref linkend="views" />.</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <colspec colnum="1" colwidth="2.2in" />
-
- <tbody>
- <row>
- <entry><keycap>C+e C+t</keycap></entry>
-
- <entry>Turn gutter (line numbering) on and off.</entry>
- </row>
-
- <row>
- <entry><keycap>C+0</keycap></entry>
-
- <entry>Remove split containing current text area
- only.</entry>
- </row>
-
- <row>
- <entry><keycap>C+1</keycap></entry>
-
- <entry>Remove all splits.</entry>
- </row>
-
- <row>
- <entry><keycap>C+2</keycap></entry>
-
- <entry>Split view horizontally.</entry>
- </row>
-
- <row>
- <entry><keycap>C+3</keycap></entry>
-
- <entry>Split view vertically.</entry>
- </row>
-
- <row>
- <entry><keycap>A+PAGE_UP</keycap></entry>
-
- <entry>Send keyboard focus to previous text area.</entry>
- </row>
-
- <row>
- <entry><keycap>A+PAGE_DOWN</keycap></entry>
-
- <entry>Send keyboard focus to next text area.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e UP</keycap>; <keycap>LEFT</keycap>;
- <keycap>DOWN</keycap>; <keycap>RIGHT</keycap></entry>
-
- <entry>Send keyboard focus to top; bottom; left; right
- docking area.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e C+`</keycap></entry>
-
- <entry>Close currently focused docking area.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <bridgehead renderas="section">Action Bar</bridgehead>
-
- <para>For details, see <xref linkend="action-bar" />.</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <colspec colnum="1" colwidth="2.2in" />
-
- <tbody>
- <row>
- <entry><keycap>C+ENTER</keycap></entry>
-
- <entry>Display the action bar and give it keyboard
- focus.</entry>
- </row>
-
- <row>
- <entry><keycap>C+SPACE</keycap></entry>
-
- <entry>Repeat last editor action.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <bridgehead renderas="section">Moving the Caret</bridgehead>
-
- <para>For details, see <xref linkend="caret" />, <xref linkend="words" />,
- <xref linkend="lines" />, <xref linkend="paragraphs" /> and <xref
- linkend="bracket-matching" />.</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <colspec colnum="1" colwidth="2.2in" />
-
- <tbody>
- <row>
- <entry><keycap><replaceable>Arrow</replaceable></keycap></entry>
-
- <entry>Move caret one character or line.</entry>
- </row>
-
- <row>
- <entry><keycap>C+<replaceable>Arrow</replaceable></keycap></entry>
-
- <entry>Move caret one word or paragraph.</entry>
- </row>
-
- <row>
- <entry><keycap>PAGE_UP</keycap>;
- <keycap>PAGE_DOWN</keycap></entry>
-
- <entry>Move caret one screenful.</entry>
- </row>
-
- <row>
- <entry><keycap>HOME</keycap></entry>
-
- <entry>First non-whitespace character of line, beginning of
- line, first visible line (repeated presses).</entry>
- </row>
-
- <row>
- <entry><keycap>END</keycap></entry>
-
- <entry>Last non-whitespace character of line, end of line,
- last visible line (repeated presses).</entry>
- </row>
-
- <row>
- <entry><keycap>C+HOME</keycap></entry>
-
- <entry>Beginning of buffer.</entry>
- </row>
-
- <row>
- <entry><keycap>C+END</keycap></entry>
-
- <entry>End of buffer.</entry>
- </row>
-
- <row>
- <entry><keycap>C+]</keycap></entry>
-
- <entry>Go to matching bracket.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e [</keycap>; <keycap>]</keycap></entry>
-
- <entry>Go to previous; next bracket.</entry>
- </row>
-
- <row>
- <entry><keycap>C+l</keycap></entry>
-
- <entry>Go to line.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <bridgehead renderas="section">Selecting Text</bridgehead>
-
- <para>For details, see <xref linkend="selection" />, <xref
- linkend="words" />, <xref linkend="lines" />, <xref linkend="paragraphs" />
- and <xref linkend="bracket-matching" />.</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <colspec colnum="1" colwidth="2.2in" />
-
- <tbody>
- <row>
- <entry><keycap>S+<replaceable>Arrow</replaceable></keycap></entry>
-
- <entry>Extend selection by one character or line.</entry>
- </row>
-
- <row>
- <entry><keycap>CS+<replaceable>Arrow</replaceable></keycap></entry>
-
- <entry>Extend selection by one word or paragraph.</entry>
- </row>
-
- <row>
- <entry><keycap>S+PAGE_UP</keycap>;
- <keycap>S+PAGE_DOWN</keycap></entry>
-
- <entry>Extend selection by one screenful.</entry>
- </row>
-
- <row>
- <entry><keycap>S+HOME</keycap></entry>
-
- <entry>Extend selection to first non-whitespace character of
- line, beginning of line, first visible line (repeated
- presses).</entry>
- </row>
-
- <row>
- <entry><keycap>S+END</keycap></entry>
-
- <entry>Extend selection to last non-whitespace character of
- line, end of line, last visible line (repeated
- presses).</entry>
- </row>
-
- <row>
- <entry><keycap>CS+HOME</keycap></entry>
-
- <entry>Extend selection to beginning of buffer.</entry>
- </row>
-
- <row>
- <entry><keycap>CS+END</keycap></entry>
-
- <entry>Extend selection to end of buffer.</entry>
- </row>
-
- <row>
- <entry><keycap>C+[</keycap></entry>
-
- <entry>Select code block.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e w</keycap>; <keycap>l</keycap>;
- <keycap>p</keycap></entry>
-
- <entry>Select word; line; paragraph.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e C+l</keycap></entry>
-
- <entry>Select line range.</entry>
- </row>
-
- <row>
- <entry><keycap>C+a</keycap></entry>
-
- <entry>Select all.</entry>
- </row>
-
- <row>
- <entry><keycap>ESCAPE</keycap></entry>
-
- <entry>Select none.</entry>
- </row>
-
- <row>
- <entry><keycap>A+\</keycap></entry>
-
- <entry>Switch between range and rectangular selection
- mode.</entry>
- </row>
-
- <row>
- <entry><keycap>C+\</keycap></entry>
-
- <entry>Switch between single and multiple selection
- mode.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e i</keycap></entry>
-
- <entry>Invert selection.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <bridgehead renderas="section">Scrolling</bridgehead>
-
- <para>For details, see <xref linkend="views" />.</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <colspec colnum="1" colwidth="2.2in" />
-
- <tbody>
- <row>
- <entry><keycap>C+e C+j</keycap></entry>
-
- <entry>Ensure current line is visible, and send focus to the
- text area.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e C+n</keycap></entry>
-
- <entry>Center caret on screen.</entry>
- </row>
-
- <row>
- <entry><keycap>C+'</keycap>; <keycap>C+/</keycap></entry>
-
- <entry>Scroll up; down one line.</entry>
- </row>
-
- <row>
- <entry><keycap>A+'</keycap>; <keycap>A+/</keycap></entry>
-
- <entry>Scroll up; down one page.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <bridgehead renderas="section">Text Editing</bridgehead>
-
- <para>For details, see <xref linkend="undo-redo" />, <xref
- linkend="entering-text" />, <xref linkend="words" />, <xref
- linkend="lines" /> and <xref linkend="paragraphs" />.</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <colspec colnum="1" colwidth="2.2in" />
-
- <tbody>
- <row>
- <entry><keycap>C+z</keycap></entry>
-
- <entry>Undo.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e C+z</keycap></entry>
-
- <entry>Redo.</entry>
- </row>
-
- <row>
- <entry><keycap>BACK_SPACE</keycap>;
- <keycap>DELETE</keycap></entry>
-
- <entry>Delete character before; after caret.</entry>
- </row>
-
- <row>
- <entry><keycap>C+BACK_SPACE</keycap>;
- <keycap>C+DELETE</keycap></entry>
-
- <entry>Delete word before; after caret.</entry>
- </row>
-
- <row>
- <entry><keycap>C+d</keycap>; <keycap>C+e d</keycap></entry>
-
- <entry>Delete line; paragraph.</entry>
- </row>
-
- <row>
- <entry><keycap>CS+BACK_SPACE</keycap>;
- <keycap>CS+DELETE</keycap></entry>
-
- <entry>Delete from caret to beginning; end of line.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e r</keycap></entry>
-
- <entry>Remove trailing whitespace from the current line (or
- all selected lines).</entry>
- </row>
-
- <row>
- <entry><keycap>C+j</keycap></entry>
-
- <entry>Join lines.</entry>
- </row>
-
- <row>
- <entry><keycap>C+b</keycap></entry>
-
- <entry>Complete word.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e f</keycap></entry>
-
- <entry>Format paragraph (or selection).</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <bridgehead renderas="section">Clipboard and Registers</bridgehead>
-
- <para>For details, see <xref linkend="text-transfer" />.</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <colspec colnum="1" colwidth="2.2in" />
-
- <tbody>
- <row>
- <entry><keycap>C+x</keycap> or
- <keycap>S+DELETE</keycap></entry>
-
- <entry>Cut selected text to clipboard.</entry>
- </row>
-
- <row>
- <entry><keycap>C+c</keycap> or
- <keycap>C+INSERT</keycap></entry>
-
- <entry>Copy selected text to clipboard.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e C+u</keycap></entry>
-
- <entry>Append selected text to clipboard, removing it from
- the buffer.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e C+a</keycap></entry>
-
- <entry>Append selected text to clipboard, leaving it in the
- buffer.</entry>
- </row>
-
- <row>
- <entry><keycap>C+v</keycap> or
- <keycap>S+INSERT</keycap></entry>
-
- <entry>Paste clipboard contents.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e C+p</keycap></entry>
-
- <entry>Vertically paste clipboard contents.</entry>
- </row>
-
- <row>
- <entry><keycap>C+r C+x
- <replaceable>key</replaceable></keycap></entry>
-
- <entry>Cut selected text to register
- <replaceable>key</replaceable>.</entry>
- </row>
-
- <row>
- <entry><keycap>C+r C+c
- <replaceable>key</replaceable></keycap></entry>
-
- <entry>Copy selected text to register
- <replaceable>key</replaceable>.</entry>
- </row>
-
- <row>
- <entry><keycap>C+r C+u
- <replaceable>key</replaceable></keycap></entry>
-
- <entry>Append selected text to register
- <replaceable>key</replaceable>, removing it from the
- buffer.</entry>
- </row>
-
- <row>
- <entry><keycap>C+r C+a
- <replaceable>key</replaceable></keycap></entry>
-
- <entry>Append selected text to register
- <replaceable>key</replaceable>, leaving it in the
- buffer.</entry>
- </row>
-
- <row>
- <entry><keycap>C+r C+v
- <replaceable>key</replaceable></keycap></entry>
-
- <entry>Paste contents of register
- <replaceable>key</replaceable>.</entry>
- </row>
-
- <row>
- <entry><keycap>C+r C+p
- <replaceable>key</replaceable></keycap></entry>
-
- <entry>Vertically paste contents of register
- <replaceable>key</replaceable>.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e C+v</keycap></entry>
-
- <entry>Paste previous.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e C+y</keycap></entry>
-
- <entry>Paste deleted.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <bridgehead renderas="section">Markers</bridgehead>
-
- <para>For details, see <xref linkend="markers" />.</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <colspec colnum="1" colwidth="2.2in" />
-
- <tbody>
- <row>
- <entry><keycap>C+e C+m</keycap></entry>
-
- <entry>If current line doesn't contain a marker, one will be
- added. Otherwise, the existing marker will be removed. Use
- the <guimenu>Markers</guimenu> menu to return to markers
- added in this manner.</entry>
- </row>
-
- <row>
- <entry><keycap>C+t
- <replaceable>key</replaceable></keycap></entry>
-
- <entry>Add marker with shortcut
- <replaceable>key</replaceable>.</entry>
- </row>
-
- <row>
- <entry><keycap>C+y
- <replaceable>key</replaceable></keycap></entry>
-
- <entry>Go to marker with shortcut
- <replaceable>key</replaceable>.</entry>
- </row>
-
- <row>
- <entry><keycap>C+u
- <replaceable>key</replaceable></keycap></entry>
-
- <entry>Select to marker with shortcut
- <replaceable>key</replaceable>.</entry>
- </row>
-
- <row>
- <entry><keycap>C+k
- <replaceable>key</replaceable></keycap></entry>
-
- <entry>Go to marker with shortcut
- <replaceable>key</replaceable>, and move the marker to the
- previous caret position.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e C+,</keycap>; <keycap>C+e
- C+.</keycap></entry>
-
- <entry>Move caret to previous; next marker.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <bridgehead renderas="section">Search and Replace</bridgehead>
-
- <para>For details, see <xref linkend="search-replace" />.</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <colspec colnum="1" colwidth="2.2in" />
-
- <tbody>
- <row>
- <entry><keycap>C+f</keycap></entry>
-
- <entry>Open search and replace dialog box.</entry>
- </row>
-
- <row>
- <entry><keycap>C+g</keycap></entry>
-
- <entry>Find next.</entry>
- </row>
-
- <row>
- <entry><keycap>C+h</keycap></entry>
-
- <entry>Find previous.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e C+b</keycap></entry>
-
- <entry>Search in open buffers.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e C+d</keycap></entry>
-
- <entry>Search in directory.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e C+r</keycap></entry>
-
- <entry>Replace in selection.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e C+g</keycap></entry>
-
- <entry>Replace in selection and find next.</entry>
- </row>
-
- <row>
- <entry><keycap>C+,</keycap></entry>
-
- <entry>Incremental search bar.</entry>
- </row>
-
- <row>
- <entry><keycap>A+,</keycap></entry>
-
- <entry>HyperSearch bar.</entry>
- </row>
-
- <row>
- <entry><keycap>C+.</keycap></entry>
-
- <entry>Incremental search for word under the caret.</entry>
- </row>
-
- <row>
- <entry><keycap>A+.</keycap></entry>
-
- <entry>HyperSearch for word under the caret.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e C+i</keycap></entry>
-
- <entry>Toggle ignore case.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e C+x</keycap></entry>
-
- <entry>Toggle regular expressions.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <bridgehead renderas="section">Source Code Editing</bridgehead>
-
- <para>For details, see <xref linkend="abbrevs" />, <xref linkend="indent" />
- and <xref linkend="commenting" />.</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <colspec colnum="1" colwidth="2.2in" />
-
- <tbody>
- <row>
- <entry><keycap>C+;</keycap></entry>
-
- <entry>Expand abbreviation.</entry>
- </row>
-
- <row>
- <entry><keycap>A+LEFT</keycap>;
- <keycap>A+RIGHT</keycap></entry>
-
- <entry>Shift current line (or all selected lines) left;
- right.</entry>
- </row>
-
- <row>
- <entry><keycap>S+TAB</keycap>; <keycap>TAB</keycap></entry>
-
- <entry>Shift selected lines left; right. Note that pressing
- <keycap>TAB</keycap> with no selection active will insert a
- tab character at the caret position.</entry>
- </row>
-
- <row>
- <entry><keycap>C+i</keycap></entry>
-
- <entry>Indent current line (or all selected lines).</entry>
- </row>
-
- <row>
- <entry><keycap>C+e C+c</keycap></entry>
-
- <entry>Range comment selection.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e C+k</keycap></entry>
-
- <entry>Line comment selection.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <bridgehead renderas="section">Folding and Narrowing</bridgehead>
-
- <para>For details, see <xref linkend="folding" /> and <xref
- linkend="narrowing" />.</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <colspec colnum="1" colwidth="2.2in" />
-
- <tbody>
- <row>
- <entry><keycap>A+BACK_SPACE</keycap></entry>
-
- <entry>Collapse fold containing caret.</entry>
- </row>
-
- <row>
- <entry><keycap>A+ENTER</keycap></entry>
-
- <entry>Expand fold containing caret one level only.</entry>
- </row>
-
- <row>
- <entry><keycap>AS+ENTER</keycap></entry>
-
- <entry>Expand fold containing caret fully.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e x</keycap></entry>
-
- <entry>Expand all folds.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e a</keycap></entry>
-
- <entry>Add explicit fold.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e s</keycap></entry>
-
- <entry>Select fold.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e ENTER
- <replaceable>key</replaceable></keycap></entry>
-
- <entry>Expand folds with level less than
- <replaceable>key</replaceable>, collapse all others.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e n n</keycap></entry>
-
- <entry>Narrow to fold.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e n s</keycap></entry>
-
- <entry>Narrow to selection.</entry>
- </row>
-
- <row>
- <entry><keycap>A+UP</keycap>;
- <keycap>A+DOWN</keycap></entry>
-
- <entry>Moves caret to previous; next fold.</entry>
- </row>
-
- <row>
- <entry><keycap>C+e u</keycap></entry>
-
- <entry>Moves caret to the parent fold of the one containing
- the caret.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <bridgehead renderas="section">Macros</bridgehead>
-
- <para>For details, see <xref linkend="using-macros" />.</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <colspec colnum="1" colwidth="2.2in" />
-
- <tbody>
- <row>
- <entry><keycap>C+m C+r</keycap></entry>
-
- <entry>Record macro.</entry>
- </row>
-
- <row>
- <entry><keycap>C+m C+m</keycap></entry>
-
- <entry>Record temporary macro.</entry>
- </row>
-
- <row>
- <entry><keycap>C+m C+s</keycap></entry>
-
- <entry>Stop recording.</entry>
- </row>
-
- <row>
- <entry><keycap>C+m C+p</keycap></entry>
-
- <entry>Run temporary macro.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <bridgehead renderas="section">Alternative Shortcuts</bridgehead>
-
- <para>A few frequently-used commands have alternative shortcuts intended to
- help you keep your hands from moving all over the keyboard.</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <colspec colnum="1" colwidth="2.2in" />
-
- <tbody>
- <row>
- <entry><keycap>A+j</keycap>; <keycap>A+l</keycap></entry>
-
- <entry>Move caret to previous, next character.</entry>
- </row>
-
- <row>
- <entry><keycap>A+i</keycap>; <keycap>A+k</keycap></entry>
-
- <entry>Move caret up, down one line.</entry>
- </row>
-
- <row>
- <entry><keycap>A+q</keycap>; <keycap>A+a</keycap></entry>
-
- <entry>Move caret up, down one screenful.</entry>
- </row>
-
- <row>
- <entry><keycap>A+z</keycap></entry>
-
- <entry>First non-whitespace character of line, beginning of
- line, first visible line (repeated presses).</entry>
- </row>
-
- <row>
- <entry><keycap>A+x</keycap></entry>
-
- <entry>Last non-whitespace character of line, end of line,
- last visible line (repeated presses).</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-</appendix>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?>
+<appendix id="shortcuts">
+ <title>Keyboard Shortcuts</title>
+
+ <!-- jEdit buffer-local properties: -->
+
+ <!-- :tabSize=1:indentSize=1:noTabs=true: -->
+
+ <!-- :xml.root=users-guide.xml: -->
+
+ <para>This appendix documents the default set of keyboard shortcuts. They
+ can be customized to suit your taste in the <guibutton>Shortcuts</guibutton>
+ pane of the <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box; see <xref linkend="global-opts" />.</para>
+
+ <bridgehead>Files</bridgehead>
+
+ <para>For details, see <xref linkend="buffers" />, <xref linkend="views" />
+ and <xref linkend="files" />.</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <colspec colnum="1" colwidth="2.2in" />
+ <colspec colwidth="*"/>
+
+ <tbody>
+ <row>
+ <entry><keycap>C+n</keycap></entry>
+
+ <entry>New file.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+o</keycap></entry>
+
+ <entry>Open file.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+w</keycap></entry>
+
+ <entry>Close buffer.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e C+w</keycap></entry>
+
+ <entry>Close all buffers.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+s</keycap></entry>
+
+ <entry>Save buffer.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e C+s</keycap></entry>
+
+ <entry>Save all buffers.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+p</keycap></entry>
+
+ <entry>Print buffer.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+PAGE_UP</keycap></entry>
+
+ <entry>Go to previous buffer.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+PAGE_DOWN</keycap></entry>
+
+ <entry>Go to next buffer.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+`</keycap></entry>
+
+ <entry>Go to recent buffer.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>A+`</keycap></entry>
+
+ <entry>Show buffer switcher.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+q</keycap></entry>
+
+ <entry>Exit jEdit.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <bridgehead>Views</bridgehead>
+
+ <para>For details, see <xref linkend="views" />.</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <colspec colnum="1" colwidth="2.2in" />
+ <colspec colwidth="*"/>
+
+ <tbody>
+ <row>
+ <entry><keycap>C+e C+t</keycap></entry>
+
+ <entry>Turn gutter (line numbering) on and off.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+0</keycap></entry>
+
+ <entry>Remove split containing current text area
+ only.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+1</keycap></entry>
+
+ <entry>Remove all splits.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+2</keycap></entry>
+
+ <entry>Split view horizontally.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+3</keycap></entry>
+
+ <entry>Split view vertically.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>A+PAGE_UP</keycap></entry>
+
+ <entry>Send keyboard focus to previous text area.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>A+PAGE_DOWN</keycap></entry>
+
+ <entry>Send keyboard focus to next text area.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e UP</keycap>; <keycap>LEFT</keycap>;
+ <keycap>DOWN</keycap>; <keycap>RIGHT</keycap></entry>
+
+ <entry>Send keyboard focus to top; bottom; left; right
+ docking area.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e C+`</keycap></entry>
+
+ <entry>Close currently focused docking area.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <bridgehead>Action Bar</bridgehead>
+
+ <para>For details, see <xref linkend="action-bar" />.</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <colspec colnum="1" colwidth="2.2in" />
+ <colspec colwidth="*"/>
+
+ <tbody>
+ <row>
+ <entry><keycap>C+ENTER</keycap></entry>
+
+ <entry>Display the action bar and give it keyboard
+ focus.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+SPACE</keycap></entry>
+
+ <entry>Repeat last editor action.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <bridgehead>Moving the Caret</bridgehead>
+
+ <para>For details, see <xref linkend="caret" />, <xref linkend="words" />,
+ <xref linkend="lines" />, <xref linkend="paragraphs" /> and <xref
+ linkend="bracket-matching" />.</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <colspec colnum="1" colwidth="2.2in" />
+ <colspec colwidth="*"/>
+
+ <tbody>
+ <row>
+ <entry><keycap><replaceable>Arrow</replaceable></keycap></entry>
+
+ <entry>Move caret one character or line.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+<replaceable>Arrow</replaceable></keycap></entry>
+
+ <entry>Move caret one word or paragraph.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>PAGE_UP</keycap>;
+ <keycap>PAGE_DOWN</keycap></entry>
+
+ <entry>Move caret one screenful.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>HOME</keycap></entry>
+
+ <entry>First non-whitespace character of line, beginning of
+ line, first visible line (repeated presses).</entry>
+ </row>
+
+ <row>
+ <entry><keycap>END</keycap></entry>
+
+ <entry>Last non-whitespace character of line, end of line,
+ last visible line (repeated presses).</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+HOME</keycap></entry>
+
+ <entry>Beginning of buffer.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+END</keycap></entry>
+
+ <entry>End of buffer.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+]</keycap></entry>
+
+ <entry>Go to matching bracket.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e [</keycap>; <keycap>]</keycap></entry>
+
+ <entry>Go to previous; next bracket.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+l</keycap></entry>
+
+ <entry>Go to line.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <bridgehead>Selecting Text</bridgehead>
+
+ <para>For details, see <xref linkend="selection" />, <xref
+ linkend="words" />, <xref linkend="lines" />, <xref linkend="paragraphs" />
+ and <xref linkend="bracket-matching" />.</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <colspec colnum="1" colwidth="2.2in" />
+ <colspec colwidth="*"/>
+
+ <tbody>
+ <row>
+ <entry><keycap>S+<replaceable>Arrow</replaceable></keycap></entry>
+
+ <entry>Extend selection by one character or line.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>CS+<replaceable>Arrow</replaceable></keycap></entry>
+
+ <entry>Extend selection by one word or paragraph.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>S+PAGE_UP</keycap>;
+ <keycap>S+PAGE_DOWN</keycap></entry>
+
+ <entry>Extend selection by one screenful.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>S+HOME</keycap></entry>
+
+ <entry>Extend selection to first non-whitespace character of
+ line, beginning of line, first visible line (repeated
+ presses).</entry>
+ </row>
+
+ <row>
+ <entry><keycap>S+END</keycap></entry>
+
+ <entry>Extend selection to last non-whitespace character of
+ line, end of line, last visible line (repeated
+ presses).</entry>
+ </row>
+
+ <row>
+ <entry><keycap>CS+HOME</keycap></entry>
+
+ <entry>Extend selection to beginning of buffer.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>CS+END</keycap></entry>
+
+ <entry>Extend selection to end of buffer.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+[</keycap></entry>
+
+ <entry>Select code block.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e w</keycap>; <keycap>l</keycap>;
+ <keycap>p</keycap></entry>
+
+ <entry>Select word; line; paragraph.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e C+l</keycap></entry>
+
+ <entry>Select line range.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+a</keycap></entry>
+
+ <entry>Select all.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>ESCAPE</keycap></entry>
+
+ <entry>Select none.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>A+\</keycap></entry>
+
+ <entry>Switch between range and rectangular selection
+ mode.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+\</keycap></entry>
+
+ <entry>Switch between single and multiple selection
+ mode.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e i</keycap></entry>
+
+ <entry>Invert selection.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <bridgehead>Scrolling</bridgehead>
+
+ <para>For details, see <xref linkend="views" />.</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <colspec colnum="1" colwidth="2.2in" />
+ <colspec colwidth="*"/>
+
+ <tbody>
+ <row>
+ <entry><keycap>C+e C+j</keycap></entry>
+
+ <entry>Ensure current line is visible, and send focus to the
+ text area.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e C+n</keycap></entry>
+
+ <entry>Center caret on screen.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+'</keycap>; <keycap>C+/</keycap></entry>
+
+ <entry>Scroll up; down one line.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>A+'</keycap>; <keycap>A+/</keycap></entry>
+
+ <entry>Scroll up; down one page.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <bridgehead>Text Editing</bridgehead>
+
+ <para>For details, see <xref linkend="undo-redo" />, <xref
+ linkend="entering-text" />, <xref linkend="words" />, <xref
+ linkend="lines" /> and <xref linkend="paragraphs" />.</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <colspec colnum="1" colwidth="2.2in" />
+ <colspec colwidth="*"/>
+
+ <tbody>
+ <row>
+ <entry><keycap>C+z</keycap></entry>
+
+ <entry>Undo.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e C+z</keycap></entry>
+
+ <entry>Redo.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>BACK_SPACE</keycap>;
+ <keycap>DELETE</keycap></entry>
+
+ <entry>Delete character before; after caret.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+BACK_SPACE</keycap>;
+ <keycap>C+DELETE</keycap></entry>
+
+ <entry>Delete word before; after caret.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+d</keycap>; <keycap>C+e d</keycap></entry>
+
+ <entry>Delete line; paragraph.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>CS+BACK_SPACE</keycap>;
+ <keycap>CS+DELETE</keycap></entry>
+
+ <entry>Delete from caret to beginning; end of line.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e r</keycap></entry>
+
+ <entry>Remove trailing whitespace from the current line (or
+ all selected lines).</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+j</keycap></entry>
+
+ <entry>Join lines.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+b</keycap></entry>
+
+ <entry>Complete word.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e f</keycap></entry>
+
+ <entry>Format paragraph (or selection).</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <bridgehead>Clipboard and Registers</bridgehead>
+
+ <para>For details, see <xref linkend="text-transfer" />.</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <colspec colnum="1" colwidth="2.2in" />
+ <colspec colwidth="*"/>
+
+ <tbody>
+ <row>
+ <entry><keycap>C+x</keycap> or
+ <keycap>S+DELETE</keycap></entry>
+
+ <entry>Cut selected text to clipboard.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+c</keycap> or
+ <keycap>C+INSERT</keycap></entry>
+
+ <entry>Copy selected text to clipboard.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e C+u</keycap></entry>
+
+ <entry>Append selected text to clipboard, removing it from
+ the buffer.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e C+a</keycap></entry>
+
+ <entry>Append selected text to clipboard, leaving it in the
+ buffer.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+v</keycap> or
+ <keycap>S+INSERT</keycap></entry>
+
+ <entry>Paste clipboard contents.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e C+p</keycap></entry>
+
+ <entry>Vertically paste clipboard contents.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+r C+x
+ <replaceable>key</replaceable></keycap></entry>
+
+ <entry>Cut selected text to register
+ <replaceable>key</replaceable>.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+r C+c
+ <replaceable>key</replaceable></keycap></entry>
+
+ <entry>Copy selected text to register
+ <replaceable>key</replaceable>.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+r C+u
+ <replaceable>key</replaceable></keycap></entry>
+
+ <entry>Append selected text to register
+ <replaceable>key</replaceable>, removing it from the
+ buffer.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+r C+a
+ <replaceable>key</replaceable></keycap></entry>
+
+ <entry>Append selected text to register
+ <replaceable>key</replaceable>, leaving it in the
+ buffer.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+r C+v
+ <replaceable>key</replaceable></keycap></entry>
+
+ <entry>Paste contents of register
+ <replaceable>key</replaceable>.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+r C+p
+ <replaceable>key</replaceable></keycap></entry>
+
+ <entry>Vertically paste contents of register
+ <replaceable>key</replaceable>.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e C+v</keycap></entry>
+
+ <entry>Paste previous.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e C+y</keycap></entry>
+
+ <entry>Paste deleted.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <bridgehead>Markers</bridgehead>
+
+ <para>For details, see <xref linkend="markers" />.</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <colspec colnum="1" colwidth="2.2in" />
+ <colspec colwidth="*"/>
+
+ <tbody>
+ <row>
+ <entry><keycap>C+e C+m</keycap></entry>
+
+ <entry>If current line doesn't contain a marker, one will be
+ added. Otherwise, the existing marker will be removed. Use
+ the <guimenu>Markers</guimenu> menu to return to markers
+ added in this manner.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+t
+ <replaceable>key</replaceable></keycap></entry>
+
+ <entry>Add marker with shortcut
+ <replaceable>key</replaceable>.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+y
+ <replaceable>key</replaceable></keycap></entry>
+
+ <entry>Go to marker with shortcut
+ <replaceable>key</replaceable>.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+u
+ <replaceable>key</replaceable></keycap></entry>
+
+ <entry>Select to marker with shortcut
+ <replaceable>key</replaceable>.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+k
+ <replaceable>key</replaceable></keycap></entry>
+
+ <entry>Go to marker with shortcut
+ <replaceable>key</replaceable>, and move the marker to the
+ previous caret position.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e C+,</keycap>; <keycap>C+e
+ C+.</keycap></entry>
+
+ <entry>Move caret to previous; next marker.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <bridgehead>Search and Replace</bridgehead>
+
+ <para>For details, see <xref linkend="search-replace" />.</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <colspec colnum="1" colwidth="2.2in" />
+ <colspec colwidth="*"/>
+
+ <tbody>
+ <row>
+ <entry><keycap>C+f</keycap></entry>
+
+ <entry>Open search and replace dialog box.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+g</keycap></entry>
+
+ <entry>Find next.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+h</keycap></entry>
+
+ <entry>Find previous.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e C+b</keycap></entry>
+
+ <entry>Search in open buffers.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e C+d</keycap></entry>
+
+ <entry>Search in directory.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e C+r</keycap></entry>
+
+ <entry>Replace in selection.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e C+g</keycap></entry>
+
+ <entry>Replace in selection and find next.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+,</keycap></entry>
+
+ <entry>Incremental search bar.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>A+,</keycap></entry>
+
+ <entry>HyperSearch bar.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+.</keycap></entry>
+
+ <entry>Incremental search for word under the caret.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>A+.</keycap></entry>
+
+ <entry>HyperSearch for word under the caret.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e C+i</keycap></entry>
+
+ <entry>Toggle ignore case.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e C+x</keycap></entry>
+
+ <entry>Toggle regular expressions.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <bridgehead>Source Code Editing</bridgehead>
+
+ <para>For details, see <xref linkend="abbrevs" />, <xref linkend="indent" />
+ and <xref linkend="commenting" />.</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <colspec colnum="1" colwidth="2.2in" />
+ <colspec colwidth="*"/>
+
+ <tbody>
+ <row>
+ <entry><keycap>C+;</keycap></entry>
+
+ <entry>Expand abbreviation.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>A+LEFT</keycap>;
+ <keycap>A+RIGHT</keycap></entry>
+
+ <entry>Shift current line (or all selected lines) left;
+ right.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>S+TAB</keycap>; <keycap>TAB</keycap></entry>
+
+ <entry>Shift selected lines left; right. Note that pressing
+ <keycap>TAB</keycap> with no selection active will insert a
+ tab character at the caret position.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+i</keycap></entry>
+
+ <entry>Indent current line (or all selected lines).</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e C+c</keycap></entry>
+
+ <entry>Range comment selection.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e C+k</keycap></entry>
+
+ <entry>Line comment selection.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <bridgehead>Folding and Narrowing</bridgehead>
+
+ <para>For details, see <xref linkend="folding" /> and <xref
+ linkend="narrowing" />.</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <colspec colnum="1" colwidth="2.2in" />
+ <colspec colwidth="*"/>
+
+ <tbody>
+ <row>
+ <entry><keycap>A+BACK_SPACE</keycap></entry>
+
+ <entry>Collapse fold containing caret.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>A+ENTER</keycap></entry>
+
+ <entry>Expand fold containing caret one level only.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>AS+ENTER</keycap></entry>
+
+ <entry>Expand fold containing caret fully.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e x</keycap></entry>
+
+ <entry>Expand all folds.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e a</keycap></entry>
+
+ <entry>Add explicit fold.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e s</keycap></entry>
+
+ <entry>Select fold.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e ENTER
+ <replaceable>key</replaceable></keycap></entry>
+
+ <entry>Expand folds with level less than
+ <replaceable>key</replaceable>, collapse all others.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e n n</keycap></entry>
+
+ <entry>Narrow to fold.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e n s</keycap></entry>
+
+ <entry>Narrow to selection.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>A+UP</keycap>;
+ <keycap>A+DOWN</keycap></entry>
+
+ <entry>Moves caret to previous; next fold.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+e u</keycap></entry>
+
+ <entry>Moves caret to the parent fold of the one containing
+ the caret.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <bridgehead>Macros</bridgehead>
+
+ <para>For details, see <xref linkend="using-macros" />.</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <colspec colnum="1" colwidth="2.2in" />
+ <colspec colwidth="*"/>
+
+ <tbody>
+ <row>
+ <entry><keycap>C+m C+r</keycap></entry>
+
+ <entry>Record macro.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+m C+m</keycap></entry>
+
+ <entry>Record temporary macro.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+m C+s</keycap></entry>
+
+ <entry>Stop recording.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>C+m C+p</keycap></entry>
+
+ <entry>Run temporary macro.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <bridgehead>Alternative Shortcuts</bridgehead>
+
+ <para>A few frequently-used commands have alternative shortcuts intended to
+ help you keep your hands from moving all over the keyboard.</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <colspec colnum="1" colwidth="2.2in" />
+ <colspec colwidth="*"/>
+
+ <tbody>
+ <row>
+ <entry><keycap>A+j</keycap>; <keycap>A+l</keycap></entry>
+
+ <entry>Move caret to previous, next character.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>A+i</keycap>; <keycap>A+k</keycap></entry>
+
+ <entry>Move caret up, down one line.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>A+q</keycap>; <keycap>A+a</keycap></entry>
+
+ <entry>Move caret up, down one screenful.</entry>
+ </row>
+
+ <row>
+ <entry><keycap>A+z</keycap></entry>
+
+ <entry>First non-whitespace character of line, beginning of
+ line, first visible line (repeated presses).</entry>
+ </row>
+
+ <row>
+ <entry><keycap>A+x</keycap></entry>
+
+ <entry>Last non-whitespace character of line, end of line,
+ last visible line (repeated presses).</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+</appendix>
diff --git a/jEdit/doc/users-guide/source-edit.xml b/jEdit/doc/users-guide/source-edit.xml
index 99e53e5..eee9257 100644
--- a/jEdit/doc/users-guide/source-edit.xml
+++ b/jEdit/doc/users-guide/source-edit.xml
@@ -1,622 +1,622 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter id="source-edit">
- <title>Editing Source Code</title>
-
- <!-- jEdit buffer-local properties: -->
-
- <!-- :tabSize=1:indentSize=1:noTabs=true:wrap=soft:maxLineLen=80: -->
-
- <!-- :xml.root=users-guide.xml: -->
-
- <section id="modes">
- <title>Edit Modes</title>
-
- <para>An <firstterm>edit mode</firstterm> specifies syntax highlighting
- rules, auto indent behavior, and various other customizations for
- editing a certain file type. This section only covers using existing
- edit modes; information about writing your own can be found in <xref
- linkend="writing-modes-part" />.</para>
-
- <para>When a file is opened, jEdit first checks the file name against a
- list of known patterns. For example, files whose names end with
- <filename>.c</filename> are opened with C mode, and files named
- <filename>Makefile</filename> are opened with Makefile mode. If a
- suitable match based on file name cannot be found, jEdit checks the
- first line of the file. For example, files whose first line is
- <filename>#!/bin/sh</filename> are opened with shell script mode.</para>
-
- <section id="mode-selection">
- <title>Mode Selection</title>
-
- <para>File name and first line matching is done using glob patterns
- similar to those used in Unix shells. Glob patterns associated with
- edit modes can be changed in the <guibutton>Editing</guibutton> pane
- of the <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box. Note that the glob patterns must
- match the file name or first line exactly; so to match files whose
- first line contains <literal>begin</literal>, you must use a first
- line glob of <literal>*begin*</literal>. See <xref
- linkend="globs" /> for a description of glob pattern syntax.</para>
-
- <para>The default edit mode for files which do not match any pattern
- can be set in the <guibutton>Editing</guibutton> pane as
- well.</para>
-
- <para>The edit mode can be specified manually as well. The current
- buffer's edit mode can be set on a one-time basis in the
- <guimenu>Utilities</guimenu>><guimenuitem>Buffer
- Options</guimenuitem> dialog box; see <xref
- linkend="buffer-opts" />. To set a buffer's edit mode for future
- editing sessions, place the following in one of the first or last 10
- lines of the buffer, where <replaceable>edit mode</replaceable> is
- the name of the desired edit mode:</para>
-
- <screen>:mode=<replaceable>edit mode</replaceable>:</screen>
- </section>
-
- <section id="syntax-hilite">
- <title>Syntax Highlighting</title>
-
- <para>Syntax highlighting is the display of programming language
- tokens using different fonts and colors. This makes code easier to
- follow and errors such as misplaced quotes easier to spot. All edit
- modes except for the plain text mode perform some kind of syntax
- highlighting.</para>
-
- <para>The colors and styles used to highlight syntax tokens can be
- changed in the <guibutton>Syntax Highlighting</guibutton> pane of
- the <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box; see <xref
- linkend="syntax-hilite-pane" />.</para>
- </section>
- </section>
-
- <section id="indent">
- <title>Tabbing and Indentation</title>
-
- <para>jEdit makes a distinction between the <firstterm>tab
- width</firstterm>, which is is used when displaying hard tab characters,
- and the <firstterm>indent width</firstterm>, which is used when a level
- of indent is to be added or removed, for example by mode-specific auto
- indent routines. Both can be changed in one of several ways:</para>
-
- <itemizedlist>
- <listitem>
- <para>On a global or mode-specific basis in the
- <guibutton>Editing</guibutton> pane of the the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box. See <xref
- linkend="editing-pane" />.</para>
- </listitem>
-
- <listitem>
- <para>In the current buffer for the duration of the editing
- session in the
- <guimenu>Utilities</guimenu>><guimenuitem>Buffer
- Options</guimenuitem> dialog box. See <xref
- linkend="buffer-opts" />.</para>
- </listitem>
-
- <listitem>
- <para>In the current buffer for future editing sessions by
- placing the following in one of the first or last 10 lines of
- the buffer, where <replaceable>n</replaceable> is the desired
- tab width, and <replaceable>m</replaceable> is the desired
- indent width:</para>
-
- <screen>:tabSize=<replaceable>n</replaceable>:indentSize=<replaceable>m</replaceable>:</screen>
- </listitem>
- </itemizedlist>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>Indent</guisubmenu>><guisubmenu>Shift
- Indent Left</guisubmenu> (shortcut: <keycap>S+TAB</keycap> or
- <keycap>A+LEFT</keycap>) removes one level of indent from each selected
- line, or the current line if there is no selection.</para>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>Indent</guisubmenu>><guisubmenu>Shift
- Indent Right</guisubmenu> (shortcut: <keycap>A+RIGHT</keycap>) adds one
- level of indent to each selected line, or the current line if there is
- no selection. Pressing <keycap>Tab</keycap> while a multi-line selection
- is active has the same effect.</para>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>Indent</guisubmenu>><guimenuitem>Remove
- Trailing Whitespace</guimenuitem> (shortcut: <keycap>C+e r</keycap>)
- removes all whitespace from the end of each selected line, or the
- current line if there is no selection.</para>
-
- <section id="soft-tabs">
- <title>Soft Tabs</title>
-
- <para>Files containing hard tab characters may look less than ideal
- if the default tab size is changed, so some people prefer using
- multiple space characters instead of hard tabs to indent
- code.</para>
-
- <para>This feature is known as <firstterm>soft tabs</firstterm>.
- Soft tabs can be enabled or disabled in one of several ways:</para>
-
- <itemizedlist>
- <listitem>
- <para>On a global or mode-specific basis in the
- <guibutton>Editing</guibutton> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box. See <xref
- linkend="editing-pane" />.</para>
- </listitem>
-
- <listitem>
- <para>In the current buffer for the duration of the editing
- session in the
- <guimenu>Utilities</guimenu>><guimenuitem>Buffer
- Options</guimenuitem> dialog box. See <xref
- linkend="buffer-opts" />.</para>
- </listitem>
-
- <listitem>
- <para>In the current buffer for future editing sessions by
- placing the following in one of the first or last 10 lines
- of the buffer, where <replaceable>flag</replaceable> is
- either <quote>true</quote> or <quote>false</quote>:</para>
-
- <screen>:noTabs=<replaceable>flag</replaceable>:</screen>
- </listitem>
- </itemizedlist>
-
- <para>Changing the soft tabs setting has no effect on existing tab
- characters; it only affects subsequently-inserted tabs.</para>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>Indent</guisubmenu>><guimenuitem>Spaces
- to Tabs</guimenuitem> converts soft tabs to hard tabs in the current
- selection, or the entire buffer if nothing is selected.</para>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>Indent</guisubmenu>><guimenuitem>Tabs
- to Spaces</guimenuitem> converts hard tabs to soft tabs in the
- current selection, or the entire buffer if nothing is
- selected.</para>
- </section>
-
- <section id="autoindent">
- <title>Automatic Indent</title>
-
- <para>The auto indent feature inserts the appropriate number of tabs
- or spaces at the beginning of a line by looking at program
- structure.</para>
-
- <para>In the default configuration, pressing <keycap>ENTER</keycap>
- will create a new line with the appropriate amount of indent
- automatically, and pressing <keycap>TAB</keycap> at the beginning
- of, or inside the leading whitespace of a line will insert the
- appropriate amount of indentation. Pressing it again will insert a
- tab character.</para>
-
- <para>The behavior of the <keycap>ENTER</keycap> and
- <keycap>TAB</keycap> keys can be configured in the
- <guibutton>Shortcuts</guibutton> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog. box, just as with any other key. The
- <keycap>ENTER</keycap> key can be bound to one of the following, or
- indeed any other command or macro:</para>
-
- <itemizedlist>
- <listitem>
- <para><guimenuitem>Insert Newline</guimenuitem>.</para>
- </listitem>
-
- <listitem>
- <para><guimenuitem>Insert Newline and Indent</guimenuitem>,
- which is the default.</para>
- </listitem>
- </itemizedlist>
-
- <para>The <keycap>TAB</keycap> can be bound to one of the following,
- or again, any other command or macro:</para>
-
- <itemizedlist>
- <listitem>
- <para><guimenuitem>Insert Tab</guimenuitem>.</para>
- </listitem>
-
- <listitem>
- <para><guimenuitem>Insert Tab or Indent</guimenuitem>, which
- is the default.</para>
- </listitem>
-
- <listitem>
- <para><guimenuitem>Indent Selected
- Lines</guimenuitem>.</para>
- </listitem>
- </itemizedlist>
-
- <para>See <xref linkend="shortcuts-pane" /> for details.</para>
-
- <para>Auto indent behavior is mode-specific. In most edit modes, the
- indent of the previous line is simply copied over. However, in
- C-like languages (C, C++, Java, JavaScript), curly brackets and
- language statements are taken into account and indent is added and
- removed as necessary.</para>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>Indent</guisubmenu>><guisubmenu>Indent
- Selected Lines</guisubmenu> (shortcut: <keycap>C+i</keycap>) indents
- all selected lines, or the current line if there is no
- selection.</para>
-
- <para>To insert a literal tab or newline without performing
- indentation, prefix the tab or newline with <keycap>C+e v</keycap>.
- For example, to create a new line without any indentation, type
- <keycap>C+e v ENTER</keycap>.</para>
- </section>
- </section>
-
- <section id="commenting">
- <title>Commenting Out Code</title>
-
- <para>Most programming and markup languages support the notion of
- <quote>comments</quote>, or regions of code which are ignored by the
- compiler/interpreter. jEdit has commands which make inserting comments
- more convenient.</para>
-
- <para>Comment strings are mode-specific, and some in some modes such as
- HTML different parts of a buffer can have different comment strings. For
- example, in HTML files, different comment strings are used for HTML text
- and inline JavaScript.</para>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>Source
- Code</guisubmenu>><guimenuitem>Range Comment</guimenuitem> (shortcut:
- <keycap>C+e C+c</keycap>) encloses the selection with comment start and
- end strings, for example <literal>/*</literal> and <literal>*/</literal>
- in Java mode.</para>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>Source
- Code</guisubmenu>><guimenuitem>Line Comment</guimenuitem> (shortcut:
- <keycap>C+e C+k</keycap>) inserts the line comment string, for example
- <literal>//</literal> in Java mode, at the start of each selected
- line.</para>
- </section>
-
- <section id="bracket-matching">
- <title>Bracket Matching</title>
-
- <para>Misplaced and unmatched brackets are one of the most common syntax
- errors encountered when writing code. jEdit has several features to make
- brackets easier to deal with.</para>
-
- <para>Positioning the caret immediately after a bracket will highlight
- the corresponding closing or opening bracket (assuming it is visible),
- and draw a scope indicator in the gutter. If the highlighted bracket is
- not visible, the text of the matching line will be shown in the status
- bar. If the matching line consists of only whitespace and the bracket
- itself, the <emphasis>previous line</emphasis> is shown instead. This
- feature is very useful when your code is indented as follows, with
- braces on their own lines:</para>
-
- <programlisting>public void someMethod()
-{
- if(isOK)
- {
- doSomething();
- }
-}</programlisting>
-
- <para>Invoking
- <guimenu>Edit</guimenu>><guisubmenu>Source</guisubmenu>><guimenuitem>Go
- to Matching Bracket</guimenuitem> (shortcut: <keycap>C+]</keycap>) or
- clicking the scope indicator in the gutter moves the caret to the
- matching bracket.</para>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>Source</guisubmenu>><guimenuitem>Select
- Code Block</guimenuitem> (shortcut: <keycap>C+[</keycap>) selects all
- text between the closest two brackets surrounding the caret.</para>
-
- <para>Holding down <keycap>Control</keycap> while clicking the scope
- indicator in the gutter or a bracket in the text area will select all
- text between the two matching brackets.</para>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>Source</guisubmenu>><guimenuitem>Go
- to Previous Bracket</guimenuitem> (shortcut: <keycap>C+e C+[</keycap>)
- moves the caret to the previous opening bracket.</para>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>Source</guisubmenu>><guimenuitem>Go
- to Next Bracket</guimenuitem> (shortcut: <keycap>C+e C+]</keycap>) moves
- the caret to the next closing bracket.</para>
-
- <para>Bracket highlighting in the text area and bracket scope display in
- the gutter can be customized in the <guibutton>Text Area</guibutton> and
- <guibutton>Gutter</guibutton> panes of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box; see <xref
- linkend="global-opts" />.</para>
-
- <tip>
- <para>jEdit's bracket matching algorithm only checks syntax tokens
- with the same type as the original bracket, so for example unmatched
- brackets inside string literals and comments will be skipped when
- matching brackets that are part of program syntax.</para>
- </tip>
- </section>
-
- <section id="abbrevs">
- <title>Abbreviations</title>
-
- <para>Abbreviations are invoked by typing a couple of letters and then
- issuing the <guimenu>Edit</guimenu>><guimenuitem>Expand
- Abbreviation</guimenuitem> (keyboard shortcut: <keycap>C+;</keycap>),
- which takes the word before the caret as the abbreviation name. If that
- particular abbreviation was not yet set, a dialog will pop up, and you
- can enter the text to insert before and after the caret. After the
- abbreviation is created, it can be viewed or edited from the
- <guibutton>Abbreviations</guibutton> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box; see <xref
- linkend="abbrevs-pane" />.</para>
-
- <para>Using abbreviations reduces the time spent typing long but
- commonly used strings. For example, in Java mode, the abbreviation
- <quote>sout</quote> is defined to expand to
- <quote>System.out.println()</quote>, so to insert
- <quote>System.out.println()</quote> in a Java buffer, you only need to
- type <quote>sout</quote> followed by <keycap>C+;</keycap>. An
- abbreviation can either be global, in which case it can be used in all
- edit modes, or specific to a single mode.</para>
-
- <para>The Java, VHDL. XML and XSL edit modes include some pre-defined
- abbreviations you might find useful. Other modes do not have any
- abbreviations defined by default.</para>
-
- <para></para>
-
- <para>Automatic abbreviation expansion can be enabled in the
- <guibutton>Abbreviations</guibutton> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box. If enabled, pressing the space bar
- after entering an abbreviation will automatically expand it.</para>
-
- <para>If automatic expansion is enabled, a space can be inserted without
- expanding the word before the caret by pressing <keycombo>
- <keycap>Control</keycap>
-
- <keycap>E</keycap>
- </keycombo> <keycap>V</keycap> <keycap>Space</keycap>.</para>
-
- <section id="positional-params">
- <title>Positional Parameters</title>
-
- <para>Positional parameters are an advanced feature that make
- abbreviations much more useful. The best way to describe them is
- with an example.</para>
-
- <para>Java mode defines an abbreviation <quote>F</quote> that is set
- to expand to the following:</para>
-
- <programlisting>for(int $1 = 0; $1 < $2; $1++)</programlisting>
-
- <para>Expanding <literal>F#j#array.length#</literal> will insert the
- following text into the buffer:</para>
-
- <programlisting>for(int j = 0; j < array.length; j++)</programlisting>
-
- <para>Expansions can contain up to nine positional parameters. Note
- that a trailing hash character (<quote>#</quote>) must be entered
- when expanding an abbreviation with parameters.</para>
-
- <para>If you do not specify the correct number of positional
- parameters when expanding an abbreviation, any missing parameters
- will be blank in the expansion, and extra parameters will be
- ignored. A status bar message will be shown stating the required
- number of parameters.</para>
- </section>
- </section>
-
- <section id="folding">
- <title>Folding</title>
-
- <para>Program source code and other structured text files can be thought
- of as containing a hierarchy of sections, which themselves might contain
- sub-sections. The folding feature lets you selectively hide and show
- these sections, replacing hidden ones with a single line that serves as
- an <quote>overview</quote> of that section. Folding is disabled by
- default. To enable it, you must choose one of the available folding
- modes.</para>
-
- <para><quote>Indent</quote> mode creates folds based on a line's leading
- whitespace; the more leading whitespace a block of text has, the further
- down it is in the hierarchy. For example:</para>
-
- <screen>This is a section
- This is a sub-section
- This is another sub-section
- This is a sub-sub-section
-Another top-level section</screen>
-
- <para><quote>Explicit</quote> mode folds away blocks of text surrounded
- with <quote>{{{</quote> and <quote>}}}</quote>. For example:</para>
-
- <screen>{{{ The first line of a fold.
-When this fold is collapsed, only the above line will be visible.
-
-{{{ A sub-section.
-With text inside it.
-}}}
-
-{{{ Another sub-section.
-}}}
-
-}}}</screen>
-
- <para>Both modes have distinct advantages and disadvantages; indent
- folding requires no changes to be made to a buffer's text and does a
- decent job with most program source. Explicit folding requires
- <quote>fold markers</quote> to be inserted into the text, but is more
- flexible in exactly what to fold away.</para>
-
- <para>Some plugins might add additional folding modes; see <xref
- linkend="using-plugins" /> for information about plugins.</para>
-
- <para>Folding can be enabled in one of several ways:</para>
-
- <itemizedlist>
- <listitem>
- <para>On a global or mode-specific basis in the
- <guibutton>Editing</guibutton> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box. See <xref
- linkend="editing-pane" />.</para>
- </listitem>
-
- <listitem>
- <para>In the current buffer for the duration of the editing
- session in the
- <guimenu>Utilities</guimenu>><guimenuitem>Buffer
- Options</guimenuitem> dialog box. See <xref
- linkend="buffer-opts" />.</para>
- </listitem>
-
- <listitem>
- <para>In the current buffer for future editing sessions by
- placing the following in the first or last 10 lines of a buffer,
- where <replaceable>mode</replaceable> is either
- <quote>indent</quote>, <quote>explicit</quote>, or the name of a
- plugin folding mode:</para>
-
- <screen>:folding=<replaceable>mode</replaceable>:</screen>
- </listitem>
- </itemizedlist>
-
- <warning>
- <para>When using indent folding, portions of the buffer may become
- inaccessible if you change the leading indent of the first line of a
- collapsed fold. If you experience this, you can use the
- <guimenuitem>Expand All Folds</guimenuitem> command to make the text
- visible again.</para>
- </warning>
-
- <section>
- <title>Collapsing and Expanding Folds</title>
-
- <para>The first line of each fold has a triangle drawn next to it in
- the gutter (see <xref linkend="overview" /> for more information
- about the gutter). The triangle points toward the line when the fold
- is collapsed, and downward when the fold is expanded. Clicking the
- triangle collapses and expands the fold. To expand all sub-folds as
- well, hold down the <keycap>Shift</keycap> while clicking.</para>
-
- <para>The first line of a collapsed fold is drawn with a background
- color that depends on the fold level, and the number of lines in the
- fold is shown to the right of the line's text.</para>
-
- <para>Folds can also be collapsed and expanded using menu item
- commands and keyboard shortcuts.</para>
-
- <para><guisubmenu>Folding</guisubmenu>><guimenuitem>Collapse
- Fold</guimenuitem> (shortcut: <keycap>A+BACK_SPACE</keycap>)
- collapses the fold containing the caret.</para>
-
- <para><guisubmenu>Folding</guisubmenu>><guimenuitem>Expand Fold
- One Level</guimenuitem> (shortcut: <keycap>A+ENTER</keycap>) expands
- the fold containing the caret. Nested folds will remain collapsed,
- and the caret will be positioned on the first nested fold (if
- any).</para>
-
- <para><guisubmenu>Folding</guisubmenu>><guimenuitem>Expand Fold
- Fully</guimenuitem> (shortcut: <keycap>AS+ENTER</keycap>) expands
- the fold containing the caret, also expanding any nested
- folds.</para>
-
- <para><guisubmenu>Folding</guisubmenu>><guimenuitem>Collapse All
- Folds</guimenuitem> (shortcut: <keycap>C+e c</keycap>) collapses all
- folds in the buffer.</para>
-
- <para><guisubmenu>Folding</guisubmenu>><guimenuitem>Expand All
- Folds</guimenuitem> (shortcut: <keycap>C+e x</keycap>) expands all
- folds in the buffer.</para>
- </section>
-
- <section>
- <title>Navigating Around With Folds</title>
-
- <para><guisubmenu>Folding</guisubmenu>><guimenuitem>Go to Parent
- Fold</guimenuitem> (shortcut: <keycap>C+e u</keycap>) moves the
- caret to the fold containing the one at the caret position.</para>
-
- <para><guisubmenu>Folding</guisubmenu>><guimenuitem>Go to
- Previous Fold</guimenuitem> (shortcut: <keycap>A+UP</keycap>) moves
- the caret to the fold immediately before the caret position.</para>
-
- <para><guisubmenu>Folding</guisubmenu>><guimenuitem>Go to Next
- Fold</guimenuitem> (shortcut: <keycap>A+DOWN</keycap>) moves the
- caret to the fold immediately after the caret position.</para>
- </section>
-
- <section>
- <title>Miscellaneous Folding Commands</title>
-
- <para><guisubmenu>Folding</guisubmenu>><guimenuitem>Add Explicit
- Fold</guimenuitem> (shortcut: <keycap>C+e a</keycap>) surrounds the
- selection with <quote>{{{</quote> and <quote>}}}</quote>. If the
- current buffer's edit mode defines comment strings (see <xref
- linkend="commenting" />) the explicit fold markers will
- automatically be commented out as well.</para>
-
- <para><guisubmenu>Folding</guisubmenu>><guimenuitem>Select
- Fold</guimenuitem> (shortcut: <keycap>C+e s</keycap>) selects all
- lines within the fold containing the caret.
- <keycap>Control</keycap>-clicking a fold expansion triangle in the
- gutter has the same effect.</para>
-
- <para><guisubmenu>Folding</guisubmenu>><guimenuitem>Expand Folds
- With Level</guimenuitem> (shortcut: <keycap>C+e ENTER
- <replaceable>key</replaceable></keycap>) reads the next character
- entered at the keyboard, and expands folds in the buffer with a fold
- level less than that specified, while collapsing all others.</para>
-
- <para>Sometimes it is desirable to have files open with folds
- initially collapsed. This can be configured as follows:</para>
-
- <itemizedlist>
- <listitem>
- <para>On a global or mode-specific basis in the
- <guibutton>Editing</guibutton> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box. See <xref
- linkend="editing-pane" />.</para>
- </listitem>
-
- <listitem>
- <para>In the current buffer for future editing sessions by
- placing the following in the first or last 10 lines of a
- buffer, where <replaceable>level</replaceable> is the
- desired fold level:</para>
-
- <screen>:collapseFolds=<replaceable>level</replaceable>:</screen>
- </listitem>
- </itemizedlist>
- </section>
-
- <section id="narrowing">
- <title>Narrowing</title>
-
- <para>The narrowing feature temporarily <quote>narrows</quote> the
- display of a buffer to a specified region. Text outside the region
- is not shown, but is still present in the buffer. <!-- Both folding and
- narrowing are implemented using the same code internally. --></para>
-
- <para>Holding down <keycap>Alt</keycap> while clicking a fold
- expansion triangle in the gutter will hide all lines the buffer
- except those contained in the clicked fold.</para>
-
- <para><guisubmenu>Folding</guisubmenu>><guimenuitem>Narrow Buffer
- to Fold</guimenuitem> (shortcut: <keycap>C+e n n</keycap>) hides all
- lines the buffer except those in the fold containing the caret. <!-- When this command is invoked, a message is shown in the
- status bar reminding you that you need to invoke
- <guimenuitem>Expand All Folds</guimenuitem> to make the rest of the buffer
- visible again. --></para>
-
- <para><guisubmenu>Folding</guisubmenu>><guimenuitem>Narrow Buffer
- to Selection</guimenuitem> (shortcut: <keycap>C+e n s</keycap>)
- hides all lines the buffer except those in the selection.</para>
-
- <para><guisubmenu>Folding</guisubmenu>><guimenuitem>Expand All
- Folds</guimenuitem> (shortcut: <keycap>C+e x</keycap>) shows lines
- that were hidden as a result of narrowing.</para>
- </section>
- </section>
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="source-edit">
+ <title>Editing Source Code</title>
+
+ <!-- jEdit buffer-local properties: -->
+
+ <!-- :tabSize=1:indentSize=1:noTabs=true:wrap=soft:maxLineLen=80: -->
+
+ <!-- :xml.root=users-guide.xml: -->
+
+ <section id="modes">
+ <title>Edit Modes</title>
+
+ <para>An <firstterm>edit mode</firstterm> specifies syntax highlighting
+ rules, auto indent behavior, and various other customizations for
+ editing a certain file type. This section only covers using existing
+ edit modes; information about writing your own can be found in <xref
+ linkend="writing-modes-part" />.</para>
+
+ <para>When a file is opened, jEdit first checks the file name against a
+ list of known patterns. For example, files whose names end with
+ <filename>.c</filename> are opened with C mode, and files named
+ <filename>Makefile</filename> are opened with Makefile mode. If a
+ suitable match based on file name cannot be found, jEdit checks the
+ first line of the file. For example, files whose first line is
+ <filename>#!/bin/sh</filename> are opened with shell script mode.</para>
+
+ <section id="mode-selection">
+ <title>Mode Selection</title>
+
+ <para>File name and first line matching is done using glob patterns
+ similar to those used in Unix shells. Glob patterns associated with
+ edit modes can be changed in the <guibutton>Editing</guibutton> pane
+ of the <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box. Note that the glob patterns must
+ match the file name or first line exactly; so to match files whose
+ first line contains <literal>begin</literal>, you must use a first
+ line glob of <literal>*begin*</literal>. See <xref
+ linkend="globs" /> for a description of glob pattern syntax.</para>
+
+ <para>The default edit mode for files which do not match any pattern
+ can be set in the <guibutton>Editing</guibutton> pane as
+ well.</para>
+
+ <para>The edit mode can be specified manually as well. The current
+ buffer's edit mode can be set on a one-time basis in the
+ <guimenu>Utilities</guimenu>><guimenuitem>Buffer
+ Options</guimenuitem> dialog box; see <xref
+ linkend="buffer-opts" />. To set a buffer's edit mode for future
+ editing sessions, place the following in one of the first or last 10
+ lines of the buffer, where <replaceable>edit mode</replaceable> is
+ the name of the desired edit mode:</para>
+
+ <screen>:mode=<replaceable>edit mode</replaceable>:</screen>
+ </section>
+
+ <section id="syntax-hilite">
+ <title>Syntax Highlighting</title>
+
+ <para>Syntax highlighting is the display of programming language
+ tokens using different fonts and colors. This makes code easier to
+ follow and errors such as misplaced quotes easier to spot. All edit
+ modes except for the plain text mode perform some kind of syntax
+ highlighting.</para>
+
+ <para>The colors and styles used to highlight syntax tokens can be
+ changed in the <guibutton>Syntax Highlighting</guibutton> pane of
+ the <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box; see <xref
+ linkend="syntax-hilite-pane" />.</para>
+ </section>
+ </section>
+
+ <section id="indent">
+ <title>Tabbing and Indentation</title>
+
+ <para>jEdit makes a distinction between the <firstterm>tab
+ width</firstterm>, which is is used when displaying hard tab characters,
+ and the <firstterm>indent width</firstterm>, which is used when a level
+ of indent is to be added or removed, for example by mode-specific auto
+ indent routines. Both can be changed in one of several ways:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>On a global or mode-specific basis in the
+ <guibutton>Editing</guibutton> pane of the the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box. See <xref
+ linkend="editing-pane" />.</para>
+ </listitem>
+
+ <listitem>
+ <para>In the current buffer for the duration of the editing
+ session in the
+ <guimenu>Utilities</guimenu>><guimenuitem>Buffer
+ Options</guimenuitem> dialog box. See <xref
+ linkend="buffer-opts" />.</para>
+ </listitem>
+
+ <listitem>
+ <para>In the current buffer for future editing sessions by
+ placing the following in one of the first or last 10 lines of
+ the buffer, where <replaceable>n</replaceable> is the desired
+ tab width, and <replaceable>m</replaceable> is the desired
+ indent width:</para>
+
+ <screen>:tabSize=<replaceable>n</replaceable>:indentSize=<replaceable>m</replaceable>:</screen>
+ </listitem>
+ </itemizedlist>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>Indent</guisubmenu>><guisubmenu>Shift
+ Indent Left</guisubmenu> (shortcut: <keycap>S+TAB</keycap> or
+ <keycap>A+LEFT</keycap>) removes one level of indent from each selected
+ line, or the current line if there is no selection.</para>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>Indent</guisubmenu>><guisubmenu>Shift
+ Indent Right</guisubmenu> (shortcut: <keycap>A+RIGHT</keycap>) adds one
+ level of indent to each selected line, or the current line if there is
+ no selection. Pressing <keycap>Tab</keycap> while a multi-line selection
+ is active has the same effect.</para>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>Indent</guisubmenu>><guimenuitem>Remove
+ Trailing Whitespace</guimenuitem> (shortcut: <keycap>C+e r</keycap>)
+ removes all whitespace from the end of each selected line, or the
+ current line if there is no selection.</para>
+
+ <section id="soft-tabs">
+ <title>Soft Tabs</title>
+
+ <para>Files containing hard tab characters may look less than ideal
+ if the default tab size is changed, so some people prefer using
+ multiple space characters instead of hard tabs to indent
+ code.</para>
+
+ <para>This feature is known as <firstterm>soft tabs</firstterm>.
+ Soft tabs can be enabled or disabled in one of several ways:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>On a global or mode-specific basis in the
+ <guibutton>Editing</guibutton> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box. See <xref
+ linkend="editing-pane" />.</para>
+ </listitem>
+
+ <listitem>
+ <para>In the current buffer for the duration of the editing
+ session in the
+ <guimenu>Utilities</guimenu>><guimenuitem>Buffer
+ Options</guimenuitem> dialog box. See <xref
+ linkend="buffer-opts" />.</para>
+ </listitem>
+
+ <listitem>
+ <para>In the current buffer for future editing sessions by
+ placing the following in one of the first or last 10 lines
+ of the buffer, where <replaceable>flag</replaceable> is
+ either <quote>true</quote> or <quote>false</quote>:</para>
+
+ <screen>:noTabs=<replaceable>flag</replaceable>:</screen>
+ </listitem>
+ </itemizedlist>
+
+ <para>Changing the soft tabs setting has no effect on existing tab
+ characters; it only affects subsequently-inserted tabs.</para>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>Indent</guisubmenu>><guimenuitem>Spaces
+ to Tabs</guimenuitem> converts soft tabs to hard tabs in the current
+ selection, or the entire buffer if nothing is selected.</para>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>Indent</guisubmenu>><guimenuitem>Tabs
+ to Spaces</guimenuitem> converts hard tabs to soft tabs in the
+ current selection, or the entire buffer if nothing is
+ selected.</para>
+ </section>
+
+ <section id="autoindent">
+ <title>Automatic Indent</title>
+
+ <para>The auto indent feature inserts the appropriate number of tabs
+ or spaces at the beginning of a line by looking at program
+ structure.</para>
+
+ <para>In the default configuration, pressing <keycap>ENTER</keycap>
+ will create a new line with the appropriate amount of indent
+ automatically, and pressing <keycap>TAB</keycap> at the beginning
+ of, or inside the leading whitespace of a line will insert the
+ appropriate amount of indentation. Pressing it again will insert a
+ tab character.</para>
+
+ <para>The behavior of the <keycap>ENTER</keycap> and
+ <keycap>TAB</keycap> keys can be configured in the
+ <guibutton>Shortcuts</guibutton> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog. box, just as with any other key. The
+ <keycap>ENTER</keycap> key can be bound to one of the following, or
+ indeed any other command or macro:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><guimenuitem>Insert Newline</guimenuitem>.</para>
+ </listitem>
+
+ <listitem>
+ <para><guimenuitem>Insert Newline and Indent</guimenuitem>,
+ which is the default.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>The <keycap>TAB</keycap> can be bound to one of the following,
+ or again, any other command or macro:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><guimenuitem>Insert Tab</guimenuitem>.</para>
+ </listitem>
+
+ <listitem>
+ <para><guimenuitem>Insert Tab or Indent</guimenuitem>, which
+ is the default.</para>
+ </listitem>
+
+ <listitem>
+ <para><guimenuitem>Indent Selected
+ Lines</guimenuitem>.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>See <xref linkend="shortcuts-pane" /> for details.</para>
+
+ <para>Auto indent behavior is mode-specific. In most edit modes, the
+ indent of the previous line is simply copied over. However, in
+ C-like languages (C, C++, Java, JavaScript), curly brackets and
+ language statements are taken into account and indent is added and
+ removed as necessary.</para>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>Indent</guisubmenu>><guisubmenu>Indent
+ Selected Lines</guisubmenu> (shortcut: <keycap>C+i</keycap>) indents
+ all selected lines, or the current line if there is no
+ selection.</para>
+
+ <para>To insert a literal tab or newline without performing
+ indentation, prefix the tab or newline with <keycap>C+e v</keycap>.
+ For example, to create a new line without any indentation, type
+ <keycap>C+e v ENTER</keycap>.</para>
+ </section>
+ </section>
+
+ <section id="commenting">
+ <title>Commenting Out Code</title>
+
+ <para>Most programming and markup languages support the notion of
+ <quote>comments</quote>, or regions of code which are ignored by the
+ compiler/interpreter. jEdit has commands which make inserting comments
+ more convenient.</para>
+
+ <para>Comment strings are mode-specific, and some in some modes such as
+ HTML different parts of a buffer can have different comment strings. For
+ example, in HTML files, different comment strings are used for HTML text
+ and inline JavaScript.</para>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>Source
+ Code</guisubmenu>><guimenuitem>Range Comment</guimenuitem> (shortcut:
+ <keycap>C+e C+c</keycap>) encloses the selection with comment start and
+ end strings, for example <literal>/*</literal> and <literal>*/</literal>
+ in Java mode.</para>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>Source
+ Code</guisubmenu>><guimenuitem>Line Comment</guimenuitem> (shortcut:
+ <keycap>C+e C+k</keycap>) inserts the line comment string, for example
+ <literal>//</literal> in Java mode, at the start of each selected
+ line.</para>
+ </section>
+
+ <section id="bracket-matching">
+ <title>Bracket Matching</title>
+
+ <para>Misplaced and unmatched brackets are one of the most common syntax
+ errors encountered when writing code. jEdit has several features to make
+ brackets easier to deal with.</para>
+
+ <para>Positioning the caret immediately after a bracket will highlight
+ the corresponding closing or opening bracket (assuming it is visible),
+ and draw a scope indicator in the gutter. If the highlighted bracket is
+ not visible, the text of the matching line will be shown in the status
+ bar. If the matching line consists of only whitespace and the bracket
+ itself, the <emphasis>previous line</emphasis> is shown instead. This
+ feature is very useful when your code is indented as follows, with
+ braces on their own lines:</para>
+
+ <programlisting>public void someMethod()
+{
+ if(isOK)
+ {
+ doSomething();
+ }
+}</programlisting>
+
+ <para>Invoking
+ <guimenu>Edit</guimenu>><guisubmenu>Source</guisubmenu>><guimenuitem>Go
+ to Matching Bracket</guimenuitem> (shortcut: <keycap>C+]</keycap>) or
+ clicking the scope indicator in the gutter moves the caret to the
+ matching bracket.</para>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>Source</guisubmenu>><guimenuitem>Select
+ Code Block</guimenuitem> (shortcut: <keycap>C+[</keycap>) selects all
+ text between the closest two brackets surrounding the caret.</para>
+
+ <para>Holding down <keycap>Control</keycap> while clicking the scope
+ indicator in the gutter or a bracket in the text area will select all
+ text between the two matching brackets.</para>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>Source</guisubmenu>><guimenuitem>Go
+ to Previous Bracket</guimenuitem> (shortcut: <keycap>C+e C+[</keycap>)
+ moves the caret to the previous opening bracket.</para>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>Source</guisubmenu>><guimenuitem>Go
+ to Next Bracket</guimenuitem> (shortcut: <keycap>C+e C+]</keycap>) moves
+ the caret to the next closing bracket.</para>
+
+ <para>Bracket highlighting in the text area and bracket scope display in
+ the gutter can be customized in the <guibutton>Text Area</guibutton> and
+ <guibutton>Gutter</guibutton> panes of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box; see <xref
+ linkend="global-opts" />.</para>
+
+ <tip>
+ <para>jEdit's bracket matching algorithm only checks syntax tokens
+ with the same type as the original bracket, so for example unmatched
+ brackets inside string literals and comments will be skipped when
+ matching brackets that are part of program syntax.</para>
+ </tip>
+ </section>
+
+ <section id="abbrevs">
+ <title>Abbreviations</title>
+
+ <para>Abbreviations are invoked by typing a couple of letters and then
+ issuing the <guimenu>Edit</guimenu>><guimenuitem>Expand
+ Abbreviation</guimenuitem> (keyboard shortcut: <keycap>C+;</keycap>),
+ which takes the word before the caret as the abbreviation name. If that
+ particular abbreviation was not yet set, a dialog will pop up, and you
+ can enter the text to insert before and after the caret. After the
+ abbreviation is created, it can be viewed or edited from the
+ <guibutton>Abbreviations</guibutton> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box; see <xref
+ linkend="abbrevs-pane" />.</para>
+
+ <para>Using abbreviations reduces the time spent typing long but
+ commonly used strings. For example, in Java mode, the abbreviation
+ <quote>sout</quote> is defined to expand to
+ <quote>System.out.println()</quote>, so to insert
+ <quote>System.out.println()</quote> in a Java buffer, you only need to
+ type <quote>sout</quote> followed by <keycap>C+;</keycap>. An
+ abbreviation can either be global, in which case it can be used in all
+ edit modes, or specific to a single mode.</para>
+
+ <para>The Java, VHDL. XML and XSL edit modes include some pre-defined
+ abbreviations you might find useful. Other modes do not have any
+ abbreviations defined by default.</para>
+
+ <para></para>
+
+ <para>Automatic abbreviation expansion can be enabled in the
+ <guibutton>Abbreviations</guibutton> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box. If enabled, pressing the space bar
+ after entering an abbreviation will automatically expand it.</para>
+
+ <para>If automatic expansion is enabled, a space can be inserted without
+ expanding the word before the caret by pressing <keycombo>
+ <keycap>Control</keycap>
+
+ <keycap>E</keycap>
+ </keycombo> <keycap>V</keycap> <keycap>Space</keycap>.</para>
+
+ <section id="positional-params">
+ <title>Positional Parameters</title>
+
+ <para>Positional parameters are an advanced feature that make
+ abbreviations much more useful. The best way to describe them is
+ with an example.</para>
+
+ <para>Java mode defines an abbreviation <quote>F</quote> that is set
+ to expand to the following:</para>
+
+ <programlisting>for(int $1 = 0; $1 < $2; $1++)</programlisting>
+
+ <para>Expanding <literal>F#j#array.length#</literal> will insert the
+ following text into the buffer:</para>
+
+ <programlisting>for(int j = 0; j < array.length; j++)</programlisting>
+
+ <para>Expansions can contain up to nine positional parameters. Note
+ that a trailing hash character (<quote>#</quote>) must be entered
+ when expanding an abbreviation with parameters.</para>
+
+ <para>If you do not specify the correct number of positional
+ parameters when expanding an abbreviation, any missing parameters
+ will be blank in the expansion, and extra parameters will be
+ ignored. A status bar message will be shown stating the required
+ number of parameters.</para>
+ </section>
+ </section>
+
+ <section id="folding">
+ <title>Folding</title>
+
+ <para>Program source code and other structured text files can be thought
+ of as containing a hierarchy of sections, which themselves might contain
+ sub-sections. The folding feature lets you selectively hide and show
+ these sections, replacing hidden ones with a single line that serves as
+ an <quote>overview</quote> of that section. Folding is disabled by
+ default. To enable it, you must choose one of the available folding
+ modes.</para>
+
+ <para><quote>Indent</quote> mode creates folds based on a line's leading
+ whitespace; the more leading whitespace a block of text has, the further
+ down it is in the hierarchy. For example:</para>
+
+ <screen>This is a section
+ This is a sub-section
+ This is another sub-section
+ This is a sub-sub-section
+Another top-level section</screen>
+
+ <para><quote>Explicit</quote> mode folds away blocks of text surrounded
+ with <quote>{{{</quote> and <quote>}}}</quote>. For example:</para>
+
+ <screen>{{{ The first line of a fold.
+When this fold is collapsed, only the above line will be visible.
+
+{{{ A sub-section.
+With text inside it.
+}}}
+
+{{{ Another sub-section.
+}}}
+
+}}}</screen>
+
+ <para>Both modes have distinct advantages and disadvantages; indent
+ folding requires no changes to be made to a buffer's text and does a
+ decent job with most program source. Explicit folding requires
+ <quote>fold markers</quote> to be inserted into the text, but is more
+ flexible in exactly what to fold away.</para>
+
+ <para>Some plugins might add additional folding modes; see <xref
+ linkend="using-plugins" /> for information about plugins.</para>
+
+ <para>Folding can be enabled in one of several ways:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>On a global or mode-specific basis in the
+ <guibutton>Editing</guibutton> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box. See <xref
+ linkend="editing-pane" />.</para>
+ </listitem>
+
+ <listitem>
+ <para>In the current buffer for the duration of the editing
+ session in the
+ <guimenu>Utilities</guimenu>><guimenuitem>Buffer
+ Options</guimenuitem> dialog box. See <xref
+ linkend="buffer-opts" />.</para>
+ </listitem>
+
+ <listitem>
+ <para>In the current buffer for future editing sessions by
+ placing the following in the first or last 10 lines of a buffer,
+ where <replaceable>mode</replaceable> is either
+ <quote>indent</quote>, <quote>explicit</quote>, or the name of a
+ plugin folding mode:</para>
+
+ <screen>:folding=<replaceable>mode</replaceable>:</screen>
+ </listitem>
+ </itemizedlist>
+
+ <warning>
+ <para>When using indent folding, portions of the buffer may become
+ inaccessible if you change the leading indent of the first line of a
+ collapsed fold. If you experience this, you can use the
+ <guimenuitem>Expand All Folds</guimenuitem> command to make the text
+ visible again.</para>
+ </warning>
+
+ <section>
+ <title>Collapsing and Expanding Folds</title>
+
+ <para>The first line of each fold has a triangle drawn next to it in
+ the gutter (see <xref linkend="overview" /> for more information
+ about the gutter). The triangle points toward the line when the fold
+ is collapsed, and downward when the fold is expanded. Clicking the
+ triangle collapses and expands the fold. To expand all sub-folds as
+ well, hold down the <keycap>Shift</keycap> while clicking.</para>
+
+ <para>The first line of a collapsed fold is drawn with a background
+ color that depends on the fold level, and the number of lines in the
+ fold is shown to the right of the line's text.</para>
+
+ <para>Folds can also be collapsed and expanded using menu item
+ commands and keyboard shortcuts.</para>
+
+ <para><guisubmenu>Folding</guisubmenu>><guimenuitem>Collapse
+ Fold</guimenuitem> (shortcut: <keycap>A+BACK_SPACE</keycap>)
+ collapses the fold containing the caret.</para>
+
+ <para><guisubmenu>Folding</guisubmenu>><guimenuitem>Expand Fold
+ One Level</guimenuitem> (shortcut: <keycap>A+ENTER</keycap>) expands
+ the fold containing the caret. Nested folds will remain collapsed,
+ and the caret will be positioned on the first nested fold (if
+ any).</para>
+
+ <para><guisubmenu>Folding</guisubmenu>><guimenuitem>Expand Fold
+ Fully</guimenuitem> (shortcut: <keycap>AS+ENTER</keycap>) expands
+ the fold containing the caret, also expanding any nested
+ folds.</para>
+
+ <para><guisubmenu>Folding</guisubmenu>><guimenuitem>Collapse All
+ Folds</guimenuitem> (shortcut: <keycap>C+e c</keycap>) collapses all
+ folds in the buffer.</para>
+
+ <para><guisubmenu>Folding</guisubmenu>><guimenuitem>Expand All
+ Folds</guimenuitem> (shortcut: <keycap>C+e x</keycap>) expands all
+ folds in the buffer.</para>
+ </section>
+
+ <section>
+ <title>Navigating Around With Folds</title>
+
+ <para><guisubmenu>Folding</guisubmenu>><guimenuitem>Go to Parent
+ Fold</guimenuitem> (shortcut: <keycap>C+e u</keycap>) moves the
+ caret to the fold containing the one at the caret position.</para>
+
+ <para><guisubmenu>Folding</guisubmenu>><guimenuitem>Go to
+ Previous Fold</guimenuitem> (shortcut: <keycap>A+UP</keycap>) moves
+ the caret to the fold immediately before the caret position.</para>
+
+ <para><guisubmenu>Folding</guisubmenu>><guimenuitem>Go to Next
+ Fold</guimenuitem> (shortcut: <keycap>A+DOWN</keycap>) moves the
+ caret to the fold immediately after the caret position.</para>
+ </section>
+
+ <section>
+ <title>Miscellaneous Folding Commands</title>
+
+ <para><guisubmenu>Folding</guisubmenu>><guimenuitem>Add Explicit
+ Fold</guimenuitem> (shortcut: <keycap>C+e a</keycap>) surrounds the
+ selection with <quote>{{{</quote> and <quote>}}}</quote>. If the
+ current buffer's edit mode defines comment strings (see <xref
+ linkend="commenting" />) the explicit fold markers will
+ automatically be commented out as well.</para>
+
+ <para><guisubmenu>Folding</guisubmenu>><guimenuitem>Select
+ Fold</guimenuitem> (shortcut: <keycap>C+e s</keycap>) selects all
+ lines within the fold containing the caret.
+ <keycap>Control</keycap>-clicking a fold expansion triangle in the
+ gutter has the same effect.</para>
+
+ <para><guisubmenu>Folding</guisubmenu>><guimenuitem>Expand Folds
+ With Level</guimenuitem> (shortcut: <keycap>C+e ENTER
+ <replaceable>key</replaceable></keycap>) reads the next character
+ entered at the keyboard, and expands folds in the buffer with a fold
+ level less than that specified, while collapsing all others.</para>
+
+ <para>Sometimes it is desirable to have files open with folds
+ initially collapsed. This can be configured as follows:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>On a global or mode-specific basis in the
+ <guibutton>Editing</guibutton> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box. See <xref
+ linkend="editing-pane" />.</para>
+ </listitem>
+
+ <listitem>
+ <para>In the current buffer for future editing sessions by
+ placing the following in the first or last 10 lines of a
+ buffer, where <replaceable>level</replaceable> is the
+ desired fold level:</para>
+
+ <screen>:collapseFolds=<replaceable>level</replaceable>:</screen>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section id="narrowing">
+ <title>Narrowing</title>
+
+ <para>The narrowing feature temporarily <quote>narrows</quote> the
+ display of a buffer to a specified region. Text outside the region
+ is not shown, but is still present in the buffer. <!-- Both folding and
+ narrowing are implemented using the same code internally. --></para>
+
+ <para>Holding down <keycap>Alt</keycap> while clicking a fold
+ expansion triangle in the gutter will hide all lines the buffer
+ except those contained in the clicked fold.</para>
+
+ <para><guisubmenu>Folding</guisubmenu>><guimenuitem>Narrow Buffer
+ to Fold</guimenuitem> (shortcut: <keycap>C+e n n</keycap>) hides all
+ lines the buffer except those in the fold containing the caret. <!-- When this command is invoked, a message is shown in the
+ status bar reminding you that you need to invoke
+ <guimenuitem>Expand All Folds</guimenuitem> to make the rest of the buffer
+ visible again. --></para>
+
+ <para><guisubmenu>Folding</guisubmenu>><guimenuitem>Narrow Buffer
+ to Selection</guimenuitem> (shortcut: <keycap>C+e n s</keycap>)
+ hides all lines the buffer except those in the selection.</para>
+
+ <para><guisubmenu>Folding</guisubmenu>><guimenuitem>Expand All
+ Folds</guimenuitem> (shortcut: <keycap>C+e x</keycap>) shows lines
+ that were hidden as a result of narrowing.</para>
+ </section>
+ </section>
</chapter>
\ No newline at end of file
diff --git a/jEdit/doc/users-guide/starting.xml b/jEdit/doc/users-guide/starting.xml
index 54ef580..efe499e 100644
--- a/jEdit/doc/users-guide/starting.xml
+++ b/jEdit/doc/users-guide/starting.xml
@@ -1,364 +1,367 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter id="starting">
- <title>Starting jEdit</title>
-
- <!-- jEdit buffer-local properties: -->
- <!-- :tabSize=1:indentSize=1:noTabs=true: -->
- <!-- :xml.root=users-guide.xml: -->
-
- <para>Exactly how jEdit is started depends on the operating system. For
- example, on Unix you can run <quote>jedit</quote> at the command line, or
- select jEdit from a menu; on Windows, you can double-click on the jEdit icon
- or select it from the <guimenu>Start</guimenu> menu. </para>
-
- <para>If jEdit is started while another copy is already running, control is
- transferred to the running copy, and a second instance is not loaded. This
- saves time and memory if jEdit is started multiple times. Communication
- between instances of jEdit is implemented using TCP/IP sockets; the initial
- instance is known as the <firstterm>server</firstterm>, and subsequent
- invocations are <firstterm>clients</firstterm>.</para>
-
- <para>If you find yourself launching and exiting jEdit a lot, the startup
- time can get a bit bothersome. If the <userinput>-background</userinput>
- command line switch is specified, jEdit will continue running and waiting
- for client requests even after all editor windows are closed. When run in
- background mode, you can open and close jEdit any number of times, only
- having to wait for it to start the first time. The downside of this is
- increased memory usage.</para>
-
- <para>When running on MacOS X, the <userinput>-background</userinput>
- command-line switch is active by default, so that jEdit conforms to the
- platform convention that programs should stay open until the
- <guimenuitem>Quit</guimenuitem> command is explicitly invoked by the user,
- even if all windows are closed. To disable background mode on MacOS X, use
- the <userinput>-nobackground</userinput> switch.</para>
-
- <para>For more information about command line switches that control the
- server feature, see <xref linkend="cli-usage" />. </para>
-
- <para>jEdit remembers open buffers, views and split window configurations
- between editing sessions, so you can get back to work immediately after
- starting jEdit. This feature can be disabled in the
- <guibutton>General</guibutton> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global Options</guimenuitem>
- dialog box see <xref linkend="general-pane" />.</para>
-
- <sidebar>
- <title>The edit server and security</title>
-
- <para>Since Java does not provide any interprocess communication
- facility other than TCP/IP, jEdit takes extra precautions to prevent
- remote attacks.</para>
-
- <para>Not only does the edit server pick a random TCP port number on
- startup, it also requires that clients provide an
- <firstterm>authorization key</firstterm>; a randomly-generated number
- only accessible to processes running on the local machine. So not only
- will <quote>bad guys</quote> have to guess a 64-bit integer, they will
- need to get it right on the first try; the edit server shuts itself off
- upon receiving an invalid packet.</para>
-
- <para>In environments that demand absolute security, the edit server can
- be disabled by specifying the <userinput>-noserver</userinput> command
- line switch.</para>
- </sidebar>
-
- <section id="cli-usage">
- <title>Command Line Usage</title>
-
- <para>On operating systems that support a command line, jEdit can be
- passed various arguments to control its behavior.</para>
-
-
- <para>When opening files from the command line, a line number or marker
- to position the caret on can be specified like so:</para>
-
- <screen><prompt>$ </prompt><userinput>jedit MyApplet.java +line:10</userinput>
-<prompt>$ </prompt><userinput>jedit thesis.tex +marker:c</userinput></screen>
-
- <para>Command-line switches begin with a "-". Some take a parameter. A
- file whose name begins with "-" can be opened like so:</para>
-
- <screen><prompt>$ </prompt><userinput>jedit -- -myfile</userinput></screen>
-
- <section>
- <title>Miscellaneous Options</title>
-
- <informaltable>
- <tgroup cols="2">
- <colspec colnum="1" colwidth="1.5in" />
-
- <thead>
- <row>
- <entry>Option</entry>
-
- <entry>Effect</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry><userinput>-log=<replaceable>level</replaceable></userinput></entry>
-
- <entry>Set the minimum log level to an integer
- between 1 and 9. Default is 7. Has no effect when
- connecting to another instance via the edit
- server.</entry>
- </row>
-
- <row>
- <entry><userinput>-usage</userinput></entry>
-
- <entry>Show a brief command line usage message
- without starting jEdit. This message is also shown if
- an invalid switch was specified.</entry>
- </row>
-
- <row>
- <entry><userinput>-version</userinput></entry>
-
- <entry>Show the version number without starting
- jEdit.</entry>
- </row>
-
- <row>
- <entry><userinput>--</userinput></entry>
-
- <entry>Specifies the end of command-line processing.
- Further parameters are treated as file names, even if
- they begin with a dash.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </section>
-
- <section>
- <title>Configuration Options</title>
-
- <informaltable>
- <tgroup cols="2">
- <colspec colnum="1" colwidth="1.5in" />
-
- <thead>
- <row>
- <entry>Option</entry>
-
- <entry>Effect</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry><userinput>-plugins</userinput></entry>
-
- <entry>Enable loading of plugins. Has no effect when
- connecting to another instance via the edit server.
- See <xref linkend="using-plugins" />.</entry>
- </row>
-
- <row>
- <entry><userinput>-noplugins</userinput></entry>
-
- <entry>Disable loading of plugins. Has no effect when
- connecting to another instance via the edit
- server.</entry>
- </row>
-
- <row>
- <entry><userinput>-restore</userinput></entry>
-
- <entry>Restore previously open files on startup. This
- is the default. This feature can also be set
- permanently in the <guibutton>General</guibutton>
- pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box; see <xref
- linkend="general-pane" />.</entry>
- </row>
-
- <row>
- <entry><userinput>-norestore</userinput></entry>
-
- <entry>Do not restore previously open files on
- startup.</entry>
- </row>
-
- <row>
- <entry><userinput>-run=<replaceable>script</replaceable></userinput></entry>
-
- <entry>Run the specified BeanShell script. There can
- only be one of these parameters on the command line.
- See <xref linkend="scripts-command-line" />.</entry>
- </row>
-
- <row>
- <entry><userinput>-settings=<replaceable>dir</replaceable></userinput></entry>
-
- <entry>Store user-specific settings in the directory
- named <replaceable>dir</replaceable>, instead of the
- default
- <filename><replaceable>user.home</replaceable>/.jedit</filename>.
- The directory will be created automatically if it
- does not exist. Has no effect when connecting to
- another instance via the edit server. See <xref
- linkend="settings-directory" />.</entry>
- </row>
-
- <row>
- <entry><userinput>-nosettings</userinput></entry>
-
- <entry>Start jEdit without loading user-specific
- settings.</entry>
- </row>
-
- <row>
- <entry><userinput>-startupscripts</userinput></entry>
-
- <entry>Run startup scripts. This is the default. Has
- no effect when connecting to another instance via the
- edit server. See <xref
- linkend="startup-scripts" />.</entry>
- </row>
-
- <row>
- <entry><userinput>-nostartupscripts</userinput></entry>
-
- <entry>Disable startup scripts. Has no effect when
- connecting to another instance via the edit
- server.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </section>
-
- <section>
- <title>Edit Server Options</title>
-
- <para>See <xref linkend="starting" /> for a brief description of the
- edit server.</para>
-
- <informaltable>
- <tgroup cols="2">
- <colspec colnum="1" colwidth="1.5in" />
-
- <thead>
- <row>
- <entry>Option</entry>
-
- <entry>Effect</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry><userinput>-background</userinput></entry>
-
- <entry>Run jEdit in background mode. In background
- mode, the edit server will continue listening for
- client connections even after all views are closed.
- Has no effect when connecting to another instance via
- the edit server.</entry>
- </row>
-
- <row>
- <entry><userinput>-nobackground</userinput></entry>
-
- <entry>Disable background mode. This is the default.
- Has no effect when connecting to another instance via
- the edit server.</entry>
- </row>
-
- <row>
- <entry><userinput>-gui</userinput></entry>
-
- <entry>Open an initial view. This is the default. Has
- no effect when connecting to another instance via the
- edit server.</entry>
- </row>
-
- <row>
- <entry><userinput>-nogui</userinput></entry>
-
- <entry>Do not open an initial view, and instead only
- open one when the first client connects. Can only be
- used in combination with the
- <userinput>-background</userinput> switch. You can
- use this switch to <quote>pre-load</quote> jEdit when
- you log in to your computer, for example. Has no
- effect when connecting to another instance via the
- edit server.</entry>
- </row>
-
- <row>
- <entry><userinput>-newplainview</userinput></entry>
-
- <entry>Opens the specified files in a new plain view.
- For more information about views, see <xref
- linkend="views" />.</entry>
- </row>
-
- <row>
- <entry><userinput>-newview</userinput></entry>
-
- <entry>Opens the specified files in a new
- view.</entry>
- </row>
-
- <row>
- <entry><userinput>-reuseview</userinput></entry>
-
- <entry>Opens the specified files in an existing
- view.</entry>
- </row>
-
- <row>
- <entry><userinput>-quit</userinput></entry>
-
- <entry>Exits the currently running editor
- instance.</entry>
- </row>
-
- <row>
- <entry><userinput>-server</userinput></entry>
-
- <entry>Store the server port info in the file named
- <filename>server</filename> inside the settings
- directory.</entry>
- </row>
-
- <row>
- <entry><userinput>-server=<replaceable>name</replaceable></userinput></entry>
-
- <entry>Store the server port info in the file named
- <replaceable>name</replaceable>. File names for this
- parameter are relative to the settings
- directory.</entry>
- </row>
-
- <row>
- <entry><userinput>-noserver</userinput></entry>
-
- <entry>Do not attempt to connect to a running edit
- server, and do not start one either.</entry>
- </row>
-
- <row>
- <entry><userinput>-wait</userinput></entry>
-
- <entry>Keeps the client open until the user closes
- the specified buffer in the server instance. Does
- nothing if passed to the initial jEdit instance. Use
- this switch if jEdit is being invoked by another
- program as an external editor; otherwise the client
- will exit immediately and the invoking program will
- assume you have finished editing the given
- file.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </section>
- </section>
-</chapter>
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="starting">
+ <title>Starting jEdit</title>
+
+ <!-- jEdit buffer-local properties: -->
+ <!-- :tabSize=1:indentSize=1:noTabs=true: -->
+ <!-- :xml.root=users-guide.xml: -->
+
+ <para>Exactly how jEdit is started depends on the operating system. For
+ example, on Unix you can run <quote>jedit</quote> at the command line, or
+ select jEdit from a menu; on Windows, you can double-click on the jEdit icon
+ or select it from the <guimenu>Start</guimenu> menu. </para>
+
+ <para>If jEdit is started while another copy is already running, control is
+ transferred to the running copy, and a second instance is not loaded. This
+ saves time and memory if jEdit is started multiple times. Communication
+ between instances of jEdit is implemented using TCP/IP sockets; the initial
+ instance is known as the <firstterm>server</firstterm>, and subsequent
+ invocations are <firstterm>clients</firstterm>.</para>
+
+ <para>If you find yourself launching and exiting jEdit a lot, the startup
+ time can get a bit bothersome. If the <userinput>-background</userinput>
+ command line switch is specified, jEdit will continue running and waiting
+ for client requests even after all editor windows are closed. When run in
+ background mode, you can open and close jEdit any number of times, only
+ having to wait for it to start the first time. The downside of this is
+ increased memory usage.</para>
+
+ <para>When running on MacOS X, the <userinput>-background</userinput>
+ command-line switch is active by default, so that jEdit conforms to the
+ platform convention that programs should stay open until the
+ <guimenuitem>Quit</guimenuitem> command is explicitly invoked by the user,
+ even if all windows are closed. To disable background mode on MacOS X, use
+ the <userinput>-nobackground</userinput> switch.</para>
+
+ <para>For more information about command line switches that control the
+ server feature, see <xref linkend="cli-usage" />. </para>
+
+ <para>jEdit remembers open buffers, views and split window configurations
+ between editing sessions, so you can get back to work immediately after
+ starting jEdit. This feature can be disabled in the
+ <guibutton>General</guibutton> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global Options</guimenuitem>
+ dialog box see <xref linkend="general-pane" />.</para>
+
+ <sidebar>
+ <title>The edit server and security</title>
+
+ <para>Since Java does not provide any interprocess communication
+ facility other than TCP/IP, jEdit takes extra precautions to prevent
+ remote attacks.</para>
+
+ <para>Not only does the edit server pick a random TCP port number on
+ startup, it also requires that clients provide an
+ <firstterm>authorization key</firstterm>; a randomly-generated number
+ only accessible to processes running on the local machine. So not only
+ will <quote>bad guys</quote> have to guess a 64-bit integer, they will
+ need to get it right on the first try; the edit server shuts itself off
+ upon receiving an invalid packet.</para>
+
+ <para>In environments that demand absolute security, the edit server can
+ be disabled by specifying the <userinput>-noserver</userinput> command
+ line switch.</para>
+ </sidebar>
+
+ <section id="cli-usage">
+ <title>Command Line Usage</title>
+
+ <para>On operating systems that support a command line, jEdit can be
+ passed various arguments to control its behavior.</para>
+
+
+ <para>When opening files from the command line, a line number or marker
+ to position the caret on can be specified like so:</para>
+
+ <screen><prompt>$ </prompt><userinput>jedit MyApplet.java +line:10</userinput>
+<prompt>$ </prompt><userinput>jedit thesis.tex +marker:c</userinput></screen>
+
+ <para>Command-line switches begin with a "-". Some take a parameter. A
+ file whose name begins with "-" can be opened like so:</para>
+
+ <screen><prompt>$ </prompt><userinput>jedit -- -myfile</userinput></screen>
+
+ <section>
+ <title>Miscellaneous Options</title>
+
+ <informaltable>
+ <tgroup cols="2">
+ <colspec colnum="1" colwidth="1.5in" />
+ <colspec colwidth="*"/>
+
+ <thead>
+ <row>
+ <entry>Option</entry>
+
+ <entry>Effect</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry><userinput>-log=<replaceable>level</replaceable></userinput></entry>
+
+ <entry>Set the minimum log level to an integer
+ between 1 and 9. Default is 7. Has no effect when
+ connecting to another instance via the edit
+ server.</entry>
+ </row>
+
+ <row>
+ <entry><userinput>-usage</userinput></entry>
+
+ <entry>Show a brief command line usage message
+ without starting jEdit. This message is also shown if
+ an invalid switch was specified.</entry>
+ </row>
+
+ <row>
+ <entry><userinput>-version</userinput></entry>
+
+ <entry>Show the version number without starting
+ jEdit.</entry>
+ </row>
+
+ <row>
+ <entry><userinput>--</userinput></entry>
+
+ <entry>Specifies the end of command-line processing.
+ Further parameters are treated as file names, even if
+ they begin with a dash.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </section>
+
+ <section>
+ <title>Configuration Options</title>
+
+ <informaltable>
+ <tgroup cols="2">
+ <colspec colnum="1" colwidth="1.5in" />
+ <colspec colwidth="*"/>
+
+ <thead>
+ <row>
+ <entry>Option</entry>
+
+ <entry>Effect</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry><userinput>-plugins</userinput></entry>
+
+ <entry>Enable loading of plugins. Has no effect when
+ connecting to another instance via the edit server.
+ See <xref linkend="using-plugins" />.</entry>
+ </row>
+
+ <row>
+ <entry><userinput>-noplugins</userinput></entry>
+
+ <entry>Disable loading of plugins. Has no effect when
+ connecting to another instance via the edit
+ server.</entry>
+ </row>
+
+ <row>
+ <entry><userinput>-restore</userinput></entry>
+
+ <entry>Restore previously open files on startup. This
+ is the default. This feature can also be set
+ permanently in the <guibutton>General</guibutton>
+ pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box; see <xref
+ linkend="general-pane" />.</entry>
+ </row>
+
+ <row>
+ <entry><userinput>-norestore</userinput></entry>
+
+ <entry>Do not restore previously open files on
+ startup.</entry>
+ </row>
+
+ <row>
+ <entry><userinput>-run=<replaceable>script</replaceable></userinput></entry>
+
+ <entry>Run the specified BeanShell script. There can
+ only be one of these parameters on the command line.
+ See <xref linkend="scripts-command-line" />.</entry>
+ </row>
+
+ <row>
+ <entry><userinput>-settings=<replaceable>dir</replaceable></userinput></entry>
+
+ <entry>Store user-specific settings in the directory
+ named <replaceable>dir</replaceable>, instead of the
+ default
+ <filename><replaceable>user.home</replaceable>/.jedit</filename>.
+ The directory will be created automatically if it
+ does not exist. Has no effect when connecting to
+ another instance via the edit server. See <xref
+ linkend="settings-directory" />.</entry>
+ </row>
+
+ <row>
+ <entry><userinput>-nosettings</userinput></entry>
+
+ <entry>Start jEdit without loading user-specific
+ settings.</entry>
+ </row>
+
+ <row>
+ <entry><userinput>-startupscripts</userinput></entry>
+
+ <entry>Run startup scripts. This is the default. Has
+ no effect when connecting to another instance via the
+ edit server. See <xref
+ linkend="startup-scripts" />.</entry>
+ </row>
+
+ <row>
+ <entry><userinput>-nostartupscripts</userinput></entry>
+
+ <entry>Disable startup scripts. Has no effect when
+ connecting to another instance via the edit
+ server.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </section>
+
+ <section>
+ <title>Edit Server Options</title>
+
+ <para>See <xref linkend="starting" /> for a brief description of the
+ edit server.</para>
+
+ <informaltable>
+ <tgroup cols="2">
+ <colspec colnum="1" colwidth="1.5in" />
+ <colspec colwidth="*"/>
+
+ <thead>
+ <row>
+ <entry>Option</entry>
+
+ <entry>Effect</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry><userinput>-background</userinput></entry>
+
+ <entry>Run jEdit in background mode. In background
+ mode, the edit server will continue listening for
+ client connections even after all views are closed.
+ Has no effect when connecting to another instance via
+ the edit server.</entry>
+ </row>
+
+ <row>
+ <entry><userinput>-nobackground</userinput></entry>
+
+ <entry>Disable background mode. This is the default.
+ Has no effect when connecting to another instance via
+ the edit server.</entry>
+ </row>
+
+ <row>
+ <entry><userinput>-gui</userinput></entry>
+
+ <entry>Open an initial view. This is the default. Has
+ no effect when connecting to another instance via the
+ edit server.</entry>
+ </row>
+
+ <row>
+ <entry><userinput>-nogui</userinput></entry>
+
+ <entry>Do not open an initial view, and instead only
+ open one when the first client connects. Can only be
+ used in combination with the
+ <userinput>-background</userinput> switch. You can
+ use this switch to <quote>pre-load</quote> jEdit when
+ you log in to your computer, for example. Has no
+ effect when connecting to another instance via the
+ edit server.</entry>
+ </row>
+
+ <row>
+ <entry><userinput>-newplainview</userinput></entry>
+
+ <entry>Opens the specified files in a new plain view.
+ For more information about views, see <xref
+ linkend="views" />.</entry>
+ </row>
+
+ <row>
+ <entry><userinput>-newview</userinput></entry>
+
+ <entry>Opens the specified files in a new
+ view.</entry>
+ </row>
+
+ <row>
+ <entry><userinput>-reuseview</userinput></entry>
+
+ <entry>Opens the specified files in an existing
+ view.</entry>
+ </row>
+
+ <row>
+ <entry><userinput>-quit</userinput></entry>
+
+ <entry>Exits the currently running editor
+ instance.</entry>
+ </row>
+
+ <row>
+ <entry><userinput>-server</userinput></entry>
+
+ <entry>Store the server port info in the file named
+ <filename>server</filename> inside the settings
+ directory.</entry>
+ </row>
+
+ <row>
+ <entry><userinput>-server=<replaceable>name</replaceable></userinput></entry>
+
+ <entry>Store the server port info in the file named
+ <replaceable>name</replaceable>. File names for this
+ parameter are relative to the settings
+ directory.</entry>
+ </row>
+
+ <row>
+ <entry><userinput>-noserver</userinput></entry>
+
+ <entry>Do not attempt to connect to a running edit
+ server, and do not start one either.</entry>
+ </row>
+
+ <row>
+ <entry><userinput>-wait</userinput></entry>
+
+ <entry>Keeps the client open until the user closes
+ the specified buffer in the server instance. Does
+ nothing if passed to the initial jEdit instance. Use
+ this switch if jEdit is being invoked by another
+ program as an external editor; otherwise the client
+ will exit immediately and the invoking program will
+ assume you have finished editing the given
+ file.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </section>
+ </section>
+</chapter>
diff --git a/jEdit/doc/users-guide/text-edit.xml b/jEdit/doc/users-guide/text-edit.xml
index 0ea397b..862310b 100644
--- a/jEdit/doc/users-guide/text-edit.xml
+++ b/jEdit/doc/users-guide/text-edit.xml
@@ -1,1246 +1,1251 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter id="editing">
- <title>Editing Text</title>
- <!-- jEdit buffer-local properties:
- :tabSize=1:indentSize=1:noTabs=true:wrap=soft:maxLineLen=80:
- :xml.root=users-guide.xml: -->
-
- <section id="caret">
- <title>Moving The Caret</title>
-
- <para>The simplest way to move the caret is to click the mouse at the
- desired location in the text area. The caret can also be moved using the
- keyboard.</para>
-
- <para>The <keycap>LEFT</keycap>, <keycap>RIGHT</keycap>,
- <keycap>UP</keycap> and <keycap>DOWN</keycap> keys move the caret in the
- respective direction, and the <keycap>PAGE_UP</keycap> and
- <keycap>PAGE_DOWN</keycap> keys move the caret up and down one
- screen-full, respectively.</para>
-
- <para>When pressed once, the <keycap>HOME</keycap> key moves the caret
- to the first non-whitespace character of the current screen line.
- Pressing it a second time moves the caret to the beginning of the
- current buffer line. Pressing it a third time moves the caret to the
- first visible line.</para>
-
- <para>The <keycap>END</keycap> key behaves in a similar manner, going to
- the last non-whitespace character of the current screen line, the end of
- the current buffer line, and finally to the last visible line.</para>
-
- <para>If soft wrap is disabled, a <quote>screen line</quote> is the same
- as a <quote>buffer line</quote>. If soft wrap is enabled, a screen line
- is a section of a newline-delimited buffer line that fits within the
- wrap margin width. See <xref linkend="word-wrap" />.</para>
-
- <para><keycap>C+HOME</keycap> and <keycap>C+END</keycap> move the caret
- to the beginning and end of the buffer, respectively.</para>
-
- <para>More advanced caret movement is covered in <xref
- linkend="words" />, <xref linkend="lines" /> and <xref
- linkend="paragraphs" />.</para>
-
- <sidebar>
- <title>The Home and End keys</title>
-
- <para>If you prefer more traditional behavior for the
- <keycap>HOME</keycap> and <keycap>END</keycap> keys, you can
- reassign the respective keyboard shortcuts in the
- <guibutton>Shortcuts</guibutton> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem>; see <xref linkend="shortcuts-pane" />.</para>
-
- <para>By default, the shortcuts are assigned as follows:</para>
-
- <itemizedlist>
- <listitem>
- <para><keycap>HOME</keycap> is bound to <guimenuitem>Smart
- Home</guimenuitem>.</para>
- </listitem>
-
- <listitem>
- <para><keycap>END</keycap> is bound to <guimenuitem>Smart
- End</guimenuitem>.</para>
- </listitem>
-
- <listitem>
- <para><keycap>S+HOME</keycap> is bound to
- <guimenuitem>Select to Smart Home
- Position</guimenuitem>.</para>
- </listitem>
-
- <listitem>
- <para><keycap>S+END</keycap> is bound to <guimenuitem>Select
- to Smart End Position</guimenuitem>.</para>
- </listitem>
- </itemizedlist>
-
- <para>However you can rebind them to anything you want, for example,
- various combinations of the following, or indeed any other command
- or macro:</para>
-
- <itemizedlist>
- <listitem>
- <para><guimenuitem>Go to Start/End of White
- Space</guimenuitem>.</para>
- </listitem>
-
- <listitem>
- <para><guimenuitem>Go to Start/End of
- Line</guimenuitem>.</para>
- </listitem>
-
- <listitem>
- <para><guimenuitem>Go to Start/End of
- Buffer</guimenuitem>.</para>
- </listitem>
-
- <listitem>
- <para><guimenuitem>Select to Start/End of White Space
- </guimenuitem>.</para>
- </listitem>
-
- <listitem>
- <para><guimenuitem>Select to Start/End of
- Line</guimenuitem>.</para>
- </listitem>
-
- <listitem>
- <para><guimenuitem>Select to Start/End of
- Buffer</guimenuitem>.</para>
- </listitem>
- </itemizedlist>
- </sidebar>
- </section>
-
- <section id="selection">
- <title>Selecting Text</title>
-
- <para>A <firstterm>selection</firstterm> is a block of text marked for
- further manipulation. Range selections are equivalent to selections in
- most other text editors; they cover text between two points in a buffer.
- In addition to the standard text-selection mode, jEdit also allows
- <emphasis role="bold">rectangular selections</emphasis> that cover a
- rectangular area (some text editors refer to these as <quote>column
- selections</quote>). Furthermore, several chunks of text can be selected
- and operated on simultaneously.</para>
-
- <section>
- <title>Range Selection</title>
-
- <para>Dragging the mouse creates a range selection from where the
- mouse was pressed to where it was released. Holding down
- <keycap>Shift</keycap> while clicking a location in the buffer will
- create a selection from the caret position to the clicked
- location.</para>
-
- <para>Holding down <keycap>Shift</keycap> in addition to a caret
- movement key (<keycap>LEFT</keycap>, <keycap>UP</keycap>,
- <keycap>HOME</keycap>, etc) will extend a selection in the specified
- direction.</para>
-
- <para><guimenu>Edit</guimenu>><guimenuitem>Select
- All</guimenuitem> (shortcut: <keycap>C+a</keycap>) selects the
- entire buffer.</para>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>More
- Selection</guisubmenu>><guimenuitem>Select None</guimenuitem>
- (shortcut: <keycap>ESCAPE</keycap>) deactivates the
- selection.</para>
- </section>
-
- <section id="rect-select">
- <title>Rectangular Selection</title>
-
- <para>Dragging with the <keycap>Control</keycap> key held down will
- create a rectangular selection. Holding down <keycap>Shift</keycap>
- and <keycap>Control</keycap> while clicking a location in the buffer
- will create a rectangular selection from the caret position to the
- clicked location.</para>
-
- <para>Alternatively, invoking
- <guimenu>Edit</guimenu>><guisubmenu>More
- Selection</guisubmenu>><guimenuitem>Rectangular
- Selection</guimenuitem> (shortcut: <keycap>A+\</keycap>) toggles
- rectangular selection mode. In rectangular selection mode, dragging
- the mouse always creates a rectangular selection, and keyboard
- commands that would normally create a range selection create a
- rectangular selection instead. A status bar indicator is shown when
- this mode is enabled.</para>
-
- <para>It is possible to select a rectangle with zero width but
- non-zero height. This can be used to insert a new column between two
- existing columns, for example. Such zero-width selections are shown
- as a thin vertical line.</para>
-
- <para>Inserting text into a rectangular selection repeats the text
- going down as many times as necessary, and shifts the selection to
- the right. This makes it behave like a <quote>tall</quote>
- caret.</para>
-
- <para>Rectangles can be deleted, copied, pasted, and operated on
- using ordinary editing commands. If necessary, rectangular
- selections are automatically filled in with whitespace to maintain
- alignment.</para>
-
- <para>Rectangular selections can extend beyond the end of a line
- into <quote>virtual space</quote>. Furthermore, if keyboard
- rectangular selection mode is on or if the <keycap>Control</keycap>
- key is being held down, clicking beyond the end of a line will
- insert the appropriate amount of whitespace in order to position the
- cursor at the clicked location.</para>
-
- <note>
- <para>Rectangular selections are implemented using character
- offsets, not absolute screen positions, so they might not behave
- as you might expect if a proportional-width font is being used
- or if soft wrap is enabled. The text area font can be changed in
- the <guibutton>Text Area</guibutton> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box. For information about soft
- wrap, see <xref linkend="word-wrap" />.</para>
- </note>
- </section>
-
- <section id="multi-select">
- <title>Multiple Selection</title>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>More
- Selection</guisubmenu>><guimenuitem>Multiple
- Selection</guimenuitem> (keyboard shortcut: <keycap>C+\</keycap>)
- turns multiple selection mode on and off. In multiple selection
- mode, multiple fragments of text can be selected and operated on
- simultaneously, and the caret can be moved independently of the
- selection. The status bar indicates if multiple selection mode is
- active; see <xref linkend="status-bar" />.</para>
-
- <para>Various jEdit commands behave differently with multiple
- selections:</para>
-
- <itemizedlist>
- <listitem>
- <para>Commands that copy text place the contents of each
- selection, separated by line breaks, in the specified
- register.</para>
- </listitem>
-
- <listitem>
- <para>Commands that insert (or paste) text replace each
- selection with the entire text that is being
- inserted.</para>
- </listitem>
-
- <listitem>
- <para>Commands that filter text (such as <guimenuitem>Spaces
- to Tabs</guimenuitem>, <guimenuitem>Range
- Comment</guimenuitem>, <guimenuitem>Replace in
- Selection</guimenuitem>, and so on) behave as if each block
- was selected independently, and the command invoked on each
- in turn.</para>
- </listitem>
-
- <listitem>
- <para>Line-based commands (such as <guimenuitem>Shift Indent
- Left</guimenuitem>, <guimenuitem>Shift Indent
- Right</guimenuitem>, and <guimenuitem>Line
- Comment</guimenuitem>) operate on each line that contains at
- least one selection.</para>
- </listitem>
-
- <listitem>
- <para>Caret movement commands that would normally deactivate
- the selection (such as the arrow keys, while
- <keycap>Shift</keycap> is not being held down), move the
- caret, leaving the selection as-is.</para>
- </listitem>
-
- <listitem>
- <para>Some older plugins may not support multiple selection
- at all.</para>
- </listitem>
- </itemizedlist>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>More
- Selection</guisubmenu>><guimenuitem>Select None</guimenuitem>
- (shortcut: <keycap>ESCAPE</keycap>) deactivates the selection
- containing the caret, if there is one. Otherwise it deactivates all
- active selections.</para>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>More
- Selection</guisubmenu>><guimenuitem>Invert
- Selection</guimenuitem> (shortcut: <keycap>C+e C+i</keycap>) selects
- a set of text chunks such that all text that was formerly part of a
- selection is now unselected, and all text that wasn't, is
- selected.</para>
-
- <note>
- <para>Deactivating multiple selection mode while multiple blocks
- of text are selected will leave the selections in place, but you
- will not be able to add new selections until multiple selection
- mode is reactivated.</para>
- </note>
- </section>
- </section>
-
- <section id="entering-text">
- <title>Inserting and Deleting Text</title>
-
- <para>Text entered at the keyboard is inserted into the buffer. In
- overwrite mode, which can be toggled by pressing
- <keycap>INSERT</keycap>, one character is deleted from in front of the
- caret position for every character that is inserted. The caret is drawn
- as a horizontal line while overwrite mode is active. The status bar also
- indicates if overwrite mode is active; see <xref linkend="status-bar" />
- for details.</para>
-
- <para>Inserting text while there is a selection will replace the
- selection with the inserted text.</para>
-
- <para>When inserting text, the <keycap>TAB</keycap> and
- <keycap>ENTER</keycap> keys might not behave entirely like you expect
- because of various indentation features; see <xref linkend="indent" />
- for details.</para>
-
- <para>The simplest way to delete text is with the
- <keycap>BACKSPACE</keycap> and <keycap>DELETE</keycap> keys. If nothing
- is selected, they delete the character before or after the caret,
- respectively. If a selection exists, both delete the selection.</para>
-
- <para>More advanced deletion commands are described in <xref
- linkend="words" />, <xref linkend="lines" /> and <xref
- linkend="paragraphs" />.</para>
- </section>
-
- <section id="undo-redo">
- <title>Undo and Redo</title>
-
- <para><guimenu>Edit</guimenu>><guimenuitem>Undo</guimenuitem>
- (shortcut: <keycap>C+z</keycap>) reverses the most recent editing
- command. For example, this can be used to restore unintentionally
- deleted text. More complicated operations, such as a search and replace,
- can also be undone.</para>
-
- <para>If you undo too many changes,
- <guimenu>Edit</guimenu>><guimenuitem>Redo</guimenuitem> (shortcut:
- <keycap>C+e C+z</keycap>) can restore the changes again. For example, if
- some text was inserted, <guimenuitem>Undo</guimenuitem> will remove it
- from the buffer. <guimenuitem>Redo</guimenuitem> will insert it
- again.</para>
-
- <para>By default, the last 100 edits is retained; older edits cannot be
- undone. The maximum number of undos and whether undos are reset when a
- buffer is saved can be changed in the <guibutton>Editing</guibutton>
- pane of the <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box; see <xref
- linkend="editing-pane" />.</para>
- </section>
-
- <section id="words">
- <title>Working With Words</title>
-
- <para><keycap>C+LEFT</keycap> and <keycap>C+RIGHT</keycap> move the
- caret a word at a time. Holding down <keycap>Shift</keycap> in addition
- to the above extends the selection a word at a time.</para>
-
- <para>A single word can be selected by double-clicking with the mouse,
- or using the <guimenu>Edit</guimenu>><guisubmenu>More
- Selection</guisubmenu>><guimenuitem>Select Word</guimenuitem> command
- (shortcut: <keycap>C+e w</keycap>). A selection that begins and ends on
- word boundaries can be created by double-clicking and dragging.</para>
-
- <para><keycap>C+BACKSPACE</keycap> and <keycap>C+DELETE</keycap> delete
- the word before or after the caret, respectively.</para>
-
- <para><guimenu>Edit</guimenu>><guimenuitem>Complete
- Word</guimenuitem> (shortcut: <keycap>C+b</keycap>) locates possible
- completions for the word at the caret, first by looking in the current
- edit mode's syntax highlighting keyword list, and then in the current
- buffer for words that begin with the word at the caret. This serves as a
- very basic code completion feature.</para>
-
- <para>If there is only one completion, it will be inserted into the
- buffer immediately.</para>
-
- <para>If multiple completions were found, the longest common prefix is
- inserted into the buffer, and a popup is shown below the caret position
- listing the completions.</para>
-
- <para>To insert a completion from the list, either select it using the
- <keycap>UP</keycap> and <keycap>DOWN</keycap> keys and press
- <keycap>ENTER</keycap>, press a digit to insert one of the first ten
- completions (1 is the first completion; 9 is the 9th; 0 is the 10th), or
- click the desired completion with the mouse. To close the popup without
- inserting a completion, press <keycap>ESCAPE</keycap>.</para>
-
- <para>Typing while the popup is visible will automatically update the
- popup and narrow the set of completions as necessary.</para>
-
- <para>The default word completion uses the visible buffers (buffers
- being shown in an EditPane) to find completions. The set of possible
- words can be expanded by enabling the <guimenuitem>Global Options - Text
- Area - Complete words from all open buffers</guimenuitem> option.
- Setting this option will use all open buffers to search for possible
- completions. Note, this can degrade completion performance if many
- buffers are open.</para>
-
- <para><guimenu>Edit</guimenu>><guimenuitem>Word Count</guimenuitem>
- displays a dialog box with the number of characters, words and lines in
- the current buffer.</para>
-
- <section>
- <title>What's a Word?</title>
-
- <para>The default behavior of the <keycap>C+LEFT</keycap>,
- <keycap>C+RIGHT</keycap>, <keycap>C+BACKSPACE</keycap> and
- <keycap>C+DELETE</keycap> commands is to stop both at the beginning
- and the end of each word. Normally, a word is a sequence of
- alphanumerics, but you can add other characters as part of
- what jEdit considers to be a 'word', set on a global or mode basis
- from <guimenuitem>Global Options - Editing - Extra Word
- Characters</guimenuitem>.
- In addition, this behavior can be changed by remapping
- these keystrokes to alternative actions whose names end with
- <guimenuitem>(Eat Whitespace)</guimenuitem> in the
- <guibutton>Shortcuts</guibutton> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box; see <xref
- linkend="shortcuts-pane" />.</para>
- </section>
- </section>
-
- <section id="lines">
- <title>Working With Lines</title>
-
- <para>An entire line can be selected by triple-clicking with the mouse,
- or using the <guimenu>Edit</guimenu>><guisubmenu>More
- Selection</guisubmenu>><guimenuitem>Select Line</guimenuitem> command
- (shortcut: <keycap>C+e l</keycap>). A selection that begins and ends on
- line boundaries can be created by triple-clicking and dragging.</para>
-
- <para><guimenu>Edit</guimenu>><guimenuitem>Go to Line</guimenuitem>
- (shortcut: <keycap>C+l</keycap>) prompts for a line number and moves the
- caret there.</para>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>More
- Selection</guisubmenu>><guimenuitem>Select Line Range</guimenuitem>
- (shortcut: <keycap>C+e C+l</keycap>) prompts for two line numbers and
- selects all text between them.</para>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>Text</guisubmenu>><guimenuitem>Delete
- Line</guimenuitem> (shortcut: <keycap>C+d</keycap>) deletes the current
- line.</para>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>Text</guisubmenu>><guimenuitem>Delete
- to Start Of Line</guimenuitem> (shortcut:
- <keycap>CS+BACK_SPACE</keycap>) deletes all text from the start of the
- current line to the caret.</para>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>Text</guisubmenu>><guimenuitem>Delete
- to End Of Line</guimenuitem> (shortcut: <keycap>CS+DELETE</keycap>)
- deletes all text from the caret to the end of the current line.</para>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>Text</guisubmenu>><guimenuitem>Join
- Lines</guimenuitem> (shortcut: <keycap>C+j</keycap>) removes any
- whitespace from the start of the next line and joins it with the current
- line. The caret is moved to the position where the two lines were
- joined. For example, if you invoke <guimenuitem>Join Lines</guimenuitem>
- with the caret on the first line of the following Java code:</para>
-
- <screen>new Widget(Foo
- .createDefaultFoo());</screen>
-
- <para>It will be changed to:</para>
-
- <screen>new Widget(Foo.createDefaultFoo());</screen>
- </section>
-
- <section id="paragraphs">
- <title>Working With Paragraphs</title>
-
- <para>As far as jEdit is concerned, <quote>paragraphs</quote> are
- delimited by double newlines. This is also how
- <application>TeX</application> defines a paragraph. Note that jEdit
- doesn't parse HTML files for <quote><P></quote> tags, nor does it
- support paragraphs delimited only by a leading indent.</para>
-
- <para><keycap>C+UP</keycap> and <keycap>C+DOWN</keycap> move the caret
- to the previous and next paragraph, respectively. Holding down
- <keycap>Shift</keycap> in addition to the above extends the selection a
- paragraph at a time.</para>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>More
- Selection</guisubmenu>><guimenuitem>Select Paragraph</guimenuitem>
- (shortcut: <keycap>C+e p</keycap>) selects the paragraph containing the
- caret.</para>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>Text</guisubmenu>><guimenuitem>Format
- Paragraph</guimenuitem> (shortcut: <keycap>C+e f</keycap>) splits and
- joins lines in the current selection to make it fit within the wrap
- column position. If nothing is selected, the paragraph containing the
- caret is formatted instead. See <xref linkend="word-wrap" /> for
- information about word wrap and changing the wrap column.</para>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>Text</guisubmenu>><guimenuitem>Delete
- Paragraph</guimenuitem> (shortcut: <keycap>C+e d</keycap>) deletes the
- paragraph containing the caret.</para>
- </section>
-
- <section id="word-wrap">
- <title>Wrapping Long Lines</title>
-
- <para>The <firstterm>word wrap</firstterm> feature splits lines at word
- boundaries in order to fit text within a specified wrap margin. A word
- boundary, for the purposes of word wrap, means whitespace. Long lines
- without whitespace are currently not wrapped by jEdit. The wrap margin
- position is indicated in the text are as a faint blue vertical line.
- There are two <quote>wrap modes</quote>, <quote>soft</quote> and
- <quote>hard</quote>; they are described below. The current wrap mode is
- shown in the status bar; see <xref linkend="status-bar" />. The wrap
- mode can be changed in one of the following ways:</para>
-
- <itemizedlist>
- <listitem>
- <para>On a global or mode-specific basis in the
- <guibutton>Editing</guibutton> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box. See <xref
- linkend="editing-pane" />.</para>
- </listitem>
-
- <listitem>
- <para>In the current buffer for the duration of the editing
- session,</para>
-
- <itemizedlist>
- <listitem>
- <para>By clicking the status bar indicator.</para>
- </listitem>
-
- <listitem>
- <para>In the
- <guimenu>Utilities</guimenu>><guimenuitem>Buffer
- Options</guimenuitem> dialog box. See <xref
- linkend="buffer-opts" />.</para>
- </listitem>
-
- <listitem>
- <para>From the keyboard, if a keyboard shortcut has been
- assigned to the <guimenuitem>Toggle Word
- Wrap</guimenuitem> command in the
- <guibutton>Shortcuts</guibutton> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box. By default, this
- command does not have a keyboard shortcut.</para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para>In the current buffer for future editing sessions by
- placing the following in one of the first or last 10 lines of
- the buffer, where <replaceable>mode</replaceable> is either
- <quote>none</quote>, <quote>soft</quote> or <quote>hard</quote>,
- and <replaceable>column</replaceable> is the desired wrap
- margin:</para>
-
- <screen>:wrap=<replaceable>mode</replaceable>:maxLineLen=<replaceable>column</replaceable>:</screen>
- </listitem>
- </itemizedlist>
-
- <section>
- <title>Soft Wrap</title>
-
- <para>In soft wrap mode, lines are automatically wrapped when
- displayed on screen. Newlines are not inserted at the wrap
- positions, and the wrapping is automatically updated when text is
- inserted or removed.</para>
-
- <para>If the margin is set to 0, then the width of the text area
- window is used to determine where to wrap lines.</para>
-
- <para>If end of line markers are enabled in the <guibutton>Text
- Area</guibutton> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box, a colon (<quote>:</quote>) is
- painted at the end of wrapped lines. See <xref
- linkend="text-area-pane" />.</para>
- </section>
-
- <section>
- <title>Hard Wrap</title>
-
- <para>In hard wrap mode, inserting text at the end of a line will
- automatically break the line if it extends beyond the wrap margin.
- Inserting or removing text in the middle of a line has no effect,
- however text can be re-wrapped using the
- <guimenu>Edit</guimenu>><guisubmenu>Text</guisubmenu>><guimenuitem>Format
- Paragraph</guimenuitem> command. See <xref
- linkend="paragraphs" />.</para>
-
- <para>Hard wrap is implemented using character offsets, not screen
- positions, so it might not behave like you expect if a
- proportional-width font is being used. The text area font can be
- changed in the <guibutton>Text Area</guibutton> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box.</para>
- </section>
- </section>
-
- <section id="scrolling">
- <title>Scrolling</title>
-
- <para>If you have a mouse with a scroll wheel, you can use the wheel to
- scroll up and down in the text area. Various modifier keys change the
- action of the wheel:</para>
-
- <itemizedlist>
- <listitem>
- <para><keycap>Shift</keycap> - scrolls an entire page at a
- time.</para>
- </listitem>
-
- <listitem>
- <para><keycap>Control</keycap> - scrolls a single line at a
- time.</para>
- </listitem>
-
- <listitem>
- <para><keycap>Alt</keycap> - moves the caret up and down instead
- of scrolling.</para>
- </listitem>
-
- <listitem>
- <para><keycombo>
- <keycap>Alt</keycap>
-
- <keycap>Shift</keycap>
- </keycombo> - extends the selection up and down instead of
- scrolling.</para>
- </listitem>
- </itemizedlist>
-
- <para>Keyboard commands for scrolling the text area are also
- available.</para>
-
- <para><guimenu>View</guimenu>><guisubmenu>Scrolling</guisubmenu>><guimenuitem>Scroll
- to Current Line</guimenuitem> (shortcut: <keycap>C+e C+j</keycap>)
- scrolls the text area in order to make the caret visible, if necessary.
- It does nothing if the caret is already visible.</para>
-
- <para><guimenu>View</guimenu>><guisubmenu>Scrolling</guisubmenu>><guimenuitem>Center
- Caret on Screen</guimenuitem> (shortcut: <keycap>C+e C+n</keycap>) moves
- the caret to the line in the middle of the screen.</para>
-
- <para><guimenu>View</guimenu>><guisubmenu>Scrolling</guisubmenu>><guimenuitem>Line
- Scroll Up</guimenuitem> (shortcut: <keycap>C+QUOTE</keycap>) scrolls the
- text area up by one line.</para>
-
- <para><guimenu>View</guimenu>><guisubmenu>Scrolling</guisubmenu>><guimenuitem>Line
- Scroll Down</guimenuitem> (shortcut: <keycap>C+SLASH</keycap>) scrolls
- the text area down by one line.</para>
-
- <para><guimenu>View</guimenu>><guisubmenu>Scrolling</guisubmenu>><guimenuitem>Page
- Scroll Up</guimenuitem> (shortcut: <keycap>A+QUOTE</keycap>) scrolls the
- text area up by one screenful.</para>
-
- <para><guimenu>View</guimenu>><guisubmenu>Scrolling</guisubmenu>><guimenuitem>Page
- Scroll Down</guimenuitem> (shortcut: <keycap>A+SLASH</keycap>) scrolls
- the text area down by one screenful.</para>
-
- <para>The above scrolling commands differ from the caret movement
- commands in that they don't actually move the caret; they just change
- the scroll bar position.</para>
- </section>
-
- <section id="text-transfer">
- <title>Transferring Text</title>
-
- <para>jEdit provides a rich set of commands for moving and copying text.
- Commands are provided for moving chunks of text from buffers to
- <firstterm>registers</firstterm> and vice-versa. A register is a holding
- area for an arbitrary length of text, with a single-character name. Most
- other programs can only transfer text to and from the system clipboard;
- in jEdit, the system clipboard is just another register, with the
- special name <filename>$</filename>.</para>
-
- <section>
- <title>The Clipboard</title>
-
- <para>jEdit offers the usual text transfer operations, that operate
- on the <filename>$</filename> register.</para>
-
- <para><guimenu>Edit</guimenu>><guimenuitem>Cut</guimenuitem>
- (shortcut: <keycap>C+x</keycap>) places the selected text in the
- clipboard and removes it from the buffer.</para>
-
- <para><guimenu>Edit</guimenu>><guimenuitem>Copy</guimenuitem>
- (shortcut: <keycap>C+c</keycap>) places the selected text in the
- clipboard and leaves it in the buffer.</para>
-
- <para><guimenu>Edit</guimenu>><guimenuitem>Paste</guimenuitem>
- (shortcut: <keycap>C+v</keycap>) inserts the clipboard contents in
- place of the selection (or at the caret position, if there is no
- selection).</para>
-
- <para>The <guimenuitem>Cut</guimenuitem> and
- <guimenuitem>Copy</guimenuitem> commands replace the old clipboard
- contents with the selected text. There are two alternative commands
- which add the selection at the end of the existing clipboard
- contents, instead of replacing it.</para>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>More
- Clipboard</guisubmenu>><guimenuitem>Cut Append</guimenuitem>
- (shortcut: <keycap>C+e C+u</keycap>) appends the selected text to
- the clipboard, then removes it from the buffer. After this command
- has been invoked, the clipboard will consist of the former clipboard
- contents, followed by a newline, followed by the selected
- text.</para>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>More
- Clipboard</guisubmenu>><guimenuitem>Copy Append</guimenuitem>
- (shortcut: <keycap>C+e C+a</keycap>) is the same as <guimenuitem>Cut
- Append</guimenuitem> except it does not remove the selection from
- the buffer.</para>
- </section>
-
- <section id="quick-copy">
- <title>Quick Copy</title>
-
- <para>The quick copy feature is usually found in Unix text editors.
- Quick copy is disabled by default, but it can be enabled in the
- <guibutton>Mouse</guibutton> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box.</para>
-
- <para>The quick copy feature is accessed using the middle mouse
- button. If you do not have a three-button mouse, then either
- <keycap>Alt</keycap>-click (on Windows and Unix) or
- <keycap>Option</keycap>-click (on MacOS X). The quick copy feature
- enables the following behavior:</para>
-
- <itemizedlist>
- <listitem>
- <para>Clicking the middle mouse button in the text area
- inserts the most recently selected text at the clicked
- location. If you only have a two-button mouse, you can click
- the left mouse button while holding down
- <keycap>Alt</keycap> instead of middle-clicking.</para>
- </listitem>
-
- <listitem>
- <para>Dragging with the middle mouse button creates a
- selection without moving the caret. As soon as the mouse
- button is released, the selected text is inserted at the
- caret position and the selection is deactivated. A message
- is shown in the status bar while text is being selected to
- remind you that this is not an ordinary selection.</para>
- </listitem>
-
- <listitem>
- <para>Holding down <keycap>Shift</keycap> while clicking the
- middle mouse button will duplicate text between the caret
- and the clicked location.</para>
- </listitem>
-
- <listitem>
- <para>Holding down <keycap>Control</keycap> while clicking
- the middle mouse button on a bracket will insert all text in
- that bracket's scope at the caret position.</para>
- </listitem>
- </itemizedlist>
-
- <para>The most recently selected text is stored in the
- <filename>%</filename> register.</para>
-
- <para>If jEdit is being run under Java 2 version 1.4 on Unix, you
- will be able to transfer text with other X Windows applications
- using the quick copy feature. On other platforms and Java versions,
- the contents of the quick copy register are only accessible from
- within jEdit.</para>
- </section>
-
- <section id="registers">
- <title>General Register Commands</title>
-
- <para>These commands require more keystrokes than the two methods
- shown above, but they can operate on any register, allowing an
- arbitrary number of text chunks to be retained at a time.</para>
-
- <para>Each command prompts for a single-character register name to
- be entered after being invoked. Pressing <keycap>ESCAPE</keycap>
- instead of specifying a register name cancels the operation.</para>
-
- <para>Note that the content of registers other than the clipboard
- and quick copy register are automatically saved between jEdit
- sessions.</para>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>More
- Clipboard</guisubmenu>><guimenuitem>Cut to Register</guimenuitem>
- (shortcut: <keycap>C+r C+x <replaceable>key</replaceable></keycap>)
- stores the selected text in the specified register, removing it from
- the buffer.</para>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>More
- Clipboard</guisubmenu>><guimenuitem>Copy to
- Register</guimenuitem> (shortcut: <keycap>C+r C+c
- <replaceable>key</replaceable></keycap>) stores the selected text in
- the specified register, leaving it in the buffer.</para>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>More
- Clipboard</guisubmenu>><guimenuitem>Cut Append to
- Register</guimenuitem> (shortcut: <keycap>C+r C+u
- <replaceable>key</replaceable></keycap>) adds the selected text to
- the existing contents of the specified register, and removes it from
- the buffer.</para>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>More
- Clipboard</guisubmenu>><guimenuitem>Copy Append to
- Register</guimenuitem> (shortcut: <keycap>C+r C+a
- <replaceable>key</replaceable></keycap>) adds the selected text to
- the existing contents of the specified register, without removing it
- from the buffer.</para>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>More
- Clipboard</guisubmenu>><guimenuitem>Paste from
- Register</guimenuitem> (shortcut: <keycap>C+r C+v
- <replaceable>key</replaceable></keycap>) replaces the selection with
- the contents of the specified register.</para>
-
- <para>The following three commands display dialog boxes instead of
- prompting for a register name.</para>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>More
- Clipboard</guisubmenu>><guimenuitem>Paste Previous</guimenuitem>
- (shortcut: <keycap>C+e C+v</keycap>) displays a dialog box listing
- the 20 most recently copied and pasted text strings.</para>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>More
- Clipboard</guisubmenu>><guimenuitem>Paste Deleted</guimenuitem>
- (shortcut: <keycap>C+e C+y</keycap>) is not really a register
- command; it displays a dialog box listing the 20 most recently
- deleted text strings.</para>
-
- <para><guimenu>Edit</guimenu>><guisubmenu>More
- Clipboard</guisubmenu>><guimenuitem>View Registers</guimenuitem>
- displays a dialog box for viewing register contents, including the
- clipboard and the quick copy.</para>
- </section>
- </section>
-
- <section id="markers">
- <title>Markers</title>
-
- <para>A <firstterm>marker</firstterm> is a pointer to a specific
- location within a buffer, which may or may not have a single-character
- <firstterm>shortcut</firstterm> associated with it. Markers are
- persistent; they are saved to
- <filename>.<replaceable>filename</replaceable>.marks</filename>, where
- <filename><replaceable>filename</replaceable></filename> is the name of
- the buffer. (The dot prefix makes the markers file hidden on Unix
- systems.) Marker saving can be disabled in the
- <guibutton>General</guibutton> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box; see <xref
- linkend="general-pane" />.</para>
-
- <para><guimenu>Markers</guimenu>><guimenuitem>Add/Remove
- Marker</guimenuitem> (shortcut: <keycap>C+e C+m</keycap>) adds a marker
- without a shortcut pointing to the current line. If a marker is already
- set on the current line, the marker is removed instead. If text is
- selected, markers are added to the first and last line of each
- selection.</para>
-
- <para>Markers are listed in the <guimenu>Markers</guimenu> menu;
- selecting a marker from this menu will move the caret to its
- location.</para>
-
- <para><guimenu>Markers</guimenu>><guimenuitem>Go to Previous
- Marker</guimenuitem> (shortcut: <keycap>C+e C+COMMA</keycap>) goes to
- the marker immediately before the caret position.</para>
-
- <para><guimenu>Markers</guimenu>><guimenuitem>Go to Next
- Marker</guimenuitem> (shortcut: <keycap>C+e C+PERIOD</keycap>) goes to
- the marker immediately after the caret position.</para>
-
- <para><guimenu>Markers</guimenu>><guimenuitem>Remove All
- Markers</guimenuitem> removes all markers set in the current
- buffer.</para>
-
- <para>Markers with shortcuts allow for quicker keyboard-based
- navigation. The following commands all prompt for a single-character
- shortcut when invoked. Pressing <keycap>ESCAPE</keycap> instead of
- specifying a shortcut will cancel the operation.</para>
-
- <para><guimenu>Markers</guimenu>><guimenuitem>Add Marker With
- Shortcut</guimenuitem> (shortcut: <keycap>C+t
- <replaceable>key</replaceable></keycap>) adds a marker with the
- specified shortcut. If marker with that shortcut already exists, it will
- remain in the buffer but lose its shortcut.</para>
-
- <para><guimenu>Markers</guimenu>><guimenuitem>Go to
- Marker</guimenuitem> (shortcut: <keycap>C+y
- <replaceable>key</replaceable></keycap>) moves the caret to the location
- of the marker with the specified shortcut.</para>
-
- <para><guimenu>Markers</guimenu>><guimenuitem>Select to
- Marker</guimenuitem> (shortcut: <keycap>C+u
- <replaceable>key</replaceable></keycap>) creates a selection from the
- caret location to the marker with the specified shortcut.</para>
-
- <para><guimenu>Markers</guimenu>><guimenuitem>Swap Caret and
- Marker</guimenuitem> (shortcut: <keycap>C+k
- <replaceable>key</replaceable></keycap>) moves the caret to the location
- of the marker with the specified shortcut, and moves the marker to the
- former caret position. Invoke this command multiple times to flip
- between two locations in the buffer.</para>
-
- <para>Lines which contain markers are indicated in the gutter with a
- highlight. Moving the mouse over the highlight displays a tool tip
- showing the marker's shortcut, if it has one. See <xref
- linkend="overview" /> for information about the gutter.</para>
- </section>
-
- <section id="search-replace">
- <title>Search and Replace</title>
-
- <section>
- <title>Searching For Text</title>
-
- <para><guimenu>Search</guimenu>><guimenuitem>Find</guimenuitem>
- (shortcut: <keycap>C+f</keycap>) displays the search and replace
- dialog box.</para>
-
- <para>The search string can be entered in the <guibutton>Search
- for</guibutton> text field. This text field remembers previously
- entered strings; see <xref linkend="history" /> for details.</para>
-
- <para>If text was selected in the text area and the selection does
- not span a line break, the selected text becomes the default search
- string.</para>
-
- <para>If the selection spans a line break, the <guibutton>Search in
- Selection</guibutton> and <guibutton>HyperSearch</guibutton> buttons
- will be pre-selected, and the search string field will be initially
- blank. (See <xref linkend="hypersearch" /> for information about the
- HyperSearch feature.) <!-- Note that finding the next or previous
- occurrence cannot be constrained to a selected range; only
- replacement and HyperSearch can be (see <xref linkend="hypersearch" />). --></para>
-
- <para>Selecting the <guibutton>Ignore case</guibutton> check box
- makes the search case insensitive - for example, searching for
- <quote>Hello</quote> will match <quote>hello</quote>,
- <quote>HELLO</quote> and <quote>HeLlO</quote>.</para>
-
- <para>To search for special characters (such as newlines or
- non-printable characters), inexact sequences of text, or strings
- that span multiple lines, we use
- <emphasis role="bold">Regular Expressions</emphasis>.
- Selecting the <guibutton>Regular expressions</guibutton> check
- box allows special characters to be used in the search string.
- Regular expression syntax is described in <xref linkend="regexps"/>.
- If you use (groups) in the search field, you back-reference them
- with $1 through $9 in the replace field. </para>
-
- <para>The <guibutton>Backward</guibutton> and
- <guibutton>Forward</guibutton> buttons specify the search direction.
- Note that regular expressions can only be used when searching in a
- forward direction.</para>
-
- <para>Clicking <guibutton>Find</guibutton> will locate the next
- occurrence of the search string (or previous occurrence, if
- searching backwards). If the <guibutton>Keep dialog</guibutton>
- check box is selected, the dialog box will remain open after the
- search string has been located; otherwise, it will close.</para>
-
- <para>If no occurrences could be found and the <guibutton>Auto
- wrap</guibutton> check box is selected, the search will
- automatically restart from the beginning of the buffer (or the end,
- if searching backwards). If <guibutton>Auto wrap</guibutton> is not
- selected, a confirmation dialog box is shown before restarting the
- search.</para>
-
- <para><guimenu>Search</guimenu>><guimenuitem>Find
- Next</guimenuitem> (shortcut: <keycap>C+g</keycap>) locates the next
- occurrence of the most recent search string without displaying the
- search and replace dialog box.</para>
-
- <para><guimenu>Search</guimenu>><guimenuitem>Find
- Previous</guimenuitem> (shortcut: <keycap>C+h</keycap>) locates the
- previous occurrence of the most recent search string without
- displaying the search and replace dialog box.</para>
- </section>
-
- <section>
- <title>Replacing Text</title>
-
- <para>The replace string text field of the search dialog remembers
- previously entered strings; see <xref linkend="history" /> for
- details.</para>
-
- <para>Clicking <guibutton>Replace & Find</guibutton> will
- perform a replacement in the current selection and locate the next
- occurrence of the search string. Clicking <guibutton>Replace
- All</guibutton> will replace all occurrences of the search string
- with the replacement string in the current search scope (which is
- either the selection, the current buffer, or a set of buffers, as
- specified in the search and replace dialog box).</para>
-
- <para>Occurrences of the search string can be replaced with either a
- replacement string, or the return value of a BeanShell script
- snippet. Two radio buttons in the search and replace dialog box
- select between the two replacement modes, which are described in
- detail below.</para>
-
- <section>
- <title>Text Replace</title>
-
- <para>If the <guibutton>Text</guibutton> button is selected, the
- search string is simply replaced with the replacement
- string.</para>
-
- <para>If regular expressions are enabled, positional parameters
- (<literal>$0</literal>, <literal>$1</literal>,
- <literal>$2</literal>, and so on) can be used to insert the
- contents of matched subexpressions in the replacement string;
- see <xref linkend="regexps" /> for more information.</para>
-
- <para>If the search is case-insensitive, jEdit attempts to
- modify the case of the replacement string to match that of the
- particular instance of the search string being replaced. For
- example, searching for <quote>label</quote> and replacing it
- with <quote>text</quote>, will perform the following
- replacements:</para>
-
- <itemizedlist>
- <listitem>
- <para><quote>String label</quote> would become
- <quote>String text</quote></para>
- </listitem>
-
- <listitem>
- <para><quote>setLabel</quote> would become
- <quote>setText</quote></para>
- </listitem>
-
- <listitem>
- <para><quote>DEFAULT_LABEL</quote> would become
- <quote>DEFAULT_TEXT</quote></para>
- </listitem>
- </itemizedlist>
- </section>
-
- <section>
- <title>BeanShell Replace</title>
-
- <para>In BeanShell replacement mode, the search string is
- replaced with the return value of a BeanShell snippet. The
- following predefined variables can be referenced in the
- snippet:</para>
-
- <itemizedlist>
- <listitem>
- <para><varname>_0</varname> -- the text to be
- replaced</para>
- </listitem>
-
- <listitem>
- <para><varname>_1</varname> - <varname>_9</varname> --
- if regular expressions are enabled, these contain the
- values of matched subexpressions.</para>
- </listitem>
- </itemizedlist>
-
- <para>BeanShell syntax and features are covered in great detail
- in <xref linkend="writing-macros-part" />, but here are some
- examples:</para>
-
- <informalexample>
- <para>To replace each occurrence of <quote>Windows</quote>
- with <quote>Linux</quote>, and each occurrence of
- <quote>Linux</quote> with <quote>Windows</quote>, search for
- the following regular expression:</para>
-
- <programlisting>(Windows|Linux)</programlisting>
-
- <para>Replacing it with the following BeanShell
- snippet:</para>
-
- <programlisting>_1.equals("Windows") ? "Linux" : "Windows"</programlisting>
- </informalexample>
-
- <informalexample>
- <para>To convert all HTML tags to lower case, search for the
- following regular expression:</para>
-
- <programlisting><\S+</programlisting>
-
- <para>Replacing it with the following BeanShell
- snippet:</para>
-
- <programlisting>_0.toLowerCase()</programlisting>
- </informalexample>
-
- <informalexample>
- <para>To replace arithmetic expressions contained in curly
- braces with the result of evaluating the expression, search
- for the following regular expression:</para>
-
- <programlisting>\{(.+?)\}</programlisting>
-
- <para>Replacing it with the following BeanShell
- snippet:</para>
-
- <programlisting>eval(_1)</programlisting>
- </informalexample>
-
- <para>These examples only scratch the surface; the possibilities
- are endless.</para>
- </section>
- </section>
-
- <section id="hypersearch">
- <title>HyperSearch</title>
-
- <para>If the <guibutton>HyperSearch</guibutton> check box in the
- search and replace dialog box is selected, clicking
- <guibutton>Find</guibutton> lists all occurrences of the search
- string, instead of locating the next match.</para>
-
- <para>By default, HyperSearch results are shown in a floating
- window. This window can be docked using the commands in its top-left
- corner popup menu; see <xref linkend="docking" />.</para>
-
- <para>If the <guibutton>Multiple results</guibutton> check box is
- selected in the results window, past search results are
- retained.</para>
-
- <para>Running searches can be stopped in the
- <guimenu>Utilities</guimenu>><guisubmenu>Troubleshooting</guisubmenu>><guimenuitem>I/O
- Progress Monitor</guimenuitem> dialog box.</para>
- </section>
-
- <section>
- <title>Multiple File Search</title>
-
- <para>Search and replace commands can be performed over an arbitrary
- set of files in one step. The set of files to search is selected
- with a set of buttons in the search dialog box.</para>
-
- <para>If the <guibutton>Current buffer</guibutton> button is
- selected, only the current buffer is searched. This is the default
- behavior.</para>
-
- <para>If the <guibutton>All buffers</guibutton> button is selected,
- all open buffers whose names match the glob pattern entered in the
- <guibutton>Filter</guibutton> text field will be searched. See <xref
- linkend="globs" /> for more information about glob patterns.</para>
-
- <para>If the <guibutton>Directory</guibutton> radio button is
- selected, all files contained in the specified directory whose names
- match the glob will be searched. The directory to search in can
- either be entered in the <guibutton>Directory</guibutton> text
- field, or chosen in a file selector dialog box by clicking the
- <guibutton>Choose</guibutton> button next to the field. If the
- <guibutton>Search subdirectories</guibutton> check box is selected,
- all subdirectories of the specified directory will also be searched.
- Keep in mind that searching through directories containing many
- files can take a long time.</para>
-
- <para>The <guibutton>Directory</guibutton> and
- <guibutton>Filter</guibutton> text fields remember previously
- entered strings; see <xref linkend="history" /> for details.</para>
-
- <para>When the search and replace dialog box is opened, the
- directory and file name filter fields are set to their previous
- values. They can be set to match the current buffer's directory and
- file name extension by clicking
- <guibutton>Synchronize</guibutton>.</para>
-
- <para>Note that clicking the <guibutton>All Buffers</guibutton> or
- <guibutton>Directory</guibutton> radio buttons also selects the
- <guibutton>HyperSearch</guibutton> check box since that is what you
- would want, most of the time. However, the
- <guibutton>HyperSearch</guibutton> check box can be unchecked, for
- stepping through search results in multiple files one at a
- time.</para>
-
- <para>Two convenience commands are provided for performing multiple
- file searches.</para>
-
- <para><guimenu>Search</guimenu>><guimenuitem>Search in Open
- Buffers</guimenuitem> (shortcut: <keycap>C+e C+b</keycap>) displays
- the search dialog box and selects the <guibutton>All
- buffers</guibutton> button.</para>
-
- <para><guimenu>Search</guimenu>><guimenuitem>Search in
- Directory</guimenuitem> (shortcut: <keycap>C+e C+d</keycap>)
- displays the search dialog box and selects the
- <guibutton>Directory</guibutton> button.</para>
- </section>
-
- <section id="search-bar">
- <title>The Search Bar</title>
-
- <para>The search bar feature provides a convenient way to search in
- the current buffer without opening the search dialog box. The search
- bar does not support replacement or multiple file search. Previously
- entered strings can be recalled in the search bar with the
- <keycap>Up</keycap> and <keycap>Down</keycap> arrow keys; see <xref
- linkend="history" />.</para>
-
- <para>By default, the search bar remains hidden until one of the
- quick search commands (described below) is invoked; however you can
- choose to have it always visible in the <guibutton>View</guibutton>
- pane of the <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box; see <xref
- linkend="view-pane" />.</para>
-
- <para><guimenu>Search</guimenu>><guimenuitem>Incremental Search
- Bar</guimenuitem> (shortcut: <keycap>C+COMMA</keycap>) displays the
- search bar if necessary, and gives it keyboard focus. </para>
-
- <para><guimenu>Search</guimenu>><guimenuitem>Incremental Search
- for Word</guimenuitem> (shortcut: <keycap>A+COMMA</keycap>) behaves
- like the above command except it places the word at the caret in the
- search string field. If this command is invoked while there is a
- selection, the selection is placed in the search string
- field instead.</para>
-
- <para>Unless the <guibutton>HyperSearch</guibutton> check box is
- selected, the search bar will perform an <firstterm>incremental
- search</firstterm>. In incremental search mode, the first occurrence
- of the search string is located in the current buffer as it is being
- typed. Pressing <keycap>ENTER</keycap> and <keycap>S+ENTER</keycap>
- searches for the next and previous occurrence, respectively. Once
- the desired occurrence has been located, pressing
- <keycap>ESCAPE</keycap> returns keyboard focus to the text area.
- Unless the search bar is set to be always visible (see above),
- pressing <keycap>ESCAPE</keycap> will also hide the search
- bar.</para>
-
- <note>
- <para>Incremental searches cannot be not recorded in macros. If
- your macro needs to perform a search, use the search and replace
- dialog box instead. See <xref linkend="using-macros" /> for
- information about macros.</para>
- </note>
-
- <para><guimenu>Search</guimenu>><guimenuitem>HyperSearch
- Bar</guimenuitem> (shortcut: <keycap>C+PERIOD</keycap>) displays the
- search bar if necessary, gives it keyboard focus, and selects the
- <guibutton>HyperSearch</guibutton> check box. If this command is
- invoked while there is a selection, the selected text will be
- searched for immediately and the search bar will not be
- shown.</para>
-
- <para>If the <guibutton>HyperSearch</guibutton> check box is
- selected, pressing <keycap>Enter</keycap> in the search string field
- will perform a HyperSearch in the current buffer.</para>
-
- <para><guimenu>Search</guimenu>><guimenuitem>HyperSearch for
- Word</guimenuitem> (shortcut: <keycap>A+PERIOD</keycap>) performs a
- HyperSearch for the word at the caret. This command does not show
- the search bar or give it keyboard focus.</para>
- </section>
- </section>
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="editing">
+ <title>Editing Text</title>
+ <!-- jEdit buffer-local properties:
+ :tabSize=1:indentSize=1:noTabs=true:wrap=soft:maxLineLen=80:
+ :xml.root=users-guide.xml: -->
+
+ <section id="caret">
+ <title>Moving The Caret</title>
+
+ <para>The simplest way to move the caret is to click the mouse at the
+ desired location in the text area. The caret can also be moved using the
+ keyboard.</para>
+
+ <para>The <keycap>LEFT</keycap>, <keycap>RIGHT</keycap>,
+ <keycap>UP</keycap> and <keycap>DOWN</keycap> keys move the caret in the
+ respective direction, and the <keycap>PAGE_UP</keycap> and
+ <keycap>PAGE_DOWN</keycap> keys move the caret up and down one
+ screen-full, respectively.</para>
+
+ <para>When pressed once, the <keycap>HOME</keycap> key moves the caret
+ to the first non-whitespace character of the current screen line.
+ Pressing it a second time moves the caret to the beginning of the
+ current buffer line. Pressing it a third time moves the caret to the
+ first visible line.</para>
+
+ <para>The <keycap>END</keycap> key behaves in a similar manner, going to
+ the last non-whitespace character of the current screen line, the end of
+ the current buffer line, and finally to the last visible line.</para>
+
+ <para>If soft wrap is disabled, a <quote>screen line</quote> is the same
+ as a <quote>buffer line</quote>. If soft wrap is enabled, a screen line
+ is a section of a newline-delimited buffer line that fits within the
+ wrap margin width. See <xref linkend="word-wrap" />.</para>
+
+ <para><keycap>C+HOME</keycap> and <keycap>C+END</keycap> move the caret
+ to the beginning and end of the buffer, respectively.</para>
+
+ <para>More advanced caret movement is covered in <xref
+ linkend="words" />, <xref linkend="lines" /> and <xref
+ linkend="paragraphs" />.</para>
+
+ <sidebar>
+ <title>The Home and End keys</title>
+
+ <para>If you prefer more traditional behavior for the
+ <keycap>HOME</keycap> and <keycap>END</keycap> keys, you can
+ reassign the respective keyboard shortcuts in the
+ <guibutton>Shortcuts</guibutton> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem>; see <xref linkend="shortcuts-pane" />.</para>
+
+ <para>By default, the shortcuts are assigned as follows:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><keycap>HOME</keycap> is bound to <guimenuitem>Smart
+ Home</guimenuitem>.</para>
+ </listitem>
+
+ <listitem>
+ <para><keycap>END</keycap> is bound to <guimenuitem>Smart
+ End</guimenuitem>.</para>
+ </listitem>
+
+ <listitem>
+ <para><keycap>S+HOME</keycap> is bound to
+ <guimenuitem>Select to Smart Home
+ Position</guimenuitem>.</para>
+ </listitem>
+
+ <listitem>
+ <para><keycap>S+END</keycap> is bound to <guimenuitem>Select
+ to Smart End Position</guimenuitem>.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>However you can rebind them to anything you want, for example,
+ various combinations of the following, or indeed any other command
+ or macro:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><guimenuitem>Go to Start/End of White
+ Space</guimenuitem>.</para>
+ </listitem>
+
+ <listitem>
+ <para><guimenuitem>Go to Start/End of
+ Line</guimenuitem>.</para>
+ </listitem>
+
+ <listitem>
+ <para><guimenuitem>Go to Start/End of
+ Buffer</guimenuitem>.</para>
+ </listitem>
+
+ <listitem>
+ <para><guimenuitem>Select to Start/End of White Space
+ </guimenuitem>.</para>
+ </listitem>
+
+ <listitem>
+ <para><guimenuitem>Select to Start/End of
+ Line</guimenuitem>.</para>
+ </listitem>
+
+ <listitem>
+ <para><guimenuitem>Select to Start/End of
+ Buffer</guimenuitem>.</para>
+ </listitem>
+ </itemizedlist>
+ </sidebar>
+ </section>
+
+ <section id="selection">
+ <title>Selecting Text</title>
+
+ <para>A <firstterm>selection</firstterm> is a block of text marked for
+ further manipulation. Range selections are equivalent to selections in
+ most other text editors; they cover text between two points in a buffer.
+ In addition to the standard text-selection mode, jEdit also allows
+ <emphasis role="bold">rectangular selections</emphasis> that cover a
+ rectangular area (some text editors refer to these as <quote>column
+ selections</quote>). Furthermore, several chunks of text can be selected
+ and operated on simultaneously.</para>
+
+ <section>
+ <title>Range Selection</title>
+
+ <para>Dragging the mouse creates a range selection from where the
+ mouse was pressed to where it was released. Holding down
+ <keycap>Shift</keycap> while clicking a location in the buffer will
+ create a selection from the caret position to the clicked
+ location.</para>
+
+ <para>Holding down <keycap>Shift</keycap> in addition to a caret
+ movement key (<keycap>LEFT</keycap>, <keycap>UP</keycap>,
+ <keycap>HOME</keycap>, etc) will extend a selection in the specified
+ direction.</para>
+
+ <para><guimenu>Edit</guimenu>><guimenuitem>Select
+ All</guimenuitem> (shortcut: <keycap>C+a</keycap>) selects the
+ entire buffer.</para>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>More
+ Selection</guisubmenu>><guimenuitem>Select None</guimenuitem>
+ (shortcut: <keycap>ESCAPE</keycap>) deactivates the
+ selection.</para>
+ </section>
+
+ <section id="rect-select">
+ <title>Rectangular Selection</title>
+
+ <para>Dragging with the <keycap>Control</keycap> key held down will
+ create a rectangular selection. Holding down <keycap>Shift</keycap>
+ and <keycap>Control</keycap> while clicking a location in the buffer
+ will create a rectangular selection from the caret position to the
+ clicked location.</para>
+
+ <para>Alternatively, invoking
+ <guimenu>Edit</guimenu>><guisubmenu>More
+ Selection</guisubmenu>><guimenuitem>Rectangular
+ Selection</guimenuitem> (shortcut: <keycap>A+\</keycap>) toggles
+ rectangular selection mode. In rectangular selection mode, dragging
+ the mouse always creates a rectangular selection, and keyboard
+ commands that would normally create a range selection create a
+ rectangular selection instead. A status bar indicator is shown when
+ this mode is enabled.</para>
+
+ <para>It is possible to select a rectangle with zero width but
+ non-zero height. This can be used to insert a new column between two
+ existing columns, for example. Such zero-width selections are shown
+ as a thin vertical line.</para>
+
+ <para>Inserting text into a rectangular selection repeats the text
+ going down as many times as necessary, and shifts the selection to
+ the right. This makes it behave like a <quote>tall</quote>
+ caret.</para>
+
+ <para>Rectangles can be deleted, copied, pasted, and operated on
+ using ordinary editing commands. If necessary, rectangular
+ selections are automatically filled in with whitespace to maintain
+ alignment.</para>
+
+ <para>Rectangular selections can extend beyond the end of a line
+ into <quote>virtual space</quote>. Furthermore, if keyboard
+ rectangular selection mode is on or if the <keycap>Control</keycap>
+ key is being held down, clicking beyond the end of a line will
+ insert the appropriate amount of whitespace in order to position the
+ cursor at the clicked location.</para>
+
+ <note>
+ <para>Rectangular selections are implemented using character
+ offsets, not absolute screen positions, so they might not behave
+ as you might expect if a proportional-width font is being used
+ or if soft wrap is enabled. The text area font can be changed in
+ the <guibutton>Text Area</guibutton> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box. For information about soft
+ wrap, see <xref linkend="word-wrap" />.</para>
+ </note>
+ </section>
+
+ <section id="multi-select">
+ <title>Multiple Selection</title>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>More
+ Selection</guisubmenu>><guimenuitem>Multiple
+ Selection</guimenuitem> (keyboard shortcut: <keycap>C+\</keycap>)
+ turns multiple selection mode on and off. In multiple selection
+ mode, multiple fragments of text can be selected and operated on
+ simultaneously, and the caret can be moved independently of the
+ selection. The status bar indicates if multiple selection mode is
+ active; see <xref linkend="status-bar" />.</para>
+
+ <para>Various jEdit commands behave differently with multiple
+ selections:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>Commands that copy text place the contents of each
+ selection, separated by line breaks, in the specified
+ register.</para>
+ </listitem>
+
+ <listitem>
+ <para>Commands that insert (or paste) text replace each
+ selection with the entire text that is being
+ inserted.</para>
+ </listitem>
+
+ <listitem>
+ <para>Commands that filter text (such as <guimenuitem>Spaces
+ to Tabs</guimenuitem>, <guimenuitem>Range
+ Comment</guimenuitem>, <guimenuitem>Replace in
+ Selection</guimenuitem>, and so on) behave as if each block
+ was selected independently, and the command invoked on each
+ in turn.</para>
+ </listitem>
+
+ <listitem>
+ <para>Line-based commands (such as <guimenuitem>Shift Indent
+ Left</guimenuitem>, <guimenuitem>Shift Indent
+ Right</guimenuitem>, and <guimenuitem>Line
+ Comment</guimenuitem>) operate on each line that contains at
+ least one selection.</para>
+ </listitem>
+
+ <listitem>
+ <para>Caret movement commands that would normally deactivate
+ the selection (such as the arrow keys, while
+ <keycap>Shift</keycap> is not being held down), move the
+ caret, leaving the selection as-is.</para>
+ </listitem>
+
+ <listitem>
+ <para>Some older plugins may not support multiple selection
+ at all.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>More
+ Selection</guisubmenu>><guimenuitem>Select None</guimenuitem>
+ (shortcut: <keycap>ESCAPE</keycap>) deactivates the selection
+ containing the caret, if there is one. Otherwise it deactivates all
+ active selections.</para>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>More
+ Selection</guisubmenu>><guimenuitem>Invert
+ Selection</guimenuitem> (shortcut: <keycap>C+e C+i</keycap>) selects
+ a set of text chunks such that all text that was formerly part of a
+ selection is now unselected, and all text that wasn't, is
+ selected.</para>
+
+ <note>
+ <para>Deactivating multiple selection mode while multiple blocks
+ of text are selected will leave the selections in place, but you
+ will not be able to add new selections until multiple selection
+ mode is reactivated.</para>
+ </note>
+ </section>
+ </section>
+
+ <section id="entering-text">
+ <title>Inserting and Deleting Text</title>
+
+ <para>Text entered at the keyboard is inserted into the buffer. In
+ overwrite mode, which can be toggled by pressing
+ <keycap>INSERT</keycap>, one character is deleted from in front of the
+ caret position for every character that is inserted. The caret is drawn
+ as a horizontal line while overwrite mode is active. The status bar also
+ indicates if overwrite mode is active; see <xref linkend="status-bar" />
+ for details.</para>
+
+ <para>Inserting text while there is a selection will replace the
+ selection with the inserted text.</para>
+
+ <para>When inserting text, the <keycap>TAB</keycap> and
+ <keycap>ENTER</keycap> keys might not behave entirely like you expect
+ because of various indentation features; see <xref linkend="indent" />
+ for details.</para>
+
+ <para>The simplest way to delete text is with the
+ <keycap>BACKSPACE</keycap> and <keycap>DELETE</keycap> keys. If nothing
+ is selected, they delete the character before or after the caret,
+ respectively. If a selection exists, both delete the selection.</para>
+
+ <para>More advanced deletion commands are described in <xref
+ linkend="words" />, <xref linkend="lines" /> and <xref
+ linkend="paragraphs" />.</para>
+ </section>
+
+ <section id="undo-redo">
+ <title>Undo and Redo</title>
+
+ <para><guimenu>Edit</guimenu>><guimenuitem>Undo</guimenuitem>
+ (shortcut: <keycap>C+z</keycap>) reverses the most recent editing
+ command. For example, this can be used to restore unintentionally
+ deleted text. More complicated operations, such as a search and replace,
+ can also be undone.</para>
+
+ <para>If you undo too many changes,
+ <guimenu>Edit</guimenu>><guimenuitem>Redo</guimenuitem> (shortcut:
+ <keycap>C+e C+z</keycap>) can restore the changes again. For example, if
+ some text was inserted, <guimenuitem>Undo</guimenuitem> will remove it
+ from the buffer. <guimenuitem>Redo</guimenuitem> will insert it
+ again.</para>
+
+ <para>By default, the last 100 edits is retained; older edits cannot be
+ undone. The maximum number of undos and whether undos are reset when a
+ buffer is saved can be changed in the <guibutton>Editing</guibutton>
+ pane of the <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box; see <xref
+ linkend="editing-pane" />.</para>
+ </section>
+
+ <section id="words">
+ <title>Working With Words</title>
+
+ <para><keycap>C+LEFT</keycap> and <keycap>C+RIGHT</keycap> move the
+ caret a word at a time. Holding down <keycap>Shift</keycap> in addition
+ to the above extends the selection a word at a time.</para>
+
+ <para>A single word can be selected by double-clicking with the mouse,
+ or using the <guimenu>Edit</guimenu>><guisubmenu>More
+ Selection</guisubmenu>><guimenuitem>Select Word</guimenuitem> command
+ (shortcut: <keycap>C+e w</keycap>). A selection that begins and ends on
+ word boundaries can be created by double-clicking and dragging.</para>
+
+ <para><keycap>C+BACKSPACE</keycap> and <keycap>C+DELETE</keycap> delete
+ the word before or after the caret, respectively.</para>
+
+ <para><guimenu>Edit</guimenu>><guimenuitem>Complete
+ Word</guimenuitem> (shortcut: <keycap>C+b</keycap>) locates possible
+ completions for the word at the caret, first by looking in the current
+ edit mode's syntax highlighting keyword list, and then in the current
+ buffer for words that begin with the word at the caret. This serves as a
+ very basic code completion feature.</para>
+
+ <para>If there is only one completion, it will be inserted into the
+ buffer immediately.</para>
+
+ <para>If multiple completions were found, the longest common prefix is
+ inserted into the buffer, and a popup is shown below the caret position
+ listing the completions.</para>
+
+ <para>To insert a completion from the list, either select it using the
+ <keycap>UP</keycap> and <keycap>DOWN</keycap> keys and press
+ <keycap>ENTER</keycap>, press a digit to insert one of the first ten
+ completions (1 is the first completion; 9 is the 9th; 0 is the 10th), or
+ click the desired completion with the mouse. To close the popup without
+ inserting a completion, press <keycap>ESCAPE</keycap>.</para>
+
+ <para>Typing while the popup is visible will automatically update the
+ popup and narrow the set of completions as necessary.</para>
+
+ <para>The default word completion uses the visible buffers (buffers
+ being shown in an EditPane) to find completions. The set of possible
+ words can be expanded by enabling the <guimenuitem>Global Options - Text
+ Area - Complete words from all open buffers</guimenuitem> option.
+ Setting this option will use all open buffers to search for possible
+ completions. Note, this can degrade completion performance if many
+ buffers are open.</para>
+
+ <para><guimenu>Edit</guimenu>><guimenuitem>Word Count</guimenuitem>
+ displays a dialog box with the number of characters, words and lines in
+ the current buffer.</para>
+
+ <section>
+ <title>What's a Word?</title>
+
+ <para>The default behavior of the <keycap>C+LEFT</keycap>,
+ <keycap>C+RIGHT</keycap>, <keycap>C+BACKSPACE</keycap> and
+ <keycap>C+DELETE</keycap> commands is to stop both at the beginning
+ and the end of each word. Normally, a word is a sequence of
+ alphanumerics, but you can add other characters as part of
+ what jEdit considers to be a 'word', set on a global or mode basis
+ from <guimenuitem>Global Options - Editing - Extra Word
+ Characters</guimenuitem>.
+ In addition, this behavior can be changed by remapping
+ these keystrokes to alternative actions whose names end with
+ <guimenuitem>(Eat Whitespace)</guimenuitem> in the
+ <guibutton>Shortcuts</guibutton> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box; see <xref
+ linkend="shortcuts-pane" />.</para>
+ </section>
+ </section>
+
+ <section id="lines">
+ <title>Working With Lines</title>
+
+ <para>An entire line can be selected by triple-clicking with the mouse,
+ or using the <guimenu>Edit</guimenu>><guisubmenu>More
+ Selection</guisubmenu>><guimenuitem>Select Line</guimenuitem> command
+ (shortcut: <keycap>C+e l</keycap>). A selection that begins and ends on
+ line boundaries can be created by triple-clicking and dragging.</para>
+
+ <para><guimenu>Edit</guimenu>><guimenuitem>Go to Line</guimenuitem>
+ (shortcut: <keycap>C+l</keycap>) prompts for a line number and moves the
+ caret there.</para>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>More
+ Selection</guisubmenu>><guimenuitem>Select Line Range</guimenuitem>
+ (shortcut: <keycap>C+e C+l</keycap>) prompts for two line numbers and
+ selects all text between them.</para>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>Text</guisubmenu>><guimenuitem>Delete
+ Line</guimenuitem> (shortcut: <keycap>C+d</keycap>) deletes the current
+ line.</para>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>Text</guisubmenu>><guimenuitem>Delete
+ to Start Of Line</guimenuitem> (shortcut:
+ <keycap>CS+BACK_SPACE</keycap>) deletes all text from the start of the
+ current line to the caret.</para>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>Text</guisubmenu>><guimenuitem>Delete
+ to End Of Line</guimenuitem> (shortcut: <keycap>CS+DELETE</keycap>)
+ deletes all text from the caret to the end of the current line.</para>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>Text</guisubmenu>><guimenuitem>Join
+ Lines</guimenuitem> (shortcut: <keycap>C+j</keycap>) removes any
+ whitespace from the start of the next line and joins it with the current
+ line. The caret is moved to the position where the two lines were
+ joined. For example, if you invoke <guimenuitem>Join Lines</guimenuitem>
+ with the caret on the first line of the following Java code:</para>
+
+ <screen>new Widget(Foo
+ .createDefaultFoo());</screen>
+
+ <para>It will be changed to:</para>
+
+ <screen>new Widget(Foo.createDefaultFoo());</screen>
+ </section>
+
+ <section id="paragraphs">
+ <title>Working With Paragraphs</title>
+
+ <para>As far as jEdit is concerned, <quote>paragraphs</quote> are
+ delimited by double newlines. This is also how
+ <application>TeX</application> defines a paragraph. Note that jEdit
+ doesn't parse HTML files for <quote><P></quote> tags, nor does it
+ support paragraphs delimited only by a leading indent.</para>
+
+ <para><keycap>C+UP</keycap> and <keycap>C+DOWN</keycap> move the caret
+ to the previous and next paragraph, respectively. Holding down
+ <keycap>Shift</keycap> in addition to the above extends the selection a
+ paragraph at a time.</para>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>More
+ Selection</guisubmenu>><guimenuitem>Select Paragraph</guimenuitem>
+ (shortcut: <keycap>C+e p</keycap>) selects the paragraph containing the
+ caret.</para>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>Text</guisubmenu>><guimenuitem>Format
+ Paragraph</guimenuitem> (shortcut: <keycap>C+e f</keycap>) splits and
+ joins lines in the current selection to make it fit within the wrap
+ column position. If nothing is selected, the paragraph containing the
+ caret is formatted instead. See <xref linkend="word-wrap" /> for
+ information about word wrap and changing the wrap column.</para>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>Text</guisubmenu>><guimenuitem>Delete
+ Paragraph</guimenuitem> (shortcut: <keycap>C+e d</keycap>) deletes the
+ paragraph containing the caret.</para>
+ </section>
+
+ <section id="word-wrap">
+ <title>Wrapping Long Lines</title>
+
+ <para>The <firstterm>word wrap</firstterm> feature splits lines at word
+ boundaries in order to fit text within a specified wrap margin. A word
+ boundary, for the purposes of word wrap, means whitespace. Long lines
+ without whitespace are currently not wrapped by jEdit. The wrap margin
+ position is indicated in the text are as a faint blue vertical line.
+ There are two <quote>wrap modes</quote>, <quote>soft</quote> and
+ <quote>hard</quote>; they are described below. The current wrap mode is
+ shown in the status bar; see <xref linkend="status-bar" />. The wrap
+ mode can be changed in one of the following ways:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>On a global or mode-specific basis in the
+ <guibutton>Editing</guibutton> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box. See <xref
+ linkend="editing-pane" />.</para>
+ </listitem>
+
+ <listitem>
+ <para>In the current buffer for the duration of the editing
+ session,</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>By clicking the status bar indicator.</para>
+ </listitem>
+
+ <listitem>
+ <para>In the
+ <guimenu>Utilities</guimenu>><guimenuitem>Buffer
+ Options</guimenuitem> dialog box. See <xref
+ linkend="buffer-opts" />.</para>
+ </listitem>
+
+ <listitem>
+ <para>From the keyboard, if a keyboard shortcut has been
+ assigned to the <guimenuitem>Toggle Word
+ Wrap</guimenuitem> command in the
+ <guibutton>Shortcuts</guibutton> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box. By default, this
+ command does not have a keyboard shortcut.</para>
+ </listitem>
+ </itemizedlist>
+ </listitem>
+
+ <listitem>
+ <para>In the current buffer for future editing sessions by
+ placing the following in one of the first or last 10 lines of
+ the buffer, where <replaceable>mode</replaceable> is either
+ <quote>none</quote>, <quote>soft</quote> or <quote>hard</quote>,
+ and <replaceable>column</replaceable> is the desired wrap
+ margin:</para>
+
+ <screen>:wrap=<replaceable>mode</replaceable>:maxLineLen=<replaceable>column</replaceable>:</screen>
+ </listitem>
+ </itemizedlist>
+
+ <section>
+ <title>Soft Wrap</title>
+
+ <para>In soft wrap mode, lines are automatically wrapped when
+ displayed on screen. Newlines are not inserted at the wrap
+ positions, and the wrapping is automatically updated when text is
+ inserted or removed.</para>
+
+ <para>If the margin is set to 0, then the width of the text area
+ window is used to determine where to wrap lines.</para>
+
+ <para>If end of line markers are enabled in the <guibutton>Text
+ Area</guibutton> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box, a colon (<quote>:</quote>) is
+ painted at the end of wrapped lines. See <xref
+ linkend="text-area-pane" />.</para>
+ </section>
+
+ <section>
+ <title>Hard Wrap</title>
+
+ <para>In hard wrap mode, inserting text at the end of a line will
+ automatically break the line if it extends beyond the wrap margin.
+ Inserting or removing text in the middle of a line has no effect,
+ however text can be re-wrapped using the
+ <guimenu>Edit</guimenu>><guisubmenu>Text</guisubmenu>><guimenuitem>Format
+ Paragraph</guimenuitem> command. See <xref
+ linkend="paragraphs" />.</para>
+
+ <para>Hard wrap is implemented using character offsets, not screen
+ positions, so it might not behave like you expect if a
+ proportional-width font is being used. The text area font can be
+ changed in the <guibutton>Text Area</guibutton> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box.</para>
+ </section>
+ </section>
+
+ <section id="scrolling">
+ <title>Scrolling</title>
+
+ <para>If you have a mouse with a scroll wheel, you can use the wheel to
+ scroll up and down in the text area. Various modifier keys change the
+ action of the wheel:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><keycap>Shift</keycap> - moves the horizontal scrollbar.
+ time.</para>
+ </listitem>
+
+ <listitem>
+ <para><keycap>Control</keycap> - scrolls a single line at a
+ time.</para>
+ </listitem>
+
+ <listitem>
+ <para><keycap>Alt</keycap> - moves the caret up and down instead
+ of scrolling.</para>
+ </listitem>
+
+ <listitem>
+ <para><keycap>CTRL+SHIFT</keycap> - scroll a page at a time. </para>
+ </listitem>
+
+
+ <listitem>
+ <para><keycombo>
+ <keycap>Alt</keycap>
+
+ <keycap>Shift</keycap>
+ </keycombo> - extends the selection up and down instead of
+ scrolling.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>Keyboard commands for scrolling the text area are also
+ available.</para>
+
+ <para><guimenu>View</guimenu>><guisubmenu>Scrolling</guisubmenu>><guimenuitem>Scroll
+ to Current Line</guimenuitem> (shortcut: <keycap>C+e C+j</keycap>)
+ scrolls the text area in order to make the caret visible, if necessary.
+ It does nothing if the caret is already visible.</para>
+
+ <para><guimenu>View</guimenu>><guisubmenu>Scrolling</guisubmenu>><guimenuitem>Center
+ Caret on Screen</guimenuitem> (shortcut: <keycap>C+e C+n</keycap>) moves
+ the caret to the line in the middle of the screen.</para>
+
+ <para><guimenu>View</guimenu>><guisubmenu>Scrolling</guisubmenu>><guimenuitem>Line
+ Scroll Up</guimenuitem> (shortcut: <keycap>C+QUOTE</keycap>) scrolls the
+ text area up by one line.</para>
+
+ <para><guimenu>View</guimenu>><guisubmenu>Scrolling</guisubmenu>><guimenuitem>Line
+ Scroll Down</guimenuitem> (shortcut: <keycap>C+SLASH</keycap>) scrolls
+ the text area down by one line.</para>
+
+ <para><guimenu>View</guimenu>><guisubmenu>Scrolling</guisubmenu>><guimenuitem>Page
+ Scroll Up</guimenuitem> (shortcut: <keycap>A+QUOTE</keycap>) scrolls the
+ text area up by one screenful.</para>
+
+ <para><guimenu>View</guimenu>><guisubmenu>Scrolling</guisubmenu>><guimenuitem>Page
+ Scroll Down</guimenuitem> (shortcut: <keycap>A+SLASH</keycap>) scrolls
+ the text area down by one screenful.</para>
+
+ <para>The above scrolling commands differ from the caret movement
+ commands in that they don't actually move the caret; they just change
+ the scroll bar position.</para>
+ </section>
+
+ <section id="text-transfer">
+ <title>Transferring Text</title>
+
+ <para>jEdit provides a rich set of commands for moving and copying text.
+ Commands are provided for moving chunks of text from buffers to
+ <firstterm>registers</firstterm> and vice-versa. A register is a holding
+ area for an arbitrary length of text, with a single-character name. Most
+ other programs can only transfer text to and from the system clipboard;
+ in jEdit, the system clipboard is just another register, with the
+ special name <filename>$</filename>.</para>
+
+ <section>
+ <title>The Clipboard</title>
+
+ <para>jEdit offers the usual text transfer operations, that operate
+ on the <filename>$</filename> register.</para>
+
+ <para><guimenu>Edit</guimenu>><guimenuitem>Cut</guimenuitem>
+ (shortcut: <keycap>C+x</keycap>) places the selected text in the
+ clipboard and removes it from the buffer.</para>
+
+ <para><guimenu>Edit</guimenu>><guimenuitem>Copy</guimenuitem>
+ (shortcut: <keycap>C+c</keycap>) places the selected text in the
+ clipboard and leaves it in the buffer.</para>
+
+ <para><guimenu>Edit</guimenu>><guimenuitem>Paste</guimenuitem>
+ (shortcut: <keycap>C+v</keycap>) inserts the clipboard contents in
+ place of the selection (or at the caret position, if there is no
+ selection).</para>
+
+ <para>The <guimenuitem>Cut</guimenuitem> and
+ <guimenuitem>Copy</guimenuitem> commands replace the old clipboard
+ contents with the selected text. There are two alternative commands
+ which add the selection at the end of the existing clipboard
+ contents, instead of replacing it.</para>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>More
+ Clipboard</guisubmenu>><guimenuitem>Cut Append</guimenuitem>
+ (shortcut: <keycap>C+e C+u</keycap>) appends the selected text to
+ the clipboard, then removes it from the buffer. After this command
+ has been invoked, the clipboard will consist of the former clipboard
+ contents, followed by a newline, followed by the selected
+ text.</para>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>More
+ Clipboard</guisubmenu>><guimenuitem>Copy Append</guimenuitem>
+ (shortcut: <keycap>C+e C+a</keycap>) is the same as <guimenuitem>Cut
+ Append</guimenuitem> except it does not remove the selection from
+ the buffer.</para>
+ </section>
+
+ <section id="quick-copy">
+ <title>Quick Copy</title>
+
+ <para>The quick copy feature is usually found in Unix text editors.
+ Quick copy is disabled by default, but it can be enabled in the
+ <guibutton>Mouse</guibutton> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box.</para>
+
+ <para>The quick copy feature is accessed using the middle mouse
+ button. If you do not have a three-button mouse, then either
+ <keycap>Alt</keycap>-click (on Windows and Unix) or
+ <keycap>Option</keycap>-click (on MacOS X). The quick copy feature
+ enables the following behavior:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>Clicking the middle mouse button in the text area
+ inserts the most recently selected text at the clicked
+ location. If you only have a two-button mouse, you can click
+ the left mouse button while holding down
+ <keycap>Alt</keycap> instead of middle-clicking.</para>
+ </listitem>
+
+ <listitem>
+ <para>Dragging with the middle mouse button creates a
+ selection without moving the caret. As soon as the mouse
+ button is released, the selected text is inserted at the
+ caret position and the selection is deactivated. A message
+ is shown in the status bar while text is being selected to
+ remind you that this is not an ordinary selection.</para>
+ </listitem>
+
+ <listitem>
+ <para>Holding down <keycap>Shift</keycap> while clicking the
+ middle mouse button will duplicate text between the caret
+ and the clicked location.</para>
+ </listitem>
+
+ <listitem>
+ <para>Holding down <keycap>Control</keycap> while clicking
+ the middle mouse button on a bracket will insert all text in
+ that bracket's scope at the caret position.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>The most recently selected text is stored in the
+ <filename>%</filename> register.</para>
+
+ <para>If jEdit is being run under Java 2 version 1.4 on Unix, you
+ will be able to transfer text with other X Windows applications
+ using the quick copy feature. On other platforms and Java versions,
+ the contents of the quick copy register are only accessible from
+ within jEdit.</para>
+ </section>
+
+ <section id="registers">
+ <title>General Register Commands</title>
+
+ <para>These commands require more keystrokes than the two methods
+ shown above, but they can operate on any register, allowing an
+ arbitrary number of text chunks to be retained at a time.</para>
+
+ <para>Each command prompts for a single-character register name to
+ be entered after being invoked. Pressing <keycap>ESCAPE</keycap>
+ instead of specifying a register name cancels the operation.</para>
+
+ <para>Note that the content of registers other than the clipboard
+ and quick copy register are automatically saved between jEdit
+ sessions.</para>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>More
+ Clipboard</guisubmenu>><guimenuitem>Cut to Register</guimenuitem>
+ (shortcut: <keycap>C+r C+x <replaceable>key</replaceable></keycap>)
+ stores the selected text in the specified register, removing it from
+ the buffer.</para>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>More
+ Clipboard</guisubmenu>><guimenuitem>Copy to
+ Register</guimenuitem> (shortcut: <keycap>C+r C+c
+ <replaceable>key</replaceable></keycap>) stores the selected text in
+ the specified register, leaving it in the buffer.</para>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>More
+ Clipboard</guisubmenu>><guimenuitem>Cut Append to
+ Register</guimenuitem> (shortcut: <keycap>C+r C+u
+ <replaceable>key</replaceable></keycap>) adds the selected text to
+ the existing contents of the specified register, and removes it from
+ the buffer.</para>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>More
+ Clipboard</guisubmenu>><guimenuitem>Copy Append to
+ Register</guimenuitem> (shortcut: <keycap>C+r C+a
+ <replaceable>key</replaceable></keycap>) adds the selected text to
+ the existing contents of the specified register, without removing it
+ from the buffer.</para>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>More
+ Clipboard</guisubmenu>><guimenuitem>Paste from
+ Register</guimenuitem> (shortcut: <keycap>C+r C+v
+ <replaceable>key</replaceable></keycap>) replaces the selection with
+ the contents of the specified register.</para>
+
+ <para>The following three commands display dialog boxes instead of
+ prompting for a register name.</para>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>More
+ Clipboard</guisubmenu>><guimenuitem>Paste Previous</guimenuitem>
+ (shortcut: <keycap>C+e C+v</keycap>) displays a dialog box listing
+ the 20 most recently copied and pasted text strings.</para>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>More
+ Clipboard</guisubmenu>><guimenuitem>Paste Deleted</guimenuitem>
+ (shortcut: <keycap>C+e C+y</keycap>) is not really a register
+ command; it displays a dialog box listing the 20 most recently
+ deleted text strings.</para>
+
+ <para><guimenu>Edit</guimenu>><guisubmenu>More
+ Clipboard</guisubmenu>><guimenuitem>View Registers</guimenuitem>
+ displays a dialog box for viewing register contents, including the
+ clipboard and the quick copy.</para>
+ </section>
+ </section>
+
+ <section id="markers">
+ <title>Markers</title>
+
+ <para>A <firstterm>marker</firstterm> is a pointer to a specific
+ location within a buffer, which may or may not have a single-character
+ <firstterm>shortcut</firstterm> associated with it. Markers are
+ persistent; they are saved to
+ <filename>.<replaceable>filename</replaceable>.marks</filename>, where
+ <filename><replaceable>filename</replaceable></filename> is the name of
+ the buffer. (The dot prefix makes the markers file hidden on Unix
+ systems.) Marker saving can be disabled in the
+ <guibutton>General</guibutton> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box; see <xref
+ linkend="general-pane" />.</para>
+
+ <para><guimenu>Markers</guimenu>><guimenuitem>Add/Remove
+ Marker</guimenuitem> (shortcut: <keycap>C+e C+m</keycap>) adds a marker
+ without a shortcut pointing to the current line. If a marker is already
+ set on the current line, the marker is removed instead. If text is
+ selected, markers are added to the first and last line of each
+ selection.</para>
+
+ <para>Markers are listed in the <guimenu>Markers</guimenu> menu;
+ selecting a marker from this menu will move the caret to its
+ location.</para>
+
+ <para><guimenu>Markers</guimenu>><guimenuitem>Go to Previous
+ Marker</guimenuitem> (shortcut: <keycap>C+e C+COMMA</keycap>) goes to
+ the marker immediately before the caret position.</para>
+
+ <para><guimenu>Markers</guimenu>><guimenuitem>Go to Next
+ Marker</guimenuitem> (shortcut: <keycap>C+e C+PERIOD</keycap>) goes to
+ the marker immediately after the caret position.</para>
+
+ <para><guimenu>Markers</guimenu>><guimenuitem>Remove All
+ Markers</guimenuitem> removes all markers set in the current
+ buffer.</para>
+
+ <para>Markers with shortcuts allow for quicker keyboard-based
+ navigation. The following commands all prompt for a single-character
+ shortcut when invoked. Pressing <keycap>ESCAPE</keycap> instead of
+ specifying a shortcut will cancel the operation.</para>
+
+ <para><guimenu>Markers</guimenu>><guimenuitem>Add Marker With
+ Shortcut</guimenuitem> (shortcut: <keycap>C+t
+ <replaceable>key</replaceable></keycap>) adds a marker with the
+ specified shortcut. If marker with that shortcut already exists, it will
+ remain in the buffer but lose its shortcut.</para>
+
+ <para><guimenu>Markers</guimenu>><guimenuitem>Go to
+ Marker</guimenuitem> (shortcut: <keycap>C+y
+ <replaceable>key</replaceable></keycap>) moves the caret to the location
+ of the marker with the specified shortcut.</para>
+
+ <para><guimenu>Markers</guimenu>><guimenuitem>Select to
+ Marker</guimenuitem> (shortcut: <keycap>C+u
+ <replaceable>key</replaceable></keycap>) creates a selection from the
+ caret location to the marker with the specified shortcut.</para>
+
+ <para><guimenu>Markers</guimenu>><guimenuitem>Swap Caret and
+ Marker</guimenuitem> (shortcut: <keycap>C+k
+ <replaceable>key</replaceable></keycap>) moves the caret to the location
+ of the marker with the specified shortcut, and moves the marker to the
+ former caret position. Invoke this command multiple times to flip
+ between two locations in the buffer.</para>
+
+ <para>Lines which contain markers are indicated in the gutter with a
+ highlight. Moving the mouse over the highlight displays a tool tip
+ showing the marker's shortcut, if it has one. See <xref
+ linkend="overview" /> for information about the gutter.</para>
+ </section>
+
+ <section id="search-replace">
+ <title>Search and Replace</title>
+
+ <section>
+ <title>Searching For Text</title>
+
+ <para><guimenu>Search</guimenu>><guimenuitem>Find</guimenuitem>
+ (shortcut: <keycap>C+f</keycap>) displays the search and replace
+ dialog box.</para>
+
+ <para>The search string can be entered in the <guibutton>Search
+ for</guibutton> text field. This text field remembers previously
+ entered strings; see <xref linkend="history" /> for details.</para>
+
+ <para>If text was selected in the text area and the selection does
+ not span a line break, the selected text becomes the default search
+ string.</para>
+
+ <para>If the selection spans a line break, the <guibutton>Search in
+ Selection</guibutton> and <guibutton>HyperSearch</guibutton> buttons
+ will be pre-selected, and the search string field will be initially
+ blank. (See <xref linkend="hypersearch" /> for information about the
+ HyperSearch feature.) <!-- Note that finding the next or previous
+ occurrence cannot be constrained to a selected range; only
+ replacement and HyperSearch can be (see <xref linkend="hypersearch" />). --></para>
+
+ <para>Selecting the <guibutton>Ignore case</guibutton> check box
+ makes the search case insensitive - for example, searching for
+ <quote>Hello</quote> will match <quote>hello</quote>,
+ <quote>HELLO</quote> and <quote>HeLlO</quote>.</para>
+
+ <para>To search for special characters (such as newlines or
+ non-printable characters), inexact sequences of text, or strings
+ that span multiple lines, we use
+ <emphasis role="bold">Regular Expressions</emphasis>.
+ Selecting the <guibutton>Regular expressions</guibutton> check
+ box allows special characters to be used in the search string.
+ Regular expression syntax is described in <xref linkend="regexps"/>.
+ If you use (groups) in the search field, you back-reference them
+ with $1 through $9 in the replace field. </para>
+
+ <para>The <guibutton>Backward</guibutton> and
+ <guibutton>Forward</guibutton> buttons specify the search direction.
+ Note that regular expressions can only be used when searching in a
+ forward direction.</para>
+
+ <para>Clicking <guibutton>Find</guibutton> will locate the next
+ occurrence of the search string (or previous occurrence, if
+ searching backwards). If the <guibutton>Keep dialog</guibutton>
+ check box is selected, the dialog box will remain open after the
+ search string has been located; otherwise, it will close.</para>
+
+ <para>If no occurrences could be found and the <guibutton>Auto
+ wrap</guibutton> check box is selected, the search will
+ automatically restart from the beginning of the buffer (or the end,
+ if searching backwards). If <guibutton>Auto wrap</guibutton> is not
+ selected, a confirmation dialog box is shown before restarting the
+ search.</para>
+
+ <para><guimenu>Search</guimenu>><guimenuitem>Find
+ Next</guimenuitem> (shortcut: <keycap>C+g</keycap>) locates the next
+ occurrence of the most recent search string without displaying the
+ search and replace dialog box.</para>
+
+ <para><guimenu>Search</guimenu>><guimenuitem>Find
+ Previous</guimenuitem> (shortcut: <keycap>C+h</keycap>) locates the
+ previous occurrence of the most recent search string without
+ displaying the search and replace dialog box.</para>
+ </section>
+
+ <section>
+ <title>Replacing Text</title>
+
+ <para>The replace string text field of the search dialog remembers
+ previously entered strings; see <xref linkend="history" /> for
+ details.</para>
+
+ <para>Clicking <guibutton>Replace & Find</guibutton> will
+ perform a replacement in the current selection and locate the next
+ occurrence of the search string. Clicking <guibutton>Replace
+ All</guibutton> will replace all occurrences of the search string
+ with the replacement string in the current search scope (which is
+ either the selection, the current buffer, or a set of buffers, as
+ specified in the search and replace dialog box).</para>
+
+ <para>Occurrences of the search string can be replaced with either a
+ replacement string, or the return value of a BeanShell script
+ snippet. Two radio buttons in the search and replace dialog box
+ select between the two replacement modes, which are described in
+ detail below.</para>
+
+ <section>
+ <title>Text Replace</title>
+
+ <para>If the <guibutton>Text</guibutton> button is selected, the
+ search string is simply replaced with the replacement
+ string.</para>
+
+ <para>If regular expressions are enabled, positional parameters
+ (<literal>$0</literal>, <literal>$1</literal>,
+ <literal>$2</literal>, and so on) can be used to insert the
+ contents of matched subexpressions in the replacement string;
+ see <xref linkend="regexps" /> for more information.</para>
+
+ <para>If the search is case-insensitive, jEdit attempts to
+ modify the case of the replacement string to match that of the
+ particular instance of the search string being replaced. For
+ example, searching for <quote>label</quote> and replacing it
+ with <quote>text</quote>, will perform the following
+ replacements:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><quote>String label</quote> would become
+ <quote>String text</quote></para>
+ </listitem>
+
+ <listitem>
+ <para><quote>setLabel</quote> would become
+ <quote>setText</quote></para>
+ </listitem>
+
+ <listitem>
+ <para><quote>DEFAULT_LABEL</quote> would become
+ <quote>DEFAULT_TEXT</quote></para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section>
+ <title>BeanShell Replace</title>
+
+ <para>In BeanShell replacement mode, the search string is
+ replaced with the return value of a BeanShell snippet. The
+ following predefined variables can be referenced in the
+ snippet:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><varname>_0</varname> -- the text to be
+ replaced</para>
+ </listitem>
+
+ <listitem>
+ <para><varname>_1</varname> - <varname>_9</varname> --
+ if regular expressions are enabled, these contain the
+ values of matched subexpressions.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>BeanShell syntax and features are covered in great detail
+ in <xref linkend="writing-macros-part" />, but here are some
+ examples:</para>
+
+ <informalexample>
+ <para>To replace each occurrence of <quote>Windows</quote>
+ with <quote>Linux</quote>, and each occurrence of
+ <quote>Linux</quote> with <quote>Windows</quote>, search for
+ the following regular expression:</para>
+
+ <programlisting>(Windows|Linux)</programlisting>
+
+ <para>Replacing it with the following BeanShell
+ snippet:</para>
+
+ <programlisting>_1.equals("Windows") ? "Linux" : "Windows"</programlisting>
+ </informalexample>
+
+ <informalexample>
+ <para>To convert all HTML tags to lower case, search for the
+ following regular expression:</para>
+
+ <programlisting><\S+</programlisting>
+
+ <para>Replacing it with the following BeanShell
+ snippet:</para>
+
+ <programlisting>_0.toLowerCase()</programlisting>
+ </informalexample>
+
+ <informalexample>
+ <para>To replace arithmetic expressions contained in curly
+ braces with the result of evaluating the expression, search
+ for the following regular expression:</para>
+
+ <programlisting>\{(.+?)\}</programlisting>
+
+ <para>Replacing it with the following BeanShell
+ snippet:</para>
+
+ <programlisting>eval(_1)</programlisting>
+ </informalexample>
+
+ <para>These examples only scratch the surface; the possibilities
+ are endless.</para>
+ </section>
+ </section>
+
+ <section id="hypersearch">
+ <title>HyperSearch</title>
+
+ <para>If the <guibutton>HyperSearch</guibutton> check box in the
+ search and replace dialog box is selected, clicking
+ <guibutton>Find</guibutton> lists all occurrences of the search
+ string, instead of locating the next match.</para>
+
+ <para>By default, HyperSearch results are shown in a floating
+ window. This window can be docked using the commands in its top-left
+ corner popup menu; see <xref linkend="docking" />.</para>
+
+ <para>If the <guibutton>Multiple results</guibutton> check box is
+ selected in the results window, past search results are
+ retained.</para>
+
+ <para>Running searches can be stopped in the
+ <guimenu>Utilities</guimenu>><guisubmenu>Troubleshooting</guisubmenu>><guimenuitem>I/O
+ Progress Monitor</guimenuitem> dialog box.</para>
+ </section>
+
+ <section>
+ <title>Multiple File Search</title>
+
+ <para>Search and replace commands can be performed over an arbitrary
+ set of files in one step. The set of files to search is selected
+ with a set of buttons in the search dialog box.</para>
+
+ <para>If the <guibutton>Current buffer</guibutton> button is
+ selected, only the current buffer is searched. This is the default
+ behavior.</para>
+
+ <para>If the <guibutton>All buffers</guibutton> button is selected,
+ all open buffers whose names match the glob pattern entered in the
+ <guibutton>Filter</guibutton> text field will be searched. See <xref
+ linkend="globs" /> for more information about glob patterns.</para>
+
+ <para>If the <guibutton>Directory</guibutton> radio button is
+ selected, all files contained in the specified directory whose names
+ match the glob will be searched. The directory to search in can
+ either be entered in the <guibutton>Directory</guibutton> text
+ field, or chosen in a file selector dialog box by clicking the
+ <guibutton>Choose</guibutton> button next to the field. If the
+ <guibutton>Search subdirectories</guibutton> check box is selected,
+ all subdirectories of the specified directory will also be searched.
+ Keep in mind that searching through directories containing many
+ files can take a long time.</para>
+
+ <para>The <guibutton>Directory</guibutton> and
+ <guibutton>Filter</guibutton> text fields remember previously
+ entered strings; see <xref linkend="history" /> for details.</para>
+
+ <para>When the search and replace dialog box is opened, the
+ directory and file name filter fields are set to their previous
+ values. They can be set to match the current buffer's directory and
+ file name extension by clicking
+ <guibutton>Synchronize</guibutton>.</para>
+
+ <para>Note that clicking the <guibutton>All Buffers</guibutton> or
+ <guibutton>Directory</guibutton> radio buttons also selects the
+ <guibutton>HyperSearch</guibutton> check box since that is what you
+ would want, most of the time. However, the
+ <guibutton>HyperSearch</guibutton> check box can be unchecked, for
+ stepping through search results in multiple files one at a
+ time.</para>
+
+ <para>Two convenience commands are provided for performing multiple
+ file searches.</para>
+
+ <para><guimenu>Search</guimenu>><guimenuitem>Search in Open
+ Buffers</guimenuitem> (shortcut: <keycap>C+e C+b</keycap>) displays
+ the search dialog box and selects the <guibutton>All
+ buffers</guibutton> button.</para>
+
+ <para><guimenu>Search</guimenu>><guimenuitem>Search in
+ Directory</guimenuitem> (shortcut: <keycap>C+e C+d</keycap>)
+ displays the search dialog box and selects the
+ <guibutton>Directory</guibutton> button.</para>
+ </section>
+
+ <section id="search-bar">
+ <title>The Search Bar</title>
+
+ <para>The search bar feature provides a convenient way to search in
+ the current buffer without opening the search dialog box. The search
+ bar does not support replacement or multiple file search. Previously
+ entered strings can be recalled in the search bar with the
+ <keycap>Up</keycap> and <keycap>Down</keycap> arrow keys; see <xref
+ linkend="history" />.</para>
+
+ <para>By default, the search bar remains hidden until one of the
+ quick search commands (described below) is invoked; however you can
+ choose to have it always visible in the <guibutton>View</guibutton>
+ pane of the <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box; see <xref
+ linkend="view-pane" />.</para>
+
+ <para><guimenu>Search</guimenu>><guimenuitem>Incremental Search
+ Bar</guimenuitem> (shortcut: <keycap>C+COMMA</keycap>) displays the
+ search bar if necessary, and gives it keyboard focus. </para>
+
+ <para><guimenu>Search</guimenu>><guimenuitem>Incremental Search
+ for Word</guimenuitem> (shortcut: <keycap>A+COMMA</keycap>) behaves
+ like the above command except it places the word at the caret in the
+ search string field. If this command is invoked while there is a
+ selection, the selection is placed in the search string
+ field instead.</para>
+
+ <para>Unless the <guibutton>HyperSearch</guibutton> check box is
+ selected, the search bar will perform an <firstterm>incremental
+ search</firstterm>. In incremental search mode, the first occurrence
+ of the search string is located in the current buffer as it is being
+ typed. Pressing <keycap>ENTER</keycap> and <keycap>S+ENTER</keycap>
+ searches for the next and previous occurrence, respectively. Once
+ the desired occurrence has been located, pressing
+ <keycap>ESCAPE</keycap> returns keyboard focus to the text area.
+ Unless the search bar is set to be always visible (see above),
+ pressing <keycap>ESCAPE</keycap> will also hide the search
+ bar.</para>
+
+ <note>
+ <para>Incremental searches cannot be not recorded in macros. If
+ your macro needs to perform a search, use the search and replace
+ dialog box instead. See <xref linkend="using-macros" /> for
+ information about macros.</para>
+ </note>
+
+ <para><guimenu>Search</guimenu>><guimenuitem>HyperSearch
+ Bar</guimenuitem> (shortcut: <keycap>C+PERIOD</keycap>) displays the
+ search bar if necessary, gives it keyboard focus, and selects the
+ <guibutton>HyperSearch</guibutton> check box. If this command is
+ invoked while there is a selection, the selected text will be
+ searched for immediately and the search bar will not be
+ shown.</para>
+
+ <para>If the <guibutton>HyperSearch</guibutton> check box is
+ selected, pressing <keycap>Enter</keycap> in the search string field
+ will perform a HyperSearch in the current buffer.</para>
+
+ <para><guimenu>Search</guimenu>><guimenuitem>HyperSearch for
+ Word</guimenuitem> (shortcut: <keycap>A+PERIOD</keycap>) performs a
+ HyperSearch for the word at the caret. This command does not show
+ the search bar or give it keyboard focus.</para>
+ </section>
+ </section>
</chapter>
\ No newline at end of file
diff --git a/jEdit/doc/users-guide/updating-modes.xml b/jEdit/doc/users-guide/updating-modes.xml
index 379e381..983a027 100644
--- a/jEdit/doc/users-guide/updating-modes.xml
+++ b/jEdit/doc/users-guide/updating-modes.xml
@@ -1,88 +1,88 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter id="updating-modes">
- <title>Updating Edit Modes</title>
-
- <!-- jEdit buffer-local properties: -->
-
- <!-- :indentSize=1:noTabs=true: -->
-
- <!-- :xml.root=users-guide.xml: -->
-
- <section id="from40to41" >
- <title>From jEdit 4.0 to 4.1</title>
-
- <para>In jEdit 4.1, the mode file grammar has been cleaned up somewhat.
- As a result, some edit modes written for jEdit 4.0 and earlier need to
- be updated:</para>
-
- <itemizedlist>
- <listitem>
- <para>Defining <literal><WHITESPACE></literal> rules is no
- longer necessary and doing so will print warnings to the
- activity logs.</para>
- </listitem>
-
- <listitem>
- <para>The <literal><KEYWORDS></literal> tag no longer
- accepts an <literal>IGNORE_CASE</literal> attribute. Set the
- <literal>IGNORE_CASE</literal> attribute of the
- <literal><RULES></literal> tag instead.</para>
- </listitem>
-
- <listitem>
- <para>The <literal><END></literal> tag of the
- <literal><SPAN></literal> rule used to be optional, in
- which case any occurrence of the start string would cause the
- remainder of the buffer to be highlighted with the span. In
- jEdit 4.1, the <literal><END></literal> tag can no longer
- be omitted, however a <literal><SEQ></literal> tag with a
- <literal>DELEGATE</literal> attribute can be used to achieve the
- same effect as endless span.</para>
- </listitem>
-
- <listitem>
- <para>Defining <literal><SEQ TYPE="NULL"></literal> rules
- for word separators is no longer necessary. Now, any
- non-alphanumeric character not appearing in a keyword definition
- or the ruleset's <literal>NO_WORD_SEP</literal> attribute is
- considered a word separator.</para>
- </listitem>
- </itemizedlist>
- </section>
-
- <section id="currentmodeformat">
- <title>From jEdit 4.2 to 4.3</title>
-
- <orderedlist>
- <listitem>
- <para>All regular expressions in mode files were rewritten to
- use <ulink
- url="http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/Pattern.html#sum">
- java.util.regex</ulink> instead of <ulink
- url="http://nlp.stanford.edu/nlp/javadoc/gnu-regexp-docs/syntax.html">
- gnu.regexp</ulink>.</para>
- </listitem>
-
- <listitem>
- <para><literal>HASH_CHAR</literal> handling of
- <literal>xxx_REGEXP</literal> elements has been updated, as
- explained in <xref linkend="mode-rule-span-regexp" />.</para>
- </listitem>
-
- <listitem>
- <para>The <literal>EXCLUDE_MATCH</literal> attribute got
- superseded by <literal>MATCH_TYPE</literal>. The attribute
- values translate from <literal>TRUE</literal> to
- <literal>CONTEXT</literal> and from <literal>FALSE</literal> to
- <literal>RULE</literal>, respectively. For more information see
- <xref linkend="mode-match-type" />.</para>
- </listitem>
-
- <listitem>
- <para> <literal>NO_ESCAPE</literal> is now deprecated and ignored by the parsing engine.
- <literal>ESCAPE</literal> is now a valid attribute for <literal>SPAN</literal> and <literal>SPAN_REGEXP</literal> rules.
- </para>
- </listitem>
- </orderedlist>
- </section>
-</chapter>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="updating-modes">
+ <title>Updating Edit Modes</title>
+
+ <!-- jEdit buffer-local properties: -->
+
+ <!-- :indentSize=1:noTabs=true: -->
+
+ <!-- :xml.root=users-guide.xml: -->
+
+ <section id="from40to41" >
+ <title>From jEdit 4.0 to 4.1</title>
+
+ <para>In jEdit 4.1, the mode file grammar has been cleaned up somewhat.
+ As a result, some edit modes written for jEdit 4.0 and earlier need to
+ be updated:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>Defining <literal><WHITESPACE></literal> rules is no
+ longer necessary and doing so will print warnings to the
+ activity logs.</para>
+ </listitem>
+
+ <listitem>
+ <para>The <literal><KEYWORDS></literal> tag no longer
+ accepts an <literal>IGNORE_CASE</literal> attribute. Set the
+ <literal>IGNORE_CASE</literal> attribute of the
+ <literal><RULES></literal> tag instead.</para>
+ </listitem>
+
+ <listitem>
+ <para>The <literal><END></literal> tag of the
+ <literal><SPAN></literal> rule used to be optional, in
+ which case any occurrence of the start string would cause the
+ remainder of the buffer to be highlighted with the span. In
+ jEdit 4.1, the <literal><END></literal> tag can no longer
+ be omitted, however a <literal><SEQ></literal> tag with a
+ <literal>DELEGATE</literal> attribute can be used to achieve the
+ same effect as endless span.</para>
+ </listitem>
+
+ <listitem>
+ <para>Defining <literal><SEQ TYPE="NULL"></literal> rules
+ for word separators is no longer necessary. Now, any
+ non-alphanumeric character not appearing in a keyword definition
+ or the ruleset's <literal>NO_WORD_SEP</literal> attribute is
+ considered a word separator.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section id="currentmodeformat">
+ <title>From jEdit 4.2 to 4.3</title>
+
+ <orderedlist>
+ <listitem>
+ <para>All regular expressions in mode files were rewritten to
+ use <ulink
+ url="http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#sum">
+ java.util.regex</ulink> instead of <ulink
+ url="http://nlp.stanford.edu/nlp/javadoc/gnu-regexp-docs/syntax.html">
+ gnu.regexp</ulink>.</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>HASH_CHAR</literal> handling of
+ <literal>xxx_REGEXP</literal> elements has been updated, as
+ explained in <xref linkend="mode-rule-span-regexp" />.</para>
+ </listitem>
+
+ <listitem>
+ <para>The <literal>EXCLUDE_MATCH</literal> attribute got
+ superseded by <literal>MATCH_TYPE</literal>. The attribute
+ values translate from <literal>TRUE</literal> to
+ <literal>CONTEXT</literal> and from <literal>FALSE</literal> to
+ <literal>RULE</literal>, respectively. For more information see
+ <xref linkend="mode-match-type" />.</para>
+ </listitem>
+
+ <listitem>
+ <para> <literal>NO_ESCAPE</literal> is now deprecated and ignored by the parsing engine.
+ <literal>ESCAPE</literal> is now a valid attribute for <literal>SPAN</literal> and <literal>SPAN_REGEXP</literal> rules.
+ </para>
+ </listitem>
+ </orderedlist>
+ </section>
+</chapter>
diff --git a/jEdit/doc/users-guide/users-guide.xml b/jEdit/doc/users-guide/users-guide.xml
index 1ea8b80..42d7101 100644
--- a/jEdit/doc/users-guide/users-guide.xml
+++ b/jEdit/doc/users-guide/users-guide.xml
@@ -1,195 +1,195 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN"
-"http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
-<!-- jEdit buffer-local properties: -->
-<!-- maxLineLen=0:wrap=soft:indentSize=1:noTabs=true: -->
-<!-- jEdit user's guide -->
-<!-- (C) 1999, 2004 Slava Pestov -->
-<!-- (C) 2001, 2002 John Gellene -->
-<!-- (C) 2005, 2009 Alan Ezust -->
-
-<!ENTITY conventions SYSTEM "conventions.xml">
-<!ENTITY starting SYSTEM "starting.xml">
-<!ENTITY basics SYSTEM "basics.xml">
-<!ENTITY files SYSTEM "files.xml">
-<!ENTITY text-edit SYSTEM "text-edit.xml">
-<!ENTITY source-edit SYSTEM "source-edit.xml">
-<!ENTITY customizing SYSTEM "customizing.xml">
-<!ENTITY using-macros SYSTEM "using-macros.xml">
-<!ENTITY using-plugins SYSTEM "using-plugins.xml">
-<!ENTITY shortcuts SYSTEM "shortcuts.xml">
-<!ENTITY activity-log SYSTEM "activity-log.xml">
-<!ENTITY history SYSTEM "history.xml">
-<!ENTITY globs SYSTEM "globs.xml">
-<!ENTITY regexps SYSTEM "regexps.xml">
-<!ENTITY macro-index SYSTEM "macro-index.xml">
-<!ENTITY writing-modes SYSTEM "writing-modes.xml">
-<!ENTITY installing-modes SYSTEM "installing-modes.xml">
-<!ENTITY updating-modes SYSTEM "updating-modes.xml">
-<!ENTITY macro-basics SYSTEM "macro-basics.xml">
-<!ENTITY dialog-macro SYSTEM "dialog-macro.xml">
-<!ENTITY macro-tips SYSTEM "macro-tips.xml">
-<!ENTITY bsh-commands SYSTEM "bsh-commands.xml">
-<!ENTITY plugin-intro SYSTEM "plugin-intro.xml">
-<!ENTITY plugin-implement SYSTEM "plugin-implement.xml">
-<!ENTITY plugin-tips SYSTEM "plugin-tips.xml">
-]>
-<book>
- <bookinfo>
- <title>jEdit 4.3 User's Guide</title>
-
- <copyright>
- <year>1999</year>
-
- <year>2004</year>
-
- <holder>Slava Pestov</holder>
- </copyright>
-
- <copyright>
- <year>2001</year>
-
- <year>2002</year>
-
- <holder>John Gellene</holder>
- </copyright>
-
- <copyright>
- <year>2005</year>
-
- <year>2008</year>
-
- <holder>Alan Ezust</holder>
- </copyright>
-
- <legalnotice>
- <title>Legal Notice</title>
-
- <para>Permission is granted to copy, distribute and/or modify this
- document under the terms of the GNU Free Documentation License,
- Version 1.1 or any later version published by the Free Software
- Foundation; with no <quote>Invariant Sections</quote>,
- <quote>Front-Cover Texts</quote> or <quote>Back-Cover Texts</quote>,
- each as defined in the license. A copy of the license can be found
- in the file <filename>COPYING.DOC.txt</filename> included with
- jEdit.</para>
- </legalnotice>
- </bookinfo>
-
- <part id="using-jedit-part">
- <title>Using jEdit</title>
-
- <partintro>
- <para>This part of the user's guide covers jEdit's text editing
- commands, along with basic usage of macros and plugins.</para>
-
- <para>This part of the user's guide was originally written by Slava
- Pestov and is maintained by the jEdit core development team.</para>
- </partintro>
-
- &conventions;
-
- &starting;
-
- &basics;
-
- &files;
-
- &text-edit;
-
- &source-edit;
-
- &customizing;
-
- &using-macros;
-
- &using-plugins;
-
- &shortcuts;
-
- &activity-log;
-
- &history;
-
- &globs;
-
- ®exps;
-
- ¯o-index;
-
- <!-- &launcher-guide; -->
- </part>
-
- <part id="writing-modes-part">
- <title>Writing Edit Modes</title>
-
- <partintro>
- <para>This part of the user's guide covers writing edit modes for
- jEdit.</para>
-
- <para>Edit modes specify syntax highlighting rules, auto indent
- behavior, and various other customizations for editing different
- file types. For general information about edit modes, see <xref
- linkend="modes" />.</para>
-
- <para>This part of the user's guide was written by Slava Pestov and
- is maintained by the jEdit core development team.</para>
- </partintro>
-
- &writing-modes;
-
- &installing-modes;
-
- &updating-modes;
- </part>
-
- <part id="writing-macros-part">
- <title>Writing Macros</title>
-
- <partintro>
- <para>This part of the user's guide covers writing macros for
- jEdit.</para>
-
- <para>First, we will tell you a little about BeanShell, jEdit's
- macro scripting language. Next, we will walk through a few simple
- macros. We then present and analyze a dialog-based macro to
- illustrate additional macro writing techniques. Finally, we discuss
- several tips and techniques for writing and debugging macros.</para>
-
- <para>This part of the user's guide was written by John Gellene
- <email>jgellene at nyc.rr.com</email>.</para>
- </partintro>
-
- ¯o-basics;
-
- &dialog-macro;
-
- ¯o-tips;
-
- &bsh-commands;
- </part>
-
- <part id="writing-plugins-part">
- <title>Writing Plugins</title>
-
- <partintro>
- <para>This part of the user's guide covers writing plugins for
- jEdit.</para>
-
- <para>Like jEdit itself, plugins are written primarily in Java.
- While this guide assumes some working knowledge of the language, you
- are not required to be a Java wizard. If you can write a useful
- application of any size in Java, you can write a plugin.</para>
-
- <para>This part of the user's guide was originally written by John
- Gellene. As of jEdit 4.3, it is maintained by Alan Ezust with help
- from others in the jEdit core development team.</para>
- </partintro>
-
- &plugin-intro;
-
- &plugin-implement;
-
- &plugin-tips;
- </part>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN"
+"http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
+<!-- jEdit buffer-local properties: -->
+<!-- maxLineLen=0:wrap=soft:indentSize=1:noTabs=true: -->
+<!-- jEdit user's guide -->
+<!-- (C) 1999, 2004 Slava Pestov -->
+<!-- (C) 2001, 2002 John Gellene -->
+<!-- (C) 2005, 2011 Alan Ezust -->
+
+<!ENTITY conventions SYSTEM "conventions.xml">
+<!ENTITY starting SYSTEM "starting.xml">
+<!ENTITY basics SYSTEM "basics.xml">
+<!ENTITY files SYSTEM "files.xml">
+<!ENTITY text-edit SYSTEM "text-edit.xml">
+<!ENTITY source-edit SYSTEM "source-edit.xml">
+<!ENTITY customizing SYSTEM "customizing.xml">
+<!ENTITY using-macros SYSTEM "using-macros.xml">
+<!ENTITY using-plugins SYSTEM "using-plugins.xml">
+<!ENTITY shortcuts SYSTEM "shortcuts.xml">
+<!ENTITY activity-log SYSTEM "activity-log.xml">
+<!ENTITY history SYSTEM "history.xml">
+<!ENTITY globs SYSTEM "globs.xml">
+<!ENTITY regexps SYSTEM "regexps.xml">
+<!ENTITY macro-index SYSTEM "macro-index.xml">
+<!ENTITY writing-modes SYSTEM "writing-modes.xml">
+<!ENTITY installing-modes SYSTEM "installing-modes.xml">
+<!ENTITY updating-modes SYSTEM "updating-modes.xml">
+<!ENTITY macro-basics SYSTEM "macro-basics.xml">
+<!ENTITY dialog-macro SYSTEM "dialog-macro.xml">
+<!ENTITY macro-tips SYSTEM "macro-tips.xml">
+<!ENTITY bsh-commands SYSTEM "bsh-commands.xml">
+<!ENTITY plugin-intro SYSTEM "plugin-intro.xml">
+<!ENTITY plugin-implement SYSTEM "plugin-implement.xml">
+<!ENTITY plugin-tips SYSTEM "plugin-tips.xml">
+]>
+<book>
+ <bookinfo>
+ <title>jEdit 4.4 User's Guide</title>
+
+ <copyright>
+ <year>1999</year>
+
+ <year>2004</year>
+
+ <holder>Slava Pestov</holder>
+ </copyright>
+
+ <copyright>
+ <year>2001</year>
+
+ <year>2002</year>
+
+ <holder>John Gellene</holder>
+ </copyright>
+
+ <copyright>
+ <year>2005</year>
+
+ <year>2011</year>
+
+ <holder>Alan Ezust</holder>
+ </copyright>
+
+ <legalnotice>
+ <title>Legal Notice</title>
+
+ <para>Permission is granted to copy, distribute and/or modify this
+ document under the terms of the GNU Free Documentation License,
+ Version 1.1 or any later version published by the Free Software
+ Foundation; with no <quote>Invariant Sections</quote>,
+ <quote>Front-Cover Texts</quote> or <quote>Back-Cover Texts</quote>,
+ each as defined in the license. A copy of the license can be found
+ in the file <filename>COPYING.DOC.txt</filename> included with
+ jEdit.</para>
+ </legalnotice>
+ </bookinfo>
+
+ <part id="using-jedit-part">
+ <title>Using jEdit</title>
+
+ <partintro>
+ <para>This part of the user's guide covers jEdit's text editing
+ commands, along with basic usage of macros and plugins.</para>
+
+ <para>This part of the user's guide was originally written by Slava
+ Pestov and is maintained by the jEdit core development team.</para>
+ </partintro>
+
+ &conventions;
+
+ &starting;
+
+ &basics;
+
+ &files;
+
+ &text-edit;
+
+ &source-edit;
+
+ &customizing;
+
+ &using-macros;
+
+ &using-plugins;
+
+ &shortcuts;
+
+ &activity-log;
+
+ &history;
+
+ &globs;
+
+ ®exps;
+
+ ¯o-index;
+
+ <!-- &launcher-guide; -->
+ </part>
+
+ <part id="writing-modes-part">
+ <title>Writing Edit Modes</title>
+
+ <partintro>
+ <para>This part of the user's guide covers writing edit modes for
+ jEdit.</para>
+
+ <para>Edit modes specify syntax highlighting rules, auto indent
+ behavior, and various other customizations for editing different
+ file types. For general information about edit modes, see <xref
+ linkend="modes" />.</para>
+
+ <para>This part of the user's guide was written by Slava Pestov and
+ is maintained by the jEdit core development team.</para>
+ </partintro>
+
+ &writing-modes;
+
+ &installing-modes;
+
+ &updating-modes;
+ </part>
+
+ <part id="writing-macros-part">
+ <title>Writing Macros</title>
+
+ <partintro>
+ <para>This part of the user's guide covers writing macros for
+ jEdit.</para>
+
+ <para>First, we will tell you a little about BeanShell, jEdit's
+ macro scripting language. Next, we will walk through a few simple
+ macros. We then present and analyze a dialog-based macro to
+ illustrate additional macro writing techniques. Finally, we discuss
+ several tips and techniques for writing and debugging macros.</para>
+
+ <para>This part of the user's guide was written by John Gellene
+ <email>jgellene at nyc.rr.com</email>.</para>
+ </partintro>
+
+ ¯o-basics;
+
+ &dialog-macro;
+
+ ¯o-tips;
+
+ &bsh-commands;
+ </part>
+
+ <part id="writing-plugins-part">
+ <title>Writing Plugins</title>
+
+ <partintro>
+ <para>This part of the user's guide covers writing plugins for
+ jEdit.</para>
+
+ <para>Like jEdit itself, plugins are written primarily in Java.
+ While this guide assumes some working knowledge of the language, you
+ are not required to be a Java wizard. If you can write a useful
+ application of any size in Java, you can write a plugin.</para>
+
+ <para>This part of the user's guide was originally written by John
+ Gellene. As of jEdit 4.3, it is maintained by Alan Ezust with help
+ from others in the jEdit core development team.</para>
+ </partintro>
+
+ &plugin-intro;
+
+ &plugin-implement;
+
+ &plugin-tips;
+ </part>
</book>
\ No newline at end of file
diff --git a/jEdit/doc/users-guide/using-macros.xml b/jEdit/doc/users-guide/using-macros.xml
index cd2bdcb..1c638a9 100644
--- a/jEdit/doc/users-guide/using-macros.xml
+++ b/jEdit/doc/users-guide/using-macros.xml
@@ -1,184 +1,184 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter id="using-macros">
- <title>Using Macros</title>
- <!-- jEdit buffer-local properties: -->
- <!-- :tabSize=1:indentSize=1:noTabs=true:wrap=soft:maxLineLen=80: -->
- <!-- :xml.root=users-guide.xml: -->
-
- <para>Macros in jEdit are short scripts written in a scripting language
- called <firstterm>BeanShell</firstterm>. They provide an easy way to
- automate repetitive keyboard and menu procedures, as well as access to the
- objects and methods created by jEdit. Macros also provide a powerful
- facility for customizing jEdit and automating complex text processing and
- programming tasks. This section describes how to record and run macros. A
- detailed guide on writing macros appears later; see <xref
- linkend="writing-macros-part" />.</para>
-
- <sidebar>
- <title>Other scripting languages</title>
-
- <para>A number of jEdit plugins provide support for writing scripts in
- alternative programming languages, like Python and Prolog. Consult the
- documentation for the appropriate plugins for more information.</para>
- </sidebar>
-
- <section id="recording-macros">
- <title>Recording Macros</title>
-
- <para>The simplest use of macros is to record a series of key strokes
- and menu commands as a BeanShell script, and play them back later. While
- this doesn't let you take advantage of the full power of BeanShell, it
- is still a great time saver and can even be used to
- <quote>prototype</quote> more complicated macros.</para>
-
- <para><guimenu>Macros</guimenu>><guimenuitem>Record
- Macro</guimenuitem> (shortcut: <keycap>C+m C+r</keycap>) prompts for a
- macro name and begins recording.</para>
-
- <para>While recording is in progress, the string <quote>Macro
- recording</quote> is displayed in the status bar. jEdit records the
- following:</para>
-
- <itemizedlist>
- <listitem>
- <para>Key strokes</para>
- </listitem>
-
- <listitem>
- <para>Menu item commands</para>
- </listitem>
-
- <listitem>
- <para>Tool bar clicks</para>
- </listitem>
-
- <listitem>
- <para>All search and replace operations, except incremental
- search</para>
- </listitem>
- </itemizedlist>
-
- <para>Mouse clicks in the text area are <emphasis>not</emphasis>
- recorded; use text selection commands or arrow keys instead.</para>
-
- <para><guimenu>Macros</guimenu>><guimenuitem>Stop
- Recording</guimenuitem> (shortcut: <keycap>C+m C+s</keycap>) stops
- recording. It also switches to the buffer containing the recorded macro,
- giving you a chance to check over the recorded commands and make any
- necessary changes. When you are happy with the macro, save the buffer
- and it will appear in the <guimenu>Macros</guimenu> menu. To discard the
- macro, close the buffer without saving it.</para>
-
- <para>The file name extension <filename>.bsh</filename> is automatically
- appended to the macro name, and all spaces are converted to underscore
- characters, in order to make the macro name a valid file name. These two
- operations are reversed when macros are displayed in the
- <guimenu>Macros</guimenu> menu; see <xref linkend="organizing-macros" />
- for details.</para>
-
- <para>If a complicated operation only needs to be repeated a few times,
- using the temporary macro feature is quicker than saving a new macro
- file.</para>
-
- <para><guimenu>Macros</guimenu>><guimenuitem>Record Temporary
- Macro</guimenuitem> (shortcut: <keycap>C+m C+m</keycap>) begins
- recording to a buffer named <filename>Temporary_Macro.bsh</filename>.
- Once recording of a temporary macro is complete, jEdit does not display
- the buffer containing the recorded commands, but the name
- <filename>Temporary_Macro.bsh</filename> will be visible on any list of
- open buffers. By switching to that buffer, you can view the commands,
- edit them, and save them if you wish to a permanent macro file. Whether
- or not you look at or save the temporary macro contents, it is
- immediately available for playback.</para>
-
- <para><guimenu>Macros</guimenu>><guimenuitem>Run Temporary
- Macro</guimenuitem> (shortcut: <keycap>C+m C+p</keycap>) plays the macro
- recorded to the <filename>Temporary_Macro.bsh</filename> buffer.</para>
-
- <para>Only one temporary macro is available at a time. If you begin
- recording a second temporary macro, the first is erased and cannot be
- recovered unless you have saved the contents to a file with a name other
- than <filename>Temporary_Macro.bsh</filename>. If you do not save the
- temporary macro, you must keep the buffer containing the macro script
- open during your jEdit session. To have the macro available for your
- next jEdit session, save the buffer
- <filename>Temporary_Macro.bsh</filename> as an ordinary macro with a
- descriptive name of your choice. The new name will then be displayed in
- the <guimenu>Macros</guimenu> menu.</para>
- </section>
-
- <section id="running-macros">
- <title>Running Macros</title>
-
- <para>Macros supplied with jEdit, as well as macros that you record or
- write, are displayed under the <guimenu>Macros</guimenu> menu in a
- hierarchical structure. The jEdit installation includes about 30 macros
- divided into several major categories. Each category corresponds to a
- nested submenu under the <guimenu>Macros</guimenu> menu. An index of
- these macros containing short descriptions and usage notes is found in
- <xref linkend="macro-index" />.</para>
-
- <para>To run a macro, choose the <guimenu>Macros</guimenu> menu,
- navigate through the hierarchy of submenus, and select the name of the
- macro to execute. You can also assign execution of a particular macro to
- a keyboard shortcut, toolbar button or context menu using the
- <guimenuitem>Macro Shortcuts</guimenuitem>, <guimenuitem>Tool
- Bar</guimenuitem> or <guimenuitem>Context Menu</guimenuitem> panes of
- the <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog; see <xref linkend="global-opts" />.</para>
- </section>
-
- <section id="organizing-macros">
- <title>How jEdit Organizes Macros</title>
-
- <para>Every macro, whether or not you originally recorded it, is stored
- on disk and can be edited as a text file. The file name of a macro must
- have a <filename>.bsh</filename> extension in order for jEdit to be
- aware of it. By default, jEdit associates a <filename>.bsh</filename>
- file with the BeanShell edit mode for purposes of syntax highlighting,
- indentation and other formatting. However, BeanShell syntax does not
- impose any indentation or line break requirements.</para>
-
- <para>The <guimenu>Macros</guimenu> menu lists all macros stored in two
- places: the <filename>macros</filename> subdirectory of the jEdit home
- directory, and the <filename>macros</filename> subdirectory of the
- user-specific settings directory (see <xref
- linkend="settings-directory" /> for information about the settings
- directory). Any macros you record will be stored in the user-specific
- directory.</para>
-
- <para>Macros stored elsewhere can be run using the
- <guimenu>Macros</guimenu>><guimenuitem>Run Other Macro</guimenuitem>
- command, which displays a file chooser dialog box, and runs the
- specified file.</para>
-
- <para>The listing of individual macros in the <guimenu>Macros</guimenu>
- menu can be organized in a hierarchy using subdirectories in the general
- or user-specific macro directories; each subdirectory appears as a
- submenu. You will find such a hierarchy in the default macro set
- included with jEdit.</para>
-
- <para>When jEdit first loads, it scans the designated macro directories
- and assembles a listing of individual macros in the
- <guimenu>Macros</guimenu> menu. When scanning the names, jEdit will
- delete underscore characters and the <filename>.bsh</filename> extension
- for menu labels, so that
- <filename>List_Useful_Information.bsh</filename>, for example, will be
- displayed in the <guimenu>Macros</guimenu> menu as <guimenuitem>List
- Useful Information</guimenuitem>.</para>
-
- <para>You can browse the user and system macro directories by opening
- the <filename>macros</filename> directory from the
- <guimenu>Utilities</guimenu>><guimenuitem>jEdit Home
- Directory</guimenuitem> and
- <guimenu>Utilities</guimenu>><guimenuitem>Settings
- Directory</guimenuitem> menus.</para>
-
- <para>Macros can be opened and edited much like ordinary files from the
- file system browser. Editing macros from within jEdit will automatically
- update the macros menu; however, if you modify macros from another
- program or add macro files to the macro directories, you should run the
- <guimenu>Macros</guimenu>><guimenuitem>Rescan Macros</guimenuitem>
- command to update the macro list.</para>
- </section>
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="using-macros">
+ <title>Using Macros</title>
+ <!-- jEdit buffer-local properties: -->
+ <!-- :tabSize=1:indentSize=1:noTabs=true:wrap=soft:maxLineLen=80: -->
+ <!-- :xml.root=users-guide.xml: -->
+
+ <para>Macros in jEdit are short scripts written in a scripting language
+ called <firstterm>BeanShell</firstterm>. They provide an easy way to
+ automate repetitive keyboard and menu procedures, as well as access to the
+ objects and methods created by jEdit. Macros also provide a powerful
+ facility for customizing jEdit and automating complex text processing and
+ programming tasks. This section describes how to record and run macros. A
+ detailed guide on writing macros appears later; see <xref
+ linkend="writing-macros-part" />.</para>
+
+ <sidebar>
+ <title>Other scripting languages</title>
+
+ <para>A number of jEdit plugins provide support for writing scripts in
+ alternative programming languages, like Python and Prolog. Consult the
+ documentation for the appropriate plugins for more information.</para>
+ </sidebar>
+
+ <section id="recording-macros">
+ <title>Recording Macros</title>
+
+ <para>The simplest use of macros is to record a series of key strokes
+ and menu commands as a BeanShell script, and play them back later. While
+ this doesn't let you take advantage of the full power of BeanShell, it
+ is still a great time saver and can even be used to
+ <quote>prototype</quote> more complicated macros.</para>
+
+ <para><guimenu>Macros</guimenu>><guimenuitem>Record
+ Macro</guimenuitem> (shortcut: <keycap>C+m C+r</keycap>) prompts for a
+ macro name and begins recording.</para>
+
+ <para>While recording is in progress, the string <quote>Macro
+ recording</quote> is displayed in the status bar. jEdit records the
+ following:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>Key strokes</para>
+ </listitem>
+
+ <listitem>
+ <para>Menu item commands</para>
+ </listitem>
+
+ <listitem>
+ <para>Tool bar clicks</para>
+ </listitem>
+
+ <listitem>
+ <para>All search and replace operations, except incremental
+ search</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>Mouse clicks in the text area are <emphasis>not</emphasis>
+ recorded; use text selection commands or arrow keys instead.</para>
+
+ <para><guimenu>Macros</guimenu>><guimenuitem>Stop
+ Recording</guimenuitem> (shortcut: <keycap>C+m C+s</keycap>) stops
+ recording. It also switches to the buffer containing the recorded macro,
+ giving you a chance to check over the recorded commands and make any
+ necessary changes. When you are happy with the macro, save the buffer
+ and it will appear in the <guimenu>Macros</guimenu> menu. To discard the
+ macro, close the buffer without saving it.</para>
+
+ <para>The file name extension <filename>.bsh</filename> is automatically
+ appended to the macro name, and all spaces are converted to underscore
+ characters, in order to make the macro name a valid file name. These two
+ operations are reversed when macros are displayed in the
+ <guimenu>Macros</guimenu> menu; see <xref linkend="organizing-macros" />
+ for details.</para>
+
+ <para>If a complicated operation only needs to be repeated a few times,
+ using the temporary macro feature is quicker than saving a new macro
+ file.</para>
+
+ <para><guimenu>Macros</guimenu>><guimenuitem>Record Temporary
+ Macro</guimenuitem> (shortcut: <keycap>C+m C+m</keycap>) begins
+ recording to a buffer named <filename>Temporary_Macro.bsh</filename>.
+ Once recording of a temporary macro is complete, jEdit does not display
+ the buffer containing the recorded commands, but the name
+ <filename>Temporary_Macro.bsh</filename> will be visible on any list of
+ open buffers. By switching to that buffer, you can view the commands,
+ edit them, and save them if you wish to a permanent macro file. Whether
+ or not you look at or save the temporary macro contents, it is
+ immediately available for playback.</para>
+
+ <para><guimenu>Macros</guimenu>><guimenuitem>Run Temporary
+ Macro</guimenuitem> (shortcut: <keycap>C+m C+p</keycap>) plays the macro
+ recorded to the <filename>Temporary_Macro.bsh</filename> buffer.</para>
+
+ <para>Only one temporary macro is available at a time. If you begin
+ recording a second temporary macro, the first is erased and cannot be
+ recovered unless you have saved the contents to a file with a name other
+ than <filename>Temporary_Macro.bsh</filename>. If you do not save the
+ temporary macro, you must keep the buffer containing the macro script
+ open during your jEdit session. To have the macro available for your
+ next jEdit session, save the buffer
+ <filename>Temporary_Macro.bsh</filename> as an ordinary macro with a
+ descriptive name of your choice. The new name will then be displayed in
+ the <guimenu>Macros</guimenu> menu.</para>
+ </section>
+
+ <section id="running-macros">
+ <title>Running Macros</title>
+
+ <para>Macros supplied with jEdit, as well as macros that you record or
+ write, are displayed under the <guimenu>Macros</guimenu> menu in a
+ hierarchical structure. The jEdit installation includes about 30 macros
+ divided into several major categories. Each category corresponds to a
+ nested submenu under the <guimenu>Macros</guimenu> menu. An index of
+ these macros containing short descriptions and usage notes is found in
+ <xref linkend="macro-index" />.</para>
+
+ <para>To run a macro, choose the <guimenu>Macros</guimenu> menu,
+ navigate through the hierarchy of submenus, and select the name of the
+ macro to execute. You can also assign execution of a particular macro to
+ a keyboard shortcut, toolbar button or context menu using the
+ <guimenuitem>Macro Shortcuts</guimenuitem>, <guimenuitem>Tool
+ Bar</guimenuitem> or <guimenuitem>Context Menu</guimenuitem> panes of
+ the <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog; see <xref linkend="global-opts" />.</para>
+ </section>
+
+ <section id="organizing-macros">
+ <title>How jEdit Organizes Macros</title>
+
+ <para>Every macro, whether or not you originally recorded it, is stored
+ on disk and can be edited as a text file. The file name of a macro must
+ have a <filename>.bsh</filename> extension in order for jEdit to be
+ aware of it. By default, jEdit associates a <filename>.bsh</filename>
+ file with the BeanShell edit mode for purposes of syntax highlighting,
+ indentation and other formatting. However, BeanShell syntax does not
+ impose any indentation or line break requirements.</para>
+
+ <para>The <guimenu>Macros</guimenu> menu lists all macros stored in two
+ places: the <filename>macros</filename> subdirectory of the jEdit home
+ directory, and the <filename>macros</filename> subdirectory of the
+ user-specific settings directory (see <xref
+ linkend="settings-directory" /> for information about the settings
+ directory). Any macros you record will be stored in the user-specific
+ directory.</para>
+
+ <para>Macros stored elsewhere can be run using the
+ <guimenu>Macros</guimenu>><guimenuitem>Run Other Macro</guimenuitem>
+ command, which displays a file chooser dialog box, and runs the
+ specified file.</para>
+
+ <para>The listing of individual macros in the <guimenu>Macros</guimenu>
+ menu can be organized in a hierarchy using subdirectories in the general
+ or user-specific macro directories; each subdirectory appears as a
+ submenu. You will find such a hierarchy in the default macro set
+ included with jEdit.</para>
+
+ <para>When jEdit first loads, it scans the designated macro directories
+ and assembles a listing of individual macros in the
+ <guimenu>Macros</guimenu> menu. When scanning the names, jEdit will
+ delete underscore characters and the <filename>.bsh</filename> extension
+ for menu labels, so that
+ <filename>List_Useful_Information.bsh</filename>, for example, will be
+ displayed in the <guimenu>Macros</guimenu> menu as <guimenuitem>List
+ Useful Information</guimenuitem>.</para>
+
+ <para>You can browse the user and system macro directories by opening
+ the <filename>macros</filename> directory from the
+ <guimenu>Utilities</guimenu>><guimenuitem>jEdit Home
+ Directory</guimenuitem> and
+ <guimenu>Utilities</guimenu>><guimenuitem>Settings
+ Directory</guimenuitem> menus.</para>
+
+ <para>Macros can be opened and edited much like ordinary files from the
+ file system browser. Editing macros from within jEdit will automatically
+ update the macros menu; however, if you modify macros from another
+ program or add macro files to the macro directories, you should run the
+ <guimenu>Macros</guimenu>><guimenuitem>Rescan Macros</guimenuitem>
+ command to update the macro list.</para>
+ </section>
</chapter>
\ No newline at end of file
diff --git a/jEdit/doc/users-guide/using-plugins.xml b/jEdit/doc/users-guide/using-plugins.xml
index 98e93b5..c0e5cf3 100644
--- a/jEdit/doc/users-guide/using-plugins.xml
+++ b/jEdit/doc/users-guide/using-plugins.xml
@@ -1,143 +1,143 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter id="using-plugins">
- <title>Installing and Using Plugins</title>
- <!-- jEdit buffer-local properties: -->
- <!-- :tabSize=1:indentSize=1:noTabs=true:wrap=hard:maxLineLen=80: -->
- <!-- :xml.root=users-guide.xml: -->
- <para>A <firstterm>plugin</firstterm> is an application which is loaded and
- runs as part of another, host application. Plugins respond to user commands
- and perform tasks that supplement the host application's features.</para>
-
- <para>This chapter covers installing, updating and removing plugins.
- Documentation for the plugins themselves can be found in
- <guimenu>Help</guimenu>><guimenuitem>jEdit Help</guimenuitem>, and
- information about writing plugins can be found in <xref
- linkend="writing-plugins-part" />.</para>
-
- <section id="plugin-manager">
- <title>The Plugin Manager</title>
-
- <para><guimenu>Plugins</guimenu>><guimenuitem>Plugin
- Manager</guimenuitem> displays the plugin manager window. It consists of
- three tabs: Manage, Update and Install. The Manage tab lists all
- installed plugins; clicking on a plugin in the list will display
- information about it.</para>
-
- <para>To remove plugins, select them (multiple plugins can be selected
- by holding down <keycap>Control</keycap>) and click
- <guibutton>Remove</guibutton>. This will display a confirmation dialog
- box first.</para>
-
- <para>To view plugin documentation, select a plugin and click
- <guibutton>Help</guibutton>. Note that plugin documentation can also be
- accessed by invoking <guimenu>Help</guimenu>><guimenuitem>jEdit
- Help</guimenuitem>.</para>
-
- <para> After you have tuned jEdit to your liking and want to install the
- same set of plugins onto another host, or another user's profile, you
- can export your currently installed plugin list as an xml file, known as
- a <emphasis role="bold">PluginSet</emphasis>. The
- <guibutton>Save</guibutton> rollover button allows you to save the list
- of installed and loaded plugins to an XML file. See <xref
- linkend="plugin-sets" /> for more information. </para>
-
-
- <para><guimenu>Plugins</guimenu>><guimenuitem>Plugin
- Options</guimenuitem> displays a dialog box for changing plugin
- settings.</para>
- </section>
-
- <section id="installing-plugins">
- <title>Installing and Updating Plugins</title>
-
- <para>Plugins can be installed in two ways; manually, and from the
- plugin manager. In most cases, plugins should be installed from the
- plugin manager. It is easier and more convenient.</para>
-
- <para>To install plugins manually, go to <ulink
- url="http://plugins.jedit.org">http://plugins.jedit.org</ulink> in a web
- browser and follow the directions on that page.</para>
-
- <para>To install plugins from the plugin manager, make sure you are
- connected to the Internet and click the <guibutton>Install</guibutton>
- tab in the plugin manager window. The plugin manager will then download
- information about available plugins from the jEdit web site, and present
- a list of plugins compatible with your jEdit release.</para>
-
- <para>Click on a plugin in the list to see some information about it. To
- select plugins for installation, click the check box next to their names
- in the list.</para>
-
- <para>The <guibutton>Total size</guibutton> field shows the total size
- of all plugins chosen for installation, along with any plugins that will
- be automatically downloaded in order to fulfill dependencies.</para>
-
- <para>If a previously saved PluginSet was selected, it will
- automatically be loaded whenever the Install tab is created, and you
- will see the filename in the hovertip of the
- <guibutton>choose</guibutton> rolloverbutton, as well as all of the
- plugins in that set already checked for you. </para>
-
- <para> You can clear the active PluginSet with the
- <guibutton>clear</guibutton> button next to it, or choose a different
- PluginSet xml file with the <guibutton>choose</guibutton> button. See
- <xref linkend="plugin-sets" /> for more information. </para>
-
- <para>Once you have specified plugins to install, click
- <guibutton>Install</guibutton> to begin the download process.</para>
-
- <para>By default, the plugin manager does not download plugin source
- code, and installs the downloaded plugins in the
- <filename>jars</filename> subdirectory of the user-specific settings
- directory. These settings can be changed in <guilabel>Plugin
- Manager</guilabel> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box; see <xref
- linkend="pluginmgr-pane" />.</para>
-
- <para>The <guibutton>Update</guibutton> tab of the plugin manager is
- very similar to the <guibutton>Install</guibutton> tab. It lists plugins
- for which updated versions are available. It will also offer to delete
- any obsolete plugins.</para>
-
- <sidebar>
- <title>Proxy Servers and Firewalls</title>
-
- <para>If you are connected to the Internet through an HTTP proxy or
- SOCKS firewall, you will need to specify the relevant details in the
- <guibutton>Proxy Servers</guibutton> pane of the
- <guimenu>Utilities</guimenu>><guimenuitem>Global
- Options</guimenuitem> dialog box; see <xref
- linkend="firewall-pane" />.</para>
- </sidebar>
- </section>
-
- <section id="plugin-sets">
- <title>Plugin Sets</title>
-
- <para> A <emphasis role="bold">PluginSet</emphasis> is a collection of
- plugins, represented as an XML file. These XML files can be created from the
- <guibutton>save</guibutton> button of the Manage tab of the Plugin Manager.
- Saving a PluginSet remembers all of the currently loaded plugins. </para>
-
- <para> When a PluginSet has been saved, it becomes the "default pluginset",
- which means that if you unload/uninstall plugins from that set and go back to the
- Install tab, you should see them selected for download again. To clear this
- setting, click on the <guibutton>clear</guibutton> button in the
- Install tab.
- </para>
-
- <para> It is posisble to Choose/Open a PluginSet from the Manage or the
- Install tab. The behavior of choosing a PluginSet depends on which tab
- you are on when you choose it. From the Manage tab, it unloads plugins that
- are loaded but not in the list. From the Install tab, it selects plugins
- from that list that are not loaded, marking them for download from Plugin
- Central. </para>
-
- <para> When choosing a PluginSet, the path can be given as a remote URL.
- This helps teachers and sysadmins direct the students/slaves to a standard
- set of plugins that are required for the course/job. </para>
-
- </section>
-
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="using-plugins">
+ <title>Installing and Using Plugins</title>
+ <!-- jEdit buffer-local properties: -->
+ <!-- :tabSize=1:indentSize=1:noTabs=true:wrap=hard:maxLineLen=80: -->
+ <!-- :xml.root=users-guide.xml: -->
+ <para>A <firstterm>plugin</firstterm> is an application which is loaded and
+ runs as part of another, host application. Plugins respond to user commands
+ and perform tasks that supplement the host application's features.</para>
+
+ <para>This chapter covers installing, updating and removing plugins.
+ Documentation for the plugins themselves can be found in
+ <guimenu>Help</guimenu>><guimenuitem>jEdit Help</guimenuitem>, and
+ information about writing plugins can be found in <xref
+ linkend="writing-plugins-part" />.</para>
+
+ <section id="plugin-manager">
+ <title>The Plugin Manager</title>
+
+ <para><guimenu>Plugins</guimenu>><guimenuitem>Plugin
+ Manager</guimenuitem> displays the plugin manager window. It consists of
+ three tabs: Manage, Update and Install. The Manage tab lists all
+ installed plugins; clicking on a plugin in the list will display
+ information about it.</para>
+
+ <para>To remove plugins, select them (multiple plugins can be selected
+ by holding down <keycap>Control</keycap>) and click
+ <guibutton>Remove</guibutton>. This will display a confirmation dialog
+ box first.</para>
+
+ <para>To view plugin documentation, select a plugin and click
+ <guibutton>Help</guibutton>. Note that plugin documentation can also be
+ accessed by invoking <guimenu>Help</guimenu>><guimenuitem>jEdit
+ Help</guimenuitem>.</para>
+
+ <para> After you have tuned jEdit to your liking and want to install the
+ same set of plugins onto another host, or another user's profile, you
+ can export your currently installed plugin list as an xml file, known as
+ a <emphasis role="bold">PluginSet</emphasis>. The
+ <guibutton>Save</guibutton> rollover button allows you to save the list
+ of installed and loaded plugins to an XML file. See <xref
+ linkend="plugin-sets" /> for more information. </para>
+
+
+ <para><guimenu>Plugins</guimenu>><guimenuitem>Plugin
+ Options</guimenuitem> displays a dialog box for changing plugin
+ settings.</para>
+ </section>
+
+ <section id="installing-plugins">
+ <title>Installing and Updating Plugins</title>
+
+ <para>Plugins can be installed in two ways; manually, and from the
+ plugin manager. In most cases, plugins should be installed from the
+ plugin manager. It is easier and more convenient.</para>
+
+ <para>To install plugins manually, go to <ulink
+ url="http://plugins.jedit.org">http://plugins.jedit.org</ulink> in a web
+ browser and follow the directions on that page.</para>
+
+ <para>To install plugins from the plugin manager, make sure you are
+ connected to the Internet and click the <guibutton>Install</guibutton>
+ tab in the plugin manager window. The plugin manager will then download
+ information about available plugins from the jEdit web site, and present
+ a list of plugins compatible with your jEdit release.</para>
+
+ <para>Click on a plugin in the list to see some information about it. To
+ select plugins for installation, click the check box next to their names
+ in the list.</para>
+
+ <para>The <guibutton>Total size</guibutton> field shows the total size
+ of all plugins chosen for installation, along with any plugins that will
+ be automatically downloaded in order to fulfill dependencies.</para>
+
+ <para>If a previously saved PluginSet was selected, it will
+ automatically be loaded whenever the Install tab is created, and you
+ will see the filename in the hovertip of the
+ <guibutton>choose</guibutton> rolloverbutton, as well as all of the
+ plugins in that set already checked for you. </para>
+
+ <para> You can clear the active PluginSet with the
+ <guibutton>clear</guibutton> button next to it, or choose a different
+ PluginSet xml file with the <guibutton>choose</guibutton> button. See
+ <xref linkend="plugin-sets" /> for more information. </para>
+
+ <para>Once you have specified plugins to install, click
+ <guibutton>Install</guibutton> to begin the download process.</para>
+
+ <para>By default, the plugin manager does not download plugin source
+ code, and installs the downloaded plugins in the
+ <filename>jars</filename> subdirectory of the user-specific settings
+ directory. These settings can be changed in <guilabel>Plugin
+ Manager</guilabel> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box; see <xref
+ linkend="pluginmgr-pane" />.</para>
+
+ <para>The <guibutton>Update</guibutton> tab of the plugin manager is
+ very similar to the <guibutton>Install</guibutton> tab. It lists plugins
+ for which updated versions are available. It will also offer to delete
+ any obsolete plugins.</para>
+
+ <sidebar>
+ <title>Proxy Servers and Firewalls</title>
+
+ <para>If you are connected to the Internet through an HTTP proxy or
+ SOCKS firewall, you will need to specify the relevant details in the
+ <guibutton>Proxy Servers</guibutton> pane of the
+ <guimenu>Utilities</guimenu>><guimenuitem>Global
+ Options</guimenuitem> dialog box; see <xref
+ linkend="firewall-pane" />.</para>
+ </sidebar>
+ </section>
+
+ <section id="plugin-sets">
+ <title>Plugin Sets</title>
+
+ <para> A <emphasis role="bold">PluginSet</emphasis> is a collection of
+ plugins, represented as an XML file. These XML files can be created from the
+ <guibutton>save</guibutton> button of the Manage tab of the Plugin Manager.
+ Saving a PluginSet remembers all of the currently loaded plugins. </para>
+
+ <para> When a PluginSet has been saved, it becomes the "default pluginset",
+ which means that if you unload/uninstall plugins from that set and go back to the
+ Install tab, you should see them selected for download again. To clear this
+ setting, click on the <guibutton>clear</guibutton> button in the
+ Install tab.
+ </para>
+
+ <para> It is posisble to Choose/Open a PluginSet from the Manage or the
+ Install tab. The behavior of choosing a PluginSet depends on which tab
+ you are on when you choose it. From the Manage tab, it unloads plugins that
+ are loaded but not in the list. From the Install tab, it selects plugins
+ from that list that are not loaded, marking them for download from Plugin
+ Central. </para>
+
+ <para> When choosing a PluginSet, the path can be given as a remote URL.
+ This helps teachers and sysadmins direct the students/slaves to a standard
+ set of plugins that are required for the course/job. </para>
+
+ </section>
+
</chapter>
\ No newline at end of file
diff --git a/jEdit/doc/users-guide/writing-modes.xml b/jEdit/doc/users-guide/writing-modes.xml
index 459571f..1eb5150 100644
--- a/jEdit/doc/users-guide/writing-modes.xml
+++ b/jEdit/doc/users-guide/writing-modes.xml
@@ -1,913 +1,913 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter id="writing-modes">
- <title>Mode Definition Syntax</title>
- <!-- jEdit buffer-local properties: -->
- <!-- :indentSize=1:noTabs=true: -->
- <!-- :xml.root=users-guide.xml: -->
- <para>Edit modes are defined using XML, the <firstterm>eXtensible Markup
- Language</firstterm>; mode files have the extension
- <filename>.xml</filename>. XML is a very simple language, and as a result
- edit modes are easy to create and modify. This section will start with a
- short XML primer, followed by detailed information about each supported tag
- and highlighting rule.</para>
- <para>Editing a mode or a mode catalog file within jEdit will cause the
- changes to take effect immediately. If you edit modes using another
- application, the changes will take effect after the
- <guimenu>Utilities</guimenu> > <guisubmenu>Troubleshooting</guisubmenu>
- > <guimenuitem>Reload Edit Modes</guimenuitem> command is invoked.</para>
- <section id="xml-primer">
- <title>An XML Primer</title>
- <para>A very simple XML file (which also happens to be an edit mode)
- looks like so:</para>
- <programlisting><?xml version="1.0"?>
-
-<!DOCTYPE MODE SYSTEM "xmode.dtd">
-
-<MODE>
- <PROPS>
- <PROPERTY NAME="commentStart" VALUE="/*" />
- <PROPERTY NAME="commentEnd" VALUE="*/" />
- </PROPS>
-
- <RULES>
- <SPAN TYPE="COMMENT1">
- <BEGIN>/*</BEGIN>
- <END>*/</END>
- </SPAN>
- </RULES>
-</MODE></programlisting>
- <para>Note that each opening tag must have a corresponding closing tag.
- If there is nothing between the opening and closing tags, for example
- <literal><TAG></TAG></literal>, the shorthand notation
- <literal><TAG /></literal> may be used. An example of this
- shorthand can be seen in the <literal><PROPERTY></literal> tags
- above.</para>
- <para>XML is case sensitive. <literal>Span</literal> or
- <literal>span</literal> is not the same as
- <literal>SPAN</literal>.</para>
- <para>To insert a special character such as < or > literally in
- XML (for example, inside an attribute value), you must write it as an
- <firstterm>entity</firstterm>. An entity consists of the character's
- symbolic name enclosed within <quote>&</quote> and <quote>;</quote>.
- The most frequently used entities are:</para>
- <itemizedlist>
- <listitem>
- <para><literal><</literal> - The less-than (<)
- character</para>
- </listitem>
- <listitem>
- <para><literal>></literal> - The greater-than (>)
- character</para>
- </listitem>
- <listitem>
- <para><literal>&</literal> - The ampersand (&)
- character</para>
- </listitem>
- </itemizedlist>
- <para>For example, the following will cause a syntax error:</para>
- <programlisting><SEQ TYPE="OPERATOR">&</SEQ></programlisting>
- <para>Instead, you must write:</para>
- <programlisting><SEQ TYPE="OPERATOR">&</SEQ></programlisting>
- <para>Now that the basics of XML have been covered, the rest of this
- section will cover each construct in detail.</para>
- </section>
- <section id="mode-preamble">
- <title>The Preamble and MODE tag</title>
- <para>Each mode definition must begin with the following:</para>
- <programlisting><?xml version="1.0"?>
-<!DOCTYPE MODE SYSTEM "xmode.dtd"></programlisting>
- <para>Each mode definition must also contain exactly one
- <literal>MODE</literal> tag. All other tags (<literal>PROPS</literal>,
- <literal>RULES</literal>) must be placed inside the
- <literal>MODE</literal> tag. The <literal>MODE</literal> tag does not
- have any defined attributes. Here is an example:</para>
- <programlisting><MODE>
- <replaceable>... mode definition goes here ...</replaceable>
-</MODE></programlisting>
- </section>
- <section id="mode-tag-props">
- <title>The PROPS Tag</title>
- <para>The <literal>PROPS</literal> tag and the
- <literal>PROPERTY</literal> tags inside it are used to define
- mode-specific properties. Each <literal>PROPERTY</literal> tag must have
- a <literal>NAME</literal> attribute set to the property's name, and a
- <literal>VALUE</literal> attribute with the property's value.</para>
- <para>All buffer-local properties listed in <xref
- linkend="buffer-local" /> may be given values in edit modes.</para>
- <para>The following mode properties specify commenting strings:</para>
- <itemizedlist>
- <listitem>
- <para><literal>commentEnd</literal> - the comment end string,
- used by the <guimenuitem>Range Comment</guimenuitem>
- command.</para>
- </listitem>
- <listitem>
- <para><literal>commentStart</literal> - the comment start
- string, used by the <guimenuitem>Range Comment</guimenuitem>
- command.</para>
- </listitem>
- <listitem>
- <para><literal>lineComment</literal> - the line comment string,
- used by the <guimenuitem>Line Comment</guimenuitem>
- command.</para>
- </listitem>
- </itemizedlist>
- <para>When performing auto indent, a number of mode properties determine
- the resulting indent level:</para>
- <itemizedlist>
- <listitem>
- <para>The line and the one before it are scanned for brackets
- listed in the <literal>indentCloseBrackets</literal> and
- <literal>indentOpenBrackets</literal> properties. Opening
- brackets in the previous line increase indent.</para>
- <para>If <literal>lineUpClosingBracket</literal> is set to
- <literal>true</literal>, then closing brackets on the current
- line will line up with the line containing the matching opening
- bracket. For example, in Java mode
- <literal>lineUpClosingBracket</literal> is set to
- <literal>true</literal>, resulting in brackets being indented
- like so:</para>
- <programlisting>{
- // Code
- {
- // More code
- }
-}</programlisting>
- <para>If <literal>lineUpClosingBracket</literal> is set to
- <literal>false</literal>, the line <emphasis>after</emphasis> a
- closing bracket will be lined up with the line containing the
- matching opening bracket. For example, in Lisp mode
- <literal>lineUpClosingBracket</literal> is set to
- <literal>false</literal>, resulting in brackets being indented
- like so:</para>
- <programlisting>(foo 'a-parameter
- (crazy-p)
- (bar baz ()))
-(print "hello world")</programlisting>
- </listitem>
- <listitem>
- <para>If the previous line contains no opening brackets, or if
- the <literal>doubleBracketIndent</literal> property is set to
- <literal>true</literal>, the previous line is checked against
- the regular expressions in the <literal>indentNextLine</literal>
- and <literal>indentNextLines</literal> properties. If the
- previous line matches the former, the indent of the current line
- is increased and the subsequent line is shifted back again. If
- the previous line matches the latter, the indent of the current
- and subsequent lines is increased.</para>
- <para>In Java mode, for example, the
- <literal>indentNextLine</literal> property is set to match
- control structures such as <quote>if</quote>,
- <quote>else</quote>, <quote>while</quote>, and so on.</para>
- <para>The <literal>doubleBracketIndent</literal> property, if
- set to the default of <literal>false</literal>, results in code
- indented like so:</para>
- <programlisting>while(objects.hasNext())
-{
- Object next = objects.hasNext();
- if(next instanceof Paintable)
- next.paint(g);
-}</programlisting>
- <para>On the other hand, settings this property to
- <quote>true</quote> will give the following result:</para>
- <programlisting>while(objects.hasNext())
- {
- Object next = objects.hasNext();
- if(next instanceof Paintable)
- next.paint(g);
- }</programlisting>
- </listitem>
- </itemizedlist>
- <para>Here is the complete <literal><PROPS></literal> tag for Java
- mode:</para>
- <programlisting><PROPS>
- <PROPERTY NAME="commentStart" VALUE="/*" />
- <PROPERTY NAME="commentEnd" VALUE="*/" />
- <PROPERTY NAME="lineComment" VALUE="//" />
- <PROPERTY NAME="wordBreakChars" VALUE=",+-=<>/?^&*" />
-
- <!-- Auto indent -->
- <PROPERTY NAME="indentOpenBrackets" VALUE="{" />
- <PROPERTY NAME="indentCloseBrackets" VALUE="}" />
- <PROPERTY NAME="unalignedOpenBrackets" VALUE="(" />
- <PROPERTY NAME="unalignedCloseBrackets" VALUE=")" />
- <PROPERTY NAME="indentNextLine"
- VALUE="\s*(((if|while)\s*\(|else\s*|else\s+if\s*\(|for\s*\(.*\))[^{;]*)" />
- <PROPERTY NAME="unindentThisLine"
- VALUE="^.*(default:\s*|case.*:.*)$" />
- <PROPERTY NAME="electricKeys" VALUE=":" />
- <!-- set this to 'true' if you want to use GNU coding style -->
- <PROPERTY NAME="doubleBracketIndent" VALUE="false" />
- <PROPERTY NAME="lineUpClosingBracket" VALUE="true" />
-</PROPS></programlisting>
- </section>
- <section id="mode-tag-rules">
- <title>The RULES Tag</title>
- <para><literal>RULES</literal> tags must be placed inside the
- <literal>MODE</literal> tag. Each <literal>RULES</literal> tag defines a
- <firstterm>ruleset</firstterm>. A ruleset consists of a number of
- <firstterm>parser rules</firstterm>, with each parser rule specifying
- how to highlight a specific syntax token. There must be at least one
- ruleset in each edit mode. There can also be more than one, with
- different rulesets being used to highlight different parts of a buffer
- (for example, in HTML mode, one rule set highlights HTML tags, and
- another highlights inline JavaScript). For information about using more
- than one ruleset, see <xref linkend="mode-rule-span" />.</para>
- <para>The <literal>RULES</literal> tag supports the following
- attributes, all of which are optional:</para>
- <itemizedlist>
- <listitem>
- <para><literal>SET</literal> - the name of this ruleset. All
- rulesets other than the first must have a name.</para>
- </listitem>
- <listitem>
- <para><literal>IGNORE_CASE</literal> - if set to
- <literal>FALSE</literal>, matches will be case sensitive.
- Otherwise, case will not matter. Default is
- <literal>TRUE</literal>.</para>
- </listitem>
- <listitem>
- <para><literal>ESCAPE</literal> - specifies a character sequence
- for escaping literals. The first character following the escape
- sequence is not considered as input for syntax highlighting,
- thus being highlighted with default token for the rule set.
- </para>
- </listitem>
- <listitem>
- <para><literal>NO_WORD_SEP</literal> - any non-alphanumeric
- character <emphasis>not</emphasis> in this list is treated as a
- word separator for the purposes of syntax highlighting.</para>
- </listitem>
- <listitem>
- <para><literal>DEFAULT</literal> - the token type for text which
- doesn't match any specific rule. Default is
- <literal>NULL</literal>. See <xref
- linkend="mode-syntax-tokens" /> for a list of token
- types.</para>
- </listitem>
- <listitem>
- <para><literal>HIGHLIGHT_DIGITS</literal></para>
- </listitem>
- <listitem>
- <para><literal>DIGIT_RE</literal> - see below for information
- about these two attributes.</para>
- </listitem>
- </itemizedlist>
- <para>Here is an example <literal>RULES</literal> tag:</para>
- <programlisting><RULES IGNORE_CASE="FALSE" HIGHLIGHT_DIGITS="TRUE">
- <replaceable>... parser rules go here ...</replaceable>
-</RULES></programlisting>
- <section>
- <title>Highlighting Numbers</title>
- <para>If the <literal>HIGHLIGHT_DIGITS</literal> attribute is set to
- <literal>TRUE</literal>, jEdit will attempt to highlight numbers in
- this ruleset.</para>
- <para>Any word consisting entirely of digits (0-9) will be
- highlighted with the <literal>DIGIT</literal> token type. A word
- that contains other letters in addition to digits will be
- highlighted with the <literal>DIGIT</literal> token type only if it
- matches the regular expression specified in the
- <literal>DIGIT_RE</literal> attribute. If this attribute is not
- specified, it will not be highlighted.</para>
- <para>Here is an example <literal>DIGIT_RE</literal> regular
- expression that highlights Java-style numeric literals (normal
- numbers, hexadecimals prefixed with <literal>0x</literal>, numbers
- suffixed with various type indicators, and floating point literals
- containing an exponent):</para>
- <programlisting>DIGIT_RE="(0[lL]?|[1-9]\d{0,9}(\d{0,9}[lL])?|0[xX]\p{XDigit}{1,8}(\p{XDigit}{0,8}[lL])?|0[0-7]{1,11}([0-7]{0,11}[lL])?|([0-9]+\.[0-9]*|\.[0-9]+)([eE][+-]?[0-9]+)?[fFdD]?|[0-9]+([eE][+-]?[0-9]+[fFdD]?|([eE][+-]?[0-9]+)?[fFdD]))"</programlisting>
- <para>Regular expression syntax is described in <xref
- linkend="regexps" />.</para>
- </section>
- <section id="rule-ordering">
- <title>Rule Ordering Requirements</title>
- <para>You might encounter this very common pitfall when writing your
- own modes.</para>
- <para>Since jEdit checks buffer text against parser rules in the
- order they appear in the ruleset, more specific rules must be placed
- before generalized ones, otherwise the generalized rules will catch
- everything.</para>
- <para>This is best demonstrated with an example. The following is
- incorrect rule ordering:</para>
- <programlisting><SPAN TYPE="MARKUP">
- <BEGIN>[</BEGIN>
- <END>]</END>
-</SPAN>
-
-<SPAN TYPE="KEYWORD1">
- <BEGIN>[!</BEGIN>
- <END>]</END>
-</SPAN></programlisting>
- <para>If you write the above in a rule set, any occurrence of
- <quote>[</quote> (even things like <quote>[!DEFINE</quote>, etc)
- will be highlighted using the first rule, because it will be the
- first to match. This is most likely not the intended
- behavior.</para>
- <para>The problem can be solved by placing the more specific rule
- before the general one:</para>
- <programlisting><SPAN TYPE="KEYWORD1">
- <BEGIN>[!</BEGIN>
- <END>]</END>
-</SPAN>
-
-<SPAN TYPE="MARKUP">
- <BEGIN>[</BEGIN>
- <END>]</END>
-</SPAN></programlisting>
- <para>Now, if the buffer contains the text
- <quote>[!SPECIAL]</quote>, the rules will be checked in order, and
- the first rule will be the first to match. However, if you write
- <quote>[FOO]</quote>, it will be highlighted using the second rule,
- which is exactly what you would expect.</para>
- </section>
- <section>
- <title>Per-Ruleset Properties</title>
- <para>The <literal>PROPS</literal> tag (described in <xref
- linkend="mode-tag-props" />) can also be placed inside the
- <literal>RULES</literal> tag to define ruleset-specific properties.
- The following properties can be set on a per-ruleset basis:</para>
- <itemizedlist>
- <listitem>
- <para><literal>commentEnd</literal> - the comment end
- string.</para>
- </listitem>
- <listitem>
- <para><literal>commentStart</literal> - the comment start
- string.</para>
- </listitem>
- <listitem>
- <para><literal>lineComment</literal> - the line comment
- string.</para>
- </listitem>
- </itemizedlist>
- <para>This allows different parts of a file to have different
- comment strings (in the case of HTML, for example, in HTML text and
- inline JavaScript). For information about the commenting commands,
- see <xref linkend="commenting" />.</para>
- </section>
- </section>
- <section id="mode-rule-terminate">
- <title>The TERMINATE Tag</title>
- <para>The <literal>TERMINATE</literal> rule, which must be placed inside
- a <literal>RULES</literal> tag, specifies that parsing should stop after
- the specified number of characters have been read from a line. The
- number of characters to terminate after should be specified with the
- <literal>AT_CHAR</literal> attribute. Here is an example:</para>
- <programlisting><TERMINATE AT_CHAR="1" /></programlisting>
- <para>This rule is used in Patch mode, for example, because only the
- first character of each line affects highlighting.</para>
- </section>
- <section id="mode-rule-span">
- <title>The SPAN Tag</title>
- <para>The <literal>SPAN</literal> rule, which must be placed inside a
- <literal>RULES</literal> tag, highlights text between a start and end
- string. The start and end strings are specified inside child elements of
- the <literal>SPAN</literal> tag. The following attributes are
- supported:</para>
- <itemizedlist>
- <listitem>
- <para><literal>TYPE</literal> - The token type to highlight the
- span with. See <xref linkend="mode-syntax-tokens" /> for a list
- of token types.</para>
- </listitem>
- <listitem>
- <para><literal>AT_LINE_START</literal> - If set to
- <literal>TRUE</literal>, the span will only be highlighted if
- the start sequence occurs at the beginning of a line.</para>
- </listitem>
- <listitem>
- <para><literal>AT_WHITESPACE_END</literal> - If set to
- <literal>TRUE</literal>, the span will only be highlighted if
- the start sequence is the first non-whitespace text in the
- line.</para>
- </listitem>
- <listitem>
- <para><literal>AT_WORD_START</literal> - If set to
- <literal>TRUE</literal>, the span will only be highlighted if
- the start sequence occurs at the beginning of a word.</para>
- </listitem>
- <listitem>
- <para><literal>DELEGATE</literal> - text inside the span will be
- highlighted with the specified ruleset. To delegate to a ruleset
- defined in the current mode, just specify its name. To delegate
- to a ruleset defined in another mode, specify a name of the form
- <literal><replaceable>mode</replaceable>::<replaceable>ruleset</replaceable></literal>.
- Note that the first (unnamed) ruleset in a mode is called
- <quote>MAIN</quote>.</para>
- </listitem>
- <listitem>
- <para><literal>MATCH_TYPE</literal> - Controls how the start and
- end of the sequence will be highlighted. See <xref
- linkend="mode-match-type" /> for more information.</para>
- </listitem>
- <listitem>
- <para><literal>ESCAPE</literal> - specifies a character sequence
- for escaping characters. The first character following the escape
- sequence is not considered as input for syntax highlighting,
- thus being highlighted with rule's token.
- </para>
- </listitem>
- <listitem>
- <para><literal>NO_LINE_BREAK</literal> - If set to
- <literal>TRUE</literal>, the span will not cross line
- breaks.</para>
- </listitem>
- <listitem>
- <para><literal>NO_WORD_BREAK</literal> - If set to
- <literal>TRUE</literal>, the span will not cross word
- breaks.</para>
- </listitem>
- </itemizedlist>
- <para>Note that the <literal>AT_LINE_START</literal>,
- <literal>AT_WHITESPACE_END</literal> and
- <literal>AT_WORD_START</literal> attributes can also be used on the
- <literal>BEGIN</literal> and <literal>END</literal> elements. Setting
- these attributes to the same value on both elements has the same effect
- as setting them on the <literal>SPAN</literal> element.</para>
- <para>Here is a <literal>SPAN</literal> that highlights Java string
- literals, which cannot include line breaks:</para>
- <programlisting><SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">
- <BEGIN>"</BEGIN>
- <END>"</END>
-</SPAN></programlisting>
- <para>Here is a <literal>SPAN</literal> that highlights Java
- documentation comments by delegating to the <quote>JAVADOC</quote>
- ruleset defined elsewhere in the current mode:</para>
- <programlisting><SPAN TYPE="COMMENT2" DELEGATE="JAVADOC">
- <BEGIN>/**</BEGIN>
- <END>*/</END>
-</SPAN></programlisting>
- <para>Here is a <literal>SPAN</literal> that highlights HTML cascading
- stylesheets inside <literal><STYLE></literal> tags by delegating
- to the main ruleset in the CSS edit mode:</para>
- <programlisting><SPAN TYPE="MARKUP" DELEGATE="css::MAIN">
- <BEGIN><style></BEGIN>
- <END></style></END>
-</SPAN></programlisting>
- </section>
- <section id="mode-rule-span-regexp">
- <title>The SPAN_REGEXP Tag</title>
- <para>The <literal>SPAN_REGEXP</literal> rule is similar to the
- <literal>SPAN</literal> rule except the start sequence is taken to be a
- regular expression. In addition to the attributes supported by the
- <literal>SPAN</literal> tag, the following attributes are
- supported:</para>
- <itemizedlist>
- <listitem>
- <para><literal>HASH_CHAR</literal> - a literal string which must
- be at the start of a regular expression.</para>
- </listitem>
- <listitem>
- <para><literal>HASH_CHARS</literal> - a list of possible literal
- characters, one of which must match at the start of the regular
- expression.</para>
- </listitem>
- </itemizedlist>
- <para><literal>HASH_CHAR</literal> and <literal>HASH_CHARS</literal>
- attributes are both optional, but you may only specify one, not both. If
- both are specified, <literal>HASH_CHARS</literal> is ignored and an
- error is shown. Whenever possible, use a literal prefix to specify a
- <literal>SPAN_REGEXP</literal>. If the starting prefix is always the
- same, use <literal>HASH_CHAR</literal> and provide as much prefix as
- possible. Only in rare cases would you omit both attributes, such as the
- case where there is no other reliable way to get the highlighting you
- need, for example, with comments in the Cobol programming
- language.</para>
- <para>The regular expression match cannot span more than one line. Any
- text matched by groups in the <literal>BEGIN</literal> regular
- expression is substituted in the <literal>END</literal> string. See
- below for an example of where this is useful.</para>
- <para>Regular expression syntax is described in <xref
- linkend="regexps" />.</para>
- <para>Here is a <literal>SPAN_REGEXP</literal> rule that highlights
- <quote>read-ins</quote> in shell scripts:</para>
- <programlisting><SPAN_REGEXP HASH_CHAR="<" TYPE="LITERAL1" DELEGATE="LITERAL">
- <BEGIN><![CDATA[<<[\p{Space}'"]*([\p{Alnum}_]+)[\p{Space}'"]*]]></BEGIN>
- <END>$1</END>
-</SPAN_REGEXP></programlisting>
- <para>Here is a <literal>SPAN_REGEXP</literal> rule that highlights
- constructs placed between <literal><#ftl</literal> and
- <literal>></literal>, as long as the <literal><#ftl</literal> is
- followed by a word break:</para>
- <programlisting><SPAN_REGEXP TYPE="KEYWORD1" HASH_CHAR="<" DELEGATE="EXPRESSION">
- <BEGIN><#ftl\b</BEGIN>
- <END>></END>
-</SPAN_REGEXP></programlisting>
- </section>
- <section id="mode-rule-eol-span">
- <title>The EOL_SPAN Tag</title>
- <para>An <literal>EOL_SPAN</literal> is similar to a
- <literal>SPAN</literal> except that highlighting stops at the end of the
- line, and no end sequence needs to be specified. The text to match is
- specified between the opening and closing <literal>EOL_SPAN</literal>
- tags. The following attributes are supported:</para>
- <itemizedlist>
- <listitem>
- <para><literal>TYPE</literal> - The token type to highlight the
- span with. See <xref linkend="mode-syntax-tokens" /> for a list
- of token types.</para>
- </listitem>
- <listitem>
- <para><literal>AT_LINE_START</literal> - If set to
- <literal>TRUE</literal>, the span will only be highlighted if
- the start sequence occurs at the beginning of a line.</para>
- </listitem>
- <listitem>
- <para><literal>AT_WHITESPACE_END</literal> - If set to
- <literal>TRUE</literal>, the span will only be highlighted if
- the sequence is the first non-whitespace text in the
- line.</para>
- </listitem>
- <listitem>
- <para><literal>AT_WORD_START</literal> - If set to
- <literal>TRUE</literal>, the span will only be highlighted if
- the start sequence occurs at the beginning of a word.</para>
- </listitem>
- <listitem>
- <para><literal>DELEGATE</literal> - text inside the span will be
- highlighted with the specified ruleset. To delegate to a ruleset
- defined in the current mode, just specify its name. To delegate
- to a ruleset defined in another mode, specify a name of the form
- <literal><replaceable>mode</replaceable>::<replaceable>ruleset</replaceable></literal>.
- Note that the first (unnamed) ruleset in a mode is called
- <quote>MAIN</quote>.</para>
- </listitem>
- <listitem>
- <para><literal>MATCH_TYPE</literal> - Controls how the start of
- the sequence will be highlighted. See <xref
- linkend="mode-match-type" /> for more information.</para>
- </listitem>
- </itemizedlist>
- <para>Here is an <literal>EOL_SPAN</literal> that highlights C++
- comments:</para>
- <programlisting><EOL_SPAN TYPE="COMMENT1">//</EOL_SPAN></programlisting>
- </section>
- <section id="mode-rule-eol-span-regexp">
- <title>The EOL_SPAN_REGEXP Tag</title>
- <para>The <literal>EOL_SPAN_REGEXP</literal> rule is similar to the
- <literal>EOL_SPAN</literal> rule except the match sequence is taken to
- be a regular expression. In addition to the attributes supported by the
- <literal>EOL_SPAN</literal> tag, the following attributes are
- supported:</para>
- <itemizedlist>
- <listitem>
- <para><literal>HASH_CHAR</literal> - a literal string which must
- be at the start of a regular expression.</para>
- </listitem>
- <listitem>
- <para><literal>HASH_CHARS</literal> - a list of possible literal
- characters, one of which must match at the start of the regular
- expression.</para>
- </listitem>
- </itemizedlist>
- <para><literal>HASH_CHAR</literal> and <literal>HASH_CHARS</literal>
- attributes are both optional, but you may only specify one, not both. If
- both are specified, <literal>HASH_CHARS</literal> is ignored and an
- error is shown. Whenever possible, use a literal prefix to specify a
- <literal>EOL_SPAN_REGEXP</literal>. If the starting prefix is always the
- same, use <literal>HASH_CHAR</literal> and provide as much prefix as
- possible. Only in rare cases would you omit both attributes, such as the
- case where there is no other reliable way to get the highlighting you
- need, for example, with comments in the Cobol programming
- language.</para>
- <para>The regular expression match cannot span more than one
- line.</para>
- <para>Regular expression syntax is described in <xref
- linkend="regexps" />.</para>
- <para>Here is an <literal>EOL_SPAN_REGEXP</literal> that highlights
- MS-DOS batch file comments, which start with <literal>REM</literal>,
- followed by any whitespace character, and extend until the end of the
- line:</para>
- <programlisting><EOL_SPAN_REGEXP AT_WHITESPACE_END="TRUE" HASH_CHAR="REM" TYPE="COMMENT1">REM\s</EOL_SPAN_REGEXP></programlisting>
- </section>
- <section id="mode-rule-mark-prev">
- <title>The MARK_PREVIOUS Tag</title>
- <para>The <literal>MARK_PREVIOUS</literal> rule, which must be placed
- inside a <literal>RULES</literal> tag, highlights from the end of the
- previous syntax token to the matched text. The text to match is
- specified between opening and closing <literal>MARK_PREVIOUS</literal>
- tags. The following attributes are supported:</para>
- <itemizedlist>
- <listitem>
- <para><literal>TYPE</literal> - The token type to highlight the
- text with. See <xref linkend="mode-syntax-tokens" /> for a list
- of token types.</para>
- </listitem>
- <listitem>
- <para><literal>AT_LINE_START</literal> - If set to
- <literal>TRUE</literal>, the sequence will only be highlighted
- if it occurs at the beginning of a line.</para>
- </listitem>
- <listitem>
- <para><literal>AT_WHITESPACE_END</literal> - If set to
- <literal>TRUE</literal>, the sequence will only be highlighted
- if it is the first non-whitespace text in the line.</para>
- </listitem>
- <listitem>
- <para><literal>AT_WORD_START</literal> - If set to
- <literal>TRUE</literal>, the sequence will only be highlighted
- if it occurs at the beginning of a word.</para>
- </listitem>
- <listitem>
- <para><literal>MATCH_TYPE</literal> - Controls how the matched
- region will be highlighted. See <xref
- linkend="mode-match-type" /> for more information.</para>
- </listitem>
- </itemizedlist>
- <para>Here is a rule that highlights labels in Java mode (for example,
- <quote>XXX:</quote>):</para>
- <programlisting><MARK_PREVIOUS AT_WHITESPACE_END="TRUE"
- MATCH_TYPE="DEFAULT">:</MARK_PREVIOUS></programlisting>
- </section>
- <section id="mode-rule-mark-following">
- <title>The MARK_FOLLOWING Tag</title>
- <para>The <literal>MARK_FOLLOWING</literal> rule, which must be placed
- inside a <literal>RULES</literal> tag, highlights from the start of the
- match to the next syntax token. The text to match is specified between
- opening and closing <literal>MARK_FOLLOWING</literal> tags. The
- following attributes are supported:</para>
- <itemizedlist>
- <listitem>
- <para><literal>TYPE</literal> - The token type to highlight the
- text with. See <xref linkend="mode-syntax-tokens" /> for a list
- of token types.</para>
- </listitem>
- <listitem>
- <para><literal>AT_LINE_START</literal> - If set to
- <literal>TRUE</literal>, the sequence will only be highlighted
- if it occurs at the beginning of a line.</para>
- </listitem>
- <listitem>
- <para><literal>AT_WHITESPACE_END</literal> - If set to
- <literal>TRUE</literal>, the sequence will only be highlighted
- if it is the first non-whitespace text in the line.</para>
- </listitem>
- <listitem>
- <para><literal>AT_WORD_START</literal> - If set to
- <literal>TRUE</literal>, the sequence will only be highlighted
- if it occurs at the beginning of a word.</para>
- </listitem>
- <listitem>
- <para><literal>MATCH_TYPE</literal> - Controls how the matched
- region will be highlighted. See <xref
- linkend="mode-match-type" /> for more information.</para>
- </listitem>
- </itemizedlist>
- <para>Here is a rule that highlights variables in Unix shell scripts
- (<quote>$CLASSPATH</quote>, <quote>$IFS</quote>, etc):</para>
- <programlisting><MARK_FOLLOWING TYPE="KEYWORD2">$</MARK_FOLLOWING></programlisting>
- </section>
- <section id="mode-rule-seq">
- <title>The SEQ Tag</title>
- <para>The <literal>SEQ</literal> rule, which must be placed inside a
- <literal>RULES</literal> tag, highlights fixed sequences of text. The
- text to highlight is specified between opening and closing
- <literal>SEQ</literal> tags. The following attributes are
- supported:</para>
- <itemizedlist>
- <listitem>
- <para><literal>TYPE</literal> - the token type to highlight the
- sequence with. See <xref linkend="mode-syntax-tokens" /> for a
- list of token types.</para>
- </listitem>
- <listitem>
- <para><literal>AT_LINE_START</literal> - If set to
- <literal>TRUE</literal>, the sequence will only be highlighted
- if it occurs at the beginning of a line.</para>
- </listitem>
- <listitem>
- <para><literal>AT_WHITESPACE_END</literal> - If set to
- <literal>TRUE</literal>, the sequence will only be highlighted
- if it is the first non-whitespace text in the line.</para>
- </listitem>
- <listitem>
- <para><literal>AT_WORD_START</literal> - If set to
- <literal>TRUE</literal>, the sequence will only be highlighted
- if it occurs at the beginning of a word.</para>
- </listitem>
- <listitem>
- <para><literal>DELEGATE</literal> - if this attribute is
- specified, all text after the sequence will be highlighted using
- this ruleset. To delegate to a ruleset defined in the current
- mode, just specify its name. To delegate to a ruleset defined in
- another mode, specify a name of the form
- <literal><replaceable>mode</replaceable>::<replaceable>ruleset</replaceable></literal>.
- Note that the first (unnamed) ruleset in a mode is called
- <quote>MAIN</quote>.</para>
- </listitem>
- </itemizedlist>
- <para>The following rules highlight a few Java operators:</para>
- <programlisting><SEQ TYPE="OPERATOR">+</SEQ>
-<SEQ TYPE="OPERATOR">-</SEQ>
-<SEQ TYPE="OPERATOR">*</SEQ>
-<SEQ TYPE="OPERATOR">/</SEQ></programlisting>
- </section>
- <section id="mode-rule-seq-regexp">
- <title>The SEQ_REGEXP Tag</title>
- <para>The <literal>SEQ_REGEXP</literal> rule is similar to the
- <literal>SEQ</literal> rule except the match sequence is taken to be a
- regular expression. In addition to the attributes supported by the
- <literal>SEQ</literal> tag, the following attributes are
- supported:</para>
- <itemizedlist>
- <listitem>
- <para><literal>HASH_CHAR</literal> - a literal string which must
- be at the start of a regular expression.</para>
- </listitem>
- <listitem>
- <para><literal>HASH_CHARS</literal> - a list of possible literal
- characters, one of which must match at the start of the regular
- expression.</para>
- </listitem>
- </itemizedlist>
- <para><literal>HASH_CHAR</literal> and <literal>HASH_CHARS</literal>
- attributes are both optional, but you may only specify one, not both. If
- both are specified, <literal>HASH_CHARS</literal> is ignored and an
- error is shown. Whenever possible, use a literal prefix to specify a
- <literal>SEQ_REGEXP</literal>. If the starting prefix is always the
- same, use <literal>HASH_CHAR</literal> and provide as much prefix as
- possible. Only in rare cases would you omit both attributes, such as the
- case where there is no other reliable way to get the highlighting you
- need, for example, with comments in the Cobol programming
- language.</para>
- <para>The regular expression match cannot span more than one
- line.</para>
- <para>Regular expression syntax is described in <xref
- linkend="regexps" />.</para>
- <para><emphasis role="bold">NOTE</emphasis>: c-style character escaping
- for literals (such as the tab char: \t) do not work as attribute values
- in XML. Use the XML character entity instead. For example: 	
- instead of \t.</para>
- <para>Here is a <literal>SEQ_REGEXP</literal> rule from moin.xml that
- uses the <literal>HASH_CHARS</literal> attribute, to describe a keyword
- (wikiword) that can start with any uppercase letter and contain lower
- case letters and at least one uppercase letter in the middle.</para>
- <programlisting>
- <SEQ_REGEXP HASH_CHARS="ABCDEFGHIJKLMNOPQRSTUVWXYZ" AT_WORD_START="TRUE" TYPE="KEYWORD2">[A-Z][a-z]+[A-Z][a-zA-Z]+</SEQ_REGEXP>
- </programlisting>
- </section>
- <section id="mode-rule-import">
- <title>The IMPORT Tag</title>
- <para>The <literal>IMPORT</literal> tag, which must be placed inside a
- <literal>RULES</literal> tag, loads all rules defined in a given ruleset
- into the current ruleset; in other words, it has the same effect as
- copying and pasting the imported ruleset.</para>
- <para>The only required attribute <literal>DELEGATE</literal> must be
- set to the name of a ruleset. To import a ruleset defined in the current
- mode, just specify its name. To import a ruleset defined in another
- mode, specify a name of the form
- <literal><replaceable>mode</replaceable>::<replaceable>ruleset</replaceable></literal>.
- Note that the first (unnamed) ruleset in a mode is called
- <quote>MAIN</quote>.</para>
- <para>One quirk is that the definition of the imported ruleset is not
- copied to the location of the <literal>IMPORT</literal> tag, but rather
- to the end of the containing ruleset. This has implications with
- rule-ordering; see <xref linkend="rule-ordering" />.</para>
- <para>Here is an example from the PHP mode, which extends the inline
- JavaScript highlighting to support embedded PHP:</para>
- <programlisting>
- <RULES SET="JAVASCRIPT+PHP">
-
- <SPAN TYPE="MARKUP" DELEGATE="php::PHP">
- <BEGIN><?php</BEGIN>
- <END>?></END>
- </SPAN>
-
- <SPAN TYPE="MARKUP" DELEGATE="php::PHP">
- <BEGIN><?</BEGIN>
- <END>?></END>
- </SPAN>
-
- <SPAN TYPE="MARKUP" DELEGATE="php::PHP">
- <BEGIN><%=</BEGIN>
- <END>%></END>
- </SPAN>
-
- <IMPORT DELEGATE="javascript::MAIN"/>
-</RULES></programlisting>
- </section>
- <section id="mode-rule-keywords">
- <title>The KEYWORDS Tag</title>
- <para>The <literal>KEYWORDS</literal> tag, which must be placed inside a
- <literal>RULES</literal> tag and can only appear once, specifies a list
- of keywords to highlight. Keywords are similar to
- <literal>SEQ</literal>s, except that <literal>SEQ</literal>s match
- anywhere in the text, whereas keywords only match whole words. Words are
- considered to be runs of text separated by non-alphanumeric
- characters.</para>
- <para>The <literal>KEYWORDS</literal> tag does not define any
- attributes.</para>
- <para>Each child element of the <literal>KEYWORDS</literal> tag is an
- element whose name is a token type, and whose content is the keyword to
- highlight. For example, the following rule highlights the most common
- Java keywords:</para>
- <programlisting><KEYWORDS>
- <KEYWORD1>if</KEYWORD1>
- <KEYWORD1>else</KEYWORD1>
- <KEYWORD3>int</KEYWORD3>
- <KEYWORD3>void</KEYWORD3>
-</KEYWORDS></programlisting>
- </section>
- <section id="mode-syntax-tokens">
- <title>Token Types</title>
- <para>Parser rules can highlight tokens using any of the following token
- types:</para>
- <itemizedlist>
- <listitem>
- <para><literal>NULL</literal> - no special highlighting is
- performed on tokens of type <literal>NULL</literal></para>
- </listitem>
- <listitem>
- <para><literal>COMMENT1</literal></para>
- </listitem>
- <listitem>
- <para><literal>COMMENT2</literal></para>
- </listitem>
- <listitem>
- <para><literal>COMMENT3</literal></para>
- </listitem>
- <listitem>
- <para><literal>COMMENT4</literal></para>
- </listitem>
- <listitem>
- <para><literal>FUNCTION</literal></para>
- </listitem>
- <listitem>
- <para><literal>DIGIT</literal></para>
- </listitem>
- <listitem>
- <para><literal>INVALID</literal><!-- - tokens of this type are
- automatically added if a <literal>NO_WORD_BREAK</literal> or
- <literal>NO_LINE_BREAK</literal> <literal>SPAN</literal> spans more than
- one word or line, respectively. --></para>
- </listitem>
- <listitem>
- <para><literal>KEYWORD1</literal></para>
- </listitem>
- <listitem>
- <para><literal>KEYWORD2</literal></para>
- </listitem>
- <listitem>
- <para><literal>KEYWORD3</literal></para>
- </listitem>
- <listitem>
- <para><literal>KEYWORD4</literal></para>
- </listitem>
- <listitem>
- <para><literal>LABEL</literal></para>
- </listitem>
- <listitem>
- <para><literal>LITERAL1</literal></para>
- </listitem>
- <listitem>
- <para><literal>LITERAL2</literal></para>
- </listitem>
- <listitem>
- <para><literal>LITERAL3</literal></para>
- </listitem>
- <listitem>
- <para><literal>LITERAL4</literal></para>
- </listitem>
- <listitem>
- <para><literal>MARKUP</literal></para>
- </listitem>
- <listitem>
- <para><literal>OPERATOR</literal></para>
- </listitem>
- </itemizedlist>
- </section>
- <section id="mode-match-type">
- <title>The MATCH_TYPE Attribute</title>
- <para>The <literal>MATCH_TYPE</literal> attribute is used by some of the
- rules to control how the region matched by the rule will be
- highlighted.</para>
- <para>For example, when using a <literal>MARK_PREVIOUS</literal> rule to
- highlight a function call of the form <literal>fcall()</literal>, the
- following rule could be used:</para>
- <programlisting>
- <MARK_PREVIOUS TYPE="FUNCTION" MATCH_TYPE="OPERATOR">(</MARK_PREVIOUS></programlisting>
- <para>This would cause <literal>fcall</literal> to be highlighted as
- <literal>FUNCTION</literal>, and <literal>(</literal> to be highlighted
- as <literal>OPERATOR</literal>. In this case, to maintain bracket
- matching working, a <literal>SEQ</literal> rule would have to be added
- to match <literal>)</literal> and mark it as
- <literal>OPERATOR</literal>.</para>
- <para>The <literal>MATCH_TYPE</literal> attribute value can be any of
- the valid token types, or the following special values:</para>
- <itemizedlist>
- <listitem>
- <para><literal>RULE</literal>: this is the default value. It
- tells the syntax system to use the same token type as the TYPE
- attribute of the rule. This is equivalent to
- <literal>EXCLUDE_MATCH="FALSE"</literal> in 4.2 and earlier mode
- files.</para>
- </listitem>
- <listitem>
- <para><literal>CONTEXT</literal>: using this value tells the
- syntax system to mark the matched region using the default token
- type for the current rule set. In 4.2 and earlier mode files,
- this was specified by
- <literal>EXCLUDE_MATCH="TRUE"</literal>.</para>
- </listitem>
- </itemizedlist>
- </section>
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="writing-modes">
+ <title>Mode Definition Syntax</title>
+ <!-- jEdit buffer-local properties: -->
+ <!-- :indentSize=1:noTabs=true: -->
+ <!-- :xml.root=users-guide.xml: -->
+ <para>Edit modes are defined using XML, the <firstterm>eXtensible Markup
+ Language</firstterm>; mode files have the extension
+ <filename>.xml</filename>. XML is a very simple language, and as a result
+ edit modes are easy to create and modify. This section will start with a
+ short XML primer, followed by detailed information about each supported tag
+ and highlighting rule.</para>
+ <para>Editing a mode or a mode catalog file within jEdit will cause the
+ changes to take effect immediately. If you edit modes using another
+ application, the changes will take effect after the
+ <guimenu>Utilities</guimenu> > <guisubmenu>Troubleshooting</guisubmenu>
+ > <guimenuitem>Reload Edit Modes</guimenuitem> command is invoked.</para>
+ <section id="xml-primer">
+ <title>An XML Primer</title>
+ <para>A very simple XML file (which also happens to be an edit mode)
+ looks like so:</para>
+ <programlisting><?xml version="1.0"?>
+
+<!DOCTYPE MODE SYSTEM "xmode.dtd">
+
+<MODE>
+ <PROPS>
+ <PROPERTY NAME="commentStart" VALUE="/*" />
+ <PROPERTY NAME="commentEnd" VALUE="*/" />
+ </PROPS>
+
+ <RULES>
+ <SPAN TYPE="COMMENT1">
+ <BEGIN>/*</BEGIN>
+ <END>*/</END>
+ </SPAN>
+ </RULES>
+</MODE></programlisting>
+ <para>Note that each opening tag must have a corresponding closing tag.
+ If there is nothing between the opening and closing tags, for example
+ <literal><TAG></TAG></literal>, the shorthand notation
+ <literal><TAG /></literal> may be used. An example of this
+ shorthand can be seen in the <literal><PROPERTY></literal> tags
+ above.</para>
+ <para>XML is case sensitive. <literal>Span</literal> or
+ <literal>span</literal> is not the same as
+ <literal>SPAN</literal>.</para>
+ <para>To insert a special character such as < or > literally in
+ XML (for example, inside an attribute value), you must write it as an
+ <firstterm>entity</firstterm>. An entity consists of the character's
+ symbolic name enclosed within <quote>&</quote> and <quote>;</quote>.
+ The most frequently used entities are:</para>
+ <itemizedlist>
+ <listitem>
+ <para><literal><</literal> - The less-than (<)
+ character</para>
+ </listitem>
+ <listitem>
+ <para><literal>></literal> - The greater-than (>)
+ character</para>
+ </listitem>
+ <listitem>
+ <para><literal>&</literal> - The ampersand (&)
+ character</para>
+ </listitem>
+ </itemizedlist>
+ <para>For example, the following will cause a syntax error:</para>
+ <programlisting><SEQ TYPE="OPERATOR">&</SEQ></programlisting>
+ <para>Instead, you must write:</para>
+ <programlisting><SEQ TYPE="OPERATOR">&</SEQ></programlisting>
+ <para>Now that the basics of XML have been covered, the rest of this
+ section will cover each construct in detail.</para>
+ </section>
+ <section id="mode-preamble">
+ <title>The Preamble and MODE tag</title>
+ <para>Each mode definition must begin with the following:</para>
+ <programlisting><?xml version="1.0"?>
+<!DOCTYPE MODE SYSTEM "xmode.dtd"></programlisting>
+ <para>Each mode definition must also contain exactly one
+ <literal>MODE</literal> tag. All other tags (<literal>PROPS</literal>,
+ <literal>RULES</literal>) must be placed inside the
+ <literal>MODE</literal> tag. The <literal>MODE</literal> tag does not
+ have any defined attributes. Here is an example:</para>
+ <programlisting><MODE>
+ <replaceable>... mode definition goes here ...</replaceable>
+</MODE></programlisting>
+ </section>
+ <section id="mode-tag-props">
+ <title>The PROPS Tag</title>
+ <para>The <literal>PROPS</literal> tag and the
+ <literal>PROPERTY</literal> tags inside it are used to define
+ mode-specific properties. Each <literal>PROPERTY</literal> tag must have
+ a <literal>NAME</literal> attribute set to the property's name, and a
+ <literal>VALUE</literal> attribute with the property's value.</para>
+ <para>All buffer-local properties listed in <xref
+ linkend="buffer-local" /> may be given values in edit modes.</para>
+ <para>The following mode properties specify commenting strings:</para>
+ <itemizedlist>
+ <listitem>
+ <para><literal>commentEnd</literal> - the comment end string,
+ used by the <guimenuitem>Range Comment</guimenuitem>
+ command.</para>
+ </listitem>
+ <listitem>
+ <para><literal>commentStart</literal> - the comment start
+ string, used by the <guimenuitem>Range Comment</guimenuitem>
+ command.</para>
+ </listitem>
+ <listitem>
+ <para><literal>lineComment</literal> - the line comment string,
+ used by the <guimenuitem>Line Comment</guimenuitem>
+ command.</para>
+ </listitem>
+ </itemizedlist>
+ <para>When performing auto indent, a number of mode properties determine
+ the resulting indent level:</para>
+ <itemizedlist>
+ <listitem>
+ <para>The line and the one before it are scanned for brackets
+ listed in the <literal>indentCloseBrackets</literal> and
+ <literal>indentOpenBrackets</literal> properties. Opening
+ brackets in the previous line increase indent.</para>
+ <para>If <literal>lineUpClosingBracket</literal> is set to
+ <literal>true</literal>, then closing brackets on the current
+ line will line up with the line containing the matching opening
+ bracket. For example, in Java mode
+ <literal>lineUpClosingBracket</literal> is set to
+ <literal>true</literal>, resulting in brackets being indented
+ like so:</para>
+ <programlisting>{
+ // Code
+ {
+ // More code
+ }
+}</programlisting>
+ <para>If <literal>lineUpClosingBracket</literal> is set to
+ <literal>false</literal>, the line <emphasis>after</emphasis> a
+ closing bracket will be lined up with the line containing the
+ matching opening bracket. For example, in Lisp mode
+ <literal>lineUpClosingBracket</literal> is set to
+ <literal>false</literal>, resulting in brackets being indented
+ like so:</para>
+ <programlisting>(foo 'a-parameter
+ (crazy-p)
+ (bar baz ()))
+(print "hello world")</programlisting>
+ </listitem>
+ <listitem>
+ <para>If the previous line contains no opening brackets, or if
+ the <literal>doubleBracketIndent</literal> property is set to
+ <literal>true</literal>, the previous line is checked against
+ the regular expressions in the <literal>indentNextLine</literal>
+ and <literal>indentNextLines</literal> properties. If the
+ previous line matches the former, the indent of the current line
+ is increased and the subsequent line is shifted back again. If
+ the previous line matches the latter, the indent of the current
+ and subsequent lines is increased.</para>
+ <para>In Java mode, for example, the
+ <literal>indentNextLine</literal> property is set to match
+ control structures such as <quote>if</quote>,
+ <quote>else</quote>, <quote>while</quote>, and so on.</para>
+ <para>The <literal>doubleBracketIndent</literal> property, if
+ set to the default of <literal>false</literal>, results in code
+ indented like so:</para>
+ <programlisting>while(objects.hasNext())
+{
+ Object next = objects.hasNext();
+ if(next instanceof Paintable)
+ next.paint(g);
+}</programlisting>
+ <para>On the other hand, settings this property to
+ <quote>true</quote> will give the following result:</para>
+ <programlisting>while(objects.hasNext())
+ {
+ Object next = objects.hasNext();
+ if(next instanceof Paintable)
+ next.paint(g);
+ }</programlisting>
+ </listitem>
+ </itemizedlist>
+ <para>Here is the complete <literal><PROPS></literal> tag for Java
+ mode:</para>
+ <programlisting><PROPS>
+ <PROPERTY NAME="commentStart" VALUE="/*" />
+ <PROPERTY NAME="commentEnd" VALUE="*/" />
+ <PROPERTY NAME="lineComment" VALUE="//" />
+ <PROPERTY NAME="wordBreakChars" VALUE=",+-=<>/?^&*" />
+
+ <!-- Auto indent -->
+ <PROPERTY NAME="indentOpenBrackets" VALUE="{" />
+ <PROPERTY NAME="indentCloseBrackets" VALUE="}" />
+ <PROPERTY NAME="unalignedOpenBrackets" VALUE="(" />
+ <PROPERTY NAME="unalignedCloseBrackets" VALUE=")" />
+ <PROPERTY NAME="indentNextLine"
+ VALUE="\s*(((if|while)\s*\(|else\s*|else\s+if\s*\(|for\s*\(.*\))[^{;]*)" />
+ <PROPERTY NAME="unindentThisLine"
+ VALUE="^.*(default:\s*|case.*:.*)$" />
+ <PROPERTY NAME="electricKeys" VALUE=":" />
+ <!-- set this to 'true' if you want to use GNU coding style -->
+ <PROPERTY NAME="doubleBracketIndent" VALUE="false" />
+ <PROPERTY NAME="lineUpClosingBracket" VALUE="true" />
+</PROPS></programlisting>
+ </section>
+ <section id="mode-tag-rules">
+ <title>The RULES Tag</title>
+ <para><literal>RULES</literal> tags must be placed inside the
+ <literal>MODE</literal> tag. Each <literal>RULES</literal> tag defines a
+ <firstterm>ruleset</firstterm>. A ruleset consists of a number of
+ <firstterm>parser rules</firstterm>, with each parser rule specifying
+ how to highlight a specific syntax token. There must be at least one
+ ruleset in each edit mode. There can also be more than one, with
+ different rulesets being used to highlight different parts of a buffer
+ (for example, in HTML mode, one rule set highlights HTML tags, and
+ another highlights inline JavaScript). For information about using more
+ than one ruleset, see <xref linkend="mode-rule-span" />.</para>
+ <para>The <literal>RULES</literal> tag supports the following
+ attributes, all of which are optional:</para>
+ <itemizedlist>
+ <listitem>
+ <para><literal>SET</literal> - the name of this ruleset. All
+ rulesets other than the first must have a name.</para>
+ </listitem>
+ <listitem>
+ <para><literal>IGNORE_CASE</literal> - if set to
+ <literal>FALSE</literal>, matches will be case sensitive.
+ Otherwise, case will not matter. Default is
+ <literal>TRUE</literal>.</para>
+ </listitem>
+ <listitem>
+ <para><literal>ESCAPE</literal> - specifies a character sequence
+ for escaping literals. The first character following the escape
+ sequence is not considered as input for syntax highlighting,
+ thus being highlighted with default token for the rule set.
+ </para>
+ </listitem>
+ <listitem>
+ <para><literal>NO_WORD_SEP</literal> - any non-alphanumeric
+ character <emphasis>not</emphasis> in this list is treated as a
+ word separator for the purposes of syntax highlighting.</para>
+ </listitem>
+ <listitem>
+ <para><literal>DEFAULT</literal> - the token type for text which
+ doesn't match any specific rule. Default is
+ <literal>NULL</literal>. See <xref
+ linkend="mode-syntax-tokens" /> for a list of token
+ types.</para>
+ </listitem>
+ <listitem>
+ <para><literal>HIGHLIGHT_DIGITS</literal></para>
+ </listitem>
+ <listitem>
+ <para><literal>DIGIT_RE</literal> - see below for information
+ about these two attributes.</para>
+ </listitem>
+ </itemizedlist>
+ <para>Here is an example <literal>RULES</literal> tag:</para>
+ <programlisting><RULES IGNORE_CASE="FALSE" HIGHLIGHT_DIGITS="TRUE">
+ <replaceable>... parser rules go here ...</replaceable>
+</RULES></programlisting>
+ <section>
+ <title>Highlighting Numbers</title>
+ <para>If the <literal>HIGHLIGHT_DIGITS</literal> attribute is set to
+ <literal>TRUE</literal>, jEdit will attempt to highlight numbers in
+ this ruleset.</para>
+ <para>Any word consisting entirely of digits (0-9) will be
+ highlighted with the <literal>DIGIT</literal> token type. A word
+ that contains other letters in addition to digits will be
+ highlighted with the <literal>DIGIT</literal> token type only if it
+ matches the regular expression specified in the
+ <literal>DIGIT_RE</literal> attribute. If this attribute is not
+ specified, it will not be highlighted.</para>
+ <para>Here is an example <literal>DIGIT_RE</literal> regular
+ expression that highlights Java-style numeric literals (normal
+ numbers, hexadecimals prefixed with <literal>0x</literal>, numbers
+ suffixed with various type indicators, and floating point literals
+ containing an exponent):</para>
+ <programlisting>DIGIT_RE="(0[lL]?|[1-9]\d{0,9}(\d{0,9}[lL])?|0[xX]\p{XDigit}{1,8}(\p{XDigit}{0,8}[lL])?|0[0-7]{1,11}([0-7]{0,11}[lL])?|([0-9]+\.[0-9]*|\.[0-9]+)([eE][+-]?[0-9]+)?[fFdD]?|[0-9]+([eE][+-]?[0-9]+[fFdD]?|([eE][+-]?[0-9]+)?[fFdD]))"</programlisting>
+ <para>Regular expression syntax is described in <xref
+ linkend="regexps" />.</para>
+ </section>
+ <section id="rule-ordering">
+ <title>Rule Ordering Requirements</title>
+ <para>You might encounter this very common pitfall when writing your
+ own modes.</para>
+ <para>Since jEdit checks buffer text against parser rules in the
+ order they appear in the ruleset, more specific rules must be placed
+ before generalized ones, otherwise the generalized rules will catch
+ everything.</para>
+ <para>This is best demonstrated with an example. The following is
+ incorrect rule ordering:</para>
+ <programlisting><SPAN TYPE="MARKUP">
+ <BEGIN>[</BEGIN>
+ <END>]</END>
+</SPAN>
+
+<SPAN TYPE="KEYWORD1">
+ <BEGIN>[!</BEGIN>
+ <END>]</END>
+</SPAN></programlisting>
+ <para>If you write the above in a rule set, any occurrence of
+ <quote>[</quote> (even things like <quote>[!DEFINE</quote>, etc)
+ will be highlighted using the first rule, because it will be the
+ first to match. This is most likely not the intended
+ behavior.</para>
+ <para>The problem can be solved by placing the more specific rule
+ before the general one:</para>
+ <programlisting><SPAN TYPE="KEYWORD1">
+ <BEGIN>[!</BEGIN>
+ <END>]</END>
+</SPAN>
+
+<SPAN TYPE="MARKUP">
+ <BEGIN>[</BEGIN>
+ <END>]</END>
+</SPAN></programlisting>
+ <para>Now, if the buffer contains the text
+ <quote>[!SPECIAL]</quote>, the rules will be checked in order, and
+ the first rule will be the first to match. However, if you write
+ <quote>[FOO]</quote>, it will be highlighted using the second rule,
+ which is exactly what you would expect.</para>
+ </section>
+ <section>
+ <title>Per-Ruleset Properties</title>
+ <para>The <literal>PROPS</literal> tag (described in <xref
+ linkend="mode-tag-props" />) can also be placed inside the
+ <literal>RULES</literal> tag to define ruleset-specific properties.
+ The following properties can be set on a per-ruleset basis:</para>
+ <itemizedlist>
+ <listitem>
+ <para><literal>commentEnd</literal> - the comment end
+ string.</para>
+ </listitem>
+ <listitem>
+ <para><literal>commentStart</literal> - the comment start
+ string.</para>
+ </listitem>
+ <listitem>
+ <para><literal>lineComment</literal> - the line comment
+ string.</para>
+ </listitem>
+ </itemizedlist>
+ <para>This allows different parts of a file to have different
+ comment strings (in the case of HTML, for example, in HTML text and
+ inline JavaScript). For information about the commenting commands,
+ see <xref linkend="commenting" />.</para>
+ </section>
+ </section>
+ <section id="mode-rule-terminate">
+ <title>The TERMINATE Tag</title>
+ <para>The <literal>TERMINATE</literal> rule, which must be placed inside
+ a <literal>RULES</literal> tag, specifies that parsing should stop after
+ the specified number of characters have been read from a line. The
+ number of characters to terminate after should be specified with the
+ <literal>AT_CHAR</literal> attribute. Here is an example:</para>
+ <programlisting><TERMINATE AT_CHAR="1" /></programlisting>
+ <para>This rule is used in Patch mode, for example, because only the
+ first character of each line affects highlighting.</para>
+ </section>
+ <section id="mode-rule-span">
+ <title>The SPAN Tag</title>
+ <para>The <literal>SPAN</literal> rule, which must be placed inside a
+ <literal>RULES</literal> tag, highlights text between a start and end
+ string. The start and end strings are specified inside child elements of
+ the <literal>SPAN</literal> tag. The following attributes are
+ supported:</para>
+ <itemizedlist>
+ <listitem>
+ <para><literal>TYPE</literal> - The token type to highlight the
+ span with. See <xref linkend="mode-syntax-tokens" /> for a list
+ of token types.</para>
+ </listitem>
+ <listitem>
+ <para><literal>AT_LINE_START</literal> - If set to
+ <literal>TRUE</literal>, the span will only be highlighted if
+ the start sequence occurs at the beginning of a line.</para>
+ </listitem>
+ <listitem>
+ <para><literal>AT_WHITESPACE_END</literal> - If set to
+ <literal>TRUE</literal>, the span will only be highlighted if
+ the start sequence is the first non-whitespace text in the
+ line.</para>
+ </listitem>
+ <listitem>
+ <para><literal>AT_WORD_START</literal> - If set to
+ <literal>TRUE</literal>, the span will only be highlighted if
+ the start sequence occurs at the beginning of a word.</para>
+ </listitem>
+ <listitem>
+ <para><literal>DELEGATE</literal> - text inside the span will be
+ highlighted with the specified ruleset. To delegate to a ruleset
+ defined in the current mode, just specify its name. To delegate
+ to a ruleset defined in another mode, specify a name of the form
+ <literal><replaceable>mode</replaceable>::<replaceable>ruleset</replaceable></literal>.
+ Note that the first (unnamed) ruleset in a mode is called
+ <quote>MAIN</quote>.</para>
+ </listitem>
+ <listitem>
+ <para><literal>MATCH_TYPE</literal> - Controls how the start and
+ end of the sequence will be highlighted. See <xref
+ linkend="mode-match-type" /> for more information.</para>
+ </listitem>
+ <listitem>
+ <para><literal>ESCAPE</literal> - specifies a character sequence
+ for escaping characters. The first character following the escape
+ sequence is not considered as input for syntax highlighting,
+ thus being highlighted with rule's token.
+ </para>
+ </listitem>
+ <listitem>
+ <para><literal>NO_LINE_BREAK</literal> - If set to
+ <literal>TRUE</literal>, the span will not cross line
+ breaks.</para>
+ </listitem>
+ <listitem>
+ <para><literal>NO_WORD_BREAK</literal> - If set to
+ <literal>TRUE</literal>, the span will not cross word
+ breaks.</para>
+ </listitem>
+ </itemizedlist>
+ <para>Note that the <literal>AT_LINE_START</literal>,
+ <literal>AT_WHITESPACE_END</literal> and
+ <literal>AT_WORD_START</literal> attributes can also be used on the
+ <literal>BEGIN</literal> and <literal>END</literal> elements. Setting
+ these attributes to the same value on both elements has the same effect
+ as setting them on the <literal>SPAN</literal> element.</para>
+ <para>Here is a <literal>SPAN</literal> that highlights Java string
+ literals, which cannot include line breaks:</para>
+ <programlisting><SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">
+ <BEGIN>"</BEGIN>
+ <END>"</END>
+</SPAN></programlisting>
+ <para>Here is a <literal>SPAN</literal> that highlights Java
+ documentation comments by delegating to the <quote>JAVADOC</quote>
+ ruleset defined elsewhere in the current mode:</para>
+ <programlisting><SPAN TYPE="COMMENT2" DELEGATE="JAVADOC">
+ <BEGIN>/**</BEGIN>
+ <END>*/</END>
+</SPAN></programlisting>
+ <para>Here is a <literal>SPAN</literal> that highlights HTML cascading
+ stylesheets inside <literal><STYLE></literal> tags by delegating
+ to the main ruleset in the CSS edit mode:</para>
+ <programlisting><SPAN TYPE="MARKUP" DELEGATE="css::MAIN">
+ <BEGIN><style></BEGIN>
+ <END></style></END>
+</SPAN></programlisting>
+ </section>
+ <section id="mode-rule-span-regexp">
+ <title>The SPAN_REGEXP Tag</title>
+ <para>The <literal>SPAN_REGEXP</literal> rule is similar to the
+ <literal>SPAN</literal> rule except the start sequence is taken to be a
+ regular expression. In addition to the attributes supported by the
+ <literal>SPAN</literal> tag, the following attributes are
+ supported:</para>
+ <itemizedlist>
+ <listitem>
+ <para><literal>HASH_CHAR</literal> - a literal string which must
+ be at the start of a regular expression.</para>
+ </listitem>
+ <listitem>
+ <para><literal>HASH_CHARS</literal> - a list of possible literal
+ characters, one of which must match at the start of the regular
+ expression.</para>
+ </listitem>
+ </itemizedlist>
+ <para><literal>HASH_CHAR</literal> and <literal>HASH_CHARS</literal>
+ attributes are both optional, but you may only specify one, not both. If
+ both are specified, <literal>HASH_CHARS</literal> is ignored and an
+ error is shown. Whenever possible, use a literal prefix to specify a
+ <literal>SPAN_REGEXP</literal>. If the starting prefix is always the
+ same, use <literal>HASH_CHAR</literal> and provide as much prefix as
+ possible. Only in rare cases would you omit both attributes, such as the
+ case where there is no other reliable way to get the highlighting you
+ need, for example, with comments in the Cobol programming
+ language.</para>
+ <para>The regular expression match cannot span more than one line. Any
+ text matched by groups in the <literal>BEGIN</literal> regular
+ expression is substituted in the <literal>END</literal> string. See
+ below for an example of where this is useful.</para>
+ <para>Regular expression syntax is described in <xref
+ linkend="regexps" />.</para>
+ <para>Here is a <literal>SPAN_REGEXP</literal> rule that highlights
+ <quote>read-ins</quote> in shell scripts:</para>
+ <programlisting><SPAN_REGEXP HASH_CHAR="<" TYPE="LITERAL1" DELEGATE="LITERAL">
+ <BEGIN><![CDATA[<<[\p{Space}'"]*([\p{Alnum}_]+)[\p{Space}'"]*]]></BEGIN>
+ <END>$1</END>
+</SPAN_REGEXP></programlisting>
+ <para>Here is a <literal>SPAN_REGEXP</literal> rule that highlights
+ constructs placed between <literal><#ftl</literal> and
+ <literal>></literal>, as long as the <literal><#ftl</literal> is
+ followed by a word break:</para>
+ <programlisting><SPAN_REGEXP TYPE="KEYWORD1" HASH_CHAR="<" DELEGATE="EXPRESSION">
+ <BEGIN><#ftl\b</BEGIN>
+ <END>></END>
+</SPAN_REGEXP></programlisting>
+ </section>
+ <section id="mode-rule-eol-span">
+ <title>The EOL_SPAN Tag</title>
+ <para>An <literal>EOL_SPAN</literal> is similar to a
+ <literal>SPAN</literal> except that highlighting stops at the end of the
+ line, and no end sequence needs to be specified. The text to match is
+ specified between the opening and closing <literal>EOL_SPAN</literal>
+ tags. The following attributes are supported:</para>
+ <itemizedlist>
+ <listitem>
+ <para><literal>TYPE</literal> - The token type to highlight the
+ span with. See <xref linkend="mode-syntax-tokens" /> for a list
+ of token types.</para>
+ </listitem>
+ <listitem>
+ <para><literal>AT_LINE_START</literal> - If set to
+ <literal>TRUE</literal>, the span will only be highlighted if
+ the start sequence occurs at the beginning of a line.</para>
+ </listitem>
+ <listitem>
+ <para><literal>AT_WHITESPACE_END</literal> - If set to
+ <literal>TRUE</literal>, the span will only be highlighted if
+ the sequence is the first non-whitespace text in the
+ line.</para>
+ </listitem>
+ <listitem>
+ <para><literal>AT_WORD_START</literal> - If set to
+ <literal>TRUE</literal>, the span will only be highlighted if
+ the start sequence occurs at the beginning of a word.</para>
+ </listitem>
+ <listitem>
+ <para><literal>DELEGATE</literal> - text inside the span will be
+ highlighted with the specified ruleset. To delegate to a ruleset
+ defined in the current mode, just specify its name. To delegate
+ to a ruleset defined in another mode, specify a name of the form
+ <literal><replaceable>mode</replaceable>::<replaceable>ruleset</replaceable></literal>.
+ Note that the first (unnamed) ruleset in a mode is called
+ <quote>MAIN</quote>.</para>
+ </listitem>
+ <listitem>
+ <para><literal>MATCH_TYPE</literal> - Controls how the start of
+ the sequence will be highlighted. See <xref
+ linkend="mode-match-type" /> for more information.</para>
+ </listitem>
+ </itemizedlist>
+ <para>Here is an <literal>EOL_SPAN</literal> that highlights C++
+ comments:</para>
+ <programlisting><EOL_SPAN TYPE="COMMENT1">//</EOL_SPAN></programlisting>
+ </section>
+ <section id="mode-rule-eol-span-regexp">
+ <title>The EOL_SPAN_REGEXP Tag</title>
+ <para>The <literal>EOL_SPAN_REGEXP</literal> rule is similar to the
+ <literal>EOL_SPAN</literal> rule except the match sequence is taken to
+ be a regular expression. In addition to the attributes supported by the
+ <literal>EOL_SPAN</literal> tag, the following attributes are
+ supported:</para>
+ <itemizedlist>
+ <listitem>
+ <para><literal>HASH_CHAR</literal> - a literal string which must
+ be at the start of a regular expression.</para>
+ </listitem>
+ <listitem>
+ <para><literal>HASH_CHARS</literal> - a list of possible literal
+ characters, one of which must match at the start of the regular
+ expression.</para>
+ </listitem>
+ </itemizedlist>
+ <para><literal>HASH_CHAR</literal> and <literal>HASH_CHARS</literal>
+ attributes are both optional, but you may only specify one, not both. If
+ both are specified, <literal>HASH_CHARS</literal> is ignored and an
+ error is shown. Whenever possible, use a literal prefix to specify a
+ <literal>EOL_SPAN_REGEXP</literal>. If the starting prefix is always the
+ same, use <literal>HASH_CHAR</literal> and provide as much prefix as
+ possible. Only in rare cases would you omit both attributes, such as the
+ case where there is no other reliable way to get the highlighting you
+ need, for example, with comments in the Cobol programming
+ language.</para>
+ <para>The regular expression match cannot span more than one
+ line.</para>
+ <para>Regular expression syntax is described in <xref
+ linkend="regexps" />.</para>
+ <para>Here is an <literal>EOL_SPAN_REGEXP</literal> that highlights
+ MS-DOS batch file comments, which start with <literal>REM</literal>,
+ followed by any whitespace character, and extend until the end of the
+ line:</para>
+ <programlisting><EOL_SPAN_REGEXP AT_WHITESPACE_END="TRUE" HASH_CHAR="REM" TYPE="COMMENT1">REM\s</EOL_SPAN_REGEXP></programlisting>
+ </section>
+ <section id="mode-rule-mark-prev">
+ <title>The MARK_PREVIOUS Tag</title>
+ <para>The <literal>MARK_PREVIOUS</literal> rule, which must be placed
+ inside a <literal>RULES</literal> tag, highlights from the end of the
+ previous syntax token to the matched text. The text to match is
+ specified between opening and closing <literal>MARK_PREVIOUS</literal>
+ tags. The following attributes are supported:</para>
+ <itemizedlist>
+ <listitem>
+ <para><literal>TYPE</literal> - The token type to highlight the
+ text with. See <xref linkend="mode-syntax-tokens" /> for a list
+ of token types.</para>
+ </listitem>
+ <listitem>
+ <para><literal>AT_LINE_START</literal> - If set to
+ <literal>TRUE</literal>, the sequence will only be highlighted
+ if it occurs at the beginning of a line.</para>
+ </listitem>
+ <listitem>
+ <para><literal>AT_WHITESPACE_END</literal> - If set to
+ <literal>TRUE</literal>, the sequence will only be highlighted
+ if it is the first non-whitespace text in the line.</para>
+ </listitem>
+ <listitem>
+ <para><literal>AT_WORD_START</literal> - If set to
+ <literal>TRUE</literal>, the sequence will only be highlighted
+ if it occurs at the beginning of a word.</para>
+ </listitem>
+ <listitem>
+ <para><literal>MATCH_TYPE</literal> - Controls how the matched
+ region will be highlighted. See <xref
+ linkend="mode-match-type" /> for more information.</para>
+ </listitem>
+ </itemizedlist>
+ <para>Here is a rule that highlights labels in Java mode (for example,
+ <quote>XXX:</quote>):</para>
+ <programlisting><MARK_PREVIOUS AT_WHITESPACE_END="TRUE"
+ MATCH_TYPE="DEFAULT">:</MARK_PREVIOUS></programlisting>
+ </section>
+ <section id="mode-rule-mark-following">
+ <title>The MARK_FOLLOWING Tag</title>
+ <para>The <literal>MARK_FOLLOWING</literal> rule, which must be placed
+ inside a <literal>RULES</literal> tag, highlights from the start of the
+ match to the next syntax token. The text to match is specified between
+ opening and closing <literal>MARK_FOLLOWING</literal> tags. The
+ following attributes are supported:</para>
+ <itemizedlist>
+ <listitem>
+ <para><literal>TYPE</literal> - The token type to highlight the
+ text with. See <xref linkend="mode-syntax-tokens" /> for a list
+ of token types.</para>
+ </listitem>
+ <listitem>
+ <para><literal>AT_LINE_START</literal> - If set to
+ <literal>TRUE</literal>, the sequence will only be highlighted
+ if it occurs at the beginning of a line.</para>
+ </listitem>
+ <listitem>
+ <para><literal>AT_WHITESPACE_END</literal> - If set to
+ <literal>TRUE</literal>, the sequence will only be highlighted
+ if it is the first non-whitespace text in the line.</para>
+ </listitem>
+ <listitem>
+ <para><literal>AT_WORD_START</literal> - If set to
+ <literal>TRUE</literal>, the sequence will only be highlighted
+ if it occurs at the beginning of a word.</para>
+ </listitem>
+ <listitem>
+ <para><literal>MATCH_TYPE</literal> - Controls how the matched
+ region will be highlighted. See <xref
+ linkend="mode-match-type" /> for more information.</para>
+ </listitem>
+ </itemizedlist>
+ <para>Here is a rule that highlights variables in Unix shell scripts
+ (<quote>$CLASSPATH</quote>, <quote>$IFS</quote>, etc):</para>
+ <programlisting><MARK_FOLLOWING TYPE="KEYWORD2">$</MARK_FOLLOWING></programlisting>
+ </section>
+ <section id="mode-rule-seq">
+ <title>The SEQ Tag</title>
+ <para>The <literal>SEQ</literal> rule, which must be placed inside a
+ <literal>RULES</literal> tag, highlights fixed sequences of text. The
+ text to highlight is specified between opening and closing
+ <literal>SEQ</literal> tags. The following attributes are
+ supported:</para>
+ <itemizedlist>
+ <listitem>
+ <para><literal>TYPE</literal> - the token type to highlight the
+ sequence with. See <xref linkend="mode-syntax-tokens" /> for a
+ list of token types.</para>
+ </listitem>
+ <listitem>
+ <para><literal>AT_LINE_START</literal> - If set to
+ <literal>TRUE</literal>, the sequence will only be highlighted
+ if it occurs at the beginning of a line.</para>
+ </listitem>
+ <listitem>
+ <para><literal>AT_WHITESPACE_END</literal> - If set to
+ <literal>TRUE</literal>, the sequence will only be highlighted
+ if it is the first non-whitespace text in the line.</para>
+ </listitem>
+ <listitem>
+ <para><literal>AT_WORD_START</literal> - If set to
+ <literal>TRUE</literal>, the sequence will only be highlighted
+ if it occurs at the beginning of a word.</para>
+ </listitem>
+ <listitem>
+ <para><literal>DELEGATE</literal> - if this attribute is
+ specified, all text after the sequence will be highlighted using
+ this ruleset. To delegate to a ruleset defined in the current
+ mode, just specify its name. To delegate to a ruleset defined in
+ another mode, specify a name of the form
+ <literal><replaceable>mode</replaceable>::<replaceable>ruleset</replaceable></literal>.
+ Note that the first (unnamed) ruleset in a mode is called
+ <quote>MAIN</quote>.</para>
+ </listitem>
+ </itemizedlist>
+ <para>The following rules highlight a few Java operators:</para>
+ <programlisting><SEQ TYPE="OPERATOR">+</SEQ>
+<SEQ TYPE="OPERATOR">-</SEQ>
+<SEQ TYPE="OPERATOR">*</SEQ>
+<SEQ TYPE="OPERATOR">/</SEQ></programlisting>
+ </section>
+ <section id="mode-rule-seq-regexp">
+ <title>The SEQ_REGEXP Tag</title>
+ <para>The <literal>SEQ_REGEXP</literal> rule is similar to the
+ <literal>SEQ</literal> rule except the match sequence is taken to be a
+ regular expression. In addition to the attributes supported by the
+ <literal>SEQ</literal> tag, the following attributes are
+ supported:</para>
+ <itemizedlist>
+ <listitem>
+ <para><literal>HASH_CHAR</literal> - a literal string which must
+ be at the start of a regular expression.</para>
+ </listitem>
+ <listitem>
+ <para><literal>HASH_CHARS</literal> - a list of possible literal
+ characters, one of which must match at the start of the regular
+ expression.</para>
+ </listitem>
+ </itemizedlist>
+ <para><literal>HASH_CHAR</literal> and <literal>HASH_CHARS</literal>
+ attributes are both optional, but you may only specify one, not both. If
+ both are specified, <literal>HASH_CHARS</literal> is ignored and an
+ error is shown. Whenever possible, use a literal prefix to specify a
+ <literal>SEQ_REGEXP</literal>. If the starting prefix is always the
+ same, use <literal>HASH_CHAR</literal> and provide as much prefix as
+ possible. Only in rare cases would you omit both attributes, such as the
+ case where there is no other reliable way to get the highlighting you
+ need, for example, with comments in the Cobol programming
+ language.</para>
+ <para>The regular expression match cannot span more than one
+ line.</para>
+ <para>Regular expression syntax is described in <xref
+ linkend="regexps" />.</para>
+ <para><emphasis role="bold">NOTE</emphasis>: c-style character escaping
+ for literals (such as the tab char: \t) do not work as attribute values
+ in XML. Use the XML character entity instead. For example: 	
+ instead of \t.</para>
+ <para>Here is a <literal>SEQ_REGEXP</literal> rule from moin.xml that
+ uses the <literal>HASH_CHARS</literal> attribute, to describe a keyword
+ (wikiword) that can start with any uppercase letter and contain lower
+ case letters and at least one uppercase letter in the middle.</para>
+ <programlisting>
+ <SEQ_REGEXP HASH_CHARS="ABCDEFGHIJKLMNOPQRSTUVWXYZ" AT_WORD_START="TRUE" TYPE="KEYWORD2">[A-Z][a-z]+[A-Z][a-zA-Z]+</SEQ_REGEXP>
+ </programlisting>
+ </section>
+ <section id="mode-rule-import">
+ <title>The IMPORT Tag</title>
+ <para>The <literal>IMPORT</literal> tag, which must be placed inside a
+ <literal>RULES</literal> tag, loads all rules defined in a given ruleset
+ into the current ruleset; in other words, it has the same effect as
+ copying and pasting the imported ruleset.</para>
+ <para>The only required attribute <literal>DELEGATE</literal> must be
+ set to the name of a ruleset. To import a ruleset defined in the current
+ mode, just specify its name. To import a ruleset defined in another
+ mode, specify a name of the form
+ <literal><replaceable>mode</replaceable>::<replaceable>ruleset</replaceable></literal>.
+ Note that the first (unnamed) ruleset in a mode is called
+ <quote>MAIN</quote>.</para>
+ <para>One quirk is that the definition of the imported ruleset is not
+ copied to the location of the <literal>IMPORT</literal> tag, but rather
+ to the end of the containing ruleset. This has implications with
+ rule-ordering; see <xref linkend="rule-ordering" />.</para>
+ <para>Here is an example from the PHP mode, which extends the inline
+ JavaScript highlighting to support embedded PHP:</para>
+ <programlisting>
+ <RULES SET="JAVASCRIPT+PHP">
+
+ <SPAN TYPE="MARKUP" DELEGATE="php::PHP">
+ <BEGIN><?php</BEGIN>
+ <END>?></END>
+ </SPAN>
+
+ <SPAN TYPE="MARKUP" DELEGATE="php::PHP">
+ <BEGIN><?</BEGIN>
+ <END>?></END>
+ </SPAN>
+
+ <SPAN TYPE="MARKUP" DELEGATE="php::PHP">
+ <BEGIN><%=</BEGIN>
+ <END>%></END>
+ </SPAN>
+
+ <IMPORT DELEGATE="javascript::MAIN"/>
+</RULES></programlisting>
+ </section>
+ <section id="mode-rule-keywords">
+ <title>The KEYWORDS Tag</title>
+ <para>The <literal>KEYWORDS</literal> tag, which must be placed inside a
+ <literal>RULES</literal> tag and can only appear once, specifies a list
+ of keywords to highlight. Keywords are similar to
+ <literal>SEQ</literal>s, except that <literal>SEQ</literal>s match
+ anywhere in the text, whereas keywords only match whole words. Words are
+ considered to be runs of text separated by non-alphanumeric
+ characters.</para>
+ <para>The <literal>KEYWORDS</literal> tag does not define any
+ attributes.</para>
+ <para>Each child element of the <literal>KEYWORDS</literal> tag is an
+ element whose name is a token type, and whose content is the keyword to
+ highlight. For example, the following rule highlights the most common
+ Java keywords:</para>
+ <programlisting><KEYWORDS>
+ <KEYWORD1>if</KEYWORD1>
+ <KEYWORD1>else</KEYWORD1>
+ <KEYWORD3>int</KEYWORD3>
+ <KEYWORD3>void</KEYWORD3>
+</KEYWORDS></programlisting>
+ </section>
+ <section id="mode-syntax-tokens">
+ <title>Token Types</title>
+ <para>Parser rules can highlight tokens using any of the following token
+ types:</para>
+ <itemizedlist>
+ <listitem>
+ <para><literal>NULL</literal> - no special highlighting is
+ performed on tokens of type <literal>NULL</literal></para>
+ </listitem>
+ <listitem>
+ <para><literal>COMMENT1</literal></para>
+ </listitem>
+ <listitem>
+ <para><literal>COMMENT2</literal></para>
+ </listitem>
+ <listitem>
+ <para><literal>COMMENT3</literal></para>
+ </listitem>
+ <listitem>
+ <para><literal>COMMENT4</literal></para>
+ </listitem>
+ <listitem>
+ <para><literal>FUNCTION</literal></para>
+ </listitem>
+ <listitem>
+ <para><literal>DIGIT</literal></para>
+ </listitem>
+ <listitem>
+ <para><literal>INVALID</literal><!-- - tokens of this type are
+ automatically added if a <literal>NO_WORD_BREAK</literal> or
+ <literal>NO_LINE_BREAK</literal> <literal>SPAN</literal> spans more than
+ one word or line, respectively. --></para>
+ </listitem>
+ <listitem>
+ <para><literal>KEYWORD1</literal></para>
+ </listitem>
+ <listitem>
+ <para><literal>KEYWORD2</literal></para>
+ </listitem>
+ <listitem>
+ <para><literal>KEYWORD3</literal></para>
+ </listitem>
+ <listitem>
+ <para><literal>KEYWORD4</literal></para>
+ </listitem>
+ <listitem>
+ <para><literal>LABEL</literal></para>
+ </listitem>
+ <listitem>
+ <para><literal>LITERAL1</literal></para>
+ </listitem>
+ <listitem>
+ <para><literal>LITERAL2</literal></para>
+ </listitem>
+ <listitem>
+ <para><literal>LITERAL3</literal></para>
+ </listitem>
+ <listitem>
+ <para><literal>LITERAL4</literal></para>
+ </listitem>
+ <listitem>
+ <para><literal>MARKUP</literal></para>
+ </listitem>
+ <listitem>
+ <para><literal>OPERATOR</literal></para>
+ </listitem>
+ </itemizedlist>
+ </section>
+ <section id="mode-match-type">
+ <title>The MATCH_TYPE Attribute</title>
+ <para>The <literal>MATCH_TYPE</literal> attribute is used by some of the
+ rules to control how the region matched by the rule will be
+ highlighted.</para>
+ <para>For example, when using a <literal>MARK_PREVIOUS</literal> rule to
+ highlight a function call of the form <literal>fcall()</literal>, the
+ following rule could be used:</para>
+ <programlisting>
+ <MARK_PREVIOUS TYPE="FUNCTION" MATCH_TYPE="OPERATOR">(</MARK_PREVIOUS></programlisting>
+ <para>This would cause <literal>fcall</literal> to be highlighted as
+ <literal>FUNCTION</literal>, and <literal>(</literal> to be highlighted
+ as <literal>OPERATOR</literal>. In this case, to maintain bracket
+ matching working, a <literal>SEQ</literal> rule would have to be added
+ to match <literal>)</literal> and mark it as
+ <literal>OPERATOR</literal>.</para>
+ <para>The <literal>MATCH_TYPE</literal> attribute value can be any of
+ the valid token types, or the following special values:</para>
+ <itemizedlist>
+ <listitem>
+ <para><literal>RULE</literal>: this is the default value. It
+ tells the syntax system to use the same token type as the TYPE
+ attribute of the rule. This is equivalent to
+ <literal>EXCLUDE_MATCH="FALSE"</literal> in 4.2 and earlier mode
+ files.</para>
+ </listitem>
+ <listitem>
+ <para><literal>CONTEXT</literal>: using this value tells the
+ syntax system to mark the matched region using the default token
+ type for the current rule set. In 4.2 and earlier mode files,
+ this was specified by
+ <literal>EXCLUDE_MATCH="TRUE"</literal>.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
</chapter>
\ No newline at end of file
diff --git a/jEdit/doc/welcome.html b/jEdit/doc/welcome.html
index 78100e1..1abe7a2 100644
--- a/jEdit/doc/welcome.html
+++ b/jEdit/doc/welcome.html
@@ -1,29 +1,29 @@
-<html>
-<head><title>Welcome to jEdit</title></head>
-<body>
-
-<center>
-<img src="jedit.png" width="128" height="128">
-<h2>Welcome to jEdit 4.3</h2>
-</center>
-<p> Useful menu commands: </p>
-<ul>
-<li>To customize jEdit: <b>Utilities</b>><b>Global Options</b> (be sure to check out the Shortcuts pane!)</li>
-<li>To install plugins: <b>Plugins</b>><b>Plugin Manager</b></li>
-<li>To customize plugins: <b>Plugins</b>><b>Plugin Options</b></li>
-<li>To open this window: <b>Help</b>><b>jEdit Help</b></li>
-</ul>
-
-<p>jEdit is free software, and you are welcome to redistribute and modify it
-under certain conditions. See the license section of the
-<a href="README.txt">read me file</a> for details.</p>
-
-<p>If you think you have found a bug, please consult the
-<a href="FAQ/index.html">Frequently Asked Questions</a> document first.</p>
-
-<p>To give feedback, subscribe to mailing lists or find out
-about the latest developments in the world of jEdit, visit
-<font color=blue>www.jedit.org</font>.</p>
-
-</body>
-</html>
+<html>
+<head><title>Welcome to jEdit</title></head>
+<body>
+
+<center>
+<img src="jedit.png" width="128" height="128">
+<h2>Welcome to jEdit 4.4</h2>
+</center>
+<p> Useful menu commands: </p>
+<ul>
+<li>To customize jEdit: <b>Utilities</b>><b>Global Options</b> (be sure to check out the Shortcuts pane!)</li>
+<li>To install plugins: <b>Plugins</b>><b>Plugin Manager</b></li>
+<li>To customize plugins: <b>Plugins</b>><b>Plugin Options</b></li>
+<li>To open this window: <b>Help</b>><b>jEdit Help</b></li>
+</ul>
+
+<p>jEdit is free software, and you are welcome to redistribute and modify it
+under certain conditions. See the license section of the
+<a href="README.txt">read me file</a> for details.</p>
+
+<p>If you think you have found a bug, please consult the
+<a href="FAQ/index.html">Frequently Asked Questions</a> document first.</p>
+
+<p>To give feedback, subscribe to mailing lists or find out
+about the latest developments in the world of jEdit, visit
+<font color=blue>www.jedit.org</font>.</p>
+
+</body>
+</html>
diff --git a/jEdit/doclet/GenerateTocXML.java b/jEdit/doclet/GenerateTocXML.java
index d4eae22..33f5c58 100644
--- a/jEdit/doclet/GenerateTocXML.java
+++ b/jEdit/doclet/GenerateTocXML.java
@@ -1,116 +1,116 @@
-/*
- * GenerateTocXML.java
- * Copyright (C) 1999, 2003 Slava Pestov
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-package doclet;
-
-import com.sun.javadoc.*;
-import com.sun.tools.doclets.standard.Standard;
-
-import java.io.*;
-import java.util.Arrays;
-
-public class GenerateTocXML
-{
- public static final String OUT = "toc.xml";
- public static final String HEADER = "<?xml version='1.0'?>\n<TOC>\n"
- + "<ENTRY HREF='overview-summary.html'><TITLE>jEdit API Reference</TITLE>";
- public static final String FOOTER = "</ENTRY></TOC>\n";
-
- public static boolean start(RootDoc root)
- {
- if (!Standard.start(root))
- {
- return false;
- }
- try
- {
- FileWriter out = new FileWriter(Standard.htmlDoclet.configuration().destDirName + OUT);
- out.write(HEADER);
-
- PackageDoc[] packages = root.specifiedPackages();
- for(int i = 0; i < packages.length; ++i)
- {
- processPackage(out,packages[i]);
- }
-
- out.write(FOOTER);
- out.close();
-
- return true;
- }
- catch(IOException e)
- {
- e.printStackTrace();
- return false;
- }
- }
-
- public static int optionLength(String option)
- {
- return Standard.optionLength(option);
- }
-
- public static boolean validOptions(String[][] options, DocErrorReporter reporter)
- {
- return Standard.validOptions(options,reporter);
- }
-
- public static LanguageVersion languageVersion()
- {
- return Standard.languageVersion();
- }
-
- private static void processPackage(Writer out, PackageDoc pkg)
- throws IOException
- {
- out.write("<ENTRY HREF='");
- String pkgPath = pkg.name().replace('.','/') + "/";
- out.write(pkgPath);
- out.write("package-summary.html'><TITLE>");
- out.write(pkg.name());
- out.write("</TITLE>\n");
-
- ClassDoc[] classes = pkg.allClasses();
- String[] classNames = new String[classes.length];
- for(int i = 0; i < classes.length; i++)
- {
- classNames[i] = classes[i].name();
- }
- Arrays.sort(classNames);
-
- for(int i = 0; i < classes.length; i++)
- {
- processClass(out,pkgPath,classNames[i]);
- }
-
- out.write("</ENTRY>");
- }
-
- private static void processClass(Writer out, String pkgPath, String clazz)
- throws IOException
- {
- out.write("<ENTRY HREF='");
- out.write(pkgPath);
- out.write(clazz);
- out.write(".html'><TITLE>");
- out.write(clazz);
- out.write("</TITLE>\n");
- out.write("</ENTRY>");
- }
-}
+/*
+ * GenerateTocXML.java
+ * Copyright (C) 1999, 2003 Slava Pestov
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+package doclet;
+
+import com.sun.javadoc.*;
+import com.sun.tools.doclets.standard.Standard;
+
+import java.io.*;
+import java.util.Arrays;
+
+public class GenerateTocXML
+{
+ public static final String OUT = "toc.xml";
+ public static final String HEADER = "<?xml version='1.0'?>\n<TOC>\n"
+ + "<ENTRY HREF='overview-summary.html'><TITLE>jEdit API Reference</TITLE>";
+ public static final String FOOTER = "</ENTRY></TOC>\n";
+
+ public static boolean start(RootDoc root)
+ {
+ if (!Standard.start(root))
+ {
+ return false;
+ }
+ try
+ {
+ FileWriter out = new FileWriter(Standard.htmlDoclet.configuration().destDirName + OUT);
+ out.write(HEADER);
+
+ PackageDoc[] packages = root.specifiedPackages();
+ for(int i = 0; i < packages.length; ++i)
+ {
+ processPackage(out,packages[i]);
+ }
+
+ out.write(FOOTER);
+ out.close();
+
+ return true;
+ }
+ catch(IOException e)
+ {
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ public static int optionLength(String option)
+ {
+ return Standard.optionLength(option);
+ }
+
+ public static boolean validOptions(String[][] options, DocErrorReporter reporter)
+ {
+ return Standard.validOptions(options,reporter);
+ }
+
+ public static LanguageVersion languageVersion()
+ {
+ return Standard.languageVersion();
+ }
+
+ private static void processPackage(Writer out, PackageDoc pkg)
+ throws IOException
+ {
+ out.write("<ENTRY HREF='");
+ String pkgPath = pkg.name().replace('.','/') + "/";
+ out.write(pkgPath);
+ out.write("package-summary.html'><TITLE>");
+ out.write(pkg.name());
+ out.write("</TITLE>\n");
+
+ ClassDoc[] classes = pkg.allClasses();
+ String[] classNames = new String[classes.length];
+ for(int i = 0; i < classes.length; i++)
+ {
+ classNames[i] = classes[i].name();
+ }
+ Arrays.sort(classNames);
+
+ for(int i = 0; i < classes.length; i++)
+ {
+ processClass(out,pkgPath,classNames[i]);
+ }
+
+ out.write("</ENTRY>");
+ }
+
+ private static void processClass(Writer out, String pkgPath, String clazz)
+ throws IOException
+ {
+ out.write("<ENTRY HREF='");
+ out.write(pkgPath);
+ out.write(clazz);
+ out.write(".html'><TITLE>");
+ out.write(clazz);
+ out.write("</TITLE>\n");
+ out.write("</ENTRY>");
+ }
+}
diff --git a/jEdit/installer/BZip2Constants.java b/jEdit/installer/BZip2Constants.java
index 2b53f55..7836c67 100644
--- a/jEdit/installer/BZip2Constants.java
+++ b/jEdit/installer/BZip2Constants.java
@@ -1,84 +1,84 @@
-/*
- * Copyright (C) The Apache Software Foundation. All rights reserved.
- *
- * This software is published under the terms of the Apache Software License
- * version 1.1, a copy of which has been included with this distribution in
- * the LICENSE.txt file.
- */
-package installer;
-
-/**
- * Base class for both the compress and decompress classes. Holds common arrays,
- * and static data.
- *
- * @author <a href="mailto:keiron at aftexsw.com">Keiron Liddle</a>
- */
-interface BZip2Constants
-{
- int BASE_BLOCK_SIZE = 100000;
- int MAX_ALPHA_SIZE = 258;
- int MAX_CODE_LEN = 23;
- int RUNA = 0;
- int RUNB = 1;
- int N_GROUPS = 6;
- int G_SIZE = 50;
- int N_ITERS = 4;
- int MAX_SELECTORS = ( 2 + ( 900000 / G_SIZE ) );
- int NUM_OVERSHOOT_BYTES = 20;
-
- int[] RAND_NUMS = new int[]
- {
- 619, 720, 127, 481, 931, 816, 813, 233, 566, 247,
- 985, 724, 205, 454, 863, 491, 741, 242, 949, 214,
- 733, 859, 335, 708, 621, 574, 73, 654, 730, 472,
- 419, 436, 278, 496, 867, 210, 399, 680, 480, 51,
- 878, 465, 811, 169, 869, 675, 611, 697, 867, 561,
- 862, 687, 507, 283, 482, 129, 807, 591, 733, 623,
- 150, 238, 59, 379, 684, 877, 625, 169, 643, 105,
- 170, 607, 520, 932, 727, 476, 693, 425, 174, 647,
- 73, 122, 335, 530, 442, 853, 695, 249, 445, 515,
- 909, 545, 703, 919, 874, 474, 882, 500, 594, 612,
- 641, 801, 220, 162, 819, 984, 589, 513, 495, 799,
- 161, 604, 958, 533, 221, 400, 386, 867, 600, 782,
- 382, 596, 414, 171, 516, 375, 682, 485, 911, 276,
- 98, 553, 163, 354, 666, 933, 424, 341, 533, 870,
- 227, 730, 475, 186, 263, 647, 537, 686, 600, 224,
- 469, 68, 770, 919, 190, 373, 294, 822, 808, 206,
- 184, 943, 795, 384, 383, 461, 404, 758, 839, 887,
- 715, 67, 618, 276, 204, 918, 873, 777, 604, 560,
- 951, 160, 578, 722, 79, 804, 96, 409, 713, 940,
- 652, 934, 970, 447, 318, 353, 859, 672, 112, 785,
- 645, 863, 803, 350, 139, 93, 354, 99, 820, 908,
- 609, 772, 154, 274, 580, 184, 79, 626, 630, 742,
- 653, 282, 762, 623, 680, 81, 927, 626, 789, 125,
- 411, 521, 938, 300, 821, 78, 343, 175, 128, 250,
- 170, 774, 972, 275, 999, 639, 495, 78, 352, 126,
- 857, 956, 358, 619, 580, 124, 737, 594, 701, 612,
- 669, 112, 134, 694, 363, 992, 809, 743, 168, 974,
- 944, 375, 748, 52, 600, 747, 642, 182, 862, 81,
- 344, 805, 988, 739, 511, 655, 814, 334, 249, 515,
- 897, 955, 664, 981, 649, 113, 974, 459, 893, 228,
- 433, 837, 553, 268, 926, 240, 102, 654, 459, 51,
- 686, 754, 806, 760, 493, 403, 415, 394, 687, 700,
- 946, 670, 656, 610, 738, 392, 760, 799, 887, 653,
- 978, 321, 576, 617, 626, 502, 894, 679, 243, 440,
- 680, 879, 194, 572, 640, 724, 926, 56, 204, 700,
- 707, 151, 457, 449, 797, 195, 791, 558, 945, 679,
- 297, 59, 87, 824, 713, 663, 412, 693, 342, 606,
- 134, 108, 571, 364, 631, 212, 174, 643, 304, 329,
- 343, 97, 430, 751, 497, 314, 983, 374, 822, 928,
- 140, 206, 73, 263, 980, 736, 876, 478, 430, 305,
- 170, 514, 364, 692, 829, 82, 855, 953, 676, 246,
- 369, 970, 294, 750, 807, 827, 150, 790, 288, 923,
- 804, 378, 215, 828, 592, 281, 565, 555, 710, 82,
- 896, 831, 547, 261, 524, 462, 293, 465, 502, 56,
- 661, 821, 976, 991, 658, 869, 905, 758, 745, 193,
- 768, 550, 608, 933, 378, 286, 215, 979, 792, 961,
- 61, 688, 793, 644, 986, 403, 106, 366, 905, 644,
- 372, 567, 466, 434, 645, 210, 389, 550, 919, 135,
- 780, 773, 635, 389, 707, 100, 626, 958, 165, 504,
- 920, 176, 193, 713, 857, 265, 203, 50, 668, 108,
- 645, 990, 626, 197, 510, 357, 358, 850, 858, 364,
- 936, 638
- };
-}
+/*
+ * Copyright (C) The Apache Software Foundation. All rights reserved.
+ *
+ * This software is published under the terms of the Apache Software License
+ * version 1.1, a copy of which has been included with this distribution in
+ * the LICENSE.txt file.
+ */
+package installer;
+
+/**
+ * Base class for both the compress and decompress classes. Holds common arrays,
+ * and static data.
+ *
+ * @author <a href="mailto:keiron at aftexsw.com">Keiron Liddle</a>
+ */
+interface BZip2Constants
+{
+ int BASE_BLOCK_SIZE = 100000;
+ int MAX_ALPHA_SIZE = 258;
+ int MAX_CODE_LEN = 23;
+ int RUNA = 0;
+ int RUNB = 1;
+ int N_GROUPS = 6;
+ int G_SIZE = 50;
+ int N_ITERS = 4;
+ int MAX_SELECTORS = ( 2 + ( 900000 / G_SIZE ) );
+ int NUM_OVERSHOOT_BYTES = 20;
+
+ int[] RAND_NUMS = new int[]
+ {
+ 619, 720, 127, 481, 931, 816, 813, 233, 566, 247,
+ 985, 724, 205, 454, 863, 491, 741, 242, 949, 214,
+ 733, 859, 335, 708, 621, 574, 73, 654, 730, 472,
+ 419, 436, 278, 496, 867, 210, 399, 680, 480, 51,
+ 878, 465, 811, 169, 869, 675, 611, 697, 867, 561,
+ 862, 687, 507, 283, 482, 129, 807, 591, 733, 623,
+ 150, 238, 59, 379, 684, 877, 625, 169, 643, 105,
+ 170, 607, 520, 932, 727, 476, 693, 425, 174, 647,
+ 73, 122, 335, 530, 442, 853, 695, 249, 445, 515,
+ 909, 545, 703, 919, 874, 474, 882, 500, 594, 612,
+ 641, 801, 220, 162, 819, 984, 589, 513, 495, 799,
+ 161, 604, 958, 533, 221, 400, 386, 867, 600, 782,
+ 382, 596, 414, 171, 516, 375, 682, 485, 911, 276,
+ 98, 553, 163, 354, 666, 933, 424, 341, 533, 870,
+ 227, 730, 475, 186, 263, 647, 537, 686, 600, 224,
+ 469, 68, 770, 919, 190, 373, 294, 822, 808, 206,
+ 184, 943, 795, 384, 383, 461, 404, 758, 839, 887,
+ 715, 67, 618, 276, 204, 918, 873, 777, 604, 560,
+ 951, 160, 578, 722, 79, 804, 96, 409, 713, 940,
+ 652, 934, 970, 447, 318, 353, 859, 672, 112, 785,
+ 645, 863, 803, 350, 139, 93, 354, 99, 820, 908,
+ 609, 772, 154, 274, 580, 184, 79, 626, 630, 742,
+ 653, 282, 762, 623, 680, 81, 927, 626, 789, 125,
+ 411, 521, 938, 300, 821, 78, 343, 175, 128, 250,
+ 170, 774, 972, 275, 999, 639, 495, 78, 352, 126,
+ 857, 956, 358, 619, 580, 124, 737, 594, 701, 612,
+ 669, 112, 134, 694, 363, 992, 809, 743, 168, 974,
+ 944, 375, 748, 52, 600, 747, 642, 182, 862, 81,
+ 344, 805, 988, 739, 511, 655, 814, 334, 249, 515,
+ 897, 955, 664, 981, 649, 113, 974, 459, 893, 228,
+ 433, 837, 553, 268, 926, 240, 102, 654, 459, 51,
+ 686, 754, 806, 760, 493, 403, 415, 394, 687, 700,
+ 946, 670, 656, 610, 738, 392, 760, 799, 887, 653,
+ 978, 321, 576, 617, 626, 502, 894, 679, 243, 440,
+ 680, 879, 194, 572, 640, 724, 926, 56, 204, 700,
+ 707, 151, 457, 449, 797, 195, 791, 558, 945, 679,
+ 297, 59, 87, 824, 713, 663, 412, 693, 342, 606,
+ 134, 108, 571, 364, 631, 212, 174, 643, 304, 329,
+ 343, 97, 430, 751, 497, 314, 983, 374, 822, 928,
+ 140, 206, 73, 263, 980, 736, 876, 478, 430, 305,
+ 170, 514, 364, 692, 829, 82, 855, 953, 676, 246,
+ 369, 970, 294, 750, 807, 827, 150, 790, 288, 923,
+ 804, 378, 215, 828, 592, 281, 565, 555, 710, 82,
+ 896, 831, 547, 261, 524, 462, 293, 465, 502, 56,
+ 661, 821, 976, 991, 658, 869, 905, 758, 745, 193,
+ 768, 550, 608, 933, 378, 286, 215, 979, 792, 961,
+ 61, 688, 793, 644, 986, 403, 106, 366, 905, 644,
+ 372, 567, 466, 434, 645, 210, 389, 550, 919, 135,
+ 780, 773, 635, 389, 707, 100, 626, 958, 165, 504,
+ 920, 176, 193, 713, 857, 265, 203, 50, 668, 108,
+ 645, 990, 626, 197, 510, 357, 358, 850, 858, 364,
+ 936, 638
+ };
+}
diff --git a/jEdit/installer/CBZip2InputStream.java b/jEdit/installer/CBZip2InputStream.java
index 3f4efef..c57b047 100644
--- a/jEdit/installer/CBZip2InputStream.java
+++ b/jEdit/installer/CBZip2InputStream.java
@@ -1,953 +1,953 @@
-/*
- * Copyright (C) The Apache Software Foundation. All rights reserved.
- *
- * This software is published under the terms of the Apache Software License
- * version 1.1, a copy of which has been included with this distribution in
- * the LICENSE.txt file.
- */
-package installer;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * An input stream that decompresses from the BZip2 format (without the file
- * header chars) to be read as any other stream.
- *
- * @author <a href="mailto:keiron at aftexsw.com">Keiron Liddle</a>
- */
-public class CBZip2InputStream
- extends InputStream
- implements BZip2Constants
-{
- private static final int START_BLOCK_STATE = 1;
- private static final int RAND_PART_A_STATE = 2;
- private static final int RAND_PART_B_STATE = 3;
- private static final int RAND_PART_C_STATE = 4;
- private static final int NO_RAND_PART_A_STATE = 5;
- private static final int NO_RAND_PART_B_STATE = 6;
- private static final int NO_RAND_PART_C_STATE = 7;
-
- private CRC m_crc = new CRC();
- private boolean[] m_inUse = new boolean[ 256 ];
- private char[] m_seqToUnseq = new char[ 256 ];
- private char[] m_unseqToSeq = new char[ 256 ];
- private char[] m_selector = new char[ MAX_SELECTORS ];
- private char[] m_selectorMtf = new char[ MAX_SELECTORS ];
-
- /*
- * freq table collected to save a pass over the data
- * during decompression.
- */
- private int[] m_unzftab = new int[ 256 ];
-
- private int[][] m_limit = new int[ N_GROUPS ][ MAX_ALPHA_SIZE ];
- private int[][] m_base = new int[ N_GROUPS ][ MAX_ALPHA_SIZE ];
- private int[][] m_perm = new int[ N_GROUPS ][ MAX_ALPHA_SIZE ];
- private int[] m_minLens = new int[ N_GROUPS ];
-
- private boolean m_streamEnd;
- private int m_currentChar = -1;
-
- private int m_currentState = START_BLOCK_STATE;
- private int m_rNToGo;
- private int m_rTPos;
- private int m_tPos;
-
- private int i2;
- private int count;
- private int chPrev;
- private int ch2;
- private int j2;
- private char z;
-
- private boolean m_blockRandomised;
-
- /*
- * always: in the range 0 .. 9.
- * The current block size is 100000 * this number.
- */
- private int m_blockSize100k;
- private int m_bsBuff;
- private int m_bsLive;
-
- private InputStream m_input;
-
- private int m_computedBlockCRC;
- private int m_computedCombinedCRC;
-
- /*
- * index of the last char in the block, so
- * the block size == last + 1.
- */
- private int m_last;
- private char[] m_ll8;
- private int m_nInUse;
-
- /*
- * index in zptr[] of original string after sorting.
- */
- private int m_origPtr;
-
- private int m_storedBlockCRC;
- private int m_storedCombinedCRC;
- private int[] m_tt;
-
- public CBZip2InputStream( final InputStream input )
- {
- bsSetStream( input );
- initialize();
- initBlock();
- setupBlock();
- }
-
- private static void badBlockHeader()
- {
- cadvise();
- }
-
- private static void blockOverrun()
- {
- cadvise();
- }
-
- private static void cadvise()
- {
- System.out.println( "CRC Error" );
- //throw new CCoruptionError();
- }
-
- private static void compressedStreamEOF()
- {
- cadvise();
- }
-
- private static void crcError()
- {
- cadvise();
- }
-
- public int read()
- {
- if( m_streamEnd )
- {
- return -1;
- }
- else
- {
- int retChar = m_currentChar;
- switch( m_currentState )
- {
- case START_BLOCK_STATE:
- break;
- case RAND_PART_A_STATE:
- break;
- case RAND_PART_B_STATE:
- setupRandPartB();
- break;
- case RAND_PART_C_STATE:
- setupRandPartC();
- break;
- case NO_RAND_PART_A_STATE:
- break;
- case NO_RAND_PART_B_STATE:
- setupNoRandPartB();
- break;
- case NO_RAND_PART_C_STATE:
- setupNoRandPartC();
- break;
- default:
- break;
- }
- return retChar;
- }
- }
-
- private void setDecompressStructureSizes( int newSize100k )
- {
- if( !( 0 <= newSize100k && newSize100k <= 9 && 0 <= m_blockSize100k
- && m_blockSize100k <= 9 ) )
- {
- // throw new IOException("Invalid block size");
- }
-
- m_blockSize100k = newSize100k;
-
- if( newSize100k == 0 )
- {
- return;
- }
-
- int n = BASE_BLOCK_SIZE * newSize100k;
- m_ll8 = new char[ n ];
- m_tt = new int[ n ];
- }
-
- private void setupBlock()
- {
- int[] cftab = new int[ 257 ];
- char ch;
-
- cftab[ 0 ] = 0;
- for( int i = 1; i <= 256; i++ )
- {
- cftab[ i ] = m_unzftab[ i - 1 ];
- }
- for( int i = 1; i <= 256; i++ )
- {
- cftab[ i ] += cftab[ i - 1 ];
- }
-
- for( int i = 0; i <= m_last; i++ )
- {
- ch = m_ll8[ i ];
- m_tt[ cftab[ ch ] ] = i;
- cftab[ ch ]++;
- }
- cftab = null;
-
- m_tPos = m_tt[ m_origPtr ];
-
- count = 0;
- i2 = 0;
- ch2 = 256;
- /*
- * not a char and not EOF
- */
- if( m_blockRandomised )
- {
- m_rNToGo = 0;
- m_rTPos = 0;
- setupRandPartA();
- }
- else
- {
- setupNoRandPartA();
- }
- }
-
- private void setupNoRandPartA()
- {
- if( i2 <= m_last )
- {
- chPrev = ch2;
- ch2 = m_ll8[ m_tPos ];
- m_tPos = m_tt[ m_tPos ];
- i2++;
-
- m_currentChar = ch2;
- m_currentState = NO_RAND_PART_B_STATE;
- m_crc.updateCRC( ch2 );
- }
- else
- {
- endBlock();
- initBlock();
- setupBlock();
- }
- }
-
- private void setupNoRandPartB()
- {
- if( ch2 != chPrev )
- {
- m_currentState = NO_RAND_PART_A_STATE;
- count = 1;
- setupNoRandPartA();
- }
- else
- {
- count++;
- if( count >= 4 )
- {
- z = m_ll8[ m_tPos ];
- m_tPos = m_tt[ m_tPos ];
- m_currentState = NO_RAND_PART_C_STATE;
- j2 = 0;
- setupNoRandPartC();
- }
- else
- {
- m_currentState = NO_RAND_PART_A_STATE;
- setupNoRandPartA();
- }
- }
- }
-
- private void setupNoRandPartC()
- {
- if( j2 < z )
- {
- m_currentChar = ch2;
- m_crc.updateCRC( ch2 );
- j2++;
- }
- else
- {
- m_currentState = NO_RAND_PART_A_STATE;
- i2++;
- count = 0;
- setupNoRandPartA();
- }
- }
-
- private void setupRandPartA()
- {
- if( i2 <= m_last )
- {
- chPrev = ch2;
- ch2 = m_ll8[ m_tPos ];
- m_tPos = m_tt[ m_tPos ];
- if( m_rNToGo == 0 )
- {
- m_rNToGo = RAND_NUMS[ m_rTPos ];
- m_rTPos++;
- if( m_rTPos == 512 )
- {
- m_rTPos = 0;
- }
- }
- m_rNToGo--;
- ch2 ^= ( ( m_rNToGo == 1 ) ? 1 : 0 );
- i2++;
-
- m_currentChar = ch2;
- m_currentState = RAND_PART_B_STATE;
- m_crc.updateCRC( ch2 );
- }
- else
- {
- endBlock();
- initBlock();
- setupBlock();
- }
- }
-
- private void setupRandPartB()
- {
- if( ch2 != chPrev )
- {
- m_currentState = RAND_PART_A_STATE;
- count = 1;
- setupRandPartA();
- }
- else
- {
- count++;
- if( count >= 4 )
- {
- z = m_ll8[ m_tPos ];
- m_tPos = m_tt[ m_tPos ];
- if( m_rNToGo == 0 )
- {
- m_rNToGo = RAND_NUMS[ m_rTPos ];
- m_rTPos++;
- if( m_rTPos == 512 )
- {
- m_rTPos = 0;
- }
- }
- m_rNToGo--;
- z ^= ( ( m_rNToGo == 1 ) ? 1 : 0 );
- j2 = 0;
- m_currentState = RAND_PART_C_STATE;
- setupRandPartC();
- }
- else
- {
- m_currentState = RAND_PART_A_STATE;
- setupRandPartA();
- }
- }
- }
-
- private void setupRandPartC()
- {
- if( j2 < z )
- {
- m_currentChar = ch2;
- m_crc.updateCRC( ch2 );
- j2++;
- }
- else
- {
- m_currentState = RAND_PART_A_STATE;
- i2++;
- count = 0;
- setupRandPartA();
- }
- }
-
- private void getAndMoveToFrontDecode()
- {
- int nextSym;
-
- int limitLast = BASE_BLOCK_SIZE * m_blockSize100k;
- m_origPtr = readVariableSizedInt( 24 );
-
- recvDecodingTables();
- int EOB = m_nInUse + 1;
- int groupNo = -1;
- int groupPos = 0;
-
- /*
- * Setting up the unzftab entries here is not strictly
- * necessary, but it does save having to do it later
- * in a separate pass, and so saves a block's worth of
- * cache misses.
- */
- for( int i = 0; i <= 255; i++ )
- {
- m_unzftab[ i ] = 0;
- }
-
- final char[] yy = new char[ 256 ];
- for( int i = 0; i <= 255; i++ )
- {
- yy[ i ] = (char)i;
- }
-
- m_last = -1;
- int zt;
- int zn;
- int zvec;
- int zj;
- groupNo++;
- groupPos = G_SIZE - 1;
-
- zt = m_selector[ groupNo ];
- zn = m_minLens[ zt ];
- zvec = bsR( zn );
- while( zvec > m_limit[ zt ][ zn ] )
- {
- zn++;
-
- while( m_bsLive < 1 )
- {
- int zzi;
- try
- {
- zzi = m_input.read();
- }
- catch( IOException e )
- {
- compressedStreamEOF();
- break;
- }
- if( zzi == -1 )
- {
- compressedStreamEOF();
- break;
- }
- m_bsBuff = ( m_bsBuff << 8 ) | ( zzi & 0xff );
- m_bsLive += 8;
- }
-
- zj = ( m_bsBuff >> ( m_bsLive - 1 ) ) & 1;
- m_bsLive--;
-
- zvec = ( zvec << 1 ) | zj;
- }
- nextSym = m_perm[ zt ][ zvec - m_base[ zt ][ zn ] ];
-
- while( true )
- {
- if( nextSym == EOB )
- {
- break;
- }
-
- if( nextSym == RUNA || nextSym == RUNB )
- {
- char ch;
- int s = -1;
- int N = 1;
- do
- {
- if( nextSym == RUNA )
- {
- s = s + ( 0 + 1 ) * N;
- }
- else// if( nextSym == RUNB )
- {
- s = s + ( 1 + 1 ) * N;
- }
- N = N * 2;
-
- if( groupPos == 0 )
- {
- groupNo++;
- groupPos = G_SIZE;
- }
- groupPos--;
- zt = m_selector[ groupNo ];
- zn = m_minLens[ zt ];
- zvec = bsR( zn );
- while( zvec > m_limit[ zt ][ zn ] )
- {
- zn++;
-
- while( m_bsLive < 1 )
- {
- int zzi;
- char thech = 0;
- try
- {
- thech = (char)m_input.read();
- }
- catch( IOException e )
- {
- compressedStreamEOF();
- }
- if( thech == -1 )
- {
- compressedStreamEOF();
- }
- zzi = thech;
- m_bsBuff = ( m_bsBuff << 8 ) | ( zzi & 0xff );
- m_bsLive += 8;
- }
-
- zj = ( m_bsBuff >> ( m_bsLive - 1 ) ) & 1;
- m_bsLive--;
- zvec = ( zvec << 1 ) | zj;
- }
-
- nextSym = m_perm[ zt ][ zvec - m_base[ zt ][ zn ] ];
-
- } while( nextSym == RUNA || nextSym == RUNB );
-
- s++;
- ch = m_seqToUnseq[ yy[ 0 ] ];
- m_unzftab[ ch ] += s;
-
- while( s > 0 )
- {
- m_last++;
- m_ll8[ m_last ] = ch;
- s--;
- }
-
- if( m_last >= limitLast )
- {
- blockOverrun();
- }
- continue;
- }
- else
- {
- char tmp;
- m_last++;
- if( m_last >= limitLast )
- {
- blockOverrun();
- }
-
- tmp = yy[ nextSym - 1 ];
- m_unzftab[ m_seqToUnseq[ tmp ] ]++;
- m_ll8[ m_last ] = m_seqToUnseq[ tmp ];
-
- /*
- * This loop is hammered during decompression,
- * hence the unrolling.
- * for (j = nextSym-1; j > 0; j--) yy[j] = yy[j-1];
- */
- int j = nextSym - 1;
- for( ; j > 3; j -= 4 )
- {
- yy[ j ] = yy[ j - 1 ];
- yy[ j - 1 ] = yy[ j - 2 ];
- yy[ j - 2 ] = yy[ j - 3 ];
- yy[ j - 3 ] = yy[ j - 4 ];
- }
- for( ; j > 0; j-- )
- {
- yy[ j ] = yy[ j - 1 ];
- }
-
- yy[ 0 ] = tmp;
-
- if( groupPos == 0 )
- {
- groupNo++;
- groupPos = G_SIZE;
- }
- groupPos--;
- zt = m_selector[ groupNo ];
- zn = m_minLens[ zt ];
- zvec = bsR( zn );
- while( zvec > m_limit[ zt ][ zn ] )
- {
- zn++;
-
- while( m_bsLive < 1 )
- {
- char ch = 0;
- try
- {
- ch = (char)m_input.read();
- }
- catch( IOException e )
- {
- compressedStreamEOF();
- }
-
- m_bsBuff = ( m_bsBuff << 8 ) | ( ch & 0xff );
- m_bsLive += 8;
- }
-
- zj = ( m_bsBuff >> ( m_bsLive - 1 ) ) & 1;
- m_bsLive--;
-
- zvec = ( zvec << 1 ) | zj;
- }
- nextSym = m_perm[ zt ][ zvec - m_base[ zt ][ zn ] ];
-
- continue;
- }
- }
- }
-
- private void bsFinishedWithStream()
- {
- m_input = null;
- }
-
- private int readVariableSizedInt( final int numBits )
- {
- return bsR( numBits );
- }
-
- private char readUnsignedChar()
- {
- return (char)bsR( 8 );
- }
-
- private int readInt()
- {
- int u = 0;
- u = ( u << 8 ) | bsR( 8 );
- u = ( u << 8 ) | bsR( 8 );
- u = ( u << 8 ) | bsR( 8 );
- u = ( u << 8 ) | bsR( 8 );
- return u;
- }
-
- private int bsR( final int n )
- {
- while( m_bsLive < n )
- {
- char ch = 0;
- try
- {
- ch = (char)m_input.read();
- }
- catch( final IOException ioe )
- {
- compressedStreamEOF();
- }
-
- if( ch == -1 )
- {
- compressedStreamEOF();
- }
-
- m_bsBuff = ( m_bsBuff << 8 ) | ( ch & 0xff );
- m_bsLive += 8;
- }
-
- final int result = ( m_bsBuff >> ( m_bsLive - n ) ) & ( ( 1 << n ) - 1 );
- m_bsLive -= n;
- return result;
- }
-
- private void bsSetStream( final InputStream input )
- {
- m_input = input;
- m_bsLive = 0;
- m_bsBuff = 0;
- }
-
- private void complete()
- {
- m_storedCombinedCRC = readInt();
- if( m_storedCombinedCRC != m_computedCombinedCRC )
- {
- crcError();
- }
-
- bsFinishedWithStream();
- m_streamEnd = true;
- }
-
- private void endBlock()
- {
- m_computedBlockCRC = m_crc.getFinalCRC();
- /*
- * A bad CRC is considered a fatal error.
- */
- if( m_storedBlockCRC != m_computedBlockCRC )
- {
- crcError();
- }
-
- m_computedCombinedCRC = ( m_computedCombinedCRC << 1 )
- | ( m_computedCombinedCRC >>> 31 );
- m_computedCombinedCRC ^= m_computedBlockCRC;
- }
-
- private void hbCreateDecodeTables( final int[] limit,
- final int[] base,
- final int[] perm,
- final char[] length,
- final int minLen,
- final int maxLen,
- final int alphaSize )
- {
- int pp = 0;
- for( int i = minLen; i <= maxLen; i++ )
- {
- for( int j = 0; j < alphaSize; j++ )
- {
- if( length[ j ] == i )
- {
- perm[ pp ] = j;
- pp++;
- }
- }
- }
-
- for( int i = 0; i < MAX_CODE_LEN; i++ )
- {
- base[ i ] = 0;
- }
-
- for( int i = 0; i < alphaSize; i++ )
- {
- base[ length[ i ] + 1 ]++;
- }
-
- for( int i = 1; i < MAX_CODE_LEN; i++ )
- {
- base[ i ] += base[ i - 1 ];
- }
-
- for( int i = 0; i < MAX_CODE_LEN; i++ )
- {
- limit[ i ] = 0;
- }
-
- int vec = 0;
- for( int i = minLen; i <= maxLen; i++ )
- {
- vec += ( base[ i + 1 ] - base[ i ] );
- limit[ i ] = vec - 1;
- vec <<= 1;
- }
-
- for( int i = minLen + 1; i <= maxLen; i++ )
- {
- base[ i ] = ( ( limit[ i - 1 ] + 1 ) << 1 ) - base[ i ];
- }
- }
-
- private void initBlock()
- {
- final char magic1 = readUnsignedChar();
- final char magic2 = readUnsignedChar();
- final char magic3 = readUnsignedChar();
- final char magic4 = readUnsignedChar();
- final char magic5 = readUnsignedChar();
- final char magic6 = readUnsignedChar();
- if( magic1 == 0x17 && magic2 == 0x72 && magic3 == 0x45 &&
- magic4 == 0x38 && magic5 == 0x50 && magic6 == 0x90 )
- {
- complete();
- return;
- }
-
- if( magic1 != 0x31 || magic2 != 0x41 || magic3 != 0x59 ||
- magic4 != 0x26 || magic5 != 0x53 || magic6 != 0x59 )
- {
- badBlockHeader();
- m_streamEnd = true;
- return;
- }
-
- m_storedBlockCRC = readInt();
-
- if( bsR( 1 ) == 1 )
- {
- m_blockRandomised = true;
- }
- else
- {
- m_blockRandomised = false;
- }
-
- // currBlockNo++;
- getAndMoveToFrontDecode();
-
- m_crc.initialiseCRC();
- m_currentState = START_BLOCK_STATE;
- }
-
- private void initialize()
- {
- final char magic3 = readUnsignedChar();
- final char magic4 = readUnsignedChar();
- if( magic3 != 'h' || magic4 < '1' || magic4 > '9' )
- {
- bsFinishedWithStream();
- m_streamEnd = true;
- return;
- }
-
- setDecompressStructureSizes( magic4 - '0' );
- m_computedCombinedCRC = 0;
- }
-
- private void makeMaps()
- {
- m_nInUse = 0;
- for( int i = 0; i < 256; i++ )
- {
- if( m_inUse[ i ] )
- {
- m_seqToUnseq[ m_nInUse ] = (char)i;
- m_unseqToSeq[ i ] = (char)m_nInUse;
- m_nInUse++;
- }
- }
- }
-
- private void recvDecodingTables()
- {
- buildInUseTable();
- makeMaps();
- final int alphaSize = m_nInUse + 2;
-
- /*
- * Now the selectors
- */
- final int groupCount = bsR( 3 );
- final int selectorCount = bsR( 15 );
- for( int i = 0; i < selectorCount; i++ )
- {
- int run = 0;
- while( bsR( 1 ) == 1 )
- {
- run++;
- }
- m_selectorMtf[ i ] = (char)run;
- }
-
- /*
- * Undo the MTF values for the selectors.
- */
- final char[] pos = new char[ N_GROUPS ];
- for( char v = 0; v < groupCount; v++ )
- {
- pos[ v ] = v;
- }
-
- for( int i = 0; i < selectorCount; i++ )
- {
- int v = m_selectorMtf[ i ];
- final char tmp = pos[ v ];
- while( v > 0 )
- {
- pos[ v ] = pos[ v - 1 ];
- v--;
- }
- pos[ 0 ] = tmp;
- m_selector[ i ] = tmp;
- }
-
- final char[][] len = new char[ N_GROUPS ][ MAX_ALPHA_SIZE ];
- /*
- * Now the coding tables
- */
- for( int i = 0; i < groupCount; i++ )
- {
- int curr = bsR( 5 );
- for( int j = 0; j < alphaSize; j++ )
- {
- while( bsR( 1 ) == 1 )
- {
- if( bsR( 1 ) == 0 )
- {
- curr++;
- }
- else
- {
- curr--;
- }
- }
- len[ i ][ j ] = (char)curr;
- }
- }
-
- /*
- * Create the Huffman decoding tables
- */
- for( int k = 0; k < groupCount; k++ )
- {
- int minLen = 32;
- int maxLen = 0;
- for( int i = 0; i < alphaSize; i++ )
- {
- if( len[ k ][ i ] > maxLen )
- {
- maxLen = len[ k ][ i ];
- }
- if( len[ k ][ i ] < minLen )
- {
- minLen = len[ k ][ i ];
- }
- }
- hbCreateDecodeTables( m_limit[ k ], m_base[ k ], m_perm[ k ], len[ k ], minLen,
- maxLen, alphaSize );
- m_minLens[ k ] = minLen;
- }
- }
-
- private void buildInUseTable()
- {
- final boolean[] inUse16 = new boolean[ 16 ];
-
- /*
- * Receive the mapping table
- */
- for( int i = 0; i < 16; i++ )
- {
- if( bsR( 1 ) == 1 )
- {
- inUse16[ i ] = true;
- }
- else
- {
- inUse16[ i ] = false;
- }
- }
-
- for( int i = 0; i < 256; i++ )
- {
- m_inUse[ i ] = false;
- }
-
- for( int i = 0; i < 16; i++ )
- {
- if( inUse16[ i ] )
- {
- for( int j = 0; j < 16; j++ )
- {
- if( bsR( 1 ) == 1 )
- {
- m_inUse[ i * 16 + j ] = true;
- }
- }
- }
- }
- }
-}
+/*
+ * Copyright (C) The Apache Software Foundation. All rights reserved.
+ *
+ * This software is published under the terms of the Apache Software License
+ * version 1.1, a copy of which has been included with this distribution in
+ * the LICENSE.txt file.
+ */
+package installer;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * An input stream that decompresses from the BZip2 format (without the file
+ * header chars) to be read as any other stream.
+ *
+ * @author <a href="mailto:keiron at aftexsw.com">Keiron Liddle</a>
+ */
+public class CBZip2InputStream
+ extends InputStream
+ implements BZip2Constants
+{
+ private static final int START_BLOCK_STATE = 1;
+ private static final int RAND_PART_A_STATE = 2;
+ private static final int RAND_PART_B_STATE = 3;
+ private static final int RAND_PART_C_STATE = 4;
+ private static final int NO_RAND_PART_A_STATE = 5;
+ private static final int NO_RAND_PART_B_STATE = 6;
+ private static final int NO_RAND_PART_C_STATE = 7;
+
+ private CRC m_crc = new CRC();
+ private boolean[] m_inUse = new boolean[ 256 ];
+ private char[] m_seqToUnseq = new char[ 256 ];
+ private char[] m_unseqToSeq = new char[ 256 ];
+ private char[] m_selector = new char[ MAX_SELECTORS ];
+ private char[] m_selectorMtf = new char[ MAX_SELECTORS ];
+
+ /*
+ * freq table collected to save a pass over the data
+ * during decompression.
+ */
+ private int[] m_unzftab = new int[ 256 ];
+
+ private int[][] m_limit = new int[ N_GROUPS ][ MAX_ALPHA_SIZE ];
+ private int[][] m_base = new int[ N_GROUPS ][ MAX_ALPHA_SIZE ];
+ private int[][] m_perm = new int[ N_GROUPS ][ MAX_ALPHA_SIZE ];
+ private int[] m_minLens = new int[ N_GROUPS ];
+
+ private boolean m_streamEnd;
+ private int m_currentChar = -1;
+
+ private int m_currentState = START_BLOCK_STATE;
+ private int m_rNToGo;
+ private int m_rTPos;
+ private int m_tPos;
+
+ private int i2;
+ private int count;
+ private int chPrev;
+ private int ch2;
+ private int j2;
+ private char z;
+
+ private boolean m_blockRandomised;
+
+ /*
+ * always: in the range 0 .. 9.
+ * The current block size is 100000 * this number.
+ */
+ private int m_blockSize100k;
+ private int m_bsBuff;
+ private int m_bsLive;
+
+ private InputStream m_input;
+
+ private int m_computedBlockCRC;
+ private int m_computedCombinedCRC;
+
+ /*
+ * index of the last char in the block, so
+ * the block size == last + 1.
+ */
+ private int m_last;
+ private char[] m_ll8;
+ private int m_nInUse;
+
+ /*
+ * index in zptr[] of original string after sorting.
+ */
+ private int m_origPtr;
+
+ private int m_storedBlockCRC;
+ private int m_storedCombinedCRC;
+ private int[] m_tt;
+
+ public CBZip2InputStream( final InputStream input )
+ {
+ bsSetStream( input );
+ initialize();
+ initBlock();
+ setupBlock();
+ }
+
+ private static void badBlockHeader()
+ {
+ cadvise();
+ }
+
+ private static void blockOverrun()
+ {
+ cadvise();
+ }
+
+ private static void cadvise()
+ {
+ System.out.println( "CRC Error" );
+ //throw new CCoruptionError();
+ }
+
+ private static void compressedStreamEOF()
+ {
+ cadvise();
+ }
+
+ private static void crcError()
+ {
+ cadvise();
+ }
+
+ public int read()
+ {
+ if( m_streamEnd )
+ {
+ return -1;
+ }
+ else
+ {
+ int retChar = m_currentChar;
+ switch( m_currentState )
+ {
+ case START_BLOCK_STATE:
+ break;
+ case RAND_PART_A_STATE:
+ break;
+ case RAND_PART_B_STATE:
+ setupRandPartB();
+ break;
+ case RAND_PART_C_STATE:
+ setupRandPartC();
+ break;
+ case NO_RAND_PART_A_STATE:
+ break;
+ case NO_RAND_PART_B_STATE:
+ setupNoRandPartB();
+ break;
+ case NO_RAND_PART_C_STATE:
+ setupNoRandPartC();
+ break;
+ default:
+ break;
+ }
+ return retChar;
+ }
+ }
+
+ private void setDecompressStructureSizes( int newSize100k )
+ {
+ if( !( 0 <= newSize100k && newSize100k <= 9 && 0 <= m_blockSize100k
+ && m_blockSize100k <= 9 ) )
+ {
+ // throw new IOException("Invalid block size");
+ }
+
+ m_blockSize100k = newSize100k;
+
+ if( newSize100k == 0 )
+ {
+ return;
+ }
+
+ int n = BASE_BLOCK_SIZE * newSize100k;
+ m_ll8 = new char[ n ];
+ m_tt = new int[ n ];
+ }
+
+ private void setupBlock()
+ {
+ int[] cftab = new int[ 257 ];
+ char ch;
+
+ cftab[ 0 ] = 0;
+ for( int i = 1; i <= 256; i++ )
+ {
+ cftab[ i ] = m_unzftab[ i - 1 ];
+ }
+ for( int i = 1; i <= 256; i++ )
+ {
+ cftab[ i ] += cftab[ i - 1 ];
+ }
+
+ for( int i = 0; i <= m_last; i++ )
+ {
+ ch = m_ll8[ i ];
+ m_tt[ cftab[ ch ] ] = i;
+ cftab[ ch ]++;
+ }
+ cftab = null;
+
+ m_tPos = m_tt[ m_origPtr ];
+
+ count = 0;
+ i2 = 0;
+ ch2 = 256;
+ /*
+ * not a char and not EOF
+ */
+ if( m_blockRandomised )
+ {
+ m_rNToGo = 0;
+ m_rTPos = 0;
+ setupRandPartA();
+ }
+ else
+ {
+ setupNoRandPartA();
+ }
+ }
+
+ private void setupNoRandPartA()
+ {
+ if( i2 <= m_last )
+ {
+ chPrev = ch2;
+ ch2 = m_ll8[ m_tPos ];
+ m_tPos = m_tt[ m_tPos ];
+ i2++;
+
+ m_currentChar = ch2;
+ m_currentState = NO_RAND_PART_B_STATE;
+ m_crc.updateCRC( ch2 );
+ }
+ else
+ {
+ endBlock();
+ initBlock();
+ setupBlock();
+ }
+ }
+
+ private void setupNoRandPartB()
+ {
+ if( ch2 != chPrev )
+ {
+ m_currentState = NO_RAND_PART_A_STATE;
+ count = 1;
+ setupNoRandPartA();
+ }
+ else
+ {
+ count++;
+ if( count >= 4 )
+ {
+ z = m_ll8[ m_tPos ];
+ m_tPos = m_tt[ m_tPos ];
+ m_currentState = NO_RAND_PART_C_STATE;
+ j2 = 0;
+ setupNoRandPartC();
+ }
+ else
+ {
+ m_currentState = NO_RAND_PART_A_STATE;
+ setupNoRandPartA();
+ }
+ }
+ }
+
+ private void setupNoRandPartC()
+ {
+ if( j2 < z )
+ {
+ m_currentChar = ch2;
+ m_crc.updateCRC( ch2 );
+ j2++;
+ }
+ else
+ {
+ m_currentState = NO_RAND_PART_A_STATE;
+ i2++;
+ count = 0;
+ setupNoRandPartA();
+ }
+ }
+
+ private void setupRandPartA()
+ {
+ if( i2 <= m_last )
+ {
+ chPrev = ch2;
+ ch2 = m_ll8[ m_tPos ];
+ m_tPos = m_tt[ m_tPos ];
+ if( m_rNToGo == 0 )
+ {
+ m_rNToGo = RAND_NUMS[ m_rTPos ];
+ m_rTPos++;
+ if( m_rTPos == 512 )
+ {
+ m_rTPos = 0;
+ }
+ }
+ m_rNToGo--;
+ ch2 ^= ( ( m_rNToGo == 1 ) ? 1 : 0 );
+ i2++;
+
+ m_currentChar = ch2;
+ m_currentState = RAND_PART_B_STATE;
+ m_crc.updateCRC( ch2 );
+ }
+ else
+ {
+ endBlock();
+ initBlock();
+ setupBlock();
+ }
+ }
+
+ private void setupRandPartB()
+ {
+ if( ch2 != chPrev )
+ {
+ m_currentState = RAND_PART_A_STATE;
+ count = 1;
+ setupRandPartA();
+ }
+ else
+ {
+ count++;
+ if( count >= 4 )
+ {
+ z = m_ll8[ m_tPos ];
+ m_tPos = m_tt[ m_tPos ];
+ if( m_rNToGo == 0 )
+ {
+ m_rNToGo = RAND_NUMS[ m_rTPos ];
+ m_rTPos++;
+ if( m_rTPos == 512 )
+ {
+ m_rTPos = 0;
+ }
+ }
+ m_rNToGo--;
+ z ^= ( ( m_rNToGo == 1 ) ? 1 : 0 );
+ j2 = 0;
+ m_currentState = RAND_PART_C_STATE;
+ setupRandPartC();
+ }
+ else
+ {
+ m_currentState = RAND_PART_A_STATE;
+ setupRandPartA();
+ }
+ }
+ }
+
+ private void setupRandPartC()
+ {
+ if( j2 < z )
+ {
+ m_currentChar = ch2;
+ m_crc.updateCRC( ch2 );
+ j2++;
+ }
+ else
+ {
+ m_currentState = RAND_PART_A_STATE;
+ i2++;
+ count = 0;
+ setupRandPartA();
+ }
+ }
+
+ private void getAndMoveToFrontDecode()
+ {
+ int nextSym;
+
+ int limitLast = BASE_BLOCK_SIZE * m_blockSize100k;
+ m_origPtr = readVariableSizedInt( 24 );
+
+ recvDecodingTables();
+ int EOB = m_nInUse + 1;
+ int groupNo = -1;
+ int groupPos = 0;
+
+ /*
+ * Setting up the unzftab entries here is not strictly
+ * necessary, but it does save having to do it later
+ * in a separate pass, and so saves a block's worth of
+ * cache misses.
+ */
+ for( int i = 0; i <= 255; i++ )
+ {
+ m_unzftab[ i ] = 0;
+ }
+
+ final char[] yy = new char[ 256 ];
+ for( int i = 0; i <= 255; i++ )
+ {
+ yy[ i ] = (char)i;
+ }
+
+ m_last = -1;
+ int zt;
+ int zn;
+ int zvec;
+ int zj;
+ groupNo++;
+ groupPos = G_SIZE - 1;
+
+ zt = m_selector[ groupNo ];
+ zn = m_minLens[ zt ];
+ zvec = bsR( zn );
+ while( zvec > m_limit[ zt ][ zn ] )
+ {
+ zn++;
+
+ while( m_bsLive < 1 )
+ {
+ int zzi;
+ try
+ {
+ zzi = m_input.read();
+ }
+ catch( IOException e )
+ {
+ compressedStreamEOF();
+ break;
+ }
+ if( zzi == -1 )
+ {
+ compressedStreamEOF();
+ break;
+ }
+ m_bsBuff = ( m_bsBuff << 8 ) | ( zzi & 0xff );
+ m_bsLive += 8;
+ }
+
+ zj = ( m_bsBuff >> ( m_bsLive - 1 ) ) & 1;
+ m_bsLive--;
+
+ zvec = ( zvec << 1 ) | zj;
+ }
+ nextSym = m_perm[ zt ][ zvec - m_base[ zt ][ zn ] ];
+
+ while( true )
+ {
+ if( nextSym == EOB )
+ {
+ break;
+ }
+
+ if( nextSym == RUNA || nextSym == RUNB )
+ {
+ char ch;
+ int s = -1;
+ int N = 1;
+ do
+ {
+ if( nextSym == RUNA )
+ {
+ s = s + ( 0 + 1 ) * N;
+ }
+ else// if( nextSym == RUNB )
+ {
+ s = s + ( 1 + 1 ) * N;
+ }
+ N = N * 2;
+
+ if( groupPos == 0 )
+ {
+ groupNo++;
+ groupPos = G_SIZE;
+ }
+ groupPos--;
+ zt = m_selector[ groupNo ];
+ zn = m_minLens[ zt ];
+ zvec = bsR( zn );
+ while( zvec > m_limit[ zt ][ zn ] )
+ {
+ zn++;
+
+ while( m_bsLive < 1 )
+ {
+ int zzi;
+ char thech = 0;
+ try
+ {
+ thech = (char)m_input.read();
+ }
+ catch( IOException e )
+ {
+ compressedStreamEOF();
+ }
+ if( thech == -1 )
+ {
+ compressedStreamEOF();
+ }
+ zzi = thech;
+ m_bsBuff = ( m_bsBuff << 8 ) | ( zzi & 0xff );
+ m_bsLive += 8;
+ }
+
+ zj = ( m_bsBuff >> ( m_bsLive - 1 ) ) & 1;
+ m_bsLive--;
+ zvec = ( zvec << 1 ) | zj;
+ }
+
+ nextSym = m_perm[ zt ][ zvec - m_base[ zt ][ zn ] ];
+
+ } while( nextSym == RUNA || nextSym == RUNB );
+
+ s++;
+ ch = m_seqToUnseq[ yy[ 0 ] ];
+ m_unzftab[ ch ] += s;
+
+ while( s > 0 )
+ {
+ m_last++;
+ m_ll8[ m_last ] = ch;
+ s--;
+ }
+
+ if( m_last >= limitLast )
+ {
+ blockOverrun();
+ }
+ continue;
+ }
+ else
+ {
+ char tmp;
+ m_last++;
+ if( m_last >= limitLast )
+ {
+ blockOverrun();
+ }
+
+ tmp = yy[ nextSym - 1 ];
+ m_unzftab[ m_seqToUnseq[ tmp ] ]++;
+ m_ll8[ m_last ] = m_seqToUnseq[ tmp ];
+
+ /*
+ * This loop is hammered during decompression,
+ * hence the unrolling.
+ * for (j = nextSym-1; j > 0; j--) yy[j] = yy[j-1];
+ */
+ int j = nextSym - 1;
+ for( ; j > 3; j -= 4 )
+ {
+ yy[ j ] = yy[ j - 1 ];
+ yy[ j - 1 ] = yy[ j - 2 ];
+ yy[ j - 2 ] = yy[ j - 3 ];
+ yy[ j - 3 ] = yy[ j - 4 ];
+ }
+ for( ; j > 0; j-- )
+ {
+ yy[ j ] = yy[ j - 1 ];
+ }
+
+ yy[ 0 ] = tmp;
+
+ if( groupPos == 0 )
+ {
+ groupNo++;
+ groupPos = G_SIZE;
+ }
+ groupPos--;
+ zt = m_selector[ groupNo ];
+ zn = m_minLens[ zt ];
+ zvec = bsR( zn );
+ while( zvec > m_limit[ zt ][ zn ] )
+ {
+ zn++;
+
+ while( m_bsLive < 1 )
+ {
+ char ch = 0;
+ try
+ {
+ ch = (char)m_input.read();
+ }
+ catch( IOException e )
+ {
+ compressedStreamEOF();
+ }
+
+ m_bsBuff = ( m_bsBuff << 8 ) | ( ch & 0xff );
+ m_bsLive += 8;
+ }
+
+ zj = ( m_bsBuff >> ( m_bsLive - 1 ) ) & 1;
+ m_bsLive--;
+
+ zvec = ( zvec << 1 ) | zj;
+ }
+ nextSym = m_perm[ zt ][ zvec - m_base[ zt ][ zn ] ];
+
+ continue;
+ }
+ }
+ }
+
+ private void bsFinishedWithStream()
+ {
+ m_input = null;
+ }
+
+ private int readVariableSizedInt( final int numBits )
+ {
+ return bsR( numBits );
+ }
+
+ private char readUnsignedChar()
+ {
+ return (char)bsR( 8 );
+ }
+
+ private int readInt()
+ {
+ int u = 0;
+ u = ( u << 8 ) | bsR( 8 );
+ u = ( u << 8 ) | bsR( 8 );
+ u = ( u << 8 ) | bsR( 8 );
+ u = ( u << 8 ) | bsR( 8 );
+ return u;
+ }
+
+ private int bsR( final int n )
+ {
+ while( m_bsLive < n )
+ {
+ char ch = 0;
+ try
+ {
+ ch = (char)m_input.read();
+ }
+ catch( final IOException ioe )
+ {
+ compressedStreamEOF();
+ }
+
+ if( ch == -1 )
+ {
+ compressedStreamEOF();
+ }
+
+ m_bsBuff = ( m_bsBuff << 8 ) | ( ch & 0xff );
+ m_bsLive += 8;
+ }
+
+ final int result = ( m_bsBuff >> ( m_bsLive - n ) ) & ( ( 1 << n ) - 1 );
+ m_bsLive -= n;
+ return result;
+ }
+
+ private void bsSetStream( final InputStream input )
+ {
+ m_input = input;
+ m_bsLive = 0;
+ m_bsBuff = 0;
+ }
+
+ private void complete()
+ {
+ m_storedCombinedCRC = readInt();
+ if( m_storedCombinedCRC != m_computedCombinedCRC )
+ {
+ crcError();
+ }
+
+ bsFinishedWithStream();
+ m_streamEnd = true;
+ }
+
+ private void endBlock()
+ {
+ m_computedBlockCRC = m_crc.getFinalCRC();
+ /*
+ * A bad CRC is considered a fatal error.
+ */
+ if( m_storedBlockCRC != m_computedBlockCRC )
+ {
+ crcError();
+ }
+
+ m_computedCombinedCRC = ( m_computedCombinedCRC << 1 )
+ | ( m_computedCombinedCRC >>> 31 );
+ m_computedCombinedCRC ^= m_computedBlockCRC;
+ }
+
+ private void hbCreateDecodeTables( final int[] limit,
+ final int[] base,
+ final int[] perm,
+ final char[] length,
+ final int minLen,
+ final int maxLen,
+ final int alphaSize )
+ {
+ int pp = 0;
+ for( int i = minLen; i <= maxLen; i++ )
+ {
+ for( int j = 0; j < alphaSize; j++ )
+ {
+ if( length[ j ] == i )
+ {
+ perm[ pp ] = j;
+ pp++;
+ }
+ }
+ }
+
+ for( int i = 0; i < MAX_CODE_LEN; i++ )
+ {
+ base[ i ] = 0;
+ }
+
+ for( int i = 0; i < alphaSize; i++ )
+ {
+ base[ length[ i ] + 1 ]++;
+ }
+
+ for( int i = 1; i < MAX_CODE_LEN; i++ )
+ {
+ base[ i ] += base[ i - 1 ];
+ }
+
+ for( int i = 0; i < MAX_CODE_LEN; i++ )
+ {
+ limit[ i ] = 0;
+ }
+
+ int vec = 0;
+ for( int i = minLen; i <= maxLen; i++ )
+ {
+ vec += ( base[ i + 1 ] - base[ i ] );
+ limit[ i ] = vec - 1;
+ vec <<= 1;
+ }
+
+ for( int i = minLen + 1; i <= maxLen; i++ )
+ {
+ base[ i ] = ( ( limit[ i - 1 ] + 1 ) << 1 ) - base[ i ];
+ }
+ }
+
+ private void initBlock()
+ {
+ final char magic1 = readUnsignedChar();
+ final char magic2 = readUnsignedChar();
+ final char magic3 = readUnsignedChar();
+ final char magic4 = readUnsignedChar();
+ final char magic5 = readUnsignedChar();
+ final char magic6 = readUnsignedChar();
+ if( magic1 == 0x17 && magic2 == 0x72 && magic3 == 0x45 &&
+ magic4 == 0x38 && magic5 == 0x50 && magic6 == 0x90 )
+ {
+ complete();
+ return;
+ }
+
+ if( magic1 != 0x31 || magic2 != 0x41 || magic3 != 0x59 ||
+ magic4 != 0x26 || magic5 != 0x53 || magic6 != 0x59 )
+ {
+ badBlockHeader();
+ m_streamEnd = true;
+ return;
+ }
+
+ m_storedBlockCRC = readInt();
+
+ if( bsR( 1 ) == 1 )
+ {
+ m_blockRandomised = true;
+ }
+ else
+ {
+ m_blockRandomised = false;
+ }
+
+ // currBlockNo++;
+ getAndMoveToFrontDecode();
+
+ m_crc.initialiseCRC();
+ m_currentState = START_BLOCK_STATE;
+ }
+
+ private void initialize()
+ {
+ final char magic3 = readUnsignedChar();
+ final char magic4 = readUnsignedChar();
+ if( magic3 != 'h' || magic4 < '1' || magic4 > '9' )
+ {
+ bsFinishedWithStream();
+ m_streamEnd = true;
+ return;
+ }
+
+ setDecompressStructureSizes( magic4 - '0' );
+ m_computedCombinedCRC = 0;
+ }
+
+ private void makeMaps()
+ {
+ m_nInUse = 0;
+ for( int i = 0; i < 256; i++ )
+ {
+ if( m_inUse[ i ] )
+ {
+ m_seqToUnseq[ m_nInUse ] = (char)i;
+ m_unseqToSeq[ i ] = (char)m_nInUse;
+ m_nInUse++;
+ }
+ }
+ }
+
+ private void recvDecodingTables()
+ {
+ buildInUseTable();
+ makeMaps();
+ final int alphaSize = m_nInUse + 2;
+
+ /*
+ * Now the selectors
+ */
+ final int groupCount = bsR( 3 );
+ final int selectorCount = bsR( 15 );
+ for( int i = 0; i < selectorCount; i++ )
+ {
+ int run = 0;
+ while( bsR( 1 ) == 1 )
+ {
+ run++;
+ }
+ m_selectorMtf[ i ] = (char)run;
+ }
+
+ /*
+ * Undo the MTF values for the selectors.
+ */
+ final char[] pos = new char[ N_GROUPS ];
+ for( char v = 0; v < groupCount; v++ )
+ {
+ pos[ v ] = v;
+ }
+
+ for( int i = 0; i < selectorCount; i++ )
+ {
+ int v = m_selectorMtf[ i ];
+ final char tmp = pos[ v ];
+ while( v > 0 )
+ {
+ pos[ v ] = pos[ v - 1 ];
+ v--;
+ }
+ pos[ 0 ] = tmp;
+ m_selector[ i ] = tmp;
+ }
+
+ final char[][] len = new char[ N_GROUPS ][ MAX_ALPHA_SIZE ];
+ /*
+ * Now the coding tables
+ */
+ for( int i = 0; i < groupCount; i++ )
+ {
+ int curr = bsR( 5 );
+ for( int j = 0; j < alphaSize; j++ )
+ {
+ while( bsR( 1 ) == 1 )
+ {
+ if( bsR( 1 ) == 0 )
+ {
+ curr++;
+ }
+ else
+ {
+ curr--;
+ }
+ }
+ len[ i ][ j ] = (char)curr;
+ }
+ }
+
+ /*
+ * Create the Huffman decoding tables
+ */
+ for( int k = 0; k < groupCount; k++ )
+ {
+ int minLen = 32;
+ int maxLen = 0;
+ for( int i = 0; i < alphaSize; i++ )
+ {
+ if( len[ k ][ i ] > maxLen )
+ {
+ maxLen = len[ k ][ i ];
+ }
+ if( len[ k ][ i ] < minLen )
+ {
+ minLen = len[ k ][ i ];
+ }
+ }
+ hbCreateDecodeTables( m_limit[ k ], m_base[ k ], m_perm[ k ], len[ k ], minLen,
+ maxLen, alphaSize );
+ m_minLens[ k ] = minLen;
+ }
+ }
+
+ private void buildInUseTable()
+ {
+ final boolean[] inUse16 = new boolean[ 16 ];
+
+ /*
+ * Receive the mapping table
+ */
+ for( int i = 0; i < 16; i++ )
+ {
+ if( bsR( 1 ) == 1 )
+ {
+ inUse16[ i ] = true;
+ }
+ else
+ {
+ inUse16[ i ] = false;
+ }
+ }
+
+ for( int i = 0; i < 256; i++ )
+ {
+ m_inUse[ i ] = false;
+ }
+
+ for( int i = 0; i < 16; i++ )
+ {
+ if( inUse16[ i ] )
+ {
+ for( int j = 0; j < 16; j++ )
+ {
+ if( bsR( 1 ) == 1 )
+ {
+ m_inUse[ i * 16 + j ] = true;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/jEdit/installer/CBZip2OutputStream.java b/jEdit/installer/CBZip2OutputStream.java
index 67b2c09..35ad2cc 100644
--- a/jEdit/installer/CBZip2OutputStream.java
+++ b/jEdit/installer/CBZip2OutputStream.java
@@ -1,2021 +1,2021 @@
-/*
- * Copyright (C) The Apache Software Foundation. All rights reserved.
- *
- * This software is published under the terms of the Apache Software License
- * version 1.1, a copy of which has been included with this distribution in
- * the LICENSE.txt file.
- */
-package installer;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-/**
- * An output stream that compresses into the BZip2 format (without the file
- * header chars) into another stream. TODO: Update to BZip2 1.0.1
- *
- * @author <a href="mailto:keiron at aftexsw.com">Keiron Liddle</a>
- */
-public class CBZip2OutputStream
- extends OutputStream
- implements BZip2Constants
-{
- private static final int LOWER_BYTE_MASK = 0x000000ff;
- private static final int UPPER_BYTE_MASK = 0xffffff00;
- private static final int SETMASK = ( 1 << 21 );
- private static final int CLEARMASK = ( ~SETMASK );
- private static final int GREATER_ICOST = 15;
- private static final int LESSER_ICOST = 0;
- private static final int SMALL_THRESH = 20;
- private static final int DEPTH_THRESH = 10;
-
- /*
- * If you are ever unlucky/improbable enough
- * to get a stack overflow whilst sorting,
- * increase the following constant and try
- * again. In practice I have never seen the
- * stack go above 27 elems, so the following
- * limit seems very generous.
- */
- private static final int QSORT_STACK_SIZE = 1000;
-
- private CRC m_crc = new CRC();
-
- private boolean[] m_inUse = new boolean[ 256 ];
-
- private char[] m_seqToUnseq = new char[ 256 ];
- private char[] m_unseqToSeq = new char[ 256 ];
-
- private char[] m_selector = new char[ MAX_SELECTORS ];
- private char[] m_selectorMtf = new char[ MAX_SELECTORS ];
-
- private int[] m_mtfFreq = new int[ MAX_ALPHA_SIZE ];
-
- private int m_currentChar = -1;
- private int m_runLength;
-
- private boolean m_closed;
-
- /*
- * Knuth's increments seem to work better
- * than Incerpi-Sedgewick here. Possibly
- * because the number of elems to sort is
- * usually small, typically <= 20.
- */
- private int[] m_incs = new int[]
- {
- 1, 4, 13, 40, 121, 364, 1093, 3280,
- 9841, 29524, 88573, 265720,
- 797161, 2391484
- };
-
- private boolean m_blockRandomised;
-
- /*
- * always: in the range 0 .. 9.
- * The current block size is 100000 * this number.
- */
- private int m_blockSize100k;
- private int m_bsBuff;
- private int m_bsLive;
-
- /*
- * index of the last char in the block, so
- * the block size == last + 1.
- */
- private int m_last;
-
- /*
- * index in zptr[] of original string after sorting.
- */
- private int m_origPtr;
-
- private int m_allowableBlockSize;
-
- private char[] m_block;
-
- private int m_blockCRC;
- private int m_combinedCRC;
-
- private OutputStream m_bsStream;
- private boolean m_firstAttempt;
- private int[] m_ftab;
- private int m_nInUse;
-
- private int m_nMTF;
- private int[] m_quadrant;
- private short[] m_szptr;
- private int m_workDone;
-
- /*
- * Used when sorting. If too many long comparisons
- * happen, we stop sorting, randomise the block
- * slightly, and try again.
- */
- private int m_workFactor;
- private int m_workLimit;
- private int[] m_zptr;
-
- public CBZip2OutputStream( final OutputStream output )
- throws IOException
- {
- this( output, 9 );
- }
-
- public CBZip2OutputStream( final OutputStream output, final int blockSize )
- throws IOException
- {
- bsSetStream( output );
- m_workFactor = 50;
-
- int outBlockSize = blockSize;
- if( outBlockSize > 9 )
- {
- outBlockSize = 9;
- }
- if( outBlockSize < 1 )
- {
- outBlockSize = 1;
- }
- m_blockSize100k = outBlockSize;
- allocateCompressStructures();
- initialize();
- initBlock();
- }
-
- private static void hbMakeCodeLengths( char[] len, int[] freq,
- int alphaSize, int maxLen )
- {
- /*
- * Nodes and heap entries run from 1. Entry 0
- * for both the heap and nodes is a sentinel.
- */
- int nNodes;
- /*
- * Nodes and heap entries run from 1. Entry 0
- * for both the heap and nodes is a sentinel.
- */
- int nHeap;
- /*
- * Nodes and heap entries run from 1. Entry 0
- * for both the heap and nodes is a sentinel.
- */
- int n1;
- /*
- * Nodes and heap entries run from 1. Entry 0
- * for both the heap and nodes is a sentinel.
- */
- int n2;
- /*
- * Nodes and heap entries run from 1. Entry 0
- * for both the heap and nodes is a sentinel.
- */
- int i;
- /*
- * Nodes and heap entries run from 1. Entry 0
- * for both the heap and nodes is a sentinel.
- */
- int j;
- /*
- * Nodes and heap entries run from 1. Entry 0
- * for both the heap and nodes is a sentinel.
- */
- int k;
- boolean tooLong;
-
- int[] heap = new int[ MAX_ALPHA_SIZE + 2 ];
- int[] weights = new int[ MAX_ALPHA_SIZE * 2 ];
- int[] parent = new int[ MAX_ALPHA_SIZE * 2 ];
-
- for( i = 0; i < alphaSize; i++ )
- {
- weights[ i + 1 ] = ( freq[ i ] == 0 ? 1 : freq[ i ] ) << 8;
- }
-
- while( true )
- {
- nNodes = alphaSize;
- nHeap = 0;
-
- heap[ 0 ] = 0;
- weights[ 0 ] = 0;
- parent[ 0 ] = -2;
-
- for( i = 1; i <= alphaSize; i++ )
- {
- parent[ i ] = -1;
- nHeap++;
- heap[ nHeap ] = i;
- {
- int zz;
- int tmp;
- zz = nHeap;
- tmp = heap[ zz ];
- while( weights[ tmp ] < weights[ heap[ zz >> 1 ] ] )
- {
- heap[ zz ] = heap[ zz >> 1 ];
- zz >>= 1;
- }
- heap[ zz ] = tmp;
- }
- }
- if( !( nHeap < ( MAX_ALPHA_SIZE + 2 ) ) )
- {
- panic();
- }
-
- while( nHeap > 1 )
- {
- n1 = heap[ 1 ];
- heap[ 1 ] = heap[ nHeap ];
- nHeap--;
- {
- int zz = 0;
- int yy = 0;
- int tmp = 0;
- zz = 1;
- tmp = heap[ zz ];
- while( true )
- {
- yy = zz << 1;
- if( yy > nHeap )
- {
- break;
- }
- if( yy < nHeap &&
- weights[ heap[ yy + 1 ] ] < weights[ heap[ yy ] ] )
- {
- yy++;
- }
- if( weights[ tmp ] < weights[ heap[ yy ] ] )
- {
- break;
- }
- heap[ zz ] = heap[ yy ];
- zz = yy;
- }
- heap[ zz ] = tmp;
- }
- n2 = heap[ 1 ];
- heap[ 1 ] = heap[ nHeap ];
- nHeap--;
- {
- int zz = 0;
- int yy = 0;
- int tmp = 0;
- zz = 1;
- tmp = heap[ zz ];
- while( true )
- {
- yy = zz << 1;
- if( yy > nHeap )
- {
- break;
- }
- if( yy < nHeap &&
- weights[ heap[ yy + 1 ] ] < weights[ heap[ yy ] ] )
- {
- yy++;
- }
- if( weights[ tmp ] < weights[ heap[ yy ] ] )
- {
- break;
- }
- heap[ zz ] = heap[ yy ];
- zz = yy;
- }
- heap[ zz ] = tmp;
- }
- nNodes++;
- parent[ n1 ] = nNodes;
- parent[ n2 ] = nNodes;
-
- final int v1 = weights[ n1 ];
- final int v2 = weights[ n2 ];
- final int weight = calculateWeight( v1, v2 );
- weights[ nNodes ] = weight;
-
- parent[ nNodes ] = -1;
- nHeap++;
- heap[ nHeap ] = nNodes;
- {
- int zz = 0;
- int tmp = 0;
- zz = nHeap;
- tmp = heap[ zz ];
- while( weights[ tmp ] < weights[ heap[ zz >> 1 ] ] )
- {
- heap[ zz ] = heap[ zz >> 1 ];
- zz >>= 1;
- }
- heap[ zz ] = tmp;
- }
- }
- if( !( nNodes < ( MAX_ALPHA_SIZE * 2 ) ) )
- {
- panic();
- }
-
- tooLong = false;
- for( i = 1; i <= alphaSize; i++ )
- {
- j = 0;
- k = i;
- while( parent[ k ] >= 0 )
- {
- k = parent[ k ];
- j++;
- }
- len[ i - 1 ] = (char)j;
- if( j > maxLen )
- {
- tooLong = true;
- }
- }
-
- if( !tooLong )
- {
- break;
- }
-
- for( i = 1; i < alphaSize; i++ )
- {
- j = weights[ i ] >> 8;
- j = 1 + ( j / 2 );
- weights[ i ] = j << 8;
- }
- }
- }
-
- private static int calculateWeight( final int v1, final int v2 )
- {
- final int upper = ( v1 & UPPER_BYTE_MASK ) + ( v2 & UPPER_BYTE_MASK );
- final int v1Lower = ( v1 & LOWER_BYTE_MASK );
- final int v2Lower = ( v2 & LOWER_BYTE_MASK );
- final int nnnn = ( v1Lower > v2Lower ) ? v1Lower : v2Lower;
- return upper | ( 1 + nnnn );
- }
-
- private static void panic()
- {
- System.out.println( "panic" );
- //throw new CError();
- }
-
- public void close()
- throws IOException
- {
- if( m_closed )
- {
- return;
- }
-
- if( m_runLength > 0 )
- {
- writeRun();
- }
- m_currentChar = -1;
- endBlock();
- endCompression();
- m_closed = true;
- super.close();
- m_bsStream.close();
- }
-
- public void finalize()
- throws Throwable
- {
- close();
- }
-
- public void flush()
- throws IOException
- {
- super.flush();
- m_bsStream.flush();
- }
-
- /**
- * modified by Oliver Merkel, 010128
- *
- * @param bv Description of Parameter
- * @exception java.io.IOException Description of Exception
- */
- public void write( int bv )
- throws IOException
- {
- int b = ( 256 + bv ) % 256;
- if( m_currentChar != -1 )
- {
- if( m_currentChar == b )
- {
- m_runLength++;
- if( m_runLength > 254 )
- {
- writeRun();
- m_currentChar = -1;
- m_runLength = 0;
- }
- }
- else
- {
- writeRun();
- m_runLength = 1;
- m_currentChar = b;
- }
- }
- else
- {
- m_currentChar = b;
- m_runLength++;
- }
- }
-
- private void allocateCompressStructures()
- {
- int n = BASE_BLOCK_SIZE * m_blockSize100k;
- m_block = new char[ ( n + 1 + NUM_OVERSHOOT_BYTES ) ];
- m_quadrant = new int[ ( n + NUM_OVERSHOOT_BYTES ) ];
- m_zptr = new int[ n ];
- m_ftab = new int[ 65537 ];
-
- if( m_block == null || m_quadrant == null || m_zptr == null
- || m_ftab == null )
- {
- //int totalDraw = (n + 1 + NUM_OVERSHOOT_BYTES) + (n + NUM_OVERSHOOT_BYTES) + n + 65537;
- //compressOutOfMemory ( totalDraw, n );
- }
-
- /*
- * The back end needs a place to store the MTF values
- * whilst it calculates the coding tables. We could
- * put them in the zptr array. However, these values
- * will fit in a short, so we overlay szptr at the
- * start of zptr, in the hope of reducing the number
- * of cache misses induced by the multiple traversals
- * of the MTF values when calculating coding tables.
- * Seems to improve compression speed by about 1%.
- */
- // szptr = zptr;
-
- m_szptr = new short[ 2 * n ];
- }
-
- private void bsFinishedWithStream()
- throws IOException
- {
- while( m_bsLive > 0 )
- {
- int ch = ( m_bsBuff >> 24 );
- try
- {
- m_bsStream.write( ch );// write 8-bit
- }
- catch( IOException e )
- {
- throw e;
- }
- m_bsBuff <<= 8;
- m_bsLive -= 8;
- }
- }
-
- private void bsPutIntVS( int numBits, int c )
- throws IOException
- {
- bsW( numBits, c );
- }
-
- private void bsPutUChar( int c )
- throws IOException
- {
- bsW( 8, c );
- }
-
- private void bsPutint( int u )
- throws IOException
- {
- bsW( 8, ( u >> 24 ) & 0xff );
- bsW( 8, ( u >> 16 ) & 0xff );
- bsW( 8, ( u >> 8 ) & 0xff );
- bsW( 8, u & 0xff );
- }
-
- private void bsSetStream( OutputStream f )
- {
- m_bsStream = f;
- m_bsLive = 0;
- m_bsBuff = 0;
- }
-
- private void bsW( int n, int v )
- throws IOException
- {
- while( m_bsLive >= 8 )
- {
- int ch = ( m_bsBuff >> 24 );
- try
- {
- m_bsStream.write( ch );// write 8-bit
- }
- catch( IOException e )
- {
- throw e;
- }
- m_bsBuff <<= 8;
- m_bsLive -= 8;
- }
- m_bsBuff |= ( v << ( 32 - m_bsLive - n ) );
- m_bsLive += n;
- }
-
- private void doReversibleTransformation()
- {
- int i;
-
- m_workLimit = m_workFactor * m_last;
- m_workDone = 0;
- m_blockRandomised = false;
- m_firstAttempt = true;
-
- mainSort();
-
- if( m_workDone > m_workLimit && m_firstAttempt )
- {
- randomiseBlock();
- m_workLimit = 0;
- m_workDone = 0;
- m_blockRandomised = true;
- m_firstAttempt = false;
- mainSort();
- }
-
- m_origPtr = -1;
- for( i = 0; i <= m_last; i++ )
- {
- if( m_zptr[ i ] == 0 )
- {
- m_origPtr = i;
- break;
- }
- }
- ;
-
- if( m_origPtr == -1 )
- {
- panic();
- }
- }
-
- private void endBlock()
- throws IOException
- {
- m_blockCRC = m_crc.getFinalCRC();
- m_combinedCRC = ( m_combinedCRC << 1 ) | ( m_combinedCRC >>> 31 );
- m_combinedCRC ^= m_blockCRC;
-
- /*
- * sort the block and establish posn of original string
- */
- doReversibleTransformation();
-
- /*
- * A 6-byte block header, the value chosen arbitrarily
- * as 0x314159265359 :-). A 32 bit value does not really
- * give a strong enough guarantee that the value will not
- * appear by chance in the compressed datastream. Worst-case
- * probability of this event, for a 900k block, is about
- * 2.0e-3 for 32 bits, 1.0e-5 for 40 bits and 4.0e-8 for 48 bits.
- * For a compressed file of size 100Gb -- about 100000 blocks --
- * only a 48-bit marker will do. NB: normal compression/
- * decompression do *not* rely on these statistical properties.
- * They are only important when trying to recover blocks from
- * damaged files.
- */
- bsPutUChar( 0x31 );
- bsPutUChar( 0x41 );
- bsPutUChar( 0x59 );
- bsPutUChar( 0x26 );
- bsPutUChar( 0x53 );
- bsPutUChar( 0x59 );
-
- /*
- * Now the block's CRC, so it is in a known place.
- */
- bsPutint( m_blockCRC );
-
- /*
- * Now a single bit indicating randomisation.
- */
- if( m_blockRandomised )
- {
- bsW( 1, 1 );
- }
- else
- {
- bsW( 1, 0 );
- }
-
- /*
- * Finally, block's contents proper.
- */
- moveToFrontCodeAndSend();
- }
-
- private void endCompression()
- throws IOException
- {
- /*
- * Now another magic 48-bit number, 0x177245385090, to
- * indicate the end of the last block. (sqrt(pi), if
- * you want to know. I did want to use e, but it contains
- * too much repetition -- 27 18 28 18 28 46 -- for me
- * to feel statistically comfortable. Call me paranoid.)
- */
- bsPutUChar( 0x17 );
- bsPutUChar( 0x72 );
- bsPutUChar( 0x45 );
- bsPutUChar( 0x38 );
- bsPutUChar( 0x50 );
- bsPutUChar( 0x90 );
-
- bsPutint( m_combinedCRC );
-
- bsFinishedWithStream();
- }
-
- private boolean fullGtU( int i1, int i2 )
- {
- int k;
- char c1;
- char c2;
- int s1;
- int s2;
-
- c1 = m_block[ i1 + 1 ];
- c2 = m_block[ i2 + 1 ];
- if( c1 != c2 )
- {
- return ( c1 > c2 );
- }
- i1++;
- i2++;
-
- c1 = m_block[ i1 + 1 ];
- c2 = m_block[ i2 + 1 ];
- if( c1 != c2 )
- {
- return ( c1 > c2 );
- }
- i1++;
- i2++;
-
- c1 = m_block[ i1 + 1 ];
- c2 = m_block[ i2 + 1 ];
- if( c1 != c2 )
- {
- return ( c1 > c2 );
- }
- i1++;
- i2++;
-
- c1 = m_block[ i1 + 1 ];
- c2 = m_block[ i2 + 1 ];
- if( c1 != c2 )
- {
- return ( c1 > c2 );
- }
- i1++;
- i2++;
-
- c1 = m_block[ i1 + 1 ];
- c2 = m_block[ i2 + 1 ];
- if( c1 != c2 )
- {
- return ( c1 > c2 );
- }
- i1++;
- i2++;
-
- c1 = m_block[ i1 + 1 ];
- c2 = m_block[ i2 + 1 ];
- if( c1 != c2 )
- {
- return ( c1 > c2 );
- }
- i1++;
- i2++;
-
- k = m_last + 1;
-
- do
- {
- c1 = m_block[ i1 + 1 ];
- c2 = m_block[ i2 + 1 ];
- if( c1 != c2 )
- {
- return ( c1 > c2 );
- }
- s1 = m_quadrant[ i1 ];
- s2 = m_quadrant[ i2 ];
- if( s1 != s2 )
- {
- return ( s1 > s2 );
- }
- i1++;
- i2++;
-
- c1 = m_block[ i1 + 1 ];
- c2 = m_block[ i2 + 1 ];
- if( c1 != c2 )
- {
- return ( c1 > c2 );
- }
- s1 = m_quadrant[ i1 ];
- s2 = m_quadrant[ i2 ];
- if( s1 != s2 )
- {
- return ( s1 > s2 );
- }
- i1++;
- i2++;
-
- c1 = m_block[ i1 + 1 ];
- c2 = m_block[ i2 + 1 ];
- if( c1 != c2 )
- {
- return ( c1 > c2 );
- }
- s1 = m_quadrant[ i1 ];
- s2 = m_quadrant[ i2 ];
- if( s1 != s2 )
- {
- return ( s1 > s2 );
- }
- i1++;
- i2++;
-
- c1 = m_block[ i1 + 1 ];
- c2 = m_block[ i2 + 1 ];
- if( c1 != c2 )
- {
- return ( c1 > c2 );
- }
- s1 = m_quadrant[ i1 ];
- s2 = m_quadrant[ i2 ];
- if( s1 != s2 )
- {
- return ( s1 > s2 );
- }
- i1++;
- i2++;
-
- if( i1 > m_last )
- {
- i1 -= m_last;
- i1--;
- }
- ;
- if( i2 > m_last )
- {
- i2 -= m_last;
- i2--;
- }
- ;
-
- k -= 4;
- m_workDone++;
- } while( k >= 0 );
-
- return false;
- }
-
- private void generateMTFValues()
- {
- char[] yy = new char[ 256 ];
- int i;
- int j;
- char tmp;
- char tmp2;
- int zPend;
- int wr;
- int EOB;
-
- makeMaps();
- EOB = m_nInUse + 1;
-
- for( i = 0; i <= EOB; i++ )
- {
- m_mtfFreq[ i ] = 0;
- }
-
- wr = 0;
- zPend = 0;
- for( i = 0; i < m_nInUse; i++ )
- {
- yy[ i ] = (char)i;
- }
-
- for( i = 0; i <= m_last; i++ )
- {
- char ll_i;
-
- ll_i = m_unseqToSeq[ m_block[ m_zptr[ i ] ] ];
-
- j = 0;
- tmp = yy[ j ];
- while( ll_i != tmp )
- {
- j++;
- tmp2 = tmp;
- tmp = yy[ j ];
- yy[ j ] = tmp2;
- }
- ;
- yy[ 0 ] = tmp;
-
- if( j == 0 )
- {
- zPend++;
- }
- else
- {
- if( zPend > 0 )
- {
- zPend--;
- while( true )
- {
- switch( zPend % 2 )
- {
- case 0:
- m_szptr[ wr ] = (short)RUNA;
- wr++;
- m_mtfFreq[ RUNA ]++;
- break;
- case 1:
- m_szptr[ wr ] = (short)RUNB;
- wr++;
- m_mtfFreq[ RUNB ]++;
- break;
- }
- ;
- if( zPend < 2 )
- {
- break;
- }
- zPend = ( zPend - 2 ) / 2;
- }
- ;
- zPend = 0;
- }
- m_szptr[ wr ] = (short)( j + 1 );
- wr++;
- m_mtfFreq[ j + 1 ]++;
- }
- }
-
- if( zPend > 0 )
- {
- zPend--;
- while( true )
- {
- switch( zPend % 2 )
- {
- case 0:
- m_szptr[ wr ] = (short)RUNA;
- wr++;
- m_mtfFreq[ RUNA ]++;
- break;
- case 1:
- m_szptr[ wr ] = (short)RUNB;
- wr++;
- m_mtfFreq[ RUNB ]++;
- break;
- }
- if( zPend < 2 )
- {
- break;
- }
- zPend = ( zPend - 2 ) / 2;
- }
- }
-
- m_szptr[ wr ] = (short)EOB;
- wr++;
- m_mtfFreq[ EOB ]++;
-
- m_nMTF = wr;
- }
-
- private void hbAssignCodes( int[] code, char[] length, int minLen,
- int maxLen, int alphaSize )
- {
- int n;
- int vec;
- int i;
-
- vec = 0;
- for( n = minLen; n <= maxLen; n++ )
- {
- for( i = 0; i < alphaSize; i++ )
- {
- if( length[ i ] == n )
- {
- code[ i ] = vec;
- vec++;
- }
- }
- ;
- vec <<= 1;
- }
- }
-
- private void initBlock()
- {
- // blockNo++;
- m_crc.initialiseCRC();
- m_last = -1;
- // ch = 0;
-
- for( int i = 0; i < 256; i++ )
- {
- m_inUse[ i ] = false;
- }
-
- /*
- * 20 is just a paranoia constant
- */
- m_allowableBlockSize = BASE_BLOCK_SIZE * m_blockSize100k - 20;
- }
-
- private void initialize()
- throws IOException
- {
- /*
- * Write `magic' bytes h indicating file-format == huffmanised,
- * followed by a digit indicating blockSize100k.
- */
- bsPutUChar( 'h' );
- bsPutUChar( '0' + m_blockSize100k );
-
- m_combinedCRC = 0;
- }
-
- private void mainSort()
- {
- int i;
- int j;
- int ss;
- int sb;
- int[] runningOrder = new int[ 256 ];
- int[] copy = new int[ 256 ];
- boolean[] bigDone = new boolean[ 256 ];
- int c1;
- int c2;
-
- /*
- * In the various block-sized structures, live data runs
- * from 0 to last+NUM_OVERSHOOT_BYTES inclusive. First,
- * set up the overshoot area for block.
- */
- // if (verbosity >= 4) fprintf ( stderr, " sort initialise ...\n" );
- for( i = 0; i < NUM_OVERSHOOT_BYTES; i++ )
- {
- m_block[ m_last + i + 2 ] = m_block[ ( i % ( m_last + 1 ) ) + 1 ];
- }
- for( i = 0; i <= m_last + NUM_OVERSHOOT_BYTES; i++ )
- {
- m_quadrant[ i ] = 0;
- }
-
- m_block[ 0 ] = m_block[ m_last + 1 ];
-
- if( m_last < 4000 )
- {
- /*
- * Use simpleSort(), since the full sorting mechanism
- * has quite a large constant overhead.
- */
- for( i = 0; i <= m_last; i++ )
- {
- m_zptr[ i ] = i;
- }
- m_firstAttempt = false;
- m_workDone = 0;
- m_workLimit = 0;
- simpleSort( 0, m_last, 0 );
- }
- else
- {
- for( i = 0; i <= 255; i++ )
- {
- bigDone[ i ] = false;
- }
-
- for( i = 0; i <= 65536; i++ )
- {
- m_ftab[ i ] = 0;
- }
-
- c1 = m_block[ 0 ];
- for( i = 0; i <= m_last; i++ )
- {
- c2 = m_block[ i + 1 ];
- m_ftab[ ( c1 << 8 ) + c2 ]++;
- c1 = c2;
- }
-
- for( i = 1; i <= 65536; i++ )
- {
- m_ftab[ i ] += m_ftab[ i - 1 ];
- }
-
- c1 = m_block[ 1 ];
- for( i = 0; i < m_last; i++ )
- {
- c2 = m_block[ i + 2 ];
- j = ( c1 << 8 ) + c2;
- c1 = c2;
- m_ftab[ j ]--;
- m_zptr[ m_ftab[ j ] ] = i;
- }
-
- j = ( ( m_block[ m_last + 1 ] ) << 8 ) + ( m_block[ 1 ] );
- m_ftab[ j ]--;
- m_zptr[ m_ftab[ j ] ] = m_last;
-
- /*
- * Now ftab contains the first loc of every small bucket.
- * Calculate the running order, from smallest to largest
- * big bucket.
- */
- for( i = 0; i <= 255; i++ )
- {
- runningOrder[ i ] = i;
- }
- {
- int vv;
- int h = 1;
- do
- {
- h = 3 * h + 1;
- } while( h <= 256 );
- do
- {
- h = h / 3;
- for( i = h; i <= 255; i++ )
- {
- vv = runningOrder[ i ];
- j = i;
- while( ( m_ftab[ ( ( runningOrder[ j - h ] ) + 1 ) << 8 ]
- - m_ftab[ ( runningOrder[ j - h ] ) << 8 ] ) >
- ( m_ftab[ ( ( vv ) + 1 ) << 8 ] - m_ftab[ ( vv ) << 8 ] ) )
- {
- runningOrder[ j ] = runningOrder[ j - h ];
- j = j - h;
- if( j <= ( h - 1 ) )
- {
- break;
- }
- }
- runningOrder[ j ] = vv;
- }
- } while( h != 1 );
- }
-
- /*
- * The main sorting loop.
- */
- for( i = 0; i <= 255; i++ )
- {
-
- /*
- * Process big buckets, starting with the least full.
- */
- ss = runningOrder[ i ];
-
- /*
- * Complete the big bucket [ss] by quicksorting
- * any unsorted small buckets [ss, j]. Hopefully
- * previous pointer-scanning phases have already
- * completed many of the small buckets [ss, j], so
- * we don't have to sort them at all.
- */
- for( j = 0; j <= 255; j++ )
- {
- sb = ( ss << 8 ) + j;
- if( !( ( m_ftab[ sb ] & SETMASK ) == SETMASK ) )
- {
- int lo = m_ftab[ sb ] & CLEARMASK;
- int hi = ( m_ftab[ sb + 1 ] & CLEARMASK ) - 1;
- if( hi > lo )
- {
- qSort3( lo, hi, 2 );
- if( m_workDone > m_workLimit && m_firstAttempt )
- {
- return;
- }
- }
- m_ftab[ sb ] |= SETMASK;
- }
- }
-
- /*
- * The ss big bucket is now done. Record this fact,
- * and update the quadrant descriptors. Remember to
- * update quadrants in the overshoot area too, if
- * necessary. The "if (i < 255)" test merely skips
- * this updating for the last bucket processed, since
- * updating for the last bucket is pointless.
- */
- bigDone[ ss ] = true;
-
- if( i < 255 )
- {
- int bbStart = m_ftab[ ss << 8 ] & CLEARMASK;
- int bbSize = ( m_ftab[ ( ss + 1 ) << 8 ] & CLEARMASK ) - bbStart;
- int shifts = 0;
-
- while( ( bbSize >> shifts ) > 65534 )
- {
- shifts++;
- }
-
- for( j = 0; j < bbSize; j++ )
- {
- int a2update = m_zptr[ bbStart + j ];
- int qVal = ( j >> shifts );
- m_quadrant[ a2update ] = qVal;
- if( a2update < NUM_OVERSHOOT_BYTES )
- {
- m_quadrant[ a2update + m_last + 1 ] = qVal;
- }
- }
-
- if( !( ( ( bbSize - 1 ) >> shifts ) <= 65535 ) )
- {
- panic();
- }
- }
-
- /*
- * Now scan this big bucket so as to synthesise the
- * sorted order for small buckets [t, ss] for all t != ss.
- */
- for( j = 0; j <= 255; j++ )
- {
- copy[ j ] = m_ftab[ ( j << 8 ) + ss ] & CLEARMASK;
- }
-
- for( j = m_ftab[ ss << 8 ] & CLEARMASK;
- j < ( m_ftab[ ( ss + 1 ) << 8 ] & CLEARMASK ); j++ )
- {
- c1 = m_block[ m_zptr[ j ] ];
- if( !bigDone[ c1 ] )
- {
- m_zptr[ copy[ c1 ] ] = m_zptr[ j ] == 0 ? m_last : m_zptr[ j ] - 1;
- copy[ c1 ]++;
- }
- }
-
- for( j = 0; j <= 255; j++ )
- {
- m_ftab[ ( j << 8 ) + ss ] |= SETMASK;
- }
- }
- }
- }
-
- private void makeMaps()
- {
- int i;
- m_nInUse = 0;
- for( i = 0; i < 256; i++ )
- {
- if( m_inUse[ i ] )
- {
- m_seqToUnseq[ m_nInUse ] = (char)i;
- m_unseqToSeq[ i ] = (char)m_nInUse;
- m_nInUse++;
- }
- }
- }
-
- private char med3( char a, char b, char c )
- {
- char t;
- if( a > b )
- {
- t = a;
- a = b;
- b = t;
- }
- if( b > c )
- {
- t = b;
- b = c;
- c = t;
- }
- if( a > b )
- {
- b = a;
- }
- return b;
- }
-
- private void moveToFrontCodeAndSend()
- throws IOException
- {
- bsPutIntVS( 24, m_origPtr );
- generateMTFValues();
- sendMTFValues();
- }
-
- private void qSort3( int loSt, int hiSt, int dSt )
- {
- int unLo;
- int unHi;
- int ltLo;
- int gtHi;
- int med;
- int n;
- int m;
- int sp;
- int lo;
- int hi;
- int d;
- StackElem[] stack = new StackElem[ QSORT_STACK_SIZE ];
- for( int count = 0; count < QSORT_STACK_SIZE; count++ )
- {
- stack[ count ] = new StackElem();
- }
-
- sp = 0;
-
- stack[ sp ].m_ll = loSt;
- stack[ sp ].m_hh = hiSt;
- stack[ sp ].m_dd = dSt;
- sp++;
-
- while( sp > 0 )
- {
- if( sp >= QSORT_STACK_SIZE )
- {
- panic();
- }
-
- sp--;
- lo = stack[ sp ].m_ll;
- hi = stack[ sp ].m_hh;
- d = stack[ sp ].m_dd;
-
- if( hi - lo < SMALL_THRESH || d > DEPTH_THRESH )
- {
- simpleSort( lo, hi, d );
- if( m_workDone > m_workLimit && m_firstAttempt )
- {
- return;
- }
- continue;
- }
-
- med = med3( m_block[ m_zptr[ lo ] + d + 1 ],
- m_block[ m_zptr[ hi ] + d + 1 ],
- m_block[ m_zptr[ ( lo + hi ) >> 1 ] + d + 1 ] );
-
- unLo = lo;
- ltLo = lo;
- unHi = hi;
- gtHi = hi;
-
- while( true )
- {
- while( true )
- {
- if( unLo > unHi )
- {
- break;
- }
- n = m_block[ m_zptr[ unLo ] + d + 1 ] - med;
- if( n == 0 )
- {
- int temp = 0;
- temp = m_zptr[ unLo ];
- m_zptr[ unLo ] = m_zptr[ ltLo ];
- m_zptr[ ltLo ] = temp;
- ltLo++;
- unLo++;
- continue;
- }
- ;
- if( n > 0 )
- {
- break;
- }
- unLo++;
- }
- while( true )
- {
- if( unLo > unHi )
- {
- break;
- }
- n = m_block[ m_zptr[ unHi ] + d + 1 ] - med;
- if( n == 0 )
- {
- int temp = 0;
- temp = m_zptr[ unHi ];
- m_zptr[ unHi ] = m_zptr[ gtHi ];
- m_zptr[ gtHi ] = temp;
- gtHi--;
- unHi--;
- continue;
- }
- ;
- if( n < 0 )
- {
- break;
- }
- unHi--;
- }
- if( unLo > unHi )
- {
- break;
- }
- int temp = 0;
- temp = m_zptr[ unLo ];
- m_zptr[ unLo ] = m_zptr[ unHi ];
- m_zptr[ unHi ] = temp;
- unLo++;
- unHi--;
- }
-
- if( gtHi < ltLo )
- {
- stack[ sp ].m_ll = lo;
- stack[ sp ].m_hh = hi;
- stack[ sp ].m_dd = d + 1;
- sp++;
- continue;
- }
-
- n = ( ( ltLo - lo ) < ( unLo - ltLo ) ) ? ( ltLo - lo ) : ( unLo - ltLo );
- vswap( lo, unLo - n, n );
- m = ( ( hi - gtHi ) < ( gtHi - unHi ) ) ? ( hi - gtHi ) : ( gtHi - unHi );
- vswap( unLo, hi - m + 1, m );
-
- n = lo + unLo - ltLo - 1;
- m = hi - ( gtHi - unHi ) + 1;
-
- stack[ sp ].m_ll = lo;
- stack[ sp ].m_hh = n;
- stack[ sp ].m_dd = d;
- sp++;
-
- stack[ sp ].m_ll = n + 1;
- stack[ sp ].m_hh = m - 1;
- stack[ sp ].m_dd = d + 1;
- sp++;
-
- stack[ sp ].m_ll = m;
- stack[ sp ].m_hh = hi;
- stack[ sp ].m_dd = d;
- sp++;
- }
- }
-
- private void randomiseBlock()
- {
- int i;
- int rNToGo = 0;
- int rTPos = 0;
- for( i = 0; i < 256; i++ )
- {
- m_inUse[ i ] = false;
- }
-
- for( i = 0; i <= m_last; i++ )
- {
- if( rNToGo == 0 )
- {
- rNToGo = (char)RAND_NUMS[ rTPos ];
- rTPos++;
- if( rTPos == 512 )
- {
- rTPos = 0;
- }
- }
- rNToGo--;
- m_block[ i + 1 ] ^= ( ( rNToGo == 1 ) ? 1 : 0 );
- // handle 16 bit signed numbers
- m_block[ i + 1 ] &= 0xFF;
-
- m_inUse[ m_block[ i + 1 ] ] = true;
- }
- }
-
- private void sendMTFValues()
- throws IOException
- {
- char[][] len = new char[ N_GROUPS ][ MAX_ALPHA_SIZE ];
-
- int v;
-
- int t;
-
- int i;
-
- int j;
-
- int gs;
-
- int ge;
-
- int bt;
-
- int bc;
-
- int iter;
- int nSelectors = 0;
- int alphaSize;
- int minLen;
- int maxLen;
- int selCtr;
- int nGroups;
-
- alphaSize = m_nInUse + 2;
- for( t = 0; t < N_GROUPS; t++ )
- {
- for( v = 0; v < alphaSize; v++ )
- {
- len[ t ][ v ] = (char)GREATER_ICOST;
- }
- }
-
- /*
- * Decide how many coding tables to use
- */
- if( m_nMTF <= 0 )
- {
- panic();
- }
-
- if( m_nMTF < 200 )
- {
- nGroups = 2;
- }
- else if( m_nMTF < 600 )
- {
- nGroups = 3;
- }
- else if( m_nMTF < 1200 )
- {
- nGroups = 4;
- }
- else if( m_nMTF < 2400 )
- {
- nGroups = 5;
- }
- else
- {
- nGroups = 6;
- }
- {
- /*
- * Generate an initial set of coding tables
- */
- int nPart;
- int remF;
- int tFreq;
- int aFreq;
-
- nPart = nGroups;
- remF = m_nMTF;
- gs = 0;
- while( nPart > 0 )
- {
- tFreq = remF / nPart;
- ge = gs - 1;
- aFreq = 0;
- while( aFreq < tFreq && ge < alphaSize - 1 )
- {
- ge++;
- aFreq += m_mtfFreq[ ge ];
- }
-
- if( ge > gs && nPart != nGroups && nPart != 1
- && ( ( nGroups - nPart ) % 2 == 1 ) )
- {
- aFreq -= m_mtfFreq[ ge ];
- ge--;
- }
-
- for( v = 0; v < alphaSize; v++ )
- {
- if( v >= gs && v <= ge )
- {
- len[ nPart - 1 ][ v ] = (char)LESSER_ICOST;
- }
- else
- {
- len[ nPart - 1 ][ v ] = (char)GREATER_ICOST;
- }
- }
-
- nPart--;
- gs = ge + 1;
- remF -= aFreq;
- }
- }
-
- int[][] rfreq = new int[ N_GROUPS ][ MAX_ALPHA_SIZE ];
- int[] fave = new int[ N_GROUPS ];
- short[] cost = new short[ N_GROUPS ];
- /*
- * Iterate up to N_ITERS times to improve the tables.
- */
- for( iter = 0; iter < N_ITERS; iter++ )
- {
- for( t = 0; t < nGroups; t++ )
- {
- fave[ t ] = 0;
- }
-
- for( t = 0; t < nGroups; t++ )
- {
- for( v = 0; v < alphaSize; v++ )
- {
- rfreq[ t ][ v ] = 0;
- }
- }
-
- nSelectors = 0;
- gs = 0;
- while( true )
- {
-
- /*
- * Set group start & end marks.
- */
- if( gs >= m_nMTF )
- {
- break;
- }
- ge = gs + G_SIZE - 1;
- if( ge >= m_nMTF )
- {
- ge = m_nMTF - 1;
- }
-
- /*
- * Calculate the cost of this group as coded
- * by each of the coding tables.
- */
- for( t = 0; t < nGroups; t++ )
- {
- cost[ t ] = 0;
- }
-
- if( nGroups == 6 )
- {
- short cost0 = 0;
- short cost1 = 0;
- short cost2 = 0;
- short cost3 = 0;
- short cost4 = 0;
- short cost5 = 0;
-
- for( i = gs; i <= ge; i++ )
- {
- short icv = m_szptr[ i ];
- cost0 += len[ 0 ][ icv ];
- cost1 += len[ 1 ][ icv ];
- cost2 += len[ 2 ][ icv ];
- cost3 += len[ 3 ][ icv ];
- cost4 += len[ 4 ][ icv ];
- cost5 += len[ 5 ][ icv ];
- }
- cost[ 0 ] = cost0;
- cost[ 1 ] = cost1;
- cost[ 2 ] = cost2;
- cost[ 3 ] = cost3;
- cost[ 4 ] = cost4;
- cost[ 5 ] = cost5;
- }
- else
- {
- for( i = gs; i <= ge; i++ )
- {
- short icv = m_szptr[ i ];
- for( t = 0; t < nGroups; t++ )
- {
- cost[ t ] += len[ t ][ icv ];
- }
- }
- }
-
- /*
- * Find the coding table which is best for this group,
- * and record its identity in the selector table.
- */
- bc = 999999999;
- bt = -1;
- for( t = 0; t < nGroups; t++ )
- {
- if( cost[ t ] < bc )
- {
- bc = cost[ t ];
- bt = t;
- }
- }
- ;
- fave[ bt ]++;
- m_selector[ nSelectors ] = (char)bt;
- nSelectors++;
-
- /*
- * Increment the symbol frequencies for the selected table.
- */
- for( i = gs; i <= ge; i++ )
- {
- rfreq[ bt ][ m_szptr[ i ] ]++;
- }
-
- gs = ge + 1;
- }
-
- /*
- * Recompute the tables based on the accumulated frequencies.
- */
- for( t = 0; t < nGroups; t++ )
- {
- hbMakeCodeLengths( len[ t ], rfreq[ t ], alphaSize, 20 );
- }
- }
-
- rfreq = null;
- fave = null;
- cost = null;
-
- if( !( nGroups < 8 ) )
- {
- panic();
- }
- if( !( nSelectors < 32768 && nSelectors <= ( 2 + ( 900000 / G_SIZE ) ) ) )
- {
- panic();
- }
- {
- /*
- * Compute MTF values for the selectors.
- */
- char[] pos = new char[ N_GROUPS ];
- char ll_i;
- char tmp2;
- char tmp;
- for( i = 0; i < nGroups; i++ )
- {
- pos[ i ] = (char)i;
- }
- for( i = 0; i < nSelectors; i++ )
- {
- ll_i = m_selector[ i ];
- j = 0;
- tmp = pos[ j ];
- while( ll_i != tmp )
- {
- j++;
- tmp2 = tmp;
- tmp = pos[ j ];
- pos[ j ] = tmp2;
- }
- pos[ 0 ] = tmp;
- m_selectorMtf[ i ] = (char)j;
- }
- }
-
- int[][] code = new int[ N_GROUPS ][ MAX_ALPHA_SIZE ];
-
- /*
- * Assign actual codes for the tables.
- */
- for( t = 0; t < nGroups; t++ )
- {
- minLen = 32;
- maxLen = 0;
- for( i = 0; i < alphaSize; i++ )
- {
- if( len[ t ][ i ] > maxLen )
- {
- maxLen = len[ t ][ i ];
- }
- if( len[ t ][ i ] < minLen )
- {
- minLen = len[ t ][ i ];
- }
- }
- if( maxLen > 20 )
- {
- panic();
- }
- if( minLen < 1 )
- {
- panic();
- }
- hbAssignCodes( code[ t ], len[ t ], minLen, maxLen, alphaSize );
- }
- {
- /*
- * Transmit the mapping table.
- */
- boolean[] inUse16 = new boolean[ 16 ];
- for( i = 0; i < 16; i++ )
- {
- inUse16[ i ] = false;
- for( j = 0; j < 16; j++ )
- {
- if( m_inUse[ i * 16 + j ] )
- {
- inUse16[ i ] = true;
- }
- }
- }
-
- for( i = 0; i < 16; i++ )
- {
- if( inUse16[ i ] )
- {
- bsW( 1, 1 );
- }
- else
- {
- bsW( 1, 0 );
- }
- }
-
- for( i = 0; i < 16; i++ )
- {
- if( inUse16[ i ] )
- {
- for( j = 0; j < 16; j++ )
- {
- if( m_inUse[ i * 16 + j ] )
- {
- bsW( 1, 1 );
- }
- else
- {
- bsW( 1, 0 );
- }
- }
- }
- }
-
- }
-
- /*
- * Now the selectors.
- */
- bsW( 3, nGroups );
- bsW( 15, nSelectors );
- for( i = 0; i < nSelectors; i++ )
- {
- for( j = 0; j < m_selectorMtf[ i ]; j++ )
- {
- bsW( 1, 1 );
- }
- bsW( 1, 0 );
- }
-
- for( t = 0; t < nGroups; t++ )
- {
- int curr = len[ t ][ 0 ];
- bsW( 5, curr );
- for( i = 0; i < alphaSize; i++ )
- {
- while( curr < len[ t ][ i ] )
- {
- bsW( 2, 2 );
- curr++;
- /*
- * 10
- */
- }
- while( curr > len[ t ][ i ] )
- {
- bsW( 2, 3 );
- curr--;
- /*
- * 11
- */
- }
- bsW( 1, 0 );
- }
- }
-
- /*
- * And finally, the block data proper
- */
- selCtr = 0;
- gs = 0;
- while( true )
- {
- if( gs >= m_nMTF )
- {
- break;
- }
- ge = gs + G_SIZE - 1;
- if( ge >= m_nMTF )
- {
- ge = m_nMTF - 1;
- }
- for( i = gs; i <= ge; i++ )
- {
- bsW( len[ m_selector[ selCtr ] ][ m_szptr[ i ] ],
- code[ m_selector[ selCtr ] ][ m_szptr[ i ] ] );
- }
-
- gs = ge + 1;
- selCtr++;
- }
- if( !( selCtr == nSelectors ) )
- {
- panic();
- }
- }
-
- private void simpleSort( int lo, int hi, int d )
- {
- int i;
- int j;
- int h;
- int bigN;
- int hp;
- int v;
-
- bigN = hi - lo + 1;
- if( bigN < 2 )
- {
- return;
- }
-
- hp = 0;
- while( m_incs[ hp ] < bigN )
- {
- hp++;
- }
- hp--;
-
- for( ; hp >= 0; hp-- )
- {
- h = m_incs[ hp ];
-
- i = lo + h;
- while( true )
- {
- /*
- * copy 1
- */
- if( i > hi )
- {
- break;
- }
- v = m_zptr[ i ];
- j = i;
- while( fullGtU( m_zptr[ j - h ] + d, v + d ) )
- {
- m_zptr[ j ] = m_zptr[ j - h ];
- j = j - h;
- if( j <= ( lo + h - 1 ) )
- {
- break;
- }
- }
- m_zptr[ j ] = v;
- i++;
-
- /*
- * copy 2
- */
- if( i > hi )
- {
- break;
- }
- v = m_zptr[ i ];
- j = i;
- while( fullGtU( m_zptr[ j - h ] + d, v + d ) )
- {
- m_zptr[ j ] = m_zptr[ j - h ];
- j = j - h;
- if( j <= ( lo + h - 1 ) )
- {
- break;
- }
- }
- m_zptr[ j ] = v;
- i++;
-
- /*
- * copy 3
- */
- if( i > hi )
- {
- break;
- }
- v = m_zptr[ i ];
- j = i;
- while( fullGtU( m_zptr[ j - h ] + d, v + d ) )
- {
- m_zptr[ j ] = m_zptr[ j - h ];
- j = j - h;
- if( j <= ( lo + h - 1 ) )
- {
- break;
- }
- }
- m_zptr[ j ] = v;
- i++;
-
- if( m_workDone > m_workLimit && m_firstAttempt )
- {
- return;
- }
- }
- }
- }
-
- private void vswap( int p1, int p2, int n )
- {
- int temp = 0;
- while( n > 0 )
- {
- temp = m_zptr[ p1 ];
- m_zptr[ p1 ] = m_zptr[ p2 ];
- m_zptr[ p2 ] = temp;
- p1++;
- p2++;
- n--;
- }
- }
-
- private void writeRun()
- throws IOException
- {
- if( m_last < m_allowableBlockSize )
- {
- m_inUse[ m_currentChar ] = true;
- for( int i = 0; i < m_runLength; i++ )
- {
- m_crc.updateCRC( (char)m_currentChar );
- }
- switch( m_runLength )
- {
- case 1:
- m_last++;
- m_block[ m_last + 1 ] = (char)m_currentChar;
- break;
- case 2:
- m_last++;
- m_block[ m_last + 1 ] = (char)m_currentChar;
- m_last++;
- m_block[ m_last + 1 ] = (char)m_currentChar;
- break;
- case 3:
- m_last++;
- m_block[ m_last + 1 ] = (char)m_currentChar;
- m_last++;
- m_block[ m_last + 1 ] = (char)m_currentChar;
- m_last++;
- m_block[ m_last + 1 ] = (char)m_currentChar;
- break;
- default:
- m_inUse[ m_runLength - 4 ] = true;
- m_last++;
- m_block[ m_last + 1 ] = (char)m_currentChar;
- m_last++;
- m_block[ m_last + 1 ] = (char)m_currentChar;
- m_last++;
- m_block[ m_last + 1 ] = (char)m_currentChar;
- m_last++;
- m_block[ m_last + 1 ] = (char)m_currentChar;
- m_last++;
- m_block[ m_last + 1 ] = (char)( m_runLength - 4 );
- break;
- }
- }
- else
- {
- endBlock();
- initBlock();
- writeRun();
- }
- }
-
- private static class StackElem
- {
- int m_dd;
- int m_hh;
- int m_ll;
- }
-}
-
+/*
+ * Copyright (C) The Apache Software Foundation. All rights reserved.
+ *
+ * This software is published under the terms of the Apache Software License
+ * version 1.1, a copy of which has been included with this distribution in
+ * the LICENSE.txt file.
+ */
+package installer;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * An output stream that compresses into the BZip2 format (without the file
+ * header chars) into another stream. TODO: Update to BZip2 1.0.1
+ *
+ * @author <a href="mailto:keiron at aftexsw.com">Keiron Liddle</a>
+ */
+public class CBZip2OutputStream
+ extends OutputStream
+ implements BZip2Constants
+{
+ private static final int LOWER_BYTE_MASK = 0x000000ff;
+ private static final int UPPER_BYTE_MASK = 0xffffff00;
+ private static final int SETMASK = ( 1 << 21 );
+ private static final int CLEARMASK = ( ~SETMASK );
+ private static final int GREATER_ICOST = 15;
+ private static final int LESSER_ICOST = 0;
+ private static final int SMALL_THRESH = 20;
+ private static final int DEPTH_THRESH = 10;
+
+ /*
+ * If you are ever unlucky/improbable enough
+ * to get a stack overflow whilst sorting,
+ * increase the following constant and try
+ * again. In practice I have never seen the
+ * stack go above 27 elems, so the following
+ * limit seems very generous.
+ */
+ private static final int QSORT_STACK_SIZE = 1000;
+
+ private CRC m_crc = new CRC();
+
+ private boolean[] m_inUse = new boolean[ 256 ];
+
+ private char[] m_seqToUnseq = new char[ 256 ];
+ private char[] m_unseqToSeq = new char[ 256 ];
+
+ private char[] m_selector = new char[ MAX_SELECTORS ];
+ private char[] m_selectorMtf = new char[ MAX_SELECTORS ];
+
+ private int[] m_mtfFreq = new int[ MAX_ALPHA_SIZE ];
+
+ private int m_currentChar = -1;
+ private int m_runLength;
+
+ private boolean m_closed;
+
+ /*
+ * Knuth's increments seem to work better
+ * than Incerpi-Sedgewick here. Possibly
+ * because the number of elems to sort is
+ * usually small, typically <= 20.
+ */
+ private int[] m_incs = new int[]
+ {
+ 1, 4, 13, 40, 121, 364, 1093, 3280,
+ 9841, 29524, 88573, 265720,
+ 797161, 2391484
+ };
+
+ private boolean m_blockRandomised;
+
+ /*
+ * always: in the range 0 .. 9.
+ * The current block size is 100000 * this number.
+ */
+ private int m_blockSize100k;
+ private int m_bsBuff;
+ private int m_bsLive;
+
+ /*
+ * index of the last char in the block, so
+ * the block size == last + 1.
+ */
+ private int m_last;
+
+ /*
+ * index in zptr[] of original string after sorting.
+ */
+ private int m_origPtr;
+
+ private int m_allowableBlockSize;
+
+ private char[] m_block;
+
+ private int m_blockCRC;
+ private int m_combinedCRC;
+
+ private OutputStream m_bsStream;
+ private boolean m_firstAttempt;
+ private int[] m_ftab;
+ private int m_nInUse;
+
+ private int m_nMTF;
+ private int[] m_quadrant;
+ private short[] m_szptr;
+ private int m_workDone;
+
+ /*
+ * Used when sorting. If too many long comparisons
+ * happen, we stop sorting, randomise the block
+ * slightly, and try again.
+ */
+ private int m_workFactor;
+ private int m_workLimit;
+ private int[] m_zptr;
+
+ public CBZip2OutputStream( final OutputStream output )
+ throws IOException
+ {
+ this( output, 9 );
+ }
+
+ public CBZip2OutputStream( final OutputStream output, final int blockSize )
+ throws IOException
+ {
+ bsSetStream( output );
+ m_workFactor = 50;
+
+ int outBlockSize = blockSize;
+ if( outBlockSize > 9 )
+ {
+ outBlockSize = 9;
+ }
+ if( outBlockSize < 1 )
+ {
+ outBlockSize = 1;
+ }
+ m_blockSize100k = outBlockSize;
+ allocateCompressStructures();
+ initialize();
+ initBlock();
+ }
+
+ private static void hbMakeCodeLengths( char[] len, int[] freq,
+ int alphaSize, int maxLen )
+ {
+ /*
+ * Nodes and heap entries run from 1. Entry 0
+ * for both the heap and nodes is a sentinel.
+ */
+ int nNodes;
+ /*
+ * Nodes and heap entries run from 1. Entry 0
+ * for both the heap and nodes is a sentinel.
+ */
+ int nHeap;
+ /*
+ * Nodes and heap entries run from 1. Entry 0
+ * for both the heap and nodes is a sentinel.
+ */
+ int n1;
+ /*
+ * Nodes and heap entries run from 1. Entry 0
+ * for both the heap and nodes is a sentinel.
+ */
+ int n2;
+ /*
+ * Nodes and heap entries run from 1. Entry 0
+ * for both the heap and nodes is a sentinel.
+ */
+ int i;
+ /*
+ * Nodes and heap entries run from 1. Entry 0
+ * for both the heap and nodes is a sentinel.
+ */
+ int j;
+ /*
+ * Nodes and heap entries run from 1. Entry 0
+ * for both the heap and nodes is a sentinel.
+ */
+ int k;
+ boolean tooLong;
+
+ int[] heap = new int[ MAX_ALPHA_SIZE + 2 ];
+ int[] weights = new int[ MAX_ALPHA_SIZE * 2 ];
+ int[] parent = new int[ MAX_ALPHA_SIZE * 2 ];
+
+ for( i = 0; i < alphaSize; i++ )
+ {
+ weights[ i + 1 ] = ( freq[ i ] == 0 ? 1 : freq[ i ] ) << 8;
+ }
+
+ while( true )
+ {
+ nNodes = alphaSize;
+ nHeap = 0;
+
+ heap[ 0 ] = 0;
+ weights[ 0 ] = 0;
+ parent[ 0 ] = -2;
+
+ for( i = 1; i <= alphaSize; i++ )
+ {
+ parent[ i ] = -1;
+ nHeap++;
+ heap[ nHeap ] = i;
+ {
+ int zz;
+ int tmp;
+ zz = nHeap;
+ tmp = heap[ zz ];
+ while( weights[ tmp ] < weights[ heap[ zz >> 1 ] ] )
+ {
+ heap[ zz ] = heap[ zz >> 1 ];
+ zz >>= 1;
+ }
+ heap[ zz ] = tmp;
+ }
+ }
+ if( !( nHeap < ( MAX_ALPHA_SIZE + 2 ) ) )
+ {
+ panic();
+ }
+
+ while( nHeap > 1 )
+ {
+ n1 = heap[ 1 ];
+ heap[ 1 ] = heap[ nHeap ];
+ nHeap--;
+ {
+ int zz = 0;
+ int yy = 0;
+ int tmp = 0;
+ zz = 1;
+ tmp = heap[ zz ];
+ while( true )
+ {
+ yy = zz << 1;
+ if( yy > nHeap )
+ {
+ break;
+ }
+ if( yy < nHeap &&
+ weights[ heap[ yy + 1 ] ] < weights[ heap[ yy ] ] )
+ {
+ yy++;
+ }
+ if( weights[ tmp ] < weights[ heap[ yy ] ] )
+ {
+ break;
+ }
+ heap[ zz ] = heap[ yy ];
+ zz = yy;
+ }
+ heap[ zz ] = tmp;
+ }
+ n2 = heap[ 1 ];
+ heap[ 1 ] = heap[ nHeap ];
+ nHeap--;
+ {
+ int zz = 0;
+ int yy = 0;
+ int tmp = 0;
+ zz = 1;
+ tmp = heap[ zz ];
+ while( true )
+ {
+ yy = zz << 1;
+ if( yy > nHeap )
+ {
+ break;
+ }
+ if( yy < nHeap &&
+ weights[ heap[ yy + 1 ] ] < weights[ heap[ yy ] ] )
+ {
+ yy++;
+ }
+ if( weights[ tmp ] < weights[ heap[ yy ] ] )
+ {
+ break;
+ }
+ heap[ zz ] = heap[ yy ];
+ zz = yy;
+ }
+ heap[ zz ] = tmp;
+ }
+ nNodes++;
+ parent[ n1 ] = nNodes;
+ parent[ n2 ] = nNodes;
+
+ final int v1 = weights[ n1 ];
+ final int v2 = weights[ n2 ];
+ final int weight = calculateWeight( v1, v2 );
+ weights[ nNodes ] = weight;
+
+ parent[ nNodes ] = -1;
+ nHeap++;
+ heap[ nHeap ] = nNodes;
+ {
+ int zz = 0;
+ int tmp = 0;
+ zz = nHeap;
+ tmp = heap[ zz ];
+ while( weights[ tmp ] < weights[ heap[ zz >> 1 ] ] )
+ {
+ heap[ zz ] = heap[ zz >> 1 ];
+ zz >>= 1;
+ }
+ heap[ zz ] = tmp;
+ }
+ }
+ if( !( nNodes < ( MAX_ALPHA_SIZE * 2 ) ) )
+ {
+ panic();
+ }
+
+ tooLong = false;
+ for( i = 1; i <= alphaSize; i++ )
+ {
+ j = 0;
+ k = i;
+ while( parent[ k ] >= 0 )
+ {
+ k = parent[ k ];
+ j++;
+ }
+ len[ i - 1 ] = (char)j;
+ if( j > maxLen )
+ {
+ tooLong = true;
+ }
+ }
+
+ if( !tooLong )
+ {
+ break;
+ }
+
+ for( i = 1; i < alphaSize; i++ )
+ {
+ j = weights[ i ] >> 8;
+ j = 1 + ( j / 2 );
+ weights[ i ] = j << 8;
+ }
+ }
+ }
+
+ private static int calculateWeight( final int v1, final int v2 )
+ {
+ final int upper = ( v1 & UPPER_BYTE_MASK ) + ( v2 & UPPER_BYTE_MASK );
+ final int v1Lower = ( v1 & LOWER_BYTE_MASK );
+ final int v2Lower = ( v2 & LOWER_BYTE_MASK );
+ final int nnnn = ( v1Lower > v2Lower ) ? v1Lower : v2Lower;
+ return upper | ( 1 + nnnn );
+ }
+
+ private static void panic()
+ {
+ System.out.println( "panic" );
+ //throw new CError();
+ }
+
+ public void close()
+ throws IOException
+ {
+ if( m_closed )
+ {
+ return;
+ }
+
+ if( m_runLength > 0 )
+ {
+ writeRun();
+ }
+ m_currentChar = -1;
+ endBlock();
+ endCompression();
+ m_closed = true;
+ super.close();
+ m_bsStream.close();
+ }
+
+ public void finalize()
+ throws Throwable
+ {
+ close();
+ }
+
+ public void flush()
+ throws IOException
+ {
+ super.flush();
+ m_bsStream.flush();
+ }
+
+ /**
+ * modified by Oliver Merkel, 010128
+ *
+ * @param bv Description of Parameter
+ * @exception java.io.IOException Description of Exception
+ */
+ public void write( int bv )
+ throws IOException
+ {
+ int b = ( 256 + bv ) % 256;
+ if( m_currentChar != -1 )
+ {
+ if( m_currentChar == b )
+ {
+ m_runLength++;
+ if( m_runLength > 254 )
+ {
+ writeRun();
+ m_currentChar = -1;
+ m_runLength = 0;
+ }
+ }
+ else
+ {
+ writeRun();
+ m_runLength = 1;
+ m_currentChar = b;
+ }
+ }
+ else
+ {
+ m_currentChar = b;
+ m_runLength++;
+ }
+ }
+
+ private void allocateCompressStructures()
+ {
+ int n = BASE_BLOCK_SIZE * m_blockSize100k;
+ m_block = new char[ ( n + 1 + NUM_OVERSHOOT_BYTES ) ];
+ m_quadrant = new int[ ( n + NUM_OVERSHOOT_BYTES ) ];
+ m_zptr = new int[ n ];
+ m_ftab = new int[ 65537 ];
+
+ if( m_block == null || m_quadrant == null || m_zptr == null
+ || m_ftab == null )
+ {
+ //int totalDraw = (n + 1 + NUM_OVERSHOOT_BYTES) + (n + NUM_OVERSHOOT_BYTES) + n + 65537;
+ //compressOutOfMemory ( totalDraw, n );
+ }
+
+ /*
+ * The back end needs a place to store the MTF values
+ * whilst it calculates the coding tables. We could
+ * put them in the zptr array. However, these values
+ * will fit in a short, so we overlay szptr at the
+ * start of zptr, in the hope of reducing the number
+ * of cache misses induced by the multiple traversals
+ * of the MTF values when calculating coding tables.
+ * Seems to improve compression speed by about 1%.
+ */
+ // szptr = zptr;
+
+ m_szptr = new short[ 2 * n ];
+ }
+
+ private void bsFinishedWithStream()
+ throws IOException
+ {
+ while( m_bsLive > 0 )
+ {
+ int ch = ( m_bsBuff >> 24 );
+ try
+ {
+ m_bsStream.write( ch );// write 8-bit
+ }
+ catch( IOException e )
+ {
+ throw e;
+ }
+ m_bsBuff <<= 8;
+ m_bsLive -= 8;
+ }
+ }
+
+ private void bsPutIntVS( int numBits, int c )
+ throws IOException
+ {
+ bsW( numBits, c );
+ }
+
+ private void bsPutUChar( int c )
+ throws IOException
+ {
+ bsW( 8, c );
+ }
+
+ private void bsPutint( int u )
+ throws IOException
+ {
+ bsW( 8, ( u >> 24 ) & 0xff );
+ bsW( 8, ( u >> 16 ) & 0xff );
+ bsW( 8, ( u >> 8 ) & 0xff );
+ bsW( 8, u & 0xff );
+ }
+
+ private void bsSetStream( OutputStream f )
+ {
+ m_bsStream = f;
+ m_bsLive = 0;
+ m_bsBuff = 0;
+ }
+
+ private void bsW( int n, int v )
+ throws IOException
+ {
+ while( m_bsLive >= 8 )
+ {
+ int ch = ( m_bsBuff >> 24 );
+ try
+ {
+ m_bsStream.write( ch );// write 8-bit
+ }
+ catch( IOException e )
+ {
+ throw e;
+ }
+ m_bsBuff <<= 8;
+ m_bsLive -= 8;
+ }
+ m_bsBuff |= ( v << ( 32 - m_bsLive - n ) );
+ m_bsLive += n;
+ }
+
+ private void doReversibleTransformation()
+ {
+ int i;
+
+ m_workLimit = m_workFactor * m_last;
+ m_workDone = 0;
+ m_blockRandomised = false;
+ m_firstAttempt = true;
+
+ mainSort();
+
+ if( m_workDone > m_workLimit && m_firstAttempt )
+ {
+ randomiseBlock();
+ m_workLimit = 0;
+ m_workDone = 0;
+ m_blockRandomised = true;
+ m_firstAttempt = false;
+ mainSort();
+ }
+
+ m_origPtr = -1;
+ for( i = 0; i <= m_last; i++ )
+ {
+ if( m_zptr[ i ] == 0 )
+ {
+ m_origPtr = i;
+ break;
+ }
+ }
+ ;
+
+ if( m_origPtr == -1 )
+ {
+ panic();
+ }
+ }
+
+ private void endBlock()
+ throws IOException
+ {
+ m_blockCRC = m_crc.getFinalCRC();
+ m_combinedCRC = ( m_combinedCRC << 1 ) | ( m_combinedCRC >>> 31 );
+ m_combinedCRC ^= m_blockCRC;
+
+ /*
+ * sort the block and establish posn of original string
+ */
+ doReversibleTransformation();
+
+ /*
+ * A 6-byte block header, the value chosen arbitrarily
+ * as 0x314159265359 :-). A 32 bit value does not really
+ * give a strong enough guarantee that the value will not
+ * appear by chance in the compressed datastream. Worst-case
+ * probability of this event, for a 900k block, is about
+ * 2.0e-3 for 32 bits, 1.0e-5 for 40 bits and 4.0e-8 for 48 bits.
+ * For a compressed file of size 100Gb -- about 100000 blocks --
+ * only a 48-bit marker will do. NB: normal compression/
+ * decompression do *not* rely on these statistical properties.
+ * They are only important when trying to recover blocks from
+ * damaged files.
+ */
+ bsPutUChar( 0x31 );
+ bsPutUChar( 0x41 );
+ bsPutUChar( 0x59 );
+ bsPutUChar( 0x26 );
+ bsPutUChar( 0x53 );
+ bsPutUChar( 0x59 );
+
+ /*
+ * Now the block's CRC, so it is in a known place.
+ */
+ bsPutint( m_blockCRC );
+
+ /*
+ * Now a single bit indicating randomisation.
+ */
+ if( m_blockRandomised )
+ {
+ bsW( 1, 1 );
+ }
+ else
+ {
+ bsW( 1, 0 );
+ }
+
+ /*
+ * Finally, block's contents proper.
+ */
+ moveToFrontCodeAndSend();
+ }
+
+ private void endCompression()
+ throws IOException
+ {
+ /*
+ * Now another magic 48-bit number, 0x177245385090, to
+ * indicate the end of the last block. (sqrt(pi), if
+ * you want to know. I did want to use e, but it contains
+ * too much repetition -- 27 18 28 18 28 46 -- for me
+ * to feel statistically comfortable. Call me paranoid.)
+ */
+ bsPutUChar( 0x17 );
+ bsPutUChar( 0x72 );
+ bsPutUChar( 0x45 );
+ bsPutUChar( 0x38 );
+ bsPutUChar( 0x50 );
+ bsPutUChar( 0x90 );
+
+ bsPutint( m_combinedCRC );
+
+ bsFinishedWithStream();
+ }
+
+ private boolean fullGtU( int i1, int i2 )
+ {
+ int k;
+ char c1;
+ char c2;
+ int s1;
+ int s2;
+
+ c1 = m_block[ i1 + 1 ];
+ c2 = m_block[ i2 + 1 ];
+ if( c1 != c2 )
+ {
+ return ( c1 > c2 );
+ }
+ i1++;
+ i2++;
+
+ c1 = m_block[ i1 + 1 ];
+ c2 = m_block[ i2 + 1 ];
+ if( c1 != c2 )
+ {
+ return ( c1 > c2 );
+ }
+ i1++;
+ i2++;
+
+ c1 = m_block[ i1 + 1 ];
+ c2 = m_block[ i2 + 1 ];
+ if( c1 != c2 )
+ {
+ return ( c1 > c2 );
+ }
+ i1++;
+ i2++;
+
+ c1 = m_block[ i1 + 1 ];
+ c2 = m_block[ i2 + 1 ];
+ if( c1 != c2 )
+ {
+ return ( c1 > c2 );
+ }
+ i1++;
+ i2++;
+
+ c1 = m_block[ i1 + 1 ];
+ c2 = m_block[ i2 + 1 ];
+ if( c1 != c2 )
+ {
+ return ( c1 > c2 );
+ }
+ i1++;
+ i2++;
+
+ c1 = m_block[ i1 + 1 ];
+ c2 = m_block[ i2 + 1 ];
+ if( c1 != c2 )
+ {
+ return ( c1 > c2 );
+ }
+ i1++;
+ i2++;
+
+ k = m_last + 1;
+
+ do
+ {
+ c1 = m_block[ i1 + 1 ];
+ c2 = m_block[ i2 + 1 ];
+ if( c1 != c2 )
+ {
+ return ( c1 > c2 );
+ }
+ s1 = m_quadrant[ i1 ];
+ s2 = m_quadrant[ i2 ];
+ if( s1 != s2 )
+ {
+ return ( s1 > s2 );
+ }
+ i1++;
+ i2++;
+
+ c1 = m_block[ i1 + 1 ];
+ c2 = m_block[ i2 + 1 ];
+ if( c1 != c2 )
+ {
+ return ( c1 > c2 );
+ }
+ s1 = m_quadrant[ i1 ];
+ s2 = m_quadrant[ i2 ];
+ if( s1 != s2 )
+ {
+ return ( s1 > s2 );
+ }
+ i1++;
+ i2++;
+
+ c1 = m_block[ i1 + 1 ];
+ c2 = m_block[ i2 + 1 ];
+ if( c1 != c2 )
+ {
+ return ( c1 > c2 );
+ }
+ s1 = m_quadrant[ i1 ];
+ s2 = m_quadrant[ i2 ];
+ if( s1 != s2 )
+ {
+ return ( s1 > s2 );
+ }
+ i1++;
+ i2++;
+
+ c1 = m_block[ i1 + 1 ];
+ c2 = m_block[ i2 + 1 ];
+ if( c1 != c2 )
+ {
+ return ( c1 > c2 );
+ }
+ s1 = m_quadrant[ i1 ];
+ s2 = m_quadrant[ i2 ];
+ if( s1 != s2 )
+ {
+ return ( s1 > s2 );
+ }
+ i1++;
+ i2++;
+
+ if( i1 > m_last )
+ {
+ i1 -= m_last;
+ i1--;
+ }
+ ;
+ if( i2 > m_last )
+ {
+ i2 -= m_last;
+ i2--;
+ }
+ ;
+
+ k -= 4;
+ m_workDone++;
+ } while( k >= 0 );
+
+ return false;
+ }
+
+ private void generateMTFValues()
+ {
+ char[] yy = new char[ 256 ];
+ int i;
+ int j;
+ char tmp;
+ char tmp2;
+ int zPend;
+ int wr;
+ int EOB;
+
+ makeMaps();
+ EOB = m_nInUse + 1;
+
+ for( i = 0; i <= EOB; i++ )
+ {
+ m_mtfFreq[ i ] = 0;
+ }
+
+ wr = 0;
+ zPend = 0;
+ for( i = 0; i < m_nInUse; i++ )
+ {
+ yy[ i ] = (char)i;
+ }
+
+ for( i = 0; i <= m_last; i++ )
+ {
+ char ll_i;
+
+ ll_i = m_unseqToSeq[ m_block[ m_zptr[ i ] ] ];
+
+ j = 0;
+ tmp = yy[ j ];
+ while( ll_i != tmp )
+ {
+ j++;
+ tmp2 = tmp;
+ tmp = yy[ j ];
+ yy[ j ] = tmp2;
+ }
+ ;
+ yy[ 0 ] = tmp;
+
+ if( j == 0 )
+ {
+ zPend++;
+ }
+ else
+ {
+ if( zPend > 0 )
+ {
+ zPend--;
+ while( true )
+ {
+ switch( zPend % 2 )
+ {
+ case 0:
+ m_szptr[ wr ] = (short)RUNA;
+ wr++;
+ m_mtfFreq[ RUNA ]++;
+ break;
+ case 1:
+ m_szptr[ wr ] = (short)RUNB;
+ wr++;
+ m_mtfFreq[ RUNB ]++;
+ break;
+ }
+ ;
+ if( zPend < 2 )
+ {
+ break;
+ }
+ zPend = ( zPend - 2 ) / 2;
+ }
+ ;
+ zPend = 0;
+ }
+ m_szptr[ wr ] = (short)( j + 1 );
+ wr++;
+ m_mtfFreq[ j + 1 ]++;
+ }
+ }
+
+ if( zPend > 0 )
+ {
+ zPend--;
+ while( true )
+ {
+ switch( zPend % 2 )
+ {
+ case 0:
+ m_szptr[ wr ] = (short)RUNA;
+ wr++;
+ m_mtfFreq[ RUNA ]++;
+ break;
+ case 1:
+ m_szptr[ wr ] = (short)RUNB;
+ wr++;
+ m_mtfFreq[ RUNB ]++;
+ break;
+ }
+ if( zPend < 2 )
+ {
+ break;
+ }
+ zPend = ( zPend - 2 ) / 2;
+ }
+ }
+
+ m_szptr[ wr ] = (short)EOB;
+ wr++;
+ m_mtfFreq[ EOB ]++;
+
+ m_nMTF = wr;
+ }
+
+ private void hbAssignCodes( int[] code, char[] length, int minLen,
+ int maxLen, int alphaSize )
+ {
+ int n;
+ int vec;
+ int i;
+
+ vec = 0;
+ for( n = minLen; n <= maxLen; n++ )
+ {
+ for( i = 0; i < alphaSize; i++ )
+ {
+ if( length[ i ] == n )
+ {
+ code[ i ] = vec;
+ vec++;
+ }
+ }
+ ;
+ vec <<= 1;
+ }
+ }
+
+ private void initBlock()
+ {
+ // blockNo++;
+ m_crc.initialiseCRC();
+ m_last = -1;
+ // ch = 0;
+
+ for( int i = 0; i < 256; i++ )
+ {
+ m_inUse[ i ] = false;
+ }
+
+ /*
+ * 20 is just a paranoia constant
+ */
+ m_allowableBlockSize = BASE_BLOCK_SIZE * m_blockSize100k - 20;
+ }
+
+ private void initialize()
+ throws IOException
+ {
+ /*
+ * Write `magic' bytes h indicating file-format == huffmanised,
+ * followed by a digit indicating blockSize100k.
+ */
+ bsPutUChar( 'h' );
+ bsPutUChar( '0' + m_blockSize100k );
+
+ m_combinedCRC = 0;
+ }
+
+ private void mainSort()
+ {
+ int i;
+ int j;
+ int ss;
+ int sb;
+ int[] runningOrder = new int[ 256 ];
+ int[] copy = new int[ 256 ];
+ boolean[] bigDone = new boolean[ 256 ];
+ int c1;
+ int c2;
+
+ /*
+ * In the various block-sized structures, live data runs
+ * from 0 to last+NUM_OVERSHOOT_BYTES inclusive. First,
+ * set up the overshoot area for block.
+ */
+ // if (verbosity >= 4) fprintf ( stderr, " sort initialise ...\n" );
+ for( i = 0; i < NUM_OVERSHOOT_BYTES; i++ )
+ {
+ m_block[ m_last + i + 2 ] = m_block[ ( i % ( m_last + 1 ) ) + 1 ];
+ }
+ for( i = 0; i <= m_last + NUM_OVERSHOOT_BYTES; i++ )
+ {
+ m_quadrant[ i ] = 0;
+ }
+
+ m_block[ 0 ] = m_block[ m_last + 1 ];
+
+ if( m_last < 4000 )
+ {
+ /*
+ * Use simpleSort(), since the full sorting mechanism
+ * has quite a large constant overhead.
+ */
+ for( i = 0; i <= m_last; i++ )
+ {
+ m_zptr[ i ] = i;
+ }
+ m_firstAttempt = false;
+ m_workDone = 0;
+ m_workLimit = 0;
+ simpleSort( 0, m_last, 0 );
+ }
+ else
+ {
+ for( i = 0; i <= 255; i++ )
+ {
+ bigDone[ i ] = false;
+ }
+
+ for( i = 0; i <= 65536; i++ )
+ {
+ m_ftab[ i ] = 0;
+ }
+
+ c1 = m_block[ 0 ];
+ for( i = 0; i <= m_last; i++ )
+ {
+ c2 = m_block[ i + 1 ];
+ m_ftab[ ( c1 << 8 ) + c2 ]++;
+ c1 = c2;
+ }
+
+ for( i = 1; i <= 65536; i++ )
+ {
+ m_ftab[ i ] += m_ftab[ i - 1 ];
+ }
+
+ c1 = m_block[ 1 ];
+ for( i = 0; i < m_last; i++ )
+ {
+ c2 = m_block[ i + 2 ];
+ j = ( c1 << 8 ) + c2;
+ c1 = c2;
+ m_ftab[ j ]--;
+ m_zptr[ m_ftab[ j ] ] = i;
+ }
+
+ j = ( ( m_block[ m_last + 1 ] ) << 8 ) + ( m_block[ 1 ] );
+ m_ftab[ j ]--;
+ m_zptr[ m_ftab[ j ] ] = m_last;
+
+ /*
+ * Now ftab contains the first loc of every small bucket.
+ * Calculate the running order, from smallest to largest
+ * big bucket.
+ */
+ for( i = 0; i <= 255; i++ )
+ {
+ runningOrder[ i ] = i;
+ }
+ {
+ int vv;
+ int h = 1;
+ do
+ {
+ h = 3 * h + 1;
+ } while( h <= 256 );
+ do
+ {
+ h = h / 3;
+ for( i = h; i <= 255; i++ )
+ {
+ vv = runningOrder[ i ];
+ j = i;
+ while( ( m_ftab[ ( ( runningOrder[ j - h ] ) + 1 ) << 8 ]
+ - m_ftab[ ( runningOrder[ j - h ] ) << 8 ] ) >
+ ( m_ftab[ ( ( vv ) + 1 ) << 8 ] - m_ftab[ ( vv ) << 8 ] ) )
+ {
+ runningOrder[ j ] = runningOrder[ j - h ];
+ j = j - h;
+ if( j <= ( h - 1 ) )
+ {
+ break;
+ }
+ }
+ runningOrder[ j ] = vv;
+ }
+ } while( h != 1 );
+ }
+
+ /*
+ * The main sorting loop.
+ */
+ for( i = 0; i <= 255; i++ )
+ {
+
+ /*
+ * Process big buckets, starting with the least full.
+ */
+ ss = runningOrder[ i ];
+
+ /*
+ * Complete the big bucket [ss] by quicksorting
+ * any unsorted small buckets [ss, j]. Hopefully
+ * previous pointer-scanning phases have already
+ * completed many of the small buckets [ss, j], so
+ * we don't have to sort them at all.
+ */
+ for( j = 0; j <= 255; j++ )
+ {
+ sb = ( ss << 8 ) + j;
+ if( !( ( m_ftab[ sb ] & SETMASK ) == SETMASK ) )
+ {
+ int lo = m_ftab[ sb ] & CLEARMASK;
+ int hi = ( m_ftab[ sb + 1 ] & CLEARMASK ) - 1;
+ if( hi > lo )
+ {
+ qSort3( lo, hi, 2 );
+ if( m_workDone > m_workLimit && m_firstAttempt )
+ {
+ return;
+ }
+ }
+ m_ftab[ sb ] |= SETMASK;
+ }
+ }
+
+ /*
+ * The ss big bucket is now done. Record this fact,
+ * and update the quadrant descriptors. Remember to
+ * update quadrants in the overshoot area too, if
+ * necessary. The "if (i < 255)" test merely skips
+ * this updating for the last bucket processed, since
+ * updating for the last bucket is pointless.
+ */
+ bigDone[ ss ] = true;
+
+ if( i < 255 )
+ {
+ int bbStart = m_ftab[ ss << 8 ] & CLEARMASK;
+ int bbSize = ( m_ftab[ ( ss + 1 ) << 8 ] & CLEARMASK ) - bbStart;
+ int shifts = 0;
+
+ while( ( bbSize >> shifts ) > 65534 )
+ {
+ shifts++;
+ }
+
+ for( j = 0; j < bbSize; j++ )
+ {
+ int a2update = m_zptr[ bbStart + j ];
+ int qVal = ( j >> shifts );
+ m_quadrant[ a2update ] = qVal;
+ if( a2update < NUM_OVERSHOOT_BYTES )
+ {
+ m_quadrant[ a2update + m_last + 1 ] = qVal;
+ }
+ }
+
+ if( !( ( ( bbSize - 1 ) >> shifts ) <= 65535 ) )
+ {
+ panic();
+ }
+ }
+
+ /*
+ * Now scan this big bucket so as to synthesise the
+ * sorted order for small buckets [t, ss] for all t != ss.
+ */
+ for( j = 0; j <= 255; j++ )
+ {
+ copy[ j ] = m_ftab[ ( j << 8 ) + ss ] & CLEARMASK;
+ }
+
+ for( j = m_ftab[ ss << 8 ] & CLEARMASK;
+ j < ( m_ftab[ ( ss + 1 ) << 8 ] & CLEARMASK ); j++ )
+ {
+ c1 = m_block[ m_zptr[ j ] ];
+ if( !bigDone[ c1 ] )
+ {
+ m_zptr[ copy[ c1 ] ] = m_zptr[ j ] == 0 ? m_last : m_zptr[ j ] - 1;
+ copy[ c1 ]++;
+ }
+ }
+
+ for( j = 0; j <= 255; j++ )
+ {
+ m_ftab[ ( j << 8 ) + ss ] |= SETMASK;
+ }
+ }
+ }
+ }
+
+ private void makeMaps()
+ {
+ int i;
+ m_nInUse = 0;
+ for( i = 0; i < 256; i++ )
+ {
+ if( m_inUse[ i ] )
+ {
+ m_seqToUnseq[ m_nInUse ] = (char)i;
+ m_unseqToSeq[ i ] = (char)m_nInUse;
+ m_nInUse++;
+ }
+ }
+ }
+
+ private char med3( char a, char b, char c )
+ {
+ char t;
+ if( a > b )
+ {
+ t = a;
+ a = b;
+ b = t;
+ }
+ if( b > c )
+ {
+ t = b;
+ b = c;
+ c = t;
+ }
+ if( a > b )
+ {
+ b = a;
+ }
+ return b;
+ }
+
+ private void moveToFrontCodeAndSend()
+ throws IOException
+ {
+ bsPutIntVS( 24, m_origPtr );
+ generateMTFValues();
+ sendMTFValues();
+ }
+
+ private void qSort3( int loSt, int hiSt, int dSt )
+ {
+ int unLo;
+ int unHi;
+ int ltLo;
+ int gtHi;
+ int med;
+ int n;
+ int m;
+ int sp;
+ int lo;
+ int hi;
+ int d;
+ StackElem[] stack = new StackElem[ QSORT_STACK_SIZE ];
+ for( int count = 0; count < QSORT_STACK_SIZE; count++ )
+ {
+ stack[ count ] = new StackElem();
+ }
+
+ sp = 0;
+
+ stack[ sp ].m_ll = loSt;
+ stack[ sp ].m_hh = hiSt;
+ stack[ sp ].m_dd = dSt;
+ sp++;
+
+ while( sp > 0 )
+ {
+ if( sp >= QSORT_STACK_SIZE )
+ {
+ panic();
+ }
+
+ sp--;
+ lo = stack[ sp ].m_ll;
+ hi = stack[ sp ].m_hh;
+ d = stack[ sp ].m_dd;
+
+ if( hi - lo < SMALL_THRESH || d > DEPTH_THRESH )
+ {
+ simpleSort( lo, hi, d );
+ if( m_workDone > m_workLimit && m_firstAttempt )
+ {
+ return;
+ }
+ continue;
+ }
+
+ med = med3( m_block[ m_zptr[ lo ] + d + 1 ],
+ m_block[ m_zptr[ hi ] + d + 1 ],
+ m_block[ m_zptr[ ( lo + hi ) >> 1 ] + d + 1 ] );
+
+ unLo = lo;
+ ltLo = lo;
+ unHi = hi;
+ gtHi = hi;
+
+ while( true )
+ {
+ while( true )
+ {
+ if( unLo > unHi )
+ {
+ break;
+ }
+ n = m_block[ m_zptr[ unLo ] + d + 1 ] - med;
+ if( n == 0 )
+ {
+ int temp = 0;
+ temp = m_zptr[ unLo ];
+ m_zptr[ unLo ] = m_zptr[ ltLo ];
+ m_zptr[ ltLo ] = temp;
+ ltLo++;
+ unLo++;
+ continue;
+ }
+ ;
+ if( n > 0 )
+ {
+ break;
+ }
+ unLo++;
+ }
+ while( true )
+ {
+ if( unLo > unHi )
+ {
+ break;
+ }
+ n = m_block[ m_zptr[ unHi ] + d + 1 ] - med;
+ if( n == 0 )
+ {
+ int temp = 0;
+ temp = m_zptr[ unHi ];
+ m_zptr[ unHi ] = m_zptr[ gtHi ];
+ m_zptr[ gtHi ] = temp;
+ gtHi--;
+ unHi--;
+ continue;
+ }
+ ;
+ if( n < 0 )
+ {
+ break;
+ }
+ unHi--;
+ }
+ if( unLo > unHi )
+ {
+ break;
+ }
+ int temp = 0;
+ temp = m_zptr[ unLo ];
+ m_zptr[ unLo ] = m_zptr[ unHi ];
+ m_zptr[ unHi ] = temp;
+ unLo++;
+ unHi--;
+ }
+
+ if( gtHi < ltLo )
+ {
+ stack[ sp ].m_ll = lo;
+ stack[ sp ].m_hh = hi;
+ stack[ sp ].m_dd = d + 1;
+ sp++;
+ continue;
+ }
+
+ n = ( ( ltLo - lo ) < ( unLo - ltLo ) ) ? ( ltLo - lo ) : ( unLo - ltLo );
+ vswap( lo, unLo - n, n );
+ m = ( ( hi - gtHi ) < ( gtHi - unHi ) ) ? ( hi - gtHi ) : ( gtHi - unHi );
+ vswap( unLo, hi - m + 1, m );
+
+ n = lo + unLo - ltLo - 1;
+ m = hi - ( gtHi - unHi ) + 1;
+
+ stack[ sp ].m_ll = lo;
+ stack[ sp ].m_hh = n;
+ stack[ sp ].m_dd = d;
+ sp++;
+
+ stack[ sp ].m_ll = n + 1;
+ stack[ sp ].m_hh = m - 1;
+ stack[ sp ].m_dd = d + 1;
+ sp++;
+
+ stack[ sp ].m_ll = m;
+ stack[ sp ].m_hh = hi;
+ stack[ sp ].m_dd = d;
+ sp++;
+ }
+ }
+
+ private void randomiseBlock()
+ {
+ int i;
+ int rNToGo = 0;
+ int rTPos = 0;
+ for( i = 0; i < 256; i++ )
+ {
+ m_inUse[ i ] = false;
+ }
+
+ for( i = 0; i <= m_last; i++ )
+ {
+ if( rNToGo == 0 )
+ {
+ rNToGo = (char)RAND_NUMS[ rTPos ];
+ rTPos++;
+ if( rTPos == 512 )
+ {
+ rTPos = 0;
+ }
+ }
+ rNToGo--;
+ m_block[ i + 1 ] ^= ( ( rNToGo == 1 ) ? 1 : 0 );
+ // handle 16 bit signed numbers
+ m_block[ i + 1 ] &= 0xFF;
+
+ m_inUse[ m_block[ i + 1 ] ] = true;
+ }
+ }
+
+ private void sendMTFValues()
+ throws IOException
+ {
+ char[][] len = new char[ N_GROUPS ][ MAX_ALPHA_SIZE ];
+
+ int v;
+
+ int t;
+
+ int i;
+
+ int j;
+
+ int gs;
+
+ int ge;
+
+ int bt;
+
+ int bc;
+
+ int iter;
+ int nSelectors = 0;
+ int alphaSize;
+ int minLen;
+ int maxLen;
+ int selCtr;
+ int nGroups;
+
+ alphaSize = m_nInUse + 2;
+ for( t = 0; t < N_GROUPS; t++ )
+ {
+ for( v = 0; v < alphaSize; v++ )
+ {
+ len[ t ][ v ] = (char)GREATER_ICOST;
+ }
+ }
+
+ /*
+ * Decide how many coding tables to use
+ */
+ if( m_nMTF <= 0 )
+ {
+ panic();
+ }
+
+ if( m_nMTF < 200 )
+ {
+ nGroups = 2;
+ }
+ else if( m_nMTF < 600 )
+ {
+ nGroups = 3;
+ }
+ else if( m_nMTF < 1200 )
+ {
+ nGroups = 4;
+ }
+ else if( m_nMTF < 2400 )
+ {
+ nGroups = 5;
+ }
+ else
+ {
+ nGroups = 6;
+ }
+ {
+ /*
+ * Generate an initial set of coding tables
+ */
+ int nPart;
+ int remF;
+ int tFreq;
+ int aFreq;
+
+ nPart = nGroups;
+ remF = m_nMTF;
+ gs = 0;
+ while( nPart > 0 )
+ {
+ tFreq = remF / nPart;
+ ge = gs - 1;
+ aFreq = 0;
+ while( aFreq < tFreq && ge < alphaSize - 1 )
+ {
+ ge++;
+ aFreq += m_mtfFreq[ ge ];
+ }
+
+ if( ge > gs && nPart != nGroups && nPart != 1
+ && ( ( nGroups - nPart ) % 2 == 1 ) )
+ {
+ aFreq -= m_mtfFreq[ ge ];
+ ge--;
+ }
+
+ for( v = 0; v < alphaSize; v++ )
+ {
+ if( v >= gs && v <= ge )
+ {
+ len[ nPart - 1 ][ v ] = (char)LESSER_ICOST;
+ }
+ else
+ {
+ len[ nPart - 1 ][ v ] = (char)GREATER_ICOST;
+ }
+ }
+
+ nPart--;
+ gs = ge + 1;
+ remF -= aFreq;
+ }
+ }
+
+ int[][] rfreq = new int[ N_GROUPS ][ MAX_ALPHA_SIZE ];
+ int[] fave = new int[ N_GROUPS ];
+ short[] cost = new short[ N_GROUPS ];
+ /*
+ * Iterate up to N_ITERS times to improve the tables.
+ */
+ for( iter = 0; iter < N_ITERS; iter++ )
+ {
+ for( t = 0; t < nGroups; t++ )
+ {
+ fave[ t ] = 0;
+ }
+
+ for( t = 0; t < nGroups; t++ )
+ {
+ for( v = 0; v < alphaSize; v++ )
+ {
+ rfreq[ t ][ v ] = 0;
+ }
+ }
+
+ nSelectors = 0;
+ gs = 0;
+ while( true )
+ {
+
+ /*
+ * Set group start & end marks.
+ */
+ if( gs >= m_nMTF )
+ {
+ break;
+ }
+ ge = gs + G_SIZE - 1;
+ if( ge >= m_nMTF )
+ {
+ ge = m_nMTF - 1;
+ }
+
+ /*
+ * Calculate the cost of this group as coded
+ * by each of the coding tables.
+ */
+ for( t = 0; t < nGroups; t++ )
+ {
+ cost[ t ] = 0;
+ }
+
+ if( nGroups == 6 )
+ {
+ short cost0 = 0;
+ short cost1 = 0;
+ short cost2 = 0;
+ short cost3 = 0;
+ short cost4 = 0;
+ short cost5 = 0;
+
+ for( i = gs; i <= ge; i++ )
+ {
+ short icv = m_szptr[ i ];
+ cost0 += len[ 0 ][ icv ];
+ cost1 += len[ 1 ][ icv ];
+ cost2 += len[ 2 ][ icv ];
+ cost3 += len[ 3 ][ icv ];
+ cost4 += len[ 4 ][ icv ];
+ cost5 += len[ 5 ][ icv ];
+ }
+ cost[ 0 ] = cost0;
+ cost[ 1 ] = cost1;
+ cost[ 2 ] = cost2;
+ cost[ 3 ] = cost3;
+ cost[ 4 ] = cost4;
+ cost[ 5 ] = cost5;
+ }
+ else
+ {
+ for( i = gs; i <= ge; i++ )
+ {
+ short icv = m_szptr[ i ];
+ for( t = 0; t < nGroups; t++ )
+ {
+ cost[ t ] += len[ t ][ icv ];
+ }
+ }
+ }
+
+ /*
+ * Find the coding table which is best for this group,
+ * and record its identity in the selector table.
+ */
+ bc = 999999999;
+ bt = -1;
+ for( t = 0; t < nGroups; t++ )
+ {
+ if( cost[ t ] < bc )
+ {
+ bc = cost[ t ];
+ bt = t;
+ }
+ }
+ ;
+ fave[ bt ]++;
+ m_selector[ nSelectors ] = (char)bt;
+ nSelectors++;
+
+ /*
+ * Increment the symbol frequencies for the selected table.
+ */
+ for( i = gs; i <= ge; i++ )
+ {
+ rfreq[ bt ][ m_szptr[ i ] ]++;
+ }
+
+ gs = ge + 1;
+ }
+
+ /*
+ * Recompute the tables based on the accumulated frequencies.
+ */
+ for( t = 0; t < nGroups; t++ )
+ {
+ hbMakeCodeLengths( len[ t ], rfreq[ t ], alphaSize, 20 );
+ }
+ }
+
+ rfreq = null;
+ fave = null;
+ cost = null;
+
+ if( !( nGroups < 8 ) )
+ {
+ panic();
+ }
+ if( !( nSelectors < 32768 && nSelectors <= ( 2 + ( 900000 / G_SIZE ) ) ) )
+ {
+ panic();
+ }
+ {
+ /*
+ * Compute MTF values for the selectors.
+ */
+ char[] pos = new char[ N_GROUPS ];
+ char ll_i;
+ char tmp2;
+ char tmp;
+ for( i = 0; i < nGroups; i++ )
+ {
+ pos[ i ] = (char)i;
+ }
+ for( i = 0; i < nSelectors; i++ )
+ {
+ ll_i = m_selector[ i ];
+ j = 0;
+ tmp = pos[ j ];
+ while( ll_i != tmp )
+ {
+ j++;
+ tmp2 = tmp;
+ tmp = pos[ j ];
+ pos[ j ] = tmp2;
+ }
+ pos[ 0 ] = tmp;
+ m_selectorMtf[ i ] = (char)j;
+ }
+ }
+
+ int[][] code = new int[ N_GROUPS ][ MAX_ALPHA_SIZE ];
+
+ /*
+ * Assign actual codes for the tables.
+ */
+ for( t = 0; t < nGroups; t++ )
+ {
+ minLen = 32;
+ maxLen = 0;
+ for( i = 0; i < alphaSize; i++ )
+ {
+ if( len[ t ][ i ] > maxLen )
+ {
+ maxLen = len[ t ][ i ];
+ }
+ if( len[ t ][ i ] < minLen )
+ {
+ minLen = len[ t ][ i ];
+ }
+ }
+ if( maxLen > 20 )
+ {
+ panic();
+ }
+ if( minLen < 1 )
+ {
+ panic();
+ }
+ hbAssignCodes( code[ t ], len[ t ], minLen, maxLen, alphaSize );
+ }
+ {
+ /*
+ * Transmit the mapping table.
+ */
+ boolean[] inUse16 = new boolean[ 16 ];
+ for( i = 0; i < 16; i++ )
+ {
+ inUse16[ i ] = false;
+ for( j = 0; j < 16; j++ )
+ {
+ if( m_inUse[ i * 16 + j ] )
+ {
+ inUse16[ i ] = true;
+ }
+ }
+ }
+
+ for( i = 0; i < 16; i++ )
+ {
+ if( inUse16[ i ] )
+ {
+ bsW( 1, 1 );
+ }
+ else
+ {
+ bsW( 1, 0 );
+ }
+ }
+
+ for( i = 0; i < 16; i++ )
+ {
+ if( inUse16[ i ] )
+ {
+ for( j = 0; j < 16; j++ )
+ {
+ if( m_inUse[ i * 16 + j ] )
+ {
+ bsW( 1, 1 );
+ }
+ else
+ {
+ bsW( 1, 0 );
+ }
+ }
+ }
+ }
+
+ }
+
+ /*
+ * Now the selectors.
+ */
+ bsW( 3, nGroups );
+ bsW( 15, nSelectors );
+ for( i = 0; i < nSelectors; i++ )
+ {
+ for( j = 0; j < m_selectorMtf[ i ]; j++ )
+ {
+ bsW( 1, 1 );
+ }
+ bsW( 1, 0 );
+ }
+
+ for( t = 0; t < nGroups; t++ )
+ {
+ int curr = len[ t ][ 0 ];
+ bsW( 5, curr );
+ for( i = 0; i < alphaSize; i++ )
+ {
+ while( curr < len[ t ][ i ] )
+ {
+ bsW( 2, 2 );
+ curr++;
+ /*
+ * 10
+ */
+ }
+ while( curr > len[ t ][ i ] )
+ {
+ bsW( 2, 3 );
+ curr--;
+ /*
+ * 11
+ */
+ }
+ bsW( 1, 0 );
+ }
+ }
+
+ /*
+ * And finally, the block data proper
+ */
+ selCtr = 0;
+ gs = 0;
+ while( true )
+ {
+ if( gs >= m_nMTF )
+ {
+ break;
+ }
+ ge = gs + G_SIZE - 1;
+ if( ge >= m_nMTF )
+ {
+ ge = m_nMTF - 1;
+ }
+ for( i = gs; i <= ge; i++ )
+ {
+ bsW( len[ m_selector[ selCtr ] ][ m_szptr[ i ] ],
+ code[ m_selector[ selCtr ] ][ m_szptr[ i ] ] );
+ }
+
+ gs = ge + 1;
+ selCtr++;
+ }
+ if( !( selCtr == nSelectors ) )
+ {
+ panic();
+ }
+ }
+
+ private void simpleSort( int lo, int hi, int d )
+ {
+ int i;
+ int j;
+ int h;
+ int bigN;
+ int hp;
+ int v;
+
+ bigN = hi - lo + 1;
+ if( bigN < 2 )
+ {
+ return;
+ }
+
+ hp = 0;
+ while( m_incs[ hp ] < bigN )
+ {
+ hp++;
+ }
+ hp--;
+
+ for( ; hp >= 0; hp-- )
+ {
+ h = m_incs[ hp ];
+
+ i = lo + h;
+ while( true )
+ {
+ /*
+ * copy 1
+ */
+ if( i > hi )
+ {
+ break;
+ }
+ v = m_zptr[ i ];
+ j = i;
+ while( fullGtU( m_zptr[ j - h ] + d, v + d ) )
+ {
+ m_zptr[ j ] = m_zptr[ j - h ];
+ j = j - h;
+ if( j <= ( lo + h - 1 ) )
+ {
+ break;
+ }
+ }
+ m_zptr[ j ] = v;
+ i++;
+
+ /*
+ * copy 2
+ */
+ if( i > hi )
+ {
+ break;
+ }
+ v = m_zptr[ i ];
+ j = i;
+ while( fullGtU( m_zptr[ j - h ] + d, v + d ) )
+ {
+ m_zptr[ j ] = m_zptr[ j - h ];
+ j = j - h;
+ if( j <= ( lo + h - 1 ) )
+ {
+ break;
+ }
+ }
+ m_zptr[ j ] = v;
+ i++;
+
+ /*
+ * copy 3
+ */
+ if( i > hi )
+ {
+ break;
+ }
+ v = m_zptr[ i ];
+ j = i;
+ while( fullGtU( m_zptr[ j - h ] + d, v + d ) )
+ {
+ m_zptr[ j ] = m_zptr[ j - h ];
+ j = j - h;
+ if( j <= ( lo + h - 1 ) )
+ {
+ break;
+ }
+ }
+ m_zptr[ j ] = v;
+ i++;
+
+ if( m_workDone > m_workLimit && m_firstAttempt )
+ {
+ return;
+ }
+ }
+ }
+ }
+
+ private void vswap( int p1, int p2, int n )
+ {
+ int temp = 0;
+ while( n > 0 )
+ {
+ temp = m_zptr[ p1 ];
+ m_zptr[ p1 ] = m_zptr[ p2 ];
+ m_zptr[ p2 ] = temp;
+ p1++;
+ p2++;
+ n--;
+ }
+ }
+
+ private void writeRun()
+ throws IOException
+ {
+ if( m_last < m_allowableBlockSize )
+ {
+ m_inUse[ m_currentChar ] = true;
+ for( int i = 0; i < m_runLength; i++ )
+ {
+ m_crc.updateCRC( (char)m_currentChar );
+ }
+ switch( m_runLength )
+ {
+ case 1:
+ m_last++;
+ m_block[ m_last + 1 ] = (char)m_currentChar;
+ break;
+ case 2:
+ m_last++;
+ m_block[ m_last + 1 ] = (char)m_currentChar;
+ m_last++;
+ m_block[ m_last + 1 ] = (char)m_currentChar;
+ break;
+ case 3:
+ m_last++;
+ m_block[ m_last + 1 ] = (char)m_currentChar;
+ m_last++;
+ m_block[ m_last + 1 ] = (char)m_currentChar;
+ m_last++;
+ m_block[ m_last + 1 ] = (char)m_currentChar;
+ break;
+ default:
+ m_inUse[ m_runLength - 4 ] = true;
+ m_last++;
+ m_block[ m_last + 1 ] = (char)m_currentChar;
+ m_last++;
+ m_block[ m_last + 1 ] = (char)m_currentChar;
+ m_last++;
+ m_block[ m_last + 1 ] = (char)m_currentChar;
+ m_last++;
+ m_block[ m_last + 1 ] = (char)m_currentChar;
+ m_last++;
+ m_block[ m_last + 1 ] = (char)( m_runLength - 4 );
+ break;
+ }
+ }
+ else
+ {
+ endBlock();
+ initBlock();
+ writeRun();
+ }
+ }
+
+ private static class StackElem
+ {
+ int m_dd;
+ int m_hh;
+ int m_ll;
+ }
+}
+
diff --git a/jEdit/installer/CRC.java b/jEdit/installer/CRC.java
index 186679f..b609c2d 100644
--- a/jEdit/installer/CRC.java
+++ b/jEdit/installer/CRC.java
@@ -1,113 +1,113 @@
-/*
- * Copyright (C) The Apache Software Foundation. All rights reserved.
- *
- * This software is published under the terms of the Apache Software License
- * version 1.1, a copy of which has been included with this distribution in
- * the LICENSE.txt file.
- */
-package installer;
-
-/**
- * A simple class the hold and calculate the CRC for sanity checking of the
- * data.
- *
- * @author <a href="mailto:keiron at aftexsw.com">Keiron Liddle</a>
- */
-class CRC
-{
- private static int[] CRC32_TABLE = new int[]
- {
- 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
- 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
- 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
- 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
- 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
- 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
- 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
- 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
- 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
- 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
- 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
- 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
- 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
- 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
- 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
- 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
- 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
- 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
- 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
- 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
- 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
- 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
- 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
- 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
- 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
- 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
- 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
- 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
- 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
- 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
- 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
- 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
- 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
- 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
- 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
- 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
- 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
- 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
- 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
- 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
- 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
- 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
- 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
- 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
- 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
- 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
- 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
- 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
- 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
- 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
- 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
- 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
- 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
- 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
- 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
- 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
- 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
- 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
- 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
- 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
- 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
- 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
- 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
- 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
- };
-
- private int m_globalCrc;
-
- protected CRC()
- {
- initialiseCRC();
- }
-
- int getFinalCRC()
- {
- return ~m_globalCrc;
- }
-
- void initialiseCRC()
- {
- m_globalCrc = 0xffffffff;
- }
-
- void updateCRC( final int inCh )
- {
- int temp = ( m_globalCrc >> 24 ) ^ inCh;
- if( temp < 0 )
- {
- temp = 256 + temp;
- }
- m_globalCrc = ( m_globalCrc << 8 ) ^ CRC32_TABLE[ temp ];
- }
-}
-
+/*
+ * Copyright (C) The Apache Software Foundation. All rights reserved.
+ *
+ * This software is published under the terms of the Apache Software License
+ * version 1.1, a copy of which has been included with this distribution in
+ * the LICENSE.txt file.
+ */
+package installer;
+
+/**
+ * A simple class the hold and calculate the CRC for sanity checking of the
+ * data.
+ *
+ * @author <a href="mailto:keiron at aftexsw.com">Keiron Liddle</a>
+ */
+class CRC
+{
+ private static int[] CRC32_TABLE = new int[]
+ {
+ 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
+ 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
+ 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
+ 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
+ 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
+ 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
+ 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
+ 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
+ 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
+ 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
+ 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
+ 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
+ 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
+ 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
+ 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
+ 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
+ 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
+ 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
+ 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
+ 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
+ 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
+ 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
+ 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
+ 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
+ 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
+ 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
+ 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
+ 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
+ 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
+ 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
+ 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
+ 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
+ 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
+ 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
+ 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
+ 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
+ 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
+ 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
+ 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
+ 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
+ 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
+ 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
+ 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
+ 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
+ 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
+ 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
+ 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
+ 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
+ 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
+ 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
+ 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
+ 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
+ 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
+ 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
+ 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
+ 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
+ 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
+ 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
+ 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
+ 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
+ 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
+ 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
+ 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
+ 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
+ };
+
+ private int m_globalCrc;
+
+ protected CRC()
+ {
+ initialiseCRC();
+ }
+
+ int getFinalCRC()
+ {
+ return ~m_globalCrc;
+ }
+
+ void initialiseCRC()
+ {
+ m_globalCrc = 0xffffffff;
+ }
+
+ void updateCRC( final int inCh )
+ {
+ int temp = ( m_globalCrc >> 24 ) ^ inCh;
+ if( temp < 0 )
+ {
+ temp = 256 + temp;
+ }
+ m_globalCrc = ( m_globalCrc << 8 ) ^ CRC32_TABLE[ temp ];
+ }
+}
+
diff --git a/jEdit/installer/ConsoleInstall.java b/jEdit/installer/ConsoleInstall.java
index 0ac2ac3..d24884e 100644
--- a/jEdit/installer/ConsoleInstall.java
+++ b/jEdit/installer/ConsoleInstall.java
@@ -1,138 +1,138 @@
-/*
- * ConsoleInstall.java
- *
- * Originally written by Slava Pestov for the jEdit installer project. This work
- * has been placed into the public domain. You may use this work in any way and
- * for any purpose you wish.
- *
- * THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, NOT EVEN THE
- * IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE, ASSUMES
- * _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE RESULTING FROM THE USE, MODIFICATION,
- * OR REDISTRIBUTION OF THIS SOFTWARE.
- */
-
-package installer;
-
-import java.io.*;
-import java.util.Vector;
-
-/*
- * Performs text-only installation.
- */
-public class ConsoleInstall
-{
- public ConsoleInstall()
- {
- installer = new Install();
-
- String appName = installer.getProperty("app.name");
- String appVersion = installer.getProperty("app.version");
-
- BufferedReader in = new BufferedReader(new InputStreamReader(
- System.in));
-
- System.out.println("*** " + appName + " " + appVersion + " installer");
-
- OperatingSystem os = OperatingSystem.getOperatingSystem();
-
- String installDir = os.getInstallDirectory(appName,appVersion);
-
- System.out.print("Installation directory: [" + installDir + "] ");
- System.out.flush();
-
- String _installDir = readLine(in);
- if(_installDir.length() != 0)
- installDir = _installDir;
- else
- System.out.println("Will use default");
-
- OperatingSystem.OSTask[] osTasks = os.getOSTasks(installer);
-
- for(int i = 0; i < osTasks.length; i++)
- {
- OperatingSystem.OSTask osTask = osTasks[i];
- String label = osTask.getLabel();
- // label == null means no configurable options
- if(label != null)
- {
- String dir = osTask.getDirectory();
- System.out.print(label + " [" + dir + "] ");
- System.out.flush();
-
- dir = readLine(in);
- osTask.setEnabled(true);
- if(dir.length() != 0)
- {
- if(dir.equals("off"))
- osTask.setEnabled(false);
- else
- osTask.setDirectory(dir);
- }
- else
- System.out.println("will use default");
- }
- }
-
- int compCount = installer.getIntegerProperty("comp.count");
- Vector components = new Vector(compCount);
-
- System.out.println("*** Program components to install");
- for(int i = 0; i < compCount; i++)
- {
- String fileset = installer.getProperty("comp." + i + ".fileset");
-
- String osDep = installer.getProperty("comp." + i + ".os");
- if(osDep != null)
- {
- if(!os.getClass().getName().endsWith(osDep))
- {
- continue;
- }
- }
-
- System.out.print("Install "
- + installer.getProperty("comp." + i + ".name")
- + " ("
- + installer.getProperty("comp." + i + ".disk-size")
- + "Kb) [Y/n]? ");
-
- String line = readLine(in);
- if(line.length() == 0 || line.charAt(0) == 'y'
- || line.charAt(0) == 'Y')
- components.addElement(fileset);
- }
-
- System.out.println("*** Starting installation...");
- ConsoleProgress progress = new ConsoleProgress();
- InstallThread thread = new InstallThread(
- installer,progress,installDir,osTasks,
- 0 /* XXX */,components);
- thread.start();
- }
-
- // private members
- private Install installer;
-
- private String readLine(BufferedReader in)
- {
- try
- {
- String line = in.readLine();
- if(line == null)
- {
- System.err.println("\nEOF in input!");
- System.exit(1);
- // can't happen
- throw new InternalError();
- }
- return line;
- }
- catch(IOException io)
- {
- System.err.println("\nI/O error: " + io);
- System.exit(1);
- // can't happen
- throw new InternalError();
- }
- }
-}
+/*
+ * ConsoleInstall.java
+ *
+ * Originally written by Slava Pestov for the jEdit installer project. This work
+ * has been placed into the public domain. You may use this work in any way and
+ * for any purpose you wish.
+ *
+ * THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, NOT EVEN THE
+ * IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE, ASSUMES
+ * _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE RESULTING FROM THE USE, MODIFICATION,
+ * OR REDISTRIBUTION OF THIS SOFTWARE.
+ */
+
+package installer;
+
+import java.io.*;
+import java.util.Vector;
+
+/*
+ * Performs text-only installation.
+ */
+public class ConsoleInstall
+{
+ public ConsoleInstall()
+ {
+ installer = new Install();
+
+ String appName = installer.getProperty("app.name");
+ String appVersion = installer.getProperty("app.version");
+
+ BufferedReader in = new BufferedReader(new InputStreamReader(
+ System.in));
+
+ System.out.println("*** " + appName + " " + appVersion + " installer");
+
+ OperatingSystem os = OperatingSystem.getOperatingSystem();
+
+ String installDir = os.getInstallDirectory(appName,appVersion);
+
+ System.out.print("Installation directory: [" + installDir + "] ");
+ System.out.flush();
+
+ String _installDir = readLine(in);
+ if(_installDir.length() != 0)
+ installDir = _installDir;
+ else
+ System.out.println("Will use default");
+
+ OperatingSystem.OSTask[] osTasks = os.getOSTasks(installer);
+
+ for(int i = 0; i < osTasks.length; i++)
+ {
+ OperatingSystem.OSTask osTask = osTasks[i];
+ String label = osTask.getLabel();
+ // label == null means no configurable options
+ if(label != null)
+ {
+ String dir = osTask.getDirectory();
+ System.out.print(label + " [" + dir + "] ");
+ System.out.flush();
+
+ dir = readLine(in);
+ osTask.setEnabled(true);
+ if(dir.length() != 0)
+ {
+ if(dir.equals("off"))
+ osTask.setEnabled(false);
+ else
+ osTask.setDirectory(dir);
+ }
+ else
+ System.out.println("will use default");
+ }
+ }
+
+ int compCount = installer.getIntegerProperty("comp.count");
+ Vector components = new Vector(compCount);
+
+ System.out.println("*** Program components to install");
+ for(int i = 0; i < compCount; i++)
+ {
+ String fileset = installer.getProperty("comp." + i + ".fileset");
+
+ String osDep = installer.getProperty("comp." + i + ".os");
+ if(osDep != null)
+ {
+ if(!os.getClass().getName().endsWith(osDep))
+ {
+ continue;
+ }
+ }
+
+ System.out.print("Install "
+ + installer.getProperty("comp." + i + ".name")
+ + " ("
+ + installer.getProperty("comp." + i + ".disk-size")
+ + "Kb) [Y/n]? ");
+
+ String line = readLine(in);
+ if(line.length() == 0 || line.charAt(0) == 'y'
+ || line.charAt(0) == 'Y')
+ components.addElement(fileset);
+ }
+
+ System.out.println("*** Starting installation...");
+ ConsoleProgress progress = new ConsoleProgress();
+ InstallThread thread = new InstallThread(
+ installer,progress,installDir,osTasks,
+ 0 /* XXX */,components);
+ thread.start();
+ }
+
+ // private members
+ private Install installer;
+
+ private String readLine(BufferedReader in)
+ {
+ try
+ {
+ String line = in.readLine();
+ if(line == null)
+ {
+ System.err.println("\nEOF in input!");
+ System.exit(1);
+ // can't happen
+ throw new InternalError();
+ }
+ return line;
+ }
+ catch(IOException io)
+ {
+ System.err.println("\nI/O error: " + io);
+ System.exit(1);
+ // can't happen
+ throw new InternalError();
+ }
+ }
+}
diff --git a/jEdit/installer/ConsoleProgress.java b/jEdit/installer/ConsoleProgress.java
index 49e02da..a0a0004 100644
--- a/jEdit/installer/ConsoleProgress.java
+++ b/jEdit/installer/ConsoleProgress.java
@@ -1,44 +1,44 @@
-/*
- * ConsoleProgress.java
- *
- * Originally written by Slava Pestov for the jEdit installer project. This work
- * has been placed into the public domain. You may use this work in any way and
- * for any purpose you wish.
- *
- * THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, NOT EVEN THE
- * IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE, ASSUMES
- * _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE RESULTING FROM THE USE, MODIFICATION,
- * OR REDISTRIBUTION OF THIS SOFTWARE.
- */
-
-package installer;
-
-/*
- * Displays install progress when running in text-only mode.
- */
-public class ConsoleProgress implements Progress
-{
-
- public void setMaximum(int max)
- {
- }
-
- public void advance(int value)
- {
- }
-
- public void done()
- {
- System.out.println("*** Installation complete");
- }
-
- public void message(String message)
- {
- System.out.println(message);
- }
-
- public void error(String message)
- {
- System.err.println("*** An error occurred: " + message);
- }
-}
+/*
+ * ConsoleProgress.java
+ *
+ * Originally written by Slava Pestov for the jEdit installer project. This work
+ * has been placed into the public domain. You may use this work in any way and
+ * for any purpose you wish.
+ *
+ * THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, NOT EVEN THE
+ * IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE, ASSUMES
+ * _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE RESULTING FROM THE USE, MODIFICATION,
+ * OR REDISTRIBUTION OF THIS SOFTWARE.
+ */
+
+package installer;
+
+/*
+ * Displays install progress when running in text-only mode.
+ */
+public class ConsoleProgress implements Progress
+{
+
+ public void setMaximum(int max)
+ {
+ }
+
+ public void advance(int value)
+ {
+ }
+
+ public void done()
+ {
+ System.out.println("*** Installation complete");
+ }
+
+ public void message(String message)
+ {
+ System.out.println(message);
+ }
+
+ public void error(String message)
+ {
+ System.err.println("*** An error occurred: " + message);
+ }
+}
diff --git a/jEdit/installer/Install.java b/jEdit/installer/Install.java
index 3556895..82755ca 100644
--- a/jEdit/installer/Install.java
+++ b/jEdit/installer/Install.java
@@ -1,163 +1,163 @@
-/*
- * Install.java - Main class of the installer
- *
- * Originally written by Slava Pestov for the jEdit installer project. This work
- * has been placed into the public domain. You may use this work in any way and
- * for any purpose you wish.
- *
- * THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, NOT EVEN THE
- * IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE, ASSUMES
- * _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE RESULTING FROM THE USE, MODIFICATION,
- * OR REDISTRIBUTION OF THIS SOFTWARE.
- */
-
-package installer;
-
-import javax.swing.plaf.metal.*;
-import javax.swing.*;
-import java.io.*;
-import java.util.Properties;
-import java.security.*;
-import java.net.URL;
-
-public class Install
-{
- /**
- * detects wether the installer is running from a path
- * containing exclamation marks.
- * This has been reported as a cause of failure on Linux and MS Windows :
- * see bug #2065330 - Installer doesn't run on dir having ! as last char in name.
- */
- private static boolean isRunningFromExclam()
- {
- Class me = Install.class;
- ProtectionDomain domaine = me.getProtectionDomain();
- CodeSource source = domaine.getCodeSource();
- URL mySource = source.getLocation();
- // In fact the check is more restrictive than required :
- // a problem occurs only when the ! is at the end of directory
- return mySource.toString().contains("!");
- }
-
- private static void errorAndExit(boolean isGUI, String message)
- {
- if(isGUI)
- {
- JTextArea messageCnt = new JTextArea(message);
- JOptionPane.showMessageDialog(null,
- messageCnt,
- "jEdit installer error...", JOptionPane.ERROR_MESSAGE);
- }
- else
- {
- System.err.println(message);
- }
- System.exit(1);
- }
-
- public static void main(String[] args)
- {
- boolean isGUI = args.length == 0;
-
- String javaVersion = System.getProperty("java.version");
- if(javaVersion.compareTo("1.5") < 0)
- {
- errorAndExit(isGUI,
- "You are running Java version "
- + javaVersion + " from "+System.getProperty("java.vendor")+".\n"
- +"This installer requires Java 1.5 or later.");
- }
-
- if(isRunningFromExclam())
- {
- errorAndExit(isGUI,
- "You are running the installer from a directory containing exclamation marks."
- + "\nIt is a known cause of failure of the installer"
- + "\n(http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4523159 for the curious ones)."
- + "\nPlease move the installer somewhere else and run it again.");
- }
-
- if(isGUI)
- new SwingInstall();
- else if(args.length == 1 && args[0].equals("text"))
- new ConsoleInstall();
- else if(args.length >= 2 && args[0].equals("auto"))
- new NonInteractiveInstall(args);
- else
- {
- System.err.println("Usage:");
- System.err.println("java -jar <installer JAR>");
- System.err.println("java -jar <installer JAR> text");
- System.err.println("java -jar <installer JAR> auto"
- + " <install dir> [unix-script=<dir>] [unix-man=<dir>]");
- System.err.println("text parameter starts installer in text-only mode.");
- System.err.println("auto parameter starts installer in non-interactive mode.");
- }
- }
-
- public Install()
- {
- props = new Properties();
- try
- {
- InputStream in = getClass().getResourceAsStream("/installer/install.props");
- props.load(in);
- in.close();
- }
- catch(IOException io)
- {
- System.err.println("Error loading 'install.props':");
- io.printStackTrace();
- }
-
- buf = new byte[32768];
- }
-
- public String getProperty(String name)
- {
- return props.getProperty(name);
- }
-
- public int getIntegerProperty(String name)
- {
- try
- {
- return Integer.parseInt(props.getProperty(name));
- }
- catch(Exception e)
- {
- return -1;
- }
- }
-
- public void copy(InputStream in, String outfile, Progress progress)
- throws IOException
- {
- File outFile = new File(outfile);
-
- OperatingSystem.getOperatingSystem().mkdirs(outFile.getParent());
-
- BufferedOutputStream out = new BufferedOutputStream(
- new FileOutputStream(outFile));
-
- int count;
-
- for(;;)
- {
- count = in.read(buf,0,Math.min(in.available(),buf.length));
- if(count == -1 || count == 0)
- break;
-
- out.write(buf,0,count);
- if(progress != null)
- progress.advance(count);
- }
-
- //in.close();
- out.close();
- }
-
- // private members
- private Properties props;
- private byte[] buf;
-}
+/*
+ * Install.java - Main class of the installer
+ *
+ * Originally written by Slava Pestov for the jEdit installer project. This work
+ * has been placed into the public domain. You may use this work in any way and
+ * for any purpose you wish.
+ *
+ * THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, NOT EVEN THE
+ * IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE, ASSUMES
+ * _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE RESULTING FROM THE USE, MODIFICATION,
+ * OR REDISTRIBUTION OF THIS SOFTWARE.
+ */
+
+package installer;
+
+import javax.swing.plaf.metal.*;
+import javax.swing.*;
+import java.io.*;
+import java.util.Properties;
+import java.security.*;
+import java.net.URL;
+
+public class Install
+{
+ /**
+ * detects wether the installer is running from a path
+ * containing exclamation marks.
+ * This has been reported as a cause of failure on Linux and MS Windows :
+ * see bug #2065330 - Installer doesn't run on dir having ! as last char in name.
+ */
+ private static boolean isRunningFromExclam()
+ {
+ Class me = Install.class;
+ ProtectionDomain domaine = me.getProtectionDomain();
+ CodeSource source = domaine.getCodeSource();
+ URL mySource = source.getLocation();
+ // In fact the check is more restrictive than required :
+ // a problem occurs only when the ! is at the end of directory
+ return mySource.toString().contains("!");
+ }
+
+ private static void errorAndExit(boolean isGUI, String message)
+ {
+ if(isGUI)
+ {
+ JTextArea messageCnt = new JTextArea(message);
+ JOptionPane.showMessageDialog(null,
+ messageCnt,
+ "jEdit installer error...", JOptionPane.ERROR_MESSAGE);
+ }
+ else
+ {
+ System.err.println(message);
+ }
+ System.exit(1);
+ }
+
+ public static void main(String[] args)
+ {
+ boolean isGUI = args.length == 0;
+
+ String javaVersion = System.getProperty("java.version");
+ if(javaVersion.compareTo("1.6") < 0)
+ {
+ errorAndExit(isGUI,
+ "You are running Java version "
+ + javaVersion + " from "+System.getProperty("java.vendor")+".\n"
+ +"This installer requires Java 1.6 or later.");
+ }
+
+ if(isRunningFromExclam())
+ {
+ errorAndExit(isGUI,
+ "You are running the installer from a directory containing exclamation marks."
+ + "\nIt is a known cause of failure of the installer"
+ + "\n(http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4523159 for the curious ones)."
+ + "\nPlease move the installer somewhere else and run it again.");
+ }
+
+ if(isGUI)
+ new SwingInstall();
+ else if(args.length == 1 && args[0].equals("text"))
+ new ConsoleInstall();
+ else if(args.length >= 2 && args[0].equals("auto"))
+ new NonInteractiveInstall(args);
+ else
+ {
+ System.err.println("Usage:");
+ System.err.println("java -jar <installer JAR>");
+ System.err.println("java -jar <installer JAR> text");
+ System.err.println("java -jar <installer JAR> auto"
+ + " <install dir> [unix-script=<dir>] [unix-man=<dir>]");
+ System.err.println("text parameter starts installer in text-only mode.");
+ System.err.println("auto parameter starts installer in non-interactive mode.");
+ }
+ }
+
+ public Install()
+ {
+ props = new Properties();
+ try
+ {
+ InputStream in = getClass().getResourceAsStream("/installer/install.props");
+ props.load(in);
+ in.close();
+ }
+ catch(IOException io)
+ {
+ System.err.println("Error loading 'install.props':");
+ io.printStackTrace();
+ }
+
+ buf = new byte[32768];
+ }
+
+ public String getProperty(String name)
+ {
+ return props.getProperty(name);
+ }
+
+ public int getIntegerProperty(String name)
+ {
+ try
+ {
+ return Integer.parseInt(props.getProperty(name));
+ }
+ catch(Exception e)
+ {
+ return -1;
+ }
+ }
+
+ public void copy(InputStream in, String outfile, Progress progress)
+ throws IOException
+ {
+ File outFile = new File(outfile);
+
+ OperatingSystem.getOperatingSystem().mkdirs(outFile.getParent());
+
+ BufferedOutputStream out = new BufferedOutputStream(
+ new FileOutputStream(outFile));
+
+ int count;
+
+ for(;;)
+ {
+ count = in.read(buf,0,Math.min(in.available(),buf.length));
+ if(count == -1 || count == 0)
+ break;
+
+ out.write(buf,0,count);
+ if(progress != null)
+ progress.advance(count);
+ }
+
+ //in.close();
+ out.close();
+ }
+
+ // private members
+ private Properties props;
+ private byte[] buf;
+}
diff --git a/jEdit/installer/InstallThread.java b/jEdit/installer/InstallThread.java
index 5666c97..c5971ce 100644
--- a/jEdit/installer/InstallThread.java
+++ b/jEdit/installer/InstallThread.java
@@ -1,114 +1,114 @@
-/*
- * InstallThread.java
- *
- * Originally written by Slava Pestov for the jEdit installer project. This work
- * has been placed into the public domain. You may use this work in any way and
- * for any purpose you wish.
- *
- * THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, NOT EVEN THE
- * IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE, ASSUMES
- * _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE RESULTING FROM THE USE, MODIFICATION,
- * OR REDISTRIBUTION OF THIS SOFTWARE.
- */
-package installer;
-
-import java.io.*;
-import java.util.Vector;
-import java.net.*;
-
-/*
- * The thread that performs installation.
- */
-public class InstallThread extends Thread
-{
- public InstallThread(Install installer, Progress progress,
- String installDir, OperatingSystem.OSTask[] osTasks,
- int size, Vector components)
- {
- super("Install thread");
-
- this.installer = installer;
- this.progress = progress;
- this.installDir = installDir;
- this.osTasks = osTasks;
- this.size = size;
- this.components = components;
- }
-
- public void run()
- {
- progress.setMaximum(size * 1024);
-
- //return value ignored : already signalled in ServerKiller
- progress.message("stopping any jEdit server");
- ServerKiller.quitjEditServer();
-
- try
- {
- // install user-selected packages
- for(int i = 0; i < components.size(); i++)
- {
- String comp = (String)components.elementAt(i);
- progress.message("Installing " + comp);
- installComponent(comp);
- }
-
- // do operating system specific stuff (creating startup
- // scripts, installing man pages, etc.)
- for(int i = 0; i < osTasks.length; i++)
- {
- progress.message("Performing task " +
- osTasks[i].getName());
- osTasks[i].perform(installDir,components);
- }
- }
- catch(FileNotFoundException fnf)
- {
- progress.error("The installer could not create the "
- + "destination directory.\n"
- + "Maybe you do not have write permission?");
- return;
- }
- catch(IOException io)
- {
- progress.error(io.toString());
- return;
- }
-
- progress.done();
- }
-
- // private members
- private Install installer;
- private Progress progress;
- private String installDir;
- private OperatingSystem.OSTask[] osTasks;
- private int size;
- private Vector components;
-
- private void installComponent(String name) throws IOException
- {
- InputStream in = new BufferedInputStream(
- getClass().getResourceAsStream(name + ".tar.bz2"));
- // skip header bytes
- // maybe should check if they're valid or not?
- in.read();
- in.read();
-
- TarInputStream tarInput = new TarInputStream(
- new CBZip2InputStream(in));
- TarEntry entry;
- while((entry = tarInput.getNextEntry()) != null)
- {
- if(entry.isDirectory())
- continue;
- String fileName = entry.getName();
- //System.err.println(fileName);
- String outfile = installDir + File.separatorChar
- + fileName.replace('/',File.separatorChar);
- installer.copy(tarInput,outfile,progress);
- }
-
- tarInput.close();
- }
-}
+/*
+ * InstallThread.java
+ *
+ * Originally written by Slava Pestov for the jEdit installer project. This work
+ * has been placed into the public domain. You may use this work in any way and
+ * for any purpose you wish.
+ *
+ * THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, NOT EVEN THE
+ * IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE, ASSUMES
+ * _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE RESULTING FROM THE USE, MODIFICATION,
+ * OR REDISTRIBUTION OF THIS SOFTWARE.
+ */
+package installer;
+
+import java.io.*;
+import java.util.Vector;
+import java.net.*;
+
+/*
+ * The thread that performs installation.
+ */
+public class InstallThread extends Thread
+{
+ public InstallThread(Install installer, Progress progress,
+ String installDir, OperatingSystem.OSTask[] osTasks,
+ int size, Vector components)
+ {
+ super("Install thread");
+
+ this.installer = installer;
+ this.progress = progress;
+ this.installDir = installDir;
+ this.osTasks = osTasks;
+ this.size = size;
+ this.components = components;
+ }
+
+ public void run()
+ {
+ progress.setMaximum(size * 1024);
+
+ //return value ignored : already signalled in ServerKiller
+ progress.message("stopping any jEdit server");
+ ServerKiller.quitjEditServer();
+
+ try
+ {
+ // install user-selected packages
+ for(int i = 0; i < components.size(); i++)
+ {
+ String comp = (String)components.elementAt(i);
+ progress.message("Installing " + comp);
+ installComponent(comp);
+ }
+
+ // do operating system specific stuff (creating startup
+ // scripts, installing man pages, etc.)
+ for(int i = 0; i < osTasks.length; i++)
+ {
+ progress.message("Performing task " +
+ osTasks[i].getName());
+ osTasks[i].perform(installDir,components);
+ }
+ }
+ catch(FileNotFoundException fnf)
+ {
+ progress.error("The installer could not create the "
+ + "destination directory.\n"
+ + "Maybe you do not have write permission?");
+ return;
+ }
+ catch(IOException io)
+ {
+ progress.error(io.toString());
+ return;
+ }
+
+ progress.done();
+ }
+
+ // private members
+ private Install installer;
+ private Progress progress;
+ private String installDir;
+ private OperatingSystem.OSTask[] osTasks;
+ private int size;
+ private Vector components;
+
+ private void installComponent(String name) throws IOException
+ {
+ InputStream in = new BufferedInputStream(
+ getClass().getResourceAsStream(name + ".tar.bz2"));
+ // skip header bytes
+ // maybe should check if they're valid or not?
+ in.read();
+ in.read();
+
+ TarInputStream tarInput = new TarInputStream(
+ new CBZip2InputStream(in));
+ TarEntry entry;
+ while((entry = tarInput.getNextEntry()) != null)
+ {
+ if(entry.isDirectory())
+ continue;
+ String fileName = entry.getName();
+ //System.err.println(fileName);
+ String outfile = installDir + File.separatorChar
+ + fileName.replace('/',File.separatorChar);
+ installer.copy(tarInput,outfile,progress);
+ }
+
+ tarInput.close();
+ }
+}
diff --git a/jEdit/installer/InvalidHeaderException.java b/jEdit/installer/InvalidHeaderException.java
index 0d40e80..be46ae0 100644
--- a/jEdit/installer/InvalidHeaderException.java
+++ b/jEdit/installer/InvalidHeaderException.java
@@ -1,42 +1,42 @@
-/*
-** Authored by Timothy Gerard Endres
-** <mailto:time at gjt.org> <http://www.trustice.com>
-**
-** This work has been placed into the public domain.
-** You may use this work in any way and for any purpose you wish.
-**
-** THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND,
-** NOT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR
-** OF THIS SOFTWARE, ASSUMES _NO_ RESPONSIBILITY FOR ANY
-** CONSEQUENCE RESULTING FROM THE USE, MODIFICATION, OR
-** REDISTRIBUTION OF THIS SOFTWARE.
-**
-*/
-
-package installer;
-
-import java.io.IOException;
-
-/**
- * This exception is used to indicate that there is a problem
- * with a TAR archive header.
- */
-
-public class
-InvalidHeaderException extends IOException
- {
-
- public
- InvalidHeaderException()
- {
- super();
- }
-
- public
- InvalidHeaderException( String msg )
- {
- super( msg );
- }
-
- }
-
+/*
+** Authored by Timothy Gerard Endres
+** <mailto:time at gjt.org> <http://www.trustice.com>
+**
+** This work has been placed into the public domain.
+** You may use this work in any way and for any purpose you wish.
+**
+** THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND,
+** NOT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR
+** OF THIS SOFTWARE, ASSUMES _NO_ RESPONSIBILITY FOR ANY
+** CONSEQUENCE RESULTING FROM THE USE, MODIFICATION, OR
+** REDISTRIBUTION OF THIS SOFTWARE.
+**
+*/
+
+package installer;
+
+import java.io.IOException;
+
+/**
+ * This exception is used to indicate that there is a problem
+ * with a TAR archive header.
+ */
+
+public class
+InvalidHeaderException extends IOException
+ {
+
+ public
+ InvalidHeaderException()
+ {
+ super();
+ }
+
+ public
+ InvalidHeaderException( String msg )
+ {
+ super( msg );
+ }
+
+ }
+
diff --git a/jEdit/installer/NonInteractiveInstall.java b/jEdit/installer/NonInteractiveInstall.java
index 32afb7a..35b6d3a 100644
--- a/jEdit/installer/NonInteractiveInstall.java
+++ b/jEdit/installer/NonInteractiveInstall.java
@@ -1,91 +1,91 @@
-/*
- * NonInteractiveInstall.java
- *
- * Originally written by Slava Pestov for the jEdit installer project. This work
- * has been placed into the public domain. You may use this work in any way and
- * for any purpose you wish.
- *
- * THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, NOT EVEN THE
- * IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE, ASSUMES
- * _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE RESULTING FROM THE USE, MODIFICATION,
- * OR REDISTRIBUTION OF THIS SOFTWARE.
- */
-
-package installer;
-
-import java.util.Vector;
-
-/*
- * Performs non-interactive installation.
- */
-public class NonInteractiveInstall
-{
- public NonInteractiveInstall(String[] args)
- {
- String installDir = args[1];
-
- installer = new Install();
-
- OperatingSystem os = OperatingSystem.getOperatingSystem();
- OperatingSystem.OSTask[] osTasks = os.getOSTasks(installer);
-
- for(int i = 2; i < args.length; i++)
- {
- String arg = args[i];
- int index = arg.indexOf('=');
- if(index == -1)
- {
- System.err.println("Invalid parameter: " + arg);
- continue;
- }
-
- String taskName = arg.substring(0,index);
- String taskDir = arg.substring(index + 1);
- for(int j = 0; j < osTasks.length; j++)
- {
- OperatingSystem.OSTask osTask = osTasks[j];
- if(osTask.getName().equals(taskName))
- {
- if(taskDir.equals("off"))
- osTask.setEnabled(false);
- else
- {
- osTask.setEnabled(true);
- osTask.setDirectory(taskDir);
- }
- break;
- }
- }
- }
-
- int compCount = installer.getIntegerProperty("comp.count");
- Vector components = new Vector(compCount);
-
- for(int i = 0; i < compCount; i++)
- {
- String fileset = installer.getProperty("comp." + i + ".fileset");
-
- String osDep = installer.getProperty("comp." + i + ".os");
- if(osDep != null)
- {
- if(!os.getClass().getName().endsWith(osDep))
- {
- continue;
- }
- }
-
- components.addElement(fileset);
- }
-
- //
-
- ConsoleProgress progress = new ConsoleProgress();
- InstallThread thread = new InstallThread(
- installer,progress,installDir,osTasks,
- 0 /* XXX */,components);
- thread.start();
- }
-
- // private members
- private Install installer;
-}
+/*
+ * NonInteractiveInstall.java
+ *
+ * Originally written by Slava Pestov for the jEdit installer project. This work
+ * has been placed into the public domain. You may use this work in any way and
+ * for any purpose you wish.
+ *
+ * THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, NOT EVEN THE
+ * IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE, ASSUMES
+ * _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE RESULTING FROM THE USE, MODIFICATION,
+ * OR REDISTRIBUTION OF THIS SOFTWARE.
+ */
+
+package installer;
+
+import java.util.Vector;
+
+/*
+ * Performs non-interactive installation.
+ */
+public class NonInteractiveInstall
+{
+ public NonInteractiveInstall(String[] args)
+ {
+ String installDir = args[1];
+
+ installer = new Install();
+
+ OperatingSystem os = OperatingSystem.getOperatingSystem();
+ OperatingSystem.OSTask[] osTasks = os.getOSTasks(installer);
+
+ for(int i = 2; i < args.length; i++)
+ {
+ String arg = args[i];
+ int index = arg.indexOf('=');
+ if(index == -1)
+ {
+ System.err.println("Invalid parameter: " + arg);
+ continue;
+ }
+
+ String taskName = arg.substring(0,index);
+ String taskDir = arg.substring(index + 1);
+ for(int j = 0; j < osTasks.length; j++)
+ {
+ OperatingSystem.OSTask osTask = osTasks[j];
+ if(osTask.getName().equals(taskName))
+ {
+ if(taskDir.equals("off"))
+ osTask.setEnabled(false);
+ else
+ {
+ osTask.setEnabled(true);
+ osTask.setDirectory(taskDir);
+ }
+ break;
+ }
+ }
+ }
+
+ int compCount = installer.getIntegerProperty("comp.count");
+ Vector components = new Vector(compCount);
+
+ for(int i = 0; i < compCount; i++)
+ {
+ String fileset = installer.getProperty("comp." + i + ".fileset");
+
+ String osDep = installer.getProperty("comp." + i + ".os");
+ if(osDep != null)
+ {
+ if(!os.getClass().getName().endsWith(osDep))
+ {
+ continue;
+ }
+ }
+
+ components.addElement(fileset);
+ }
+
+ //
+
+ ConsoleProgress progress = new ConsoleProgress();
+ InstallThread thread = new InstallThread(
+ installer,progress,installDir,osTasks,
+ 0 /* XXX */,components);
+ thread.start();
+ }
+
+ // private members
+ private Install installer;
+}
diff --git a/jEdit/installer/OperatingSystem.java b/jEdit/installer/OperatingSystem.java
index c9772e5..241e6bb 100644
--- a/jEdit/installer/OperatingSystem.java
+++ b/jEdit/installer/OperatingSystem.java
@@ -1,376 +1,376 @@
-/*
- * OperatingSystem.java
- *
- * Originally written by Slava Pestov for the jEdit installer project. This work
- * has been placed into the public domain. You may use this work in any way and
- * for any purpose you wish.
- *
- * THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, NOT EVEN THE
- * IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE, ASSUMES
- * _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE RESULTING FROM THE USE, MODIFICATION,
- * OR REDISTRIBUTION OF THIS SOFTWARE.
- */
-
-package installer;
-
-import java.io.*;
-import java.util.Vector;
-
-/*
- * Abstracts away operating-specific stuff, like finding out the installation
- * directory, creating a shortcut to start to program, and such.
- */
-public abstract class OperatingSystem
-{
- public abstract String getInstallDirectory(String name, String version);
-
- public abstract static class OSTask
- {
- protected Install installer;
- protected String name;
- protected String label;
- protected String directory;
- protected boolean enabled;
-
- public OSTask(Install installer, String name)
- {
- this.installer = installer;
- this.name = name;
- this.label = installer.getProperty("ostask." + name + ".label");
- this.directory = getDefaultDirectory(installer);
-
- // on by default
- enabled = true;
- }
-
- public String getName()
- {
- return name;
- }
-
- public String getLabel()
- {
- return label;
- }
-
- public String getDefaultDirectory(Install installer)
- {
- return null;
- }
-
- public String getDirectory()
- {
- return directory;
- }
-
- public boolean isEnabled()
- {
- return enabled;
- }
-
- public void setEnabled(boolean enabled)
- {
- this.enabled = enabled;
- }
-
- public void setDirectory(String directory)
- {
- this.directory = directory;
- }
-
- public abstract void perform(String installDir,
- Vector filesets) throws IOException;
- }
-
- public OSTask[] getOSTasks(Install installer)
- {
- return new OSTask[0];
- }
-
- public void mkdirs(String directory) throws IOException
- {
- File file = new File(directory);
- if(!file.exists())
- file.mkdirs();
- }
-
- public static OperatingSystem getOperatingSystem()
- {
- if(os != null)
- return os;
-
- if(System.getProperty("mrj.version") != null)
- {
- os = new MacOS();
- }
- else
- {
- String osName = System.getProperty("os.name");
- if(osName.indexOf("Windows") != -1)
- os = new Windows();
- else if(osName.indexOf("OS/2") != -1)
- os = new HalfAnOS();
- else if(osName.indexOf("VMS") != -1)
- os = new VMS();
- else
- os = new Unix();
- }
-
- return os;
- }
-
- public static class Unix extends OperatingSystem
- {
- public String getInstallDirectory(String name, String version)
- {
- String dir = "/usr/local/share/";
- if(!new File(dir).canWrite())
- {
- dir = System.getProperty("user.home");
- }
-
- return new File(dir,name.toLowerCase() + "/" + version).getPath();
- }
-
- public String getExtraClassPath()
- {
- return "";
- }
-
- public class ScriptOSTask extends OSTask
- {
- public ScriptOSTask(Install installer)
- {
- super(installer,"unix-script");
- }
-
- public String getDefaultDirectory(Install installer)
- {
- String dir = "/usr/local/";
- if(!new File(dir).canWrite())
- {
- dir = System.getProperty("user.home");
- }
-
- return new File(dir,"bin").getPath();
- }
-
- public void perform(String installDir,
- Vector filesets) throws IOException
- {
- if(!enabled)
- {
- return;
- }
-
- mkdirs(directory);
-
- String name = installer.getProperty("app.name");
-
- // create app start script
- String script = directory + File.separatorChar
- + name.toLowerCase();
-
- // Delete existing copy
- new File(script).delete();
-
- // Write simple script
- FileWriter out = new FileWriter(script);
- out.write("#!/bin/sh\n");
- out.write("#\n");
- out.write("# Runs jEdit - Programmer's Text Editor.\n");
- out.write("#\n");
- out.write("\n");
- out.write("# Set jvm heap initial and maximum sizes (in megabytes).\n");
- out.write("JAVA_HEAP_MAX_SIZE=192\n");
- out.write("\n");
- out.write("DEFAULT_JAVA_HOME=\""
- + System.getProperty("java.home")
- + "\"\n");
- out.write("if [ -z \"$JAVA_HOME\" ]; then\n");
- out.write("\tJAVA_HOME=\"$DEFAULT_JAVA_HOME\"\n");
- out.write("fi\n");
- out.write("\n");
- out.write("# Launch application.\n");
- out.write("\n");
-
- String jar = "\""+ installDir + File.separator
- + name.toLowerCase() + ".jar"+"\"";
-
-
- out.write("exec \"$JAVA_HOME/bin/java\"" +
- " -Xmx${JAVA_HEAP_MAX_SIZE}M -jar " +
- jar + " \"$@\"\n");
- out.close();
-
- // Make it executable
- String[] chmodArgs = { "chmod", "755", script };
- exec(chmodArgs);
- }
- }
-
- public class ManPageOSTask extends OSTask
- {
- public ManPageOSTask(Install installer)
- {
- super(installer,"unix-man");
- }
-
- public String getDefaultDirectory(Install installer)
- {
- String dir = "/usr/local/";
- if(!new File(dir).canWrite())
- dir = System.getProperty("user.home");
-
- return new File(dir,"man/man1").getPath();
- }
-
- public void perform(String installDir,
- Vector filesets) throws IOException
- {
- if(!enabled)
- return;
-
- mkdirs(directory);
-
- String name = installer.getProperty("app.name");
-
- // install man page
- String manpage = installer.getProperty("ostask.unix-man.manpage");
-
- InputStream in = getClass().getResourceAsStream("/" + manpage);
- installer.copy(in,new File(directory,manpage).getPath(),
- null);
- }
- }
-
- public OSTask[] getOSTasks(Install installer)
- {
- return new OSTask[] { new ScriptOSTask(installer),
- new ManPageOSTask(installer) };
- }
-
- public void mkdirs(String directory) throws IOException
- {
- File file = new File(directory);
- if(!file.exists())
- {
- String[] mkdirArgs = { "mkdir", "-m", "755",
- "-p", directory };
- exec(mkdirArgs);
- }
- }
-
- public void exec(String[] args) throws IOException
- {
- Process proc = Runtime.getRuntime().exec(args);
- proc.getInputStream().close();
- proc.getOutputStream().close();
- proc.getErrorStream().close();
- try
- {
- proc.waitFor();
- }
- catch(InterruptedException ie)
- {
- }
- }
- }
-
- public static class MacOS extends Unix
- {
- public String getInstallDirectory(String name, String version)
- {
- return "/Applications/" + name + " " + version;
- }
-
- public String getExtraClassPath()
- {
- return "/System/Library/Java/:";
- }
- }
-
- public static class Windows extends OperatingSystem
- {
- public String getInstallDirectory(String name, String version)
- {
- String programDir = System.getenv("ProgramFiles");
- // Here is a workaround for the case that the environment
- // variable is not defined. Windows 98 and ME are known as
- // such environments. This makes sense while jEdit supports
- // JRE 5. JRE 6 doesn't support Windows 98 and ME.
- if(programDir == null)
- {
- // This is a hint for what is needed here.
- programDir = "%ProgramFiles%";
- }
- return programDir + "\\" + name + " " + version;
- }
-
- public class JEditLauncherOSTask extends OSTask
- {
- public JEditLauncherOSTask(Install installer)
- {
- super(installer,"jedit-launcher");
- }
-
- public String getDefaultDirectory(Install installer)
- {
- return null;
- }
-
- public void perform(String installDir,
- Vector filesets)
- {
- if(!enabled
- || !filesets.contains("jedit-windows"))
- return;
-
- // run jEditLauncher installation
- File executable = new File(installDir,"jedit.exe");
- if(!executable.exists())
- return;
-
- String[] args = { executable.getPath(), "/i",
- System.getProperty("java.home")
- + File.separator
- + "bin" };
-
- try
- {
- Runtime.getRuntime().exec(args).waitFor();
- }
- catch(IOException io)
- {
- }
- catch(InterruptedException ie)
- {
- }
- }
- }
-
- public OSTask[] getOSTasks(Install installer)
- {
- return new OSTask[] { /* new JEditLauncherOSTask(installer) */ };
- }
- }
-
- public static class HalfAnOS extends OperatingSystem
- {
- public String getInstallDirectory(String name, String version)
- {
- return "C:\\" + name + " " + version;
- }
- }
-
- public static class VMS extends OperatingSystem
- {
- public String getInstallDirectory(String name, String version)
- {
- return "./" + name.toLowerCase() + "/" + version;
- }
- }
-
- // private members
- private static OperatingSystem os;
-}
+/*
+ * OperatingSystem.java
+ *
+ * Originally written by Slava Pestov for the jEdit installer project. This work
+ * has been placed into the public domain. You may use this work in any way and
+ * for any purpose you wish.
+ *
+ * THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, NOT EVEN THE
+ * IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE, ASSUMES
+ * _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE RESULTING FROM THE USE, MODIFICATION,
+ * OR REDISTRIBUTION OF THIS SOFTWARE.
+ */
+
+package installer;
+
+import java.io.*;
+import java.util.Vector;
+
+/*
+ * Abstracts away operating-specific stuff, like finding out the installation
+ * directory, creating a shortcut to start to program, and such.
+ */
+public abstract class OperatingSystem
+{
+ public abstract String getInstallDirectory(String name, String version);
+
+ public abstract static class OSTask
+ {
+ protected Install installer;
+ protected String name;
+ protected String label;
+ protected String directory;
+ protected boolean enabled;
+
+ public OSTask(Install installer, String name)
+ {
+ this.installer = installer;
+ this.name = name;
+ this.label = installer.getProperty("ostask." + name + ".label");
+ this.directory = getDefaultDirectory(installer);
+
+ // on by default
+ enabled = true;
+ }
+
+ public String getName()
+ {
+ return name;
+ }
+
+ public String getLabel()
+ {
+ return label;
+ }
+
+ public String getDefaultDirectory(Install installer)
+ {
+ return null;
+ }
+
+ public String getDirectory()
+ {
+ return directory;
+ }
+
+ public boolean isEnabled()
+ {
+ return enabled;
+ }
+
+ public void setEnabled(boolean enabled)
+ {
+ this.enabled = enabled;
+ }
+
+ public void setDirectory(String directory)
+ {
+ this.directory = directory;
+ }
+
+ public abstract void perform(String installDir,
+ Vector filesets) throws IOException;
+ }
+
+ public OSTask[] getOSTasks(Install installer)
+ {
+ return new OSTask[0];
+ }
+
+ public void mkdirs(String directory) throws IOException
+ {
+ File file = new File(directory);
+ if(!file.exists())
+ file.mkdirs();
+ }
+
+ public static OperatingSystem getOperatingSystem()
+ {
+ if(os != null)
+ return os;
+
+ if(System.getProperty("mrj.version") != null)
+ {
+ os = new MacOS();
+ }
+ else
+ {
+ String osName = System.getProperty("os.name");
+ if(osName.indexOf("Windows") != -1)
+ os = new Windows();
+ else if(osName.indexOf("OS/2") != -1)
+ os = new HalfAnOS();
+ else if(osName.indexOf("VMS") != -1)
+ os = new VMS();
+ else
+ os = new Unix();
+ }
+
+ return os;
+ }
+
+ public static class Unix extends OperatingSystem
+ {
+ public String getInstallDirectory(String name, String version)
+ {
+ String dir = "/usr/local/share/";
+ if(!new File(dir).canWrite())
+ {
+ dir = System.getProperty("user.home");
+ }
+
+ return new File(dir,name.toLowerCase() + "/" + version).getPath();
+ }
+
+ public String getExtraClassPath()
+ {
+ return "";
+ }
+
+ public class ScriptOSTask extends OSTask
+ {
+ public ScriptOSTask(Install installer)
+ {
+ super(installer,"unix-script");
+ }
+
+ public String getDefaultDirectory(Install installer)
+ {
+ String dir = "/usr/local/";
+ if(!new File(dir).canWrite())
+ {
+ dir = System.getProperty("user.home");
+ }
+
+ return new File(dir,"bin").getPath();
+ }
+
+ public void perform(String installDir,
+ Vector filesets) throws IOException
+ {
+ if(!enabled)
+ {
+ return;
+ }
+
+ mkdirs(directory);
+
+ String name = installer.getProperty("app.name");
+
+ // create app start script
+ String script = directory + File.separatorChar
+ + name.toLowerCase();
+
+ // Delete existing copy
+ new File(script).delete();
+
+ // Write simple script
+ FileWriter out = new FileWriter(script);
+ out.write("#!/bin/sh\n");
+ out.write("#\n");
+ out.write("# Runs jEdit - Programmer's Text Editor.\n");
+ out.write("#\n");
+ out.write("\n");
+ out.write("# Set jvm heap initial and maximum sizes (in megabytes).\n");
+ out.write("JAVA_HEAP_MAX_SIZE=192\n");
+ out.write("\n");
+ out.write("DEFAULT_JAVA_HOME=\""
+ + System.getProperty("java.home")
+ + "\"\n");
+ out.write("if [ -z \"$JAVA_HOME\" ]; then\n");
+ out.write("\tJAVA_HOME=\"$DEFAULT_JAVA_HOME\"\n");
+ out.write("fi\n");
+ out.write("\n");
+ out.write("# Launch application.\n");
+ out.write("\n");
+
+ String jar = "\""+ installDir + File.separator
+ + name.toLowerCase() + ".jar"+"\"";
+
+
+ out.write("exec \"$JAVA_HOME/bin/java\"" +
+ " -Xmx${JAVA_HEAP_MAX_SIZE}M -jar " +
+ jar + " \"$@\"\n");
+ out.close();
+
+ // Make it executable
+ String[] chmodArgs = { "chmod", "755", script };
+ exec(chmodArgs);
+ }
+ }
+
+ public class ManPageOSTask extends OSTask
+ {
+ public ManPageOSTask(Install installer)
+ {
+ super(installer,"unix-man");
+ }
+
+ public String getDefaultDirectory(Install installer)
+ {
+ String dir = "/usr/local/";
+ if(!new File(dir).canWrite())
+ dir = System.getProperty("user.home");
+
+ return new File(dir,"man/man1").getPath();
+ }
+
+ public void perform(String installDir,
+ Vector filesets) throws IOException
+ {
+ if(!enabled)
+ return;
+
+ mkdirs(directory);
+
+ String name = installer.getProperty("app.name");
+
+ // install man page
+ String manpage = installer.getProperty("ostask.unix-man.manpage");
+
+ InputStream in = getClass().getResourceAsStream("/" + manpage);
+ installer.copy(in,new File(directory,manpage).getPath(),
+ null);
+ }
+ }
+
+ public OSTask[] getOSTasks(Install installer)
+ {
+ return new OSTask[] { new ScriptOSTask(installer),
+ new ManPageOSTask(installer) };
+ }
+
+ public void mkdirs(String directory) throws IOException
+ {
+ File file = new File(directory);
+ if(!file.exists())
+ {
+ String[] mkdirArgs = { "mkdir", "-m", "755",
+ "-p", directory };
+ exec(mkdirArgs);
+ }
+ }
+
+ public void exec(String[] args) throws IOException
+ {
+ Process proc = Runtime.getRuntime().exec(args);
+ proc.getInputStream().close();
+ proc.getOutputStream().close();
+ proc.getErrorStream().close();
+ try
+ {
+ proc.waitFor();
+ }
+ catch(InterruptedException ie)
+ {
+ }
+ }
+ }
+
+ public static class MacOS extends Unix
+ {
+ public String getInstallDirectory(String name, String version)
+ {
+ return "/Applications/" + name + " " + version;
+ }
+
+ public String getExtraClassPath()
+ {
+ return "/System/Library/Java/:";
+ }
+ }
+
+ public static class Windows extends OperatingSystem
+ {
+ public String getInstallDirectory(String name, String version)
+ {
+ String programDir = System.getenv("ProgramFiles");
+ // Here is a workaround for the case that the environment
+ // variable is not defined. Windows 98 and ME are known as
+ // such environments. This makes sense while jEdit supports
+ // JRE 5. JRE 6 doesn't support Windows 98 and ME.
+ if(programDir == null)
+ {
+ // This is a hint for what is needed here.
+ programDir = "%ProgramFiles%";
+ }
+ return programDir + "\\" + name + " " + version;
+ }
+
+ public class JEditLauncherOSTask extends OSTask
+ {
+ public JEditLauncherOSTask(Install installer)
+ {
+ super(installer,"jedit-launcher");
+ }
+
+ public String getDefaultDirectory(Install installer)
+ {
+ return null;
+ }
+
+ public void perform(String installDir,
+ Vector filesets)
+ {
+ if(!enabled
+ || !filesets.contains("jedit-windows"))
+ return;
+
+ // run jEditLauncher installation
+ File executable = new File(installDir,"jedit.exe");
+ if(!executable.exists())
+ return;
+
+ String[] args = { executable.getPath(), "/i",
+ System.getProperty("java.home")
+ + File.separator
+ + "bin" };
+
+ try
+ {
+ Runtime.getRuntime().exec(args).waitFor();
+ }
+ catch(IOException io)
+ {
+ }
+ catch(InterruptedException ie)
+ {
+ }
+ }
+ }
+
+ public OSTask[] getOSTasks(Install installer)
+ {
+ return new OSTask[] { /* new JEditLauncherOSTask(installer) */ };
+ }
+ }
+
+ public static class HalfAnOS extends OperatingSystem
+ {
+ public String getInstallDirectory(String name, String version)
+ {
+ return "C:\\" + name + " " + version;
+ }
+ }
+
+ public static class VMS extends OperatingSystem
+ {
+ public String getInstallDirectory(String name, String version)
+ {
+ return "./" + name.toLowerCase() + "/" + version;
+ }
+ }
+
+ // private members
+ private static OperatingSystem os;
+}
diff --git a/jEdit/installer/Progress.java b/jEdit/installer/Progress.java
index 309dedd..f551281 100644
--- a/jEdit/installer/Progress.java
+++ b/jEdit/installer/Progress.java
@@ -1,30 +1,30 @@
-/*
- * Progress.java
- *
- * Originally written by Slava Pestov for the jEdit installer project. This work
- * has been placed into the public domain. You may use this work in any way and
- * for any purpose you wish.
- *
- * THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, NOT EVEN THE
- * IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE, ASSUMES
- * _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE RESULTING FROM THE USE, MODIFICATION,
- * OR REDISTRIBUTION OF THIS SOFTWARE.
- */
-
-package installer;
-
-/*
- * An interface for reporting installation progress. ConsoleProgress and
- * SwingProcess are the two existing implementations.
- */
-public interface Progress
-{
- public void setMaximum(int max);
-
- public void advance(int value);
-
- public void done();
-
- public void message(String message);
- public void error(String message);
-}
+/*
+ * Progress.java
+ *
+ * Originally written by Slava Pestov for the jEdit installer project. This work
+ * has been placed into the public domain. You may use this work in any way and
+ * for any purpose you wish.
+ *
+ * THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, NOT EVEN THE
+ * IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE, ASSUMES
+ * _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE RESULTING FROM THE USE, MODIFICATION,
+ * OR REDISTRIBUTION OF THIS SOFTWARE.
+ */
+
+package installer;
+
+/*
+ * An interface for reporting installation progress. ConsoleProgress and
+ * SwingProcess are the two existing implementations.
+ */
+public interface Progress
+{
+ public void setMaximum(int max);
+
+ public void advance(int value);
+
+ public void done();
+
+ public void message(String message);
+ public void error(String message);
+}
diff --git a/jEdit/installer/ServerKiller.java b/jEdit/installer/ServerKiller.java
index a53194d..7768908 100644
--- a/jEdit/installer/ServerKiller.java
+++ b/jEdit/installer/ServerKiller.java
@@ -1,133 +1,133 @@
-/*
- * ServerKiller.java - Utility class for the installer
- * :tabSize=8:indentSize=8:noTabs=false:
- * :folding=explicit:collapseFolds=1:
- *
- * Copyright (C) 2009 Eric Le Lay
- *
- * this code is freely adapted from org/gjt/sp/jedit/jEdit.java
- * Copyright (C) 1998, 2005 Slava Pestov
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-package installer;
-
-import java.io.*;
-import java.net.*;
-
-/**
- * Utility class to check for a running jEdit server,
- * and stop it.
- * Useful on windows platform, where the jedit.jar archive
- * is locked and can't be overwritten by the installer.
- *
- * NB: The server file must be in the standard location (i.e. $HOME/.jedit/server)
- * for the server to be found.
- * @version $Id$
- */
-public class ServerKiller
-{
-
- /**
- * try to contact a running instance of jEdit Server
- * and ask it to close.
- * @return true either if no server was detected, or the server was shut-down,
- * false otherwise
- */
- public static boolean quitjEditServer()
- {
-
- /* {{{ default server file location */
- String settingsDirectory = System.getProperty("user.home");
- File portFile;
- File f = new File(settingsDirectory);
- portFile = new File(f,".jedit/server");
- /* }}} */
-
- if(portFile.exists())
- {
- try
- {
- BufferedReader in = new BufferedReader(new FileReader(portFile));
- String check = in.readLine();
- if(!check.equals("b"))
- {
- System.out.println("Wrong port file format");
- return false;
- }
-
- int port = Integer.parseInt(in.readLine());
- int key = Integer.parseInt(in.readLine());
-
- Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),port);
- DataOutputStream out = new DataOutputStream(
- socket.getOutputStream());
- out.writeInt(key);
-
- // we can't close the socket cleanly, because we want
- // to wait for complete exit, and then it's too late.
- // so the socket is closed when the JVM is shut down.
- String script;
- script = "jEdit.exit(null,true);\n";
-
- out.writeUTF(script);
-
- // block until its closed
- try
- {
- socket.getInputStream().read();
- }
- catch(Exception e)
- {
- //should get an exception !
- }
-
- in.close();
- out.close();
- }
- catch(FileNotFoundException fnfe)
- {
- //it exists : we checked that earlier !
- }
- catch(UnknownHostException uhe)
- {
- //localhost doesn't exist ?
- }
- catch(IOException ioe)
- {
- System.out.println("Exception while trying to connect to existing server:");
- System.out.println(ioe);
- System.out.println("Don't worry too much !");
- return false; //warn the user
- }
- }
- return true;
- }
-
- /**
- * try to connect to any running server instance and close it.
- * exit with an error code on failure, but not if no server was found.
- */
- public static void main(String[] args)
- {
- boolean success = quitjEditServer();
- if(!success)
- {
- System.exit(-1);
- }
- }
-}
-
-
+/*
+ * ServerKiller.java - Utility class for the installer
+ * :tabSize=8:indentSize=8:noTabs=false:
+ * :folding=explicit:collapseFolds=1:
+ *
+ * Copyright (C) 2009 Eric Le Lay
+ *
+ * this code is freely adapted from org/gjt/sp/jedit/jEdit.java
+ * Copyright (C) 1998, 2005 Slava Pestov
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+package installer;
+
+import java.io.*;
+import java.net.*;
+
+/**
+ * Utility class to check for a running jEdit server,
+ * and stop it.
+ * Useful on windows platform, where the jedit.jar archive
+ * is locked and can't be overwritten by the installer.
+ *
+ * NB: The server file must be in the standard location (i.e. $HOME/.jedit/server)
+ * for the server to be found.
+ * @version $Id$
+ */
+public class ServerKiller
+{
+
+ /**
+ * try to contact a running instance of jEdit Server
+ * and ask it to close.
+ * @return true either if no server was detected, or the server was shut-down,
+ * false otherwise
+ */
+ public static boolean quitjEditServer()
+ {
+
+ /* {{{ default server file location */
+ String settingsDirectory = System.getProperty("user.home");
+ File portFile;
+ File f = new File(settingsDirectory);
+ portFile = new File(f,".jedit/server");
+ /* }}} */
+
+ if(portFile.exists())
+ {
+ try
+ {
+ BufferedReader in = new BufferedReader(new FileReader(portFile));
+ String check = in.readLine();
+ if(!check.equals("b"))
+ {
+ System.out.println("Wrong port file format");
+ return false;
+ }
+
+ int port = Integer.parseInt(in.readLine());
+ int key = Integer.parseInt(in.readLine());
+
+ Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),port);
+ DataOutputStream out = new DataOutputStream(
+ socket.getOutputStream());
+ out.writeInt(key);
+
+ // we can't close the socket cleanly, because we want
+ // to wait for complete exit, and then it's too late.
+ // so the socket is closed when the JVM is shut down.
+ String script;
+ script = "jEdit.exit(null,true);\n";
+
+ out.writeUTF(script);
+
+ // block until its closed
+ try
+ {
+ socket.getInputStream().read();
+ }
+ catch(Exception e)
+ {
+ //should get an exception !
+ }
+
+ in.close();
+ out.close();
+ }
+ catch(FileNotFoundException fnfe)
+ {
+ //it exists : we checked that earlier !
+ }
+ catch(UnknownHostException uhe)
+ {
+ //localhost doesn't exist ?
+ }
+ catch(IOException ioe)
+ {
+ System.out.println("Exception while trying to connect to existing server:");
+ System.out.println(ioe);
+ System.out.println("Don't worry too much !");
+ return false; //warn the user
+ }
+ }
+ return true;
+ }
+
+ /**
+ * try to connect to any running server instance and close it.
+ * exit with an error code on failure, but not if no server was found.
+ */
+ public static void main(String[] args)
+ {
+ boolean success = quitjEditServer();
+ if(!success)
+ {
+ System.exit(-1);
+ }
+ }
+}
+
+
diff --git a/jEdit/installer/SwingInstall.java b/jEdit/installer/SwingInstall.java
index a24747b..fdf88e9 100644
--- a/jEdit/installer/SwingInstall.java
+++ b/jEdit/installer/SwingInstall.java
@@ -1,784 +1,784 @@
-/*
- * SwingInstall.java
- *
- * Originally written by Slava Pestov for the jEdit installer project. This work
- * has been placed into the public domain. You may use this work in any way and
- * for any purpose you wish.
- *
- * THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, NOT EVEN THE
- * IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE, ASSUMES
- * _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE RESULTING FROM THE USE, MODIFICATION,
- * OR REDISTRIBUTION OF THIS SOFTWARE.
- */
-
-package installer;
-
-import javax.swing.border.*;
-import javax.swing.*;
-import javax.swing.text.JTextComponent;
-import java.awt.event.*;
-import java.awt.*;
-import java.io.File;
-import java.io.IOException;
-import java.util.*;
-
-/*
- * Graphical front-end to installer.
- */
-public class SwingInstall extends JFrame
-{
- public SwingInstall()
- {
- installer = new Install();
- osTasks = OperatingSystem.getOperatingSystem().getOSTasks(installer);
-
- appName = installer.getProperty("app.name");
- appVersion = installer.getProperty("app.version");
-
- setTitle(appName + " " + appVersion + " installer");
-
- JPanel content = new JPanel(new WizardLayout());
- setContentPane(content);
-
- caption = new JLabel();
- caption.setFont(new Font("SansSerif",Font.BOLD,18));
-
- ActionHandler actionHandler = new ActionHandler();
-
- cancelButton = new JButton("Cancel");
- cancelButton.setRequestFocusEnabled(false);
- cancelButton.addActionListener(actionHandler);
- prevButton = new JButton("Previous");
- prevButton.setRequestFocusEnabled(false);
- prevButton.addActionListener(actionHandler);
- nextButton = new JButton();
- nextButton.setRequestFocusEnabled(false);
- nextButton.addActionListener(actionHandler);
-
- content.add(caption);
- content.add(cancelButton);
- content.add(prevButton);
- content.add(nextButton);
-
- String clazz = OperatingSystem.getOperatingSystem()
- .getClass().getName();
- String completedInfo = "done-" + clazz.substring(
- clazz.indexOf('$') + 1) + ".html";
-
- pages = new Component[] {
- new TextPanel(installer.getProperty("app.readme")),
- new TextPanel(installer.getProperty("app.license")),
- chooseDirectory = new ChooseDirectory(),
- selectComponents = new SelectComponents(),
- progress = new SwingProgress(),
- new TextPanel(completedInfo)
- };
-
- for(int i = 0; i < pages.length; i++)
- content.add(pages[i]);
-
- pageChanged();
-
- setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
- addWindowListener(new WindowHandler());
-
- Dimension screen = getToolkit().getScreenSize();
- pack();
- setLocation((screen.width - getSize().width) / 2,
- (screen.height - getSize().height) / 2);
- setVisible(true);
- }
-
- // package-private members
- // package-private, not private, for speedy access by inner classes
- Install installer;
- OperatingSystem.OSTask[] osTasks;
- String appName;
- String appVersion;
-
- JLabel caption;
-
- ChooseDirectory chooseDirectory;
- SelectComponents selectComponents;
- SwingProgress progress;
-
- JButton cancelButton;
- JButton prevButton;
- JButton nextButton;
- Component[] pages;
- int currentPage;
-
- private static final int PADDING = 12;
-
- void install()
- {
- Vector components = new Vector();
- int size = 0;
-
- JPanel comp = selectComponents.comp;
- Vector ids = selectComponents.filesets;
-
- for(int i = 0; i < comp.getComponentCount(); i++)
- {
- if(((JCheckBox)comp.getComponent(i))
- .getModel().isSelected())
- {
- size += installer.getIntegerProperty(
- "comp." + ids.elementAt(i) + ".real-size");
- components.addElement(installer.getProperty(
- "comp." + ids.elementAt(i) + ".fileset"));
- }
- }
-
- String installDir = chooseDirectory.installDir.getText();
-
- Map osTaskDirs = chooseDirectory.osTaskDirs;
- Iterator keys = osTaskDirs.keySet().iterator();
- while(keys.hasNext())
- {
- OperatingSystem.OSTask osTask = (OperatingSystem.OSTask)keys.next();
- String dir = ((JTextField)osTaskDirs.get(osTask)).getText();
- if(dir != null && dir.trim().length() != 0)
- {
- osTask.setEnabled(true);
- osTask.setDirectory(dir);
- }
- else
- osTask.setEnabled(false);
- }
-
- InstallThread thread = new InstallThread(
- installer,progress,
- installDir,osTasks,
- size,components);
- progress.setThread(thread);
- thread.start();
- }
-
- private void pageChanged()
- {
- switch(currentPage)
- {
- case 0:
- caption.setText("Installing " + appName);
-
- nextButton.setText("Next");
- prevButton.setEnabled(false);
- nextButton.setEnabled(true);
- break;
- case 1:
- caption.setText(installer.getProperty("app.license.title"));
-
- nextButton.setText("Next");
- prevButton.setEnabled(true);
- nextButton.setEnabled(true);
- break;
- case 2:
- caption.setText("Specify where " + appName
- + " is to be installed");
-
- nextButton.setText("Next");
- prevButton.setEnabled(true);
- if(!chooseDirectory.isOK())nextButton.setEnabled(false);
- break;
- case 3:
- caption.setText("Choose components to install");
-
- nextButton.setText("Install");
- prevButton.setEnabled(true);
- nextButton.setEnabled(true);
- break;
- case 4:
- caption.setText("Installing " + appName);
-
- nextButton.setText("Finish");
- prevButton.setEnabled(false);
- nextButton.setEnabled(false);
- install();
- break;
- case 5:
- caption.setText("Installation complete");
-
- nextButton.setText("Finish");
- prevButton.setEnabled(false);
- nextButton.setEnabled(true);
- cancelButton.setEnabled(false);
- break;
- }
-
- getRootPane().invalidate();
- getRootPane().validate();
- }
-
- class ActionHandler implements ActionListener
- {
- public void actionPerformed(ActionEvent evt)
- {
- Object source = evt.getSource();
- if(source == cancelButton)
- System.exit(0);
- else if(source == prevButton)
- {
- currentPage--;
- pageChanged();
- }
- else if(source == nextButton)
- {
- if(currentPage == pages.length - 1)
- System.exit(0);
- else
- {
- currentPage++;
- pageChanged();
- }
- }
- }
- }
-
- class WindowHandler extends WindowAdapter
- {
- public void windowClosing(WindowEvent evt)
- {
- System.exit(0);
- }
- }
-
- class WizardLayout implements LayoutManager
- {
- public void addLayoutComponent(String name, Component comp)
- {
- }
-
- public void removeLayoutComponent(Component comp)
- {
- }
-
- public Dimension preferredLayoutSize(Container parent)
- {
- Dimension dim = new Dimension();
-
- Dimension captionSize = caption.getPreferredSize();
- dim.width = captionSize.width;
-
- for(int i = 0; i < pages.length; i++)
- {
- Dimension _dim = pages[i].getPreferredSize();
- dim.width = Math.max(_dim.width,dim.width);
- dim.height = Math.max(_dim.height,dim.height);
- }
-
- dim.width += PADDING * 2;
- dim.height += PADDING * 2;
- dim.height += nextButton.getPreferredSize().height;
- dim.height += captionSize.height;
- return dim;
- }
-
- public Dimension minimumLayoutSize(Container parent)
- {
- return preferredLayoutSize(parent);
- }
-
- public void layoutContainer(Container parent)
- {
- Dimension size = parent.getSize();
-
- Dimension captionSize = caption.getPreferredSize();
- caption.setBounds(PADDING,PADDING,captionSize.width,
- captionSize.height);
-
- // make all buttons the same size
- Dimension buttonSize = cancelButton.getPreferredSize();
- buttonSize.width = Math.max(buttonSize.width,prevButton.getPreferredSize().width);
- buttonSize.width = Math.max(buttonSize.width,nextButton.getPreferredSize().width);
-
- // cancel button goes on far left
- cancelButton.setBounds(
- PADDING,
- size.height - buttonSize.height - PADDING,
- buttonSize.width,
- buttonSize.height);
-
- // prev and next buttons are on the right
- prevButton.setBounds(
- size.width - buttonSize.width * 2 - 6 - PADDING,
- size.height - buttonSize.height - PADDING,
- buttonSize.width,
- buttonSize.height);
-
- nextButton.setBounds(
- size.width - buttonSize.width - PADDING,
- size.height - buttonSize.height - PADDING,
- buttonSize.width,
- buttonSize.height);
-
- // calculate size for current page
- Rectangle currentPageBounds = new Rectangle();
- currentPageBounds.x = PADDING;
- currentPageBounds.y = PADDING * 2 + captionSize.height;
- currentPageBounds.width = size.width - currentPageBounds.x
- - PADDING;
- currentPageBounds.height = size.height - buttonSize.height
- - currentPageBounds.y - PADDING * 2;
-
- for(int i = 0; i < pages.length; i++)
- {
- Component page = pages[i];
- page.setBounds(currentPageBounds);
- page.setVisible(i == currentPage);
- }
- }
- }
-
- class TextPanel extends JPanel
- {
- TextPanel(String file)
- {
- super(new BorderLayout());
-
- JEditorPane text = new JEditorPane();
-
- try
- {
- text.setPage(TextPanel.this.getClass().getResource(file));
- }
- catch(Exception e)
- {
- text.setText("Error loading '" + file + "'");
- e.printStackTrace();
- }
-
- text.setEditable(false);
-
- JScrollPane scrollPane = new JScrollPane(text);
- Dimension dim = new Dimension();
- dim.width = 450;
- dim.height = 200;
- scrollPane.setPreferredSize(dim);
- TextPanel.this.add(BorderLayout.CENTER,scrollPane);
- }
- }
-
- class DirVerifier extends InputVerifier
- {
- private JTextComponent message;
- private Object pos;
- private JComponent parent;
-
- public DirVerifier(JComponent parent, Object pos)
- {
- super();
- message = new JTextArea(" ");
- message.setEditable(false);
- message.setBackground(parent.getBackground());
- this.parent = parent;
- this.pos = pos;
- }
-
- public boolean shouldYieldFocus(JComponent input)
- {
- return verify(input);
- }
-
- public boolean verify(JComponent input)
- {
- if(input instanceof JTextComponent)
- {
- String dir = ((JTextComponent)input).getText();
- if(checkNull(dir) &&
- checkExistNotDirectory(dir) &&
- checkExistNotEmpty(dir) &&
- checkRelative(dir))
- {
- //everything is perfect, clean label
- if(message.getParent()!=null)
- {
- SwingUtilities.invokeLater(new Runnable()
- {
- public void run()
- {
- parent.remove(message);
- parent.revalidate();
- parent.repaint();
- }
- });
- }
- }
- else
- {
- if(message.getParent()==null)
- {
- SwingUtilities.invokeLater(new Runnable()
- {
- public void run()
- {
- parent.add(message,pos);
- parent.revalidate();
- parent.repaint();
- }
- });
- }
- else message.repaint();
- }
- }
- return true;
- }
-
- private boolean checkNull(String file)
- {
- if(file.trim().length()==0)
- {
- message.setForeground(Color.red);
- message.setText(installer.getProperty("dir.null"));
- return false;
- }
- else return true;
- }
-
- private boolean checkRelative(String dir)
- {
- File f = new File(dir);
- if(!f.isAbsolute())
- {
- String msg = installer.getProperty("dir.relative");
- try
- {
- String full = f.getCanonicalPath();
- message.setForeground(Color.orange);
- message.setText(msg+'\n'+full);
- }
- catch(IOException ioe)
- {
- message.setForeground(Color.red);
- msg = installer.getProperty("dir.cant-resolve");
- message.setText(msg);
- }
- return false;
- }
- else return true;
- }
-
- private boolean checkExistNotDirectory(String dir)
- {
- File f = new File(dir);
- if(f.exists() && !f.isDirectory())
- {
- message.setForeground(Color.red);
- message.setText(installer.getProperty("dir.not-directory"));
- return false;
- }
- else return true;
- }
-
- private boolean checkExistNotEmpty(String dir)
- {
- File f = new File(dir);
- String[]cnt = f.list();
- if(cnt!=null && cnt.length>0)
- {
- message.setForeground(Color.orange);
- message.setText(installer.getProperty("dir.not-empty"));
- return false;
- }
- else return true;
- }
- }
- /**
- * only install directory is required, as it's necessary to scripts, etc.
- * If one uses the installer only for OS tasks, then one deselects all components
- * and that's all.
- */
- class ChooseDirectory extends JPanel
- {
- JTextField installDir;
- Map osTaskDirs;
-
- ChooseDirectory()
- {
- super(new BorderLayout());
- osTaskDirs = new HashMap();
-
-
- JPanel directoryPanel = new JPanel(new GridBagLayout());
-
- installDir = addField(directoryPanel,"Install program in:",
- OperatingSystem.getOperatingSystem()
- .getInstallDirectory(appName,appVersion));
-
- installDir.addFocusListener(new FocusAdapter()
- {
- public void focusLost(FocusEvent fe)
- {
- nextButton.setEnabled(isOK());
- }
- });
- for(int i = 0; i < osTasks.length; i++)
- {
- OperatingSystem.OSTask osTask = osTasks[i];
- String label = osTask.getLabel();
- if(label != null)
- {
- JTextField field = addField(directoryPanel,label,
- osTask.getDirectory());
- osTaskDirs.put(osTask,field);
- }
- }
- ChooseDirectory.this.add(BorderLayout.NORTH,directoryPanel);
- }
-
- boolean isOK()
- {
- if(installDir.getText().length()==0)return false;
- File f = new File(installDir.getText());
- return !(f.exists()&&!f.isDirectory());
- }
-
- private GridBagConstraints c = new GridBagConstraints();
- private JTextField addField(JPanel directoryPanel, String label,
- String defaultText)
- {
-
- //new line
- c.gridy++;
-
- //message
- JTextField field = new JTextField(defaultText);
- c.insets.bottom=3;
- c.gridx=0;
- c.gridwidth=3;
- c.insets.left=0;
- c.insets.right=0;
- c.anchor=GridBagConstraints.LINE_START;
- DirVerifier verif = new DirVerifier(directoryPanel,c.clone());
-
-
- field.setInputVerifier(verif);
-
- c.insets.bottom=12;
- c.gridx=0;
- c.gridy++;
- c.gridwidth=1;
- c.anchor=GridBagConstraints.LINE_END;
- directoryPanel.add(new JLabel(label,SwingConstants.RIGHT),c);
-
- c.gridx=1;
- c.fill=GridBagConstraints.HORIZONTAL;
- c.anchor=GridBagConstraints.CENTER;
- c.insets.left=12;
- c.insets.right=12;
- c.weightx=1.0;
- directoryPanel.add(field,c);
-
-
- JButton choose = new JButton("Choose...");
- choose.setRequestFocusEnabled(false);
- choose.addActionListener(new ActionHandler(field));
- c.gridx=2;
- c.insets.left=0;
- c.insets.right=0;
- c.fill=GridBagConstraints.NONE;
- c.weightx=0;
- directoryPanel.add(choose,c);
-
- return field;
- }
-
- class ActionHandler implements ActionListener
- {
- JTextField field;
-
- ActionHandler(JTextField field)
- {
- this.field = field;
- }
-
- public void actionPerformed(ActionEvent evt)
- {
- File directory = new File(field.getText());
- JFileChooser chooser = new JFileChooser(directory.getParent());
- chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
- chooser.setSelectedFile(directory);
-
- if(chooser.showOpenDialog(SwingInstall.this)
- == JFileChooser.APPROVE_OPTION)
- {
- field.setText(chooser.getSelectedFile().getPath());
- field.getInputVerifier().verify(field);
- }
- }
- }
- }
-
- class SelectComponents extends JPanel
- implements ActionListener
- {
- JPanel comp;
- JLabel sizeLabel;
- Vector filesets;
-
- SelectComponents()
- {
- super(new BorderLayout());
-
- comp = createCompPanel();
- SelectComponents.this.add(BorderLayout.NORTH,comp);
-
- sizeLabel = new JLabel("",SwingConstants.LEFT);
- SelectComponents.this.add(BorderLayout.SOUTH,sizeLabel);
-
- updateSize();
- }
-
- public void actionPerformed(ActionEvent evt)
- {
- updateSize();
- }
-
- private JPanel createCompPanel()
- {
- filesets = new Vector();
-
- int count = installer.getIntegerProperty("comp.count");
- JPanel panel = new JPanel(new GridLayout(count,1));
-
- String osClass = OperatingSystem.getOperatingSystem()
- .getClass().getName();
- osClass = osClass.substring(osClass.indexOf('$') + 1);
-
- for(int i = 0; i < count; i++)
- {
- String os = installer.getProperty("comp." + i + ".os");
-
- if(os != null && !osClass.equals(os))
- continue;
-
- JCheckBox checkBox = new JCheckBox(
- installer.getProperty("comp." + i + ".name")
- + " (" + installer.getProperty("comp." + i
- + ".disk-size") + "Kb)");
- checkBox.getModel().setSelected(true);
- checkBox.addActionListener(this);
- checkBox.setRequestFocusEnabled(false);
-
- filesets.addElement(new Integer(i));
-
- panel.add(checkBox);
- }
-
- Dimension dim = panel.getPreferredSize();
- dim.width = Integer.MAX_VALUE;
- panel.setMaximumSize(dim);
-
- return panel;
- }
-
- private void updateSize()
- {
- int size = 0;
-
- for(int i = 0; i < filesets.size(); i++)
- {
- if(((JCheckBox)comp.getComponent(i))
- .getModel().isSelected())
- {
- size += installer.getIntegerProperty("comp."
- + filesets.elementAt(i)
- + ".disk-size");
- }
- }
-
- sizeLabel.setText("Estimated disk usage of selected"
- + " components: " + size + "Kb");
- }
- }
-
- class SwingProgress extends JPanel implements Progress
- {
- JProgressBar progress;
- InstallThread thread;
-
- SwingProgress()
- {
- super(new BorderLayout());
-
- progress = new JProgressBar();
- progress.setStringPainted(true);
-
- SwingProgress.this.add(BorderLayout.NORTH,progress);
- }
-
- public void setMaximum(final int max)
- {
- SwingUtilities.invokeLater(new Runnable()
- {
- public void run()
- {
- progress.setMaximum(max);
- }
- });
- }
-
- public void advance(final int value)
- {
- try
- {
- SwingUtilities.invokeAndWait(new Runnable()
- {
- public void run()
- {
- progress.setValue(progress
- .getValue() + value);
- }
- });
- Thread.yield();
- }
- catch(Exception e)
- {
- }
- }
-
- public void done()
- {
- SwingUtilities.invokeLater(new Runnable()
- {
- public void run()
- {
- currentPage++;
- pageChanged();
- }
- });
- }
-
- public void error(final String message)
- {
- SwingUtilities.invokeLater(new Runnable()
- {
- public void run()
- {
- dispose();
- JOptionPane.showMessageDialog(null,
- message,
- "Installation aborted",
- JOptionPane.ERROR_MESSAGE);
- System.exit(1);
- }
- });
- }
-
- public void message(final String message)
- {
- SwingUtilities.invokeLater(new Runnable()
- {
- public void run()
- {
- progress.setString(message);
- }
- });
- }
-
- public void setThread(InstallThread thread)
- {
- this.thread = thread;
- }
- }
-}
+/*
+ * SwingInstall.java
+ *
+ * Originally written by Slava Pestov for the jEdit installer project. This work
+ * has been placed into the public domain. You may use this work in any way and
+ * for any purpose you wish.
+ *
+ * THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, NOT EVEN THE
+ * IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE, ASSUMES
+ * _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE RESULTING FROM THE USE, MODIFICATION,
+ * OR REDISTRIBUTION OF THIS SOFTWARE.
+ */
+
+package installer;
+
+import javax.swing.border.*;
+import javax.swing.*;
+import javax.swing.text.JTextComponent;
+import java.awt.event.*;
+import java.awt.*;
+import java.io.File;
+import java.io.IOException;
+import java.util.*;
+
+/*
+ * Graphical front-end to installer.
+ */
+public class SwingInstall extends JFrame
+{
+ public SwingInstall()
+ {
+ installer = new Install();
+ osTasks = OperatingSystem.getOperatingSystem().getOSTasks(installer);
+
+ appName = installer.getProperty("app.name");
+ appVersion = installer.getProperty("app.version");
+
+ setTitle(appName + " " + appVersion + " installer");
+
+ JPanel content = new JPanel(new WizardLayout());
+ setContentPane(content);
+
+ caption = new JLabel();
+ caption.setFont(new Font("SansSerif",Font.BOLD,18));
+
+ ActionHandler actionHandler = new ActionHandler();
+
+ cancelButton = new JButton("Cancel");
+ cancelButton.setRequestFocusEnabled(false);
+ cancelButton.addActionListener(actionHandler);
+ prevButton = new JButton("Previous");
+ prevButton.setRequestFocusEnabled(false);
+ prevButton.addActionListener(actionHandler);
+ nextButton = new JButton();
+ nextButton.setRequestFocusEnabled(false);
+ nextButton.addActionListener(actionHandler);
+
+ content.add(caption);
+ content.add(cancelButton);
+ content.add(prevButton);
+ content.add(nextButton);
+
+ String clazz = OperatingSystem.getOperatingSystem()
+ .getClass().getName();
+ String completedInfo = "done-" + clazz.substring(
+ clazz.indexOf('$') + 1) + ".html";
+
+ pages = new Component[] {
+ new TextPanel(installer.getProperty("app.readme")),
+ new TextPanel(installer.getProperty("app.license")),
+ chooseDirectory = new ChooseDirectory(),
+ selectComponents = new SelectComponents(),
+ progress = new SwingProgress(),
+ new TextPanel(completedInfo)
+ };
+
+ for(int i = 0; i < pages.length; i++)
+ content.add(pages[i]);
+
+ pageChanged();
+
+ setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
+ addWindowListener(new WindowHandler());
+
+ Dimension screen = getToolkit().getScreenSize();
+ pack();
+ setLocation((screen.width - getSize().width) / 2,
+ (screen.height - getSize().height) / 2);
+ setVisible(true);
+ }
+
+ // package-private members
+ // package-private, not private, for speedy access by inner classes
+ Install installer;
+ OperatingSystem.OSTask[] osTasks;
+ String appName;
+ String appVersion;
+
+ JLabel caption;
+
+ ChooseDirectory chooseDirectory;
+ SelectComponents selectComponents;
+ SwingProgress progress;
+
+ JButton cancelButton;
+ JButton prevButton;
+ JButton nextButton;
+ Component[] pages;
+ int currentPage;
+
+ private static final int PADDING = 12;
+
+ void install()
+ {
+ Vector components = new Vector();
+ int size = 0;
+
+ JPanel comp = selectComponents.comp;
+ Vector ids = selectComponents.filesets;
+
+ for(int i = 0; i < comp.getComponentCount(); i++)
+ {
+ if(((JCheckBox)comp.getComponent(i))
+ .getModel().isSelected())
+ {
+ size += installer.getIntegerProperty(
+ "comp." + ids.elementAt(i) + ".real-size");
+ components.addElement(installer.getProperty(
+ "comp." + ids.elementAt(i) + ".fileset"));
+ }
+ }
+
+ String installDir = chooseDirectory.installDir.getText();
+
+ Map osTaskDirs = chooseDirectory.osTaskDirs;
+ Iterator keys = osTaskDirs.keySet().iterator();
+ while(keys.hasNext())
+ {
+ OperatingSystem.OSTask osTask = (OperatingSystem.OSTask)keys.next();
+ String dir = ((JTextField)osTaskDirs.get(osTask)).getText();
+ if(dir != null && dir.trim().length() != 0)
+ {
+ osTask.setEnabled(true);
+ osTask.setDirectory(dir);
+ }
+ else
+ osTask.setEnabled(false);
+ }
+
+ InstallThread thread = new InstallThread(
+ installer,progress,
+ installDir,osTasks,
+ size,components);
+ progress.setThread(thread);
+ thread.start();
+ }
+
+ private void pageChanged()
+ {
+ switch(currentPage)
+ {
+ case 0:
+ caption.setText("Installing " + appName);
+
+ nextButton.setText("Next");
+ prevButton.setEnabled(false);
+ nextButton.setEnabled(true);
+ break;
+ case 1:
+ caption.setText(installer.getProperty("app.license.title"));
+
+ nextButton.setText("Next");
+ prevButton.setEnabled(true);
+ nextButton.setEnabled(true);
+ break;
+ case 2:
+ caption.setText("Specify where " + appName
+ + " is to be installed");
+
+ nextButton.setText("Next");
+ prevButton.setEnabled(true);
+ if(!chooseDirectory.isOK())nextButton.setEnabled(false);
+ break;
+ case 3:
+ caption.setText("Choose components to install");
+
+ nextButton.setText("Install");
+ prevButton.setEnabled(true);
+ nextButton.setEnabled(true);
+ break;
+ case 4:
+ caption.setText("Installing " + appName);
+
+ nextButton.setText("Finish");
+ prevButton.setEnabled(false);
+ nextButton.setEnabled(false);
+ install();
+ break;
+ case 5:
+ caption.setText("Installation complete");
+
+ nextButton.setText("Finish");
+ prevButton.setEnabled(false);
+ nextButton.setEnabled(true);
+ cancelButton.setEnabled(false);
+ break;
+ }
+
+ getRootPane().invalidate();
+ getRootPane().validate();
+ }
+
+ class ActionHandler implements ActionListener
+ {
+ public void actionPerformed(ActionEvent evt)
+ {
+ Object source = evt.getSource();
+ if(source == cancelButton)
+ System.exit(0);
+ else if(source == prevButton)
+ {
+ currentPage--;
+ pageChanged();
+ }
+ else if(source == nextButton)
+ {
+ if(currentPage == pages.length - 1)
+ System.exit(0);
+ else
+ {
+ currentPage++;
+ pageChanged();
+ }
+ }
+ }
+ }
+
+ class WindowHandler extends WindowAdapter
+ {
+ public void windowClosing(WindowEvent evt)
+ {
+ System.exit(0);
+ }
+ }
+
+ class WizardLayout implements LayoutManager
+ {
+ public void addLayoutComponent(String name, Component comp)
+ {
+ }
+
+ public void removeLayoutComponent(Component comp)
+ {
+ }
+
+ public Dimension preferredLayoutSize(Container parent)
+ {
+ Dimension dim = new Dimension();
+
+ Dimension captionSize = caption.getPreferredSize();
+ dim.width = captionSize.width;
+
+ for(int i = 0; i < pages.length; i++)
+ {
+ Dimension _dim = pages[i].getPreferredSize();
+ dim.width = Math.max(_dim.width,dim.width);
+ dim.height = Math.max(_dim.height,dim.height);
+ }
+
+ dim.width += PADDING * 2;
+ dim.height += PADDING * 2;
+ dim.height += nextButton.getPreferredSize().height;
+ dim.height += captionSize.height;
+ return dim;
+ }
+
+ public Dimension minimumLayoutSize(Container parent)
+ {
+ return preferredLayoutSize(parent);
+ }
+
+ public void layoutContainer(Container parent)
+ {
+ Dimension size = parent.getSize();
+
+ Dimension captionSize = caption.getPreferredSize();
+ caption.setBounds(PADDING,PADDING,captionSize.width,
+ captionSize.height);
+
+ // make all buttons the same size
+ Dimension buttonSize = cancelButton.getPreferredSize();
+ buttonSize.width = Math.max(buttonSize.width,prevButton.getPreferredSize().width);
+ buttonSize.width = Math.max(buttonSize.width,nextButton.getPreferredSize().width);
+
+ // cancel button goes on far left
+ cancelButton.setBounds(
+ PADDING,
+ size.height - buttonSize.height - PADDING,
+ buttonSize.width,
+ buttonSize.height);
+
+ // prev and next buttons are on the right
+ prevButton.setBounds(
+ size.width - buttonSize.width * 2 - 6 - PADDING,
+ size.height - buttonSize.height - PADDING,
+ buttonSize.width,
+ buttonSize.height);
+
+ nextButton.setBounds(
+ size.width - buttonSize.width - PADDING,
+ size.height - buttonSize.height - PADDING,
+ buttonSize.width,
+ buttonSize.height);
+
+ // calculate size for current page
+ Rectangle currentPageBounds = new Rectangle();
+ currentPageBounds.x = PADDING;
+ currentPageBounds.y = PADDING * 2 + captionSize.height;
+ currentPageBounds.width = size.width - currentPageBounds.x
+ - PADDING;
+ currentPageBounds.height = size.height - buttonSize.height
+ - currentPageBounds.y - PADDING * 2;
+
+ for(int i = 0; i < pages.length; i++)
+ {
+ Component page = pages[i];
+ page.setBounds(currentPageBounds);
+ page.setVisible(i == currentPage);
+ }
+ }
+ }
+
+ class TextPanel extends JPanel
+ {
+ TextPanel(String file)
+ {
+ super(new BorderLayout());
+
+ JEditorPane text = new JEditorPane();
+
+ try
+ {
+ text.setPage(TextPanel.this.getClass().getResource(file));
+ }
+ catch(Exception e)
+ {
+ text.setText("Error loading '" + file + "'");
+ e.printStackTrace();
+ }
+
+ text.setEditable(false);
+
+ JScrollPane scrollPane = new JScrollPane(text);
+ Dimension dim = new Dimension();
+ dim.width = 450;
+ dim.height = 200;
+ scrollPane.setPreferredSize(dim);
+ TextPanel.this.add(BorderLayout.CENTER,scrollPane);
+ }
+ }
+
+ class DirVerifier extends InputVerifier
+ {
+ private JTextComponent message;
+ private Object pos;
+ private JComponent parent;
+
+ public DirVerifier(JComponent parent, Object pos)
+ {
+ super();
+ message = new JTextArea(" ");
+ message.setEditable(false);
+ message.setBackground(parent.getBackground());
+ this.parent = parent;
+ this.pos = pos;
+ }
+
+ public boolean shouldYieldFocus(JComponent input)
+ {
+ return verify(input);
+ }
+
+ public boolean verify(JComponent input)
+ {
+ if(input instanceof JTextComponent)
+ {
+ String dir = ((JTextComponent)input).getText();
+ if(checkNull(dir) &&
+ checkExistNotDirectory(dir) &&
+ checkExistNotEmpty(dir) &&
+ checkRelative(dir))
+ {
+ //everything is perfect, clean label
+ if(message.getParent()!=null)
+ {
+ SwingUtilities.invokeLater(new Runnable()
+ {
+ public void run()
+ {
+ parent.remove(message);
+ parent.revalidate();
+ parent.repaint();
+ }
+ });
+ }
+ }
+ else
+ {
+ if(message.getParent()==null)
+ {
+ SwingUtilities.invokeLater(new Runnable()
+ {
+ public void run()
+ {
+ parent.add(message,pos);
+ parent.revalidate();
+ parent.repaint();
+ }
+ });
+ }
+ else message.repaint();
+ }
+ }
+ return true;
+ }
+
+ private boolean checkNull(String file)
+ {
+ if(file.trim().length()==0)
+ {
+ message.setForeground(Color.red);
+ message.setText(installer.getProperty("dir.null"));
+ return false;
+ }
+ else return true;
+ }
+
+ private boolean checkRelative(String dir)
+ {
+ File f = new File(dir);
+ if(!f.isAbsolute())
+ {
+ String msg = installer.getProperty("dir.relative");
+ try
+ {
+ String full = f.getCanonicalPath();
+ message.setForeground(Color.orange);
+ message.setText(msg+'\n'+full);
+ }
+ catch(IOException ioe)
+ {
+ message.setForeground(Color.red);
+ msg = installer.getProperty("dir.cant-resolve");
+ message.setText(msg);
+ }
+ return false;
+ }
+ else return true;
+ }
+
+ private boolean checkExistNotDirectory(String dir)
+ {
+ File f = new File(dir);
+ if(f.exists() && !f.isDirectory())
+ {
+ message.setForeground(Color.red);
+ message.setText(installer.getProperty("dir.not-directory"));
+ return false;
+ }
+ else return true;
+ }
+
+ private boolean checkExistNotEmpty(String dir)
+ {
+ File f = new File(dir);
+ String[]cnt = f.list();
+ if(cnt!=null && cnt.length>0)
+ {
+ message.setForeground(Color.orange);
+ message.setText(installer.getProperty("dir.not-empty"));
+ return false;
+ }
+ else return true;
+ }
+ }
+ /**
+ * only install directory is required, as it's necessary to scripts, etc.
+ * If one uses the installer only for OS tasks, then one deselects all components
+ * and that's all.
+ */
+ class ChooseDirectory extends JPanel
+ {
+ JTextField installDir;
+ Map osTaskDirs;
+
+ ChooseDirectory()
+ {
+ super(new BorderLayout());
+ osTaskDirs = new HashMap();
+
+
+ JPanel directoryPanel = new JPanel(new GridBagLayout());
+
+ installDir = addField(directoryPanel,"Install program in:",
+ OperatingSystem.getOperatingSystem()
+ .getInstallDirectory(appName,appVersion));
+
+ installDir.addFocusListener(new FocusAdapter()
+ {
+ public void focusLost(FocusEvent fe)
+ {
+ nextButton.setEnabled(isOK());
+ }
+ });
+ for(int i = 0; i < osTasks.length; i++)
+ {
+ OperatingSystem.OSTask osTask = osTasks[i];
+ String label = osTask.getLabel();
+ if(label != null)
+ {
+ JTextField field = addField(directoryPanel,label,
+ osTask.getDirectory());
+ osTaskDirs.put(osTask,field);
+ }
+ }
+ ChooseDirectory.this.add(BorderLayout.NORTH,directoryPanel);
+ }
+
+ boolean isOK()
+ {
+ if(installDir.getText().length()==0)return false;
+ File f = new File(installDir.getText());
+ return !(f.exists()&&!f.isDirectory());
+ }
+
+ private GridBagConstraints c = new GridBagConstraints();
+ private JTextField addField(JPanel directoryPanel, String label,
+ String defaultText)
+ {
+
+ //new line
+ c.gridy++;
+
+ //message
+ JTextField field = new JTextField(defaultText);
+ c.insets.bottom=3;
+ c.gridx=0;
+ c.gridwidth=3;
+ c.insets.left=0;
+ c.insets.right=0;
+ c.anchor=GridBagConstraints.LINE_START;
+ DirVerifier verif = new DirVerifier(directoryPanel,c.clone());
+
+
+ field.setInputVerifier(verif);
+
+ c.insets.bottom=12;
+ c.gridx=0;
+ c.gridy++;
+ c.gridwidth=1;
+ c.anchor=GridBagConstraints.LINE_END;
+ directoryPanel.add(new JLabel(label,SwingConstants.RIGHT),c);
+
+ c.gridx=1;
+ c.fill=GridBagConstraints.HORIZONTAL;
+ c.anchor=GridBagConstraints.CENTER;
+ c.insets.left=12;
+ c.insets.right=12;
+ c.weightx=1.0;
+ directoryPanel.add(field,c);
+
+
+ JButton choose = new JButton("Choose...");
+ choose.setRequestFocusEnabled(false);
+ choose.addActionListener(new ActionHandler(field));
+ c.gridx=2;
+ c.insets.left=0;
+ c.insets.right=0;
+ c.fill=GridBagConstraints.NONE;
+ c.weightx=0;
+ directoryPanel.add(choose,c);
+
+ return field;
+ }
+
+ class ActionHandler implements ActionListener
+ {
+ JTextField field;
+
+ ActionHandler(JTextField field)
+ {
+ this.field = field;
+ }
+
+ public void actionPerformed(ActionEvent evt)
+ {
+ File directory = new File(field.getText());
+ JFileChooser chooser = new JFileChooser(directory.getParent());
+ chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
+ chooser.setSelectedFile(directory);
+
+ if(chooser.showOpenDialog(SwingInstall.this)
+ == JFileChooser.APPROVE_OPTION)
+ {
+ field.setText(chooser.getSelectedFile().getPath());
+ field.getInputVerifier().verify(field);
+ }
+ }
+ }
+ }
+
+ class SelectComponents extends JPanel
+ implements ActionListener
+ {
+ JPanel comp;
+ JLabel sizeLabel;
+ Vector filesets;
+
+ SelectComponents()
+ {
+ super(new BorderLayout());
+
+ comp = createCompPanel();
+ SelectComponents.this.add(BorderLayout.NORTH,comp);
+
+ sizeLabel = new JLabel("",SwingConstants.LEFT);
+ SelectComponents.this.add(BorderLayout.SOUTH,sizeLabel);
+
+ updateSize();
+ }
+
+ public void actionPerformed(ActionEvent evt)
+ {
+ updateSize();
+ }
+
+ private JPanel createCompPanel()
+ {
+ filesets = new Vector();
+
+ int count = installer.getIntegerProperty("comp.count");
+ JPanel panel = new JPanel(new GridLayout(count,1));
+
+ String osClass = OperatingSystem.getOperatingSystem()
+ .getClass().getName();
+ osClass = osClass.substring(osClass.indexOf('$') + 1);
+
+ for(int i = 0; i < count; i++)
+ {
+ String os = installer.getProperty("comp." + i + ".os");
+
+ if(os != null && !osClass.equals(os))
+ continue;
+
+ JCheckBox checkBox = new JCheckBox(
+ installer.getProperty("comp." + i + ".name")
+ + " (" + installer.getProperty("comp." + i
+ + ".disk-size") + "Kb)");
+ checkBox.getModel().setSelected(true);
+ checkBox.addActionListener(this);
+ checkBox.setRequestFocusEnabled(false);
+
+ filesets.addElement(new Integer(i));
+
+ panel.add(checkBox);
+ }
+
+ Dimension dim = panel.getPreferredSize();
+ dim.width = Integer.MAX_VALUE;
+ panel.setMaximumSize(dim);
+
+ return panel;
+ }
+
+ private void updateSize()
+ {
+ int size = 0;
+
+ for(int i = 0; i < filesets.size(); i++)
+ {
+ if(((JCheckBox)comp.getComponent(i))
+ .getModel().isSelected())
+ {
+ size += installer.getIntegerProperty("comp."
+ + filesets.elementAt(i)
+ + ".disk-size");
+ }
+ }
+
+ sizeLabel.setText("Estimated disk usage of selected"
+ + " components: " + size + "Kb");
+ }
+ }
+
+ class SwingProgress extends JPanel implements Progress
+ {
+ JProgressBar progress;
+ InstallThread thread;
+
+ SwingProgress()
+ {
+ super(new BorderLayout());
+
+ progress = new JProgressBar();
+ progress.setStringPainted(true);
+
+ SwingProgress.this.add(BorderLayout.NORTH,progress);
+ }
+
+ public void setMaximum(final int max)
+ {
+ SwingUtilities.invokeLater(new Runnable()
+ {
+ public void run()
+ {
+ progress.setMaximum(max);
+ }
+ });
+ }
+
+ public void advance(final int value)
+ {
+ try
+ {
+ SwingUtilities.invokeAndWait(new Runnable()
+ {
+ public void run()
+ {
+ progress.setValue(progress
+ .getValue() + value);
+ }
+ });
+ Thread.yield();
+ }
+ catch(Exception e)
+ {
+ }
+ }
+
+ public void done()
+ {
+ SwingUtilities.invokeLater(new Runnable()
+ {
+ public void run()
+ {
+ currentPage++;
+ pageChanged();
+ }
+ });
+ }
+
+ public void error(final String message)
+ {
+ SwingUtilities.invokeLater(new Runnable()
+ {
+ public void run()
+ {
+ dispose();
+ JOptionPane.showMessageDialog(null,
+ message,
+ "Installation aborted",
+ JOptionPane.ERROR_MESSAGE);
+ System.exit(1);
+ }
+ });
+ }
+
+ public void message(final String message)
+ {
+ SwingUtilities.invokeLater(new Runnable()
+ {
+ public void run()
+ {
+ progress.setString(message);
+ }
+ });
+ }
+
+ public void setThread(InstallThread thread)
+ {
+ this.thread = thread;
+ }
+ }
+}
diff --git a/jEdit/installer/TarBuffer.java b/jEdit/installer/TarBuffer.java
index af96fc0..156802a 100644
--- a/jEdit/installer/TarBuffer.java
+++ b/jEdit/installer/TarBuffer.java
@@ -1,484 +1,484 @@
-/*
-** Authored by Timothy Gerard Endres
-** <mailto:time at gjt.org> <http://www.trustice.com>
-**
-** This work has been placed into the public domain.
-** You may use this work in any way and for any purpose you wish.
-**
-** THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND,
-** NOT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR
-** OF THIS SOFTWARE, ASSUMES _NO_ RESPONSIBILITY FOR ANY
-** CONSEQUENCE RESULTING FROM THE USE, MODIFICATION, OR
-** REDISTRIBUTION OF THIS SOFTWARE.
-**
-*/
-
-package installer;
-
-import java.io.*;
-
-
-/**
- * The TarBuffer class implements the tar archive concept
- * of a buffered input stream. This concept goes back to the
- * days of blocked tape drives and special io devices. In the
- * Java universe, the only real function that this class
- * performs is to ensure that files have the correct "block"
- * size, or other tars will complain.
- * <p>
- * You should never have a need to access this class directly.
- * TarBuffers are created by Tar IO Streams.
- *
- * @version $Revision: 12504 $
- * @author Timothy Gerard Endres,
- * <a href="mailto:time at gjt.org">time at trustice.com</a>.
- * @see TarArchive
- */
-
-public class
-TarBuffer extends Object
- {
- public static final int DEFAULT_RCDSIZE = ( 512 );
- public static final int DEFAULT_BLKSIZE = ( DEFAULT_RCDSIZE * 20 );
-
- private InputStream inStream;
- private OutputStream outStream;
-
- private byte[] blockBuffer;
- private int currBlkIdx;
- private int currRecIdx;
- private int blockSize;
- private int recordSize;
- private int recsPerBlock;
-
- private boolean debug;
-
-
- public
- TarBuffer( InputStream inStream )
- {
- this( inStream, TarBuffer.DEFAULT_BLKSIZE );
- }
-
- public
- TarBuffer( InputStream inStream, int blockSize )
- {
- this( inStream, blockSize, TarBuffer.DEFAULT_RCDSIZE );
- }
-
- public
- TarBuffer( InputStream inStream, int blockSize, int recordSize )
- {
- this.inStream = inStream;
- this.outStream = null;
- this.initialize( blockSize, recordSize );
- }
-
- public
- TarBuffer( OutputStream outStream )
- {
- this( outStream, TarBuffer.DEFAULT_BLKSIZE );
- }
-
- public
- TarBuffer( OutputStream outStream, int blockSize )
- {
- this( outStream, blockSize, TarBuffer.DEFAULT_RCDSIZE );
- }
-
- public
- TarBuffer( OutputStream outStream, int blockSize, int recordSize )
- {
- this.inStream = null;
- this.outStream = outStream;
- this.initialize( blockSize, recordSize );
- }
-
- /**
- * Initialization common to all constructors.
- */
- private void
- initialize( int blockSize, int recordSize )
- {
- this.debug = false;
- this.blockSize = blockSize;
- this.recordSize = recordSize;
- this.recsPerBlock = ( this.blockSize / this.recordSize );
- this.blockBuffer = new byte[ this.blockSize ];
-
- if ( this.inStream != null )
- {
- this.currBlkIdx = -1;
- this.currRecIdx = this.recsPerBlock;
- }
- else
- {
- this.currBlkIdx = 0;
- this.currRecIdx = 0;
- }
- }
-
- /**
- * Get the TAR Buffer's block size. Blocks consist of multiple records.
- */
- public int
- getBlockSize()
- {
- return this.blockSize;
- }
-
- /**
- * Get the TAR Buffer's record size.
- */
- public int
- getRecordSize()
- {
- return this.recordSize;
- }
-
- /**
- * Set the debugging flag for the buffer.
- *
- * @param debug If true, print debugging output.
- */
- public void
- setDebug( boolean debug )
- {
- this.debug = debug;
- }
-
- /**
- * Determine if an archive record indicate End of Archive. End of
- * archive is indicated by a record that consists entirely of null bytes.
- *
- * @param record The record data to check.
- */
- public boolean
- isEOFRecord( byte[] record )
- {
- for ( int i = 0, sz = this.getRecordSize() ; i < sz ; ++i )
- if ( record[i] != 0 )
- return false;
-
- return true;
- }
-
- /**
- * Skip over a record on the input stream.
- */
-
- public void
- skipRecord()
- throws IOException
- {
- if ( this.debug )
- {
- System.err.println
- ( "SkipRecord: recIdx = " + this.currRecIdx
- + " blkIdx = " + this.currBlkIdx );
- }
-
- if ( this.inStream == null )
- throw new IOException
- ( "reading (via skip) from an output buffer" );
-
- if ( this.currRecIdx >= this.recsPerBlock )
- {
- if ( ! this.readBlock() )
- return; // UNDONE
- }
-
- this.currRecIdx++;
- }
-
- /**
- * Read a record from the input stream and return the data.
- *
- * @return The record data.
- */
-
- public byte[]
- readRecord()
- throws IOException
- {
- if ( this.debug )
- {
- System.err.println
- ( "ReadRecord: recIdx = " + this.currRecIdx
- + " blkIdx = " + this.currBlkIdx );
- }
-
- if ( this.inStream == null )
- throw new IOException
- ( "reading from an output buffer" );
-
- if ( this.currRecIdx >= this.recsPerBlock )
- {
- if ( ! this.readBlock() )
- return null;
- }
-
- byte[] result = new byte[ this.recordSize ];
-
- System.arraycopy(
- this.blockBuffer, (this.currRecIdx * this.recordSize),
- result, 0, this.recordSize );
-
- this.currRecIdx++;
-
- return result;
- }
-
- /**
- * @return false if End-Of-File, else true
- */
-
- private boolean
- readBlock()
- throws IOException
- {
- if ( this.debug )
- {
- System.err.println
- ( "ReadBlock: blkIdx = " + this.currBlkIdx );
- }
-
- if ( this.inStream == null )
- throw new IOException
- ( "reading from an output buffer" );
-
- this.currRecIdx = 0;
-
- int offset = 0;
- int bytesNeeded = this.blockSize;
- for ( ; bytesNeeded > 0 ; )
- {
- long numBytes =
- this.inStream.read
- ( this.blockBuffer, offset, bytesNeeded );
-
- //
- // NOTE
- // We have fit EOF, and the block is not full!
- //
- // This is a broken archive. It does not follow the standard
- // blocking algorithm. However, because we are generous, and
- // it requires little effort, we will simply ignore the error
- // and continue as if the entire block were read. This does
- // not appear to break anything upstream. We used to return
- // false in this case.
- //
- // Thanks to 'Yohann.Roussel at alcatel.fr' for this fix.
- //
-
- if ( numBytes == -1 )
- break;
-
- offset += numBytes;
- bytesNeeded -= numBytes;
- if ( numBytes != this.blockSize )
- {
- if ( this.debug )
- {
- System.err.println
- ( "ReadBlock: INCOMPLETE READ " + numBytes
- + " of " + this.blockSize + " bytes read." );
- }
- }
- }
-
- this.currBlkIdx++;
-
- return true;
- }
-
- /**
- * Get the current block number, zero based.
- *
- * @return The current zero based block number.
- */
- public int
- getCurrentBlockNum()
- {
- return this.currBlkIdx;
- }
-
- /**
- * Get the current record number, within the current block, zero based.
- * Thus, current offset = (currentBlockNum * recsPerBlk) + currentRecNum.
- *
- * @return The current zero based record number.
- */
- public int
- getCurrentRecordNum()
- {
- return this.currRecIdx - 1;
- }
-
- /**
- * Write an archive record to the archive.
- *
- * @param record The record data to write to the archive.
- */
-
- public void
- writeRecord( byte[] record )
- throws IOException
- {
- if ( this.debug )
- {
- System.err.println
- ( "WriteRecord: recIdx = " + this.currRecIdx
- + " blkIdx = " + this.currBlkIdx );
- }
-
- if ( this.outStream == null )
- throw new IOException
- ( "writing to an input buffer" );
-
- if ( record.length != this.recordSize )
- throw new IOException
- ( "record to write has length '" + record.length
- + "' which is not the record size of '"
- + this.recordSize + "'" );
-
- if ( this.currRecIdx >= this.recsPerBlock )
- {
- this.writeBlock();
- }
-
- System.arraycopy(
- record, 0,
- this.blockBuffer, (this.currRecIdx * this.recordSize),
- this.recordSize );
-
- this.currRecIdx++;
- }
-
- /**
- * Write an archive record to the archive, where the record may be
- * inside of a larger array buffer. The buffer must be "offset plus
- * record size" long.
- *
- * @param buf The buffer containing the record data to write.
- * @param offset The offset of the record data within buf.
- */
-
- public void
- writeRecord( byte[] buf, int offset )
- throws IOException
- {
- if ( this.debug )
- {
- System.err.println
- ( "WriteRecord: recIdx = " + this.currRecIdx
- + " blkIdx = " + this.currBlkIdx );
- }
-
- if ( this.outStream == null )
- throw new IOException
- ( "writing to an input buffer" );
-
- if ( (offset + this.recordSize) > buf.length )
- throw new IOException
- ( "record has length '" + buf.length
- + "' with offset '" + offset
- + "' which is less than the record size of '"
- + this.recordSize + "'" );
-
- if ( this.currRecIdx >= this.recsPerBlock )
- {
- this.writeBlock();
- }
-
- System.arraycopy(
- buf, offset,
- this.blockBuffer, (this.currRecIdx * this.recordSize),
- this.recordSize );
-
- this.currRecIdx++;
- }
-
- /**
- * Write a TarBuffer block to the archive.
- */
- private void
- writeBlock()
- throws IOException
- {
- if ( this.debug )
- {
- System.err.println
- ( "WriteBlock: blkIdx = " + this.currBlkIdx );
- }
-
- if ( this.outStream == null )
- throw new IOException
- ( "writing to an input buffer" );
-
- this.outStream.write( this.blockBuffer, 0, this.blockSize );
- this.outStream.flush();
-
- this.currRecIdx = 0;
- this.currBlkIdx++;
- }
-
- /**
- * Flush the current data block if it has any data in it.
- */
-
- private void
- flushBlock()
- throws IOException
- {
- if ( this.debug )
- {
- System.err.println( "TarBuffer.flushBlock() called." );
- }
-
- if ( this.outStream == null )
- throw new IOException
- ( "writing to an input buffer" );
-
- if ( this.currRecIdx > 0 )
- {
- this.writeBlock();
- }
- }
-
- /**
- * Close the TarBuffer. If this is an output buffer, also flush the
- * current block before closing.
- */
- public void
- close()
- throws IOException
- {
- if ( this.debug )
- {
- System.err.println( "TarBuffer.closeBuffer()." );
- }
-
- if ( this.outStream != null )
- {
- this.flushBlock();
-
- if ( this.outStream != System.out
- && this.outStream != System.err )
- {
- this.outStream.close();
- this.outStream = null;
- }
- }
- else if ( this.inStream != null )
- {
- if ( this.inStream != System.in )
- {
- this.inStream.close();
- this.inStream = null;
- }
- }
- }
-
- }
-
+/*
+** Authored by Timothy Gerard Endres
+** <mailto:time at gjt.org> <http://www.trustice.com>
+**
+** This work has been placed into the public domain.
+** You may use this work in any way and for any purpose you wish.
+**
+** THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND,
+** NOT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR
+** OF THIS SOFTWARE, ASSUMES _NO_ RESPONSIBILITY FOR ANY
+** CONSEQUENCE RESULTING FROM THE USE, MODIFICATION, OR
+** REDISTRIBUTION OF THIS SOFTWARE.
+**
+*/
+
+package installer;
+
+import java.io.*;
+
+
+/**
+ * The TarBuffer class implements the tar archive concept
+ * of a buffered input stream. This concept goes back to the
+ * days of blocked tape drives and special io devices. In the
+ * Java universe, the only real function that this class
+ * performs is to ensure that files have the correct "block"
+ * size, or other tars will complain.
+ * <p>
+ * You should never have a need to access this class directly.
+ * TarBuffers are created by Tar IO Streams.
+ *
+ * @version $Revision: 12504 $
+ * @author Timothy Gerard Endres,
+ * <a href="mailto:time at gjt.org">time at trustice.com</a>.
+ * @see TarArchive
+ */
+
+public class
+TarBuffer extends Object
+ {
+ public static final int DEFAULT_RCDSIZE = ( 512 );
+ public static final int DEFAULT_BLKSIZE = ( DEFAULT_RCDSIZE * 20 );
+
+ private InputStream inStream;
+ private OutputStream outStream;
+
+ private byte[] blockBuffer;
+ private int currBlkIdx;
+ private int currRecIdx;
+ private int blockSize;
+ private int recordSize;
+ private int recsPerBlock;
+
+ private boolean debug;
+
+
+ public
+ TarBuffer( InputStream inStream )
+ {
+ this( inStream, TarBuffer.DEFAULT_BLKSIZE );
+ }
+
+ public
+ TarBuffer( InputStream inStream, int blockSize )
+ {
+ this( inStream, blockSize, TarBuffer.DEFAULT_RCDSIZE );
+ }
+
+ public
+ TarBuffer( InputStream inStream, int blockSize, int recordSize )
+ {
+ this.inStream = inStream;
+ this.outStream = null;
+ this.initialize( blockSize, recordSize );
+ }
+
+ public
+ TarBuffer( OutputStream outStream )
+ {
+ this( outStream, TarBuffer.DEFAULT_BLKSIZE );
+ }
+
+ public
+ TarBuffer( OutputStream outStream, int blockSize )
+ {
+ this( outStream, blockSize, TarBuffer.DEFAULT_RCDSIZE );
+ }
+
+ public
+ TarBuffer( OutputStream outStream, int blockSize, int recordSize )
+ {
+ this.inStream = null;
+ this.outStream = outStream;
+ this.initialize( blockSize, recordSize );
+ }
+
+ /**
+ * Initialization common to all constructors.
+ */
+ private void
+ initialize( int blockSize, int recordSize )
+ {
+ this.debug = false;
+ this.blockSize = blockSize;
+ this.recordSize = recordSize;
+ this.recsPerBlock = ( this.blockSize / this.recordSize );
+ this.blockBuffer = new byte[ this.blockSize ];
+
+ if ( this.inStream != null )
+ {
+ this.currBlkIdx = -1;
+ this.currRecIdx = this.recsPerBlock;
+ }
+ else
+ {
+ this.currBlkIdx = 0;
+ this.currRecIdx = 0;
+ }
+ }
+
+ /**
+ * Get the TAR Buffer's block size. Blocks consist of multiple records.
+ */
+ public int
+ getBlockSize()
+ {
+ return this.blockSize;
+ }
+
+ /**
+ * Get the TAR Buffer's record size.
+ */
+ public int
+ getRecordSize()
+ {
+ return this.recordSize;
+ }
+
+ /**
+ * Set the debugging flag for the buffer.
+ *
+ * @param debug If true, print debugging output.
+ */
+ public void
+ setDebug( boolean debug )
+ {
+ this.debug = debug;
+ }
+
+ /**
+ * Determine if an archive record indicate End of Archive. End of
+ * archive is indicated by a record that consists entirely of null bytes.
+ *
+ * @param record The record data to check.
+ */
+ public boolean
+ isEOFRecord( byte[] record )
+ {
+ for ( int i = 0, sz = this.getRecordSize() ; i < sz ; ++i )
+ if ( record[i] != 0 )
+ return false;
+
+ return true;
+ }
+
+ /**
+ * Skip over a record on the input stream.
+ */
+
+ public void
+ skipRecord()
+ throws IOException
+ {
+ if ( this.debug )
+ {
+ System.err.println
+ ( "SkipRecord: recIdx = " + this.currRecIdx
+ + " blkIdx = " + this.currBlkIdx );
+ }
+
+ if ( this.inStream == null )
+ throw new IOException
+ ( "reading (via skip) from an output buffer" );
+
+ if ( this.currRecIdx >= this.recsPerBlock )
+ {
+ if ( ! this.readBlock() )
+ return; // UNDONE
+ }
+
+ this.currRecIdx++;
+ }
+
+ /**
+ * Read a record from the input stream and return the data.
+ *
+ * @return The record data.
+ */
+
+ public byte[]
+ readRecord()
+ throws IOException
+ {
+ if ( this.debug )
+ {
+ System.err.println
+ ( "ReadRecord: recIdx = " + this.currRecIdx
+ + " blkIdx = " + this.currBlkIdx );
+ }
+
+ if ( this.inStream == null )
+ throw new IOException
+ ( "reading from an output buffer" );
+
+ if ( this.currRecIdx >= this.recsPerBlock )
+ {
+ if ( ! this.readBlock() )
+ return null;
+ }
+
+ byte[] result = new byte[ this.recordSize ];
+
+ System.arraycopy(
+ this.blockBuffer, (this.currRecIdx * this.recordSize),
+ result, 0, this.recordSize );
+
+ this.currRecIdx++;
+
+ return result;
+ }
+
+ /**
+ * @return false if End-Of-File, else true
+ */
+
+ private boolean
+ readBlock()
+ throws IOException
+ {
+ if ( this.debug )
+ {
+ System.err.println
+ ( "ReadBlock: blkIdx = " + this.currBlkIdx );
+ }
+
+ if ( this.inStream == null )
+ throw new IOException
+ ( "reading from an output buffer" );
+
+ this.currRecIdx = 0;
+
+ int offset = 0;
+ int bytesNeeded = this.blockSize;
+ for ( ; bytesNeeded > 0 ; )
+ {
+ long numBytes =
+ this.inStream.read
+ ( this.blockBuffer, offset, bytesNeeded );
+
+ //
+ // NOTE
+ // We have fit EOF, and the block is not full!
+ //
+ // This is a broken archive. It does not follow the standard
+ // blocking algorithm. However, because we are generous, and
+ // it requires little effort, we will simply ignore the error
+ // and continue as if the entire block were read. This does
+ // not appear to break anything upstream. We used to return
+ // false in this case.
+ //
+ // Thanks to 'Yohann.Roussel at alcatel.fr' for this fix.
+ //
+
+ if ( numBytes == -1 )
+ break;
+
+ offset += numBytes;
+ bytesNeeded -= numBytes;
+ if ( numBytes != this.blockSize )
+ {
+ if ( this.debug )
+ {
+ System.err.println
+ ( "ReadBlock: INCOMPLETE READ " + numBytes
+ + " of " + this.blockSize + " bytes read." );
+ }
+ }
+ }
+
+ this.currBlkIdx++;
+
+ return true;
+ }
+
+ /**
+ * Get the current block number, zero based.
+ *
+ * @return The current zero based block number.
+ */
+ public int
+ getCurrentBlockNum()
+ {
+ return this.currBlkIdx;
+ }
+
+ /**
+ * Get the current record number, within the current block, zero based.
+ * Thus, current offset = (currentBlockNum * recsPerBlk) + currentRecNum.
+ *
+ * @return The current zero based record number.
+ */
+ public int
+ getCurrentRecordNum()
+ {
+ return this.currRecIdx - 1;
+ }
+
+ /**
+ * Write an archive record to the archive.
+ *
+ * @param record The record data to write to the archive.
+ */
+
+ public void
+ writeRecord( byte[] record )
+ throws IOException
+ {
+ if ( this.debug )
+ {
+ System.err.println
+ ( "WriteRecord: recIdx = " + this.currRecIdx
+ + " blkIdx = " + this.currBlkIdx );
+ }
+
+ if ( this.outStream == null )
+ throw new IOException
+ ( "writing to an input buffer" );
+
+ if ( record.length != this.recordSize )
+ throw new IOException
+ ( "record to write has length '" + record.length
+ + "' which is not the record size of '"
+ + this.recordSize + "'" );
+
+ if ( this.currRecIdx >= this.recsPerBlock )
+ {
+ this.writeBlock();
+ }
+
+ System.arraycopy(
+ record, 0,
+ this.blockBuffer, (this.currRecIdx * this.recordSize),
+ this.recordSize );
+
+ this.currRecIdx++;
+ }
+
+ /**
+ * Write an archive record to the archive, where the record may be
+ * inside of a larger array buffer. The buffer must be "offset plus
+ * record size" long.
+ *
+ * @param buf The buffer containing the record data to write.
+ * @param offset The offset of the record data within buf.
+ */
+
+ public void
+ writeRecord( byte[] buf, int offset )
+ throws IOException
+ {
+ if ( this.debug )
+ {
+ System.err.println
+ ( "WriteRecord: recIdx = " + this.currRecIdx
+ + " blkIdx = " + this.currBlkIdx );
+ }
+
+ if ( this.outStream == null )
+ throw new IOException
+ ( "writing to an input buffer" );
+
+ if ( (offset + this.recordSize) > buf.length )
+ throw new IOException
+ ( "record has length '" + buf.length
+ + "' with offset '" + offset
+ + "' which is less than the record size of '"
+ + this.recordSize + "'" );
+
+ if ( this.currRecIdx >= this.recsPerBlock )
+ {
+ this.writeBlock();
+ }
+
+ System.arraycopy(
+ buf, offset,
+ this.blockBuffer, (this.currRecIdx * this.recordSize),
+ this.recordSize );
+
+ this.currRecIdx++;
+ }
+
+ /**
+ * Write a TarBuffer block to the archive.
+ */
+ private void
+ writeBlock()
+ throws IOException
+ {
+ if ( this.debug )
+ {
+ System.err.println
+ ( "WriteBlock: blkIdx = " + this.currBlkIdx );
+ }
+
+ if ( this.outStream == null )
+ throw new IOException
+ ( "writing to an input buffer" );
+
+ this.outStream.write( this.blockBuffer, 0, this.blockSize );
+ this.outStream.flush();
+
+ this.currRecIdx = 0;
+ this.currBlkIdx++;
+ }
+
+ /**
+ * Flush the current data block if it has any data in it.
+ */
+
+ private void
+ flushBlock()
+ throws IOException
+ {
+ if ( this.debug )
+ {
+ System.err.println( "TarBuffer.flushBlock() called." );
+ }
+
+ if ( this.outStream == null )
+ throw new IOException
+ ( "writing to an input buffer" );
+
+ if ( this.currRecIdx > 0 )
+ {
+ this.writeBlock();
+ }
+ }
+
+ /**
+ * Close the TarBuffer. If this is an output buffer, also flush the
+ * current block before closing.
+ */
+ public void
+ close()
+ throws IOException
+ {
+ if ( this.debug )
+ {
+ System.err.println( "TarBuffer.closeBuffer()." );
+ }
+
+ if ( this.outStream != null )
+ {
+ this.flushBlock();
+
+ if ( this.outStream != System.out
+ && this.outStream != System.err )
+ {
+ this.outStream.close();
+ this.outStream = null;
+ }
+ }
+ else if ( this.inStream != null )
+ {
+ if ( this.inStream != System.in )
+ {
+ this.inStream.close();
+ this.inStream = null;
+ }
+ }
+ }
+
+ }
+
diff --git a/jEdit/installer/TarEntry.java b/jEdit/installer/TarEntry.java
index 19f5a70..1ea3d4f 100644
--- a/jEdit/installer/TarEntry.java
+++ b/jEdit/installer/TarEntry.java
@@ -1,729 +1,729 @@
-/*
-** Authored by Timothy Gerard Endres
-** <mailto:time at gjt.org> <http://www.trustice.com>
-**
-** This work has been placed into the public domain.
-** You may use this work in any way and for any purpose you wish.
-**
-** THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND,
-** NOT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR
-** OF THIS SOFTWARE, ASSUMES _NO_ RESPONSIBILITY FOR ANY
-** CONSEQUENCE RESULTING FROM THE USE, MODIFICATION, OR
-** REDISTRIBUTION OF THIS SOFTWARE.
-**
-*/
-
-package installer;
-
-import java.io.*;
-import java.util.Date;
-
-
-/**
- *
- * This class represents an entry in a Tar archive. It consists
- * of the entry's header, as well as the entry's File. Entries
- * can be instantiated in one of three ways, depending on how
- * they are to be used.
- * <p>
- * TarEntries that are created from the header bytes read from
- * an archive are instantiated with the TarEntry( byte[] )
- * constructor. These entries will be used when extracting from
- * or listing the contents of an archive. These entries have their
- * header filled in using the header bytes. They also set the File
- * to null, since they reference an archive entry not a file.
- * <p>
- * TarEntries that are created from Files that are to be written
- * into an archive are instantiated with the TarEntry( File )
- * constructor. These entries have their header filled in using
- * the File's information. They also keep a reference to the File
- * for convenience when writing entries.
- * <p>
- * Finally, TarEntries can be constructed from nothing but a name.
- * This allows the programmer to construct the entry by hand, for
- * instance when only an InputStream is available for writing to
- * the archive, and the header information is constructed from
- * other information. In this case the header fields are set to
- * defaults and the File is set to null.
- *
- * <p>
- * The C structure for a Tar Entry's header is:
- * <pre>
- * struct header {
- * char name[NAMSIZ];
- * char mode[8];
- * char uid[8];
- * char gid[8];
- * char size[12];
- * char mtime[12];
- * char chksum[8];
- * char linkflag;
- * char linkname[NAMSIZ];
- * char magic[8];
- * char uname[TUNMLEN];
- * char gname[TGNMLEN];
- * char devmajor[8];
- * char devminor[8];
- * } header;
- * </pre>
- *
- * @see TarHeader
- *
- */
-
-public
-class TarEntry
-extends Object
- {
- /**
- * If this entry represents a File, this references it.
- */
- protected File file;
-
- /**
- * This is the entry's header information.
- */
- protected TarHeader header;
-
- /**
- * Construct an entry with only a name. This allows the programmer
- * to construct the entry's header "by hand". File is set to null.
- */
- public
- TarEntry( String name )
- {
- this.initialize();
- this.nameTarHeader( this.header, name );
- }
-
- /**
- * Construct an entry for a file. File is set to file, and the
- * header is constructed from information from the file.
- *
- * @param file The file that the entry represents.
- */
- public
- TarEntry( File file )
- throws InvalidHeaderException
- {
- this.initialize();
- this.getFileTarHeader( this.header, file );
- }
-
- /**
- * Construct an entry from an archive's header bytes. File is set
- * to null.
- *
- * @param headerBuf The header bytes from a tar archive entry.
- */
- public
- TarEntry( byte[] headerBuf )
- throws InvalidHeaderException
- {
- this.initialize();
- this.parseTarHeader( this.header, headerBuf );
- }
-
- /**
- * Initialization code common to all constructors.
- */
- private void
- initialize()
- {
- this.file = null;
- this.header = new TarHeader();
- }
-
- /**
- * Determine if the two entries are equal. Equality is determined
- * by the header names being equal.
- *
- * @return it Entry to be checked for equality.
- * @return True if the entries are equal.
- */
- public boolean
- equals( TarEntry it )
- {
- return
- this.header.name.toString().equals
- ( it.header.name.toString() );
- }
-
- /**
- * Determine if the given entry is a descendant of this entry.
- * Descendancy is determined by the name of the descendant
- * starting with this entry's name.
- *
- * @param desc Entry to be checked as a descendent of this.
- * @return True if entry is a descendant of this.
- */
- public boolean
- isDescendent( TarEntry desc )
- {
- return
- desc.header.name.toString().startsWith
- ( this.header.name.toString() );
- }
-
- /**
- * Get this entry's header.
- *
- * @return This entry's TarHeader.
- */
- public TarHeader
- getHeader()
- {
- return this.header;
- }
-
- /**
- * Get this entry's name.
- *
- * @return This entry's name.
- */
- public String
- getName()
- {
- return this.header.name.toString();
- }
-
- /**
- * Set this entry's name.
- *
- * @param name This entry's new name.
- */
- public void
- setName( String name )
- {
- this.header.name =
- new StringBuffer( name );
- }
-
- /**
- * Get this entry's user id.
- *
- * @return This entry's user id.
- */
- public int
- getUserId()
- {
- return this.header.userId;
- }
-
- /**
- * Set this entry's user id.
- *
- * @param userId This entry's new user id.
- */
- public void
- setUserId( int userId )
- {
- this.header.userId = userId;
- }
-
- /**
- * Get this entry's group id.
- *
- * @return This entry's group id.
- */
- public int
- getGroupId()
- {
- return this.header.groupId;
- }
-
- /**
- * Set this entry's group id.
- *
- * @param groupId This entry's new group id.
- */
- public void
- setGroupId( int groupId )
- {
- this.header.groupId = groupId;
- }
-
- /**
- * Get this entry's user name.
- *
- * @return This entry's user name.
- */
- public String
- getUserName()
- {
- return this.header.userName.toString();
- }
-
- /**
- * Set this entry's user name.
- *
- * @param userName This entry's new user name.
- */
- public void
- setUserName( String userName )
- {
- this.header.userName =
- new StringBuffer( userName );
- }
-
- /**
- * Get this entry's group name.
- *
- * @return This entry's group name.
- */
- public String
- getGroupName()
- {
- return this.header.groupName.toString();
- }
-
- /**
- * Set this entry's group name.
- *
- * @param groupName This entry's new group name.
- */
- public void
- setGroupName( String groupName )
- {
- this.header.groupName =
- new StringBuffer( groupName );
- }
-
- /**
- * Convenience method to set this entry's group and user ids.
- *
- * @param userId This entry's new user id.
- * @param groupId This entry's new group id.
- */
- public void
- setIds( int userId, int groupId )
- {
- this.setUserId( userId );
- this.setGroupId( groupId );
- }
-
- /**
- * Convenience method to set this entry's group and user names.
- *
- * @param userName This entry's new user name.
- * @param groupName This entry's new group name.
- */
- public void
- setNames( String userName, String groupName )
- {
- this.setUserName( userName );
- this.setGroupName( groupName );
- }
-
- /**
- * Set this entry's modification time. The parameter passed
- * to this method is in "Java time".
- *
- * @param time This entry's new modification time.
- */
- public void
- setModTime( long time )
- {
- this.header.modTime = time / 1000;
- }
-
- /**
- * Set this entry's modification time.
- *
- * @param time This entry's new modification time.
- */
- public void
- setModTime( Date time )
- {
- this.header.modTime = time.getTime() / 1000;
- }
-
- /**
- * Set this entry's modification time.
- *
- * @param time This entry's new modification time.
- */
- public Date
- getModTime()
- {
- return new Date( this.header.modTime * 1000 );
- }
-
- /**
- * Get this entry's file.
- *
- * @return This entry's file.
- */
- public File
- getFile()
- {
- return this.file;
- }
-
- /**
- * Get this entry's file size.
- *
- * @return This entry's file size.
- */
- public long
- getSize()
- {
- return this.header.size;
- }
-
- /**
- * Set this entry's file size.
- *
- * @param size This entry's new file size.
- */
- public void
- setSize( long size )
- {
- this.header.size = size;
- }
-
- /**
- * Convenience method that will modify an entry's name directly
- * in place in an entry header buffer byte array.
- *
- * @param outbuf The buffer containing the entry header to modify.
- * @param newName The new name to place into the header buffer.
- */
- public void
- adjustEntryName( byte[] outbuf, String newName )
- {
- int offset = 0;
- offset = TarHeader.getNameBytes
- ( new StringBuffer( newName ),
- outbuf, offset, TarHeader.NAMELEN );
- }
-
- /**
- * Return whether or not this entry represents a directory.
- *
- * @return True if this entry is a directory.
- */
- public boolean
- isDirectory()
- {
- if ( this.file != null )
- return this.file.isDirectory();
-
- if ( this.header != null )
- {
- if ( this.header.linkFlag == TarHeader.LF_DIR )
- return true;
-
- if ( this.header.name.toString().endsWith( "/" ) )
- return true;
- }
-
- return false;
- }
-
- /**
- * Fill in a TarHeader with information from a File.
- *
- * @param hdr The TarHeader to fill in.
- * @param file The file from which to get the header information.
- */
- public void
- getFileTarHeader( TarHeader hdr, File file )
- throws InvalidHeaderException
- {
- this.file = file;
-
- String name = file.getPath();
- String osname = System.getProperty( "os.name" );
- if ( osname != null )
- {
- // Strip off drive letters!
- // REVIEW Would a better check be "(File.separator == '\')"?
-
- // String Win32Prefix = "Windows";
- // String prefix = osname.substring( 0, Win32Prefix.length() );
- // if ( prefix.equalsIgnoreCase( Win32Prefix ) )
-
- // if ( File.separatorChar == '\\' )
-
- // Per Patrick Beard:
- String Win32Prefix = "windows";
- if ( osname.toLowerCase().startsWith( Win32Prefix ) )
- {
- if ( name.length() > 2 )
- {
- char ch1 = name.charAt(0);
- char ch2 = name.charAt(1);
- if ( ch2 == ':'
- && ( (ch1 >= 'a' && ch1 <= 'z')
- || (ch1 >= 'A' && ch1 <= 'Z') ) )
- {
- name = name.substring( 2 );
- }
- }
- }
- }
-
- name = name.replace( File.separatorChar, '/' );
-
- // No absolute pathnames
- // Windows (and Posix?) paths can start with "\\NetworkDrive\",
- // so we loop on starting /'s.
-
- for ( ; name.startsWith( "/" ) ; )
- name = name.substring( 1 );
-
- hdr.linkName = new StringBuffer( "" );
-
- hdr.name = new StringBuffer( name );
-
- if ( file.isDirectory() )
- {
- hdr.mode = 040755;
- hdr.linkFlag = TarHeader.LF_DIR;
- if ( hdr.name.charAt( hdr.name.length() - 1 ) != '/' )
- hdr.name.append( "/" );
- }
- else
- {
- hdr.mode = 0100644;
- hdr.linkFlag = TarHeader.LF_NORMAL;
- }
-
- // UNDONE When File lets us get the userName, use it!
-
- hdr.size = file.length();
- hdr.modTime = file.lastModified() / 1000;
- hdr.checkSum = 0;
- hdr.devMajor = 0;
- hdr.devMinor = 0;
- }
-
- /**
- * If this entry represents a file, and the file is a directory, return
- * an array of TarEntries for this entry's children.
- *
- * @return An array of TarEntry's for this entry's children.
- */
- public TarEntry[]
- getDirectoryEntries()
- throws InvalidHeaderException
- {
- if ( this.file == null
- || ! this.file.isDirectory() )
- {
- return new TarEntry[0];
- }
-
- String[] list = this.file.list();
-
- TarEntry[] result = new TarEntry[ list.length ];
-
- for ( int i = 0 ; i < list.length ; ++i )
- {
- result[i] =
- new TarEntry
- ( new File( this.file, list[i] ) );
- }
-
- return result;
- }
-
- /**
- * Compute the checksum of a tar entry header.
- *
- * @param buf The tar entry's header buffer.
- * @return The computed checksum.
- */
- public long
- computeCheckSum( byte[] buf )
- {
- long sum = 0;
-
- for ( int i = 0 ; i < buf.length ; ++i )
- {
- sum += 255 & buf[ i ];
- }
-
- return sum;
- }
-
- /**
- * Write an entry's header information to a header buffer.
- *
- * @param outbuf The tar entry header buffer to fill in.
- */
- public void
- writeEntryHeader( byte[] outbuf )
- {
- int offset = 0;
-
- offset = TarHeader.getNameBytes
- ( this.header.name, outbuf, offset, TarHeader.NAMELEN );
-
- offset = TarHeader.getOctalBytes
- ( this.header.mode, outbuf, offset, TarHeader.MODELEN );
-
- offset = TarHeader.getOctalBytes
- ( this.header.userId, outbuf, offset, TarHeader.UIDLEN );
-
- offset = TarHeader.getOctalBytes
- ( this.header.groupId, outbuf, offset, TarHeader.GIDLEN );
-
- long size = this.header.size;
-
- offset = TarHeader.getLongOctalBytes
- ( size, outbuf, offset, TarHeader.SIZELEN );
-
- offset = TarHeader.getLongOctalBytes
- ( this.header.modTime, outbuf, offset, TarHeader.MODTIMELEN );
-
- int csOffset = offset;
- for ( int c = 0 ; c < TarHeader.CHKSUMLEN ; ++c )
- outbuf[ offset++ ] = (byte) ' ';
-
- outbuf[ offset++ ] = this.header.linkFlag;
-
- offset = TarHeader.getNameBytes
- ( this.header.linkName, outbuf, offset, TarHeader.NAMELEN );
-
- offset = TarHeader.getNameBytes
- ( this.header.magic, outbuf, offset, TarHeader.MAGICLEN );
-
- offset = TarHeader.getNameBytes
- ( this.header.userName, outbuf, offset, TarHeader.UNAMELEN );
-
- offset = TarHeader.getNameBytes
- ( this.header.groupName, outbuf, offset, TarHeader.GNAMELEN );
-
- offset = TarHeader.getOctalBytes
- ( this.header.devMajor, outbuf, offset, TarHeader.DEVLEN );
-
- offset = TarHeader.getOctalBytes
- ( this.header.devMinor, outbuf, offset, TarHeader.DEVLEN );
-
- for ( ; offset < outbuf.length ; )
- outbuf[ offset++ ] = 0;
-
- long checkSum = this.computeCheckSum( outbuf );
-
- TarHeader.getCheckSumOctalBytes
- ( checkSum, outbuf, csOffset, TarHeader.CHKSUMLEN );
- }
-
- /**
- * Parse an entry's TarHeader information from a header buffer.
- *
- * @param hdr The TarHeader to fill in from the buffer information.
- * @param header The tar entry header buffer to get information from.
- */
- public void
- parseTarHeader( TarHeader hdr, byte[] header )
- throws InvalidHeaderException
- {
- int offset = 0;
-
- hdr.name =
- TarHeader.parseName( header, offset, TarHeader.NAMELEN );
-
- offset += TarHeader.NAMELEN;
-
- hdr.mode = (int)
- TarHeader.parseOctal( header, offset, TarHeader.MODELEN );
-
- offset += TarHeader.MODELEN;
-
- hdr.userId = (int)
- TarHeader.parseOctal( header, offset, TarHeader.UIDLEN );
-
- offset += TarHeader.UIDLEN;
-
- hdr.groupId = (int)
- TarHeader.parseOctal( header, offset, TarHeader.GIDLEN );
-
- offset += TarHeader.GIDLEN;
-
- hdr.size =
- TarHeader.parseOctal( header, offset, TarHeader.SIZELEN );
-
- offset += TarHeader.SIZELEN;
-
- hdr.modTime =
- TarHeader.parseOctal( header, offset, TarHeader.MODTIMELEN );
-
- offset += TarHeader.MODTIMELEN;
-
- hdr.checkSum = (int)
- TarHeader.parseOctal( header, offset, TarHeader.CHKSUMLEN );
-
- offset += TarHeader.CHKSUMLEN;
-
- hdr.linkFlag = header[ offset++ ];
-
- hdr.linkName =
- TarHeader.parseName( header, offset, TarHeader.NAMELEN );
-
- offset += TarHeader.NAMELEN;
-
- hdr.magic =
- TarHeader.parseName( header, offset, TarHeader.MAGICLEN );
-
- offset += TarHeader.MAGICLEN;
-
- hdr.userName =
- TarHeader.parseName( header, offset, TarHeader.UNAMELEN );
-
- offset += TarHeader.UNAMELEN;
-
- hdr.groupName =
- TarHeader.parseName( header, offset, TarHeader.GNAMELEN );
-
- offset += TarHeader.GNAMELEN;
-
- hdr.devMajor = (int)
- TarHeader.parseOctal( header, offset, TarHeader.DEVLEN );
-
- offset += TarHeader.DEVLEN;
-
- hdr.devMinor = (int)
- TarHeader.parseOctal( header, offset, TarHeader.DEVLEN );
- }
-
- /**
- * Fill in a TarHeader given only the entry's name.
- *
- * @param hdr The TarHeader to fill in.
- * @param name The tar entry name.
- */
- public void
- nameTarHeader( TarHeader hdr, String name )
- {
- boolean isDir = name.endsWith( "/" );
-
- hdr.checkSum = 0;
- hdr.devMajor = 0;
- hdr.devMinor = 0;
-
- hdr.name = new StringBuffer( name );
- hdr.mode = isDir ? 040755 : 0100644;
- hdr.userId = 0;
- hdr.groupId = 0;
- hdr.size = 0;
- hdr.checkSum = 0;
-
- hdr.modTime =
- (new java.util.Date()).getTime() / 1000;
-
- hdr.linkFlag =
- isDir ? TarHeader.LF_DIR : TarHeader.LF_NORMAL;
-
- hdr.linkName = new StringBuffer( "" );
- hdr.userName = new StringBuffer( "" );
- hdr.groupName = new StringBuffer( "" );
-
- hdr.devMajor = 0;
- hdr.devMinor = 0;
- }
-
- }
-
+/*
+** Authored by Timothy Gerard Endres
+** <mailto:time at gjt.org> <http://www.trustice.com>
+**
+** This work has been placed into the public domain.
+** You may use this work in any way and for any purpose you wish.
+**
+** THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND,
+** NOT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR
+** OF THIS SOFTWARE, ASSUMES _NO_ RESPONSIBILITY FOR ANY
+** CONSEQUENCE RESULTING FROM THE USE, MODIFICATION, OR
+** REDISTRIBUTION OF THIS SOFTWARE.
+**
+*/
+
+package installer;
+
+import java.io.*;
+import java.util.Date;
+
+
+/**
+ *
+ * This class represents an entry in a Tar archive. It consists
+ * of the entry's header, as well as the entry's File. Entries
+ * can be instantiated in one of three ways, depending on how
+ * they are to be used.
+ * <p>
+ * TarEntries that are created from the header bytes read from
+ * an archive are instantiated with the TarEntry( byte[] )
+ * constructor. These entries will be used when extracting from
+ * or listing the contents of an archive. These entries have their
+ * header filled in using the header bytes. They also set the File
+ * to null, since they reference an archive entry not a file.
+ * <p>
+ * TarEntries that are created from Files that are to be written
+ * into an archive are instantiated with the TarEntry( File )
+ * constructor. These entries have their header filled in using
+ * the File's information. They also keep a reference to the File
+ * for convenience when writing entries.
+ * <p>
+ * Finally, TarEntries can be constructed from nothing but a name.
+ * This allows the programmer to construct the entry by hand, for
+ * instance when only an InputStream is available for writing to
+ * the archive, and the header information is constructed from
+ * other information. In this case the header fields are set to
+ * defaults and the File is set to null.
+ *
+ * <p>
+ * The C structure for a Tar Entry's header is:
+ * <pre>
+ * struct header {
+ * char name[NAMSIZ];
+ * char mode[8];
+ * char uid[8];
+ * char gid[8];
+ * char size[12];
+ * char mtime[12];
+ * char chksum[8];
+ * char linkflag;
+ * char linkname[NAMSIZ];
+ * char magic[8];
+ * char uname[TUNMLEN];
+ * char gname[TGNMLEN];
+ * char devmajor[8];
+ * char devminor[8];
+ * } header;
+ * </pre>
+ *
+ * @see TarHeader
+ *
+ */
+
+public
+class TarEntry
+extends Object
+ {
+ /**
+ * If this entry represents a File, this references it.
+ */
+ protected File file;
+
+ /**
+ * This is the entry's header information.
+ */
+ protected TarHeader header;
+
+ /**
+ * Construct an entry with only a name. This allows the programmer
+ * to construct the entry's header "by hand". File is set to null.
+ */
+ public
+ TarEntry( String name )
+ {
+ this.initialize();
+ this.nameTarHeader( this.header, name );
+ }
+
+ /**
+ * Construct an entry for a file. File is set to file, and the
+ * header is constructed from information from the file.
+ *
+ * @param file The file that the entry represents.
+ */
+ public
+ TarEntry( File file )
+ throws InvalidHeaderException
+ {
+ this.initialize();
+ this.getFileTarHeader( this.header, file );
+ }
+
+ /**
+ * Construct an entry from an archive's header bytes. File is set
+ * to null.
+ *
+ * @param headerBuf The header bytes from a tar archive entry.
+ */
+ public
+ TarEntry( byte[] headerBuf )
+ throws InvalidHeaderException
+ {
+ this.initialize();
+ this.parseTarHeader( this.header, headerBuf );
+ }
+
+ /**
+ * Initialization code common to all constructors.
+ */
+ private void
+ initialize()
+ {
+ this.file = null;
+ this.header = new TarHeader();
+ }
+
+ /**
+ * Determine if the two entries are equal. Equality is determined
+ * by the header names being equal.
+ *
+ * @return it Entry to be checked for equality.
+ * @return True if the entries are equal.
+ */
+ public boolean
+ equals( TarEntry it )
+ {
+ return
+ this.header.name.toString().equals
+ ( it.header.name.toString() );
+ }
+
+ /**
+ * Determine if the given entry is a descendant of this entry.
+ * Descendancy is determined by the name of the descendant
+ * starting with this entry's name.
+ *
+ * @param desc Entry to be checked as a descendent of this.
+ * @return True if entry is a descendant of this.
+ */
+ public boolean
+ isDescendent( TarEntry desc )
+ {
+ return
+ desc.header.name.toString().startsWith
+ ( this.header.name.toString() );
+ }
+
+ /**
+ * Get this entry's header.
+ *
+ * @return This entry's TarHeader.
+ */
+ public TarHeader
+ getHeader()
+ {
+ return this.header;
+ }
+
+ /**
+ * Get this entry's name.
+ *
+ * @return This entry's name.
+ */
+ public String
+ getName()
+ {
+ return this.header.name.toString();
+ }
+
+ /**
+ * Set this entry's name.
+ *
+ * @param name This entry's new name.
+ */
+ public void
+ setName( String name )
+ {
+ this.header.name =
+ new StringBuffer( name );
+ }
+
+ /**
+ * Get this entry's user id.
+ *
+ * @return This entry's user id.
+ */
+ public int
+ getUserId()
+ {
+ return this.header.userId;
+ }
+
+ /**
+ * Set this entry's user id.
+ *
+ * @param userId This entry's new user id.
+ */
+ public void
+ setUserId( int userId )
+ {
+ this.header.userId = userId;
+ }
+
+ /**
+ * Get this entry's group id.
+ *
+ * @return This entry's group id.
+ */
+ public int
+ getGroupId()
+ {
+ return this.header.groupId;
+ }
+
+ /**
+ * Set this entry's group id.
+ *
+ * @param groupId This entry's new group id.
+ */
+ public void
+ setGroupId( int groupId )
+ {
+ this.header.groupId = groupId;
+ }
+
+ /**
+ * Get this entry's user name.
+ *
+ * @return This entry's user name.
+ */
+ public String
+ getUserName()
+ {
+ return this.header.userName.toString();
+ }
+
+ /**
+ * Set this entry's user name.
+ *
+ * @param userName This entry's new user name.
+ */
+ public void
+ setUserName( String userName )
+ {
+ this.header.userName =
+ new StringBuffer( userName );
+ }
+
+ /**
+ * Get this entry's group name.
+ *
+ * @return This entry's group name.
+ */
+ public String
+ getGroupName()
+ {
+ return this.header.groupName.toString();
+ }
+
+ /**
+ * Set this entry's group name.
+ *
+ * @param groupName This entry's new group name.
+ */
+ public void
+ setGroupName( String groupName )
+ {
+ this.header.groupName =
+ new StringBuffer( groupName );
+ }
+
+ /**
+ * Convenience method to set this entry's group and user ids.
+ *
+ * @param userId This entry's new user id.
+ * @param groupId This entry's new group id.
+ */
+ public void
+ setIds( int userId, int groupId )
+ {
+ this.setUserId( userId );
+ this.setGroupId( groupId );
+ }
+
+ /**
+ * Convenience method to set this entry's group and user names.
+ *
+ * @param userName This entry's new user name.
+ * @param groupName This entry's new group name.
+ */
+ public void
+ setNames( String userName, String groupName )
+ {
+ this.setUserName( userName );
+ this.setGroupName( groupName );
+ }
+
+ /**
+ * Set this entry's modification time. The parameter passed
+ * to this method is in "Java time".
+ *
+ * @param time This entry's new modification time.
+ */
+ public void
+ setModTime( long time )
+ {
+ this.header.modTime = time / 1000;
+ }
+
+ /**
+ * Set this entry's modification time.
+ *
+ * @param time This entry's new modification time.
+ */
+ public void
+ setModTime( Date time )
+ {
+ this.header.modTime = time.getTime() / 1000;
+ }
+
+ /**
+ * Set this entry's modification time.
+ *
+ * @param time This entry's new modification time.
+ */
+ public Date
+ getModTime()
+ {
+ return new Date( this.header.modTime * 1000 );
+ }
+
+ /**
+ * Get this entry's file.
+ *
+ * @return This entry's file.
+ */
+ public File
+ getFile()
+ {
+ return this.file;
+ }
+
+ /**
+ * Get this entry's file size.
+ *
+ * @return This entry's file size.
+ */
+ public long
+ getSize()
+ {
+ return this.header.size;
+ }
+
+ /**
+ * Set this entry's file size.
+ *
+ * @param size This entry's new file size.
+ */
+ public void
+ setSize( long size )
+ {
+ this.header.size = size;
+ }
+
+ /**
+ * Convenience method that will modify an entry's name directly
+ * in place in an entry header buffer byte array.
+ *
+ * @param outbuf The buffer containing the entry header to modify.
+ * @param newName The new name to place into the header buffer.
+ */
+ public void
+ adjustEntryName( byte[] outbuf, String newName )
+ {
+ int offset = 0;
+ offset = TarHeader.getNameBytes
+ ( new StringBuffer( newName ),
+ outbuf, offset, TarHeader.NAMELEN );
+ }
+
+ /**
+ * Return whether or not this entry represents a directory.
+ *
+ * @return True if this entry is a directory.
+ */
+ public boolean
+ isDirectory()
+ {
+ if ( this.file != null )
+ return this.file.isDirectory();
+
+ if ( this.header != null )
+ {
+ if ( this.header.linkFlag == TarHeader.LF_DIR )
+ return true;
+
+ if ( this.header.name.toString().endsWith( "/" ) )
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Fill in a TarHeader with information from a File.
+ *
+ * @param hdr The TarHeader to fill in.
+ * @param file The file from which to get the header information.
+ */
+ public void
+ getFileTarHeader( TarHeader hdr, File file )
+ throws InvalidHeaderException
+ {
+ this.file = file;
+
+ String name = file.getPath();
+ String osname = System.getProperty( "os.name" );
+ if ( osname != null )
+ {
+ // Strip off drive letters!
+ // REVIEW Would a better check be "(File.separator == '\')"?
+
+ // String Win32Prefix = "Windows";
+ // String prefix = osname.substring( 0, Win32Prefix.length() );
+ // if ( prefix.equalsIgnoreCase( Win32Prefix ) )
+
+ // if ( File.separatorChar == '\\' )
+
+ // Per Patrick Beard:
+ String Win32Prefix = "windows";
+ if ( osname.toLowerCase().startsWith( Win32Prefix ) )
+ {
+ if ( name.length() > 2 )
+ {
+ char ch1 = name.charAt(0);
+ char ch2 = name.charAt(1);
+ if ( ch2 == ':'
+ && ( (ch1 >= 'a' && ch1 <= 'z')
+ || (ch1 >= 'A' && ch1 <= 'Z') ) )
+ {
+ name = name.substring( 2 );
+ }
+ }
+ }
+ }
+
+ name = name.replace( File.separatorChar, '/' );
+
+ // No absolute pathnames
+ // Windows (and Posix?) paths can start with "\\NetworkDrive\",
+ // so we loop on starting /'s.
+
+ for ( ; name.startsWith( "/" ) ; )
+ name = name.substring( 1 );
+
+ hdr.linkName = new StringBuffer( "" );
+
+ hdr.name = new StringBuffer( name );
+
+ if ( file.isDirectory() )
+ {
+ hdr.mode = 040755;
+ hdr.linkFlag = TarHeader.LF_DIR;
+ if ( hdr.name.charAt( hdr.name.length() - 1 ) != '/' )
+ hdr.name.append( "/" );
+ }
+ else
+ {
+ hdr.mode = 0100644;
+ hdr.linkFlag = TarHeader.LF_NORMAL;
+ }
+
+ // UNDONE When File lets us get the userName, use it!
+
+ hdr.size = file.length();
+ hdr.modTime = file.lastModified() / 1000;
+ hdr.checkSum = 0;
+ hdr.devMajor = 0;
+ hdr.devMinor = 0;
+ }
+
+ /**
+ * If this entry represents a file, and the file is a directory, return
+ * an array of TarEntries for this entry's children.
+ *
+ * @return An array of TarEntry's for this entry's children.
+ */
+ public TarEntry[]
+ getDirectoryEntries()
+ throws InvalidHeaderException
+ {
+ if ( this.file == null
+ || ! this.file.isDirectory() )
+ {
+ return new TarEntry[0];
+ }
+
+ String[] list = this.file.list();
+
+ TarEntry[] result = new TarEntry[ list.length ];
+
+ for ( int i = 0 ; i < list.length ; ++i )
+ {
+ result[i] =
+ new TarEntry
+ ( new File( this.file, list[i] ) );
+ }
+
+ return result;
+ }
+
+ /**
+ * Compute the checksum of a tar entry header.
+ *
+ * @param buf The tar entry's header buffer.
+ * @return The computed checksum.
+ */
+ public long
+ computeCheckSum( byte[] buf )
+ {
+ long sum = 0;
+
+ for ( int i = 0 ; i < buf.length ; ++i )
+ {
+ sum += 255 & buf[ i ];
+ }
+
+ return sum;
+ }
+
+ /**
+ * Write an entry's header information to a header buffer.
+ *
+ * @param outbuf The tar entry header buffer to fill in.
+ */
+ public void
+ writeEntryHeader( byte[] outbuf )
+ {
+ int offset = 0;
+
+ offset = TarHeader.getNameBytes
+ ( this.header.name, outbuf, offset, TarHeader.NAMELEN );
+
+ offset = TarHeader.getOctalBytes
+ ( this.header.mode, outbuf, offset, TarHeader.MODELEN );
+
+ offset = TarHeader.getOctalBytes
+ ( this.header.userId, outbuf, offset, TarHeader.UIDLEN );
+
+ offset = TarHeader.getOctalBytes
+ ( this.header.groupId, outbuf, offset, TarHeader.GIDLEN );
+
+ long size = this.header.size;
+
+ offset = TarHeader.getLongOctalBytes
+ ( size, outbuf, offset, TarHeader.SIZELEN );
+
+ offset = TarHeader.getLongOctalBytes
+ ( this.header.modTime, outbuf, offset, TarHeader.MODTIMELEN );
+
+ int csOffset = offset;
+ for ( int c = 0 ; c < TarHeader.CHKSUMLEN ; ++c )
+ outbuf[ offset++ ] = (byte) ' ';
+
+ outbuf[ offset++ ] = this.header.linkFlag;
+
+ offset = TarHeader.getNameBytes
+ ( this.header.linkName, outbuf, offset, TarHeader.NAMELEN );
+
+ offset = TarHeader.getNameBytes
+ ( this.header.magic, outbuf, offset, TarHeader.MAGICLEN );
+
+ offset = TarHeader.getNameBytes
+ ( this.header.userName, outbuf, offset, TarHeader.UNAMELEN );
+
+ offset = TarHeader.getNameBytes
+ ( this.header.groupName, outbuf, offset, TarHeader.GNAMELEN );
+
+ offset = TarHeader.getOctalBytes
+ ( this.header.devMajor, outbuf, offset, TarHeader.DEVLEN );
+
+ offset = TarHeader.getOctalBytes
+ ( this.header.devMinor, outbuf, offset, TarHeader.DEVLEN );
+
+ for ( ; offset < outbuf.length ; )
+ outbuf[ offset++ ] = 0;
+
+ long checkSum = this.computeCheckSum( outbuf );
+
+ TarHeader.getCheckSumOctalBytes
+ ( checkSum, outbuf, csOffset, TarHeader.CHKSUMLEN );
+ }
+
+ /**
+ * Parse an entry's TarHeader information from a header buffer.
+ *
+ * @param hdr The TarHeader to fill in from the buffer information.
+ * @param header The tar entry header buffer to get information from.
+ */
+ public void
+ parseTarHeader( TarHeader hdr, byte[] header )
+ throws InvalidHeaderException
+ {
+ int offset = 0;
+
+ hdr.name =
+ TarHeader.parseName( header, offset, TarHeader.NAMELEN );
+
+ offset += TarHeader.NAMELEN;
+
+ hdr.mode = (int)
+ TarHeader.parseOctal( header, offset, TarHeader.MODELEN );
+
+ offset += TarHeader.MODELEN;
+
+ hdr.userId = (int)
+ TarHeader.parseOctal( header, offset, TarHeader.UIDLEN );
+
+ offset += TarHeader.UIDLEN;
+
+ hdr.groupId = (int)
+ TarHeader.parseOctal( header, offset, TarHeader.GIDLEN );
+
+ offset += TarHeader.GIDLEN;
+
+ hdr.size =
+ TarHeader.parseOctal( header, offset, TarHeader.SIZELEN );
+
+ offset += TarHeader.SIZELEN;
+
+ hdr.modTime =
+ TarHeader.parseOctal( header, offset, TarHeader.MODTIMELEN );
+
+ offset += TarHeader.MODTIMELEN;
+
+ hdr.checkSum = (int)
+ TarHeader.parseOctal( header, offset, TarHeader.CHKSUMLEN );
+
+ offset += TarHeader.CHKSUMLEN;
+
+ hdr.linkFlag = header[ offset++ ];
+
+ hdr.linkName =
+ TarHeader.parseName( header, offset, TarHeader.NAMELEN );
+
+ offset += TarHeader.NAMELEN;
+
+ hdr.magic =
+ TarHeader.parseName( header, offset, TarHeader.MAGICLEN );
+
+ offset += TarHeader.MAGICLEN;
+
+ hdr.userName =
+ TarHeader.parseName( header, offset, TarHeader.UNAMELEN );
+
+ offset += TarHeader.UNAMELEN;
+
+ hdr.groupName =
+ TarHeader.parseName( header, offset, TarHeader.GNAMELEN );
+
+ offset += TarHeader.GNAMELEN;
+
+ hdr.devMajor = (int)
+ TarHeader.parseOctal( header, offset, TarHeader.DEVLEN );
+
+ offset += TarHeader.DEVLEN;
+
+ hdr.devMinor = (int)
+ TarHeader.parseOctal( header, offset, TarHeader.DEVLEN );
+ }
+
+ /**
+ * Fill in a TarHeader given only the entry's name.
+ *
+ * @param hdr The TarHeader to fill in.
+ * @param name The tar entry name.
+ */
+ public void
+ nameTarHeader( TarHeader hdr, String name )
+ {
+ boolean isDir = name.endsWith( "/" );
+
+ hdr.checkSum = 0;
+ hdr.devMajor = 0;
+ hdr.devMinor = 0;
+
+ hdr.name = new StringBuffer( name );
+ hdr.mode = isDir ? 040755 : 0100644;
+ hdr.userId = 0;
+ hdr.groupId = 0;
+ hdr.size = 0;
+ hdr.checkSum = 0;
+
+ hdr.modTime =
+ (new java.util.Date()).getTime() / 1000;
+
+ hdr.linkFlag =
+ isDir ? TarHeader.LF_DIR : TarHeader.LF_NORMAL;
+
+ hdr.linkName = new StringBuffer( "" );
+ hdr.userName = new StringBuffer( "" );
+ hdr.groupName = new StringBuffer( "" );
+
+ hdr.devMajor = 0;
+ hdr.devMinor = 0;
+ }
+
+ }
+
diff --git a/jEdit/installer/TarHeader.java b/jEdit/installer/TarHeader.java
index 570a753..fdf15ad 100644
--- a/jEdit/installer/TarHeader.java
+++ b/jEdit/installer/TarHeader.java
@@ -1,422 +1,422 @@
-/*
-** Authored by Timothy Gerard Endres
-** <mailto:time at gjt.org> <http://www.trustice.com>
-**
-** This work has been placed into the public domain.
-** You may use this work in any way and for any purpose you wish.
-**
-** THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND,
-** NOT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR
-** OF THIS SOFTWARE, ASSUMES _NO_ RESPONSIBILITY FOR ANY
-** CONSEQUENCE RESULTING FROM THE USE, MODIFICATION, OR
-** REDISTRIBUTION OF THIS SOFTWARE.
-**
-*/
-
-package installer;
-
-/**
- * This class encapsulates the Tar Entry Header used in Tar Archives.
- * The class also holds a number of tar constants, used mostly in headers.
- */
-
-public class
-TarHeader extends Object
- {
- /**
- * The length of the name field in a header buffer.
- */
- public static final int NAMELEN = 100;
- /**
- * The length of the mode field in a header buffer.
- */
- public static final int MODELEN = 8;
- /**
- * The length of the user id field in a header buffer.
- */
- public static final int UIDLEN = 8;
- /**
- * The length of the group id field in a header buffer.
- */
- public static final int GIDLEN = 8;
- /**
- * The length of the checksum field in a header buffer.
- */
- public static final int CHKSUMLEN = 8;
- /**
- * The length of the size field in a header buffer.
- */
- public static final int SIZELEN = 12;
- /**
- * The length of the magic field in a header buffer.
- */
- public static final int MAGICLEN = 8;
- /**
- * The length of the modification time field in a header buffer.
- */
- public static final int MODTIMELEN = 12;
- /**
- * The length of the user name field in a header buffer.
- */
- public static final int UNAMELEN = 32;
- /**
- * The length of the group name field in a header buffer.
- */
- public static final int GNAMELEN = 32;
- /**
- * The length of the devices field in a header buffer.
- */
- public static final int DEVLEN = 8;
-
- /**
- * LF_ constants represent the "link flag" of an entry, or more commonly,
- * the "entry type". This is the "old way" of indicating a normal file.
- */
- public static final byte LF_OLDNORM = 0;
- /**
- * Normal file type.
- */
- public static final byte LF_NORMAL = (byte) '0';
- /**
- * Link file type.
- */
- public static final byte LF_LINK = (byte) '1';
- /**
- * Symbolic link file type.
- */
- public static final byte LF_SYMLINK = (byte) '2';
- /**
- * Character device file type.
- */
- public static final byte LF_CHR = (byte) '3';
- /**
- * Block device file type.
- */
- public static final byte LF_BLK = (byte) '4';
- /**
- * Directory file type.
- */
- public static final byte LF_DIR = (byte) '5';
- /**
- * FIFO (pipe) file type.
- */
- public static final byte LF_FIFO = (byte) '6';
- /**
- * Contiguous file type.
- */
- public static final byte LF_CONTIG = (byte) '7';
-
- /**
- * The magic tag representing a POSIX tar archive.
- */
- public static final String TMAGIC = "ustar";
-
- /**
- * The magic tag representing a GNU tar archive.
- */
- public static final String GNU_TMAGIC = "ustar ";
-
- /**
- * The entry's name.
- */
- public StringBuffer name;
- /**
- * The entry's permission mode.
- */
- public int mode;
- /**
- * The entry's user id.
- */
- public int userId;
- /**
- * The entry's group id.
- */
- public int groupId;
- /**
- * The entry's size.
- */
- public long size;
- /**
- * The entry's modification time.
- */
- public long modTime;
- /**
- * The entry's checksum.
- */
- public int checkSum;
- /**
- * The entry's link flag.
- */
- public byte linkFlag;
- /**
- * The entry's link name.
- */
- public StringBuffer linkName;
- /**
- * The entry's magic tag.
- */
- public StringBuffer magic;
- /**
- * The entry's user name.
- */
- public StringBuffer userName;
- /**
- * The entry's group name.
- */
- public StringBuffer groupName;
- /**
- * The entry's major device number.
- */
- public int devMajor;
- /**
- * The entry's minor device number.
- */
- public int devMinor;
-
-
- public
- TarHeader()
- {
- this.magic = new StringBuffer( TarHeader.TMAGIC );
-
- this.name = new StringBuffer();
- this.linkName = new StringBuffer();
-
- String user =
- System.getProperty( "user.name", "" );
-
- if ( user.length() > 31 )
- user = user.substring( 0, 31 );
-
- this.userId = 0;
- this.groupId = 0;
- this.userName = new StringBuffer( user );
- this.groupName = new StringBuffer( "" );
- }
-
- /**
- * TarHeaders can be cloned.
- */
- public Object
- clone()
- {
- TarHeader hdr = null;
-
- try {
- hdr = (TarHeader) super.clone();
-
- hdr.name =
- (this.name == null ) ? null
- : new StringBuffer( this.name.toString() );
- hdr.mode = this.mode;
- hdr.userId = this.userId;
- hdr.groupId = this.groupId;
- hdr.size = this.size;
- hdr.modTime = this.modTime;
- hdr.checkSum = this.checkSum;
- hdr.linkFlag = this.linkFlag;
- hdr.linkName =
- (this.linkName == null ) ? null
- : new StringBuffer( this.linkName.toString() );
- hdr.magic =
- (this.magic == null ) ? null
- : new StringBuffer( this.magic.toString() );
- hdr.userName =
- (this.userName == null ) ? null
- : new StringBuffer( this.userName.toString() );
- hdr.groupName =
- (this.groupName == null ) ? null
- : new StringBuffer( this.groupName.toString() );
- hdr.devMajor = this.devMajor;
- hdr.devMinor = this.devMinor;
- }
- catch ( CloneNotSupportedException ex )
- {
- ex.printStackTrace();
- }
-
- return hdr;
- }
-
- /**
- * Get the name of this entry.
- *
- * @return Teh entry's name.
- */
- public String
- getName()
- {
- return this.name.toString();
- }
-
- /**
- * Parse an octal string from a header buffer. This is used for the
- * file permission mode value.
- *
- * @param header The header buffer from which to parse.
- * @param offset The offset into the buffer from which to parse.
- * @param length The number of header bytes to parse.
- * @return The long value of the octal string.
- */
- public static long
- parseOctal( byte[] header, int offset, int length )
- throws InvalidHeaderException
- {
- long result = 0;
- boolean stillPadding = true;
-
- int end = offset + length;
- for ( int i = offset ; i < end ; ++i )
- {
- if ( header[i] == 0 )
- break;
-
- if ( header[i] == (byte) ' ' || header[i] == '0' )
- {
- if ( stillPadding )
- continue;
-
- if ( header[i] == (byte) ' ' )
- break;
- }
-
- stillPadding = false;
-
- result =
- (result << 3)
- + (header[i] - '0');
- }
-
- return result;
- }
-
- /**
- * Parse an entry name from a header buffer.
- *
- * @param header The header buffer from which to parse.
- * @param offset The offset into the buffer from which to parse.
- * @param length The number of header bytes to parse.
- * @return The header's entry name.
- */
- public static StringBuffer
- parseName( byte[] header, int offset, int length )
- throws InvalidHeaderException
- {
- StringBuffer result = new StringBuffer( length );
-
- int end = offset + length;
- for ( int i = offset ; i < end ; ++i )
- {
- if ( header[i] == 0 )
- break;
- result.append( (char)header[i] );
- }
-
- return result;
- }
-
- /**
- * Determine the number of bytes in an entry name.
- *
- * @param header The header buffer from which to parse.
- * @param offset The offset into the buffer from which to parse.
- * @param length The number of header bytes to parse.
- * @return The number of bytes in a header's entry name.
- */
- public static int
- getNameBytes( StringBuffer name, byte[] buf, int offset, int length )
- {
- int i;
-
- for ( i = 0 ; i < length && i < name.length() ; ++i )
- {
- buf[ offset + i ] = (byte) name.charAt( i );
- }
-
- for ( ; i < length ; ++i )
- {
- buf[ offset + i ] = 0;
- }
-
- return offset + length;
- }
-
- /**
- * Parse an octal integer from a header buffer.
- *
- * @param header The header buffer from which to parse.
- * @param offset The offset into the buffer from which to parse.
- * @param length The number of header bytes to parse.
- * @return The integer value of the octal bytes.
- */
- public static int
- getOctalBytes( long value, byte[] buf, int offset, int length )
- {
- byte[] result = new byte[ length ];
-
- int idx = length - 1;
-
- buf[ offset + idx ] = 0;
- --idx;
- buf[ offset + idx ] = (byte) ' ';
- --idx;
-
- if ( value == 0 )
- {
- buf[ offset + idx ] = (byte) '0';
- --idx;
- }
- else
- {
- for ( long val = value ; idx >= 0 && val > 0 ; --idx )
- {
- buf[ offset + idx ] = (byte)
- ( (byte) '0' + (byte) (val & 7) );
- val = val >> 3;
- }
- }
-
- for ( ; idx >= 0 ; --idx )
- {
- buf[ offset + idx ] = (byte) ' ';
- }
-
- return offset + length;
- }
-
- /**
- * Parse an octal long integer from a header buffer.
- *
- * @param header The header buffer from which to parse.
- * @param offset The offset into the buffer from which to parse.
- * @param length The number of header bytes to parse.
- * @return The long value of the octal bytes.
- */
- public static int
- getLongOctalBytes( long value, byte[] buf, int offset, int length )
- {
- byte[] temp = new byte[ length + 1 ];
- TarHeader.getOctalBytes( value, temp, 0, length + 1 );
- System.arraycopy( temp, 0, buf, offset, length );
- return offset + length;
- }
-
- /**
- * Parse the checksum octal integer from a header buffer.
- *
- * @param header The header buffer from which to parse.
- * @param offset The offset into the buffer from which to parse.
- * @param length The number of header bytes to parse.
- * @return The integer value of the entry's checksum.
- */
- public static int
- getCheckSumOctalBytes( long value, byte[] buf, int offset, int length )
- {
- TarHeader.getOctalBytes( value, buf, offset, length );
- buf[ offset + length - 1 ] = (byte) ' ';
- buf[ offset + length - 2 ] = 0;
- return offset + length;
- }
-
- }
-
+/*
+** Authored by Timothy Gerard Endres
+** <mailto:time at gjt.org> <http://www.trustice.com>
+**
+** This work has been placed into the public domain.
+** You may use this work in any way and for any purpose you wish.
+**
+** THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND,
+** NOT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR
+** OF THIS SOFTWARE, ASSUMES _NO_ RESPONSIBILITY FOR ANY
+** CONSEQUENCE RESULTING FROM THE USE, MODIFICATION, OR
+** REDISTRIBUTION OF THIS SOFTWARE.
+**
+*/
+
+package installer;
+
+/**
+ * This class encapsulates the Tar Entry Header used in Tar Archives.
+ * The class also holds a number of tar constants, used mostly in headers.
+ */
+
+public class
+TarHeader extends Object
+ {
+ /**
+ * The length of the name field in a header buffer.
+ */
+ public static final int NAMELEN = 100;
+ /**
+ * The length of the mode field in a header buffer.
+ */
+ public static final int MODELEN = 8;
+ /**
+ * The length of the user id field in a header buffer.
+ */
+ public static final int UIDLEN = 8;
+ /**
+ * The length of the group id field in a header buffer.
+ */
+ public static final int GIDLEN = 8;
+ /**
+ * The length of the checksum field in a header buffer.
+ */
+ public static final int CHKSUMLEN = 8;
+ /**
+ * The length of the size field in a header buffer.
+ */
+ public static final int SIZELEN = 12;
+ /**
+ * The length of the magic field in a header buffer.
+ */
+ public static final int MAGICLEN = 8;
+ /**
+ * The length of the modification time field in a header buffer.
+ */
+ public static final int MODTIMELEN = 12;
+ /**
+ * The length of the user name field in a header buffer.
+ */
+ public static final int UNAMELEN = 32;
+ /**
+ * The length of the group name field in a header buffer.
+ */
+ public static final int GNAMELEN = 32;
+ /**
+ * The length of the devices field in a header buffer.
+ */
+ public static final int DEVLEN = 8;
+
+ /**
+ * LF_ constants represent the "link flag" of an entry, or more commonly,
+ * the "entry type". This is the "old way" of indicating a normal file.
+ */
+ public static final byte LF_OLDNORM = 0;
+ /**
+ * Normal file type.
+ */
+ public static final byte LF_NORMAL = (byte) '0';
+ /**
+ * Link file type.
+ */
+ public static final byte LF_LINK = (byte) '1';
+ /**
+ * Symbolic link file type.
+ */
+ public static final byte LF_SYMLINK = (byte) '2';
+ /**
+ * Character device file type.
+ */
+ public static final byte LF_CHR = (byte) '3';
+ /**
+ * Block device file type.
+ */
+ public static final byte LF_BLK = (byte) '4';
+ /**
+ * Directory file type.
+ */
+ public static final byte LF_DIR = (byte) '5';
+ /**
+ * FIFO (pipe) file type.
+ */
+ public static final byte LF_FIFO = (byte) '6';
+ /**
+ * Contiguous file type.
+ */
+ public static final byte LF_CONTIG = (byte) '7';
+
+ /**
+ * The magic tag representing a POSIX tar archive.
+ */
+ public static final String TMAGIC = "ustar";
+
+ /**
+ * The magic tag representing a GNU tar archive.
+ */
+ public static final String GNU_TMAGIC = "ustar ";
+
+ /**
+ * The entry's name.
+ */
+ public StringBuffer name;
+ /**
+ * The entry's permission mode.
+ */
+ public int mode;
+ /**
+ * The entry's user id.
+ */
+ public int userId;
+ /**
+ * The entry's group id.
+ */
+ public int groupId;
+ /**
+ * The entry's size.
+ */
+ public long size;
+ /**
+ * The entry's modification time.
+ */
+ public long modTime;
+ /**
+ * The entry's checksum.
+ */
+ public int checkSum;
+ /**
+ * The entry's link flag.
+ */
+ public byte linkFlag;
+ /**
+ * The entry's link name.
+ */
+ public StringBuffer linkName;
+ /**
+ * The entry's magic tag.
+ */
+ public StringBuffer magic;
+ /**
+ * The entry's user name.
+ */
+ public StringBuffer userName;
+ /**
+ * The entry's group name.
+ */
+ public StringBuffer groupName;
+ /**
+ * The entry's major device number.
+ */
+ public int devMajor;
+ /**
+ * The entry's minor device number.
+ */
+ public int devMinor;
+
+
+ public
+ TarHeader()
+ {
+ this.magic = new StringBuffer( TarHeader.TMAGIC );
+
+ this.name = new StringBuffer();
+ this.linkName = new StringBuffer();
+
+ String user =
+ System.getProperty( "user.name", "" );
+
+ if ( user.length() > 31 )
+ user = user.substring( 0, 31 );
+
+ this.userId = 0;
+ this.groupId = 0;
+ this.userName = new StringBuffer( user );
+ this.groupName = new StringBuffer( "" );
+ }
+
+ /**
+ * TarHeaders can be cloned.
+ */
+ public Object
+ clone()
+ {
+ TarHeader hdr = null;
+
+ try {
+ hdr = (TarHeader) super.clone();
+
+ hdr.name =
+ (this.name == null ) ? null
+ : new StringBuffer( this.name.toString() );
+ hdr.mode = this.mode;
+ hdr.userId = this.userId;
+ hdr.groupId = this.groupId;
+ hdr.size = this.size;
+ hdr.modTime = this.modTime;
+ hdr.checkSum = this.checkSum;
+ hdr.linkFlag = this.linkFlag;
+ hdr.linkName =
+ (this.linkName == null ) ? null
+ : new StringBuffer( this.linkName.toString() );
+ hdr.magic =
+ (this.magic == null ) ? null
+ : new StringBuffer( this.magic.toString() );
+ hdr.userName =
+ (this.userName == null ) ? null
+ : new StringBuffer( this.userName.toString() );
+ hdr.groupName =
+ (this.groupName == null ) ? null
+ : new StringBuffer( this.groupName.toString() );
+ hdr.devMajor = this.devMajor;
+ hdr.devMinor = this.devMinor;
+ }
+ catch ( CloneNotSupportedException ex )
+ {
+ ex.printStackTrace();
+ }
+
+ return hdr;
+ }
+
+ /**
+ * Get the name of this entry.
+ *
+ * @return Teh entry's name.
+ */
+ public String
+ getName()
+ {
+ return this.name.toString();
+ }
+
+ /**
+ * Parse an octal string from a header buffer. This is used for the
+ * file permission mode value.
+ *
+ * @param header The header buffer from which to parse.
+ * @param offset The offset into the buffer from which to parse.
+ * @param length The number of header bytes to parse.
+ * @return The long value of the octal string.
+ */
+ public static long
+ parseOctal( byte[] header, int offset, int length )
+ throws InvalidHeaderException
+ {
+ long result = 0;
+ boolean stillPadding = true;
+
+ int end = offset + length;
+ for ( int i = offset ; i < end ; ++i )
+ {
+ if ( header[i] == 0 )
+ break;
+
+ if ( header[i] == (byte) ' ' || header[i] == '0' )
+ {
+ if ( stillPadding )
+ continue;
+
+ if ( header[i] == (byte) ' ' )
+ break;
+ }
+
+ stillPadding = false;
+
+ result =
+ (result << 3)
+ + (header[i] - '0');
+ }
+
+ return result;
+ }
+
+ /**
+ * Parse an entry name from a header buffer.
+ *
+ * @param header The header buffer from which to parse.
+ * @param offset The offset into the buffer from which to parse.
+ * @param length The number of header bytes to parse.
+ * @return The header's entry name.
+ */
+ public static StringBuffer
+ parseName( byte[] header, int offset, int length )
+ throws InvalidHeaderException
+ {
+ StringBuffer result = new StringBuffer( length );
+
+ int end = offset + length;
+ for ( int i = offset ; i < end ; ++i )
+ {
+ if ( header[i] == 0 )
+ break;
+ result.append( (char)header[i] );
+ }
+
+ return result;
+ }
+
+ /**
+ * Determine the number of bytes in an entry name.
+ *
+ * @param header The header buffer from which to parse.
+ * @param offset The offset into the buffer from which to parse.
+ * @param length The number of header bytes to parse.
+ * @return The number of bytes in a header's entry name.
+ */
+ public static int
+ getNameBytes( StringBuffer name, byte[] buf, int offset, int length )
+ {
+ int i;
+
+ for ( i = 0 ; i < length && i < name.length() ; ++i )
+ {
+ buf[ offset + i ] = (byte) name.charAt( i );
+ }
+
+ for ( ; i < length ; ++i )
+ {
+ buf[ offset + i ] = 0;
+ }
+
+ return offset + length;
+ }
+
+ /**
+ * Parse an octal integer from a header buffer.
+ *
+ * @param header The header buffer from which to parse.
+ * @param offset The offset into the buffer from which to parse.
+ * @param length The number of header bytes to parse.
+ * @return The integer value of the octal bytes.
+ */
+ public static int
+ getOctalBytes( long value, byte[] buf, int offset, int length )
+ {
+ byte[] result = new byte[ length ];
+
+ int idx = length - 1;
+
+ buf[ offset + idx ] = 0;
+ --idx;
+ buf[ offset + idx ] = (byte) ' ';
+ --idx;
+
+ if ( value == 0 )
+ {
+ buf[ offset + idx ] = (byte) '0';
+ --idx;
+ }
+ else
+ {
+ for ( long val = value ; idx >= 0 && val > 0 ; --idx )
+ {
+ buf[ offset + idx ] = (byte)
+ ( (byte) '0' + (byte) (val & 7) );
+ val = val >> 3;
+ }
+ }
+
+ for ( ; idx >= 0 ; --idx )
+ {
+ buf[ offset + idx ] = (byte) ' ';
+ }
+
+ return offset + length;
+ }
+
+ /**
+ * Parse an octal long integer from a header buffer.
+ *
+ * @param header The header buffer from which to parse.
+ * @param offset The offset into the buffer from which to parse.
+ * @param length The number of header bytes to parse.
+ * @return The long value of the octal bytes.
+ */
+ public static int
+ getLongOctalBytes( long value, byte[] buf, int offset, int length )
+ {
+ byte[] temp = new byte[ length + 1 ];
+ TarHeader.getOctalBytes( value, temp, 0, length + 1 );
+ System.arraycopy( temp, 0, buf, offset, length );
+ return offset + length;
+ }
+
+ /**
+ * Parse the checksum octal integer from a header buffer.
+ *
+ * @param header The header buffer from which to parse.
+ * @param offset The offset into the buffer from which to parse.
+ * @param length The number of header bytes to parse.
+ * @return The integer value of the entry's checksum.
+ */
+ public static int
+ getCheckSumOctalBytes( long value, byte[] buf, int offset, int length )
+ {
+ TarHeader.getOctalBytes( value, buf, offset, length );
+ buf[ offset + length - 1 ] = (byte) ' ';
+ buf[ offset + length - 2 ] = 0;
+ return offset + length;
+ }
+
+ }
+
diff --git a/jEdit/installer/TarInputStream.java b/jEdit/installer/TarInputStream.java
index 495381f..8b9ecbc 100644
--- a/jEdit/installer/TarInputStream.java
+++ b/jEdit/installer/TarInputStream.java
@@ -1,519 +1,519 @@
-/*
-** Authored by Timothy Gerard Endres
-** <mailto:time at gjt.org> <http://www.trustice.com>
-**
-** This work has been placed into the public domain.
-** You may use this work in any way and for any purpose you wish.
-**
-** THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND,
-** NOT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR
-** OF THIS SOFTWARE, ASSUMES _NO_ RESPONSIBILITY FOR ANY
-** CONSEQUENCE RESULTING FROM THE USE, MODIFICATION, OR
-** REDISTRIBUTION OF THIS SOFTWARE.
-**
-*/
-
-package installer;
-
-import java.io.*;
-
-
-/**
- * The TarInputStream reads a UNIX tar archive as an InputStream.
- * methods are provided to position at each successive entry in
- * the archive, and the read each entry as a normal input stream
- * using read().
- *
- * @version $Revision: 12504 $
- * @author Timothy Gerard Endres,
- * <a href="mailto:time at gjt.org">time at trustice.com</a>.
- * @see TarBuffer
- * @see TarHeader
- * @see TarEntry
- */
-
-
-public
-class TarInputStream
-extends FilterInputStream
- {
- protected boolean debug;
- protected boolean hasHitEOF;
-
- protected int entrySize;
- protected int entryOffset;
-
- protected byte[] oneBuf;
- protected byte[] readBuf;
-
- protected TarBuffer buffer;
-
- protected TarEntry currEntry;
-
- protected EntryFactory eFactory;
-
-
- public
- TarInputStream( InputStream is )
- {
- this( is, TarBuffer.DEFAULT_BLKSIZE, TarBuffer.DEFAULT_RCDSIZE );
- }
-
- public
- TarInputStream( InputStream is, int blockSize )
- {
- this( is, blockSize, TarBuffer.DEFAULT_RCDSIZE );
- }
-
- public
- TarInputStream( InputStream is, int blockSize, int recordSize )
- {
- super( is );
-
- this.buffer = new TarBuffer( is, blockSize, recordSize );
-
- this.readBuf = null;
- this.oneBuf = new byte[1];
- this.debug = false;
- this.hasHitEOF = false;
- this.eFactory = null;
- }
-
- /**
- * Sets the debugging flag.
- *
- * @param debugF True to turn on debugging.
- */
- public void
- setDebug( boolean debugF )
- {
- this.debug = debugF;
- }
-
- /**
- * Sets the debugging flag.
- *
- * @param debugF True to turn on debugging.
- */
- public void
- setEntryFactory( EntryFactory factory )
- {
- this.eFactory = factory;
- }
-
- /**
- * Sets the debugging flag in this stream's TarBuffer.
- *
- * @param debugF True to turn on debugging.
- */
- public void
- setBufferDebug( boolean debug )
- {
- this.buffer.setDebug( debug );
- }
-
- /**
- * Closes this stream. Calls the TarBuffer's close() method.
- */
- public void
- close()
- throws IOException
- {
- this.buffer.close();
- }
-
- /**
- * Get the record size being used by this stream's TarBuffer.
- *
- * @return The TarBuffer record size.
- */
- public int
- getRecordSize()
- {
- return this.buffer.getRecordSize();
- }
-
- /**
- * Get the available data that can be read from the current
- * entry in the archive. This does not indicate how much data
- * is left in the entire archive, only in the current entry.
- * This value is determined from the entry's size header field
- * and the amount of data already read from the current entry.
- *
- *
- * @return The number of available bytes for the current entry.
- */
- public int
- available()
- throws IOException
- {
- return this.entrySize - this.entryOffset;
- }
-
- /**
- * Skip bytes in the input buffer. This skips bytes in the
- * current entry's data, not the entire archive, and will
- * stop at the end of the current entry's data if the number
- * to skip extends beyond that point.
- *
- * @param numToSkip The number of bytes to skip.
- */
- public void
- skip( int numToSkip )
- throws IOException
- {
- // REVIEW
- // This is horribly inefficient, but it ensures that we
- // properly skip over bytes via the TarBuffer...
- //
-
- byte[] skipBuf = new byte[ 8 * 1024 ];
-
- for ( int num = numToSkip ; num > 0 ; )
- {
- int numRead =
- this.read( skipBuf, 0,
- ( num > skipBuf.length ? skipBuf.length : num ) );
-
- if ( numRead == -1 )
- break;
-
- num -= numRead;
- }
- }
-
- /**
- * Since we do not support marking just yet, we return false.
- *
- * @return False.
- */
- public boolean
- markSupported()
- {
- return false;
- }
-
- /**
- * Since we do not support marking just yet, we do nothing.
- *
- * @param markLimit The limit to mark.
- */
- public void
- mark( int markLimit )
- {
- }
-
- /**
- * Since we do not support marking just yet, we do nothing.
- */
- public void
- reset()
- {
- }
-
- /**
- * Get the next entry in this tar archive. This will skip
- * over any remaining data in the current entry, if there
- * is one, and place the input stream at the header of the
- * next entry, and read the header and instantiate a new
- * TarEntry from the header bytes and return that entry.
- * If there are no more entries in the archive, null will
- * be returned to indicate that the end of the archive has
- * been reached.
- *
- * @return The next TarEntry in the archive, or null.
- */
- public TarEntry
- getNextEntry()
- throws IOException
- {
- if ( this.hasHitEOF )
- return null;
-
- if ( this.currEntry != null )
- {
- int numToSkip = this.entrySize - this.entryOffset;
-
- if ( this.debug )
- System.err.println
- ( "TarInputStream: SKIP currENTRY '"
- + this.currEntry.getName() + "' SZ "
- + this.entrySize + " OFF " + this.entryOffset
- + " skipping " + numToSkip + " bytes" );
-
- if ( numToSkip > 0 )
- {
- this.skip( numToSkip );
- }
-
- this.readBuf = null;
- }
-
- byte[] headerBuf = this.buffer.readRecord();
-
- if ( headerBuf == null )
- {
- if ( this.debug )
- {
- System.err.println( "READ NULL RECORD" );
- }
-
- this.hasHitEOF = true;
- }
- else if ( this.buffer.isEOFRecord( headerBuf ) )
- {
- if ( this.debug )
- {
- System.err.println( "READ EOF RECORD" );
- }
-
- this.hasHitEOF = true;
- }
-
- if ( this.hasHitEOF )
- {
- this.currEntry = null;
- }
- else
- {
- try {
- if ( this.eFactory == null )
- {
- this.currEntry = new TarEntry( headerBuf );
- }
- else
- {
- this.currEntry =
- this.eFactory.createEntry( headerBuf );
- }
-
- if ( ! ( headerBuf[257] == 'u' && headerBuf[258] == 's'
- && headerBuf[259] == 't' && headerBuf[260] == 'a'
- && headerBuf[261] == 'r' ) )
- {
- throw new InvalidHeaderException
- ( "header magic is not 'ustar', but '"
- + headerBuf[257] + headerBuf[258] + headerBuf[259]
- + headerBuf[260] + headerBuf[261] + "', or (dec) "
- + ((int)headerBuf[257]) + ", "
- + ((int)headerBuf[258]) + ", "
- + ((int)headerBuf[259]) + ", "
- + ((int)headerBuf[260]) + ", "
- + ((int)headerBuf[261]) );
- }
-
- if ( this.debug )
- System.err.println
- ( "TarInputStream: SET CURRENTRY '"
- + this.currEntry.getName()
- + "' size = " + this.currEntry.getSize() );
-
- this.entryOffset = 0;
- // REVIEW How do we resolve this discrepancy?!
- this.entrySize = (int) this.currEntry.getSize();
- }
- catch ( InvalidHeaderException ex )
- {
- this.entrySize = 0;
- this.entryOffset = 0;
- this.currEntry = null;
- throw new InvalidHeaderException
- ( "bad header in block "
- + this.buffer.getCurrentBlockNum()
- + " record "
- + this.buffer.getCurrentRecordNum()
- + ", " + ex.getMessage() );
- }
- }
-
- return this.currEntry;
- }
-
- /**
- * Reads a byte from the current tar archive entry.
- *
- * This method simply calls read( byte[], int, int ).
- *
- * @return The byte read, or -1 at EOF.
- */
- public int
- read()
- throws IOException
- {
- int num = this.read( this.oneBuf, 0, 1 );
- if ( num == -1 )
- return num;
- else
- return this.oneBuf[0];
- }
-
- /**
- * Reads bytes from the current tar archive entry.
- *
- * This method simply calls read( byte[], int, int ).
- *
- * @param buf The buffer into which to place bytes read.
- * @return The number of bytes read, or -1 at EOF.
- */
- public int
- read( byte[] buf )
- throws IOException
- {
- return this.read( buf, 0, buf.length );
- }
-
- /**
- * Reads bytes from the current tar archive entry.
- *
- * This method is aware of the boundaries of the current
- * entry in the archive and will deal with them as if they
- * were this stream's start and EOF.
- *
- * @param buf The buffer into which to place bytes read.
- * @param offset The offset at which to place bytes read.
- * @param numToRead The number of bytes to read.
- * @return The number of bytes read, or -1 at EOF.
- */
- public int
- read( byte[] buf, int offset, int numToRead )
- throws IOException
- {
- int totalRead = 0;
-
- if ( this.entryOffset >= this.entrySize )
- return -1;
-
- if ( (numToRead + this.entryOffset) > this.entrySize )
- {
- numToRead = (this.entrySize - this.entryOffset);
- }
-
- if ( this.readBuf != null )
- {
- int sz = ( numToRead > this.readBuf.length )
- ? this.readBuf.length : numToRead;
-
- System.arraycopy( this.readBuf, 0, buf, offset, sz );
-
- if ( sz >= this.readBuf.length )
- {
- this.readBuf = null;
- }
- else
- {
- int newLen = this.readBuf.length - sz;
- byte[] newBuf = new byte[ newLen ];
- System.arraycopy( this.readBuf, sz, newBuf, 0, newLen );
- this.readBuf = newBuf;
- }
-
- totalRead += sz;
- numToRead -= sz;
- offset += sz;
- }
-
- for ( ; numToRead > 0 ; )
- {
- byte[] rec = this.buffer.readRecord();
- if ( rec == null )
- {
- // Unexpected EOF!
- throw new IOException
- ( "unexpected EOF with " + numToRead + " bytes unread" );
- }
-
- int sz = numToRead;
- int recLen = rec.length;
-
- if ( recLen > sz )
- {
- System.arraycopy( rec, 0, buf, offset, sz );
- this.readBuf = new byte[ recLen - sz ];
- System.arraycopy( rec, sz, this.readBuf, 0, recLen - sz );
- }
- else
- {
- sz = recLen;
- System.arraycopy( rec, 0, buf, offset, recLen );
- }
-
- totalRead += sz;
- numToRead -= sz;
- offset += sz;
- }
-
- this.entryOffset += totalRead;
-
- return totalRead;
- }
-
- /**
- * Copies the contents of the current tar archive entry directly into
- * an output stream.
- *
- * @param out The OutputStream into which to write the entry's data.
- */
- public void
- copyEntryContents( OutputStream out )
- throws IOException
- {
- byte[] buf = new byte[ 32 * 1024 ];
-
- for ( ; ; )
- {
- int numRead = this.read( buf, 0, buf.length );
- if ( numRead == -1 )
- break;
- out.write( buf, 0, numRead );
- }
- }
-
- /**
- * This interface is provided, with the method setEntryFactory(), to allow
- * the programmer to have their own TarEntry subclass instantiated for the
- * entries return from getNextEntry().
- */
-
- public
- interface EntryFactory
- {
- public TarEntry
- createEntry( String name );
-
- public TarEntry
- createEntry( File path )
- throws InvalidHeaderException;
-
- public TarEntry
- createEntry( byte[] headerBuf )
- throws InvalidHeaderException;
- }
-
- public
- class EntryAdapter
- implements EntryFactory
- {
- public TarEntry
- createEntry( String name )
- {
- return new TarEntry( name );
- }
-
- public TarEntry
- createEntry( File path )
- throws InvalidHeaderException
- {
- return new TarEntry( path );
- }
-
- public TarEntry
- createEntry( byte[] headerBuf )
- throws InvalidHeaderException
- {
- return new TarEntry( headerBuf );
- }
- }
-
- }
-
-
+/*
+** Authored by Timothy Gerard Endres
+** <mailto:time at gjt.org> <http://www.trustice.com>
+**
+** This work has been placed into the public domain.
+** You may use this work in any way and for any purpose you wish.
+**
+** THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND,
+** NOT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR
+** OF THIS SOFTWARE, ASSUMES _NO_ RESPONSIBILITY FOR ANY
+** CONSEQUENCE RESULTING FROM THE USE, MODIFICATION, OR
+** REDISTRIBUTION OF THIS SOFTWARE.
+**
+*/
+
+package installer;
+
+import java.io.*;
+
+
+/**
+ * The TarInputStream reads a UNIX tar archive as an InputStream.
+ * methods are provided to position at each successive entry in
+ * the archive, and the read each entry as a normal input stream
+ * using read().
+ *
+ * @version $Revision: 12504 $
+ * @author Timothy Gerard Endres,
+ * <a href="mailto:time at gjt.org">time at trustice.com</a>.
+ * @see TarBuffer
+ * @see TarHeader
+ * @see TarEntry
+ */
+
+
+public
+class TarInputStream
+extends FilterInputStream
+ {
+ protected boolean debug;
+ protected boolean hasHitEOF;
+
+ protected int entrySize;
+ protected int entryOffset;
+
+ protected byte[] oneBuf;
+ protected byte[] readBuf;
+
+ protected TarBuffer buffer;
+
+ protected TarEntry currEntry;
+
+ protected EntryFactory eFactory;
+
+
+ public
+ TarInputStream( InputStream is )
+ {
+ this( is, TarBuffer.DEFAULT_BLKSIZE, TarBuffer.DEFAULT_RCDSIZE );
+ }
+
+ public
+ TarInputStream( InputStream is, int blockSize )
+ {
+ this( is, blockSize, TarBuffer.DEFAULT_RCDSIZE );
+ }
+
+ public
+ TarInputStream( InputStream is, int blockSize, int recordSize )
+ {
+ super( is );
+
+ this.buffer = new TarBuffer( is, blockSize, recordSize );
+
+ this.readBuf = null;
+ this.oneBuf = new byte[1];
+ this.debug = false;
+ this.hasHitEOF = false;
+ this.eFactory = null;
+ }
+
+ /**
+ * Sets the debugging flag.
+ *
+ * @param debugF True to turn on debugging.
+ */
+ public void
+ setDebug( boolean debugF )
+ {
+ this.debug = debugF;
+ }
+
+ /**
+ * Sets the debugging flag.
+ *
+ * @param debugF True to turn on debugging.
+ */
+ public void
+ setEntryFactory( EntryFactory factory )
+ {
+ this.eFactory = factory;
+ }
+
+ /**
+ * Sets the debugging flag in this stream's TarBuffer.
+ *
+ * @param debugF True to turn on debugging.
+ */
+ public void
+ setBufferDebug( boolean debug )
+ {
+ this.buffer.setDebug( debug );
+ }
+
+ /**
+ * Closes this stream. Calls the TarBuffer's close() method.
+ */
+ public void
+ close()
+ throws IOException
+ {
+ this.buffer.close();
+ }
+
+ /**
+ * Get the record size being used by this stream's TarBuffer.
+ *
+ * @return The TarBuffer record size.
+ */
+ public int
+ getRecordSize()
+ {
+ return this.buffer.getRecordSize();
+ }
+
+ /**
+ * Get the available data that can be read from the current
+ * entry in the archive. This does not indicate how much data
+ * is left in the entire archive, only in the current entry.
+ * This value is determined from the entry's size header field
+ * and the amount of data already read from the current entry.
+ *
+ *
+ * @return The number of available bytes for the current entry.
+ */
+ public int
+ available()
+ throws IOException
+ {
+ return this.entrySize - this.entryOffset;
+ }
+
+ /**
+ * Skip bytes in the input buffer. This skips bytes in the
+ * current entry's data, not the entire archive, and will
+ * stop at the end of the current entry's data if the number
+ * to skip extends beyond that point.
+ *
+ * @param numToSkip The number of bytes to skip.
+ */
+ public void
+ skip( int numToSkip )
+ throws IOException
+ {
+ // REVIEW
+ // This is horribly inefficient, but it ensures that we
+ // properly skip over bytes via the TarBuffer...
+ //
+
+ byte[] skipBuf = new byte[ 8 * 1024 ];
+
+ for ( int num = numToSkip ; num > 0 ; )
+ {
+ int numRead =
+ this.read( skipBuf, 0,
+ ( num > skipBuf.length ? skipBuf.length : num ) );
+
+ if ( numRead == -1 )
+ break;
+
+ num -= numRead;
+ }
+ }
+
+ /**
+ * Since we do not support marking just yet, we return false.
+ *
+ * @return False.
+ */
+ public boolean
+ markSupported()
+ {
+ return false;
+ }
+
+ /**
+ * Since we do not support marking just yet, we do nothing.
+ *
+ * @param markLimit The limit to mark.
+ */
+ public void
+ mark( int markLimit )
+ {
+ }
+
+ /**
+ * Since we do not support marking just yet, we do nothing.
+ */
+ public void
+ reset()
+ {
+ }
+
+ /**
+ * Get the next entry in this tar archive. This will skip
+ * over any remaining data in the current entry, if there
+ * is one, and place the input stream at the header of the
+ * next entry, and read the header and instantiate a new
+ * TarEntry from the header bytes and return that entry.
+ * If there are no more entries in the archive, null will
+ * be returned to indicate that the end of the archive has
+ * been reached.
+ *
+ * @return The next TarEntry in the archive, or null.
+ */
+ public TarEntry
+ getNextEntry()
+ throws IOException
+ {
+ if ( this.hasHitEOF )
+ return null;
+
+ if ( this.currEntry != null )
+ {
+ int numToSkip = this.entrySize - this.entryOffset;
+
+ if ( this.debug )
+ System.err.println
+ ( "TarInputStream: SKIP currENTRY '"
+ + this.currEntry.getName() + "' SZ "
+ + this.entrySize + " OFF " + this.entryOffset
+ + " skipping " + numToSkip + " bytes" );
+
+ if ( numToSkip > 0 )
+ {
+ this.skip( numToSkip );
+ }
+
+ this.readBuf = null;
+ }
+
+ byte[] headerBuf = this.buffer.readRecord();
+
+ if ( headerBuf == null )
+ {
+ if ( this.debug )
+ {
+ System.err.println( "READ NULL RECORD" );
+ }
+
+ this.hasHitEOF = true;
+ }
+ else if ( this.buffer.isEOFRecord( headerBuf ) )
+ {
+ if ( this.debug )
+ {
+ System.err.println( "READ EOF RECORD" );
+ }
+
+ this.hasHitEOF = true;
+ }
+
+ if ( this.hasHitEOF )
+ {
+ this.currEntry = null;
+ }
+ else
+ {
+ try {
+ if ( this.eFactory == null )
+ {
+ this.currEntry = new TarEntry( headerBuf );
+ }
+ else
+ {
+ this.currEntry =
+ this.eFactory.createEntry( headerBuf );
+ }
+
+ if ( ! ( headerBuf[257] == 'u' && headerBuf[258] == 's'
+ && headerBuf[259] == 't' && headerBuf[260] == 'a'
+ && headerBuf[261] == 'r' ) )
+ {
+ throw new InvalidHeaderException
+ ( "header magic is not 'ustar', but '"
+ + headerBuf[257] + headerBuf[258] + headerBuf[259]
+ + headerBuf[260] + headerBuf[261] + "', or (dec) "
+ + ((int)headerBuf[257]) + ", "
+ + ((int)headerBuf[258]) + ", "
+ + ((int)headerBuf[259]) + ", "
+ + ((int)headerBuf[260]) + ", "
+ + ((int)headerBuf[261]) );
+ }
+
+ if ( this.debug )
+ System.err.println
+ ( "TarInputStream: SET CURRENTRY '"
+ + this.currEntry.getName()
+ + "' size = " + this.currEntry.getSize() );
+
+ this.entryOffset = 0;
+ // REVIEW How do we resolve this discrepancy?!
+ this.entrySize = (int) this.currEntry.getSize();
+ }
+ catch ( InvalidHeaderException ex )
+ {
+ this.entrySize = 0;
+ this.entryOffset = 0;
+ this.currEntry = null;
+ throw new InvalidHeaderException
+ ( "bad header in block "
+ + this.buffer.getCurrentBlockNum()
+ + " record "
+ + this.buffer.getCurrentRecordNum()
+ + ", " + ex.getMessage() );
+ }
+ }
+
+ return this.currEntry;
+ }
+
+ /**
+ * Reads a byte from the current tar archive entry.
+ *
+ * This method simply calls read( byte[], int, int ).
+ *
+ * @return The byte read, or -1 at EOF.
+ */
+ public int
+ read()
+ throws IOException
+ {
+ int num = this.read( this.oneBuf, 0, 1 );
+ if ( num == -1 )
+ return num;
+ else
+ return this.oneBuf[0];
+ }
+
+ /**
+ * Reads bytes from the current tar archive entry.
+ *
+ * This method simply calls read( byte[], int, int ).
+ *
+ * @param buf The buffer into which to place bytes read.
+ * @return The number of bytes read, or -1 at EOF.
+ */
+ public int
+ read( byte[] buf )
+ throws IOException
+ {
+ return this.read( buf, 0, buf.length );
+ }
+
+ /**
+ * Reads bytes from the current tar archive entry.
+ *
+ * This method is aware of the boundaries of the current
+ * entry in the archive and will deal with them as if they
+ * were this stream's start and EOF.
+ *
+ * @param buf The buffer into which to place bytes read.
+ * @param offset The offset at which to place bytes read.
+ * @param numToRead The number of bytes to read.
+ * @return The number of bytes read, or -1 at EOF.
+ */
+ public int
+ read( byte[] buf, int offset, int numToRead )
+ throws IOException
+ {
+ int totalRead = 0;
+
+ if ( this.entryOffset >= this.entrySize )
+ return -1;
+
+ if ( (numToRead + this.entryOffset) > this.entrySize )
+ {
+ numToRead = (this.entrySize - this.entryOffset);
+ }
+
+ if ( this.readBuf != null )
+ {
+ int sz = ( numToRead > this.readBuf.length )
+ ? this.readBuf.length : numToRead;
+
+ System.arraycopy( this.readBuf, 0, buf, offset, sz );
+
+ if ( sz >= this.readBuf.length )
+ {
+ this.readBuf = null;
+ }
+ else
+ {
+ int newLen = this.readBuf.length - sz;
+ byte[] newBuf = new byte[ newLen ];
+ System.arraycopy( this.readBuf, sz, newBuf, 0, newLen );
+ this.readBuf = newBuf;
+ }
+
+ totalRead += sz;
+ numToRead -= sz;
+ offset += sz;
+ }
+
+ for ( ; numToRead > 0 ; )
+ {
+ byte[] rec = this.buffer.readRecord();
+ if ( rec == null )
+ {
+ // Unexpected EOF!
+ throw new IOException
+ ( "unexpected EOF with " + numToRead + " bytes unread" );
+ }
+
+ int sz = numToRead;
+ int recLen = rec.length;
+
+ if ( recLen > sz )
+ {
+ System.arraycopy( rec, 0, buf, offset, sz );
+ this.readBuf = new byte[ recLen - sz ];
+ System.arraycopy( rec, sz, this.readBuf, 0, recLen - sz );
+ }
+ else
+ {
+ sz = recLen;
+ System.arraycopy( rec, 0, buf, offset, recLen );
+ }
+
+ totalRead += sz;
+ numToRead -= sz;
+ offset += sz;
+ }
+
+ this.entryOffset += totalRead;
+
+ return totalRead;
+ }
+
+ /**
+ * Copies the contents of the current tar archive entry directly into
+ * an output stream.
+ *
+ * @param out The OutputStream into which to write the entry's data.
+ */
+ public void
+ copyEntryContents( OutputStream out )
+ throws IOException
+ {
+ byte[] buf = new byte[ 32 * 1024 ];
+
+ for ( ; ; )
+ {
+ int numRead = this.read( buf, 0, buf.length );
+ if ( numRead == -1 )
+ break;
+ out.write( buf, 0, numRead );
+ }
+ }
+
+ /**
+ * This interface is provided, with the method setEntryFactory(), to allow
+ * the programmer to have their own TarEntry subclass instantiated for the
+ * entries return from getNextEntry().
+ */
+
+ public
+ interface EntryFactory
+ {
+ public TarEntry
+ createEntry( String name );
+
+ public TarEntry
+ createEntry( File path )
+ throws InvalidHeaderException;
+
+ public TarEntry
+ createEntry( byte[] headerBuf )
+ throws InvalidHeaderException;
+ }
+
+ public
+ class EntryAdapter
+ implements EntryFactory
+ {
+ public TarEntry
+ createEntry( String name )
+ {
+ return new TarEntry( name );
+ }
+
+ public TarEntry
+ createEntry( File path )
+ throws InvalidHeaderException
+ {
+ return new TarEntry( path );
+ }
+
+ public TarEntry
+ createEntry( byte[] headerBuf )
+ throws InvalidHeaderException
+ {
+ return new TarEntry( headerBuf );
+ }
+ }
+
+ }
+
+
diff --git a/jEdit/installer/TarOutputStream.java b/jEdit/installer/TarOutputStream.java
index f5691a7..14de717 100644
--- a/jEdit/installer/TarOutputStream.java
+++ b/jEdit/installer/TarOutputStream.java
@@ -1,330 +1,330 @@
-/*
-** Authored by Timothy Gerard Endres
-** <mailto:time at gjt.org> <http://www.trustice.com>
-**
-** This work has been placed into the public domain.
-** You may use this work in any way and for any purpose you wish.
-**
-** THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND,
-** NOT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR
-** OF THIS SOFTWARE, ASSUMES _NO_ RESPONSIBILITY FOR ANY
-** CONSEQUENCE RESULTING FROM THE USE, MODIFICATION, OR
-** REDISTRIBUTION OF THIS SOFTWARE.
-**
-*/
-
-package installer;
-
-import java.io.*;
-
-
-/**
- * The TarOutputStream writes a UNIX tar archive as an OutputStream.
- * Methods are provided to put entries, and then write their contents
- * by writing to this stream using write().
- *
- *
- * @version $Revision: 12504 $
- * @author Timothy Gerard Endres,
- * <a href="mailto:time at gjt.org">time at trustice.com</a>.
- * @see TarBuffer
- * @see TarHeader
- * @see TarEntry
- */
-
-
-public
-class TarOutputStream
-extends FilterOutputStream
- {
- protected boolean debug;
- protected int currSize;
- protected int currBytes;
- protected byte[] oneBuf;
- protected byte[] recordBuf;
- protected int assemLen;
- protected byte[] assemBuf;
- protected TarBuffer buffer;
-
-
- public
- TarOutputStream( OutputStream os )
- {
- this( os, TarBuffer.DEFAULT_BLKSIZE, TarBuffer.DEFAULT_RCDSIZE );
- }
-
- public
- TarOutputStream( OutputStream os, int blockSize )
- {
- this( os, blockSize, TarBuffer.DEFAULT_RCDSIZE );
- }
-
- public
- TarOutputStream( OutputStream os, int blockSize, int recordSize )
- {
- super( os );
-
- this.buffer = new TarBuffer( os, blockSize, recordSize );
-
- this.debug = false;
- this.assemLen = 0;
- this.assemBuf = new byte[ recordSize ];
- this.recordBuf = new byte[ recordSize ];
- this.oneBuf = new byte[1];
- }
-
- /**
- * Sets the debugging flag.
- *
- * @param debugF True to turn on debugging.
- */
- public void
- setDebug( boolean debugF )
- {
- this.debug = debugF;
- }
-
- /**
- * Sets the debugging flag in this stream's TarBuffer.
- *
- * @param debugF True to turn on debugging.
- */
- public void
- setBufferDebug( boolean debug )
- {
- this.buffer.setDebug( debug );
- }
-
- /**
- * Ends the TAR archive without closing the underlying OutputStream.
- * The result is that the EOF record of nulls is written.
- */
-
- public void
- finish()
- throws IOException
- {
- this.writeEOFRecord();
- }
-
- /**
- * Ends the TAR archive and closes the underlying OutputStream.
- * This means that finish() is called followed by calling the
- * TarBuffer's close().
- */
-
- public void
- close()
- throws IOException
- {
- this.finish();
- this.buffer.close();
- }
-
- /**
- * Get the record size being used by this stream's TarBuffer.
- *
- * @return The TarBuffer record size.
- */
- public int
- getRecordSize()
- {
- return this.buffer.getRecordSize();
- }
-
- /**
- * Put an entry on the output stream. This writes the entry's
- * header record and positions the output stream for writing
- * the contents of the entry. Once this method is called, the
- * stream is ready for calls to write() to write the entry's
- * contents. Once the contents are written, closeEntry()
- * <B>MUST</B> be called to ensure that all buffered data
- * is completely written to the output stream.
- *
- * @param entry The TarEntry to be written to the archive.
- */
- public void
- putNextEntry( TarEntry entry )
- throws IOException
- {
- if ( entry.getHeader().name.length() > TarHeader.NAMELEN )
- throw new InvalidHeaderException
- ( "file name '" + entry.getHeader().name
- + "' is too long ( > "
- + TarHeader.NAMELEN + " bytes )" );
-
- entry.writeEntryHeader( this.recordBuf );
- this.buffer.writeRecord( this.recordBuf );
-
- this.currBytes = 0;
-
- if ( entry.isDirectory() )
- this.currSize = 0;
- else
- this.currSize = (int)entry.getSize();
- }
-
- /**
- * Close an entry. This method MUST be called for all file
- * entries that contain data. The reason is that we must
- * buffer data written to the stream in order to satisfy
- * the buffer's record based writes. Thus, there may be
- * data fragments still being assembled that must be written
- * to the output stream before this entry is closed and the
- * next entry written.
- */
- public void
- closeEntry()
- throws IOException
- {
- if ( this.assemLen > 0 )
- {
- for ( int i = this.assemLen ; i < this.assemBuf.length ; ++i )
- this.assemBuf[i] = 0;
-
- this.buffer.writeRecord( this.assemBuf );
-
- this.currBytes += this.assemLen;
- this.assemLen = 0;
- }
-
- if ( this.currBytes < this.currSize )
- throw new IOException
- ( "entry closed at '" + this.currBytes
- + "' before the '" + this.currSize
- + "' bytes specified in the header were written" );
- }
-
- /**
- * Writes a byte to the current tar archive entry.
- *
- * This method simply calls read( byte[], int, int ).
- *
- * @param b The byte written.
- */
- public void
- write( int b )
- throws IOException
- {
- this.oneBuf[0] = (byte) b;
- this.write( this.oneBuf, 0, 1 );
- }
-
- /**
- * Writes bytes to the current tar archive entry.
- *
- * This method simply calls read( byte[], int, int ).
- *
- * @param wBuf The buffer to write to the archive.
- * @return The number of bytes read, or -1 at EOF.
- */
- public void
- write( byte[] wBuf )
- throws IOException
- {
- this.write( wBuf, 0, wBuf.length );
- }
-
- /**
- * Writes bytes to the current tar archive entry. This method
- * is aware of the current entry and will throw an exception if
- * you attempt to write bytes past the length specified for the
- * current entry. The method is also (painfully) aware of the
- * record buffering required by TarBuffer, and manages buffers
- * that are not a multiple of recordsize in length, including
- * assembling records from small buffers.
- *
- * This method simply calls read( byte[], int, int ).
- *
- * @param wBuf The buffer to write to the archive.
- * @param wOffset The offset in the buffer from which to get bytes.
- * @param numToWrite The number of bytes to write.
- */
- public void
- write( byte[] wBuf, int wOffset, int numToWrite )
- throws IOException
- {
- if ( (this.currBytes + numToWrite) > this.currSize )
- throw new IOException
- ( "request to write '" + numToWrite
- + "' bytes exceeds size in header of '"
- + this.currSize + "' bytes" );
-
- //
- // We have to deal with assembly!!!
- // The programmer can be writing little 32 byte chunks for all
- // we know, and we must assemble complete records for writing.
- // REVIEW Maybe this should be in TarBuffer? Could that help to
- // eliminate some of the buffer copying.
- //
- if ( this.assemLen > 0 )
- {
- if ( (this.assemLen + numToWrite ) >= this.recordBuf.length )
- {
- int aLen = this.recordBuf.length - this.assemLen;
-
- System.arraycopy
- ( this.assemBuf, 0, this.recordBuf, 0, this.assemLen );
-
- System.arraycopy
- ( wBuf, wOffset, this.recordBuf, this.assemLen, aLen );
-
- this.buffer.writeRecord( this.recordBuf );
-
- this.currBytes += this.recordBuf.length;
-
- wOffset += aLen;
- numToWrite -= aLen;
- this.assemLen = 0;
- }
- else // ( (this.assemLen + numToWrite ) < this.recordBuf.length )
- {
- System.arraycopy
- ( wBuf, wOffset, this.assemBuf,
- this.assemLen, numToWrite );
- wOffset += numToWrite;
- this.assemLen += numToWrite;
- numToWrite -= numToWrite;
- }
- }
-
- //
- // When we get here we have EITHER:
- // o An empty "assemble" buffer.
- // o No bytes to write (numToWrite == 0)
- //
-
- for ( ; numToWrite > 0 ; )
- {
- if ( numToWrite < this.recordBuf.length )
- {
- System.arraycopy
- ( wBuf, wOffset, this.assemBuf, this.assemLen, numToWrite );
- this.assemLen += numToWrite;
- break;
- }
-
- this.buffer.writeRecord( wBuf, wOffset );
-
- int num = this.recordBuf.length;
- this.currBytes += num;
- numToWrite -= num;
- wOffset += num;
- }
- }
-
- /**
- * Write an EOF (end of archive) record to the tar archive.
- * An EOF record consists of a record of all zeros.
- */
- private void
- writeEOFRecord()
- throws IOException
- {
- for ( int i = 0 ; i < this.recordBuf.length ; ++i )
- this.recordBuf[i] = 0;
- this.buffer.writeRecord( this.recordBuf );
- }
-
- }
-
+/*
+** Authored by Timothy Gerard Endres
+** <mailto:time at gjt.org> <http://www.trustice.com>
+**
+** This work has been placed into the public domain.
+** You may use this work in any way and for any purpose you wish.
+**
+** THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND,
+** NOT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR
+** OF THIS SOFTWARE, ASSUMES _NO_ RESPONSIBILITY FOR ANY
+** CONSEQUENCE RESULTING FROM THE USE, MODIFICATION, OR
+** REDISTRIBUTION OF THIS SOFTWARE.
+**
+*/
+
+package installer;
+
+import java.io.*;
+
+
+/**
+ * The TarOutputStream writes a UNIX tar archive as an OutputStream.
+ * Methods are provided to put entries, and then write their contents
+ * by writing to this stream using write().
+ *
+ *
+ * @version $Revision: 12504 $
+ * @author Timothy Gerard Endres,
+ * <a href="mailto:time at gjt.org">time at trustice.com</a>.
+ * @see TarBuffer
+ * @see TarHeader
+ * @see TarEntry
+ */
+
+
+public
+class TarOutputStream
+extends FilterOutputStream
+ {
+ protected boolean debug;
+ protected int currSize;
+ protected int currBytes;
+ protected byte[] oneBuf;
+ protected byte[] recordBuf;
+ protected int assemLen;
+ protected byte[] assemBuf;
+ protected TarBuffer buffer;
+
+
+ public
+ TarOutputStream( OutputStream os )
+ {
+ this( os, TarBuffer.DEFAULT_BLKSIZE, TarBuffer.DEFAULT_RCDSIZE );
+ }
+
+ public
+ TarOutputStream( OutputStream os, int blockSize )
+ {
+ this( os, blockSize, TarBuffer.DEFAULT_RCDSIZE );
+ }
+
+ public
+ TarOutputStream( OutputStream os, int blockSize, int recordSize )
+ {
+ super( os );
+
+ this.buffer = new TarBuffer( os, blockSize, recordSize );
+
+ this.debug = false;
+ this.assemLen = 0;
+ this.assemBuf = new byte[ recordSize ];
+ this.recordBuf = new byte[ recordSize ];
+ this.oneBuf = new byte[1];
+ }
+
+ /**
+ * Sets the debugging flag.
+ *
+ * @param debugF True to turn on debugging.
+ */
+ public void
+ setDebug( boolean debugF )
+ {
+ this.debug = debugF;
+ }
+
+ /**
+ * Sets the debugging flag in this stream's TarBuffer.
+ *
+ * @param debugF True to turn on debugging.
+ */
+ public void
+ setBufferDebug( boolean debug )
+ {
+ this.buffer.setDebug( debug );
+ }
+
+ /**
+ * Ends the TAR archive without closing the underlying OutputStream.
+ * The result is that the EOF record of nulls is written.
+ */
+
+ public void
+ finish()
+ throws IOException
+ {
+ this.writeEOFRecord();
+ }
+
+ /**
+ * Ends the TAR archive and closes the underlying OutputStream.
+ * This means that finish() is called followed by calling the
+ * TarBuffer's close().
+ */
+
+ public void
+ close()
+ throws IOException
+ {
+ this.finish();
+ this.buffer.close();
+ }
+
+ /**
+ * Get the record size being used by this stream's TarBuffer.
+ *
+ * @return The TarBuffer record size.
+ */
+ public int
+ getRecordSize()
+ {
+ return this.buffer.getRecordSize();
+ }
+
+ /**
+ * Put an entry on the output stream. This writes the entry's
+ * header record and positions the output stream for writing
+ * the contents of the entry. Once this method is called, the
+ * stream is ready for calls to write() to write the entry's
+ * contents. Once the contents are written, closeEntry()
+ * <B>MUST</B> be called to ensure that all buffered data
+ * is completely written to the output stream.
+ *
+ * @param entry The TarEntry to be written to the archive.
+ */
+ public void
+ putNextEntry( TarEntry entry )
+ throws IOException
+ {
+ if ( entry.getHeader().name.length() > TarHeader.NAMELEN )
+ throw new InvalidHeaderException
+ ( "file name '" + entry.getHeader().name
+ + "' is too long ( > "
+ + TarHeader.NAMELEN + " bytes )" );
+
+ entry.writeEntryHeader( this.recordBuf );
+ this.buffer.writeRecord( this.recordBuf );
+
+ this.currBytes = 0;
+
+ if ( entry.isDirectory() )
+ this.currSize = 0;
+ else
+ this.currSize = (int)entry.getSize();
+ }
+
+ /**
+ * Close an entry. This method MUST be called for all file
+ * entries that contain data. The reason is that we must
+ * buffer data written to the stream in order to satisfy
+ * the buffer's record based writes. Thus, there may be
+ * data fragments still being assembled that must be written
+ * to the output stream before this entry is closed and the
+ * next entry written.
+ */
+ public void
+ closeEntry()
+ throws IOException
+ {
+ if ( this.assemLen > 0 )
+ {
+ for ( int i = this.assemLen ; i < this.assemBuf.length ; ++i )
+ this.assemBuf[i] = 0;
+
+ this.buffer.writeRecord( this.assemBuf );
+
+ this.currBytes += this.assemLen;
+ this.assemLen = 0;
+ }
+
+ if ( this.currBytes < this.currSize )
+ throw new IOException
+ ( "entry closed at '" + this.currBytes
+ + "' before the '" + this.currSize
+ + "' bytes specified in the header were written" );
+ }
+
+ /**
+ * Writes a byte to the current tar archive entry.
+ *
+ * This method simply calls read( byte[], int, int ).
+ *
+ * @param b The byte written.
+ */
+ public void
+ write( int b )
+ throws IOException
+ {
+ this.oneBuf[0] = (byte) b;
+ this.write( this.oneBuf, 0, 1 );
+ }
+
+ /**
+ * Writes bytes to the current tar archive entry.
+ *
+ * This method simply calls read( byte[], int, int ).
+ *
+ * @param wBuf The buffer to write to the archive.
+ * @return The number of bytes read, or -1 at EOF.
+ */
+ public void
+ write( byte[] wBuf )
+ throws IOException
+ {
+ this.write( wBuf, 0, wBuf.length );
+ }
+
+ /**
+ * Writes bytes to the current tar archive entry. This method
+ * is aware of the current entry and will throw an exception if
+ * you attempt to write bytes past the length specified for the
+ * current entry. The method is also (painfully) aware of the
+ * record buffering required by TarBuffer, and manages buffers
+ * that are not a multiple of recordsize in length, including
+ * assembling records from small buffers.
+ *
+ * This method simply calls read( byte[], int, int ).
+ *
+ * @param wBuf The buffer to write to the archive.
+ * @param wOffset The offset in the buffer from which to get bytes.
+ * @param numToWrite The number of bytes to write.
+ */
+ public void
+ write( byte[] wBuf, int wOffset, int numToWrite )
+ throws IOException
+ {
+ if ( (this.currBytes + numToWrite) > this.currSize )
+ throw new IOException
+ ( "request to write '" + numToWrite
+ + "' bytes exceeds size in header of '"
+ + this.currSize + "' bytes" );
+
+ //
+ // We have to deal with assembly!!!
+ // The programmer can be writing little 32 byte chunks for all
+ // we know, and we must assemble complete records for writing.
+ // REVIEW Maybe this should be in TarBuffer? Could that help to
+ // eliminate some of the buffer copying.
+ //
+ if ( this.assemLen > 0 )
+ {
+ if ( (this.assemLen + numToWrite ) >= this.recordBuf.length )
+ {
+ int aLen = this.recordBuf.length - this.assemLen;
+
+ System.arraycopy
+ ( this.assemBuf, 0, this.recordBuf, 0, this.assemLen );
+
+ System.arraycopy
+ ( wBuf, wOffset, this.recordBuf, this.assemLen, aLen );
+
+ this.buffer.writeRecord( this.recordBuf );
+
+ this.currBytes += this.recordBuf.length;
+
+ wOffset += aLen;
+ numToWrite -= aLen;
+ this.assemLen = 0;
+ }
+ else // ( (this.assemLen + numToWrite ) < this.recordBuf.length )
+ {
+ System.arraycopy
+ ( wBuf, wOffset, this.assemBuf,
+ this.assemLen, numToWrite );
+ wOffset += numToWrite;
+ this.assemLen += numToWrite;
+ numToWrite -= numToWrite;
+ }
+ }
+
+ //
+ // When we get here we have EITHER:
+ // o An empty "assemble" buffer.
+ // o No bytes to write (numToWrite == 0)
+ //
+
+ for ( ; numToWrite > 0 ; )
+ {
+ if ( numToWrite < this.recordBuf.length )
+ {
+ System.arraycopy
+ ( wBuf, wOffset, this.assemBuf, this.assemLen, numToWrite );
+ this.assemLen += numToWrite;
+ break;
+ }
+
+ this.buffer.writeRecord( wBuf, wOffset );
+
+ int num = this.recordBuf.length;
+ this.currBytes += num;
+ numToWrite -= num;
+ wOffset += num;
+ }
+ }
+
+ /**
+ * Write an EOF (end of archive) record to the tar archive.
+ * An EOF record consists of a record of all zeros.
+ */
+ private void
+ writeEOFRecord()
+ throws IOException
+ {
+ for ( int i = 0 ; i < this.recordBuf.length ; ++i )
+ this.recordBuf[i] = 0;
+ this.buffer.writeRecord( this.recordBuf );
+ }
+
+ }
+
diff --git a/jEdit/installer/VariableGridLayout.java b/jEdit/installer/VariableGridLayout.java
deleted file mode 100644
index aa841d3..0000000
--- a/jEdit/installer/VariableGridLayout.java
+++ /dev/null
@@ -1,334 +0,0 @@
-/*
- * VariableGridLayout.java - a grid layout manager with variable cell sizes
- *
- * Originally written by Dirk Moebius for the jEdit project. This work has been
- * placed into the public domain. You may use this work in any way and for any
- * purpose you wish.
- *
- * THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, NOT EVEN THE
- * IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE, ASSUMES
- * _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE RESULTING FROM THE USE, MODIFICATION,
- * OR REDISTRIBUTION OF THIS SOFTWARE.
- */
-
-package installer;
-
-
-import java.awt.*;
-
-// This is copied from jEdit's org.gjt.sp.jedit.gui package.
-
-/**
- * The <code>VariableGridLayout</code> class is a layout manager
- * that lays out a container's components in a rectangular grid
- * with variable cell sizes.<p>
- *
- * The container is divided into rectangles, and one component is placed
- * in each rectangle. Each row is as large as the largest component in
- * that row, and each column is as wide as the widest component in
- * that column.<p>
- *
- * This behavior is basically the same as in
- * <code>java.awt.GridLayout</code>, but with different row heights and
- * column widths for each row/column.<p>
- *
- * For example, the following is an applet that lays out six buttons
- * into three rows and two columns:<p>
- *
- * <blockquote><pre>
- * import java.awt.*;
- * import java.applet.Applet;
- * public class ButtonGrid extends Applet {
- * public void init() {
- * setLayout(new VariableGridLayout(VariableGridLayout.FIXED_NUM_COLUMNS, 2));
- * add(new Button("1"));
- * add(new Button("2"));
- * add(new Button("3"));
- * add(new Button("4"));
- * add(new Button("5"));
- * add(new Button("6"));
- * }
- * }
- * </pre></blockquote><p>
- *
- * <b>Programmer's remark:</b> VariableGridLayout could be faster, if it would
- * reside in the package java.awt, because then it could access some
- * package private fields of <code>Container</code> or
- * <code>Component</code>. Instead, it has to call
- * <code>Component.getSize()</code>,
- * which allocates memory on the heap.<p>
- *
- * <b>Todo:</b>
- * <ul>
- * <li>Use alignmentX/Y property if the grid cell is larger than the preferred size of the component.
- * <li>Ability to span components over more than one cell horizontally
- * </ul>
- *
- * @author Dirk Moebius
- * @version 1.0
- * @see java.awt.GridLayout
- */
-public class VariableGridLayout implements LayoutManager2, java.io.Serializable
-{
-
- public static final int FIXED_NUM_ROWS = 1;
- public static final int FIXED_NUM_COLUMNS = 2;
-
-
- public VariableGridLayout(int mode, int size, int hgap, int vgap) {
- if (mode != FIXED_NUM_ROWS && mode != FIXED_NUM_COLUMNS) {
- throw new IllegalArgumentException("illegal mode; value is " + mode);
- }
- if (size <= 0) {
- throw new IllegalArgumentException("size cannot be zero or less; value is " + size);
- }
- if (hgap < 0) {
- throw new IllegalArgumentException("hgap cannot be negative; value is " + hgap);
- }
- if (vgap < 0) {
- throw new IllegalArgumentException("vgap cannot be negative; value is " + vgap);
- }
- this.mode = mode;
- this.size = size;
- this.hgap = hgap;
- this.vgap = vgap;
- }
-
-
- /**
- * Creates a variable grid layout manager with the specified mode
- * and zero horizontal and vertical gap.
- */
- public VariableGridLayout(int mode, int size) {
- this(mode, size, 0, 0);
- }
-
-
- /**
- * Creates a variable grid layout manager with mode FIXED_NUM_ROWS,
- * number of rows == 1 and zero horizontal and vertical gap.
- */
- public VariableGridLayout() {
- this(FIXED_NUM_ROWS, 1, 0, 0);
- }
-
-
- /**
- * Not used in this class.
- */
- public void addLayoutComponent(String name, Component component) { }
-
-
- /**
- * Not used in this class.
- */
- public void addLayoutComponent(Component component, Object constraints) { }
-
-
- /**
- * Not used in this class.
- */
- public void removeLayoutComponent(Component component) { }
-
-
- /**
- * Always returns 0.5.
- */
- public float getLayoutAlignmentX(Container container) {
- return 0.5f;
- }
-
-
- /**
- * Always returns 0.5.
- */
- public float getLayoutAlignmentY(Container container) {
- return 0.5f;
- }
-
-
- public Dimension preferredLayoutSize(Container parent) {
- return getLayoutSize(parent, 2);
- }
-
-
- public Dimension minimumLayoutSize(Container parent) {
- return getLayoutSize(parent, 0);
- }
-
-
- public Dimension maximumLayoutSize(Container parent) {
- return getLayoutSize(parent, 1);
- }
-
-
- public void layoutContainer(Container parent) {
- synchronized (parent.getTreeLock()) {
- update(parent);
-
- int ncomponents = parent.getComponentCount();
-
- if (ncomponents == 0) {
- return;
- }
-
- // Pass 1: compute preferred row heights / column widths
- int total_height = 0;
- for (int r = 0, i = 0; r < nrows; r++) {
- for (int c = 0; c < ncols; c++, i++) {
- if (i < ncomponents) {
- Dimension d = parent.getComponent(i).getPreferredSize();
- row_heights[r] = Math.max(row_heights[r], d.height);
- col_widths[c] = Math.max(col_widths[c], d.width);
- } else {
- break;
- }
- }
- total_height += row_heights[r];
- }
-
- int total_width = 0;
- for (int c = 0; c < ncols; c++) {
- total_width += col_widths[c];
- }
-
- // Pass 2: redistribute free space
- Dimension parent_size = parent.getSize();
- Insets insets = parent.getInsets();
- int free_height = parent_size.height - insets.top - insets.bottom - (nrows - 1) * vgap;
- int free_width = parent_size.width - insets.left - insets.right - (ncols - 1) * hgap;
-
- if (total_height != free_height) {
- double dy = (double)free_height / (double)total_height;
- for (int r = 0; r < nrows; r++) {
- row_heights[r] = (int) ((double)row_heights[r] * dy);
- }
- }
-
- if (total_width != free_width) {
- double dx = ((double)free_width) / ((double)total_width);
- for (int c = 0; c < ncols; c++) {
- col_widths[c] = (int) ((double)col_widths[c] * dx);
- }
- }
-
- // Pass 3: layout components
- for (int r = 0, y = insets.top, i = 0; r < nrows; y += row_heights[r] + vgap, r++) {
- for (int c = 0, x = insets.left; c < ncols; x += col_widths[c] + hgap, c++, i++) {
- if (i < ncomponents) {
- parent.getComponent(i).setBounds(x, y, col_widths[c], row_heights[r]);
- }
- }
- }
-
- } // synchronized
- }
-
-
- public void invalidateLayout(Container container) {}
-
-
- /**
- * Returns the string representation of this variable grid layout's values.
- * @return a string representation of this variable grid layout.
- */
- public String toString() {
- return getClass().getName() + "[mode=" + mode + ",size=" + size
- + ",hgap=" + hgap + ",vgap=" + vgap + "]";
- }
-
-
- /**
- * @param which if 0 compute minimum layout size,
- * if 1 compute maximum layout size,
- * otherwise compute preferred layout size.
- */
- private Dimension getLayoutSize(Container parent, int which) {
- synchronized (parent.getTreeLock()){
- update(parent);
-
- int ncomponents = parent.getComponentCount();
- int h = 0;
- int w = 0;
-
- for (int r = 0, i = 0; r < nrows; r++) {
- int row_height = 0;
- for (int c = 0; c < ncols; c++, i++) {
- if (i < ncomponents) {
- switch (which) {
- case 0:
- row_height = Math.max(row_height, parent.getComponent(i).getMinimumSize().height);
- break;
- case 1:
- row_height = Math.max(row_height, parent.getComponent(i).getMaximumSize().height);
- break;
- default:
- row_height = Math.max(row_height, parent.getComponent(i).getPreferredSize().height);
- break;
- }
- } else {
- break;
- }
- }
- h += row_height;
- }
-
- for (int c = 0; c < ncols; c++) {
- int col_width = 0;
- for (int r = 0; r < nrows; r++) {
- int i = r * ncols + c;
- if (i < ncomponents) {
- switch (which) {
- case 0:
- col_width = Math.max(col_width, parent.getComponent(i).getMinimumSize().width);
- break;
- case 1:
- col_width = Math.max(col_width, parent.getComponent(i).getMaximumSize().width);
- break;
- default:
- col_width = Math.max(col_width, parent.getComponent(i).getPreferredSize().width);
- break;
- }
- } else {
- break;
- }
- }
- w += col_width;
- }
-
- Insets insets = parent.getInsets();
- return new Dimension(w + insets.left + insets.right + ((ncols - 1) * hgap),
- h + insets.top + insets.bottom + ((nrows - 1) * vgap));
- }
- }
-
-
- private void update(Container container) {
- int ncomponents = container.getComponentCount();
- int old_nrows = nrows;
- int old_ncols = ncols;
- if (this.mode == FIXED_NUM_ROWS) {
- nrows = this.size;
- ncols = (ncomponents + nrows - 1) / nrows;
- } else {
- ncols = this.size;
- nrows = (ncomponents + ncols - 1) / ncols;
- }
- if (old_nrows != nrows) {
- row_heights = new int[nrows];
- }
- if (old_ncols != ncols) {
- col_widths = new int[ncols];
- }
- }
-
-
- private int mode;
- private int size;
- private int hgap;
- private int vgap;
- private transient int nrows = -1;
- private transient int ncols = -1;
- private transient int[] row_heights = null;
- private transient int[] col_widths = null;
-}
diff --git a/jEdit/installer/done-HalfAnOS.html b/jEdit/installer/done-HalfAnOS.html
index 390bc35..405800e 100644
--- a/jEdit/installer/done-HalfAnOS.html
+++ b/jEdit/installer/done-HalfAnOS.html
@@ -1,8 +1,8 @@
-<html><body>
-
-jEdit has been installed successfully.<p>
-
-To start jEdit, run the <tt>jedit.cmd</tt> script located in the
-installation directory.
-
-</body></html>
+<html><body>
+
+jEdit has been installed successfully.<p>
+
+To start jEdit, run the <tt>jedit.cmd</tt> script located in the
+installation directory.
+
+</body></html>
diff --git a/jEdit/installer/done-MacOS.html b/jEdit/installer/done-MacOS.html
index c7d6265..b423541 100644
--- a/jEdit/installer/done-MacOS.html
+++ b/jEdit/installer/done-MacOS.html
@@ -1,13 +1,13 @@
-<html><body>
-
-jEdit has been installed successfully.<p>
-
-To start jEdit, either double-click on the <tt>jedit.jar</tt> file in the
-install directory, or run the <tt>jedit</tt> command in a terminal window:
-
-<table><tr><td bgcolor="#e0e0e0"><tt><b>$</b> jedit <i>filename</i> ...</td></tt></tr></table>
-
-To find out about supported command-line options, run:
-
-<table><tr><td bgcolor="#e0e0e0"><tt><b>$</b> man jedit</tt></td></tr></table>
-</body></html>
+<html><body>
+
+jEdit has been installed successfully.<p>
+
+To start jEdit, either double-click on the <tt>jedit.jar</tt> file in the
+install directory, or run the <tt>jedit</tt> command in a terminal window:
+
+<table><tr><td bgcolor="#e0e0e0"><tt><b>$</b> jedit <i>filename</i> ...</td></tt></tr></table>
+
+To find out about supported command-line options, run:
+
+<table><tr><td bgcolor="#e0e0e0"><tt><b>$</b> man jedit</tt></td></tr></table>
+</body></html>
diff --git a/jEdit/installer/done-Unix.html b/jEdit/installer/done-Unix.html
index 3fea360..8aaa2ba 100644
--- a/jEdit/installer/done-Unix.html
+++ b/jEdit/installer/done-Unix.html
@@ -1,12 +1,12 @@
-<html><body>
-
-jEdit has been installed successfully.<p>
-
-To start jEdit, run the <tt>jedit</tt> command in a terminal window:
-
-<table><tr><td bgcolor="#e0e0e0"><tt><b>$</b> jedit <i>filename</i> ...</td></tt></tr></table>
-
-To find out about supported command-line options, run:
-
-<table><tr><td bgcolor="#e0e0e0"><tt><b>$</b> man jedit</tt></td></tr></table>
-</body></html>
+<html><body>
+
+jEdit has been installed successfully.<p>
+
+To start jEdit, run the <tt>jedit</tt> command in a terminal window:
+
+<table><tr><td bgcolor="#e0e0e0"><tt><b>$</b> jedit <i>filename</i> ...</td></tt></tr></table>
+
+To find out about supported command-line options, run:
+
+<table><tr><td bgcolor="#e0e0e0"><tt><b>$</b> man jedit</tt></td></tr></table>
+</body></html>
diff --git a/jEdit/installer/done-VMS.html b/jEdit/installer/done-VMS.html
index 51f6ddf..0c0888f 100644
--- a/jEdit/installer/done-VMS.html
+++ b/jEdit/installer/done-VMS.html
@@ -1,13 +1,13 @@
-<html><body>
-
-jEdit has been installed successfully.<p>
-
-To start jEdit, run the following command in a terminal window:
-
-<table><tr><td bgcolor="#e0e0e0"><tt><b>$</b> java -jar <i>disk</i>:[<i>dir</i>]jedit.jar <i>filename</i> ...</td></tt></tr></table>
-
-To find out about supported command-line options, run:
-
-<table><tr><td bgcolor="#e0e0e0"><tt><b>$</b> java -jar <i>disk</i>:[<i>dir</i>]jedit.jar -usage</td></tt></tr></table>
-
-</body></html>
+<html><body>
+
+jEdit has been installed successfully.<p>
+
+To start jEdit, run the following command in a terminal window:
+
+<table><tr><td bgcolor="#e0e0e0"><tt><b>$</b> java -jar <i>disk</i>:[<i>dir</i>]jedit.jar <i>filename</i> ...</td></tt></tr></table>
+
+To find out about supported command-line options, run:
+
+<table><tr><td bgcolor="#e0e0e0"><tt><b>$</b> java -jar <i>disk</i>:[<i>dir</i>]jedit.jar -usage</td></tt></tr></table>
+
+</body></html>
diff --git a/jEdit/installer/done-Windows.html b/jEdit/installer/done-Windows.html
index 81dc0bb..a2f1a84 100644
--- a/jEdit/installer/done-Windows.html
+++ b/jEdit/installer/done-Windows.html
@@ -1,7 +1,7 @@
-<html><body>
-
-jEdit has been installed successfully.<p>
-
-To start jEdit, double-click on <code>jedit.jar</code> in the jEdit installation directory.
-
-</body></html>
+<html><body>
+
+jEdit has been installed successfully.<p>
+
+To start jEdit, double-click on <code>jedit.jar</code> in the jEdit installation directory.
+
+</body></html>
diff --git a/jEdit/installer/gpl.html b/jEdit/installer/gpl.html
index 0bfa993..278a777 100644
--- a/jEdit/installer/gpl.html
+++ b/jEdit/installer/gpl.html
@@ -1,471 +1,471 @@
-<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN">
-<HTML>
-<HEAD>
-<TITLE>GNU General Public License - GNU Project - Free Software Foundation (FSF)</TITLE>
-</HEAD>
-<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#1F00FF" ALINK="#FF0000" VLINK="#9900DD">
-
-Version 2, June 1991<p>
-
-<code>
-Copyright (C) 1989, 1991 Free Software Foundation, Inc.<br>
-59 Temple Place - Suite 330, Boston, MA 02111-1307, USA<p>
-
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.
-</code>
-
-
-
-<H2>Preamble</H2>
-
-<P>
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
-your programs, too.
-
-</P>
-<P>
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-</P>
-<P>
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-</P>
-<P>
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
-</P>
-<P>
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-</P>
-<P>
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-</P>
-<P>
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-</P>
-<P>
- The precise terms and conditions for copying, distribution and
-modification follow.
-
-</P>
-
-
-<H2>TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</H2>
-
-
-<P>
-
-<STRONG>0.</STRONG>
- This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-<P>
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-<P>
-
-<STRONG>1.</STRONG>
- You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-<P>
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-<P>
-
-<STRONG>2.</STRONG>
- You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-<P>
-
-<UL>
-
-<LI><STRONG>a)</STRONG>
- You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
-<P>
-<LI><STRONG>b)</STRONG>
- You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
-<P>
-<LI><STRONG>c)</STRONG>
- If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-</UL>
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-<P>
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-<P>
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-<P>
-
-<STRONG>3.</STRONG>
- You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-
-<!-- we use this doubled UL to get the sub-sections indented, -->
-<!-- while making the bullets as unobvious as possible. -->
-<UL>
-
-<LI><STRONG>a)</STRONG>
- Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
-
-<P>
-<LI><STRONG>b)</STRONG>
- Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
-<P>
-<LI><STRONG>c)</STRONG>
- Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-</UL>
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-<P>
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-<P>
-
-<STRONG>4.</STRONG>
- You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-<P>
-
-<STRONG>5.</STRONG>
- You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-<P>
-
-<STRONG>6.</STRONG>
- Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-<P>
-
-<STRONG>7.</STRONG>
- If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-<P>
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-<P>
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-<P>
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-<P>
-
-<STRONG>8.</STRONG>
- If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-<P>
-
-<STRONG>9.</STRONG>
- The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-<P>
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-<P>
-
-
-<STRONG>10.</STRONG>
- If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-
-
-<P><STRONG>NO WARRANTY</STRONG></P>
-
-<P>
-
-<STRONG>11.</STRONG>
- BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-<P>
-
-<STRONG>12.</STRONG>
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-<P>
-
-<!--
-<H2>END OF TERMS AND CONDITIONS</H2>
-
-
-
-<H2>How to Apply These Terms to Your New Programs</H2>
-
-<P>
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-</P>
-<P>
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-</P>
-
-<code>
-<VAR>one line to give the program's name and an idea of what it does.</VAR>
-Copyright (C) <VAR>yyyy</VAR> <VAR>name of author</VAR>
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-</code>
-
-<P>
-Also add information on how to contact you by electronic and paper mail.
-
-</P>
-<P>
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-</P>
-
-<code>
-Gnomovision version 69, Copyright (C) <VAR>year</VAR> <VAR>name of author</VAR><p>
-Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
-type `show w'. This is free software, and you are welcome
-to redistribute it under certain conditions; type `show c'
-for details.
-</code>
-
-<P>
-The hypothetical commands <SAMP>`show w'</SAMP> and <SAMP>`show c'</SAMP> should show
-the appropriate parts of the General Public License. Of course, the
-commands you use may be called something other than <SAMP>`show w'</SAMP> and
-<SAMP>`show c'</SAMP>; they could even be mouse-clicks or menu items--whatever
-suits your program.
-
-</P>
-<P>
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
-</P>
-
-<code>
-Yoyodyne, Inc., hereby disclaims all copyright
-interest in the program `Gnomovision'
-(which makes passes at compilers) written
-by James Hacker.<p>
-
-<VAR>signature of Ty Coon</VAR>, 1 April 1989
-Ty Coon, President of Vice
-</code>
-
-<P>
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
-Public License instead of this License.
--->
-</BODY>
-</HTML>
+<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN">
+<HTML>
+<HEAD>
+<TITLE>GNU General Public License - GNU Project - Free Software Foundation (FSF)</TITLE>
+</HEAD>
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#1F00FF" ALINK="#FF0000" VLINK="#9900DD">
+
+Version 2, June 1991<p>
+
+<code>
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.<br>
+59 Temple Place - Suite 330, Boston, MA 02111-1307, USA<p>
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+</code>
+
+
+
+<H2>Preamble</H2>
+
+<P>
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+</P>
+<P>
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+</P>
+<P>
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+</P>
+<P>
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+</P>
+<P>
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+</P>
+<P>
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+</P>
+<P>
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+</P>
+<P>
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+</P>
+
+
+<H2>TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</H2>
+
+
+<P>
+
+<STRONG>0.</STRONG>
+ This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+<P>
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+<P>
+
+<STRONG>1.</STRONG>
+ You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+<P>
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+<P>
+
+<STRONG>2.</STRONG>
+ You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+<P>
+
+<UL>
+
+<LI><STRONG>a)</STRONG>
+ You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+<P>
+<LI><STRONG>b)</STRONG>
+ You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+<P>
+<LI><STRONG>c)</STRONG>
+ If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+</UL>
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+<P>
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+<P>
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+<P>
+
+<STRONG>3.</STRONG>
+ You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+
+<!-- we use this doubled UL to get the sub-sections indented, -->
+<!-- while making the bullets as unobvious as possible. -->
+<UL>
+
+<LI><STRONG>a)</STRONG>
+ Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+<P>
+<LI><STRONG>b)</STRONG>
+ Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+<P>
+<LI><STRONG>c)</STRONG>
+ Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+</UL>
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+<P>
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+<P>
+
+<STRONG>4.</STRONG>
+ You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+<P>
+
+<STRONG>5.</STRONG>
+ You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+<P>
+
+<STRONG>6.</STRONG>
+ Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+<P>
+
+<STRONG>7.</STRONG>
+ If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+<P>
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+<P>
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+<P>
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+<P>
+
+<STRONG>8.</STRONG>
+ If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+<P>
+
+<STRONG>9.</STRONG>
+ The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+<P>
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+<P>
+
+
+<STRONG>10.</STRONG>
+ If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+
+
+<P><STRONG>NO WARRANTY</STRONG></P>
+
+<P>
+
+<STRONG>11.</STRONG>
+ BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+<P>
+
+<STRONG>12.</STRONG>
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+<P>
+
+<!--
+<H2>END OF TERMS AND CONDITIONS</H2>
+
+
+
+<H2>How to Apply These Terms to Your New Programs</H2>
+
+<P>
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+</P>
+<P>
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+</P>
+
+<code>
+<VAR>one line to give the program's name and an idea of what it does.</VAR>
+Copyright (C) <VAR>yyyy</VAR> <VAR>name of author</VAR>
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+</code>
+
+<P>
+Also add information on how to contact you by electronic and paper mail.
+
+</P>
+<P>
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+</P>
+
+<code>
+Gnomovision version 69, Copyright (C) <VAR>year</VAR> <VAR>name of author</VAR><p>
+Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
+type `show w'. This is free software, and you are welcome
+to redistribute it under certain conditions; type `show c'
+for details.
+</code>
+
+<P>
+The hypothetical commands <SAMP>`show w'</SAMP> and <SAMP>`show c'</SAMP> should show
+the appropriate parts of the General Public License. Of course, the
+commands you use may be called something other than <SAMP>`show w'</SAMP> and
+<SAMP>`show c'</SAMP>; they could even be mouse-clicks or menu items--whatever
+suits your program.
+
+</P>
+<P>
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+</P>
+
+<code>
+Yoyodyne, Inc., hereby disclaims all copyright
+interest in the program `Gnomovision'
+(which makes passes at compilers) written
+by James Hacker.<p>
+
+<VAR>signature of Ty Coon</VAR>, 1 April 1989
+Ty Coon, President of Vice
+</code>
+
+<P>
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
+-->
+</BODY>
+</HTML>
diff --git a/jEdit/installer/install.mf b/jEdit/installer/install.mf
index f753191..6c7be97 100644
--- a/jEdit/installer/install.mf
+++ b/jEdit/installer/install.mf
@@ -1 +1 @@
-Main-Class: installer.Install
+Main-Class: installer.Install
diff --git a/jEdit/installer/install.props b/jEdit/installer/install.props
index 1921315..943dc40 100644
--- a/jEdit/installer/install.props
+++ b/jEdit/installer/install.props
@@ -1,66 +1,66 @@
-###
-### Installation settings
-###
-
-# Program name
-app.name=jEdit
-
-# Program version
-app.version=@jedit.version@
-
-# Info to display on first page of installer
-app.readme=readme.html
-
-# License to show on second page
-app.license.title=GNU General Public License
-app.license=gpl.html
-
-# OS-specific stuff
-ostask.unix-script.label=Install shortcut in:
-ostask.unix-man.label=Install manual page in:
-ostask.unix-man.manpage=jedit.1
-
-# Each component must have a name, a size, and a 'fileset'. The fileset is the
-# name of a resource, relative to the root of the JAR, where the list of files
-# is stored, newline delimited
-comp.count=5
-
-comp.0.name=jEdit text editor
-comp.0.disk-size=@jedit-program.disksize@
-comp.0.real-size=@jedit-program.realsize@
-comp.0.fileset=jedit-program
-
-comp.1.name=Default set of macros (highly recommended)
-comp.1.disk-size=@jedit-macros.disksize@
-comp.1.real-size=@jedit-macros.realsize@
-comp.1.fileset=jedit-macros
-
-comp.2.name=API documentation (for macro and plugin development)
-comp.2.disk-size=@jedit-api.disksize@
-comp.2.real-size=@jedit-api.realsize@
-comp.2.fileset=jedit-api
-
-#comp.3.name=Windows desktop integration (jEditLauncher)
-#comp.3.disk-size=400
-#comp.3.real-size=361
-#comp.3.fileset=jedit-windows
-#comp.3.os=Windows
-
-comp.3.name=MacOS desktop integration
-comp.3.disk-size=@jedit-mac.disksize@
-comp.3.real-size=@jedit-mac.realsize@
-comp.3.fileset=jedit-mac
-comp.3.os=MacOS
-
-comp.4.name=OS/2 start script
-comp.4.disk-size=@jedit-os2.disksize@
-comp.4.real-size=@jedit-os2.realsize@
-comp.4.fileset=jedit-os2
-comp.4.os=HalfAnOS
-
-dir.null=Empty directory: will NOT be installed
-dir.not-empty=Target directory exists and is not empty
-dir.not-directory=Target is NOT a directory, can't install
-dir.relative=Relative directory, translated to :
-dir.relative-cant-resolve=Can't resolve relative directory !
-dir.not-exist=Target directory doesn't exist (we will create it for you)
+###
+### Installation settings
+###
+
+# Program name
+app.name=jEdit
+
+# Program version
+app.version=@jedit.version@
+
+# Info to display on first page of installer
+app.readme=readme.html
+
+# License to show on second page
+app.license.title=GNU General Public License
+app.license=gpl.html
+
+# OS-specific stuff
+ostask.unix-script.label=Install shortcut in:
+ostask.unix-man.label=Install manual page in:
+ostask.unix-man.manpage=jedit.1
+
+# Each component must have a name, a size, and a 'fileset'. The fileset is the
+# name of a resource, relative to the root of the JAR, where the list of files
+# is stored, newline delimited
+comp.count=6
+
+comp.0.name=jEdit text editor
+comp.0.disk-size=@jedit-program.disksize@
+comp.0.real-size=@jedit-program.realsize@
+comp.0.fileset=jedit-program
+
+comp.1.name=Default set of macros (highly recommended)
+comp.1.disk-size=@jedit-macros.disksize@
+comp.1.real-size=@jedit-macros.realsize@
+comp.1.fileset=jedit-macros
+
+comp.2.name=API documentation (for macro and plugin development)
+comp.2.disk-size=@jedit-api.disksize@
+comp.2.real-size=@jedit-api.realsize@
+comp.2.fileset=jedit-api
+
+comp.3.name=Windows EXE launcher
+comp.3.disk-size=@jedit-windows.disksize@
+comp.3.real-size=@jedit-windows.realsize@
+comp.3.fileset=jedit-windows
+comp.3.os=Windows
+
+comp.4.name=MacOS desktop integration
+comp.4.disk-size=@jedit-mac.disksize@
+comp.4.real-size=@jedit-mac.realsize@
+comp.4.fileset=jedit-mac
+comp.4.os=MacOS
+
+comp.5.name=OS/2 start script
+comp.5.disk-size=@jedit-os2.disksize@
+comp.5.real-size=@jedit-os2.realsize@
+comp.5.fileset=jedit-os2
+comp.5.os=HalfAnOS
+
+dir.null=Empty directory: will NOT be installed
+dir.not-empty=Target directory exists and is not empty
+dir.not-directory=Target is NOT a directory, can't install
+dir.relative=Relative directory, translated to :
+dir.relative-cant-resolve=Can't resolve relative directory !
+dir.not-exist=Target directory doesn't exist (we will create it for you)
diff --git a/jEdit/installer/readme.html b/jEdit/installer/readme.html
index 79c7936..79ba6ad 100644
--- a/jEdit/installer/readme.html
+++ b/jEdit/installer/readme.html
@@ -1,25 +1,25 @@
-<html>
-<body>
-
-Simply fill out the required
-information at each screen and click <b>Next</b>. Once all installation
-parameters have been specified, the <b>Next</b> button changes to
-read <b>Install</b>. Clicking it will then begin the installation
-process.<p>
-
-The <b>Cancel</b> button will quit the installer without installing
-anything; <b>Previous</b> will take you to the previous screen
-(use it if you change your mind about a setting).
-
-<hr>
-
-jEdit is free software, released under the terms of the GNU General
-Public License. The full text of the license is shown in the next page
-of the installer.<p>
-
-Several class libraries bundled with jEdit are have other
-licenses; once jEdit is installed, see the <code>README.txt</code>
-file for details.
-
-</body>
-</html>
+<html>
+<body>
+
+Simply fill out the required
+information at each screen and click <b>Next</b>. Once all installation
+parameters have been specified, the <b>Next</b> button changes to
+read <b>Install</b>. Clicking it will then begin the installation
+process.<p>
+
+The <b>Cancel</b> button will quit the installer without installing
+anything; <b>Previous</b> will take you to the previous screen
+(use it if you change your mind about a setting).
+
+<hr>
+
+jEdit is free software, released under the terms of the GNU General
+Public License. The full text of the license is shown in the next page
+of the installer.<p>
+
+Several class libraries bundled with jEdit are have other
+licenses; once jEdit is installed, see the <code>README.txt</code>
+file for details.
+
+</body>
+</html>
diff --git a/jEdit/jEdit.iml b/jEdit/jEdit.iml
index 1490486..f01b5a3 100644
--- a/jEdit/jEdit.iml
+++ b/jEdit/jEdit.iml
@@ -5,6 +5,7 @@
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/build" />
+ <excludeFolder url="file://$MODULE_DIR$/dist" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
diff --git a/jEdit/jEdit.ipr b/jEdit/jEdit.ipr
deleted file mode 100644
index 04e0db5..0000000
--- a/jEdit/jEdit.ipr
+++ /dev/null
@@ -1,1736 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
- <component name="AntConfiguration">
- <defaultAnt bundledAnt="true" />
- <buildFile url="file://$PROJECT_DIR$/build.xml">
- <additionalClassPath />
- <antReference projectDefault="true" />
- <customJdkName value="" />
- <maximumHeapSize value="128" />
- <maximumStackSize value="32" />
- <properties />
- </buildFile>
- <buildFile url="file://$PROJECT_DIR$/jars/LatestVersion/build.xml">
- <additionalClassPath />
- <antReference projectDefault="true" />
- <customJdkName value="" />
- <maximumHeapSize value="128" />
- <maximumStackSize value="32" />
- <properties />
- </buildFile>
- <buildFile url="file://$PROJECT_DIR$/jars/MacOSX/build.xml">
- <additionalClassPath />
- <antReference projectDefault="true" />
- <customJdkName value="" />
- <maximumHeapSize value="128" />
- <maximumStackSize value="32" />
- <properties />
- </buildFile>
- <buildFile url="file://$PROJECT_DIR$/jars/QuickNotepad/build.xml">
- <additionalClassPath />
- <antReference projectDefault="true" />
- <customJdkName value="" />
- <maximumHeapSize value="128" />
- <maximumStackSize value="32" />
- <properties />
- </buildFile>
- </component>
- <component name="BuildJarProjectSettings">
- <option name="BUILD_JARS_ON_MAKE" value="false" />
- </component>
- <component name="CodeStyleSettingsManager">
- <option name="PER_PROJECT_SETTINGS">
- <value>
- <ADDITIONAL_INDENT_OPTIONS fileType="java">
- <option name="INDENT_SIZE" value="4" />
- <option name="CONTINUATION_INDENT_SIZE" value="8" />
- <option name="TAB_SIZE" value="4" />
- <option name="USE_TAB_CHARACTER" value="false" />
- <option name="SMART_TABS" value="false" />
- <option name="LABEL_INDENT_SIZE" value="0" />
- <option name="LABEL_INDENT_ABSOLUTE" value="false" />
- </ADDITIONAL_INDENT_OPTIONS>
- <ADDITIONAL_INDENT_OPTIONS fileType="jsp">
- <option name="INDENT_SIZE" value="4" />
- <option name="CONTINUATION_INDENT_SIZE" value="8" />
- <option name="TAB_SIZE" value="4" />
- <option name="USE_TAB_CHARACTER" value="false" />
- <option name="SMART_TABS" value="false" />
- <option name="LABEL_INDENT_SIZE" value="0" />
- <option name="LABEL_INDENT_ABSOLUTE" value="false" />
- </ADDITIONAL_INDENT_OPTIONS>
- <ADDITIONAL_INDENT_OPTIONS fileType="xml">
- <option name="INDENT_SIZE" value="4" />
- <option name="CONTINUATION_INDENT_SIZE" value="8" />
- <option name="TAB_SIZE" value="4" />
- <option name="USE_TAB_CHARACTER" value="false" />
- <option name="SMART_TABS" value="false" />
- <option name="LABEL_INDENT_SIZE" value="0" />
- <option name="LABEL_INDENT_ABSOLUTE" value="false" />
- </ADDITIONAL_INDENT_OPTIONS>
- </value>
- </option>
- </component>
- <component name="CompilerConfiguration">
- <option name="DEFAULT_COMPILER" value="Javac" />
- <resourceExtensions>
- <entry name=".+\.(properties|xml|html|dtd|tld)" />
- <entry name=".+\.(gif|png|jpeg|jpg)" />
- </resourceExtensions>
- <wildcardResourcePatterns>
- <entry name="?*.properties" />
- <entry name="?*.props" />
- <entry name="?*.xml" />
- <entry name="?*.gif" />
- <entry name="?*.png" />
- <entry name="?*.jpeg" />
- <entry name="?*.jpg" />
- <entry name="?*.html" />
- <entry name="?*.dtd" />
- <entry name="?*.tld" />
- <entry name="?*.ftl" />
- </wildcardResourcePatterns>
- <annotationProcessing enabled="false" useClasspath="true" />
- </component>
- <component name="CopyrightManager" default="GPL v2">
- <copyright>
- <option name="notice" value="jEdit - Programmer's Text Editor
:tabSize=8:indentSize=8:noTabs=false:
:folding=explicit:collapseFolds=1:
Copyright © $today.year jEdit contributors
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA." />
- <option name="keyword" value="Copyright" />
- <option name="allowReplaceKeyword" value="" />
- <option name="myName" value="GPL v2" />
- <option name="myLocal" value="true" />
- </copyright>
- <module2copyright />
- <LanguageOptions name="HTML">
- <option name="fileTypeOverride" value="2" />
- <option name="relativeBefore" value="true" />
- <option name="addBlankAfter" value="true" />
- <option name="fileLocation" value="2" />
- <option name="block" value="true" />
- <option name="separateBefore" value="false" />
- <option name="separateAfter" value="false" />
- <option name="prefixLines" value="true" />
- <option name="lenBefore" value="80" />
- <option name="lenAfter" value="80" />
- <option name="box" value="false" />
- <option name="filler" value=" " />
- </LanguageOptions>
- <LanguageOptions name="JSP">
- <option name="fileTypeOverride" value="2" />
- <option name="relativeBefore" value="true" />
- <option name="addBlankAfter" value="true" />
- <option name="fileLocation" value="2" />
- <option name="block" value="true" />
- <option name="separateBefore" value="false" />
- <option name="separateAfter" value="false" />
- <option name="prefixLines" value="true" />
- <option name="lenBefore" value="80" />
- <option name="lenAfter" value="80" />
- <option name="box" value="false" />
- <option name="filler" value=" " />
- </LanguageOptions>
- <LanguageOptions name="JSPX">
- <option name="fileTypeOverride" value="2" />
- <option name="relativeBefore" value="true" />
- <option name="addBlankAfter" value="true" />
- <option name="fileLocation" value="2" />
- <option name="block" value="true" />
- <option name="separateBefore" value="false" />
- <option name="separateAfter" value="false" />
- <option name="prefixLines" value="true" />
- <option name="lenBefore" value="80" />
- <option name="lenAfter" value="80" />
- <option name="box" value="false" />
- <option name="filler" value=" " />
- </LanguageOptions>
- <LanguageOptions name="XML">
- <option name="fileTypeOverride" value="2" />
- <option name="relativeBefore" value="true" />
- <option name="addBlankAfter" value="true" />
- <option name="fileLocation" value="2" />
- <option name="block" value="true" />
- <option name="separateBefore" value="false" />
- <option name="separateAfter" value="false" />
- <option name="prefixLines" value="true" />
- <option name="lenBefore" value="80" />
- <option name="lenAfter" value="80" />
- <option name="box" value="false" />
- <option name="filler" value=" " />
- </LanguageOptions>
- </component>
- <component name="DependencyValidationManager">
- <scope name="jEdit Sourcefiles" pattern="file[jEdit]:org//*.java" />
- <scope name="Modes" pattern="file[jEdit]:modes//*.xml" />
- <scope name="Macros" pattern="file[jEdit]:macros//*.bsh" />
- <scope name="LatestVersion Sourcefiles" pattern="file[LatestVersion]:*.java" />
- <scope name="MacOSX Sourcefiles" pattern="file[MacOSX]:macosx//*.java" />
- <scope name="QuickNotepad Sourcefiles" pattern="file[QuickNotepad]:*.java" />
- <option name="SKIP_IMPORT_STATEMENTS" value="false" />
- </component>
- <component name="EclipseCompilerSettings">
- <option name="GENERATE_NO_WARNINGS" value="true" />
- <option name="DEPRECATION" value="false" />
- </component>
- <component name="Encoding" useUTFGuessing="true" native2AsciiForPropertiesFiles="true" defaultCharsetForPropertiesFiles="ISO-8859-1">
- <file url="file://$PROJECT_DIR$/doc/CHANGES.txt" charset="ISO-8859-1" />
- </component>
- <component name="IdProvider" IDEtalkID="F2207F966C6969E072D5CD57D729D7EA" />
- <component name="InspectionProjectProfileManager">
- <profiles>
- <profile version="1.0" is_locked="false">
- <option name="myName" value="Project Default" />
- <option name="myLocal" value="false" />
- <inspection_tool class="AbstractClassNeverImplemented" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="AbstractClassWithOnlyOneDirectInheritor" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="AbstractClassWithoutAbstractMethods" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="AbstractMethodCallInConstructor" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="AbstractMethodOverridesAbstractMethod" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="AbstractMethodOverridesConcreteMethod" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="AbstractMethodWithMissingImplementations" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="AccessToNonThreadSafeStaticFieldFromInstance" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="nonThreadSafeTypes" value="java.text.DateFormat,java.util.Calendar" />
- </inspection_tool>
- <inspection_tool class="AccessToStaticFieldLockedOnInstance" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="AnnotationNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_regex" value="[A-Z][A-Za-z\d]*" />
- <option name="m_minLength" value="8" />
- <option name="m_maxLength" value="64" />
- </inspection_tool>
- <inspection_tool class="AnonymousClassMethodCount" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_limit" value="3" />
- </inspection_tool>
- <inspection_tool class="AnonymousClassVariableHidesContainingMethodVariable" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="AnonymousFunctionJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="AnonymousInnerClassMayBeStatic" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="AntMissingPropertiesFileInspection" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ArchaicSystemPropertyAccess" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ArithmeticOnVolatileField" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ArrayLengthInLoopCondition" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="AssertAsName" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="AssertsWithoutMessages" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="AssignmentResultUsedJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="AssignmentToCatchBlockParameter" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="AssignmentToCollectionFieldFromParameter" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="ignorePrivateMethods" value="true" />
- </inspection_tool>
- <inspection_tool class="AssignmentToDateFieldFromParameter" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="ignorePrivateMethods" value="true" />
- </inspection_tool>
- <inspection_tool class="AssignmentToForLoopParameter" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_checkForeachParameters" value="true" />
- </inspection_tool>
- <inspection_tool class="AssignmentToForLoopParameterJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="AssignmentToFunctionParameterJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="AssignmentToMethodParameter" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="ignoreTransformationOfOriginalParameter" value="false" />
- </inspection_tool>
- <inspection_tool class="AssignmentUsedAsCondition" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="AwaitNotInLoop" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="AwaitWithoutCorrespondingSignal" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="BadExceptionCaught" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="exceptionsString" value="java.lang.NullPointerException,java.lang.IllegalMonitorStateException,java.lang.ArrayIndexOutOfBoundsException" />
- </inspection_tool>
- <inspection_tool class="BadExceptionDeclared" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="exceptionsString" value="java.lang.Throwable,java.lang.Exception,java.lang.Error,java.lang.RuntimeException,java.lang.NullPointerException,java.lang.ClassCastException,java.lang.ArrayIndexOutOfBoundsException" />
- <option name="ignoreTestCases" value="false" />
- </inspection_tool>
- <inspection_tool class="BadOddness" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="BeforeClassOrAfterClassIsPublicStaticVoidNoArg" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="BeforeOrAfterIsPublicVoidNoArg" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="BigDecimalEquals" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="BlockStatementJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="BooleanMethodNameMustStartWithQuestion" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="questionString" value="is,can,has,should,could,will,shall,check,contains,equals,add,put,remove,startsWith,endsWith" />
- </inspection_tool>
- <inspection_tool class="BusyWait" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="CStyleArrayDeclaration" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="CachedNumberConstructorCall" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="CallToNativeMethodWhileLocked" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="CallToSimpleGetterInClass" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="ignoreGetterCallsOnOtherObjects" value="true" />
- </inspection_tool>
- <inspection_tool class="CallToSimpleSetterInClass" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="ignoreSetterCallsOnOtherObjects" value="true" />
- </inspection_tool>
- <inspection_tool class="CallToStringConcatCanBeReplacedByOperator" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="CallerJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="CastConflictsWithInstanceof" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="CastThatLosesPrecision" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="ignoreIntegerCharCasts" value="false" />
- </inspection_tool>
- <inspection_tool class="CastToIncompatibleInterface" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="CatchGenericClass" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ChainedEquality" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ChainedEqualityJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ChannelResource" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="CharacterComparison" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="CheckForOutOfMemoryOnLargeArrayAllocation" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_limit" value="64" />
- </inspection_tool>
- <inspection_tool class="ClassEscapesItsScope" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ClassHasNoToStringMethod" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="excludeClassNames" value="" />
- <option name="excludeException" value="true" />
- <option name="excludeDeprecated" value="true" />
- <option name="excludeEnum" value="false" />
- <option name="excludeAbstract" value="false" />
- </inspection_tool>
- <inspection_tool class="ClassInitializer" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ClassMayBeInterface" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ClassNameDiffersFromFileName" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ClassNameSameAsAncestorName" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ClassNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_regex" value="[A-Z][A-Za-z\d]*" />
- <option name="m_minLength" value="8" />
- <option name="m_maxLength" value="64" />
- </inspection_tool>
- <inspection_tool class="ClassNestingDepth" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_limit" value="1" />
- </inspection_tool>
- <inspection_tool class="ClassReferencesSubclass" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ClassUnconnectedToPackage" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ClassWithMultipleLoggers" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="loggerClassName" value="java.util.logging.Logger" />
- </inspection_tool>
- <inspection_tool class="ClassWithTooManyDependencies" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="limit" value="10" />
- </inspection_tool>
- <inspection_tool class="ClassWithTooManyDependents" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="limit" value="10" />
- </inspection_tool>
- <inspection_tool class="ClassWithTooManyTransitiveDependencies" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="limit" value="35" />
- </inspection_tool>
- <inspection_tool class="ClassWithTooManyTransitiveDependents" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="limit" value="35" />
- </inspection_tool>
- <inspection_tool class="ClassWithoutToString" level="WARNING" enabled="true" />
- <inspection_tool class="CloneCallsConstructors" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="CloneInNonCloneableClass" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="CloneableClassInSecureContext" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="CloneableImplementsClone" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_ignoreCloneableDueToInheritance" value="false" />
- </inspection_tool>
- <inspection_tool class="CollectionAddedToSelf" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="CollectionContainsUrl" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="CollectionsMustHaveInitialCapacity" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="CommaExpressionJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ComparableImplementedButEqualsNotOverridden" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ComparatorNotSerializable" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="CompareToUsesNonFinalVariable" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ComparisonOfShortAndChar" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ComparisonToNaN" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ConditionSignal" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ConditionalExpressionWithIdenticalBranches" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ConditionalExpressionWithIdenticalBranchesJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ConfusingElse" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ConfusingFloatingPointLiteral" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ConfusingFloatingPointLiteralJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ConfusingMainMethod" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ConfusingOctalEscape" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ConfusingPlusesOrMinusesJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ConnectionResource" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ConstantConditions" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="SUGGEST_NULLABLE_ANNOTATIONS" value="true" />
- <option name="DONT_REPORT_TRUE_ASSERT_STATEMENTS" value="false" />
- </inspection_tool>
- <inspection_tool class="ConstantMathCall" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ConstantNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="onlyCheckImmutables" value="false" />
- <option name="m_regex" value="[A-Z_\d]*" />
- <option name="m_minLength" value="5" />
- <option name="m_maxLength" value="32" />
- </inspection_tool>
- <inspection_tool class="ConstantOnRHSOfComparison" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ConstantOnRHSOfComparisonJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ConstantStringIntern" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ControlFlowStatementWithoutBraces" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="CovariantEquals" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="CyclicClassDependency" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="CyclicPackageDependency" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="CyclomaticComplexity" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_limit" value="20" />
- </inspection_tool>
- <inspection_tool class="CyclomaticComplexityJS" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_limit" value="10" />
- </inspection_tool>
- <inspection_tool class="DateToString" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="DebuggerStatementJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="DeclareCollectionAsInterface" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="ignoreLocalVariables" value="false" />
- <option name="ignorePrivateMethodsAndFields" value="false" />
- </inspection_tool>
- <inspection_tool class="DefaultNotLastCaseInSwitch" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="DefaultNotLastCaseInSwitchJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="DeserializableClassInSecureContext" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="DisjointPackage" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="DivideByZero" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="DivideByZeroJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="DocumentWriteJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="DollarSignInName" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="DoubleCheckedLocking" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="ignoreOnVolatileVariables" value="false" />
- </inspection_tool>
- <inspection_tool class="DoubleNegation" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="DriverManagerGetConnection" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="DuplicateBooleanBranch" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="DuplicateCondition" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="ignoreMethodCalls" value="false" />
- </inspection_tool>
- <inspection_tool class="DuplicateConditionJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="DuplicatePropertyInspection" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="CURRENT_FILE" value="true" />
- <option name="MODULE_WITH_DEPENDENCIES" value="false" />
- <option name="CHECK_DUPLICATE_VALUES" value="true" />
- <option name="CHECK_DUPLICATE_KEYS" value="true" />
- <option name="CHECK_DUPLICATE_KEYS_WITH_DIFFERENT_VALUES" value="true" />
- </inspection_tool>
- <inspection_tool class="DynamicallyGeneratedCodeJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="EmptyCatchBlockJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="EmptyClass" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="EmptyFinallyBlockJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="EmptyInitializer" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="EmptyStatementBody" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_reportEmptyBlocks" value="true" />
- </inspection_tool>
- <inspection_tool class="EmptyStatementBodyJS" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_reportEmptyBlocks" value="true" />
- </inspection_tool>
- <inspection_tool class="EmptySynchronizedStatement" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="EmptyTryBlockJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="EnumAsName" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="EnumSwitchStatementWhichMissesCases" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="ignoreSwitchStatementsWithDefault" value="false" />
- </inspection_tool>
- <inspection_tool class="EnumeratedClassNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_regex" value="[A-Z][A-Za-z\d]*" />
- <option name="m_minLength" value="8" />
- <option name="m_maxLength" value="64" />
- </inspection_tool>
- <inspection_tool class="EnumeratedConstantNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_regex" value="[A-Z][A-Za-z\d]*" />
- <option name="m_minLength" value="5" />
- <option name="m_maxLength" value="32" />
- </inspection_tool>
- <inspection_tool class="EqualityComparisonWithCoercionJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="EqualsAndHashcode" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="EqualsHashCodeCalledOnUrl" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="EqualsUsesNonFinalVariable" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ErrorRethrown" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ExceptionFromCatchWhichDoesntWrap" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="ignoreGetMessage" value="false" />
- </inspection_tool>
- <inspection_tool class="ExceptionNameDoesntEndWithException" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ExtendsThread" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ExtendsUtilityClass" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ExternalizableWithSerializationMethods" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="FallthruInSwitchStatement" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="FeatureEnvy" enabled="false" level="WARNING" enabled_by_default="false">
- <option name="ignoreTestCases" value="true" />
- </inspection_tool>
- <inspection_tool class="FieldAccessedSynchronizedAndUnsynchronized" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="countGettersAndSetters" value="true" />
- </inspection_tool>
- <inspection_tool class="FieldHidesSuperclassField" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_ignoreInvisibleFields" value="true" />
- </inspection_tool>
- <inspection_tool class="FieldMayBeStatic" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="FieldNotUsedInToString" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="FieldRepeatedlyAccessed" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_ignoreFinalFields" value="false" />
- </inspection_tool>
- <inspection_tool class="FinalMethodInFinalClass" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="Finalize" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="FinalizeNotProtected" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="FloatingPointEquality" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ForLoopReplaceableByWhile" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_ignoreLoopsWithoutConditions" value="false" />
- </inspection_tool>
- <inspection_tool class="ForLoopReplaceableByWhileJS" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_ignoreLoopsWithoutConditions" value="false" />
- </inspection_tool>
- <inspection_tool class="ForLoopThatDoesntUseLoopVariable" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ForLoopThatDoesntUseLoopVariableJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ForLoopWithMissingComponent" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="ignoreCollectionLoops" value="false" />
- </inspection_tool>
- <inspection_tool class="FunctionNamingConventionJS" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_regex" value="[a-z][A-Za-z]*" />
- <option name="m_minLength" value="4" />
- <option name="m_maxLength" value="32" />
- </inspection_tool>
- <inspection_tool class="HardCodedStringLiteral" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="ignoreForAssertStatements" value="true" />
- <option name="ignoreForExceptionConstructors" value="true" />
- <option name="ignoreForSpecifiedExceptionConstructors" value="" />
- <option name="ignoreForJUnitAsserts" value="true" />
- <option name="ignoreForClassReferences" value="true" />
- <option name="ignoreForPropertyKeyReferences" value="true" />
- <option name="ignoreForNonAlpha" value="true" />
- <option name="ignoreAssignedToConstants" value="false" />
- <option name="ignoreToString" value="true" />
- <option name="nonNlsCommentPattern" value="NON-NLS" />
- </inspection_tool>
- <inspection_tool class="HashCodeUsesNonFinalVariable" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="HibernateResource" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="IOResource" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="IfStatementWithIdenticalBranches" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="IfStatementWithIdenticalBranchesJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="IfStatementWithTooManyBranchesJS" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_limit" value="3" />
- </inspection_tool>
- <inspection_tool class="ImplicitNumericConversion" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="ignoreWideningConversions" value="false" />
- <option name="ignoreCharConversions" value="false" />
- <option name="ignoreConstantConversions" value="false" />
- </inspection_tool>
- <inspection_tool class="IncrementDecrementResultUsedJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="IndexOfReplaceableByContains" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="InnerClassMayBeStatic" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="InnerClassVariableHidesOuterClassVariable" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_ignoreInvisibleFields" value="true" />
- </inspection_tool>
- <inspection_tool class="InnerHTMLJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="InstanceMethodNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_regex" value="[a-z][A-Za-z\d]*" />
- <option name="m_minLength" value="4" />
- <option name="m_maxLength" value="32" />
- </inspection_tool>
- <inspection_tool class="InstanceVariableNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_regex" value="[a-z][A-Za-z\d]*" />
- <option name="m_minLength" value="4" />
- <option name="m_maxLength" value="32" />
- </inspection_tool>
- <inspection_tool class="InstanceVariableUninitializedUse" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_ignorePrimitives" value="false" />
- </inspection_tool>
- <inspection_tool class="InstanceofCatchParameter" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="InstanceofChain" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="InstanceofIncompatibleInterface" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="InstanceofThis" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="InstantiationOfUtilityClass" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="IntegerDivisionInFloatingPointContext" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="IntegerMultiplicationImplicitCastToLong" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="InterfaceNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_regex" value="[A-Z][A-Za-z\d]*" />
- <option name="m_minLength" value="8" />
- <option name="m_maxLength" value="64" />
- </inspection_tool>
- <inspection_tool class="InterfaceNeverImplemented" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="ignoreInterfacesThatOnlyDeclareConstants" value="false" />
- </inspection_tool>
- <inspection_tool class="IteratorHasNextCallsIteratorNext" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="IteratorNextDoesNotThrowNoSuchElementException" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="JDBCExecuteWithNonConstantString" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="JDBCPrepareStatementWithNonConstantString" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="JDBCResource" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="JNDIResource" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="JUnitAbstractTestClassNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_regex" value="[A-Z][A-Za-z\d]*TestCase" />
- <option name="m_minLength" value="12" />
- <option name="m_maxLength" value="64" />
- </inspection_tool>
- <inspection_tool class="JUnitTestClassNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_regex" value="[A-Z][A-Za-z\d]*Test" />
- <option name="m_minLength" value="8" />
- <option name="m_maxLength" value="64" />
- </inspection_tool>
- <inspection_tool class="JavaDoc" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="TOP_LEVEL_CLASS_OPTIONS">
- <value>
- <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="package" />
- <option name="REQUIRED_TAGS" value="@param" />
- </value>
- </option>
- <option name="INNER_CLASS_OPTIONS">
- <value>
- <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="private" />
- <option name="REQUIRED_TAGS" value="" />
- </value>
- </option>
- <option name="METHOD_OPTIONS">
- <value>
- <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="private" />
- <option name="REQUIRED_TAGS" value="@return at param@throws or @exception" />
- </value>
- </option>
- <option name="FIELD_OPTIONS">
- <value>
- <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="private" />
- <option name="REQUIRED_TAGS" value="" />
- </value>
- </option>
- <option name="IGNORE_DEPRECATED" value="false" />
- <option name="IGNORE_JAVADOC_PERIOD" value="true" />
- <option name="IGNORE_DUPLICATED_THROWS" value="false" />
- <option name="myAdditionalJavadocTags" value="" />
- </inspection_tool>
- <inspection_tool class="JavaLangImport" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="JavaLangReflect" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="LengthOneStringInIndexOf" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="LengthOneStringsInConcatenation" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ListIndexOfReplaceableByContains" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="LiteralAsArgToStringEquals" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="LoadLibraryWithNonConstantString" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="LocalVariableHidingMemberVariable" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_ignoreInvisibleFields" value="true" />
- <option name="m_ignoreStaticMethods" value="true" />
- </inspection_tool>
- <inspection_tool class="LocalVariableNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_ignoreForLoopParameters" value="false" />
- <option name="m_ignoreCatchParameters" value="false" />
- <option name="m_regex" value="[a-z][A-Za-z\d]*" />
- <option name="m_minLength" value="1" />
- <option name="m_maxLength" value="20" />
- </inspection_tool>
- <inspection_tool class="LocalVariableNamingConventionJS" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_regex" value="[a-z][A-Za-z]*" />
- <option name="m_minLength" value="1" />
- <option name="m_maxLength" value="32" />
- </inspection_tool>
- <inspection_tool class="LongLiteralsEndingWithLowercaseL" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="LoopConditionNotUpdatedInsideLoop" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="ignoreIterators" value="false" />
- </inspection_tool>
- <inspection_tool class="LoopWithImplicitTerminationCondition" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="LossyEncoding" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="MagicNumber" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_ignoreInHashCode" value="false" />
- </inspection_tool>
- <inspection_tool class="MagicNumberJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="MapReplaceableByEnumMap" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="MarkerInterface" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="MethodCallInLoopCondition" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="MethodCoupling" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_includeJavaClasses" value="false" />
- <option name="m_includeLibraryClasses" value="false" />
- <option name="m_limit" value="10" />
- </inspection_tool>
- <inspection_tool class="MethodMayBeStatic" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_onlyPrivateOrFinal" value="false" />
- <option name="m_ignoreEmptyMethods" value="true" />
- </inspection_tool>
- <inspection_tool class="MethodMayBeSynchronized" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="MethodNameSameAsParentName" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="MethodNamesDifferOnlyByCase" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="MethodOnlyUsedFromInnerClass" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="ignoreMethodsAccessedFromAnonymousClass" value="false" />
- </inspection_tool>
- <inspection_tool class="MethodOverloadsParentMethod" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="MethodOverridesPackageLocalMethod" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="MethodOverridesPrivateMethod" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="MethodOverridesStaticMethod" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="MethodReturnAlwaysConstant" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="MisorderedAssertEqualsParameters" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="MissingDeprecatedAnnotation" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="MissingOverrideAnnotation" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="MissortedModifiers" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_requireAnnotationsFirst" value="true" />
- </inspection_tool>
- <inspection_tool class="MisspelledCompareTo" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="MisspelledEquals" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="MisspelledHashcode" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="MisspelledSetUp" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="MisspelledTearDown" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="MisspelledToString" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ModuleWithTooFewClasses" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="limit" value="10" />
- </inspection_tool>
- <inspection_tool class="ModuleWithTooManyClasses" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="limit" value="100" />
- </inspection_tool>
- <inspection_tool class="MultipleDeclaration" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="MultipleReturnPointsPerMethod" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="ignoreGuardClauses" value="false" />
- <option name="ignoreEqualsMethod" value="false" />
- <option name="m_limit" value="1" />
- </inspection_tool>
- <inspection_tool class="MultipleTopLevelClassesInFile" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="MultipleTypedDeclaration" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="MultiplyOrDivideByPowerOfTwo" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="checkDivision" value="true" />
- </inspection_tool>
- <inspection_tool class="NakedNotify" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="NativeMethods" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="NegatedConditional" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_ignoreNegatedNullComparison" value="true" />
- </inspection_tool>
- <inspection_tool class="NegatedConditionalExpressionJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="NegatedIfElse" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_ignoreNegatedNullComparison" value="true" />
- </inspection_tool>
- <inspection_tool class="NegatedIfStatementJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="NestedAssignment" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="NestedAssignmentJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="NestedConditionalExpression" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="NestedConditionalExpressionJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="NestedFunctionJS" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_includeAnonymousFunctions" value="false" />
- </inspection_tool>
- <inspection_tool class="NestedSynchronizedStatement" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="NestedTryStatement" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="NestingDepth" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_limit" value="5" />
- </inspection_tool>
- <inspection_tool class="NestingDepthJS" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_limit" value="5" />
- </inspection_tool>
- <inspection_tool class="NonBlockStatementBodyJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="NonBooleanMethodNameMayNotStartWithQuestion" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="questionString" value="is,can,has,should,could,will,shall,check,contains,equals,startsWith,endsWith" />
- </inspection_tool>
- <inspection_tool class="NonCommentSourceStatements" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_limit" value="50" />
- </inspection_tool>
- <inspection_tool class="NonExceptionNameEndsWithException" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="NonFinalClone" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="NonFinalFieldOfException" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="NonFinalStaticVariableUsedInClassInitialization" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="NonProtectedConstructorInAbstractClass" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_ignoreNonPublicClasses" value="false" />
- </inspection_tool>
- <inspection_tool class="NonReproducibleMathCall" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="NonSerializableFieldInSerializableClass" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="superClassString" value="java.awt.Component" />
- </inspection_tool>
- <inspection_tool class="NonSerializableObjectBoundToHttpSession" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="NonSerializableObjectPassedToObjectStream" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="NonSerializableWithSerialVersionUIDField" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="NonSerializableWithSerializationMethods" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="NonShortCircuitBoolean" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="NonShortCircuitBooleanExpressionJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="NonStaticFinalLogger" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="loggerClassName" value="java.util.logging.Logger" />
- </inspection_tool>
- <inspection_tool class="NonStaticInnerClassInSecureContext" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="NonSynchronizedMethodOverridesSynchronizedMethod" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="NonThreadSafeLazyInitialization" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="NoopMethodInAbstractClass" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="NotifyCalledOnCondition" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="NotifyNotInSynchronizedContext" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="NotifyWithoutCorrespondingWait" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="NumericToString" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ObjectAllocationIgnoredJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ObjectAllocationInLoop" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ObjectNotify" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ObjectToString" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ObsoleteCollection" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="ignoreLibraryArguments" value="false" />
- </inspection_tool>
- <inspection_tool class="OctalAndDecimalIntegersMixed" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="OctalIntegerJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="OnDemandImport" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="OverloadedVarargsMethod" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="OverlyComplexArithmeticExpression" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_limit" value="6" />
- </inspection_tool>
- <inspection_tool class="OverlyComplexArithmeticExpressionJS" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_limit" value="6" />
- </inspection_tool>
- <inspection_tool class="OverlyComplexBooleanExpression" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_limit" value="5" />
- <option name="m_ignorePureConjunctionsDisjunctions" value="true" />
- </inspection_tool>
- <inspection_tool class="OverlyComplexBooleanExpressionJS" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_limit" value="3" />
- </inspection_tool>
- <inspection_tool class="OverlyLargePrimitiveArrayInitializer" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_limit" value="64" />
- </inspection_tool>
- <inspection_tool class="OverlyStrongTypeCast" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="ignoreInMatchingInstanceof" value="false" />
- </inspection_tool>
- <inspection_tool class="OverridableMethodCallDuringObjectConstruction" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="OverriddenMethodCallDuringObjectConstruction" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="PackageInMultipleModules" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="PackageWithTooFewClasses" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="limit" value="3" />
- </inspection_tool>
- <inspection_tool class="PackageWithTooManyClasses" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="limit" value="10" />
- </inspection_tool>
- <inspection_tool class="ParameterHidingMemberVariable" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_ignoreInvisibleFields" value="true" />
- <option name="m_ignoreStaticMethodParametersHidingInstanceFields" value="false" />
- <option name="m_ignoreForConstructors" value="true" />
- <option name="m_ignoreForPropertySetters" value="true" />
- <option name="m_ignoreForAbstractMethods" value="false" />
- </inspection_tool>
- <inspection_tool class="ParameterNameDiffersFromOverriddenParameter" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_ignoreSingleCharacterNames" value="true" />
- <option name="m_ignoreOverridesOfLibraryMethods" value="false" />
- </inspection_tool>
- <inspection_tool class="ParameterNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_regex" value="[a-z][A-Za-z\d]*" />
- <option name="m_minLength" value="1" />
- <option name="m_maxLength" value="20" />
- </inspection_tool>
- <inspection_tool class="ParameterNamingConventionJS" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_regex" value="[a-z][A-Za-z]*" />
- <option name="m_minLength" value="1" />
- <option name="m_maxLength" value="32" />
- </inspection_tool>
- <inspection_tool class="ParametersPerConstructor" enabled="false" level="WARNING" enabled_by_default="false">
- <option name="m_limit" value="10" />
- </inspection_tool>
- <inspection_tool class="ParametersPerFunctionJS" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_limit" value="5" />
- </inspection_tool>
- <inspection_tool class="PlatformDetectionJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="PointlessIndexOfComparison" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="PrivateMemberAccessBetweenOuterAndInnerClass" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ProtectedMemberInFinalClass" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="PublicConstructorInNonPublicClass" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="PublicFieldAccessedInSynchronizedContext" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="PublicStaticArrayField" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="PublicStaticCollectionField" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="QuestionableName" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="nameString" value="aa,abc,bad,bar,bar2,baz,baz1,baz2,baz3,bb,blah,bogus,bool,cc,dd,defau1t,dummy,dummy2,ee,fa1se,ff,foo,foo1,foo2,foo3,foobar,four,fred,fred1,fred2,gg,hh,hello,hello1,hello2,hello3,ii,nu11,one,silly,silly2,string,two,that,then,three,whi1e,var" />
- </inspection_tool>
- <inspection_tool class="RandomDoubleForRandomInteger" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="RawUseOfParameterizedType" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="ignoreObjectConstruction" value="true" />
- <option name="ignoreTypeCasts" value="false" />
- </inspection_tool>
- <inspection_tool class="ReadObjectAndWriteObjectPrivate" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ReadObjectInitialization" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ReadResolveAndWriteReplaceProtected" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="RecordStoreResource" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="RedundantFieldInitialization" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="RedundantImplements" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="ignoreSerializable" value="false" />
- <option name="ignoreCloneable" value="false" />
- </inspection_tool>
- <inspection_tool class="RedundantImport" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="RedundantMethodOverride" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="RedundantSuppression" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="RedundantThrowsDeclaration" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="RefusedBequest" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="ignoreEmptySuperMethods" value="false" />
- </inspection_tool>
- <inspection_tool class="ReplaceAllDot" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ReplaceAssignmentWithOperatorAssignment" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="ignoreLazyOperators" value="true" />
- <option name="ignoreObscureOperators" value="false" />
- </inspection_tool>
- <inspection_tool class="ReplaceAssignmentWithOperatorAssignmentJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ResultOfObjectAllocationIgnored" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ResultSetIndexZero" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ReturnOfCollectionField" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="ignorePrivateMethods" value="true" />
- </inspection_tool>
- <inspection_tool class="ReturnOfDateField" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ReturnThis" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ReuseOfLocalVariable" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ReuseOfLocalVariableJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="RuntimeExec" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="RuntimeExecWithNonConstantString" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="SafeLock" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="SamePackageImport" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="SerialPersistentFieldsWithWrongSignature" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="SerialVersionUIDNotStaticFinal" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="SerializableClassInSecureContext" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="SerializableHasSerialVersionUIDField" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="superClassString" value="java.awt.Component" />
- </inspection_tool>
- <inspection_tool class="SerializableHasSerializationMethods" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="superClassString" value="java.awt.Component" />
- </inspection_tool>
- <inspection_tool class="SerializableInnerClassHasSerialVersionUIDField" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="superClassString" value="java.awt.Component" />
- </inspection_tool>
- <inspection_tool class="SerializableInnerClassWithNonSerializableOuterClass" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="superClassString" value="java.awt.Component" />
- </inspection_tool>
- <inspection_tool class="SerializableWithUnconstructableAncestor" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="SetReplaceableByEnumSet" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="SetupCallsSuperSetup" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="SetupIsPublicVoidNoArg" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="SignalWithoutCorrespondingAwait" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="SimpleDateFormatWithoutLocale" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="SimplifiableJUnitAssertion" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="SizeReplaceableByIsEmpty" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="ignoreNegations" value="false" />
- </inspection_tool>
- <inspection_tool class="SleepWhileHoldingLock" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="SocketResource" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="StandardVariableNames" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="StatementsPerFunctionJS" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_limit" value="30" />
- </inspection_tool>
- <inspection_tool class="StaticCallOnSubclass" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="StaticFieldReferenceOnSubclass" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="StaticInheritance" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="StaticMethodNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_regex" value="[a-z][A-Za-z\d]*" />
- <option name="m_minLength" value="4" />
- <option name="m_maxLength" value="32" />
- </inspection_tool>
- <inspection_tool class="StaticMethodOnlyUsedInOneClass" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="StaticSuite" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="StaticVariableNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="checkMutableFinals" value="false" />
- <option name="m_regex" value="[a-z][A-Za-z\d]*" />
- <option name="m_minLength" value="5" />
- <option name="m_maxLength" value="32" />
- </inspection_tool>
- <inspection_tool class="StaticVariableUninitializedUse" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_ignorePrimitives" value="false" />
- </inspection_tool>
- <inspection_tool class="StringBufferMustHaveInitialCapacity" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="StringBufferReplaceableByString" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="StringBufferReplaceableByStringBuilder" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="StringBufferToStringInConcatenation" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="StringConcatenationInLoops" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_ignoreUnlessAssigned" value="false" />
- </inspection_tool>
- <inspection_tool class="StringEqualsEmptyString" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="StringLiteralBreaksHTMLJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="StringReplaceableByStringBuffer" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="onlyWarnOnLoop" value="true" />
- </inspection_tool>
- <inspection_tool class="StringTokenizer" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="SubstringZero" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="SubtractionInCompareTo" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="SuspiciousIndentAfterControlStatement" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="SwitchStatementWithConfusingDeclaration" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="SwitchStatementWithNoDefaultBranchJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="SwitchStatementWithTooFewBranches" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_limit" value="2" />
- </inspection_tool>
- <inspection_tool class="SwitchStatementsWithoutDefault" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_ignoreFullyCoveredEnums" value="true" />
- </inspection_tool>
- <inspection_tool class="SynchronizeOnLock" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="SynchronizeOnThis" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="SynchronizedMethod" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_includeNativeMethods" value="true" />
- </inspection_tool>
- <inspection_tool class="SynchronizedOnLiteralObject" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="SystemExit" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="SystemGC" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="SystemGetenv" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="SystemOutErr" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="SystemRunFinalizersOnExit" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="TailRecursion" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="TailRecursionJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="TeardownCallsSuperTeardown" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="TeardownIsPublicVoidNoArg" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="TestCaseInProductCode" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="TestCaseWithConstructor" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="TestCaseWithNoTestMethods" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="ignoreSupers" value="false" />
- </inspection_tool>
- <inspection_tool class="TestMethodInProductCode" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="TestMethodIsPublicVoidNoArg" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="TestMethodWithoutAssertion" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="TestOnlyProblems" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="TextLabelInSwitchStatement" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="TextLabelInSwitchStatementJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ThisEscapedInConstructor" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ThreadDeathRethrown" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ThreadDumpStack" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ThreadPriority" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ThreadRun" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ThreadStartInConstruction" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ThreadStopSuspendResume" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ThreadWithDefaultRunMethod" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ThreadYield" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ThreeNegationsPerFunctionJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ThrowCaughtLocally" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="ignoreRethrownExceptions" value="false" />
- </inspection_tool>
- <inspection_tool class="ThrowablePrintStackTrace" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ThrownExceptionsPerMethod" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_limit" value="3" />
- </inspection_tool>
- <inspection_tool class="TimeToString" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="TooBroadCatch" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="onlyWarnOnRootExceptions" value="false" />
- </inspection_tool>
- <inspection_tool class="TooBroadScope" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_allowConstructorAsInitializer" value="false" />
- <option name="m_onlyLookAtBlocks" value="false" />
- </inspection_tool>
- <inspection_tool class="TransientFieldInNonSerializableClass" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="TransientFieldNotInitialized" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="TrivialStringConcatenation" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="TypeMayBeWeakened" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="useRighthandTypeAsWeakestTypeInAssignments" value="true" />
- <option name="useParameterizedTypeForCollectionMethods" value="true" />
- <option name="doNotWeakenToJavaLangObject" value="true" />
- </inspection_tool>
- <inspection_tool class="TypeParameterExtendsFinalClass" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="TypeParameterHidesVisibleType" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="TypeParameterNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_regex" value="[A-Z]" />
- <option name="m_minLength" value="1" />
- <option name="m_maxLength" value="1" />
- </inspection_tool>
- <inspection_tool class="UNCHECKED_WARNING" enabled="false" level="WARNING" enabled_by_default="false" />
- <inspection_tool class="UnaryPlus" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="UnconditionalWait" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="UnconstructableTestCase" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="UnnecessarilyQualifiedStaticUsage" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_ignoreStaticFieldAccesses" value="false" />
- <option name="m_ignoreStaticMethodCalls" value="false" />
- <option name="m_ignoreStaticAccessFromStaticContext" value="false" />
- </inspection_tool>
- <inspection_tool class="UnnecessaryBlockStatement" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="UnnecessaryConstructor" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="UnnecessaryEnumModifier" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="UnnecessaryFinalOnParameter" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="onlyWarnOnAbstractMethods" value="true" />
- </inspection_tool>
- <inspection_tool class="UnnecessaryFullyQualifiedName" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="m_ignoreJavadoc" value="false" />
- </inspection_tool>
- <inspection_tool class="UnnecessaryInterfaceModifier" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="UnnecessaryQualifierForThis" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="UnnecessarySuperConstructor" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="UnnecessaryThis" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="UnnecessaryUnaryMinus" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="UnpredictableBigDecimalConstructorCall" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="ignoreReferences" value="true" />
- <option name="ignoreComplexLiterals" value="false" />
- </inspection_tool>
- <inspection_tool class="UnusedAssignment" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="REPORT_PREFIX_EXPRESSIONS" value="true" />
- <option name="REPORT_POSTFIX_EXPRESSIONS" value="true" />
- <option name="REPORT_REDUNDANT_INITIALIZER" value="true" />
- </inspection_tool>
- <inspection_tool class="UnusedImport" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="UnusedLibrary" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="UnusedProperty" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="UpperCaseFieldNameNotConstant" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="UseOfAWTPeerClass" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="UseOfAnotherObjectsPrivateField" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="UseOfJDBCDriverClass" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="UseOfProcessBuilder" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="UseOfPropertiesAsHashtable" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="UseOfSunClasses" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="UtilityClassWithoutPrivateConstructor" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="ignoreClassesWithOnlyMain" value="false" />
- </inspection_tool>
- <inspection_tool class="VoidExpressionJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="VolatileArrayField" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="WaitCalledOnCondition" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="WaitNotInLoop" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="WaitNotInSynchronizedContext" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="WaitOrAwaitWithoutTimeout" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="WaitWhileHoldingTwoLocks" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="WaitWithoutCorrespondingNotify" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="WeakerAccess" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="SUGGEST_PACKAGE_LOCAL_FOR_MEMBERS" value="true" />
- <option name="SUGGEST_PACKAGE_LOCAL_FOR_TOP_CLASSES" value="true" />
- <option name="SUGGEST_PRIVATE_FOR_INNERS" value="true" />
- </inspection_tool>
- <inspection_tool class="WhileLoopSpinsOnField" enabled="true" level="WARNING" enabled_by_default="true">
- <option name="ignoreNonEmtpyLoops" value="false" />
- </inspection_tool>
- <inspection_tool class="WithStatementJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="XHTMLIncompatabilitiesJS" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="ZeroLengthArrayInitialization" enabled="true" level="WARNING" enabled_by_default="true" />
- </profile>
- </profiles>
- <option name="PROJECT_PROFILE" value="Project Default" />
- <option name="USE_PROJECT_PROFILE" value="true" />
- <version value="1.0" />
- </component>
- <component name="IssueNavigationConfiguration">
- <option name="links">
- <list>
- <IssueNavigationLink>
- <option name="issueRegexp" value="\d+" />
- <option name="linkRegexp" value="http://sourceforge.net/support/tracker.php?aid=$0" />
- </IssueNavigationLink>
- </list>
- </option>
- </component>
- <component name="JavadocGenerationManager">
- <option name="OUTPUT_DIRECTORY" />
- <option name="OPTION_SCOPE" value="protected" />
- <option name="OPTION_HIERARCHY" value="true" />
- <option name="OPTION_NAVIGATOR" value="true" />
- <option name="OPTION_INDEX" value="true" />
- <option name="OPTION_SEPARATE_INDEX" value="true" />
- <option name="OPTION_DOCUMENT_TAG_USE" value="false" />
- <option name="OPTION_DOCUMENT_TAG_AUTHOR" value="false" />
- <option name="OPTION_DOCUMENT_TAG_VERSION" value="false" />
- <option name="OPTION_DOCUMENT_TAG_DEPRECATED" value="true" />
- <option name="OPTION_DEPRECATED_LIST" value="true" />
- <option name="OTHER_OPTIONS" value="" />
- <option name="HEAP_SIZE" />
- <option name="LOCALE" />
- <option name="OPEN_IN_BROWSER" value="true" />
- </component>
- <component name="Palette2">
- <group name="Swing">
- <item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
- <default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
- </item>
- <item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
- <default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
- </item>
- <item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
- <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
- </item>
- <item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
- <default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
- </item>
- <item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
- <initial-values>
- <property name="text" value="Button" />
- </initial-values>
- </item>
- <item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
- <initial-values>
- <property name="text" value="RadioButton" />
- </initial-values>
- </item>
- <item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
- <initial-values>
- <property name="text" value="CheckBox" />
- </initial-values>
- </item>
- <item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
- <default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
- <initial-values>
- <property name="text" value="Label" />
- </initial-values>
- </item>
- <item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
- <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
- <preferred-size width="150" height="-1" />
- </default-constraints>
- </item>
- <item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
- <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
- <preferred-size width="150" height="-1" />
- </default-constraints>
- </item>
- <item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
- <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
- <preferred-size width="150" height="-1" />
- </default-constraints>
- </item>
- <item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
- <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
- <preferred-size width="150" height="50" />
- </default-constraints>
- </item>
- <item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
- <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
- <preferred-size width="150" height="50" />
- </default-constraints>
- </item>
- <item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
- <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
- <preferred-size width="150" height="50" />
- </default-constraints>
- </item>
- <item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
- <default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
- </item>
- <item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
- <preferred-size width="150" height="50" />
- </default-constraints>
- </item>
- <item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
- <preferred-size width="150" height="50" />
- </default-constraints>
- </item>
- <item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
- <preferred-size width="150" height="50" />
- </default-constraints>
- </item>
- <item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
- <preferred-size width="200" height="200" />
- </default-constraints>
- </item>
- <item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
- <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
- <preferred-size width="200" height="200" />
- </default-constraints>
- </item>
- <item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
- <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
- </item>
- <item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
- </item>
- <item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
- <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
- </item>
- <item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
- </item>
- <item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
- <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
- <preferred-size width="-1" height="20" />
- </default-constraints>
- </item>
- <item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
- <default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
- </item>
- <item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
- </item>
- </group>
- </component>
- <component name="ProjectDetails">
- <option name="projectName" value="jEdit" />
- </component>
- <component name="ProjectDictionaryState">
- <dictionary name="vampire" />
- </component>
- <component name="ProjectModuleManager">
- <modules>
- <module fileurl="file://$PROJECT_DIR$/jars/LatestVersion/LatestVersion.iml" filepath="$PROJECT_DIR$/jars/LatestVersion/LatestVersion.iml" />
- <module fileurl="file://$PROJECT_DIR$/jars/MacOSX/MacOSX.iml" filepath="$PROJECT_DIR$/jars/MacOSX/MacOSX.iml" />
- <module fileurl="file://$PROJECT_DIR$/jars/QuickNotepad/QuickNotepad.iml" filepath="$PROJECT_DIR$/jars/QuickNotepad/QuickNotepad.iml" />
- <module fileurl="file://$PROJECT_DIR$/jEdit.iml" filepath="$PROJECT_DIR$/jEdit.iml" />
- </modules>
- </component>
- <component name="ProjectRootManager" version="2" languageLevel="JDK_1_5" assert-keyword="true" jdk-15="true" project-jdk-name="1.5" project-jdk-type="JavaSDK">
- <output url="file://$PROJECT_DIR$/build/idea" />
- </component>
- <component name="ProjectRunConfigurationManager">
- <configuration default="false" name="jEdit" type="Application" factoryName="Application">
- <log_file path="$PROJECT_DIR$/build/settings/activity.log" checked="true" skipped="true" show_all="false" alias="Activity Log" />
- <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="emma" />
- <extension name="snapshooter" />
- <option name="MAIN_CLASS_NAME" value="org.gjt.sp.jedit.jEdit" />
- <option name="VM_PARAMETERS" value="-Xmx192M" />
- <option name="PROGRAM_PARAMETERS" value="-settings="$PROJECT_DIR$/build/settings"" />
- <option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
- <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
- <option name="ALTERNATIVE_JRE_PATH" value="" />
- <option name="ENABLE_SWING_INSPECTOR" value="false" />
- <option name="ENV_VARIABLES" />
- <option name="PASS_PARENT_ENVS" value="true" />
- <module name="jEdit" />
- <envs />
- <RunnerSettings RunnerId="Debug">
- <option name="DEBUG_PORT" value="1341" />
- <option name="TRANSPORT" value="0" />
- <option name="LOCAL" value="true" />
- </RunnerSettings>
- <RunnerSettings RunnerId="JProfiler">
- <option name="WINDOW" value="false" />
- <option name="JVMPI" value="false" />
- <option name="INTERPRETED" value="false" />
- </RunnerSettings>
- <RunnerSettings RunnerId="Run" />
- <ConfigurationWrapper RunnerId="Debug" />
- <ConfigurationWrapper RunnerId="JProfiler" />
- <ConfigurationWrapper RunnerId="Run" />
- <method>
- <option name="AntTarget" enabled="true" antfile="file://$PROJECT_DIR$/build.xml" target="build" />
- <option name="Make" enabled="false" />
- <option name="Run Ant target" value="true" />
- </method>
- </configuration>
- <configuration default="false" name="jEdit (background mode)" type="Application" factoryName="Application">
- <log_file path="$PROJECT_DIR$/build/settings/activity.log" checked="true" skipped="true" show_all="false" alias="Activity Log" />
- <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="emma" />
- <extension name="snapshooter" />
- <option name="MAIN_CLASS_NAME" value="org.gjt.sp.jedit.jEdit" />
- <option name="VM_PARAMETERS" value="-Xmx192M" />
- <option name="PROGRAM_PARAMETERS" value="-settings="$PROJECT_DIR$/build/settings" -background" />
- <option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
- <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
- <option name="ALTERNATIVE_JRE_PATH" value="" />
- <option name="ENABLE_SWING_INSPECTOR" value="false" />
- <option name="ENV_VARIABLES" />
- <option name="PASS_PARENT_ENVS" value="true" />
- <module name="jEdit" />
- <envs />
- <RunnerSettings RunnerId="JProfiler">
- <option name="WINDOW" value="false" />
- <option name="JVMPI" value="false" />
- <option name="INTERPRETED" value="false" />
- </RunnerSettings>
- <RunnerSettings RunnerId="Run" />
- <ConfigurationWrapper RunnerId="Run" />
- <method>
- <option name="AntTarget" enabled="true" antfile="file://$PROJECT_DIR$/build.xml" target="build" />
- <option name="Make" enabled="false" />
- <option name="Run Ant target" value="true" />
- </method>
- </configuration>
- <configuration default="false" name="jEdit (Java 6)" type="Application" factoryName="Application">
- <log_file path="$PROJECT_DIR$/build/settings/activity.log" checked="true" skipped="true" show_all="false" alias="Activity Log" />
- <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="emma" />
- <extension name="snapshooter" />
- <option name="MAIN_CLASS_NAME" value="org.gjt.sp.jedit.jEdit" />
- <option name="VM_PARAMETERS" value="-Xmx192M" />
- <option name="PROGRAM_PARAMETERS" value="-settings="$PROJECT_DIR$/build/settings"" />
- <option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
- <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="true" />
- <option name="ALTERNATIVE_JRE_PATH" value="/usr/lib/jvm/java-6-sun" />
- <option name="ENABLE_SWING_INSPECTOR" value="false" />
- <option name="ENV_VARIABLES" />
- <option name="PASS_PARENT_ENVS" value="true" />
- <module name="jEdit" />
- <envs />
- <RunnerSettings RunnerId="Debug">
- <option name="DEBUG_PORT" value="44197" />
- <option name="TRANSPORT" value="0" />
- <option name="LOCAL" value="true" />
- </RunnerSettings>
- <RunnerSettings RunnerId="JProfiler">
- <option name="WINDOW" value="false" />
- <option name="JVMPI" value="false" />
- <option name="INTERPRETED" value="false" />
- </RunnerSettings>
- <RunnerSettings RunnerId="Run" />
- <ConfigurationWrapper RunnerId="Debug" />
- <ConfigurationWrapper RunnerId="JProfiler" />
- <ConfigurationWrapper RunnerId="Run" />
- <method>
- <option name="AntTarget" enabled="true" antfile="file://$PROJECT_DIR$/build.xml" target="build" />
- <option name="Make" enabled="false" />
- <option name="Run Ant target" value="true" />
- </method>
- </configuration>
- <configuration default="false" name="jEdit (Java 6; background mode)" type="Application" factoryName="Application">
- <log_file path="$PROJECT_DIR$/build/settings/activity.log" checked="true" skipped="true" show_all="false" alias="Activity Log" />
- <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="emma" />
- <extension name="snapshooter" />
- <option name="MAIN_CLASS_NAME" value="org.gjt.sp.jedit.jEdit" />
- <option name="VM_PARAMETERS" value="-Xmx192M" />
- <option name="PROGRAM_PARAMETERS" value="-settings="$PROJECT_DIR$/build/settings" -background" />
- <option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
- <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="true" />
- <option name="ALTERNATIVE_JRE_PATH" value="/usr/lib/jvm/java-6-sun" />
- <option name="ENABLE_SWING_INSPECTOR" value="false" />
- <option name="ENV_VARIABLES" />
- <option name="PASS_PARENT_ENVS" value="true" />
- <module name="jEdit" />
- <envs />
- <RunnerSettings RunnerId="JProfiler">
- <option name="WINDOW" value="false" />
- <option name="JVMPI" value="false" />
- <option name="INTERPRETED" value="false" />
- </RunnerSettings>
- <method>
- <option name="AntTarget" enabled="true" antfile="file://$PROJECT_DIR$/build.xml" target="build" />
- <option name="Make" enabled="false" />
- <option name="Run Ant target" value="true" />
- </method>
- </configuration>
- </component>
- <component name="SvnBranchConfigurationManager">
- <option name="myConfigurationMap">
- <map>
- <entry key="$PROJECT_DIR$">
- <value>
- <SvnBranchConfiguration>
- <option name="branchMap">
- <map>
- <entry key="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/branches">
- <value>
- <list>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1218396639209" />
- <option name="revision" value="13258" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/branches/docking_framework" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1176951697724" />
- <option name="revision" value="9462" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/branches/jedit43_nostrings" />
- </SvnBranchItem>
- </list>
- </value>
- </entry>
- <entry key="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags">
- <value>
- <list>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1226862920462" />
- <option name="revision" value="14070" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-3-pre16" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1224211014440" />
- <option name="revision" value="13896" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-3-pre15" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1209312241226" />
- <option name="revision" value="12514" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-3-pre14" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1205435718427" />
- <option name="revision" value="12215" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-3-pre13" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1197063574015" />
- <option name="revision" value="11207" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-3-pre12" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1191436781626" />
- <option name="revision" value="10791" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-3-pre11" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1184190109800" />
- <option name="revision" value="10009" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-3-pre10" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1172940160439" />
- <option name="revision" value="9074" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-0-pre1" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1172938815897" />
- <option name="revision" value="9072" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-3-2-2" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1172934922377" />
- <option name="revision" value="9070" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-1-final" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1172934620160" />
- <option name="revision" value="9069" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-1-pre7" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1172934093879" />
- <option name="revision" value="9068" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-1-pre5" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1172933950791" />
- <option name="revision" value="9067" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-1-pre4" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1172930175040" />
- <option name="revision" value="9066" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-2-pre12" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1172929632216" />
- <option name="revision" value="9065" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-2-pre9" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1172929477203" />
- <option name="revision" value="9064" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-2-pre8" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1172929096756" />
- <option name="revision" value="9063" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-2-pre5" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1169312622101" />
- <option name="revision" value="8692" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-3-pre9" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1163001311391" />
- <option name="revision" value="7992" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-3-pre8" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1159851355117" />
- <option name="revision" value="7163" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-3-pre7" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1155747706518" />
- <option name="revision" value="6701" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-3-pre6" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1152311295000" />
- <option name="revision" value="5556" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/after_bsh-2-0b4" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1152266138000" />
- <option name="revision" value="5554" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/before_bsh-2-0b4" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1152181828000" />
- <option name="revision" value="5542" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-3-pre5" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1152180149000" />
- <option name="revision" value="5540" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-0-pre3" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1152122425000" />
- <option name="revision" value="5531" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-0-pre2" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1150397246000" />
- <option name="revision" value="5442" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit_43_with_gnuregexp_microstarxml" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1147475209000" />
- <option name="revision" value="5388" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-3-pre4" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1136173007000" />
- <option name="revision" value="5329" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-3-pre3" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1110595434000" />
- <option name="revision" value="5202" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-3-pre2" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1108074918000" />
- <option name="revision" value="5182" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/before-fast-scroll" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1104528786000" />
- <option name="revision" value="5165" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-3-pre1" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1094326374000" />
- <option name="revision" value="5129" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/before-selection-manager" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1094264677000" />
- <option name="revision" value="5124" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/before-screen-line-refactoring" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1093748323000" />
- <option name="revision" value="5111" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-2-final" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1090047563000" />
- <option name="revision" value="5085" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-2-pre15" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1086297068000" />
- <option name="revision" value="5058" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-2-pre14" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1084575691000" />
- <option name="revision" value="5043" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-2-pre13" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1079804107000" />
- <option name="revision" value="5002" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-2-pre11" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1079764835000" />
- <option name="revision" value="5000" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-2-pre10" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1072501334000" />
- <option name="revision" value="4944" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/beanshell-2-0b1" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1070236854000" />
- <option name="revision" value="4927" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-2-pre7" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1067201848000" />
- <option name="revision" value="4907" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-2-pre6" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1061570577000" />
- <option name="revision" value="4867" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/crazy-pos-mgr" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1059967153000" />
- <option name="revision" value="4844" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-2-pre4" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1058223654000" />
- <option name="revision" value="4827" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/bsh-13b2-merge" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1057542014000" />
- <option name="revision" value="4821" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-2-pre3" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1054263177000" />
- <option name="revision" value="4749" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-2-pre2" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1052174343000" />
- <option name="revision" value="4685" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/beanshell-1-3" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1051837211000" />
- <option name="revision" value="4676" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-2-pre1" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1045976885000" />
- <option name="revision" value="4511" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/macos-2_0_4" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1045871364000" />
- <option name="revision" value="4508" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-1-pre11" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1045820614000" />
- <option name="revision" value="4504" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/macos-2_0_3" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1045271361000" />
- <option name="revision" value="4482" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-1-pre10" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1043802516000" />
- <option name="revision" value="4451" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-1-pre9" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1042258598000" />
- <option name="revision" value="4425" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-1-pre8" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1037919166000" />
- <option name="revision" value="4380" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-1-pre6" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1029873100000" />
- <option name="revision" value="4318" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-1-pre3" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1024812657000" />
- <option name="revision" value="4284" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-1-pre2" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1024133719000" />
- <option name="revision" value="4256" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-1-pre1" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1018587320000" />
- <option name="revision" value="4140" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-0-final" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1017715362000" />
- <option name="revision" value="4125" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-0-pre9" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1017050868000" />
- <option name="revision" value="4114" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-0-pre8" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1015742549000" />
- <option name="revision" value="4084" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-0-pre7" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1014103275000" />
- <option name="revision" value="4052" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-0-pre6" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1012890490000" />
- <option name="revision" value="4013" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-0-pre5" />
- </SvnBranchItem>
- <SvnBranchItem>
- <option name="creationDateMillis" value="1011744082000" />
- <option name="revision" value="3993" />
- <option name="url" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags/jedit-4-0-pre4" />
- </SvnBranchItem>
- </list>
- </value>
- </entry>
- </map>
- </option>
- <option name="branchUrls">
- <list>
- <option value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/branches" />
- <option value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/tags" />
- </list>
- </option>
- <option name="trunkUrl" value="https://jedit.svn.sourceforge.net/svnroot/jedit/jEdit/trunk" />
- </SvnBranchConfiguration>
- </value>
- </entry>
- </map>
- </option>
- <option name="myVersion" value="124" />
- <option name="mySupportsUserInfoFilter" value="true" />
- </component>
- <component name="VcsDirectoryMappings">
- <mapping directory="" vcs="svn" />
- </component>
- <component name="VcsRevisionGraphProjectComponent">
- <option name="_useTwoTagConvention" value="true" />
- <option name="_showTags" value="true" />
- <option name="_tagNaming" value="TAG_$T_MERGE_$S_TO_$D" />
- <option name="_tagFilter" value="" />
- <option name="_branchFilter" />
- <option name="_showRevisionFilter" value="false" />
- <option name="_afterDateTimeFilter" value="false" />
- <option name="_beforeDateTimeFilter" value="false" />
- <option name="_afterDateTime" value="" />
- <option name="_beforeDateTime" value="" />
- <option name="_projectRoot" value="<Use repository root>" />
- <option name="_trunk" value="trunk" />
- <option name="_branches" value="branches" />
- <option name="_tags" value="tags" />
- <option name="_showTagFilter" value="false" />
- <option name="_showBranchFilter" value="false" />
- </component>
- <component name="WebServicesPlugin" addRequiredLibraries="true" />
-</project>
-
diff --git a/jEdit/jars/LatestVersion/LatestVersion.html b/jEdit/jars/LatestVersion/LatestVersion.html
deleted file mode 100644
index 791eb99..0000000
--- a/jEdit/jars/LatestVersion/LatestVersion.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<html>
-<head>
-<title>LatestVersion Plugin</title>
-</head>
-
-<body>
-
-<h1>LatestVersion Plugin</h1>
-
-This plugin can be used to find out what the latest available jEdit
-version is. To invoke it, select
-<b>Plugins</b>><b>Check jEdit Version</b>. When invoked, it will
-connect to a special URL
-(<code>http://www.jedit.org/jEdit-version.txt</code>),
-which contains version info.
-
-</body>
-</html>
diff --git a/jEdit/jars/LatestVersion/LatestVersion.iml b/jEdit/jars/LatestVersion/LatestVersion.iml
deleted file mode 100644
index a94b1c0..0000000
--- a/jEdit/jars/LatestVersion/LatestVersion.iml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module relativePaths="true" type="JAVA_MODULE" version="4">
- <component name="NewModuleRootManager" inherit-compiler-output="true">
- <exclude-output />
- <content url="file://$MODULE_DIR$">
- <sourceFolder url="file://$MODULE_DIR$" isTestSource="false" />
- </content>
- <orderEntry type="inheritedJdk" />
- <orderEntry type="sourceFolder" forTests="false" />
- <orderEntry type="module" module-name="jEdit" />
- </component>
-</module>
-
diff --git a/jEdit/jars/LatestVersion/LatestVersion.props b/jEdit/jars/LatestVersion/LatestVersion.props
deleted file mode 100644
index 7bf506a..0000000
--- a/jEdit/jars/LatestVersion/LatestVersion.props
+++ /dev/null
@@ -1,42 +0,0 @@
-plugin.LatestVersionPlugin.activate=defer
-
-plugin.LatestVersionPlugin.name=Latest Version Check
-plugin.LatestVersionPlugin.author=Slava Pestov
-plugin.LatestVersionPlugin.version=1.5
-plugin.LatestVersionPlugin.docs=LatestVersion.html
-
-plugin.LatestVersionPlugin.depend.0=jedit 04.02.01.00
-plugin.LatestVersionPlugin.depend.1=jdk 1.4
-
-plugin.LatestVersionPlugin.description=This plugin can be used to find out what \
- the latest available jEdit version is.
-plugin.LatestVersionPlugin.longdescription=LatestVersion.txt
-
-plugin.LatestVersionPlugin.menu-item=version-check
-
-version-check.label=Check jEdit Version
-
-version-check.stable.title=Version Status
-version-check.stable.message=You are using the stable branch of jEdit, version {0}.\n\n\
- The latest stable release is {1}.\n\
- The latest development release is {2}.\n\n\
- Do you want to see more information?
-
-version-check.stable-nodevel.title=Version Status
-version-check.stable-nodevel.message=You are using the stable branch of jEdit, version {0}.\n\n\
- The latest stable release is {1}.\n\n\
- Do you want to see more information?
-
-version-check.devel.title=Version Status
-version-check.devel.message=You are using the development branch of jEdit, version {0}.\n\n\
- The latest development release is {2}.\n\
- The latest stable release is {1}.\n\n\
- Do you want to see more information?
-
-version-check.devel-nodevel.title=Version Status
-version-check.devel-nodevel.message=You are using the development branch of jEdit, version {0}.\n\n\
- Currently, no development release is available.\n\
- The latest stable release is {1}.\n\n\
- Do you want to see more information?
-
-version-check.url=http://www.jedit.org/jEdit-version.txt
diff --git a/jEdit/jars/LatestVersion/LatestVersion.txt b/jEdit/jars/LatestVersion/LatestVersion.txt
deleted file mode 100644
index 61687bf..0000000
--- a/jEdit/jars/LatestVersion/LatestVersion.txt
+++ /dev/null
@@ -1 +0,0 @@
-This plugin can be used to find out what the latest available jEdit version is. To invoke it, select Plugins->Check jEdit Version. When invoked, it will connect to a special URL (http://www.jedit.org/jEdit-version.txt), which contains version info.
diff --git a/jEdit/jars/LatestVersion/LatestVersionPlugin.java b/jEdit/jars/LatestVersion/LatestVersionPlugin.java
deleted file mode 100644
index 1570b4e..0000000
--- a/jEdit/jars/LatestVersion/LatestVersionPlugin.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * LatestVersionPlugin.java - Latest Version Check Plugin
- * Copyright (C) 1999, 2003 Slava Pestov
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-import javax.swing.JOptionPane;
-import java.io.*;
-import java.net.URL;
-import org.gjt.sp.jedit.*;
-
-public class LatestVersionPlugin extends EditPlugin
-{
- public static void doVersionCheck(View view)
- {
- view.showWaitCursor();
-
- try
- {
- URL url = new URL(jEdit.getProperty(
- "version-check.url"));
- InputStream in = url.openStream();
- BufferedReader bin = new BufferedReader(
- new InputStreamReader(in));
-
- String line;
- String develBuild = null;
- String stableBuild = null;
- while((line = bin.readLine()) != null)
- {
- if(line.startsWith(".build"))
- develBuild = line.substring(6).trim();
- else if(line.startsWith(".stablebuild"))
- stableBuild = line.substring(12).trim();
- }
-
- bin.close();
-
- if(develBuild != null && stableBuild != null)
- {
- doVersionCheck(view,stableBuild,develBuild);
- }
- }
- catch(IOException e)
- {
- String[] args = { jEdit.getProperty("version-check.url"),
- e.toString() };
- GUIUtilities.error(view,"read-error",args);
- }
-
- view.hideWaitCursor();
- }
-
- public static void doVersionCheck(View view, String stableBuild,
- String develBuild)
- {
- String myBuild = jEdit.getBuild();
- String pre = myBuild.substring(6,7);
- String variant;
- String build;
-
- if(pre.equals("99"))
- {
- variant = "stable";
- build = stableBuild;
- }
- else
- {
- variant = "devel";
- build = develBuild;
- }
-
- // special case: no current development version
- if(develBuild.compareTo(stableBuild) < 0)
- variant += "-nodevel";
-
- int retVal = GUIUtilities.confirm(view,"version-check." + variant,
- new String[] { MiscUtilities.buildToVersion(myBuild),
- MiscUtilities.buildToVersion(stableBuild),
- MiscUtilities.buildToVersion(develBuild) },
- JOptionPane.YES_NO_OPTION,
- JOptionPane.QUESTION_MESSAGE);
- if(retVal == JOptionPane.YES_OPTION)
- jEdit.openFile(view,jEdit.getProperty("version-check.url"));
- }
-}
diff --git a/jEdit/jars/LatestVersion/actions.xml b/jEdit/jars/LatestVersion/actions.xml
deleted file mode 100644
index 98f5be3..0000000
--- a/jEdit/jars/LatestVersion/actions.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE ACTIONS SYSTEM "actions.dtd">
-
-<ACTIONS>
- <ACTION NAME="version-check">
- <CODE>
- LatestVersionPlugin.doVersionCheck(view);
- </CODE>
- </ACTION>
-</ACTIONS>
diff --git a/jEdit/jars/LatestVersion/build.xml b/jEdit/jars/LatestVersion/build.xml
deleted file mode 100644
index a6798b8..0000000
--- a/jEdit/jars/LatestVersion/build.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0"?>
-<project name="LatestVersion"
- default="build">
- <description>
- This is an ant build.xml file for building the LatestVersion plugin for jEdit.
- </description>
-
- <property file="build.properties"/>
- <property file="../build.properties"/>
-
- <property name="jedit.install.dir"
- location="../../build" />
- <property name="docs-proc.target"
- value="none" />
-
- <property name="build.support"
- value="../../../build-support" />
- <import file="${build.support}/plugin-build.xml" />
-
- <selector id="packageFiles">
- <filename name="LatestVersion.html" />
- </selector>
-</project>
diff --git a/jEdit/jars/MacOSX/MacOSX.iml b/jEdit/jars/MacOSX/MacOSX.iml
index a94b1c0..d8fc64d 100644
--- a/jEdit/jars/MacOSX/MacOSX.iml
+++ b/jEdit/jars/MacOSX/MacOSX.iml
@@ -1,13 +1,13 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module relativePaths="true" type="JAVA_MODULE" version="4">
- <component name="NewModuleRootManager" inherit-compiler-output="true">
- <exclude-output />
- <content url="file://$MODULE_DIR$">
- <sourceFolder url="file://$MODULE_DIR$" isTestSource="false" />
- </content>
- <orderEntry type="inheritedJdk" />
- <orderEntry type="sourceFolder" forTests="false" />
- <orderEntry type="module" module-name="jEdit" />
- </component>
-</module>
-
+<?xml version="1.0" encoding="UTF-8"?>
+<module relativePaths="true" type="JAVA_MODULE" version="4">
+ <component name="NewModuleRootManager" inherit-compiler-output="true">
+ <exclude-output />
+ <content url="file://$MODULE_DIR$">
+ <sourceFolder url="file://$MODULE_DIR$" isTestSource="false" />
+ </content>
+ <orderEntry type="inheritedJdk" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ <orderEntry type="module" module-name="jEdit" />
+ </component>
+</module>
+
diff --git a/jEdit/jars/MacOSX/macosx/MacOSXPlugin.java b/jEdit/jars/MacOSX/macosx/MacOSXPlugin.java
index 3a1947e..c96f573 100644
--- a/jEdit/jars/MacOSX/macosx/MacOSXPlugin.java
+++ b/jEdit/jars/MacOSX/macosx/MacOSXPlugin.java
@@ -65,7 +65,7 @@ public class MacOSXPlugin extends EBPlugin
{
// Fix key bindings for OS X for anything other than Aqua LNF
// See: http://lists.apple.com/archives/java-dev/2008/Apr/msg00209.html
- if (lf.equalsIgnoreCase("apple.laf.aqualookandfeel") == false)
+ if (!UIManager.getLookAndFeel().isNativeLookAndFeel())
{
Log.log(Log.DEBUG, this, "Fixing keybindingds on current LNF");
UIDefaults uid = UIManager.getLookAndFeelDefaults();
diff --git a/jEdit/jars/QuickNotepad/QuickNotepad.iml b/jEdit/jars/QuickNotepad/QuickNotepad.iml
index a94b1c0..d8fc64d 100644
--- a/jEdit/jars/QuickNotepad/QuickNotepad.iml
+++ b/jEdit/jars/QuickNotepad/QuickNotepad.iml
@@ -1,13 +1,13 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module relativePaths="true" type="JAVA_MODULE" version="4">
- <component name="NewModuleRootManager" inherit-compiler-output="true">
- <exclude-output />
- <content url="file://$MODULE_DIR$">
- <sourceFolder url="file://$MODULE_DIR$" isTestSource="false" />
- </content>
- <orderEntry type="inheritedJdk" />
- <orderEntry type="sourceFolder" forTests="false" />
- <orderEntry type="module" module-name="jEdit" />
- </component>
-</module>
-
+<?xml version="1.0" encoding="UTF-8"?>
+<module relativePaths="true" type="JAVA_MODULE" version="4">
+ <component name="NewModuleRootManager" inherit-compiler-output="true">
+ <exclude-output />
+ <content url="file://$MODULE_DIR$">
+ <sourceFolder url="file://$MODULE_DIR$" isTestSource="false" />
+ </content>
+ <orderEntry type="inheritedJdk" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ <orderEntry type="module" module-name="jEdit" />
+ </component>
+</module>
+
diff --git a/jEdit/jars/QuickNotepad/QuickNotepad.java b/jEdit/jars/QuickNotepad/QuickNotepad.java
index 94f36d9..1df7b80 100644
--- a/jEdit/jars/QuickNotepad/QuickNotepad.java
+++ b/jEdit/jars/QuickNotepad/QuickNotepad.java
@@ -1,244 +1,244 @@
-/*
- * QuickNotepad.java
- * part of the QuickNotepad plugin for the jEdit text editor
- * Copyright (C) 2001 John Gellene
- * jgellene at nyc.rr.com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id: QuickNotepad.java 12504 2008-04-22 23:12:43Z ezust $
- */
-
-// {{{ imports
-import java.awt.BorderLayout;
-import java.awt.Dimension;
-import java.awt.Font;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-
-import javax.swing.JFileChooser;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-
-import org.gjt.sp.jedit.EBComponent;
-import org.gjt.sp.jedit.EBMessage;
-import org.gjt.sp.jedit.EditBus;
-import org.gjt.sp.jedit.GUIUtilities;
-import org.gjt.sp.jedit.View;
-import org.gjt.sp.jedit.jEdit;
-import org.gjt.sp.jedit.gui.DefaultFocusComponent;
-import org.gjt.sp.jedit.gui.DockableWindowManager;
-import org.gjt.sp.jedit.msg.PropertiesChanged;
-import org.gjt.sp.util.Log;
-import org.gjt.sp.util.StandardUtilities;
-// }}}
-
-// {{{ QuickNotePad class
-/**
- *
- * QuickNotePad - a dockable JPanel, a demonstration of a jEdit plugin.
- *
- */
-public class QuickNotepad extends JPanel
- implements EBComponent, QuickNotepadActions, DefaultFocusComponent {
-
- // {{{ Instance Variables
- private static final long serialVersionUID = 6412255692894321789L;
-
- private String filename;
-
- private String defaultFilename;
-
- private View view;
-
- private boolean floating;
-
- private QuickNotepadTextArea textArea;
-
- private QuickNotepadToolPanel toolPanel;
- // }}}
-
- // {{{ Constructor
- /**
- *
- * @param view the current jedit window
- * @param position a variable passed in from the script in actions.xml,
- * which can be DockableWindowManager.FLOATING, TOP, BOTTOM, LEFT, RIGHT, etc.
- * see @ref DockableWindowManager for possible values.
- */
- public QuickNotepad(View view, String position) {
- super(new BorderLayout());
- this.view = view;
- this.floating = position.equals(DockableWindowManager.FLOATING);
-
- if (jEdit.getSettingsDirectory() != null) {
- this.filename = jEdit.getProperty(QuickNotepadPlugin.OPTION_PREFIX
- + "filepath");
- if (this.filename == null || this.filename.length() == 0) {
- this.filename = new String(jEdit.getSettingsDirectory()
- + File.separator + "qn.txt");
- jEdit.setProperty(
- QuickNotepadPlugin.OPTION_PREFIX + "filepath",
- this.filename);
- }
- this.defaultFilename = this.filename;
- }
-
- this.toolPanel = new QuickNotepadToolPanel(this);
- add(BorderLayout.NORTH, this.toolPanel);
-
- if (floating)
- this.setPreferredSize(new Dimension(500, 250));
-
- textArea = new QuickNotepadTextArea();
- textArea.setFont(QuickNotepadOptionPane.makeFont());
-
- JScrollPane pane = new JScrollPane(textArea);
- add(BorderLayout.CENTER, pane);
-
- readFile();
- }
- // }}}
-
- // {{{ Member Functions
-
- // {{{ focusOnDefaultComponent
- public void focusOnDefaultComponent() {
- textArea.requestFocus();
- }
- // }}}
-
- // {{{ getFileName
- public String getFilename() {
- return filename;
- }
- // }}}
-
- // EBComponent implementation
-
- // {{{ handleMessage
- public void handleMessage(EBMessage message) {
- if (message instanceof PropertiesChanged) {
- propertiesChanged();
- }
- }
- // }}}
-
- // {{{ propertiesChanged
- private void propertiesChanged() {
- String propertyFilename = jEdit
- .getProperty(QuickNotepadPlugin.OPTION_PREFIX + "filepath");
- if (!StandardUtilities.objectsEqual(defaultFilename, propertyFilename)) {
- saveFile();
- toolPanel.propertiesChanged();
- defaultFilename = propertyFilename;
- filename = defaultFilename;
- readFile();
- }
- Font newFont = QuickNotepadOptionPane.makeFont();
- if (!newFont.equals(textArea.getFont())) {
- textArea.setFont(newFont);
- }
- }
- // }}}
-
- // These JComponent methods provide the appropriate points
- // to subscribe and unsubscribe this object to the EditBus.
-
- // {{{ addNotify
- public void addNotify() {
- super.addNotify();
- EditBus.addToBus(this);
- }
- // }}}
-
- // {{{ removeNotify
- public void removeNotify() {
- saveFile();
- super.removeNotify();
- EditBus.removeFromBus(this);
- }
- // }}}
-
- // QuickNotepadActions implementation
-
- // {{{
- public void saveFile() {
- if (filename == null || filename.length() == 0)
- return;
- try {
- FileWriter out = new FileWriter(filename);
- out.write(textArea.getText());
- out.close();
- } catch (IOException ioe) {
- Log.log(Log.ERROR, QuickNotepad.class,
- "Could not write notepad text to " + filename);
- }
- }
- // }}}
-
- // {{{ chooseFile
- public void chooseFile() {
- String[] paths = GUIUtilities.showVFSFileDialog(view, null,
- JFileChooser.OPEN_DIALOG, false);
- if (paths != null && !paths[0].equals(filename)) {
- saveFile();
- filename = paths[0];
- toolPanel.propertiesChanged();
- readFile();
- }
- }
- // }}}
-
- // {{{ copyToBuffer
- public void copyToBuffer() {
- jEdit.newFile(view);
- view.getEditPane().getTextArea().setText(textArea.getText());
- }
- // }}}
- // {{{ readFile()
- /**
- * Helper method
- */
- private void readFile() {
- if (filename == null || filename.length() == 0)
- return;
-
- BufferedReader bf = null;
- try {
- bf = new BufferedReader(new FileReader(filename));
- StringBuffer sb = new StringBuffer(2048);
- String str;
- while ((str = bf.readLine()) != null) {
- sb.append(str).append('\n');
- }
- bf.close();
- textArea.setText(sb.toString());
- } catch (FileNotFoundException fnf) {
- Log.log(Log.ERROR, QuickNotepad.class, "notepad file " + filename
- + " does not exist");
- } catch (IOException ioe) {
- Log.log(Log.ERROR, QuickNotepad.class,
- "could not read notepad file " + filename);
- }
- }
- // }}}
- // }}}
-}
-// }}}
+/*
+ * QuickNotepad.java
+ * part of the QuickNotepad plugin for the jEdit text editor
+ * Copyright (C) 2001 John Gellene
+ * jgellene at nyc.rr.com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id: QuickNotepad.java 12504 2008-04-22 23:12:43Z ezust $
+ */
+
+// {{{ imports
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+
+import javax.swing.JFileChooser;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+
+import org.gjt.sp.jedit.EBComponent;
+import org.gjt.sp.jedit.EBMessage;
+import org.gjt.sp.jedit.EditBus;
+import org.gjt.sp.jedit.GUIUtilities;
+import org.gjt.sp.jedit.View;
+import org.gjt.sp.jedit.jEdit;
+import org.gjt.sp.jedit.gui.DefaultFocusComponent;
+import org.gjt.sp.jedit.gui.DockableWindowManager;
+import org.gjt.sp.jedit.msg.PropertiesChanged;
+import org.gjt.sp.util.Log;
+import org.gjt.sp.util.StandardUtilities;
+// }}}
+
+// {{{ QuickNotePad class
+/**
+ *
+ * QuickNotePad - a dockable JPanel, a demonstration of a jEdit plugin.
+ *
+ */
+public class QuickNotepad extends JPanel
+ implements EBComponent, QuickNotepadActions, DefaultFocusComponent {
+
+ // {{{ Instance Variables
+ private static final long serialVersionUID = 6412255692894321789L;
+
+ private String filename;
+
+ private String defaultFilename;
+
+ private View view;
+
+ private boolean floating;
+
+ private QuickNotepadTextArea textArea;
+
+ private QuickNotepadToolPanel toolPanel;
+ // }}}
+
+ // {{{ Constructor
+ /**
+ *
+ * @param view the current jedit window
+ * @param position a variable passed in from the script in actions.xml,
+ * which can be DockableWindowManager.FLOATING, TOP, BOTTOM, LEFT, RIGHT, etc.
+ * see @ref DockableWindowManager for possible values.
+ */
+ public QuickNotepad(View view, String position) {
+ super(new BorderLayout());
+ this.view = view;
+ this.floating = position.equals(DockableWindowManager.FLOATING);
+
+ if (jEdit.getSettingsDirectory() != null) {
+ this.filename = jEdit.getProperty(QuickNotepadPlugin.OPTION_PREFIX
+ + "filepath");
+ if (this.filename == null || this.filename.length() == 0) {
+ this.filename = new String(jEdit.getSettingsDirectory()
+ + File.separator + "qn.txt");
+ jEdit.setProperty(
+ QuickNotepadPlugin.OPTION_PREFIX + "filepath",
+ this.filename);
+ }
+ this.defaultFilename = this.filename;
+ }
+
+ this.toolPanel = new QuickNotepadToolPanel(this);
+ add(BorderLayout.NORTH, this.toolPanel);
+
+ if (floating)
+ this.setPreferredSize(new Dimension(500, 250));
+
+ textArea = new QuickNotepadTextArea();
+ textArea.setFont(QuickNotepadOptionPane.makeFont());
+
+ JScrollPane pane = new JScrollPane(textArea);
+ add(BorderLayout.CENTER, pane);
+
+ readFile();
+ }
+ // }}}
+
+ // {{{ Member Functions
+
+ // {{{ focusOnDefaultComponent
+ public void focusOnDefaultComponent() {
+ textArea.requestFocus();
+ }
+ // }}}
+
+ // {{{ getFileName
+ public String getFilename() {
+ return filename;
+ }
+ // }}}
+
+ // EBComponent implementation
+
+ // {{{ handleMessage
+ public void handleMessage(EBMessage message) {
+ if (message instanceof PropertiesChanged) {
+ propertiesChanged();
+ }
+ }
+ // }}}
+
+ // {{{ propertiesChanged
+ private void propertiesChanged() {
+ String propertyFilename = jEdit
+ .getProperty(QuickNotepadPlugin.OPTION_PREFIX + "filepath");
+ if (!StandardUtilities.objectsEqual(defaultFilename, propertyFilename)) {
+ saveFile();
+ toolPanel.propertiesChanged();
+ defaultFilename = propertyFilename;
+ filename = defaultFilename;
+ readFile();
+ }
+ Font newFont = QuickNotepadOptionPane.makeFont();
+ if (!newFont.equals(textArea.getFont())) {
+ textArea.setFont(newFont);
+ }
+ }
+ // }}}
+
+ // These JComponent methods provide the appropriate points
+ // to subscribe and unsubscribe this object to the EditBus.
+
+ // {{{ addNotify
+ public void addNotify() {
+ super.addNotify();
+ EditBus.addToBus(this);
+ }
+ // }}}
+
+ // {{{ removeNotify
+ public void removeNotify() {
+ saveFile();
+ super.removeNotify();
+ EditBus.removeFromBus(this);
+ }
+ // }}}
+
+ // QuickNotepadActions implementation
+
+ // {{{
+ public void saveFile() {
+ if (filename == null || filename.length() == 0)
+ return;
+ try {
+ FileWriter out = new FileWriter(filename);
+ out.write(textArea.getText());
+ out.close();
+ } catch (IOException ioe) {
+ Log.log(Log.ERROR, QuickNotepad.class,
+ "Could not write notepad text to " + filename);
+ }
+ }
+ // }}}
+
+ // {{{ chooseFile
+ public void chooseFile() {
+ String[] paths = GUIUtilities.showVFSFileDialog(view, null,
+ JFileChooser.OPEN_DIALOG, false);
+ if (paths != null && !paths[0].equals(filename)) {
+ saveFile();
+ filename = paths[0];
+ toolPanel.propertiesChanged();
+ readFile();
+ }
+ }
+ // }}}
+
+ // {{{ copyToBuffer
+ public void copyToBuffer() {
+ jEdit.newFile(view);
+ view.getEditPane().getTextArea().setText(textArea.getText());
+ }
+ // }}}
+ // {{{ readFile()
+ /**
+ * Helper method
+ */
+ private void readFile() {
+ if (filename == null || filename.length() == 0)
+ return;
+
+ BufferedReader bf = null;
+ try {
+ bf = new BufferedReader(new FileReader(filename));
+ StringBuffer sb = new StringBuffer(2048);
+ String str;
+ while ((str = bf.readLine()) != null) {
+ sb.append(str).append('\n');
+ }
+ bf.close();
+ textArea.setText(sb.toString());
+ } catch (FileNotFoundException fnf) {
+ Log.log(Log.ERROR, QuickNotepad.class, "notepad file " + filename
+ + " does not exist");
+ } catch (IOException ioe) {
+ Log.log(Log.ERROR, QuickNotepad.class,
+ "could not read notepad file " + filename);
+ }
+ }
+ // }}}
+ // }}}
+}
+// }}}
diff --git a/jEdit/jars/QuickNotepad/QuickNotepad.props b/jEdit/jars/QuickNotepad/QuickNotepad.props
index b1b6b0f..46d63e0 100644
--- a/jEdit/jars/QuickNotepad/QuickNotepad.props
+++ b/jEdit/jars/QuickNotepad/QuickNotepad.props
@@ -1,67 +1,67 @@
-# Properties file for QuickNotepad plugin
-# $Id: QuickNotepad.props 6876 2006-09-02 20:39:49Z jchoyt $
-
-# jEdit only needs to load the plugin the first time the user accesses it
-# the presence of this property also tells jEdit the plugin is using the new API
-plugin.QuickNotepadPlugin.activate=defer
-
-# These two properties are required for all plugins
-plugin.QuickNotepadPlugin.name=QuickNotepad
-plugin.QuickNotepadPlugin.author=John Gellene
-
-# version number == jEdit version number
-plugin.QuickNotepadPlugin.version=4.3
-
-# online help
-plugin.QuickNotepadPlugin.docs=index.html
-
-# we only have one dependency, jEdit 4.2, since we use the new plugin API
-plugin.QuickNotepadPlugin.depend.0=jedit 04.02.01.00
-plugin.QuickNotepadPlugin.depend.1=jdk 1.4
-
-plugin.QuickNotepadPlugin.description=This plugin provides a dockable "scratch pad" for writing and displaying notes, to do lists or similar items as unformatted text.
-# plugin menu
-plugin.QuickNotepadPlugin.menu=quicknotepad \
- - \
- quicknotepad.choose-file \
- quicknotepad.save-file \
- quicknotepad.copy-to-buffer
-
-# action labels for actions supplied by dockables.xml
-quicknotepad.label=QuickNotepad
-
-# action labels for actions supplied by actions.xml
-quicknotepad.choose-file.label=Choose notepad file
-quicknotepad.save-file.label=Save notepad file
-quicknotepad.copy-to-buffer.label=Copy notepad to buffer
-
-# plugin option pane
-plugin.QuickNotepadPlugin.option-pane=quicknotepad
-
-# Option pane activation BeanShell snippet
-options.quicknotepad.code=new QuickNotepadOptionPane();
-
-# Option pane labels
-options.quicknotepad.label=QuickNotepad
-options.quicknotepad.file=File:
-options.quicknotepad.choose-file=Choose
-options.quicknotepad.choose-file.title=Choose a notepad file
-options.quicknotepad.choose-font=Font:
-options.quicknotepad.show-filepath.title=Display notepad file path
-
-# window title
-quicknotepad.title=QuickNotepad
-
-# window toolbar buttons
-quicknotepad.choose-file.icon=Open.png
-quicknotepad.save-file.icon=Save.png
-quicknotepad.copy-to-buffer.icon=CopyToBuffer.png
-
-# default settings
-options.quicknotepad.show-filepath=true
-options.quicknotepad.font=Monospaced
-options.quicknotepad.fontstyle=0
-options.quicknotepad.fontsize=14
-
-# Setting not defined but supplied for completeness
-options.quicknotepad.filepath=
+# Properties file for QuickNotepad plugin
+# $Id: QuickNotepad.props 6876 2006-09-02 20:39:49Z jchoyt $
+
+# jEdit only needs to load the plugin the first time the user accesses it
+# the presence of this property also tells jEdit the plugin is using the new API
+plugin.QuickNotepadPlugin.activate=defer
+
+# These two properties are required for all plugins
+plugin.QuickNotepadPlugin.name=QuickNotepad
+plugin.QuickNotepadPlugin.author=John Gellene
+
+# version number == jEdit version number
+plugin.QuickNotepadPlugin.version=4.3
+
+# online help
+plugin.QuickNotepadPlugin.docs=index.html
+
+# we only have one dependency, jEdit 4.2, since we use the new plugin API
+plugin.QuickNotepadPlugin.depend.0=jedit 04.02.01.00
+plugin.QuickNotepadPlugin.depend.1=jdk 1.4
+
+plugin.QuickNotepadPlugin.description=This plugin provides a dockable "scratch pad" for writing and displaying notes, to do lists or similar items as unformatted text.
+# plugin menu
+plugin.QuickNotepadPlugin.menu=quicknotepad \
+ - \
+ quicknotepad.choose-file \
+ quicknotepad.save-file \
+ quicknotepad.copy-to-buffer
+
+# action labels for actions supplied by dockables.xml
+quicknotepad.label=QuickNotepad
+
+# action labels for actions supplied by actions.xml
+quicknotepad.choose-file.label=Choose notepad file
+quicknotepad.save-file.label=Save notepad file
+quicknotepad.copy-to-buffer.label=Copy notepad to buffer
+
+# plugin option pane
+plugin.QuickNotepadPlugin.option-pane=quicknotepad
+
+# Option pane activation BeanShell snippet
+options.quicknotepad.code=new QuickNotepadOptionPane();
+
+# Option pane labels
+options.quicknotepad.label=QuickNotepad
+options.quicknotepad.file=File:
+options.quicknotepad.choose-file=Choose
+options.quicknotepad.choose-file.title=Choose a notepad file
+options.quicknotepad.choose-font=Font:
+options.quicknotepad.show-filepath.title=Display notepad file path
+
+# window title
+quicknotepad.title=QuickNotepad
+
+# window toolbar buttons
+quicknotepad.choose-file.icon=Open.png
+quicknotepad.save-file.icon=Save.png
+quicknotepad.copy-to-buffer.icon=CopyToBuffer.png
+
+# default settings
+options.quicknotepad.show-filepath=true
+options.quicknotepad.font=Monospaced
+options.quicknotepad.fontstyle=0
+options.quicknotepad.fontsize=14
+
+# Setting not defined but supplied for completeness
+options.quicknotepad.filepath=
diff --git a/jEdit/jars/QuickNotepad/QuickNotepadActions.java b/jEdit/jars/QuickNotepad/QuickNotepadActions.java
index 74f7b4d..0587e9e 100644
--- a/jEdit/jars/QuickNotepad/QuickNotepadActions.java
+++ b/jEdit/jars/QuickNotepad/QuickNotepadActions.java
@@ -1,30 +1,30 @@
-/*
- * QuickNotepadActions.java
- * part of the QuickNotepad plugin for the jEdit text editor
- * Copyright (C) 2001 John Gellene
- * jgellene at nyc.rr.com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id: QuickNotepadActions.java 12504 2008-04-22 23:12:43Z ezust $
- */
-
-interface QuickNotepadActions {
- void chooseFile();
-
- void saveFile();
-
- void copyToBuffer();
-}
+/*
+ * QuickNotepadActions.java
+ * part of the QuickNotepad plugin for the jEdit text editor
+ * Copyright (C) 2001 John Gellene
+ * jgellene at nyc.rr.com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id: QuickNotepadActions.java 12504 2008-04-22 23:12:43Z ezust $
+ */
+
+interface QuickNotepadActions {
+ void chooseFile();
+
+ void saveFile();
+
+ void copyToBuffer();
+}
diff --git a/jEdit/jars/QuickNotepad/QuickNotepadOptionPane.java b/jEdit/jars/QuickNotepad/QuickNotepadOptionPane.java
index a50aa0b..74f9345 100644
--- a/jEdit/jars/QuickNotepad/QuickNotepadOptionPane.java
+++ b/jEdit/jars/QuickNotepad/QuickNotepadOptionPane.java
@@ -1,127 +1,127 @@
-/*
- * QuickNotepadOptionPane.java
- * part of the QuickNotepad plugin for the jEdit text editor
- * Copyright (C) 2001 John Gellene
- * jgellene at nyc.rr.com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id: QuickNotepadOptionPane.java 12504 2008-04-22 23:12:43Z ezust $
- */
-
-import java.awt.BorderLayout;
-import java.awt.Font;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JFileChooser;
-import javax.swing.JPanel;
-import javax.swing.JTextField;
-
-import org.gjt.sp.jedit.AbstractOptionPane;
-import org.gjt.sp.jedit.GUIUtilities;
-import org.gjt.sp.jedit.jEdit;
-import org.gjt.sp.jedit.gui.FontSelector;
-
-public class QuickNotepadOptionPane extends AbstractOptionPane implements
- ActionListener {
- private JCheckBox showPath;
-
- private JTextField pathName;
-
- private FontSelector font;
-
- public QuickNotepadOptionPane() {
- super(QuickNotepadPlugin.NAME);
- }
-
- public void _init() {
- showPath = new JCheckBox(jEdit
- .getProperty(QuickNotepadPlugin.OPTION_PREFIX
- + "show-filepath.title"), jEdit.getProperty(
- QuickNotepadPlugin.OPTION_PREFIX + "show-filepath").equals(
- "true"));
- addComponent(showPath);
-
- pathName = new JTextField(jEdit
- .getProperty(QuickNotepadPlugin.OPTION_PREFIX + "filepath"));
- JButton pickPath = new JButton(jEdit
- .getProperty(QuickNotepadPlugin.OPTION_PREFIX + "choose-file"));
- pickPath.addActionListener(this);
-
- JPanel pathPanel = new JPanel(new BorderLayout(0, 0));
- pathPanel.add(pathName, BorderLayout.CENTER);
- pathPanel.add(pickPath, BorderLayout.EAST);
-
- addComponent(jEdit.getProperty(QuickNotepadPlugin.OPTION_PREFIX
- + "file"), pathPanel);
-
- font = new FontSelector(makeFont());
- addComponent(jEdit.getProperty(QuickNotepadPlugin.OPTION_PREFIX
- + "choose-font"), font);
- }
-
- public void _save() {
- jEdit.setProperty(QuickNotepadPlugin.OPTION_PREFIX + "filepath",
- pathName.getText());
- Font _font = font.getFont();
- jEdit.setProperty(QuickNotepadPlugin.OPTION_PREFIX + "font", _font
- .getFamily());
- jEdit.setProperty(QuickNotepadPlugin.OPTION_PREFIX + "fontsize", String
- .valueOf(_font.getSize()));
- jEdit.setProperty(QuickNotepadPlugin.OPTION_PREFIX + "fontstyle",
- String.valueOf(_font.getStyle()));
- jEdit.setProperty(QuickNotepadPlugin.OPTION_PREFIX + "show-filepath",
- String.valueOf(showPath.isSelected()));
- }
-
- // end AbstractOptionPane implementation
-
- // begin ActionListener implementation
- public void actionPerformed(ActionEvent evt) {
- String[] paths = GUIUtilities.showVFSFileDialog(null, null,
- JFileChooser.OPEN_DIALOG, false);
- if (paths != null) {
- pathName.setText(paths[0]);
- }
- }
-
- // helper method to get Font from plugin properties
- static public Font makeFont() {
- int style, size;
- String family = jEdit.getProperty(QuickNotepadPlugin.OPTION_PREFIX
- + "font");
- try {
- size = Integer
- .parseInt(jEdit
- .getProperty(QuickNotepadPlugin.OPTION_PREFIX
- + "fontsize"));
- } catch (NumberFormatException nf) {
- size = 14;
- }
- try {
- style = Integer
- .parseInt(jEdit
- .getProperty(QuickNotepadPlugin.OPTION_PREFIX
- + "fontstyle"));
- } catch (NumberFormatException nf) {
- style = Font.PLAIN;
- }
- return new Font(family, style, size);
- }
-
-}
+/*
+ * QuickNotepadOptionPane.java
+ * part of the QuickNotepad plugin for the jEdit text editor
+ * Copyright (C) 2001 John Gellene
+ * jgellene at nyc.rr.com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id: QuickNotepadOptionPane.java 12504 2008-04-22 23:12:43Z ezust $
+ */
+
+import java.awt.BorderLayout;
+import java.awt.Font;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JFileChooser;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+
+import org.gjt.sp.jedit.AbstractOptionPane;
+import org.gjt.sp.jedit.GUIUtilities;
+import org.gjt.sp.jedit.jEdit;
+import org.gjt.sp.jedit.gui.FontSelector;
+
+public class QuickNotepadOptionPane extends AbstractOptionPane implements
+ ActionListener {
+ private JCheckBox showPath;
+
+ private JTextField pathName;
+
+ private FontSelector font;
+
+ public QuickNotepadOptionPane() {
+ super(QuickNotepadPlugin.NAME);
+ }
+
+ public void _init() {
+ showPath = new JCheckBox(jEdit
+ .getProperty(QuickNotepadPlugin.OPTION_PREFIX
+ + "show-filepath.title"), jEdit.getProperty(
+ QuickNotepadPlugin.OPTION_PREFIX + "show-filepath").equals(
+ "true"));
+ addComponent(showPath);
+
+ pathName = new JTextField(jEdit
+ .getProperty(QuickNotepadPlugin.OPTION_PREFIX + "filepath"));
+ JButton pickPath = new JButton(jEdit
+ .getProperty(QuickNotepadPlugin.OPTION_PREFIX + "choose-file"));
+ pickPath.addActionListener(this);
+
+ JPanel pathPanel = new JPanel(new BorderLayout(0, 0));
+ pathPanel.add(pathName, BorderLayout.CENTER);
+ pathPanel.add(pickPath, BorderLayout.EAST);
+
+ addComponent(jEdit.getProperty(QuickNotepadPlugin.OPTION_PREFIX
+ + "file"), pathPanel);
+
+ font = new FontSelector(makeFont());
+ addComponent(jEdit.getProperty(QuickNotepadPlugin.OPTION_PREFIX
+ + "choose-font"), font);
+ }
+
+ public void _save() {
+ jEdit.setProperty(QuickNotepadPlugin.OPTION_PREFIX + "filepath",
+ pathName.getText());
+ Font _font = font.getFont();
+ jEdit.setProperty(QuickNotepadPlugin.OPTION_PREFIX + "font", _font
+ .getFamily());
+ jEdit.setProperty(QuickNotepadPlugin.OPTION_PREFIX + "fontsize", String
+ .valueOf(_font.getSize()));
+ jEdit.setProperty(QuickNotepadPlugin.OPTION_PREFIX + "fontstyle",
+ String.valueOf(_font.getStyle()));
+ jEdit.setProperty(QuickNotepadPlugin.OPTION_PREFIX + "show-filepath",
+ String.valueOf(showPath.isSelected()));
+ }
+
+ // end AbstractOptionPane implementation
+
+ // begin ActionListener implementation
+ public void actionPerformed(ActionEvent evt) {
+ String[] paths = GUIUtilities.showVFSFileDialog(null, null,
+ JFileChooser.OPEN_DIALOG, false);
+ if (paths != null) {
+ pathName.setText(paths[0]);
+ }
+ }
+
+ // helper method to get Font from plugin properties
+ static public Font makeFont() {
+ int style, size;
+ String family = jEdit.getProperty(QuickNotepadPlugin.OPTION_PREFIX
+ + "font");
+ try {
+ size = Integer
+ .parseInt(jEdit
+ .getProperty(QuickNotepadPlugin.OPTION_PREFIX
+ + "fontsize"));
+ } catch (NumberFormatException nf) {
+ size = 14;
+ }
+ try {
+ style = Integer
+ .parseInt(jEdit
+ .getProperty(QuickNotepadPlugin.OPTION_PREFIX
+ + "fontstyle"));
+ } catch (NumberFormatException nf) {
+ style = Font.PLAIN;
+ }
+ return new Font(family, style, size);
+ }
+
+}
diff --git a/jEdit/jars/QuickNotepad/QuickNotepadPlugin.java b/jEdit/jars/QuickNotepad/QuickNotepadPlugin.java
index 28ae46a..d2d0d85 100644
--- a/jEdit/jars/QuickNotepad/QuickNotepadPlugin.java
+++ b/jEdit/jars/QuickNotepad/QuickNotepadPlugin.java
@@ -1,34 +1,34 @@
-/*
- * QuickNotepadPlugin.java
- * part of the QuickNotepad plugin for the jEdit text editor
- * Copyright (C) 2001 John Gellene
- * jgellene at nyc.rr.com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id: QuickNotepadPlugin.java 12504 2008-04-22 23:12:43Z ezust $
- */
-
-import org.gjt.sp.jedit.EditPlugin;
-
-/**
- * The QuickNotepad plugin
- *
- * @author John Gellene
- */
-public class QuickNotepadPlugin extends EditPlugin {
- public static final String NAME = "quicknotepad";
- public static final String OPTION_PREFIX = "options.quicknotepad.";
-}
+/*
+ * QuickNotepadPlugin.java
+ * part of the QuickNotepad plugin for the jEdit text editor
+ * Copyright (C) 2001 John Gellene
+ * jgellene at nyc.rr.com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id: QuickNotepadPlugin.java 12504 2008-04-22 23:12:43Z ezust $
+ */
+
+import org.gjt.sp.jedit.EditPlugin;
+
+/**
+ * The QuickNotepad plugin
+ *
+ * @author John Gellene
+ */
+public class QuickNotepadPlugin extends EditPlugin {
+ public static final String NAME = "quicknotepad";
+ public static final String OPTION_PREFIX = "options.quicknotepad.";
+}
diff --git a/jEdit/jars/QuickNotepad/QuickNotepadTextArea.java b/jEdit/jars/QuickNotepad/QuickNotepadTextArea.java
index 24bb5cb..44f5456 100644
--- a/jEdit/jars/QuickNotepad/QuickNotepadTextArea.java
+++ b/jEdit/jars/QuickNotepad/QuickNotepadTextArea.java
@@ -1,33 +1,33 @@
-/*
- * QuickNotepadTextArea.java
- * part of the QuickNotepad plugin for the jEditTextArea
- * Copyright (C) 2001 John Gellene
- * jgellene at nyc.rr.com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id: QuickNotepadTextArea.java 12504 2008-04-22 23:12:43Z ezust $
- */
-
-import javax.swing.JTextArea;
-
-public class QuickNotepadTextArea extends JTextArea {
- public QuickNotepadTextArea() {
- super();
- setLineWrap(true);
- setWrapStyleWord(true);
- setTabSize(4);
- }
-}
+/*
+ * QuickNotepadTextArea.java
+ * part of the QuickNotepad plugin for the jEditTextArea
+ * Copyright (C) 2001 John Gellene
+ * jgellene at nyc.rr.com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id: QuickNotepadTextArea.java 12504 2008-04-22 23:12:43Z ezust $
+ */
+
+import javax.swing.JTextArea;
+
+public class QuickNotepadTextArea extends JTextArea {
+ public QuickNotepadTextArea() {
+ super();
+ setLineWrap(true);
+ setWrapStyleWord(true);
+ setTabSize(4);
+ }
+}
diff --git a/jEdit/jars/QuickNotepad/QuickNotepadToolPanel.java b/jEdit/jars/QuickNotepad/QuickNotepadToolPanel.java
index 98fce48..f76f002 100644
--- a/jEdit/jars/QuickNotepad/QuickNotepadToolPanel.java
+++ b/jEdit/jars/QuickNotepad/QuickNotepadToolPanel.java
@@ -1,100 +1,100 @@
-/*
- * QuickNotepadToolPanel.java
- * part of the QuickNotepad plugin for the jEdit text editor
- * Copyright (C) 2001 John Gellene
- * jgellene at nyc.rr.com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id: QuickNotepadToolPanel.java 12504 2008-04-22 23:12:43Z ezust $
- */
-
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-
-import javax.swing.AbstractButton;
-import javax.swing.Box;
-import javax.swing.BoxLayout;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-
-import org.gjt.sp.jedit.GUIUtilities;
-import org.gjt.sp.jedit.jEdit;
-import org.gjt.sp.jedit.gui.RolloverButton;
-
-public class QuickNotepadToolPanel extends JPanel {
- private QuickNotepad pad;
-
- private JLabel label;
-
- public QuickNotepadToolPanel(QuickNotepad qnpad) {
- setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
- pad = qnpad;
-
- Box labelBox = new Box(BoxLayout.Y_AXIS);
- labelBox.add(Box.createGlue());
-
- label = new JLabel(pad.getFilename());
- label.setVisible(jEdit.getProperty(
- QuickNotepadPlugin.OPTION_PREFIX + "show-filepath").equals(
- "true"));
-
- labelBox.add(label);
- labelBox.add(Box.createGlue());
-
- add(labelBox);
-
- add(Box.createGlue());
-
- add(makeCustomButton("quicknotepad.choose-file", new ActionListener() {
- public void actionPerformed(ActionEvent evt) {
- QuickNotepadToolPanel.this.pad.chooseFile();
- }
- }));
- add(makeCustomButton("quicknotepad.save-file", new ActionListener() {
- public void actionPerformed(ActionEvent evt) {
- QuickNotepadToolPanel.this.pad.saveFile();
- }
- }));
- add(makeCustomButton("quicknotepad.copy-to-buffer",
- new ActionListener() {
- public void actionPerformed(ActionEvent evt) {
- QuickNotepadToolPanel.this.pad.copyToBuffer();
- }
- }));
- }
-
- void propertiesChanged() {
- label.setText(pad.getFilename());
- label.setVisible(jEdit.getProperty(
- QuickNotepadPlugin.OPTION_PREFIX + "show-filepath").equals(
- "true"));
- }
-
- private AbstractButton makeCustomButton(String name, ActionListener listener) {
- String toolTip = jEdit.getProperty(name.concat(".label"));
- AbstractButton b = new RolloverButton(GUIUtilities.loadIcon(jEdit
- .getProperty(name + ".icon")));
- if (listener != null) {
- b.addActionListener(listener);
- b.setEnabled(true);
- } else {
- b.setEnabled(false);
- }
- b.setToolTipText(toolTip);
- return b;
- }
-
-}
+/*
+ * QuickNotepadToolPanel.java
+ * part of the QuickNotepad plugin for the jEdit text editor
+ * Copyright (C) 2001 John Gellene
+ * jgellene at nyc.rr.com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id: QuickNotepadToolPanel.java 12504 2008-04-22 23:12:43Z ezust $
+ */
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.AbstractButton;
+import javax.swing.Box;
+import javax.swing.BoxLayout;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+
+import org.gjt.sp.jedit.GUIUtilities;
+import org.gjt.sp.jedit.jEdit;
+import org.gjt.sp.jedit.gui.RolloverButton;
+
+public class QuickNotepadToolPanel extends JPanel {
+ private QuickNotepad pad;
+
+ private JLabel label;
+
+ public QuickNotepadToolPanel(QuickNotepad qnpad) {
+ setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
+ pad = qnpad;
+
+ Box labelBox = new Box(BoxLayout.Y_AXIS);
+ labelBox.add(Box.createGlue());
+
+ label = new JLabel(pad.getFilename());
+ label.setVisible(jEdit.getProperty(
+ QuickNotepadPlugin.OPTION_PREFIX + "show-filepath").equals(
+ "true"));
+
+ labelBox.add(label);
+ labelBox.add(Box.createGlue());
+
+ add(labelBox);
+
+ add(Box.createGlue());
+
+ add(makeCustomButton("quicknotepad.choose-file", new ActionListener() {
+ public void actionPerformed(ActionEvent evt) {
+ QuickNotepadToolPanel.this.pad.chooseFile();
+ }
+ }));
+ add(makeCustomButton("quicknotepad.save-file", new ActionListener() {
+ public void actionPerformed(ActionEvent evt) {
+ QuickNotepadToolPanel.this.pad.saveFile();
+ }
+ }));
+ add(makeCustomButton("quicknotepad.copy-to-buffer",
+ new ActionListener() {
+ public void actionPerformed(ActionEvent evt) {
+ QuickNotepadToolPanel.this.pad.copyToBuffer();
+ }
+ }));
+ }
+
+ void propertiesChanged() {
+ label.setText(pad.getFilename());
+ label.setVisible(jEdit.getProperty(
+ QuickNotepadPlugin.OPTION_PREFIX + "show-filepath").equals(
+ "true"));
+ }
+
+ private AbstractButton makeCustomButton(String name, ActionListener listener) {
+ String toolTip = jEdit.getProperty(name.concat(".label"));
+ AbstractButton b = new RolloverButton(GUIUtilities.loadIcon(jEdit
+ .getProperty(name + ".icon")));
+ if (listener != null) {
+ b.addActionListener(listener);
+ b.setEnabled(true);
+ } else {
+ b.setEnabled(false);
+ }
+ b.setToolTipText(toolTip);
+ return b;
+ }
+
+}
diff --git a/jEdit/jars/QuickNotepad/README.txt b/jEdit/jars/QuickNotepad/README.txt
index 39993a8..f4fc99b 100644
--- a/jEdit/jars/QuickNotepad/README.txt
+++ b/jEdit/jars/QuickNotepad/README.txt
@@ -1,12 +1,12 @@
-QUICK NOTEPAD PLUGIN
-
-The jEdit source distribution includes source code for an example plugin
-named 'QuickNotepad', written by John Gellene.
-
-The plugin source is discussed in detail in the 'Writing Plugins' part
-of the user's guide.
-
-The source code has been updated to conform the the Plugin API for version 4.0
-of jEdit. The file changes40.txt outlines the changes that were made from the
-version distributed with jEdit 3.2.2.
-
+QUICK NOTEPAD PLUGIN
+
+The jEdit source distribution includes source code for an example plugin
+named 'QuickNotepad', written by John Gellene.
+
+The plugin source is discussed in detail in the 'Writing Plugins' part
+of the user's guide.
+
+The source code has been updated to conform the the Plugin API for version 4.0
+of jEdit. The file changes40.txt outlines the changes that were made from the
+version distributed with jEdit 3.2.2.
+
diff --git a/jEdit/jars/QuickNotepad/actions.xml b/jEdit/jars/QuickNotepad/actions.xml
index c1caee5..b40297f 100644
--- a/jEdit/jars/QuickNotepad/actions.xml
+++ b/jEdit/jars/QuickNotepad/actions.xml
@@ -1,29 +1,29 @@
-<!-- Action definition file for QuickNotepad plugin -->
-<!-- $Id: actions.xml 5152 2004-12-05 04:37:06Z spestov $
--->
-
-<!DOCTYPE ACTIONS SYSTEM "actions.dtd">
-
-<ACTIONS>
- <ACTION NAME="quicknotepad.choose-file">
- <CODE>
- wm.addDockableWindow(QuickNotepadPlugin.NAME);
- wm.getDockableWindow(QuickNotepadPlugin.NAME).chooseFile();
- </CODE>
- </ACTION>
-
- <ACTION NAME="quicknotepad.save-file">
- <CODE>
- wm.addDockableWindow(QuickNotepadPlugin.NAME);
- wm.getDockableWindow(QuickNotepadPlugin.NAME).saveFile();
- </CODE>
- </ACTION>
-
- <ACTION NAME="quicknotepad.copy-to-buffer">
- <CODE>
- wm.addDockableWindow(QuickNotepadPlugin.NAME);
- wm.getDockableWindow(QuickNotepadPlugin.NAME).copyToBuffer();
- </CODE>
- </ACTION>
-</ACTIONS>
-
+<!-- Action definition file for QuickNotepad plugin -->
+<!-- $Id: actions.xml 5152 2004-12-05 04:37:06Z spestov $
+-->
+
+<!DOCTYPE ACTIONS SYSTEM "actions.dtd">
+
+<ACTIONS>
+ <ACTION NAME="quicknotepad.choose-file">
+ <CODE>
+ wm.addDockableWindow(QuickNotepadPlugin.NAME);
+ wm.getDockableWindow(QuickNotepadPlugin.NAME).chooseFile();
+ </CODE>
+ </ACTION>
+
+ <ACTION NAME="quicknotepad.save-file">
+ <CODE>
+ wm.addDockableWindow(QuickNotepadPlugin.NAME);
+ wm.getDockableWindow(QuickNotepadPlugin.NAME).saveFile();
+ </CODE>
+ </ACTION>
+
+ <ACTION NAME="quicknotepad.copy-to-buffer">
+ <CODE>
+ wm.addDockableWindow(QuickNotepadPlugin.NAME);
+ wm.getDockableWindow(QuickNotepadPlugin.NAME).copyToBuffer();
+ </CODE>
+ </ACTION>
+</ACTIONS>
+
diff --git a/jEdit/jars/QuickNotepad/build.xml b/jEdit/jars/QuickNotepad/build.xml
index 7ad38fe..3451e56 100644
--- a/jEdit/jars/QuickNotepad/build.xml
+++ b/jEdit/jars/QuickNotepad/build.xml
@@ -1,23 +1,23 @@
-<?xml version="1.0"?>
-<project name="QuickNotepad"
- default="build">
- <description>
- This is an ant build.xml file for building the QuickNotepad plugin for jEdit.
- </description>
-
- <property file="build.properties"/>
- <property file="../build.properties"/>
-
- <property name="jedit.install.dir"
- location="../../build" />
- <property name="user-doc.xml"
- value="users-guide.xml" />
-
- <property name="build.support"
- value="../../../build-support" />
- <import file="${build.support}/plugin-build.xml" />
-
- <selector id="docSrcFiles">
- <filename name="users-guide.xml" />
- </selector>
-</project>
+<?xml version="1.0"?>
+<project name="QuickNotepad"
+ default="build">
+ <description>
+ This is an ant build.xml file for building the QuickNotepad plugin for jEdit.
+ </description>
+
+ <property file="build.properties"/>
+ <property file="../build.properties"/>
+
+ <property name="jedit.install.dir"
+ location="../../build" />
+ <property name="user-doc.xml"
+ value="users-guide.xml" />
+
+ <property name="build.support"
+ value="../../../build-support" />
+ <import file="${build.support}/plugin-build.xml" />
+
+ <selector id="docSrcFiles">
+ <filename name="users-guide.xml" />
+ </selector>
+</project>
diff --git a/jEdit/jars/QuickNotepad/changes40.txt b/jEdit/jars/QuickNotepad/changes40.txt
index 845dbb2..452dc60 100644
--- a/jEdit/jars/QuickNotepad/changes40.txt
+++ b/jEdit/jars/QuickNotepad/changes40.txt
@@ -1,99 +1,99 @@
-$Id: changes40.txt 3890 2001-11-11 03:02:31Z jgellene $
-
-Changes made to QuickNotepad plugin for jEdit 4.0:
-
-(1) Under jEdit 3.2.2 and prior versions, the plugin had a separate class,
-QuickNotepadDockable, implementing the DockableWindow interface. The class's
-methods delegated actions to the plugin's top-level visible component, a class
-derived from JPanel called QuickNotepad. The DockableWindow interface is
-deprecated in jEdit 4.0, so this class was eliminated. If the top-level
-component had implemented the DockableWindow interface, it would have been
-necessary to remove DockableWindow as an implemented interface and the eliminate
-the getName() and getComponent() methods of that interface in the plugin class.
-
-(2) A new file, dockables.xml, was created containing XML markup for the
-constructor of a plugin component. Under the new plugin API, this file is read
-to determine the method call or calls for constructing a new instance of a
-dockable plugin component. The file is quite short:
-
-<?xml version="1.0"?>
-
-<!DOCTYPE DOCKABLES SYSTEM "dockables.dtd">
-
-<!-- QuickNotepad dockable window -->
-
-<DOCKABLES>
- <DOCKABLE NAME="quicknotepad">
- new QuickNotepad(view, position);
- </DOCKABLE>
-</DOCKABLES>
-
-The parameters are those found in the existing version of the QuickNotepad
-constructor. Both "view" and "position" are defined by the new plugin API in the
-namespace in which the constructor is called. The value of position is taken
-from optional properties set by the user. In the absence of a user setting, the
-position parameter is set to place the plugin component in a floating window.
-
-The NAME attribute is taken to conform to the value of the static variable
-QuickNotepadPlugin.NAME, which is also used to identify the plugin in the user
-action code contained in actions.xml.
-
-By default, the plugin API adds two actions for a plugin. The first is entitled
-[name of plugin] (in this case, "quicknotepad"), and simply activates the plugin
-by executing the code contained in the DOCKABLE element. The second action
-toggles the plugin's visible component, the title of the action is [name of
-plugin]-toggle (in this case, "quicknotepad-toggle"). The plugin API handles
-this action internally.
-
-To prevent these actions from being created, you can add a NO_ACTIONS="true"
-attribute to the DOCKABLE element. The NAME and NO_ACTIONS attributes are the
-only attributes defined for a DOCKABLE entry. A NAME is required; NO_ACTIONS is
-set to "false" by default.
-
-(3) In the actions.xml file, the user action definitions were revised to call
-DockableWindowManager.getDockable() instead of
-DockableManager.getDockableWindow(). In addition, the actions for toggling the
-plugin docking window and bringing the QuickNotepad window to the foreground
-were eliminated. The toggle action was duplicative of the built-in action
-supplied through dockables.xml, and the "bring to front" action had become
-redundant.
-
-(4) There were two deletions made in QuickNotepadPlugin, the main plugin class.
-
-The handleMessage() method was eliminated because it was only necessary for the
-plugin to listen for the CreateDockableWindow message. As a result, it is no
-longer necessary for this plugin to connect to the EditBus, so its derivation
-was changed from EBPlugin to EditPlugin. Individual instances of the
-QuickNotepad class still need to listen for a PropertiesChanged message, so that
-class continues to implement EBComponent.
-
-In addition, since the EditBus no longer maintains an active list of windows,
-the call to EditBus.addToNamedList() is no longer needed in the class's start()
-method and so was eliminated, leaving an empty start() method.
-
-(5) No changes were required in the option pane class, QuickNotepadOptionsPane,
-or the other other classes defining components of the plugin.
-
-(6) Finally, several changes were made to the propoerties file of the plugin,
-QuickNotepad.props. First, the plugin's dependency properties were changed to
-make the plugin dependent upon version 4.0 or greater of jEdit:
-
-plugin.QuickNotepadPlugin.depend.1=jedit 04.00.00.00
-
-Next, the quicknotepad.title property was eliminated, and the "label" properties
-for the docking window and plugin menu were reorganized into two categories:
-labels for action created by dockable.xml (quicknotepad.label and
-quicknotepad-toggle.label), and labels for actions created by actions.xml (the
-remaining user actions: "choose-file", "save-file" and "copy-to-buffer").
-
-The plugin was built using the standard build.xml supplied for plugins,
-after checking to make sure that the name of the plugin and the location of
-jedit.jar were correct. It was also necessary to add dockables.xml to the list
-of files to be archived by the jar utility. Iterations of the build process
-helped to uncover deprecated API elements.
-
-The help file was built from DocBook XML source using xsltproc. The build.xml
-Ant build file and the users-guide.xsl customization file contain annotations
-which may be helpful in building plugin documentation. In particular, a few
-<indexterm> tags were added to the documentation source to provide references
-for the index to be generated for all plugin files.
+$Id: changes40.txt 3890 2001-11-11 03:02:31Z jgellene $
+
+Changes made to QuickNotepad plugin for jEdit 4.0:
+
+(1) Under jEdit 3.2.2 and prior versions, the plugin had a separate class,
+QuickNotepadDockable, implementing the DockableWindow interface. The class's
+methods delegated actions to the plugin's top-level visible component, a class
+derived from JPanel called QuickNotepad. The DockableWindow interface is
+deprecated in jEdit 4.0, so this class was eliminated. If the top-level
+component had implemented the DockableWindow interface, it would have been
+necessary to remove DockableWindow as an implemented interface and the eliminate
+the getName() and getComponent() methods of that interface in the plugin class.
+
+(2) A new file, dockables.xml, was created containing XML markup for the
+constructor of a plugin component. Under the new plugin API, this file is read
+to determine the method call or calls for constructing a new instance of a
+dockable plugin component. The file is quite short:
+
+<?xml version="1.0"?>
+
+<!DOCTYPE DOCKABLES SYSTEM "dockables.dtd">
+
+<!-- QuickNotepad dockable window -->
+
+<DOCKABLES>
+ <DOCKABLE NAME="quicknotepad">
+ new QuickNotepad(view, position);
+ </DOCKABLE>
+</DOCKABLES>
+
+The parameters are those found in the existing version of the QuickNotepad
+constructor. Both "view" and "position" are defined by the new plugin API in the
+namespace in which the constructor is called. The value of position is taken
+from optional properties set by the user. In the absence of a user setting, the
+position parameter is set to place the plugin component in a floating window.
+
+The NAME attribute is taken to conform to the value of the static variable
+QuickNotepadPlugin.NAME, which is also used to identify the plugin in the user
+action code contained in actions.xml.
+
+By default, the plugin API adds two actions for a plugin. The first is entitled
+[name of plugin] (in this case, "quicknotepad"), and simply activates the plugin
+by executing the code contained in the DOCKABLE element. The second action
+toggles the plugin's visible component, the title of the action is [name of
+plugin]-toggle (in this case, "quicknotepad-toggle"). The plugin API handles
+this action internally.
+
+To prevent these actions from being created, you can add a NO_ACTIONS="true"
+attribute to the DOCKABLE element. The NAME and NO_ACTIONS attributes are the
+only attributes defined for a DOCKABLE entry. A NAME is required; NO_ACTIONS is
+set to "false" by default.
+
+(3) In the actions.xml file, the user action definitions were revised to call
+DockableWindowManager.getDockable() instead of
+DockableManager.getDockableWindow(). In addition, the actions for toggling the
+plugin docking window and bringing the QuickNotepad window to the foreground
+were eliminated. The toggle action was duplicative of the built-in action
+supplied through dockables.xml, and the "bring to front" action had become
+redundant.
+
+(4) There were two deletions made in QuickNotepadPlugin, the main plugin class.
+
+The handleMessage() method was eliminated because it was only necessary for the
+plugin to listen for the CreateDockableWindow message. As a result, it is no
+longer necessary for this plugin to connect to the EditBus, so its derivation
+was changed from EBPlugin to EditPlugin. Individual instances of the
+QuickNotepad class still need to listen for a PropertiesChanged message, so that
+class continues to implement EBComponent.
+
+In addition, since the EditBus no longer maintains an active list of windows,
+the call to EditBus.addToNamedList() is no longer needed in the class's start()
+method and so was eliminated, leaving an empty start() method.
+
+(5) No changes were required in the option pane class, QuickNotepadOptionsPane,
+or the other other classes defining components of the plugin.
+
+(6) Finally, several changes were made to the propoerties file of the plugin,
+QuickNotepad.props. First, the plugin's dependency properties were changed to
+make the plugin dependent upon version 4.0 or greater of jEdit:
+
+plugin.QuickNotepadPlugin.depend.1=jedit 04.00.00.00
+
+Next, the quicknotepad.title property was eliminated, and the "label" properties
+for the docking window and plugin menu were reorganized into two categories:
+labels for action created by dockable.xml (quicknotepad.label and
+quicknotepad-toggle.label), and labels for actions created by actions.xml (the
+remaining user actions: "choose-file", "save-file" and "copy-to-buffer").
+
+The plugin was built using the standard build.xml supplied for plugins,
+after checking to make sure that the name of the plugin and the location of
+jedit.jar were correct. It was also necessary to add dockables.xml to the list
+of files to be archived by the jar utility. Iterations of the build process
+helped to uncover deprecated API elements.
+
+The help file was built from DocBook XML source using xsltproc. The build.xml
+Ant build file and the users-guide.xsl customization file contain annotations
+which may be helpful in building plugin documentation. In particular, a few
+<indexterm> tags were added to the documentation source to provide references
+for the index to be generated for all plugin files.
diff --git a/jEdit/jars/QuickNotepad/changes42.txt b/jEdit/jars/QuickNotepad/changes42.txt
index d86f534..eadd27a 100644
--- a/jEdit/jars/QuickNotepad/changes42.txt
+++ b/jEdit/jars/QuickNotepad/changes42.txt
@@ -1,26 +1,26 @@
-$Id: changes42.txt 4665 2003-04-30 05:28:55Z spestov $
-
-Changes made to QuickNotepad plugin for jEdit 4.2:
-
-(1) The following property was added:
-
- plugin.QuickNotepadPlugin.activate=defer
-
-This informs jEdit the plugin is using the new API, and that it should only be
-loaded the first time it is accessed by the user.
-
-(2) The createMenuItems() method of the plugin core class has been removed. The
-plugin menu is now specified with the following property:
-
- plugin.QuickNotepadPlugin.menu=... list of menu items ...
-
-(3) The createOptionPanes() method of the plugin core class has been removed. The plugin option pane is now specified with the following property:
-
- plugin.QuickNotepadPlugin.option-pane=quicknotepad
-
-(4) The QuickNotepad class (the dockable window) implements the new DefaultFocusComponent interface, and the following method was added to this class:
-
- public void focusOnDefaultComponent()
- {
- textArea.requestFocus();
- }
+$Id: changes42.txt 4665 2003-04-30 05:28:55Z spestov $
+
+Changes made to QuickNotepad plugin for jEdit 4.2:
+
+(1) The following property was added:
+
+ plugin.QuickNotepadPlugin.activate=defer
+
+This informs jEdit the plugin is using the new API, and that it should only be
+loaded the first time it is accessed by the user.
+
+(2) The createMenuItems() method of the plugin core class has been removed. The
+plugin menu is now specified with the following property:
+
+ plugin.QuickNotepadPlugin.menu=... list of menu items ...
+
+(3) The createOptionPanes() method of the plugin core class has been removed. The plugin option pane is now specified with the following property:
+
+ plugin.QuickNotepadPlugin.option-pane=quicknotepad
+
+(4) The QuickNotepad class (the dockable window) implements the new DefaultFocusComponent interface, and the following method was added to this class:
+
+ public void focusOnDefaultComponent()
+ {
+ textArea.requestFocus();
+ }
diff --git a/jEdit/jars/QuickNotepad/description.html b/jEdit/jars/QuickNotepad/description.html
index af044ee..042b442 100644
--- a/jEdit/jars/QuickNotepad/description.html
+++ b/jEdit/jars/QuickNotepad/description.html
@@ -1,8 +1,8 @@
-This plugin provides a dockable "scratch pad" for writing
-and displaying notes, to do lists or similar items as unformatted text.
-The text is automatically saved upon closing the plugin or exiting
-jEdit. It can also be saved manually. The user can change the file to be
-displayed during the current editing session. The path of the default
-notepad file can be changed as a user option. Finally, the text file can
-be copied to a new, untitled jEdit buffer so that it can be edited by the
-main program.
+This plugin provides a dockable "scratch pad" for writing
+and displaying notes, to do lists or similar items as unformatted text.
+The text is automatically saved upon closing the plugin or exiting
+jEdit. It can also be saved manually. The user can change the file to be
+displayed during the current editing session. The path of the default
+notepad file can be changed as a user option. Finally, the text file can
+be copied to a new, untitled jEdit buffer so that it can be edited by the
+main program.
diff --git a/jEdit/jars/QuickNotepad/dockables.xml b/jEdit/jars/QuickNotepad/dockables.xml
index b479e8b..7c026df 100644
--- a/jEdit/jars/QuickNotepad/dockables.xml
+++ b/jEdit/jars/QuickNotepad/dockables.xml
@@ -1,15 +1,15 @@
-<?xml version="1.0"?>
-
-<!-- Dockable component definition file for QuickNotepad plugin -->
-<!-- $Id: dockables.xml 4474 2003-02-09 20:37:14Z spestov $
--->
-
-<!DOCTYPE DOCKABLES SYSTEM "dockables.dtd">
-
-<!-- QuickNotepad dockable windows -->
-
-<DOCKABLES>
- <DOCKABLE NAME="quicknotepad">
- new QuickNotepad(view, position);
- </DOCKABLE>
-</DOCKABLES>
+<?xml version="1.0"?>
+
+<!-- Dockable component definition file for QuickNotepad plugin -->
+<!-- $Id: dockables.xml 4474 2003-02-09 20:37:14Z spestov $
+-->
+
+<!DOCTYPE DOCKABLES SYSTEM "dockables.dtd">
+
+<!-- QuickNotepad dockable windows -->
+
+<DOCKABLES>
+ <DOCKABLE NAME="quicknotepad">
+ new QuickNotepad(view, position);
+ </DOCKABLE>
+</DOCKABLES>
diff --git a/jEdit/jars/QuickNotepad/users-guide.xml b/jEdit/jars/QuickNotepad/users-guide.xml
index 7339014..ebf15ec 100644
--- a/jEdit/jars/QuickNotepad/users-guide.xml
+++ b/jEdit/jars/QuickNotepad/users-guide.xml
@@ -1,277 +1,277 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- QuickNotepad 2.0 help documentation -->
-<!-- Copyright (C) 2001 John Gellene -->
-<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
-<article id="QuickNotepad">
- <articleinfo>
- <author>
- <firstname>John</firstname>
-
- <surname>Gellene</surname>
-
- <affiliation>
- <address><email>jgellene at nyc.rr.com</email></address>
- </affiliation>
- </author>
-
- <copyright>
- <year>2001</year>
-
- <holder>John Gellene</holder>
- </copyright>
-
- <legalnotice>
- <title>Legal Notice</title>
-
- <para>Permission is granted to copy, distribute and/or modify this
- document under the terms of the GNU Free Documentation License,
- Version 1.1 or any later version published by the Free Software
- Foundation; with no <quote>Invariant Sections</quote>,
- <quote>Front-Cover Texts</quote> or <quote>Back-Cover Texts</quote>,
- each as defined in the license. A copy of the license is included in
- the file <filename>COPYING.DOC.txt</filename> included with the
- jEdit distribution.</para>
- </legalnotice>
-
- <title>QuickNotepad 4.2</title>
- </articleinfo>
-
- <simplesect>
- <title>Introduction</title>
-
- <indexterm>
- <primary>QuickNotepad</primary>
- </indexterm>
-
- <para>This plugin provides a dockable <quote>scratch pad</quote> for
- writing and displaying notes, to do lists or similar items as
- unformatted text. The text is automatically saved upon closing the
- plugin or exiting jEdit. It can also be saved manually. The user can
- change the file to be displayed during the current editing session. The
- path of the default notepad file can be changed as a user option.
- Finally, the text file can be copied to a new, untitled jEdit buffer so
- that it can be edited by the main program.</para>
-
- <para>The <citetitle>jEdit Plugin Guide</citetitle> details the
- development and design of QuickNotepad. It is a simple but functional
- dockable plugin that incorporates the basic elements of the jEdit plugin
- architecture.</para>
-
- <para>The file <filename>changes42.txt</filename> in the plugin's source
- code details the changes that were made to the plugin to conform to the
- new plugin API for jEdit version 4.2.</para>
-
- <para>The file <filename>changes40.txt</filename> in the plugin's source
- code details the changes that were made to the plugin to conform to the
- new plugin API for jEdit version 4.0.</para>
- </simplesect>
-
- <simplesect>
- <title>Operation</title>
-
- <para><indexterm>
- <primary>QuickNotepad</primary>
-
- <secondary>shortcut keys</secondary>
- </indexterm> When QuickNotepad is activated, it loads and displays
- the file stored in its properties as unformatted text. The text can be
- edited using the keyboard and mouse. The text area component recognizes
- the following basic editing shortcuts:</para>
-
- <!-- Limitations on xsltproc's capabilities require a blank column between -->
-
- <!-- the two columns of data to provide spacing for the table. -->
-
- <informaltable frame="none">
- <tgroup align="left" cols="4">
- <colspec colnum="1" />
-
- <!-- blank column -->
-
- <colspec colnum="2" />
-
- <colspec colnum="3" />
-
- <!-- blank column -->
-
- <colspec colnum="4" />
-
- <tbody>
- <row>
- <entry></entry>
-
- <entry>Cut</entry>
-
- <entry></entry>
-
- <entry><keycombo action="simul">
- <keysym>Ctrl</keysym>
-
- <keysym>x</keysym>
- </keycombo></entry>
- </row>
-
- <row>
- <entry></entry>
-
- <entry>Copy</entry>
-
- <entry></entry>
-
- <entry><keycombo action="simul">
- <keysym>Ctrl</keysym>
-
- <keysym>c</keysym>
- </keycombo></entry>
- </row>
-
- <row>
- <entry></entry>
-
- <entry>Paste</entry>
-
- <entry></entry>
-
- <entry><keycombo action="simul">
- <keysym>Ctrl</keysym>
-
- <keysym>v</keysym>
- </keycombo></entry>
- </row>
-
- <row>
- <entry></entry>
-
- <entry>Select All</entry>
-
- <entry></entry>
-
- <entry><keycombo action="simul">
- <keysym>Ctrl</keysym>
-
- <keysym>a</keysym>
- </keycombo></entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <para>QuickNotepad ignores function keys and other combination key
- presses.</para>
- </simplesect>
-
- <simplesect>
- <title>Toolbar buttons</title>
-
- <para>Three buttons above the text area provide file management
- operations:</para>
-
- <itemizedlist>
- <listitem>
- <para><guilabel>Choose notepad file</guilabel> - this button
- opens a file selection dialog permitting the user to select a
- different file to view in the text area. If a new file is
- selected, the old file is auomatically saved. The selection is
- valid only for the current editing session; to change the
- default QuickNotepad file for future sessions, use the <link
- linkend="options">options dialog</link>.</para>
- </listitem>
-
- <listitem>
- <para><guilabel>Save notepad file</guilabel> - this button
- causes QuickNotepad to write the contents of the text area to
- the designated notepad file. To save the text to another file
- name, use the <guilabel>Copy notepad to buffer</guilabel>
- operation.</para>
- </listitem>
-
- <listitem>
- <para><guilabel>Copy notepad to buffer</guilabel> - this button
- causes the contents of the text to be written to a newly
- created, untitled buffer in the main text editing area. This
- operation does not alter the QuickNotepad text area or write its
- text to storage. Further changes to either the QuickNotepad text
- area or the new buffer will not affect the other.</para>
- </listitem>
- </itemizedlist>
-
- <para>These operations are listed in the menu which appears for
- QuickNotepad under the <guimenu>Plugins</guimenu> heading. They can also
- be made the subject of keyboard shortcuts in the <guilabel>Plugin
- Shortcuts</guilabel> pane of jEdit's options dialog.</para>
-
- <para>One other operation is available as a keyboard shortcut.
- <guilabel>Bring QuickNotepad to front</guilabel> activates the plugin
- and makes visible if it is currently hidden in a docking window.</para>
- </simplesect>
-
- <simplesect id="options">
- <title>Options</title>
-
- <indexterm>
- <primary>QuickNotepad</primary>
-
- <secondary>options</secondary>
- </indexterm>
-
- <para>There are three options which can be set using the pane for
- QuickNotepad in the <guilabel>Plugin Shortcuts</guilabel> section of the
- general options dialog:</para>
-
- <itemizedlist>
- <listitem>
- <para>A checkbox governs whether the name of the notepad file
- will be displayed in the toolbar panel above the text area. Even
- if the file name display is enabled, if the plugin is displayed
- to the left or right of the main editing area, the notepad file
- name will likely be partially or completely hidden.</para>
- </listitem>
-
- <listitem>
- <para>A text field and adjacent button allow the user to choose
- the path of the default notepad file by typing its name or
- opening a file chooser dialog. This file will be loaded (and the
- old file saved) once the plugin's options settings are
- committed.</para>
- </listitem>
-
- <listitem>
- <para>A third button shows the name, size and style of the font
- used by the QuickNotepad text area. Pressing the button summons
- a font chooser dialog for making a new selection. The text area
- will be redrawn with the new font once the change is
- committed.</para>
- </listitem>
- </itemizedlist>
- </simplesect>
-
- <simplesect>
- <title>Legal notices</title>
-
- <para>The QuickNotepad plugin is released under the GNU General Public
- License (either version 2 or any later version, at the user's option). A
- copy of the GPL is available in the <filename>COPYING.txt</filename>
- file in the jEdit distribution.</para>
-
- <para>The QuickNotepad plugin comes with ABSOLUTELY NO WARRANTY OF ANY
- KIND; see section 11 and 12 of the GPL for details.</para>
-
- <para>Permission is granted to copy, distribute and/or modify this
- document under the terms of the GNU Free Documentation License, Version
- 1.1 or any later version published by the Free Software Foundation; with
- no <quote>Invariant Sections</quote>, <quote>Front-Cover Texts</quote>
- or <quote>Back-Cover Texts</quote>, each as defined in the license. A
- copy of the license is included in the file
- <filename>COPYING.DOC.txt</filename> included with the jEdit
- distribution.</para>
- </simplesect>
-
- <simplesect>
- <title>Feedback</title>
-
- <para>Comments, bug reports and other feedback may be sent to the <ulink
- url="mailto:jgellene at nyc.rr.com">author</ulink> or the jEdit-users
- mailing list.</para>
- </simplesect>
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- QuickNotepad 2.0 help documentation -->
+<!-- Copyright (C) 2001 John Gellene -->
+<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<article id="QuickNotepad">
+ <articleinfo>
+ <author>
+ <firstname>John</firstname>
+
+ <surname>Gellene</surname>
+
+ <affiliation>
+ <address><email>jgellene at nyc.rr.com</email></address>
+ </affiliation>
+ </author>
+
+ <copyright>
+ <year>2001</year>
+
+ <holder>John Gellene</holder>
+ </copyright>
+
+ <legalnotice>
+ <title>Legal Notice</title>
+
+ <para>Permission is granted to copy, distribute and/or modify this
+ document under the terms of the GNU Free Documentation License,
+ Version 1.1 or any later version published by the Free Software
+ Foundation; with no <quote>Invariant Sections</quote>,
+ <quote>Front-Cover Texts</quote> or <quote>Back-Cover Texts</quote>,
+ each as defined in the license. A copy of the license is included in
+ the file <filename>COPYING.DOC.txt</filename> included with the
+ jEdit distribution.</para>
+ </legalnotice>
+
+ <title>QuickNotepad 4.2</title>
+ </articleinfo>
+
+ <simplesect>
+ <title>Introduction</title>
+
+ <indexterm>
+ <primary>QuickNotepad</primary>
+ </indexterm>
+
+ <para>This plugin provides a dockable <quote>scratch pad</quote> for
+ writing and displaying notes, to do lists or similar items as
+ unformatted text. The text is automatically saved upon closing the
+ plugin or exiting jEdit. It can also be saved manually. The user can
+ change the file to be displayed during the current editing session. The
+ path of the default notepad file can be changed as a user option.
+ Finally, the text file can be copied to a new, untitled jEdit buffer so
+ that it can be edited by the main program.</para>
+
+ <para>The <citetitle>jEdit Plugin Guide</citetitle> details the
+ development and design of QuickNotepad. It is a simple but functional
+ dockable plugin that incorporates the basic elements of the jEdit plugin
+ architecture.</para>
+
+ <para>The file <filename>changes42.txt</filename> in the plugin's source
+ code details the changes that were made to the plugin to conform to the
+ new plugin API for jEdit version 4.2.</para>
+
+ <para>The file <filename>changes40.txt</filename> in the plugin's source
+ code details the changes that were made to the plugin to conform to the
+ new plugin API for jEdit version 4.0.</para>
+ </simplesect>
+
+ <simplesect>
+ <title>Operation</title>
+
+ <para><indexterm>
+ <primary>QuickNotepad</primary>
+
+ <secondary>shortcut keys</secondary>
+ </indexterm> When QuickNotepad is activated, it loads and displays
+ the file stored in its properties as unformatted text. The text can be
+ edited using the keyboard and mouse. The text area component recognizes
+ the following basic editing shortcuts:</para>
+
+ <!-- Limitations on xsltproc's capabilities require a blank column between -->
+
+ <!-- the two columns of data to provide spacing for the table. -->
+
+ <informaltable frame="none">
+ <tgroup align="left" cols="4">
+ <colspec colnum="1" />
+
+ <!-- blank column -->
+
+ <colspec colnum="2" />
+
+ <colspec colnum="3" />
+
+ <!-- blank column -->
+
+ <colspec colnum="4" />
+
+ <tbody>
+ <row>
+ <entry></entry>
+
+ <entry>Cut</entry>
+
+ <entry></entry>
+
+ <entry><keycombo action="simul">
+ <keysym>Ctrl</keysym>
+
+ <keysym>x</keysym>
+ </keycombo></entry>
+ </row>
+
+ <row>
+ <entry></entry>
+
+ <entry>Copy</entry>
+
+ <entry></entry>
+
+ <entry><keycombo action="simul">
+ <keysym>Ctrl</keysym>
+
+ <keysym>c</keysym>
+ </keycombo></entry>
+ </row>
+
+ <row>
+ <entry></entry>
+
+ <entry>Paste</entry>
+
+ <entry></entry>
+
+ <entry><keycombo action="simul">
+ <keysym>Ctrl</keysym>
+
+ <keysym>v</keysym>
+ </keycombo></entry>
+ </row>
+
+ <row>
+ <entry></entry>
+
+ <entry>Select All</entry>
+
+ <entry></entry>
+
+ <entry><keycombo action="simul">
+ <keysym>Ctrl</keysym>
+
+ <keysym>a</keysym>
+ </keycombo></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>QuickNotepad ignores function keys and other combination key
+ presses.</para>
+ </simplesect>
+
+ <simplesect>
+ <title>Toolbar buttons</title>
+
+ <para>Three buttons above the text area provide file management
+ operations:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><guilabel>Choose notepad file</guilabel> - this button
+ opens a file selection dialog permitting the user to select a
+ different file to view in the text area. If a new file is
+ selected, the old file is auomatically saved. The selection is
+ valid only for the current editing session; to change the
+ default QuickNotepad file for future sessions, use the <link
+ linkend="options">options dialog</link>.</para>
+ </listitem>
+
+ <listitem>
+ <para><guilabel>Save notepad file</guilabel> - this button
+ causes QuickNotepad to write the contents of the text area to
+ the designated notepad file. To save the text to another file
+ name, use the <guilabel>Copy notepad to buffer</guilabel>
+ operation.</para>
+ </listitem>
+
+ <listitem>
+ <para><guilabel>Copy notepad to buffer</guilabel> - this button
+ causes the contents of the text to be written to a newly
+ created, untitled buffer in the main text editing area. This
+ operation does not alter the QuickNotepad text area or write its
+ text to storage. Further changes to either the QuickNotepad text
+ area or the new buffer will not affect the other.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>These operations are listed in the menu which appears for
+ QuickNotepad under the <guimenu>Plugins</guimenu> heading. They can also
+ be made the subject of keyboard shortcuts in the <guilabel>Plugin
+ Shortcuts</guilabel> pane of jEdit's options dialog.</para>
+
+ <para>One other operation is available as a keyboard shortcut.
+ <guilabel>Bring QuickNotepad to front</guilabel> activates the plugin
+ and makes visible if it is currently hidden in a docking window.</para>
+ </simplesect>
+
+ <simplesect id="options">
+ <title>Options</title>
+
+ <indexterm>
+ <primary>QuickNotepad</primary>
+
+ <secondary>options</secondary>
+ </indexterm>
+
+ <para>There are three options which can be set using the pane for
+ QuickNotepad in the <guilabel>Plugin Shortcuts</guilabel> section of the
+ general options dialog:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>A checkbox governs whether the name of the notepad file
+ will be displayed in the toolbar panel above the text area. Even
+ if the file name display is enabled, if the plugin is displayed
+ to the left or right of the main editing area, the notepad file
+ name will likely be partially or completely hidden.</para>
+ </listitem>
+
+ <listitem>
+ <para>A text field and adjacent button allow the user to choose
+ the path of the default notepad file by typing its name or
+ opening a file chooser dialog. This file will be loaded (and the
+ old file saved) once the plugin's options settings are
+ committed.</para>
+ </listitem>
+
+ <listitem>
+ <para>A third button shows the name, size and style of the font
+ used by the QuickNotepad text area. Pressing the button summons
+ a font chooser dialog for making a new selection. The text area
+ will be redrawn with the new font once the change is
+ committed.</para>
+ </listitem>
+ </itemizedlist>
+ </simplesect>
+
+ <simplesect>
+ <title>Legal notices</title>
+
+ <para>The QuickNotepad plugin is released under the GNU General Public
+ License (either version 2 or any later version, at the user's option). A
+ copy of the GPL is available in the <filename>COPYING.txt</filename>
+ file in the jEdit distribution.</para>
+
+ <para>The QuickNotepad plugin comes with ABSOLUTELY NO WARRANTY OF ANY
+ KIND; see section 11 and 12 of the GPL for details.</para>
+
+ <para>Permission is granted to copy, distribute and/or modify this
+ document under the terms of the GNU Free Documentation License, Version
+ 1.1 or any later version published by the Free Software Foundation; with
+ no <quote>Invariant Sections</quote>, <quote>Front-Cover Texts</quote>
+ or <quote>Back-Cover Texts</quote>, each as defined in the license. A
+ copy of the license is included in the file
+ <filename>COPYING.DOC.txt</filename> included with the jEdit
+ distribution.</para>
+ </simplesect>
+
+ <simplesect>
+ <title>Feedback</title>
+
+ <para>Comments, bug reports and other feedback may be sent to the <ulink
+ url="mailto:jgellene at nyc.rr.com">author</ulink> or the jEdit-users
+ mailing list.</para>
+ </simplesect>
</article>
\ No newline at end of file
diff --git a/jEdit/macros/C/Include_Guard.bsh b/jEdit/macros/C/Include_Guard.bsh
index b677952..6e73d42 100644
--- a/jEdit/macros/C/Include_Guard.bsh
+++ b/jEdit/macros/C/Include_Guard.bsh
@@ -1,74 +1,74 @@
-/*
- * Include_Guard.bsh - a BeanShell macro script for the
- * jEdit text editor - for C/C++ header files: inserts preprocessor
- * directive in current buffer to ensure that header is included only
- * once per compilation unit
- * Copyright (C) 2001 John Gellene
- * jgellene at nyc.rr.com
- * http://community.jedit.org
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with the jEdit program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id: Include_Guard.bsh 10301 2007-08-03 20:18:54Z blueyed $
- *
- * Notes on use:
- *
- * An "include guard" is a conventional mechanism for reducing
- * compilation time for C/C++ source files by ensuring that the
- * substance of a header file is read by the preprocessor only once
- * for each compilation unit. The usual reason this is necessary is
- * the presence of nested include files, sometimes an unavoidable
- * circumstance when creating a hierarchy of classes.
- *
- * To use the macro, first place the caret at the beginning of the header
- * file before any uncommented text. The macro returns to this position
- * upon completion.
- *
- * The macro will complain if you have not yet named the buffer, but it
- * does not check to see if the buffer is actually a header file.
- *
- * The defined term that triggers the guard is taken from the buffer's
- * name. This is one conventional approach and should not cause a conflict
- * unless a compilation unit includes header files from different
- * directories with the same name. In that case, change the conflicting
- * guard names manually.
- *
- *
- * Checked for jEdit 4.0 API
- *
- */
-
-void includeGuard()
-{
- if(buffer.isUntitled())
- {
- Macros.error(view, "Name the file before inserting an include guard.");
- return;
- }
-
- guardName = buffer.getName().toUpperCase().replace('.', '_') ;
- pos = textArea.getCaretPosition();
- textArea.setCaretPosition(0);
- textArea.setSelectedText("#ifndef " + guardName + "\n#define " + guardName + "\n\n");
- pos1 = textArea.getCaretPosition();
- textArea.setCaretPosition(buffer.getLength());
- textArea.setSelectedText("\n#endif // #ifndef " + guardName + "\n");
- textArea.setCaretPosition(pos + pos1);
-}
-
-if( buffer.isReadOnly() )
- Macros.error(view, "Buffer is read-only.");
-else
- includeGuard();
+/*
+ * Include_Guard.bsh - a BeanShell macro script for the
+ * jEdit text editor - for C/C++ header files: inserts preprocessor
+ * directive in current buffer to ensure that header is included only
+ * once per compilation unit
+ * Copyright (C) 2001 John Gellene
+ * jgellene at nyc.rr.com
+ * http://community.jedit.org
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the jEdit program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id: Include_Guard.bsh 10301 2007-08-03 20:18:54Z blueyed $
+ *
+ * Notes on use:
+ *
+ * An "include guard" is a conventional mechanism for reducing
+ * compilation time for C/C++ source files by ensuring that the
+ * substance of a header file is read by the preprocessor only once
+ * for each compilation unit. The usual reason this is necessary is
+ * the presence of nested include files, sometimes an unavoidable
+ * circumstance when creating a hierarchy of classes.
+ *
+ * To use the macro, first place the caret at the beginning of the header
+ * file before any uncommented text. The macro returns to this position
+ * upon completion.
+ *
+ * The macro will complain if you have not yet named the buffer, but it
+ * does not check to see if the buffer is actually a header file.
+ *
+ * The defined term that triggers the guard is taken from the buffer's
+ * name. This is one conventional approach and should not cause a conflict
+ * unless a compilation unit includes header files from different
+ * directories with the same name. In that case, change the conflicting
+ * guard names manually.
+ *
+ *
+ * Checked for jEdit 4.0 API
+ *
+ */
+
+void includeGuard()
+{
+ if(buffer.isUntitled())
+ {
+ Macros.error(view, "Name the file before inserting an include guard.");
+ return;
+ }
+
+ guardName = buffer.getName().toUpperCase().replace('.', '_') ;
+ pos = textArea.getCaretPosition();
+ textArea.setCaretPosition(0);
+ textArea.setSelectedText("#ifndef " + guardName + "\n#define " + guardName + "\n\n");
+ pos1 = textArea.getCaretPosition();
+ textArea.setCaretPosition(buffer.getLength());
+ textArea.setSelectedText("\n#endif // #ifndef " + guardName + "\n");
+ textArea.setCaretPosition(pos + pos1);
+}
+
+if( buffer.isReadOnly() )
+ Macros.error(view, "Buffer is read-only.");
+else
+ includeGuard();
diff --git a/jEdit/macros/C/Toggle_Header_Source.bsh b/jEdit/macros/C/Toggle_Header_Source.bsh
index 6727e36..443bde0 100644
--- a/jEdit/macros/C/Toggle_Header_Source.bsh
+++ b/jEdit/macros/C/Toggle_Header_Source.bsh
@@ -1,181 +1,181 @@
-/**
- ToggleHeaderSource.bsh V1.4
- by Alan Ezust
- $Id: Toggle_Header_Source.bsh 16248 2009-09-29 20:43:41Z shlomy $
-
- A jedit beanshell macro that toggles your current buffer
- between the header file (.h) and the source file (.c(c|pp|xx)?).
-
- Enables you to switch the current text
- buffer between C/C++ header and sourcecode
- file. If the file does not already exist, it opens a new buffer
- of that name for you.
-
- New to 1.2: If another buffer is already open with the requested
- filename, it is selected, even if located in another directory.
-
- New to 1.3: If another EditPane is already open with the
- requested buffer, it is selected and focused.
-
- New to 1.4: Instead of throwing an exception, treats
- files with no extension as header files, and tries to
- open .cpp file with same basename.
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- as published by the Free Software Foundation; either version 2
- of the License, or any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with the jEdit program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
- */
-
-import projectviewer.*;
-import projectviewer.vpt.*;
-import java.util.*;
-
-/* Set this property from the console beanshell to something else if cpp is not
- your favorite extension. e.g.:
- jEdit.setProperty("default.extension.c", "cc");
-*/
-
-String defaultSourceExtension = jEdit.getProperty("default.extension.c", "cpp");
-
-String[] sourceExtensions = new String[]{"cpp", "cxx", "cc", "c"};
-
-/** Looks for an existing file in the current project, if ProjectViewer is
- installed and a 'current' project exists.
- @return the absolute path if found, NULL if not.
- */
-String findBufferInProject(String fileName) {
- int sep1 = fileName.lastIndexOf('\\');
- int sep2 = fileName.lastIndexOf('/');
- if (sep1 > sep2)
- fileName = fileName.substring(sep1 + 1);
- else if (sep2 > sep1)
- fileName = fileName.substring(sep2 + 1);
- VPTProject project = ProjectViewer.getActiveProject(view);
- Collection nodes = project.getOpenableNodes();
- for (VPTNode node: nodes) {
- String path = node.getNodePath();
- if ((path.endsWith("\\" + fileName)) || (path.endsWith("/" + fileName)))
- return path;
- }
- return null;
-}
-
-/** Looks for an existing file in the same directory, or
- an already open buffer with the given name in another directory.
- @return the absolute path if found, NULL if not.
- */
-String findBuffer(String fileName) {
- File f = new File(fileName);
- if (f.canRead()) return f.getPath();
- String fn2 = f.getName();
- Buffer[] bufs = jEdit.getBuffers();
- bn = bufs.length;
- for (int i=0; i<bn; ++i) {
- Buffer b = bufs[i];
- if (b.getName().equals(fn2)) return b.getPath();
- }
- return null;
-}
-
-/** Returns true if PV is installed and a project is selected (current)
-*/
-boolean activeProjectExists()
-{
- EditPlugin p = jEdit.getPlugin("projectviewer.ProjectPlugin",false);
- if(p == null)
- return false;
- VPTProject project = ProjectViewer.getActiveProject(view);
- return (project != null);
-}
-
-/** Given a header file, iterates through all sourcefile extensions checking if the sourcefile exists.
- @return the absolute path of the sourcefile for this header
-*/
-
-String getSourceFile(String baseName)
-{
- int numExt = sourceExtensions.length;
- // First try open buffers
- for (int i=numExt-1; i>=0; --i)
- {
- String ext = sourceExtensions[i];
- String tryFile = baseName + "." + ext;
- String path = findBuffer(tryFile);
- if (path != null) return path;
- }
- // Then try current project
- if (activeProjectExists())
- {
- for (int i=numExt-1; i>=0; --i)
- {
- String ext = sourceExtensions[i];
- String tryFile = baseName + "." + ext;
- String path = findBufferInProject(tryFile);
- if (path != null) return path;
- }
- }
- return baseName + "." + defaultSourceExtension;
-}
-
-boolean isSourceFile(String extension)
-{
- for (int i=0; i<sourceExtensions.length; ++i) {
- if (extension.equals(sourceExtensions[i])) return true;
- }
- return false;
-}
-
-void toggleHeaderSource()
-{
- String currentFile = buffer.getPath();
- int pos = currentFile.lastIndexOf('.');
- String path = null;
- if (pos < 0) {
- path = getSourceFile(currentFile);
- }
- else {
- String baseName = currentFile.substring(0, pos);
- String extension = currentFile.substring(pos+1);
- if (isSourceFile(extension))
- {
- String header = baseName + ".h";
- path = findBuffer(header);
- if (path == null) {
- if (activeProjectExists())
- path = findBufferInProject(header);
- }
- if (path == null) path = baseName + ".h";
- }
- else if (extension.equals("h")) {
- path = getSourceFile(baseName);
- }
- }
- if (path == null) return;
- // see if it is already open in another editpane
- panes = view.getEditPanes();
- if (panes.length > 1)
- for (int i=panes.length - 1; i >= 0; --i) {
- buf = panes[i].getBuffer();
- if (buf.getName().equals(path)
- || buf.getPath().equals(path)) {
- panes[i].focusOnTextArea();
- return;
- }
- }
- jEdit.openFile(view, path);
-}
-
-toggleHeaderSource();
-
-
+/**
+ ToggleHeaderSource.bsh V1.4
+ by Alan Ezust
+ $Id: Toggle_Header_Source.bsh 16248 2009-09-29 20:43:41Z shlomy $
+
+ A jedit beanshell macro that toggles your current buffer
+ between the header file (.h) and the source file (.c(c|pp|xx)?).
+
+ Enables you to switch the current text
+ buffer between C/C++ header and sourcecode
+ file. If the file does not already exist, it opens a new buffer
+ of that name for you.
+
+ New to 1.2: If another buffer is already open with the requested
+ filename, it is selected, even if located in another directory.
+
+ New to 1.3: If another EditPane is already open with the
+ requested buffer, it is selected and focused.
+
+ New to 1.4: Instead of throwing an exception, treats
+ files with no extension as header files, and tries to
+ open .cpp file with same basename.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with the jEdit program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ */
+
+import projectviewer.*;
+import projectviewer.vpt.*;
+import java.util.*;
+
+/* Set this property from the console beanshell to something else if cpp is not
+ your favorite extension. e.g.:
+ jEdit.setProperty("default.extension.c", "cc");
+*/
+
+String defaultSourceExtension = jEdit.getProperty("default.extension.c", "cpp");
+
+String[] sourceExtensions = new String[]{"cpp", "cxx", "cc", "c"};
+
+/** Looks for an existing file in the current project, if ProjectViewer is
+ installed and a 'current' project exists.
+ @return the absolute path if found, NULL if not.
+ */
+String findBufferInProject(String fileName) {
+ int sep1 = fileName.lastIndexOf('\\');
+ int sep2 = fileName.lastIndexOf('/');
+ if (sep1 > sep2)
+ fileName = fileName.substring(sep1 + 1);
+ else if (sep2 > sep1)
+ fileName = fileName.substring(sep2 + 1);
+ VPTProject project = ProjectViewer.getActiveProject(view);
+ Collection nodes = project.getOpenableNodes();
+ for (VPTNode node: nodes) {
+ String path = node.getNodePath();
+ if ((path.endsWith("\\" + fileName)) || (path.endsWith("/" + fileName)))
+ return path;
+ }
+ return null;
+}
+
+/** Looks for an existing file in the same directory, or
+ an already open buffer with the given name in another directory.
+ @return the absolute path if found, NULL if not.
+ */
+String findBuffer(String fileName) {
+ File f = new File(fileName);
+ if (f.canRead()) return f.getPath();
+ String fn2 = f.getName();
+ Buffer[] bufs = jEdit.getBuffers();
+ bn = bufs.length;
+ for (int i=0; i<bn; ++i) {
+ Buffer b = bufs[i];
+ if (b.getName().equals(fn2)) return b.getPath();
+ }
+ return null;
+}
+
+/** Returns true if PV is installed and a project is selected (current)
+*/
+boolean activeProjectExists()
+{
+ EditPlugin p = jEdit.getPlugin("projectviewer.ProjectPlugin",false);
+ if(p == null)
+ return false;
+ VPTProject project = ProjectViewer.getActiveProject(view);
+ return (project != null);
+}
+
+/** Given a header file, iterates through all sourcefile extensions checking if the sourcefile exists.
+ @return the absolute path of the sourcefile for this header
+*/
+
+String getSourceFile(String baseName)
+{
+ int numExt = sourceExtensions.length;
+ // First try open buffers
+ for (int i=numExt-1; i>=0; --i)
+ {
+ String ext = sourceExtensions[i];
+ String tryFile = baseName + "." + ext;
+ String path = findBuffer(tryFile);
+ if (path != null) return path;
+ }
+ // Then try current project
+ if (activeProjectExists())
+ {
+ for (int i=numExt-1; i>=0; --i)
+ {
+ String ext = sourceExtensions[i];
+ String tryFile = baseName + "." + ext;
+ String path = findBufferInProject(tryFile);
+ if (path != null) return path;
+ }
+ }
+ return baseName + "." + defaultSourceExtension;
+}
+
+boolean isSourceFile(String extension)
+{
+ for (int i=0; i<sourceExtensions.length; ++i) {
+ if (extension.equals(sourceExtensions[i])) return true;
+ }
+ return false;
+}
+
+void toggleHeaderSource()
+{
+ String currentFile = buffer.getPath();
+ int pos = currentFile.lastIndexOf('.');
+ String path = null;
+ if (pos < 0) {
+ path = getSourceFile(currentFile);
+ }
+ else {
+ String baseName = currentFile.substring(0, pos);
+ String extension = currentFile.substring(pos+1);
+ if (isSourceFile(extension))
+ {
+ String header = baseName + ".h";
+ path = findBuffer(header);
+ if (path == null) {
+ if (activeProjectExists())
+ path = findBufferInProject(header);
+ }
+ if (path == null) path = baseName + ".h";
+ }
+ else if (extension.equals("h")) {
+ path = getSourceFile(baseName);
+ }
+ }
+ if (path == null) return;
+ // see if it is already open in another editpane
+ panes = view.getEditPanes();
+ if (panes.length > 1)
+ for (int i=panes.length - 1; i >= 0; --i) {
+ buf = panes[i].getBuffer();
+ if (buf.getName().equals(path)
+ || buf.getPath().equals(path)) {
+ panes[i].focusOnTextArea();
+ return;
+ }
+ }
+ jEdit.openFile(view, path);
+}
+
+toggleHeaderSource();
+
+
diff --git a/jEdit/macros/Clipboard/Copy_Lines.bsh b/jEdit/macros/Clipboard/Copy_Lines.bsh
index 21f9774..4efc686 100644
--- a/jEdit/macros/Clipboard/Copy_Lines.bsh
+++ b/jEdit/macros/Clipboard/Copy_Lines.bsh
@@ -1,36 +1,36 @@
-/*
-* Copy_Lines.bsh - a BeanShell macro for jEdit
-* which copies either the selected lines of text, or the current line
-* if no text is selected, to the clipboard.
-*
-* Copyright (C) 2003 Ollie Rutherfurd <oliver at jedit.org>
-*
-* $Id: Copy_Lines.bsh 11860 2008-02-24 23:43:28Z ezust $
-*/
-
-copyLines(){
- selections = textArea.getSelectedLines();
-
- if(selections.length == 0){
- selections = new int [] {textArea.getCaretLine()};
- }
- start = textArea.getLineStartOffset(selections[0]);
- stop = textArea.getLineEndOffset(selections[selections.length-1]);
- Registers.getRegister('$').setValue(textArea.getText(start,stop-start+1));
-}
-
-copyLines();
-
-/*
- Macro index data (in DocBook format)
-
-<listitem>
- <para><filename>Copy_Lines.bsh</filename>
- <abstract><para>
- If no text is selected, the current line is copied to
- the clipboard, otherwise otherwise, all lines that contain the selection
- are copied to the clipboard.
- </para></abstract>
-</listitem>
-
-*/
+/*
+* Copy_Lines.bsh - a BeanShell macro for jEdit
+* which copies either the selected lines of text, or the current line
+* if no text is selected, to the clipboard.
+*
+* Copyright (C) 2003 Ollie Rutherfurd <oliver at jedit.org>
+*
+* $Id: Copy_Lines.bsh 11860 2008-02-24 23:43:28Z ezust $
+*/
+
+copyLines(){
+ selections = textArea.getSelectedLines();
+
+ if(selections.length == 0){
+ selections = new int [] {textArea.getCaretLine()};
+ }
+ start = textArea.getLineStartOffset(selections[0]);
+ stop = textArea.getLineEndOffset(selections[selections.length-1]);
+ Registers.getRegister('$').setValue(textArea.getText(start,stop-start+1));
+}
+
+copyLines();
+
+/*
+ Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>Copy_Lines.bsh</filename>
+ <abstract><para>
+ If no text is selected, the current line is copied to
+ the clipboard, otherwise otherwise, all lines that contain the selection
+ are copied to the clipboard.
+ </para></abstract>
+</listitem>
+
+*/
diff --git a/jEdit/macros/Clipboard/Copy_Lines_Containing.bsh b/jEdit/macros/Clipboard/Copy_Lines_Containing.bsh
index 36951f6..fc895d1 100644
--- a/jEdit/macros/Clipboard/Copy_Lines_Containing.bsh
+++ b/jEdit/macros/Clipboard/Copy_Lines_Containing.bsh
@@ -1,28 +1,28 @@
-/*
- * Copy_Lines_Containing.bsh - Copies lines from current buffer that
- * contain a user-supplied string to the clipboard.
- *
- * Copyright (C) 2004 Ollie Rutherfurd <oliver at jedit.org>
- *
- * $Id: Copy_Lines_Containing.bsh 5098 2004-08-03 21:31:48Z orutherfurd $
- */
-
-copyLinesContaining(){
- String text = Macros.input(view,"Copy lines containing:");
- if(text == null || "".equals(text))
- return;
- int count = 0;
- StringBuffer buff = new StringBuffer();
- for(int i = 0; i < buffer.getLineCount(); i++){
- String line = buffer.getLineText(i);
- if(line.indexOf(text) > -1){
- buff.append(line).append('\n');
- count++;
- }
- }
- Registers.setRegister('$',buff.toString());
- HistoryModel.getModel("clipboard").addItem(buff.toString());
- view.getStatus().setMessageAndClear("" + count + " lines copied");
-}
-
-copyLinesContaining();
+/*
+ * Copy_Lines_Containing.bsh - Copies lines from current buffer that
+ * contain a user-supplied string to the clipboard.
+ *
+ * Copyright (C) 2004 Ollie Rutherfurd <oliver at jedit.org>
+ *
+ * $Id: Copy_Lines_Containing.bsh 5098 2004-08-03 21:31:48Z orutherfurd $
+ */
+
+copyLinesContaining(){
+ String text = Macros.input(view,"Copy lines containing:");
+ if(text == null || "".equals(text))
+ return;
+ int count = 0;
+ StringBuffer buff = new StringBuffer();
+ for(int i = 0; i < buffer.getLineCount(); i++){
+ String line = buffer.getLineText(i);
+ if(line.indexOf(text) > -1){
+ buff.append(line).append('\n');
+ count++;
+ }
+ }
+ Registers.setRegister('$',buff.toString());
+ HistoryModel.getModel("clipboard").addItem(buff.toString());
+ view.getStatus().setMessageAndClear("" + count + " lines copied");
+}
+
+copyLinesContaining();
diff --git a/jEdit/macros/Clipboard/Copy_Visible_Lines.bsh b/jEdit/macros/Clipboard/Copy_Visible_Lines.bsh
index 6bab0b8..7a26509 100644
--- a/jEdit/macros/Clipboard/Copy_Visible_Lines.bsh
+++ b/jEdit/macros/Clipboard/Copy_Visible_Lines.bsh
@@ -1,34 +1,34 @@
-/*
- * Copy_Visible_Lines.bsh - Copies visible (non-folded) lines from
- * the current buffer to the clipboard.
- *
- * Copyright (C) 2002-2004 Ollie Rutherfurd <oliver at jedit.org>
- *
- * $Id: Copy_Visible_Lines.bsh 5098 2004-08-03 21:31:48Z orutherfurd $
- */
-
-void copyVisibleLines(View view){
- JEditTextArea textArea = view.getTextArea();
- DisplayManager dm = textArea.getDisplayManager();
-
- StringBuffer buff = new StringBuffer();
- for(int i=0; i < buffer.getLineCount(); i++){
- if(dm.isLineVisible(i))
- buff.append(textArea.getLineText(i)).append('\n');
- }
- Registers.setRegister('$', buff.toString());
-}
-
-copyVisibleLines(view);
-
-/*
-
-<listitem>
- <para><filename>Copy_Visible_Lines.bsh</filename></para>
- <abstract><para>Copies the visible lines from the current
- buffer to the Clipboard. Lines that are not visible
- becuase they are folded are not copied.
- </para></abstract>
-</listitem>
-
-*/
+/*
+ * Copy_Visible_Lines.bsh - Copies visible (non-folded) lines from
+ * the current buffer to the clipboard.
+ *
+ * Copyright (C) 2002-2004 Ollie Rutherfurd <oliver at jedit.org>
+ *
+ * $Id: Copy_Visible_Lines.bsh 5098 2004-08-03 21:31:48Z orutherfurd $
+ */
+
+void copyVisibleLines(View view){
+ JEditTextArea textArea = view.getTextArea();
+ DisplayManager dm = textArea.getDisplayManager();
+
+ StringBuffer buff = new StringBuffer();
+ for(int i=0; i < buffer.getLineCount(); i++){
+ if(dm.isLineVisible(i))
+ buff.append(textArea.getLineText(i)).append('\n');
+ }
+ Registers.setRegister('$', buff.toString());
+}
+
+copyVisibleLines(view);
+
+/*
+
+<listitem>
+ <para><filename>Copy_Visible_Lines.bsh</filename></para>
+ <abstract><para>Copies the visible lines from the current
+ buffer to the Clipboard. Lines that are not visible
+ becuase they are folded are not copied.
+ </para></abstract>
+</listitem>
+
+*/
diff --git a/jEdit/macros/Clipboard/Cut_Lines.bsh b/jEdit/macros/Clipboard/Cut_Lines.bsh
index d3327f0..3688d2e 100644
--- a/jEdit/macros/Clipboard/Cut_Lines.bsh
+++ b/jEdit/macros/Clipboard/Cut_Lines.bsh
@@ -1,41 +1,41 @@
-/*
-* Cut_Lines.bsh - a BeanShell macro for jEdit
-* which cuts either the selected text, or the current line
-* if no text is selected, to the clipboard.
-*
-* Copyright (C) 2003 Ollie Rutherfurd <oliver at jedit.org>
-* Copyright (c) 2008 encorejane at users.sourceforge.net
-*
-* $Id: Cut_Lines.bsh 11860 2008-02-24 23:43:28Z ezust $
-*/
-
-cutLines(){
- selections = textArea.getSelectedLines();
-
- if(selections.length == 0){
- selections = new int [] {textArea.getCaretLine()};
- }
- start = textArea.getLineStartOffset(selections[0]);
- stop = textArea.getLineEndOffset(selections[selections.length-1]);
- textArea.setSelection(new Selection.Range(start,stop));
- Registers.cut(textArea,'$');
-}
-
-if(buffer.isReadOnly())
- Toolkit.getDefaultToolkit().beep();
-else
- cutLines();
-
-/*
- Macro index data (in DocBook format)
-
-<listitem>
- <para><filename>Cut_Selection_or_Line.bsh</filename>
- <abstract><para>
- If no text is selected, the current line is cut to the clipboard,
- otherwise, all lines that contain the selection are cut to the clipboard.
- </para></abstract>
-</listitem>
-
-*/
-
+/*
+* Cut_Lines.bsh - a BeanShell macro for jEdit
+* which cuts either the selected text, or the current line
+* if no text is selected, to the clipboard.
+*
+* Copyright (C) 2003 Ollie Rutherfurd <oliver at jedit.org>
+* Copyright (c) 2008 encorejane at users.sourceforge.net
+*
+* $Id: Cut_Lines.bsh 11860 2008-02-24 23:43:28Z ezust $
+*/
+
+cutLines(){
+ selections = textArea.getSelectedLines();
+
+ if(selections.length == 0){
+ selections = new int [] {textArea.getCaretLine()};
+ }
+ start = textArea.getLineStartOffset(selections[0]);
+ stop = textArea.getLineEndOffset(selections[selections.length-1]);
+ textArea.setSelection(new Selection.Range(start,stop));
+ Registers.cut(textArea,'$');
+}
+
+if(buffer.isReadOnly())
+ Toolkit.getDefaultToolkit().beep();
+else
+ cutLines();
+
+/*
+ Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>Cut_Selection_or_Line.bsh</filename>
+ <abstract><para>
+ If no text is selected, the current line is cut to the clipboard,
+ otherwise, all lines that contain the selection are cut to the clipboard.
+ </para></abstract>
+</listitem>
+
+*/
+
diff --git a/jEdit/macros/Clipboard/Cut_Lines_Containing.bsh b/jEdit/macros/Clipboard/Cut_Lines_Containing.bsh
index 75676fe..ef3b983 100644
--- a/jEdit/macros/Clipboard/Cut_Lines_Containing.bsh
+++ b/jEdit/macros/Clipboard/Cut_Lines_Containing.bsh
@@ -1,36 +1,36 @@
-/*
- * Cut_Lines_Containing.bsh - Cuts lines from current buffer that
- * contain a user-supplied string to the clipboard.
- *
- * Copyright (C) 2004 Ollie Rutherfurd <oliver at jedit.org>
- *
- * $Id: Cut_Lines_Containing.bsh 9126 2007-03-10 19:14:30Z Vampire0 $
- */
-
-cutLinesContaining(){
- String text = Macros.input(view,"Cut lines containing:");
- if(text == null || "".equals(text))
- return;
- int count = 0;
- int start = 0;
- int end = 0;
- StringBuffer buff = new StringBuffer();
- for(int i = buffer.getLineCount() - 1 ; i >= 0; i--){
- String line = buffer.getLineText(i);
- if(line.indexOf(text) > -1){
- buff.insert(0,'\n').insert(0,line);
- int start = buffer.getLineStartOffset(i);
- int end = buffer.getLineEndOffset(i);
- buffer.remove(start,Math.min(end,buffer.getLength())-start);
- count++;
- }
- }
- Registers.setRegister('$',buff.toString());
- HistoryModel.getModel("clipboard").addItem(buff.toString());
- view.getStatus().setMessageAndClear("" + count + " lines cut");
-}
-
-if(buffer.isReadOnly())
- Toolkit.getDefaultToolkit().beep();
-else
- cutLinesContaining();
+/*
+ * Cut_Lines_Containing.bsh - Cuts lines from current buffer that
+ * contain a user-supplied string to the clipboard.
+ *
+ * Copyright (C) 2004 Ollie Rutherfurd <oliver at jedit.org>
+ *
+ * $Id: Cut_Lines_Containing.bsh 9126 2007-03-10 19:14:30Z Vampire0 $
+ */
+
+cutLinesContaining(){
+ String text = Macros.input(view,"Cut lines containing:");
+ if(text == null || "".equals(text))
+ return;
+ int count = 0;
+ int start = 0;
+ int end = 0;
+ StringBuffer buff = new StringBuffer();
+ for(int i = buffer.getLineCount() - 1 ; i >= 0; i--){
+ String line = buffer.getLineText(i);
+ if(line.indexOf(text) > -1){
+ buff.insert(0,'\n').insert(0,line);
+ int start = buffer.getLineStartOffset(i);
+ int end = buffer.getLineEndOffset(i);
+ buffer.remove(start,Math.min(end,buffer.getLength())-start);
+ count++;
+ }
+ }
+ Registers.setRegister('$',buff.toString());
+ HistoryModel.getModel("clipboard").addItem(buff.toString());
+ view.getStatus().setMessageAndClear("" + count + " lines cut");
+}
+
+if(buffer.isReadOnly())
+ Toolkit.getDefaultToolkit().beep();
+else
+ cutLinesContaining();
diff --git a/jEdit/macros/Editing/Emacs_Ctrl-K.bsh b/jEdit/macros/Editing/Emacs_Ctrl-K.bsh
index 79bd3cd..6375571 100644
--- a/jEdit/macros/Editing/Emacs_Ctrl-K.bsh
+++ b/jEdit/macros/Editing/Emacs_Ctrl-K.bsh
@@ -1,67 +1,67 @@
-/*
-* Emacs_Ctrl-k.bsh - a BeanShell macro for jEdit
-* which cuts either the selected text, or the current line
-* if no text is selected, to the clipboard.
-*
-* Repeated calls to Emacs-Ctrl-K from the same position
-* should append cut lines to the cut buffer.
-*
-* By Alan Ezust <ezust at users dot sourceforge dot net>
-* with help from Ollie Rutherford
-* Version 0.1 21 December 2003
-*
-*/
-
-// an arbitrary letter for a register.
-myReg = 'p';
-
-emacsCtrlK()
-{
- int currentLine = textArea.getCaretPosition();
- try
- {
- int lastLine = Integer.parseInt("" + jEdit.getProperty("lastpos"));
- if(lastLine != currentLine)
- {
- Registers.clearRegister('$');
- }
- }
- catch ( NumberFormatException nfe )
- {
- Registers.clearRegister('$');
- }
-
- selections = textArea.getSelection();
- if(selections.length == 0)
- {
- textArea.goToEndOfWhiteSpace(true);
- }
- selections = textArea.getSelection();
- if (selections.length==0)
- {
- textArea.goToNextCharacter(true);
- }
- selections = textArea.getSelection();
- Registers.append(textArea, '$', "");
-
- // since there is no cut-append, I"ll just cut it into another register
- Registers.cut(textArea, 'e');
-
- // remember the caretPosition for next time around
- // Registers.setRegister('p', "" + textArea.getCaretPosition());
- jEdit.setProperty("lastpos", "" + textArea.getCaretPosition());
-}
-
-emacsCtrlK();
-
-/**
-<listitem>
- <para>
- If no text is selected, the current line is cut to the clipboard,
- otherwise the selected text is cut to the clipboard.
-
- Subsequent calls to Emacs_Ctrl-k will alternate between cut-append
- the following newline character, or the following line of text.
- </para>
-</listitem>
-*/
+/*
+* Emacs_Ctrl-k.bsh - a BeanShell macro for jEdit
+* which cuts either the selected text, or the current line
+* if no text is selected, to the clipboard.
+*
+* Repeated calls to Emacs-Ctrl-K from the same position
+* should append cut lines to the cut buffer.
+*
+* By Alan Ezust <ezust at users dot sourceforge dot net>
+* with help from Ollie Rutherford
+* Version 0.1 21 December 2003
+*
+*/
+
+// an arbitrary letter for a register.
+myReg = 'p';
+
+emacsCtrlK()
+{
+ int currentLine = textArea.getCaretPosition();
+ try
+ {
+ int lastLine = Integer.parseInt("" + jEdit.getProperty("lastpos"));
+ if(lastLine != currentLine)
+ {
+ Registers.clearRegister('$');
+ }
+ }
+ catch ( NumberFormatException nfe )
+ {
+ Registers.clearRegister('$');
+ }
+
+ selections = textArea.getSelection();
+ if(selections.length == 0)
+ {
+ textArea.goToEndOfWhiteSpace(true);
+ }
+ selections = textArea.getSelection();
+ if (selections.length==0)
+ {
+ textArea.goToNextCharacter(true);
+ }
+ selections = textArea.getSelection();
+ Registers.append(textArea, '$', "");
+
+ // since there is no cut-append, I"ll just cut it into another register
+ Registers.cut(textArea, 'e');
+
+ // remember the caretPosition for next time around
+ // Registers.setRegister('p', "" + textArea.getCaretPosition());
+ jEdit.setProperty("lastpos", "" + textArea.getCaretPosition());
+}
+
+emacsCtrlK();
+
+/**
+<listitem>
+ <para>
+ If no text is selected, the current line is cut to the clipboard,
+ otherwise the selected text is cut to the clipboard.
+
+ Subsequent calls to Emacs_Ctrl-k will alternate between cut-append
+ the following newline character, or the following line of text.
+ </para>
+</listitem>
+*/
diff --git a/jEdit/macros/Editing/Emacs_Next_Line.bsh b/jEdit/macros/Editing/Emacs_Next_Line.bsh
index e0e45c5..afc1c16 100644
--- a/jEdit/macros/Editing/Emacs_Next_Line.bsh
+++ b/jEdit/macros/Editing/Emacs_Next_Line.bsh
@@ -1,43 +1,43 @@
-/*
- * Emacs_Next_Line.bsh - Beanshell macro for jEdit that provides
- * 'Emacs-like scrolling. If the caret is at the bottom of the
- * screen the next line is centered on the screen rather than
- * scrolling the whole text area by one line. For machines with
- * slow painting, this can increase scrolling speed.
- *
- * Copyright (C) 2002-2004, Ollie Rutherfurd <oliver at rutherfurd.net>
- *
- * $Id: Emacs_Next_Line.bsh 4995 2004-03-19 15:58:00Z spestov $
- */
-
-void emacsNextLine(View view){
-
- // need access to textArea.lastLinePartial
- setAccessibility(true);
-
- int first = textArea.getFirstLine();
- int caretLine = textArea.getScreenLineOfOffset(textArea.getCaretPosition());
- int visibleLines = textArea.getVisibleLines();
- int electricScroll = textArea.getElectricScroll();
-
- if(caretLine != -1 && caretLine+1 >=
- (visibleLines - (electricScroll + (textArea.lastLinePartial ? 1 : 0))))
- {
- int newFirst = (first + (visibleLines - electricScroll) / 2);
- textArea.setFirstLine(newFirst);
- }
- textArea.goToNextLine(false);
-}
-
-emacsNextLine(view);
-
-/*
- <listitem>
- <para><filename>Emacs_Next_Line.bsh</filename></para>
- <abstract><para>
- Moves the cursor to the next line, centering
- the current line in the middle of the text area
- if the cursor is at the bottom of the text area.
- </para></abstract>
- </listitem>
-*/
+/*
+ * Emacs_Next_Line.bsh - Beanshell macro for jEdit that provides
+ * 'Emacs-like scrolling. If the caret is at the bottom of the
+ * screen the next line is centered on the screen rather than
+ * scrolling the whole text area by one line. For machines with
+ * slow painting, this can increase scrolling speed.
+ *
+ * Copyright (C) 2002-2004, Ollie Rutherfurd <oliver at rutherfurd.net>
+ *
+ * $Id: Emacs_Next_Line.bsh 4995 2004-03-19 15:58:00Z spestov $
+ */
+
+void emacsNextLine(View view){
+
+ // need access to textArea.lastLinePartial
+ setAccessibility(true);
+
+ int first = textArea.getFirstLine();
+ int caretLine = textArea.getScreenLineOfOffset(textArea.getCaretPosition());
+ int visibleLines = textArea.getVisibleLines();
+ int electricScroll = textArea.getElectricScroll();
+
+ if(caretLine != -1 && caretLine+1 >=
+ (visibleLines - (electricScroll + (textArea.lastLinePartial ? 1 : 0))))
+ {
+ int newFirst = (first + (visibleLines - electricScroll) / 2);
+ textArea.setFirstLine(newFirst);
+ }
+ textArea.goToNextLine(false);
+}
+
+emacsNextLine(view);
+
+/*
+ <listitem>
+ <para><filename>Emacs_Next_Line.bsh</filename></para>
+ <abstract><para>
+ Moves the cursor to the next line, centering
+ the current line in the middle of the text area
+ if the cursor is at the bottom of the text area.
+ </para></abstract>
+ </listitem>
+*/
diff --git a/jEdit/macros/Editing/Emacs_Previous_Line.bsh b/jEdit/macros/Editing/Emacs_Previous_Line.bsh
index e66dfd4..de86c02 100644
--- a/jEdit/macros/Editing/Emacs_Previous_Line.bsh
+++ b/jEdit/macros/Editing/Emacs_Previous_Line.bsh
@@ -1,45 +1,45 @@
-/*
- * Emacs_Previous_Line.bsh - Beanshell macro for jEdit that provides
- * 'Emacs-like scrolling. If the caret is at the top of the
- * screen the current line is centered on the screen rather than
- * scrolling the whole text area by one line. For machines with
- * slow painting, this can increase scrolling speed.
- *
- * Copyright (C) 2002-2004, Ollie Rutherfurd <oliver at rutherfurd.net>
- *
- * $Id: Emacs_Previous_Line.bsh 4995 2004-03-19 15:58:00Z spestov $
- */
-
-void emacsPreviousLine(View view){
-
- // need access to textArea.lastLinePartial
- setAccessibility(true);
-
- int first = textArea.getFirstLine();
- int caretLine = textArea.getScreenLineOfOffset(textArea.getCaretPosition());
- int visibleLines = textArea.getVisibleLines();
- int electricScroll = textArea.getElectricScroll();
-
- if(caretLine <= electricScroll){
- int newFirst = first - ((visibleLines - electricScroll) / 2);
- // if jumping would put us over the top, just go to top
- if(newFirst < 0){
- newFirst = 0;
- }
- textArea.setFirstLine(newFirst);
- }
- textArea.goToPrevLine(false);
-}
-
-emacsPreviousLine(view);
-
-/*
- <listitem>
- <para><filename>Emacs_Previous_Line.bsh</filename></para>
- <abstract><para>
- Moves the cursor to the previous line, centering
- the current line in the middle of the text area
- if the cursor is at the top of the text area.
- </para></abstract>
- </listitem>
-*/
+/*
+ * Emacs_Previous_Line.bsh - Beanshell macro for jEdit that provides
+ * 'Emacs-like scrolling. If the caret is at the top of the
+ * screen the current line is centered on the screen rather than
+ * scrolling the whole text area by one line. For machines with
+ * slow painting, this can increase scrolling speed.
+ *
+ * Copyright (C) 2002-2004, Ollie Rutherfurd <oliver at rutherfurd.net>
+ *
+ * $Id: Emacs_Previous_Line.bsh 4995 2004-03-19 15:58:00Z spestov $
+ */
+
+void emacsPreviousLine(View view){
+
+ // need access to textArea.lastLinePartial
+ setAccessibility(true);
+
+ int first = textArea.getFirstLine();
+ int caretLine = textArea.getScreenLineOfOffset(textArea.getCaretPosition());
+ int visibleLines = textArea.getVisibleLines();
+ int electricScroll = textArea.getElectricScroll();
+
+ if(caretLine <= electricScroll){
+ int newFirst = first - ((visibleLines - electricScroll) / 2);
+ // if jumping would put us over the top, just go to top
+ if(newFirst < 0){
+ newFirst = 0;
+ }
+ textArea.setFirstLine(newFirst);
+ }
+ textArea.goToPrevLine(false);
+}
+
+emacsPreviousLine(view);
+
+/*
+ <listitem>
+ <para><filename>Emacs_Previous_Line.bsh</filename></para>
+ <abstract><para>
+ Moves the cursor to the previous line, centering
+ the current line in the middle of the text area
+ if the cursor is at the top of the text area.
+ </para></abstract>
+ </listitem>
+*/
diff --git a/jEdit/macros/Editing/Go_to_Column.bsh b/jEdit/macros/Editing/Go_to_Column.bsh
index cfc290a..184c884 100644
--- a/jEdit/macros/Editing/Go_to_Column.bsh
+++ b/jEdit/macros/Editing/Go_to_Column.bsh
@@ -1,51 +1,51 @@
-/*
- * Go_to_Column.bsh - a BeanShell macro for the jEdit text
- * editor - Prompts the user for a column position on the
- * current line, then moves the caret there.
- *
- * Copyright (C) 2003 Ollie Rutherfurd <oliver at rutherfurd.net>
- *
- * $Id: Go_to_Column.bsh 4995 2004-03-19 15:58:00Z spestov $
- */
-goToColumn()
-{
- line = textArea.getCaretLine();
- len = textArea.getLineLength(line) + 1;
- while(true)
- {
- col = Macros.input(view, "Column (between 1 and " + len + "):");
- if(col == null)
- return;
- else
- {
- try
- {
- col = Integer.parseInt(col);
- if(col >= 1 && col <= len)
- {
- lineStartOffset = textArea.getLineStartOffset(line);
- textArea.setCaretPosition(lineStartOffset + (col-1));
- textArea.requestFocus();
- return;
- }
- }catch(NumberFormatException e){
- }
- }
- }
-}
-
-goToColumn();
-
-/*
- Macro index data (in DocBook format)
-
-<listitem>
- <para><filename>Go_to_Column.bsh</filename></para>
- <abstract><para>
- Prompts the user for a column position on the
- current line, then moves the caret there.
- </para></abstract>
-</listitem>
-
-*/
-
+/*
+ * Go_to_Column.bsh - a BeanShell macro for the jEdit text
+ * editor - Prompts the user for a column position on the
+ * current line, then moves the caret there.
+ *
+ * Copyright (C) 2003 Ollie Rutherfurd <oliver at rutherfurd.net>
+ *
+ * $Id: Go_to_Column.bsh 4995 2004-03-19 15:58:00Z spestov $
+ */
+goToColumn()
+{
+ line = textArea.getCaretLine();
+ len = textArea.getLineLength(line) + 1;
+ while(true)
+ {
+ col = Macros.input(view, "Column (between 1 and " + len + "):");
+ if(col == null)
+ return;
+ else
+ {
+ try
+ {
+ col = Integer.parseInt(col);
+ if(col >= 1 && col <= len)
+ {
+ lineStartOffset = textArea.getLineStartOffset(line);
+ textArea.setCaretPosition(lineStartOffset + (col-1));
+ textArea.requestFocus();
+ return;
+ }
+ }catch(NumberFormatException e){
+ }
+ }
+ }
+}
+
+goToColumn();
+
+/*
+ Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>Go_to_Column.bsh</filename></para>
+ <abstract><para>
+ Prompts the user for a column position on the
+ current line, then moves the caret there.
+ </para></abstract>
+</listitem>
+
+*/
+
diff --git a/jEdit/macros/Editing/Greedy_Backspace.bsh b/jEdit/macros/Editing/Greedy_Backspace.bsh
index 21034de..654a954 100644
--- a/jEdit/macros/Editing/Greedy_Backspace.bsh
+++ b/jEdit/macros/Editing/Greedy_Backspace.bsh
@@ -1,81 +1,81 @@
-/*
- * Greedy_Backspace.bsh - If buffer is using soft tabs,
- * this macro will backspace to the previous tab stop,
- * if all characters between the caret and the tab stop
- * are spaces. In all other cases a single character is
- * removed.
- *
- * Copyright (C) 2002-2004 Ollie Rutherfurd <oliver at jedit.org>
- *
- * $Id: Greedy_Backspace.bsh 5230 2005-07-20 13:31:08Z orutherfurd $
- */
-
-/**
- * @param onlyFullTabs if true, multiple spaces are only
- * removed if they would constitute
- * a 'complete' tab.
- */
-void greedyBackspace(View view, boolean onlyFullTabs)
-{
- JEditTextArea textArea = view.getTextArea();
- JEditBuffer buffer = textArea.getBuffer();
-
- int caret = textArea.getCaretPosition();
- int caretLine = textArea.getCaretLine();
- int lineStart = textArea.getLineStartOffset(caretLine);
-
- if(buffer.getBooleanProperty("noTabs") == true)
- {
- // if anything is selected, use standard
- if(textArea.getSelection().length != 0)
- {
- textArea.backspace();
- }
- // if at the start of the line, use standard
- else if(caret == lineStart)
- {
- textArea.backspace();
- }
- else
- {
- int col = caret - lineStart;
- int tabSize = buffer.getIntegerProperty("tabSize",8);
-
- // unlikely, but just in case
- if(tabSize <= 0)
- {
- buffer.remove(caret-1,1);
- }
- else
- {
- int toTabStop = ((col-1) % tabSize) + 1;
- int count = 0;
- String chunk = buffer.getText(caret-toTabStop,toTabStop);
- for(int i=0; i < toTabStop; i++)
- {
- if(' ' != chunk.charAt(i))
- break;
- count += 1;
- }
-
- // if onlyFullTabs must be only spaces to
- // the tabStop and must have tabSize number
- // of spaces to remove them all.
- if(onlyFullTabs == false || count == tabSize){
- buffer.remove(caret-count,count);
- }
- else{
- buffer.remove(caret-1,1);
- }
- }
- }
- }
- else
- textArea.backspace();
-}
-
-if(buffer.isReadOnly())
- Toolkit.getDefaultToolkit().beep();
-else
- greedyBackspace(view,true);
-
+/*
+ * Greedy_Backspace.bsh - If buffer is using soft tabs,
+ * this macro will backspace to the previous tab stop,
+ * if all characters between the caret and the tab stop
+ * are spaces. In all other cases a single character is
+ * removed.
+ *
+ * Copyright (C) 2002-2004 Ollie Rutherfurd <oliver at jedit.org>
+ *
+ * $Id: Greedy_Backspace.bsh 5230 2005-07-20 13:31:08Z orutherfurd $
+ */
+
+/**
+ * @param onlyFullTabs if true, multiple spaces are only
+ * removed if they would constitute
+ * a 'complete' tab.
+ */
+void greedyBackspace(View view, boolean onlyFullTabs)
+{
+ JEditTextArea textArea = view.getTextArea();
+ JEditBuffer buffer = textArea.getBuffer();
+
+ int caret = textArea.getCaretPosition();
+ int caretLine = textArea.getCaretLine();
+ int lineStart = textArea.getLineStartOffset(caretLine);
+
+ if(buffer.getBooleanProperty("noTabs") == true)
+ {
+ // if anything is selected, use standard
+ if(textArea.getSelection().length != 0)
+ {
+ textArea.backspace();
+ }
+ // if at the start of the line, use standard
+ else if(caret == lineStart)
+ {
+ textArea.backspace();
+ }
+ else
+ {
+ int col = caret - lineStart;
+ int tabSize = buffer.getIntegerProperty("tabSize",8);
+
+ // unlikely, but just in case
+ if(tabSize <= 0)
+ {
+ buffer.remove(caret-1,1);
+ }
+ else
+ {
+ int toTabStop = ((col-1) % tabSize) + 1;
+ int count = 0;
+ String chunk = buffer.getText(caret-toTabStop,toTabStop);
+ for(int i=0; i < toTabStop; i++)
+ {
+ if(' ' != chunk.charAt(i))
+ break;
+ count += 1;
+ }
+
+ // if onlyFullTabs must be only spaces to
+ // the tabStop and must have tabSize number
+ // of spaces to remove them all.
+ if(onlyFullTabs == false || count == tabSize){
+ buffer.remove(caret-count,count);
+ }
+ else{
+ buffer.remove(caret-1,1);
+ }
+ }
+ }
+ }
+ else
+ textArea.backspace();
+}
+
+if(buffer.isReadOnly())
+ Toolkit.getDefaultToolkit().beep();
+else
+ greedyBackspace(view,true);
+
diff --git a/jEdit/macros/Editing/Greedy_Delete.bsh b/jEdit/macros/Editing/Greedy_Delete.bsh
index 77de2cc..dfcbf40 100644
--- a/jEdit/macros/Editing/Greedy_Delete.bsh
+++ b/jEdit/macros/Editing/Greedy_Delete.bsh
@@ -1,87 +1,87 @@
-/*
- * Greedy_Delete.bsh - If a buffer is using soft tabs,
- * this macro will delete tabSize number of spaces, if
- * all the characters between the caret and the next tab
- * stop are spaces. In all other cases a single character
- * is deleted.
- *
- * Copyright (C) 2004 Ollie Rutherfurd <oliver at jedit.org>
- *
- * $Id: Greedy_Delete.bsh 5230 2005-07-20 13:31:08Z orutherfurd $
- */
-
-/**
- * @param onlyFullTabs if true, multiple spaces are only
- * removed if they would constitute
- * a 'complete' tab.
- */
-void greedyDelete(View view, boolean onlyFullTabs)
-{
- JEditTextArea textArea = view.getTextArea();
- JEditBuffer buffer = textArea.getBuffer();
- int caret = textArea.getCaretPosition();
- int caretLine = textArea.getCaretLine();
- int lineStart = textArea.getLineStartOffset(caretLine);
- int lineEnd = textArea.getLineEndOffset(caretLine);
-
- if(buffer.getBooleanProperty("noTabs") == true)
- {
- // if anything is selected, use standard
- if(textArea.getSelection().length != 0)
- {
- textArea.delete();
- }
- // if at the end of the line, go to the
- // start of the next line (+1 for \n)
- else if(caret+1 >= lineEnd)
- {
- textArea.delete();
- }
- else
- {
- int col = caret - lineStart;
- int tabSize = buffer.getIntegerProperty("tabSize",8);
-
- // unlikely, but just in case
- if(tabSize <= 0)
- {
- textArea.delete();
- }
- else
- {
- int toTabStop = (((col+tabSize)-1) % tabSize) + 1;
- // don't wrap to next line
- if(caret+toTabStop > lineEnd){
- textArea.delete();
- return;
- }
-
- int count = 0;
- for(int i=0; i < toTabStop; i++)
- {
- if(!" ".equals(buffer.getText(caret+i,1)))
- break;
- count += 1;
- }
-
- // if onlyFullTabs must be only spaces to
- // the tabStop and must have tabSize number
- // of spaces to remove them all.
- if(onlyFullTabs == false || count == tabSize){
- buffer.remove(caret,count);
- }
- else{
- textArea.delete();
- }
- }
- }
- }
- else
- textArea.delete();
-}
-
-if(buffer.isReadOnly())
- Toolkit.getDefaultToolkit().beep();
-else
- greedyDelete(view,true);
-
+/*
+ * Greedy_Delete.bsh - If a buffer is using soft tabs,
+ * this macro will delete tabSize number of spaces, if
+ * all the characters between the caret and the next tab
+ * stop are spaces. In all other cases a single character
+ * is deleted.
+ *
+ * Copyright (C) 2004 Ollie Rutherfurd <oliver at jedit.org>
+ *
+ * $Id: Greedy_Delete.bsh 5230 2005-07-20 13:31:08Z orutherfurd $
+ */
+
+/**
+ * @param onlyFullTabs if true, multiple spaces are only
+ * removed if they would constitute
+ * a 'complete' tab.
+ */
+void greedyDelete(View view, boolean onlyFullTabs)
+{
+ JEditTextArea textArea = view.getTextArea();
+ JEditBuffer buffer = textArea.getBuffer();
+ int caret = textArea.getCaretPosition();
+ int caretLine = textArea.getCaretLine();
+ int lineStart = textArea.getLineStartOffset(caretLine);
+ int lineEnd = textArea.getLineEndOffset(caretLine);
+
+ if(buffer.getBooleanProperty("noTabs") == true)
+ {
+ // if anything is selected, use standard
+ if(textArea.getSelection().length != 0)
+ {
+ textArea.delete();
+ }
+ // if at the end of the line, go to the
+ // start of the next line (+1 for \n)
+ else if(caret+1 >= lineEnd)
+ {
+ textArea.delete();
+ }
+ else
+ {
+ int col = caret - lineStart;
+ int tabSize = buffer.getIntegerProperty("tabSize",8);
+
+ // unlikely, but just in case
+ if(tabSize <= 0)
+ {
+ textArea.delete();
+ }
+ else
+ {
+ int toTabStop = (((col+tabSize)-1) % tabSize) + 1;
+ // don't wrap to next line
+ if(caret+toTabStop > lineEnd){
+ textArea.delete();
+ return;
+ }
+
+ int count = 0;
+ for(int i=0; i < toTabStop; i++)
+ {
+ if(!" ".equals(buffer.getText(caret+i,1)))
+ break;
+ count += 1;
+ }
+
+ // if onlyFullTabs must be only spaces to
+ // the tabStop and must have tabSize number
+ // of spaces to remove them all.
+ if(onlyFullTabs == false || count == tabSize){
+ buffer.remove(caret,count);
+ }
+ else{
+ textArea.delete();
+ }
+ }
+ }
+ }
+ else
+ textArea.delete();
+}
+
+if(buffer.isReadOnly())
+ Toolkit.getDefaultToolkit().beep();
+else
+ greedyDelete(view,true);
+
diff --git a/jEdit/macros/Editing/Greedy_Left.bsh b/jEdit/macros/Editing/Greedy_Left.bsh
index 8b31f92..c1736b9 100644
--- a/jEdit/macros/Editing/Greedy_Left.bsh
+++ b/jEdit/macros/Editing/Greedy_Left.bsh
@@ -1,80 +1,80 @@
-/*
- * Greedy_Left.bsh - If a buffer is using soft tabs,
- * this macro will move the caret tabSize spaces to the left,
- * if all the characters between the caret and the previous
- * tab stop are all spaces. In all other cases, the caret
- * is moved a single character to the left.
- *
- * Copyright (C) 2004 Ollie Rutherfurd <oliver at jedit.org>
- *
- * $Id: Greedy_Left.bsh 5230 2005-07-20 13:31:08Z orutherfurd $
- */
-
-/**
- * @param onlyFullTabs if true, the caret will only be moved
- * multiple spaces it would constitute
- * a 'complete' tab.
- */
-void greedyLeft(View view, boolean onlyFullTabs)
-{
- JEditTextArea textArea = view.getTextArea();
- JEditBuffer buffer = textArea.getBuffer();
- int caret = textArea.getCaretPosition();
- int caretLine = textArea.getCaretLine();
- int lineStart = textArea.getLineStartOffset(caretLine);
-
- if(textArea.getCaretPosition() == 0)
- return;
-
- if(buffer.getBooleanProperty("noTabs") == true)
- {
- // if anything is selected, use standard
- if(textArea.getSelection().length != 0)
- {
- textArea.setCaretPosition(caret-1);
- }
- // if at the start of the line, use standard
- else if(caret == lineStart)
- {
- textArea.setCaretPosition(caret-1);
- }
- else
- {
- int col = caret - lineStart;
- int tabSize = buffer.getIntegerProperty("tabSize",8);
-
- // unlikely, but just in case
- if(tabSize <= 0)
- {
- textArea.setCaretPosition(caret-1);
- }
- else
- {
- int toTabStop = ((col-1) % tabSize) + 1;
- int count = 0;
- String chunk = buffer.getText(caret-toTabStop,toTabStop);
- for(int i=0; i < toTabStop; i++)
- {
- if(' ' != chunk.charAt(i))
- break;
- count += 1;
- }
-
- // if onlyFullTabs must be only spaces to
- // the tabStop and must have tabSize number
- // of spaces to remove them all.
- if(onlyFullTabs == false || count == tabSize){
- textArea.setCaretPosition(caret-count);
- }
- else{
- textArea.setCaretPosition(caret-1);
- }
- }
- }
- }
- else
- textArea.setCaretPosition(caret-1);
-}
-
-greedyLeft(view,true);
-
+/*
+ * Greedy_Left.bsh - If a buffer is using soft tabs,
+ * this macro will move the caret tabSize spaces to the left,
+ * if all the characters between the caret and the previous
+ * tab stop are all spaces. In all other cases, the caret
+ * is moved a single character to the left.
+ *
+ * Copyright (C) 2004 Ollie Rutherfurd <oliver at jedit.org>
+ *
+ * $Id: Greedy_Left.bsh 5230 2005-07-20 13:31:08Z orutherfurd $
+ */
+
+/**
+ * @param onlyFullTabs if true, the caret will only be moved
+ * multiple spaces it would constitute
+ * a 'complete' tab.
+ */
+void greedyLeft(View view, boolean onlyFullTabs)
+{
+ JEditTextArea textArea = view.getTextArea();
+ JEditBuffer buffer = textArea.getBuffer();
+ int caret = textArea.getCaretPosition();
+ int caretLine = textArea.getCaretLine();
+ int lineStart = textArea.getLineStartOffset(caretLine);
+
+ if(textArea.getCaretPosition() == 0)
+ return;
+
+ if(buffer.getBooleanProperty("noTabs") == true)
+ {
+ // if anything is selected, use standard
+ if(textArea.getSelection().length != 0)
+ {
+ textArea.setCaretPosition(caret-1);
+ }
+ // if at the start of the line, use standard
+ else if(caret == lineStart)
+ {
+ textArea.setCaretPosition(caret-1);
+ }
+ else
+ {
+ int col = caret - lineStart;
+ int tabSize = buffer.getIntegerProperty("tabSize",8);
+
+ // unlikely, but just in case
+ if(tabSize <= 0)
+ {
+ textArea.setCaretPosition(caret-1);
+ }
+ else
+ {
+ int toTabStop = ((col-1) % tabSize) + 1;
+ int count = 0;
+ String chunk = buffer.getText(caret-toTabStop,toTabStop);
+ for(int i=0; i < toTabStop; i++)
+ {
+ if(' ' != chunk.charAt(i))
+ break;
+ count += 1;
+ }
+
+ // if onlyFullTabs must be only spaces to
+ // the tabStop and must have tabSize number
+ // of spaces to remove them all.
+ if(onlyFullTabs == false || count == tabSize){
+ textArea.setCaretPosition(caret-count);
+ }
+ else{
+ textArea.setCaretPosition(caret-1);
+ }
+ }
+ }
+ }
+ else
+ textArea.setCaretPosition(caret-1);
+}
+
+greedyLeft(view,true);
+
diff --git a/jEdit/macros/Editing/Greedy_Right.bsh b/jEdit/macros/Editing/Greedy_Right.bsh
index fb4a32d..2ca0251 100644
--- a/jEdit/macros/Editing/Greedy_Right.bsh
+++ b/jEdit/macros/Editing/Greedy_Right.bsh
@@ -1,86 +1,86 @@
-/*
- * Greedy_Right.bsh - If a buffer is using soft tabs,
- * this macro will move the caret tabSize spaces to the right,
- * if all the characters between the caret and the next
- * tab stop are all spaces. In all other cases, the caret
- * is moved a single character to the right.
- *
- * Copyright (C) 2004 Ollie Rutherfurd <oliver at jedit.org>
- *
- * $Id: Greedy_Right.bsh 5230 2005-07-20 13:31:08Z orutherfurd $
- */
-
-/**
- * @param onlyFullTabs if true, the caret will only be moved
- * multiple spaces it would constitute
- * a 'complete' tab.
- */
-void greedyRight(View view, boolean onlyFullTabs)
-{
- JEditTextArea textArea = view.getTextArea();
- JEditBuffer buffer = textArea.getBuffer();
- int caret = textArea.getCaretPosition();
- int caretLine = textArea.getCaretLine();
- int lineStart = textArea.getLineStartOffset(caretLine);
- int lineEnd = textArea.getLineEndOffset(caretLine);
-
- if(textArea.getCaretPosition() == buffer.getLength())
- return;
-
- if(buffer.getBooleanProperty("noTabs") == true)
- {
- // if anything is selected, use standard
- if(textArea.getSelection().length != 0)
- {
- textArea.setCaretPosition(caret+1);
- }
- // if at the end of the line, go to the
- // start of the next line (+1 for \n)
- else if(caret+1 >= lineEnd)
- {
- textArea.setCaretPosition(caret+1);
- }
- else
- {
- int col = caret - lineStart;
- int tabSize = buffer.getIntegerProperty("tabSize",8);
-
- // unlikely, but just in case
- if(tabSize <= 0)
- {
- textArea.setCaretPosition(caret+11);
- }
- else
- {
- int toTabStop = (((col+tabSize)-1) % tabSize) + 1;
- String chunk = "";
- if((caret + toTabStop) <= buffer.getLength())
- chunk = buffer.getText(caret,toTabStop);
- int count = 0;
- for(int i=0; i < chunk.length(); i++)
- {
- if(' ' != chunk.charAt(i))
- {
- break;
- }
- count += 1;
- }
-
- // if onlyFullTabs must be only spaces to
- // the tabStop and must have tabSize number
- // of spaces to remove them all.
- if(onlyFullTabs == false || count == tabSize){
- textArea.setCaretPosition(caret+count);
- }
- else{
- textArea.setCaretPosition(caret+1);
- }
- }
- }
- }
- else
- textArea.setCaretPosition(caret+1);
-}
-
-greedyRight(view,true);
-
+/*
+ * Greedy_Right.bsh - If a buffer is using soft tabs,
+ * this macro will move the caret tabSize spaces to the right,
+ * if all the characters between the caret and the next
+ * tab stop are all spaces. In all other cases, the caret
+ * is moved a single character to the right.
+ *
+ * Copyright (C) 2004 Ollie Rutherfurd <oliver at jedit.org>
+ *
+ * $Id: Greedy_Right.bsh 5230 2005-07-20 13:31:08Z orutherfurd $
+ */
+
+/**
+ * @param onlyFullTabs if true, the caret will only be moved
+ * multiple spaces it would constitute
+ * a 'complete' tab.
+ */
+void greedyRight(View view, boolean onlyFullTabs)
+{
+ JEditTextArea textArea = view.getTextArea();
+ JEditBuffer buffer = textArea.getBuffer();
+ int caret = textArea.getCaretPosition();
+ int caretLine = textArea.getCaretLine();
+ int lineStart = textArea.getLineStartOffset(caretLine);
+ int lineEnd = textArea.getLineEndOffset(caretLine);
+
+ if(textArea.getCaretPosition() == buffer.getLength())
+ return;
+
+ if(buffer.getBooleanProperty("noTabs") == true)
+ {
+ // if anything is selected, use standard
+ if(textArea.getSelection().length != 0)
+ {
+ textArea.setCaretPosition(caret+1);
+ }
+ // if at the end of the line, go to the
+ // start of the next line (+1 for \n)
+ else if(caret+1 >= lineEnd)
+ {
+ textArea.setCaretPosition(caret+1);
+ }
+ else
+ {
+ int col = caret - lineStart;
+ int tabSize = buffer.getIntegerProperty("tabSize",8);
+
+ // unlikely, but just in case
+ if(tabSize <= 0)
+ {
+ textArea.setCaretPosition(caret+11);
+ }
+ else
+ {
+ int toTabStop = (((col+tabSize)-1) % tabSize) + 1;
+ String chunk = "";
+ if((caret + toTabStop) <= buffer.getLength())
+ chunk = buffer.getText(caret,toTabStop);
+ int count = 0;
+ for(int i=0; i < chunk.length(); i++)
+ {
+ if(' ' != chunk.charAt(i))
+ {
+ break;
+ }
+ count += 1;
+ }
+
+ // if onlyFullTabs must be only spaces to
+ // the tabStop and must have tabSize number
+ // of spaces to remove them all.
+ if(onlyFullTabs == false || count == tabSize){
+ textArea.setCaretPosition(caret+count);
+ }
+ else{
+ textArea.setCaretPosition(caret+1);
+ }
+ }
+ }
+ }
+ else
+ textArea.setCaretPosition(caret+1);
+}
+
+greedyRight(view,true);
+
diff --git a/jEdit/macros/Editing/Keywords_to_Upper_Case.bsh b/jEdit/macros/Editing/Keywords_to_Upper_Case.bsh
index 44e0279..e4a74b2 100644
--- a/jEdit/macros/Editing/Keywords_to_Upper_Case.bsh
+++ b/jEdit/macros/Editing/Keywords_to_Upper_Case.bsh
@@ -1,47 +1,47 @@
-/**
- * Converts keyword token types to upper case.
- */
-void keywords2upper(View view)
-{
- // declarations run faster than doing Token.KEYWORDx comparison
- byte KEYWORD1 = Token.KEYWORD1;
- byte KEYWORD4 = Token.KEYWORD4;
- JEditBuffer buffer = view.getBuffer();
- JEditTextArea textArea = view.getTextArea();
- Token token = null;
-
- //long t1 = System.currentTimeMillis();
-
- Selection[] selection = textArea.getSelection();
- Buffer.TokenList info = null;
- int pos = 0;
- int lineStart = 0;
-
- for(int line = 0; line < textArea.getLineCount(); ++line)
- {
- info = buffer.markTokens(line);
- token = info.getFirstToken();
- lineStart = buffer.getLineStartOffset(line);
- pos = lineStart;
- while(token != null)
- {
- if(KEYWORD1 <= token.id && token.id <= KEYWORD4)
- {
- String word = buffer.getText(pos,token.length);
- buffer.remove(pos,token.length);
- buffer.insert(pos,word.toUpperCase());
- }
- pos += token.length;
- token = token.next;
- }
- }
- view.getTextArea().setSelection(selection);
-
- //long t2 = System.currentTimeMillis();
- //print("elapsed: " + (t2-t1));
-
- view.getStatus().setMessageAndClear("Converted Keywords to Upper Case");
-}
-
-keywords2upper(view);
-
+/**
+ * Converts keyword token types to upper case.
+ */
+void keywords2upper(View view)
+{
+ // declarations run faster than doing Token.KEYWORDx comparison
+ byte KEYWORD1 = Token.KEYWORD1;
+ byte KEYWORD4 = Token.KEYWORD4;
+ JEditBuffer buffer = view.getBuffer();
+ JEditTextArea textArea = view.getTextArea();
+ Token token = null;
+
+ //long t1 = System.currentTimeMillis();
+
+ Selection[] selection = textArea.getSelection();
+ Buffer.TokenList info = null;
+ int pos = 0;
+ int lineStart = 0;
+
+ for(int line = 0; line < textArea.getLineCount(); ++line)
+ {
+ info = buffer.markTokens(line);
+ token = info.getFirstToken();
+ lineStart = buffer.getLineStartOffset(line);
+ pos = lineStart;
+ while(token != null)
+ {
+ if(KEYWORD1 <= token.id && token.id <= KEYWORD4)
+ {
+ String word = buffer.getText(pos,token.length);
+ buffer.remove(pos,token.length);
+ buffer.insert(pos,word.toUpperCase());
+ }
+ pos += token.length;
+ token = token.next;
+ }
+ }
+ view.getTextArea().setSelection(selection);
+
+ //long t2 = System.currentTimeMillis();
+ //print("elapsed: " + (t2-t1));
+
+ view.getStatus().setMessageAndClear("Converted Keywords to Upper Case");
+}
+
+keywords2upper(view);
+
diff --git a/jEdit/macros/Editing/Mode_Switcher.bsh b/jEdit/macros/Editing/Mode_Switcher.bsh
index 96e86d2..5a9e697 100644
--- a/jEdit/macros/Editing/Mode_Switcher.bsh
+++ b/jEdit/macros/Editing/Mode_Switcher.bsh
@@ -1,193 +1,193 @@
-/*
- * ModeSwitcher.bsh - a BeanShell macro script for changing the current
- * buffer's edit mode.
- *
- * Copyright (C) 2004-6 Nicholas O'Leary nick.oleary at gmail.com
- *
- * :mode=beanshell:tabSize=3:indentSize=3:maxLineLen=0:noTabs=false:
- * :indentOnTab=true:indentOnEnter=true:folding=explicit:collapseFolds=1:
- *
- * {{{ License
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with the jEdit program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * }}}
- *
- * Notes:
- * There are two other ways to change the buffers mode:
- * - enter 'buffer.mode=[mode]' in the action bar
- * - change it in the Buffer Options dialog
- * Whilst both of these do the job, I wanted a way to achieve it with minimum
- * effort, and keypresses.
- * It also has the benefit of auto-completion of mode names.
- *
- * $Id: Mode_Switcher.bsh 5465 2006-06-21 13:04:43Z kpouer $
- */
-
-import javax.swing.border.EmptyBorder;
-
-//class ModeSwitcherTextField extends JTextField
-void modeSwitcher() {
- JDialog dialog = new JDialog(view, "Buffer Mode Switcher", true);
- dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
- JPanel content = new JPanel(new BorderLayout());
- content.setBorder(new EmptyBorder(12,12,12,12));
- Mode[] modes = jEdit.getModes();
- String[] names = new String[modes.length];
- for(int i=0;i<modes.length;i++) {
- names[i] = modes[i].getName();
- }
- Arrays.sort(names);
- JTextField textfield = new JTextField() {
- protected String[] names;
- protected boolean shifted = false;
- //{{{ setNames
- public void setNames(String[] a){
- names = a;
- } //}}}
- public boolean getFocusTraversalKeysEnabled(){return false;}
- //{{{ processKeyEvent
- protected void processKeyEvent(KeyEvent evt)
- {
- if (evt.getID() == KeyEvent.KEY_RELEASED) {
- if (evt.getKeyCode() == KeyEvent.VK_SHIFT) {
- shifted = false;
- }
- } else if(evt.getID() == KeyEvent.KEY_PRESSED) {
- if (evt.getKeyCode() == KeyEvent.VK_SHIFT) {
- shifted = true;
- } else if(evt.getKeyCode() == KeyEvent.VK_TAB) {
- // Get the current text
- String txt = getText();
- String original = txt;
- // See if some text is selected
- if (getSelectedText() != null)
- txt = txt.substring(0,txt.length()-getSelectedText().length());
- // txt represents the unhighlighted text in the box. This is used
- // to find further matches.
-
- // See if the current text is a known mode
- int index = Arrays.binarySearch(names,original);
- if (index < 0) index = 0;
- int indexStep = 1;
- if (shifted) indexStep = -1;
- index+=indexStep;
- if (index == names.length) index = 0;
- if (index < 0) index = names.length-1;
- int match = -1;
- boolean foundExact = false;
- boolean keepLooping = true;
- // Loop through modes, starting at current+1
- int i = index;
- while(keepLooping) {
- // Skip if the mode name is shorter than the current text
- if (names[i].length()>=txt.length())
- {
- // If the mode matches, escape
- if (names[i].substring(0,txt.length()).equals(txt)) {
- match = i;
- break;
- }
- }
- // Loop the loop
- i+=indexStep;
- if (i == names.length) i = 0;
- if (i < 0) i = names.length-1;
- if (i==index) break;
- }
- // If a match has been found...
- if (match >= 0) {
- setText(names[match]);
- setSelectionStart(txt.length());
- setSelectionEnd(names[match].length());
- }
- return;
- }
- }
- super.processKeyEvent(evt);
- } //}}}
- };
-
- textfield.setColumns(20);
- textfield.setNames(names);
- Mode m = buffer.getMode();
- // Set the inital text to the current mode, and highlight it, so a key
- // press will clear the entry.
- if (m != null) {
- textfield.setText(m.getName());
- textfield.setSelectionStart(0);
- textfield.setSelectionEnd(m.getName().length());
- }
- content.add(new JLabel("Enter buffer mode:"), BorderLayout.NORTH);
- content.add(textfield, BorderLayout.CENTER);
- Vector v = new Vector();
-
- // KeyListener Interface
- //{{{ keyPressed
- void keyPressed(evt)
- {
- if(evt.getKeyCode() == KeyEvent.VK_ESCAPE)
- dialog.dispose();
- else if(evt.getKeyCode() == KeyEvent.VK_ENTER)
- {
- Mode m = jEdit.getMode(textfield.getText());
- if (m!=null)
- {
- buffer.setMode(m);
- Log.log(Log.NOTICE,
- BeanShell.class,
- "Changing mode of buffer ["+
- buffer.getName()+"] to ["+
- m.getName()+"]");
- } else {
- Log.log(Log.WARNING,
- BeanShell.class,
- "Mode ["+textfield.getText()+"] not found");
- }
- evt.consume();
- dialog.dispose();
- }
- }//}}}
- void keyReleased(evt) {}
- void keyTyped(evt) {}
-
- dialog.addKeyListener(this);
- textfield.addKeyListener(this);
- dialog.setContentPane(content);
- dialog.pack();
- dialog.setLocationRelativeTo(view);
- textfield.grabFocus();
- dialog.setVisible(true);
-}
-
-modeSwitcher();
-
-/*
-
-Macro index data (in DocBook format)
-
- <listitem>
- <para><filename>Mode_Switcher.bsh</filename></para>
- Displays a modal dialog with the current buffer's mode in a text field,
- allowing one to change the mode by typing in its name.
- <keycap>ENTER</keycap> selects the current mode; if the text is not a
- valid mode, the dialog still dismisses, but a warning is logged to the
- activity log.
- <keycap>ESACPE</keycap> closes the dialog with no further action.
- <keycap>TAB</keycap> attempts to auto-complete the mode name. Pressing
- <keycap>TAB</keycap> repeatedly cycles through the possible completions.
- <keycap>SHIFT-TAB</keycap> cycles through the completions in reverse.
- </para></abstract>
- </listitem>
-
-*/
+/*
+ * ModeSwitcher.bsh - a BeanShell macro script for changing the current
+ * buffer's edit mode.
+ *
+ * Copyright (C) 2004-6 Nicholas O'Leary nick.oleary at gmail.com
+ *
+ * :mode=beanshell:tabSize=3:indentSize=3:maxLineLen=0:noTabs=false:
+ * :indentOnTab=true:indentOnEnter=true:folding=explicit:collapseFolds=1:
+ *
+ * {{{ License
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the jEdit program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * }}}
+ *
+ * Notes:
+ * There are two other ways to change the buffers mode:
+ * - enter 'buffer.mode=[mode]' in the action bar
+ * - change it in the Buffer Options dialog
+ * Whilst both of these do the job, I wanted a way to achieve it with minimum
+ * effort, and keypresses.
+ * It also has the benefit of auto-completion of mode names.
+ *
+ * $Id: Mode_Switcher.bsh 5465 2006-06-21 13:04:43Z kpouer $
+ */
+
+import javax.swing.border.EmptyBorder;
+
+//class ModeSwitcherTextField extends JTextField
+void modeSwitcher() {
+ JDialog dialog = new JDialog(view, "Buffer Mode Switcher", true);
+ dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
+ JPanel content = new JPanel(new BorderLayout());
+ content.setBorder(new EmptyBorder(12,12,12,12));
+ Mode[] modes = jEdit.getModes();
+ String[] names = new String[modes.length];
+ for(int i=0;i<modes.length;i++) {
+ names[i] = modes[i].getName();
+ }
+ Arrays.sort(names);
+ JTextField textfield = new JTextField() {
+ protected String[] names;
+ protected boolean shifted = false;
+ //{{{ setNames
+ public void setNames(String[] a){
+ names = a;
+ } //}}}
+ public boolean getFocusTraversalKeysEnabled(){return false;}
+ //{{{ processKeyEvent
+ protected void processKeyEvent(KeyEvent evt)
+ {
+ if (evt.getID() == KeyEvent.KEY_RELEASED) {
+ if (evt.getKeyCode() == KeyEvent.VK_SHIFT) {
+ shifted = false;
+ }
+ } else if(evt.getID() == KeyEvent.KEY_PRESSED) {
+ if (evt.getKeyCode() == KeyEvent.VK_SHIFT) {
+ shifted = true;
+ } else if(evt.getKeyCode() == KeyEvent.VK_TAB) {
+ // Get the current text
+ String txt = getText();
+ String original = txt;
+ // See if some text is selected
+ if (getSelectedText() != null)
+ txt = txt.substring(0,txt.length()-getSelectedText().length());
+ // txt represents the unhighlighted text in the box. This is used
+ // to find further matches.
+
+ // See if the current text is a known mode
+ int index = Arrays.binarySearch(names,original);
+ if (index < 0) index = 0;
+ int indexStep = 1;
+ if (shifted) indexStep = -1;
+ index+=indexStep;
+ if (index == names.length) index = 0;
+ if (index < 0) index = names.length-1;
+ int match = -1;
+ boolean foundExact = false;
+ boolean keepLooping = true;
+ // Loop through modes, starting at current+1
+ int i = index;
+ while(keepLooping) {
+ // Skip if the mode name is shorter than the current text
+ if (names[i].length()>=txt.length())
+ {
+ // If the mode matches, escape
+ if (names[i].substring(0,txt.length()).equals(txt)) {
+ match = i;
+ break;
+ }
+ }
+ // Loop the loop
+ i+=indexStep;
+ if (i == names.length) i = 0;
+ if (i < 0) i = names.length-1;
+ if (i==index) break;
+ }
+ // If a match has been found...
+ if (match >= 0) {
+ setText(names[match]);
+ setSelectionStart(txt.length());
+ setSelectionEnd(names[match].length());
+ }
+ return;
+ }
+ }
+ super.processKeyEvent(evt);
+ } //}}}
+ };
+
+ textfield.setColumns(20);
+ textfield.setNames(names);
+ Mode m = buffer.getMode();
+ // Set the inital text to the current mode, and highlight it, so a key
+ // press will clear the entry.
+ if (m != null) {
+ textfield.setText(m.getName());
+ textfield.setSelectionStart(0);
+ textfield.setSelectionEnd(m.getName().length());
+ }
+ content.add(new JLabel("Enter buffer mode:"), BorderLayout.NORTH);
+ content.add(textfield, BorderLayout.CENTER);
+ Vector v = new Vector();
+
+ // KeyListener Interface
+ //{{{ keyPressed
+ void keyPressed(evt)
+ {
+ if(evt.getKeyCode() == KeyEvent.VK_ESCAPE)
+ dialog.dispose();
+ else if(evt.getKeyCode() == KeyEvent.VK_ENTER)
+ {
+ Mode m = jEdit.getMode(textfield.getText());
+ if (m!=null)
+ {
+ buffer.setMode(m);
+ Log.log(Log.NOTICE,
+ BeanShell.class,
+ "Changing mode of buffer ["+
+ buffer.getName()+"] to ["+
+ m.getName()+"]");
+ } else {
+ Log.log(Log.WARNING,
+ BeanShell.class,
+ "Mode ["+textfield.getText()+"] not found");
+ }
+ evt.consume();
+ dialog.dispose();
+ }
+ }//}}}
+ void keyReleased(evt) {}
+ void keyTyped(evt) {}
+
+ dialog.addKeyListener(this);
+ textfield.addKeyListener(this);
+ dialog.setContentPane(content);
+ dialog.pack();
+ dialog.setLocationRelativeTo(view);
+ textfield.grabFocus();
+ dialog.setVisible(true);
+}
+
+modeSwitcher();
+
+/*
+
+Macro index data (in DocBook format)
+
+ <listitem>
+ <para><filename>Mode_Switcher.bsh</filename></para>
+ Displays a modal dialog with the current buffer's mode in a text field,
+ allowing one to change the mode by typing in its name.
+ <keycap>ENTER</keycap> selects the current mode; if the text is not a
+ valid mode, the dialog still dismisses, but a warning is logged to the
+ activity log.
+ <keycap>ESACPE</keycap> closes the dialog with no further action.
+ <keycap>TAB</keycap> attempts to auto-complete the mode name. Pressing
+ <keycap>TAB</keycap> repeatedly cycles through the possible completions.
+ <keycap>SHIFT-TAB</keycap> cycles through the completions in reverse.
+ </para></abstract>
+ </listitem>
+
+*/
diff --git a/jEdit/macros/Editing/Move_Lines_Down.bsh b/jEdit/macros/Editing/Move_Lines_Down.bsh
index 662713d..3a533bf 100644
--- a/jEdit/macros/Editing/Move_Lines_Down.bsh
+++ b/jEdit/macros/Editing/Move_Lines_Down.bsh
@@ -1,106 +1,106 @@
-/*
-Move_Lines_Down.bsh - Beanshell macro to move a selection of lines down by one
-line. This should handle multiple selections, but doesn't work quite right.
-
-Copyright (c) Dale Anson, 2004
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- 3. The name of the author may not be used to endorse or promote products
- derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
-EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-// check buffer read-only status
-if ( buffer.isReadOnly() ) {
- Macros.error( view, "File is read only." );
- return ;
-}
-
-Mode mode = buffer.getMode();
-boolean shouldIndent = false;
-String[] indentProps = new String[]{"indentOpenBrackets", "indentOpenBrackets", "unalignedOpenBrackets", "unalignedCloseBrackets", "indentNextLine", "unindentThisLine", "electricKeys", "doubleBracketIndent", "lineUpClosingBracket"};
-for (String name : indentProps) {
- if (mode.getProperty(name) != null) {
- shouldIndent = true;
- break;
- }
-}
-
-// get the current selection or the current line if no selection
-Selection[] selections = textArea.getSelection();
-
-// this doesn't work right with multiple selection, so don't do anything
-if (selections.length > 1) {
- Macros.error( view, "Line move does not work with multiple selection." );
- return ;
-}
-
-String ls = buffer.getStringProperty( "lineSeparator" );
-
-int line = textArea.getCaretLine();
-
-// make sure last line ends with a line separator
-String line_text = textArea.getLineText(textArea.getLineCount() - 1);
-if (!line_text.endsWith(ls) && line >= textArea.getLineCount() - 3) {
- buffer.insert(buffer.getLength(), ls);
-}
-
-// if nothing is selected, select current line
-if (selection == null || selections.length == 0) {
- selections = new Selection[1];
- int start_offset = textArea.getLineStartOffset(line);
- int end_offset = textArea.getLineEndOffset(line);
- selections[0] = new Selection.Range(start_offset, end_offset);
- textArea.addToSelection(selections[0]);
-}
-
-// adjust the start and end line offsets to reselect after the move
-int[] startLines = new int[selections.length];
-int[] endLines = new int[selections.length];
-for (int i = 0; i < selections.length; i++) {
- startLines[i] = selections[i].getStartLine() + 1;
- endLines[i] = selections[i].getEndLine() + 1;
-}
-
-// cut the selected text, move down one line, and paste it back in
-Registers.cut( textArea, '_' );
-textArea.goToNextLine( false );
-Registers.paste( textArea, '_', false );
-textArea.goToPrevLine( false );
-
-// indent lines
-if (shouldIndent) {
- for (int i = 0; i < startLines.length; i++) {
- buffer.indentLines( startLines[i] - 1, endLines[i] );
- }
-}
-
-// reselect the moved text
-textArea.selectNone();
-for (int i = 0; i < startLines.length; i++) {
- selection = new Selection.Range(
- textArea.getLineStartOffset( startLines[i] ),
- textArea.getLineStartOffset( endLines[i] )
- );
- textArea.addToSelection(selection);
-}
-
-
-
+/*
+Move_Lines_Down.bsh - Beanshell macro to move a selection of lines down by one
+line. This should handle multiple selections, but doesn't work quite right.
+
+Copyright (c) Dale Anson, 2004
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. The name of the author may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+// check buffer read-only status
+if ( buffer.isReadOnly() ) {
+ Macros.error( view, "File is read only." );
+ return ;
+}
+
+Mode mode = buffer.getMode();
+boolean shouldIndent = false;
+String[] indentProps = new String[]{"indentOpenBrackets", "indentOpenBrackets", "unalignedOpenBrackets", "unalignedCloseBrackets", "indentNextLine", "unindentThisLine", "electricKeys", "doubleBracketIndent", "lineUpClosingBracket"};
+for (String name : indentProps) {
+ if (mode.getProperty(name) != null) {
+ shouldIndent = true;
+ break;
+ }
+}
+
+// get the current selection or the current line if no selection
+Selection[] selections = textArea.getSelection();
+
+// this doesn't work right with multiple selection, so don't do anything
+if (selections.length > 1) {
+ Macros.error( view, "Line move does not work with multiple selection." );
+ return ;
+}
+
+String ls = buffer.getStringProperty( "lineSeparator" );
+
+int line = textArea.getCaretLine();
+
+// make sure last line ends with a line separator
+String line_text = textArea.getLineText(textArea.getLineCount() - 1);
+if (!line_text.endsWith(ls) && line >= textArea.getLineCount() - 3) {
+ buffer.insert(buffer.getLength(), ls);
+}
+
+// if nothing is selected, select current line
+if (selection == null || selections.length == 0) {
+ selections = new Selection[1];
+ int start_offset = textArea.getLineStartOffset(line);
+ int end_offset = textArea.getLineEndOffset(line);
+ selections[0] = new Selection.Range(start_offset, end_offset);
+ textArea.addToSelection(selections[0]);
+}
+
+// adjust the start and end line offsets to reselect after the move
+int[] startLines = new int[selections.length];
+int[] endLines = new int[selections.length];
+for (int i = 0; i < selections.length; i++) {
+ startLines[i] = selections[i].getStartLine() + 1;
+ endLines[i] = selections[i].getEndLine() + 1;
+}
+
+// cut the selected text, move down one line, and paste it back in
+Registers.cut( textArea, '_' );
+textArea.goToNextLine( false );
+Registers.paste( textArea, '_', false );
+textArea.goToPrevLine( false );
+
+// indent lines
+if (shouldIndent) {
+ for (int i = 0; i < startLines.length; i++) {
+ buffer.indentLines( startLines[i] - 1, endLines[i] );
+ }
+}
+
+// reselect the moved text
+textArea.selectNone();
+for (int i = 0; i < startLines.length; i++) {
+ selection = new Selection.Range(
+ textArea.getLineStartOffset( startLines[i] ),
+ textArea.getLineStartOffset( endLines[i] )
+ );
+ textArea.addToSelection(selection);
+}
+
+
+
diff --git a/jEdit/macros/Editing/Move_Lines_Up.bsh b/jEdit/macros/Editing/Move_Lines_Up.bsh
index 148ee99..b3b0780 100644
--- a/jEdit/macros/Editing/Move_Lines_Up.bsh
+++ b/jEdit/macros/Editing/Move_Lines_Up.bsh
@@ -1,110 +1,110 @@
-/*
-Move_Lines_Up.bsh - Beanshell macro to move a selection of lines up by one line.
-This should handle multiple selections, but doesn't work quite right.
-
-Copyright (c) Dale Anson, 2004
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- 3. The name of the author may not be used to endorse or promote products
- derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
-EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-// check buffer read-only status
-if ( buffer.isReadOnly() ) {
- Macros.error( view, "File is read only." );
- return ;
-}
-
-Mode mode = buffer.getMode();
-boolean shouldIndent = false;
-String[] indentProps = new String[]{"indentOpenBrackets", "indentOpenBrackets", "unalignedOpenBrackets", "unalignedCloseBrackets", "indentNextLine", "unindentThisLine", "electricKeys", "doubleBracketIndent", "lineUpClosingBracket"};
-for (String name : indentProps) {
- if (mode.getProperty(name) != null) {
- shouldIndent = true;
- break;
- }
-}
-
-// get the current selection or the current line if no selection
-Selection[] selections = textArea.getSelection();
-
-// this doesn't work right with multiple selection, so don't do anything
-if (selections.length > 1) {
- Macros.error( view, "Line move does not work with multiple selection." );
- return ;
-}
-
-String ls = buffer.getStringProperty( "lineSeparator" );
-
-int line = textArea.getCaretLine();
-if (line == 0) {
- return; // at top, nowhere to go from here
-}
-if (line == textArea.getLineCount() - 1) {
- // on last line, make sure it ends with a line separator
- String line_text = textArea.getLineText(line);
- if (!line_text.endsWith(ls)) {
- buffer.insert(buffer.getLength(), ls);
- }
-}
-
-// if nothing is selected, select current line
-if (selection == null || selections.length == 0) {
- selections = new Selection[1];
- int start_offset = textArea.getLineStartOffset(line);
- int end_offset = textArea.getLineEndOffset(line);
- selections[0] = new Selection.Range(start_offset, end_offset);
- textArea.addToSelection(selections[0]);
-}
-
-// adjust the start and end line offsets to reselect after the move
-int[] startLines = new int[selections.length];
-int[] endLines = new int[selections.length];
-for (int i = 0; i < selections.length; i++) {
- if (selections[i].getStartLine() == 0) {
- return; // at top, nowhere to go from here
- }
- startLines[i] = selections[i].getStartLine() - 1;
- endLines[i] = selections[i].getEndLine() - 1;
-}
-
-// cut the selected text, move up one line, and paste it back in
-Registers.cut( textArea, '_' );
-textArea.goToPrevLine( false );
-Registers.paste( textArea, '_', false );
-textArea.goToPrevLine( false );
-
-// indent lines
-if (shouldIndent) {
- for (int i = 0; i < startLines.length; i++) {
- buffer.indentLines( startLines[i], endLines[i] + 1 );
- }
-}
-
-// reselect the moved text
-textArea.selectNone();
-for (int i = 0; i < startLines.length; i++) {
- selection = new Selection.Range(
- textArea.getLineStartOffset( startLines[i] ),
- textArea.getLineStartOffset( endLines[i] )
- );
- textArea.addToSelection(selection);
-}
+/*
+Move_Lines_Up.bsh - Beanshell macro to move a selection of lines up by one line.
+This should handle multiple selections, but doesn't work quite right.
+
+Copyright (c) Dale Anson, 2004
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. The name of the author may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+// check buffer read-only status
+if ( buffer.isReadOnly() ) {
+ Macros.error( view, "File is read only." );
+ return ;
+}
+
+Mode mode = buffer.getMode();
+boolean shouldIndent = false;
+String[] indentProps = new String[]{"indentOpenBrackets", "indentOpenBrackets", "unalignedOpenBrackets", "unalignedCloseBrackets", "indentNextLine", "unindentThisLine", "electricKeys", "doubleBracketIndent", "lineUpClosingBracket"};
+for (String name : indentProps) {
+ if (mode.getProperty(name) != null) {
+ shouldIndent = true;
+ break;
+ }
+}
+
+// get the current selection or the current line if no selection
+Selection[] selections = textArea.getSelection();
+
+// this doesn't work right with multiple selection, so don't do anything
+if (selections.length > 1) {
+ Macros.error( view, "Line move does not work with multiple selection." );
+ return ;
+}
+
+String ls = buffer.getStringProperty( "lineSeparator" );
+
+int line = textArea.getCaretLine();
+if (line == 0) {
+ return; // at top, nowhere to go from here
+}
+if (line == textArea.getLineCount() - 1) {
+ // on last line, make sure it ends with a line separator
+ String line_text = textArea.getLineText(line);
+ if (!line_text.endsWith(ls)) {
+ buffer.insert(buffer.getLength(), ls);
+ }
+}
+
+// if nothing is selected, select current line
+if (selection == null || selections.length == 0) {
+ selections = new Selection[1];
+ int start_offset = textArea.getLineStartOffset(line);
+ int end_offset = textArea.getLineEndOffset(line);
+ selections[0] = new Selection.Range(start_offset, end_offset);
+ textArea.addToSelection(selections[0]);
+}
+
+// adjust the start and end line offsets to reselect after the move
+int[] startLines = new int[selections.length];
+int[] endLines = new int[selections.length];
+for (int i = 0; i < selections.length; i++) {
+ if (selections[i].getStartLine() == 0) {
+ return; // at top, nowhere to go from here
+ }
+ startLines[i] = selections[i].getStartLine() - 1;
+ endLines[i] = selections[i].getEndLine() - 1;
+}
+
+// cut the selected text, move up one line, and paste it back in
+Registers.cut( textArea, '_' );
+textArea.goToPrevLine( false );
+Registers.paste( textArea, '_', false );
+textArea.goToPrevLine( false );
+
+// indent lines
+if (shouldIndent) {
+ for (int i = 0; i < startLines.length; i++) {
+ buffer.indentLines( startLines[i], endLines[i] + 1 );
+ }
+}
+
+// reselect the moved text
+textArea.selectNone();
+for (int i = 0; i < startLines.length; i++) {
+ selection = new Selection.Range(
+ textArea.getLineStartOffset( startLines[i] ),
+ textArea.getLineStartOffset( endLines[i] )
+ );
+ textArea.addToSelection(selection);
+}
diff --git a/jEdit/macros/Files/Browse_Directory.bsh b/jEdit/macros/Files/Browse_Directory.bsh
index 0715610..8ce45ba 100644
--- a/jEdit/macros/Files/Browse_Directory.bsh
+++ b/jEdit/macros/Files/Browse_Directory.bsh
@@ -1,51 +1,51 @@
-/*
- * Browse_Directory.bsh - a BeanShell macro script for the
- * jEdit text editor - Prompts for a path name and opens it
- * in the file system browser
- * Copyright (C) 2001 Slava Pestov
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with the jEdit program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id: Browse_Directory.bsh 3928 2001-12-01 05:48:48Z spestov $
- *
- * Checked for jEdit 4.0 API
- *
- */
-
-void browseDirectory()
-{
- path = Macros.input(view,"Directory to browse:");
- if(path != null)
- VFSBrowser.browseDirectory(view,path);
-}
-
-browseDirectory();
-
-/*
- Macro index data (in DocBook format)
-
-<listitem>
- <para><filename>Browse_Directory.bsh</filename></para>
- <abstract><para>
- Opens a directory supplied by the user in the file system
- browser.
- </para></abstract>
-</listitem>
-
-*/
-
-
-// end Browse_Directory.bsh
-
+/*
+ * Browse_Directory.bsh - a BeanShell macro script for the
+ * jEdit text editor - Prompts for a path name and opens it
+ * in the file system browser
+ * Copyright (C) 2001 Slava Pestov
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the jEdit program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id: Browse_Directory.bsh 3928 2001-12-01 05:48:48Z spestov $
+ *
+ * Checked for jEdit 4.0 API
+ *
+ */
+
+void browseDirectory()
+{
+ path = Macros.input(view,"Directory to browse:");
+ if(path != null)
+ VFSBrowser.browseDirectory(view,path);
+}
+
+browseDirectory();
+
+/*
+ Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>Browse_Directory.bsh</filename></para>
+ <abstract><para>
+ Opens a directory supplied by the user in the file system
+ browser.
+ </para></abstract>
+</listitem>
+
+*/
+
+
+// end Browse_Directory.bsh
+
diff --git a/jEdit/macros/Files/Buffer_Switcher.bsh b/jEdit/macros/Files/Buffer_Switcher.bsh
index 062900b..327ac34 100644
--- a/jEdit/macros/Files/Buffer_Switcher.bsh
+++ b/jEdit/macros/Files/Buffer_Switcher.bsh
@@ -1,261 +1,261 @@
-/*
- * Buffer_Switcher.bsh - a BeanShell macro script for displaying
- * and switching between open buffers.
- *
- * Copyright (C) 2001-2004 Ollie Rutherfurd, oliver at rutherfurd.net
- *
- * :mode=beanshell:tabSize=4:indentSize=4:maxLineLen=0:noTabs=false:
- * :indentOnTab=true:indentOnEnter=true:folding=explicit:collapseFolds=1:
- *
- * {{{ License
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with the jEdit program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * }}}
- *
- * Notes:
- *
- * This is very similar to the functionality provided by the BufferList
- * plugin but, that is overkill for me. I just want a way I can
- * see and switch between buffers without having to use the mouse
- * to go to the BufferSwitcher widget in the EditPane.
- *
- * DELETE: closes the selected buffer but not the dialog.
- * ENTER: switches to the selected buffer and closes the dialog.
- * ESCAPE: closes the dialog.
- * SPACE: switches to the selected buffer but does not close the dialog.
- *
- * $Id: Buffer_Switcher.bsh 5450 2006-06-20 09:08:13Z vampire0 $
- */
-
-import javax.swing.border.EmptyBorder;
-
-
-/*
-* Custom Cell Renderer which displays the buffer icons in the JList.
-* As it runs a little slowly on my machine, it is not used by default.
-*
-* set useCustomCellRenderer to true at the bottom of this macro to use this.
-*/
-// {{{ BufferCellRenderer
-BufferCellRenderer()
-{
-
- l = new JLabel();
- l.setOpaque(true);
-
- Component getListCellRendererComponent(
- JList list,
- Object value,
- int index,
- boolean isSelected,
- boolean cellHasFocus)
- {
- l.setText(value.toString());
- l.setIcon(value.getIcon());
-
- if (isSelected)
- {
- l.setBackground(list.getSelectionBackground());
- l.setForeground(list.getSelectionForeground());
- }
- else
- {
- l.setBackground(list.getBackground());
- l.setForeground(list.getForeground());
- }
-
- return l;
-
- }
-
- return this;
-} // }}}
-
-
-/*
-* BufferSwitcherDialog - Dialog allows one to switch between
-* open buffers (and/or close open buffers).
-*/
-BufferSwitcherDialog(doModal, useCustomCellRenderer)
-{
-
- // {{{ create dialog
- Buffer[] openBuffers = jEdit.getBuffers();
- int numOpen = openBuffers.length;
- dialog = new JDialog(view, "" + numOpen + " Open Buffers", doModal);
- content = new JPanel(new BorderLayout());
- content.setBorder(new EmptyBorder(12,12,12,12));
- dialog.setContentPane(content);
-
- bufferList = new JList(openBuffers);
- bufferList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
- if(useCustomCellRenderer)
- bufferList.setCellRenderer(BufferCellRenderer());
- content.add(new JScrollPane(bufferList), BorderLayout.CENTER);
-
- content.add(new JLabel("[ENTER] Switch to; [SPACE] Switch to, keep dialog; [DEL] Close Buffer"), BorderLayout.NORTH);
-
- buttonPanel = new JPanel();
- buttonPanel.setLayout(new BoxLayout(buttonPanel,
- BoxLayout.X_AXIS));
-
- buttonPanel.setBorder(new EmptyBorder(12,50,0,50));
- buttonPanel.add(Box.createGlue());
- ok = new JButton("OK");
- close = new JButton("Close");
- ok.setPreferredSize(close.getPreferredSize());
- dialog.getRootPane().setDefaultButton(ok);
- buttonPanel.add(ok);
- buttonPanel.add(Box.createHorizontalStrut(6));
- buttonPanel.add(close);
- buttonPanel.add(Box.createGlue());
- content.add(buttonPanel, BorderLayout.SOUTH);
- // }}}
-
- // {{{ switchBuffer()
- void switchBuffer()
- {
- _buffer = bufferList.getSelectedValue();
- if(_buffer == null)
- view.getToolkit().beep();
- else
- view.getEditPane().setBuffer(_buffer);
- } // }}}
-
- // {{{ closeBuffer()
- void closeBuffer()
- {
- index = bufferList.getSelectedIndex();
- _buffer = bufferList.getSelectedValue();
- if(_buffer == null)
- view.getToolkit().beep();
- else
- if(jEdit.closeBuffer(view, _buffer))
- {
- bufferList.setListData(jEdit.getBuffers());
- if(index == jEdit.getBufferCount())
- index--;
- bufferList.setSelectedIndex(index);
- }
- numOpen--;
- dialog.setTitle("" + numOpen + " Open Buffers");
- } // }}}
-
- // {{{ actionPerformed
- void actionPerformed(evt)
- {
- if(evt.getSource() == ok)
- switchBuffer();
- dialog.dispose();
- dialog = null;
- } // }}}
-
- // {{{ KeyListener implementation
- void keyPressed(evt)
- {
- if(evt.getKeyCode() == KeyEvent.VK_ESCAPE)
- dialog.dispose();
- else if(evt.getKeyCode() == KeyEvent.VK_SPACE)
- switchBuffer();
- else if(evt.getKeyCode() == KeyEvent.VK_DELETE)
- {
- evt.consume();
- closeBuffer();
- }
- }
-
- void keyReleased(evt)
- {
- int selected = bufferList.getSelectedIndex();
- if(selected > -1)
- bufferList.ensureIndexIsVisible(selected);
- }
-
- void keyTyped(evt){}
- // }}}
-
- // {{{ MouseListener implementation
- void mouseClicked(evt)
- {
- if(evt.getClickCount() > 1)
- {
- switchBuffer();
- dialog.dispose();
- }
- }
-
- void mouseEntered(evt){}
- void mouseExited(evt){}
- void mousePressed(evt){}
- void mouseReleased(evt){}
- // }}}
-
- // {{{ add listeners
- dialog.addKeyListener(this);
- bufferList.addKeyListener(this);
- bufferList.addMouseListener(this);
- ok.addActionListener(this);
- close.addActionListener(this);
- // }}}
-
- // {{{ display dialog
- dialog.pack();
- bufferList.setSelectedValue(buffer,true);
- dialog.setLocationRelativeTo(view);
- dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
- dialog.setVisible(true);
- // }}}
-
-}
-
-
-// SETTINGS {{{
-doModal = true;
-
-// whether or not to use custom CellRenderer
-useCustomCellRenderer = true;
-
-// show help for keys on first run
-showHelp = jEdit.getProperty("macro.buffer_switcher.display-help","1");
-if(showHelp.equals("1"))
-{
- Macros.message(view, "Help for Buffer Switcher macro:\n\n"
- + "DELETE closes selected buffer.\n"
- + "ENTER switches to selected buffer, closes dialog.\n"
- + "ESCAPE closes dialog.\n"
- + "SPACE switches to selected buffer, does not close dialog.\n\n"
- + "NOTE: This dialog will only be displayed once.");
- jEdit.setProperty("macro.buffer_switcher.display-help","0");
-}
-// }}}
-
-
-BufferSwitcherDialog(doModal, useCustomCellRenderer);
-
-
-/*
-
-Macro index data (in DocBook format)
-
- <listitem>
- <para><filename>Buffer_Switcher</filename></para>
- Displays a modal dialog listing all open buffers,
- allowing one to switch to and/or close buffers.
- <keycap>ENTER</keycap> switches to a buffer and closes the dialog,
- <keycap>DELETE</keycap> closes a buffer, <keycap>SPACE</keycap>
- switches to a buffer but does not close the dialog.
- </para></abstract>
- </listitem>
-
-*/
+/*
+ * Buffer_Switcher.bsh - a BeanShell macro script for displaying
+ * and switching between open buffers.
+ *
+ * Copyright (C) 2001-2004 Ollie Rutherfurd, oliver at rutherfurd.net
+ *
+ * :mode=beanshell:tabSize=4:indentSize=4:maxLineLen=0:noTabs=false:
+ * :indentOnTab=true:indentOnEnter=true:folding=explicit:collapseFolds=1:
+ *
+ * {{{ License
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the jEdit program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * }}}
+ *
+ * Notes:
+ *
+ * This is very similar to the functionality provided by the BufferList
+ * plugin but, that is overkill for me. I just want a way I can
+ * see and switch between buffers without having to use the mouse
+ * to go to the BufferSwitcher widget in the EditPane.
+ *
+ * DELETE: closes the selected buffer but not the dialog.
+ * ENTER: switches to the selected buffer and closes the dialog.
+ * ESCAPE: closes the dialog.
+ * SPACE: switches to the selected buffer but does not close the dialog.
+ *
+ * $Id: Buffer_Switcher.bsh 5450 2006-06-20 09:08:13Z vampire0 $
+ */
+
+import javax.swing.border.EmptyBorder;
+
+
+/*
+* Custom Cell Renderer which displays the buffer icons in the JList.
+* As it runs a little slowly on my machine, it is not used by default.
+*
+* set useCustomCellRenderer to true at the bottom of this macro to use this.
+*/
+// {{{ BufferCellRenderer
+BufferCellRenderer()
+{
+
+ l = new JLabel();
+ l.setOpaque(true);
+
+ Component getListCellRendererComponent(
+ JList list,
+ Object value,
+ int index,
+ boolean isSelected,
+ boolean cellHasFocus)
+ {
+ l.setText(value.toString());
+ l.setIcon(value.getIcon());
+
+ if (isSelected)
+ {
+ l.setBackground(list.getSelectionBackground());
+ l.setForeground(list.getSelectionForeground());
+ }
+ else
+ {
+ l.setBackground(list.getBackground());
+ l.setForeground(list.getForeground());
+ }
+
+ return l;
+
+ }
+
+ return this;
+} // }}}
+
+
+/*
+* BufferSwitcherDialog - Dialog allows one to switch between
+* open buffers (and/or close open buffers).
+*/
+BufferSwitcherDialog(doModal, useCustomCellRenderer)
+{
+
+ // {{{ create dialog
+ Buffer[] openBuffers = jEdit.getBuffers();
+ int numOpen = openBuffers.length;
+ dialog = new JDialog(view, "" + numOpen + " Open Buffers", doModal);
+ content = new JPanel(new BorderLayout());
+ content.setBorder(new EmptyBorder(12,12,12,12));
+ dialog.setContentPane(content);
+
+ bufferList = new JList(openBuffers);
+ bufferList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+ if(useCustomCellRenderer)
+ bufferList.setCellRenderer(BufferCellRenderer());
+ content.add(new JScrollPane(bufferList), BorderLayout.CENTER);
+
+ content.add(new JLabel("[ENTER] Switch to; [SPACE] Switch to, keep dialog; [DEL] Close Buffer"), BorderLayout.NORTH);
+
+ buttonPanel = new JPanel();
+ buttonPanel.setLayout(new BoxLayout(buttonPanel,
+ BoxLayout.X_AXIS));
+
+ buttonPanel.setBorder(new EmptyBorder(12,50,0,50));
+ buttonPanel.add(Box.createGlue());
+ ok = new JButton("OK");
+ close = new JButton("Close");
+ ok.setPreferredSize(close.getPreferredSize());
+ dialog.getRootPane().setDefaultButton(ok);
+ buttonPanel.add(ok);
+ buttonPanel.add(Box.createHorizontalStrut(6));
+ buttonPanel.add(close);
+ buttonPanel.add(Box.createGlue());
+ content.add(buttonPanel, BorderLayout.SOUTH);
+ // }}}
+
+ // {{{ switchBuffer()
+ void switchBuffer()
+ {
+ _buffer = bufferList.getSelectedValue();
+ if(_buffer == null)
+ view.getToolkit().beep();
+ else
+ view.getEditPane().setBuffer(_buffer);
+ } // }}}
+
+ // {{{ closeBuffer()
+ void closeBuffer()
+ {
+ index = bufferList.getSelectedIndex();
+ _buffer = bufferList.getSelectedValue();
+ if(_buffer == null)
+ view.getToolkit().beep();
+ else
+ if(jEdit.closeBuffer(view, _buffer))
+ {
+ bufferList.setListData(jEdit.getBuffers());
+ if(index == jEdit.getBufferCount())
+ index--;
+ bufferList.setSelectedIndex(index);
+ }
+ numOpen--;
+ dialog.setTitle("" + numOpen + " Open Buffers");
+ } // }}}
+
+ // {{{ actionPerformed
+ void actionPerformed(evt)
+ {
+ if(evt.getSource() == ok)
+ switchBuffer();
+ dialog.dispose();
+ dialog = null;
+ } // }}}
+
+ // {{{ KeyListener implementation
+ void keyPressed(evt)
+ {
+ if(evt.getKeyCode() == KeyEvent.VK_ESCAPE)
+ dialog.dispose();
+ else if(evt.getKeyCode() == KeyEvent.VK_SPACE)
+ switchBuffer();
+ else if(evt.getKeyCode() == KeyEvent.VK_DELETE)
+ {
+ evt.consume();
+ closeBuffer();
+ }
+ }
+
+ void keyReleased(evt)
+ {
+ int selected = bufferList.getSelectedIndex();
+ if(selected > -1)
+ bufferList.ensureIndexIsVisible(selected);
+ }
+
+ void keyTyped(evt){}
+ // }}}
+
+ // {{{ MouseListener implementation
+ void mouseClicked(evt)
+ {
+ if(evt.getClickCount() > 1)
+ {
+ switchBuffer();
+ dialog.dispose();
+ }
+ }
+
+ void mouseEntered(evt){}
+ void mouseExited(evt){}
+ void mousePressed(evt){}
+ void mouseReleased(evt){}
+ // }}}
+
+ // {{{ add listeners
+ dialog.addKeyListener(this);
+ bufferList.addKeyListener(this);
+ bufferList.addMouseListener(this);
+ ok.addActionListener(this);
+ close.addActionListener(this);
+ // }}}
+
+ // {{{ display dialog
+ dialog.pack();
+ bufferList.setSelectedValue(buffer,true);
+ dialog.setLocationRelativeTo(view);
+ dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
+ dialog.setVisible(true);
+ // }}}
+
+}
+
+
+// SETTINGS {{{
+doModal = true;
+
+// whether or not to use custom CellRenderer
+useCustomCellRenderer = true;
+
+// show help for keys on first run
+showHelp = jEdit.getProperty("macro.buffer_switcher.display-help","1");
+if(showHelp.equals("1"))
+{
+ Macros.message(view, "Help for Buffer Switcher macro:\n\n"
+ + "DELETE closes selected buffer.\n"
+ + "ENTER switches to selected buffer, closes dialog.\n"
+ + "ESCAPE closes dialog.\n"
+ + "SPACE switches to selected buffer, does not close dialog.\n\n"
+ + "NOTE: This dialog will only be displayed once.");
+ jEdit.setProperty("macro.buffer_switcher.display-help","0");
+}
+// }}}
+
+
+BufferSwitcherDialog(doModal, useCustomCellRenderer);
+
+
+/*
+
+Macro index data (in DocBook format)
+
+ <listitem>
+ <para><filename>Buffer_Switcher</filename></para>
+ Displays a modal dialog listing all open buffers,
+ allowing one to switch to and/or close buffers.
+ <keycap>ENTER</keycap> switches to a buffer and closes the dialog,
+ <keycap>DELETE</keycap> closes a buffer, <keycap>SPACE</keycap>
+ switches to a buffer but does not close the dialog.
+ </para></abstract>
+ </listitem>
+
+*/
diff --git a/jEdit/macros/Files/Close_All_Except_Active.bsh b/jEdit/macros/Files/Close_All_Except_Active.bsh
index da1c8a6..db9fb1a 100644
--- a/jEdit/macros/Files/Close_All_Except_Active.bsh
+++ b/jEdit/macros/Files/Close_All_Except_Active.bsh
@@ -1,57 +1,57 @@
-/*
- * Close_All_Except_Active.bsh - a BeanShell macro script for the
- * jEdit text editor - Closes all except the current active buffer
- * Copyright (C) 2001 John Gellene
- * jgellene at nyc.rr.com
- * http://community.jedit.org
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id: Close_All_Except_Active.bsh 3871 2001-11-06 17:15:01Z jgellene $
- *
- * Checked for jEdit 4.0 API
- *
- */
-
-void closeBuffersExceptActive()
-{
- buffers = jEdit.getBuffers();
- for(i = 0; i < buffers.length; ++i)
- {
- if(buffers[i] != buffer)
- jEdit.closeBuffer(view, buffers[i]);
- }
-}
-
-closeBuffersExceptActive();
-
-/*
- Macro index data (in DocBook format)
-
-<listitem>
- <para><filename>Close_Except_Active.bsh</filename></para>
- <abstract><para>
- Closes all files except the current buffer.
- </para></abstract>
- <para>
- Prompts the user to save any buffer containing unsaved changes.
- </para>
-</listitem>
-
-*/
-
-
-// end Close_Except_Active.bsh
-
+/*
+ * Close_All_Except_Active.bsh - a BeanShell macro script for the
+ * jEdit text editor - Closes all except the current active buffer
+ * Copyright (C) 2001 John Gellene
+ * jgellene at nyc.rr.com
+ * http://community.jedit.org
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id: Close_All_Except_Active.bsh 3871 2001-11-06 17:15:01Z jgellene $
+ *
+ * Checked for jEdit 4.0 API
+ *
+ */
+
+void closeBuffersExceptActive()
+{
+ buffers = jEdit.getBuffers();
+ for(i = 0; i < buffers.length; ++i)
+ {
+ if(buffers[i] != buffer)
+ jEdit.closeBuffer(view, buffers[i]);
+ }
+}
+
+closeBuffersExceptActive();
+
+/*
+ Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>Close_Except_Active.bsh</filename></para>
+ <abstract><para>
+ Closes all files except the current buffer.
+ </para></abstract>
+ <para>
+ Prompts the user to save any buffer containing unsaved changes.
+ </para>
+</listitem>
+
+*/
+
+
+// end Close_Except_Active.bsh
+
diff --git a/jEdit/macros/Files/Copy_Name_to_Clipboard.bsh b/jEdit/macros/Files/Copy_Name_to_Clipboard.bsh
index f301e5d..b04d45b 100644
--- a/jEdit/macros/Files/Copy_Name_to_Clipboard.bsh
+++ b/jEdit/macros/Files/Copy_Name_to_Clipboard.bsh
@@ -1,28 +1,28 @@
-/*
- * Copy_Name_to_Clipboad.bsh - Copies the current buffer's filename
- * to the clipboard.
- *
- * Copyright (C) 2002-2004 Ollie Rutherfurd <oliver at rutherfurd.net>
- *
- * $Id: Copy_Name_to_Clipboard.bsh 5016 2004-04-09 17:10:15Z spestov $
- */
-
-void copyBufferNameToClipboard(Buffer buffer)
-{
- Registers.setRegister('$',buffer.getName());
- HistoryModel.getModel("clipboard").addItem(buffer.getName());
-}
-
-copyBufferNameToClipboard(buffer);
-
-/*
-
-<listitem>
- <para><filename>Copy_Name_to_Clipboad.bsh</filename></para>
- <abstract><para>Copies the current buffer's filename
- to the clipboard.
- </para></abstract>
-</listitem>
-
-*/
-
+/*
+ * Copy_Name_to_Clipboad.bsh - Copies the current buffer's filename
+ * to the clipboard.
+ *
+ * Copyright (C) 2002-2004 Ollie Rutherfurd <oliver at rutherfurd.net>
+ *
+ * $Id: Copy_Name_to_Clipboard.bsh 5016 2004-04-09 17:10:15Z spestov $
+ */
+
+void copyBufferNameToClipboard(Buffer buffer)
+{
+ Registers.setRegister('$',buffer.getName());
+ HistoryModel.getModel("clipboard").addItem(buffer.getName());
+}
+
+copyBufferNameToClipboard(buffer);
+
+/*
+
+<listitem>
+ <para><filename>Copy_Name_to_Clipboad.bsh</filename></para>
+ <abstract><para>Copies the current buffer's filename
+ to the clipboard.
+ </para></abstract>
+</listitem>
+
+*/
+
diff --git a/jEdit/macros/Files/Copy_Path_to_Clipboard.bsh b/jEdit/macros/Files/Copy_Path_to_Clipboard.bsh
index 4d5c265..7cca1c9 100644
--- a/jEdit/macros/Files/Copy_Path_to_Clipboard.bsh
+++ b/jEdit/macros/Files/Copy_Path_to_Clipboard.bsh
@@ -1,27 +1,27 @@
-/*
- * Copy_Path_to_Clipboad.bsh - Copies the current buffer's
- * path to the clipboard.
- *
- * Copyright (C) 2002-2004 Ollie Rutherfurd <oliver at rutherfurd.net>
- *
- * $Id: Copy_Path_to_Clipboard.bsh 5016 2004-04-09 17:10:15Z spestov $
- */
-
-void copyBufferPathToClipboard(Buffer buffer)
-{
- Registers.setRegister('$',buffer.getPath());
- HistoryModel.getModel("clipboard").addItem(buffer.getPath());
-}
-
-copyBufferPathToClipboard(buffer);
-
-/*
-
-<listitem>
- <para><filename>Copy_Path_to_Clipboad.bsh</filename></para>
- <abstract><para>Copies the current buffer's path
- to the clipboard.
- </para></abstract>
-</listitem>
-
-*/
+/*
+ * Copy_Path_to_Clipboad.bsh - Copies the current buffer's
+ * path to the clipboard.
+ *
+ * Copyright (C) 2002-2004 Ollie Rutherfurd <oliver at rutherfurd.net>
+ *
+ * $Id: Copy_Path_to_Clipboard.bsh 5016 2004-04-09 17:10:15Z spestov $
+ */
+
+void copyBufferPathToClipboard(Buffer buffer)
+{
+ Registers.setRegister('$',buffer.getPath());
+ HistoryModel.getModel("clipboard").addItem(buffer.getPath());
+}
+
+copyBufferPathToClipboard(buffer);
+
+/*
+
+<listitem>
+ <para><filename>Copy_Path_to_Clipboad.bsh</filename></para>
+ <abstract><para>Copies the current buffer's path
+ to the clipboard.
+ </para></abstract>
+</listitem>
+
+*/
diff --git a/jEdit/macros/Files/Delete_Current.bsh b/jEdit/macros/Files/Delete_Current.bsh
index e141975..ddadfbd 100644
--- a/jEdit/macros/Files/Delete_Current.bsh
+++ b/jEdit/macros/Files/Delete_Current.bsh
@@ -1,75 +1,75 @@
-/*
- * Delete_Current.bsh - Deletes the current
- * buffer's file on disk, but doesn't close
- * the buffer.
- *
- * Copyright (C) 2003-2004 Ollie Rutherfurd <oliver at rutherfurd.net>
- *
- * $Id: Delete_Current.bsh 4995 2004-03-19 15:58:00Z spestov $
- */
-
-import javax.swing.SwingUtilities;
-import org.gjt.sp.jedit.io.*;
-
-
-BufferStatusChecker(View view){
- run(){
- jEdit.checkBufferStatus(view);
- }
- return this;
-}
-
-
-void deleteCurrentBuffer(View view){
- Buffer buffer = view.getBuffer();
-
- // don't bother deleting new buffers (don't exist on disk)
- if(buffer.isNewFile()){
- Macros.error(view, "Buffer doesn't exist on disk.");
- return;
- }
-
- try{
- String path = buffer.getPath();
- VFS vfs = VFSManager.getVFSForPath(path);
- int caps = vfs.getCapabilities();
- int del = VFS.DELETE_CAP;
- int res = caps & del;
- if(res == 0){
- Macros.error(view, "VFS " + vfs.getName()
- + " doesn't support deleting.");
- return;
- }
-
- Object session = null;
- try{
- session = vfs.createVFSSession(path,view);
- if(vfs._delete(session,path,view)){
- view.getStatus().setMessageAndClear("Deleted: " + path);
- }
- // invoke buffer status check
- SwingUtilities.invokeLater(BufferStatusChecker(view));
- }
- finally{
- if(session != null)
- vfs._endVFSSession(session,view);
- }
- }
- catch(Exception e){
- Macros.error(view, e.toString());
- }
-}
-
-deleteCurrentBuffer(view);
-
-/*
-
- <listitem>
- <para><filename>Delete_Current.bsh</filename></para>
- <abstract><para>
- Deletes the current buffer's file on disk, but
- doesn't close the buffer.
- </para></abstract>
- </listitem>
-
-*/
+/*
+ * Delete_Current.bsh - Deletes the current
+ * buffer's file on disk, but doesn't close
+ * the buffer.
+ *
+ * Copyright (C) 2003-2004 Ollie Rutherfurd <oliver at rutherfurd.net>
+ *
+ * $Id: Delete_Current.bsh 4995 2004-03-19 15:58:00Z spestov $
+ */
+
+import javax.swing.SwingUtilities;
+import org.gjt.sp.jedit.io.*;
+
+
+BufferStatusChecker(View view){
+ run(){
+ jEdit.checkBufferStatus(view);
+ }
+ return this;
+}
+
+
+void deleteCurrentBuffer(View view){
+ Buffer buffer = view.getBuffer();
+
+ // don't bother deleting new buffers (don't exist on disk)
+ if(buffer.isNewFile()){
+ Macros.error(view, "Buffer doesn't exist on disk.");
+ return;
+ }
+
+ try{
+ String path = buffer.getPath();
+ VFS vfs = VFSManager.getVFSForPath(path);
+ int caps = vfs.getCapabilities();
+ int del = VFS.DELETE_CAP;
+ int res = caps & del;
+ if(res == 0){
+ Macros.error(view, "VFS " + vfs.getName()
+ + " doesn't support deleting.");
+ return;
+ }
+
+ Object session = null;
+ try{
+ session = vfs.createVFSSession(path,view);
+ if(vfs._delete(session,path,view)){
+ view.getStatus().setMessageAndClear("Deleted: " + path);
+ }
+ // invoke buffer status check
+ SwingUtilities.invokeLater(BufferStatusChecker(view));
+ }
+ finally{
+ if(session != null)
+ vfs._endVFSSession(session,view);
+ }
+ }
+ catch(Exception e){
+ Macros.error(view, e.toString());
+ }
+}
+
+deleteCurrentBuffer(view);
+
+/*
+
+ <listitem>
+ <para><filename>Delete_Current.bsh</filename></para>
+ <abstract><para>
+ Deletes the current buffer's file on disk, but
+ doesn't close the buffer.
+ </para></abstract>
+ </listitem>
+
+*/
diff --git a/jEdit/macros/Files/Glob_Close.bsh b/jEdit/macros/Files/Glob_Close.bsh
index 1f97496..8176969 100644
--- a/jEdit/macros/Files/Glob_Close.bsh
+++ b/jEdit/macros/Files/Glob_Close.bsh
@@ -1,48 +1,48 @@
-/*
- * Glob_Close.bsh - a BeanShell macro for jEdit that closes
- * all open buffers matching a given glob pattern.
- *
- * Copyright (C) 2003-2004 Ollie Rutherfurd <oliver at rutherfurd.net>
- *
- * $Id: Glob_Close.bsh 12063 2008-03-02 06:58:51Z k_satoda $
- */
-
-import java.util.regex.Pattern;
-
-void globClose(View view)
-{
- String glob = Macros.input(view, "Glob Pattern:");
- if(glob == null || glob.length() == 0)
- return;
-
- Pattern re = null;
- try
- {
- re = Pattern.compile(MiscUtilities.globToRE(glob));
- }
- catch(Exception e)
- {
- Macros.error(view,"Error in glob pattern: " + e.toString());
- return;
- }
-
- Buffer[] buffers = jEdit.getBuffers();
- for(int i=0; i < buffers.length; i++)
- {
- if(re.matcher(buffers[i].getPath()).matches())
- jEdit.closeBuffer(view,buffers[i]);
- }
-}
-
-globClose(view);
-
-/*
-
-<listitem>
- <para><filename>Glob_Close.bsh</filename></para>
- <abstract><para>
- Closes all open buffers matching a given glob pattern.
- </para></abstract>
-</listitem>
-
-*/
+/*
+ * Glob_Close.bsh - a BeanShell macro for jEdit that closes
+ * all open buffers matching a given glob pattern.
+ *
+ * Copyright (C) 2003-2004 Ollie Rutherfurd <oliver at rutherfurd.net>
+ *
+ * $Id: Glob_Close.bsh 12063 2008-03-02 06:58:51Z k_satoda $
+ */
+
+import java.util.regex.Pattern;
+
+void globClose(View view)
+{
+ String glob = Macros.input(view, "Glob Pattern:");
+ if(glob == null || glob.length() == 0)
+ return;
+
+ Pattern re = null;
+ try
+ {
+ re = Pattern.compile(MiscUtilities.globToRE(glob));
+ }
+ catch(Exception e)
+ {
+ Macros.error(view,"Error in glob pattern: " + e.toString());
+ return;
+ }
+
+ Buffer[] buffers = jEdit.getBuffers();
+ for(int i=0; i < buffers.length; i++)
+ {
+ if(re.matcher(buffers[i].getPath()).matches())
+ jEdit.closeBuffer(view,buffers[i]);
+ }
+}
+
+globClose(view);
+
+/*
+
+<listitem>
+ <para><filename>Glob_Close.bsh</filename></para>
+ <abstract><para>
+ Closes all open buffers matching a given glob pattern.
+ </para></abstract>
+</listitem>
+
+*/
diff --git a/jEdit/macros/Files/Insert_Selection.bsh b/jEdit/macros/Files/Insert_Selection.bsh
index 21e026d..1385990 100644
--- a/jEdit/macros/Files/Insert_Selection.bsh
+++ b/jEdit/macros/Files/Insert_Selection.bsh
@@ -1,53 +1,53 @@
-/*
- * Insert_Selection.bsh - Inserts the contents of the
- * current selection (assuming it's the path to a file)
- * into the current buffer -- replacing the selected
- * text. Text must be selected and it must not span
- * multiple lines.
- *
- * Copyright (C) 2004 Ollie Rutherfurd <oliver at jedit.org>
- *
- * $Id: Insert_Selection.bsh 5037 2004-05-06 22:35:11Z spestov $
- */
-
-insertSelected(View view, String path){
-
- // read into temporary buffer
- Buffer b = jEdit.openTemporary(view,null,path,false);
- try{
- if(b == null)
- return;
-
- while(!b.isLoaded())
- VFSManager.waitForRequests();
- String text = b.getText(0,b.getLength());
- view.getTextArea().setSelectedText(text);
- }finally{
- if(b != null)
- b.close();
- }
-}
-
-if(buffer.isReadOnly()){
- getToolkit().beep();
-}
-else{
- String selected = view.getTextArea().getSelectedText();
- if(selected == null || selected.indexOf('\n') != -1)
- getToolkit().beep();
- else
- insertSelected(view,selected);
-}
-
-/*
-
-<listitem>
- <para><filename>Insert_Selection.bsh</filename></para>
- <abstract><para>Assumes the current selection is
- file path and tries replaces the selection with the
- contents of the file. Does nothing if no text is
- selected or the selection spans multiple lines.
- </para></abstract>
-</listitem>
-
-*/
+/*
+ * Insert_Selection.bsh - Inserts the contents of the
+ * current selection (assuming it's the path to a file)
+ * into the current buffer -- replacing the selected
+ * text. Text must be selected and it must not span
+ * multiple lines.
+ *
+ * Copyright (C) 2004 Ollie Rutherfurd <oliver at jedit.org>
+ *
+ * $Id: Insert_Selection.bsh 5037 2004-05-06 22:35:11Z spestov $
+ */
+
+insertSelected(View view, String path){
+
+ // read into temporary buffer
+ Buffer b = jEdit.openTemporary(view,null,path,false);
+ try{
+ if(b == null)
+ return;
+
+ while(!b.isLoaded())
+ VFSManager.waitForRequests();
+ String text = b.getText(0,b.getLength());
+ view.getTextArea().setSelectedText(text);
+ }finally{
+ if(b != null)
+ b.close();
+ }
+}
+
+if(buffer.isReadOnly()){
+ getToolkit().beep();
+}
+else{
+ String selected = view.getTextArea().getSelectedText();
+ if(selected == null || selected.indexOf('\n') != -1)
+ getToolkit().beep();
+ else
+ insertSelected(view,selected);
+}
+
+/*
+
+<listitem>
+ <para><filename>Insert_Selection.bsh</filename></para>
+ <abstract><para>Assumes the current selection is
+ file path and tries replaces the selection with the
+ contents of the file. Does nothing if no text is
+ selected or the selection spans multiple lines.
+ </para></abstract>
+</listitem>
+
+*/
diff --git a/jEdit/macros/Files/Next_Dirty_Buffer.bsh b/jEdit/macros/Files/Next_Dirty_Buffer.bsh
index c69c9c5..9b7117d 100644
--- a/jEdit/macros/Files/Next_Dirty_Buffer.bsh
+++ b/jEdit/macros/Files/Next_Dirty_Buffer.bsh
@@ -1,44 +1,44 @@
-/*
- * Next_Dirty_Buffer.bsh - Changes the buffer in
- * the current EditPane to the next dirty buffer, if
- * there is one.
- *
- * Copyright (C) 2002-2004 Ollie Rutherfurd <oliver at rutherfurd.net>
- *
- * $Id: Next_Dirty_Buffer.bsh 5450 2006-06-20 09:08:13Z vampire0 $
- */
-
-void nextDirtyBuffer(View view)
-{
- Buffer current = view.getBuffer();
- Buffer b = current.getNext();
- for(int i=0; i < jEdit.getBufferCount()-1; i++)
- {
- // Buffer.getNext() returns null on last
- if(b == null)
- b = jEdit.getFirstBuffer();
- if(b.isDirty())
- {
- view.getEditPane().setBuffer(b);
- return;
- }
- b = b.getNext(); // check next
- }
- // if we get here, we didn't switch
- if(current.isDirty())
- view.getStatus().setMessageAndClear("No other buffers are dirty");
- else
- view.getStatus().setMessageAndClear("No buffers are dirty");
-}
-
-nextDirtyBuffer(view);
-
-/*
-
-<listitem>
- <para><filename>Next_Dirty_Buffer.bsh</filename></para>
- <abstract><para>Switches to the next dirty buffer, if there is one.
- </para></abstract>
-</listitem>
-
-*/
+/*
+ * Next_Dirty_Buffer.bsh - Changes the buffer in
+ * the current EditPane to the next dirty buffer, if
+ * there is one.
+ *
+ * Copyright (C) 2002-2004 Ollie Rutherfurd <oliver at rutherfurd.net>
+ *
+ * $Id: Next_Dirty_Buffer.bsh 5450 2006-06-20 09:08:13Z vampire0 $
+ */
+
+void nextDirtyBuffer(View view)
+{
+ Buffer current = view.getBuffer();
+ Buffer b = current.getNext();
+ for(int i=0; i < jEdit.getBufferCount()-1; i++)
+ {
+ // Buffer.getNext() returns null on last
+ if(b == null)
+ b = jEdit.getFirstBuffer();
+ if(b.isDirty())
+ {
+ view.getEditPane().setBuffer(b);
+ return;
+ }
+ b = b.getNext(); // check next
+ }
+ // if we get here, we didn't switch
+ if(current.isDirty())
+ view.getStatus().setMessageAndClear("No other buffers are dirty");
+ else
+ view.getStatus().setMessageAndClear("No buffers are dirty");
+}
+
+nextDirtyBuffer(view);
+
+/*
+
+<listitem>
+ <para><filename>Next_Dirty_Buffer.bsh</filename></para>
+ <abstract><para>Switches to the next dirty buffer, if there is one.
+ </para></abstract>
+</listitem>
+
+*/
diff --git a/jEdit/macros/Files/Open_Path.bsh b/jEdit/macros/Files/Open_Path.bsh
index 83edf9e..6fe0a2a 100644
--- a/jEdit/macros/Files/Open_Path.bsh
+++ b/jEdit/macros/Files/Open_Path.bsh
@@ -1,49 +1,49 @@
-/*
- * Open_Path.bsh - a BeanShell macro script for the
- * jEdit text editor - Prompts for a path name and opens it
- * Copyright (C) 2001 Slava Pestov
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with the jEdit program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id: Open_Path.bsh 3871 2001-11-06 17:15:01Z jgellene $
- *
- * Checked for jEdit 4.0 API
- *
- */
-
-void openPath()
-{
- String path = Macros.input(view,"Path name:");
- if(path != null)
- jEdit.openFile(view,path);
-}
-
-openPath();
-
-/*
- Macro index data (in DocBook format)
-
-<listitem>
- <para><filename>Open_Path.bsh</filename></para>
- <abstract><para>
- Opens the file supplied by the user in an input dialog.
- </para></abstract>
-</listitem>
-
-*/
-
-
-// end Open_Path.bsh
-
+/*
+ * Open_Path.bsh - a BeanShell macro script for the
+ * jEdit text editor - Prompts for a path name and opens it
+ * Copyright (C) 2001 Slava Pestov
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the jEdit program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id: Open_Path.bsh 3871 2001-11-06 17:15:01Z jgellene $
+ *
+ * Checked for jEdit 4.0 API
+ *
+ */
+
+void openPath()
+{
+ String path = Macros.input(view,"Path name:");
+ if(path != null)
+ jEdit.openFile(view,path);
+}
+
+openPath();
+
+/*
+ Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>Open_Path.bsh</filename></para>
+ <abstract><para>
+ Opens the file supplied by the user in an input dialog.
+ </para></abstract>
+</listitem>
+
+*/
+
+
+// end Open_Path.bsh
+
diff --git a/jEdit/macros/Files/Open_Selection.bsh b/jEdit/macros/Files/Open_Selection.bsh
index e47f751..c6cbdc6 100644
--- a/jEdit/macros/Files/Open_Selection.bsh
+++ b/jEdit/macros/Files/Open_Selection.bsh
@@ -1,54 +1,54 @@
-/*
- * Open_Selection.bsh - a BeanShell macro script for the
- * jEdit text editor - opens file named by selected text
- * Copyright (C) 2001 Slava Pestov
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with the jEdit program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id: Open_Selection.bsh 4826 2003-07-14 23:00:54Z spestov $
- *
- * Checked for jEdit 4.0 API
- *
- */
-
-void openSelection()
-{
- Selection[] selection = textArea.getSelection();
- if(selection == null)
- view.getToolkit().beep();
- else
- {
- for(i = 0; i < selection.length; i++)
- jEdit.openFile(view,textArea.getSelectedText(selection[i]));
- }
-}
-
-openSelection();
-
-/*
- Macro index data (in DocBook format)
-
-<listitem>
- <para><filename>Open_Selection.bsh</filename></para>
- <abstract><para>
- Opens the file named by the current buffer's selected text.
- </para></abstract>
-</listitem>
-
-*/
-
-
-// end Open_Selection.bsh
-
+/*
+ * Open_Selection.bsh - a BeanShell macro script for the
+ * jEdit text editor - opens file named by selected text
+ * Copyright (C) 2001 Slava Pestov
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the jEdit program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id: Open_Selection.bsh 4826 2003-07-14 23:00:54Z spestov $
+ *
+ * Checked for jEdit 4.0 API
+ *
+ */
+
+void openSelection()
+{
+ Selection[] selection = textArea.getSelection();
+ if(selection == null)
+ view.getToolkit().beep();
+ else
+ {
+ for(i = 0; i < selection.length; i++)
+ jEdit.openFile(view,textArea.getSelectedText(selection[i]));
+ }
+}
+
+openSelection();
+
+/*
+ Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>Open_Selection.bsh</filename></para>
+ <abstract><para>
+ Opens the file named by the current buffer's selected text.
+ </para></abstract>
+</listitem>
+
+*/
+
+
+// end Open_Selection.bsh
+
diff --git a/jEdit/macros/Files/Toggle_ReadOnly.bsh b/jEdit/macros/Files/Toggle_ReadOnly.bsh
index d1106db..57750d4 100644
--- a/jEdit/macros/Files/Toggle_ReadOnly.bsh
+++ b/jEdit/macros/Files/Toggle_ReadOnly.bsh
@@ -1,87 +1,87 @@
-/*
- * Toggle_ReadOnly.bsh - a BeanShell macro for jEdit that toggles
- * a local file's read-only flag.
- *
- * Copyright (C) 2002,2003 Ollie Rutherfurd, oliver at rutherfurd.net
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with the jEdit program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id: Toggle_ReadOnly.bsh 4937 2003-12-22 04:14:55Z spestov $
- */
-
-
-
-CmdThread(cmd, view)
-{
- run()
- {
- process = Runtime.getRuntime().exec(cmd);
- process.waitFor();
- view.getBuffer().checkFileStatus(view);
- }
- return this;
-}
-
-
-void ToggleReadOnly(view)
-{
-
- buffer = view.getBuffer();
-
- // must be using file vfs
- if(!buffer.getVFS().getName().equals("file"))
- {
- Macros.error(view, "This macro only works on local files.");
- return;
- }
-
- // is read-only be turned on or off
- readonly = buffer.isReadOnly();
-
- if (OperatingSystem.isUnix() || OperatingSystem.isMacOS())
- {
- cmd = "chmod " + (readonly ? "+" : "-") + "w "
- + buffer.getPath();
- }
- else if(OperatingSystem.isWindows())
- {
- cmd = "ATTRIB.EXE " + (readonly ? "-" : "+") + "R \""
- + buffer.getPath() + "\"";
- }
- else
- {
- Macros.error(view, "This macro only works on Windows, Unix, & MacOS X.");
- return;
- }
-
- toggle = CmdThread(cmd, view);
- SwingUtilities.invokeLater(toggle);
-}
-
-ToggleReadOnly(view);
-
-/*
- Macro index data (in DocBook format)
-
-<listitem>
- <para><filename>Toggle_ReadOnly.bsh</filename></para>
- <abstract><para>
- Toggles a local file's read-only flag. Uses platform-specific commands, so it only works on Windows, Unix and MacOS X.
- </para></abstract>
-</listitem>
-
-*/
-
-// :indentSize=4:lineSeparator=\n:noTabs=false:tabSize=4:folding=explicit:collapseFolds=1:
+/*
+ * Toggle_ReadOnly.bsh - a BeanShell macro for jEdit that toggles
+ * a local file's read-only flag.
+ *
+ * Copyright (C) 2002,2003 Ollie Rutherfurd, oliver at rutherfurd.net
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the jEdit program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id: Toggle_ReadOnly.bsh 4937 2003-12-22 04:14:55Z spestov $
+ */
+
+
+
+CmdThread(cmd, view)
+{
+ run()
+ {
+ process = Runtime.getRuntime().exec(cmd);
+ process.waitFor();
+ view.getBuffer().checkFileStatus(view);
+ }
+ return this;
+}
+
+
+void ToggleReadOnly(view)
+{
+
+ buffer = view.getBuffer();
+
+ // must be using file vfs
+ if(!buffer.getVFS().getName().equals("file"))
+ {
+ Macros.error(view, "This macro only works on local files.");
+ return;
+ }
+
+ // is read-only be turned on or off
+ readonly = buffer.isReadOnly();
+
+ if (OperatingSystem.isUnix() || OperatingSystem.isMacOS())
+ {
+ cmd = "chmod " + (readonly ? "+" : "-") + "w "
+ + buffer.getPath();
+ }
+ else if(OperatingSystem.isWindows())
+ {
+ cmd = "ATTRIB.EXE " + (readonly ? "-" : "+") + "R \""
+ + buffer.getPath() + "\"";
+ }
+ else
+ {
+ Macros.error(view, "This macro only works on Windows, Unix, & MacOS X.");
+ return;
+ }
+
+ toggle = CmdThread(cmd, view);
+ SwingUtilities.invokeLater(toggle);
+}
+
+ToggleReadOnly(view);
+
+/*
+ Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>Toggle_ReadOnly.bsh</filename></para>
+ <abstract><para>
+ Toggles a local file's read-only flag. Uses platform-specific commands, so it only works on Windows, Unix and MacOS X.
+ </para></abstract>
+</listitem>
+
+*/
+
+// :indentSize=4:lineSeparator=\n:noTabs=false:tabSize=4:folding=explicit:collapseFolds=1:
diff --git a/jEdit/macros/Interface/Decrease_Font_Size.bsh b/jEdit/macros/Interface/Decrease_Font_Size.bsh
index 89e84a0..3ff5c92 100644
--- a/jEdit/macros/Interface/Decrease_Font_Size.bsh
+++ b/jEdit/macros/Interface/Decrease_Font_Size.bsh
@@ -1,38 +1,38 @@
-/*
-* Decrease_Font_Size.bsh - a BeanShell macro for the jEdit text
-* editor - Decreases editor & gutter font size by 1.
-*
-* Copyright (C) 2003 Ollie Rutherfurd <oliver at rutherfurd.net>
-*
-* $Id: Decrease_Font_Size.bsh 4937 2003-12-22 04:14:55Z spestov $
-*/
-
-decreaseFontSize()
-{
- FONT_SIZE = "view.fontsize";
- GUTTER_FONT_SIZE = "view.gutter.fontsize";
- CONSOLE_FONT_SIZE = "console.fontsize";
- size = jEdit.getIntegerProperty(FONT_SIZE,12) - 1;
- jEdit.setIntegerProperty(FONT_SIZE,size);
- jEdit.setIntegerProperty(GUTTER_FONT_SIZE,size);
- jEdit.setIntegerProperty(CONSOLE_FONT_SIZE,size);
- jEdit.propertiesChanged();
- jEdit.saveSettings();
- view.getStatus().setMessageAndClear("Font size now " + size);
-}
-
-decreaseFontSize();
-
-/*
-
- Macro index data (in DocBook format)
-
-<listitem>
- <para><filename>Decrease_Font_Size.bsh</filename></para>
- <abstract><para>
- Decreases the font size in the gutter and text area by 1 point.
- </para></abstract>
-</listitem>
-
-*/
-
+/*
+* Decrease_Font_Size.bsh - a BeanShell macro for the jEdit text
+* editor - Decreases editor & gutter font size by 1.
+*
+* Copyright (C) 2003 Ollie Rutherfurd <oliver at rutherfurd.net>
+*
+* $Id: Decrease_Font_Size.bsh 4937 2003-12-22 04:14:55Z spestov $
+*/
+
+decreaseFontSize()
+{
+ FONT_SIZE = "view.fontsize";
+ GUTTER_FONT_SIZE = "view.gutter.fontsize";
+ CONSOLE_FONT_SIZE = "console.fontsize";
+ size = jEdit.getIntegerProperty(FONT_SIZE,12) - 1;
+ jEdit.setIntegerProperty(FONT_SIZE,size);
+ jEdit.setIntegerProperty(GUTTER_FONT_SIZE,size);
+ jEdit.setIntegerProperty(CONSOLE_FONT_SIZE,size);
+ jEdit.propertiesChanged();
+ jEdit.saveSettings();
+ view.getStatus().setMessageAndClear("Font size now " + size);
+}
+
+decreaseFontSize();
+
+/*
+
+ Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>Decrease_Font_Size.bsh</filename></para>
+ <abstract><para>
+ Decreases the font size in the gutter and text area by 1 point.
+ </para></abstract>
+</listitem>
+
+*/
+
diff --git a/jEdit/macros/Interface/Increase_Font_Size.bsh b/jEdit/macros/Interface/Increase_Font_Size.bsh
index c936e08..b530dac 100644
--- a/jEdit/macros/Interface/Increase_Font_Size.bsh
+++ b/jEdit/macros/Interface/Increase_Font_Size.bsh
@@ -1,38 +1,38 @@
-/*
-* Increase_Font_Size.bsh - a BeanShell macro for the jEdit text
-* editor - Increases editor & gutter font size by 1.
-*
-* Copyright (C) 2003 Ollie Rutherfurd <oliver at rutherfurd.net>
-*
-* $Id: Increase_Font_Size.bsh 4938 2003-12-23 02:15:05Z spestov $
-*/
-
-increaseFontSize()
-{
- FONT_SIZE = "view.fontsize";
- GUTTER_FONT_SIZE = "view.gutter.fontsize";
- CONSOLE_FONT_SIZE = "console.fontsize";
- size = jEdit.getIntegerProperty(FONT_SIZE,12) + 1;
- jEdit.setIntegerProperty(FONT_SIZE,size);
- jEdit.setIntegerProperty(GUTTER_FONT_SIZE,size);
- jEdit.setIntegerProperty(CONSOLE_FONT_SIZE,size);
- jEdit.propertiesChanged();
- jEdit.saveSettings();
- view.getStatus().setMessageAndClear("Font size now " + size);
-}
-
-increaseFontSize();
-
-/*
-
- Macro index data (in DocBook format)
-
-<listitem>
- <para><filename>Increase_Font_Size.bsh</filename></para>
- <abstract><para>
- Increases the font size in the gutter and text area by 1 point.
- </para></abstract>
-</listitem>
-
-*/
-
+/*
+* Increase_Font_Size.bsh - a BeanShell macro for the jEdit text
+* editor - Increases editor & gutter font size by 1.
+*
+* Copyright (C) 2003 Ollie Rutherfurd <oliver at rutherfurd.net>
+*
+* $Id: Increase_Font_Size.bsh 4938 2003-12-23 02:15:05Z spestov $
+*/
+
+increaseFontSize()
+{
+ FONT_SIZE = "view.fontsize";
+ GUTTER_FONT_SIZE = "view.gutter.fontsize";
+ CONSOLE_FONT_SIZE = "console.fontsize";
+ size = jEdit.getIntegerProperty(FONT_SIZE,12) + 1;
+ jEdit.setIntegerProperty(FONT_SIZE,size);
+ jEdit.setIntegerProperty(GUTTER_FONT_SIZE,size);
+ jEdit.setIntegerProperty(CONSOLE_FONT_SIZE,size);
+ jEdit.propertiesChanged();
+ jEdit.saveSettings();
+ view.getStatus().setMessageAndClear("Font size now " + size);
+}
+
+increaseFontSize();
+
+/*
+
+ Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>Increase_Font_Size.bsh</filename></para>
+ <abstract><para>
+ Increases the font size in the gutter and text area by 1 point.
+ </para></abstract>
+</listitem>
+
+*/
+
diff --git a/jEdit/macros/Interface/Open_Context_Menu.bsh b/jEdit/macros/Interface/Open_Context_Menu.bsh
index 3791954..75ab6e2 100644
--- a/jEdit/macros/Interface/Open_Context_Menu.bsh
+++ b/jEdit/macros/Interface/Open_Context_Menu.bsh
@@ -1,28 +1,28 @@
-/*
-* Open_Context_Menu.bsh - a BeanShell macro script for
-* the jEdit text editor - Opens the editor context menu
-* just below and to the right of the cursor.
-*
-* Copyright (C) 2003 Nitsan Vardi
-*
-* $Id: Open_Context_Menu.bsh 9820 2007-06-17 20:59:58Z vanza $
-*/
-
-openContextMenu(){
- textArea.showPopupMenu();
-}
-
-openContextMenu();
-
-/*
- Macro index data (in DocBook format)
-
-<listitem>
- <para><filename>Open_Context_Menu.bsh</filename></para>
- <abstract><para>
- Opens the text area context menu just below the caret.
- </para></abstract>
-</listitem>
-
-*/
-
+/*
+* Open_Context_Menu.bsh - a BeanShell macro script for
+* the jEdit text editor - Opens the editor context menu
+* just below and to the right of the cursor.
+*
+* Copyright (C) 2003 Nitsan Vardi
+*
+* $Id: Open_Context_Menu.bsh 9820 2007-06-17 20:59:58Z vanza $
+*/
+
+openContextMenu(){
+ textArea.showPopupMenu();
+}
+
+openContextMenu();
+
+/*
+ Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>Open_Context_Menu.bsh</filename></para>
+ <abstract><para>
+ Opens the text area context menu just below the caret.
+ </para></abstract>
+</listitem>
+
+*/
+
diff --git a/jEdit/macros/Interface/Reset_TextArea.bsh b/jEdit/macros/Interface/Reset_TextArea.bsh
index 72378b5..edaf914 100644
--- a/jEdit/macros/Interface/Reset_TextArea.bsh
+++ b/jEdit/macros/Interface/Reset_TextArea.bsh
@@ -2,7 +2,15 @@
A macro that performs a split and an unsplit of the current TextArea.
Useful for those occasions when your textarea is corrupt (painting the
incorrect characters on the screen).
-*/
-
+*/
+import javax.swing.Timer;
view.splitVertically();
-view.unsplitCurrent();
+int delay = 100; //milliseconds
+ActionListener taskPerformer = new ActionListener() {
+ public void actionPerformed(ActionEvent evt) {
+ view.unsplitCurrent();
+ }
+};
+t = new Timer(delay, taskPerformer);
+t.setRepeats(false);
+t.start();
diff --git a/jEdit/macros/Interface/Splitpane_Grow.bsh b/jEdit/macros/Interface/Splitpane_Grow.bsh
index 096a03d..483761c 100644
--- a/jEdit/macros/Interface/Splitpane_Grow.bsh
+++ b/jEdit/macros/Interface/Splitpane_Grow.bsh
@@ -1,57 +1,58 @@
-/*
- * Splitpane_grow.bsh v1.0 - a BeanShell macro script for the
- * jEdit text editor -
- * Increases the size of the currently active split pane.
- *
- * Based on SplitPane_up by Claudio Vicari
- * (c) 2005 by Alan Ezust
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with the jEdit program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- *
- * Checked for jEdit 4.2 API
- *
- */
-
- splitPaneGrow() {
-
- EditPane active_area = view.getEditPane();
-
- if( view.getSplitPane() != null ) {
- JSplitPane splitPane = view.getSplitPane();
- int minimum = splitPane.getMinimumDividerLocation();
- int maximum = splitPane.getMaximumDividerLocation();
- double actual_position = (double)splitPane.getDividerLocation();
-
- /* converts the integer returned by getDividerLocation in a proportion
- between 0.0 and 1.0 */
- actual_position = (actual_position-minimum) / ( maximum - minimum );
- if (splitPane.getLeftComponent() == active_area) {
- actual_position += 0.05;
- }
- else {
- actual_position -= 0.05;
- }
- if( actual_position <= 0.0 )
- actual_position = 0.0;
- if( actual_position >= 1.0 )
- actual_position = 1.0;
-
- splitPane.setDividerLocation( (double)actual_position );
- active_area.focusOnTextArea();
- }
- }
- splitPaneGrow();
-
+/*
+ * Splitpane_grow.bsh v1.1 - a BeanShell macro script for the jEdit text editor
+ * Increases the size of the currently active split pane.
+ *
+ * Based on SplitPane_up by Claudio Vicari
+ * (c) 2005, 2011 by Alan Ezust
+ * Version 1.1 supports more than 2 editpanes.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the jEdit program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ *
+ * Checked for jEdit 4.5 API
+ *
+ */
+
+ import javax.swing.JSplitPane;
+ import org.gjt.sp.jedit.GUIUtilities;
+
+ splitPaneGrow() {
+ EditPane active_area = view.getEditPane();
+ if( view.getSplitPane() != null ) {
+ splitPane = GUIUtilities.getComponentParent(active_area, JSplitPane.class);
+ int minimum = splitPane.getMinimumDividerLocation();
+ int maximum = splitPane.getMaximumDividerLocation();
+ double actual_position = (double)splitPane.getDividerLocation();
+
+ /* converts the integer returned by getDividerLocation in a proportion
+ between 0.0 and 1.0 */
+ actual_position = (actual_position-minimum) / ( maximum - minimum );
+ if (splitPane.getLeftComponent() == active_area) {
+ actual_position += 0.05;
+ }
+ else {
+ actual_position -= 0.05;
+ }
+ if( actual_position <= 0.0 )
+ actual_position = 0.0;
+ if( actual_position >= 1.0 )
+ actual_position = 1.0;
+
+ splitPane.setDividerLocation( (double)actual_position );
+ active_area.focusOnTextArea();
+ }
+ }
+ splitPaneGrow();
+
diff --git a/jEdit/macros/Interface/Toggle_Bottom_Docking_Area.bsh b/jEdit/macros/Interface/Toggle_Bottom_Docking_Area.bsh
index 735f46f..fea53ae 100644
--- a/jEdit/macros/Interface/Toggle_Bottom_Docking_Area.bsh
+++ b/jEdit/macros/Interface/Toggle_Bottom_Docking_Area.bsh
@@ -1,44 +1,44 @@
-/*
- * Toggle_Bottom_Docking_Area.bsh - a BeanShell macro for the
- * jEdit text editor - Expands or collapses the bottom docking
- * area, depending on it's current state.
- *
- * Copyright (C) 2003 Ollie Rutherfurd <oliver at rutherfurd.net>
- *
- * $Id: Toggle_Bottom_Docking_Area.bsh 4906 2003-10-26 20:57:28Z spestov $
- */
-
-toggleBottomDockingArea()
-{
- dockarea = view.getDockableWindowManager().getBottomDockingArea();
- if(dockarea.getCurrent() == null)
- {
- dockarea.showMostRecent();
- name = dockarea.getCurrent();
- component = view.getDockableWindowManager().getDockable(name);
- if(component instanceof DefaultFocusComponent)
- component.focusOnDefaultComponent();
- }
- else
- {
- dockarea.show(null);
- view.getTextArea().requestFocus();
- }
-}
-
-toggleBottomDockingArea();
-
-/*
-
- Macro index data (in DocBook format)
-
-<listitem>
- <para><filename>Toggle_Bottom_Docking_Area.bsh</filename></para>
- <abstract><para>
- Expands or collapses the bottom docking area,
- depending on it's current state.
- </para></abstract>
-</listitem>
-
-*/
-
+/*
+ * Toggle_Bottom_Docking_Area.bsh - a BeanShell macro for the
+ * jEdit text editor - Expands or collapses the bottom docking
+ * area, depending on it's current state.
+ *
+ * Copyright (C) 2003 Ollie Rutherfurd <oliver at rutherfurd.net>
+ *
+ * $Id: Toggle_Bottom_Docking_Area.bsh 4906 2003-10-26 20:57:28Z spestov $
+ */
+
+toggleBottomDockingArea()
+{
+ dockarea = view.getDockableWindowManager().getBottomDockingArea();
+ if(dockarea.getCurrent() == null)
+ {
+ dockarea.showMostRecent();
+ name = dockarea.getCurrent();
+ component = view.getDockableWindowManager().getDockable(name);
+ if(component instanceof DefaultFocusComponent)
+ component.focusOnDefaultComponent();
+ }
+ else
+ {
+ dockarea.show(null);
+ view.getTextArea().requestFocus();
+ }
+}
+
+toggleBottomDockingArea();
+
+/*
+
+ Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>Toggle_Bottom_Docking_Area.bsh</filename></para>
+ <abstract><para>
+ Expands or collapses the bottom docking area,
+ depending on it's current state.
+ </para></abstract>
+</listitem>
+
+*/
+
diff --git a/jEdit/macros/Interface/Toggle_Left_Docking_Area.bsh b/jEdit/macros/Interface/Toggle_Left_Docking_Area.bsh
index 69ed139..3f1dfdc 100644
--- a/jEdit/macros/Interface/Toggle_Left_Docking_Area.bsh
+++ b/jEdit/macros/Interface/Toggle_Left_Docking_Area.bsh
@@ -1,36 +1,36 @@
-/*
- * Toggle_Left_Docking_Area.bsh - a BeanShell macro for the
- * jEdit text editor - Expands or collapses the left docking
- * area, depending on it's current state.
- *
- * Copyright (C) 2003 Ollie Rutherfurd <oliver at rutherfurd.net>
- *
- * $Id: Toggle_Left_Docking_Area.bsh 4906 2003-10-26 20:57:28Z spestov $
- */
-
-toggleLeftDockingArea()
-{
- dockarea = view.getDockableWindowManager().getLeftDockingArea();
- if(dockarea.getCurrent() == null)
- dockarea.showMostRecent();
- else
- dockarea.show(null);
- view.getTextArea().requestFocus();
-}
-
-toggleLeftDockingArea();
-
-/*
-
- Macro index data (in DocBook format)
-
-<listitem>
- <para><filename>Toggle_Left_Docking_Area.bsh</filename></para>
- <abstract><para>
- Expands or collapses the left docking area,
- depending on it's current state.
- </para></abstract>
-</listitem>
-
-*/
-
+/*
+ * Toggle_Left_Docking_Area.bsh - a BeanShell macro for the
+ * jEdit text editor - Expands or collapses the left docking
+ * area, depending on it's current state.
+ *
+ * Copyright (C) 2003 Ollie Rutherfurd <oliver at rutherfurd.net>
+ *
+ * $Id: Toggle_Left_Docking_Area.bsh 4906 2003-10-26 20:57:28Z spestov $
+ */
+
+toggleLeftDockingArea()
+{
+ dockarea = view.getDockableWindowManager().getLeftDockingArea();
+ if(dockarea.getCurrent() == null)
+ dockarea.showMostRecent();
+ else
+ dockarea.show(null);
+ view.getTextArea().requestFocus();
+}
+
+toggleLeftDockingArea();
+
+/*
+
+ Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>Toggle_Left_Docking_Area.bsh</filename></para>
+ <abstract><para>
+ Expands or collapses the left docking area,
+ depending on it's current state.
+ </para></abstract>
+</listitem>
+
+*/
+
diff --git a/jEdit/macros/Interface/Toggle_Right_Docking_Area.bsh b/jEdit/macros/Interface/Toggle_Right_Docking_Area.bsh
index 25d310a..724a780 100644
--- a/jEdit/macros/Interface/Toggle_Right_Docking_Area.bsh
+++ b/jEdit/macros/Interface/Toggle_Right_Docking_Area.bsh
@@ -1,36 +1,36 @@
-/*
- * Toggle_Right_Docking_Area.bsh - a BeanShell macro for the
- * jEdit text editor - Expands or collapses the tight docking
- * area, depending on it's current state.
- *
- * Copyright (C) 2003 Ollie Rutherfurd <oliver at rutherfurd.net>
- *
- * $Id: Toggle_Right_Docking_Area.bsh 4937 2003-12-22 04:14:55Z spestov $
- */
-
-toggleRightDockingArea()
-{
- dockarea = view.getDockableWindowManager().getRightDockingArea();
- if(dockarea.getCurrent() == null)
- dockarea.showMostRecent();
- else
- dockarea.show(null);
- view.getTextArea().requestFocus();
-}
-
-toggleRightDockingArea();
-
-/*
-
- Macro index data (in DocBook format)
-
-<listitem>
- <para><filename>Toggle_Right_Docking_Area.bsh</filename></para>
- <abstract><para>
- Expands or collapses the right docking area,
- depending on it's current state.
- </para></abstract>
-</listitem>
-
-*/
-
+/*
+ * Toggle_Right_Docking_Area.bsh - a BeanShell macro for the
+ * jEdit text editor - Expands or collapses the tight docking
+ * area, depending on it's current state.
+ *
+ * Copyright (C) 2003 Ollie Rutherfurd <oliver at rutherfurd.net>
+ *
+ * $Id: Toggle_Right_Docking_Area.bsh 4937 2003-12-22 04:14:55Z spestov $
+ */
+
+toggleRightDockingArea()
+{
+ dockarea = view.getDockableWindowManager().getRightDockingArea();
+ if(dockarea.getCurrent() == null)
+ dockarea.showMostRecent();
+ else
+ dockarea.show(null);
+ view.getTextArea().requestFocus();
+}
+
+toggleRightDockingArea();
+
+/*
+
+ Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>Toggle_Right_Docking_Area.bsh</filename></para>
+ <abstract><para>
+ Expands or collapses the right docking area,
+ depending on it's current state.
+ </para></abstract>
+</listitem>
+
+*/
+
diff --git a/jEdit/macros/Interface/Toggle_Top_Docking_Area.bsh b/jEdit/macros/Interface/Toggle_Top_Docking_Area.bsh
index eaa3ddc..1475b7a 100644
--- a/jEdit/macros/Interface/Toggle_Top_Docking_Area.bsh
+++ b/jEdit/macros/Interface/Toggle_Top_Docking_Area.bsh
@@ -1,36 +1,36 @@
-/*
- * Toggle_Top_Docking_Area.bsh - a BeanShell macro for the
- * jEdit text editor - Expands or collapses the top docking
- * area, depending on it's current state.
- *
- * Copyright (C) 2003 Ollie Rutherfurd <oliver at rutherfurd.net>
- *
- * $Id: Toggle_Top_Docking_Area.bsh 4906 2003-10-26 20:57:28Z spestov $
- */
-
-toggleTopDockingArea()
-{
- dockarea = view.getDockableWindowManager().getTopDockingArea();
- if(dockarea.getCurrent() == null)
- dockarea.showMostRecent();
- else
- dockarea.show(null);
- view.getTextArea().requestFocus();
-}
-
-toggleTopDockingArea();
-
-/*
-
- Macro index data (in DocBook format)
-
-<listitem>
- <para><filename>Toggle_Top_Docking_Area.bsh</filename></para>
- <abstract><para>
- Expands or collapses the top docking area,
- depending on it's current state.
- </para></abstract>
-</listitem>
-
-*/
-
+/*
+ * Toggle_Top_Docking_Area.bsh - a BeanShell macro for the
+ * jEdit text editor - Expands or collapses the top docking
+ * area, depending on it's current state.
+ *
+ * Copyright (C) 2003 Ollie Rutherfurd <oliver at rutherfurd.net>
+ *
+ * $Id: Toggle_Top_Docking_Area.bsh 4906 2003-10-26 20:57:28Z spestov $
+ */
+
+toggleTopDockingArea()
+{
+ dockarea = view.getDockableWindowManager().getTopDockingArea();
+ if(dockarea.getCurrent() == null)
+ dockarea.showMostRecent();
+ else
+ dockarea.show(null);
+ view.getTextArea().requestFocus();
+}
+
+toggleTopDockingArea();
+
+/*
+
+ Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>Toggle_Top_Docking_Area.bsh</filename></para>
+ <abstract><para>
+ Expands or collapses the top docking area,
+ depending on it's current state.
+ </para></abstract>
+</listitem>
+
+*/
+
diff --git a/jEdit/macros/Java/Create_Constructor.bsh b/jEdit/macros/Java/Create_Constructor.bsh
index 2154190..7ddc3cf 100644
--- a/jEdit/macros/Java/Create_Constructor.bsh
+++ b/jEdit/macros/Java/Create_Constructor.bsh
@@ -1,221 +1,221 @@
-/**
-Create_Constructor.bsh - a BeanShell macro for the jEdit text editor that
-creates a constructor containing the selected variables. This code has the
-similar limitations as Get_Class_Name; it merely looks backwards for the nearest
-occurance of the keyword 'class," etc.
-
-Copyright (C) 2004 Thomas Galvin - software at thomas-galvin.com
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-*/
-
-boolean JAVA_MODE = buffer.getMode().getName().toLowerCase().equals("java");
-String UNDEFINED = "UNKNOWN_CLASS";
-
-void setCaret(int selectionStart, int selectionEnd)
-{
- textArea.setCaretPosition(selectionStart);
- textArea.moveCaretPosition(selectionEnd);
-}
-
-String getClassName()
-{
- int selectionStart = textArea.getSelectionStart();
- int selectionEnd = textArea.getSelectionEnd();
-
- String text = textArea.getText();
- int index = text.lastIndexOf("class", selectionStart);
- if(index != -1)
- {
- textArea.setCaretPosition(index);
- int lineNumber = textArea.getCaretLine();
- int lineEnd = textArea.getLineEndOffset(lineNumber);
- String lineText = text.substring(index, lineEnd);
-
- StringTokenizer tokenizer = new StringTokenizer(lineText);
- tokenizer.nextToken(); //eat "class"
- if(tokenizer.hasMoreTokens())
- {
- setCaret(selectionStart, selectionEnd);
- return tokenizer.nextToken();
- }
- }
- setCaret(selectionStart, selectionEnd);
-
- String fileClassName = buffer.getName();
- int index = fileClassName.lastIndexOf('.');
- if(index != -1)
- {
- fileClassName = fileClassName.substring(0, index);
- if(fileClassName.toLowerCase().indexOf("untitled") == -1)
- {
- return fileClassName;
- }
- }
-
- return UNDEFINED;
-}
-
-public String createJavaConstructor(String className, String[] typeNames, String[] variableNames)
-{
- if(typeNames.length != variableNames.length)
- {
- Macro.message(view, "Uneven number of type names and variables.");
- return "";
- }
-
- String args = "";
- String body = "";
-
- for(int i = 0; i < typeNames.length; i++)
- {
- args += typeNames[i] + " " + variableNames[i];
- if(i+1 < typeNames.length)
- {
- args += ",\n";
- }
-
- body += "this." + variableNames[i] + " = " + variableNames[i] + ";\n";
- }
-
- String code =
- "/**\n" + "Basic constructor for " + className + "\n*/\n" +
- "public " + className +
- "(" + args + ")" + "\n" +
- "{" + "\n" +
- body +
- "}" + "\n";
-
- return code;
-}
-
-public String createCppConstructor(String className, String[] typeNames, String[] variableNames)
-{
- if(typeNames.length != variableNames.length)
- {
- Macro.message(view, "Uneven number of type names and variables.");
- return "";
- }
-
- String args = "";
- String body = "";
-
- for(int i = 0; i < typeNames.length; i++)
- {
- String setVariable = variableNames[i] + "Value";
-
- args += typeNames[i] + "& " + setVariable;
- body += variableNames[i] + "(" + setVariable + ")";
-
- if(i+1 < typeNames.length)
- {
- args += ",\n";
- body += ",";
- }
-
- body += "\n";
- }
-
- String code =
- "/*\n" + "Basic constructor for " + className + "\n*/\n" +
- className + "::" + className +
- "(" + args + ")" + "\n" +
- "throw()\n" +
- " : " + body +
- "{" + "\n" +
- "}" + "\n";
-
- return code;
-}
-
-void parseSelection()
-{
- int selectionStart = textArea.getSelectionStart();
- int selectionEnd = textArea.getSelectionEnd();
-
- textArea.setCaretPosition(selectionStart);
- int startLine = textArea.getCaretLine();
-
- textArea.setCaretPosition(selectionEnd);
- int endLine = textArea.getCaretLine();
-
- Vector typeNames = new Vector();
- Vector variableNames = new Vector();
-
- for(int i = startLine; i <= endLine; i++)
- {
- String lineText = textArea.getLineText(i);
- if( lineText != null && !lineText.equals("") )
- {
- lineText = lineText.trim();
- if( lineText.endsWith(";") )
- {
- lineText = lineText.substring( 0, lineText.length() -1 );
- }
-
- StringTokenizer tokenizer = new StringTokenizer(lineText);
- int tokenCount = tokenizer.countTokens();
- if(tokenCount >= 2)
- {
- int numGarbage = tokenCount - 2;
- for (int i = 0; i < numGarbage; i++)
- {
- tokenizer.nextToken();
- }
-
- String type = tokenizer.nextToken();
- String variable = tokenizer.nextToken();
-
- if(type != null &&
- type.compareTo("") != 0 &&
- variable != null &&
- variable.compareTo("") != 0 )
- {
- typeNames.add(type);
- variableNames.add(variable);
- }
- }
- }
- }
-
- int size = typeNames.size();
- String [] types = new String[size];
- String [] variables = new String[size];
-
- for(int i = 0; i < size; i++)
- {
- types[i] = typeNames.get(i).toString();
- variables[i] = variableNames.get(i).toString();
- }
-
- String code = "\n";
- if(JAVA_MODE)
- {
- code += createJavaConstructor(getClassName(), types, variables);
- textArea.setCaretPosition(selectionEnd);
- textArea.setSelectedText(code);
- }
- else
- {
- code += createCppConstructor(getClassName(), types, variables);
- textArea.setCaretPosition(selectionEnd);
- textArea.setSelectedText(code);
- }
-
- textArea.setCaretPosition(selectionEnd);
- textArea.moveCaretPosition(selectionEnd + code.length(), true);
- textArea.indentSelectedLines();
-}
-
-if( buffer.isReadOnly() )
- Macros.error( view, "Buffer is read-only." );
-else
- parseSelection();
+/**
+Create_Constructor.bsh - a BeanShell macro for the jEdit text editor that
+creates a constructor containing the selected variables. This code has the
+similar limitations as Get_Class_Name; it merely looks backwards for the nearest
+occurance of the keyword 'class," etc.
+
+Copyright (C) 2004 Thomas Galvin - software at thomas-galvin.com
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+*/
+
+boolean JAVA_MODE = buffer.getMode().getName().toLowerCase().equals("java");
+String UNDEFINED = "UNKNOWN_CLASS";
+
+void setCaret(int selectionStart, int selectionEnd)
+{
+ textArea.setCaretPosition(selectionStart);
+ textArea.moveCaretPosition(selectionEnd);
+}
+
+String getClassName()
+{
+ int selectionStart = textArea.getSelectionStart();
+ int selectionEnd = textArea.getSelectionEnd();
+
+ String text = textArea.getText();
+ int index = text.lastIndexOf("class", selectionStart);
+ if(index != -1)
+ {
+ textArea.setCaretPosition(index);
+ int lineNumber = textArea.getCaretLine();
+ int lineEnd = textArea.getLineEndOffset(lineNumber);
+ String lineText = text.substring(index, lineEnd);
+
+ StringTokenizer tokenizer = new StringTokenizer(lineText);
+ tokenizer.nextToken(); //eat "class"
+ if(tokenizer.hasMoreTokens())
+ {
+ setCaret(selectionStart, selectionEnd);
+ return tokenizer.nextToken();
+ }
+ }
+ setCaret(selectionStart, selectionEnd);
+
+ String fileClassName = buffer.getName();
+ int index = fileClassName.lastIndexOf('.');
+ if(index != -1)
+ {
+ fileClassName = fileClassName.substring(0, index);
+ if(fileClassName.toLowerCase().indexOf("untitled") == -1)
+ {
+ return fileClassName;
+ }
+ }
+
+ return UNDEFINED;
+}
+
+public String createJavaConstructor(String className, String[] typeNames, String[] variableNames)
+{
+ if(typeNames.length != variableNames.length)
+ {
+ Macro.message(view, "Uneven number of type names and variables.");
+ return "";
+ }
+
+ String args = "";
+ String body = "";
+
+ for(int i = 0; i < typeNames.length; i++)
+ {
+ args += typeNames[i] + " " + variableNames[i];
+ if(i+1 < typeNames.length)
+ {
+ args += ",\n";
+ }
+
+ body += "this." + variableNames[i] + " = " + variableNames[i] + ";\n";
+ }
+
+ String code =
+ "/**\n" + "Basic constructor for " + className + "\n*/\n" +
+ "public " + className +
+ "(" + args + ")" + "\n" +
+ "{" + "\n" +
+ body +
+ "}" + "\n";
+
+ return code;
+}
+
+public String createCppConstructor(String className, String[] typeNames, String[] variableNames)
+{
+ if(typeNames.length != variableNames.length)
+ {
+ Macro.message(view, "Uneven number of type names and variables.");
+ return "";
+ }
+
+ String args = "";
+ String body = "";
+
+ for(int i = 0; i < typeNames.length; i++)
+ {
+ String setVariable = variableNames[i] + "Value";
+
+ args += typeNames[i] + "& " + setVariable;
+ body += variableNames[i] + "(" + setVariable + ")";
+
+ if(i+1 < typeNames.length)
+ {
+ args += ",\n";
+ body += ",";
+ }
+
+ body += "\n";
+ }
+
+ String code =
+ "/*\n" + "Basic constructor for " + className + "\n*/\n" +
+ className + "::" + className +
+ "(" + args + ")" + "\n" +
+ "throw()\n" +
+ " : " + body +
+ "{" + "\n" +
+ "}" + "\n";
+
+ return code;
+}
+
+void parseSelection()
+{
+ int selectionStart = textArea.getSelectionStart();
+ int selectionEnd = textArea.getSelectionEnd();
+
+ textArea.setCaretPosition(selectionStart);
+ int startLine = textArea.getCaretLine();
+
+ textArea.setCaretPosition(selectionEnd);
+ int endLine = textArea.getCaretLine();
+
+ Vector typeNames = new Vector();
+ Vector variableNames = new Vector();
+
+ for(int i = startLine; i <= endLine; i++)
+ {
+ String lineText = textArea.getLineText(i);
+ if( lineText != null && !lineText.equals("") )
+ {
+ lineText = lineText.trim();
+ if( lineText.endsWith(";") )
+ {
+ lineText = lineText.substring( 0, lineText.length() -1 );
+ }
+
+ StringTokenizer tokenizer = new StringTokenizer(lineText);
+ int tokenCount = tokenizer.countTokens();
+ if(tokenCount >= 2)
+ {
+ int numGarbage = tokenCount - 2;
+ for (int i = 0; i < numGarbage; i++)
+ {
+ tokenizer.nextToken();
+ }
+
+ String type = tokenizer.nextToken();
+ String variable = tokenizer.nextToken();
+
+ if(type != null &&
+ type.compareTo("") != 0 &&
+ variable != null &&
+ variable.compareTo("") != 0 )
+ {
+ typeNames.add(type);
+ variableNames.add(variable);
+ }
+ }
+ }
+ }
+
+ int size = typeNames.size();
+ String [] types = new String[size];
+ String [] variables = new String[size];
+
+ for(int i = 0; i < size; i++)
+ {
+ types[i] = typeNames.get(i).toString();
+ variables[i] = variableNames.get(i).toString();
+ }
+
+ String code = "\n";
+ if(JAVA_MODE)
+ {
+ code += createJavaConstructor(getClassName(), types, variables);
+ textArea.setCaretPosition(selectionEnd);
+ textArea.setSelectedText(code);
+ }
+ else
+ {
+ code += createCppConstructor(getClassName(), types, variables);
+ textArea.setCaretPosition(selectionEnd);
+ textArea.setSelectedText(code);
+ }
+
+ textArea.setCaretPosition(selectionEnd);
+ textArea.moveCaretPosition(selectionEnd + code.length(), true);
+ textArea.indentSelectedLines();
+}
+
+if( buffer.isReadOnly() )
+ Macros.error( view, "Buffer is read-only." );
+else
+ parseSelection();
diff --git a/jEdit/macros/Java/Get_Class_Name.bsh b/jEdit/macros/Java/Get_Class_Name.bsh
index d1ffb47..da31fe6 100644
--- a/jEdit/macros/Java/Get_Class_Name.bsh
+++ b/jEdit/macros/Java/Get_Class_Name.bsh
@@ -1,92 +1,92 @@
-/**
-Get_Class_Name.bsh - a BeanShell macro for the jEdit text editor replaces the
-selected text with the current class name.
-
-This macro walks though several steps in an attempt to guess the correct class
-name.
-
-First, it searches backwards for the nearest occurance of the keyword 'class,'
-so it should work for inner class definitions. It does not, however, do any
-fancy code parsing, so if you run this macro at any point after an inner class
-definition, it will return the name of the inner class, not the parent class.
-
-If that fails, it attempts to guess the class name from the file name; i.e. it
-would return "FooBar" if the buffer was named "FooBar.cc." If this fails (if,
-for example, the buffer is untitled), it returns an empty string.
-
-Copyright (C) 2004 Thomas Galvin - software at thomas-galvin.com
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-*/
-
-void setCaret(int selectionStart, int selectionEnd)
-{
- textArea.setCaretPosition(selectionStart);
- textArea.moveCaretPosition(selectionEnd);
-}
-
-String getClassName()
-{
- int selectionStart = textArea.getSelectionStart();
- int selectionEnd = textArea.getSelectionEnd();
-
- String text = textArea.getText();
- int index = text.lastIndexOf("class", selectionStart);
- if(index != -1)
- {
- textArea.setCaretPosition(index);
- int lineNumber = textArea.getCaretLine();
- int lineEnd = textArea.getLineEndOffset(lineNumber);
- String lineText = text.substring(index, lineEnd);
-
- StringTokenizer tokenizer = new StringTokenizer(lineText);
- tokenizer.nextToken(); //eat "class"
- if(tokenizer.hasMoreTokens())
- {
- setCaret(selectionStart, selectionEnd);
- return tokenizer.nextToken();
- }
- }
-
-
- String fileClassName = buffer.getName();
- int index = fileClassName.lastIndexOf('.');
- if(index != -1)
- {
- fileClassName = fileClassName.substring(0, index);
- if(fileClassName.toLowerCase().indexOf("untitled") == -1)
- {
- return fileClassName;
- }
- }
- setCaret(selectionStart, selectionEnd);
-
- String className = buffer.getName();
- int index = name.lastIndexOf('.');
- if(index != -1)
- {
- className = className.substring(0, index);
- if(className.toLowerCase().indexOf("untitled") == -1)
- {
- return className;
- }
- }
-
- return "";
-}
-
-String className = getClassName();
-if( buffer.isReadOnly() )
- Macros.error( view, "Buffer is read-only." );
-else if( className != null && !className.equals("") )
-{
- textArea.setSelectedText(className);
-}
+/**
+Get_Class_Name.bsh - a BeanShell macro for the jEdit text editor replaces the
+selected text with the current class name.
+
+This macro walks though several steps in an attempt to guess the correct class
+name.
+
+First, it searches backwards for the nearest occurance of the keyword 'class,'
+so it should work for inner class definitions. It does not, however, do any
+fancy code parsing, so if you run this macro at any point after an inner class
+definition, it will return the name of the inner class, not the parent class.
+
+If that fails, it attempts to guess the class name from the file name; i.e. it
+would return "FooBar" if the buffer was named "FooBar.cc." If this fails (if,
+for example, the buffer is untitled), it returns an empty string.
+
+Copyright (C) 2004 Thomas Galvin - software at thomas-galvin.com
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+*/
+
+void setCaret(int selectionStart, int selectionEnd)
+{
+ textArea.setCaretPosition(selectionStart);
+ textArea.moveCaretPosition(selectionEnd);
+}
+
+String getClassName()
+{
+ int selectionStart = textArea.getSelectionStart();
+ int selectionEnd = textArea.getSelectionEnd();
+
+ String text = textArea.getText();
+ int index = text.lastIndexOf("class", selectionStart);
+ if(index != -1)
+ {
+ textArea.setCaretPosition(index);
+ int lineNumber = textArea.getCaretLine();
+ int lineEnd = textArea.getLineEndOffset(lineNumber);
+ String lineText = text.substring(index, lineEnd);
+
+ StringTokenizer tokenizer = new StringTokenizer(lineText);
+ tokenizer.nextToken(); //eat "class"
+ if(tokenizer.hasMoreTokens())
+ {
+ setCaret(selectionStart, selectionEnd);
+ return tokenizer.nextToken();
+ }
+ }
+
+
+ String fileClassName = buffer.getName();
+ int index = fileClassName.lastIndexOf('.');
+ if(index != -1)
+ {
+ fileClassName = fileClassName.substring(0, index);
+ if(fileClassName.toLowerCase().indexOf("untitled") == -1)
+ {
+ return fileClassName;
+ }
+ }
+ setCaret(selectionStart, selectionEnd);
+
+ String className = buffer.getName();
+ int index = name.lastIndexOf('.');
+ if(index != -1)
+ {
+ className = className.substring(0, index);
+ if(className.toLowerCase().indexOf("untitled") == -1)
+ {
+ return className;
+ }
+ }
+
+ return "";
+}
+
+String className = getClassName();
+if( buffer.isReadOnly() )
+ Macros.error( view, "Buffer is read-only." );
+else if( className != null && !className.equals("") )
+{
+ textArea.setSelectedText(className);
+}
diff --git a/jEdit/macros/Java/Get_Package_Name.bsh b/jEdit/macros/Java/Get_Package_Name.bsh
index 772d8a8..418f54a 100644
--- a/jEdit/macros/Java/Get_Package_Name.bsh
+++ b/jEdit/macros/Java/Get_Package_Name.bsh
@@ -1,136 +1,136 @@
-/*
- * Get_Package_Name.bsh - a BeanShell macro script for the
- * jEdit text editor - insert package name based upon path
- * of current buffer
- * Copyright (C) 2001 John Gellene
- * jgellene at nyc.rr.com
- * http://community.jedit.org
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * Based on code contributed by Richard Wan
- *
- * $Id: Get_Package_Name.bsh 4995 2004-03-19 15:58:00Z spestov $
- *
- * Checked for jEdit 4.0 API
- *
- */
-
-boolean testClassPath()
-{
- classpath = System.getProperty("java.class.path");
- classSeparator = (File.separatorChar == '/' ? ':' : ';');
- return (classpath.indexOf(classSeparator) != -1)
- || (!classpath.endsWith("jedit.jar"));
-}
-
-
-File getCanonicalFile(File file)
-{
- try
- {
- return new File(file.getCanonicalPath());
- }
- catch(IOException e)
- {
- return new File(file.getAbsolutePath());
- }
-}
-
-File getRoot(File file)
-{
- tokens = new StringTokenizer(System.getProperty("java.class.path"),
- File.pathSeparator);
- fileSet = new Hashtable();
- while(tokens.hasMoreTokens())
- {
- String tok = tokens.nextToken();
- fileSet.put(getCanonicalFile(new File(tok)), tok);
- }
-
- while(file != null)
- {
- if(fileSet.get(getCanonicalFile(file)) != null)
- break;
- parent = file.getParent();
- file = (parent != null) ? new File(parent) : null;
- }
- return file;
-}
-
-
-String determinePackageName(String path)
-{
- pathFile = new File(buffer.getPath());
- File root = getRoot(pathFile);
- if(root == null)
- return null;
- parent = pathFile.getParent();
- packagePath = parent.substring(root.getPath().length(), parent.length());
- packagePath = packagePath.replace(File.separatorChar, '.');
- if (packagePath.endsWith("."))
- {
- packagePath = packagePath.substring(0, packagePath.length() - 1);
- }
- if (packagePath.startsWith("."))
- {
- packagePath = packagePath.substring(1, packagePath.length());
- }
- return packagePath;
-}
-
-if( buffer.isReadOnly() )
- Macros.error( view, "Buffer is read-only." );
-else
-{
- // main routine
- if(!testClassPath())
- {
- Macros.error(view, "This macro will not work when the Java interpreter\n"
- + "loads jEdit with the '-jar' command line option.");
- }
- else
- {
- result = determinePackageName(buffer.getPath());
- if(result == null)
- {
- Macros.error(view, "Could not find a package name.");
- }
- else textArea.setSelectedText(result);
- }
-}
-
-/*
- Macro index data (in DocBook format)
-
-<listitem>
- <para><filename>Get_Package_Name.bsh</filename></para>
- <abstract><para>
- Inserts a plausible Java package name for the current buffer.
- </para></abstract>
- <para>
- The macro compares the buffer's path name with the elements of the
- classpath being used by the jEdit session. An error message will be
- displayed if no suitable package name is found. This macro will not
- work if jEdit is being run as a JAR file without specifying a
- classpath. In that case the classpath seen by the macro consists
- solely of the JAR file.
- </para>
-</listitem>
-
-*/
-
-// end Get_Package_Name.bsh
-
+/*
+ * Get_Package_Name.bsh - a BeanShell macro script for the
+ * jEdit text editor - insert package name based upon path
+ * of current buffer
+ * Copyright (C) 2001 John Gellene
+ * jgellene at nyc.rr.com
+ * http://community.jedit.org
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Based on code contributed by Richard Wan
+ *
+ * $Id: Get_Package_Name.bsh 4995 2004-03-19 15:58:00Z spestov $
+ *
+ * Checked for jEdit 4.0 API
+ *
+ */
+
+boolean testClassPath()
+{
+ classpath = System.getProperty("java.class.path");
+ classSeparator = (File.separatorChar == '/' ? ':' : ';');
+ return (classpath.indexOf(classSeparator) != -1)
+ || (!classpath.endsWith("jedit.jar"));
+}
+
+
+File getCanonicalFile(File file)
+{
+ try
+ {
+ return new File(file.getCanonicalPath());
+ }
+ catch(IOException e)
+ {
+ return new File(file.getAbsolutePath());
+ }
+}
+
+File getRoot(File file)
+{
+ tokens = new StringTokenizer(System.getProperty("java.class.path"),
+ File.pathSeparator);
+ fileSet = new Hashtable();
+ while(tokens.hasMoreTokens())
+ {
+ String tok = tokens.nextToken();
+ fileSet.put(getCanonicalFile(new File(tok)), tok);
+ }
+
+ while(file != null)
+ {
+ if(fileSet.get(getCanonicalFile(file)) != null)
+ break;
+ parent = file.getParent();
+ file = (parent != null) ? new File(parent) : null;
+ }
+ return file;
+}
+
+
+String determinePackageName(String path)
+{
+ pathFile = new File(buffer.getPath());
+ File root = getRoot(pathFile);
+ if(root == null)
+ return null;
+ parent = pathFile.getParent();
+ packagePath = parent.substring(root.getPath().length(), parent.length());
+ packagePath = packagePath.replace(File.separatorChar, '.');
+ if (packagePath.endsWith("."))
+ {
+ packagePath = packagePath.substring(0, packagePath.length() - 1);
+ }
+ if (packagePath.startsWith("."))
+ {
+ packagePath = packagePath.substring(1, packagePath.length());
+ }
+ return packagePath;
+}
+
+if( buffer.isReadOnly() )
+ Macros.error( view, "Buffer is read-only." );
+else
+{
+ // main routine
+ if(!testClassPath())
+ {
+ Macros.error(view, "This macro will not work when the Java interpreter\n"
+ + "loads jEdit with the '-jar' command line option.");
+ }
+ else
+ {
+ result = determinePackageName(buffer.getPath());
+ if(result == null)
+ {
+ Macros.error(view, "Could not find a package name.");
+ }
+ else textArea.setSelectedText(result);
+ }
+}
+
+/*
+ Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>Get_Package_Name.bsh</filename></para>
+ <abstract><para>
+ Inserts a plausible Java package name for the current buffer.
+ </para></abstract>
+ <para>
+ The macro compares the buffer's path name with the elements of the
+ classpath being used by the jEdit session. An error message will be
+ displayed if no suitable package name is found. This macro will not
+ work if jEdit is being run as a JAR file without specifying a
+ classpath. In that case the classpath seen by the macro consists
+ solely of the JAR file.
+ </para>
+</listitem>
+
+*/
+
+// end Get_Package_Name.bsh
+
diff --git a/jEdit/macros/Java/Java_File_Save.bsh b/jEdit/macros/Java/Java_File_Save.bsh
index 3f2d0e8..507f555 100644
--- a/jEdit/macros/Java/Java_File_Save.bsh
+++ b/jEdit/macros/Java/Java_File_Save.bsh
@@ -1,142 +1,142 @@
-/*
- * Java_File_Save.bsh - a BeanShell macro for saving new java files.
- *
- * Copyright (C) 2004 Nicholas O'Leary nol at deferential.net
- *
- * :mode=beanshell:tabSize=3:indentSize=3:maxLineLen=0:noTabs=true:
- * :indentOnTab=true:indentOnEnter=true:folding=explicit:collapseFolds=1:
- *
- * {{{ License
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with the jEdit program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * }}}
- *
- * Notes:
- * Only the first 250 lines of the buffer are scanned for a suitable
- * class or interface declaration.
- *
- * Changes:
- * 17-May-04: Only scans if the edit mode is either 'java' or the default mode
- * : Ignores declarations that are in multiline comments
- * 08-Jun-04: If an infinite loop is hit (1000 iterations) in the comment
- * : parsing, it now opens the default save dialog, rather than
- * : just returning.
- * $Id: Java_File_Save.bsh 12063 2008-03-02 06:58:51Z k_satoda $
- */
-
-
-// Check this is a new file
-if (buffer.isNewFile() && buffer.getPath() != null)
-{
- // Only look further if the mode is 'java', or still the default
- String buffer_mode = buffer.getMode().toString();
- if (buffer_mode.equals("java") || buffer_mode.equals(jEdit.getProperty("buffer.defaultMode","")))
- {
- String fullpath = buffer.getPath();
- VFS vfs = VFSManager.getVFSForPath(fullpath);
- // Split into constituent parts
- String path = vfs.getParentOfPath(fullpath);
- String name = vfs.getFileName(fullpath);
-
- // At most, check the first 250 lines - this sounds reasonable to me
- int maxLine = Math.min(buffer.getLineCount(),250);
- import java.util.regex.Pattern;
- import java.util.regex.Matcher;
- // Build the regex - based on the offical java language spec.
- Pattern regex = Pattern.compile("^\\s*(public|protected|private|static|abstract|final|native|synchronized|transient|volatile|strictfp)?\\s*(class|interface)\\s*([^ {/]*)");
- boolean inComment = false;
- for(int i=0;i<maxLine;i++)
- {
- String txt = buffer.getLineText(i);
- int count = 0;
- // See if this line has a the start or finish of a multiline comment
- while (txt.indexOf("/*")!=-1 || txt.indexOf("*/")!=-1)
- {
- // A little paranoia on my part
- count++;
- if (count==1000)
- {
- Log.log(Log.ERROR,BeanShell.class,"Infinite loop:["+txt+"]");
- buffer.save(view,null,true);
- return;
- }
- // Look for the next starting comment if we're not in a comment
- if (!inComment)
- {
- int commentStartIndex = txt.indexOf("/*");
- if (commentStartIndex != -1)
- {
- inComment = true;
- if (commentStartIndex+2 == txt.length())
- txt = "";
- else
- txt = txt.substring(commentStartIndex+2);
- }
- }
- // Look for the next ending comment if we are in a comment
- if (inComment)
- {
- int commentEndIndex = txt.indexOf("*/");
- if (commentEndIndex != -1)
- {
- inComment = false;
- if (commentEndIndex+2 == txt.length())
- txt = "";
- else
- txt = txt.substring(commentEndIndex+2);
- } else {
- continue;
- }
- }
- }
-
- // We now know if the remainder of the line is in a comment or not
- if (!inComment)
- {
- Matcher matcher = regex.matcher(txt);
- if (matcher.matches())
- {
- // Extract the class/interface name
- name = matcher.group(3)+".java";
- break;
- }
- }
- }
-
- // Open the VFSBrowser
- String[] files = GUIUtilities.showVFSFileDialog(view,path+name,
- VFSBrowser.SAVE_DIALOG,false);
- if(files == null)
- return false;
- buffer.save(view,files[0],true);
- return;
- }
-}
-
-// This isn't a file that has been scanned, so just do a normal save
-buffer.save(view,null,true);
-
-/*
-
-Macro index data (in DocBook format)
-
- <listitem>
- <para><filename>Java_File_Save.bsh</filename></para>
- <abstract><para>Acts as a wrapper script to the Save As action. If the buffer
- is a new file, it scans the first 250 lines for a Java class or interface
- declaration. On finding one, it extracts the appropriate filename to be
- used in the Save As dialog.</para></abstract>
- </listitem>
-
-*/
+/*
+ * Java_File_Save.bsh - a BeanShell macro for saving new java files.
+ *
+ * Copyright (C) 2004 Nicholas O'Leary nol at deferential.net
+ *
+ * :mode=beanshell:tabSize=3:indentSize=3:maxLineLen=0:noTabs=true:
+ * :indentOnTab=true:indentOnEnter=true:folding=explicit:collapseFolds=1:
+ *
+ * {{{ License
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the jEdit program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * }}}
+ *
+ * Notes:
+ * Only the first 250 lines of the buffer are scanned for a suitable
+ * class or interface declaration.
+ *
+ * Changes:
+ * 17-May-04: Only scans if the edit mode is either 'java' or the default mode
+ * : Ignores declarations that are in multiline comments
+ * 08-Jun-04: If an infinite loop is hit (1000 iterations) in the comment
+ * : parsing, it now opens the default save dialog, rather than
+ * : just returning.
+ * $Id: Java_File_Save.bsh 12063 2008-03-02 06:58:51Z k_satoda $
+ */
+
+
+// Check this is a new file
+if (buffer.isNewFile() && buffer.getPath() != null)
+{
+ // Only look further if the mode is 'java', or still the default
+ String buffer_mode = buffer.getMode().toString();
+ if (buffer_mode.equals("java") || buffer_mode.equals(jEdit.getProperty("buffer.defaultMode","")))
+ {
+ String fullpath = buffer.getPath();
+ VFS vfs = VFSManager.getVFSForPath(fullpath);
+ // Split into constituent parts
+ String path = vfs.getParentOfPath(fullpath);
+ String name = vfs.getFileName(fullpath);
+
+ // At most, check the first 250 lines - this sounds reasonable to me
+ int maxLine = Math.min(buffer.getLineCount(),250);
+ import java.util.regex.Pattern;
+ import java.util.regex.Matcher;
+ // Build the regex - based on the offical java language spec.
+ Pattern regex = Pattern.compile("^\\s*(public|protected|private|static|abstract|final|native|synchronized|transient|volatile|strictfp)?\\s*(class|interface)\\s*([^ {/]*)");
+ boolean inComment = false;
+ for(int i=0;i<maxLine;i++)
+ {
+ String txt = buffer.getLineText(i);
+ int count = 0;
+ // See if this line has a the start or finish of a multiline comment
+ while (txt.indexOf("/*")!=-1 || txt.indexOf("*/")!=-1)
+ {
+ // A little paranoia on my part
+ count++;
+ if (count==1000)
+ {
+ Log.log(Log.ERROR,BeanShell.class,"Infinite loop:["+txt+"]");
+ buffer.save(view,null,true);
+ return;
+ }
+ // Look for the next starting comment if we're not in a comment
+ if (!inComment)
+ {
+ int commentStartIndex = txt.indexOf("/*");
+ if (commentStartIndex != -1)
+ {
+ inComment = true;
+ if (commentStartIndex+2 == txt.length())
+ txt = "";
+ else
+ txt = txt.substring(commentStartIndex+2);
+ }
+ }
+ // Look for the next ending comment if we are in a comment
+ if (inComment)
+ {
+ int commentEndIndex = txt.indexOf("*/");
+ if (commentEndIndex != -1)
+ {
+ inComment = false;
+ if (commentEndIndex+2 == txt.length())
+ txt = "";
+ else
+ txt = txt.substring(commentEndIndex+2);
+ } else {
+ continue;
+ }
+ }
+ }
+
+ // We now know if the remainder of the line is in a comment or not
+ if (!inComment)
+ {
+ Matcher matcher = regex.matcher(txt);
+ if (matcher.matches())
+ {
+ // Extract the class/interface name
+ name = matcher.group(3)+".java";
+ break;
+ }
+ }
+ }
+
+ // Open the VFSBrowser
+ String[] files = GUIUtilities.showVFSFileDialog(view,path+name,
+ VFSBrowser.SAVE_DIALOG,false);
+ if(files == null)
+ return false;
+ buffer.save(view,files[0],true);
+ return;
+ }
+}
+
+// This isn't a file that has been scanned, so just do a normal save
+buffer.save(view,null,true);
+
+/*
+
+Macro index data (in DocBook format)
+
+ <listitem>
+ <para><filename>Java_File_Save.bsh</filename></para>
+ <abstract><para>Acts as a wrapper script to the Save As action. If the buffer
+ is a new file, it scans the first 250 lines for a Java class or interface
+ declaration. On finding one, it extracts the appropriate filename to be
+ used in the Save As dialog.</para></abstract>
+ </listitem>
+
+*/
diff --git a/jEdit/macros/Java/Make_Get_and_Set_Methods.bsh b/jEdit/macros/Java/Make_Get_and_Set_Methods.bsh
index d4a64b5..e34857d 100644
--- a/jEdit/macros/Java/Make_Get_and_Set_Methods.bsh
+++ b/jEdit/macros/Java/Make_Get_and_Set_Methods.bsh
@@ -1,297 +1,337 @@
-/**
-Make_Get_and_Set_Functions.bsh - a BeanShell macro for
-the jEdit text editor that creates simple get() and set()
-methods for the variables on selected lines.
-
-Copyright (C) 2004 Thomas Galvin - software at thomas-galvin.com
-based on Make_Get_and_Set_Methods.bsh by John Gellene
-
-This macro will work on multiple selected lines; for instance,
-selecting
-
-<code>
-public int foo;
-public int bar;
-</code>
-
-and running the macro will produce get and set functions for both
-variables, along with comments. This macro produces c-style
-functions, unless the buffer is in java mode.
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-*/
-
-boolean JAVA_MODE = buffer.getMode().getName().equals("java");
-boolean createGetMethods = true;
-boolean createSetMethods = true;
-
-void setCaret(int selectionStart, int selectionEnd)
-{
- textArea.setCaretPosition(selectionStart);
- textArea.moveCaretPosition(selectionEnd);
-}
-
-String getClassName()
-{
- int selectionStart = textArea.getSelectionStart();
- int selectionEnd = textArea.getSelectionEnd();
-
- String text = textArea.getText();
- int index = text.lastIndexOf("class", selectionStart);
- if(index != -1)
- {
- textArea.setCaretPosition(index);
- int lineNumber = textArea.getCaretLine();
- int lineEnd = textArea.getLineEndOffset(lineNumber);
- String lineText = text.substring(index, lineEnd);
-
- StringTokenizer tokenizer = new StringTokenizer(lineText);
- tokenizer.nextToken(); //eat "class"
- if(tokenizer.hasMoreTokens())
- {
- setCaret(selectionStart, selectionEnd);
- return tokenizer.nextToken();
- }
- }
- setCaret(selectionStart, selectionEnd);
-
- String fileClassName = buffer.getName();
- int index = fileClassName.lastIndexOf('.');
- if(index != -1)
- {
- fileClassName = fileClassName.substring(0, index);
- if(fileClassName.toLowerCase().indexOf("untitled") == -1)
- {
- return fileClassName;
- }
- }
-
- return "";
-}
-
-String createJavaGetMethod(String type, String variableName)
-{
- String uppperVariable = Character.toUpperCase(variableName.charAt(0)) + variableName.substring(1, variableName.length());
- String result =
- "\t/**\n" +
- "\t * Returns the value of " + variableName + ".\n" +
- "\t */\n" +
- "\tpublic " + type + " get" + uppperVariable + "()" + "\n" +
- "\t{" + "\n" +
- "\t\treturn " + variableName + ";" + "\n" +
- "\t}\n";
-
- return result;
-}
-
-String createJavaSetMethod(String type, String variableName)
-{
- String uppperVariable = Character.toUpperCase(variableName.charAt(0)) + variableName.substring(1, variableName.length());
- String result =
- "\t/**\n" +
- "\t * Sets the value of " + variableName + ".\n" +
- "\t * @param " + variableName + " The value to assign " + variableName + ".\n" +
- "\t */\n" +
- "\tpublic void set" + uppperVariable + "(" + type + " " + variableName + ")\n" +
- "\t{" + "\n" +
- "\t\tthis." + variableName + " = " + variableName + ";" + "\n" +
- "\t}\n";
-
- return result;
-}
-
-String createCppGetMethod(String className, String type, String variableName)
-{
- String scopeIndicator = "";
- if(className != null && className.compareTo("") != 0)
- {
- scopeIndicator = className + "::";
- }
-
- String uppperVariable = Character.toUpperCase(variableName.charAt(0)) + variableName.substring(1, variableName.length());
- String result =
- "/*\n" +
- "function: get" + uppperVariable + "()\n" +
- "Returns the value of " + variableName + ".\n" +
- "*/\n" +
- type + " " + scopeIndicator + "get" + uppperVariable + "()" + "\n" +
- "{" + "\n" +
- " return " + variableName + ";" + "\n" +
- "}\n";
-
- return result;
-}
-
-String createCppSetMethod(String className, String type, String variableName)
-{
- String scopeIndicator = "";
- if(className != null && className.compareTo("") != 0)
- {
- scopeIndicator = className + "::";
- }
-
- String uppperVariable = Character.toUpperCase(variableName.charAt(0)) + variableName.substring(1, variableName.length());
- String setVariable = variableName + "Value";
- String result =
- "/*\n" +
- "function: set" + uppperVariable + "()\n" +
- "Sets the value of " + variableName + ".\n" +
- "Input: " + setVariable + " The value to assign " + variableName + ".\n" +
- "*/\n" +
- "void " + scopeIndicator + "set" + uppperVariable + "(const " + type + "& " + setVariable + ")\n" +
- "{" + "\n" +
- " " + variableName + " = " + setVariable + ";" + "\n" +
- "}\n";
-
- return result;
-}
-
-void parseSelection()
-{
- int selectionStart = textArea.getSelectionStart();
- int selectionEnd = textArea.getSelectionEnd();
-
- textArea.setCaretPosition(selectionStart);
- int startLine = textArea.getCaretLine();
-
- textArea.setCaretPosition(selectionEnd);
- int endLine = textArea.getCaretLine();
-
- StringBuffer code = new StringBuffer();
- String className = getClassName();
-
- for(int i = startLine; i <= endLine; i++)
- {
- String lineText = textArea.getLineText(i);
- if( lineText != null && !lineText.equals("") )
- {
- lineText = lineText.trim();
- if( lineText.endsWith(";") )
- {
- lineText = lineText.substring( 0, lineText.length() -1 );
- }
-
- StringTokenizer tokenizer = new StringTokenizer(lineText);
- int tokenCount = tokenizer.countTokens();
- if(tokenCount >= 2)
- {
- int numGarbage = tokenCount - 2;
- for (int i = 0; i < numGarbage; i++)
- {
- tokenizer.nextToken();
- }
-
- String type = tokenizer.nextToken();
- String variable = tokenizer.nextToken();
-
- if(createGetMethods)
- {
- String tmp = "";
- if(JAVA_MODE)
- {
- tmp = createJavaGetMethod(type, variable);
- }
- else
- {
- tmp = createCppGetMethod(className, type, variable);
- }
-
- if(tmp != null && tmp.compareTo("") != 0)
- {
- code.append(tmp + "\n");
- }
- }
-
- if(createSetMethods && lineText.indexOf("final ") == -1 && lineText.indexOf("const ") == -1)
- {
- String tmp = "\n";
- if(JAVA_MODE)
- {
- tmp = createJavaSetMethod(type, variable);
- }
- else
- {
- tmp = createCppSetMethod(className, type, variable);
- }
-
- if(tmp != null && tmp.compareTo("") != 0)
- {
- code.append(tmp + "\n");
- }
- }
- }
- }
- }
-
- textArea.setCaretPosition(selectionEnd);
- textArea.setSelectedText(code.toString());
-
- textArea.setCaretPosition(selectionEnd);
- textArea.moveCaretPosition(selectionEnd + code.length(), true);
- textArea.indentSelectedLines();
-}
-
-void displayPrompt()
-{
- String DONE = "Generate Code";
- String CANCEL = " Cancel ";
-
- JCheckBox getCheckbox = new JCheckBox("Create Get Methods", true);
- JCheckBox setCheckbox = new JCheckBox("Create Set Methods", true);
-
- JPanel checkBoxPanel = new JPanel();
- checkBoxPanel.setLayout(new BorderLayout());
- checkBoxPanel.add(getCheckbox, BorderLayout.NORTH);
- checkBoxPanel.add(setCheckbox, BorderLayout.SOUTH);
-
- JButton createButton = new JButton(DONE);
- JButton cancelButton = new JButton(CANCEL);
-
- JPanel buttonPanel = new JPanel();
- buttonPanel.setLayout(new BorderLayout());
- buttonPanel.add(createButton, BorderLayout.WEST);
- buttonPanel.add(cancelButton, BorderLayout.EAST);
-
- JPanel mainPanel = new JPanel();
- mainPanel.setLayout(new BorderLayout());
- mainPanel.add(checkBoxPanel, BorderLayout.NORTH);
- mainPanel.add(buttonPanel, BorderLayout.SOUTH);
-
- String title = "Create Get and Set Methods";
- JDialog dialog = new JDialog(view, title, false);
- dialog.setContentPane(mainPanel);
-
- actionPerformed(ActionEvent e)
- {
- if(e.getSource() == createButton)
- {
- createGetMethods = getCheckbox.isSelected();
- createSetMethods = setCheckbox.isSelected();
- parseSelection();
- }
- this.dialog.dispose();
- return;
- }
-
- createButton.addActionListener(this);
- cancelButton.addActionListener(this);
-
- dialog.pack();
- dialog.setLocationRelativeTo(view);
- dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
- dialog.setVisible(true);
- createButton.requestFocus();
-}
-
-if( buffer.isReadOnly() )
- Macros.error( view, "Buffer is read-only." );
-else
- displayPrompt();
+/**
+Make_Get_and_Set_Functions.bsh - a BeanShell macro for
+the jEdit text editor that creates simple get() and set()
+methods for the variables on selected lines.
+
+Copyright (C) 2004 Thomas Galvin - software at thomas-galvin.com
+based on Make_Get_and_Set_Methods.bsh by John Gellene
+
+This macro will work on multiple selected lines; for instance,
+selecting
+
+<code>
+public int foo;
+public int bar;
+</code>
+
+and running the macro will produce get and set functions for both
+variables, along with comments. This macro produces c-style
+functions, unless the buffer is in java mode.
+
+Modifications by Dale Anson, Dec 2008:
+
+1. Allows variable declarations to have an initial assignment, like
+<code>
+public int foo = 1;
+public int bar = 2;
+</code>
+
+2. Allows multiple variables on same line, like
+<code>
+public int foo, bar;
+</code>
+
+3. Use line separator as set in buffer properties rather than always using \n.
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+*/
+
+
+boolean JAVA_MODE = buffer.getMode().getName().equals( "java" );
+
+// use line separator from current buffer
+String LS = buffer.getStringProperty( "lineSeparator" );
+if (LS == null) {
+ // otherwise, use default line separator
+ LS = jEdit.getProperty("buffer.lineSeparator");
+}
+
+boolean createGetMethods = true;
+boolean createSetMethods = true;
+
+void setCaret( int selectionStart, int selectionEnd ) {
+ textArea.setCaretPosition( selectionStart );
+ textArea.moveCaretPosition( selectionEnd );
+}
+
+String getClassName() {
+ int selectionStart = textArea.getSelectionStart();
+ int selectionEnd = textArea.getSelectionEnd();
+
+ String text = textArea.getText();
+ int index = text.lastIndexOf( "class", selectionStart );
+ if ( index != -1 ) {
+ textArea.setCaretPosition( index );
+ int lineNumber = textArea.getCaretLine();
+ int lineEnd = textArea.getLineEndOffset( lineNumber );
+ String lineText = text.substring( index, lineEnd );
+
+ StringTokenizer tokenizer = new StringTokenizer( lineText );
+ tokenizer.nextToken(); //eat "class"
+ if ( tokenizer.hasMoreTokens() ) {
+ setCaret( selectionStart, selectionEnd );
+ return tokenizer.nextToken();
+ }
+ }
+ setCaret( selectionStart, selectionEnd );
+
+ String fileClassName = buffer.getName();
+ int index = fileClassName.lastIndexOf( '.' );
+ if ( index != -1 ) {
+ fileClassName = fileClassName.substring( 0, index );
+ if ( fileClassName.toLowerCase().indexOf( "untitled" ) == -1 ) {
+ return fileClassName;
+ }
+ }
+
+ return "";
+}
+
+String createJavaGetMethod( String type, String variableName ) {
+ String uppperVariable = Character.toUpperCase( variableName.charAt( 0 ) ) + variableName.substring( 1, variableName.length() );
+ String result =
+ "\t/**" + LS +
+ "\t * Returns the value of " + variableName + "." + LS +
+ "\t */" + LS +
+ "\tpublic " + type + " get" + uppperVariable + "() {" + LS +
+ "\t\treturn " + variableName + ";" + LS +
+ "\t}" + LS;
+
+ return result;
+}
+
+String createJavaSetMethod( String type, String variableName ) {
+ String uppperVariable = Character.toUpperCase( variableName.charAt( 0 ) ) + variableName.substring( 1, variableName.length() );
+ String result =
+ "\t/**" + LS +
+ "\t * Sets the value of " + variableName + "." + LS +
+ "\t * @param " + variableName + " The value to assign " + variableName + "." + LS +
+ "\t */" + LS +
+ "\tpublic void set" + uppperVariable + "(" + type + " " + variableName + ") {" + LS +
+ "\t\tthis." + variableName + " = " + variableName + ";" + LS +
+ "\t}" + LS;
+
+ return result;
+}
+
+String createCppGetMethod( String className, String type, String variableName ) {
+ String scopeIndicator = "";
+ if ( className != null && className.compareTo( "" ) != 0 ) {
+ scopeIndicator = className + "::";
+ }
+ if (type == null) {
+ type = "";
+ }
+ System.out.println("7 " + className + ", " + type + ", " + variableName);
+ String uppperVariable = Character.toUpperCase( variableName.charAt( 0 ) ) + variableName.substring( 1, variableName.length() );
+ System.out.println("8");
+ String result =
+ "/*" + LS +
+ "function: get" + uppperVariable + "()" + LS +
+ "Returns the value of " + variableName + "." + LS +
+ "*/" + LS +
+ type + (type.length() > 0 ? " " : "") + scopeIndicator + "get" + uppperVariable + "()" + "" + LS +
+ "{" + "" + LS +
+ " return " + variableName + ";" + "" + LS +
+ "}" + LS;
+
+ return result;
+}
+
+String createCppSetMethod( String className, String type, String variableName ) {
+ String scopeIndicator = "";
+ if ( className != null && className.compareTo( "" ) != 0 ) {
+ scopeIndicator = className + "::";
+ }
+
+ String uppperVariable = Character.toUpperCase( variableName.charAt( 0 ) ) + variableName.substring( 1, variableName.length() );
+ String setVariable = variableName + "Value";
+ String result =
+ "/*" + LS +
+ "function: set" + uppperVariable + "()" + LS +
+ "Sets the value of " + variableName + "." + LS +
+ "Input: " + setVariable + " The value to assign " + variableName + "." + LS +
+ "*/" + LS +
+ "void " + scopeIndicator + "set" + uppperVariable + "(const " + type + "& " + setVariable + ")" + LS +
+ "{" + "" + LS +
+ " " + variableName + " = " + setVariable + ";" + "" + LS +
+ "}" + LS;
+
+ return result;
+}
+
+void parseSelection() {
+ int selectionStart = textArea.getSelectionStart();
+ int selectionEnd = textArea.getSelectionEnd();
+
+ textArea.setCaretPosition( selectionStart );
+ int startLine = textArea.getCaretLine();
+
+ textArea.setCaretPosition( selectionEnd );
+ int endLine = textArea.getCaretLine();
+
+ StringBuffer code = new StringBuffer();
+ String className = getClassName();
+
+ for ( int i = startLine; i <= endLine; i++ ) {
+ // parse each line for variable declaration
+ String lineText = textArea.getLineText( i );
+ if ( lineText != null && lineText.length() > 0 ) {
+ System.out.println("1");
+ // remove leading and trailing whitespace
+ lineText = lineText.trim();
+ if ( lineText.length() == 0 ) {
+ continue; // nothing to do with this line
+ }
+
+ // remove semi-colon
+ if ( lineText.endsWith( ";" ) ) {
+ lineText = lineText.substring( 0, lineText.length() - 1 );
+ }
+ System.out.println("2");
+ // remove initial assignment if present
+ if ( lineText.indexOf( "=" ) > 0 ) {
+ lineText = lineText.substring( 0, lineText.indexOf( "=" ) );
+ }
+ System.out.println("3");
+ lineText = lineText.trim();
+ if ( lineText.length() == 0 ) {
+ continue;
+ }
+ System.out.println("4");
+ // list to hold variable names
+ ArrayList variables = new ArrayList();
+
+ // could have declaration like int x, y; so split them out into the
+ // variables array
+ if ( lineText.indexOf( "," ) > 0 ) {
+ int index = lineText.indexOf( "," ); // just after first variable name
+ String front = lineText.substring( 0, index ); // up to and including the first variable name
+ String back = lineText.substring( index ); // remaining variable names
+ lineText = front.substring( 0, front.lastIndexOf( " " ) ); // adjust remaining line text, this contains the type
+ front = front.substring( front.lastIndexOf( " " ) ).trim(); // first variable name
+ String[] backs = back.split( "," ); // remaining variable names
+ variables.add( front ); // add first variable name to the list
+ for ( String back : backs ) { // add remaining variable names to the list
+ String maybe = back.trim();
+ if ( maybe.length() > 0 ) {
+ variables.add( maybe );
+ }
+ }
+ }
+ else {
+ // just one variable declared
+ String var = lineText.substring( lineText.lastIndexOf( " " ) ).trim();
+ variables.add( var );
+ lineText = lineText.substring( 0, lineText.lastIndexOf( " " ) ).trim();
+ }
+ System.out.println("5");
+ if ( lineText.trim().length() == 0 ) {
+ continue; // no type declared for this variable
+ }
+
+ // get the variable type
+ String type = "";
+ if (lineText.lastIndexOf( " " ) > 0) {
+ type = lineText.substring( lineText.lastIndexOf( " " ) );
+ }
+ type = type.trim();
+ System.out.println("5.1");
+
+ if ( variables.size() > 0 ) {
+ code.append( LS );
+ }
+
+ // create the get and set methods for each variable
+ for ( String variable : variables ) {
+ if ( createGetMethods ) {
+ String tmp = JAVA_MODE ? createJavaGetMethod( type, variable ) : createCppGetMethod( className, type, variable );
+ if ( tmp != null && tmp.length() > 0 ) {
+ code.append( tmp ).append( LS );
+ }
+ }
+
+ if ( createSetMethods && lineText.indexOf( "final " ) == -1 && lineText.indexOf( "const " ) == -1 ) {
+ String tmp = JAVA_MODE ? createJavaSetMethod( type, variable ) : createCppSetMethod( className, type, variable );
+
+ if ( tmp != null && tmp.compareTo( "" ) != 0 ) {
+ code.append( LS ).append( tmp ).append( LS );
+ }
+ }
+ }
+ }
+ }
+
+ // move to the end of the selected text
+ textArea.setCaretPosition( selectionEnd );
+
+ // insert get/set methods
+ textArea.setSelectedText( code.toString() );
+
+ // select the inserted code and indent it
+ textArea.setCaretPosition( selectionEnd );
+ textArea.moveCaretPosition( selectionEnd + code.length(), true );
+ textArea.indentSelectedLines();
+}
+
+void displayPrompt() {
+ String DONE = "Generate Code";
+ String CANCEL = "Cancel";
+
+ JCheckBox getCheckbox = new JCheckBox( "Create Get Methods", true );
+ JCheckBox setCheckbox = new JCheckBox( "Create Set Methods", true );
+
+ JPanel checkBoxPanel = new JPanel(new BorderLayout());
+ checkBoxPanel.setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6));
+ checkBoxPanel.add( getCheckbox, BorderLayout.NORTH );
+ checkBoxPanel.add( setCheckbox, BorderLayout.SOUTH );
+
+ JButton createButton = new JButton( DONE );
+ JButton cancelButton = new JButton( CANCEL );
+
+ JPanel buttonPanel = new JPanel(new GridLayout(1, 2, 6, 0));
+ buttonPanel.setBorder(BorderFactory.createEmptyBorder(11, 11, 11, 11));
+ buttonPanel.add( createButton, BorderLayout.WEST );
+ buttonPanel.add( cancelButton, BorderLayout.EAST );
+
+ JPanel mainPanel = new JPanel();
+ mainPanel.setLayout( new BorderLayout() );
+ mainPanel.add( checkBoxPanel, BorderLayout.NORTH );
+ mainPanel.add( buttonPanel, BorderLayout.SOUTH );
+
+ String title = "Create Get and Set Methods";
+ JDialog dialog = new JDialog( view, title, false );
+ dialog.setContentPane( mainPanel );
+
+ actionPerformed( ActionEvent e ) {
+ if ( e.getSource() == createButton ) {
+ createGetMethods = getCheckbox.isSelected();
+ createSetMethods = setCheckbox.isSelected();
+ parseSelection();
+ }
+ this.dialog.dispose();
+ return ;
+ }
+
+ createButton.addActionListener( this );
+ cancelButton.addActionListener( this );
+
+ dialog.pack();
+ dialog.setLocationRelativeTo( view );
+ dialog.setDefaultCloseOperation( JDialog.DISPOSE_ON_CLOSE );
+ dialog.setVisible( true );
+ createButton.requestFocus();
+}
+
+if ( buffer.isReadOnly() )
+ Macros.error( view, "Buffer is read-only." );
+else
+ displayPrompt();
\ No newline at end of file
diff --git a/jEdit/macros/Java/Preview_JavaDoc_Of_Current_Buffer.bsh b/jEdit/macros/Java/Preview_JavaDoc_Of_Current_Buffer.bsh
index 10f283a..0533af4 100644
--- a/jEdit/macros/Java/Preview_JavaDoc_Of_Current_Buffer.bsh
+++ b/jEdit/macros/Java/Preview_JavaDoc_Of_Current_Buffer.bsh
@@ -1,824 +1,824 @@
-/*
- * Preview_JavaDoc_Of_Current_Buffer.bsh
- * version 1.8
- * A BeanShell macro script for the jEdit text editor
- * :tabSize=2:indentSize=2:noTabs=true:
- * :folding=explicit:collapseFolds=1:
- *
- * $Header$
- * Copyright (C) 2001-2003 Tom Gutwin
- * tgutwin at webarts.bc.ca
- *
- * - Macro to create and preview the JavaDocs for the current buffer
- * - It tries to figure everything out for you.
- * - Map this macro to it to a button on the button bar and away you go!
- *
- * ************************************************************************
- * ** Requires the Console plugin and the InfoViewer plugin
- * ** ALSO
- * ** Requires Downloading of the different doclets if you are going to use
- * them and pdfReaderCommand if using the pdfDoclet.
- * ***********************************************************************
- * ** Features
- * ***********************************************************************
- *
- * - most of the settings to customize how this macro performs are set with
- * boolean flags (see code below). The following features are some of the
- * features already selectable/customizable
- *
- * - javadoc of current buffer OR current buffer's package
- * set the 'doFullPackage' boolean flag in the macro code
- * You can then save a copy of this macro as a different name
- * for example... Preview_JavaDoc_Of_Current_Buffers_Package.bsh
- *
- * - default Doclet is the standard Java Doclet
- * (the user can change the default doclet to use by changing the XXXX
- * variable in this macro)
- *
- * - When this macro starts, a doclet choice dialog is presented.
- * this dialog can be bypassed by setting 'showDocletDialog' to false
- * see the code below
- *
- * - Many of the standard Doclet commandline parms are preset with some
- * defaults... header, footer etc.
- * They are all controlled via boolean flags in the code
- * Switch them on/off as you like.
- *
- * - Includes the ability to use 'user selectable' doclets
- * The following are already built in. (you just have to go get the doclet)
- * > the DocBook doclet - dbdoclet http://www.michael-a-fuchs.de
- * > the Bouvard Doclet - http://web.tiscali.it/no-redirect-tiscali/farello/bp/intro.html
- * > the XMLDoclet - http://
- * > the pdfdoclet (Java API to PDF) - http://sourceforge.net/projects/pdfdoclet
- * > others
- *
- * - easy selection of output dir (defaults to system temp dir)
- * set with the 'outputDir' var in the macro code
- *
- * - other standard doclets parameters have been supervised by variables.
- * see below for adding extra classpath, source path, title, header, footer
- * MORE below
- *
- * ************************************************************************
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with the jEdit program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-USA.
- */
-
-//{{{ _getClassName() method
-String _getClassName()
-{
- /*
- * Get_Class_Name.bsh - a BeanShell macro script for the
- * jEdit text editor - gets class name from buffer name
- * Copyright (C) 2001 John Gellene
- * jgellene at nyc.rr.com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with the jEdit program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id: Preview_JavaDoc_Of_Current_Buffer.bsh 10711 2007-09-22 09:12:15Z kpouer $
- */
- name = buffer.getName();
- index = name.lastIndexOf('.');
- return (index != -1 ? name.substring(0, index) : name);
-} //}}}
-
-//{{{ _determinePackageName() method
-/** Trys to obtain the package name from the file **/
-String _determinePackageName()
-{
- packageName = "";
- text = buffer.getText(0, buffer.getLength());
- //String lineSep = System.getProperty("line.separator");
- /* look for the word package.
- It must be at the start of a line.
- It should not be within comments. (how can we easily determine this???)
- */
- packageWord = text.indexOf("package");
- // If it is not on the first line of the file
- // then look for the 1st occurence of "package" on its own line
- if (packageWord > 0)
- packageWord = text.indexOf("\npackage");
-
- if (packageWord != -1)
- {
- packageEOLine = text.indexOf(";", packageWord);
- if (packageEOLine!= -1)
- packageName = text.substring(packageWord+8,packageEOLine);
- }
- return packageName;
-} //}}}
-
-//{{{ _chooseADir() method
-/** Chooses a directory and returns the path. **/
-/* Use this method if you want to customize the macro to choose
- output and input directorys for things */
-String _chooseADir(String dialogTitle, String startDir)
-{
- String retVal = "";
- JFileChooser chooser = new JFileChooser(startDir);
- chooser.setDialogTitle(dialogTitle);
- chooser.setMultiSelectionEnabled(false);
- chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
- if(chooser.showDialog(view, "Okay") == JFileChooser.APPROVE_OPTION)
- {
- retVal = chooser.getSelectedFile().getAbsolutePath();
- }
- return retVal;
-} //}}}
-
-//{{{ _infoView() method
-void _infoView(View view, String urlStr)
-{
- // first, check if the plugin is installed.
- boolean version1 = false;
- //With version 1.0 of the plugin ... the name changed to
- //infoviewer.InfoViewerPlugin
- if(jEdit.getPlugin("InfoViewerPlugin") == null)
- {
- if(jEdit.getPlugin("infoviewer.InfoViewerPlugin") == null)
- {
- Macros.error(view,"You must install the InfoViewerPlugin"
- + " to use this macro.");
- return;
- }
- version1 = true;
- }
- try
- {
- // API change with version 1.0 of the InfoViewer
- if (version1)
- jEdit.getPlugin("infoviewer.InfoViewerPlugin").
- openURL(view, urlStr);// version 1.0
- else
- jEdit.getPlugin("InfoViewerPlugin").
- sendURL(new URL(urlStr), view); // pre 1.0
- }
- catch (MalformedURLException mu)
- {
- Macros.error(view,"Cannot find the url " + urlStr);
- }
-} //}}}
-
-//{{{ _returnSystemCommand() method
-String _returnSystemCommand(View view, String command)
-{
- //{{{ first, check if the plugin is installed.
- if(jEdit.getPlugin("console.ConsolePlugin") == null)
- {
- Macros.error(view,"You must install the Console plugin"
- + " to use this macro.");
- return;
- } //}}}
-
- //Macros.message(view, "Getting window manager.");
- manager = view.getDockableWindowManager();
- _console = (console.Console) manager.getDockable("console");
- if (_console == null)
- {
- manager.showDockableWindow("console");
- _console = (console.Console) manager.getDockable("console");
- }
- outputPane = _console.getOutputPane();
-
- text = outputPane.getText();
- textLength = text.length();
- runInSystemShell(view, command);
- waitForConsole(view);
- text = outputPane.getText();
- textLength = text.length();
- text = outputPane.getText().substring(textLength);
- return text;
-} //}}}
-
-//{{{ _ensureFolderExists() method
-/**
- * Ensures that a folder exists.
- * <TABLE WIDTH="100%" BORDER="0" CELLSPACING="1" CELLPADDING="2">
- * <TR><TD COLSPAN="2">
- * <H2>Ensures that a folder exists</H2>
- * </TD></TR>
- *
- * <TR><TD COLSPAN="2"> <BR>
- * <B>Description:</B><BR>
- * use it like this:
- * <br> _ensureFolderExists(new File(fileName).getParentFile());
- * </TD></TR>
- * </TABLE>
- *
- * @param folder The File object to check.
- **/
-void _ensureFolderExists(File folder)
-{
- if ( folder != null && ! folder.exists() )
- {
- _ensureFolderExists(folder.getParentFile());
- folder.mkdir();
- }
-} //}}}
-
-
-String versionStr = "1.8";
-String SYSTEM_FILE_SEPERATOR = File.separator;
-String SYSTEM_TEMP_DIR = System.getProperty("java.io.tmpdir");
-//SYSTEM_TEMP_DIR = "/tmp";
-String SYSTEM_PATH_SEPERATOR = System.getProperty("path.separator");
-
-// first, check if the plugin is installed.
-if(jEdit.getPlugin("console.ConsolePlugin") == null ||
- (jEdit.getPlugin("InfoViewerPlugin") == null) &&
- (jEdit.getPlugin("infoviewer.InfoViewerPlugin") == null))
-{
- if(jEdit.getPlugin("console.ConsolePlugin") == null)
- Macros.error(view,"You must install the Console plugin"
- + " to use this macro.");
- else
- Macros.error(view,"You must install the InfoViewerPlugin plugin"
- + " to use this macro.");
-}
-else
-{
-
- String currBufferPath = buffer.getPath();
-
- //Macros.message(view,"Current Buffer Path:\n"+currBufferPath);
- if (currBufferPath.endsWith(".java"))
- {
- /* Store Some class/package/path info for use later */
- // Get the Package name
- String packName = _determinePackageName();
-
- // Get the Class Name
- String className = _getClassName();
-
- /* ********************************************************************** */
- /* Change the Following Vars to personalize things */
- /* You should also Change the Header and Botton javadoc text down below */
- /* ********************************************************************** */
- // header message
- String yourProductUrlStr = "http://www.yourProductURL.goes.here";
- String yourProductNameStr = "My Java Product Name";
-
- // header message
- String yourBottomStr = "Released under a GNU Public License.";
-
- // PDFDoclet outputfilename
- String pdfDocletOutputFilename = "PDFDoclet.Output.pdf";
-
- // PDFDoclet outputfilename
- String pdfReaderCommand = "acro";
-
- // Output directory .... set this to somewhere permanent if you want
- String outputDir = SYSTEM_TEMP_DIR;
-
- // Allow choice of the output dir at runtime
- boolean chooseOutputDir = false;
-
- // This macro attempts to get the source search path right
- // if its not getting it... this var gets added to the Javadoc search path
- String extraSourceDir = "";
-
- // This macro doesn't do much with the javadoc classpath
- // if its not getting it... this var gets added to the Javadoc classpath
- String extraClassesDir = "";
-
- // flag to do the Javadoc on the package instead of just the file
- // Set this to true then save this macro with a new name
- // ie... Preview_Javadoc_Of_Current_Package.bsh
- boolean doFullPackage = false;
-
- // set to false to default to the standard java doclet
- boolean showDocletDialog = true;
-
- /* Set some default options for the javadoc command */
- /* change these to suit how you like your output to show up */
- /* better yet... make a little dialog for input at runtime */
- int showOnlyLevel = 3; // protected is the default
- String[] showOnlyStr = {"-public ","-protected ","-package ","-private"};
-
- /* some (not All) standard doclet options */
- /* ************************************** */
- // if you want one of the following options...
- // set the corresponding flag to true
- boolean[] optionFlags = {false,false,false,false,false,
- false,false,false,false};
- String[] optionStrs = {"-use ","-version ","-author ","-nosince","-notree ",
- "-noindex ","-nohelp ","-nodeprecated ","-verbose"};
-
- // beware OS/2 users...
- // ALL the following options break the IBM 1.3.0 JDK Javadoc tool
- // don't ask me?
- boolean addWindowTitle = true;
- StringBuffer windowTitle = new StringBuffer("-windowtitle \"Javadoc for");
- windowTitle.append((doFullPackage?"package ":"class "));
- windowTitle.append(className);
- windowTitle.append("\" ");
-
- /* DocTitle Text */
- boolean addDocTitle = true;
- StringBuffer docTitle = new StringBuffer("-doctitle \"");
- docTitle.append("Your Document Title here Javadoc API");
- docTitle.append("\" ");
-
- /* Header Text */
- boolean addHeader = true;
- StringBuffer header = new StringBuffer("-header \"");
- header.append("<B><A href=\"");
- header.append(yourProductUrlStr);
- header.append("\">");
- header.append(yourProductNameStr);
- header.append("</A></B>");
- header.append("<BR>Version xx.xx.xx");
- // Format the current time.
- java.text.SimpleDateFormat formatter
- = new java.text.SimpleDateFormat ("yyyy.MMMMM.dd 'at' hh:mm:sszzz");
- java.util.Date currentTime_1 = new java.util.Date();
- String dateString = formatter.format(currentTime_1);
- header.append("<BR><font size=-1>");
- header.append(dateString);
- header.append("</font>\" ");
-
- /* Footer Text */
- boolean addFooter = true;
- StringBuffer footer = new StringBuffer("-footer \"");
- footer.append("Produced Using the <A href=\"http://www.jedit.org\">");
- footer.append("jEdit</A><BR>Preview Javadoc Beanshell Macro.<BR>");
- footer.append("Copyright © 2001-2003, ");
- footer.append("<A href=\"http://www.webarts.bc.ca>\"");
- footer.append("Tom B. Gutwin</A>");
- footer.append("\" ");
-
- /* Bottom Text */
- boolean addBottom = true;
- StringBuffer bottom = new StringBuffer("-bottom \"");
- bottom.append(yourBottomStr);
- bottom.append("\" ");
-
- /*********************************************************************** */
- /* All users setting now complete */
- /*********************************************************************** */
-
-
- // Store the directory where the buffer file lives
- String savedBufferdir = currBufferPath.substring(0,
- currBufferPath.length()-6-className.length());
-
- // build the full package.classname
- StringBuffer fullClassName = new StringBuffer();
- if (packName != null && !packName.equals(""))
- {
- fullClassName.append(packName);
- fullClassName.append(".");
- }
- fullClassName.append(className);
-
- /* Javadoc needs the file to live in a directory structure */
- /* named like its Package name */
- // If needed... copy the file to the temp dir into its package dir */
- String currBufferdir = savedBufferdir;
- StringBuffer tmpBufferName = new StringBuffer(SYSTEM_TEMP_DIR);
- if (packName != null && !packName.equals("") &&
- savedBufferdir.indexOf(
- packName.replace('.',File.separatorChar).trim()) == -1 )
- {
- // The buffer file is not in an appropriate named dir
- // copy and work on it in temp
- if (!SYSTEM_TEMP_DIR.endsWith(SYSTEM_FILE_SEPERATOR))
- tmpBufferName.append(SYSTEM_FILE_SEPERATOR);
- _ensureFolderExists(new File(tmpBufferName.toString() +
- packName.replace('.', File.separatorChar).trim()));
- tmpBufferName.append(fullClassName.toString().
- replace('.', File.separatorChar).trim());
- tmpBufferName.append(".java");
- //Macros.message(view, "Saving "+tmpBufferName.toString());
- buffer.save(view, tmpBufferName.toString(), false);
-
- // the rest of the macro uses the currBufferdir variable
- currBufferPath = tmpBufferName.toString();
- currBufferdir = currBufferPath.substring(0,
- currBufferPath.length()-6-className.length());
- }
-
- // some debug statements
- //Macros.message(view,"Package Name ="+packName);
- //Macros.message(view,"fullClassName ="+fullClassName);
- //Macros.message(view,"Buffer Path ="+currBufferPath);
- //Macros.message(view,"Buffer Dir ="+currBufferdir);
-
-
- /* ************************************************* */
- /* *********** On with the Processing ************* */
- Object[] options = { "Standard Java Doclet", "Bouvard Doclet",
- "DocBook Doclet", "XML Doclet", "PDF Doclet" };
- String[] docletClassName = { "", "bp.doclet.Bouvard",
- "com.mf.doclet.docbook.DocBookDoclet",
- "codeinsight.xmldoclet.XMLDoclet",
- "com.tarsec.javadoc.pdfdoclet.PDFDoclet"};
- String[] docletClassPath = { "", "Bouvard.jar", "dbdoclet.jar",
- "xmldoclet.jar",
- "pdfdoclet.jar:itext.jar:/usr/lib/pkgs" };
- String PDFDocletConfigPropertiesFile = "pdfdoclet.config.properties";
- // Set the DEFAULT Doclet to the JavaDoclet
- String proceed = options[0];
-
- /* Shows a Doclet Selection Dialog */
- if (showDocletDialog)
- proceed = JOptionPane.showInputDialog(view,
- "Choose the Doclet to use for previewing the"+
- "\n" + className + " JavaDocs."+
- "\n(Bypass this dialog... set "+
- "'showDocletDialog=false;' in the macro)",
- "JavaDoc Buffer Macro - version "+versionStr,
- JOptionPane.QUESTION_MESSAGE, null, options,
- options[0]);
-
- if (proceed != null)
- {
- // this is where you could use the _chooseADir(String startDir) method
- // to choose an output dir at runtime.
- if (chooseOutputDir)
- outputDir = _chooseADir("Please Choose an Output Directory.",outputDir);
-
- docletChoice = 0;
- for (int choiceNum = 0; choiceNum < options.length;choiceNum++)
- {
- if (((String)proceed).equals((String)options[choiceNum]))
- {
- docletChoice = choiceNum;
- choiceNum = options.length;
- }
- }
-
- // The currBufferSrcDir expects the current buffer to be in a subDirectory
- // path the same as the package name
- // THIS is definitely NOT always the case
- String currBufferSrcDir = currBufferPath.substring(0,
- currBufferPath.length()-fullClassName.toString().length()-5);
-
- if(outputDir != null && !outputDir.equals(""))
- {
- // you might need some of the follwing if you want to add some
- // commandline parms
- String jedit_userdir=System.getProperty("user.home") +
- SYSTEM_FILE_SEPERATOR +".jedit";
- String jedit_homedir=jEdit.getJEditHome();
- String currClassPath=System.getProperty("java.class.path");
- String java_home=System.getProperty("java.home");
-
- // Construct the command which will be executed
- StringBuilder command = new StringBuilder(java_home);
- if (java_home.toLowerCase().endsWith("jre"))
- command.append(File.separator).append("..");
- command.append(File.separator).append("bin");
- command.append(File.separator).append("javadoc ");
-
- if (!((String)proceed).equals((String)options[0]))
- {
- //{{{ general parms for 'other' doclets
- command.append("-doclet \"");
- command.append(docletClassName[docletChoice]);
- command.append("\" ");
- command.append("-docletpath \"");
- command.append(jedit_userdir);
- command.append(SYSTEM_FILE_SEPERATOR);
- command.append("jars");
- command.append(SYSTEM_FILE_SEPERATOR);
- command.append(docletClassPath[docletChoice]);
- command.append("\" ");
- //}}}
-
- //{{{ Bouvard Doclet
- // This assumes the Bouvard.jar already exists
- // in the jeditUser/jars dir
- if (((String)proceed).equals((String)options[1]))
- {
- /* Specify the output dir */
- command.append("-d \"");
- command.append(outputDir);
- command.append("\" ");
- } //}}}
-
- //{{{ the DocBookDoclet has an extra parm
- if (((String)proceed).equals((String)options[2]))
- {
- command.append("-properties \"");
- command.append(jedit_userdir);
- command.append(SYSTEM_FILE_SEPERATOR);
- command.append("macros");
- command.append(SYSTEM_FILE_SEPERATOR);
- command.append("Java");
- command.append(SYSTEM_FILE_SEPERATOR);
- command.append("dbdoclet-xml.properties\" ");
- } //}}}
-
- //{{{ the XMLDoclet has an extra parm
- if (((String)proceed).equals((String)options[3]))
- {
- /* Specify the output dir */
- //command.append("-d \"");
- //command.append(outputDir);
- //command.append("\" ");
- } //}}}
-
- //{{{ the PDFDoclet has an extra parm
- if (((String)proceed).equals((String)options[4]))
- {
- command.append("-pdf \"");
- command.append(outputDir);
- command.append(SYSTEM_FILE_SEPERATOR);
- command.append(pdfDocletOutputFilename);
- command.append("\" ");
- if (PDFDocletConfigPropertiesFile != null
- &&!PDFDocletConfigPropertiesFile.equals(""))
- {
- command.append(" -workdir \"");
- command.append(outputDir);
- command.append("\" ");
- command.append("-config \"");
- command.append(jedit_userdir);
- command.append(SYSTEM_FILE_SEPERATOR);
- command.append("macros");
- command.append(SYSTEM_FILE_SEPERATOR);
- command.append("Java");
- command.append(SYSTEM_FILE_SEPERATOR);
- command.append(PDFDocletConfigPropertiesFile);
- command.append("\"");
- }
- } //}}}
-
- }
- else
- {
- //{{{ standard doclet parms
- if (addWindowTitle)
- command.append(windowTitle.toString());
- if (addDocTitle)
- command.append(docTitle.toString());
- if (addHeader)
- command.append(header.toString());
- if (addFooter)
- command.append(footer.toString());
- if (addBottom)
- command.append(bottom.toString());
-
- /* add the on/off options */
- for (int opt = 0; opt <optionFlags.length; opt++)
- {
- if (optionFlags[opt])
- command.append(optionStrs[opt]);
- }
-
- /* Specify the output dir */
- command.append("-d \"");
- command.append(outputDir);
- command.append("\" ");
-
- //}}}
-
- }
-
- /* Set the Level of detail to show */
- command.append(" ");
- command.append(showOnlyStr[showOnlyLevel]);
-
- //{{{ if not found add your source dir to the 'extraClassesdir' var
- command.append(" -classpath \"");
- command.append(SYSTEM_TEMP_DIR);
- command.append(SYSTEM_PATH_SEPERATOR);
- command.append(System.getProperty("java.class.path"));
- command.append(SYSTEM_PATH_SEPERATOR);
- command.append(extraClassesDir);
- command.append("\" ");
- //}}}
-
- /* **** Done with the options ***** */
- /* Specify the package or file name */
- if (doFullPackage && packName != null && !packName.equals(""))
- {
- /* Guess where the package source is located */
- /* if not found... add your source dir to the 'extraSourcedir' var */
- command.append("-sourcepath \"");
- command.append(savedBufferdir);
- command.append(SYSTEM_PATH_SEPERATOR);
- command.append(currBufferSrcDir);
- command.append(SYSTEM_PATH_SEPERATOR);
- command.append(currBufferSrcDir);
- command.append(SYSTEM_FILE_SEPERATOR);
- command.append("..");
- command.append(SYSTEM_PATH_SEPERATOR);
- command.append(currBufferSrcDir);
- command.append(SYSTEM_FILE_SEPERATOR);
- command.append("..");
- command.append(SYSTEM_FILE_SEPERATOR);
- command.append("..");
- command.append(SYSTEM_PATH_SEPERATOR);
- command.append(currBufferSrcDir);
- command.append(SYSTEM_FILE_SEPERATOR);
- command.append("..");
- command.append(SYSTEM_FILE_SEPERATOR);
- command.append("..");
- command.append(SYSTEM_FILE_SEPERATOR);
- command.append("..");
- command.append(SYSTEM_PATH_SEPERATOR);
- command.append(currBufferSrcDir);
- command.append(SYSTEM_FILE_SEPERATOR);
- command.append("..");
- command.append(SYSTEM_FILE_SEPERATOR);
- command.append("..");
- command.append(SYSTEM_FILE_SEPERATOR);
- command.append("..");
- command.append(SYSTEM_FILE_SEPERATOR);
- command.append("..");
- command.append(SYSTEM_PATH_SEPERATOR);
- command.append(currBufferdir);
- command.append(SYSTEM_PATH_SEPERATOR);
- command.append(extraSourceDir);
- command.append("\" ");
-
- command.append(packName);
- }
- else
- {
- //{{{ add the base sourcepath
- command.append("-sourcepath \"");
- command.append(savedBufferdir);
- command.append(SYSTEM_PATH_SEPERATOR);
- command.append(currBufferSrcDir);
- command.append(SYSTEM_PATH_SEPERATOR);
- command.append(currBufferdir);
- command.append(SYSTEM_PATH_SEPERATOR);
- command.append(extraSourceDir);
- command.append("\" ");
- //}}}
-
- //{{{ now add the file to javadoc
- command.append("\"");
- command.append(currBufferPath);
- command.append("\"");
- //}}}
-
- }
-System.out.println("****************************************************************");
-System.out.println(command.toString());
-System.out.println("****************************************************************");
- retVal = _returnSystemCommand(view, command.toString());
- if (retVal.indexOf("error") == -1)
- {
-
- // Build the url for the Viewer
- // If you don't want to use the InfoViewer plugin...
- // easy, change the implementation in this macros _infoView method
- StringBuffer urlStr = new StringBuffer();
- urlStr.append("file:///");
- urlStr.append(outputDir.replace('\\', '/').trim());
- if (!outputDir.endsWith(SYSTEM_FILE_SEPERATOR))
- urlStr.append("/");
- if (doFullPackage)
- {
- urlStr.append("index.html");
- }
- else
- {
- if (packName != null && !packName.equals(""))
- {
- urlStr.append(packName.replace('.', '/').trim());
- urlStr.append("/");
- }
- //Macros.message(view, packName);
- urlStr.append(className);
- urlStr.append(".html");
- //Macros.message(view, urlStr.toString());
- }
-
- // now which viewer (standard or Pecuchet)
- if (!showDocletDialog || ((String)proceed).equals((String)options[0]))
- _infoView(view, urlStr.toString());
-
- else if (((String)proceed).equals((String)options[1]))
- {
- // Bouvard Browser
- // This assumes the Pecuchet.jar already exists
- // and xerces is in the classpath already
- StringBuffer classPath = new StringBuffer("\"");
- classPath.append(jedit_userdir);
- classPath.append(SYSTEM_FILE_SEPERATOR);
- classPath.append("jars");
- classPath.append(SYSTEM_FILE_SEPERATOR);
- classPath.append("Pecuchet.jar");
- classPath.append(SYSTEM_PATH_SEPERATOR);
- classPath.append(jedit_homedir);
- classPath.append(SYSTEM_FILE_SEPERATOR);
- classPath.append("jars");
- classPath.append(SYSTEM_FILE_SEPERATOR);
- classPath.append("Pecuchet.jar");
- classPath.append(SYSTEM_PATH_SEPERATOR);
- classPath.append(currClassPath);
- classPath.append("\"");
-
- StringBuffer bViewerCommand = new StringBuffer("java -classpath ");
- bViewerCommand.append(classPath);
- bViewerCommand.append(" ");
- bViewerCommand.append("-Dorg.xml.sax.driver=");
- bViewerCommand.append("org.apache.xerces.parsers.SAXParser");
- bViewerCommand.append(" ");
- bViewerCommand.append("bp.app.Main ");
- bViewerCommand.append(outputDir);
- if (!outputDir.endsWith(SYSTEM_FILE_SEPERATOR))
- bViewerCommand.append(SYSTEM_FILE_SEPERATOR);
- bViewerCommand.append("data.bou &");
- retVal = _returnSystemCommand(view, bViewerCommand.toString());
- StringBuffer macroMessage =
- new StringBuffer("When the Pecuchet browser starts.\n");
- macroMessage.append("Open file: ");
- macroMessage.append(outputDir);
- if (!outputDir.endsWith(SYSTEM_FILE_SEPERATOR))
- macroMessage.append(SYSTEM_FILE_SEPERATOR);
- macroMessage.append("data.bou");
- //Macros.message(view, macroMessage.toString());
- }
- else if (((String)proceed).equals((String)options[2]))
- {
- // XML Doclet
- // Use a new jEdit Buffer
- StringBuffer newFile = new StringBuffer(outputDir);
- if (!outputDir.endsWith(SYSTEM_FILE_SEPERATOR))
- newFile.append(SYSTEM_FILE_SEPERATOR);
- newFile.append("Reference.xml");
- Buffer newTmpBuffer = jEdit.openFile(view,newFile.toString());
- }
- else if (((String)proceed).equals((String)options[3]))
- {
- // XML Doclet
- // Use a new jEdit Buffer
- StringBuffer newFile = new StringBuffer(outputDir);
- if (!outputDir.endsWith(SYSTEM_FILE_SEPERATOR))
- newFile.append(SYSTEM_FILE_SEPERATOR);
- newFile.append("output.xml");
- Buffer newTmpBuffer = jEdit.openFile(view,newFile.toString());
- }
- else if (((String)proceed).equals((String)options[4]))
- {
- // pdf Doclet
- StringBuffer pdfViewerCommand = new StringBuffer(pdfReaderCommand);
- pdfViewerCommand.append(" ");
- pdfViewerCommand.append(outputDir);
- pdfViewerCommand.append(SYSTEM_FILE_SEPERATOR);
- pdfViewerCommand.append(pdfDocletOutputFilename);
- retVal = _returnSystemCommand(view, pdfViewerCommand.toString());
- }
- else
- {
- // put the viewers for other doclets here
- }
- }
- else
- Macros.error(view, "Javadoc did NOT complete successfully. " +
- "See the console output");
- }
- }
- }
- else
- Macros.error(view, "Current Buffer does NOT appear to be a Java File");
-}
-
-/*
-
-Macro index data (in DocBook format)
-
- <listitem>
- <para><filename>Preview_Javadoc_of_Buffer.bsh</filename></para>
- <abstract><para>
- Create and display API documentation for the current buffer.
- </para></abstract>
- <para>
- The macro includes various configuration variables you can change; see the comment at the beginning of the macro source for details.
- </para>
- </listitem>
-
-*/
-
-// end Preview_JavaDoc_of_Buffer.bsh
-
+/*
+ * Preview_JavaDoc_Of_Current_Buffer.bsh
+ * version 1.8
+ * A BeanShell macro script for the jEdit text editor
+ * :tabSize=2:indentSize=2:noTabs=true:
+ * :folding=explicit:collapseFolds=1:
+ *
+ * $Header$
+ * Copyright (C) 2001-2003 Tom Gutwin
+ * tgutwin at webarts.bc.ca
+ *
+ * - Macro to create and preview the JavaDocs for the current buffer
+ * - It tries to figure everything out for you.
+ * - Map this macro to it to a button on the button bar and away you go!
+ *
+ * ************************************************************************
+ * ** Requires the Console plugin and the InfoViewer plugin
+ * ** ALSO
+ * ** Requires Downloading of the different doclets if you are going to use
+ * them and pdfReaderCommand if using the pdfDoclet.
+ * ***********************************************************************
+ * ** Features
+ * ***********************************************************************
+ *
+ * - most of the settings to customize how this macro performs are set with
+ * boolean flags (see code below). The following features are some of the
+ * features already selectable/customizable
+ *
+ * - javadoc of current buffer OR current buffer's package
+ * set the 'doFullPackage' boolean flag in the macro code
+ * You can then save a copy of this macro as a different name
+ * for example... Preview_JavaDoc_Of_Current_Buffers_Package.bsh
+ *
+ * - default Doclet is the standard Java Doclet
+ * (the user can change the default doclet to use by changing the XXXX
+ * variable in this macro)
+ *
+ * - When this macro starts, a doclet choice dialog is presented.
+ * this dialog can be bypassed by setting 'showDocletDialog' to false
+ * see the code below
+ *
+ * - Many of the standard Doclet commandline parms are preset with some
+ * defaults... header, footer etc.
+ * They are all controlled via boolean flags in the code
+ * Switch them on/off as you like.
+ *
+ * - Includes the ability to use 'user selectable' doclets
+ * The following are already built in. (you just have to go get the doclet)
+ * > the DocBook doclet - dbdoclet http://www.michael-a-fuchs.de
+ * > the Bouvard Doclet - http://web.tiscali.it/no-redirect-tiscali/farello/bp/intro.html
+ * > the XMLDoclet - http://
+ * > the pdfdoclet (Java API to PDF) - http://sourceforge.net/projects/pdfdoclet
+ * > others
+ *
+ * - easy selection of output dir (defaults to system temp dir)
+ * set with the 'outputDir' var in the macro code
+ *
+ * - other standard doclets parameters have been supervised by variables.
+ * see below for adding extra classpath, source path, title, header, footer
+ * MORE below
+ *
+ * ************************************************************************
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the jEdit program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+USA.
+ */
+
+//{{{ _getClassName() method
+String _getClassName()
+{
+ /*
+ * Get_Class_Name.bsh - a BeanShell macro script for the
+ * jEdit text editor - gets class name from buffer name
+ * Copyright (C) 2001 John Gellene
+ * jgellene at nyc.rr.com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the jEdit program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id: Preview_JavaDoc_Of_Current_Buffer.bsh 10711 2007-09-22 09:12:15Z kpouer $
+ */
+ name = buffer.getName();
+ index = name.lastIndexOf('.');
+ return (index != -1 ? name.substring(0, index) : name);
+} //}}}
+
+//{{{ _determinePackageName() method
+/** Trys to obtain the package name from the file **/
+String _determinePackageName()
+{
+ packageName = "";
+ text = buffer.getText(0, buffer.getLength());
+ //String lineSep = System.getProperty("line.separator");
+ /* look for the word package.
+ It must be at the start of a line.
+ It should not be within comments. (how can we easily determine this???)
+ */
+ packageWord = text.indexOf("package");
+ // If it is not on the first line of the file
+ // then look for the 1st occurence of "package" on its own line
+ if (packageWord > 0)
+ packageWord = text.indexOf("\npackage");
+
+ if (packageWord != -1)
+ {
+ packageEOLine = text.indexOf(";", packageWord);
+ if (packageEOLine!= -1)
+ packageName = text.substring(packageWord+8,packageEOLine);
+ }
+ return packageName;
+} //}}}
+
+//{{{ _chooseADir() method
+/** Chooses a directory and returns the path. **/
+/* Use this method if you want to customize the macro to choose
+ output and input directorys for things */
+String _chooseADir(String dialogTitle, String startDir)
+{
+ String retVal = "";
+ JFileChooser chooser = new JFileChooser(startDir);
+ chooser.setDialogTitle(dialogTitle);
+ chooser.setMultiSelectionEnabled(false);
+ chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
+ if(chooser.showDialog(view, "Okay") == JFileChooser.APPROVE_OPTION)
+ {
+ retVal = chooser.getSelectedFile().getAbsolutePath();
+ }
+ return retVal;
+} //}}}
+
+//{{{ _infoView() method
+void _infoView(View view, String urlStr)
+{
+ // first, check if the plugin is installed.
+ boolean version1 = false;
+ //With version 1.0 of the plugin ... the name changed to
+ //infoviewer.InfoViewerPlugin
+ if(jEdit.getPlugin("InfoViewerPlugin") == null)
+ {
+ if(jEdit.getPlugin("infoviewer.InfoViewerPlugin") == null)
+ {
+ Macros.error(view,"You must install the InfoViewerPlugin"
+ + " to use this macro.");
+ return;
+ }
+ version1 = true;
+ }
+ try
+ {
+ // API change with version 1.0 of the InfoViewer
+ if (version1)
+ jEdit.getPlugin("infoviewer.InfoViewerPlugin").
+ openURL(view, urlStr);// version 1.0
+ else
+ jEdit.getPlugin("InfoViewerPlugin").
+ sendURL(new URL(urlStr), view); // pre 1.0
+ }
+ catch (MalformedURLException mu)
+ {
+ Macros.error(view,"Cannot find the url " + urlStr);
+ }
+} //}}}
+
+//{{{ _returnSystemCommand() method
+String _returnSystemCommand(View view, String command)
+{
+ //{{{ first, check if the plugin is installed.
+ if(jEdit.getPlugin("console.ConsolePlugin") == null)
+ {
+ Macros.error(view,"You must install the Console plugin"
+ + " to use this macro.");
+ return;
+ } //}}}
+
+ //Macros.message(view, "Getting window manager.");
+ manager = view.getDockableWindowManager();
+ _console = (console.Console) manager.getDockable("console");
+ if (_console == null)
+ {
+ manager.showDockableWindow("console");
+ _console = (console.Console) manager.getDockable("console");
+ }
+ outputPane = _console.getOutputPane();
+
+ text = outputPane.getText();
+ textLength = text.length();
+ runInSystemShell(view, command);
+ waitForConsole(view);
+ text = outputPane.getText();
+ textLength = text.length();
+ text = outputPane.getText().substring(textLength);
+ return text;
+} //}}}
+
+//{{{ _ensureFolderExists() method
+/**
+ * Ensures that a folder exists.
+ * <TABLE WIDTH="100%" BORDER="0" CELLSPACING="1" CELLPADDING="2">
+ * <TR><TD COLSPAN="2">
+ * <H2>Ensures that a folder exists</H2>
+ * </TD></TR>
+ *
+ * <TR><TD COLSPAN="2"> <BR>
+ * <B>Description:</B><BR>
+ * use it like this:
+ * <br> _ensureFolderExists(new File(fileName).getParentFile());
+ * </TD></TR>
+ * </TABLE>
+ *
+ * @param folder The File object to check.
+ **/
+void _ensureFolderExists(File folder)
+{
+ if ( folder != null && ! folder.exists() )
+ {
+ _ensureFolderExists(folder.getParentFile());
+ folder.mkdir();
+ }
+} //}}}
+
+
+String versionStr = "1.8";
+String SYSTEM_FILE_SEPERATOR = File.separator;
+String SYSTEM_TEMP_DIR = System.getProperty("java.io.tmpdir");
+//SYSTEM_TEMP_DIR = "/tmp";
+String SYSTEM_PATH_SEPERATOR = System.getProperty("path.separator");
+
+// first, check if the plugin is installed.
+if(jEdit.getPlugin("console.ConsolePlugin") == null ||
+ (jEdit.getPlugin("InfoViewerPlugin") == null) &&
+ (jEdit.getPlugin("infoviewer.InfoViewerPlugin") == null))
+{
+ if(jEdit.getPlugin("console.ConsolePlugin") == null)
+ Macros.error(view,"You must install the Console plugin"
+ + " to use this macro.");
+ else
+ Macros.error(view,"You must install the InfoViewerPlugin plugin"
+ + " to use this macro.");
+}
+else
+{
+
+ String currBufferPath = buffer.getPath();
+
+ //Macros.message(view,"Current Buffer Path:\n"+currBufferPath);
+ if (currBufferPath.endsWith(".java"))
+ {
+ /* Store Some class/package/path info for use later */
+ // Get the Package name
+ String packName = _determinePackageName();
+
+ // Get the Class Name
+ String className = _getClassName();
+
+ /* ********************************************************************** */
+ /* Change the Following Vars to personalize things */
+ /* You should also Change the Header and Botton javadoc text down below */
+ /* ********************************************************************** */
+ // header message
+ String yourProductUrlStr = "http://www.yourProductURL.goes.here";
+ String yourProductNameStr = "My Java Product Name";
+
+ // header message
+ String yourBottomStr = "Released under a GNU Public License.";
+
+ // PDFDoclet outputfilename
+ String pdfDocletOutputFilename = "PDFDoclet.Output.pdf";
+
+ // PDFDoclet outputfilename
+ String pdfReaderCommand = "acro";
+
+ // Output directory .... set this to somewhere permanent if you want
+ String outputDir = SYSTEM_TEMP_DIR;
+
+ // Allow choice of the output dir at runtime
+ boolean chooseOutputDir = false;
+
+ // This macro attempts to get the source search path right
+ // if its not getting it... this var gets added to the Javadoc search path
+ String extraSourceDir = "";
+
+ // This macro doesn't do much with the javadoc classpath
+ // if its not getting it... this var gets added to the Javadoc classpath
+ String extraClassesDir = "";
+
+ // flag to do the Javadoc on the package instead of just the file
+ // Set this to true then save this macro with a new name
+ // ie... Preview_Javadoc_Of_Current_Package.bsh
+ boolean doFullPackage = false;
+
+ // set to false to default to the standard java doclet
+ boolean showDocletDialog = true;
+
+ /* Set some default options for the javadoc command */
+ /* change these to suit how you like your output to show up */
+ /* better yet... make a little dialog for input at runtime */
+ int showOnlyLevel = 3; // protected is the default
+ String[] showOnlyStr = {"-public ","-protected ","-package ","-private"};
+
+ /* some (not All) standard doclet options */
+ /* ************************************** */
+ // if you want one of the following options...
+ // set the corresponding flag to true
+ boolean[] optionFlags = {false,false,false,false,false,
+ false,false,false,false};
+ String[] optionStrs = {"-use ","-version ","-author ","-nosince","-notree ",
+ "-noindex ","-nohelp ","-nodeprecated ","-verbose"};
+
+ // beware OS/2 users...
+ // ALL the following options break the IBM 1.3.0 JDK Javadoc tool
+ // don't ask me?
+ boolean addWindowTitle = true;
+ StringBuffer windowTitle = new StringBuffer("-windowtitle \"Javadoc for");
+ windowTitle.append((doFullPackage?"package ":"class "));
+ windowTitle.append(className);
+ windowTitle.append("\" ");
+
+ /* DocTitle Text */
+ boolean addDocTitle = true;
+ StringBuffer docTitle = new StringBuffer("-doctitle \"");
+ docTitle.append("Your Document Title here Javadoc API");
+ docTitle.append("\" ");
+
+ /* Header Text */
+ boolean addHeader = true;
+ StringBuffer header = new StringBuffer("-header \"");
+ header.append("<B><A href=\"");
+ header.append(yourProductUrlStr);
+ header.append("\">");
+ header.append(yourProductNameStr);
+ header.append("</A></B>");
+ header.append("<BR>Version xx.xx.xx");
+ // Format the current time.
+ java.text.SimpleDateFormat formatter
+ = new java.text.SimpleDateFormat ("yyyy.MMMMM.dd 'at' hh:mm:sszzz");
+ java.util.Date currentTime_1 = new java.util.Date();
+ String dateString = formatter.format(currentTime_1);
+ header.append("<BR><font size=-1>");
+ header.append(dateString);
+ header.append("</font>\" ");
+
+ /* Footer Text */
+ boolean addFooter = true;
+ StringBuffer footer = new StringBuffer("-footer \"");
+ footer.append("Produced Using the <A href=\"http://www.jedit.org\">");
+ footer.append("jEdit</A><BR>Preview Javadoc Beanshell Macro.<BR>");
+ footer.append("Copyright © 2001-2003, ");
+ footer.append("<A href=\"http://www.webarts.bc.ca>\"");
+ footer.append("Tom B. Gutwin</A>");
+ footer.append("\" ");
+
+ /* Bottom Text */
+ boolean addBottom = true;
+ StringBuffer bottom = new StringBuffer("-bottom \"");
+ bottom.append(yourBottomStr);
+ bottom.append("\" ");
+
+ /*********************************************************************** */
+ /* All users setting now complete */
+ /*********************************************************************** */
+
+
+ // Store the directory where the buffer file lives
+ String savedBufferdir = currBufferPath.substring(0,
+ currBufferPath.length()-6-className.length());
+
+ // build the full package.classname
+ StringBuffer fullClassName = new StringBuffer();
+ if (packName != null && !packName.equals(""))
+ {
+ fullClassName.append(packName);
+ fullClassName.append(".");
+ }
+ fullClassName.append(className);
+
+ /* Javadoc needs the file to live in a directory structure */
+ /* named like its Package name */
+ // If needed... copy the file to the temp dir into its package dir */
+ String currBufferdir = savedBufferdir;
+ StringBuffer tmpBufferName = new StringBuffer(SYSTEM_TEMP_DIR);
+ if (packName != null && !packName.equals("") &&
+ savedBufferdir.indexOf(
+ packName.replace('.',File.separatorChar).trim()) == -1 )
+ {
+ // The buffer file is not in an appropriate named dir
+ // copy and work on it in temp
+ if (!SYSTEM_TEMP_DIR.endsWith(SYSTEM_FILE_SEPERATOR))
+ tmpBufferName.append(SYSTEM_FILE_SEPERATOR);
+ _ensureFolderExists(new File(tmpBufferName.toString() +
+ packName.replace('.', File.separatorChar).trim()));
+ tmpBufferName.append(fullClassName.toString().
+ replace('.', File.separatorChar).trim());
+ tmpBufferName.append(".java");
+ //Macros.message(view, "Saving "+tmpBufferName.toString());
+ buffer.save(view, tmpBufferName.toString(), false);
+
+ // the rest of the macro uses the currBufferdir variable
+ currBufferPath = tmpBufferName.toString();
+ currBufferdir = currBufferPath.substring(0,
+ currBufferPath.length()-6-className.length());
+ }
+
+ // some debug statements
+ //Macros.message(view,"Package Name ="+packName);
+ //Macros.message(view,"fullClassName ="+fullClassName);
+ //Macros.message(view,"Buffer Path ="+currBufferPath);
+ //Macros.message(view,"Buffer Dir ="+currBufferdir);
+
+
+ /* ************************************************* */
+ /* *********** On with the Processing ************* */
+ Object[] options = { "Standard Java Doclet", "Bouvard Doclet",
+ "DocBook Doclet", "XML Doclet", "PDF Doclet" };
+ String[] docletClassName = { "", "bp.doclet.Bouvard",
+ "com.mf.doclet.docbook.DocBookDoclet",
+ "codeinsight.xmldoclet.XMLDoclet",
+ "com.tarsec.javadoc.pdfdoclet.PDFDoclet"};
+ String[] docletClassPath = { "", "Bouvard.jar", "dbdoclet.jar",
+ "xmldoclet.jar",
+ "pdfdoclet.jar:itext.jar:/usr/lib/pkgs" };
+ String PDFDocletConfigPropertiesFile = "pdfdoclet.config.properties";
+ // Set the DEFAULT Doclet to the JavaDoclet
+ String proceed = options[0];
+
+ /* Shows a Doclet Selection Dialog */
+ if (showDocletDialog)
+ proceed = JOptionPane.showInputDialog(view,
+ "Choose the Doclet to use for previewing the"+
+ "\n" + className + " JavaDocs."+
+ "\n(Bypass this dialog... set "+
+ "'showDocletDialog=false;' in the macro)",
+ "JavaDoc Buffer Macro - version "+versionStr,
+ JOptionPane.QUESTION_MESSAGE, null, options,
+ options[0]);
+
+ if (proceed != null)
+ {
+ // this is where you could use the _chooseADir(String startDir) method
+ // to choose an output dir at runtime.
+ if (chooseOutputDir)
+ outputDir = _chooseADir("Please Choose an Output Directory.",outputDir);
+
+ docletChoice = 0;
+ for (int choiceNum = 0; choiceNum < options.length;choiceNum++)
+ {
+ if (((String)proceed).equals((String)options[choiceNum]))
+ {
+ docletChoice = choiceNum;
+ choiceNum = options.length;
+ }
+ }
+
+ // The currBufferSrcDir expects the current buffer to be in a subDirectory
+ // path the same as the package name
+ // THIS is definitely NOT always the case
+ String currBufferSrcDir = currBufferPath.substring(0,
+ currBufferPath.length()-fullClassName.toString().length()-5);
+
+ if(outputDir != null && !outputDir.equals(""))
+ {
+ // you might need some of the follwing if you want to add some
+ // commandline parms
+ String jedit_userdir=System.getProperty("user.home") +
+ SYSTEM_FILE_SEPERATOR +".jedit";
+ String jedit_homedir=jEdit.getJEditHome();
+ String currClassPath=System.getProperty("java.class.path");
+ String java_home=System.getProperty("java.home");
+
+ // Construct the command which will be executed
+ StringBuilder command = new StringBuilder(java_home);
+ if (java_home.toLowerCase().endsWith("jre"))
+ command.append(File.separator).append("..");
+ command.append(File.separator).append("bin");
+ command.append(File.separator).append("javadoc ");
+
+ if (!((String)proceed).equals((String)options[0]))
+ {
+ //{{{ general parms for 'other' doclets
+ command.append("-doclet \"");
+ command.append(docletClassName[docletChoice]);
+ command.append("\" ");
+ command.append("-docletpath \"");
+ command.append(jedit_userdir);
+ command.append(SYSTEM_FILE_SEPERATOR);
+ command.append("jars");
+ command.append(SYSTEM_FILE_SEPERATOR);
+ command.append(docletClassPath[docletChoice]);
+ command.append("\" ");
+ //}}}
+
+ //{{{ Bouvard Doclet
+ // This assumes the Bouvard.jar already exists
+ // in the jeditUser/jars dir
+ if (((String)proceed).equals((String)options[1]))
+ {
+ /* Specify the output dir */
+ command.append("-d \"");
+ command.append(outputDir);
+ command.append("\" ");
+ } //}}}
+
+ //{{{ the DocBookDoclet has an extra parm
+ if (((String)proceed).equals((String)options[2]))
+ {
+ command.append("-properties \"");
+ command.append(jedit_userdir);
+ command.append(SYSTEM_FILE_SEPERATOR);
+ command.append("macros");
+ command.append(SYSTEM_FILE_SEPERATOR);
+ command.append("Java");
+ command.append(SYSTEM_FILE_SEPERATOR);
+ command.append("dbdoclet-xml.properties\" ");
+ } //}}}
+
+ //{{{ the XMLDoclet has an extra parm
+ if (((String)proceed).equals((String)options[3]))
+ {
+ /* Specify the output dir */
+ //command.append("-d \"");
+ //command.append(outputDir);
+ //command.append("\" ");
+ } //}}}
+
+ //{{{ the PDFDoclet has an extra parm
+ if (((String)proceed).equals((String)options[4]))
+ {
+ command.append("-pdf \"");
+ command.append(outputDir);
+ command.append(SYSTEM_FILE_SEPERATOR);
+ command.append(pdfDocletOutputFilename);
+ command.append("\" ");
+ if (PDFDocletConfigPropertiesFile != null
+ &&!PDFDocletConfigPropertiesFile.equals(""))
+ {
+ command.append(" -workdir \"");
+ command.append(outputDir);
+ command.append("\" ");
+ command.append("-config \"");
+ command.append(jedit_userdir);
+ command.append(SYSTEM_FILE_SEPERATOR);
+ command.append("macros");
+ command.append(SYSTEM_FILE_SEPERATOR);
+ command.append("Java");
+ command.append(SYSTEM_FILE_SEPERATOR);
+ command.append(PDFDocletConfigPropertiesFile);
+ command.append("\"");
+ }
+ } //}}}
+
+ }
+ else
+ {
+ //{{{ standard doclet parms
+ if (addWindowTitle)
+ command.append(windowTitle.toString());
+ if (addDocTitle)
+ command.append(docTitle.toString());
+ if (addHeader)
+ command.append(header.toString());
+ if (addFooter)
+ command.append(footer.toString());
+ if (addBottom)
+ command.append(bottom.toString());
+
+ /* add the on/off options */
+ for (int opt = 0; opt <optionFlags.length; opt++)
+ {
+ if (optionFlags[opt])
+ command.append(optionStrs[opt]);
+ }
+
+ /* Specify the output dir */
+ command.append("-d \"");
+ command.append(outputDir);
+ command.append("\" ");
+
+ //}}}
+
+ }
+
+ /* Set the Level of detail to show */
+ command.append(" ");
+ command.append(showOnlyStr[showOnlyLevel]);
+
+ //{{{ if not found add your source dir to the 'extraClassesdir' var
+ command.append(" -classpath \"");
+ command.append(SYSTEM_TEMP_DIR);
+ command.append(SYSTEM_PATH_SEPERATOR);
+ command.append(System.getProperty("java.class.path"));
+ command.append(SYSTEM_PATH_SEPERATOR);
+ command.append(extraClassesDir);
+ command.append("\" ");
+ //}}}
+
+ /* **** Done with the options ***** */
+ /* Specify the package or file name */
+ if (doFullPackage && packName != null && !packName.equals(""))
+ {
+ /* Guess where the package source is located */
+ /* if not found... add your source dir to the 'extraSourcedir' var */
+ command.append("-sourcepath \"");
+ command.append(savedBufferdir);
+ command.append(SYSTEM_PATH_SEPERATOR);
+ command.append(currBufferSrcDir);
+ command.append(SYSTEM_PATH_SEPERATOR);
+ command.append(currBufferSrcDir);
+ command.append(SYSTEM_FILE_SEPERATOR);
+ command.append("..");
+ command.append(SYSTEM_PATH_SEPERATOR);
+ command.append(currBufferSrcDir);
+ command.append(SYSTEM_FILE_SEPERATOR);
+ command.append("..");
+ command.append(SYSTEM_FILE_SEPERATOR);
+ command.append("..");
+ command.append(SYSTEM_PATH_SEPERATOR);
+ command.append(currBufferSrcDir);
+ command.append(SYSTEM_FILE_SEPERATOR);
+ command.append("..");
+ command.append(SYSTEM_FILE_SEPERATOR);
+ command.append("..");
+ command.append(SYSTEM_FILE_SEPERATOR);
+ command.append("..");
+ command.append(SYSTEM_PATH_SEPERATOR);
+ command.append(currBufferSrcDir);
+ command.append(SYSTEM_FILE_SEPERATOR);
+ command.append("..");
+ command.append(SYSTEM_FILE_SEPERATOR);
+ command.append("..");
+ command.append(SYSTEM_FILE_SEPERATOR);
+ command.append("..");
+ command.append(SYSTEM_FILE_SEPERATOR);
+ command.append("..");
+ command.append(SYSTEM_PATH_SEPERATOR);
+ command.append(currBufferdir);
+ command.append(SYSTEM_PATH_SEPERATOR);
+ command.append(extraSourceDir);
+ command.append("\" ");
+
+ command.append(packName);
+ }
+ else
+ {
+ //{{{ add the base sourcepath
+ command.append("-sourcepath \"");
+ command.append(savedBufferdir);
+ command.append(SYSTEM_PATH_SEPERATOR);
+ command.append(currBufferSrcDir);
+ command.append(SYSTEM_PATH_SEPERATOR);
+ command.append(currBufferdir);
+ command.append(SYSTEM_PATH_SEPERATOR);
+ command.append(extraSourceDir);
+ command.append("\" ");
+ //}}}
+
+ //{{{ now add the file to javadoc
+ command.append("\"");
+ command.append(currBufferPath);
+ command.append("\"");
+ //}}}
+
+ }
+System.out.println("****************************************************************");
+System.out.println(command.toString());
+System.out.println("****************************************************************");
+ retVal = _returnSystemCommand(view, command.toString());
+ if (retVal.indexOf("error") == -1)
+ {
+
+ // Build the url for the Viewer
+ // If you don't want to use the InfoViewer plugin...
+ // easy, change the implementation in this macros _infoView method
+ StringBuffer urlStr = new StringBuffer();
+ urlStr.append("file:///");
+ urlStr.append(outputDir.replace('\\', '/').trim());
+ if (!outputDir.endsWith(SYSTEM_FILE_SEPERATOR))
+ urlStr.append("/");
+ if (doFullPackage)
+ {
+ urlStr.append("index.html");
+ }
+ else
+ {
+ if (packName != null && !packName.equals(""))
+ {
+ urlStr.append(packName.replace('.', '/').trim());
+ urlStr.append("/");
+ }
+ //Macros.message(view, packName);
+ urlStr.append(className);
+ urlStr.append(".html");
+ //Macros.message(view, urlStr.toString());
+ }
+
+ // now which viewer (standard or Pecuchet)
+ if (!showDocletDialog || ((String)proceed).equals((String)options[0]))
+ _infoView(view, urlStr.toString());
+
+ else if (((String)proceed).equals((String)options[1]))
+ {
+ // Bouvard Browser
+ // This assumes the Pecuchet.jar already exists
+ // and xerces is in the classpath already
+ StringBuffer classPath = new StringBuffer("\"");
+ classPath.append(jedit_userdir);
+ classPath.append(SYSTEM_FILE_SEPERATOR);
+ classPath.append("jars");
+ classPath.append(SYSTEM_FILE_SEPERATOR);
+ classPath.append("Pecuchet.jar");
+ classPath.append(SYSTEM_PATH_SEPERATOR);
+ classPath.append(jedit_homedir);
+ classPath.append(SYSTEM_FILE_SEPERATOR);
+ classPath.append("jars");
+ classPath.append(SYSTEM_FILE_SEPERATOR);
+ classPath.append("Pecuchet.jar");
+ classPath.append(SYSTEM_PATH_SEPERATOR);
+ classPath.append(currClassPath);
+ classPath.append("\"");
+
+ StringBuffer bViewerCommand = new StringBuffer("java -classpath ");
+ bViewerCommand.append(classPath);
+ bViewerCommand.append(" ");
+ bViewerCommand.append("-Dorg.xml.sax.driver=");
+ bViewerCommand.append("org.apache.xerces.parsers.SAXParser");
+ bViewerCommand.append(" ");
+ bViewerCommand.append("bp.app.Main ");
+ bViewerCommand.append(outputDir);
+ if (!outputDir.endsWith(SYSTEM_FILE_SEPERATOR))
+ bViewerCommand.append(SYSTEM_FILE_SEPERATOR);
+ bViewerCommand.append("data.bou &");
+ retVal = _returnSystemCommand(view, bViewerCommand.toString());
+ StringBuffer macroMessage =
+ new StringBuffer("When the Pecuchet browser starts.\n");
+ macroMessage.append("Open file: ");
+ macroMessage.append(outputDir);
+ if (!outputDir.endsWith(SYSTEM_FILE_SEPERATOR))
+ macroMessage.append(SYSTEM_FILE_SEPERATOR);
+ macroMessage.append("data.bou");
+ //Macros.message(view, macroMessage.toString());
+ }
+ else if (((String)proceed).equals((String)options[2]))
+ {
+ // XML Doclet
+ // Use a new jEdit Buffer
+ StringBuffer newFile = new StringBuffer(outputDir);
+ if (!outputDir.endsWith(SYSTEM_FILE_SEPERATOR))
+ newFile.append(SYSTEM_FILE_SEPERATOR);
+ newFile.append("Reference.xml");
+ Buffer newTmpBuffer = jEdit.openFile(view,newFile.toString());
+ }
+ else if (((String)proceed).equals((String)options[3]))
+ {
+ // XML Doclet
+ // Use a new jEdit Buffer
+ StringBuffer newFile = new StringBuffer(outputDir);
+ if (!outputDir.endsWith(SYSTEM_FILE_SEPERATOR))
+ newFile.append(SYSTEM_FILE_SEPERATOR);
+ newFile.append("output.xml");
+ Buffer newTmpBuffer = jEdit.openFile(view,newFile.toString());
+ }
+ else if (((String)proceed).equals((String)options[4]))
+ {
+ // pdf Doclet
+ StringBuffer pdfViewerCommand = new StringBuffer(pdfReaderCommand);
+ pdfViewerCommand.append(" ");
+ pdfViewerCommand.append(outputDir);
+ pdfViewerCommand.append(SYSTEM_FILE_SEPERATOR);
+ pdfViewerCommand.append(pdfDocletOutputFilename);
+ retVal = _returnSystemCommand(view, pdfViewerCommand.toString());
+ }
+ else
+ {
+ // put the viewers for other doclets here
+ }
+ }
+ else
+ Macros.error(view, "Javadoc did NOT complete successfully. " +
+ "See the console output");
+ }
+ }
+ }
+ else
+ Macros.error(view, "Current Buffer does NOT appear to be a Java File");
+}
+
+/*
+
+Macro index data (in DocBook format)
+
+ <listitem>
+ <para><filename>Preview_Javadoc_of_Buffer.bsh</filename></para>
+ <abstract><para>
+ Create and display API documentation for the current buffer.
+ </para></abstract>
+ <para>
+ The macro includes various configuration variables you can change; see the comment at the beginning of the macro source for details.
+ </para>
+ </listitem>
+
+*/
+
+// end Preview_JavaDoc_of_Buffer.bsh
+
diff --git a/jEdit/macros/Misc/Debug_BufferSets.bsh b/jEdit/macros/Misc/Debug_BufferSets.bsh
index 593c523..929ac9a 100644
--- a/jEdit/macros/Misc/Debug_BufferSets.bsh
+++ b/jEdit/macros/Misc/Debug_BufferSets.bsh
@@ -1,7 +1,7 @@
/*
* Debug_BufferSets.bsh - a BeanShell macro script to debug bufferSets
*
- * Copyright (C) 2008 Matthieu Casanova
+ * Copyright (C) 2008, 2010 Matthieu Casanova
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -16,8 +16,6 @@
* You should have received a copy of the GNU General Public License
* along with the jEdit program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id: Run_Script.bsh 3912 2001-11-24 03:56:51Z jgellene $
*/
org.gjt.sp.jedit.bufferset.BufferSetManager bufferSetManager = jEdit.getBufferSetManager();
@@ -33,20 +31,6 @@ for (Buffer buffer:buffers)
}
Log.log(Log.DEBUG, this, "------END BUFFER LIST------");
-Log.log(Log.DEBUG, this, "------BUFFERSET LIST------");
-bufferSetManager.visit(new org.gjt.sp.jedit.bufferset.BufferSetManager.BufferSetVisitor()
- {
- public void visit(org.gjt.sp.jedit.bufferset.BufferSet bufferSet)
- {
- Buffer[] buffers = bufferSet.getAllBuffers();
- for (Buffer buffer : buffers)
- {
- Log.log(Log.DEBUG, this, bufferSet.hashCode() + "@" + bufferSet + " " + buffer);
- }
- }
- });
-
-Log.log(Log.DEBUG, this, "------END BUFFERSET LIST------");
Log.log(Log.DEBUG, this, "------EDITPANE LIST------");
jEdit.visit(new org.gjt.sp.jedit.visitors.JEditVisitorAdapter()
{
diff --git a/jEdit/macros/Misc/Display_Abbreviations.bsh b/jEdit/macros/Misc/Display_Abbreviations.bsh
index a2cd8e5..9df5f08 100644
--- a/jEdit/macros/Misc/Display_Abbreviations.bsh
+++ b/jEdit/macros/Misc/Display_Abbreviations.bsh
@@ -1,391 +1,391 @@
-/*
- * Display_abbreviations.bsh - a BeanShell macro script for the
- * jEdit text editor - displays all defined abbreviations
- * Copyright (C) 2001 John Gellene
- * email: jgellene at nyc.rr.com
- * http://community.jedit.org
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id: Display_Abbreviations.bsh 5224 2005-06-08 22:33:27Z orutherfurd $
- *
- * requires JDK 1.2, jEdit3.0
- *
- * Notes on use:
- *
- * This macro will display a sorted list of all defined abbreviations
- * in a dialog. A combo box lists all eidting modes for which abbreviations
- * are currently defined, as well as the "global" abbreviation set.
- *
- * Pressing a letter key will cause the table to scroll to the first row
- * with a label beginning with the letter (or the imeediately preceding row if
- * no item begins with that letter). The table is read-only; the dialog is
- * dismissed by clicking "OK" or pressing Esc or Enter.
- *
- * The macro has two global constants defined to permit customization of the
- * script's behavior. STARTING_SET contains the name of the abbreviation set
- * that will be first displayed. If the other variable, EXCLUDE_EMPTY_SETS,
- * is set to true, the drop-down menu and the results of clicking the
- * "Write All" button will only include abbreviations sets containing
- * entries.
- *
- * The table being displayed at any time is not updated if changes are made to
- * the abbreviation set in the "Global Options" dialog. If EXCLUDE_EMPTY_SETS
- * is set to true, the drop-down list will not by updated. Clsoing the dialog
- * and running the macro again will obtain current data.
- *
- *
- * Checked for jEdit 4.0 API
- *
- */
-
-import javax.swing.table.*;
-
-/*
- * getActiveSets()
- * This returns an array with the names of the abbreviation sets
- * (beginning with "global"). If EXCLUDE_EMPTY_SETS is set to true, only sets
- * with abbreviations are included.
- */
-Object[] getActiveSets()
-{
- Mode[] modes = jEdit.getModes();
- Vector setVector = new Vector(modes.length + 1);
- setVector.addElement("global");
- for(int i = 0; i < modes.length; i++)
- {
- String name = modes[i].getName();
- if(EXCLUDE_EMPTY_SETS)
- {
- Hashtable ht = Abbrevs.getModeAbbrevs().get(name);
- if( ht == null || ht.isEmpty())
- continue;
- }
- setVector.addElement(name);
- }
- Object[] sets = new Object[setVector.size()];
- setVector.copyInto(sets);
- return sets;
-}
-
-/*
- * makeTableDataForMode()
- * This extracts the abbreviations from the named set. If extraction is
- * successful, the vector named by the first parameter will have its
- * elements removed before the variable is set to the newly created vector.
- */
-Vector makeTableDataForMode(Vector v, String name)
-{
- if(name.equals(currentSet))
- return v;
- Hashtable htable = null;
- if(name.equals("global"))
- {
- htable = Abbrevs.getGlobalAbbrevs();
- }
- else
- {
- Hashtable modeAbbrevs = Abbrevs.getModeAbbrevs();
- htable = modeAbbrevs.get(name);
- }
- if(htable != null)
- {
- Enumeration abbrevEnum = htable.keys();
- Enumeration expandEnum = htable.elements();
- Vector newData = new Vector(20, 5);
- while(abbrevEnum.hasMoreElements())
- {
- Vector row = new Vector(2);
- row.addElement(abbrevEnum.nextElement());
- row.addElement(expandEnum.nextElement());
- newData.addElement(row);
- }
- MiscUtilities.quicksort(newData,
- new MiscUtilities.StringICaseCompare());
- currentSet = name;
- if( v != null)
- v.removeAllElements();
- v = newData;
- }
- return v;
-}
-
-/*
- * showAbbrevs()
- * This is the macro's principal method.
- */
-void showAbbrevs()
-{
- currentSet = null;
- data = makeTableDataForMode(data, STARTING_SET);
- if(data.size() == 0)
- {
- STARTING_SET = "global";
- data = makeTableDataForMode(data, STARTING_SET);
- }
- Vector columnNames = new Vector(2);
- columnNames.addElement(new String("Abbreviation"));
- columnNames.addElement(new String("Expansion"));
- table = new JTable();
- table.setModel(new DefaultTableModel(data, columnNames));
- table.setRowSelectionAllowed(true);
- /* The next line prevents the table from being edited.
- * The normal approach in Java would be to subclass the TableModel
- * associated with the JTable and define TableModel.isCellEditable()
- * to return false. However, BeanShell does not allow conventional
- * class creation, and the desired behavior cannot be achieved using
- * its scripted object feature.
- */
- table.setDefaultEditor(Object.class, null);
- if(table.getRowCount() != 0)
- table.setRowSelectionInterval(0,0);
- tablePane = new JScrollPane(table);
- tablePane.setPreferredSize(new Dimension(450, 300));
-
- combo = new JComboBox(abbrevSets);
- Dimension dim = combo.getPreferredSize();
- dim.width = Math.max(dim.width, 120);
- combo.setPreferredSize(dim);
- combo.setSelectedItem(STARTING_SET);
- comboPanel = new JPanel(new FlowLayout());
- comboPanel.add(new JLabel("Abbreviation set:"));
- comboPanel.add(combo);
-
- close = new JButton("Close");
- write_set = new JButton("Write set");
- write_all = new JButton("Write all");
- buttonPanel = new JPanel(new FlowLayout());
- buttonPanel.add(write_set);
- buttonPanel.add(write_all);
- buttonPanel.add(close);
-
- close.addActionListener(this);
- write_set.addActionListener(this);
- write_all.addActionListener(this);
- combo.addActionListener(this);
- void actionPerformed(e)
- {
- Component source = e.getSource();
- if(source == close)
- dialog.hide();
- else if(source == write_set)
- writeTableToNewBuffer(super.data, (String)combo.getSelectedItem());
- else if(source == write_all)
- writeAllToNewBuffer();
- else if(source == combo)
- {
- super.data = makeTableDataForMode(super.data, (String)combo.getSelectedItem());
- if( data != null)
- {
- DefaultTableModel model = (DefaultTableModel)table.getModel();
- model.setDataVector(super.data, columnNames);
- }
- }
- }
-
- // workaround required by Swing bug; scheduled to be fixed in JDK 1.4
- combo.getComponent(0).addKeyListener(this);
- table.addKeyListener(this);
- write_set.addKeyListener(this);
- write_all.addKeyListener(this);
- close.addKeyListener(this);
- void keyPressed(e)
- {
- if(combo.isPopupVisible()) return;
- if(e.getKeyCode() == KeyEvent.VK_ESCAPE ||
- e.getKeyCode() == KeyEvent.VK_ENTER)
- {
- dialog.hide();
- }
- else if(e.getSource() != combo)
- {
- char ch = e.getKeyChar();
- if(Character.isLetter(ch))
- {
- e.consume();
- row = findFirstItem(ch);
- /* The next few lines set the last visible row
- * of the table so that you can look ahead of
- * the selected row.
- */
- visibleRows =
- table.getVisibleRect().height / table.getRowHeight();
- oldRow = table.getSelectedRow();
- table.setRowSelectionInterval(row,row);
- if (visibleRows > 5 && row - oldRow > visibleRows - 3)
- {
- row = Math.min( super.data.size() - 1, row + 3);
- }
- table.scrollRectToVisible(table.getCellRect(row,0,true));
- }
- }
- }
- /*
- * Having these members of KeyListener implemented as no-ops
- * will speedup execution. Otherwise BeanShell throws an
- * exception that jEdit handles internally.
- * Under BeanShell 1.2, implementation of these methods is
- * required.
- */
- void keyReleased(e) {}
- void keyTyped(e) {}
-
- /*
- * findFirstItem()
- * A simple linear search for the table entry that begins with the
- * given letter. It returns the first row with an entry beginning with
- * the letter, or the immdediately preceding row if there is no match
- * on the letter.
- *
- */
- int findFirstItem(char ch)
- {
- ch = Character.toUpperCase(ch);
- int row = 0;
- for(int i = 0; i < data.size(); ++i)
- {
- String name = ((Vector)data.elementAt(i)).elementAt(0);
- char ch_test = Character.toUpperCase(name.charAt(0));
- if( ch_test > ch) break;
- else
- {
- row = i;
- if( ch_test == ch) break;
- }
- }
- return row;
- }
-
- title = "Abbreviation list";
- dialog = new JDialog(view, title, false);
- c = dialog.getContentPane();
- c.add(tablePane, "Center");
- c.add(comboPanel, "North");
- c.add(buttonPanel, "South");
- dialog.getRootPane().setDefaultButton(close);
- dialog.pack();
- dialog.setLocationRelativeTo(view);
- dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
- dialog.show();
-}
-
-/*
- * The next four methods deal with writing the abbreviation sets to a new
- * text buffer.
- */
-void writeTableToNewBuffer(Vector v, String setName)
-{
- Log.log(Log.DEBUG, BeanShell.class,
- "calling writeTableToNewBuffer for " + setName);
- writeHeader();
- Log.log(Log.DEBUG, BeanShell.class, "size of vector = "
- + String.valueOf(v.size()));
- writeSet(v, setName);
-}
-
-// saved the currentSet and deleted it for makeTableDataForMode()-invocation
-// because otherwise the currently in the Dialog displayed set has no abbrevs
-// in the output written to the buffer.
-void writeAllToNewBuffer()
-{
- writeHeader();
- Vector vOut = new Vector();
- savedCurrentSet = currentSet;
- for( int i = 0; i < abbrevSets.length; ++i)
- {
- currentSet = null;
- String setName = (String)abbrevSets[i];
- vOut = makeTableDataForMode(vOut, setName);
- writeSet(vOut, setName);
- textArea.setSelectedText("\n\n");
- }
- currentSet = savedCurrentSet;
-}
-
-void writeHeader()
-{
- jEdit.newFile(view);
- textArea.setSelectedText("jEdit Abbreviation Table\n\n");
-}
-
-/*
- * This truncates the definition text at 17 characters and the expansion text
- * at 58.
- */
-void writeSet(Vector v, String setName)
-{
- textArea.setSelectedText("Abbreviation set: " + setName + "\n");
- textArea.setSelectedText("Abbreviation Expansion\n\n");
- if(v.size() == 0)
- textArea.setSelectedText("<< No abbreviations >>\n");
- else for( int i = 0; i < v.size(); ++i)
- {
- StringBuffer sb = new StringBuffer(85);
- spaceString = " ";
- char[] space = spaceString.toCharArray();
- Vector row = (Vector)v.elementAt(i);
- abbrevName = (String)row.elementAt(0);
- if(abbrevName == null) continue;
- if(abbrevName.length() > 17)
- abbrevName = abbrevName.substring(0, 14) + "...";
- sb.append(abbrevName);
- sb.append(space, 0, 18 - (abbrevName.length()));
- expansion = row.elementAt(1);
- if(shortcut1 != null)
- {
- if(expansion.length() > 58)
- expansion = expansion.substring(0, 55) + "...";
- sb.append(expansion);
- }
- sb.append('\n');
- textArea.setSelectedText(sb.toString());
- }
-}
-
-
-/*
- * main routine, including definition of global variables
- */
-STARTING_SET = "global";
-EXCLUDE_EMPTY_SETS = true;
-abbrevSets = getActiveSets();
-currentSet = null;
-Vector data = new Vector(20, 5);
-showAbbrevs();
-
-/*
- Macro index data (in DocBook format)
-
-<listitem>
- <para><filename>Display_Abbreviations.bsh</filename></para>
- <abstract><para>
- Displays the abbreviations registered for each of jEdit's
- editing modes.
- </para></abstract>
- <para>
- The macro provides a read-only view of the abbreviations
- contained in the <quote>Abbreviations</quote> option pane. Pressing
- a letter key will scroll the table to the first entry beginning with
- that letter. A further option is provided to write a selected mode's
- abbreviations or all abbreviations in a text buffer for printing as a
- reference. Notes in the source code listing point out some display options
- that are configured by modifying global variables.
- </para>
-</listitem>
-
-*/
-
-// end Display_Abbreviations.bsh
-
+/*
+ * Display_abbreviations.bsh - a BeanShell macro script for the
+ * jEdit text editor - displays all defined abbreviations
+ * Copyright (C) 2001 John Gellene
+ * email: jgellene at nyc.rr.com
+ * http://community.jedit.org
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id: Display_Abbreviations.bsh 5224 2005-06-08 22:33:27Z orutherfurd $
+ *
+ * requires JDK 1.2, jEdit3.0
+ *
+ * Notes on use:
+ *
+ * This macro will display a sorted list of all defined abbreviations
+ * in a dialog. A combo box lists all eidting modes for which abbreviations
+ * are currently defined, as well as the "global" abbreviation set.
+ *
+ * Pressing a letter key will cause the table to scroll to the first row
+ * with a label beginning with the letter (or the imeediately preceding row if
+ * no item begins with that letter). The table is read-only; the dialog is
+ * dismissed by clicking "OK" or pressing Esc or Enter.
+ *
+ * The macro has two global constants defined to permit customization of the
+ * script's behavior. STARTING_SET contains the name of the abbreviation set
+ * that will be first displayed. If the other variable, EXCLUDE_EMPTY_SETS,
+ * is set to true, the drop-down menu and the results of clicking the
+ * "Write All" button will only include abbreviations sets containing
+ * entries.
+ *
+ * The table being displayed at any time is not updated if changes are made to
+ * the abbreviation set in the "Global Options" dialog. If EXCLUDE_EMPTY_SETS
+ * is set to true, the drop-down list will not by updated. Clsoing the dialog
+ * and running the macro again will obtain current data.
+ *
+ *
+ * Checked for jEdit 4.0 API
+ *
+ */
+
+import javax.swing.table.*;
+
+/*
+ * getActiveSets()
+ * This returns an array with the names of the abbreviation sets
+ * (beginning with "global"). If EXCLUDE_EMPTY_SETS is set to true, only sets
+ * with abbreviations are included.
+ */
+Object[] getActiveSets()
+{
+ Mode[] modes = jEdit.getModes();
+ Vector setVector = new Vector(modes.length + 1);
+ setVector.addElement("global");
+ for(int i = 0; i < modes.length; i++)
+ {
+ String name = modes[i].getName();
+ if(EXCLUDE_EMPTY_SETS)
+ {
+ Hashtable ht = Abbrevs.getModeAbbrevs().get(name);
+ if( ht == null || ht.isEmpty())
+ continue;
+ }
+ setVector.addElement(name);
+ }
+ Object[] sets = new Object[setVector.size()];
+ setVector.copyInto(sets);
+ return sets;
+}
+
+/*
+ * makeTableDataForMode()
+ * This extracts the abbreviations from the named set. If extraction is
+ * successful, the vector named by the first parameter will have its
+ * elements removed before the variable is set to the newly created vector.
+ */
+Vector makeTableDataForMode(Vector v, String name)
+{
+ if(name.equals(currentSet))
+ return v;
+ Hashtable htable = null;
+ if(name.equals("global"))
+ {
+ htable = Abbrevs.getGlobalAbbrevs();
+ }
+ else
+ {
+ Hashtable modeAbbrevs = Abbrevs.getModeAbbrevs();
+ htable = modeAbbrevs.get(name);
+ }
+ if(htable != null)
+ {
+ Enumeration abbrevEnum = htable.keys();
+ Enumeration expandEnum = htable.elements();
+ Vector newData = new Vector(20, 5);
+ while(abbrevEnum.hasMoreElements())
+ {
+ Vector row = new Vector(2);
+ row.addElement(abbrevEnum.nextElement());
+ row.addElement(expandEnum.nextElement());
+ newData.addElement(row);
+ }
+ MiscUtilities.quicksort(newData,
+ new MiscUtilities.StringICaseCompare());
+ currentSet = name;
+ if( v != null)
+ v.removeAllElements();
+ v = newData;
+ }
+ return v;
+}
+
+/*
+ * showAbbrevs()
+ * This is the macro's principal method.
+ */
+void showAbbrevs()
+{
+ currentSet = null;
+ data = makeTableDataForMode(data, STARTING_SET);
+ if(data.size() == 0)
+ {
+ STARTING_SET = "global";
+ data = makeTableDataForMode(data, STARTING_SET);
+ }
+ Vector columnNames = new Vector(2);
+ columnNames.addElement(new String("Abbreviation"));
+ columnNames.addElement(new String("Expansion"));
+ table = new JTable();
+ table.setModel(new DefaultTableModel(data, columnNames));
+ table.setRowSelectionAllowed(true);
+ /* The next line prevents the table from being edited.
+ * The normal approach in Java would be to subclass the TableModel
+ * associated with the JTable and define TableModel.isCellEditable()
+ * to return false. However, BeanShell does not allow conventional
+ * class creation, and the desired behavior cannot be achieved using
+ * its scripted object feature.
+ */
+ table.setDefaultEditor(Object.class, null);
+ if(table.getRowCount() != 0)
+ table.setRowSelectionInterval(0,0);
+ tablePane = new JScrollPane(table);
+ tablePane.setPreferredSize(new Dimension(450, 300));
+
+ combo = new JComboBox(abbrevSets);
+ Dimension dim = combo.getPreferredSize();
+ dim.width = Math.max(dim.width, 120);
+ combo.setPreferredSize(dim);
+ combo.setSelectedItem(STARTING_SET);
+ comboPanel = new JPanel(new FlowLayout());
+ comboPanel.add(new JLabel("Abbreviation set:"));
+ comboPanel.add(combo);
+
+ close = new JButton("Close");
+ write_set = new JButton("Write set");
+ write_all = new JButton("Write all");
+ buttonPanel = new JPanel(new FlowLayout());
+ buttonPanel.add(write_set);
+ buttonPanel.add(write_all);
+ buttonPanel.add(close);
+
+ close.addActionListener(this);
+ write_set.addActionListener(this);
+ write_all.addActionListener(this);
+ combo.addActionListener(this);
+ void actionPerformed(e)
+ {
+ Component source = e.getSource();
+ if(source == close)
+ dialog.hide();
+ else if(source == write_set)
+ writeTableToNewBuffer(super.data, (String)combo.getSelectedItem());
+ else if(source == write_all)
+ writeAllToNewBuffer();
+ else if(source == combo)
+ {
+ super.data = makeTableDataForMode(super.data, (String)combo.getSelectedItem());
+ if( data != null)
+ {
+ DefaultTableModel model = (DefaultTableModel)table.getModel();
+ model.setDataVector(super.data, columnNames);
+ }
+ }
+ }
+
+ // workaround required by Swing bug; scheduled to be fixed in JDK 1.4
+ combo.getComponent(0).addKeyListener(this);
+ table.addKeyListener(this);
+ write_set.addKeyListener(this);
+ write_all.addKeyListener(this);
+ close.addKeyListener(this);
+ void keyPressed(e)
+ {
+ if(combo.isPopupVisible()) return;
+ if(e.getKeyCode() == KeyEvent.VK_ESCAPE ||
+ e.getKeyCode() == KeyEvent.VK_ENTER)
+ {
+ dialog.hide();
+ }
+ else if(e.getSource() != combo)
+ {
+ char ch = e.getKeyChar();
+ if(Character.isLetter(ch))
+ {
+ e.consume();
+ row = findFirstItem(ch);
+ /* The next few lines set the last visible row
+ * of the table so that you can look ahead of
+ * the selected row.
+ */
+ visibleRows =
+ table.getVisibleRect().height / table.getRowHeight();
+ oldRow = table.getSelectedRow();
+ table.setRowSelectionInterval(row,row);
+ if (visibleRows > 5 && row - oldRow > visibleRows - 3)
+ {
+ row = Math.min( super.data.size() - 1, row + 3);
+ }
+ table.scrollRectToVisible(table.getCellRect(row,0,true));
+ }
+ }
+ }
+ /*
+ * Having these members of KeyListener implemented as no-ops
+ * will speedup execution. Otherwise BeanShell throws an
+ * exception that jEdit handles internally.
+ * Under BeanShell 1.2, implementation of these methods is
+ * required.
+ */
+ void keyReleased(e) {}
+ void keyTyped(e) {}
+
+ /*
+ * findFirstItem()
+ * A simple linear search for the table entry that begins with the
+ * given letter. It returns the first row with an entry beginning with
+ * the letter, or the immdediately preceding row if there is no match
+ * on the letter.
+ *
+ */
+ int findFirstItem(char ch)
+ {
+ ch = Character.toUpperCase(ch);
+ int row = 0;
+ for(int i = 0; i < data.size(); ++i)
+ {
+ String name = ((Vector)data.elementAt(i)).elementAt(0);
+ char ch_test = Character.toUpperCase(name.charAt(0));
+ if( ch_test > ch) break;
+ else
+ {
+ row = i;
+ if( ch_test == ch) break;
+ }
+ }
+ return row;
+ }
+
+ title = "Abbreviation list";
+ dialog = new JDialog(view, title, false);
+ c = dialog.getContentPane();
+ c.add(tablePane, "Center");
+ c.add(comboPanel, "North");
+ c.add(buttonPanel, "South");
+ dialog.getRootPane().setDefaultButton(close);
+ dialog.pack();
+ dialog.setLocationRelativeTo(view);
+ dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
+ dialog.show();
+}
+
+/*
+ * The next four methods deal with writing the abbreviation sets to a new
+ * text buffer.
+ */
+void writeTableToNewBuffer(Vector v, String setName)
+{
+ Log.log(Log.DEBUG, BeanShell.class,
+ "calling writeTableToNewBuffer for " + setName);
+ writeHeader();
+ Log.log(Log.DEBUG, BeanShell.class, "size of vector = "
+ + String.valueOf(v.size()));
+ writeSet(v, setName);
+}
+
+// saved the currentSet and deleted it for makeTableDataForMode()-invocation
+// because otherwise the currently in the Dialog displayed set has no abbrevs
+// in the output written to the buffer.
+void writeAllToNewBuffer()
+{
+ writeHeader();
+ Vector vOut = new Vector();
+ savedCurrentSet = currentSet;
+ for( int i = 0; i < abbrevSets.length; ++i)
+ {
+ currentSet = null;
+ String setName = (String)abbrevSets[i];
+ vOut = makeTableDataForMode(vOut, setName);
+ writeSet(vOut, setName);
+ textArea.setSelectedText("\n\n");
+ }
+ currentSet = savedCurrentSet;
+}
+
+void writeHeader()
+{
+ jEdit.newFile(view);
+ textArea.setSelectedText("jEdit Abbreviation Table\n\n");
+}
+
+/*
+ * This truncates the definition text at 17 characters and the expansion text
+ * at 58.
+ */
+void writeSet(Vector v, String setName)
+{
+ textArea.setSelectedText("Abbreviation set: " + setName + "\n");
+ textArea.setSelectedText("Abbreviation Expansion\n\n");
+ if(v.size() == 0)
+ textArea.setSelectedText("<< No abbreviations >>\n");
+ else for( int i = 0; i < v.size(); ++i)
+ {
+ StringBuffer sb = new StringBuffer(85);
+ spaceString = " ";
+ char[] space = spaceString.toCharArray();
+ Vector row = (Vector)v.elementAt(i);
+ abbrevName = (String)row.elementAt(0);
+ if(abbrevName == null) continue;
+ if(abbrevName.length() > 17)
+ abbrevName = abbrevName.substring(0, 14) + "...";
+ sb.append(abbrevName);
+ sb.append(space, 0, 18 - (abbrevName.length()));
+ expansion = row.elementAt(1);
+ if(shortcut1 != null)
+ {
+ if(expansion.length() > 58)
+ expansion = expansion.substring(0, 55) + "...";
+ sb.append(expansion);
+ }
+ sb.append('\n');
+ textArea.setSelectedText(sb.toString());
+ }
+}
+
+
+/*
+ * main routine, including definition of global variables
+ */
+STARTING_SET = "global";
+EXCLUDE_EMPTY_SETS = true;
+abbrevSets = getActiveSets();
+currentSet = null;
+Vector data = new Vector(20, 5);
+showAbbrevs();
+
+/*
+ Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>Display_Abbreviations.bsh</filename></para>
+ <abstract><para>
+ Displays the abbreviations registered for each of jEdit's
+ editing modes.
+ </para></abstract>
+ <para>
+ The macro provides a read-only view of the abbreviations
+ contained in the <quote>Abbreviations</quote> option pane. Pressing
+ a letter key will scroll the table to the first entry beginning with
+ that letter. A further option is provided to write a selected mode's
+ abbreviations or all abbreviations in a text buffer for printing as a
+ reference. Notes in the source code listing point out some display options
+ that are configured by modifying global variables.
+ </para>
+</listitem>
+
+*/
+
+// end Display_Abbreviations.bsh
+
diff --git a/jEdit/macros/Misc/Display_Actions.bsh b/jEdit/macros/Misc/Display_Actions.bsh
index ac80e3d..003e861 100644
--- a/jEdit/macros/Misc/Display_Actions.bsh
+++ b/jEdit/macros/Misc/Display_Actions.bsh
@@ -1,76 +1,76 @@
-/*
- * Display_Actions.bsh - Displays a list of all the actions known to jEdit
- * categorised by ActionSet.
- *
- * Copyright (C) 2002 Lee Turner (lee at leeturner.org)
- * Version 1.0
- *
- * :tabSize=4:indentSize=4:noTabs=false:folding=explicit:collapseFolds=1:
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-StringBuffer buf = new StringBuffer();
-buf.append("The jEdit action bar can be opened via the Utilities menu and is usually\n");
-buf.append("assigned to the C+ENTER keyboard shortcut.\n\n");
-
-actionSets = jEdit.getActionSets();
-Arrays.sort(actionSets,new MiscUtilities.StringICaseCompare());
-
-for(i = 0; i < actionSets.length; i++)
-{
- ActionSet actionSet = actionSets[i];
- if(actionSet.getActionCount() != 0)
- {
- buf.append("{{{ " + actionSet.getLabel() + "\n");
-
- actions = actionSet.getActionNames();
- Arrays.sort(actions,new MiscUtilities.StringICaseCompare());
-
- for(j = 0; j < actions.length; j++)
- {
- String name = actions[j];
- String label = jEdit.getProperty(actions[j] + ".label");
- if(label == null)
- label = "<no label>";
- else
- label = GUIUtilities.prettifyMenuLabel(label);
- buf.append(name + " : " + label + "\n");
- }
- buf.append("}}}\n\n");
- }
-}
-buffer = jEdit.newFile(view);
-buffer.insert(0,buf.toString());
-textArea.setCaretPosition(0);
-
-buffer.setStringProperty("folding","explicit");
-buffer.setIntegerProperty("collapseFolds",1);
-buffer.propertiesChanged();
-
-/*
-Macro index data (in DocBook format)
-
-<listitem>
- <para><filename>Display_Actions.bsh</filename></para>
- <abstract><para>
- Displays a list of all the actions known to jEdit categorised by
- their action set.
- </para></abstract>
- <para>
- This macro can be a useful reference if you want to use the jEdit 4.2 action bar.
- </para>
-</listitem>
-*/
+/*
+ * Display_Actions.bsh - Displays a list of all the actions known to jEdit
+ * categorised by ActionSet.
+ *
+ * Copyright (C) 2002 Lee Turner (lee at leeturner.org)
+ * Version 1.0
+ *
+ * :tabSize=4:indentSize=4:noTabs=false:folding=explicit:collapseFolds=1:
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+StringBuffer buf = new StringBuffer();
+buf.append("The jEdit action bar can be opened via the Utilities menu and is usually\n");
+buf.append("assigned to the C+ENTER keyboard shortcut.\n\n");
+
+actionSets = jEdit.getActionSets();
+Arrays.sort(actionSets,new MiscUtilities.StringICaseCompare());
+
+for(i = 0; i < actionSets.length; i++)
+{
+ ActionSet actionSet = actionSets[i];
+ if(actionSet.getActionCount() != 0)
+ {
+ buf.append("{{{ " + actionSet.getLabel() + "\n");
+
+ actions = actionSet.getActionNames();
+ Arrays.sort(actions,new MiscUtilities.StringICaseCompare());
+
+ for(j = 0; j < actions.length; j++)
+ {
+ String name = actions[j];
+ String label = jEdit.getProperty(actions[j] + ".label");
+ if(label == null)
+ label = "<no label>";
+ else
+ label = GUIUtilities.prettifyMenuLabel(label);
+ buf.append(name + " : " + label + "\n");
+ }
+ buf.append("}}}\n\n");
+ }
+}
+buffer = jEdit.newFile(view);
+buffer.insert(0,buf.toString());
+textArea.setCaretPosition(0);
+
+buffer.setStringProperty("folding","explicit");
+buffer.setIntegerProperty("collapseFolds",1);
+buffer.propertiesChanged();
+
+/*
+Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>Display_Actions.bsh</filename></para>
+ <abstract><para>
+ Displays a list of all the actions known to jEdit categorised by
+ their action set.
+ </para></abstract>
+ <para>
+ This macro can be a useful reference if you want to use the jEdit 4.2 action bar.
+ </para>
+</listitem>
+*/
diff --git a/jEdit/macros/Misc/Display_Character_Code.bsh b/jEdit/macros/Misc/Display_Character_Code.bsh
index fc9f5ad..0c64dfb 100644
--- a/jEdit/macros/Misc/Display_Character_Code.bsh
+++ b/jEdit/macros/Misc/Display_Character_Code.bsh
@@ -1,28 +1,28 @@
-/**
- * Display int and hex values for the character at
- * the caret in the status bar.
- *
- * Copyright 2004 Ollie Rutherfurd <oliver at jedit.org>
- *
- * $Id: Display_Character_Code.bsh 5050 2004-05-24 19:24:56Z orutherfurd $
- */
-
-void displayCharacterCode(View view)
-{
- JEditTextArea textArea = view.getTextArea();
- int caret = textArea.getCaretPosition();
- int line = textArea.getCaretLine();
- if(caret < textArea.getLineEndOffset(line)-1)
- {
- char c = buffer.getText(caret,1).charAt(0);
- StringBuffer buf = new StringBuffer();
- buf.append("Character at caret: ");
- buf.append("int=").append((int)c).append(", ");
- buf.append("hex=").append(Integer.toString((int)c,16));
- view.getStatus().setMessageAndClear(buf.toString());
- }
- else
- Toolkit.getDefaultToolkit().beep();
-}
-
-displayCharacterCode(view);
+/**
+ * Display int and hex values for the character at
+ * the caret in the status bar.
+ *
+ * Copyright 2004 Ollie Rutherfurd <oliver at jedit.org>
+ *
+ * $Id: Display_Character_Code.bsh 5050 2004-05-24 19:24:56Z orutherfurd $
+ */
+
+void displayCharacterCode(View view)
+{
+ JEditTextArea textArea = view.getTextArea();
+ int caret = textArea.getCaretPosition();
+ int line = textArea.getCaretLine();
+ if(caret < textArea.getLineEndOffset(line)-1)
+ {
+ char c = buffer.getText(caret,1).charAt(0);
+ StringBuffer buf = new StringBuffer();
+ buf.append("Character at caret: ");
+ buf.append("int=").append((int)c).append(", ");
+ buf.append("hex=").append(Integer.toString((int)c,16));
+ view.getStatus().setMessageAndClear(buf.toString());
+ }
+ else
+ Toolkit.getDefaultToolkit().beep();
+}
+
+displayCharacterCode(view);
diff --git a/jEdit/macros/Misc/Display_Shortcuts.bsh b/jEdit/macros/Misc/Display_Shortcuts.bsh
index 92f96ac..2ac0e99 100644
--- a/jEdit/macros/Misc/Display_Shortcuts.bsh
+++ b/jEdit/macros/Misc/Display_Shortcuts.bsh
@@ -1,307 +1,307 @@
-/*
- * Display_shortcuts.bsh - a BeanShell macro script for the
- * jEdit text editor - displays all shortcut key assignments
- * Copyright (C) 2003 Russell Inman
- * email: RInman at csustan.edu
- *
- * Code based on Display_Shortcuts.bsh, 1.3
- * Copyright (C) 2001 John Gellene
- * email: jgellene at nyc.rr.com
- * http://community.jedit.org
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- *
- * Display_Shortcuts.bsh, v1.3.1 2003-11-13
- *
- *
- * requires jEdit3.1pre5
- *
- * Notes on use:
- *
- * This macro will display a sorted list of all keyboard shortcuts
- * in a dialog.
- *
- * Pressing a letter key will cause the table to scroll to the first row
- * with a label beginning with the letter (or the imeediately preceding row if
- * no item begins with that letter). The table is read-only; the dialog is
- * dismissed by clicking "OK" or pressing Esc or Enter.
- *
- * General comment:
- *
- * This macro illustrates the limitations of BeanShell, which cannot create
- * true derived subclasses. To get the same features, the alternative to using
- * Vectors to hold the data would be to write a highly customized sorting
- * routine. Sorting by keyname would require a second custom sorting routine.
- * There is also a hack in the code creating the table.
- *
- * Checked for jEdit 4.2pre6 API
- */
-
-import javax.swing.table.*;
-
-/*
- * method for creating vectors of row data describing shortcuts.
- */
-
-void makeShortcutsVector(Vector p_v)
-{
- String[] actionNames = jEdit.getActionNames();
- for(int i = 0; i < actionNames.length; i++)
- {
- EditAction action = jEdit.getAction(actionNames[i]);
- String name = action.getName();
- String label = action.getLabel();
- if(label == null)
- label = name;
- else label = GUIUtilities.prettifyMenuLabel(label);
- String shortcut1 = jEdit.getProperty(name + ".shortcut");
- if(shortcut1 == null)
- shortcut1 = "";
- String shortcut2 = jEdit.getProperty(name + ".shortcut2");
- if(shortcut2 == null)
- shortcut2 = "";
- if(shortcut1.length() != 0 || shortcut2.length() != 0)
- {
- p_v.addElement(makeRow(label,shortcut1,shortcut2));
- }
- }
-}
-
-/*
- * helper method to make vector of row data for table
- */
-Vector makeRow(String name, String shortcut1, String shortcut2)
-{
- Vector row = new Vector(3);
- row.addElement(name);
- row.addElement(shortcut1);
- row.addElement(shortcut2);
- return row;
-}
-
-/*
- * methods for formatting and writing shortcut data to a text buffer
- */
-
-void writeTableToNewBuffer(Vector v)
-{
- jEdit.newFile(view);
- textArea.setSelectedText("jEdit Keyboard Shortcut Table\n\n");
- headings = makeRow("Name", "Shortcut - 1", "Shortcut - 2");
- writeLine(headings);
- textArea.setSelectedText("\n");
- for(int i = 0; i < v.size(); ++i)
- {
- writeLine((Vector)v.elementAt(i));
- }
-}
-
-void writeLine(Vector row)
-{
- StringBuffer sb = new StringBuffer(85);
- spaceString = " ";
- char[] space = spaceString.toCharArray();
- displayName = row.elementAt(0);
- if(displayName.length() > 38)
- displayName = displayName.substring(0, 34) + "...";
- sb.append(displayName);
- sb.append(space, 0, 40 - (displayName.length()));
- shortcut1 = row.elementAt(1);
- if(shortcut1 != null)
- {
- sb.append(shortcut1);
- sb.append(space, 0, 20 - (shortcut1.length()));
- }
- else sb.append(space, 0, 20);
- shortcut2 = row.elementAt(2);
- if(shortcut2 != null)
- {
- sb.append(shortcut2);
- sb.append(space, 0, 20 - (shortcut2.length()));
- }
- sb.append('\n');
- textArea.setSelectedText(sb.toString());
-}
-
-/*
- * main routine
- */
-void showShortcuts(View view)
-{
- this.view = view;
-
- Vector v = new Vector();
- makeShortcutsVector(v);
- MiscUtilities.quicksort(v, new MiscUtilities.StringICaseCompare());
-
- table = new JTable(v, makeRow( "Name", "Shortcut-1", "Shortcut-2"));
- table.getColumnModel().getColumn(0).setPreferredWidth(200);
- table.setRowSelectionAllowed(true);
- /* The next line prevents the table from being edited.
- * The normal approach in Java would be to subclass the TableModel
- * associated with the JTable and define TableModel.isCellEditable()
- * to return false. However, BeanShell does not allow conventional
- * class creation, and the desired behavior cannot be achieved using
- * its scripted object feature.
- */
- table.setDefaultEditor(Object.class, null);
- if(table.getRowCount() != 0)
- {
- table.setRowSelectionInterval(0, 0);
- table.setColumnSelectionInterval(1, 1);
- }
-
- tablePane = new JScrollPane(table);
- tablePane.setPreferredSize(new Dimension(450, 300));
-
- close = new JButton("Close");
- close.addActionListener(this);
- write = new JButton("Write to buffer");
- write.addActionListener(this);
- void actionPerformed(e)
- {
- if(e.getSource().getText().equals("Close"))
- dialog.hide();
- else writeTableToNewBuffer(v);
- }
- buttonPanel = new JPanel(new FlowLayout());
- buttonPanel.add(write);
- buttonPanel.add(close);
-
- title = "Keyboard shortcut list";
- dialog = new JDialog(view, title, false);
- dialog.getContentPane().add(tablePane, "Center");
- dialog.getContentPane().add(buttonPanel, "South");
- dialog.getRootPane().setDefaultButton(close);
-
-
- table.addKeyListener(this);
- void keyPressed(e)
- {
- if(e.getKeyCode() == KeyEvent.VK_ESCAPE ||
- e.getKeyCode() == KeyEvent.VK_ENTER)
- {
- dialog.hide();
- }
- else
- {
- char ch = e.getKeyChar();
- if(Character.isLetter(ch))
- {
- e.consume();
- row = findFirstItem(ch);
- /* The next few lines set the last visible row
- * of the table so that you can look ahead of
- * the selected row.
- */
- visibleRows =
- table.getVisibleRect().height / table.getRowHeight();
- oldRow = table.getSelectedRow();
- table.setRowSelectionInterval(row,row);
- if (visibleRows > 5 && row - oldRow > visibleRows - 3)
- {
- row = Math.min( v.size() - 1, row + 3);
- }
- table.scrollRectToVisible(table.getCellRect(row,0,true));
- }
- }
- }
- /*
- * Having these members of KeyListener implemented will speedup execution;
- * BeanShell will otherwise throw and handle an exception.
- * This idiom is required under BeanShell 1.2
- */
- void keyReleased(e) {}
- void keyTyped(e) {}
-
-
- /*
- * A simple linear search for the table entry that begins with the
- * given letter. It returns the first row with an entry beginning with
- * the letter, or the immdediately preceding row if there is no match
- * on the letter. If PUT_MACROS_AT_END is set to true, they will not be
- * searched.
- *
- */
- int data_midpoint = 0;
- int findFirstItem(char ch)
- {
- ch = Character.toUpperCase(ch);
- int row = 0;
- int fix_err = ch > 'L' ? data_midpoint : 0;
- for(int i = fix_err; i < v.size(); ++i)
- {
- String name = ((Vector)v.elementAt(i)).elementAt(0);
- char ch_test = Character.toUpperCase(name.charAt(0));
- if( ch_test > ch) break;
- else
- {
- row = i;
- if( ch_test == ch) break;
- }
- }
- return row;
- }
- /* This line caches the row that starts the second half of the
- * alphabet to speed up searches. 'M' was chosen as the midpoint
- * to speed up searches.
- */
- data_midpoint = findFirstItem('M');
- dialog.pack();
- dialog.setLocationRelativeTo(view);
- dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
- dialog.show();
-}
-
-showShortcuts(view);
-
-/*
- Macro index data (in DocBook format)
-
-<listitem>
- <para><filename>Display_Shortcuts.bsh</filename></para>
- <abstract><para>
- Displays a sorted list of the keyboard shortcuts currently in effect.
- </para></abstract>
- <para>
- The macro provides a combined read-only view of command, macro
- and plugin shortcuts. Pressing a letter key will
- scroll the table to the first entry beginning with that letter.
- A further option is provided to write the shortcut assignments in a
- text buffer for printing as a reference. Notes in the source code
- listing point out some display options that are configured by
- modifying global variables.
- </para>
-</listitem>
-
-*/
-
-/*
- Changes from v1.3
- - Since makeShortcutsVector() had no return statement, the return type was
- changed to void.
- - Removed deprecated jEdit.getEditActions() call from makeShortcutsVector
- - The original makeShortcutsVector method referenced a variable v,
- presumably from showShortcuts(), which was outside of its scope.
- I don't know if some new scoping rule in BeanShell broke this or not.
- At any rate, the method has been updated so that it takes a
- Vector as a parameter.
- - Added an explicit declaration for Vector v to showShortcuts in order to
- pass it to makeShortcutsVector
-*/
-
-// end Display_Shortcuts.bsh
-
+/*
+ * Display_shortcuts.bsh - a BeanShell macro script for the
+ * jEdit text editor - displays all shortcut key assignments
+ * Copyright (C) 2003 Russell Inman
+ * email: RInman at csustan.edu
+ *
+ * Code based on Display_Shortcuts.bsh, 1.3
+ * Copyright (C) 2001 John Gellene
+ * email: jgellene at nyc.rr.com
+ * http://community.jedit.org
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ *
+ * Display_Shortcuts.bsh, v1.3.1 2003-11-13
+ *
+ *
+ * requires jEdit3.1pre5
+ *
+ * Notes on use:
+ *
+ * This macro will display a sorted list of all keyboard shortcuts
+ * in a dialog.
+ *
+ * Pressing a letter key will cause the table to scroll to the first row
+ * with a label beginning with the letter (or the imeediately preceding row if
+ * no item begins with that letter). The table is read-only; the dialog is
+ * dismissed by clicking "OK" or pressing Esc or Enter.
+ *
+ * General comment:
+ *
+ * This macro illustrates the limitations of BeanShell, which cannot create
+ * true derived subclasses. To get the same features, the alternative to using
+ * Vectors to hold the data would be to write a highly customized sorting
+ * routine. Sorting by keyname would require a second custom sorting routine.
+ * There is also a hack in the code creating the table.
+ *
+ * Checked for jEdit 4.2pre6 API
+ */
+
+import javax.swing.table.*;
+
+/*
+ * method for creating vectors of row data describing shortcuts.
+ */
+
+void makeShortcutsVector(Vector p_v)
+{
+ String[] actionNames = jEdit.getActionNames();
+ for(int i = 0; i < actionNames.length; i++)
+ {
+ EditAction action = jEdit.getAction(actionNames[i]);
+ String name = action.getName();
+ String label = action.getLabel();
+ if(label == null)
+ label = name;
+ else label = GUIUtilities.prettifyMenuLabel(label);
+ String shortcut1 = jEdit.getProperty(name + ".shortcut");
+ if(shortcut1 == null)
+ shortcut1 = "";
+ String shortcut2 = jEdit.getProperty(name + ".shortcut2");
+ if(shortcut2 == null)
+ shortcut2 = "";
+ if(shortcut1.length() != 0 || shortcut2.length() != 0)
+ {
+ p_v.addElement(makeRow(label,shortcut1,shortcut2));
+ }
+ }
+}
+
+/*
+ * helper method to make vector of row data for table
+ */
+Vector makeRow(String name, String shortcut1, String shortcut2)
+{
+ Vector row = new Vector(3);
+ row.addElement(name);
+ row.addElement(shortcut1);
+ row.addElement(shortcut2);
+ return row;
+}
+
+/*
+ * methods for formatting and writing shortcut data to a text buffer
+ */
+
+void writeTableToNewBuffer(Vector v)
+{
+ jEdit.newFile(view);
+ textArea.setSelectedText("jEdit Keyboard Shortcut Table\n\n");
+ headings = makeRow("Name", "Shortcut - 1", "Shortcut - 2");
+ writeLine(headings);
+ textArea.setSelectedText("\n");
+ for(int i = 0; i < v.size(); ++i)
+ {
+ writeLine((Vector)v.elementAt(i));
+ }
+}
+
+void writeLine(Vector row)
+{
+ StringBuffer sb = new StringBuffer(85);
+ spaceString = " ";
+ char[] space = spaceString.toCharArray();
+ displayName = row.elementAt(0);
+ if(displayName.length() > 38)
+ displayName = displayName.substring(0, 34) + "...";
+ sb.append(displayName);
+ sb.append(space, 0, 40 - (displayName.length()));
+ shortcut1 = row.elementAt(1);
+ if(shortcut1 != null)
+ {
+ sb.append(shortcut1);
+ sb.append(space, 0, 20 - (shortcut1.length()));
+ }
+ else sb.append(space, 0, 20);
+ shortcut2 = row.elementAt(2);
+ if(shortcut2 != null)
+ {
+ sb.append(shortcut2);
+ sb.append(space, 0, 20 - (shortcut2.length()));
+ }
+ sb.append('\n');
+ textArea.setSelectedText(sb.toString());
+}
+
+/*
+ * main routine
+ */
+void showShortcuts(View view)
+{
+ this.view = view;
+
+ Vector v = new Vector();
+ makeShortcutsVector(v);
+ MiscUtilities.quicksort(v, new MiscUtilities.StringICaseCompare());
+
+ table = new JTable(v, makeRow( "Name", "Shortcut-1", "Shortcut-2"));
+ table.getColumnModel().getColumn(0).setPreferredWidth(200);
+ table.setRowSelectionAllowed(true);
+ /* The next line prevents the table from being edited.
+ * The normal approach in Java would be to subclass the TableModel
+ * associated with the JTable and define TableModel.isCellEditable()
+ * to return false. However, BeanShell does not allow conventional
+ * class creation, and the desired behavior cannot be achieved using
+ * its scripted object feature.
+ */
+ table.setDefaultEditor(Object.class, null);
+ if(table.getRowCount() != 0)
+ {
+ table.setRowSelectionInterval(0, 0);
+ table.setColumnSelectionInterval(1, 1);
+ }
+
+ tablePane = new JScrollPane(table);
+ tablePane.setPreferredSize(new Dimension(450, 300));
+
+ close = new JButton("Close");
+ close.addActionListener(this);
+ write = new JButton("Write to buffer");
+ write.addActionListener(this);
+ void actionPerformed(e)
+ {
+ if(e.getSource().getText().equals("Close"))
+ dialog.hide();
+ else writeTableToNewBuffer(v);
+ }
+ buttonPanel = new JPanel(new FlowLayout());
+ buttonPanel.add(write);
+ buttonPanel.add(close);
+
+ title = "Keyboard shortcut list";
+ dialog = new JDialog(view, title, false);
+ dialog.getContentPane().add(tablePane, "Center");
+ dialog.getContentPane().add(buttonPanel, "South");
+ dialog.getRootPane().setDefaultButton(close);
+
+
+ table.addKeyListener(this);
+ void keyPressed(e)
+ {
+ if(e.getKeyCode() == KeyEvent.VK_ESCAPE ||
+ e.getKeyCode() == KeyEvent.VK_ENTER)
+ {
+ dialog.hide();
+ }
+ else
+ {
+ char ch = e.getKeyChar();
+ if(Character.isLetter(ch))
+ {
+ e.consume();
+ row = findFirstItem(ch);
+ /* The next few lines set the last visible row
+ * of the table so that you can look ahead of
+ * the selected row.
+ */
+ visibleRows =
+ table.getVisibleRect().height / table.getRowHeight();
+ oldRow = table.getSelectedRow();
+ table.setRowSelectionInterval(row,row);
+ if (visibleRows > 5 && row - oldRow > visibleRows - 3)
+ {
+ row = Math.min( v.size() - 1, row + 3);
+ }
+ table.scrollRectToVisible(table.getCellRect(row,0,true));
+ }
+ }
+ }
+ /*
+ * Having these members of KeyListener implemented will speedup execution;
+ * BeanShell will otherwise throw and handle an exception.
+ * This idiom is required under BeanShell 1.2
+ */
+ void keyReleased(e) {}
+ void keyTyped(e) {}
+
+
+ /*
+ * A simple linear search for the table entry that begins with the
+ * given letter. It returns the first row with an entry beginning with
+ * the letter, or the immdediately preceding row if there is no match
+ * on the letter. If PUT_MACROS_AT_END is set to true, they will not be
+ * searched.
+ *
+ */
+ int data_midpoint = 0;
+ int findFirstItem(char ch)
+ {
+ ch = Character.toUpperCase(ch);
+ int row = 0;
+ int fix_err = ch > 'L' ? data_midpoint : 0;
+ for(int i = fix_err; i < v.size(); ++i)
+ {
+ String name = ((Vector)v.elementAt(i)).elementAt(0);
+ char ch_test = Character.toUpperCase(name.charAt(0));
+ if( ch_test > ch) break;
+ else
+ {
+ row = i;
+ if( ch_test == ch) break;
+ }
+ }
+ return row;
+ }
+ /* This line caches the row that starts the second half of the
+ * alphabet to speed up searches. 'M' was chosen as the midpoint
+ * to speed up searches.
+ */
+ data_midpoint = findFirstItem('M');
+ dialog.pack();
+ dialog.setLocationRelativeTo(view);
+ dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
+ dialog.show();
+}
+
+showShortcuts(view);
+
+/*
+ Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>Display_Shortcuts.bsh</filename></para>
+ <abstract><para>
+ Displays a sorted list of the keyboard shortcuts currently in effect.
+ </para></abstract>
+ <para>
+ The macro provides a combined read-only view of command, macro
+ and plugin shortcuts. Pressing a letter key will
+ scroll the table to the first entry beginning with that letter.
+ A further option is provided to write the shortcut assignments in a
+ text buffer for printing as a reference. Notes in the source code
+ listing point out some display options that are configured by
+ modifying global variables.
+ </para>
+</listitem>
+
+*/
+
+/*
+ Changes from v1.3
+ - Since makeShortcutsVector() had no return statement, the return type was
+ changed to void.
+ - Removed deprecated jEdit.getEditActions() call from makeShortcutsVector
+ - The original makeShortcutsVector method referenced a variable v,
+ presumably from showShortcuts(), which was outside of its scope.
+ I don't know if some new scoping rule in BeanShell broke this or not.
+ At any rate, the method has been updated so that it takes a
+ Vector as a parameter.
+ - Added an explicit declaration for Vector v to showShortcuts in order to
+ pass it to makeShortcutsVector
+*/
+
+// end Display_Shortcuts.bsh
+
diff --git a/jEdit/macros/Misc/Evaluate_Buffer_in_BeanShell.bsh b/jEdit/macros/Misc/Evaluate_Buffer_in_BeanShell.bsh
index c693675..78bd5f0 100644
--- a/jEdit/macros/Misc/Evaluate_Buffer_in_BeanShell.bsh
+++ b/jEdit/macros/Misc/Evaluate_Buffer_in_BeanShell.bsh
@@ -1,61 +1,61 @@
-/*
- * Evaluate_Buffer_in_BeanShell.bsh - a BeanShell macro script for the
- * jEdit text editor - evaluates contents of buffer as
- * BeanShell script
- * Copyright (C) 2001 John Gellene
- * jgellene at nyc.rr.com
- * http://community.jedit.org
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with the jEdit program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id: Evaluate_Buffer_in_BeanShell.bsh 10596 2007-09-19 00:02:50Z Vampire0 $
- *
- * Checked for jEdit 4.0 API
- *
- */
-
-script = buffer.getText(0,buffer.getLength());
-buffer = jEdit.newFile(view);
-result = BeanShell.eval(view,BeanShell.getNameSpace(),script);
-if (null != result) {
- buffer.insert(buffer.getLength(),"\n" + result);
-}
-
-/*
- Macro index data (in DocBook format)
-
-<listitem>
- <para><filename>Evaluate_Buffer_in_BeanShell.bsh</filename></para>
- <abstract><para>
- Evaluates contents of current buffer as a BeanShell script,
- and opens a new
- buffer to receive any text output.
- </para></abstract>
- <para>
- This is a quick way to test a macro script even before its text
- is saved to a file. Opening a new buffer for output is a precaution
- to prevent the macro from inadvertently erasing or overwriting
- itself. BeanShell scripts that operate on the contents of the
- current buffer will not work meaningfully when tested using this
- macro. If the script returns any value, the result of its toString()
- method is appended in a new line to the newly created buffer.
- </para>
-</listitem>
-
-*/
-
-
-// end of Evaluate_Buffer_in_BeanShell.bsh
-
+/*
+ * Evaluate_Buffer_in_BeanShell.bsh - a BeanShell macro script for the
+ * jEdit text editor - evaluates contents of buffer as
+ * BeanShell script
+ * Copyright (C) 2001 John Gellene
+ * jgellene at nyc.rr.com
+ * http://community.jedit.org
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the jEdit program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id: Evaluate_Buffer_in_BeanShell.bsh 10596 2007-09-19 00:02:50Z Vampire0 $
+ *
+ * Checked for jEdit 4.0 API
+ *
+ */
+
+script = buffer.getText(0,buffer.getLength());
+buffer = jEdit.newFile(view);
+result = BeanShell.eval(view,BeanShell.getNameSpace(),script);
+if (null != result) {
+ buffer.insert(buffer.getLength(),"\n" + result);
+}
+
+/*
+ Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>Evaluate_Buffer_in_BeanShell.bsh</filename></para>
+ <abstract><para>
+ Evaluates contents of current buffer as a BeanShell script,
+ and opens a new
+ buffer to receive any text output.
+ </para></abstract>
+ <para>
+ This is a quick way to test a macro script even before its text
+ is saved to a file. Opening a new buffer for output is a precaution
+ to prevent the macro from inadvertently erasing or overwriting
+ itself. BeanShell scripts that operate on the contents of the
+ current buffer will not work meaningfully when tested using this
+ macro. If the script returns any value, the result of its toString()
+ method is appended in a new line to the newly created buffer.
+ </para>
+</listitem>
+
+*/
+
+
+// end of Evaluate_Buffer_in_BeanShell.bsh
+
diff --git a/jEdit/macros/Misc/Hex_Convert.bsh b/jEdit/macros/Misc/Hex_Convert.bsh
index 03378b8..ab1cdb9 100644
--- a/jEdit/macros/Misc/Hex_Convert.bsh
+++ b/jEdit/macros/Misc/Hex_Convert.bsh
@@ -1,106 +1,106 @@
-/*
- * Hex_Convert.bsh - a BeanShell macro script for the
- * jEdit text editor - Converts byte characters to their
- * hex equivalent, and vice versa.
- * Copyright (C) 2001 Will Sargent
- * will_sargent at yahoo.dom
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with the jEdit program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id: Hex_Convert.bsh 5224 2005-06-08 22:33:27Z orutherfurd $
- */
-
-import java.io.*;
-import java.util.*;
-
-char[] hexDigit = new char[]
-{
- '0', '1', '2', '3', '4', '5', '6', '7',
- '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
-};
-
-String byteToHex(byte b)
-{
- char[] chars = new char[]
- {
- hexDigit[(b >> 4) & 0x0f],
- hexDigit[b & 0x0f]
- };
- return new String(chars);
-}
-
-void print(String line)
-{
- Macros.message(view, line);
-}
-
-void stringToByte(String target)
-{
- byte[] string = target.getBytes();
-
- StringBuffer foo = new StringBuffer();
- foo.append("before = " + target);
- foo.append("\nafter = ");
-
- int length = string.length;
- for (int i = 0; i < length; i++)
- {
- foo.append("0x" + byteToHex(string[i]));
- if (i < length - 1) foo.append(" ");
- }
- print(foo.toString());
-}
-
-void byteToString(String target)
-{
- if(target.length() == 0)
- return;
-
- try
- {
- byte b = Byte.parseByte(target, 16);
- String str = new String(new byte[] { b });
-
- StringBuffer foo = new StringBuffer();
- foo.append("" + target + " = " + str);
-
- print(foo.toString());
- }
- catch(NumberFormatException nfe)
- {
- Macros.error(view, "" + target + " is not valid hex string.");
- }
-}
-
-String target = Macros.input(view,"Byte to String:");
-if(target != null)
- byteToString(target);
-
-
-/*
-
-Macro index data (in DocBook format)
-
- <listitem>
- <para><filename>Hex_Convert.bsh</filename></para>
- <abstract><para>
- Converts byte characters to their hex equivalent, and vice versa.
- </para></abstract>
- </listitem>
-
-*/
-
-// end Hex_Convert.bsh
-
+/*
+ * Hex_Convert.bsh - a BeanShell macro script for the
+ * jEdit text editor - Converts byte characters to their
+ * hex equivalent, and vice versa.
+ * Copyright (C) 2001 Will Sargent
+ * will_sargent at yahoo.dom
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the jEdit program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id: Hex_Convert.bsh 5224 2005-06-08 22:33:27Z orutherfurd $
+ */
+
+import java.io.*;
+import java.util.*;
+
+char[] hexDigit = new char[]
+{
+ '0', '1', '2', '3', '4', '5', '6', '7',
+ '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
+};
+
+String byteToHex(byte b)
+{
+ char[] chars = new char[]
+ {
+ hexDigit[(b >> 4) & 0x0f],
+ hexDigit[b & 0x0f]
+ };
+ return new String(chars);
+}
+
+void print(String line)
+{
+ Macros.message(view, line);
+}
+
+void stringToByte(String target)
+{
+ byte[] string = target.getBytes();
+
+ StringBuffer foo = new StringBuffer();
+ foo.append("before = " + target);
+ foo.append("\nafter = ");
+
+ int length = string.length;
+ for (int i = 0; i < length; i++)
+ {
+ foo.append("0x" + byteToHex(string[i]));
+ if (i < length - 1) foo.append(" ");
+ }
+ print(foo.toString());
+}
+
+void byteToString(String target)
+{
+ if(target.length() == 0)
+ return;
+
+ try
+ {
+ byte b = Byte.parseByte(target, 16);
+ String str = new String(new byte[] { b });
+
+ StringBuffer foo = new StringBuffer();
+ foo.append("" + target + " = " + str);
+
+ print(foo.toString());
+ }
+ catch(NumberFormatException nfe)
+ {
+ Macros.error(view, "" + target + " is not valid hex string.");
+ }
+}
+
+String target = Macros.input(view,"Byte to String:");
+if(target != null)
+ byteToString(target);
+
+
+/*
+
+Macro index data (in DocBook format)
+
+ <listitem>
+ <para><filename>Hex_Convert.bsh</filename></para>
+ <abstract><para>
+ Converts byte characters to their hex equivalent, and vice versa.
+ </para></abstract>
+ </listitem>
+
+*/
+
+// end Hex_Convert.bsh
+
diff --git a/jEdit/macros/Misc/HyperSearch_Results_to_Buffer.bsh b/jEdit/macros/Misc/HyperSearch_Results_to_Buffer.bsh
index 9a893ce..48c1233 100644
--- a/jEdit/macros/Misc/HyperSearch_Results_to_Buffer.bsh
+++ b/jEdit/macros/Misc/HyperSearch_Results_to_Buffer.bsh
@@ -1,98 +1,98 @@
-/*
- * HyperSearch_Results_to_Buffer.bsh - a Beanshell macro
- * for jEdit text that writes HyperSearch results
- * matches to a new buffer in the format:
- *
- * * <search string>
- * <filename> :<linenum>: <line text>
- *
- * Copyright (C) 2002, 2003 Ollie Rutherfurd <oliver at rutherfurd.net>
- * 2008: Shlomy Reinstein - added search string and include all searches
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id: HyperSearch_Results_to_Buffer.bsh 14007 2008-11-04 21:37:36Z shlomy $
- */
-
-traverseTree(javax.swing.tree.DefaultMutableTreeNode node, StringBuffer results){
- if (node.getUserObject() instanceof org.gjt.sp.jedit.search.HyperSearchFileNode)
- {
- path = node.getUserObject().path;
- match = node.getFirstChild();
- while(match != null)
- {
- text = match.getUserObject().str;
- results.append(path + " :" + text + "\n");
- match = match.getNextSibling();
- }
- }
- else
- {
- for (Enumeration e = node.children(); e.hasMoreElements();)
- traverseTree(e.nextElement(), results);
- }
-}
-
-writeHypersearchResultsToBuffer(View view){
- hs = view.getDockableWindowManager().getDockableWindow("hypersearch-results");
- if (hs == null)
- {
- Macros.error(view, "The 'HyperSearch Results' window is not open.");
- return;
- }
-
- root = hs.getTreeModel().getRoot();
- if(root == null || root.getDepth() == 0)
- {
- Macros.error(view, "No HyperSearch matches.");
- return;
- }
-
- results = new StringBuffer();
- node = root.getFirstChild();
- while(node != null)
- {
- Object object = node.getUserObject();
- if (! (object instanceof org.gjt.sp.jedit.search.HyperSearchOperationNode))
- continue;
- results.append("* " + object.getSearchMatcher() + "\n");
- traverseTree(node, results);
- node = node.getNextSibling();
- }
-
- text = results.toString();
- if(text.length() > 0)
- {
- jEdit.newFile(view);
- view.getTextArea().setText(text);
- }
-}
-
-setAccessibility(true);
-writeHypersearchResultsToBuffer(view);
-setAccessibility(false);
-/*
- Macro index data (in DocBook format)
-
-<listitem>
- <para><filename>HyperSearch_Results_to_Buffer.bsh</filename></para>
- <abstract><para>
- Writes HyperSeach results to a new buffer.
- </para></abstract>
-</listitem>
-
-*/
-
-// :wrap=none:collapseFolds=0:noTabs=false:lineSeparator=\n:maxLineLen=80:indentSize=4:deepIndent=false:folding=none:
+/*
+ * HyperSearch_Results_to_Buffer.bsh - a Beanshell macro
+ * for jEdit text that writes HyperSearch results
+ * matches to a new buffer in the format:
+ *
+ * * <search string>
+ * <filename> :<linenum>: <line text>
+ *
+ * Copyright (C) 2002, 2003 Ollie Rutherfurd <oliver at rutherfurd.net>
+ * 2008: Shlomy Reinstein - added search string and include all searches
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id: HyperSearch_Results_to_Buffer.bsh 14007 2008-11-04 21:37:36Z shlomy $
+ */
+
+traverseTree(javax.swing.tree.DefaultMutableTreeNode node, StringBuffer results){
+ if (node.getUserObject() instanceof org.gjt.sp.jedit.search.HyperSearchFileNode)
+ {
+ path = node.getUserObject().path;
+ match = node.getFirstChild();
+ while(match != null)
+ {
+ text = match.getUserObject().str;
+ results.append(path + " :" + text + "\n");
+ match = match.getNextSibling();
+ }
+ }
+ else
+ {
+ for (Enumeration e = node.children(); e.hasMoreElements();)
+ traverseTree(e.nextElement(), results);
+ }
+}
+
+writeHypersearchResultsToBuffer(View view){
+ hs = view.getDockableWindowManager().getDockableWindow("hypersearch-results");
+ if (hs == null)
+ {
+ Macros.error(view, "The 'HyperSearch Results' window is not open.");
+ return;
+ }
+
+ root = hs.getTreeModel().getRoot();
+ if(root == null || root.getDepth() == 0)
+ {
+ Macros.error(view, "No HyperSearch matches.");
+ return;
+ }
+
+ results = new StringBuffer();
+ node = root.getFirstChild();
+ while(node != null)
+ {
+ Object object = node.getUserObject();
+ if (! (object instanceof org.gjt.sp.jedit.search.HyperSearchOperationNode))
+ continue;
+ results.append("* " + object.getSearchMatcher() + "\n");
+ traverseTree(node, results);
+ node = node.getNextSibling();
+ }
+
+ text = results.toString();
+ if(text.length() > 0)
+ {
+ jEdit.newFile(view);
+ view.getTextArea().setText(text);
+ }
+}
+
+setAccessibility(true);
+writeHypersearchResultsToBuffer(view);
+setAccessibility(false);
+/*
+ Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>HyperSearch_Results_to_Buffer.bsh</filename></para>
+ <abstract><para>
+ Writes HyperSeach results to a new buffer.
+ </para></abstract>
+</listitem>
+
+*/
+
+// :wrap=none:collapseFolds=0:noTabs=false:lineSeparator=\n:maxLineLen=80:indentSize=4:deepIndent=false:folding=none:
diff --git a/jEdit/macros/Misc/Make_Bug_Report.bsh b/jEdit/macros/Misc/Make_Bug_Report.bsh
index f752a45..86bee2b 100644
--- a/jEdit/macros/Misc/Make_Bug_Report.bsh
+++ b/jEdit/macros/Misc/Make_Bug_Report.bsh
@@ -1,118 +1,118 @@
-/*
- * Make_Bug_Report.bsh - a BeanShell macro script for the
- * jEdit text editor - creates a new buffer with installation and
- * error information extracted from jEdit's Activity Log.
- * Copyright (C) 2001 John Gellene
- * jgellene at nyc.rr.com
- * http://community.jedit.org
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id: Make_Bug_Report.bsh 3873 2001-11-06 17:57:35Z jgellene $
- *
- * Checked for jEdit 4.0 API
- *
- */
-
-makeBugReport()
-{
- Log.flushStream();
- path = jEdit.getSettingsDirectory() + File.separator
- + "activity.log";
- try
- {
- file = new FileInputStream(path);
- reader = new BufferedReader(new InputStreamReader(file));
- }
- catch(IOException e)
- {
- Macros.error(view, "Error opening Activity Log.");
- return;
- }
- report = new StringBuffer();
-
- report.append("Activity log entries that might be useful in a bug report:\n\n");
-
- lastError = new StringBuffer();
- insideError = false;
- startupDone = false;
- activityLogHeaderLines = 9;
- try
- {
- for(i = 0; i < activityLogHeaderLines; ++i)
- {
- report.append(reader.readLine()).append('\n');
- }
- while((line = reader.readLine()) != null)
- {
- if(!startupDone &&
- (line.startsWith("[message] jEdit:")
- || line.startsWith("[notice] jEdit:")
- || line.startsWith("[notice] JARClassLoader:")))
- {
- report.append(line).append('\n');
- if(line.equals("[message] jEdit: Startup complete"))
- {
- startupDone = true;
- }
- }
- else if(line.startsWith("[error]"))
- {
- if(!insideError)
- {
- lastError.setLength(0);
- insideError = true;
- }
- lastError.append(line).append('\n');
- }
- else
- insideError = false;
- }
- reader.close();
- }
- catch(IOException e)
- {
- Macros.error(view, "Error reading Activity Log");
- }
-
- report.append(lastError.toString());
- newBuffer = jEdit.newFile(view);
- newBuffer.insert(0, report.toString());
-}
-
-makeBugReport();
-
-/*
-jEdit macro index data (DocBook format)
-
- <listitem>
- <para><filename>Make_Bug_Report.bsh</filename></para>
- <abstract><para>
- Creates a new buffer with installation and error information
- extracted from the Activity Log.
- </para></abstract>
- <para>
- The macro extracts initial messages written to the Activity Log
- describing the user's operating system, JDK, jEdit version and
- installed plugins. It then appends the last set of error messages
- written to the Activity Log. The new text buffer can be saved and
- attached to an email message or a bug report made on SourceForge.
- </para>
- </listitem>
-
-*/
-
-// end Make_Bug_Report.bsh
-
+/*
+ * Make_Bug_Report.bsh - a BeanShell macro script for the
+ * jEdit text editor - creates a new buffer with installation and
+ * error information extracted from jEdit's Activity Log.
+ * Copyright (C) 2001 John Gellene
+ * jgellene at nyc.rr.com
+ * http://community.jedit.org
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id: Make_Bug_Report.bsh 3873 2001-11-06 17:57:35Z jgellene $
+ *
+ * Checked for jEdit 4.0 API
+ *
+ */
+
+makeBugReport()
+{
+ Log.flushStream();
+ path = jEdit.getSettingsDirectory() + File.separator
+ + "activity.log";
+ try
+ {
+ file = new FileInputStream(path);
+ reader = new BufferedReader(new InputStreamReader(file));
+ }
+ catch(IOException e)
+ {
+ Macros.error(view, "Error opening Activity Log.");
+ return;
+ }
+ report = new StringBuffer();
+
+ report.append("Activity log entries that might be useful in a bug report:\n\n");
+
+ lastError = new StringBuffer();
+ insideError = false;
+ startupDone = false;
+ activityLogHeaderLines = 9;
+ try
+ {
+ for(i = 0; i < activityLogHeaderLines; ++i)
+ {
+ report.append(reader.readLine()).append('\n');
+ }
+ while((line = reader.readLine()) != null)
+ {
+ if(!startupDone &&
+ (line.startsWith("[message] jEdit:")
+ || line.startsWith("[notice] jEdit:")
+ || line.startsWith("[notice] JARClassLoader:")))
+ {
+ report.append(line).append('\n');
+ if(line.equals("[message] jEdit: Startup complete"))
+ {
+ startupDone = true;
+ }
+ }
+ else if(line.startsWith("[error]"))
+ {
+ if(!insideError)
+ {
+ lastError.setLength(0);
+ insideError = true;
+ }
+ lastError.append(line).append('\n');
+ }
+ else
+ insideError = false;
+ }
+ reader.close();
+ }
+ catch(IOException e)
+ {
+ Macros.error(view, "Error reading Activity Log");
+ }
+
+ report.append(lastError.toString());
+ newBuffer = jEdit.newFile(view);
+ newBuffer.insert(0, report.toString());
+}
+
+makeBugReport();
+
+/*
+jEdit macro index data (DocBook format)
+
+ <listitem>
+ <para><filename>Make_Bug_Report.bsh</filename></para>
+ <abstract><para>
+ Creates a new buffer with installation and error information
+ extracted from the Activity Log.
+ </para></abstract>
+ <para>
+ The macro extracts initial messages written to the Activity Log
+ describing the user's operating system, JDK, jEdit version and
+ installed plugins. It then appends the last set of error messages
+ written to the Activity Log. The new text buffer can be saved and
+ attached to an email message or a bug report made on SourceForge.
+ </para>
+ </listitem>
+
+*/
+
+// end Make_Bug_Report.bsh
+
diff --git a/jEdit/macros/Misc/Run_Script.bsh b/jEdit/macros/Misc/Run_Script.bsh
index ffc1da1..8beb67a 100644
--- a/jEdit/macros/Misc/Run_Script.bsh
+++ b/jEdit/macros/Misc/Run_Script.bsh
@@ -1,126 +1,126 @@
-/*
- * Run_Script.bsh - a BeanShell macro script for the
- * jEdit text editor - Runs script using interpreter based upon
- * buffer's editing mode (by default, determined using file extension).
- *
- * Copyright (C) 2001 John Gellene
- * jgellene at nyc.rr.com
- * http://community.jedit.org
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with the jEdit program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id: Run_Script.bsh 3912 2001-11-24 03:56:51Z jgellene $
- */
-
-
-void execScript(interpreter, command)
-{
- params = Macros.input(view,
- "Specify parameters for running script under " + interpreter);
- if(params == null)
- {
- Macros.message(view, "Script execution was cancelled.");
- return;
- }
- runInSystemShell(view, command + params);
-}
-
-void runScript()
-{
- if(buffer.isNewFile())
- buffer.saveAs(view, true);
- else
- buffer.save(view, buffer.getPath());
- mode = buffer.getMode().getName();
- path = buffer.getPath() + " ";
- os = System.getProperty("os.name");
- if(os.indexOf("Windows") != -1)
- path = "\"" + path + "\"";
- if(mode.equals("beanshell")) {
- source(path);
- }
- else if(mode.equals("awk")) {
- execScript("awk", "awk -f " + path);
- }
- else if(mode.equals("batch")) {
- if(os.indexOf("Windows 9") == -1
- && os.indexOf("Windows M") == -1)
- {
- execScript("shell", "cmd /C " + path);
- }
- else execScript("shell", "command /C " + path);
- }
- else if(mode.equals("javascript")) {
- execScript("Windows Script Host", "wscript " + path);
- }
- else if(mode.equals("jmk")) {
- execScript("jmk", "java -jar jmk.jar -f" + path);
- }
- else if(mode.equals("makefile")) {
- if(os.indexOf("Windows") == -1) {
- execScript("make", "make -f " + path);
- }
- else {
- execScript("nmake", "nmake -f " + path);
- }
- }
- else if(mode.equals("netrexx")) {
- execScript("NetRexx", "NetRexxC -exec " + path);
- }
- else if(mode.equals("perl")) {
- execScript("perl", "perl " + path);
- }
- else if(mode.equals("python")) {
- execScript("python", "python " + path);
- }
- else if(mode.equals("ruby")) {
- execScript("ruby", "ruby " + path);
- }
- else if(mode.equals("scheme")) {
- execScript("scheme", "scheme -load " + path);
- }
- else if(mode.equals("shellscript")) {
- execScript("shell", "bash " + path);
- }
- else if(mode.equals("tcl")) {
- execScript("tcl", "tcl " + path);
- }
- else if(mode.equals("vbscript")) {
- execScript("Windows Script Host", "wscript " + path);
- }
- else {
- Macros.error(view,
- "The current file does not appear to be a script.");
- }
-}
-
-runScript();
-
-
-/*
-
-Macro index data (in DocBook format)
-
- <listitem>
- <para><filename>Run_Script.bsh</filename></para>
- <abstract><para>
- Runs script using interpreter based upon buffer's editing mode
- (by default, determined using file extension).
- </para></abstract>
- </listitem>
-
-*/
-
-// end Run_Script.bsh
+/*
+ * Run_Script.bsh - a BeanShell macro script for the
+ * jEdit text editor - Runs script using interpreter based upon
+ * buffer's editing mode (by default, determined using file extension).
+ *
+ * Copyright (C) 2001 John Gellene
+ * jgellene at nyc.rr.com
+ * http://community.jedit.org
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the jEdit program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id: Run_Script.bsh 16858 2010-01-07 01:45:03Z ezust $
+ */
+
+
+void execScript(interpreter, command)
+{
+ params = Macros.input(view,
+ "Specify parameters for running script under " + interpreter);
+ if(params == null)
+ {
+ Macros.message(view, "Script execution was cancelled.");
+ return;
+ }
+ runInSystemShell(view, command + params);
+}
+
+void runScript()
+{
+ if(buffer.isNewFile())
+ buffer.saveAs(view, true);
+ else
+ buffer.save(view, buffer.getPath());
+ mode = buffer.getMode().getName();
+ path = buffer.getPath() ;
+ os = System.getProperty("os.name");
+ if(os.indexOf("Windows") != -1)
+ path = "\"" + path + "\"";
+ if(mode.equals("beanshell")) {
+ source(path);
+ }
+ else if(mode.equals("awk")) {
+ execScript("awk", "awk -f " + path);
+ }
+ else if(mode.equals("batch")) {
+ if(os.indexOf("Windows 9") == -1
+ && os.indexOf("Windows M") == -1)
+ {
+ execScript("shell", "cmd /C " + path);
+ }
+ else execScript("shell", "command /C " + path);
+ }
+ else if(mode.equals("javascript")) {
+ execScript("Windows Script Host", "wscript " + path);
+ }
+ else if(mode.equals("jmk")) {
+ execScript("jmk", "java -jar jmk.jar -f" + path);
+ }
+ else if(mode.equals("makefile")) {
+ if(os.indexOf("Windows") == -1) {
+ execScript("make", "make -f " + path);
+ }
+ else {
+ execScript("nmake", "nmake -f " + path);
+ }
+ }
+ else if(mode.equals("netrexx")) {
+ execScript("NetRexx", "NetRexxC -exec " + path);
+ }
+ else if(mode.equals("perl")) {
+ execScript("perl", "perl " + path);
+ }
+ else if(mode.equals("python")) {
+ execScript("python", "python " + path);
+ }
+ else if(mode.equals("ruby")) {
+ execScript("ruby", "ruby " + path);
+ }
+ else if(mode.equals("scheme")) {
+ execScript("scheme", "scheme -load " + path);
+ }
+ else if(mode.equals("shellscript")) {
+ execScript("shell", "bash " + path);
+ }
+ else if(mode.equals("tcl")) {
+ execScript("tcl", "tcl " + path);
+ }
+ else if(mode.equals("vbscript")) {
+ execScript("Windows Script Host", "wscript " + path);
+ }
+ else {
+ Macros.error(view,
+ "The current file does not appear to be a script.");
+ }
+}
+
+runScript();
+
+
+/*
+
+Macro index data (in DocBook format)
+
+ <listitem>
+ <para><filename>Run_Script.bsh</filename></para>
+ <abstract><para>
+ Runs script using interpreter based upon buffer's editing mode
+ (by default, determined using file extension).
+ </para></abstract>
+ </listitem>
+
+*/
+
+// end Run_Script.bsh
diff --git a/jEdit/macros/Misc/Show_Threads.bsh b/jEdit/macros/Misc/Show_Threads.bsh
index 208fa51..11d1531 100644
--- a/jEdit/macros/Misc/Show_Threads.bsh
+++ b/jEdit/macros/Misc/Show_Threads.bsh
@@ -1,150 +1,150 @@
-/* Show_Threads.bsh
- *
- * A BeanShell macro script for jEdit - displays all threads in a tree.
- *
- * Copyright (c) 2001 Dirk Moebius (dmoebius at gmx.net)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- *
- * Version 1.0
- * requires JDK 1.1, jEdit3.1
- *
- * $Id: Show_Threads.bsh 4001 2002-01-31 05:35:49Z spestov $
- */
-
-
-import java.awt.event.*;
-import javax.swing.*;
-import javax.swing.tree.*;
-
-
-JFrame createThreadsFrame() {
-
- void windowClosing(WindowEvent e) {
- GUIUtilities.saveGeometry(frame, "macros-show-threads");
- }
-
-
- void keyPressed(KeyEvent e) {
- if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
- GUIUtilities.saveGeometry(frame, "macros-show-threads");
- frame.setVisible(false);
- frame.dispose();
- }
- else if (e.getKeyCode() == KeyEvent.VK_U) {
- tree.setModel(new DefaultTreeModel(createModel()));
- tree.revalidate();
- }
- }
-
-
- // Having these members of KeyListener and WindowListener implemented as
- // no-ops will speedup execution. Otherwise BeanShell throws an
- // exception each time one of these events occur.
- void keyReleased(KeyEvent e) { }
- void keyTyped(KeyEvent e) { }
- void windowActivated(WindowEvent e) { }
- void windowClosed(WindowEvent e) { }
- void windowDeactivated(WindowEvent e) { }
- void windowDeiconified(WindowEvent e) { }
- void windowIconified(WindowEvent e) { }
- void windowOpened(WindowEvent e) { }
-
-
- ThreadGroup getMainThreadGroup() {
- t = Thread.currentThread();
- g = t.getThreadGroup();
- while (g.getParent() != null)
- g = g.getParent();
- return g;
- }
-
-
- DefaultMutableTreeNode createModel() {
- g = getMainThreadGroup();
- return createGroupNode(g);
- }
-
-
- DefaultMutableTreeNode createGroupNode(ThreadGroup g) {
- node = new DefaultMutableTreeNode(g.getName() + (g.isDaemon() ? " (daemon)" : ""), true);
-
- groups = new ThreadGroup[g.activeGroupCount()];
- count = g.enumerate(groups, false);
- for (int i = 0; i < count; ++i)
- node.add(createGroupNode(groups[i]));
-
- threads = new Thread[g.activeCount()];
- count = g.enumerate(threads, false);
- for (int i = 0; i < count; ++i)
- node.add(new DefaultMutableTreeNode(getDescription(threads[i]), false));
-
- return node;
- }
-
-
- String getDescription(Thread t) {
- StringBuffer buf = new StringBuffer(t.getName());
- buf.append(" (prio ");
- buf.append(t.getPriority());
- if (!t.isAlive())
- buf.append(", not started");
- if (t.isDaemon())
- buf.append(", daemon");
- if (t.isInterrupted())
- buf.append(", interrupted");
- buf.append(")");
- return buf.toString();
- }
-
-
- tree = new JTree(createModel());
- tree.putClientProperty("JTree.lineStyle", "Angled");
- tree.addKeyListener(this);
-
- stage = new JScrollPane(tree);
- stage.setColumnHeaderView(new JLabel("[Esc] Close [U] Update"));
-
- frame = new JFrame("Current Threads");
- frame.setContentPane(stage);
- frame.addWindowListener(this);
- // set default size and position:
- frame.setSize(new Dimension(400, 400)); // faster than pack()
- // overwrite default size and position loading user properties:
- GUIUtilities.loadGeometry(frame, "macros-show-threads");
- frame.setVisible(true);
-
- return frame;
-}
-
-
-createThreadsFrame();
-
-/*
-
-Macro index data (in DocBook format)
-
- <listitem>
- <para><filename>Show_Threads.bsh</filename></para>
- <abstract><para>
- Displays all running Java threads in a tree.
- </para></abstract>
- </listitem>
-
-*/
-
-// end Show_Threads.bsh
-
+/* Show_Threads.bsh
+ *
+ * A BeanShell macro script for jEdit - displays all threads in a tree.
+ *
+ * Copyright (c) 2001 Dirk Moebius (dmoebius at gmx.net)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ *
+ * Version 1.0
+ * requires JDK 1.1, jEdit3.1
+ *
+ * $Id: Show_Threads.bsh 4001 2002-01-31 05:35:49Z spestov $
+ */
+
+
+import java.awt.event.*;
+import javax.swing.*;
+import javax.swing.tree.*;
+
+
+JFrame createThreadsFrame() {
+
+ void windowClosing(WindowEvent e) {
+ GUIUtilities.saveGeometry(frame, "macros-show-threads");
+ }
+
+
+ void keyPressed(KeyEvent e) {
+ if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
+ GUIUtilities.saveGeometry(frame, "macros-show-threads");
+ frame.setVisible(false);
+ frame.dispose();
+ }
+ else if (e.getKeyCode() == KeyEvent.VK_U) {
+ tree.setModel(new DefaultTreeModel(createModel()));
+ tree.revalidate();
+ }
+ }
+
+
+ // Having these members of KeyListener and WindowListener implemented as
+ // no-ops will speedup execution. Otherwise BeanShell throws an
+ // exception each time one of these events occur.
+ void keyReleased(KeyEvent e) { }
+ void keyTyped(KeyEvent e) { }
+ void windowActivated(WindowEvent e) { }
+ void windowClosed(WindowEvent e) { }
+ void windowDeactivated(WindowEvent e) { }
+ void windowDeiconified(WindowEvent e) { }
+ void windowIconified(WindowEvent e) { }
+ void windowOpened(WindowEvent e) { }
+
+
+ ThreadGroup getMainThreadGroup() {
+ t = Thread.currentThread();
+ g = t.getThreadGroup();
+ while (g.getParent() != null)
+ g = g.getParent();
+ return g;
+ }
+
+
+ DefaultMutableTreeNode createModel() {
+ g = getMainThreadGroup();
+ return createGroupNode(g);
+ }
+
+
+ DefaultMutableTreeNode createGroupNode(ThreadGroup g) {
+ node = new DefaultMutableTreeNode(g.getName() + (g.isDaemon() ? " (daemon)" : ""), true);
+
+ groups = new ThreadGroup[g.activeGroupCount()];
+ count = g.enumerate(groups, false);
+ for (int i = 0; i < count; ++i)
+ node.add(createGroupNode(groups[i]));
+
+ threads = new Thread[g.activeCount()];
+ count = g.enumerate(threads, false);
+ for (int i = 0; i < count; ++i)
+ node.add(new DefaultMutableTreeNode(getDescription(threads[i]), false));
+
+ return node;
+ }
+
+
+ String getDescription(Thread t) {
+ StringBuffer buf = new StringBuffer(t.getName());
+ buf.append(" (prio ");
+ buf.append(t.getPriority());
+ if (!t.isAlive())
+ buf.append(", not started");
+ if (t.isDaemon())
+ buf.append(", daemon");
+ if (t.isInterrupted())
+ buf.append(", interrupted");
+ buf.append(")");
+ return buf.toString();
+ }
+
+
+ tree = new JTree(createModel());
+ tree.putClientProperty("JTree.lineStyle", "Angled");
+ tree.addKeyListener(this);
+
+ stage = new JScrollPane(tree);
+ stage.setColumnHeaderView(new JLabel("[Esc] Close [U] Update"));
+
+ frame = new JFrame("Current Threads");
+ frame.setContentPane(stage);
+ frame.addWindowListener(this);
+ // set default size and position:
+ frame.setSize(new Dimension(400, 400)); // faster than pack()
+ // overwrite default size and position loading user properties:
+ GUIUtilities.loadGeometry(frame, "macros-show-threads");
+ frame.setVisible(true);
+
+ return frame;
+}
+
+
+createThreadsFrame();
+
+/*
+
+Macro index data (in DocBook format)
+
+ <listitem>
+ <para><filename>Show_Threads.bsh</filename></para>
+ <abstract><para>
+ Displays all running Java threads in a tree.
+ </para></abstract>
+ </listitem>
+
+*/
+
+// end Show_Threads.bsh
+
diff --git a/jEdit/macros/Properties/Create_Plugin_Announcement.bsh b/jEdit/macros/Properties/Create_Plugin_Announcement.bsh
index 42017f3..a0e6e12 100644
--- a/jEdit/macros/Properties/Create_Plugin_Announcement.bsh
+++ b/jEdit/macros/Properties/Create_Plugin_Announcement.bsh
@@ -1,335 +1,442 @@
-/*
- * Create_plugin_release_text.bsh - a BeanShell macro script for the
- * jEdit text editor - Parses a plugin's properties file to create the
- * text for a plugin submission
- * Copyright ( C ) 2006 Jeffrey Hoyt
- * jchoyt at jedit.org
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- */
-
-
-// import statements
-import javax.swing.border.*;
-
-// main routine
-void pluginTextDialog( View view, Buffer buffer )
-{
- this.view = view;
- this.buffer=buffer;
-
- File propsFile = new File( buffer.getPath() );
- Properties props = new Properties();
- InputStream in = new FileInputStream( propsFile );
- try
- {
- props.load( in );
- }
- finally
- {
- in.close();
- }
-
- //setup the strings we are interested in and can get from the props file
- String fileName = propsFile.getName();
- String pluginName = fileName.substring( 0, fileName.indexOf( '.' ) );
- String version = null;
- String jEditDependency = null;
- String javaDependency = null;
- String activate = null;
- ArrayList pluginDependencies = new ArrayList();
- ArrayList optionalPluginDependencies = new ArrayList();
- String announcement, shortDescription, source;
- String longDescription="";
- String classname=null;
- String longDescriptionFileName=null;
-
- //extract the properties we care about
- String start = "plugin.";
- for ( Enumeration e = props.keys(); e.hasMoreElements() ; )
- {
- String key = ( String ) e.nextElement();
- // Log.log( Log.DEBUG, this, "Parsing key: " + key );
- if( key.startsWith( start ) )
- {
- if( key.endsWith( ".activate" ) )
- {
- activate = props.getProperty( key );
- }
- else if( key.endsWith( ".version" ) )
- {
- version = props.getProperty( key );
- }
- else if( key.indexOf( ".depend." ) != -1 )
- {
- String value = props.getProperty( key ).trim();
- String[] parts = value.split( " " );
- if( parts.length < 2 )
- {
- Macros.error( view, "Badly constructed dependency ( " + value + " ). All dependencies must have at least 2 parts" );
- }
- if( parts[0].equals( "jedit" ) )
- {
- jEditDependency = parts[1];
- }
- else if( parts[0].equals( "jdk" ) )
- {
- javaDependency = parts[1];
- }
- else if( parts[0].equals( "plugin" ) )
- {
- pluginDependencies.add( parts[1] + " " + parts[2] );
- }
- else if( parts[0].equals( "optional" ) && parts[1].equals( "plugin" ) )
- {
- optionalPluginDependencies.add( parts[2] + " " + parts[3] );
- }
- else
- {
- Macros.error( view, "Unexpected dependency ( " + value + " ). See the javadoc of org.gjt.sp.jedit.EditPlugin" );
- }
- }
- else if(key.endsWith(".longdescription") )
- {
- longDescriptionFileName = props.getProperty( key );
- }
- else if(key.endsWith(".description") )
- {
- shortDescription = props.getProperty( key );
- }
- else if(key.endsWith(".name") )
- {
- if (props.getProperty( key ).equals(pluginName))
- {
- classname = key.substring( start.length(), key.length() - 5 );
- // Macros.error( view, "Classname is " + classname );
- }
- }
- }
- }
- // Macros.error( view, "Parsing complete" );
-
- if( javaDependency==null )
- {
- Macros.error( view, "You must supply a JDK dependency. Please add it and rerun the macro." );
- return;
- }
- if( jEditDependency==null )
- {
- Macros.error( view, "You must supply a jEdit dependency. Please add it and rerun the macro." );
- return;
- }
- if( shortDescription==null )
- {
- Macros.error( view, "You must supply a short description in the plugin." + classname + ".description property. Please add it and rerun the macro." );
- return;
- }
- if( longDescriptionFileName==null )
- {
- longDescriptionFileName = "description.html";
- // Macros.error(view, "setting default long description file");
- }
-
- //load the long description
- File descriptionFile = new File( new File(buffer.getPath()).getParent(), longDescriptionFileName );
- if(!descriptionFile.exists())
- {
- Macros.error( view, "You must supply a long description in a file located at " + descriptionFile.getPath() + ". Please create it and rerun the macro." );
- return;
- }
- BufferedReader reader = new BufferedReader( new FileReader( descriptionFile ) );
- try
- {
- String line;
- while( (line = reader.readLine())!=null )
- {
- longDescription = longDescription + line + "\n";
- }
- }
- finally
- {
- reader.close();
- }
-
- // create dialog object and set its features
- title = "Create Plugin Announcement";
- dialog = new JDialog( view, title, false );
- content = new JPanel( new BorderLayout() );
- content.setBorder( new EmptyBorder( 12, 12, 12, 12 ) );
- dialog.setContentPane( content );
-
- // add to the dialog a panel containing the text fields for
- // entry of the prefix and suffix text
- propsPanel = new JPanel( new GridLayout( 5 + pluginDependencies.size() + optionalPluginDependencies.size() , 2, 2, 6 ) );
- propsPanel.add( new JLabel( "Plugin name" ) );
- propsPanel.add( new JLabel( pluginName ) );
- propsPanel.add( new JLabel( "Plugin version" ) );
- propsPanel.add( new JLabel( version ) );
- propsPanel.add( new JLabel( "Activates" ) );
- propsPanel.add( new JLabel( activate ) );
- propsPanel.add( new JLabel( "jEdit Dependency" ) );
- propsPanel.add( new JLabel( jEditDependency ) );
- propsPanel.add( new JLabel( "JDK Dependency" ) );
- propsPanel.add( new JLabel( javaDependency ) );
- for( int i=0; i<pluginDependencies.size(); i++ )
- {
- propsPanel.add( new JLabel( "Depends on" ) );
- propsPanel.add( new JLabel( pluginDependencies.get( i ).toString() ) );
- }
- for( int i=0; i<optionalPluginDependencies.size(); i++ )
- {
- propsPanel.add( new JLabel( "Optional" ) );
- propsPanel.add( new JLabel( optionalPluginDependencies.get( i ).toString() ) );
- }
- content.add( propsPanel, "Center" );
-
- //add areas for source location, Announcement, Short Description, and Long Description
- descriptionPanel = new JPanel();
- descriptionPanel.setLayout( new BoxLayout( descriptionPanel, BoxLayout.Y_AXIS ) );
- descriptionPanel.setBorder(new EmptyBorder(12, 5, 0, 5));
-
- descriptionPanel.add( new JLabel( "Source Code Location (SVN and tag, or URL): " ) );
- sourceArea = new JEditorPane();
- sourceArea.setText("Source code is in SVN with the tag XXXX (no SVN release numbers, please)");
- sourceArea.setPreferredSize( new Dimension( 250, 36 ) );
- descriptionPanel.add( new JScrollPane( sourceArea ) );
-
- descriptionPanel.add( new JLabel( "Announcement: " ) );
- announcementArea = new JEditorPane();
- announcementArea.setPreferredSize( new Dimension( 250, 120 ) );
- descriptionPanel.add( new JScrollPane( announcementArea ) );
-
- descriptionPanel.add( new JLabel( "Short Description ( for new plugins or updated descriptions only ): " ) );
- shortDescriptionArea = new JEditorPane("text/plain", shortDescription);
- shortDescriptionArea.disable();
- shortDescriptionArea.setPreferredSize( new Dimension( 250, 72 ) );
- descriptionPanel.add( new JScrollPane( shortDescriptionArea ) );
-
- descriptionPanel.add( new JLabel( "Long Description ( for new plugins or updated descriptions only ): " ) );
- longDescriptionArea = new JEditorPane("text/plain", longDescription);
- longDescriptionArea.disable();
- longDescriptionArea.setPreferredSize( new Dimension( 250, 120 ) );
- descriptionPanel.add( new JScrollPane( longDescriptionArea ) );
-
- //add buttons to description panel
- buttonPanel = new JPanel();
- buttonPanel.setLayout( new BoxLayout( buttonPanel, BoxLayout.X_AXIS ) );
- ok = new JButton( "Create Announcement" );
- buttonPanel.add( ok );
- cancel = new JButton( "Cancel" );
- buttonPanel.add( cancel );
- descriptionPanel.add( buttonPanel );
- content.add( descriptionPanel, "South" );
-
- // register this method as an ActionListener for
- // the buttons and text fields
- ok.addActionListener( this );
- cancel.addActionListener( this );
-
- // locate the dialog in the center of the
- // editing pane and make it visible
- dialog.pack();
- dialog.setLocationRelativeTo( view );
- dialog.setDefaultCloseOperation( JDialog.DISPOSE_ON_CLOSE );
- dialog.setVisible( true );
-
- // this method will be called when a button is clicked
- // or when ENTER is pressed
- void actionPerformed( e )
- {
- if( e.getSource() != cancel )
- {
- createAnnouncement();
- }
- dialog.dispose();
- }
-
- void createAnnouncement()
- {
- announcement = announcementArea.getText();
- shortDescription = shortDescriptionArea.getText();
- longDescription = longDescriptionArea.getText();
- source = sourceArea.getText();
- StringBuffer ret = new StringBuffer();
- ret.append( "Paste the text below into the Plugin Central Submission Tracker at https://sourceforge.net/tracker/?group_id=588&atid=625093\n" );
- ret.append( "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" );
- ret.append( "\n{{{ " );
- ret.append( pluginName );
- ret.append( " " );
- ret.append( version );
- ret.append( "\n Source: " );
- ret.append( source );
- ret.append( "\n Announcement: " + announcement.replaceAll("\n", "\n " ) );
- ret.append( "\n Requires Java " );
- ret.append( javaDependency );
- ret.append( "\n Requires jEdit " );
- ret.append( jEditDependency );
- if( pluginDependencies.size() > 0 )
- {
- ret.append( "\n Required plugins: " );
- for( int i=0; i<pluginDependencies.size(); i++ )
- {
- ret.append( "\n " );
- ret.append( pluginDependencies.get( i ) );
- }
- }
- if( optionalPluginDependencies.size() > 0 )
- {
- ret.append( "\n Optional plugins: " );
- for( int i=0; i<optionalPluginDependencies.size(); i++ )
- {
- ret.append( "\n " );
- ret.append( optionalPluginDependencies.get( i ) );
- }
- }
- if( shortDescription!=null && !shortDescription.equals( "" ) )
- {
- ret.append( "\n \n Short Description: " + shortDescription );
- }
- if( longDescription!=null && !longDescription.equals( "" ) )
- {
- ret.append( "\n \n Long Description: " + longDescription );
- }
- ret.append( " }}}" );
- newbuf = jEdit.newFile( view );
- newbuf.insert( 0, ret.toString() );
- }
-}
-
-// this single line of code is the script's main routine
-// it calls the methods and exits
-if( buffer.getMode().toString().equals( "properties" ) )
- pluginTextDialog( view, buffer );
-else
- Macros.error( view, "This must be run on a jEdit plugin's properties file. \nOpen your Plugin's props file and rerun this macro." );
-
-/*
- Macro index data ( in DocBook format )
-
-<listitem>
- <para><filename>Create_Plugin_Announcement.bsh</filename></para>
- <abstract><para>
- Creates a machine-parsable version of the release announcement from the source files and minimal user input.
- The wiz can then read this file and do the release automatically.
- </para></abstract>
- <para>
- Creates a machine-parsable version of the release announcement from the source files and minimal user input.
- The wiz can then read this file and do the release automatically.
- </para>
-</listitem>
-
-*/
-
+/*
+ * Create_plugin_release_text.bsh - a BeanShell macro script for the
+ * jEdit text editor - Parses a plugin's properties file to create the
+ * text for a plugin submission
+ * Copyright ( C ) 2006 Jeffrey Hoyt
+ * jchoyt at jedit.org
+ * Eric Berry <elberry at users.sourceforge.net> (version checking 2010)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+
+// import statements
+import javax.swing.border.*;
+import org.gjt.sp.util.Log;
+import java.util.Comparator;
+
+public class PluginDependency
+{
+ public String className;
+ public String simpleName;
+ public String version;
+
+ public PluginDependency(String cn, String v)
+ {
+ className = cn;
+ version = v;
+ simpleName = jEdit.getProperty("plugin." + cn + ".name");
+ if(simpleName != null)
+ {
+ simpleName = simpleName.trim();
+ }
+ if(simpleName == null || simpleName.length() <= 0)
+ {
+ int lastDotIndex = cn.lastIndexOf(".");
+ simpleName = cn.substring(lastDotIndex + 1);
+ }
+ Log.log(Log.DEBUG, this, "new PluginDependency class: " + className + " | name: " + simpleName + " | version: " + version);
+ }
+}
+
+public class PluginDependencyNameComparator implements Comparator
+{
+ public int compare(Object o1, Object o2)
+ {
+ PluginDependency pd1 = (PluginDependency)o1;
+ PluginDependency pd2 = (PluginDependency)o2;
+ return pd1.simpleName.compareTo(pd2.simpleName);
+ }
+}
+
+// main routine
+void pluginTextDialog( View view, Buffer buffer )
+{
+ this.view = view;
+ this.buffer=buffer;
+
+ File propsFile = new File( buffer.getPath() );
+ Properties props = new Properties();
+ InputStream in = new FileInputStream( propsFile );
+ try
+ {
+ props.load( in );
+ }
+ finally
+ {
+ in.close();
+ }
+
+ //setup the strings we are interested in and can get from the props file
+ String fileName = propsFile.getName();
+ String pluginName = fileName.substring( 0, fileName.indexOf( '.' ) );
+ String version = null;
+ String jEditDependency = null;
+ String javaDependency = null;
+ String activate = null;
+ ArrayList pluginDependencies = new ArrayList();
+ ArrayList optionalPluginDependencies = new ArrayList();
+ String announcement, shortDescription, source;
+ String longDescription="";
+ String classname=null;
+ String longDescriptionFileName=null;
+
+ //extract the properties we care about
+ String start = "plugin.";
+ for ( Enumeration e = props.keys(); e.hasMoreElements() ; )
+ {
+ String key = ( String ) e.nextElement();
+ // Log.log( Log.DEBUG, this, "Parsing key: " + key );
+ if( key.startsWith( start ) )
+ {
+ if( key.endsWith( ".activate" ) )
+ {
+ activate = props.getProperty( key );
+ }
+ else if( key.endsWith( ".version" ) )
+ {
+ version = props.getProperty( key );
+ }
+ else if( key.indexOf( ".depend." ) != -1 )
+ {
+ String value = props.getProperty( key ).trim();
+ String[] parts = value.split( " " );
+ if( parts.length < 2 )
+ {
+ Macros.error( view, "Badly constructed dependency ( " + value + " ). All dependencies must have at least 2 parts" );
+ }
+ if( parts[0].equals( "jedit" ) )
+ {
+ jEditDependency = parts[1];
+ }
+ else if( parts[0].equals( "jdk" ) )
+ {
+ javaDependency = parts[1];
+ }
+ else if( parts[0].equals( "plugin" ) )
+ {
+ Log.log(Log.DEBUG, this, "required plugin name - class: " + parts[1] + " | name: " + jEdit.getProperty("plugin." + parts[1] + ".name"));
+ pluginDependencies.add(new PluginDependency(parts[1], parts[2]));
+ }
+ else if( parts[0].equals( "optional" ) && parts[1].equals( "plugin" ) )
+ {
+ Log.log(Log.DEBUG, this, "optional plugin name - class: " + parts[2] + " | name: " + jEdit.getProperty("plugin." + parts[2] + ".name"));
+ optionalPluginDependencies.add(new PluginDependency(parts[2], parts[3]));
+ }
+ else
+ {
+ Macros.error( view, "Unexpected dependency ( " + value + " ). See the javadoc of org.gjt.sp.jedit.EditPlugin" );
+ }
+ }
+ else if(key.endsWith(".longdescription") )
+ {
+ longDescriptionFileName = props.getProperty( key );
+ }
+ else if(key.endsWith(".description") )
+ {
+ shortDescription = props.getProperty( key );
+ }
+ else if(key.endsWith(".name") )
+ {
+ if (props.getProperty( key ).equals(pluginName))
+ {
+ classname = key.substring( start.length(), key.length() - 5 );
+ // Macros.error( view, "Classname is " + classname );
+ }
+ }
+ }
+ }
+ // Macros.error( view, "Parsing complete" );
+
+ if( javaDependency==null )
+ {
+ Macros.error( view, "You must supply a JDK dependency. Please add it and rerun the macro." );
+ return;
+ }
+ if( jEditDependency==null )
+ {
+ Macros.error( view, "You must supply a jEdit dependency. Please add it and rerun the macro." );
+ return;
+ }
+ if( shortDescription==null )
+ {
+ Macros.error( view, "You must supply a short description in the plugin." + classname + ".description property. Please add it and rerun the macro." );
+ return;
+ }
+ if( longDescriptionFileName==null )
+ {
+ longDescriptionFileName = "description.html";
+ // Macros.error(view, "setting default long description file");
+ }
+
+ //load the long description
+ File descriptionFile = new File( new File(buffer.getPath()).getParent(), longDescriptionFileName );
+ if(!descriptionFile.exists())
+ {
+ Macros.error( view, "You must supply a long description in a file located at " + descriptionFile.getPath() + ". Please create it and rerun the macro." );
+ return;
+ }
+ BufferedReader reader = new BufferedReader( new FileReader( descriptionFile ) );
+ try
+ {
+ String line;
+ while( (line = reader.readLine())!=null )
+ {
+ longDescription = longDescription + line + "\n";
+ }
+ }
+ finally
+ {
+ reader.close();
+ }
+
+ // create dialog object and set its features
+ title = "Create Plugin Announcement";
+ dialog = new JDialog( view, title, false );
+ content = new JPanel( new BorderLayout() );
+ content.setBorder( new EmptyBorder( 12, 12, 12, 12 ) );
+ dialog.setContentPane( content );
+
+ // add to the dialog a panel containing the text fields for
+ // entry of the prefix and suffix text
+ propsPanel = new JPanel( new GridLayout( 5 + pluginDependencies.size() + optionalPluginDependencies.size() , 2, 2, 6 ) );
+ propsPanel.add( new JLabel( "Plugin name" ) );
+ propsPanel.add( new JLabel( pluginName ) );
+ propsPanel.add( new JLabel( "Plugin version" ) );
+ propsPanel.add( new JLabel( version ) );
+ propsPanel.add( new JLabel( "Activates" ) );
+ propsPanel.add( new JLabel( activate ) );
+ propsPanel.add( new JLabel( "jEdit Dependency" ) );
+ propsPanel.add( new JLabel( jEditDependency ) );
+ propsPanel.add( new JLabel( "JDK Dependency" ) );
+ propsPanel.add( new JLabel( javaDependency ) );
+ PluginDependencyNameComparator comparator = new PluginDependencyNameComparator();
+ Collections.sort(pluginDependencies, comparator);
+ Collections.sort(optionalPluginDependencies, comparator);
+ for( int i=0; i<pluginDependencies.size(); i++ )
+ {
+ propsPanel.add( new JLabel( "Depends on" ) );
+ PluginDependency requiredPlugin = pluginDependencies.get( i );
+ propsPanel.add( new JLabel( requiredPlugin.simpleName + " " + requiredPlugin.version ) );
+ }
+ for( int i=0; i<optionalPluginDependencies.size(); i++ )
+ {
+ propsPanel.add( new JLabel( "Optional" ) );
+ PluginDependency optionalPlugin = optionalPluginDependencies.get( i );
+ propsPanel.add( new JLabel( optionalPlugin.simpleName + " " + optionalPlugin.version ) );
+ }
+ content.add( propsPanel, "Center" );
+
+ //add areas for source location, Announcement, Short Description, and Long Description
+ descriptionPanel = new JPanel();
+ descriptionPanel.setLayout( new BoxLayout( descriptionPanel, BoxLayout.Y_AXIS ) );
+ descriptionPanel.setBorder(new EmptyBorder(12, 5, 0, 5));
+
+ descriptionPanel.add( new JLabel( "Source Code Location (SVN and tag, or URL): " ) );
+ sourceArea = new JEditorPane();
+ sourceArea.setText("Source code is in SVN with the tag XXXX (no SVN release numbers, please)");
+ sourceArea.setPreferredSize( new Dimension( 250, 36 ) );
+ descriptionPanel.add( new JScrollPane( sourceArea ) );
+
+ descriptionPanel.add( new JLabel( "Announcement: " ) );
+ announcementArea = new JEditorPane();
+ announcementArea.setPreferredSize( new Dimension( 250, 120 ) );
+ descriptionPanel.add( new JScrollPane( announcementArea ) );
+
+ descriptionPanel.add( new JLabel( "Short Description ( for new plugins or updated descriptions only ): " ) );
+ shortDescriptionArea = new JEditorPane("text/plain", shortDescription);
+ shortDescriptionArea.disable();
+ shortDescriptionArea.setPreferredSize( new Dimension( 250, 72 ) );
+ descriptionPanel.add( new JScrollPane( shortDescriptionArea ) );
+
+ descriptionPanel.add( new JLabel( "Long Description ( for new plugins or updated descriptions only ): " ) );
+ longDescriptionArea = new JEditorPane("text/plain", longDescription);
+ longDescriptionArea.disable();
+ longDescriptionArea.setPreferredSize( new Dimension( 250, 120 ) );
+ descriptionPanel.add( new JScrollPane( longDescriptionArea ) );
+
+ //add buttons to description panel
+ buttonPanel = new JPanel();
+ buttonPanel.setLayout( new BoxLayout( buttonPanel, BoxLayout.X_AXIS ) );
+ ok = new JButton( "Create Announcement" );
+ buttonPanel.add( ok );
+ cancel = new JButton( "Cancel" );
+ buttonPanel.add( cancel );
+ descriptionPanel.add( buttonPanel );
+ content.add( descriptionPanel, "South" );
+
+ // register this method as an ActionListener for
+ // the buttons and text fields
+ ok.addActionListener( this );
+ cancel.addActionListener( this );
+
+ // locate the dialog in the center of the
+ // editing pane and make it visible
+ dialog.pack();
+ dialog.setLocationRelativeTo( view );
+ dialog.setDefaultCloseOperation( JDialog.DISPOSE_ON_CLOSE );
+ dialog.setVisible( true );
+
+ // this method will be called when a button is clicked
+ // or when ENTER is pressed
+ void actionPerformed( e )
+ {
+ if( e.getSource() != cancel )
+ {
+ if(validateVersions()) {
+ createAnnouncement();
+ }
+ }
+ dialog.dispose();
+ }
+
+ void createAnnouncement()
+ {
+ announcement = announcementArea.getText();
+ shortDescription = shortDescriptionArea.getText();
+ longDescription = longDescriptionArea.getText();
+ source = sourceArea.getText();
+ StringBuffer ret = new StringBuffer();
+ ret.append( "Paste the text below into the Plugin Central Submission Tracker at https://sourceforge.net/tracker/?group_id=588&atid=625093\n" );
+ ret.append( "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" );
+ ret.append( "\n{{{ " );
+ ret.append( pluginName );
+ ret.append( " " );
+ ret.append( version );
+ ret.append( "\n Source: " );
+ ret.append( source );
+ ret.append( "\n Announcement: " + announcement.replaceAll("\n", "\n " ) );
+ ret.append( "\n Requires Java " );
+ ret.append( javaDependency );
+ ret.append( "\n Requires jEdit " );
+ ret.append( jEditDependency );
+ if( pluginDependencies.size() > 0 )
+ {
+ ret.append( "\n Required plugins: " );
+ for( int i=0; i<pluginDependencies.size(); i++ )
+ {
+ ret.append( "\n " );
+ PluginDependency plugin = pluginDependencies.get( i );
+ ret.append( plugin.simpleName + " " + plugin.version + " (" + plugin.className + ")" );
+ }
+ }
+ if( optionalPluginDependencies.size() > 0 )
+ {
+ ret.append( "\n Optional plugins: " );
+ for( int i=0; i<optionalPluginDependencies.size(); i++ )
+ {
+ ret.append( "\n " );
+ PluginDependency plugin = optionalPluginDependencies.get( i );
+ ret.append( plugin.simpleName + " " + plugin.version + " (" + plugin.className + ")" );
+ }
+ }
+ if( shortDescription!=null && !shortDescription.equals( "" ) )
+ {
+ ret.append( "\n \n Short Description: " + shortDescription );
+ }
+ if( longDescription!=null && !longDescription.equals( "" ) )
+ {
+ ret.append( "\n \n Long Description: " + longDescription );
+ }
+ ret.append( " }}}" );
+ newbuf = jEdit.newFile( view );
+ newbuf.insert( 0, ret.toString() );
+ }
+
+ boolean pluginIsNotInstalled(PluginDependency dependency, String installed) {
+ if(installed != null) {
+ installed = installed.trim();
+ if(!installed.equals(dependency.version))
+ {
+ return true;
+ }
+ } else {
+ return true;
+ }
+ return false;
+ }
+
+ boolean validateVersions()
+ {
+ boolean valid = true;
+ StringBuilder builder = new StringBuilder();
+ builder.append(
+ "There are some inconsistencies in your plugin's requirements. The\n" +
+ "version numbers below don't match what you are working with in\n" +
+ "your installation of jEdit.\n\n");
+
+ // check jEdit dependency against running build.
+ String build = jEdit.getBuild();
+ if(!build.equals(jEditDependency))
+ {
+ valid = false;
+ builder.append(" jEdit - Required: " + jEditDependency + " - Running: " + build + "\n");
+ }
+
+ // check required plugin dependencies.
+ for( int i = 0; i < pluginDependencies.size(); i++ )
+ {
+ PluginDependency plugin = pluginDependencies.get(i);
+ String installed = jEdit.getProperty("plugin." + plugin.className + ".version");
+ if(pluginIsNotInstalled(plugin, installed)) {
+ valid = false;
+ builder.append(" " + plugin.simpleName + " - Required: " + plugin.version + " - Running: " + installed + "\n");
+ }
+ }
+
+ // check optional plugin dependencies.
+ for( int i = 0; i < optionalPluginDependencies.size(); i++ )
+ {
+ PluginDependency plugin = optionalPluginDependencies.get(i);
+ String installed = jEdit.getProperty("plugin." + plugin.className + ".version");
+ if(pluginIsNotInstalled(plugin, installed)) {
+ valid = false;
+ builder.append(" " + plugin.simpleName + " - Optional: " + plugin.version + " - Running: " + installed + "\n");
+ }
+ }
+
+ if(!valid)
+ {
+ builder.append("\n\n" +
+ "Note that your plugin will be tested against the latest released\n" +
+ "versions of jEdit and your plugin's dependencies before it is\n" +
+ "released.\n\n" +
+ "Do you want to continue creating this announcement, or would you\n" +
+ "like to cancel it, and update the version numbers?\n\n" +
+ " \"Yes\" to create announcement as is.\n" +
+ " \"No\" to cancel and update props.");
+ int choice = JOptionPane.showConfirmDialog(
+ view,
+ builder.toString(),
+ "Versions don't match",
+ JOptionPane.YES_NO_OPTION,
+ JOptionPane.WARNING_MESSAGE);
+
+ // if user's chosen yes, then announcement is created.
+ valid = (choice == JOptionPane.YES_OPTION);
+ }
+ return valid;
+ }
+}
+
+// this single line of code is the script's main routine
+// it calls the methods and exits
+if( buffer.getMode().toString().equals( "properties" ) )
+ pluginTextDialog( view, buffer );
+else
+ Macros.error( view, "This must be run on a jEdit plugin's properties file. \nOpen your Plugin's props file and rerun this macro." );
+
+// ::mode=beanshell:noTabs=true:tabSize=4:indentSize=4::
diff --git a/jEdit/macros/Properties/Insert_Buffer_Properties.bsh b/jEdit/macros/Properties/Insert_Buffer_Properties.bsh
index aab1e67..9c6333a 100644
--- a/jEdit/macros/Properties/Insert_Buffer_Properties.bsh
+++ b/jEdit/macros/Properties/Insert_Buffer_Properties.bsh
@@ -1,226 +1,226 @@
-/*
- * Insert_Buffer_Properties.bsh - a Beanshell macro
- * for the jEdit text editor that provides a gui for
- * inserting Buffer Local properties for the current buffer
- * into the current buffer. If the buffer's mode as a line
- * comment defined, or comment start and end properties then
- * the inserted properties will be commented out.
- *
- * Copyright (C) 2002, 2003 Ollie Rutherfurd <oliver at rutherfurd.net>
- *
- * BugFixed by Björn "Vampire" Kautler <Vampire0 at gmx.net>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id: Insert_Buffer_Properties.bsh 5265 2005-08-14 22:31:16Z spestov $
- */
-
-import java.awt.BorderLayout;
-import java.awt.event.ActionEvent;
-import java.util.Hashtable;
-import java.util.StringTokenizer;
-import java.util.Vector;
-import javax.swing.Box;
-import javax.swing.BoxLayout;
-import javax.swing.JButton;
-import javax.swing.JDialog;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.border.EmptyBorder;
-import org.gjt.sp.jedit.gui.JCheckBoxList;
-
-BufferLocalPropertiesDialog(View view){
-
- this.view = view;
- buffer = view.getTextArea().getBuffer();
- mode = buffer.getMode().name;
-
-// removed non-valid BLPs and added missing ones
- props = new Hashtable();
- props.put("mode","");
- props.put("indentSize","int");
- props.put("tabSize","int");
- props.put("noTabs","bool");
- props.put("wrap","str");
- props.put("maxLineLen","int");
- props.put("folding","str");
- props.put("collapseFolds","int");
- props.put("deepIndent","bool");
- props.put("noWordSep","str");
- props.put("wordBreakChars","str");
-
- _checked = jEdit.getProperty("macro.insert-buffer-properties." + mode,"");
- tokens = new StringTokenizer(_checked,",");
- checkedProps = new Hashtable();
- while(tokens.hasMoreTokens())
- {
- property = tokens.nextToken();
- checkedProps.put(property,"checked");
- }
-
- dialog = new JDialog(view,"Insert Buffer Local Properties",true);
- content = new JPanel(new BorderLayout());
- content.setBorder(new EmptyBorder(10,10,10,10));
- dialog.setContentPane(content);
- content.add(new JLabel("Properties:"), BorderLayout.NORTH);
-
- _entries = new Vector();
- names = props.keys();
- while(names.hasMoreElements()){
- name = names.nextElement();
- checked = checkedProps.get(name);
- entry = new JCheckBoxList.Entry(checked != null,name);
- _entries.addElement(entry);
- }
- entries = new JCheckBoxList.Entry[_entries.size()];
- _entries.copyInto(entries);
-
- checkBox = new JCheckBoxList(entries);
- checkBox.addKeyListener(this);
- content.add(new JScrollPane(checkBox),
- BorderLayout.CENTER);
-
- buttons = new JPanel();
- buttons.setBorder(new EmptyBorder(12,50,0,50));
- buttons.setLayout(new BoxLayout(buttons,BoxLayout.X_AXIS));
- buttons.add(Box.createGlue());
- insert = new JButton("Insert");
- cancel = new JButton("Cancel");
- insert.addActionListener(this);
- cancel.addActionListener(this);
- dialog.getRootPane().setDefaultButton(insert);
- buttons.add(insert);
- buttons.add(Box.createHorizontalStrut(6));
- buttons.add(cancel);
- buttons.add(Box.createGlue());
- content.add(buttons,BorderLayout.SOUTH);
-
- void actionPerformed(ActionEvent evt){
- if(evt.getSource() == cancel)
- dialog.dispose();
- else
- this.insertProperties();
- }
-
- keyPressed(KeyEvent evt){
- if(evt.getKeyCode() == KeyEvent.VK_ESCAPE)
- dialog.dispose();
- else if(evt.getKeyCode() == KeyEvent.VK_ENTER)
- this.insertProperties();
- }
- keyReleased(KeyEvent evt){;}
- keyTyped(KeyEvent evt){;}
-
- insertProperties(){
-// removed isReadOnly-Check because already done in the beginning of the script
- checkNextTime = new StringBuffer();
- buff = new StringBuffer();
- names = checkBox.getCheckedValues();
- for(i=0; i < names.length; i++)
- {
-// moved the assignation in front of the checkNextTime-build,
-// because "name" is used and will have a wrong value otherwise
- name = names[i];
- type = props.get(name);
-
- if(i > 0)
- checkNextTime.append(',');
- checkNextTime.append(name);
-
-// changed the value reading/building/escaping
- if(name.equals("mode"))
- value = mode;
- else if(type.equals("bool"))
- value = buffer.getBooleanProperty(name);
- else if(type.equals("str"))
- {
- value = buffer.getStringProperty(name);
- if(value == null)
- value = "";
- value = value.replaceAll("=","\\\\=").replaceAll(":","\\\\:").replaceAll("\n","\\\\n").replaceAll("\t","\\\\t");
- }
- else if(type.equals("int"))
- {
- value = buffer.getIntegerProperty(name,-1);
- if(value == -1)
- value = "";
- }
- else
- value = "";
- buff.append(':').append(name).append('=').append(value);
- }
-
- jEdit.setProperty("macro.insert-buffer-properties." + mode,
- checkNextTime.toString());
-
- if(buff.length() > 0)
- buff.append(':');
- properties = buff.toString();
-
- // try to comment out the properties first using a lineComment
- // and if that's not defined, look for comment start and end
- // properties -- use context senstive properties
- caret = view.getTextArea().getCaretPosition();
- comment = buffer.getContextSensitiveProperty(caret,"lineComment");
- if(comment != null && comment.length() > 0)
- properties = comment + " " + properties;
- else
- {
- commentStart = buffer.getContextSensitiveProperty(caret,"commentStart");
- commentEnd = buffer.getContextSensitiveProperty(caret,"commentEnd");
- if(commentStart != null && commentEnd != null)
- properties = commentStart + " " + properties + " " + commentEnd;
- }
- buffer.insert(caret,properties);
-
- line = view.getTextArea().getCaretLine();
- if(line >= 10 && line < (buffer.getLineCount()-10))
- Macros.message(view, "Note: Buffer Local properties must in the first or last 10 lines of a buffer to be recognized by jEdit.");
-
- dialog.dispose();
- }
-
- dialog.pack();
-// cosmetic size-correction
- dialog.setSize(250,290);
- dialog.setLocationRelativeTo(view);
- dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
- dialog.setVisible(true);
-}
-
-if(buffer.isReadOnly())
- Macros.error(view, "Buffer is read-only.");
-else
- BufferLocalPropertiesDialog(view);
-
-/*
- Macro index data (in DocBook format)
-
-<listitem>
- <para><filename>Insert_Buffer_Properties.bsh</filename></para>
- <abstract><para>
- Inserts buffer-local properties into the current buffer.
- </para></abstract>
- <para>
- If the buffer's
- mode has a line comment defined, or comment start and end
- defined, the inserted properties will be commented out.
- </para>
-</listitem>
-
-*/
-
-// :wrap=none:noTabs=false:collapseFolds=0:maxLineLen=80:mode=beanshell:indentSize=8:deepIndent=false:folding=none:
+/*
+ * Insert_Buffer_Properties.bsh - a Beanshell macro
+ * for the jEdit text editor that provides a gui for
+ * inserting Buffer Local properties for the current buffer
+ * into the current buffer. If the buffer's mode as a line
+ * comment defined, or comment start and end properties then
+ * the inserted properties will be commented out.
+ *
+ * Copyright (C) 2002, 2003 Ollie Rutherfurd <oliver at rutherfurd.net>
+ *
+ * BugFixed by Björn "Vampire" Kautler <Vampire0 at gmx.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id: Insert_Buffer_Properties.bsh 5265 2005-08-14 22:31:16Z spestov $
+ */
+
+import java.awt.BorderLayout;
+import java.awt.event.ActionEvent;
+import java.util.Hashtable;
+import java.util.StringTokenizer;
+import java.util.Vector;
+import javax.swing.Box;
+import javax.swing.BoxLayout;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.border.EmptyBorder;
+import org.gjt.sp.jedit.gui.JCheckBoxList;
+
+BufferLocalPropertiesDialog(View view){
+
+ this.view = view;
+ buffer = view.getTextArea().getBuffer();
+ mode = buffer.getMode().name;
+
+// removed non-valid BLPs and added missing ones
+ props = new Hashtable();
+ props.put("mode","");
+ props.put("indentSize","int");
+ props.put("tabSize","int");
+ props.put("noTabs","bool");
+ props.put("wrap","str");
+ props.put("maxLineLen","int");
+ props.put("folding","str");
+ props.put("collapseFolds","int");
+ props.put("deepIndent","bool");
+ props.put("noWordSep","str");
+ props.put("wordBreakChars","str");
+
+ _checked = jEdit.getProperty("macro.insert-buffer-properties." + mode,"");
+ tokens = new StringTokenizer(_checked,",");
+ checkedProps = new Hashtable();
+ while(tokens.hasMoreTokens())
+ {
+ property = tokens.nextToken();
+ checkedProps.put(property,"checked");
+ }
+
+ dialog = new JDialog(view,"Insert Buffer Local Properties",true);
+ content = new JPanel(new BorderLayout());
+ content.setBorder(new EmptyBorder(10,10,10,10));
+ dialog.setContentPane(content);
+ content.add(new JLabel("Properties:"), BorderLayout.NORTH);
+
+ _entries = new Vector();
+ names = props.keys();
+ while(names.hasMoreElements()){
+ name = names.nextElement();
+ checked = checkedProps.get(name);
+ entry = new JCheckBoxList.Entry(checked != null,name);
+ _entries.addElement(entry);
+ }
+ entries = new JCheckBoxList.Entry[_entries.size()];
+ _entries.copyInto(entries);
+
+ checkBox = new JCheckBoxList(entries);
+ checkBox.addKeyListener(this);
+ content.add(new JScrollPane(checkBox),
+ BorderLayout.CENTER);
+
+ buttons = new JPanel();
+ buttons.setBorder(new EmptyBorder(12,50,0,50));
+ buttons.setLayout(new BoxLayout(buttons,BoxLayout.X_AXIS));
+ buttons.add(Box.createGlue());
+ insert = new JButton("Insert");
+ cancel = new JButton("Cancel");
+ insert.addActionListener(this);
+ cancel.addActionListener(this);
+ dialog.getRootPane().setDefaultButton(insert);
+ buttons.add(insert);
+ buttons.add(Box.createHorizontalStrut(6));
+ buttons.add(cancel);
+ buttons.add(Box.createGlue());
+ content.add(buttons,BorderLayout.SOUTH);
+
+ void actionPerformed(ActionEvent evt){
+ if(evt.getSource() == cancel)
+ dialog.dispose();
+ else
+ this.insertProperties();
+ }
+
+ keyPressed(KeyEvent evt){
+ if(evt.getKeyCode() == KeyEvent.VK_ESCAPE)
+ dialog.dispose();
+ else if(evt.getKeyCode() == KeyEvent.VK_ENTER)
+ this.insertProperties();
+ }
+ keyReleased(KeyEvent evt){;}
+ keyTyped(KeyEvent evt){;}
+
+ insertProperties(){
+// removed isReadOnly-Check because already done in the beginning of the script
+ checkNextTime = new StringBuffer();
+ buff = new StringBuffer();
+ names = checkBox.getCheckedValues();
+ for(i=0; i < names.length; i++)
+ {
+// moved the assignation in front of the checkNextTime-build,
+// because "name" is used and will have a wrong value otherwise
+ name = names[i];
+ type = props.get(name);
+
+ if(i > 0)
+ checkNextTime.append(',');
+ checkNextTime.append(name);
+
+// changed the value reading/building/escaping
+ if(name.equals("mode"))
+ value = mode;
+ else if(type.equals("bool"))
+ value = buffer.getBooleanProperty(name);
+ else if(type.equals("str"))
+ {
+ value = buffer.getStringProperty(name);
+ if(value == null)
+ value = "";
+ value = value.replaceAll("=","\\\\=").replaceAll(":","\\\\:").replaceAll("\n","\\\\n").replaceAll("\t","\\\\t");
+ }
+ else if(type.equals("int"))
+ {
+ value = buffer.getIntegerProperty(name,-1);
+ if(value == -1)
+ value = "";
+ }
+ else
+ value = "";
+ buff.append(':').append(name).append('=').append(value);
+ }
+
+ jEdit.setProperty("macro.insert-buffer-properties." + mode,
+ checkNextTime.toString());
+
+ if(buff.length() > 0)
+ buff.append(':');
+ properties = buff.toString();
+
+ // try to comment out the properties first using a lineComment
+ // and if that's not defined, look for comment start and end
+ // properties -- use context senstive properties
+ caret = view.getTextArea().getCaretPosition();
+ comment = buffer.getContextSensitiveProperty(caret,"lineComment");
+ if(comment != null && comment.length() > 0)
+ properties = comment + " " + properties;
+ else
+ {
+ commentStart = buffer.getContextSensitiveProperty(caret,"commentStart");
+ commentEnd = buffer.getContextSensitiveProperty(caret,"commentEnd");
+ if(commentStart != null && commentEnd != null)
+ properties = commentStart + " " + properties + " " + commentEnd;
+ }
+ buffer.insert(caret,properties);
+
+ line = view.getTextArea().getCaretLine();
+ if(line >= 10 && line < (buffer.getLineCount()-10))
+ Macros.message(view, "Note: Buffer Local properties must in the first or last 10 lines of a buffer to be recognized by jEdit.");
+
+ dialog.dispose();
+ }
+
+ dialog.pack();
+// cosmetic size-correction
+ dialog.setSize(250,290);
+ dialog.setLocationRelativeTo(view);
+ dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
+ dialog.setVisible(true);
+}
+
+if(buffer.isReadOnly())
+ Macros.error(view, "Buffer is read-only.");
+else
+ BufferLocalPropertiesDialog(view);
+
+/*
+ Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>Insert_Buffer_Properties.bsh</filename></para>
+ <abstract><para>
+ Inserts buffer-local properties into the current buffer.
+ </para></abstract>
+ <para>
+ If the buffer's
+ mode has a line comment defined, or comment start and end
+ defined, the inserted properties will be commented out.
+ </para>
+</listitem>
+
+*/
+
+// :wrap=none:noTabs=false:collapseFolds=0:maxLineLen=80:mode=beanshell:indentSize=8:deepIndent=false:folding=none:
diff --git a/jEdit/macros/Properties/Look_and_Feel_Properties.bsh b/jEdit/macros/Properties/Look_and_Feel_Properties.bsh
index ce5b1a9..99e7998 100644
--- a/jEdit/macros/Properties/Look_and_Feel_Properties.bsh
+++ b/jEdit/macros/Properties/Look_and_Feel_Properties.bsh
@@ -1,58 +1,58 @@
-/*
- * Look_and_Feel_Properties.bsh - a BeanShell macro script for the
- * jEdit text editor - writes current look and feel
- * properties to new text buffer
- * Copyright (C) 2001 John Gellene
- * jgellene at nyc.rr.com
- * http://community.jedit.org
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with the jEdit program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id: Look_and_Feel_Properties.bsh 4911 2003-11-12 00:24:11Z spestov $
- *
- * Checked for jEdit 4.0 API
- *
- */
-
-void lookAndFeelProperties()
-{
- keys = javax.swing.UIManager.getLookAndFeelDefaults().keys();
- sb = new StringBuffer("--listing look and feel property names--\n");
- while(keys.hasMoreElements())
- {
- sb.append(keys.nextElement());
- sb.append('\n');
- }
- newbuf = jEdit.newFile(view);
- newbuf.insert(0, sb.toString());
-}
-
-lookAndFeelProperties();
-
-/*
- Macro index data (in DocBook format)
-
-<listitem>
- <para><filename>Look_and_Feel_Properties.bsh</filename></para>
- <abstract><para>
- Writes an unsorted list of the names of Java Look and Feel
- properties in a new buffer.
- </para></abstract>
-</listitem>
-
-*/
-
-// end Look_and_Feel_Properties.bsh
-
+/*
+ * Look_and_Feel_Properties.bsh - a BeanShell macro script for the
+ * jEdit text editor - writes current look and feel
+ * properties to new text buffer
+ * Copyright (C) 2001 John Gellene
+ * jgellene at nyc.rr.com
+ * http://community.jedit.org
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the jEdit program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id: Look_and_Feel_Properties.bsh 4911 2003-11-12 00:24:11Z spestov $
+ *
+ * Checked for jEdit 4.0 API
+ *
+ */
+
+void lookAndFeelProperties()
+{
+ keys = javax.swing.UIManager.getLookAndFeelDefaults().keys();
+ sb = new StringBuffer("--listing look and feel property names--\n");
+ while(keys.hasMoreElements())
+ {
+ sb.append(keys.nextElement());
+ sb.append('\n');
+ }
+ newbuf = jEdit.newFile(view);
+ newbuf.insert(0, sb.toString());
+}
+
+lookAndFeelProperties();
+
+/*
+ Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>Look_and_Feel_Properties.bsh</filename></para>
+ <abstract><para>
+ Writes an unsorted list of the names of Java Look and Feel
+ properties in a new buffer.
+ </para></abstract>
+</listitem>
+
+*/
+
+// end Look_and_Feel_Properties.bsh
+
diff --git a/jEdit/macros/Properties/System_Properties.bsh b/jEdit/macros/Properties/System_Properties.bsh
index e5efc0e..1090475 100644
--- a/jEdit/macros/Properties/System_Properties.bsh
+++ b/jEdit/macros/Properties/System_Properties.bsh
@@ -1,55 +1,55 @@
-/*
- * System_Properties.bsh - a BeanShell macro script for the
- * jEdit text editor - writes current system properties
- * to new text buffer
- * Copyright (C) 2001 John Gellene
- * jgellene at nyc.rr.com
- * http://community.jedit.org
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with the jEdit program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id: System_Properties.bsh 4911 2003-11-12 00:24:11Z spestov $
- *
- * Checked for jEdit 4.0 API
- *
- */
-
-systemProperties()
-{
- props = System.getProperties();
- sw = new StringWriter();
- pw = new PrintWriter(sw);
- props.list(pw);
- jEdit.newFile(view);
- textArea.setSelectedText(sw.toString());
-}
-
-systemProperties();
-
-/*
- Macro index data (in DocBook format)
-
-<listitem>
- <para><filename>System_Properties.bsh</filename></para>
- <abstract><para>
- Writes an unsorted list of all Java system properties in a new
- buffer.
- </para></abstract>
-</listitem>
-
-*/
-
-// end System_Properties.bsh
-
+/*
+ * System_Properties.bsh - a BeanShell macro script for the
+ * jEdit text editor - writes current system properties
+ * to new text buffer
+ * Copyright (C) 2001 John Gellene
+ * jgellene at nyc.rr.com
+ * http://community.jedit.org
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the jEdit program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id: System_Properties.bsh 4911 2003-11-12 00:24:11Z spestov $
+ *
+ * Checked for jEdit 4.0 API
+ *
+ */
+
+systemProperties()
+{
+ props = System.getProperties();
+ sw = new StringWriter();
+ pw = new PrintWriter(sw);
+ props.list(pw);
+ jEdit.newFile(view);
+ textArea.setSelectedText(sw.toString());
+}
+
+systemProperties();
+
+/*
+ Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>System_Properties.bsh</filename></para>
+ <abstract><para>
+ Writes an unsorted list of all Java system properties in a new
+ buffer.
+ </para></abstract>
+</listitem>
+
+*/
+
+// end System_Properties.bsh
+
diff --git a/jEdit/macros/Properties/jEdit_Properties.bsh b/jEdit/macros/Properties/jEdit_Properties.bsh
index 2f6495c..75f0d89 100644
--- a/jEdit/macros/Properties/jEdit_Properties.bsh
+++ b/jEdit/macros/Properties/jEdit_Properties.bsh
@@ -1,58 +1,58 @@
-/*
- * jEdit_Properties.bsh - a BeanShell macro for the
- * jEdit text editor application -- provides a list of current
- * properties used by jEdit
- * Copyright (C) 2001 John Gellene
- * jgellene at nyc.rr.com
- * http://community.jedit.org
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with the jEdit application; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id: jEdit_Properties.bsh 4911 2003-11-12 00:24:11Z spestov $
- *
- * Checked for jEdit 4.0 API
- *
- */
-
-void writeJEditProperties()
-{
- // save any changes written since the session started
- jEdit.saveSettings();
-
- props = jEdit.getProperties();
-
- sw = new StringWriter();
- pw = new PrintWriter(sw);
- props.list(pw);
- newbuf = jEdit.newFile(view);
- newbuf.insert(0, sw.toString());
-}
-
-writeJEditProperties();
-
-/*
- Macro index data (in DocBook format)
-
-<listitem>
- <para><filename>jEdit_Properties.bsh</filename></para>
- <abstract><para>
- Writes an unsorted list of jEdit properties in a new buffer.
- </para></abstract>
-</listitem>
-
-*/
-
-// end jEdit_Properties.bsh
-
+/*
+ * jEdit_Properties.bsh - a BeanShell macro for the
+ * jEdit text editor application -- provides a list of current
+ * properties used by jEdit
+ * Copyright (C) 2001 John Gellene
+ * jgellene at nyc.rr.com
+ * http://community.jedit.org
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the jEdit application; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id: jEdit_Properties.bsh 4911 2003-11-12 00:24:11Z spestov $
+ *
+ * Checked for jEdit 4.0 API
+ *
+ */
+
+void writeJEditProperties()
+{
+ // save any changes written since the session started
+ jEdit.saveSettings();
+
+ props = jEdit.getProperties();
+
+ sw = new StringWriter();
+ pw = new PrintWriter(sw);
+ props.list(pw);
+ newbuf = jEdit.newFile(view);
+ newbuf.insert(0, sw.toString());
+}
+
+writeJEditProperties();
+
+/*
+ Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>jEdit_Properties.bsh</filename></para>
+ <abstract><para>
+ Writes an unsorted list of jEdit properties in a new buffer.
+ </para></abstract>
+</listitem>
+
+*/
+
+// end jEdit_Properties.bsh
+
diff --git a/jEdit/macros/Text/Add_Prefix_and_Suffix.bsh b/jEdit/macros/Text/Add_Prefix_and_Suffix.bsh
index e7b5776..f192ef5 100644
--- a/jEdit/macros/Text/Add_Prefix_and_Suffix.bsh
+++ b/jEdit/macros/Text/Add_Prefix_and_Suffix.bsh
@@ -1,160 +1,160 @@
-/*
- * Add_Prefix_and_Suffix.bsh - a BeanShell macro script for the
- * jEdit text editor - obtains and processes input for prefix and
- * suffix text to be inserted in selected lines in the current
- * editing buffer
- * Copyright (C) 2001 John Gellene
- * jgellene at nyc.rr.com
- * http://community.jedit.org
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id: Add_Prefix_and_Suffix.bsh 9126 2007-03-10 19:14:30Z Vampire0 $
- *
- * Notes on use:
- *
- * If no text is selected, the macro will operate on the current line.
- *
- * The caret position is part of the selected text; if the caret is at
- * the beginning of a line, the macro will operate on that line.
- *
- * The use of HistoryTextField objects allows the macro to 'remember'
- * past entries for the prefix and suffix.
- */
-
-// beginning of Add_Prefix_and_Suffix.bsh
-
-// import statements
-import javax.swing.border.*;
-
-// main routine
-void prefixSuffixDialog(View view)
-{
- this.view = view;
-
- // create dialog object and set its features
- title = "Add prefix and suffix to selected lines";
- dialog = new JDialog(view, title, false);
- content = new JPanel(new BorderLayout());
- content.setBorder(new EmptyBorder(12, 12, 12, 12));
- dialog.setContentPane(content);
-
- // add to the dialog a panel containing the text fields for
- // entry of the prefix and suffix text
- fieldPanel = new JPanel(new GridLayout(4, 1, 0, 6));
- prefixField = new HistoryTextField("macro.add-prefix");
- prefixLabel = new JLabel("Prefix to add:");
- suffixField = new HistoryTextField("macro.add-suffix");
- suffixLabel = new JLabel("Suffix to add:");
- fieldPanel.add(prefixLabel);
- fieldPanel.add(prefixField);
- fieldPanel.add(suffixLabel);
- fieldPanel.add(suffixField);
- content.add(fieldPanel, "Center");
-
- // add a panel containing the buttons
- buttonPanel = new JPanel();
- buttonPanel.setLayout(new BoxLayout(buttonPanel,
- BoxLayout.X_AXIS));
- buttonPanel.setBorder(new EmptyBorder(12, 50, 0, 50));
- buttonPanel.add(Box.createGlue());
- ok = new JButton("OK");
- cancel = new JButton("Cancel");
- ok.setPreferredSize(cancel.getPreferredSize());
- dialog.getRootPane().setDefaultButton(ok);
- buttonPanel.add(ok);
- buttonPanel.add(Box.createHorizontalStrut(6));
- buttonPanel.add(cancel);
- buttonPanel.add(Box.createGlue());
- content.add(buttonPanel, "South");
-
- // register this method as an ActionListener for
- // the buttons and text fields
- ok.addActionListener(this);
- cancel.addActionListener(this);
- prefixField.addActionListener(this);
- suffixField.addActionListener(this);
-
- // locate the dialog in the center of the
- // editing pane and make it visible
- dialog.pack();
- dialog.setLocationRelativeTo(view);
- dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
- dialog.setVisible(true);
-
- // this method will be called when a button is clicked
- // or when ENTER is pressed
- void actionPerformed(e)
- {
- if(e.getSource() != cancel)
- {
- processText();
- }
- dialog.dispose();
- }
-
- // this is where the work gets done to insert
- // the prefix and suffix
- void processText()
- {
- prefix = prefixField.getText();
- suffix = suffixField.getText();
- if(prefix.length() == 0 && suffix.length() == 0)
- return;
- prefixField.addCurrentToHistory();
- suffixField.addCurrentToHistory();
-
- // text manipulation begins here using calls
- // to jEdit methods
- selectedLines = textArea.getSelectedLines();
- for(i = 0; i < selectedLines.length; ++i)
- {
- offsetBOL = textArea.getLineStartOffset(selectedLines[i]);
- textArea.setCaretPosition(offsetBOL);
- textArea.goToStartOfWhiteSpace(false);
- textArea.goToEndOfWhiteSpace(true);
- text = textArea.getSelectedText();
- if(text == null) text = "";
- textArea.setSelectedText(prefix + text + suffix);
- }
- }
-}
-
-// this single line of code is the script's main routine
-// it calls the methods and exits
-if(buffer.isReadOnly())
- Macros.error(view, "Buffer is read-only.");
-else
- prefixSuffixDialog(view);
-
-/*
- Macro index data (in DocBook format)
-
-<listitem>
- <para><filename>Add_Prefix_and_Suffix.bsh</filename></para>
- <abstract><para>
- Adds user-supplied <quote>prefix</quote> and <quote>suffix</quote>
- text to each line in a group of selected lines.
- </para></abstract>
- <para>
- Text is added after leading whitespace and before trailing whitespace.
- A dialog window receives input and <quote>remembers</quote> past entries.
- </para>
-</listitem>
-
-*/
-
-// end Add_Prefix_and_Suffix.bsh
-
+/*
+ * Add_Prefix_and_Suffix.bsh - a BeanShell macro script for the
+ * jEdit text editor - obtains and processes input for prefix and
+ * suffix text to be inserted in selected lines in the current
+ * editing buffer
+ * Copyright (C) 2001 John Gellene
+ * jgellene at nyc.rr.com
+ * http://community.jedit.org
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id: Add_Prefix_and_Suffix.bsh 9126 2007-03-10 19:14:30Z Vampire0 $
+ *
+ * Notes on use:
+ *
+ * If no text is selected, the macro will operate on the current line.
+ *
+ * The caret position is part of the selected text; if the caret is at
+ * the beginning of a line, the macro will operate on that line.
+ *
+ * The use of HistoryTextField objects allows the macro to 'remember'
+ * past entries for the prefix and suffix.
+ */
+
+// beginning of Add_Prefix_and_Suffix.bsh
+
+// import statements
+import javax.swing.border.*;
+
+// main routine
+void prefixSuffixDialog(View view)
+{
+ this.view = view;
+
+ // create dialog object and set its features
+ title = "Add prefix and suffix to selected lines";
+ dialog = new JDialog(view, title, false);
+ content = new JPanel(new BorderLayout());
+ content.setBorder(new EmptyBorder(12, 12, 12, 12));
+ dialog.setContentPane(content);
+
+ // add to the dialog a panel containing the text fields for
+ // entry of the prefix and suffix text
+ fieldPanel = new JPanel(new GridLayout(4, 1, 0, 6));
+ prefixField = new HistoryTextField("macro.add-prefix");
+ prefixLabel = new JLabel("Prefix to add:");
+ suffixField = new HistoryTextField("macro.add-suffix");
+ suffixLabel = new JLabel("Suffix to add:");
+ fieldPanel.add(prefixLabel);
+ fieldPanel.add(prefixField);
+ fieldPanel.add(suffixLabel);
+ fieldPanel.add(suffixField);
+ content.add(fieldPanel, "Center");
+
+ // add a panel containing the buttons
+ buttonPanel = new JPanel();
+ buttonPanel.setLayout(new BoxLayout(buttonPanel,
+ BoxLayout.X_AXIS));
+ buttonPanel.setBorder(new EmptyBorder(12, 50, 0, 50));
+ buttonPanel.add(Box.createGlue());
+ ok = new JButton("OK");
+ cancel = new JButton("Cancel");
+ ok.setPreferredSize(cancel.getPreferredSize());
+ dialog.getRootPane().setDefaultButton(ok);
+ buttonPanel.add(ok);
+ buttonPanel.add(Box.createHorizontalStrut(6));
+ buttonPanel.add(cancel);
+ buttonPanel.add(Box.createGlue());
+ content.add(buttonPanel, "South");
+
+ // register this method as an ActionListener for
+ // the buttons and text fields
+ ok.addActionListener(this);
+ cancel.addActionListener(this);
+ prefixField.addActionListener(this);
+ suffixField.addActionListener(this);
+
+ // locate the dialog in the center of the
+ // editing pane and make it visible
+ dialog.pack();
+ dialog.setLocationRelativeTo(view);
+ dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
+ dialog.setVisible(true);
+
+ // this method will be called when a button is clicked
+ // or when ENTER is pressed
+ void actionPerformed(e)
+ {
+ if(e.getSource() != cancel)
+ {
+ processText();
+ }
+ dialog.dispose();
+ }
+
+ // this is where the work gets done to insert
+ // the prefix and suffix
+ void processText()
+ {
+ prefix = prefixField.getText();
+ suffix = suffixField.getText();
+ if(prefix.length() == 0 && suffix.length() == 0)
+ return;
+ prefixField.addCurrentToHistory();
+ suffixField.addCurrentToHistory();
+
+ // text manipulation begins here using calls
+ // to jEdit methods
+ selectedLines = textArea.getSelectedLines();
+ for(i = 0; i < selectedLines.length; ++i)
+ {
+ offsetBOL = textArea.getLineStartOffset(selectedLines[i]);
+ textArea.setCaretPosition(offsetBOL);
+ textArea.goToStartOfWhiteSpace(false);
+ textArea.goToEndOfWhiteSpace(true);
+ text = textArea.getSelectedText();
+ if(text == null) text = "";
+ textArea.setSelectedText(prefix + text + suffix);
+ }
+ }
+}
+
+// this single line of code is the script's main routine
+// it calls the methods and exits
+if(buffer.isReadOnly())
+ Macros.error(view, "Buffer is read-only.");
+else
+ prefixSuffixDialog(view);
+
+/*
+ Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>Add_Prefix_and_Suffix.bsh</filename></para>
+ <abstract><para>
+ Adds user-supplied <quote>prefix</quote> and <quote>suffix</quote>
+ text to each line in a group of selected lines.
+ </para></abstract>
+ <para>
+ Text is added after leading whitespace and before trailing whitespace.
+ A dialog window receives input and <quote>remembers</quote> past entries.
+ </para>
+</listitem>
+
+*/
+
+// end Add_Prefix_and_Suffix.bsh
+
diff --git a/jEdit/macros/Text/Color_Picker.bsh b/jEdit/macros/Text/Color_Picker.bsh
index 8a93089..91351f7 100644
--- a/jEdit/macros/Text/Color_Picker.bsh
+++ b/jEdit/macros/Text/Color_Picker.bsh
@@ -1,52 +1,52 @@
-/*
- * Color_Picker.bsh - a BeanShell macro script for the
- * jEdit text editor - displays color picker, inserts selected color
- * Copyright (C) 2001 Slava Pestov
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with the jEdit application; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id: Color_Picker.bsh 4988 2004-03-08 04:29:12Z spestov $
- */
-
-selection = textArea.getSelectedText();
-if (selection != null)
- color = GUIUtilities.parseColor(selection);
-else
- color = null;
-
-color = JColorChooser.showDialog(view, "Color Picker", color);
-
-if (color != null){
- if(buffer.isReadOnly())
- Macros.error(view, "Buffer is read-only.");
- else
- textArea.setSelectedText(GUIUtilities.getColorHexString(color));
-}
-
-/*
- Macro index data (in DocBook format)
-
-<listitem>
- <para><filename>Color_Picker.bsh</filename></para>
- <abstract><para>
- Displays a color picker and inserts the selected color in
- hexadecimal format, prefixed with a <quote>#</quote>.
- </para></abstract>
-</listitem>
-
-*/
-
-// end Color_Picker.bsh
-
+/*
+ * Color_Picker.bsh - a BeanShell macro script for the
+ * jEdit text editor - displays color picker, inserts selected color
+ * Copyright (C) 2001 Slava Pestov
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the jEdit application; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id: Color_Picker.bsh 4988 2004-03-08 04:29:12Z spestov $
+ */
+
+selection = textArea.getSelectedText();
+if (selection != null)
+ color = GUIUtilities.parseColor(selection);
+else
+ color = null;
+
+color = JColorChooser.showDialog(view, "Color Picker", color);
+
+if (color != null){
+ if(buffer.isReadOnly())
+ Macros.error(view, "Buffer is read-only.");
+ else
+ textArea.setSelectedText(GUIUtilities.getColorHexString(color));
+}
+
+/*
+ Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>Color_Picker.bsh</filename></para>
+ <abstract><para>
+ Displays a color picker and inserts the selected color in
+ hexadecimal format, prefixed with a <quote>#</quote>.
+ </para></abstract>
+</listitem>
+
+*/
+
+// end Color_Picker.bsh
+
diff --git a/jEdit/macros/Text/Duplicate_Line.bsh b/jEdit/macros/Text/Duplicate_Line.bsh
index b28cd50..03593b6 100644
--- a/jEdit/macros/Text/Duplicate_Line.bsh
+++ b/jEdit/macros/Text/Duplicate_Line.bsh
@@ -1,70 +1,70 @@
-/*
- * Duplicate_Line.bsh - a BeanShell macro script for the
- * jEdit text editor - duplicates the cursor line.
- * Copyright (C) 2001 Francesc Roses
- * froses at menta.net
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with the jEdit program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- *
- * $Id: Duplicate_Line.bsh 3866 2001-11-06 15:04:21Z jgellene $
- *
- * Checked for jEdit 4.0 API
- *
- */
-
-void duplicateLine()
-{
- /*
- * Guard for readonly files becuase Buffer.insert()
- * ignores the flag
- *
- */
- if(buffer.isReadOnly())
- {
- Macros.error(view, "This file is read only.");
- return;
- }
- line = textArea.getCaretLine();
- offset = textArea.getLineEndOffset(line);
- // handle last line differently
- if(line == textArea.getLineCount() - 1)
- {
- text = "\n" + textArea.getLineText(line);
- --offset;
- }
- else
- text = textArea.getLineText(line) + "\n";
- buffer.insert(offset, text);
- textArea.goToNextLine(false);
-}
-
-duplicateLine();
-
-/*
-
-Macro index data (in DocBook format)
-
- <listitem>
- <para><filename>Duplicate_Line.bsh</filename></para>
- <abstract><para>
- Duplicates the line on which the caret lies immediately
- beneath it and moves the caret to the new line.
- </para></abstract>
- </listitem>
-
-*/
-
-// end Duplicate_Line.bsh
+/*
+ * Duplicate_Line.bsh - a BeanShell macro script for the
+ * jEdit text editor - duplicates the cursor line.
+ * Copyright (C) 2001 Francesc Roses
+ * froses at menta.net
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the jEdit program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ *
+ * $Id: Duplicate_Line.bsh 3866 2001-11-06 15:04:21Z jgellene $
+ *
+ * Checked for jEdit 4.0 API
+ *
+ */
+
+void duplicateLine()
+{
+ /*
+ * Guard for readonly files becuase Buffer.insert()
+ * ignores the flag
+ *
+ */
+ if(buffer.isReadOnly())
+ {
+ Macros.error(view, "This file is read only.");
+ return;
+ }
+ line = textArea.getCaretLine();
+ offset = textArea.getLineEndOffset(line);
+ // handle last line differently
+ if(line == textArea.getLineCount() - 1)
+ {
+ text = "\n" + textArea.getLineText(line);
+ --offset;
+ }
+ else
+ text = textArea.getLineText(line) + "\n";
+ buffer.insert(offset, text);
+ textArea.goToNextLine(false);
+}
+
+duplicateLine();
+
+/*
+
+Macro index data (in DocBook format)
+
+ <listitem>
+ <para><filename>Duplicate_Line.bsh</filename></para>
+ <abstract><para>
+ Duplicates the line on which the caret lies immediately
+ beneath it and moves the caret to the new line.
+ </para></abstract>
+ </listitem>
+
+*/
+
+// end Duplicate_Line.bsh
diff --git a/jEdit/macros/Text/Insert_Date.bsh b/jEdit/macros/Text/Insert_Date.bsh
index fe31093..f15cd43 100644
--- a/jEdit/macros/Text/Insert_Date.bsh
+++ b/jEdit/macros/Text/Insert_Date.bsh
@@ -1,80 +1,80 @@
-/*
- * Insert_Date.bsh - a BeanShell macro script for the
- * jEdit text editor - insert current date and "Internet Time"
- * at current caret position
- * Copyright (C) 2001 John Gellene (on behalf of author)
- * jgellene at nyc.rr.com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with the jEdit program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id: Insert_Date.bsh 4988 2004-03-08 04:29:12Z spestov $
- */
-
-// Inserts the current date and Internet Time at the caret position
-// "Internet Time" is a new and easy way to measure time across the world
-// To find more "Internet Time"-related information go to
-// http://www.swatch.com/alu_beat/fs_itime.html
-
-// Wed Jan 31 03:12:33 AKST 2001 @550 /Internet Time/
-
-void insertDate()
-{
- Calendar rightNow = Calendar.getInstance();
-
- // zone offset with daylight savings
- int zoffset = (rightNow.get(Calendar.ZONE_OFFSET) +
- rightNow.get(Calendar.DST_OFFSET)) / 60000;
-
- // parsing current hour, minute and second
- double h = rightNow.get(Calendar.HOUR_OF_DAY);
- double m = rightNow.get(Calendar.MINUTE);
- double s = rightNow.get(Calendar.SECOND);
-
- // calculating internet time
- double swatch = Math.floor
- ((h * 3600 + ((m - zoffset + 60) * 60) + s) * 1000 / 86400);
- if (swatch >= 1000)
- swatch -= 1000;
- else if (swatch < 0)
- swatch += 1000;
-
- // inserting date and internet time to textarea
- textArea.setSelectedText(Calendar.getInstance().getTime().toString()
- + " @" + (int)swatch + " /Internet Time/");
-}
-
-if(buffer.isReadOnly())
- Macros.error(view, "Buffer is read-only.");
-else
- insertDate();
-
-/*
- Macro index data (in DocBook format)
-
-<listitem>
- <para><filename>Insert_Date.bsh</filename></para>
- <abstract><para>
- Inserts the current date and time in the current buffer.
- </para></abstract>
- <para>
- The inserted text includes a representation of the time in the
- <quote>Internet Time</quote> format.
- </para>
-</listitem>
-
-*/
-
-// end Insert_Date.bsh
-
+/*
+ * Insert_Date.bsh - a BeanShell macro script for the
+ * jEdit text editor - insert current date and "Internet Time"
+ * at current caret position
+ * Copyright (C) 2001 John Gellene (on behalf of author)
+ * jgellene at nyc.rr.com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the jEdit program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id: Insert_Date.bsh 4988 2004-03-08 04:29:12Z spestov $
+ */
+
+// Inserts the current date and Internet Time at the caret position
+// "Internet Time" is a new and easy way to measure time across the world
+// To find more "Internet Time"-related information go to
+// http://www.swatch.com/alu_beat/fs_itime.html
+
+// Wed Jan 31 03:12:33 AKST 2001 @550 /Internet Time/
+
+void insertDate()
+{
+ Calendar rightNow = Calendar.getInstance();
+
+ // zone offset with daylight savings
+ int zoffset = (rightNow.get(Calendar.ZONE_OFFSET) +
+ rightNow.get(Calendar.DST_OFFSET)) / 60000;
+
+ // parsing current hour, minute and second
+ double h = rightNow.get(Calendar.HOUR_OF_DAY);
+ double m = rightNow.get(Calendar.MINUTE);
+ double s = rightNow.get(Calendar.SECOND);
+
+ // calculating internet time
+ double swatch = Math.floor
+ ((h * 3600 + ((m - zoffset + 60) * 60) + s) * 1000 / 86400);
+ if (swatch >= 1000)
+ swatch -= 1000;
+ else if (swatch < 0)
+ swatch += 1000;
+
+ // inserting date and internet time to textarea
+ textArea.setSelectedText(Calendar.getInstance().getTime().toString()
+ + " @" + (int)swatch + " /Internet Time/");
+}
+
+if(buffer.isReadOnly())
+ Macros.error(view, "Buffer is read-only.");
+else
+ insertDate();
+
+/*
+ Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>Insert_Date.bsh</filename></para>
+ <abstract><para>
+ Inserts the current date and time in the current buffer.
+ </para></abstract>
+ <para>
+ The inserted text includes a representation of the time in the
+ <quote>Internet Time</quote> format.
+ </para>
+</listitem>
+
+*/
+
+// end Insert_Date.bsh
+
diff --git a/jEdit/macros/Text/Insert_Tag.bsh b/jEdit/macros/Text/Insert_Tag.bsh
index 9e3945f..6a675ca 100644
--- a/jEdit/macros/Text/Insert_Tag.bsh
+++ b/jEdit/macros/Text/Insert_Tag.bsh
@@ -1,62 +1,62 @@
-/*
- * Insert_Tag.bsh - a BeanShell macro script for the
- * jEdit text editor - inserts opening and closing tags
- * around selected text
- * Copyright (C) 2001 John Gellene
- * jgellene at nyc.rr.com
- * http://community.jedit.org
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with the jEdit program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id: Insert_Tag.bsh 4988 2004-03-08 04:29:12Z spestov $
- */
-
-
-void insertTag()
-{
- caret = textArea.getCaretPosition();
- tag = Macros.input(view, "Enter name of tag:");
- if( tag == null || tag.length() == 0) return;
- text = textArea.getSelectedText();
- if(text == null) text = "";
- sb = new StringBuffer();
- sb.append("<").append(tag).append(">");
- sb.append(text);
- sb.append("</").append(tag).append(">");
- textArea.setSelectedText(sb.toString());
- //if no selected text, put the caret between the tags
- if(text.length() == 0)
- textArea.setCaretPosition(caret + tag.length() + 2);
-}
-
-if(buffer.isReadOnly())
- Macros.error(view, "Buffer is read-only.");
-else
- insertTag();
-
-/*
- Macro index data (in DocBook format)
-
-<listitem>
- <para><filename>Insert_Tag.bsh</filename></para>
- <abstract><para>
- Inserts a balanced pair of markup tags as supplied in a i
- nput dialog.
- </para></abstract>
-</listitem>
-
-*/
-
-// end Insert_Tag.bsh
+/*
+ * Insert_Tag.bsh - a BeanShell macro script for the
+ * jEdit text editor - inserts opening and closing tags
+ * around selected text
+ * Copyright (C) 2001 John Gellene
+ * jgellene at nyc.rr.com
+ * http://community.jedit.org
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the jEdit program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id: Insert_Tag.bsh 4988 2004-03-08 04:29:12Z spestov $
+ */
+
+
+void insertTag()
+{
+ caret = textArea.getCaretPosition();
+ tag = Macros.input(view, "Enter name of tag:");
+ if( tag == null || tag.length() == 0) return;
+ text = textArea.getSelectedText();
+ if(text == null) text = "";
+ sb = new StringBuffer();
+ sb.append("<").append(tag).append(">");
+ sb.append(text);
+ sb.append("</").append(tag).append(">");
+ textArea.setSelectedText(sb.toString());
+ //if no selected text, put the caret between the tags
+ if(text.length() == 0)
+ textArea.setCaretPosition(caret + tag.length() + 2);
+}
+
+if(buffer.isReadOnly())
+ Macros.error(view, "Buffer is read-only.");
+else
+ insertTag();
+
+/*
+ Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>Insert_Tag.bsh</filename></para>
+ <abstract><para>
+ Inserts a balanced pair of markup tags as supplied in a i
+ nput dialog.
+ </para></abstract>
+</listitem>
+
+*/
+
+// end Insert_Tag.bsh
diff --git a/jEdit/macros/Text/Next_Char.bsh b/jEdit/macros/Text/Next_Char.bsh
index 8f480f4..ea819b6 100644
--- a/jEdit/macros/Text/Next_Char.bsh
+++ b/jEdit/macros/Text/Next_Char.bsh
@@ -1,73 +1,73 @@
-/*
- * Next_char.bsh - a BeanShell macro script for the
- * jEdit text editor - finds next occurence of character on
- * current line
- * Copyright (C) 2001 John Gellene
- * jgellene at nyc.rr.com
- * http://community.jedit.org
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with the jEdit program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id: Next_Char.bsh 4988 2004-03-08 04:29:12Z spestov $
- *
- * Checked for jEdit 4.0 API
- *
- */
-
-void nextChar()
-{
- script = new StringBuffer(512);
- script.append( "start = textArea.getCaretPosition();" );
- script.append( "line = textArea.getCaretLine();" );
- script.append( "end = textArea.getLineEndOffset(line) + 1;" );
- script.append( "text = buffer.getText(start, end - start);" );
- script.append( "match = text.indexOf(__char__, 1);" );
- script.append( "if(match != -1) {" );
- script.append( "if(__char__ != '\\n') ++match;" );
- script.append( "textArea.select(start, start + match - 1);}" );
-
- view.getInputHandler().readNextChar("Enter a character",script.toString());
-}
-
-nextChar();
-
-/*
- Macro index data (in DocBook format)
-
-<listitem>
- <para><filename>Next_Char.bsh</filename></para>
- <abstract><para>
- Finds next occurence of character on current line.
- </para></abstract>
- <para>
- The macro takes the next character typed after macro execution
- as the character being searched. That character is not
- displayed. If the character does not appear in the balance of
- the current line, no action occurs.
- </para>
- <para>
- This macro illustrates the use of
- <function>InputHandler.readNextChar()</function> as a means of
- obtaining user input. <!-- See <xref
- linkend="macro-tips-single-char" -->
- />.
- </para>
- </listitem>
-
-*/
-
-
-// end Next_char.bsh
-
+/*
+ * Next_char.bsh - a BeanShell macro script for the
+ * jEdit text editor - finds next occurence of character on
+ * current line
+ * Copyright (C) 2001 John Gellene
+ * jgellene at nyc.rr.com
+ * http://community.jedit.org
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the jEdit program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id: Next_Char.bsh 4988 2004-03-08 04:29:12Z spestov $
+ *
+ * Checked for jEdit 4.0 API
+ *
+ */
+
+void nextChar()
+{
+ script = new StringBuffer(512);
+ script.append( "start = textArea.getCaretPosition();" );
+ script.append( "line = textArea.getCaretLine();" );
+ script.append( "end = textArea.getLineEndOffset(line) + 1;" );
+ script.append( "text = buffer.getText(start, end - start);" );
+ script.append( "match = text.indexOf(__char__, 1);" );
+ script.append( "if(match != -1) {" );
+ script.append( "if(__char__ != '\\n') ++match;" );
+ script.append( "textArea.select(start, start + match - 1);}" );
+
+ view.getInputHandler().readNextChar("Enter a character",script.toString());
+}
+
+nextChar();
+
+/*
+ Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>Next_Char.bsh</filename></para>
+ <abstract><para>
+ Finds next occurence of character on current line.
+ </para></abstract>
+ <para>
+ The macro takes the next character typed after macro execution
+ as the character being searched. That character is not
+ displayed. If the character does not appear in the balance of
+ the current line, no action occurs.
+ </para>
+ <para>
+ This macro illustrates the use of
+ <function>InputHandler.readNextChar()</function> as a means of
+ obtaining user input. <!-- See <xref
+ linkend="macro-tips-single-char" -->
+ />.
+ </para>
+ </listitem>
+
+*/
+
+
+// end Next_char.bsh
+
diff --git a/jEdit/macros/Text/Reverse_Lines.bsh b/jEdit/macros/Text/Reverse_Lines.bsh
index edeca72..27dba02 100644
--- a/jEdit/macros/Text/Reverse_Lines.bsh
+++ b/jEdit/macros/Text/Reverse_Lines.bsh
@@ -1,94 +1,94 @@
-/*
- * Reverse_Lines.bsh - a BeanShell macro script for reversing the order
- * of lines in a buffer. If there are selections, the lines in the selections
- * will be reversed, otherwise the whole buffer will be reversed.
- * NOTE: Lines are not sorted or reverse sorted, simply reversed.
- *
- * Copyright (C) 2002-2004 Ollie Rutherfurd, oliver at rutherfurd.net
- *
- * :mode=beanshell:tabSize=4:indentSize=4:maxLineLen=0:noTabs=false:
- * :indentOnTab=true:indentOnEnter=true:folding=explicit:collapseFolds=1:
- *
- * $Id: Reverse_Lines.bsh 9126 2007-03-10 19:14:30Z Vampire0 $
- */
-
-void reverseLines(textArea)
-{
- JEditBuffer buffer = textArea.getBuffer();
- Selection[] selections = textArea.getSelection();
-
- // doesn't work with rectangular selections, check for them up-front
- for(int i = 0; i < selections.length; i++)
- {
- if(selections[i] instanceof Selection.Rect)
- {
- Macros.error(view, "Sorry, this macro doesn't work with Rectangular Selections.");
- return;
- }
- }
-
- // do whole buffer if no selections
- if(selections.length == 0)
- {
- StringBuffer sb = new StringBuffer(buffer.getLength());
- for(int i = buffer.getLineCount() - 1; i >= 0; i--)
- {
- String line = buffer.getLineText(i);
- sb.append(line);
- if(i > 0) // don't append a newline for the last line
- sb.append('\n');
- }
- buffer.remove(0, buffer.getLength());
- buffer.insert(0, sb.toString());
- }
- // reverse all lines that are selected *NOT* just selected portions of lines
- else
- {
- for(int i = 0; i < selections.length; i++){
-
- int startLine = selections[i].getStartLine();
- int endLine = selections[i].getEndLine();
- int startOffset = buffer.getLineStartOffset(startLine);
-
- if(startLine < endLine)
- {
- StringBuffer sb = new StringBuffer();
- for(int i = endLine; i > startLine; i--)
- {
- String line = buffer.getLineText(i);
- sb.append(line).append('\n');
- }
-
- // appending first line here, so a check
- // can be made to see whether to append
- // a newline (don't if the original line
- // was the last line of the buffer)
- sb.append(buffer.getLineText(startLine));
- if(endLine < buffer.getLineCount() - 1)
- sb.append('\n');
-
- String reversed = sb.toString();
- buffer.remove(startOffset, reversed.length());
- buffer.insert(startOffset, reversed);
- }
- }
- }
-}
-
-if(buffer.isReadOnly())
- Macros.error(view, "Buffer is read-only.");
-else
- reverseLines(textArea);
-
-/*
- Macro index entry (in DocBook XML)
-
-<listitem>
- <para><filename>Reverse_Lines.bsh</filename></para>
- <abstract><para>
- Reverses the selected lines or the entire buffer if no
- lines are selected. Does not support Rectangular
- Selections.
- </para></abstract>
-</listitem>
-*/
+/*
+ * Reverse_Lines.bsh - a BeanShell macro script for reversing the order
+ * of lines in a buffer. If there are selections, the lines in the selections
+ * will be reversed, otherwise the whole buffer will be reversed.
+ * NOTE: Lines are not sorted or reverse sorted, simply reversed.
+ *
+ * Copyright (C) 2002-2004 Ollie Rutherfurd, oliver at rutherfurd.net
+ *
+ * :mode=beanshell:tabSize=4:indentSize=4:maxLineLen=0:noTabs=false:
+ * :indentOnTab=true:indentOnEnter=true:folding=explicit:collapseFolds=1:
+ *
+ * $Id: Reverse_Lines.bsh 9126 2007-03-10 19:14:30Z Vampire0 $
+ */
+
+void reverseLines(textArea)
+{
+ JEditBuffer buffer = textArea.getBuffer();
+ Selection[] selections = textArea.getSelection();
+
+ // doesn't work with rectangular selections, check for them up-front
+ for(int i = 0; i < selections.length; i++)
+ {
+ if(selections[i] instanceof Selection.Rect)
+ {
+ Macros.error(view, "Sorry, this macro doesn't work with Rectangular Selections.");
+ return;
+ }
+ }
+
+ // do whole buffer if no selections
+ if(selections.length == 0)
+ {
+ StringBuffer sb = new StringBuffer(buffer.getLength());
+ for(int i = buffer.getLineCount() - 1; i >= 0; i--)
+ {
+ String line = buffer.getLineText(i);
+ sb.append(line);
+ if(i > 0) // don't append a newline for the last line
+ sb.append('\n');
+ }
+ buffer.remove(0, buffer.getLength());
+ buffer.insert(0, sb.toString());
+ }
+ // reverse all lines that are selected *NOT* just selected portions of lines
+ else
+ {
+ for(int i = 0; i < selections.length; i++){
+
+ int startLine = selections[i].getStartLine();
+ int endLine = selections[i].getEndLine();
+ int startOffset = buffer.getLineStartOffset(startLine);
+
+ if(startLine < endLine)
+ {
+ StringBuffer sb = new StringBuffer();
+ for(int i = endLine; i > startLine; i--)
+ {
+ String line = buffer.getLineText(i);
+ sb.append(line).append('\n');
+ }
+
+ // appending first line here, so a check
+ // can be made to see whether to append
+ // a newline (don't if the original line
+ // was the last line of the buffer)
+ sb.append(buffer.getLineText(startLine));
+ if(endLine < buffer.getLineCount() - 1)
+ sb.append('\n');
+
+ String reversed = sb.toString();
+ buffer.remove(startOffset, reversed.length());
+ buffer.insert(startOffset, reversed);
+ }
+ }
+ }
+}
+
+if(buffer.isReadOnly())
+ Macros.error(view, "Buffer is read-only.");
+else
+ reverseLines(textArea);
+
+/*
+ Macro index entry (in DocBook XML)
+
+<listitem>
+ <para><filename>Reverse_Lines.bsh</filename></para>
+ <abstract><para>
+ Reverses the selected lines or the entire buffer if no
+ lines are selected. Does not support Rectangular
+ Selections.
+ </para></abstract>
+</listitem>
+*/
diff --git a/jEdit/macros/Text/Single_Space_Buffer.bsh b/jEdit/macros/Text/Single_Space_Buffer.bsh
index e686ad4..cf811e8 100644
--- a/jEdit/macros/Text/Single_Space_Buffer.bsh
+++ b/jEdit/macros/Text/Single_Space_Buffer.bsh
@@ -1,51 +1,51 @@
-/**
- * Single_Space_Buffer.bsh - A Beanshell macro for jEdit that
- * converts a buffer from being double-spaced (where every second
- * line is blank) to single-spaced, by removing each second line -
- * but only if they're all blank.
- *
- * Copyright (C) 2004 Ollie Rutherfurd <oliver at rutherfurd.net>
- *
- * $Id: Single_Space_Buffer.bsh 9126 2007-03-10 19:14:30Z Vampire0 $
- */
-
-void singleSpaceBuffer(View view)
-{
- Buffer buffer = view.getBuffer();
- int line = 1; // start on second line
- Vector lines = new java.util.Stack();
-
- while(line < buffer.getLineCount())
- {
- if(buffer.getLineText(line).equals(""))
- lines.addElement(new Integer(line));
- else
- {
- StringBuffer msg = new StringBuffer();
- msg.append(buffer.getPath() + " doesn't appear to be double-spaced:\n");
- msg.append("Line " + (line + 1) + " isn't blank.");
- Macros.error(view, msg.toString());
- return;
- }
- line += 2;
- }
- while(!lines.empty())
- {
- Integer lineno = (Integer)lines.pop();
- int offset = buffer.getLineStartOffset(lineno.intValue());
- buffer.remove(offset-1,1);
- }
-}
-
-singleSpaceBuffer(view);
-
-/*
-
-<listitem>
- <para><filename>Single_Space_Buffer.bsh</filename></para>
- <abstract><para>
- Removes every second line, if they are all blank.
- </para></abstract>
-</listitem>
-
-*/
+/**
+ * Single_Space_Buffer.bsh - A Beanshell macro for jEdit that
+ * converts a buffer from being double-spaced (where every second
+ * line is blank) to single-spaced, by removing each second line -
+ * but only if they're all blank.
+ *
+ * Copyright (C) 2004 Ollie Rutherfurd <oliver at rutherfurd.net>
+ *
+ * $Id: Single_Space_Buffer.bsh 9126 2007-03-10 19:14:30Z Vampire0 $
+ */
+
+void singleSpaceBuffer(View view)
+{
+ Buffer buffer = view.getBuffer();
+ int line = 1; // start on second line
+ Vector lines = new java.util.Stack();
+
+ while(line < buffer.getLineCount())
+ {
+ if(buffer.getLineText(line).equals(""))
+ lines.addElement(new Integer(line));
+ else
+ {
+ StringBuffer msg = new StringBuffer();
+ msg.append(buffer.getPath() + " doesn't appear to be double-spaced:\n");
+ msg.append("Line " + (line + 1) + " isn't blank.");
+ Macros.error(view, msg.toString());
+ return;
+ }
+ line += 2;
+ }
+ while(!lines.empty())
+ {
+ Integer lineno = (Integer)lines.pop();
+ int offset = buffer.getLineStartOffset(lineno.intValue());
+ buffer.remove(offset-1,1);
+ }
+}
+
+singleSpaceBuffer(view);
+
+/*
+
+<listitem>
+ <para><filename>Single_Space_Buffer.bsh</filename></para>
+ <abstract><para>
+ Removes every second line, if they are all blank.
+ </para></abstract>
+</listitem>
+
+*/
diff --git a/jEdit/modes/actionscript.xml b/jEdit/modes/actionscript.xml
index baf750f..3d53a98 100644
--- a/jEdit/modes/actionscript.xml
+++ b/jEdit/modes/actionscript.xml
@@ -1,829 +1,829 @@
-<?xml version="1.0"?>
-<!DOCTYPE MODE SYSTEM "xmode.dtd">
-
-<!--
- ActionScript mode by Ben Glazer <ben at enspire.com>
- Adapted from JavaScript mode by Andre Kaplan
- Updated for Flash MX 2004 by Nahuel Foronda <www.asfusion.com>
--->
-<MODE>
- <PROPS>
- <PROPERTY NAME="indentOpenBrackets" VALUE="{" />
- <PROPERTY NAME="indentCloseBrackets" VALUE="}" />
- <!-- the ; hack is there so that stuff like if(bob) fred();
- does not indent the next line -->
- <PROPERTY NAME="indentPrevLine" VALUE="\s*(if|while)\s*(|else|case|default:)[^;]*|for\s*\(.*)" />
- <!-- set this to 'true' if you want to use GNU coding style -->
- <PROPERTY NAME="doubleBracketIndent" VALUE="false" />
- <PROPERTY NAME="commentStart" VALUE="/*" />
- <PROPERTY NAME="commentEnd" VALUE="*/" />
- <PROPERTY NAME="lineComment" VALUE="//" />
- <PROPERTY NAME="wordBreakChars" VALUE=",+-=<>/?^&*" />
- </PROPS>
-
- <RULES IGNORE_CASE="FALSE" HIGHLIGHT_DIGITS="TRUE">
- <!-- whitespace: (space and tab) -->
- <SPAN TYPE="COMMENT1">
- <BEGIN>/*</BEGIN>
- <END>*/</END>
- </SPAN>
-
- <SPAN TYPE="LITERAL1" ESCAPE="\" NO_LINE_BREAK="TRUE">
- <BEGIN>"</BEGIN>
- <END>"</END>
- </SPAN>
-
- <SPAN TYPE="LITERAL1" ESCAPE="\" NO_LINE_BREAK="TRUE">
- <BEGIN>'</BEGIN>
- <END>'</END>
- </SPAN>
-
- <MARK_PREVIOUS TYPE="FUNCTION" MATCH_TYPE="OPERATOR">(</MARK_PREVIOUS>
- <SEQ TYPE="OPERATOR">)</SEQ>
-
- <EOL_SPAN TYPE="COMMENT1">//</EOL_SPAN>
- <SEQ TYPE="NULL">)</SEQ>
- <SEQ TYPE="NULL">(</SEQ>
-
- <SEQ TYPE="OPERATOR">=</SEQ>
- <SEQ TYPE="OPERATOR">!</SEQ>
- <SEQ TYPE="OPERATOR">>=</SEQ>
- <SEQ TYPE="OPERATOR"><=</SEQ>
- <SEQ TYPE="OPERATOR">+</SEQ>
- <SEQ TYPE="OPERATOR">-</SEQ>
- <SEQ TYPE="OPERATOR">/</SEQ>
- <SEQ TYPE="OPERATOR">*</SEQ>
- <SEQ TYPE="OPERATOR">></SEQ>
- <SEQ TYPE="OPERATOR"><</SEQ>
- <SEQ TYPE="OPERATOR">%</SEQ>
- <SEQ TYPE="OPERATOR">&</SEQ>
- <SEQ TYPE="OPERATOR">|</SEQ>
- <SEQ TYPE="OPERATOR">^</SEQ>
- <SEQ TYPE="OPERATOR">~</SEQ>
- <SEQ TYPE="OPERATOR">.</SEQ>
- <SEQ TYPE="OPERATOR">}</SEQ>
- <SEQ TYPE="OPERATOR">{</SEQ>
- <SEQ TYPE="OPERATOR">,</SEQ>
- <SEQ TYPE="OPERATOR">;</SEQ>
- <SEQ TYPE="OPERATOR">]</SEQ>
- <SEQ TYPE="OPERATOR">[</SEQ>
- <SEQ TYPE="OPERATOR">?</SEQ>
- <MARK_PREVIOUS TYPE="LABEL" MATCH_TYPE="OPERATOR"
- AT_LINE_START="TRUE">:</MARK_PREVIOUS>
- <SEQ TYPE="OPERATOR">:</SEQ>
-
- <KEYWORDS>
- <!-- ActionScript's reserved words (see AS:TDG p.332) -->
- <KEYWORD1>add</KEYWORD1> <!-- deprecated -->
- <KEYWORD1>and</KEYWORD1> <!-- deprecated -->
- <KEYWORD1>break</KEYWORD1>
- <KEYWORD1>continue</KEYWORD1>
- <KEYWORD1>delete</KEYWORD1>
- <KEYWORD1>do</KEYWORD1>
- <KEYWORD1>else</KEYWORD1>
- <KEYWORD1>eq</KEYWORD1> <!-- deprecated -->
- <KEYWORD1>for</KEYWORD1>
- <KEYWORD1>function</KEYWORD1>
- <KEYWORD1>ge</KEYWORD1> <!-- deprecated -->
- <KEYWORD1>gt</KEYWORD1> <!-- deprecated -->
- <KEYWORD1>if</KEYWORD1>
- <KEYWORD1>ifFrameLoaded</KEYWORD1> <!-- deprecated -->
- <KEYWORD1>in</KEYWORD1>
- <KEYWORD1>le</KEYWORD1> <!-- deprecated -->
- <KEYWORD1>lt</KEYWORD1> <!-- deprecated -->
- <KEYWORD1>ne</KEYWORD1> <!-- deprecated -->
- <KEYWORD1>new</KEYWORD1>
- <KEYWORD1>not</KEYWORD1> <!-- deprecated -->
- <KEYWORD1>on</KEYWORD1>
- <KEYWORD1>onClipEvent</KEYWORD1>
- <KEYWORD1>or</KEYWORD1> <!-- deprecated -->
- <KEYWORD1>return</KEYWORD1>
- <LITERAL2>this</LITERAL2>
- <KEYWORD1>tellTarget</KEYWORD1> <!-- deprecated -->
- <KEYWORD1>typeof</KEYWORD1>
- <KEYWORD1>var</KEYWORD1>
- <KEYWORD3>void</KEYWORD3>
- <KEYWORD1>while</KEYWORD1>
- <KEYWORD1>with</KEYWORD1>
-
- <!-- Built-in objects (good idea not to use these names!)-->
- <KEYWORD3>Array</KEYWORD3>
- <KEYWORD3>Boolean</KEYWORD3>
- <KEYWORD3>Color</KEYWORD3>
- <KEYWORD3>Date</KEYWORD3>
- <KEYWORD3>Function</KEYWORD3>
- <KEYWORD3>Key</KEYWORD3>
- <KEYWORD3>MovieClip</KEYWORD3>
- <KEYWORD3>Math</KEYWORD3>
- <KEYWORD3>Mouse</KEYWORD3>
- <KEYWORD3>Number</KEYWORD3>
- <KEYWORD3>Object</KEYWORD3>
- <KEYWORD3>Selection</KEYWORD3>
- <KEYWORD3>Sound</KEYWORD3>
- <KEYWORD3>String</KEYWORD3>
- <KEYWORD3>XML</KEYWORD3>
- <KEYWORD3>XMLNode</KEYWORD3>
- <KEYWORD3>XMLSocket</KEYWORD3>
-
- <!-- Literals -->
- <LITERAL2>NaN</LITERAL2>
- <LITERAL2>Infinity</LITERAL2>
- <LITERAL2>false</LITERAL2>
- <LITERAL2>null</LITERAL2>
- <LITERAL2>true</LITERAL2>
- <LITERAL2>undefined</LITERAL2>
-
- <!-- Global functions -->
- <LITERAL2>Boolean</LITERAL2>
- <LITERAL2>call</LITERAL2>
- <LITERAL2>Date</LITERAL2>
- <LITERAL2>escape</LITERAL2>
- <LITERAL2>eval</LITERAL2>
- <LITERAL2>fscommand</LITERAL2>
- <LITERAL2>getProperty</LITERAL2>
- <LITERAL2>getTimer</LITERAL2>
- <LITERAL2>getURL</LITERAL2>
- <LITERAL2>getVersion</LITERAL2>
- <LITERAL2>gotoAndPlay</LITERAL2>
- <LITERAL2>gotoAndStop</LITERAL2>
- <LITERAL2>#include</LITERAL2>
- <LITERAL2>int</LITERAL2> <!-- deprecated -->
- <LITERAL2>isFinite</LITERAL2>
- <LITERAL2>isNaN</LITERAL2>
- <LITERAL2>loadMovie</LITERAL2>
- <LITERAL2>loadMovieNum</LITERAL2>
- <LITERAL2>loadVariables</LITERAL2>
- <LITERAL2>loadVariablesNum</LITERAL2>
- <LITERAL2>maxscroll</LITERAL2>
- <LITERAL2>newline</LITERAL2>
- <LITERAL2>nextFrame</LITERAL2>
- <LITERAL2>nextScene</LITERAL2>
- <LITERAL2>Number</LITERAL2>
- <LITERAL2>parseFloat</LITERAL2>
- <LITERAL2>parseInt</LITERAL2>
- <LITERAL2>play</LITERAL2>
- <LITERAL2>prevFrame</LITERAL2>
- <LITERAL2>prevScene</LITERAL2>
- <LITERAL2>print</LITERAL2>
- <LITERAL2>printAsBitmap</LITERAL2>
- <LITERAL2>printAsBitmapNum</LITERAL2>
- <LITERAL2>printNum</LITERAL2>
- <LITERAL2>random</LITERAL2> <!-- deprecated -->
- <LITERAL2>removeMovieClip</LITERAL2>
- <LITERAL2>scroll</LITERAL2>
- <LITERAL2>setProperty</LITERAL2>
- <LITERAL2>startDrag</LITERAL2>
- <LITERAL2>stop</LITERAL2>
- <LITERAL2>stopAllSounds</LITERAL2>
- <LITERAL2>stopDrag</LITERAL2>
- <LITERAL2>String</LITERAL2>
- <LITERAL2>targetPath</LITERAL2>
- <LITERAL2>tellTarget</LITERAL2> <!-- deprecated -->
- <LITERAL2>toggleHighQuality</LITERAL2> <!-- deprecated -->
- <LITERAL2>trace</LITERAL2>
- <LITERAL2>unescape</LITERAL2>
- <LITERAL2>unloadMovie</LITERAL2>
- <LITERAL2>unloadMovieNum</LITERAL2>
- <LITERAL2>updateAfterEvent</LITERAL2>
-
- <!-- Start Update -->
- <LITERAL2>prototype</LITERAL2>
- <LITERAL2>clearInterval</LITERAL2>
- <LITERAL2>getVersion</LITERAL2>
- <LITERAL2>length</LITERAL2>
- <LITERAL2>__proto__</LITERAL2>
- <LITERAL2>__constructor__</LITERAL2>
- <LITERAL2>ASSetPropFlags</LITERAL2>
- <LITERAL2>setInterval</LITERAL2>
- <LITERAL2>setI</LITERAL2>
- <KEYWORD3>MMExecute</KEYWORD3>
-
- <!-- MovieCLip methods-->
- <LITERAL2>attachMovie</LITERAL2>
- <LITERAL2>createEmptyMovieClip</LITERAL2>
- <LITERAL2>createTextField</LITERAL2>
- <LITERAL2>duplicateMovieClip</LITERAL2>
- <LITERAL2>getBounds</LITERAL2>
- <LITERAL2>getBytesLoaded</LITERAL2>
- <LITERAL2>getBytesTotal</LITERAL2>
- <LITERAL2>getDepth</LITERAL2>
- <LITERAL2>globalToLocal</LITERAL2>
- <LITERAL2>hitTest</LITERAL2>
- <LITERAL2>localToGlobal</LITERAL2>
- <LITERAL2>setMask</LITERAL2>
- <LITERAL2>swapDepths</LITERAL2>
- <LITERAL2>attachAudio</LITERAL2>
- <LITERAL2>getInstanceAtDepth</LITERAL2>
- <LITERAL2>getNextHighestDepth</LITERAL2>
- <LITERAL2>getSWFVersion</LITERAL2>
- <LITERAL2>getTextSnapshot</LITERAL2>
- <LITERAL2>getSWFVersion</LITERAL2>
- <LITERAL2>getSWFVersion</LITERAL2>
-
- <!-- MovieCLip drawing methods -->
- <LITERAL2>beginFill</LITERAL2>
- <LITERAL2>beginGradientFill</LITERAL2>
- <LITERAL2>clear</LITERAL2>
- <LITERAL2>curveTo</LITERAL2>
- <LITERAL2>endFill</LITERAL2>
- <LITERAL2>lineStyle</LITERAL2>
- <LITERAL2>lineTo</LITERAL2>
- <LITERAL2>moveTo</LITERAL2>
-
- <!-- MovieCLip properties -->
- <LITERAL2>enabled</LITERAL2>
- <LITERAL2>focusEnabled</LITERAL2>
- <LITERAL2>hitArea</LITERAL2>
- <LITERAL2>tabChildren</LITERAL2>
- <LITERAL2>tabEnabled</LITERAL2>
- <LITERAL2>tabIndex</LITERAL2>
- <LITERAL2>trackAsMenu</LITERAL2>
- <LITERAL2>menu</LITERAL2>
- <LITERAL2>useHandCursor</LITERAL2>
-
- <!-- MovieCLip Events -->
- <LITERAL2>onData</LITERAL2>
- <LITERAL2>onDragOut</LITERAL2>
- <LITERAL2>onDragOver</LITERAL2>
- <LITERAL2>onEnterFrame</LITERAL2>
- <LITERAL2>onKeyDown</LITERAL2>
- <LITERAL2>onKeyUp</LITERAL2>
- <LITERAL2>onKillFocus</LITERAL2>
- <LITERAL2>onLoad</LITERAL2>
- <LITERAL2>onMouseDown</LITERAL2>
- <LITERAL2>onMouseMove</LITERAL2>
- <LITERAL2>onMouseUp</LITERAL2>
- <LITERAL2>onPress</LITERAL2>
- <LITERAL2>onRelease</LITERAL2>
- <LITERAL2>onReleaseOutside</LITERAL2>
- <LITERAL2>onRollOut</LITERAL2>
- <LITERAL2>onRollOver</LITERAL2>
- <LITERAL2>onSetFocus</LITERAL2>
- <LITERAL2>onUnload</LITERAL2>
-
- <!-- MovieClipLoader class -->
- <LITERAL2>MovieClipLoader</LITERAL2>
- <LITERAL2>getProgress</LITERAL2>
- <LITERAL2>loadClip</LITERAL2>
- <LITERAL2>onLoadComplete</LITERAL2>
- <LITERAL2>onLoadError</LITERAL2>
- <LITERAL2>onLoadInit</LITERAL2>
- <LITERAL2>onLoadProgress</LITERAL2>
- <LITERAL2>onLoadStart</LITERAL2>
- <LITERAL2>unloadClip</LITERAL2>
-
- <!-- PrintJob class -->
- <LITERAL2>PrintJob</LITERAL2>
- <LITERAL2>addPage</LITERAL2>
-
- <!-- Camera class -->
- <LITERAL2>Camera</LITERAL2>
- <LITERAL2>activityLevel</LITERAL2>
- <LITERAL2>bandwidth</LITERAL2>
- <LITERAL2>currentFps</LITERAL2>
- <LITERAL2>fps</LITERAL2>
- <LITERAL2>index</LITERAL2>
- <LITERAL2>motionLevel</LITERAL2>
- <LITERAL2>motionTimeOut</LITERAL2>
- <LITERAL2>muted</LITERAL2>
- <LITERAL2>name</LITERAL2>
- <LITERAL2>names</LITERAL2>
- <LITERAL2>onActivity</LITERAL2>
- <LITERAL2>onStatus</LITERAL2>
- <LITERAL2>quality</LITERAL2>
- <LITERAL2>setMode</LITERAL2>
- <LITERAL2>setMotionLevel</LITERAL2>
- <LITERAL2>setQuality</LITERAL2>
-
- <!-- Microphone class -->
- <LITERAL2>Microphone</LITERAL2>
- <LITERAL2>gain</LITERAL2>
- <LITERAL2>rate</LITERAL2>
- <LITERAL2>setGain</LITERAL2>
- <LITERAL2>setRate</LITERAL2>
- <LITERAL2>setSilenceLevel</LITERAL2>
- <LITERAL2>setUseEchoSuppression</LITERAL2>
- <LITERAL2>silenceLevel</LITERAL2>
- <LITERAL2>silenceTimeout</LITERAL2>
- <LITERAL2>useEchoSuppression</LITERAL2>
-
- <!-- ContextMenu Class -->
- <LITERAL2>ContextMenu</LITERAL2>
- <LITERAL2>builtInItems</LITERAL2>
- <LITERAL2>copy</LITERAL2>
- <LITERAL2>customItems</LITERAL2>
- <LITERAL2>hideBuiltInItems</LITERAL2>
- <LITERAL2>onSelect</LITERAL2>
- <LITERAL2>caption</LITERAL2>
- <LITERAL2>ContextMenuItem</LITERAL2>
- <LITERAL2>separatorBefore</LITERAL2>
- <LITERAL2>visible</LITERAL2>
-
- <!-- Error class -->
- <LITERAL2>Error</LITERAL2>
- <LITERAL2>visible</LITERAL2>
- <LITERAL2>message</LITERAL2>
-
- <!-- operators grenn-->
- <KEYWORD1>instanceof</KEYWORD1>
- <KEYWORD1>#endinitclip</KEYWORD1>
- <KEYWORD1>#initclip</KEYWORD1>
-
- <!-- properties -->
- <LITERAL2>_alpha</LITERAL2>
- <LITERAL2>_currentframe</LITERAL2>
- <LITERAL2>_droptarget</LITERAL2>
- <LITERAL2>_focusrect</LITERAL2>
- <LITERAL2>_framesloaded</LITERAL2>
- <LITERAL2>_height</LITERAL2>
- <LITERAL2>_name</LITERAL2>
- <LITERAL2>_quality</LITERAL2>
- <LITERAL2>_rotation</LITERAL2>
- <LITERAL2>_soundbuftime</LITERAL2>
- <LITERAL2>_target</LITERAL2>
- <LITERAL2>_totalframes</LITERAL2>
- <LITERAL2>_url</LITERAL2>
- <LITERAL2>_visible</LITERAL2>
- <LITERAL2>_width</LITERAL2>
- <LITERAL2>_x</LITERAL2>
- <LITERAL2>_xmouse</LITERAL2>
- <LITERAL2>_xscale</LITERAL2>
- <LITERAL2>_y</LITERAL2>
- <LITERAL2>_ymouse</LITERAL2>
- <LITERAL2>_yscale</LITERAL2>
- <LITERAL2>_parent</LITERAL2>
- <LITERAL2>_root</LITERAL2>
- <LITERAL2>_level</LITERAL2>
- <LITERAL2>_lockroot</LITERAL2>
- <LITERAL2>_accProps</LITERAL2>
-
-
- <!-- Array -->
- <LITERAL2>sortOn</LITERAL2>
- <LITERAL2>toString</LITERAL2>
- <LITERAL2>splice</LITERAL2>
- <LITERAL2>sort</LITERAL2>
- <LITERAL2>slice</LITERAL2>
- <LITERAL2>shift</LITERAL2>
- <LITERAL2>reverse</LITERAL2>
- <LITERAL2>push</LITERAL2>
- <LITERAL2>join</LITERAL2>
- <LITERAL2>pop</LITERAL2>
- <LITERAL2>concat</LITERAL2>
- <LITERAL2>unshift</LITERAL2>
-
- <!-- Arguments -->
- <LITERAL2>arguments</LITERAL2>
- <LITERAL2>callee</LITERAL2>
- <LITERAL2>caller</LITERAL2>
- <LITERAL2>valueOf</LITERAL2>
-
- <!-- Date Class -->
- <LITERAL2>getDate</LITERAL2>
- <LITERAL2>getDay</LITERAL2>
- <LITERAL2>getFullYear</LITERAL2>
- <LITERAL2>getHours</LITERAL2>
- <LITERAL2>getMilliseconds</LITERAL2>
- <LITERAL2>getMinutes</LITERAL2>
- <LITERAL2>getMonth</LITERAL2>
- <LITERAL2>getSeconds</LITERAL2>
- <LITERAL2>getTime</LITERAL2>
- <LITERAL2>getTimezoneOffset</LITERAL2>
- <LITERAL2>getUTCDate</LITERAL2>
- <LITERAL2>getUTCDay</LITERAL2>
- <LITERAL2>getUTCFullYear</LITERAL2>
- <LITERAL2>getUTCHours</LITERAL2>
- <LITERAL2>getUTCMilliseconds</LITERAL2>
- <LITERAL2>getUTCMinutes</LITERAL2>
- <LITERAL2>getUTCMonth</LITERAL2>
- <LITERAL2>getUTCSeconds</LITERAL2>
- <LITERAL2>getYear</LITERAL2>
- <LITERAL2>setDate</LITERAL2>
- <LITERAL2>setFullYear</LITERAL2>
- <LITERAL2>setHours</LITERAL2>
- <LITERAL2>setMilliseconds</LITERAL2>
- <LITERAL2>setMinutes</LITERAL2>
- <LITERAL2>setMonth</LITERAL2>
- <LITERAL2>setSeconds</LITERAL2>
- <LITERAL2>setTime</LITERAL2>
- <LITERAL2>setUTCDate</LITERAL2>
- <LITERAL2>setUTCFullYear</LITERAL2>
- <LITERAL2>setUTCHours</LITERAL2>
- <LITERAL2>setUTCMilliseconds</LITERAL2>
- <LITERAL2>setUTCMinutes</LITERAL2>
- <LITERAL2>setUTCMonth</LITERAL2>
- <LITERAL2>setUTCSeconds</LITERAL2>
- <LITERAL2>setYear</LITERAL2>
- <LITERAL2>UTC</LITERAL2>
-
- <!-- Function -->
- <LITERAL2>_global</LITERAL2>
- <LITERAL2>apply</LITERAL2>
-
- <!-- Math Class -->
- <LITERAL2>abs</LITERAL2>
- <LITERAL2>acos</LITERAL2>
- <LITERAL2>asin</LITERAL2>
- <LITERAL2>atan</LITERAL2>
- <LITERAL2>atan2</LITERAL2>
- <LITERAL2>ceil</LITERAL2>
- <LITERAL2>cos</LITERAL2>
- <LITERAL2>exp</LITERAL2>
- <LITERAL2>floor</LITERAL2>
- <LITERAL2>log</LITERAL2>
- <LITERAL2>max</LITERAL2>
- <LITERAL2>min</LITERAL2>
- <LITERAL2>pow</LITERAL2>
- <LITERAL2>round</LITERAL2>
- <LITERAL2>sin</LITERAL2>
- <LITERAL2>sqrt</LITERAL2>
- <LITERAL2>tan</LITERAL2>
-
- <LITERAL2>E</LITERAL2>
- <LITERAL2>LN2</LITERAL2>
- <LITERAL2>LN10</LITERAL2>
- <LITERAL2>LOG2E</LITERAL2>
- <LITERAL2>LOG10E</LITERAL2>
- <LITERAL2>PI</LITERAL2>
- <LITERAL2>SQRT1_2</LITERAL2>
- <LITERAL2>SQRT2</LITERAL2>
-
- <!-- Number -->
- <LITERAL2>MAX_VALUE</LITERAL2>
- <LITERAL2>MIN_VALUE</LITERAL2>
- <LITERAL2>NEGATIVE_INFINITY</LITERAL2>
- <LITERAL2>POSITIVE_INFINITY</LITERAL2>
-
- <!-- Object -->
- <LITERAL2>addProperty</LITERAL2>
- <LITERAL2>registerClass</LITERAL2>
- <LITERAL2>unwatch</LITERAL2>
- <LITERAL2>watch</LITERAL2>
-
- <!-- String -->
- <LITERAL2>charAt</LITERAL2>
- <LITERAL2>charCodeAt</LITERAL2>
- <LITERAL2>fromCharCode</LITERAL2>
- <LITERAL2>lastIndexOf</LITERAL2>
- <LITERAL2>indexOf</LITERAL2>
- <LITERAL2>split</LITERAL2>
- <LITERAL2>substr</LITERAL2>
- <LITERAL2>substring</LITERAL2>
- <LITERAL2>toLowerCase</LITERAL2>
- <LITERAL2>toUpperCase</LITERAL2>
-
- <!-- Accessibility -->
- <LITERAL2>Accessibility</LITERAL2>
- <LITERAL2>isActive</LITERAL2>
- <LITERAL2>updateProperties</LITERAL2>
-
-
- <!-- System capabilities Class-->
- <LITERAL2>System</LITERAL2>
- <LITERAL2>capabilities</LITERAL2>
- <LITERAL2>exactSettings</LITERAL2>
- <LITERAL2>setClipboard</LITERAL2>
- <LITERAL2>showSettings</LITERAL2>
- <LITERAL2>useCodepage</LITERAL2>
- <LITERAL2>avHardwareDisable</LITERAL2>
- <LITERAL2>hasAccessibility</LITERAL2>
- <LITERAL2>hasAudio</LITERAL2>
- <LITERAL2>hasAudioEncoder</LITERAL2>
- <LITERAL2>hasMP3</LITERAL2>
- <LITERAL2>hasVideoEncoder</LITERAL2>
- <LITERAL2>pixelAspectRatio</LITERAL2>
- <LITERAL2>screenColor</LITERAL2>
- <LITERAL2>screenDPI</LITERAL2>
- <LITERAL2>screenResolutionX</LITERAL2>
- <LITERAL2>screenResolutionY</LITERAL2>
- <LITERAL2>hasEmbeddedVideo</LITERAL2>
- <LITERAL2>hasPrinting</LITERAL2>
- <LITERAL2>hasScreenBroadcast</LITERAL2>
- <LITERAL2>hasScreenPlayback</LITERAL2>
- <LITERAL2>hasStreamingAudio</LITERAL2>
- <LITERAL2>hasStreamingVideo</LITERAL2>
- <LITERAL2>isDebugger</LITERAL2>
- <LITERAL2>language</LITERAL2>
- <LITERAL2>manufacturer</LITERAL2>
- <LITERAL2>os</LITERAL2>
- <LITERAL2>playerType</LITERAL2>
- <LITERAL2>serverString</LITERAL2>
- <LITERAL2>localFileReadDisable</LITERAL2>
- <LITERAL2>version</LITERAL2>
- <!-- System security Class -->
- <LITERAL2>security</LITERAL2>
-
- <!-- Color Class -->
- <LITERAL2>getRGB</LITERAL2>
- <LITERAL2>getTransform</LITERAL2>
- <LITERAL2>setRGB</LITERAL2>
- <LITERAL2>setTransform</LITERAL2>
-
- <!-- Key Class -->
- <LITERAL2>addListener</LITERAL2>
- <LITERAL2>getAscii</LITERAL2>
- <LITERAL2>isDown</LITERAL2>
- <LITERAL2>getCode</LITERAL2>
- <LITERAL2>isToggled</LITERAL2>
- <LITERAL2>removeListener</LITERAL2>
- <LITERAL2>BACKSPACE</LITERAL2>
- <LITERAL2>CAPSLOCK</LITERAL2>
- <LITERAL2>CONTROL</LITERAL2>
- <LITERAL2>DELETEKEY</LITERAL2>
- <LITERAL2>DOWN</LITERAL2>
- <LITERAL2>END</LITERAL2>
- <LITERAL2>ENTER</LITERAL2>
- <LITERAL2>ESCAPE</LITERAL2>
- <LITERAL2>HOME</LITERAL2>
- <LITERAL2>INSERT</LITERAL2>
- <LITERAL2>LEFT</LITERAL2>
- <LITERAL2>PGDN</LITERAL2>
- <LITERAL2>PGUP</LITERAL2>
- <LITERAL2>SHIFT</LITERAL2>
- <LITERAL2>RIGHT</LITERAL2>
- <LITERAL2>SPACE</LITERAL2>
- <LITERAL2>TAB</LITERAL2>
- <LITERAL2>UP</LITERAL2>
-
- <!-- Mouse -->
- <LITERAL2>hide</LITERAL2>
- <LITERAL2>show</LITERAL2>
- <LITERAL2>onMouseWheel</LITERAL2>
-
- <!-- Selection Class-->
- <LITERAL2>getBeginIndex</LITERAL2>
- <LITERAL2>getCaretIndex</LITERAL2>
- <LITERAL2>getEndIndex</LITERAL2>
- <LITERAL2>getFocus</LITERAL2>
- <LITERAL2>setFocus</LITERAL2>
- <LITERAL2>setSelection</LITERAL2>
-
- <!-- SharedObject Class-->
- <LITERAL2>SharedObject</LITERAL2>
- <LITERAL2>data</LITERAL2>
- <LITERAL2>flush</LITERAL2>
- <LITERAL2>getLocal</LITERAL2>
- <LITERAL2>getSize</LITERAL2>
-
- <!-- Sound Class -->
- <LITERAL2>attachSound</LITERAL2>
- <LITERAL2>getVolume</LITERAL2>
- <LITERAL2>loadSound</LITERAL2>
- <LITERAL2>setPan</LITERAL2>
- <LITERAL2>getPan</LITERAL2>
- <LITERAL2>setVolume</LITERAL2>
- <LITERAL2>start</LITERAL2>
- <LITERAL2>duration</LITERAL2>
- <LITERAL2>position</LITERAL2>
- <LITERAL2>onSoundComplete</LITERAL2>
- <LITERAL2>id3</LITERAL2>
- <LITERAL2>onID3</LITERAL2>
-
- <!-- Video Class -->
- <LITERAL2>Video</LITERAL2>
- <LITERAL2>deblocking</LITERAL2>
- <LITERAL2>smoothing</LITERAL2>
-
- <!-- Stage Class -->
- <LITERAL2>Stage</LITERAL2>
- <LITERAL2>align</LITERAL2>
- <LITERAL2>height</LITERAL2>
- <LITERAL2>scaleMode</LITERAL2>
- <LITERAL2>showMenu</LITERAL2>
- <LITERAL2>width</LITERAL2>
- <LITERAL2>onResize</LITERAL2>
-
- <!-- TextField Class -->
- <LITERAL2>getFontList</LITERAL2>
- <LITERAL2>getNewTextFormat</LITERAL2>
- <LITERAL2>getTextFormat</LITERAL2>
- <LITERAL2>removeTextField</LITERAL2>
- <LITERAL2>replaceSel</LITERAL2>
- <LITERAL2>setNewTextFormat</LITERAL2>
- <LITERAL2>setTextFormat</LITERAL2>
- <LITERAL2>autoSize</LITERAL2>
- <LITERAL2>background</LITERAL2>
- <LITERAL2>backgroundColor</LITERAL2>
- <LITERAL2>border</LITERAL2>
- <LITERAL2>borderColor</LITERAL2>
- <LITERAL2>bottomScroll</LITERAL2>
- <LITERAL2>embedFonts</LITERAL2>
- <LITERAL2>hscroll</LITERAL2>
- <LITERAL2>html</LITERAL2>
- <LITERAL2>htmlText</LITERAL2>
- <LITERAL2>maxChars</LITERAL2>
- <LITERAL2>maxhscroll</LITERAL2>
- <LITERAL2>multiline</LITERAL2>
- <LITERAL2>password</LITERAL2>
- <LITERAL2>restrict</LITERAL2>
- <LITERAL2>selectable</LITERAL2>
- <LITERAL2>text</LITERAL2>
- <LITERAL2>textColor</LITERAL2>
- <LITERAL2>textHeight</LITERAL2>
- <LITERAL2>textWidth</LITERAL2>
- <LITERAL2>type</LITERAL2>
- <LITERAL2>variable</LITERAL2>
- <LITERAL2>wordWrap</LITERAL2>
- <LITERAL2>onChanged</LITERAL2>
- <LITERAL2>onScroller</LITERAL2>
- <LITERAL2>TextField</LITERAL2>
- <LITERAL2>mouseWheelEnabled</LITERAL2>
- <LITERAL2>replaceText</LITERAL2>
-
- <!-- StyleSheet Class -->
- <LITERAL2>StyleSheet</LITERAL2>
- <LITERAL2>getStyle</LITERAL2>
- <LITERAL2>getStyleNames</LITERAL2>
- <LITERAL2>parseCSS</LITERAL2>
- <LITERAL2>setStyle</LITERAL2>
- <LITERAL2>styleSheet</LITERAL2>
-
- <!-- TextFormat Class -->
- <LITERAL2>TextFormat</LITERAL2>
- <LITERAL2>getTextExtent</LITERAL2>
- <LITERAL2>blockIndent</LITERAL2>
- <LITERAL2>bold</LITERAL2>
- <LITERAL2>bullet</LITERAL2>
- <LITERAL2>color</LITERAL2>
- <LITERAL2>font</LITERAL2>
- <LITERAL2>indent</LITERAL2>
- <LITERAL2>italic</LITERAL2>
- <LITERAL2>leading</LITERAL2>
- <LITERAL2>leftMargin</LITERAL2>
- <LITERAL2>rightMargin</LITERAL2>
- <LITERAL2>size</LITERAL2>
- <LITERAL2>tabStops</LITERAL2>
- <LITERAL2>target</LITERAL2>
- <LITERAL2>underline</LITERAL2>
- <LITERAL2>url</LITERAL2>
-
- <!-- TextSnapshot object -->
- <LITERAL2>TextSnapshot</LITERAL2>
- <LITERAL2>findText</LITERAL2>
- <LITERAL2>getCount</LITERAL2>
- <LITERAL2>getSelected</LITERAL2>
- <LITERAL2>getSelectedText</LITERAL2>
- <LITERAL2>hitTestTextNearPos</LITERAL2>
- <LITERAL2>getText</LITERAL2>
- <LITERAL2>setSelectColor</LITERAL2>
- <LITERAL2>setSelected</LITERAL2>
-
- <!-- LoadVars Class-->
- <LITERAL2>LoadVars</LITERAL2>
- <LITERAL2>load</LITERAL2>
- <LITERAL2>send</LITERAL2>
- <LITERAL2>sendAndLoad</LITERAL2>
- <LITERAL2>contentType</LITERAL2>
- <LITERAL2>loaded</LITERAL2>
- <LITERAL2>addRequestHeader</LITERAL2>
-
- <!-- LocalConnection Class-->
- <LITERAL2>LocalConnection</LITERAL2>
- <LITERAL2>allowDomain</LITERAL2>
- <LITERAL2>allowInsecureDomain</LITERAL2>
- <LITERAL2>domain</LITERAL2>
-
- <!-- XML Class -->
- <LITERAL2>appendChild</LITERAL2>
- <LITERAL2>cloneNode</LITERAL2>
- <LITERAL2>createElement</LITERAL2>
- <LITERAL2>createTextNode</LITERAL2>
- <LITERAL2>hasChildNodes</LITERAL2>
- <LITERAL2>insertBefore</LITERAL2>
- <LITERAL2>parseXML</LITERAL2>
- <LITERAL2>removeNode</LITERAL2>
- <LITERAL2>attributes</LITERAL2>
- <LITERAL2>childNodes</LITERAL2>
- <LITERAL2>docTypeDecl</LITERAL2>
- <LITERAL2>firstChild</LITERAL2>
- <LITERAL2>ignoreWhite</LITERAL2>
- <LITERAL2>lastChild</LITERAL2>
- <LITERAL2>nextSibling</LITERAL2>
- <LITERAL2>nodeName</LITERAL2>
- <LITERAL2>nodeType</LITERAL2>
- <LITERAL2>nodeValue</LITERAL2>
- <LITERAL2>parentNode</LITERAL2>
- <LITERAL2>previousSibling</LITERAL2>
- <LITERAL2>status</LITERAL2>
- <LITERAL2>xmlDecl</LITERAL2>
- <LITERAL2>close</LITERAL2>
- <LITERAL2>connect</LITERAL2>
- <LITERAL2>onClose</LITERAL2>
- <LITERAL2>onConnect</LITERAL2>
- <LITERAL2>onXML</LITERAL2>
-
- <!-- CustomActions Class -->
- <LITERAL2>CustomActions</LITERAL2>
- <LITERAL2>onUpdate</LITERAL2>
- <LITERAL2>uninstall</LITERAL2>
- <LITERAL2>list</LITERAL2>
- <LITERAL2>install</LITERAL2>
- <LITERAL2>get</LITERAL2>
-
- <!-- NetConnection Class -->
- <LITERAL2>NetConnection</LITERAL2>
-
- <!-- NetStream Class-->
- <LITERAL2>NetStream</LITERAL2>
- <LITERAL2>bufferLength</LITERAL2>
- <LITERAL2>bufferTime</LITERAL2>
- <LITERAL2>bytesLoaded</LITERAL2>
- <LITERAL2>bytesTotal</LITERAL2>
- <LITERAL2>pause</LITERAL2>
- <LITERAL2>seek</LITERAL2>
- <LITERAL2>setBufferTime</LITERAL2>
- <LITERAL2>time</LITERAL2>
-
- <!-- RecordSet Class -->
- <LITERAL2>DataGlue</LITERAL2>
- <LITERAL2>bindFormatFunction</LITERAL2>
- <LITERAL2>bindFormatStrings</LITERAL2>
- <LITERAL2>getDebugConfig</LITERAL2>
- <LITERAL2>getDebugID</LITERAL2>
- <LITERAL2>getService</LITERAL2>
- <LITERAL2>setCredentials</LITERAL2>
- <LITERAL2>setDebugID</LITERAL2>
- <LITERAL2>getDebug</LITERAL2>
- <LITERAL2>setDebug</LITERAL2>
- <LITERAL2>createGatewayConnection</LITERAL2>
- <LITERAL2>NetServices</LITERAL2>
- <LITERAL2>setDefaultGatewayURL</LITERAL2>
- <LITERAL2>addItem</LITERAL2>
- <LITERAL2>addItemAt</LITERAL2>
- <LITERAL2>addView</LITERAL2>
- <LITERAL2>filter</LITERAL2>
- <LITERAL2>getColumnNames</LITERAL2>
- <LITERAL2>getItemAt</LITERAL2>
- <LITERAL2>getLength</LITERAL2>
- <LITERAL2>getNumberAvailable</LITERAL2>
- <LITERAL2>isFullyPopulated</LITERAL2>
- <LITERAL2>isLocal</LITERAL2>
- <LITERAL2>removeAll</LITERAL2>
- <LITERAL2>removeItemAt</LITERAL2>
- <LITERAL2>replaceItemAt</LITERAL2>
- <LITERAL2>setDeliveryMode</LITERAL2>
- <LITERAL2>setField</LITERAL2>
- <LITERAL2>sortItemsBy</LITERAL2>
-
- <!-- deprecated-->
- <KEYWORD2>chr</KEYWORD2>
- <KEYWORD2>mbchr</KEYWORD2>
- <KEYWORD2>mblength</KEYWORD2>
- <KEYWORD2>mbord</KEYWORD2>
- <KEYWORD2>mbsubstring</KEYWORD2>
- <KEYWORD2>ord</KEYWORD2>
- <KEYWORD2>_highquality</KEYWORD2>
-
- <!-- END-->
-
- <!--ECMAScript keywords-->
- <!-- Reserved for future use
- (some are already used in some Javascript Engines)
- -->
- <KEYWORD1>abstract</KEYWORD1>
- <KEYWORD3>boolean</KEYWORD3>
- <KEYWORD3>byte</KEYWORD3>
- <KEYWORD1>case</KEYWORD1>
- <KEYWORD1>catch</KEYWORD1>
- <KEYWORD3>char</KEYWORD3>
- <KEYWORD1>class</KEYWORD1>
- <KEYWORD1>const</KEYWORD1>
- <KEYWORD1>debugger</KEYWORD1>
- <KEYWORD1>default</KEYWORD1>
-
- <KEYWORD3>double</KEYWORD3>
- <KEYWORD1>enum</KEYWORD1>
- <KEYWORD2>export</KEYWORD2>
- <KEYWORD1>extends</KEYWORD1>
- <KEYWORD1>final</KEYWORD1>
- <KEYWORD1>finally</KEYWORD1>
- <KEYWORD3>float</KEYWORD3>
- <KEYWORD1>goto</KEYWORD1>
- <KEYWORD1>implements</KEYWORD1>
-
- <KEYWORD2>import</KEYWORD2>
- <KEYWORD1>instanceof</KEYWORD1>
- <KEYWORD3>int</KEYWORD3>
- <KEYWORD1>interface</KEYWORD1>
- <KEYWORD3>long</KEYWORD3>
- <KEYWORD1>native</KEYWORD1>
- <KEYWORD2>package</KEYWORD2>
- <KEYWORD1>private</KEYWORD1>
- <KEYWORD1>Void</KEYWORD1>
- <KEYWORD1>protected</KEYWORD1>
- <KEYWORD1>public</KEYWORD1>
- <KEYWORD1>dynamic</KEYWORD1>
-
- <KEYWORD3>short</KEYWORD3>
- <KEYWORD1>static</KEYWORD1>
- <LITERAL2>super</LITERAL2>
- <KEYWORD1>switch</KEYWORD1>
- <KEYWORD1>synchronized</KEYWORD1>
- <KEYWORD1>throw</KEYWORD1>
- <KEYWORD1>throws</KEYWORD1>
- <KEYWORD1>transient</KEYWORD1>
- <KEYWORD1>try</KEYWORD1>
- <KEYWORD1>volatile</KEYWORD1>
- </KEYWORDS>
- </RULES>
-</MODE>
+<?xml version="1.0"?>
+<!DOCTYPE MODE SYSTEM "xmode.dtd">
+
+<!--
+ ActionScript mode by Ben Glazer <ben at enspire.com>
+ Adapted from JavaScript mode by Andre Kaplan
+ Updated for Flash MX 2004 by Nahuel Foronda <www.asfusion.com>
+-->
+<MODE>
+ <PROPS>
+ <PROPERTY NAME="indentOpenBrackets" VALUE="{" />
+ <PROPERTY NAME="indentCloseBrackets" VALUE="}" />
+ <!-- the ; hack is there so that stuff like if(bob) fred();
+ does not indent the next line -->
+ <PROPERTY NAME="indentPrevLine" VALUE="\s*(if|while)\s*(|else|case|default:)[^;]*|for\s*\(.*)" />
+ <!-- set this to 'true' if you want to use GNU coding style -->
+ <PROPERTY NAME="doubleBracketIndent" VALUE="false" />
+ <PROPERTY NAME="commentStart" VALUE="/*" />
+ <PROPERTY NAME="commentEnd" VALUE="*/" />
+ <PROPERTY NAME="lineComment" VALUE="//" />
+ <PROPERTY NAME="wordBreakChars" VALUE=",+-=<>/?^&*" />
+ </PROPS>
+
+ <RULES IGNORE_CASE="FALSE" HIGHLIGHT_DIGITS="TRUE">
+ <!-- whitespace: (space and tab) -->
+ <SPAN TYPE="COMMENT1">
+ <BEGIN>/*</BEGIN>
+ <END>*/</END>
+ </SPAN>
+
+ <SPAN TYPE="LITERAL1" ESCAPE="\" NO_LINE_BREAK="TRUE">
+ <BEGIN>"</BEGIN>
+ <END>"</END>
+ </SPAN>
+
+ <SPAN TYPE="LITERAL1" ESCAPE="\" NO_LINE_BREAK="TRUE">
+ <BEGIN>'</BEGIN>
+ <END>'</END>
+ </SPAN>
+
+ <MARK_PREVIOUS TYPE="FUNCTION" MATCH_TYPE="OPERATOR">(</MARK_PREVIOUS>
+ <SEQ TYPE="OPERATOR">)</SEQ>
+
+ <EOL_SPAN TYPE="COMMENT1">//</EOL_SPAN>
+ <SEQ TYPE="NULL">)</SEQ>
+ <SEQ TYPE="NULL">(</SEQ>
+
+ <SEQ TYPE="OPERATOR">=</SEQ>
+ <SEQ TYPE="OPERATOR">!</SEQ>
+ <SEQ TYPE="OPERATOR">>=</SEQ>
+ <SEQ TYPE="OPERATOR"><=</SEQ>
+ <SEQ TYPE="OPERATOR">+</SEQ>
+ <SEQ TYPE="OPERATOR">-</SEQ>
+ <SEQ TYPE="OPERATOR">/</SEQ>
+ <SEQ TYPE="OPERATOR">*</SEQ>
+ <SEQ TYPE="OPERATOR">></SEQ>
+ <SEQ TYPE="OPERATOR"><</SEQ>
+ <SEQ TYPE="OPERATOR">%</SEQ>
+ <SEQ TYPE="OPERATOR">&</SEQ>
+ <SEQ TYPE="OPERATOR">|</SEQ>
+ <SEQ TYPE="OPERATOR">^</SEQ>
+ <SEQ TYPE="OPERATOR">~</SEQ>
+ <SEQ TYPE="OPERATOR">.</SEQ>
+ <SEQ TYPE="OPERATOR">}</SEQ>
+ <SEQ TYPE="OPERATOR">{</SEQ>
+ <SEQ TYPE="OPERATOR">,</SEQ>
+ <SEQ TYPE="OPERATOR">;</SEQ>
+ <SEQ TYPE="OPERATOR">]</SEQ>
+ <SEQ TYPE="OPERATOR">[</SEQ>
+ <SEQ TYPE="OPERATOR">?</SEQ>
+ <MARK_PREVIOUS TYPE="LABEL" MATCH_TYPE="OPERATOR"
+ AT_LINE_START="TRUE">:</MARK_PREVIOUS>
+ <SEQ TYPE="OPERATOR">:</SEQ>
+
+ <KEYWORDS>
+ <!-- ActionScript's reserved words (see AS:TDG p.332) -->
+ <KEYWORD1>add</KEYWORD1> <!-- deprecated -->
+ <KEYWORD1>and</KEYWORD1> <!-- deprecated -->
+ <KEYWORD1>break</KEYWORD1>
+ <KEYWORD1>continue</KEYWORD1>
+ <KEYWORD1>delete</KEYWORD1>
+ <KEYWORD1>do</KEYWORD1>
+ <KEYWORD1>else</KEYWORD1>
+ <KEYWORD1>eq</KEYWORD1> <!-- deprecated -->
+ <KEYWORD1>for</KEYWORD1>
+ <KEYWORD1>function</KEYWORD1>
+ <KEYWORD1>ge</KEYWORD1> <!-- deprecated -->
+ <KEYWORD1>gt</KEYWORD1> <!-- deprecated -->
+ <KEYWORD1>if</KEYWORD1>
+ <KEYWORD1>ifFrameLoaded</KEYWORD1> <!-- deprecated -->
+ <KEYWORD1>in</KEYWORD1>
+ <KEYWORD1>le</KEYWORD1> <!-- deprecated -->
+ <KEYWORD1>lt</KEYWORD1> <!-- deprecated -->
+ <KEYWORD1>ne</KEYWORD1> <!-- deprecated -->
+ <KEYWORD1>new</KEYWORD1>
+ <KEYWORD1>not</KEYWORD1> <!-- deprecated -->
+ <KEYWORD1>on</KEYWORD1>
+ <KEYWORD1>onClipEvent</KEYWORD1>
+ <KEYWORD1>or</KEYWORD1> <!-- deprecated -->
+ <KEYWORD1>return</KEYWORD1>
+ <LITERAL2>this</LITERAL2>
+ <KEYWORD1>tellTarget</KEYWORD1> <!-- deprecated -->
+ <KEYWORD1>typeof</KEYWORD1>
+ <KEYWORD1>var</KEYWORD1>
+ <KEYWORD3>void</KEYWORD3>
+ <KEYWORD1>while</KEYWORD1>
+ <KEYWORD1>with</KEYWORD1>
+
+ <!-- Built-in objects (good idea not to use these names!)-->
+ <KEYWORD3>Array</KEYWORD3>
+ <KEYWORD3>Boolean</KEYWORD3>
+ <KEYWORD3>Color</KEYWORD3>
+ <KEYWORD3>Date</KEYWORD3>
+ <KEYWORD3>Function</KEYWORD3>
+ <KEYWORD3>Key</KEYWORD3>
+ <KEYWORD3>MovieClip</KEYWORD3>
+ <KEYWORD3>Math</KEYWORD3>
+ <KEYWORD3>Mouse</KEYWORD3>
+ <KEYWORD3>Number</KEYWORD3>
+ <KEYWORD3>Object</KEYWORD3>
+ <KEYWORD3>Selection</KEYWORD3>
+ <KEYWORD3>Sound</KEYWORD3>
+ <KEYWORD3>String</KEYWORD3>
+ <KEYWORD3>XML</KEYWORD3>
+ <KEYWORD3>XMLNode</KEYWORD3>
+ <KEYWORD3>XMLSocket</KEYWORD3>
+
+ <!-- Literals -->
+ <LITERAL2>NaN</LITERAL2>
+ <LITERAL2>Infinity</LITERAL2>
+ <LITERAL2>false</LITERAL2>
+ <LITERAL2>null</LITERAL2>
+ <LITERAL2>true</LITERAL2>
+ <LITERAL2>undefined</LITERAL2>
+
+ <!-- Global functions -->
+ <LITERAL2>Boolean</LITERAL2>
+ <LITERAL2>call</LITERAL2>
+ <LITERAL2>Date</LITERAL2>
+ <LITERAL2>escape</LITERAL2>
+ <LITERAL2>eval</LITERAL2>
+ <LITERAL2>fscommand</LITERAL2>
+ <LITERAL2>getProperty</LITERAL2>
+ <LITERAL2>getTimer</LITERAL2>
+ <LITERAL2>getURL</LITERAL2>
+ <LITERAL2>getVersion</LITERAL2>
+ <LITERAL2>gotoAndPlay</LITERAL2>
+ <LITERAL2>gotoAndStop</LITERAL2>
+ <LITERAL2>#include</LITERAL2>
+ <LITERAL2>int</LITERAL2> <!-- deprecated -->
+ <LITERAL2>isFinite</LITERAL2>
+ <LITERAL2>isNaN</LITERAL2>
+ <LITERAL2>loadMovie</LITERAL2>
+ <LITERAL2>loadMovieNum</LITERAL2>
+ <LITERAL2>loadVariables</LITERAL2>
+ <LITERAL2>loadVariablesNum</LITERAL2>
+ <LITERAL2>maxscroll</LITERAL2>
+ <LITERAL2>newline</LITERAL2>
+ <LITERAL2>nextFrame</LITERAL2>
+ <LITERAL2>nextScene</LITERAL2>
+ <LITERAL2>Number</LITERAL2>
+ <LITERAL2>parseFloat</LITERAL2>
+ <LITERAL2>parseInt</LITERAL2>
+ <LITERAL2>play</LITERAL2>
+ <LITERAL2>prevFrame</LITERAL2>
+ <LITERAL2>prevScene</LITERAL2>
+ <LITERAL2>print</LITERAL2>
+ <LITERAL2>printAsBitmap</LITERAL2>
+ <LITERAL2>printAsBitmapNum</LITERAL2>
+ <LITERAL2>printNum</LITERAL2>
+ <LITERAL2>random</LITERAL2> <!-- deprecated -->
+ <LITERAL2>removeMovieClip</LITERAL2>
+ <LITERAL2>scroll</LITERAL2>
+ <LITERAL2>setProperty</LITERAL2>
+ <LITERAL2>startDrag</LITERAL2>
+ <LITERAL2>stop</LITERAL2>
+ <LITERAL2>stopAllSounds</LITERAL2>
+ <LITERAL2>stopDrag</LITERAL2>
+ <LITERAL2>String</LITERAL2>
+ <LITERAL2>targetPath</LITERAL2>
+ <LITERAL2>tellTarget</LITERAL2> <!-- deprecated -->
+ <LITERAL2>toggleHighQuality</LITERAL2> <!-- deprecated -->
+ <LITERAL2>trace</LITERAL2>
+ <LITERAL2>unescape</LITERAL2>
+ <LITERAL2>unloadMovie</LITERAL2>
+ <LITERAL2>unloadMovieNum</LITERAL2>
+ <LITERAL2>updateAfterEvent</LITERAL2>
+
+ <!-- Start Update -->
+ <LITERAL2>prototype</LITERAL2>
+ <LITERAL2>clearInterval</LITERAL2>
+ <LITERAL2>getVersion</LITERAL2>
+ <LITERAL2>length</LITERAL2>
+ <LITERAL2>__proto__</LITERAL2>
+ <LITERAL2>__constructor__</LITERAL2>
+ <LITERAL2>ASSetPropFlags</LITERAL2>
+ <LITERAL2>setInterval</LITERAL2>
+ <LITERAL2>setI</LITERAL2>
+ <KEYWORD3>MMExecute</KEYWORD3>
+
+ <!-- MovieCLip methods-->
+ <LITERAL2>attachMovie</LITERAL2>
+ <LITERAL2>createEmptyMovieClip</LITERAL2>
+ <LITERAL2>createTextField</LITERAL2>
+ <LITERAL2>duplicateMovieClip</LITERAL2>
+ <LITERAL2>getBounds</LITERAL2>
+ <LITERAL2>getBytesLoaded</LITERAL2>
+ <LITERAL2>getBytesTotal</LITERAL2>
+ <LITERAL2>getDepth</LITERAL2>
+ <LITERAL2>globalToLocal</LITERAL2>
+ <LITERAL2>hitTest</LITERAL2>
+ <LITERAL2>localToGlobal</LITERAL2>
+ <LITERAL2>setMask</LITERAL2>
+ <LITERAL2>swapDepths</LITERAL2>
+ <LITERAL2>attachAudio</LITERAL2>
+ <LITERAL2>getInstanceAtDepth</LITERAL2>
+ <LITERAL2>getNextHighestDepth</LITERAL2>
+ <LITERAL2>getSWFVersion</LITERAL2>
+ <LITERAL2>getTextSnapshot</LITERAL2>
+ <LITERAL2>getSWFVersion</LITERAL2>
+ <LITERAL2>getSWFVersion</LITERAL2>
+
+ <!-- MovieCLip drawing methods -->
+ <LITERAL2>beginFill</LITERAL2>
+ <LITERAL2>beginGradientFill</LITERAL2>
+ <LITERAL2>clear</LITERAL2>
+ <LITERAL2>curveTo</LITERAL2>
+ <LITERAL2>endFill</LITERAL2>
+ <LITERAL2>lineStyle</LITERAL2>
+ <LITERAL2>lineTo</LITERAL2>
+ <LITERAL2>moveTo</LITERAL2>
+
+ <!-- MovieCLip properties -->
+ <LITERAL2>enabled</LITERAL2>
+ <LITERAL2>focusEnabled</LITERAL2>
+ <LITERAL2>hitArea</LITERAL2>
+ <LITERAL2>tabChildren</LITERAL2>
+ <LITERAL2>tabEnabled</LITERAL2>
+ <LITERAL2>tabIndex</LITERAL2>
+ <LITERAL2>trackAsMenu</LITERAL2>
+ <LITERAL2>menu</LITERAL2>
+ <LITERAL2>useHandCursor</LITERAL2>
+
+ <!-- MovieCLip Events -->
+ <LITERAL2>onData</LITERAL2>
+ <LITERAL2>onDragOut</LITERAL2>
+ <LITERAL2>onDragOver</LITERAL2>
+ <LITERAL2>onEnterFrame</LITERAL2>
+ <LITERAL2>onKeyDown</LITERAL2>
+ <LITERAL2>onKeyUp</LITERAL2>
+ <LITERAL2>onKillFocus</LITERAL2>
+ <LITERAL2>onLoad</LITERAL2>
+ <LITERAL2>onMouseDown</LITERAL2>
+ <LITERAL2>onMouseMove</LITERAL2>
+ <LITERAL2>onMouseUp</LITERAL2>
+ <LITERAL2>onPress</LITERAL2>
+ <LITERAL2>onRelease</LITERAL2>
+ <LITERAL2>onReleaseOutside</LITERAL2>
+ <LITERAL2>onRollOut</LITERAL2>
+ <LITERAL2>onRollOver</LITERAL2>
+ <LITERAL2>onSetFocus</LITERAL2>
+ <LITERAL2>onUnload</LITERAL2>
+
+ <!-- MovieClipLoader class -->
+ <LITERAL2>MovieClipLoader</LITERAL2>
+ <LITERAL2>getProgress</LITERAL2>
+ <LITERAL2>loadClip</LITERAL2>
+ <LITERAL2>onLoadComplete</LITERAL2>
+ <LITERAL2>onLoadError</LITERAL2>
+ <LITERAL2>onLoadInit</LITERAL2>
+ <LITERAL2>onLoadProgress</LITERAL2>
+ <LITERAL2>onLoadStart</LITERAL2>
+ <LITERAL2>unloadClip</LITERAL2>
+
+ <!-- PrintJob class -->
+ <LITERAL2>PrintJob</LITERAL2>
+ <LITERAL2>addPage</LITERAL2>
+
+ <!-- Camera class -->
+ <LITERAL2>Camera</LITERAL2>
+ <LITERAL2>activityLevel</LITERAL2>
+ <LITERAL2>bandwidth</LITERAL2>
+ <LITERAL2>currentFps</LITERAL2>
+ <LITERAL2>fps</LITERAL2>
+ <LITERAL2>index</LITERAL2>
+ <LITERAL2>motionLevel</LITERAL2>
+ <LITERAL2>motionTimeOut</LITERAL2>
+ <LITERAL2>muted</LITERAL2>
+ <LITERAL2>name</LITERAL2>
+ <LITERAL2>names</LITERAL2>
+ <LITERAL2>onActivity</LITERAL2>
+ <LITERAL2>onStatus</LITERAL2>
+ <LITERAL2>quality</LITERAL2>
+ <LITERAL2>setMode</LITERAL2>
+ <LITERAL2>setMotionLevel</LITERAL2>
+ <LITERAL2>setQuality</LITERAL2>
+
+ <!-- Microphone class -->
+ <LITERAL2>Microphone</LITERAL2>
+ <LITERAL2>gain</LITERAL2>
+ <LITERAL2>rate</LITERAL2>
+ <LITERAL2>setGain</LITERAL2>
+ <LITERAL2>setRate</LITERAL2>
+ <LITERAL2>setSilenceLevel</LITERAL2>
+ <LITERAL2>setUseEchoSuppression</LITERAL2>
+ <LITERAL2>silenceLevel</LITERAL2>
+ <LITERAL2>silenceTimeout</LITERAL2>
+ <LITERAL2>useEchoSuppression</LITERAL2>
+
+ <!-- ContextMenu Class -->
+ <LITERAL2>ContextMenu</LITERAL2>
+ <LITERAL2>builtInItems</LITERAL2>
+ <LITERAL2>copy</LITERAL2>
+ <LITERAL2>customItems</LITERAL2>
+ <LITERAL2>hideBuiltInItems</LITERAL2>
+ <LITERAL2>onSelect</LITERAL2>
+ <LITERAL2>caption</LITERAL2>
+ <LITERAL2>ContextMenuItem</LITERAL2>
+ <LITERAL2>separatorBefore</LITERAL2>
+ <LITERAL2>visible</LITERAL2>
+
+ <!-- Error class -->
+ <LITERAL2>Error</LITERAL2>
+ <LITERAL2>visible</LITERAL2>
+ <LITERAL2>message</LITERAL2>
+
+ <!-- operators grenn-->
+ <KEYWORD1>instanceof</KEYWORD1>
+ <KEYWORD1>#endinitclip</KEYWORD1>
+ <KEYWORD1>#initclip</KEYWORD1>
+
+ <!-- properties -->
+ <LITERAL2>_alpha</LITERAL2>
+ <LITERAL2>_currentframe</LITERAL2>
+ <LITERAL2>_droptarget</LITERAL2>
+ <LITERAL2>_focusrect</LITERAL2>
+ <LITERAL2>_framesloaded</LITERAL2>
+ <LITERAL2>_height</LITERAL2>
+ <LITERAL2>_name</LITERAL2>
+ <LITERAL2>_quality</LITERAL2>
+ <LITERAL2>_rotation</LITERAL2>
+ <LITERAL2>_soundbuftime</LITERAL2>
+ <LITERAL2>_target</LITERAL2>
+ <LITERAL2>_totalframes</LITERAL2>
+ <LITERAL2>_url</LITERAL2>
+ <LITERAL2>_visible</LITERAL2>
+ <LITERAL2>_width</LITERAL2>
+ <LITERAL2>_x</LITERAL2>
+ <LITERAL2>_xmouse</LITERAL2>
+ <LITERAL2>_xscale</LITERAL2>
+ <LITERAL2>_y</LITERAL2>
+ <LITERAL2>_ymouse</LITERAL2>
+ <LITERAL2>_yscale</LITERAL2>
+ <LITERAL2>_parent</LITERAL2>
+ <LITERAL2>_root</LITERAL2>
+ <LITERAL2>_level</LITERAL2>
+ <LITERAL2>_lockroot</LITERAL2>
+ <LITERAL2>_accProps</LITERAL2>
+
+
+ <!-- Array -->
+ <LITERAL2>sortOn</LITERAL2>
+ <LITERAL2>toString</LITERAL2>
+ <LITERAL2>splice</LITERAL2>
+ <LITERAL2>sort</LITERAL2>
+ <LITERAL2>slice</LITERAL2>
+ <LITERAL2>shift</LITERAL2>
+ <LITERAL2>reverse</LITERAL2>
+ <LITERAL2>push</LITERAL2>
+ <LITERAL2>join</LITERAL2>
+ <LITERAL2>pop</LITERAL2>
+ <LITERAL2>concat</LITERAL2>
+ <LITERAL2>unshift</LITERAL2>
+
+ <!-- Arguments -->
+ <LITERAL2>arguments</LITERAL2>
+ <LITERAL2>callee</LITERAL2>
+ <LITERAL2>caller</LITERAL2>
+ <LITERAL2>valueOf</LITERAL2>
+
+ <!-- Date Class -->
+ <LITERAL2>getDate</LITERAL2>
+ <LITERAL2>getDay</LITERAL2>
+ <LITERAL2>getFullYear</LITERAL2>
+ <LITERAL2>getHours</LITERAL2>
+ <LITERAL2>getMilliseconds</LITERAL2>
+ <LITERAL2>getMinutes</LITERAL2>
+ <LITERAL2>getMonth</LITERAL2>
+ <LITERAL2>getSeconds</LITERAL2>
+ <LITERAL2>getTime</LITERAL2>
+ <LITERAL2>getTimezoneOffset</LITERAL2>
+ <LITERAL2>getUTCDate</LITERAL2>
+ <LITERAL2>getUTCDay</LITERAL2>
+ <LITERAL2>getUTCFullYear</LITERAL2>
+ <LITERAL2>getUTCHours</LITERAL2>
+ <LITERAL2>getUTCMilliseconds</LITERAL2>
+ <LITERAL2>getUTCMinutes</LITERAL2>
+ <LITERAL2>getUTCMonth</LITERAL2>
+ <LITERAL2>getUTCSeconds</LITERAL2>
+ <LITERAL2>getYear</LITERAL2>
+ <LITERAL2>setDate</LITERAL2>
+ <LITERAL2>setFullYear</LITERAL2>
+ <LITERAL2>setHours</LITERAL2>
+ <LITERAL2>setMilliseconds</LITERAL2>
+ <LITERAL2>setMinutes</LITERAL2>
+ <LITERAL2>setMonth</LITERAL2>
+ <LITERAL2>setSeconds</LITERAL2>
+ <LITERAL2>setTime</LITERAL2>
+ <LITERAL2>setUTCDate</LITERAL2>
+ <LITERAL2>setUTCFullYear</LITERAL2>
+ <LITERAL2>setUTCHours</LITERAL2>
+ <LITERAL2>setUTCMilliseconds</LITERAL2>
+ <LITERAL2>setUTCMinutes</LITERAL2>
+ <LITERAL2>setUTCMonth</LITERAL2>
+ <LITERAL2>setUTCSeconds</LITERAL2>
+ <LITERAL2>setYear</LITERAL2>
+ <LITERAL2>UTC</LITERAL2>
+
+ <!-- Function -->
+ <LITERAL2>_global</LITERAL2>
+ <LITERAL2>apply</LITERAL2>
+
+ <!-- Math Class -->
+ <LITERAL2>abs</LITERAL2>
+ <LITERAL2>acos</LITERAL2>
+ <LITERAL2>asin</LITERAL2>
+ <LITERAL2>atan</LITERAL2>
+ <LITERAL2>atan2</LITERAL2>
+ <LITERAL2>ceil</LITERAL2>
+ <LITERAL2>cos</LITERAL2>
+ <LITERAL2>exp</LITERAL2>
+ <LITERAL2>floor</LITERAL2>
+ <LITERAL2>log</LITERAL2>
+ <LITERAL2>max</LITERAL2>
+ <LITERAL2>min</LITERAL2>
+ <LITERAL2>pow</LITERAL2>
+ <LITERAL2>round</LITERAL2>
+ <LITERAL2>sin</LITERAL2>
+ <LITERAL2>sqrt</LITERAL2>
+ <LITERAL2>tan</LITERAL2>
+
+ <LITERAL2>E</LITERAL2>
+ <LITERAL2>LN2</LITERAL2>
+ <LITERAL2>LN10</LITERAL2>
+ <LITERAL2>LOG2E</LITERAL2>
+ <LITERAL2>LOG10E</LITERAL2>
+ <LITERAL2>PI</LITERAL2>
+ <LITERAL2>SQRT1_2</LITERAL2>
+ <LITERAL2>SQRT2</LITERAL2>
+
+ <!-- Number -->
+ <LITERAL2>MAX_VALUE</LITERAL2>
+ <LITERAL2>MIN_VALUE</LITERAL2>
+ <LITERAL2>NEGATIVE_INFINITY</LITERAL2>
+ <LITERAL2>POSITIVE_INFINITY</LITERAL2>
+
+ <!-- Object -->
+ <LITERAL2>addProperty</LITERAL2>
+ <LITERAL2>registerClass</LITERAL2>
+ <LITERAL2>unwatch</LITERAL2>
+ <LITERAL2>watch</LITERAL2>
+
+ <!-- String -->
+ <LITERAL2>charAt</LITERAL2>
+ <LITERAL2>charCodeAt</LITERAL2>
+ <LITERAL2>fromCharCode</LITERAL2>
+ <LITERAL2>lastIndexOf</LITERAL2>
+ <LITERAL2>indexOf</LITERAL2>
+ <LITERAL2>split</LITERAL2>
+ <LITERAL2>substr</LITERAL2>
+ <LITERAL2>substring</LITERAL2>
+ <LITERAL2>toLowerCase</LITERAL2>
+ <LITERAL2>toUpperCase</LITERAL2>
+
+ <!-- Accessibility -->
+ <LITERAL2>Accessibility</LITERAL2>
+ <LITERAL2>isActive</LITERAL2>
+ <LITERAL2>updateProperties</LITERAL2>
+
+
+ <!-- System capabilities Class-->
+ <LITERAL2>System</LITERAL2>
+ <LITERAL2>capabilities</LITERAL2>
+ <LITERAL2>exactSettings</LITERAL2>
+ <LITERAL2>setClipboard</LITERAL2>
+ <LITERAL2>showSettings</LITERAL2>
+ <LITERAL2>useCodepage</LITERAL2>
+ <LITERAL2>avHardwareDisable</LITERAL2>
+ <LITERAL2>hasAccessibility</LITERAL2>
+ <LITERAL2>hasAudio</LITERAL2>
+ <LITERAL2>hasAudioEncoder</LITERAL2>
+ <LITERAL2>hasMP3</LITERAL2>
+ <LITERAL2>hasVideoEncoder</LITERAL2>
+ <LITERAL2>pixelAspectRatio</LITERAL2>
+ <LITERAL2>screenColor</LITERAL2>
+ <LITERAL2>screenDPI</LITERAL2>
+ <LITERAL2>screenResolutionX</LITERAL2>
+ <LITERAL2>screenResolutionY</LITERAL2>
+ <LITERAL2>hasEmbeddedVideo</LITERAL2>
+ <LITERAL2>hasPrinting</LITERAL2>
+ <LITERAL2>hasScreenBroadcast</LITERAL2>
+ <LITERAL2>hasScreenPlayback</LITERAL2>
+ <LITERAL2>hasStreamingAudio</LITERAL2>
+ <LITERAL2>hasStreamingVideo</LITERAL2>
+ <LITERAL2>isDebugger</LITERAL2>
+ <LITERAL2>language</LITERAL2>
+ <LITERAL2>manufacturer</LITERAL2>
+ <LITERAL2>os</LITERAL2>
+ <LITERAL2>playerType</LITERAL2>
+ <LITERAL2>serverString</LITERAL2>
+ <LITERAL2>localFileReadDisable</LITERAL2>
+ <LITERAL2>version</LITERAL2>
+ <!-- System security Class -->
+ <LITERAL2>security</LITERAL2>
+
+ <!-- Color Class -->
+ <LITERAL2>getRGB</LITERAL2>
+ <LITERAL2>getTransform</LITERAL2>
+ <LITERAL2>setRGB</LITERAL2>
+ <LITERAL2>setTransform</LITERAL2>
+
+ <!-- Key Class -->
+ <LITERAL2>addListener</LITERAL2>
+ <LITERAL2>getAscii</LITERAL2>
+ <LITERAL2>isDown</LITERAL2>
+ <LITERAL2>getCode</LITERAL2>
+ <LITERAL2>isToggled</LITERAL2>
+ <LITERAL2>removeListener</LITERAL2>
+ <LITERAL2>BACKSPACE</LITERAL2>
+ <LITERAL2>CAPSLOCK</LITERAL2>
+ <LITERAL2>CONTROL</LITERAL2>
+ <LITERAL2>DELETEKEY</LITERAL2>
+ <LITERAL2>DOWN</LITERAL2>
+ <LITERAL2>END</LITERAL2>
+ <LITERAL2>ENTER</LITERAL2>
+ <LITERAL2>ESCAPE</LITERAL2>
+ <LITERAL2>HOME</LITERAL2>
+ <LITERAL2>INSERT</LITERAL2>
+ <LITERAL2>LEFT</LITERAL2>
+ <LITERAL2>PGDN</LITERAL2>
+ <LITERAL2>PGUP</LITERAL2>
+ <LITERAL2>SHIFT</LITERAL2>
+ <LITERAL2>RIGHT</LITERAL2>
+ <LITERAL2>SPACE</LITERAL2>
+ <LITERAL2>TAB</LITERAL2>
+ <LITERAL2>UP</LITERAL2>
+
+ <!-- Mouse -->
+ <LITERAL2>hide</LITERAL2>
+ <LITERAL2>show</LITERAL2>
+ <LITERAL2>onMouseWheel</LITERAL2>
+
+ <!-- Selection Class-->
+ <LITERAL2>getBeginIndex</LITERAL2>
+ <LITERAL2>getCaretIndex</LITERAL2>
+ <LITERAL2>getEndIndex</LITERAL2>
+ <LITERAL2>getFocus</LITERAL2>
+ <LITERAL2>setFocus</LITERAL2>
+ <LITERAL2>setSelection</LITERAL2>
+
+ <!-- SharedObject Class-->
+ <LITERAL2>SharedObject</LITERAL2>
+ <LITERAL2>data</LITERAL2>
+ <LITERAL2>flush</LITERAL2>
+ <LITERAL2>getLocal</LITERAL2>
+ <LITERAL2>getSize</LITERAL2>
+
+ <!-- Sound Class -->
+ <LITERAL2>attachSound</LITERAL2>
+ <LITERAL2>getVolume</LITERAL2>
+ <LITERAL2>loadSound</LITERAL2>
+ <LITERAL2>setPan</LITERAL2>
+ <LITERAL2>getPan</LITERAL2>
+ <LITERAL2>setVolume</LITERAL2>
+ <LITERAL2>start</LITERAL2>
+ <LITERAL2>duration</LITERAL2>
+ <LITERAL2>position</LITERAL2>
+ <LITERAL2>onSoundComplete</LITERAL2>
+ <LITERAL2>id3</LITERAL2>
+ <LITERAL2>onID3</LITERAL2>
+
+ <!-- Video Class -->
+ <LITERAL2>Video</LITERAL2>
+ <LITERAL2>deblocking</LITERAL2>
+ <LITERAL2>smoothing</LITERAL2>
+
+ <!-- Stage Class -->
+ <LITERAL2>Stage</LITERAL2>
+ <LITERAL2>align</LITERAL2>
+ <LITERAL2>height</LITERAL2>
+ <LITERAL2>scaleMode</LITERAL2>
+ <LITERAL2>showMenu</LITERAL2>
+ <LITERAL2>width</LITERAL2>
+ <LITERAL2>onResize</LITERAL2>
+
+ <!-- TextField Class -->
+ <LITERAL2>getFontList</LITERAL2>
+ <LITERAL2>getNewTextFormat</LITERAL2>
+ <LITERAL2>getTextFormat</LITERAL2>
+ <LITERAL2>removeTextField</LITERAL2>
+ <LITERAL2>replaceSel</LITERAL2>
+ <LITERAL2>setNewTextFormat</LITERAL2>
+ <LITERAL2>setTextFormat</LITERAL2>
+ <LITERAL2>autoSize</LITERAL2>
+ <LITERAL2>background</LITERAL2>
+ <LITERAL2>backgroundColor</LITERAL2>
+ <LITERAL2>border</LITERAL2>
+ <LITERAL2>borderColor</LITERAL2>
+ <LITERAL2>bottomScroll</LITERAL2>
+ <LITERAL2>embedFonts</LITERAL2>
+ <LITERAL2>hscroll</LITERAL2>
+ <LITERAL2>html</LITERAL2>
+ <LITERAL2>htmlText</LITERAL2>
+ <LITERAL2>maxChars</LITERAL2>
+ <LITERAL2>maxhscroll</LITERAL2>
+ <LITERAL2>multiline</LITERAL2>
+ <LITERAL2>password</LITERAL2>
+ <LITERAL2>restrict</LITERAL2>
+ <LITERAL2>selectable</LITERAL2>
+ <LITERAL2>text</LITERAL2>
+ <LITERAL2>textColor</LITERAL2>
+ <LITERAL2>textHeight</LITERAL2>
+ <LITERAL2>textWidth</LITERAL2>
+ <LITERAL2>type</LITERAL2>
+ <LITERAL2>variable</LITERAL2>
+ <LITERAL2>wordWrap</LITERAL2>
+ <LITERAL2>onChanged</LITERAL2>
+ <LITERAL2>onScroller</LITERAL2>
+ <LITERAL2>TextField</LITERAL2>
+ <LITERAL2>mouseWheelEnabled</LITERAL2>
+ <LITERAL2>replaceText</LITERAL2>
+
+ <!-- StyleSheet Class -->
+ <LITERAL2>StyleSheet</LITERAL2>
+ <LITERAL2>getStyle</LITERAL2>
+ <LITERAL2>getStyleNames</LITERAL2>
+ <LITERAL2>parseCSS</LITERAL2>
+ <LITERAL2>setStyle</LITERAL2>
+ <LITERAL2>styleSheet</LITERAL2>
+
+ <!-- TextFormat Class -->
+ <LITERAL2>TextFormat</LITERAL2>
+ <LITERAL2>getTextExtent</LITERAL2>
+ <LITERAL2>blockIndent</LITERAL2>
+ <LITERAL2>bold</LITERAL2>
+ <LITERAL2>bullet</LITERAL2>
+ <LITERAL2>color</LITERAL2>
+ <LITERAL2>font</LITERAL2>
+ <LITERAL2>indent</LITERAL2>
+ <LITERAL2>italic</LITERAL2>
+ <LITERAL2>leading</LITERAL2>
+ <LITERAL2>leftMargin</LITERAL2>
+ <LITERAL2>rightMargin</LITERAL2>
+ <LITERAL2>size</LITERAL2>
+ <LITERAL2>tabStops</LITERAL2>
+ <LITERAL2>target</LITERAL2>
+ <LITERAL2>underline</LITERAL2>
+ <LITERAL2>url</LITERAL2>
+
+ <!-- TextSnapshot object -->
+ <LITERAL2>TextSnapshot</LITERAL2>
+ <LITERAL2>findText</LITERAL2>
+ <LITERAL2>getCount</LITERAL2>
+ <LITERAL2>getSelected</LITERAL2>
+ <LITERAL2>getSelectedText</LITERAL2>
+ <LITERAL2>hitTestTextNearPos</LITERAL2>
+ <LITERAL2>getText</LITERAL2>
+ <LITERAL2>setSelectColor</LITERAL2>
+ <LITERAL2>setSelected</LITERAL2>
+
+ <!-- LoadVars Class-->
+ <LITERAL2>LoadVars</LITERAL2>
+ <LITERAL2>load</LITERAL2>
+ <LITERAL2>send</LITERAL2>
+ <LITERAL2>sendAndLoad</LITERAL2>
+ <LITERAL2>contentType</LITERAL2>
+ <LITERAL2>loaded</LITERAL2>
+ <LITERAL2>addRequestHeader</LITERAL2>
+
+ <!-- LocalConnection Class-->
+ <LITERAL2>LocalConnection</LITERAL2>
+ <LITERAL2>allowDomain</LITERAL2>
+ <LITERAL2>allowInsecureDomain</LITERAL2>
+ <LITERAL2>domain</LITERAL2>
+
+ <!-- XML Class -->
+ <LITERAL2>appendChild</LITERAL2>
+ <LITERAL2>cloneNode</LITERAL2>
+ <LITERAL2>createElement</LITERAL2>
+ <LITERAL2>createTextNode</LITERAL2>
+ <LITERAL2>hasChildNodes</LITERAL2>
+ <LITERAL2>insertBefore</LITERAL2>
+ <LITERAL2>parseXML</LITERAL2>
+ <LITERAL2>removeNode</LITERAL2>
+ <LITERAL2>attributes</LITERAL2>
+ <LITERAL2>childNodes</LITERAL2>
+ <LITERAL2>docTypeDecl</LITERAL2>
+ <LITERAL2>firstChild</LITERAL2>
+ <LITERAL2>ignoreWhite</LITERAL2>
+ <LITERAL2>lastChild</LITERAL2>
+ <LITERAL2>nextSibling</LITERAL2>
+ <LITERAL2>nodeName</LITERAL2>
+ <LITERAL2>nodeType</LITERAL2>
+ <LITERAL2>nodeValue</LITERAL2>
+ <LITERAL2>parentNode</LITERAL2>
+ <LITERAL2>previousSibling</LITERAL2>
+ <LITERAL2>status</LITERAL2>
+ <LITERAL2>xmlDecl</LITERAL2>
+ <LITERAL2>close</LITERAL2>
+ <LITERAL2>connect</LITERAL2>
+ <LITERAL2>onClose</LITERAL2>
+ <LITERAL2>onConnect</LITERAL2>
+ <LITERAL2>onXML</LITERAL2>
+
+ <!-- CustomActions Class -->
+ <LITERAL2>CustomActions</LITERAL2>
+ <LITERAL2>onUpdate</LITERAL2>
+ <LITERAL2>uninstall</LITERAL2>
+ <LITERAL2>list</LITERAL2>
+ <LITERAL2>install</LITERAL2>
+ <LITERAL2>get</LITERAL2>
+
+ <!-- NetConnection Class -->
+ <LITERAL2>NetConnection</LITERAL2>
+
+ <!-- NetStream Class-->
+ <LITERAL2>NetStream</LITERAL2>
+ <LITERAL2>bufferLength</LITERAL2>
+ <LITERAL2>bufferTime</LITERAL2>
+ <LITERAL2>bytesLoaded</LITERAL2>
+ <LITERAL2>bytesTotal</LITERAL2>
+ <LITERAL2>pause</LITERAL2>
+ <LITERAL2>seek</LITERAL2>
+ <LITERAL2>setBufferTime</LITERAL2>
+ <LITERAL2>time</LITERAL2>
+
+ <!-- RecordSet Class -->
+ <LITERAL2>DataGlue</LITERAL2>
+ <LITERAL2>bindFormatFunction</LITERAL2>
+ <LITERAL2>bindFormatStrings</LITERAL2>
+ <LITERAL2>getDebugConfig</LITERAL2>
+ <LITERAL2>getDebugID</LITERAL2>
+ <LITERAL2>getService</LITERAL2>
+ <LITERAL2>setCredentials</LITERAL2>
+ <LITERAL2>setDebugID</LITERAL2>
+ <LITERAL2>getDebug</LITERAL2>
+ <LITERAL2>setDebug</LITERAL2>
+ <LITERAL2>createGatewayConnection</LITERAL2>
+ <LITERAL2>NetServices</LITERAL2>
+ <LITERAL2>setDefaultGatewayURL</LITERAL2>
+ <LITERAL2>addItem</LITERAL2>
+ <LITERAL2>addItemAt</LITERAL2>
+ <LITERAL2>addView</LITERAL2>
+ <LITERAL2>filter</LITERAL2>
+ <LITERAL2>getColumnNames</LITERAL2>
+ <LITERAL2>getItemAt</LITERAL2>
+ <LITERAL2>getLength</LITERAL2>
+ <LITERAL2>getNumberAvailable</LITERAL2>
+ <LITERAL2>isFullyPopulated</LITERAL2>
+ <LITERAL2>isLocal</LITERAL2>
+ <LITERAL2>removeAll</LITERAL2>
+ <LITERAL2>removeItemAt</LITERAL2>
+ <LITERAL2>replaceItemAt</LITERAL2>
+ <LITERAL2>setDeliveryMode</LITERAL2>
+ <LITERAL2>setField</LITERAL2>
+ <LITERAL2>sortItemsBy</LITERAL2>
+
+ <!-- deprecated-->
+ <KEYWORD2>chr</KEYWORD2>
+ <KEYWORD2>mbchr</KEYWORD2>
+ <KEYWORD2>mblength</KEYWORD2>
+ <KEYWORD2>mbord</KEYWORD2>
+ <KEYWORD2>mbsubstring</KEYWORD2>
+ <KEYWORD2>ord</KEYWORD2>
+ <KEYWORD2>_highquality</KEYWORD2>
+
+ <!-- END-->
+
+ <!--ECMAScript keywords-->
+ <!-- Reserved for future use
+ (some are already used in some Javascript Engines)
+ -->
+ <KEYWORD1>abstract</KEYWORD1>
+ <KEYWORD3>boolean</KEYWORD3>
+ <KEYWORD3>byte</KEYWORD3>
+ <KEYWORD1>case</KEYWORD1>
+ <KEYWORD1>catch</KEYWORD1>
+ <KEYWORD3>char</KEYWORD3>
+ <KEYWORD1>class</KEYWORD1>
+ <KEYWORD1>const</KEYWORD1>
+ <KEYWORD1>debugger</KEYWORD1>
+ <KEYWORD1>default</KEYWORD1>
+
+ <KEYWORD3>double</KEYWORD3>
+ <KEYWORD1>enum</KEYWORD1>
+ <KEYWORD2>export</KEYWORD2>
+ <KEYWORD1>extends</KEYWORD1>
+ <KEYWORD1>final</KEYWORD1>
+ <KEYWORD1>finally</KEYWORD1>
+ <KEYWORD3>float</KEYWORD3>
+ <KEYWORD1>goto</KEYWORD1>
+ <KEYWORD1>implements</KEYWORD1>
+
+ <KEYWORD2>import</KEYWORD2>
+ <KEYWORD1>instanceof</KEYWORD1>
+ <KEYWORD3>int</KEYWORD3>
+ <KEYWORD1>interface</KEYWORD1>
+ <KEYWORD3>long</KEYWORD3>
+ <KEYWORD1>native</KEYWORD1>
+ <KEYWORD2>package</KEYWORD2>
+ <KEYWORD1>private</KEYWORD1>
+ <KEYWORD1>Void</KEYWORD1>
+ <KEYWORD1>protected</KEYWORD1>
+ <KEYWORD1>public</KEYWORD1>
+ <KEYWORD1>dynamic</KEYWORD1>
+
+ <KEYWORD3>short</KEYWORD3>
+ <KEYWORD1>static</KEYWORD1>
+ <LITERAL2>super</LITERAL2>
+ <KEYWORD1>switch</KEYWORD1>
+ <KEYWORD1>synchronized</KEYWORD1>
+ <KEYWORD1>throw</KEYWORD1>
+ <KEYWORD1>throws</KEYWORD1>
+ <KEYWORD1>transient</KEYWORD1>
+ <KEYWORD1>try</KEYWORD1>
+ <KEYWORD1>volatile</KEYWORD1>
+ </KEYWORDS>
+ </RULES>
+</MODE>
diff --git a/jEdit/modes/ada95.xml b/jEdit/modes/ada95.xml
index a6d1550..85cc10f 100644
--- a/jEdit/modes/ada95.xml
+++ b/jEdit/modes/ada95.xml
@@ -1,224 +1,224 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE MODE SYSTEM "xmode.dtd">
-
-<MODE>
- <PROPS>
- <PROPERTY NAME="lineComment" VALUE="--" />
- </PROPS>
-
- <RULES IGNORE_CASE="TRUE" HIGHLIGHT_DIGITS="TRUE">
- <!-- Normal comments. -->
- <EOL_SPAN TYPE="COMMENT1">--</EOL_SPAN>
-
- <SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">
- <BEGIN>"</BEGIN>
- <END>"</END>
- </SPAN>
-
- <SEQ TYPE="OPERATOR">)</SEQ>
- <SEQ TYPE="OPERATOR">(</SEQ>
- <SEQ TYPE="OPERATOR">..</SEQ>
- <SEQ TYPE="OPERATOR">.all</SEQ>
- <SEQ TYPE="OPERATOR">:=</SEQ>
- <SEQ TYPE="OPERATOR">/=</SEQ>
- <SEQ TYPE="OPERATOR">=></SEQ>
- <SEQ TYPE="OPERATOR">=</SEQ>
- <SEQ TYPE="NULL"><></SEQ>
- <SEQ TYPE="LABEL"><<</SEQ>
- <SEQ TYPE="LABEL">>></SEQ>
- <SEQ TYPE="OPERATOR">>=</SEQ>
- <SEQ TYPE="OPERATOR"><=</SEQ>
- <SEQ TYPE="OPERATOR">></SEQ>
- <SEQ TYPE="OPERATOR"><</SEQ>
- <SEQ TYPE="OPERATOR">&</SEQ>
- <SEQ TYPE="OPERATOR">+</SEQ>
- <SEQ TYPE="OPERATOR">-</SEQ>
- <SEQ TYPE="OPERATOR">/</SEQ>
- <SEQ TYPE="OPERATOR">**</SEQ>
- <SEQ TYPE="OPERATOR">*</SEQ>
-
- <SEQ TYPE="KEYWORD3">'access</SEQ>
- <SEQ TYPE="KEYWORD3">'address</SEQ>
- <SEQ TYPE="KEYWORD3">'adjacent</SEQ>
- <SEQ TYPE="KEYWORD3">'aft</SEQ>
- <SEQ TYPE="KEYWORD3">'alignment</SEQ>
- <SEQ TYPE="KEYWORD3">'base</SEQ>
- <SEQ TYPE="KEYWORD3">'bit_order</SEQ>
- <SEQ TYPE="KEYWORD3">'body_version</SEQ>
- <SEQ TYPE="KEYWORD3">'callable</SEQ>
- <SEQ TYPE="KEYWORD3">'caller</SEQ>
- <SEQ TYPE="KEYWORD3">'ceiling</SEQ>
- <SEQ TYPE="KEYWORD3">'class</SEQ>
- <SEQ TYPE="KEYWORD3">'component_size</SEQ>
- <SEQ TYPE="KEYWORD3">'composed</SEQ>
- <SEQ TYPE="KEYWORD3">'constrained</SEQ>
- <SEQ TYPE="KEYWORD3">'copy_size</SEQ>
- <SEQ TYPE="KEYWORD3">'count</SEQ>
- <SEQ TYPE="KEYWORD3">'definite</SEQ>
- <SEQ TYPE="KEYWORD3">'delta</SEQ>
- <SEQ TYPE="KEYWORD3">'denorm</SEQ>
- <SEQ TYPE="KEYWORD3">'digits</SEQ>
- <SEQ TYPE="KEYWORD3">'exponent</SEQ>
- <SEQ TYPE="KEYWORD3">'external_tag</SEQ>
- <SEQ TYPE="KEYWORD3">'first</SEQ>
- <SEQ TYPE="KEYWORD3">'first_bit</SEQ>
- <SEQ TYPE="KEYWORD3">'floor</SEQ>
- <SEQ TYPE="KEYWORD3">'fore</SEQ>
- <SEQ TYPE="KEYWORD3">'fraction</SEQ>
- <SEQ TYPE="KEYWORD3">'genetic</SEQ>
- <SEQ TYPE="KEYWORD3">'identity</SEQ>
- <SEQ TYPE="KEYWORD3">'image</SEQ>
- <SEQ TYPE="KEYWORD3">'input</SEQ>
- <SEQ TYPE="KEYWORD3">'last</SEQ>
- <SEQ TYPE="KEYWORD3">'last_bit</SEQ>
- <SEQ TYPE="KEYWORD3">'leading_part</SEQ>
- <SEQ TYPE="KEYWORD3">'length</SEQ>
- <SEQ TYPE="KEYWORD3">'machine</SEQ>
- <SEQ TYPE="KEYWORD3">'machine_emax</SEQ>
- <SEQ TYPE="KEYWORD3">'machine_emin</SEQ>
- <SEQ TYPE="KEYWORD3">'machine_mantissa</SEQ>
- <SEQ TYPE="KEYWORD3">'machine_overflows</SEQ>
- <SEQ TYPE="KEYWORD3">'machine_radix</SEQ>
- <SEQ TYPE="KEYWORD3">'machine_rounds</SEQ>
- <SEQ TYPE="KEYWORD3">'max</SEQ>
- <SEQ TYPE="KEYWORD3">'max_size_in_storage_elements</SEQ>
- <SEQ TYPE="KEYWORD3">'min</SEQ>
- <SEQ TYPE="KEYWORD3">'model</SEQ>
- <SEQ TYPE="KEYWORD3">'model_emin</SEQ>
- <SEQ TYPE="KEYWORD3">'model_epsilon</SEQ>
- <SEQ TYPE="KEYWORD3">'model_mantissa</SEQ>
- <SEQ TYPE="KEYWORD3">'model_small</SEQ>
- <SEQ TYPE="KEYWORD3">'modulus</SEQ>
- <SEQ TYPE="KEYWORD3">'output</SEQ>
- <SEQ TYPE="KEYWORD3">'partition_id</SEQ>
- <SEQ TYPE="KEYWORD3">'pos</SEQ>
- <SEQ TYPE="KEYWORD3">'position</SEQ>
- <SEQ TYPE="KEYWORD3">'pred</SEQ>
- <SEQ TYPE="KEYWORD3">'range</SEQ>
- <SEQ TYPE="KEYWORD3">'read</SEQ>
- <SEQ TYPE="KEYWORD3">'remainder</SEQ>
- <SEQ TYPE="KEYWORD3">'round</SEQ>
- <SEQ TYPE="KEYWORD3">'rounding</SEQ>
- <SEQ TYPE="KEYWORD3">'safe_first</SEQ>
- <SEQ TYPE="KEYWORD3">'safe_last</SEQ>
- <SEQ TYPE="KEYWORD3">'scale</SEQ>
- <SEQ TYPE="KEYWORD3">'scaling</SEQ>
- <SEQ TYPE="KEYWORD3">'signed_zeros</SEQ>
- <SEQ TYPE="KEYWORD3">'size</SEQ>
- <SEQ TYPE="KEYWORD3">'small</SEQ>
- <SEQ TYPE="KEYWORD3">'storage_pool</SEQ>
- <SEQ TYPE="KEYWORD3">'storage_size</SEQ>
- <SEQ TYPE="KEYWORD3">'succ</SEQ>
- <SEQ TYPE="KEYWORD3">'tag</SEQ>
- <SEQ TYPE="KEYWORD3">'terminated</SEQ>
- <SEQ TYPE="KEYWORD3">'truncation</SEQ>
- <SEQ TYPE="KEYWORD3">'unbiased_rounding</SEQ>
- <SEQ TYPE="KEYWORD3">'unchecked_access</SEQ>
- <SEQ TYPE="KEYWORD3">'val</SEQ>
- <SEQ TYPE="KEYWORD3">'valid</SEQ>
- <SEQ TYPE="KEYWORD3">'value</SEQ>
- <SEQ TYPE="KEYWORD3">'version</SEQ>
- <SEQ TYPE="KEYWORD3">'wide_image</SEQ>
- <SEQ TYPE="KEYWORD3">'wide_value</SEQ>
- <SEQ TYPE="KEYWORD3">'wide_width</SEQ>
- <SEQ TYPE="KEYWORD3">'width</SEQ>
- <SEQ TYPE="KEYWORD3">'write</SEQ>
-
- <SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">
- <BEGIN>'</BEGIN>
- <END>'</END>
- </SPAN>
-
- <KEYWORDS>
- <!-- Reserved words -->
- <KEYWORD1>entry</KEYWORD1>
- <KEYWORD1>function</KEYWORD1>
- <KEYWORD1>procedure</KEYWORD1>
-
- <KEYWORD2>abort</KEYWORD2>
- <KEYWORD2>abs</KEYWORD2>
- <KEYWORD2>abstract</KEYWORD2>
- <KEYWORD2>accept</KEYWORD2>
- <KEYWORD2>access</KEYWORD2>
- <KEYWORD2>aliased</KEYWORD2>
- <KEYWORD2>all</KEYWORD2>
- <KEYWORD2>and</KEYWORD2>
- <KEYWORD2>array</KEYWORD2>
- <KEYWORD2>at</KEYWORD2>
- <KEYWORD2>begin</KEYWORD2>
- <KEYWORD2>body</KEYWORD2>
- <KEYWORD2>case</KEYWORD2>
- <KEYWORD2>constant</KEYWORD2>
- <KEYWORD2>declare</KEYWORD2>
- <KEYWORD2>delay</KEYWORD2>
- <KEYWORD2>delta</KEYWORD2>
- <KEYWORD2>digits</KEYWORD2>
- <KEYWORD2>do</KEYWORD2>
- <KEYWORD2>else</KEYWORD2>
- <KEYWORD2>elsif</KEYWORD2>
- <KEYWORD2>end</KEYWORD2>
- <KEYWORD2>exception</KEYWORD2>
- <KEYWORD2>exit</KEYWORD2>
- <KEYWORD2>for</KEYWORD2>
- <KEYWORD2>goto</KEYWORD2>
- <KEYWORD2>if</KEYWORD2>
- <KEYWORD2>in</KEYWORD2>
- <KEYWORD2>is</KEYWORD2>
- <KEYWORD2>limited</KEYWORD2>
- <KEYWORD2>loop</KEYWORD2>
- <KEYWORD2>mod</KEYWORD2>
- <KEYWORD2>new</KEYWORD2>
- <KEYWORD2>not</KEYWORD2>
- <KEYWORD2>or</KEYWORD2>
- <KEYWORD2>others</KEYWORD2>
- <KEYWORD2>out</KEYWORD2>
- <KEYWORD2>package</KEYWORD2>
- <KEYWORD2>pragma</KEYWORD2>
- <KEYWORD2>private</KEYWORD2>
- <KEYWORD2>protected</KEYWORD2>
- <KEYWORD2>raise</KEYWORD2>
- <KEYWORD2>range</KEYWORD2>
- <KEYWORD2>record</KEYWORD2>
- <KEYWORD2>rem</KEYWORD2>
- <KEYWORD2>renames</KEYWORD2>
- <KEYWORD2>requeue</KEYWORD2>
- <KEYWORD2>return</KEYWORD2>
- <KEYWORD2>select</KEYWORD2>
- <KEYWORD2>separate</KEYWORD2>
- <KEYWORD2>string</KEYWORD2>
- <KEYWORD2>subtype</KEYWORD2>
- <KEYWORD2>tagged</KEYWORD2>
- <KEYWORD2>task</KEYWORD2>
- <KEYWORD2>terminate</KEYWORD2>
- <KEYWORD2>then</KEYWORD2>
- <KEYWORD2>type</KEYWORD2>
- <KEYWORD2>until</KEYWORD2>
- <KEYWORD2>use</KEYWORD2>
- <KEYWORD2>when</KEYWORD2>
- <KEYWORD2>while</KEYWORD2>
- <KEYWORD2>with</KEYWORD2>
- <KEYWORD2>xor</KEYWORD2>
-
- <!-- Attributes -->
-
- <!-- Common Pre-defined Types -->
- <LITERAL2>address</LITERAL2>
- <LITERAL2>boolean</LITERAL2>
- <LITERAL2>character</LITERAL2>
- <LITERAL2>duration</LITERAL2>
- <LITERAL2>float</LITERAL2>
- <LITERAL2>integer</LITERAL2>
- <LITERAL2>latin_1</LITERAL2>
- <LITERAL2>natural</LITERAL2>
- <LITERAL2>positive</LITERAL2>
- <LITERAL2>string</LITERAL2>
- <LITERAL2>time</LITERAL2>
-
- <!-- Literals -->
- <LITERAL1>false</LITERAL1>
- <LITERAL1>null</LITERAL1>
- <LITERAL1>true</LITERAL1>
- </KEYWORDS>
- </RULES>
-</MODE>
+<?xml version="1.0"?>
+
+<!DOCTYPE MODE SYSTEM "xmode.dtd">
+
+<MODE>
+ <PROPS>
+ <PROPERTY NAME="lineComment" VALUE="--" />
+ </PROPS>
+
+ <RULES IGNORE_CASE="TRUE" HIGHLIGHT_DIGITS="TRUE">
+ <!-- Normal comments. -->
+ <EOL_SPAN TYPE="COMMENT1">--</EOL_SPAN>
+
+ <SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">
+ <BEGIN>"</BEGIN>
+ <END>"</END>
+ </SPAN>
+
+ <SEQ TYPE="OPERATOR">)</SEQ>
+ <SEQ TYPE="OPERATOR">(</SEQ>
+ <SEQ TYPE="OPERATOR">..</SEQ>
+ <SEQ TYPE="OPERATOR">.all</SEQ>
+ <SEQ TYPE="OPERATOR">:=</SEQ>
+ <SEQ TYPE="OPERATOR">/=</SEQ>
+ <SEQ TYPE="OPERATOR">=></SEQ>
+ <SEQ TYPE="OPERATOR">=</SEQ>
+ <SEQ TYPE="NULL"><></SEQ>
+ <SEQ TYPE="LABEL"><<</SEQ>
+ <SEQ TYPE="LABEL">>></SEQ>
+ <SEQ TYPE="OPERATOR">>=</SEQ>
+ <SEQ TYPE="OPERATOR"><=</SEQ>
+ <SEQ TYPE="OPERATOR">></SEQ>
+ <SEQ TYPE="OPERATOR"><</SEQ>
+ <SEQ TYPE="OPERATOR">&</SEQ>
+ <SEQ TYPE="OPERATOR">+</SEQ>
+ <SEQ TYPE="OPERATOR">-</SEQ>
+ <SEQ TYPE="OPERATOR">/</SEQ>
+ <SEQ TYPE="OPERATOR">**</SEQ>
+ <SEQ TYPE="OPERATOR">*</SEQ>
+
+ <SEQ TYPE="KEYWORD3">'access</SEQ>
+ <SEQ TYPE="KEYWORD3">'address</SEQ>
+ <SEQ TYPE="KEYWORD3">'adjacent</SEQ>
+ <SEQ TYPE="KEYWORD3">'aft</SEQ>
+ <SEQ TYPE="KEYWORD3">'alignment</SEQ>
+ <SEQ TYPE="KEYWORD3">'base</SEQ>
+ <SEQ TYPE="KEYWORD3">'bit_order</SEQ>
+ <SEQ TYPE="KEYWORD3">'body_version</SEQ>
+ <SEQ TYPE="KEYWORD3">'callable</SEQ>
+ <SEQ TYPE="KEYWORD3">'caller</SEQ>
+ <SEQ TYPE="KEYWORD3">'ceiling</SEQ>
+ <SEQ TYPE="KEYWORD3">'class</SEQ>
+ <SEQ TYPE="KEYWORD3">'component_size</SEQ>
+ <SEQ TYPE="KEYWORD3">'composed</SEQ>
+ <SEQ TYPE="KEYWORD3">'constrained</SEQ>
+ <SEQ TYPE="KEYWORD3">'copy_size</SEQ>
+ <SEQ TYPE="KEYWORD3">'count</SEQ>
+ <SEQ TYPE="KEYWORD3">'definite</SEQ>
+ <SEQ TYPE="KEYWORD3">'delta</SEQ>
+ <SEQ TYPE="KEYWORD3">'denorm</SEQ>
+ <SEQ TYPE="KEYWORD3">'digits</SEQ>
+ <SEQ TYPE="KEYWORD3">'exponent</SEQ>
+ <SEQ TYPE="KEYWORD3">'external_tag</SEQ>
+ <SEQ TYPE="KEYWORD3">'first</SEQ>
+ <SEQ TYPE="KEYWORD3">'first_bit</SEQ>
+ <SEQ TYPE="KEYWORD3">'floor</SEQ>
+ <SEQ TYPE="KEYWORD3">'fore</SEQ>
+ <SEQ TYPE="KEYWORD3">'fraction</SEQ>
+ <SEQ TYPE="KEYWORD3">'genetic</SEQ>
+ <SEQ TYPE="KEYWORD3">'identity</SEQ>
+ <SEQ TYPE="KEYWORD3">'image</SEQ>
+ <SEQ TYPE="KEYWORD3">'input</SEQ>
+ <SEQ TYPE="KEYWORD3">'last</SEQ>
+ <SEQ TYPE="KEYWORD3">'last_bit</SEQ>
+ <SEQ TYPE="KEYWORD3">'leading_part</SEQ>
+ <SEQ TYPE="KEYWORD3">'length</SEQ>
+ <SEQ TYPE="KEYWORD3">'machine</SEQ>
+ <SEQ TYPE="KEYWORD3">'machine_emax</SEQ>
+ <SEQ TYPE="KEYWORD3">'machine_emin</SEQ>
+ <SEQ TYPE="KEYWORD3">'machine_mantissa</SEQ>
+ <SEQ TYPE="KEYWORD3">'machine_overflows</SEQ>
+ <SEQ TYPE="KEYWORD3">'machine_radix</SEQ>
+ <SEQ TYPE="KEYWORD3">'machine_rounds</SEQ>
+ <SEQ TYPE="KEYWORD3">'max</SEQ>
+ <SEQ TYPE="KEYWORD3">'max_size_in_storage_elements</SEQ>
+ <SEQ TYPE="KEYWORD3">'min</SEQ>
+ <SEQ TYPE="KEYWORD3">'model</SEQ>
+ <SEQ TYPE="KEYWORD3">'model_emin</SEQ>
+ <SEQ TYPE="KEYWORD3">'model_epsilon</SEQ>
+ <SEQ TYPE="KEYWORD3">'model_mantissa</SEQ>
+ <SEQ TYPE="KEYWORD3">'model_small</SEQ>
+ <SEQ TYPE="KEYWORD3">'modulus</SEQ>
+ <SEQ TYPE="KEYWORD3">'output</SEQ>
+ <SEQ TYPE="KEYWORD3">'partition_id</SEQ>
+ <SEQ TYPE="KEYWORD3">'pos</SEQ>
+ <SEQ TYPE="KEYWORD3">'position</SEQ>
+ <SEQ TYPE="KEYWORD3">'pred</SEQ>
+ <SEQ TYPE="KEYWORD3">'range</SEQ>
+ <SEQ TYPE="KEYWORD3">'read</SEQ>
+ <SEQ TYPE="KEYWORD3">'remainder</SEQ>
+ <SEQ TYPE="KEYWORD3">'round</SEQ>
+ <SEQ TYPE="KEYWORD3">'rounding</SEQ>
+ <SEQ TYPE="KEYWORD3">'safe_first</SEQ>
+ <SEQ TYPE="KEYWORD3">'safe_last</SEQ>
+ <SEQ TYPE="KEYWORD3">'scale</SEQ>
+ <SEQ TYPE="KEYWORD3">'scaling</SEQ>
+ <SEQ TYPE="KEYWORD3">'signed_zeros</SEQ>
+ <SEQ TYPE="KEYWORD3">'size</SEQ>
+ <SEQ TYPE="KEYWORD3">'small</SEQ>
+ <SEQ TYPE="KEYWORD3">'storage_pool</SEQ>
+ <SEQ TYPE="KEYWORD3">'storage_size</SEQ>
+ <SEQ TYPE="KEYWORD3">'succ</SEQ>
+ <SEQ TYPE="KEYWORD3">'tag</SEQ>
+ <SEQ TYPE="KEYWORD3">'terminated</SEQ>
+ <SEQ TYPE="KEYWORD3">'truncation</SEQ>
+ <SEQ TYPE="KEYWORD3">'unbiased_rounding</SEQ>
+ <SEQ TYPE="KEYWORD3">'unchecked_access</SEQ>
+ <SEQ TYPE="KEYWORD3">'val</SEQ>
+ <SEQ TYPE="KEYWORD3">'valid</SEQ>
+ <SEQ TYPE="KEYWORD3">'value</SEQ>
+ <SEQ TYPE="KEYWORD3">'version</SEQ>
+ <SEQ TYPE="KEYWORD3">'wide_image</SEQ>
+ <SEQ TYPE="KEYWORD3">'wide_value</SEQ>
+ <SEQ TYPE="KEYWORD3">'wide_width</SEQ>
+ <SEQ TYPE="KEYWORD3">'width</SEQ>
+ <SEQ TYPE="KEYWORD3">'write</SEQ>
+
+ <SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">
+ <BEGIN>'</BEGIN>
+ <END>'</END>
+ </SPAN>
+
+ <KEYWORDS>
+ <!-- Reserved words -->
+ <KEYWORD1>entry</KEYWORD1>
+ <KEYWORD1>function</KEYWORD1>
+ <KEYWORD1>procedure</KEYWORD1>
+
+ <KEYWORD2>abort</KEYWORD2>
+ <KEYWORD2>abs</KEYWORD2>
+ <KEYWORD2>abstract</KEYWORD2>
+ <KEYWORD2>accept</KEYWORD2>
+ <KEYWORD2>access</KEYWORD2>
+ <KEYWORD2>aliased</KEYWORD2>
+ <KEYWORD2>all</KEYWORD2>
+ <KEYWORD2>and</KEYWORD2>
+ <KEYWORD2>array</KEYWORD2>
+ <KEYWORD2>at</KEYWORD2>
+ <KEYWORD2>begin</KEYWORD2>
+ <KEYWORD2>body</KEYWORD2>
+ <KEYWORD2>case</KEYWORD2>
+ <KEYWORD2>constant</KEYWORD2>
+ <KEYWORD2>declare</KEYWORD2>
+ <KEYWORD2>delay</KEYWORD2>
+ <KEYWORD2>delta</KEYWORD2>
+ <KEYWORD2>digits</KEYWORD2>
+ <KEYWORD2>do</KEYWORD2>
+ <KEYWORD2>else</KEYWORD2>
+ <KEYWORD2>elsif</KEYWORD2>
+ <KEYWORD2>end</KEYWORD2>
+ <KEYWORD2>exception</KEYWORD2>
+ <KEYWORD2>exit</KEYWORD2>
+ <KEYWORD2>for</KEYWORD2>
+ <KEYWORD2>goto</KEYWORD2>
+ <KEYWORD2>if</KEYWORD2>
+ <KEYWORD2>in</KEYWORD2>
+ <KEYWORD2>is</KEYWORD2>
+ <KEYWORD2>limited</KEYWORD2>
+ <KEYWORD2>loop</KEYWORD2>
+ <KEYWORD2>mod</KEYWORD2>
+ <KEYWORD2>new</KEYWORD2>
+ <KEYWORD2>not</KEYWORD2>
+ <KEYWORD2>or</KEYWORD2>
+ <KEYWORD2>others</KEYWORD2>
+ <KEYWORD2>out</KEYWORD2>
+ <KEYWORD2>package</KEYWORD2>
+ <KEYWORD2>pragma</KEYWORD2>
+ <KEYWORD2>private</KEYWORD2>
+ <KEYWORD2>protected</KEYWORD2>
+ <KEYWORD2>raise</KEYWORD2>
+ <KEYWORD2>range</KEYWORD2>
+ <KEYWORD2>record</KEYWORD2>
+ <KEYWORD2>rem</KEYWORD2>
+ <KEYWORD2>renames</KEYWORD2>
+ <KEYWORD2>requeue</KEYWORD2>
+ <KEYWORD2>return</KEYWORD2>
+ <KEYWORD2>select</KEYWORD2>
+ <KEYWORD2>separate</KEYWORD2>
+ <KEYWORD2>string</KEYWORD2>
+ <KEYWORD2>subtype</KEYWORD2>
+ <KEYWORD2>tagged</KEYWORD2>
+ <KEYWORD2>task</KEYWORD2>
+ <KEYWORD2>terminate</KEYWORD2>
+ <KEYWORD2>then</KEYWORD2>
+ <KEYWORD2>type</KEYWORD2>
+ <KEYWORD2>until</KEYWORD2>
+ <KEYWORD2>use</KEYWORD2>
+ <KEYWORD2>when</KEYWORD2>
+ <KEYWORD2>while</KEYWORD2>
+ <KEYWORD2>with</KEYWORD2>
+ <KEYWORD2>xor</KEYWORD2>
+
+ <!-- Attributes -->
+
+ <!-- Common Pre-defined Types -->
+ <LITERAL2>address</LITERAL2>
+ <LITERAL2>boolean</LITERAL2>
+ <LITERAL2>character</LITERAL2>
+ <LITERAL2>duration</LITERAL2>
+ <LITERAL2>float</LITERAL2>
+ <LITERAL2>integer</LITERAL2>
+ <LITERAL2>latin_1</LITERAL2>
+ <LITERAL2>natural</LITERAL2>
+ <LITERAL2>positive</LITERAL2>
+ <LITERAL2>string</LITERAL2>
+ <LITERAL2>time</LITERAL2>
+
+ <!-- Literals -->
+ <LITERAL1>false</LITERAL1>
+ <LITERAL1>null</LITERAL1>
+ <LITERAL1>true</LITERAL1>
+ </KEYWORDS>
+ </RULES>
+</MODE>
diff --git a/jEdit/modes/ant.xml b/jEdit/modes/ant.xml
new file mode 100644
index 0000000..d6eb4ed
--- /dev/null
+++ b/jEdit/modes/ant.xml
@@ -0,0 +1,348 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE MODE SYSTEM "xmode.dtd">
+
+<MODE>
+ <PROPS>
+ <PROPERTY NAME="commentStart" VALUE="<!--" />
+ <PROPERTY NAME="commentEnd" VALUE="-->" />
+ </PROPS>
+ <!-- {{{ MAIN -->
+ <RULES>
+ <SPAN TYPE="MARKUP" DELEGATE="SQL">
+ <BEGIN><transaction</BEGIN>
+ <END></transaction></END>
+ </SPAN>
+
+ <!-- ant variables -->
+ <SPAN TYPE="KEYWORD3">
+ <BEGIN>${</BEGIN>
+ <END>}</END>
+ </SPAN>
+
+ <!-- SGML comment -->
+ <SPAN TYPE="COMMENT1">
+ <BEGIN><!--</BEGIN>
+ <END>--></END>
+ </SPAN>
+
+ <!-- DTD Entity declarations -->
+ <SPAN TYPE="KEYWORD2" DELEGATE="ENTITY-TAGS">
+ <BEGIN><!ENTITY</BEGIN>
+ <END>></END>
+ </SPAN>
+
+ <!-- CDATA sections -->
+ <SPAN TYPE="KEYWORD2" DELEGATE="CDATA">
+ <BEGIN><![CDATA[</BEGIN>
+ <END>]]></END>
+ </SPAN>
+
+ <!-- DTD instructions -->
+ <SPAN TYPE="KEYWORD2" DELEGATE="DTD-TAGS">
+ <BEGIN><!</BEGIN>
+ <END>></END>
+ </SPAN>
+
+ <!-- PI directives -->
+ <SPAN TYPE="KEYWORD3">
+ <BEGIN><?</BEGIN>
+ <END>></END>
+ </SPAN>
+
+ <!-- markup tags -->
+ <SPAN TYPE="MARKUP" DELEGATE="TAGS">
+ <BEGIN><</BEGIN>
+ <END>></END>
+ </SPAN>
+
+ <!-- SGML entities -->
+ <SPAN TYPE="LITERAL2" NO_WORD_BREAK="TRUE">
+ <BEGIN>&</BEGIN>
+ <END>;</END>
+ </SPAN>
+ </RULES>
+ <!-- }}} -->
+
+ <!-- {{{ TAGS -->
+ <RULES SET="TAGS" DEFAULT="MARKUP" NO_WORD_SEP="-_">
+ <!-- SGML comment -->
+ <SPAN TYPE="COMMENT1">
+ <BEGIN><!--</BEGIN>
+ <END>--></END>
+ </SPAN>
+
+ <SPAN TYPE="LITERAL1">
+ <BEGIN>"</BEGIN>
+ <END>"</END>
+ </SPAN>
+
+ <SPAN TYPE="LITERAL1">
+ <BEGIN>'</BEGIN>
+ <END>'</END>
+ </SPAN>
+
+ <SEQ TYPE="MARKUP" DELEGATE="STRING">"</SEQ>
+
+ <SEQ TYPE="MARKUP" DELEGATE="ant::MAIN">/></SEQ>
+ <MARK_PREVIOUS TYPE="LABEL">:</MARK_PREVIOUS>
+ <SEQ TYPE="OPERATOR">:</SEQ>
+ <KEYWORDS>
+ <KEYWORD1>target</KEYWORD1>
+
+ <KEYWORD2>project</KEYWORD2>
+
+ <KEYWORD3>description</KEYWORD3>
+ <KEYWORD3>loadfile</KEYWORD3>
+ <KEYWORD3>loadproperties</KEYWORD3>
+ <KEYWORD3>property</KEYWORD3>
+ <KEYWORD3>xmlproperty</KEYWORD3>
+
+ <KEYWORD4>fileset</KEYWORD4>
+ <KEYWORD4>filelist</KEYWORD4>
+ <KEYWORD4>include</KEYWORD4>
+ <KEYWORD4>exclude</KEYWORD4>
+ <KEYWORD4>filter</KEYWORD4>
+ <KEYWORD4>filterchain</KEYWORD4>
+ <KEYWORD4>path</KEYWORD4>
+ <KEYWORD4>pathelement</KEYWORD4>
+ <KEYWORD4>classpath</KEYWORD4>
+
+ <!-- condition subelements -->
+ <KEYWORD4>istrue</KEYWORD4>
+
+ <OPERATOR>equals</OPERATOR>
+ <OPERATOR>and</OPERATOR>
+ <OPERATOR>or</OPERATOR>
+ <OPERATOR>not</OPERATOR>
+ <OPERATOR>=</OPERATOR>
+
+ <!-- basic file tasks -->
+ <FUNCTION>chmod</FUNCTION>
+ <FUNCTION>checksum</FUNCTION>
+ <FUNCTION>concat</FUNCTION>
+ <FUNCTION>copy</FUNCTION>
+ <FUNCTION>delete</FUNCTION>
+ <FUNCTION>echo</FUNCTION>
+ <FUNCTION>exec</FUNCTION>
+ <FUNCTION>import</FUNCTION>
+ <FUNCTION>input</FUNCTION>
+ <FUNCTION>mkdir</FUNCTION>
+ <FUNCTION>move</FUNCTION>
+ <FUNCTION>patch</FUNCTION>
+ <FUNCTION>tempfile</FUNCTION>
+ <FUNCTION>touch</FUNCTION>
+
+ <!-- java specific tasks -->
+ <FUNCTION>java</FUNCTION>
+ <FUNCTION>javac</FUNCTION>
+ <FUNCTION>javadoc</FUNCTION>
+ <FUNCTION>junit</FUNCTION>
+ <FUNCTION>rmic</FUNCTION>
+ <FUNCTION>signjar</FUNCTION>
+
+ <!-- archive tasks -->
+ <FUNCTION>bzip2</FUNCTION>
+ <FUNCTION>bunzip2</FUNCTION>
+ <FUNCTION>ear</FUNCTION>
+ <FUNCTION>gzip</FUNCTION>
+ <FUNCTION>gunzip</FUNCTION>
+ <FUNCTION>jar</FUNCTION>
+ <FUNCTION>unjar</FUNCTION>
+ <FUNCTION>manifest</FUNCTION>
+ <FUNCTION>tar</FUNCTION>
+ <FUNCTION>untar</FUNCTION>
+ <FUNCTION>war</FUNCTION>
+ <FUNCTION>unwar</FUNCTION>
+ <FUNCTION>zip</FUNCTION>
+ <FUNCTION>unzip</FUNCTION>
+
+ <!-- execution tasks -->
+ <FUNCTION>ant</FUNCTION>
+ <FUNCTION>antcall</FUNCTION>
+ <FUNCTION>apply</FUNCTION>
+ <FUNCTION>dependset</FUNCTION>
+ <FUNCTION>fail</FUNCTION>
+ <FUNCTION>parallel</FUNCTION>
+ <FUNCTION>sequential</FUNCTION>
+ <FUNCTION>sleep</FUNCTION>
+ <FUNCTION>waitfor</FUNCTION>
+
+ <!-- misc tasks -->
+ <FUNCTION>antstructure</FUNCTION>
+ <FUNCTION>available</FUNCTION>
+ <FUNCTION>condition</FUNCTION>
+ <FUNCTION>cvs</FUNCTION>
+ <FUNCTION>cvschangelog</FUNCTION>
+ <FUNCTION>cvspass</FUNCTION>
+ <FUNCTION>cvstagdiff</FUNCTION>
+ <FUNCTION>get</FUNCTION>
+ <FUNCTION>mail</FUNCTION>
+ <FUNCTION>replace</FUNCTION>
+ <FUNCTION>sql</FUNCTION>
+ <FUNCTION>style</FUNCTION>
+ <FUNCTION>taskdef</FUNCTION>
+ <FUNCTION>tstamp</FUNCTION>
+ <FUNCTION>typedef</FUNCTION>
+ <FUNCTION>xslt</FUNCTION>
+
+ <!-- antelope tasks -->
+ <FUNCTION>assert</FUNCTION>
+ <FUNCTION>call</FUNCTION>
+ <FUNCTION>else</FUNCTION>
+ <FUNCTION>find</FUNCTION>
+ <FUNCTION>grep</FUNCTION>
+ <FUNCTION>if</FUNCTION>
+ <FUNCTION>new</FUNCTION>
+ <FUNCTION>post</FUNCTION>
+ <FUNCTION>repeat</FUNCTION>
+ <FUNCTION>suite</FUNCTION>
+ <FUNCTION>testcase</FUNCTION>
+ <FUNCTION>unset</FUNCTION>
+ <FUNCTION>var</FUNCTION>
+
+ <!-- deprecated tasks -->
+ <INVALID>copydir</INVALID>
+ <INVALID>copyfile</INVALID>
+ <INVALID>deltree</INVALID>
+ <INVALID>execOn</INVALID>
+ <INVALID>javadoc2</INVALID>
+ <INVALID>rename</INVALID>
+ </KEYWORDS>
+ </RULES>
+ <!-- }}} -->
+
+ <!-- {{{ DTD-TAGS -->
+ <RULES SET="DTD-TAGS" DEFAULT="KEYWORD2" IGNORE_CASE="FALSE">
+ <!-- SGML comment -->
+ <SPAN TYPE="COMMENT1">
+ <BEGIN><!--</BEGIN>
+ <END>--></END>
+ </SPAN>
+
+ <!-- SGML comment -->
+ <SPAN TYPE="COMMENT1">
+ <BEGIN>--</BEGIN>
+ <END>--</END>
+ </SPAN>
+
+ <!-- Parameter entities -->
+ <SPAN TYPE="LITERAL2" NO_WORD_BREAK="TRUE">
+ <BEGIN>%</BEGIN>
+ <END>;</END>
+ </SPAN>
+
+ <SPAN TYPE="LITERAL1">
+ <BEGIN>"</BEGIN>
+ <END>"</END>
+ </SPAN>
+
+ <SPAN TYPE="LITERAL1">
+ <BEGIN>'</BEGIN>
+ <END>'</END>
+ </SPAN>
+
+ <!-- This appears in some SGML documents -->
+ <SPAN TYPE="KEYWORD2" DELEGATE="MAIN">
+ <BEGIN>[</BEGIN>
+ <END>]</END>
+ </SPAN>
+
+ <SEQ TYPE="OPERATOR">(</SEQ>
+ <SEQ TYPE="OPERATOR">)</SEQ>
+ <SEQ TYPE="OPERATOR">|</SEQ>
+ <SEQ TYPE="OPERATOR">?</SEQ>
+ <SEQ TYPE="OPERATOR">*</SEQ>
+ <SEQ TYPE="OPERATOR">+</SEQ>
+ <SEQ TYPE="OPERATOR">,</SEQ>
+
+ <KEYWORDS>
+ <KEYWORD1>CDATA</KEYWORD1>
+ <KEYWORD1>EMPTY</KEYWORD1>
+ <KEYWORD1>INCLUDE</KEYWORD1>
+ <KEYWORD1>IGNORE</KEYWORD1>
+ <KEYWORD1>NDATA</KEYWORD1>
+ <KEYWORD1>#IMPLIED</KEYWORD1>
+ <KEYWORD1>#PCDATA</KEYWORD1>
+ <KEYWORD1>#REQUIRED</KEYWORD1>
+ </KEYWORDS>
+ </RULES>
+ <!-- }}} -->
+
+ <!-- {{{ ENTITY-TAGS -->
+ <RULES SET="ENTITY-TAGS" DEFAULT="KEYWORD2">
+ <!-- SGML comment -->
+ <SPAN TYPE="COMMENT1">
+ <BEGIN><!--</BEGIN>
+ <END>--></END>
+ </SPAN>
+
+ <!-- SGML comment -->
+ <SPAN TYPE="COMMENT1">
+ <BEGIN>--</BEGIN>
+ <END>--</END>
+ </SPAN>
+
+ <SPAN TYPE="LITERAL1">
+ <BEGIN>"</BEGIN>
+ <END>"</END>
+ </SPAN>
+
+ <SPAN TYPE="LITERAL1">
+ <BEGIN>'</BEGIN>
+ <END>'</END>
+ </SPAN>
+
+ <SEQ TYPE="OPERATOR">=</SEQ>
+
+ <SEQ TYPE="OPERATOR">%</SEQ>
+
+ <KEYWORDS>
+ <KEYWORD1>SYSTEM</KEYWORD1>
+ </KEYWORDS>
+ </RULES>
+ <!-- }}} -->
+
+ <!-- {{{ CDATA -->
+ <RULES SET="CDATA" DEFAULT="COMMENT2">
+ <!-- no rules -->
+ </RULES>
+ <!-- }}} -->
+
+ <!-- {{{ STRING -->
+ <RULES SET="STRING" DEFAULT="LITERAL1">
+ <!-- ant property -->
+ <SPAN TYPE="KEYWORD3">
+ <BEGIN>${</BEGIN>
+ <END>}</END>
+ </SPAN>
+ <SEQ TYPE="NULL">\"</SEQ>
+ <SEQ TYPE="MARKUP" DELEGATE="TAGS">"</SEQ>
+
+ <SPAN TYPE="LITERAL2" NO_WORD_BREAK="TRUE">
+ <BEGIN>&</BEGIN>
+ <END>;</END>
+ </SPAN>
+ <KEYWORDS>
+ <LITERAL2>true</LITERAL2>
+ <LITERAL2>yes</LITERAL2>
+ <LITERAL2>false</LITERAL2>
+ </KEYWORDS>
+ </RULES>
+ <!-- }}} -->
+
+ <RULES SET="SQL" DEFAULT="MARKUP">
+ <SEQ TYPE="MARKUP" DELEGATE="MAIN">/></SEQ>
+ <!--
+ <SEQ TYPE="MARKUP" DELEGATE="MySQL::MAIN">></SEQ>
+ -->
+ <!-- handle <transaction src="..."> properly -->
+ <SEQ TYPE="MARKUP" DELEGATE="BACK_TO_XML"> </SEQ>
+ </RULES>
+
+ <RULES SET="BACK_TO_XML" DEFAULT="MARKUP">
+ <SEQ TYPE="MARKUP" DELEGATE="ant::TAGS">></SEQ>
+ </RULES>
+</MODE>
+
+
diff --git a/jEdit/modes/antlr.xml b/jEdit/modes/antlr.xml
index 5accf97..fbac355 100644
--- a/jEdit/modes/antlr.xml
+++ b/jEdit/modes/antlr.xml
@@ -1,102 +1,102 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE MODE SYSTEM "xmode.dtd">
-
-<!--
- This mode file describes the ANTLR syntax definition language.
- It is derived from and tested with the ANTLR syntax rules specified in
- antlr.g included with the ANTLR distribution.
-
- Portions of this file from java.xml.
-
- Author: Brant Gurganus <brantgurga at users.sourceforge.net>
--->
-<MODE>
- <PROPS>
- <PROPERTY NAME="commentStart" VALUE="/*" />
- <PROPERTY NAME="commentEnd" VALUE="*/" />
- <PROPERTY NAME="lineComment" VALUE="//" />
- <PROPERTY NAME="wordBreakChars" VALUE="" />
- </PROPS>
- <RULES>
- <SPAN TYPE="COMMENT2" DELEGATE="java::JAVADOC">
- <BEGIN>/**</BEGIN>
- <END>*/</END>
- </SPAN>
- <SPAN TYPE="COMMENT1">
- <BEGIN>/*</BEGIN>
- <END>*/</END>
- </SPAN>
- <EOL_SPAN TYPE="COMMENT1">//</EOL_SPAN>
- <SPAN TYPE="LITERAL1" ESCAPE="\">
- <BEGIN>"</BEGIN>
- <END>"</END>
- </SPAN>
- <SPAN TYPE="LITERAL1" ESCAPE="\">
- <BEGIN>'</BEGIN>
- <END>'</END>
- </SPAN>
- <SEQ TYPE="OPERATOR">|</SEQ>
- <SEQ TYPE="OPERATOR">:</SEQ>
- <KEYWORDS>
- <KEYWORD3>header</KEYWORD3>
- <KEYWORD3>options</KEYWORD3>
- <KEYWORD3>tokens</KEYWORD3>
- <KEYWORD1>abstract</KEYWORD1>
- <KEYWORD1>break</KEYWORD1>
- <KEYWORD1>case</KEYWORD1>
- <KEYWORD1>catch</KEYWORD1>
- <KEYWORD1>continue</KEYWORD1>
- <KEYWORD1>default</KEYWORD1>
- <KEYWORD1>do</KEYWORD1>
- <KEYWORD1>else</KEYWORD1>
- <KEYWORD1>extends</KEYWORD1>
- <KEYWORD1>final</KEYWORD1>
- <KEYWORD1>finally</KEYWORD1>
- <KEYWORD1>for</KEYWORD1>
- <KEYWORD1>if</KEYWORD1>
- <KEYWORD1>implements</KEYWORD1>
- <KEYWORD1>instanceof</KEYWORD1>
- <KEYWORD1>native</KEYWORD1>
- <KEYWORD1>new</KEYWORD1>
- <KEYWORD1>private</KEYWORD1>
- <KEYWORD1>protected</KEYWORD1>
- <KEYWORD1>public</KEYWORD1>
- <KEYWORD1>return</KEYWORD1>
- <KEYWORD1>static</KEYWORD1>
- <KEYWORD1>switch</KEYWORD1>
- <KEYWORD1>synchronized</KEYWORD1>
- <KEYWORD1>throw</KEYWORD1>
- <KEYWORD1>throws</KEYWORD1>
- <KEYWORD1>transient</KEYWORD1>
- <KEYWORD1>try</KEYWORD1>
- <KEYWORD1>volatile</KEYWORD1>
- <KEYWORD1>while</KEYWORD1>
- <KEYWORD1>package</KEYWORD1>
- <KEYWORD1>import</KEYWORD1>
-
- <KEYWORD2>boolean</KEYWORD2>
- <KEYWORD2>byte</KEYWORD2>
- <KEYWORD2>char</KEYWORD2>
- <KEYWORD2>class</KEYWORD2>
- <KEYWORD2>double</KEYWORD2>
- <KEYWORD2>float</KEYWORD2>
- <KEYWORD2>int</KEYWORD2>
- <KEYWORD2>interface</KEYWORD2>
- <KEYWORD2>long</KEYWORD2>
- <KEYWORD2>short</KEYWORD2>
- <KEYWORD2>void</KEYWORD2>
-
- <FUNCTION>assert</FUNCTION>
- <KEYWORD1>strictfp</KEYWORD1>
-
- <LITERAL2>false</LITERAL2>
- <LITERAL2>null</LITERAL2>
- <LITERAL2>super</LITERAL2>
- <LITERAL2>this</LITERAL2>
- <LITERAL2>true</LITERAL2>
-
- <INVALID>goto</INVALID>
- <INVALID>const</INVALID>
- </KEYWORDS>
- </RULES>
-</MODE>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE MODE SYSTEM "xmode.dtd">
+
+<!--
+ This mode file describes the ANTLR syntax definition language.
+ It is derived from and tested with the ANTLR syntax rules specified in
+ antlr.g included with the ANTLR distribution.
+
+ Portions of this file from java.xml.
+
+ Author: Brant Gurganus <brantgurga at users.sourceforge.net>
+-->
+<MODE>
+ <PROPS>
+ <PROPERTY NAME="commentStart" VALUE="/*" />
+ <PROPERTY NAME="commentEnd" VALUE="*/" />
+ <PROPERTY NAME="lineComment" VALUE="//" />
+ <PROPERTY NAME="wordBreakChars" VALUE="" />
+ </PROPS>
+ <RULES>
+ <SPAN TYPE="COMMENT2" DELEGATE="java::JAVADOC">
+ <BEGIN>/**</BEGIN>
+ <END>*/</END>
+ </SPAN>
+ <SPAN TYPE="COMMENT1">
+ <BEGIN>/*</BEGIN>
+ <END>*/</END>
+ </SPAN>
+ <EOL_SPAN TYPE="COMMENT1">//</EOL_SPAN>
+ <SPAN TYPE="LITERAL1" ESCAPE="\">
+ <BEGIN>"</BEGIN>
+ <END>"</END>
+ </SPAN>
+ <SPAN TYPE="LITERAL1" ESCAPE="\">
+ <BEGIN>'</BEGIN>
+ <END>'</END>
+ </SPAN>
+ <SEQ TYPE="OPERATOR">|</SEQ>
+ <SEQ TYPE="OPERATOR">:</SEQ>
+ <KEYWORDS>
+ <KEYWORD3>header</KEYWORD3>
+ <KEYWORD3>options</KEYWORD3>
+ <KEYWORD3>tokens</KEYWORD3>
+ <KEYWORD1>abstract</KEYWORD1>
+ <KEYWORD1>break</KEYWORD1>
+ <KEYWORD1>case</KEYWORD1>
+ <KEYWORD1>catch</KEYWORD1>
+ <KEYWORD1>continue</KEYWORD1>
+ <KEYWORD1>default</KEYWORD1>
+ <KEYWORD1>do</KEYWORD1>
+ <KEYWORD1>else</KEYWORD1>
+ <KEYWORD1>extends</KEYWORD1>
+ <KEYWORD1>final</KEYWORD1>
+ <KEYWORD1>finally</KEYWORD1>
+ <KEYWORD1>for</KEYWORD1>
+ <KEYWORD1>if</KEYWORD1>
+ <KEYWORD1>implements</KEYWORD1>
+ <KEYWORD1>instanceof</KEYWORD1>
+ <KEYWORD1>native</KEYWORD1>
+ <KEYWORD1>new</KEYWORD1>
+ <KEYWORD1>private</KEYWORD1>
+ <KEYWORD1>protected</KEYWORD1>
+ <KEYWORD1>public</KEYWORD1>
+ <KEYWORD1>return</KEYWORD1>
+ <KEYWORD1>static</KEYWORD1>
+ <KEYWORD1>switch</KEYWORD1>
+ <KEYWORD1>synchronized</KEYWORD1>
+ <KEYWORD1>throw</KEYWORD1>
+ <KEYWORD1>throws</KEYWORD1>
+ <KEYWORD1>transient</KEYWORD1>
+ <KEYWORD1>try</KEYWORD1>
+ <KEYWORD1>volatile</KEYWORD1>
+ <KEYWORD1>while</KEYWORD1>
+ <KEYWORD1>package</KEYWORD1>
+ <KEYWORD1>import</KEYWORD1>
+
+ <KEYWORD2>boolean</KEYWORD2>
+ <KEYWORD2>byte</KEYWORD2>
+ <KEYWORD2>char</KEYWORD2>
+ <KEYWORD2>class</KEYWORD2>
+ <KEYWORD2>double</KEYWORD2>
+ <KEYWORD2>float</KEYWORD2>
+ <KEYWORD2>int</KEYWORD2>
+ <KEYWORD2>interface</KEYWORD2>
+ <KEYWORD2>long</KEYWORD2>
+ <KEYWORD2>short</KEYWORD2>
+ <KEYWORD2>void</KEYWORD2>
+
+ <FUNCTION>assert</FUNCTION>
+ <KEYWORD1>strictfp</KEYWORD1>
+
+ <LITERAL2>false</LITERAL2>
+ <LITERAL2>null</LITERAL2>
+ <LITERAL2>super</LITERAL2>
+ <LITERAL2>this</LITERAL2>
+ <LITERAL2>true</LITERAL2>
+
+ <INVALID>goto</INVALID>
+ <INVALID>const</INVALID>
+ </KEYWORDS>
+ </RULES>
+</MODE>
diff --git a/jEdit/modes/apacheconf.xml b/jEdit/modes/apacheconf.xml
index e7bfdfe..290c170 100644
--- a/jEdit/modes/apacheconf.xml
+++ b/jEdit/modes/apacheconf.xml
@@ -1,1007 +1,1007 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE MODE SYSTEM "xmode.dtd">
-
-<MODE>
- <PROPS>
- <PROPERTY NAME="lineComment" VALUE="#" />
- <PROPERTY NAME="noWordSep" VALUE="-" />
- </PROPS>
- <RULES HIGHLIGHT_DIGITS="FALSE" IGNORE_CASE="TRUE">
-
- <EOL_SPAN TYPE="COMMENT1">#</EOL_SPAN>
-
- <SPAN TYPE="LITERAL1" ESCAPE="\" NO_LINE_BREAK="TRUE">
- <BEGIN>"</BEGIN>
- <END>"</END>
- </SPAN>
-
- <SPAN_REGEXP HASH_CHAR="<VirtualHost" TYPE="MARKUP" DELEGATE="VHOST">
- <BEGIN><![CDATA[<(VirtualHost)[^>]*>]]></BEGIN>
- <END><![CDATA[</$1>]]></END>
- </SPAN_REGEXP>
-
- <SPAN_REGEXP HASH_CHAR="<" TYPE="MARKUP" DELEGATE="DIRECTIVE">
- <BEGIN><![CDATA[<(\w+)[^>]*>]]></BEGIN>
- <END><![CDATA[</$1>]]></END>
- </SPAN_REGEXP>
-
- <KEYWORDS>
- <KEYWORD1>AcceptMutex</KEYWORD1>
- <KEYWORD1>AcceptPathInfo</KEYWORD1>
- <KEYWORD1>AccessFileName</KEYWORD1>
- <KEYWORD1>Action</KEYWORD1>
- <KEYWORD1>AddAlt</KEYWORD1>
- <KEYWORD1>AddAltByEncoding</KEYWORD1>
- <KEYWORD1>AddAltByType</KEYWORD1>
- <KEYWORD1>AddCharset</KEYWORD1>
- <KEYWORD1>AddDefaultCharset</KEYWORD1>
- <KEYWORD1>AddDescription</KEYWORD1>
- <KEYWORD1>AddEncoding</KEYWORD1>
- <KEYWORD1>AddHandler</KEYWORD1>
- <KEYWORD1>AddIcon</KEYWORD1>
- <KEYWORD1>AddIconByEncoding</KEYWORD1>
- <KEYWORD1>AddIconByType</KEYWORD1>
- <KEYWORD1>AddInputFilter</KEYWORD1>
- <KEYWORD1>AddLanguage</KEYWORD1>
- <KEYWORD1>AddModuleInfo</KEYWORD1>
- <KEYWORD1>AddOutputFilter</KEYWORD1>
- <KEYWORD1>AddOutputFilterByType</KEYWORD1>
- <KEYWORD1>AddType</KEYWORD1>
- <KEYWORD1>Alias</KEYWORD1>
- <KEYWORD1>AliasMatch</KEYWORD1>
- <KEYWORD1>AllowCONNECT</KEYWORD1>
- <KEYWORD1>AllowEncodedSlashes</KEYWORD1>
- <KEYWORD1>AuthDigestNcCheck</KEYWORD1>
- <KEYWORD1>AuthDigestShmemSize</KEYWORD1>
- <KEYWORD1>AuthLDAPCharsetConfig</KEYWORD1>
- <KEYWORD1>BS2000Account</KEYWORD1>
- <KEYWORD1>BrowserMatch</KEYWORD1>
- <KEYWORD1>BrowserMatchNoCase</KEYWORD1>
- <KEYWORD1>CacheDefaultExpire</KEYWORD1>
- <KEYWORD1>CacheDirLength</KEYWORD1>
- <KEYWORD1>CacheDirLevels</KEYWORD1>
- <KEYWORD1>CacheDisable</KEYWORD1>
- <KEYWORD1>CacheEnable</KEYWORD1>
- <KEYWORD1>CacheExpiryCheck</KEYWORD1>
- <KEYWORD1>CacheFile</KEYWORD1>
- <KEYWORD1>CacheForceCompletion</KEYWORD1>
- <KEYWORD1>CacheGcClean</KEYWORD1>
- <KEYWORD1>CacheGcDaily</KEYWORD1>
- <KEYWORD1>CacheGcInterval</KEYWORD1>
- <KEYWORD1>CacheGcMemUsage</KEYWORD1>
- <KEYWORD1>CacheGcUnused</KEYWORD1>
- <KEYWORD1>CacheIgnoreCacheControl</KEYWORD1>
- <KEYWORD1>CacheIgnoreNoLastMod</KEYWORD1>
- <KEYWORD1>CacheLastModifiedFactor</KEYWORD1>
- <KEYWORD1>CacheMaxExpire</KEYWORD1>
- <KEYWORD1>CacheMaxFileSize</KEYWORD1>
- <KEYWORD1>CacheMinFileSize</KEYWORD1>
- <KEYWORD1>CacheNegotiatedDocs</KEYWORD1>
- <KEYWORD1>CacheRoot</KEYWORD1>
- <KEYWORD1>CacheSize</KEYWORD1>
- <KEYWORD1>CacheTimeMargin</KEYWORD1>
- <KEYWORD1>CharsetDefault</KEYWORD1>
- <KEYWORD1>CharsetOptions</KEYWORD1>
- <KEYWORD1>CharsetSourceEnc</KEYWORD1>
- <KEYWORD1>CheckSpelling</KEYWORD1>
- <KEYWORD1>ChildPerUserID</KEYWORD1>
- <KEYWORD1>ContentDigest</KEYWORD1>
- <KEYWORD1>CookieDomain</KEYWORD1>
- <KEYWORD1>CookieExpires</KEYWORD1>
- <KEYWORD1>CookieLog</KEYWORD1>
- <KEYWORD1>CookieName</KEYWORD1>
- <KEYWORD1>CookieStyle</KEYWORD1>
- <KEYWORD1>CookieTracking</KEYWORD1>
- <KEYWORD1>CoreDumpDirectory</KEYWORD1>
- <KEYWORD1>CustomLog</KEYWORD1>
- <KEYWORD1>DavDepthInfinity</KEYWORD1>
- <KEYWORD1>DavLockDB</KEYWORD1>
- <KEYWORD1>DavMinTimeout</KEYWORD1>
- <KEYWORD1>DefaultIcon</KEYWORD1>
- <KEYWORD1>DefaultLanguage</KEYWORD1>
- <KEYWORD1>DefaultType</KEYWORD1>
- <KEYWORD1>DeflateBufferSize</KEYWORD1>
- <KEYWORD1>DeflateCompressionLevel</KEYWORD1>
- <KEYWORD1>DeflateFilterNote</KEYWORD1>
- <KEYWORD1>DeflateMemLevel</KEYWORD1>
- <KEYWORD1>DeflateWindowSize</KEYWORD1>
- <KEYWORD1>DirectoryIndex</KEYWORD1>
- <KEYWORD1>DirectorySlash</KEYWORD1>
- <KEYWORD1>DocumentRoot</KEYWORD1>
- <KEYWORD1>EnableExceptionHook</KEYWORD1>
- <KEYWORD1>EnableMMAP</KEYWORD1>
- <KEYWORD1>EnableSendfile</KEYWORD1>
- <KEYWORD1>ErrorDocument</KEYWORD1>
- <KEYWORD1>ErrorLog</KEYWORD1>
- <KEYWORD1>Example</KEYWORD1>
- <KEYWORD1>ExpiresActive</KEYWORD1>
- <KEYWORD1>ExpiresByType</KEYWORD1>
- <KEYWORD1>ExpiresDefault</KEYWORD1>
- <KEYWORD1>ExtFilterDefine</KEYWORD1>
- <KEYWORD1>ExtendedStatus</KEYWORD1>
- <KEYWORD1>FileETag</KEYWORD1>
- <KEYWORD1>ForceLanguagePriority</KEYWORD1>
- <KEYWORD1>ForensicLog</KEYWORD1>
- <KEYWORD1>Group</KEYWORD1>
- <KEYWORD1>Header</KEYWORD1>
- <KEYWORD1>HeaderName</KEYWORD1>
- <KEYWORD1>HostnameLookups</KEYWORD1>
- <KEYWORD1>ISAPIAppendLogToErrors</KEYWORD1>
- <KEYWORD1>ISAPIAppendLogToQuery</KEYWORD1>
- <KEYWORD1>ISAPICacheFile</KEYWORD1>
- <KEYWORD1>ISAPIFakeAsync</KEYWORD1>
- <KEYWORD1>ISAPILogNotSupported</KEYWORD1>
- <KEYWORD1>ISAPIReadAheadBuffer</KEYWORD1>
- <KEYWORD1>IdentityCheck</KEYWORD1>
- <KEYWORD1>ImapBase</KEYWORD1>
- <KEYWORD1>ImapDefault</KEYWORD1>
- <KEYWORD1>ImapMenu</KEYWORD1>
- <KEYWORD1>Include</KEYWORD1>
- <KEYWORD1>IndexIgnore</KEYWORD1>
- <KEYWORD1>IndexOptions</KEYWORD1>
- <KEYWORD1>IndexOrderDefault</KEYWORD1>
- <KEYWORD1>KeepAlive</KEYWORD1>
- <KEYWORD1>KeepAliveTimeout</KEYWORD1>
- <KEYWORD1>LDAPCacheEntries</KEYWORD1>
- <KEYWORD1>LDAPCacheTTL</KEYWORD1>
- <KEYWORD1>LDAPOpCacheEntries</KEYWORD1>
- <KEYWORD1>LDAPOpCacheTTL</KEYWORD1>
- <KEYWORD1>LDAPSharedCacheFile</KEYWORD1>
- <KEYWORD1>LDAPSharedCacheSize</KEYWORD1>
- <KEYWORD1>LDAPTrustedCA</KEYWORD1>
- <KEYWORD1>LDAPTrustedCAType</KEYWORD1>
- <KEYWORD1>LanguagePriority</KEYWORD1>
- <KEYWORD1>LimitInternalRecursion</KEYWORD1>
- <KEYWORD1>LimitRequestBody</KEYWORD1>
- <KEYWORD1>LimitRequestFields</KEYWORD1>
- <KEYWORD1>LimitRequestFieldsize</KEYWORD1>
- <KEYWORD1>LimitRequestLine</KEYWORD1>
- <KEYWORD1>LimitXMLRequestBody</KEYWORD1>
- <KEYWORD1>Listen</KEYWORD1>
- <KEYWORD1>ListenBacklog</KEYWORD1>
- <KEYWORD1>LoadFile</KEYWORD1>
- <KEYWORD1>LoadModule</KEYWORD1>
- <KEYWORD1>LockFile</KEYWORD1>
- <KEYWORD1>LogFormat</KEYWORD1>
- <KEYWORD1>LogLevel</KEYWORD1>
- <KEYWORD1>MCacheMaxObjectCount</KEYWORD1>
- <KEYWORD1>MCacheMaxObjectSize</KEYWORD1>
- <KEYWORD1>MCacheMaxStreamingBuffer</KEYWORD1>
- <KEYWORD1>MCacheMinObjectSize</KEYWORD1>
- <KEYWORD1>MCacheRemovalAlgorithm</KEYWORD1>
- <KEYWORD1>MCacheSize</KEYWORD1>
- <KEYWORD1>MMapFile</KEYWORD1>
- <KEYWORD1>MaxClients</KEYWORD1>
- <KEYWORD1>MaxKeepAliveRequests</KEYWORD1>
- <KEYWORD1>MaxMemFree</KEYWORD1>
- <KEYWORD1>MaxRequestsPerChild</KEYWORD1>
- <KEYWORD1>MaxRequestsPerThread</KEYWORD1>
- <KEYWORD1>MaxSpareServers</KEYWORD1>
- <KEYWORD1>MaxSpareThreads</KEYWORD1>
- <KEYWORD1>MaxThreads</KEYWORD1>
- <KEYWORD1>MaxThreadsPerChild</KEYWORD1>
- <KEYWORD1>MetaDir</KEYWORD1>
- <KEYWORD1>MetaFiles</KEYWORD1>
- <KEYWORD1>MetaSuffix</KEYWORD1>
- <KEYWORD1>MimeMagicFile</KEYWORD1>
- <KEYWORD1>MinSpareServers</KEYWORD1>
- <KEYWORD1>MinSpareThreads</KEYWORD1>
- <KEYWORD1>MultiviewsMatch</KEYWORD1>
- <KEYWORD1>NWSSLTrustedCerts</KEYWORD1>
- <KEYWORD1>NWSSLUpgradeable</KEYWORD1>
- <KEYWORD1>NameVirtualHost</KEYWORD1>
- <KEYWORD1>NoProxy</KEYWORD1>
- <KEYWORD1>NumServers</KEYWORD1>
- <KEYWORD1>Options</KEYWORD1>
- <KEYWORD1>PassEnv</KEYWORD1>
- <KEYWORD1>PidFile</KEYWORD1>
- <KEYWORD1>ProtocolEcho</KEYWORD1>
- <KEYWORD1>ProxyBadHeader</KEYWORD1>
- <KEYWORD1>ProxyBlock</KEYWORD1>
- <KEYWORD1>ProxyDomain</KEYWORD1>
- <KEYWORD1>ProxyErrorOverride</KEYWORD1>
- <KEYWORD1>ProxyIOBufferSize</KEYWORD1>
- <KEYWORD1>ProxyMaxForwards</KEYWORD1>
- <KEYWORD1>ProxyPass</KEYWORD1>
- <KEYWORD1>ProxyPassReverse</KEYWORD1>
- <KEYWORD1>ProxyPreserveHost</KEYWORD1>
- <KEYWORD1>ProxyReceiveBufferSize</KEYWORD1>
- <KEYWORD1>ProxyRemote</KEYWORD1>
- <KEYWORD1>ProxyRemoteMatch</KEYWORD1>
- <KEYWORD1>ProxyRequests</KEYWORD1>
- <KEYWORD1>ProxyTimeout</KEYWORD1>
- <KEYWORD1>ProxyVia</KEYWORD1>
- <KEYWORD1>RLimitCPU</KEYWORD1>
- <KEYWORD1>RLimitMEM</KEYWORD1>
- <KEYWORD1>RLimitNPROC</KEYWORD1>
- <KEYWORD1>ReadmeName</KEYWORD1>
- <KEYWORD1>Redirect</KEYWORD1>
- <KEYWORD1>RedirectMatch</KEYWORD1>
- <KEYWORD1>RedirectPermanent</KEYWORD1>
- <KEYWORD1>RedirectTemp</KEYWORD1>
- <KEYWORD1>RequestHeader</KEYWORD1>
- <KEYWORD1>RewriteBase</KEYWORD1>
- <KEYWORD1>RewriteCond</KEYWORD1>
- <KEYWORD1>RewriteEngine</KEYWORD1>
- <KEYWORD1>RewriteLock</KEYWORD1>
- <KEYWORD1>RewriteLog</KEYWORD1>
- <KEYWORD1>RewriteLogLevel</KEYWORD1>
- <KEYWORD1>RewriteMap</KEYWORD1>
- <KEYWORD1>RewriteOptions</KEYWORD1>
- <KEYWORD1>RewriteRule</KEYWORD1>
- <KEYWORD1>SSIEndTag</KEYWORD1>
- <KEYWORD1>SSIErrorMsg</KEYWORD1>
- <KEYWORD1>SSIStartTag</KEYWORD1>
- <KEYWORD1>SSITimeFormat</KEYWORD1>
- <KEYWORD1>SSIUndefinedEcho</KEYWORD1>
- <KEYWORD1>SSLCACertificateFile</KEYWORD1>
- <KEYWORD1>SSLCACertificatePath</KEYWORD1>
- <KEYWORD1>SSLCARevocationFile</KEYWORD1>
- <KEYWORD1>SSLCARevocationPath</KEYWORD1>
- <KEYWORD1>SSLCertificateChainFile</KEYWORD1>
- <KEYWORD1>SSLCertificateFile</KEYWORD1>
- <KEYWORD1>SSLCertificateKeyFile</KEYWORD1>
- <KEYWORD1>SSLCipherSuite</KEYWORD1>
- <KEYWORD1>SSLEngine</KEYWORD1>
- <KEYWORD1>SSLMutex</KEYWORD1>
- <KEYWORD1>SSLOptions</KEYWORD1>
- <KEYWORD1>SSLPassPhraseDialog</KEYWORD1>
- <KEYWORD1>SSLProtocol</KEYWORD1>
- <KEYWORD1>SSLProxyCACertificateFile</KEYWORD1>
- <KEYWORD1>SSLProxyCACertificatePath</KEYWORD1>
- <KEYWORD1>SSLProxyCARevocationFile</KEYWORD1>
- <KEYWORD1>SSLProxyCARevocationPath</KEYWORD1>
- <KEYWORD1>SSLProxyCipherSuite</KEYWORD1>
- <KEYWORD1>SSLProxyEngine</KEYWORD1>
- <KEYWORD1>SSLProxyMachineCertificateFile</KEYWORD1>
- <KEYWORD1>SSLProxyMachineCertificatePath</KEYWORD1>
- <KEYWORD1>SSLProxyProtocol</KEYWORD1>
- <KEYWORD1>SSLProxyVerify</KEYWORD1>
- <KEYWORD1>SSLProxyVerifyDepth</KEYWORD1>
- <KEYWORD1>SSLRandomSeed</KEYWORD1>
- <KEYWORD1>SSLSessionCache</KEYWORD1>
- <KEYWORD1>SSLSessionCacheTimeout</KEYWORD1>
- <KEYWORD1>SSLVerifyClient</KEYWORD1>
- <KEYWORD1>SSLVerifyDepth</KEYWORD1>
- <KEYWORD1>ScoreBoardFile</KEYWORD1>
- <KEYWORD1>Script</KEYWORD1>
- <KEYWORD1>ScriptAlias</KEYWORD1>
- <KEYWORD1>ScriptAliasMatch</KEYWORD1>
- <KEYWORD1>ScriptInterpreterSource</KEYWORD1>
- <KEYWORD1>ScriptLog</KEYWORD1>
- <KEYWORD1>ScriptLogBuffer</KEYWORD1>
- <KEYWORD1>ScriptLogLength</KEYWORD1>
- <KEYWORD1>ScriptSock</KEYWORD1>
- <KEYWORD1>SecureListen</KEYWORD1>
- <KEYWORD1>SendBufferSize</KEYWORD1>
- <KEYWORD1>ServerAdmin</KEYWORD1>
- <KEYWORD1>ServerLimit</KEYWORD1>
- <KEYWORD1>ServerName</KEYWORD1>
- <KEYWORD1>ServerRoot</KEYWORD1>
- <KEYWORD1>ServerSignature</KEYWORD1>
- <KEYWORD1>ServerTokens</KEYWORD1>
- <KEYWORD1>SetEnv</KEYWORD1>
- <KEYWORD1>SetEnvIf</KEYWORD1>
- <KEYWORD1>SetEnvIfNoCase</KEYWORD1>
- <KEYWORD1>SetHandler</KEYWORD1>
- <KEYWORD1>SetInputFilter</KEYWORD1>
- <KEYWORD1>SetOutputFilter</KEYWORD1>
- <KEYWORD1>StartServers</KEYWORD1>
- <KEYWORD1>StartThreads</KEYWORD1>
- <KEYWORD1>SuexecUserGroup</KEYWORD1>
- <KEYWORD1>ThreadLimit</KEYWORD1>
- <KEYWORD1>ThreadStackSize</KEYWORD1>
- <KEYWORD1>ThreadsPerChild</KEYWORD1>
- <KEYWORD1>TimeOut</KEYWORD1>
- <KEYWORD1>TransferLog</KEYWORD1>
- <KEYWORD1>TypesConfig</KEYWORD1>
- <KEYWORD1>UnsetEnv</KEYWORD1>
- <KEYWORD1>UseCanonicalName</KEYWORD1>
- <KEYWORD1>User</KEYWORD1>
- <KEYWORD1>UserDir</KEYWORD1>
- <KEYWORD1>VirtualDocumentRoot</KEYWORD1>
- <KEYWORD1>VirtualDocumentRootIP</KEYWORD1>
- <KEYWORD1>VirtualScriptAlias</KEYWORD1>
- <KEYWORD1>VirtualScriptAliasIP</KEYWORD1>
- <KEYWORD1>Win32DisableAcceptEx</KEYWORD1>
- <KEYWORD1>XBitHack</KEYWORD1>
-
- <!-- Apache 1.x -->
- <KEYWORD4>AddModule</KEYWORD4>
- <KEYWORD4>ClearModuleList</KEYWORD4>
- <KEYWORD4>ServerType</KEYWORD4>
- <KEYWORD4>Port</KEYWORD4>
-
- <LITERAL2>Off</LITERAL2>
- <LITERAL2>On</LITERAL2>
- <LITERAL2>None</LITERAL2>
- </KEYWORDS>
- </RULES>
-
- <RULES SET="DIRECTIVE" DEFAULT="NULL" IGNORE_CASE="TRUE">
-
- <EOL_SPAN TYPE="COMMENT2">#</EOL_SPAN>
-
- <SPAN TYPE="LITERAL1" ESCAPE="\" NO_LINE_BREAK="TRUE">
- <BEGIN>"</BEGIN>
- <END>"</END>
- </SPAN>
-
- <SPAN_REGEXP HASH_CHAR="<VirtualHost" TYPE="MARKUP" DELEGATE="VHOST">
- <BEGIN><![CDATA[<(VirtualHost)[^>]*>]]></BEGIN>
- <END><![CDATA[</$1>]]></END>
- </SPAN_REGEXP>
-
- <SPAN_REGEXP HASH_CHAR="<" TYPE="MARKUP" DELEGATE="DIRECTIVE">
- <BEGIN><![CDATA[<(\w+)[^>]*>]]></BEGIN>
- <END><![CDATA[</$1>]]></END>
- </SPAN_REGEXP>
-
- <KEYWORDS>
-
- <KEYWORD2>AcceptMutex</KEYWORD2>
- <KEYWORD2>AcceptPathInfo</KEYWORD2>
- <KEYWORD2>AccessFileName</KEYWORD2>
- <KEYWORD2>Action</KEYWORD2>
- <KEYWORD2>AddAlt</KEYWORD2>
- <KEYWORD2>AddAltByEncoding</KEYWORD2>
- <KEYWORD2>AddAltByType</KEYWORD2>
- <KEYWORD2>AddCharset</KEYWORD2>
- <KEYWORD2>AddDefaultCharset</KEYWORD2>
- <KEYWORD2>AddDescription</KEYWORD2>
- <KEYWORD2>AddEncoding</KEYWORD2>
- <KEYWORD2>AddHandler</KEYWORD2>
- <KEYWORD2>AddIcon</KEYWORD2>
- <KEYWORD2>AddIconByEncoding</KEYWORD2>
- <KEYWORD2>AddIconByType</KEYWORD2>
- <KEYWORD2>AddInputFilter</KEYWORD2>
- <KEYWORD2>AddLanguage</KEYWORD2>
- <KEYWORD2>AddModuleInfo</KEYWORD2>
- <KEYWORD2>AddOutputFilter</KEYWORD2>
- <KEYWORD2>AddOutputFilterByType</KEYWORD2>
- <KEYWORD2>AddType</KEYWORD2>
- <KEYWORD2>Alias</KEYWORD2>
- <KEYWORD2>AliasMatch</KEYWORD2>
- <KEYWORD2>Allow</KEYWORD2>
- <KEYWORD2>AllowCONNECT</KEYWORD2>
- <KEYWORD2>AllowEncodedSlashes</KEYWORD2>
- <KEYWORD2>AllowOverride</KEYWORD2>
- <KEYWORD2>Anonymous</KEYWORD2>
- <KEYWORD2>Anonymous_Authoritative</KEYWORD2>
- <KEYWORD2>Anonymous_LogEmail</KEYWORD2>
- <KEYWORD2>Anonymous_MustGiveEmail</KEYWORD2>
- <KEYWORD2>Anonymous_NoUserID</KEYWORD2>
- <KEYWORD2>Anonymous_VerifyEmail</KEYWORD2>
- <KEYWORD2>AuthAuthoritative</KEYWORD2>
- <KEYWORD2>AuthDBMAuthoritative</KEYWORD2>
- <KEYWORD2>AuthDBMGroupFile</KEYWORD2>
- <KEYWORD2>AuthDBMType</KEYWORD2>
- <KEYWORD2>AuthDBMUserFile</KEYWORD2>
- <KEYWORD2>AuthDigestAlgorithm</KEYWORD2>
- <KEYWORD2>AuthDigestDomain</KEYWORD2>
- <KEYWORD2>AuthDigestFile</KEYWORD2>
- <KEYWORD2>AuthDigestGroupFile</KEYWORD2>
- <KEYWORD2>AuthDigestNcCheck</KEYWORD2>
- <KEYWORD2>AuthDigestNonceFormat</KEYWORD2>
- <KEYWORD2>AuthDigestNonceLifetime</KEYWORD2>
- <KEYWORD2>AuthDigestQop</KEYWORD2>
- <KEYWORD2>AuthDigestShmemSize</KEYWORD2>
- <KEYWORD2>AuthGroupFile</KEYWORD2>
- <KEYWORD2>AuthLDAPAuthoritative</KEYWORD2>
- <KEYWORD2>AuthLDAPBindDN</KEYWORD2>
- <KEYWORD2>AuthLDAPBindPassword</KEYWORD2>
- <KEYWORD2>AuthLDAPCharsetConfig</KEYWORD2>
- <KEYWORD2>AuthLDAPCompareDNOnServer</KEYWORD2>
- <KEYWORD2>AuthLDAPDereferenceAliases</KEYWORD2>
- <KEYWORD2>AuthLDAPEnabled</KEYWORD2>
- <KEYWORD2>AuthLDAPFrontPageHack</KEYWORD2>
- <KEYWORD2>AuthLDAPGroupAttribute</KEYWORD2>
- <KEYWORD2>AuthLDAPGroupAttributeIsDN</KEYWORD2>
- <KEYWORD2>AuthLDAPRemoteUserIsDN</KEYWORD2>
- <KEYWORD2>AuthLDAPUrl</KEYWORD2>
- <KEYWORD2>AuthName</KEYWORD2>
- <KEYWORD2>AuthType</KEYWORD2>
- <KEYWORD2>AuthUserFile</KEYWORD2>
- <KEYWORD2>BS2000Account</KEYWORD2>
- <KEYWORD2>BrowserMatch</KEYWORD2>
- <KEYWORD2>BrowserMatchNoCase</KEYWORD2>
- <KEYWORD2>CGIMapExtension</KEYWORD2>
- <KEYWORD2>CacheDefaultExpire</KEYWORD2>
- <KEYWORD2>CacheDirLength</KEYWORD2>
- <KEYWORD2>CacheDirLevels</KEYWORD2>
- <KEYWORD2>CacheDisable</KEYWORD2>
- <KEYWORD2>CacheEnable</KEYWORD2>
- <KEYWORD2>CacheExpiryCheck</KEYWORD2>
- <KEYWORD2>CacheFile</KEYWORD2>
- <KEYWORD2>CacheForceCompletion</KEYWORD2>
- <KEYWORD2>CacheGcClean</KEYWORD2>
- <KEYWORD2>CacheGcDaily</KEYWORD2>
- <KEYWORD2>CacheGcInterval</KEYWORD2>
- <KEYWORD2>CacheGcMemUsage</KEYWORD2>
- <KEYWORD2>CacheGcUnused</KEYWORD2>
- <KEYWORD2>CacheIgnoreCacheControl</KEYWORD2>
- <KEYWORD2>CacheIgnoreNoLastMod</KEYWORD2>
- <KEYWORD2>CacheLastModifiedFactor</KEYWORD2>
- <KEYWORD2>CacheMaxExpire</KEYWORD2>
- <KEYWORD2>CacheMaxFileSize</KEYWORD2>
- <KEYWORD2>CacheMinFileSize</KEYWORD2>
- <KEYWORD2>CacheNegotiatedDocs</KEYWORD2>
- <KEYWORD2>CacheRoot</KEYWORD2>
- <KEYWORD2>CacheSize</KEYWORD2>
- <KEYWORD2>CacheTimeMargin</KEYWORD2>
- <KEYWORD2>CharsetDefault</KEYWORD2>
- <KEYWORD2>CharsetOptions</KEYWORD2>
- <KEYWORD2>CharsetSourceEnc</KEYWORD2>
- <KEYWORD2>CheckSpelling</KEYWORD2>
- <KEYWORD2>ChildPerUserID</KEYWORD2>
- <KEYWORD2>ContentDigest</KEYWORD2>
- <KEYWORD2>CookieDomain</KEYWORD2>
- <KEYWORD2>CookieExpires</KEYWORD2>
- <KEYWORD2>CookieLog</KEYWORD2>
- <KEYWORD2>CookieName</KEYWORD2>
- <KEYWORD2>CookieStyle</KEYWORD2>
- <KEYWORD2>CookieTracking</KEYWORD2>
- <KEYWORD2>CoreDumpDirectory</KEYWORD2>
- <KEYWORD2>CustomLog</KEYWORD2>
- <KEYWORD2>Dav</KEYWORD2>
- <KEYWORD2>DavDepthInfinity</KEYWORD2>
- <KEYWORD2>DavLockDB</KEYWORD2>
- <KEYWORD2>DavMinTimeout</KEYWORD2>
- <KEYWORD2>DefaultIcon</KEYWORD2>
- <KEYWORD2>DefaultLanguage</KEYWORD2>
- <KEYWORD2>DefaultType</KEYWORD2>
- <KEYWORD2>DeflateBufferSize</KEYWORD2>
- <KEYWORD2>DeflateCompressionLevel</KEYWORD2>
- <KEYWORD2>DeflateFilterNote</KEYWORD2>
- <KEYWORD2>DeflateMemLevel</KEYWORD2>
- <KEYWORD2>DeflateWindowSize</KEYWORD2>
- <KEYWORD2>Deny</KEYWORD2>
- <KEYWORD2>DirectoryIndex</KEYWORD2>
- <KEYWORD1>DirectorySlash</KEYWORD1>
- <KEYWORD2>DocumentRoot</KEYWORD2>
- <KEYWORD2>EnableMMAP</KEYWORD2>
- <KEYWORD2>EnableSendfile</KEYWORD2>
- <KEYWORD2>ErrorDocument</KEYWORD2>
- <KEYWORD2>ErrorLog</KEYWORD2>
- <KEYWORD2>Example</KEYWORD2>
- <KEYWORD2>ExpiresActive</KEYWORD2>
- <KEYWORD2>ExpiresByType</KEYWORD2>
- <KEYWORD2>ExpiresDefault</KEYWORD2>
- <KEYWORD2>ExtFilterDefine</KEYWORD2>
- <KEYWORD2>ExtFilterOptions</KEYWORD2>
- <KEYWORD2>ExtendedStatus</KEYWORD2>
- <KEYWORD2>FileETag</KEYWORD2>
- <KEYWORD2>ForceLanguagePriority</KEYWORD2>
- <KEYWORD2>ForceType</KEYWORD2>
- <KEYWORD2>Group</KEYWORD2>
- <KEYWORD2>Header</KEYWORD2>
- <KEYWORD2>HeaderName</KEYWORD2>
- <KEYWORD2>HostnameLookups</KEYWORD2>
- <KEYWORD2>ISAPIAppendLogToErrors</KEYWORD2>
- <KEYWORD2>ISAPIAppendLogToQuery</KEYWORD2>
- <KEYWORD2>ISAPICacheFile</KEYWORD2>
- <KEYWORD2>ISAPIFakeAsync</KEYWORD2>
- <KEYWORD2>ISAPILogNotSupported</KEYWORD2>
- <KEYWORD2>ISAPIReadAheadBuffer</KEYWORD2>
- <KEYWORD2>IdentityCheck</KEYWORD2>
- <KEYWORD2>ImapBase</KEYWORD2>
- <KEYWORD2>ImapDefault</KEYWORD2>
- <KEYWORD2>ImapMenu</KEYWORD2>
- <KEYWORD2>Include</KEYWORD2>
- <KEYWORD2>IndexIgnore</KEYWORD2>
- <KEYWORD2>IndexOptions</KEYWORD2>
- <KEYWORD2>IndexOrderDefault</KEYWORD2>
- <KEYWORD2>KeepAlive</KEYWORD2>
- <KEYWORD2>KeepAliveTimeout</KEYWORD2>
- <KEYWORD2>LDAPCacheEntries</KEYWORD2>
- <KEYWORD2>LDAPCacheTTL</KEYWORD2>
- <KEYWORD2>LDAPOpCacheEntries</KEYWORD2>
- <KEYWORD2>LDAPOpCacheTTL</KEYWORD2>
- <KEYWORD2>LDAPSharedCacheSize</KEYWORD2>
- <KEYWORD2>LDAPTrustedCA</KEYWORD2>
- <KEYWORD2>LDAPTrustedCAType</KEYWORD2>
- <KEYWORD2>LanguagePriority</KEYWORD2>
- <KEYWORD2>LimitInternalRecursion</KEYWORD2>
- <KEYWORD2>LimitRequestBody</KEYWORD2>
- <KEYWORD2>LimitRequestFields</KEYWORD2>
- <KEYWORD2>LimitRequestFieldsize</KEYWORD2>
- <KEYWORD2>LimitRequestLine</KEYWORD2>
- <KEYWORD2>LimitXMLRequestBody</KEYWORD2>
- <KEYWORD2>Listen</KEYWORD2>
- <KEYWORD2>ListenBacklog</KEYWORD2>
- <KEYWORD2>LoadFile</KEYWORD2>
- <KEYWORD2>LoadModule</KEYWORD2>
- <KEYWORD2>LockFile</KEYWORD2>
- <KEYWORD2>LogFormat</KEYWORD2>
- <KEYWORD2>LogLevel</KEYWORD2>
- <KEYWORD2>MCacheMaxObjectCount</KEYWORD2>
- <KEYWORD2>MCacheMaxObjectSize</KEYWORD2>
- <KEYWORD2>MCacheMaxStreamingBuffer</KEYWORD2>
- <KEYWORD2>MCacheMinObjectSize</KEYWORD2>
- <KEYWORD2>MCacheRemovalAlgorithm</KEYWORD2>
- <KEYWORD2>MCacheSize</KEYWORD2>
- <KEYWORD2>MMapFile</KEYWORD2>
- <KEYWORD2>MaxClients</KEYWORD2>
- <KEYWORD2>MaxKeepAliveRequests</KEYWORD2>
- <KEYWORD2>MaxMemFree</KEYWORD2>
- <KEYWORD2>MaxRequestsPerChild</KEYWORD2>
- <KEYWORD2>MaxRequestsPerThread</KEYWORD2>
- <KEYWORD2>MaxSpareServers</KEYWORD2>
- <KEYWORD2>MaxSpareThreads</KEYWORD2>
- <KEYWORD2>MaxThreads</KEYWORD2>
- <KEYWORD2>MaxThreadsPerChild</KEYWORD2>
- <KEYWORD2>MetaDir</KEYWORD2>
- <KEYWORD2>MetaFiles</KEYWORD2>
- <KEYWORD2>MetaSuffix</KEYWORD2>
- <KEYWORD2>MimeMagicFile</KEYWORD2>
- <KEYWORD2>MinSpareServers</KEYWORD2>
- <KEYWORD2>MinSpareThreads</KEYWORD2>
- <KEYWORD2>ModMimeUsePathInfo</KEYWORD2>
- <KEYWORD2>MultiviewsMatch</KEYWORD2>
- <KEYWORD2>NWSSLTrustedCerts</KEYWORD2>
- <KEYWORD2>NameVirtualHost</KEYWORD2>
- <KEYWORD2>NoProxy</KEYWORD2>
- <KEYWORD2>NumServers</KEYWORD2>
- <KEYWORD2>Options</KEYWORD2>
- <KEYWORD2>Order</KEYWORD2>
- <KEYWORD2>PassEnv</KEYWORD2>
- <KEYWORD2>PidFile</KEYWORD2>
- <KEYWORD2>ProtocolEcho</KEYWORD2>
- <KEYWORD2>ProxyBadHeader</KEYWORD2>
- <KEYWORD2>ProxyBlock</KEYWORD2>
- <KEYWORD2>ProxyDomain</KEYWORD2>
- <KEYWORD2>ProxyErrorOverride</KEYWORD2>
- <KEYWORD2>ProxyIOBufferSize</KEYWORD2>
- <KEYWORD2>ProxyMaxForwards</KEYWORD2>
- <KEYWORD2>ProxyPass</KEYWORD2>
- <KEYWORD2>ProxyPassReverse</KEYWORD2>
- <KEYWORD2>ProxyPreserveHost</KEYWORD2>
- <KEYWORD2>ProxyReceiveBufferSize</KEYWORD2>
- <KEYWORD2>ProxyRemote</KEYWORD2>
- <KEYWORD2>ProxyRemoteMatch</KEYWORD2>
- <KEYWORD2>ProxyRequests</KEYWORD2>
- <KEYWORD2>ProxyTimeout</KEYWORD2>
- <KEYWORD2>ProxyVia</KEYWORD2>
- <KEYWORD2>RLimitCPU</KEYWORD2>
- <KEYWORD2>RLimitMEM</KEYWORD2>
- <KEYWORD2>RLimitNPROC</KEYWORD2>
- <KEYWORD2>ReadmeName</KEYWORD2>
- <KEYWORD2>Redirect</KEYWORD2>
- <KEYWORD2>RedirectMatch</KEYWORD2>
- <KEYWORD2>RedirectPermanent</KEYWORD2>
- <KEYWORD2>RedirectTemp</KEYWORD2>
- <KEYWORD2>RemoveCharset</KEYWORD2>
- <KEYWORD2>RemoveEncoding</KEYWORD2>
- <KEYWORD2>RemoveHandler</KEYWORD2>
- <KEYWORD2>RemoveInputFilter</KEYWORD2>
- <KEYWORD2>RemoveLanguage</KEYWORD2>
- <KEYWORD2>RemoveOutputFilter</KEYWORD2>
- <KEYWORD2>RemoveType</KEYWORD2>
- <KEYWORD2>RequestHeader</KEYWORD2>
- <KEYWORD2>Require</KEYWORD2>
- <KEYWORD2>RewriteBase</KEYWORD2>
- <KEYWORD2>RewriteCond</KEYWORD2>
- <KEYWORD2>RewriteEngine</KEYWORD2>
- <KEYWORD2>RewriteLock</KEYWORD2>
- <KEYWORD2>RewriteLog</KEYWORD2>
- <KEYWORD2>RewriteLogLevel</KEYWORD2>
- <KEYWORD2>RewriteMap</KEYWORD2>
- <KEYWORD2>RewriteOptions</KEYWORD2>
- <KEYWORD2>RewriteRule</KEYWORD2>
- <KEYWORD2>SSIEndTag</KEYWORD2>
- <KEYWORD2>SSIErrorMsg</KEYWORD2>
- <KEYWORD2>SSIStartTag</KEYWORD2>
- <KEYWORD2>SSITimeFormat</KEYWORD2>
- <KEYWORD2>SSIUndefinedEcho</KEYWORD2>
- <KEYWORD2>SSLCACertificateFile</KEYWORD2>
- <KEYWORD2>SSLCACertificatePath</KEYWORD2>
- <KEYWORD2>SSLCARevocationFile</KEYWORD2>
- <KEYWORD2>SSLCARevocationPath</KEYWORD2>
- <KEYWORD2>SSLCertificateChainFile</KEYWORD2>
- <KEYWORD2>SSLCertificateFile</KEYWORD2>
- <KEYWORD2>SSLCertificateKeyFile</KEYWORD2>
- <KEYWORD2>SSLCipherSuite</KEYWORD2>
- <KEYWORD2>SSLEngine</KEYWORD2>
- <KEYWORD2>SSLMutex</KEYWORD2>
- <KEYWORD2>SSLOptions</KEYWORD2>
- <KEYWORD2>SSLPassPhraseDialog</KEYWORD2>
- <KEYWORD2>SSLProtocol</KEYWORD2>
- <KEYWORD2>SSLProxyCACertificateFile</KEYWORD2>
- <KEYWORD2>SSLProxyCACertificatePath</KEYWORD2>
- <KEYWORD2>SSLProxyCARevocationFile</KEYWORD2>
- <KEYWORD2>SSLProxyCARevocationPath</KEYWORD2>
- <KEYWORD2>SSLProxyCipherSuite</KEYWORD2>
- <KEYWORD2>SSLProxyEngine</KEYWORD2>
- <KEYWORD2>SSLProxyMachineCertificateFile</KEYWORD2>
- <KEYWORD2>SSLProxyMachineCertificatePath</KEYWORD2>
- <KEYWORD2>SSLProxyProtocol</KEYWORD2>
- <KEYWORD2>SSLProxyVerify</KEYWORD2>
- <KEYWORD2>SSLProxyVerifyDepth</KEYWORD2>
- <KEYWORD2>SSLRandomSeed</KEYWORD2>
- <KEYWORD2>SSLRequire</KEYWORD2>
- <KEYWORD2>SSLRequireSSL</KEYWORD2>
- <KEYWORD2>SSLSessionCache</KEYWORD2>
- <KEYWORD2>SSLSessionCacheTimeout</KEYWORD2>
- <KEYWORD2>SSLVerifyClient</KEYWORD2>
- <KEYWORD2>SSLVerifyDepth</KEYWORD2>
- <KEYWORD2>Satisfy</KEYWORD2>
- <KEYWORD2>ScoreBoardFile</KEYWORD2>
- <KEYWORD2>Script</KEYWORD2>
- <KEYWORD2>ScriptAlias</KEYWORD2>
- <KEYWORD2>ScriptAliasMatch</KEYWORD2>
- <KEYWORD2>ScriptInterpreterSource</KEYWORD2>
- <KEYWORD2>ScriptLog</KEYWORD2>
- <KEYWORD2>ScriptLogBuffer</KEYWORD2>
- <KEYWORD2>ScriptLogLength</KEYWORD2>
- <KEYWORD2>ScriptSock</KEYWORD2>
- <KEYWORD2>SecureListen</KEYWORD2>
- <KEYWORD2>SendBufferSize</KEYWORD2>
- <KEYWORD2>ServerAdmin</KEYWORD2>
- <KEYWORD2>ServerLimit</KEYWORD2>
- <KEYWORD2>ServerName</KEYWORD2>
- <KEYWORD2>ServerRoot</KEYWORD2>
- <KEYWORD2>ServerSignature</KEYWORD2>
- <KEYWORD2>ServerTokens</KEYWORD2>
- <KEYWORD2>SetEnv</KEYWORD2>
- <KEYWORD2>SetEnvIf</KEYWORD2>
- <KEYWORD2>SetEnvIfNoCase</KEYWORD2>
- <KEYWORD2>SetHandler</KEYWORD2>
- <KEYWORD2>SetInputFilter</KEYWORD2>
- <KEYWORD2>SetOutputFilter</KEYWORD2>
- <KEYWORD2>StartServers</KEYWORD2>
- <KEYWORD2>StartThreads</KEYWORD2>
- <KEYWORD2>SuexecUserGroup</KEYWORD2>
- <KEYWORD2>ThreadLimit</KEYWORD2>
- <KEYWORD2>ThreadStackSize</KEYWORD2>
- <KEYWORD2>ThreadsPerChild</KEYWORD2>
- <KEYWORD2>TimeOut</KEYWORD2>
- <KEYWORD2>TransferLog</KEYWORD2>
- <KEYWORD2>TypesConfig</KEYWORD2>
- <KEYWORD2>UnsetEnv</KEYWORD2>
- <KEYWORD2>UseCanonicalName</KEYWORD2>
- <KEYWORD2>User</KEYWORD2>
- <KEYWORD2>UserDir</KEYWORD2>
- <KEYWORD2>VirtualDocumentRoot</KEYWORD2>
- <KEYWORD2>VirtualDocumentRootIP</KEYWORD2>
- <KEYWORD2>VirtualScriptAlias</KEYWORD2>
- <KEYWORD2>VirtualScriptAliasIP</KEYWORD2>
- <KEYWORD2>XBitHack</KEYWORD2>
-
- <!-- Apache 1.x -->
- <KEYWORD4>AddModule</KEYWORD4>
- <KEYWORD4>ClearModuleList</KEYWORD4>
-
- <!-- Subversion directives -->
- <KEYWORD3>SVNPath</KEYWORD3>
- <KEYWORD3>SVNParentPath</KEYWORD3>
- <KEYWORD3>SVNIndexXSLT</KEYWORD3>
-
- <!-- mod_python directives -->
- <KEYWORD3>PythonHandler</KEYWORD3>
- <KEYWORD3>PythonDebug</KEYWORD3>
-
- <LITERAL2>All</LITERAL2>
- <LITERAL2>ExecCGI</LITERAL2>
- <LITERAL2>FollowSymLinks</LITERAL2>
- <LITERAL2>Includes</LITERAL2>
- <LITERAL2>IncludesNOEXEC</LITERAL2>
- <LITERAL2>Indexes</LITERAL2>
- <LITERAL2>MultiViews</LITERAL2>
- <LITERAL2>None</LITERAL2>
- <LITERAL2>Off</LITERAL2>
- <LITERAL2>On</LITERAL2>
- <LITERAL2>SymLinksIfOwnerMatch</LITERAL2>
- <LITERAL2>from</LITERAL2>
- </KEYWORDS>
- </RULES>
-
- <RULES SET="VHOST" DEFAULT="NULL" IGNORE_CASE="TRUE">
-
- <EOL_SPAN TYPE="COMMENT2">#</EOL_SPAN>
-
- <SPAN_REGEXP HASH_CHAR="<" TYPE="MARKUP" DELEGATE="DIRECTIVE">
- <BEGIN><![CDATA[<(\w+)[^>]*>]]></BEGIN>
- <END><![CDATA[</$1>]]></END>
- </SPAN_REGEXP>
-
- <SPAN TYPE="LITERAL1" ESCAPE="\" NO_LINE_BREAK="TRUE">
- <BEGIN>"</BEGIN>
- <END>"</END>
- </SPAN>
-
- <KEYWORDS>
- <KEYWORD2>AcceptMutex</KEYWORD2>
- <KEYWORD2>AcceptPathInfo</KEYWORD2>
- <KEYWORD2>AccessFileName</KEYWORD2>
- <KEYWORD2>Action</KEYWORD2>
- <KEYWORD2>AddAlt</KEYWORD2>
- <KEYWORD2>AddAltByEncoding</KEYWORD2>
- <KEYWORD2>AddAltByType</KEYWORD2>
- <KEYWORD2>AddCharset</KEYWORD2>
- <KEYWORD2>AddDefaultCharset</KEYWORD2>
- <KEYWORD2>AddDescription</KEYWORD2>
- <KEYWORD2>AddEncoding</KEYWORD2>
- <KEYWORD2>AddHandler</KEYWORD2>
- <KEYWORD2>AddIcon</KEYWORD2>
- <KEYWORD2>AddIconByEncoding</KEYWORD2>
- <KEYWORD2>AddIconByType</KEYWORD2>
- <KEYWORD2>AddInputFilter</KEYWORD2>
- <KEYWORD2>AddLanguage</KEYWORD2>
- <KEYWORD2>AddModuleInfo</KEYWORD2>
- <KEYWORD2>AddOutputFilter</KEYWORD2>
- <KEYWORD2>AddOutputFilterByType</KEYWORD2>
- <KEYWORD2>AddType</KEYWORD2>
- <KEYWORD2>Alias</KEYWORD2>
- <KEYWORD2>AliasMatch</KEYWORD2>
- <KEYWORD2>AllowCONNECT</KEYWORD2>
- <KEYWORD2>AllowEncodedSlashes</KEYWORD2>
- <KEYWORD2>AssignUserID</KEYWORD2>
- <KEYWORD2>AuthDigestNcCheck</KEYWORD2>
- <KEYWORD2>AuthDigestShmemSize</KEYWORD2>
- <KEYWORD2>AuthLDAPCharsetConfig</KEYWORD2>
- <KEYWORD2>BS2000Account</KEYWORD2>
- <KEYWORD2>BrowserMatch</KEYWORD2>
- <KEYWORD2>BrowserMatchNoCase</KEYWORD2>
- <KEYWORD2>CacheDefaultExpire</KEYWORD2>
- <KEYWORD2>CacheDirLength</KEYWORD2>
- <KEYWORD2>CacheDirLevels</KEYWORD2>
- <KEYWORD2>CacheDisable</KEYWORD2>
- <KEYWORD2>CacheEnable</KEYWORD2>
- <KEYWORD2>CacheExpiryCheck</KEYWORD2>
- <KEYWORD2>CacheFile</KEYWORD2>
- <KEYWORD2>CacheForceCompletion</KEYWORD2>
- <KEYWORD2>CacheGcClean</KEYWORD2>
- <KEYWORD2>CacheGcDaily</KEYWORD2>
- <KEYWORD2>CacheGcInterval</KEYWORD2>
- <KEYWORD2>CacheGcMemUsage</KEYWORD2>
- <KEYWORD2>CacheGcUnused</KEYWORD2>
- <KEYWORD2>CacheIgnoreCacheControl</KEYWORD2>
- <KEYWORD2>CacheIgnoreNoLastMod</KEYWORD2>
- <KEYWORD2>CacheLastModifiedFactor</KEYWORD2>
- <KEYWORD2>CacheMaxExpire</KEYWORD2>
- <KEYWORD2>CacheMaxFileSize</KEYWORD2>
- <KEYWORD2>CacheMinFileSize</KEYWORD2>
- <KEYWORD2>CacheNegotiatedDocs</KEYWORD2>
- <KEYWORD2>CacheRoot</KEYWORD2>
- <KEYWORD2>CacheSize</KEYWORD2>
- <KEYWORD2>CacheTimeMargin</KEYWORD2>
- <KEYWORD2>CharsetDefault</KEYWORD2>
- <KEYWORD2>CharsetOptions</KEYWORD2>
- <KEYWORD2>CharsetSourceEnc</KEYWORD2>
- <KEYWORD2>CheckSpelling</KEYWORD2>
- <KEYWORD2>ChildPerUserID</KEYWORD2>
- <KEYWORD2>ContentDigest</KEYWORD2>
- <KEYWORD2>CookieDomain</KEYWORD2>
- <KEYWORD2>CookieExpires</KEYWORD2>
- <KEYWORD2>CookieLog</KEYWORD2>
- <KEYWORD2>CookieName</KEYWORD2>
- <KEYWORD2>CookieStyle</KEYWORD2>
- <KEYWORD2>CookieTracking</KEYWORD2>
- <KEYWORD2>CoreDumpDirectory</KEYWORD2>
- <KEYWORD2>CustomLog</KEYWORD2>
- <KEYWORD2>DavDepthInfinity</KEYWORD2>
- <KEYWORD2>DavLockDB</KEYWORD2>
- <KEYWORD2>DavMinTimeout</KEYWORD2>
- <KEYWORD2>DefaultIcon</KEYWORD2>
- <KEYWORD2>DefaultLanguage</KEYWORD2>
- <KEYWORD2>DefaultType</KEYWORD2>
- <KEYWORD2>DeflateBufferSize</KEYWORD2>
- <KEYWORD2>DeflateCompressionLevel</KEYWORD2>
- <KEYWORD2>DeflateFilterNote</KEYWORD2>
- <KEYWORD2>DeflateMemLevel</KEYWORD2>
- <KEYWORD2>DeflateWindowSize</KEYWORD2>
- <KEYWORD2>DirectoryIndex</KEYWORD2>
- <KEYWORD1>DirectorySlash</KEYWORD1>
- <KEYWORD2>DocumentRoot</KEYWORD2>
- <KEYWORD2>EnableMMAP</KEYWORD2>
- <KEYWORD2>EnableSendfile</KEYWORD2>
- <KEYWORD2>ErrorDocument</KEYWORD2>
- <KEYWORD2>ErrorLog</KEYWORD2>
- <KEYWORD2>Example</KEYWORD2>
- <KEYWORD2>ExpiresActive</KEYWORD2>
- <KEYWORD2>ExpiresByType</KEYWORD2>
- <KEYWORD2>ExpiresDefault</KEYWORD2>
- <KEYWORD2>ExtFilterDefine</KEYWORD2>
- <KEYWORD2>ExtendedStatus</KEYWORD2>
- <KEYWORD2>FileETag</KEYWORD2>
- <KEYWORD2>ForceLanguagePriority</KEYWORD2>
- <KEYWORD2>ForensicLog</KEYWORD2>
- <KEYWORD2>Group</KEYWORD2>
- <KEYWORD2>Header</KEYWORD2>
- <KEYWORD2>HeaderName</KEYWORD2>
- <KEYWORD2>HostnameLookups</KEYWORD2>
- <KEYWORD2>ISAPIAppendLogToErrors</KEYWORD2>
- <KEYWORD2>ISAPIAppendLogToQuery</KEYWORD2>
- <KEYWORD2>ISAPICacheFile</KEYWORD2>
- <KEYWORD2>ISAPIFakeAsync</KEYWORD2>
- <KEYWORD2>ISAPILogNotSupported</KEYWORD2>
- <KEYWORD2>ISAPIReadAheadBuffer</KEYWORD2>
- <KEYWORD2>IdentityCheck</KEYWORD2>
- <KEYWORD2>ImapBase</KEYWORD2>
- <KEYWORD2>ImapDefault</KEYWORD2>
- <KEYWORD2>ImapMenu</KEYWORD2>
- <KEYWORD2>Include</KEYWORD2>
- <KEYWORD2>IndexIgnore</KEYWORD2>
- <KEYWORD2>IndexOptions</KEYWORD2>
- <KEYWORD2>IndexOrderDefault</KEYWORD2>
- <KEYWORD2>JkMount</KEYWORD2>
- <KEYWORD2>KeepAlive</KEYWORD2>
- <KEYWORD2>KeepAliveTimeout</KEYWORD2>
- <KEYWORD2>LDAPCacheEntries</KEYWORD2>
- <KEYWORD2>LDAPCacheTTL</KEYWORD2>
- <KEYWORD2>LDAPOpCacheEntries</KEYWORD2>
- <KEYWORD2>LDAPOpCacheTTL</KEYWORD2>
- <KEYWORD2>LDAPSharedCacheSize</KEYWORD2>
- <KEYWORD2>LDAPTrustedCA</KEYWORD2>
- <KEYWORD2>LDAPTrustedCAType</KEYWORD2>
- <KEYWORD2>LanguagePriority</KEYWORD2>
- <KEYWORD2>LimitInternalRecursion</KEYWORD2>
- <KEYWORD2>LimitRequestBody</KEYWORD2>
- <KEYWORD2>LimitRequestFields</KEYWORD2>
- <KEYWORD2>LimitRequestFieldsize</KEYWORD2>
- <KEYWORD2>LimitRequestLine</KEYWORD2>
- <KEYWORD2>LimitXMLRequestBody</KEYWORD2>
- <KEYWORD2>Listen</KEYWORD2>
- <KEYWORD2>ListenBacklog</KEYWORD2>
- <KEYWORD2>LoadFile</KEYWORD2>
- <KEYWORD2>LoadModule</KEYWORD2>
- <KEYWORD2>LockFile</KEYWORD2>
- <KEYWORD2>LogFormat</KEYWORD2>
- <KEYWORD2>LogLevel</KEYWORD2>
- <KEYWORD2>MCacheMaxObjectCount</KEYWORD2>
- <KEYWORD2>MCacheMaxObjectSize</KEYWORD2>
- <KEYWORD2>MCacheMaxStreamingBuffer</KEYWORD2>
- <KEYWORD2>MCacheMinObjectSize</KEYWORD2>
- <KEYWORD2>MCacheRemovalAlgorithm</KEYWORD2>
- <KEYWORD2>MCacheSize</KEYWORD2>
- <KEYWORD2>MMapFile</KEYWORD2>
- <KEYWORD2>MaxClients</KEYWORD2>
- <KEYWORD2>MaxKeepAliveRequests</KEYWORD2>
- <KEYWORD2>MaxMemFree</KEYWORD2>
- <KEYWORD2>MaxRequestsPerChild</KEYWORD2>
- <KEYWORD2>MaxRequestsPerThread</KEYWORD2>
- <KEYWORD2>MaxSpareServers</KEYWORD2>
- <KEYWORD2>MaxSpareThreads</KEYWORD2>
- <KEYWORD2>MaxThreads</KEYWORD2>
- <KEYWORD2>MaxThreadsPerChild</KEYWORD2>
- <KEYWORD2>MetaDir</KEYWORD2>
- <KEYWORD2>MetaFiles</KEYWORD2>
- <KEYWORD2>MetaSuffix</KEYWORD2>
- <KEYWORD2>MimeMagicFile</KEYWORD2>
- <KEYWORD2>MinSpareServers</KEYWORD2>
- <KEYWORD2>MinSpareThreads</KEYWORD2>
- <KEYWORD2>MultiviewsMatch</KEYWORD2>
- <KEYWORD2>NWSSLTrustedCerts</KEYWORD2>
- <KEYWORD2>NameVirtualHost</KEYWORD2>
- <KEYWORD2>NoProxy</KEYWORD2>
- <KEYWORD2>NumServers</KEYWORD2>
- <KEYWORD2>Options</KEYWORD2>
- <KEYWORD2>PassEnv</KEYWORD2>
- <KEYWORD2>PidFile</KEYWORD2>
- <KEYWORD2>ProtocolEcho</KEYWORD2>
- <KEYWORD2>ProxyBadHeader</KEYWORD2>
- <KEYWORD2>ProxyBlock</KEYWORD2>
- <KEYWORD2>ProxyDomain</KEYWORD2>
- <KEYWORD2>ProxyErrorOverride</KEYWORD2>
- <KEYWORD2>ProxyIOBufferSize</KEYWORD2>
- <KEYWORD2>ProxyMaxForwards</KEYWORD2>
- <KEYWORD2>ProxyPass</KEYWORD2>
- <KEYWORD2>ProxyPassReverse</KEYWORD2>
- <KEYWORD2>ProxyPreserveHost</KEYWORD2>
- <KEYWORD2>ProxyReceiveBufferSize</KEYWORD2>
- <KEYWORD2>ProxyRemote</KEYWORD2>
- <KEYWORD2>ProxyRemoteMatch</KEYWORD2>
- <KEYWORD2>ProxyRequests</KEYWORD2>
- <KEYWORD2>ProxyTimeout</KEYWORD2>
- <KEYWORD2>ProxyVia</KEYWORD2>
- <KEYWORD2>RLimitCPU</KEYWORD2>
- <KEYWORD2>RLimitMEM</KEYWORD2>
- <KEYWORD2>RLimitNPROC</KEYWORD2>
- <KEYWORD2>ReadmeName</KEYWORD2>
- <KEYWORD2>Redirect</KEYWORD2>
- <KEYWORD2>RedirectMatch</KEYWORD2>
- <KEYWORD2>RedirectPermanent</KEYWORD2>
- <KEYWORD2>RedirectTemp</KEYWORD2>
- <KEYWORD2>RemoveCharset</KEYWORD2>
- <KEYWORD2>RemoveEncoding</KEYWORD2>
- <KEYWORD2>RemoveHandler</KEYWORD2>
- <KEYWORD2>RemoveInputFilter</KEYWORD2>
- <KEYWORD2>RemoveLanguage</KEYWORD2>
- <KEYWORD2>RemoveOutputFilter</KEYWORD2>
- <KEYWORD2>RemoveType</KEYWORD2>
- <KEYWORD2>RequestHeader</KEYWORD2>
- <KEYWORD2>RewriteBase</KEYWORD2>
- <KEYWORD2>RewriteCond</KEYWORD2>
- <KEYWORD2>RewriteEngine</KEYWORD2>
- <KEYWORD2>RewriteLock</KEYWORD2>
- <KEYWORD2>RewriteLog</KEYWORD2>
- <KEYWORD2>RewriteLogLevel</KEYWORD2>
- <KEYWORD2>RewriteMap</KEYWORD2>
- <KEYWORD2>RewriteOptions</KEYWORD2>
- <KEYWORD2>RewriteRule</KEYWORD2>
- <KEYWORD2>SSIEndTag</KEYWORD2>
- <KEYWORD2>SSIErrorMsg</KEYWORD2>
- <KEYWORD2>SSIStartTag</KEYWORD2>
- <KEYWORD2>SSITimeFormat</KEYWORD2>
- <KEYWORD2>SSIUndefinedEcho</KEYWORD2>
- <KEYWORD2>SSLCACertificateFile</KEYWORD2>
- <KEYWORD2>SSLCACertificatePath</KEYWORD2>
- <KEYWORD2>SSLCARevocationFile</KEYWORD2>
- <KEYWORD2>SSLCARevocationPath</KEYWORD2>
- <KEYWORD2>SSLCertificateChainFile</KEYWORD2>
- <KEYWORD2>SSLCertificateFile</KEYWORD2>
- <KEYWORD2>SSLCertificateKeyFile</KEYWORD2>
- <KEYWORD2>SSLCipherSuite</KEYWORD2>
- <KEYWORD2>SSLEngine</KEYWORD2>
- <KEYWORD2>SSLMutex</KEYWORD2>
- <KEYWORD2>SSLOptions</KEYWORD2>
- <KEYWORD2>SSLPassPhraseDialog</KEYWORD2>
- <KEYWORD2>SSLProtocol</KEYWORD2>
- <KEYWORD2>SSLProxyCACertificateFile</KEYWORD2>
- <KEYWORD2>SSLProxyCACertificatePath</KEYWORD2>
- <KEYWORD2>SSLProxyCARevocationFile</KEYWORD2>
- <KEYWORD2>SSLProxyCARevocationPath</KEYWORD2>
- <KEYWORD2>SSLProxyCipherSuite</KEYWORD2>
- <KEYWORD2>SSLProxyEngine</KEYWORD2>
- <KEYWORD2>SSLProxyMachineCertificateFile</KEYWORD2>
- <KEYWORD2>SSLProxyMachineCertificatePath</KEYWORD2>
- <KEYWORD2>SSLProxyProtocol</KEYWORD2>
- <KEYWORD2>SSLProxyVerify</KEYWORD2>
- <KEYWORD2>SSLProxyVerifyDepth</KEYWORD2>
- <KEYWORD2>SSLRandomSeed</KEYWORD2>
- <KEYWORD2>SSLSessionCache</KEYWORD2>
- <KEYWORD2>SSLSessionCacheTimeout</KEYWORD2>
- <KEYWORD2>SSLVerifyClient</KEYWORD2>
- <KEYWORD2>SSLVerifyDepth</KEYWORD2>
- <KEYWORD2>ScoreBoardFile</KEYWORD2>
- <KEYWORD2>Script</KEYWORD2>
- <KEYWORD2>ScriptAlias</KEYWORD2>
- <KEYWORD2>ScriptAliasMatch</KEYWORD2>
- <KEYWORD2>ScriptInterpreterSource</KEYWORD2>
- <KEYWORD2>ScriptLog</KEYWORD2>
- <KEYWORD2>ScriptLogBuffer</KEYWORD2>
- <KEYWORD2>ScriptLogLength</KEYWORD2>
- <KEYWORD2>ScriptSock</KEYWORD2>
- <KEYWORD2>SecureListen</KEYWORD2>
- <KEYWORD2>SendBufferSize</KEYWORD2>
- <KEYWORD2>ServerAdmin</KEYWORD2>
- <KEYWORD2>ServerAlias</KEYWORD2>
- <KEYWORD2>ServerLimit</KEYWORD2>
- <KEYWORD2>ServerName</KEYWORD2>
- <KEYWORD2>ServerPath</KEYWORD2>
- <KEYWORD2>ServerRoot</KEYWORD2>
- <KEYWORD2>ServerSignature</KEYWORD2>
- <KEYWORD2>ServerTokens</KEYWORD2>
- <KEYWORD2>SetEnv</KEYWORD2>
- <KEYWORD2>SetEnvIf</KEYWORD2>
- <KEYWORD2>SetEnvIfNoCase</KEYWORD2>
- <KEYWORD2>SetHandler</KEYWORD2>
- <KEYWORD2>SetInputFilter</KEYWORD2>
- <KEYWORD2>SetOutputFilter</KEYWORD2>
- <KEYWORD2>StartServers</KEYWORD2>
- <KEYWORD2>StartThreads</KEYWORD2>
- <KEYWORD2>SuexecUserGroup</KEYWORD2>
- <KEYWORD2>ThreadLimit</KEYWORD2>
- <KEYWORD2>ThreadStackSize</KEYWORD2>
- <KEYWORD2>ThreadsPerChild</KEYWORD2>
- <KEYWORD2>TimeOut</KEYWORD2>
- <KEYWORD2>TransferLog</KEYWORD2>
- <KEYWORD2>TypesConfig</KEYWORD2>
- <KEYWORD2>UnsetEnv</KEYWORD2>
- <KEYWORD2>UseCanonicalName</KEYWORD2>
- <KEYWORD2>User</KEYWORD2>
- <KEYWORD2>UserDir</KEYWORD2>
- <KEYWORD2>VirtualDocumentRoot</KEYWORD2>
- <KEYWORD2>VirtualDocumentRootIP</KEYWORD2>
- <KEYWORD2>VirtualScriptAlias</KEYWORD2>
- <KEYWORD2>VirtualScriptAliasIP</KEYWORD2>
- <KEYWORD2>XBitHack</KEYWORD2>
-
- <LITERAL2>Off</LITERAL2>
- <LITERAL2>On</LITERAL2>
- <LITERAL2>None</LITERAL2>
- </KEYWORDS>
- </RULES>
-</MODE>
-
+<?xml version="1.0"?>
+
+<!DOCTYPE MODE SYSTEM "xmode.dtd">
+
+<MODE>
+ <PROPS>
+ <PROPERTY NAME="lineComment" VALUE="#" />
+ <PROPERTY NAME="noWordSep" VALUE="-" />
+ </PROPS>
+ <RULES HIGHLIGHT_DIGITS="FALSE" IGNORE_CASE="TRUE">
+
+ <EOL_SPAN TYPE="COMMENT1">#</EOL_SPAN>
+
+ <SPAN TYPE="LITERAL1" ESCAPE="\" NO_LINE_BREAK="TRUE">
+ <BEGIN>"</BEGIN>
+ <END>"</END>
+ </SPAN>
+
+ <SPAN_REGEXP HASH_CHAR="<VirtualHost" TYPE="MARKUP" DELEGATE="VHOST">
+ <BEGIN><![CDATA[<(VirtualHost)[^>]*>]]></BEGIN>
+ <END><![CDATA[</$1>]]></END>
+ </SPAN_REGEXP>
+
+ <SPAN_REGEXP HASH_CHAR="<" TYPE="MARKUP" DELEGATE="DIRECTIVE">
+ <BEGIN><![CDATA[<(\w+)[^>]*>]]></BEGIN>
+ <END><![CDATA[</$1>]]></END>
+ </SPAN_REGEXP>
+
+ <KEYWORDS>
+ <KEYWORD1>AcceptMutex</KEYWORD1>
+ <KEYWORD1>AcceptPathInfo</KEYWORD1>
+ <KEYWORD1>AccessFileName</KEYWORD1>
+ <KEYWORD1>Action</KEYWORD1>
+ <KEYWORD1>AddAlt</KEYWORD1>
+ <KEYWORD1>AddAltByEncoding</KEYWORD1>
+ <KEYWORD1>AddAltByType</KEYWORD1>
+ <KEYWORD1>AddCharset</KEYWORD1>
+ <KEYWORD1>AddDefaultCharset</KEYWORD1>
+ <KEYWORD1>AddDescription</KEYWORD1>
+ <KEYWORD1>AddEncoding</KEYWORD1>
+ <KEYWORD1>AddHandler</KEYWORD1>
+ <KEYWORD1>AddIcon</KEYWORD1>
+ <KEYWORD1>AddIconByEncoding</KEYWORD1>
+ <KEYWORD1>AddIconByType</KEYWORD1>
+ <KEYWORD1>AddInputFilter</KEYWORD1>
+ <KEYWORD1>AddLanguage</KEYWORD1>
+ <KEYWORD1>AddModuleInfo</KEYWORD1>
+ <KEYWORD1>AddOutputFilter</KEYWORD1>
+ <KEYWORD1>AddOutputFilterByType</KEYWORD1>
+ <KEYWORD1>AddType</KEYWORD1>
+ <KEYWORD1>Alias</KEYWORD1>
+ <KEYWORD1>AliasMatch</KEYWORD1>
+ <KEYWORD1>AllowCONNECT</KEYWORD1>
+ <KEYWORD1>AllowEncodedSlashes</KEYWORD1>
+ <KEYWORD1>AuthDigestNcCheck</KEYWORD1>
+ <KEYWORD1>AuthDigestShmemSize</KEYWORD1>
+ <KEYWORD1>AuthLDAPCharsetConfig</KEYWORD1>
+ <KEYWORD1>BS2000Account</KEYWORD1>
+ <KEYWORD1>BrowserMatch</KEYWORD1>
+ <KEYWORD1>BrowserMatchNoCase</KEYWORD1>
+ <KEYWORD1>CacheDefaultExpire</KEYWORD1>
+ <KEYWORD1>CacheDirLength</KEYWORD1>
+ <KEYWORD1>CacheDirLevels</KEYWORD1>
+ <KEYWORD1>CacheDisable</KEYWORD1>
+ <KEYWORD1>CacheEnable</KEYWORD1>
+ <KEYWORD1>CacheExpiryCheck</KEYWORD1>
+ <KEYWORD1>CacheFile</KEYWORD1>
+ <KEYWORD1>CacheForceCompletion</KEYWORD1>
+ <KEYWORD1>CacheGcClean</KEYWORD1>
+ <KEYWORD1>CacheGcDaily</KEYWORD1>
+ <KEYWORD1>CacheGcInterval</KEYWORD1>
+ <KEYWORD1>CacheGcMemUsage</KEYWORD1>
+ <KEYWORD1>CacheGcUnused</KEYWORD1>
+ <KEYWORD1>CacheIgnoreCacheControl</KEYWORD1>
+ <KEYWORD1>CacheIgnoreNoLastMod</KEYWORD1>
+ <KEYWORD1>CacheLastModifiedFactor</KEYWORD1>
+ <KEYWORD1>CacheMaxExpire</KEYWORD1>
+ <KEYWORD1>CacheMaxFileSize</KEYWORD1>
+ <KEYWORD1>CacheMinFileSize</KEYWORD1>
+ <KEYWORD1>CacheNegotiatedDocs</KEYWORD1>
+ <KEYWORD1>CacheRoot</KEYWORD1>
+ <KEYWORD1>CacheSize</KEYWORD1>
+ <KEYWORD1>CacheTimeMargin</KEYWORD1>
+ <KEYWORD1>CharsetDefault</KEYWORD1>
+ <KEYWORD1>CharsetOptions</KEYWORD1>
+ <KEYWORD1>CharsetSourceEnc</KEYWORD1>
+ <KEYWORD1>CheckSpelling</KEYWORD1>
+ <KEYWORD1>ChildPerUserID</KEYWORD1>
+ <KEYWORD1>ContentDigest</KEYWORD1>
+ <KEYWORD1>CookieDomain</KEYWORD1>
+ <KEYWORD1>CookieExpires</KEYWORD1>
+ <KEYWORD1>CookieLog</KEYWORD1>
+ <KEYWORD1>CookieName</KEYWORD1>
+ <KEYWORD1>CookieStyle</KEYWORD1>
+ <KEYWORD1>CookieTracking</KEYWORD1>
+ <KEYWORD1>CoreDumpDirectory</KEYWORD1>
+ <KEYWORD1>CustomLog</KEYWORD1>
+ <KEYWORD1>DavDepthInfinity</KEYWORD1>
+ <KEYWORD1>DavLockDB</KEYWORD1>
+ <KEYWORD1>DavMinTimeout</KEYWORD1>
+ <KEYWORD1>DefaultIcon</KEYWORD1>
+ <KEYWORD1>DefaultLanguage</KEYWORD1>
+ <KEYWORD1>DefaultType</KEYWORD1>
+ <KEYWORD1>DeflateBufferSize</KEYWORD1>
+ <KEYWORD1>DeflateCompressionLevel</KEYWORD1>
+ <KEYWORD1>DeflateFilterNote</KEYWORD1>
+ <KEYWORD1>DeflateMemLevel</KEYWORD1>
+ <KEYWORD1>DeflateWindowSize</KEYWORD1>
+ <KEYWORD1>DirectoryIndex</KEYWORD1>
+ <KEYWORD1>DirectorySlash</KEYWORD1>
+ <KEYWORD1>DocumentRoot</KEYWORD1>
+ <KEYWORD1>EnableExceptionHook</KEYWORD1>
+ <KEYWORD1>EnableMMAP</KEYWORD1>
+ <KEYWORD1>EnableSendfile</KEYWORD1>
+ <KEYWORD1>ErrorDocument</KEYWORD1>
+ <KEYWORD1>ErrorLog</KEYWORD1>
+ <KEYWORD1>Example</KEYWORD1>
+ <KEYWORD1>ExpiresActive</KEYWORD1>
+ <KEYWORD1>ExpiresByType</KEYWORD1>
+ <KEYWORD1>ExpiresDefault</KEYWORD1>
+ <KEYWORD1>ExtFilterDefine</KEYWORD1>
+ <KEYWORD1>ExtendedStatus</KEYWORD1>
+ <KEYWORD1>FileETag</KEYWORD1>
+ <KEYWORD1>ForceLanguagePriority</KEYWORD1>
+ <KEYWORD1>ForensicLog</KEYWORD1>
+ <KEYWORD1>Group</KEYWORD1>
+ <KEYWORD1>Header</KEYWORD1>
+ <KEYWORD1>HeaderName</KEYWORD1>
+ <KEYWORD1>HostnameLookups</KEYWORD1>
+ <KEYWORD1>ISAPIAppendLogToErrors</KEYWORD1>
+ <KEYWORD1>ISAPIAppendLogToQuery</KEYWORD1>
+ <KEYWORD1>ISAPICacheFile</KEYWORD1>
+ <KEYWORD1>ISAPIFakeAsync</KEYWORD1>
+ <KEYWORD1>ISAPILogNotSupported</KEYWORD1>
+ <KEYWORD1>ISAPIReadAheadBuffer</KEYWORD1>
+ <KEYWORD1>IdentityCheck</KEYWORD1>
+ <KEYWORD1>ImapBase</KEYWORD1>
+ <KEYWORD1>ImapDefault</KEYWORD1>
+ <KEYWORD1>ImapMenu</KEYWORD1>
+ <KEYWORD1>Include</KEYWORD1>
+ <KEYWORD1>IndexIgnore</KEYWORD1>
+ <KEYWORD1>IndexOptions</KEYWORD1>
+ <KEYWORD1>IndexOrderDefault</KEYWORD1>
+ <KEYWORD1>KeepAlive</KEYWORD1>
+ <KEYWORD1>KeepAliveTimeout</KEYWORD1>
+ <KEYWORD1>LDAPCacheEntries</KEYWORD1>
+ <KEYWORD1>LDAPCacheTTL</KEYWORD1>
+ <KEYWORD1>LDAPOpCacheEntries</KEYWORD1>
+ <KEYWORD1>LDAPOpCacheTTL</KEYWORD1>
+ <KEYWORD1>LDAPSharedCacheFile</KEYWORD1>
+ <KEYWORD1>LDAPSharedCacheSize</KEYWORD1>
+ <KEYWORD1>LDAPTrustedCA</KEYWORD1>
+ <KEYWORD1>LDAPTrustedCAType</KEYWORD1>
+ <KEYWORD1>LanguagePriority</KEYWORD1>
+ <KEYWORD1>LimitInternalRecursion</KEYWORD1>
+ <KEYWORD1>LimitRequestBody</KEYWORD1>
+ <KEYWORD1>LimitRequestFields</KEYWORD1>
+ <KEYWORD1>LimitRequestFieldsize</KEYWORD1>
+ <KEYWORD1>LimitRequestLine</KEYWORD1>
+ <KEYWORD1>LimitXMLRequestBody</KEYWORD1>
+ <KEYWORD1>Listen</KEYWORD1>
+ <KEYWORD1>ListenBacklog</KEYWORD1>
+ <KEYWORD1>LoadFile</KEYWORD1>
+ <KEYWORD1>LoadModule</KEYWORD1>
+ <KEYWORD1>LockFile</KEYWORD1>
+ <KEYWORD1>LogFormat</KEYWORD1>
+ <KEYWORD1>LogLevel</KEYWORD1>
+ <KEYWORD1>MCacheMaxObjectCount</KEYWORD1>
+ <KEYWORD1>MCacheMaxObjectSize</KEYWORD1>
+ <KEYWORD1>MCacheMaxStreamingBuffer</KEYWORD1>
+ <KEYWORD1>MCacheMinObjectSize</KEYWORD1>
+ <KEYWORD1>MCacheRemovalAlgorithm</KEYWORD1>
+ <KEYWORD1>MCacheSize</KEYWORD1>
+ <KEYWORD1>MMapFile</KEYWORD1>
+ <KEYWORD1>MaxClients</KEYWORD1>
+ <KEYWORD1>MaxKeepAliveRequests</KEYWORD1>
+ <KEYWORD1>MaxMemFree</KEYWORD1>
+ <KEYWORD1>MaxRequestsPerChild</KEYWORD1>
+ <KEYWORD1>MaxRequestsPerThread</KEYWORD1>
+ <KEYWORD1>MaxSpareServers</KEYWORD1>
+ <KEYWORD1>MaxSpareThreads</KEYWORD1>
+ <KEYWORD1>MaxThreads</KEYWORD1>
+ <KEYWORD1>MaxThreadsPerChild</KEYWORD1>
+ <KEYWORD1>MetaDir</KEYWORD1>
+ <KEYWORD1>MetaFiles</KEYWORD1>
+ <KEYWORD1>MetaSuffix</KEYWORD1>
+ <KEYWORD1>MimeMagicFile</KEYWORD1>
+ <KEYWORD1>MinSpareServers</KEYWORD1>
+ <KEYWORD1>MinSpareThreads</KEYWORD1>
+ <KEYWORD1>MultiviewsMatch</KEYWORD1>
+ <KEYWORD1>NWSSLTrustedCerts</KEYWORD1>
+ <KEYWORD1>NWSSLUpgradeable</KEYWORD1>
+ <KEYWORD1>NameVirtualHost</KEYWORD1>
+ <KEYWORD1>NoProxy</KEYWORD1>
+ <KEYWORD1>NumServers</KEYWORD1>
+ <KEYWORD1>Options</KEYWORD1>
+ <KEYWORD1>PassEnv</KEYWORD1>
+ <KEYWORD1>PidFile</KEYWORD1>
+ <KEYWORD1>ProtocolEcho</KEYWORD1>
+ <KEYWORD1>ProxyBadHeader</KEYWORD1>
+ <KEYWORD1>ProxyBlock</KEYWORD1>
+ <KEYWORD1>ProxyDomain</KEYWORD1>
+ <KEYWORD1>ProxyErrorOverride</KEYWORD1>
+ <KEYWORD1>ProxyIOBufferSize</KEYWORD1>
+ <KEYWORD1>ProxyMaxForwards</KEYWORD1>
+ <KEYWORD1>ProxyPass</KEYWORD1>
+ <KEYWORD1>ProxyPassReverse</KEYWORD1>
+ <KEYWORD1>ProxyPreserveHost</KEYWORD1>
+ <KEYWORD1>ProxyReceiveBufferSize</KEYWORD1>
+ <KEYWORD1>ProxyRemote</KEYWORD1>
+ <KEYWORD1>ProxyRemoteMatch</KEYWORD1>
+ <KEYWORD1>ProxyRequests</KEYWORD1>
+ <KEYWORD1>ProxyTimeout</KEYWORD1>
+ <KEYWORD1>ProxyVia</KEYWORD1>
+ <KEYWORD1>RLimitCPU</KEYWORD1>
+ <KEYWORD1>RLimitMEM</KEYWORD1>
+ <KEYWORD1>RLimitNPROC</KEYWORD1>
+ <KEYWORD1>ReadmeName</KEYWORD1>
+ <KEYWORD1>Redirect</KEYWORD1>
+ <KEYWORD1>RedirectMatch</KEYWORD1>
+ <KEYWORD1>RedirectPermanent</KEYWORD1>
+ <KEYWORD1>RedirectTemp</KEYWORD1>
+ <KEYWORD1>RequestHeader</KEYWORD1>
+ <KEYWORD1>RewriteBase</KEYWORD1>
+ <KEYWORD1>RewriteCond</KEYWORD1>
+ <KEYWORD1>RewriteEngine</KEYWORD1>
+ <KEYWORD1>RewriteLock</KEYWORD1>
+ <KEYWORD1>RewriteLog</KEYWORD1>
+ <KEYWORD1>RewriteLogLevel</KEYWORD1>
+ <KEYWORD1>RewriteMap</KEYWORD1>
+ <KEYWORD1>RewriteOptions</KEYWORD1>
+ <KEYWORD1>RewriteRule</KEYWORD1>
+ <KEYWORD1>SSIEndTag</KEYWORD1>
+ <KEYWORD1>SSIErrorMsg</KEYWORD1>
+ <KEYWORD1>SSIStartTag</KEYWORD1>
+ <KEYWORD1>SSITimeFormat</KEYWORD1>
+ <KEYWORD1>SSIUndefinedEcho</KEYWORD1>
+ <KEYWORD1>SSLCACertificateFile</KEYWORD1>
+ <KEYWORD1>SSLCACertificatePath</KEYWORD1>
+ <KEYWORD1>SSLCARevocationFile</KEYWORD1>
+ <KEYWORD1>SSLCARevocationPath</KEYWORD1>
+ <KEYWORD1>SSLCertificateChainFile</KEYWORD1>
+ <KEYWORD1>SSLCertificateFile</KEYWORD1>
+ <KEYWORD1>SSLCertificateKeyFile</KEYWORD1>
+ <KEYWORD1>SSLCipherSuite</KEYWORD1>
+ <KEYWORD1>SSLEngine</KEYWORD1>
+ <KEYWORD1>SSLMutex</KEYWORD1>
+ <KEYWORD1>SSLOptions</KEYWORD1>
+ <KEYWORD1>SSLPassPhraseDialog</KEYWORD1>
+ <KEYWORD1>SSLProtocol</KEYWORD1>
+ <KEYWORD1>SSLProxyCACertificateFile</KEYWORD1>
+ <KEYWORD1>SSLProxyCACertificatePath</KEYWORD1>
+ <KEYWORD1>SSLProxyCARevocationFile</KEYWORD1>
+ <KEYWORD1>SSLProxyCARevocationPath</KEYWORD1>
+ <KEYWORD1>SSLProxyCipherSuite</KEYWORD1>
+ <KEYWORD1>SSLProxyEngine</KEYWORD1>
+ <KEYWORD1>SSLProxyMachineCertificateFile</KEYWORD1>
+ <KEYWORD1>SSLProxyMachineCertificatePath</KEYWORD1>
+ <KEYWORD1>SSLProxyProtocol</KEYWORD1>
+ <KEYWORD1>SSLProxyVerify</KEYWORD1>
+ <KEYWORD1>SSLProxyVerifyDepth</KEYWORD1>
+ <KEYWORD1>SSLRandomSeed</KEYWORD1>
+ <KEYWORD1>SSLSessionCache</KEYWORD1>
+ <KEYWORD1>SSLSessionCacheTimeout</KEYWORD1>
+ <KEYWORD1>SSLVerifyClient</KEYWORD1>
+ <KEYWORD1>SSLVerifyDepth</KEYWORD1>
+ <KEYWORD1>ScoreBoardFile</KEYWORD1>
+ <KEYWORD1>Script</KEYWORD1>
+ <KEYWORD1>ScriptAlias</KEYWORD1>
+ <KEYWORD1>ScriptAliasMatch</KEYWORD1>
+ <KEYWORD1>ScriptInterpreterSource</KEYWORD1>
+ <KEYWORD1>ScriptLog</KEYWORD1>
+ <KEYWORD1>ScriptLogBuffer</KEYWORD1>
+ <KEYWORD1>ScriptLogLength</KEYWORD1>
+ <KEYWORD1>ScriptSock</KEYWORD1>
+ <KEYWORD1>SecureListen</KEYWORD1>
+ <KEYWORD1>SendBufferSize</KEYWORD1>
+ <KEYWORD1>ServerAdmin</KEYWORD1>
+ <KEYWORD1>ServerLimit</KEYWORD1>
+ <KEYWORD1>ServerName</KEYWORD1>
+ <KEYWORD1>ServerRoot</KEYWORD1>
+ <KEYWORD1>ServerSignature</KEYWORD1>
+ <KEYWORD1>ServerTokens</KEYWORD1>
+ <KEYWORD1>SetEnv</KEYWORD1>
+ <KEYWORD1>SetEnvIf</KEYWORD1>
+ <KEYWORD1>SetEnvIfNoCase</KEYWORD1>
+ <KEYWORD1>SetHandler</KEYWORD1>
+ <KEYWORD1>SetInputFilter</KEYWORD1>
+ <KEYWORD1>SetOutputFilter</KEYWORD1>
+ <KEYWORD1>StartServers</KEYWORD1>
+ <KEYWORD1>StartThreads</KEYWORD1>
+ <KEYWORD1>SuexecUserGroup</KEYWORD1>
+ <KEYWORD1>ThreadLimit</KEYWORD1>
+ <KEYWORD1>ThreadStackSize</KEYWORD1>
+ <KEYWORD1>ThreadsPerChild</KEYWORD1>
+ <KEYWORD1>TimeOut</KEYWORD1>
+ <KEYWORD1>TransferLog</KEYWORD1>
+ <KEYWORD1>TypesConfig</KEYWORD1>
+ <KEYWORD1>UnsetEnv</KEYWORD1>
+ <KEYWORD1>UseCanonicalName</KEYWORD1>
+ <KEYWORD1>User</KEYWORD1>
+ <KEYWORD1>UserDir</KEYWORD1>
+ <KEYWORD1>VirtualDocumentRoot</KEYWORD1>
+ <KEYWORD1>VirtualDocumentRootIP</KEYWORD1>
+ <KEYWORD1>VirtualScriptAlias</KEYWORD1>
+ <KEYWORD1>VirtualScriptAliasIP</KEYWORD1>
+ <KEYWORD1>Win32DisableAcceptEx</KEYWORD1>
+ <KEYWORD1>XBitHack</KEYWORD1>
+
+ <!-- Apache 1.x -->
+ <KEYWORD4>AddModule</KEYWORD4>
+ <KEYWORD4>ClearModuleList</KEYWORD4>
+ <KEYWORD4>ServerType</KEYWORD4>
+ <KEYWORD4>Port</KEYWORD4>
+
+ <LITERAL2>Off</LITERAL2>
+ <LITERAL2>On</LITERAL2>
+ <LITERAL2>None</LITERAL2>
+ </KEYWORDS>
+ </RULES>
+
+ <RULES SET="DIRECTIVE" DEFAULT="NULL" IGNORE_CASE="TRUE">
+
+ <EOL_SPAN TYPE="COMMENT2">#</EOL_SPAN>
+
+ <SPAN TYPE="LITERAL1" ESCAPE="\" NO_LINE_BREAK="TRUE">
+ <BEGIN>"</BEGIN>
+ <END>"</END>
+ </SPAN>
+
+ <SPAN_REGEXP HASH_CHAR="<VirtualHost" TYPE="MARKUP" DELEGATE="VHOST">
+ <BEGIN><![CDATA[<(VirtualHost)[^>]*>]]></BEGIN>
+ <END><![CDATA[</$1>]]></END>
+ </SPAN_REGEXP>
+
+ <SPAN_REGEXP HASH_CHAR="<" TYPE="MARKUP" DELEGATE="DIRECTIVE">
+ <BEGIN><![CDATA[<(\w+)[^>]*>]]></BEGIN>
+ <END><![CDATA[</$1>]]></END>
+ </SPAN_REGEXP>
+
+ <KEYWORDS>
+
+ <KEYWORD2>AcceptMutex</KEYWORD2>
+ <KEYWORD2>AcceptPathInfo</KEYWORD2>
+ <KEYWORD2>AccessFileName</KEYWORD2>
+ <KEYWORD2>Action</KEYWORD2>
+ <KEYWORD2>AddAlt</KEYWORD2>
+ <KEYWORD2>AddAltByEncoding</KEYWORD2>
+ <KEYWORD2>AddAltByType</KEYWORD2>
+ <KEYWORD2>AddCharset</KEYWORD2>
+ <KEYWORD2>AddDefaultCharset</KEYWORD2>
+ <KEYWORD2>AddDescription</KEYWORD2>
+ <KEYWORD2>AddEncoding</KEYWORD2>
+ <KEYWORD2>AddHandler</KEYWORD2>
+ <KEYWORD2>AddIcon</KEYWORD2>
+ <KEYWORD2>AddIconByEncoding</KEYWORD2>
+ <KEYWORD2>AddIconByType</KEYWORD2>
+ <KEYWORD2>AddInputFilter</KEYWORD2>
+ <KEYWORD2>AddLanguage</KEYWORD2>
+ <KEYWORD2>AddModuleInfo</KEYWORD2>
+ <KEYWORD2>AddOutputFilter</KEYWORD2>
+ <KEYWORD2>AddOutputFilterByType</KEYWORD2>
+ <KEYWORD2>AddType</KEYWORD2>
+ <KEYWORD2>Alias</KEYWORD2>
+ <KEYWORD2>AliasMatch</KEYWORD2>
+ <KEYWORD2>Allow</KEYWORD2>
+ <KEYWORD2>AllowCONNECT</KEYWORD2>
+ <KEYWORD2>AllowEncodedSlashes</KEYWORD2>
+ <KEYWORD2>AllowOverride</KEYWORD2>
+ <KEYWORD2>Anonymous</KEYWORD2>
+ <KEYWORD2>Anonymous_Authoritative</KEYWORD2>
+ <KEYWORD2>Anonymous_LogEmail</KEYWORD2>
+ <KEYWORD2>Anonymous_MustGiveEmail</KEYWORD2>
+ <KEYWORD2>Anonymous_NoUserID</KEYWORD2>
+ <KEYWORD2>Anonymous_VerifyEmail</KEYWORD2>
+ <KEYWORD2>AuthAuthoritative</KEYWORD2>
+ <KEYWORD2>AuthDBMAuthoritative</KEYWORD2>
+ <KEYWORD2>AuthDBMGroupFile</KEYWORD2>
+ <KEYWORD2>AuthDBMType</KEYWORD2>
+ <KEYWORD2>AuthDBMUserFile</KEYWORD2>
+ <KEYWORD2>AuthDigestAlgorithm</KEYWORD2>
+ <KEYWORD2>AuthDigestDomain</KEYWORD2>
+ <KEYWORD2>AuthDigestFile</KEYWORD2>
+ <KEYWORD2>AuthDigestGroupFile</KEYWORD2>
+ <KEYWORD2>AuthDigestNcCheck</KEYWORD2>
+ <KEYWORD2>AuthDigestNonceFormat</KEYWORD2>
+ <KEYWORD2>AuthDigestNonceLifetime</KEYWORD2>
+ <KEYWORD2>AuthDigestQop</KEYWORD2>
+ <KEYWORD2>AuthDigestShmemSize</KEYWORD2>
+ <KEYWORD2>AuthGroupFile</KEYWORD2>
+ <KEYWORD2>AuthLDAPAuthoritative</KEYWORD2>
+ <KEYWORD2>AuthLDAPBindDN</KEYWORD2>
+ <KEYWORD2>AuthLDAPBindPassword</KEYWORD2>
+ <KEYWORD2>AuthLDAPCharsetConfig</KEYWORD2>
+ <KEYWORD2>AuthLDAPCompareDNOnServer</KEYWORD2>
+ <KEYWORD2>AuthLDAPDereferenceAliases</KEYWORD2>
+ <KEYWORD2>AuthLDAPEnabled</KEYWORD2>
+ <KEYWORD2>AuthLDAPFrontPageHack</KEYWORD2>
+ <KEYWORD2>AuthLDAPGroupAttribute</KEYWORD2>
+ <KEYWORD2>AuthLDAPGroupAttributeIsDN</KEYWORD2>
+ <KEYWORD2>AuthLDAPRemoteUserIsDN</KEYWORD2>
+ <KEYWORD2>AuthLDAPUrl</KEYWORD2>
+ <KEYWORD2>AuthName</KEYWORD2>
+ <KEYWORD2>AuthType</KEYWORD2>
+ <KEYWORD2>AuthUserFile</KEYWORD2>
+ <KEYWORD2>BS2000Account</KEYWORD2>
+ <KEYWORD2>BrowserMatch</KEYWORD2>
+ <KEYWORD2>BrowserMatchNoCase</KEYWORD2>
+ <KEYWORD2>CGIMapExtension</KEYWORD2>
+ <KEYWORD2>CacheDefaultExpire</KEYWORD2>
+ <KEYWORD2>CacheDirLength</KEYWORD2>
+ <KEYWORD2>CacheDirLevels</KEYWORD2>
+ <KEYWORD2>CacheDisable</KEYWORD2>
+ <KEYWORD2>CacheEnable</KEYWORD2>
+ <KEYWORD2>CacheExpiryCheck</KEYWORD2>
+ <KEYWORD2>CacheFile</KEYWORD2>
+ <KEYWORD2>CacheForceCompletion</KEYWORD2>
+ <KEYWORD2>CacheGcClean</KEYWORD2>
+ <KEYWORD2>CacheGcDaily</KEYWORD2>
+ <KEYWORD2>CacheGcInterval</KEYWORD2>
+ <KEYWORD2>CacheGcMemUsage</KEYWORD2>
+ <KEYWORD2>CacheGcUnused</KEYWORD2>
+ <KEYWORD2>CacheIgnoreCacheControl</KEYWORD2>
+ <KEYWORD2>CacheIgnoreNoLastMod</KEYWORD2>
+ <KEYWORD2>CacheLastModifiedFactor</KEYWORD2>
+ <KEYWORD2>CacheMaxExpire</KEYWORD2>
+ <KEYWORD2>CacheMaxFileSize</KEYWORD2>
+ <KEYWORD2>CacheMinFileSize</KEYWORD2>
+ <KEYWORD2>CacheNegotiatedDocs</KEYWORD2>
+ <KEYWORD2>CacheRoot</KEYWORD2>
+ <KEYWORD2>CacheSize</KEYWORD2>
+ <KEYWORD2>CacheTimeMargin</KEYWORD2>
+ <KEYWORD2>CharsetDefault</KEYWORD2>
+ <KEYWORD2>CharsetOptions</KEYWORD2>
+ <KEYWORD2>CharsetSourceEnc</KEYWORD2>
+ <KEYWORD2>CheckSpelling</KEYWORD2>
+ <KEYWORD2>ChildPerUserID</KEYWORD2>
+ <KEYWORD2>ContentDigest</KEYWORD2>
+ <KEYWORD2>CookieDomain</KEYWORD2>
+ <KEYWORD2>CookieExpires</KEYWORD2>
+ <KEYWORD2>CookieLog</KEYWORD2>
+ <KEYWORD2>CookieName</KEYWORD2>
+ <KEYWORD2>CookieStyle</KEYWORD2>
+ <KEYWORD2>CookieTracking</KEYWORD2>
+ <KEYWORD2>CoreDumpDirectory</KEYWORD2>
+ <KEYWORD2>CustomLog</KEYWORD2>
+ <KEYWORD2>Dav</KEYWORD2>
+ <KEYWORD2>DavDepthInfinity</KEYWORD2>
+ <KEYWORD2>DavLockDB</KEYWORD2>
+ <KEYWORD2>DavMinTimeout</KEYWORD2>
+ <KEYWORD2>DefaultIcon</KEYWORD2>
+ <KEYWORD2>DefaultLanguage</KEYWORD2>
+ <KEYWORD2>DefaultType</KEYWORD2>
+ <KEYWORD2>DeflateBufferSize</KEYWORD2>
+ <KEYWORD2>DeflateCompressionLevel</KEYWORD2>
+ <KEYWORD2>DeflateFilterNote</KEYWORD2>
+ <KEYWORD2>DeflateMemLevel</KEYWORD2>
+ <KEYWORD2>DeflateWindowSize</KEYWORD2>
+ <KEYWORD2>Deny</KEYWORD2>
+ <KEYWORD2>DirectoryIndex</KEYWORD2>
+ <KEYWORD1>DirectorySlash</KEYWORD1>
+ <KEYWORD2>DocumentRoot</KEYWORD2>
+ <KEYWORD2>EnableMMAP</KEYWORD2>
+ <KEYWORD2>EnableSendfile</KEYWORD2>
+ <KEYWORD2>ErrorDocument</KEYWORD2>
+ <KEYWORD2>ErrorLog</KEYWORD2>
+ <KEYWORD2>Example</KEYWORD2>
+ <KEYWORD2>ExpiresActive</KEYWORD2>
+ <KEYWORD2>ExpiresByType</KEYWORD2>
+ <KEYWORD2>ExpiresDefault</KEYWORD2>
+ <KEYWORD2>ExtFilterDefine</KEYWORD2>
+ <KEYWORD2>ExtFilterOptions</KEYWORD2>
+ <KEYWORD2>ExtendedStatus</KEYWORD2>
+ <KEYWORD2>FileETag</KEYWORD2>
+ <KEYWORD2>ForceLanguagePriority</KEYWORD2>
+ <KEYWORD2>ForceType</KEYWORD2>
+ <KEYWORD2>Group</KEYWORD2>
+ <KEYWORD2>Header</KEYWORD2>
+ <KEYWORD2>HeaderName</KEYWORD2>
+ <KEYWORD2>HostnameLookups</KEYWORD2>
+ <KEYWORD2>ISAPIAppendLogToErrors</KEYWORD2>
+ <KEYWORD2>ISAPIAppendLogToQuery</KEYWORD2>
+ <KEYWORD2>ISAPICacheFile</KEYWORD2>
+ <KEYWORD2>ISAPIFakeAsync</KEYWORD2>
+ <KEYWORD2>ISAPILogNotSupported</KEYWORD2>
+ <KEYWORD2>ISAPIReadAheadBuffer</KEYWORD2>
+ <KEYWORD2>IdentityCheck</KEYWORD2>
+ <KEYWORD2>ImapBase</KEYWORD2>
+ <KEYWORD2>ImapDefault</KEYWORD2>
+ <KEYWORD2>ImapMenu</KEYWORD2>
+ <KEYWORD2>Include</KEYWORD2>
+ <KEYWORD2>IndexIgnore</KEYWORD2>
+ <KEYWORD2>IndexOptions</KEYWORD2>
+ <KEYWORD2>IndexOrderDefault</KEYWORD2>
+ <KEYWORD2>KeepAlive</KEYWORD2>
+ <KEYWORD2>KeepAliveTimeout</KEYWORD2>
+ <KEYWORD2>LDAPCacheEntries</KEYWORD2>
+ <KEYWORD2>LDAPCacheTTL</KEYWORD2>
+ <KEYWORD2>LDAPOpCacheEntries</KEYWORD2>
+ <KEYWORD2>LDAPOpCacheTTL</KEYWORD2>
+ <KEYWORD2>LDAPSharedCacheSize</KEYWORD2>
+ <KEYWORD2>LDAPTrustedCA</KEYWORD2>
+ <KEYWORD2>LDAPTrustedCAType</KEYWORD2>
+ <KEYWORD2>LanguagePriority</KEYWORD2>
+ <KEYWORD2>LimitInternalRecursion</KEYWORD2>
+ <KEYWORD2>LimitRequestBody</KEYWORD2>
+ <KEYWORD2>LimitRequestFields</KEYWORD2>
+ <KEYWORD2>LimitRequestFieldsize</KEYWORD2>
+ <KEYWORD2>LimitRequestLine</KEYWORD2>
+ <KEYWORD2>LimitXMLRequestBody</KEYWORD2>
+ <KEYWORD2>Listen</KEYWORD2>
+ <KEYWORD2>ListenBacklog</KEYWORD2>
+ <KEYWORD2>LoadFile</KEYWORD2>
+ <KEYWORD2>LoadModule</KEYWORD2>
+ <KEYWORD2>LockFile</KEYWORD2>
+ <KEYWORD2>LogFormat</KEYWORD2>
+ <KEYWORD2>LogLevel</KEYWORD2>
+ <KEYWORD2>MCacheMaxObjectCount</KEYWORD2>
+ <KEYWORD2>MCacheMaxObjectSize</KEYWORD2>
+ <KEYWORD2>MCacheMaxStreamingBuffer</KEYWORD2>
+ <KEYWORD2>MCacheMinObjectSize</KEYWORD2>
+ <KEYWORD2>MCacheRemovalAlgorithm</KEYWORD2>
+ <KEYWORD2>MCacheSize</KEYWORD2>
+ <KEYWORD2>MMapFile</KEYWORD2>
+ <KEYWORD2>MaxClients</KEYWORD2>
+ <KEYWORD2>MaxKeepAliveRequests</KEYWORD2>
+ <KEYWORD2>MaxMemFree</KEYWORD2>
+ <KEYWORD2>MaxRequestsPerChild</KEYWORD2>
+ <KEYWORD2>MaxRequestsPerThread</KEYWORD2>
+ <KEYWORD2>MaxSpareServers</KEYWORD2>
+ <KEYWORD2>MaxSpareThreads</KEYWORD2>
+ <KEYWORD2>MaxThreads</KEYWORD2>
+ <KEYWORD2>MaxThreadsPerChild</KEYWORD2>
+ <KEYWORD2>MetaDir</KEYWORD2>
+ <KEYWORD2>MetaFiles</KEYWORD2>
+ <KEYWORD2>MetaSuffix</KEYWORD2>
+ <KEYWORD2>MimeMagicFile</KEYWORD2>
+ <KEYWORD2>MinSpareServers</KEYWORD2>
+ <KEYWORD2>MinSpareThreads</KEYWORD2>
+ <KEYWORD2>ModMimeUsePathInfo</KEYWORD2>
+ <KEYWORD2>MultiviewsMatch</KEYWORD2>
+ <KEYWORD2>NWSSLTrustedCerts</KEYWORD2>
+ <KEYWORD2>NameVirtualHost</KEYWORD2>
+ <KEYWORD2>NoProxy</KEYWORD2>
+ <KEYWORD2>NumServers</KEYWORD2>
+ <KEYWORD2>Options</KEYWORD2>
+ <KEYWORD2>Order</KEYWORD2>
+ <KEYWORD2>PassEnv</KEYWORD2>
+ <KEYWORD2>PidFile</KEYWORD2>
+ <KEYWORD2>ProtocolEcho</KEYWORD2>
+ <KEYWORD2>ProxyBadHeader</KEYWORD2>
+ <KEYWORD2>ProxyBlock</KEYWORD2>
+ <KEYWORD2>ProxyDomain</KEYWORD2>
+ <KEYWORD2>ProxyErrorOverride</KEYWORD2>
+ <KEYWORD2>ProxyIOBufferSize</KEYWORD2>
+ <KEYWORD2>ProxyMaxForwards</KEYWORD2>
+ <KEYWORD2>ProxyPass</KEYWORD2>
+ <KEYWORD2>ProxyPassReverse</KEYWORD2>
+ <KEYWORD2>ProxyPreserveHost</KEYWORD2>
+ <KEYWORD2>ProxyReceiveBufferSize</KEYWORD2>
+ <KEYWORD2>ProxyRemote</KEYWORD2>
+ <KEYWORD2>ProxyRemoteMatch</KEYWORD2>
+ <KEYWORD2>ProxyRequests</KEYWORD2>
+ <KEYWORD2>ProxyTimeout</KEYWORD2>
+ <KEYWORD2>ProxyVia</KEYWORD2>
+ <KEYWORD2>RLimitCPU</KEYWORD2>
+ <KEYWORD2>RLimitMEM</KEYWORD2>
+ <KEYWORD2>RLimitNPROC</KEYWORD2>
+ <KEYWORD2>ReadmeName</KEYWORD2>
+ <KEYWORD2>Redirect</KEYWORD2>
+ <KEYWORD2>RedirectMatch</KEYWORD2>
+ <KEYWORD2>RedirectPermanent</KEYWORD2>
+ <KEYWORD2>RedirectTemp</KEYWORD2>
+ <KEYWORD2>RemoveCharset</KEYWORD2>
+ <KEYWORD2>RemoveEncoding</KEYWORD2>
+ <KEYWORD2>RemoveHandler</KEYWORD2>
+ <KEYWORD2>RemoveInputFilter</KEYWORD2>
+ <KEYWORD2>RemoveLanguage</KEYWORD2>
+ <KEYWORD2>RemoveOutputFilter</KEYWORD2>
+ <KEYWORD2>RemoveType</KEYWORD2>
+ <KEYWORD2>RequestHeader</KEYWORD2>
+ <KEYWORD2>Require</KEYWORD2>
+ <KEYWORD2>RewriteBase</KEYWORD2>
+ <KEYWORD2>RewriteCond</KEYWORD2>
+ <KEYWORD2>RewriteEngine</KEYWORD2>
+ <KEYWORD2>RewriteLock</KEYWORD2>
+ <KEYWORD2>RewriteLog</KEYWORD2>
+ <KEYWORD2>RewriteLogLevel</KEYWORD2>
+ <KEYWORD2>RewriteMap</KEYWORD2>
+ <KEYWORD2>RewriteOptions</KEYWORD2>
+ <KEYWORD2>RewriteRule</KEYWORD2>
+ <KEYWORD2>SSIEndTag</KEYWORD2>
+ <KEYWORD2>SSIErrorMsg</KEYWORD2>
+ <KEYWORD2>SSIStartTag</KEYWORD2>
+ <KEYWORD2>SSITimeFormat</KEYWORD2>
+ <KEYWORD2>SSIUndefinedEcho</KEYWORD2>
+ <KEYWORD2>SSLCACertificateFile</KEYWORD2>
+ <KEYWORD2>SSLCACertificatePath</KEYWORD2>
+ <KEYWORD2>SSLCARevocationFile</KEYWORD2>
+ <KEYWORD2>SSLCARevocationPath</KEYWORD2>
+ <KEYWORD2>SSLCertificateChainFile</KEYWORD2>
+ <KEYWORD2>SSLCertificateFile</KEYWORD2>
+ <KEYWORD2>SSLCertificateKeyFile</KEYWORD2>
+ <KEYWORD2>SSLCipherSuite</KEYWORD2>
+ <KEYWORD2>SSLEngine</KEYWORD2>
+ <KEYWORD2>SSLMutex</KEYWORD2>
+ <KEYWORD2>SSLOptions</KEYWORD2>
+ <KEYWORD2>SSLPassPhraseDialog</KEYWORD2>
+ <KEYWORD2>SSLProtocol</KEYWORD2>
+ <KEYWORD2>SSLProxyCACertificateFile</KEYWORD2>
+ <KEYWORD2>SSLProxyCACertificatePath</KEYWORD2>
+ <KEYWORD2>SSLProxyCARevocationFile</KEYWORD2>
+ <KEYWORD2>SSLProxyCARevocationPath</KEYWORD2>
+ <KEYWORD2>SSLProxyCipherSuite</KEYWORD2>
+ <KEYWORD2>SSLProxyEngine</KEYWORD2>
+ <KEYWORD2>SSLProxyMachineCertificateFile</KEYWORD2>
+ <KEYWORD2>SSLProxyMachineCertificatePath</KEYWORD2>
+ <KEYWORD2>SSLProxyProtocol</KEYWORD2>
+ <KEYWORD2>SSLProxyVerify</KEYWORD2>
+ <KEYWORD2>SSLProxyVerifyDepth</KEYWORD2>
+ <KEYWORD2>SSLRandomSeed</KEYWORD2>
+ <KEYWORD2>SSLRequire</KEYWORD2>
+ <KEYWORD2>SSLRequireSSL</KEYWORD2>
+ <KEYWORD2>SSLSessionCache</KEYWORD2>
+ <KEYWORD2>SSLSessionCacheTimeout</KEYWORD2>
+ <KEYWORD2>SSLVerifyClient</KEYWORD2>
+ <KEYWORD2>SSLVerifyDepth</KEYWORD2>
+ <KEYWORD2>Satisfy</KEYWORD2>
+ <KEYWORD2>ScoreBoardFile</KEYWORD2>
+ <KEYWORD2>Script</KEYWORD2>
+ <KEYWORD2>ScriptAlias</KEYWORD2>
+ <KEYWORD2>ScriptAliasMatch</KEYWORD2>
+ <KEYWORD2>ScriptInterpreterSource</KEYWORD2>
+ <KEYWORD2>ScriptLog</KEYWORD2>
+ <KEYWORD2>ScriptLogBuffer</KEYWORD2>
+ <KEYWORD2>ScriptLogLength</KEYWORD2>
+ <KEYWORD2>ScriptSock</KEYWORD2>
+ <KEYWORD2>SecureListen</KEYWORD2>
+ <KEYWORD2>SendBufferSize</KEYWORD2>
+ <KEYWORD2>ServerAdmin</KEYWORD2>
+ <KEYWORD2>ServerLimit</KEYWORD2>
+ <KEYWORD2>ServerName</KEYWORD2>
+ <KEYWORD2>ServerRoot</KEYWORD2>
+ <KEYWORD2>ServerSignature</KEYWORD2>
+ <KEYWORD2>ServerTokens</KEYWORD2>
+ <KEYWORD2>SetEnv</KEYWORD2>
+ <KEYWORD2>SetEnvIf</KEYWORD2>
+ <KEYWORD2>SetEnvIfNoCase</KEYWORD2>
+ <KEYWORD2>SetHandler</KEYWORD2>
+ <KEYWORD2>SetInputFilter</KEYWORD2>
+ <KEYWORD2>SetOutputFilter</KEYWORD2>
+ <KEYWORD2>StartServers</KEYWORD2>
+ <KEYWORD2>StartThreads</KEYWORD2>
+ <KEYWORD2>SuexecUserGroup</KEYWORD2>
+ <KEYWORD2>ThreadLimit</KEYWORD2>
+ <KEYWORD2>ThreadStackSize</KEYWORD2>
+ <KEYWORD2>ThreadsPerChild</KEYWORD2>
+ <KEYWORD2>TimeOut</KEYWORD2>
+ <KEYWORD2>TransferLog</KEYWORD2>
+ <KEYWORD2>TypesConfig</KEYWORD2>
+ <KEYWORD2>UnsetEnv</KEYWORD2>
+ <KEYWORD2>UseCanonicalName</KEYWORD2>
+ <KEYWORD2>User</KEYWORD2>
+ <KEYWORD2>UserDir</KEYWORD2>
+ <KEYWORD2>VirtualDocumentRoot</KEYWORD2>
+ <KEYWORD2>VirtualDocumentRootIP</KEYWORD2>
+ <KEYWORD2>VirtualScriptAlias</KEYWORD2>
+ <KEYWORD2>VirtualScriptAliasIP</KEYWORD2>
+ <KEYWORD2>XBitHack</KEYWORD2>
+
+ <!-- Apache 1.x -->
+ <KEYWORD4>AddModule</KEYWORD4>
+ <KEYWORD4>ClearModuleList</KEYWORD4>
+
+ <!-- Subversion directives -->
+ <KEYWORD3>SVNPath</KEYWORD3>
+ <KEYWORD3>SVNParentPath</KEYWORD3>
+ <KEYWORD3>SVNIndexXSLT</KEYWORD3>
+
+ <!-- mod_python directives -->
+ <KEYWORD3>PythonHandler</KEYWORD3>
+ <KEYWORD3>PythonDebug</KEYWORD3>
+
+ <LITERAL2>All</LITERAL2>
+ <LITERAL2>ExecCGI</LITERAL2>
+ <LITERAL2>FollowSymLinks</LITERAL2>
+ <LITERAL2>Includes</LITERAL2>
+ <LITERAL2>IncludesNOEXEC</LITERAL2>
+ <LITERAL2>Indexes</LITERAL2>
+ <LITERAL2>MultiViews</LITERAL2>
+ <LITERAL2>None</LITERAL2>
+ <LITERAL2>Off</LITERAL2>
+ <LITERAL2>On</LITERAL2>
+ <LITERAL2>SymLinksIfOwnerMatch</LITERAL2>
+ <LITERAL2>from</LITERAL2>
+ </KEYWORDS>
+ </RULES>
+
+ <RULES SET="VHOST" DEFAULT="NULL" IGNORE_CASE="TRUE">
+
+ <EOL_SPAN TYPE="COMMENT2">#</EOL_SPAN>
+
+ <SPAN_REGEXP HASH_CHAR="<" TYPE="MARKUP" DELEGATE="DIRECTIVE">
+ <BEGIN><![CDATA[<(\w+)[^>]*>]]></BEGIN>
+ <END><![CDATA[</$1>]]></END>
+ </SPAN_REGEXP>
+
+ <SPAN TYPE="LITERAL1" ESCAPE="\" NO_LINE_BREAK="TRUE">
+ <BEGIN>"</BEGIN>
+ <END>"</END>
+ </SPAN>
+
+ <KEYWORDS>
+ <KEYWORD2>AcceptMutex</KEYWORD2>
+ <KEYWORD2>AcceptPathInfo</KEYWORD2>
+ <KEYWORD2>AccessFileName</KEYWORD2>
+ <KEYWORD2>Action</KEYWORD2>
+ <KEYWORD2>AddAlt</KEYWORD2>
+ <KEYWORD2>AddAltByEncoding</KEYWORD2>
+ <KEYWORD2>AddAltByType</KEYWORD2>
+ <KEYWORD2>AddCharset</KEYWORD2>
+ <KEYWORD2>AddDefaultCharset</KEYWORD2>
+ <KEYWORD2>AddDescription</KEYWORD2>
+ <KEYWORD2>AddEncoding</KEYWORD2>
+ <KEYWORD2>AddHandler</KEYWORD2>
+ <KEYWORD2>AddIcon</KEYWORD2>
+ <KEYWORD2>AddIconByEncoding</KEYWORD2>
+ <KEYWORD2>AddIconByType</KEYWORD2>
+ <KEYWORD2>AddInputFilter</KEYWORD2>
+ <KEYWORD2>AddLanguage</KEYWORD2>
+ <KEYWORD2>AddModuleInfo</KEYWORD2>
+ <KEYWORD2>AddOutputFilter</KEYWORD2>
+ <KEYWORD2>AddOutputFilterByType</KEYWORD2>
+ <KEYWORD2>AddType</KEYWORD2>
+ <KEYWORD2>Alias</KEYWORD2>
+ <KEYWORD2>AliasMatch</KEYWORD2>
+ <KEYWORD2>AllowCONNECT</KEYWORD2>
+ <KEYWORD2>AllowEncodedSlashes</KEYWORD2>
+ <KEYWORD2>AssignUserID</KEYWORD2>
+ <KEYWORD2>AuthDigestNcCheck</KEYWORD2>
+ <KEYWORD2>AuthDigestShmemSize</KEYWORD2>
+ <KEYWORD2>AuthLDAPCharsetConfig</KEYWORD2>
+ <KEYWORD2>BS2000Account</KEYWORD2>
+ <KEYWORD2>BrowserMatch</KEYWORD2>
+ <KEYWORD2>BrowserMatchNoCase</KEYWORD2>
+ <KEYWORD2>CacheDefaultExpire</KEYWORD2>
+ <KEYWORD2>CacheDirLength</KEYWORD2>
+ <KEYWORD2>CacheDirLevels</KEYWORD2>
+ <KEYWORD2>CacheDisable</KEYWORD2>
+ <KEYWORD2>CacheEnable</KEYWORD2>
+ <KEYWORD2>CacheExpiryCheck</KEYWORD2>
+ <KEYWORD2>CacheFile</KEYWORD2>
+ <KEYWORD2>CacheForceCompletion</KEYWORD2>
+ <KEYWORD2>CacheGcClean</KEYWORD2>
+ <KEYWORD2>CacheGcDaily</KEYWORD2>
+ <KEYWORD2>CacheGcInterval</KEYWORD2>
+ <KEYWORD2>CacheGcMemUsage</KEYWORD2>
+ <KEYWORD2>CacheGcUnused</KEYWORD2>
+ <KEYWORD2>CacheIgnoreCacheControl</KEYWORD2>
+ <KEYWORD2>CacheIgnoreNoLastMod</KEYWORD2>
+ <KEYWORD2>CacheLastModifiedFactor</KEYWORD2>
+ <KEYWORD2>CacheMaxExpire</KEYWORD2>
+ <KEYWORD2>CacheMaxFileSize</KEYWORD2>
+ <KEYWORD2>CacheMinFileSize</KEYWORD2>
+ <KEYWORD2>CacheNegotiatedDocs</KEYWORD2>
+ <KEYWORD2>CacheRoot</KEYWORD2>
+ <KEYWORD2>CacheSize</KEYWORD2>
+ <KEYWORD2>CacheTimeMargin</KEYWORD2>
+ <KEYWORD2>CharsetDefault</KEYWORD2>
+ <KEYWORD2>CharsetOptions</KEYWORD2>
+ <KEYWORD2>CharsetSourceEnc</KEYWORD2>
+ <KEYWORD2>CheckSpelling</KEYWORD2>
+ <KEYWORD2>ChildPerUserID</KEYWORD2>
+ <KEYWORD2>ContentDigest</KEYWORD2>
+ <KEYWORD2>CookieDomain</KEYWORD2>
+ <KEYWORD2>CookieExpires</KEYWORD2>
+ <KEYWORD2>CookieLog</KEYWORD2>
+ <KEYWORD2>CookieName</KEYWORD2>
+ <KEYWORD2>CookieStyle</KEYWORD2>
+ <KEYWORD2>CookieTracking</KEYWORD2>
+ <KEYWORD2>CoreDumpDirectory</KEYWORD2>
+ <KEYWORD2>CustomLog</KEYWORD2>
+ <KEYWORD2>DavDepthInfinity</KEYWORD2>
+ <KEYWORD2>DavLockDB</KEYWORD2>
+ <KEYWORD2>DavMinTimeout</KEYWORD2>
+ <KEYWORD2>DefaultIcon</KEYWORD2>
+ <KEYWORD2>DefaultLanguage</KEYWORD2>
+ <KEYWORD2>DefaultType</KEYWORD2>
+ <KEYWORD2>DeflateBufferSize</KEYWORD2>
+ <KEYWORD2>DeflateCompressionLevel</KEYWORD2>
+ <KEYWORD2>DeflateFilterNote</KEYWORD2>
+ <KEYWORD2>DeflateMemLevel</KEYWORD2>
+ <KEYWORD2>DeflateWindowSize</KEYWORD2>
+ <KEYWORD2>DirectoryIndex</KEYWORD2>
+ <KEYWORD1>DirectorySlash</KEYWORD1>
+ <KEYWORD2>DocumentRoot</KEYWORD2>
+ <KEYWORD2>EnableMMAP</KEYWORD2>
+ <KEYWORD2>EnableSendfile</KEYWORD2>
+ <KEYWORD2>ErrorDocument</KEYWORD2>
+ <KEYWORD2>ErrorLog</KEYWORD2>
+ <KEYWORD2>Example</KEYWORD2>
+ <KEYWORD2>ExpiresActive</KEYWORD2>
+ <KEYWORD2>ExpiresByType</KEYWORD2>
+ <KEYWORD2>ExpiresDefault</KEYWORD2>
+ <KEYWORD2>ExtFilterDefine</KEYWORD2>
+ <KEYWORD2>ExtendedStatus</KEYWORD2>
+ <KEYWORD2>FileETag</KEYWORD2>
+ <KEYWORD2>ForceLanguagePriority</KEYWORD2>
+ <KEYWORD2>ForensicLog</KEYWORD2>
+ <KEYWORD2>Group</KEYWORD2>
+ <KEYWORD2>Header</KEYWORD2>
+ <KEYWORD2>HeaderName</KEYWORD2>
+ <KEYWORD2>HostnameLookups</KEYWORD2>
+ <KEYWORD2>ISAPIAppendLogToErrors</KEYWORD2>
+ <KEYWORD2>ISAPIAppendLogToQuery</KEYWORD2>
+ <KEYWORD2>ISAPICacheFile</KEYWORD2>
+ <KEYWORD2>ISAPIFakeAsync</KEYWORD2>
+ <KEYWORD2>ISAPILogNotSupported</KEYWORD2>
+ <KEYWORD2>ISAPIReadAheadBuffer</KEYWORD2>
+ <KEYWORD2>IdentityCheck</KEYWORD2>
+ <KEYWORD2>ImapBase</KEYWORD2>
+ <KEYWORD2>ImapDefault</KEYWORD2>
+ <KEYWORD2>ImapMenu</KEYWORD2>
+ <KEYWORD2>Include</KEYWORD2>
+ <KEYWORD2>IndexIgnore</KEYWORD2>
+ <KEYWORD2>IndexOptions</KEYWORD2>
+ <KEYWORD2>IndexOrderDefault</KEYWORD2>
+ <KEYWORD2>JkMount</KEYWORD2>
+ <KEYWORD2>KeepAlive</KEYWORD2>
+ <KEYWORD2>KeepAliveTimeout</KEYWORD2>
+ <KEYWORD2>LDAPCacheEntries</KEYWORD2>
+ <KEYWORD2>LDAPCacheTTL</KEYWORD2>
+ <KEYWORD2>LDAPOpCacheEntries</KEYWORD2>
+ <KEYWORD2>LDAPOpCacheTTL</KEYWORD2>
+ <KEYWORD2>LDAPSharedCacheSize</KEYWORD2>
+ <KEYWORD2>LDAPTrustedCA</KEYWORD2>
+ <KEYWORD2>LDAPTrustedCAType</KEYWORD2>
+ <KEYWORD2>LanguagePriority</KEYWORD2>
+ <KEYWORD2>LimitInternalRecursion</KEYWORD2>
+ <KEYWORD2>LimitRequestBody</KEYWORD2>
+ <KEYWORD2>LimitRequestFields</KEYWORD2>
+ <KEYWORD2>LimitRequestFieldsize</KEYWORD2>
+ <KEYWORD2>LimitRequestLine</KEYWORD2>
+ <KEYWORD2>LimitXMLRequestBody</KEYWORD2>
+ <KEYWORD2>Listen</KEYWORD2>
+ <KEYWORD2>ListenBacklog</KEYWORD2>
+ <KEYWORD2>LoadFile</KEYWORD2>
+ <KEYWORD2>LoadModule</KEYWORD2>
+ <KEYWORD2>LockFile</KEYWORD2>
+ <KEYWORD2>LogFormat</KEYWORD2>
+ <KEYWORD2>LogLevel</KEYWORD2>
+ <KEYWORD2>MCacheMaxObjectCount</KEYWORD2>
+ <KEYWORD2>MCacheMaxObjectSize</KEYWORD2>
+ <KEYWORD2>MCacheMaxStreamingBuffer</KEYWORD2>
+ <KEYWORD2>MCacheMinObjectSize</KEYWORD2>
+ <KEYWORD2>MCacheRemovalAlgorithm</KEYWORD2>
+ <KEYWORD2>MCacheSize</KEYWORD2>
+ <KEYWORD2>MMapFile</KEYWORD2>
+ <KEYWORD2>MaxClients</KEYWORD2>
+ <KEYWORD2>MaxKeepAliveRequests</KEYWORD2>
+ <KEYWORD2>MaxMemFree</KEYWORD2>
+ <KEYWORD2>MaxRequestsPerChild</KEYWORD2>
+ <KEYWORD2>MaxRequestsPerThread</KEYWORD2>
+ <KEYWORD2>MaxSpareServers</KEYWORD2>
+ <KEYWORD2>MaxSpareThreads</KEYWORD2>
+ <KEYWORD2>MaxThreads</KEYWORD2>
+ <KEYWORD2>MaxThreadsPerChild</KEYWORD2>
+ <KEYWORD2>MetaDir</KEYWORD2>
+ <KEYWORD2>MetaFiles</KEYWORD2>
+ <KEYWORD2>MetaSuffix</KEYWORD2>
+ <KEYWORD2>MimeMagicFile</KEYWORD2>
+ <KEYWORD2>MinSpareServers</KEYWORD2>
+ <KEYWORD2>MinSpareThreads</KEYWORD2>
+ <KEYWORD2>MultiviewsMatch</KEYWORD2>
+ <KEYWORD2>NWSSLTrustedCerts</KEYWORD2>
+ <KEYWORD2>NameVirtualHost</KEYWORD2>
+ <KEYWORD2>NoProxy</KEYWORD2>
+ <KEYWORD2>NumServers</KEYWORD2>
+ <KEYWORD2>Options</KEYWORD2>
+ <KEYWORD2>PassEnv</KEYWORD2>
+ <KEYWORD2>PidFile</KEYWORD2>
+ <KEYWORD2>ProtocolEcho</KEYWORD2>
+ <KEYWORD2>ProxyBadHeader</KEYWORD2>
+ <KEYWORD2>ProxyBlock</KEYWORD2>
+ <KEYWORD2>ProxyDomain</KEYWORD2>
+ <KEYWORD2>ProxyErrorOverride</KEYWORD2>
+ <KEYWORD2>ProxyIOBufferSize</KEYWORD2>
+ <KEYWORD2>ProxyMaxForwards</KEYWORD2>
+ <KEYWORD2>ProxyPass</KEYWORD2>
+ <KEYWORD2>ProxyPassReverse</KEYWORD2>
+ <KEYWORD2>ProxyPreserveHost</KEYWORD2>
+ <KEYWORD2>ProxyReceiveBufferSize</KEYWORD2>
+ <KEYWORD2>ProxyRemote</KEYWORD2>
+ <KEYWORD2>ProxyRemoteMatch</KEYWORD2>
+ <KEYWORD2>ProxyRequests</KEYWORD2>
+ <KEYWORD2>ProxyTimeout</KEYWORD2>
+ <KEYWORD2>ProxyVia</KEYWORD2>
+ <KEYWORD2>RLimitCPU</KEYWORD2>
+ <KEYWORD2>RLimitMEM</KEYWORD2>
+ <KEYWORD2>RLimitNPROC</KEYWORD2>
+ <KEYWORD2>ReadmeName</KEYWORD2>
+ <KEYWORD2>Redirect</KEYWORD2>
+ <KEYWORD2>RedirectMatch</KEYWORD2>
+ <KEYWORD2>RedirectPermanent</KEYWORD2>
+ <KEYWORD2>RedirectTemp</KEYWORD2>
+ <KEYWORD2>RemoveCharset</KEYWORD2>
+ <KEYWORD2>RemoveEncoding</KEYWORD2>
+ <KEYWORD2>RemoveHandler</KEYWORD2>
+ <KEYWORD2>RemoveInputFilter</KEYWORD2>
+ <KEYWORD2>RemoveLanguage</KEYWORD2>
+ <KEYWORD2>RemoveOutputFilter</KEYWORD2>
+ <KEYWORD2>RemoveType</KEYWORD2>
+ <KEYWORD2>RequestHeader</KEYWORD2>
+ <KEYWORD2>RewriteBase</KEYWORD2>
+ <KEYWORD2>RewriteCond</KEYWORD2>
+ <KEYWORD2>RewriteEngine</KEYWORD2>
+ <KEYWORD2>RewriteLock</KEYWORD2>
+ <KEYWORD2>RewriteLog</KEYWORD2>
+ <KEYWORD2>RewriteLogLevel</KEYWORD2>
+ <KEYWORD2>RewriteMap</KEYWORD2>
+ <KEYWORD2>RewriteOptions</KEYWORD2>
+ <KEYWORD2>RewriteRule</KEYWORD2>
+ <KEYWORD2>SSIEndTag</KEYWORD2>
+ <KEYWORD2>SSIErrorMsg</KEYWORD2>
+ <KEYWORD2>SSIStartTag</KEYWORD2>
+ <KEYWORD2>SSITimeFormat</KEYWORD2>
+ <KEYWORD2>SSIUndefinedEcho</KEYWORD2>
+ <KEYWORD2>SSLCACertificateFile</KEYWORD2>
+ <KEYWORD2>SSLCACertificatePath</KEYWORD2>
+ <KEYWORD2>SSLCARevocationFile</KEYWORD2>
+ <KEYWORD2>SSLCARevocationPath</KEYWORD2>
+ <KEYWORD2>SSLCertificateChainFile</KEYWORD2>
+ <KEYWORD2>SSLCertificateFile</KEYWORD2>
+ <KEYWORD2>SSLCertificateKeyFile</KEYWORD2>
+ <KEYWORD2>SSLCipherSuite</KEYWORD2>
+ <KEYWORD2>SSLEngine</KEYWORD2>
+ <KEYWORD2>SSLMutex</KEYWORD2>
+ <KEYWORD2>SSLOptions</KEYWORD2>
+ <KEYWORD2>SSLPassPhraseDialog</KEYWORD2>
+ <KEYWORD2>SSLProtocol</KEYWORD2>
+ <KEYWORD2>SSLProxyCACertificateFile</KEYWORD2>
+ <KEYWORD2>SSLProxyCACertificatePath</KEYWORD2>
+ <KEYWORD2>SSLProxyCARevocationFile</KEYWORD2>
+ <KEYWORD2>SSLProxyCARevocationPath</KEYWORD2>
+ <KEYWORD2>SSLProxyCipherSuite</KEYWORD2>
+ <KEYWORD2>SSLProxyEngine</KEYWORD2>
+ <KEYWORD2>SSLProxyMachineCertificateFile</KEYWORD2>
+ <KEYWORD2>SSLProxyMachineCertificatePath</KEYWORD2>
+ <KEYWORD2>SSLProxyProtocol</KEYWORD2>
+ <KEYWORD2>SSLProxyVerify</KEYWORD2>
+ <KEYWORD2>SSLProxyVerifyDepth</KEYWORD2>
+ <KEYWORD2>SSLRandomSeed</KEYWORD2>
+ <KEYWORD2>SSLSessionCache</KEYWORD2>
+ <KEYWORD2>SSLSessionCacheTimeout</KEYWORD2>
+ <KEYWORD2>SSLVerifyClient</KEYWORD2>
+ <KEYWORD2>SSLVerifyDepth</KEYWORD2>
+ <KEYWORD2>ScoreBoardFile</KEYWORD2>
+ <KEYWORD2>Script</KEYWORD2>
+ <KEYWORD2>ScriptAlias</KEYWORD2>
+ <KEYWORD2>ScriptAliasMatch</KEYWORD2>
+ <KEYWORD2>ScriptInterpreterSource</KEYWORD2>
+ <KEYWORD2>ScriptLog</KEYWORD2>
+ <KEYWORD2>ScriptLogBuffer</KEYWORD2>
+ <KEYWORD2>ScriptLogLength</KEYWORD2>
+ <KEYWORD2>ScriptSock</KEYWORD2>
+ <KEYWORD2>SecureListen</KEYWORD2>
+ <KEYWORD2>SendBufferSize</KEYWORD2>
+ <KEYWORD2>ServerAdmin</KEYWORD2>
+ <KEYWORD2>ServerAlias</KEYWORD2>
+ <KEYWORD2>ServerLimit</KEYWORD2>
+ <KEYWORD2>ServerName</KEYWORD2>
+ <KEYWORD2>ServerPath</KEYWORD2>
+ <KEYWORD2>ServerRoot</KEYWORD2>
+ <KEYWORD2>ServerSignature</KEYWORD2>
+ <KEYWORD2>ServerTokens</KEYWORD2>
+ <KEYWORD2>SetEnv</KEYWORD2>
+ <KEYWORD2>SetEnvIf</KEYWORD2>
+ <KEYWORD2>SetEnvIfNoCase</KEYWORD2>
+ <KEYWORD2>SetHandler</KEYWORD2>
+ <KEYWORD2>SetInputFilter</KEYWORD2>
+ <KEYWORD2>SetOutputFilter</KEYWORD2>
+ <KEYWORD2>StartServers</KEYWORD2>
+ <KEYWORD2>StartThreads</KEYWORD2>
+ <KEYWORD2>SuexecUserGroup</KEYWORD2>
+ <KEYWORD2>ThreadLimit</KEYWORD2>
+ <KEYWORD2>ThreadStackSize</KEYWORD2>
+ <KEYWORD2>ThreadsPerChild</KEYWORD2>
+ <KEYWORD2>TimeOut</KEYWORD2>
+ <KEYWORD2>TransferLog</KEYWORD2>
+ <KEYWORD2>TypesConfig</KEYWORD2>
+ <KEYWORD2>UnsetEnv</KEYWORD2>
+ <KEYWORD2>UseCanonicalName</KEYWORD2>
+ <KEYWORD2>User</KEYWORD2>
+ <KEYWORD2>UserDir</KEYWORD2>
+ <KEYWORD2>VirtualDocumentRoot</KEYWORD2>
+ <KEYWORD2>VirtualDocumentRootIP</KEYWORD2>
+ <KEYWORD2>VirtualScriptAlias</KEYWORD2>
+ <KEYWORD2>VirtualScriptAliasIP</KEYWORD2>
+ <KEYWORD2>XBitHack</KEYWORD2>
+
+ <LITERAL2>Off</LITERAL2>
+ <LITERAL2>On</LITERAL2>
+ <LITERAL2>None</LITERAL2>
+ </KEYWORDS>
+ </RULES>
+</MODE>
+
diff --git a/jEdit/modes/apdl.xml b/jEdit/modes/apdl.xml
index d66f8bf..213a532 100644
--- a/jEdit/modes/apdl.xml
+++ b/jEdit/modes/apdl.xml
@@ -1,7536 +1,7536 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE MODE SYSTEM "xmode.dtd">
-
-<!--
-
- Version 0.9.8 - generated by Randolf Mock on 11/22/2003
- Randolf.Mock at siemens.com
-
- <KEYWORD1>: ANSYS commands
- <KEYWORD2>: abbreviated *get commands
- <KEYWORD3>: ANSYS command options
-
--->
-
-<!-- The keywords and functions defined here are those of ANSYS 5.7 -->
-
-<MODE>
- <PROPS>
- <PROPERTY NAME="lineComment" VALUE="!" />
- </PROPS>
- <RULES IGNORE_CASE="TRUE" HIGHLIGHT_DIGITS="TRUE">
-
- <!-- labels - eg :test -->
- <EOL_SPAN TYPE="LABEL" AT_LINE_START="TRUE">:</EOL_SPAN>
-
- <!-- comments -->
- <EOL_SPAN TYPE="COMMENT1">!</EOL_SPAN>
-
- <!-- literals -->
- <SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">
- <BEGIN>'</BEGIN>
- <END>'</END>
- </SPAN>
-
-<!-- Special treatment of the ANSYS commands
- beginning with a '/' or '*' character -->
-
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*ABBR</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*ABB</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*AFUN</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*AFU</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*ASK</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*CFCLOS</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*CFC</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*CFOPEN</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*CFO</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*CFWRITE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*CFW</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*CREATE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*CRE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*CYCLE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*CYC</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*DEL</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*DIM</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*DO</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*ELSEIF</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*ELSE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*ENDDO</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*ENDIF</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*END</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*EVAL</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*EVA</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*EXIT</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*EXI</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*GET</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*GO</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*IF</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*LIST</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*LIS</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*MFOURI</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*MFO</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*MFUN</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*MFU</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*MOONEY</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*MOO</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*MOPER</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*MOP</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*MSG</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*REPEAT</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*REP</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*SET</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*STATUS</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*STA</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*TREAD</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*TRE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*ULIB</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*ULI</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*USE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VABS</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VAB</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VCOL</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VCO</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VCUM</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VCU</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VEDIT</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VED</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VFACT</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VFA</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VFILL</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VFI</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VFUN</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VFU</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VGET</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VGE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VITRP</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VIT</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VLEN</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VLE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VMASK</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VMA</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VOPER</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VOP</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VPLOT</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VPL</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VPUT</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VPU</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VREAD</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VRE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VSCFUN</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VSC</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VSTAT</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VST</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VWRITE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VWR</SEQ>
-
-
-
-
-
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/ANFILE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/ANF</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/ANGLE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/ANG</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/ANNOT</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/ANN</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/ANUM</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/ANU</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/ASSIGN</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/ASS</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/AUTO</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/AUT</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/AUX15</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/AUX2</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/AUX</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/AXLAB</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/AXL</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/BATCH</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/BAT</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CLABEL</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CLA</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CLEAR</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CLE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CLOG</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CLO</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CMAP</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CMA</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/COLOR</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/COL</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/COM</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CONFIG</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CONTOUR</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CON</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/COPY</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/COP</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CPLANE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CPL</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CTYPE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CTY</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CVAL</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CVA</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/DELETE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/DEL</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/DEVDISP</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/DEVICE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/DEV</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/DIST</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/DIS</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/DSCALE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/DSC</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/DV3D</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/DV3</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/EDGE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/EDG</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/EFACET</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/EFA</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/EOF</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/ERASE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/ERA</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/ESHAPE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/ESH</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/EXIT</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/EXI</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/EXPAND</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/EXP</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/FACET</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/FAC</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/FDELE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/FDE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/FILNAME</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/FIL</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/FOCUS</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/FOC</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/FORMAT</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/FOR</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/FTYPE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/FTY</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GCMD</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GCM</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GCOLUMN</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GCO</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GFILE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GFI</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GFORMAT</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GFO</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GLINE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GLI</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GMARKER</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GMA</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GOLIST</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GOL</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GOPR</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GOP</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GO</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GRAPHICS</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GRA</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GRESUME</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GRE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GRID</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GRI</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GROPT</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GRO</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GRTYP</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GRT</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GSAVE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GSA</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GST</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GTHK</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GTH</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GTYPE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GTY</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/HEADER</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/HEA</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/INPUT</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/INP</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/LARC</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/LAR</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/LIGHT</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/LIG</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/LINE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/LIN</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/LSPEC</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/LSP</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/LSYMBOL</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/LSY</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/MENU</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/MEN</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/MPLIB</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/MPL</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/MREP</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/MRE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/MSTART</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/MST</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/NERR</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/NER</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/NOERASE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/NOE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/NOLIST</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/NOL</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/NOPR</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/NOP</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/NORMAL</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/NOR</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/NUMBER</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/NUM</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/OPT</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/OUTPUT</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/OUt</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PAGE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PAG</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PBC</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PBF</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PCIRCLE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PCI</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PCOPY</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PCO</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PLOPTS</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PLO</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PMACRO</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PMA</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PMETH</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PME</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PMORE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PMO</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PNUM</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PNU</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/POLYGON</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/POL</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/POST26</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/POST1</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/POS</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PREP7</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PRE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PSEARCH</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PSE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PSF</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PSPEC</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PSP</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PSTATUS</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PST</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PSYMB</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PSY</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PWEDGE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PWE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/QUIT</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/QUI</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/RATIO</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/RAT</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/RENAME</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/REN</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/REPLOT</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/REP</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/RESET</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/RES</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/RGB</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/RUNST</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/RUN</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/SECLIB</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/SEC</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/SEG</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/SHADE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/SHA</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/SHOWDISP</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/SHOW</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/SHO</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/SHRINK</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/SHR</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/SOLU</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/SOL</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/SSCALE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/SSC</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/STATUS</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/STA</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/STITLE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/STI</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/SYP</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/SYS</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/TITLE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/TIT</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/TLABEL</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/TLA</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/TRIAD</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/TRI</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/TRLCY</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/TRL</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/TSPEC</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/TSP</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/TYPE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/TYP</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/UCMD</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/UCM</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/UIS</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/UI</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/UNITS</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/UNI</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/USER</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/USE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/VCONE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/VCO</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/VIEW</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/VIE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/VSCALE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/VSC</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/VUP</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/WAIT</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/WAI</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/WINDOW</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/WIN</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/XRANGE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/XRA</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/YRANGE</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/YRA</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/ZOOM</SEQ>
- <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/ZOO</SEQ>
-
-
-
- <SEQ TYPE="OPERATOR">+</SEQ>
- <SEQ TYPE="OPERATOR">-</SEQ>
- <SEQ TYPE="OPERATOR">$</SEQ>
- <SEQ TYPE="OPERATOR">=</SEQ>
- <SEQ TYPE="OPERATOR">(</SEQ>
- <SEQ TYPE="OPERATOR">)</SEQ>
- <SEQ TYPE="OPERATOR">,</SEQ>
- <SEQ TYPE="NULL">;</SEQ>
- <SEQ TYPE="OPERATOR">*</SEQ>
- <SEQ TYPE="OPERATOR">/</SEQ>
-
- <!-- *msg command: variable formats -->
- <SEQ TYPE="KEYWORD2">%C</SEQ> <!-- alphamuneric format -->
- <SEQ TYPE="KEYWORD2">%G</SEQ> <!-- double precision format -->
- <SEQ TYPE="KEYWORD2">%I</SEQ> <!-- integer format -->
- <SEQ TYPE="KEYWORD2">%/</SEQ> <!-- line break -->
-
- <!-- variables -->
- <SPAN TYPE="FUNCTION" NO_LINE_BREAK="TRUE">
- <BEGIN>%</BEGIN>
- <END>%</END>
- </SPAN>
-
- <KEYWORDS>
-
-<!-- ANSYS Commands (incl. abbreviated version) -->
-
- <KEYWORD1>A</KEYWORD1>
- <KEYWORD1>AADD</KEYWORD1>
- <KEYWORD1>AADD</KEYWORD1>
- <KEYWORD1>AATT</KEYWORD1>
- <KEYWORD1>AATT</KEYWORD1>
- <KEYWORD1>ABBR</KEYWORD1>
- <KEYWORD1>ABBRES</KEYWORD1>
- <KEYWORD1>ABBS</KEYWORD1>
- <KEYWORD1>ABBSAV</KEYWORD1>
- <KEYWORD1>ABS</KEYWORD1>
- <KEYWORD1>ACCA</KEYWORD1>
- <KEYWORD1>ACCAT</KEYWORD1>
- <KEYWORD1>ACEL</KEYWORD1>
- <KEYWORD1>ACEL</KEYWORD1>
- <KEYWORD1>ACLE</KEYWORD1>
- <KEYWORD1>ACLEAR</KEYWORD1>
- <KEYWORD1>ADAP</KEYWORD1>
- <KEYWORD1>ADAPT</KEYWORD1>
- <KEYWORD1>ADD</KEYWORD1>
- <KEYWORD1>ADDA</KEYWORD1>
- <KEYWORD1>ADDAM</KEYWORD1>
- <KEYWORD1>ADEL</KEYWORD1>
- <KEYWORD1>ADELE</KEYWORD1>
- <KEYWORD1>ADGL</KEYWORD1>
- <KEYWORD1>ADGL</KEYWORD1>
- <KEYWORD1>ADRA</KEYWORD1>
- <KEYWORD1>ADRAG</KEYWORD1>
- <KEYWORD1>AFIL</KEYWORD1>
- <KEYWORD1>AFILLT</KEYWORD1>
- <KEYWORD1>AFLI</KEYWORD1>
- <KEYWORD1>AFLIST</KEYWORD1>
- <KEYWORD1>AFSU</KEYWORD1>
- <KEYWORD1>AFSURF</KEYWORD1>
- <KEYWORD1>AGEN</KEYWORD1>
- <KEYWORD1>AGEN</KEYWORD1>
- <KEYWORD1>AGLU</KEYWORD1>
- <KEYWORD1>AGLUE</KEYWORD1>
- <KEYWORD1>AINA</KEYWORD1>
- <KEYWORD1>AINA</KEYWORD1>
- <KEYWORD1>AINP</KEYWORD1>
- <KEYWORD1>AINP</KEYWORD1>
- <KEYWORD1>AINV</KEYWORD1>
- <KEYWORD1>AINV</KEYWORD1>
- <KEYWORD1>AL</KEYWORD1>
- <KEYWORD1>ALIS</KEYWORD1>
- <KEYWORD1>ALIST</KEYWORD1>
- <KEYWORD1>ALLS</KEYWORD1>
- <KEYWORD1>ALLSEL</KEYWORD1>
- <KEYWORD1>ALPF</KEYWORD1>
- <KEYWORD1>ALPFILL</KEYWORD1>
- <KEYWORD1>ALPH</KEYWORD1>
- <KEYWORD1>ALPHAD</KEYWORD1>
- <KEYWORD1>AMAP</KEYWORD1>
- <KEYWORD1>AMAP</KEYWORD1>
- <KEYWORD1>AMES</KEYWORD1>
- <KEYWORD1>AMESH</KEYWORD1>
- <KEYWORD1>ANCN</KEYWORD1>
- <KEYWORD1>ANCNTR</KEYWORD1>
- <KEYWORD1>ANCU</KEYWORD1>
- <KEYWORD1>ANCUT</KEYWORD1>
- <KEYWORD1>ANDA</KEYWORD1>
- <KEYWORD1>ANDATA</KEYWORD1>
- <KEYWORD1>ANDS</KEYWORD1>
- <KEYWORD1>ANDSCL</KEYWORD1>
- <KEYWORD1>ANDY</KEYWORD1>
- <KEYWORD1>ANDYNA</KEYWORD1>
- <KEYWORD1>ANFL</KEYWORD1>
- <KEYWORD1>ANFLOW</KEYWORD1>
- <KEYWORD1>ANIM</KEYWORD1>
- <KEYWORD1>ANIM</KEYWORD1>
- <KEYWORD1>ANIS</KEYWORD1>
- <KEYWORD1>ANISOS</KEYWORD1>
- <KEYWORD1>ANMO</KEYWORD1>
- <KEYWORD1>ANMODE</KEYWORD1>
- <KEYWORD1>ANOR</KEYWORD1>
- <KEYWORD1>ANORM</KEYWORD1>
- <KEYWORD1>ANTI</KEYWORD1>
- <KEYWORD1>ANTIME</KEYWORD1>
- <KEYWORD1>ANTY</KEYWORD1>
- <KEYWORD1>ANTYPE</KEYWORD1>
- <KEYWORD1>AOFF</KEYWORD1>
- <KEYWORD1>AOFFST</KEYWORD1>
- <KEYWORD1>AOVL</KEYWORD1>
- <KEYWORD1>AOVLAP</KEYWORD1>
- <KEYWORD1>APLO</KEYWORD1>
- <KEYWORD1>APLOT</KEYWORD1>
- <KEYWORD1>APPE</KEYWORD1>
- <KEYWORD1>APPEND</KEYWORD1>
- <KEYWORD1>APTN</KEYWORD1>
- <KEYWORD1>APTN</KEYWORD1>
- <KEYWORD1>ARCL</KEYWORD1>
- <KEYWORD1>ARCLEN</KEYWORD1>
- <KEYWORD1>ARCO</KEYWORD1>
- <KEYWORD1>ARCOLLAPSE</KEYWORD1>
- <KEYWORD1>ARCT</KEYWORD1>
- <KEYWORD1>ARCTRM</KEYWORD1>
- <KEYWORD1>ARDE</KEYWORD1>
- <KEYWORD1>ARDETACH</KEYWORD1>
- <KEYWORD1>AREA</KEYWORD1>
- <KEYWORD1>AREAS</KEYWORD1>
- <KEYWORD1>AREF</KEYWORD1>
- <KEYWORD1>AREFINE</KEYWORD1>
- <KEYWORD1>AREV</KEYWORD1>
- <KEYWORD1>AREVERSE</KEYWORD1>
- <KEYWORD1>ARFI</KEYWORD1>
- <KEYWORD1>ARFILL</KEYWORD1>
- <KEYWORD1>ARME</KEYWORD1>
- <KEYWORD1>ARMERGE</KEYWORD1>
- <KEYWORD1>AROT</KEYWORD1>
- <KEYWORD1>AROTAT</KEYWORD1>
- <KEYWORD1>ARSC</KEYWORD1>
- <KEYWORD1>ARSCALE</KEYWORD1>
- <KEYWORD1>ARSP</KEYWORD1>
- <KEYWORD1>ARSPLIT</KEYWORD1>
- <KEYWORD1>ARSY</KEYWORD1>
- <KEYWORD1>ARSYM</KEYWORD1>
- <KEYWORD1>ASBA</KEYWORD1>
- <KEYWORD1>ASBA</KEYWORD1>
- <KEYWORD1>ASBL</KEYWORD1>
- <KEYWORD1>ASBL</KEYWORD1>
- <KEYWORD1>ASBV</KEYWORD1>
- <KEYWORD1>ASBV</KEYWORD1>
- <KEYWORD1>ASBW</KEYWORD1>
- <KEYWORD1>ASBW</KEYWORD1>
- <KEYWORD1>ASEL</KEYWORD1>
- <KEYWORD1>ASEL</KEYWORD1>
- <KEYWORD1>ASKI</KEYWORD1>
- <KEYWORD1>ASKIN</KEYWORD1>
- <KEYWORD1>ASLL</KEYWORD1>
- <KEYWORD1>ASLL</KEYWORD1>
- <KEYWORD1>ASLV</KEYWORD1>
- <KEYWORD1>ASLV</KEYWORD1>
- <KEYWORD1>ASUB</KEYWORD1>
- <KEYWORD1>ASUB</KEYWORD1>
- <KEYWORD1>ASUM</KEYWORD1>
- <KEYWORD1>ASUM</KEYWORD1>
- <KEYWORD1>ATAN</KEYWORD1>
- <KEYWORD1>ATAN</KEYWORD1>
- <KEYWORD1>ATRA</KEYWORD1>
- <KEYWORD1>ATRAN</KEYWORD1>
- <KEYWORD1>ATYP</KEYWORD1>
- <KEYWORD1>ATYPE</KEYWORD1>
- <KEYWORD1>AUTO</KEYWORD1>
- <KEYWORD1>AUTOTS</KEYWORD1>
- <KEYWORD1>AVPR</KEYWORD1>
- <KEYWORD1>AVPRIN</KEYWORD1>
- <KEYWORD1>AVRE</KEYWORD1>
- <KEYWORD1>AVRES</KEYWORD1>
- <KEYWORD1>BELL</KEYWORD1>
- <KEYWORD1>BELLOW</KEYWORD1>
- <KEYWORD1>BEND</KEYWORD1>
- <KEYWORD1>BEND</KEYWORD1>
- <KEYWORD1>BETA</KEYWORD1>
- <KEYWORD1>BETAD</KEYWORD1>
- <KEYWORD1>BF</KEYWORD1>
- <KEYWORD1>BFA</KEYWORD1>
- <KEYWORD1>BFAD</KEYWORD1>
- <KEYWORD1>BFADELE</KEYWORD1>
- <KEYWORD1>BFAL</KEYWORD1>
- <KEYWORD1>BFALIST</KEYWORD1>
- <KEYWORD1>BFCU</KEYWORD1>
- <KEYWORD1>BFCUM</KEYWORD1>
- <KEYWORD1>BFDE</KEYWORD1>
- <KEYWORD1>BFDELE</KEYWORD1>
- <KEYWORD1>BFE</KEYWORD1>
- <KEYWORD1>BFEC</KEYWORD1>
- <KEYWORD1>BFECUM</KEYWORD1>
- <KEYWORD1>BFED</KEYWORD1>
- <KEYWORD1>BFEDELE</KEYWORD1>
- <KEYWORD1>BFEL</KEYWORD1>
- <KEYWORD1>BFELIST</KEYWORD1>
- <KEYWORD1>BFES</KEYWORD1>
- <KEYWORD1>BFESCAL</KEYWORD1>
- <KEYWORD1>BFIN</KEYWORD1>
- <KEYWORD1>BFINT</KEYWORD1>
- <KEYWORD1>BFK</KEYWORD1>
- <KEYWORD1>BFKD</KEYWORD1>
- <KEYWORD1>BFKDELE</KEYWORD1>
- <KEYWORD1>BFKL</KEYWORD1>
- <KEYWORD1>BFKLIST</KEYWORD1>
- <KEYWORD1>BFL</KEYWORD1>
- <KEYWORD1>BFLD</KEYWORD1>
- <KEYWORD1>BFLDELE</KEYWORD1>
- <KEYWORD1>BFLI</KEYWORD1>
- <KEYWORD1>BFLIST</KEYWORD1>
- <KEYWORD1>BFLL</KEYWORD1>
- <KEYWORD1>BFLLIST</KEYWORD1>
- <KEYWORD1>BFSC</KEYWORD1>
- <KEYWORD1>BFSCALE</KEYWORD1>
- <KEYWORD1>BFTR</KEYWORD1>
- <KEYWORD1>BFTRAN</KEYWORD1>
- <KEYWORD1>BFUN</KEYWORD1>
- <KEYWORD1>BFUNIF</KEYWORD1>
- <KEYWORD1>BFV</KEYWORD1>
- <KEYWORD1>BFVD</KEYWORD1>
- <KEYWORD1>BFVDELE</KEYWORD1>
- <KEYWORD1>BFVL</KEYWORD1>
- <KEYWORD1>BFVLIST</KEYWORD1>
- <KEYWORD1>BIOO</KEYWORD1>
- <KEYWORD1>BIOOPT</KEYWORD1>
- <KEYWORD1>BIOT</KEYWORD1>
- <KEYWORD1>BIOT</KEYWORD1>
- <KEYWORD1>BLC4</KEYWORD1>
- <KEYWORD1>BLC4</KEYWORD1>
- <KEYWORD1>BLC5</KEYWORD1>
- <KEYWORD1>BLC5</KEYWORD1>
- <KEYWORD1>BLOC</KEYWORD1>
- <KEYWORD1>BLOCK</KEYWORD1>
- <KEYWORD1>BOOL</KEYWORD1>
- <KEYWORD1>BOOL</KEYWORD1>
- <KEYWORD1>BOPT</KEYWORD1>
- <KEYWORD1>BOPTN</KEYWORD1>
- <KEYWORD1>BRAN</KEYWORD1>
- <KEYWORD1>BRANCH</KEYWORD1>
- <KEYWORD1>BSPL</KEYWORD1>
- <KEYWORD1>BSPLIN</KEYWORD1>
- <KEYWORD1>BTOL</KEYWORD1>
- <KEYWORD1>BTOL</KEYWORD1>
- <KEYWORD1>BUCO</KEYWORD1>
- <KEYWORD1>BUCOPT</KEYWORD1>
- <KEYWORD1>CALC</KEYWORD1>
- <KEYWORD1>CALC</KEYWORD1>
- <KEYWORD1>CBDO</KEYWORD1>
- <KEYWORD1>CBDOF</KEYWORD1>
- <KEYWORD1>CDRE</KEYWORD1>
- <KEYWORD1>CDREAD</KEYWORD1>
- <KEYWORD1>CDWR</KEYWORD1>
- <KEYWORD1>CDWRITE</KEYWORD1>
- <KEYWORD1>CE</KEYWORD1>
- <KEYWORD1>CECM</KEYWORD1>
- <KEYWORD1>CECMOD</KEYWORD1>
- <KEYWORD1>CECY</KEYWORD1>
- <KEYWORD1>CECYC</KEYWORD1>
- <KEYWORD1>CEDE</KEYWORD1>
- <KEYWORD1>CEDELE</KEYWORD1>
- <KEYWORD1>CEIN</KEYWORD1>
- <KEYWORD1>CEINTF</KEYWORD1>
- <KEYWORD1>CELI</KEYWORD1>
- <KEYWORD1>CELIST</KEYWORD1>
- <KEYWORD1>CENT</KEYWORD1>
- <KEYWORD1>CENTER</KEYWORD1>
- <KEYWORD1>CEQN</KEYWORD1>
- <KEYWORD1>CEQN</KEYWORD1>
- <KEYWORD1>CERI</KEYWORD1>
- <KEYWORD1>CERIG</KEYWORD1>
- <KEYWORD1>CESG</KEYWORD1>
- <KEYWORD1>CESGEN</KEYWORD1>
- <KEYWORD1>CFAC</KEYWORD1>
- <KEYWORD1>CFACT</KEYWORD1>
- <KEYWORD1>CGLO</KEYWORD1>
- <KEYWORD1>CGLOC</KEYWORD1>
- <KEYWORD1>CGOM</KEYWORD1>
- <KEYWORD1>CGOMGA</KEYWORD1>
- <KEYWORD1>CHEC</KEYWORD1>
- <KEYWORD1>CHECK</KEYWORD1>
- <KEYWORD1>CHKM</KEYWORD1>
- <KEYWORD1>CHKMSH</KEYWORD1>
- <KEYWORD1>CIRC</KEYWORD1>
- <KEYWORD1>CIRCLE</KEYWORD1>
- <KEYWORD1>CLOC</KEYWORD1>
- <KEYWORD1>CLOCAL</KEYWORD1>
- <KEYWORD1>CLOG</KEYWORD1>
- <KEYWORD1>CLOG</KEYWORD1>
- <KEYWORD1>CLRM</KEYWORD1>
- <KEYWORD1>CLRMSHLN</KEYWORD1>
- <KEYWORD1>CM</KEYWORD1>
- <KEYWORD1>CMDE</KEYWORD1>
- <KEYWORD1>CMDELE</KEYWORD1>
- <KEYWORD1>CMED</KEYWORD1>
- <KEYWORD1>CMEDIT</KEYWORD1>
- <KEYWORD1>CMGR</KEYWORD1>
- <KEYWORD1>CMGRP</KEYWORD1>
- <KEYWORD1>CMLI</KEYWORD1>
- <KEYWORD1>CMLIST</KEYWORD1>
- <KEYWORD1>CMPL</KEYWORD1>
- <KEYWORD1>CMPLOT</KEYWORD1>
- <KEYWORD1>CMSE</KEYWORD1>
- <KEYWORD1>CMSEL</KEYWORD1>
- <KEYWORD1>CNVT</KEYWORD1>
- <KEYWORD1>CNVTOL</KEYWORD1>
- <KEYWORD1>CON4</KEYWORD1>
- <KEYWORD1>CON4</KEYWORD1>
- <KEYWORD1>CONE</KEYWORD1>
- <KEYWORD1>CONE</KEYWORD1>
- <KEYWORD1>CONJ</KEYWORD1>
- <KEYWORD1>CONJUG</KEYWORD1>
- <KEYWORD1>COUP</KEYWORD1>
- <KEYWORD1>COUPLE</KEYWORD1>
- <KEYWORD1>COVA</KEYWORD1>
- <KEYWORD1>COVAL</KEYWORD1>
- <KEYWORD1>CP</KEYWORD1>
- <KEYWORD1>CPDE</KEYWORD1>
- <KEYWORD1>CPDELE</KEYWORD1>
- <KEYWORD1>CPIN</KEYWORD1>
- <KEYWORD1>CPINTF</KEYWORD1>
- <KEYWORD1>CPLG</KEYWORD1>
- <KEYWORD1>CPLGEN</KEYWORD1>
- <KEYWORD1>CPLI</KEYWORD1>
- <KEYWORD1>CPLIST</KEYWORD1>
- <KEYWORD1>CPNG</KEYWORD1>
- <KEYWORD1>CPNGEN</KEYWORD1>
- <KEYWORD1>CPSG</KEYWORD1>
- <KEYWORD1>CPSGEN</KEYWORD1>
- <KEYWORD1>CQC</KEYWORD1>
- <KEYWORD1>CRPL</KEYWORD1>
- <KEYWORD1>CRPLIM</KEYWORD1>
- <KEYWORD1>CS</KEYWORD1>
- <KEYWORD1>CSCI</KEYWORD1>
- <KEYWORD1>CSCIR</KEYWORD1>
- <KEYWORD1>CSDE</KEYWORD1>
- <KEYWORD1>CSDELE</KEYWORD1>
- <KEYWORD1>CSKP</KEYWORD1>
- <KEYWORD1>CSKP</KEYWORD1>
- <KEYWORD1>CSLI</KEYWORD1>
- <KEYWORD1>CSLIST</KEYWORD1>
- <KEYWORD1>CSWP</KEYWORD1>
- <KEYWORD1>CSWPLA</KEYWORD1>
- <KEYWORD1>CSYS</KEYWORD1>
- <KEYWORD1>CSYS</KEYWORD1>
- <KEYWORD1>CURR2D</KEYWORD1>
- <KEYWORD1>CURR</KEYWORD1>
- <KEYWORD1>CUTC</KEYWORD1>
- <KEYWORD1>CUTCONTROL</KEYWORD1>
- <KEYWORD1>CVAR</KEYWORD1>
- <KEYWORD1>CVAR</KEYWORD1>
- <KEYWORD1>CYCG</KEYWORD1>
- <KEYWORD1>CYCGEN</KEYWORD1>
- <KEYWORD1>CYCS</KEYWORD1>
- <KEYWORD1>CYCSOL</KEYWORD1>
- <KEYWORD1>CYL4</KEYWORD1>
- <KEYWORD1>CYL4</KEYWORD1>
- <KEYWORD1>CYL5</KEYWORD1>
- <KEYWORD1>CYL5</KEYWORD1>
- <KEYWORD1>CYLI</KEYWORD1>
- <KEYWORD1>CYLIND</KEYWORD1>
- <KEYWORD1>D</KEYWORD1>
- <KEYWORD1>DA</KEYWORD1>
- <KEYWORD1>DADE</KEYWORD1>
- <KEYWORD1>DADELE</KEYWORD1>
- <KEYWORD1>DALI</KEYWORD1>
- <KEYWORD1>DALIST</KEYWORD1>
- <KEYWORD1>DATA</KEYWORD1>
- <KEYWORD1>DATA</KEYWORD1>
- <KEYWORD1>DATA</KEYWORD1>
- <KEYWORD1>DATADEF</KEYWORD1>
- <KEYWORD1>DCGO</KEYWORD1>
- <KEYWORD1>DCGOMG</KEYWORD1>
- <KEYWORD1>DCUM</KEYWORD1>
- <KEYWORD1>DCUM</KEYWORD1>
- <KEYWORD1>DDEL</KEYWORD1>
- <KEYWORD1>DDELE</KEYWORD1>
- <KEYWORD1>DEAC</KEYWORD1>
- <KEYWORD1>DEACT</KEYWORD1>
- <KEYWORD1>DEFI</KEYWORD1>
- <KEYWORD1>DEFINE</KEYWORD1>
- <KEYWORD1>DELT</KEYWORD1>
- <KEYWORD1>DELTIM</KEYWORD1>
- <KEYWORD1>DERI</KEYWORD1>
- <KEYWORD1>DERIV</KEYWORD1>
- <KEYWORD1>DESI</KEYWORD1>
- <KEYWORD1>DESIZE</KEYWORD1>
- <KEYWORD1>DESO</KEYWORD1>
- <KEYWORD1>DESOL</KEYWORD1>
- <KEYWORD1>DETA</KEYWORD1>
- <KEYWORD1>DETAB</KEYWORD1>
- <KEYWORD1>DIG</KEYWORD1>
- <KEYWORD1>DIGI</KEYWORD1>
- <KEYWORD1>DIGIT</KEYWORD1>
- <KEYWORD1>DISP</KEYWORD1>
- <KEYWORD1>DISPLAY</KEYWORD1>
- <KEYWORD1>DK</KEYWORD1>
- <KEYWORD1>DKDE</KEYWORD1>
- <KEYWORD1>DKDELE</KEYWORD1>
- <KEYWORD1>DKLI</KEYWORD1>
- <KEYWORD1>DKLIST</KEYWORD1>
- <KEYWORD1>DL</KEYWORD1>
- <KEYWORD1>DLDE</KEYWORD1>
- <KEYWORD1>DLDELE</KEYWORD1>
- <KEYWORD1>DLIS</KEYWORD1>
- <KEYWORD1>DLIST</KEYWORD1>
- <KEYWORD1>DLLI</KEYWORD1>
- <KEYWORD1>DLLIST</KEYWORD1>
- <KEYWORD1>DMOV</KEYWORD1>
- <KEYWORD1>DMOVE</KEYWORD1>
- <KEYWORD1>DMPR</KEYWORD1>
- <KEYWORD1>DMPRAT</KEYWORD1>
- <KEYWORD1>DNSO</KEYWORD1>
- <KEYWORD1>DNSOL</KEYWORD1>
- <KEYWORD1>DOF</KEYWORD1>
- <KEYWORD1>DOFS</KEYWORD1>
- <KEYWORD1>DOFSEL</KEYWORD1>
- <KEYWORD1>DOME</KEYWORD1>
- <KEYWORD1>DOMEGA</KEYWORD1>
- <KEYWORD1>DSCA</KEYWORD1>
- <KEYWORD1>DSCALE</KEYWORD1>
- <KEYWORD1>DSET</KEYWORD1>
- <KEYWORD1>DSET</KEYWORD1>
- <KEYWORD1>DSUM</KEYWORD1>
- <KEYWORD1>DSUM</KEYWORD1>
- <KEYWORD1>DSUR</KEYWORD1>
- <KEYWORD1>DSURF</KEYWORD1>
- <KEYWORD1>DSYM</KEYWORD1>
- <KEYWORD1>DSYM</KEYWORD1>
- <KEYWORD1>DSYS</KEYWORD1>
- <KEYWORD1>DSYS</KEYWORD1>
- <KEYWORD1>DTRA</KEYWORD1>
- <KEYWORD1>DTRAN</KEYWORD1>
- <KEYWORD1>DUMP</KEYWORD1>
- <KEYWORD1>DUMP</KEYWORD1>
- <KEYWORD1>DYNO</KEYWORD1>
- <KEYWORD1>DYNOPT</KEYWORD1>
- <KEYWORD1>E</KEYWORD1>
- <KEYWORD1>EALI</KEYWORD1>
- <KEYWORD1>EALIVE</KEYWORD1>
- <KEYWORD1>EDBO</KEYWORD1>
- <KEYWORD1>EDBOUND</KEYWORD1>
- <KEYWORD1>EDBV</KEYWORD1>
- <KEYWORD1>EDBVIS</KEYWORD1>
- <KEYWORD1>EDCD</KEYWORD1>
- <KEYWORD1>EDCDELE</KEYWORD1>
- <KEYWORD1>EDCG</KEYWORD1>
- <KEYWORD1>EDCGEN</KEYWORD1>
- <KEYWORD1>EDCL</KEYWORD1>
- <KEYWORD1>EDCLIST</KEYWORD1>
- <KEYWORD1>EDCO</KEYWORD1>
- <KEYWORD1>EDCONTACT</KEYWORD1>
- <KEYWORD1>EDCP</KEYWORD1>
- <KEYWORD1>EDCPU</KEYWORD1>
- <KEYWORD1>EDCR</KEYWORD1>
- <KEYWORD1>EDCRB</KEYWORD1>
- <KEYWORD1>EDCS</KEYWORD1>
- <KEYWORD1>EDCSC</KEYWORD1>
- <KEYWORD1>EDCT</KEYWORD1>
- <KEYWORD1>EDCTS</KEYWORD1>
- <KEYWORD1>EDCU</KEYWORD1>
- <KEYWORD1>EDCURVE</KEYWORD1>
- <KEYWORD1>EDDA</KEYWORD1>
- <KEYWORD1>EDDAMP</KEYWORD1>
- <KEYWORD1>EDDR</KEYWORD1>
- <KEYWORD1>EDDRELAX</KEYWORD1>
- <KEYWORD1>EDEL</KEYWORD1>
- <KEYWORD1>EDELE</KEYWORD1>
- <KEYWORD1>EDEN</KEYWORD1>
- <KEYWORD1>EDENERGY</KEYWORD1>
- <KEYWORD1>EDFP</KEYWORD1>
- <KEYWORD1>EDFPLOT</KEYWORD1>
- <KEYWORD1>EDHG</KEYWORD1>
- <KEYWORD1>EDHGLS</KEYWORD1>
- <KEYWORD1>EDHI</KEYWORD1>
- <KEYWORD1>EDHIST</KEYWORD1>
- <KEYWORD1>EDHT</KEYWORD1>
- <KEYWORD1>EDHTIME</KEYWORD1>
- <KEYWORD1>EDIN</KEYWORD1>
- <KEYWORD1>EDINT</KEYWORD1>
- <KEYWORD1>EDIV</KEYWORD1>
- <KEYWORD1>EDIVELO</KEYWORD1>
- <KEYWORD1>EDLC</KEYWORD1>
- <KEYWORD1>EDLCS</KEYWORD1>
- <KEYWORD1>EDLD</KEYWORD1>
- <KEYWORD1>EDLDPLOT</KEYWORD1>
- <KEYWORD1>EDLO</KEYWORD1>
- <KEYWORD1>EDLOAD</KEYWORD1>
- <KEYWORD1>EDMP</KEYWORD1>
- <KEYWORD1>EDMP</KEYWORD1>
- <KEYWORD1>EDND</KEYWORD1>
- <KEYWORD1>EDNDTSD</KEYWORD1>
- <KEYWORD1>EDNR</KEYWORD1>
- <KEYWORD1>EDNROT</KEYWORD1>
- <KEYWORD1>EDOP</KEYWORD1>
- <KEYWORD1>EDOPT</KEYWORD1>
- <KEYWORD1>EDOU</KEYWORD1>
- <KEYWORD1>EDOUT</KEYWORD1>
- <KEYWORD1>EDRE</KEYWORD1>
- <KEYWORD1>EDREAD</KEYWORD1>
- <KEYWORD1>EDRS</KEYWORD1>
- <KEYWORD1>EDRST</KEYWORD1>
- <KEYWORD1>EDSH</KEYWORD1>
- <KEYWORD1>EDSHELL</KEYWORD1>
- <KEYWORD1>EDSO</KEYWORD1>
- <KEYWORD1>EDSOLV</KEYWORD1>
- <KEYWORD1>EDST</KEYWORD1>
- <KEYWORD1>EDSTART</KEYWORD1>
- <KEYWORD1>EDWE</KEYWORD1>
- <KEYWORD1>EDWELD</KEYWORD1>
- <KEYWORD1>EDWR</KEYWORD1>
- <KEYWORD1>EDWRITE</KEYWORD1>
- <KEYWORD1>EGEN</KEYWORD1>
- <KEYWORD1>EGEN</KEYWORD1>
- <KEYWORD1>EINT</KEYWORD1>
- <KEYWORD1>EINTF</KEYWORD1>
- <KEYWORD1>EKIL</KEYWORD1>
- <KEYWORD1>EKILL</KEYWORD1>
- <KEYWORD1>ELEM</KEYWORD1>
- <KEYWORD1>ELEM</KEYWORD1>
- <KEYWORD1>ELIS</KEYWORD1>
- <KEYWORD1>ELIST</KEYWORD1>
- <KEYWORD1>EMAG</KEYWORD1>
- <KEYWORD1>EMAGERR</KEYWORD1>
- <KEYWORD1>EMF</KEYWORD1>
- <KEYWORD1>EMID</KEYWORD1>
- <KEYWORD1>EMID</KEYWORD1>
- <KEYWORD1>EMIS</KEYWORD1>
- <KEYWORD1>EMIS</KEYWORD1>
- <KEYWORD1>EMOD</KEYWORD1>
- <KEYWORD1>EMODIF</KEYWORD1>
- <KEYWORD1>EMOR</KEYWORD1>
- <KEYWORD1>EMORE</KEYWORD1>
- <KEYWORD1>EMSY</KEYWORD1>
- <KEYWORD1>EMSYM</KEYWORD1>
- <KEYWORD1>EMUN</KEYWORD1>
- <KEYWORD1>EMUNIT</KEYWORD1>
- <KEYWORD1>EN</KEYWORD1>
- <KEYWORD1>ENGE</KEYWORD1>
- <KEYWORD1>ENGEN</KEYWORD1>
- <KEYWORD1>ENOR</KEYWORD1>
- <KEYWORD1>ENORM</KEYWORD1>
- <KEYWORD1>ENSY</KEYWORD1>
- <KEYWORD1>ENSYM</KEYWORD1>
- <KEYWORD1>EPLO</KEYWORD1>
- <KEYWORD1>EPLOT</KEYWORD1>
- <KEYWORD1>EQSL</KEYWORD1>
- <KEYWORD1>EQSLV</KEYWORD1>
- <KEYWORD1>ERAS</KEYWORD1>
- <KEYWORD1>ERASE</KEYWORD1>
- <KEYWORD1>EREA</KEYWORD1>
- <KEYWORD1>EREAD</KEYWORD1>
- <KEYWORD1>EREF</KEYWORD1>
- <KEYWORD1>EREFINE</KEYWORD1>
- <KEYWORD1>ERES</KEYWORD1>
- <KEYWORD1>ERESX</KEYWORD1>
- <KEYWORD1>ERNO</KEYWORD1>
- <KEYWORD1>ERNORM</KEYWORD1>
- <KEYWORD1>ERRA</KEYWORD1>
- <KEYWORD1>ERRANG</KEYWORD1>
- <KEYWORD1>ESEL</KEYWORD1>
- <KEYWORD1>ESEL</KEYWORD1>
- <KEYWORD1>ESIZ</KEYWORD1>
- <KEYWORD1>ESIZE</KEYWORD1>
- <KEYWORD1>ESLA</KEYWORD1>
- <KEYWORD1>ESLA</KEYWORD1>
- <KEYWORD1>ESLL</KEYWORD1>
- <KEYWORD1>ESLL</KEYWORD1>
- <KEYWORD1>ESLN</KEYWORD1>
- <KEYWORD1>ESLN</KEYWORD1>
- <KEYWORD1>ESLV</KEYWORD1>
- <KEYWORD1>ESLV</KEYWORD1>
- <KEYWORD1>ESOL</KEYWORD1>
- <KEYWORD1>ESOL</KEYWORD1>
- <KEYWORD1>ESOR</KEYWORD1>
- <KEYWORD1>ESORT</KEYWORD1>
- <KEYWORD1>ESTI</KEYWORD1>
- <KEYWORD1>ESTIF</KEYWORD1>
- <KEYWORD1>ESUR</KEYWORD1>
- <KEYWORD1>ESURF</KEYWORD1>
- <KEYWORD1>ESYM</KEYWORD1>
- <KEYWORD1>ESYM</KEYWORD1>
- <KEYWORD1>ESYS</KEYWORD1>
- <KEYWORD1>ESYS</KEYWORD1>
- <KEYWORD1>ET</KEYWORD1>
- <KEYWORD1>ETAB</KEYWORD1>
- <KEYWORD1>ETABLE</KEYWORD1>
- <KEYWORD1>ETCH</KEYWORD1>
- <KEYWORD1>ETCHG</KEYWORD1>
- <KEYWORD1>ETDE</KEYWORD1>
- <KEYWORD1>ETDELE</KEYWORD1>
- <KEYWORD1>ETLI</KEYWORD1>
- <KEYWORD1>ETLIST</KEYWORD1>
- <KEYWORD1>ETYP</KEYWORD1>
- <KEYWORD1>ETYPE</KEYWORD1>
- <KEYWORD1>EUSO</KEYWORD1>
- <KEYWORD1>EUSORT</KEYWORD1>
- <KEYWORD1>EWRI</KEYWORD1>
- <KEYWORD1>EWRITE</KEYWORD1>
- <KEYWORD1>EXP</KEYWORD1>
- <KEYWORD1>EXPA</KEYWORD1>
- <KEYWORD1>EXPA</KEYWORD1>
- <KEYWORD1>EXPAND</KEYWORD1>
- <KEYWORD1>EXPASS</KEYWORD1>
- <KEYWORD1>EXPS</KEYWORD1>
- <KEYWORD1>EXPSOL</KEYWORD1>
- <KEYWORD1>EXTO</KEYWORD1>
- <KEYWORD1>EXTOPT</KEYWORD1>
- <KEYWORD1>EXTR</KEYWORD1>
- <KEYWORD1>EXTREM</KEYWORD1>
- <KEYWORD1>FATI</KEYWORD1>
- <KEYWORD1>FATIGUE</KEYWORD1>
- <KEYWORD1>FCUM</KEYWORD1>
- <KEYWORD1>FCUM</KEYWORD1>
- <KEYWORD1>FDEL</KEYWORD1>
- <KEYWORD1>FDELE</KEYWORD1>
- <KEYWORD1>FE</KEYWORD1>
- <KEYWORD1>FEBO</KEYWORD1>
- <KEYWORD1>FEBODY</KEYWORD1>
- <KEYWORD1>FECO</KEYWORD1>
- <KEYWORD1>FECONS</KEYWORD1>
- <KEYWORD1>FEFO</KEYWORD1>
- <KEYWORD1>FEFOR</KEYWORD1>
- <KEYWORD1>FELI</KEYWORD1>
- <KEYWORD1>FELIST</KEYWORD1>
- <KEYWORD1>FESU</KEYWORD1>
- <KEYWORD1>FESURF</KEYWORD1>
- <KEYWORD1>FILE</KEYWORD1>
- <KEYWORD1>FILE</KEYWORD1>
- <KEYWORD1>FILE</KEYWORD1>
- <KEYWORD1>FILE</KEYWORD1>
- <KEYWORD1>FILEAUX2</KEYWORD1>
- <KEYWORD1>FILEDISP</KEYWORD1>
- <KEYWORD1>FILL</KEYWORD1>
- <KEYWORD1>FILL</KEYWORD1>
- <KEYWORD1>FILL</KEYWORD1>
- <KEYWORD1>FILLDATA</KEYWORD1>
- <KEYWORD1>FINI</KEYWORD1>
- <KEYWORD1>FINISH</KEYWORD1>
- <KEYWORD1>FITE</KEYWORD1>
- <KEYWORD1>FITEM</KEYWORD1>
- <KEYWORD1>FK</KEYWORD1>
- <KEYWORD1>FKDE</KEYWORD1>
- <KEYWORD1>FKDELE</KEYWORD1>
- <KEYWORD1>FKLI</KEYWORD1>
- <KEYWORD1>FKLIST</KEYWORD1>
- <KEYWORD1>FL</KEYWORD1>
- <KEYWORD1>FLAN</KEYWORD1>
- <KEYWORD1>FLANGE</KEYWORD1>
- <KEYWORD1>FLDA</KEYWORD1>
- <KEYWORD1>FLDATA</KEYWORD1>
- <KEYWORD1>FLDATA10</KEYWORD1>
- <KEYWORD1>FLDATA11</KEYWORD1>
- <KEYWORD1>FLDATA12</KEYWORD1>
- <KEYWORD1>FLDATA13</KEYWORD1>
- <KEYWORD1>FLDATA14</KEYWORD1>
- <KEYWORD1>FLDATA15</KEYWORD1>
- <KEYWORD1>FLDATA16</KEYWORD1>
- <KEYWORD1>FLDATA17</KEYWORD1>
- <KEYWORD1>FLDATA18</KEYWORD1>
- <KEYWORD1>FLDATA19</KEYWORD1>
- <KEYWORD1>FLDATA1</KEYWORD1>
- <KEYWORD1>FLDATA20</KEYWORD1>
- <KEYWORD1>FLDATA20A</KEYWORD1>
- <KEYWORD1>FLDATA21</KEYWORD1>
- <KEYWORD1>FLDATA22</KEYWORD1>
- <KEYWORD1>FLDATA23</KEYWORD1>
- <KEYWORD1>FLDATA24</KEYWORD1>
- <KEYWORD1>FLDATA24A</KEYWORD1>
- <KEYWORD1>FLDATA24B</KEYWORD1>
- <KEYWORD1>FLDATA24C</KEYWORD1>
- <KEYWORD1>FLDATA24D</KEYWORD1>
- <KEYWORD1>FLDATA25</KEYWORD1>
- <KEYWORD1>FLDATA26</KEYWORD1>
- <KEYWORD1>FLDATA27</KEYWORD1>
- <KEYWORD1>FLDATA28</KEYWORD1>
- <KEYWORD1>FLDATA29</KEYWORD1>
- <KEYWORD1>FLDATA2</KEYWORD1>
- <KEYWORD1>FLDATA30</KEYWORD1>
- <KEYWORD1>FLDATA31</KEYWORD1>
- <KEYWORD1>FLDATA32</KEYWORD1>
- <KEYWORD1>FLDATA33</KEYWORD1>
- <KEYWORD1>FLDATA37</KEYWORD1>
- <KEYWORD1>FLDATA3</KEYWORD1>
- <KEYWORD1>FLDATA4</KEYWORD1>
- <KEYWORD1>FLDATA4A</KEYWORD1>
- <KEYWORD1>FLDATA5</KEYWORD1>
- <KEYWORD1>FLDATA6</KEYWORD1>
- <KEYWORD1>FLDATA7</KEYWORD1>
- <KEYWORD1>FLDATA8</KEYWORD1>
- <KEYWORD1>FLDATA9</KEYWORD1>
- <KEYWORD1>FLDATA</KEYWORD1>
- <KEYWORD1>FLIS</KEYWORD1>
- <KEYWORD1>FLIST</KEYWORD1>
- <KEYWORD1>FLLI</KEYWORD1>
- <KEYWORD1>FLLIST</KEYWORD1>
- <KEYWORD1>FLOC</KEYWORD1>
- <KEYWORD1>FLOCHECK</KEYWORD1>
- <KEYWORD1>FLOT</KEYWORD1>
- <KEYWORD1>FLOTRAN</KEYWORD1>
- <KEYWORD1>FLRE</KEYWORD1>
- <KEYWORD1>FLREAD</KEYWORD1>
- <KEYWORD1>FLST</KEYWORD1>
- <KEYWORD1>FLST</KEYWORD1>
- <KEYWORD1>FLUX</KEYWORD1>
- <KEYWORD1>FLUXV</KEYWORD1>
- <KEYWORD1>FMAG</KEYWORD1>
- <KEYWORD1>FMAG</KEYWORD1>
- <KEYWORD1>FMAGBC</KEYWORD1>
- <KEYWORD1>FMAGSUM</KEYWORD1>
- <KEYWORD1>FOR2</KEYWORD1>
- <KEYWORD1>FOR2D</KEYWORD1>
- <KEYWORD1>FORC</KEYWORD1>
- <KEYWORD1>FORCE</KEYWORD1>
- <KEYWORD1>FORM</KEYWORD1>
- <KEYWORD1>FORM</KEYWORD1>
- <KEYWORD1>FP</KEYWORD1>
- <KEYWORD1>FPLI</KEYWORD1>
- <KEYWORD1>FPLIST</KEYWORD1>
- <KEYWORD1>FREQ</KEYWORD1>
- <KEYWORD1>FREQ</KEYWORD1>
- <KEYWORD1>FS</KEYWORD1>
- <KEYWORD1>FSCA</KEYWORD1>
- <KEYWORD1>FSCALE</KEYWORD1>
- <KEYWORD1>FSDE</KEYWORD1>
- <KEYWORD1>FSDELE</KEYWORD1>
- <KEYWORD1>FSLI</KEYWORD1>
- <KEYWORD1>FSLIST</KEYWORD1>
- <KEYWORD1>FSNO</KEYWORD1>
- <KEYWORD1>FSNODE</KEYWORD1>
- <KEYWORD1>FSPL</KEYWORD1>
- <KEYWORD1>FSPLOT</KEYWORD1>
- <KEYWORD1>FSSE</KEYWORD1>
- <KEYWORD1>FSSECT</KEYWORD1>
- <KEYWORD1>FSUM</KEYWORD1>
- <KEYWORD1>FSUM</KEYWORD1>
- <KEYWORD1>FTCA</KEYWORD1>
- <KEYWORD1>FTCALC</KEYWORD1>
- <KEYWORD1>FTRA</KEYWORD1>
- <KEYWORD1>FTRAN</KEYWORD1>
- <KEYWORD1>FTSI</KEYWORD1>
- <KEYWORD1>FTSIZE</KEYWORD1>
- <KEYWORD1>FTWR</KEYWORD1>
- <KEYWORD1>FTWRITE</KEYWORD1>
- <KEYWORD1>FVME</KEYWORD1>
- <KEYWORD1>FVMESH</KEYWORD1>
- <KEYWORD1>GAP</KEYWORD1>
- <KEYWORD1>GAPF</KEYWORD1>
- <KEYWORD1>GAPFINISH</KEYWORD1>
- <KEYWORD1>GAPL</KEYWORD1>
- <KEYWORD1>GAPLIST</KEYWORD1>
- <KEYWORD1>GAPM</KEYWORD1>
- <KEYWORD1>GAPMERGE</KEYWORD1>
- <KEYWORD1>GAPO</KEYWORD1>
- <KEYWORD1>GAPOPT</KEYWORD1>
- <KEYWORD1>GAPP</KEYWORD1>
- <KEYWORD1>GAPPLOT</KEYWORD1>
- <KEYWORD1>GAUG</KEYWORD1>
- <KEYWORD1>GAUGE</KEYWORD1>
- <KEYWORD1>GCGE</KEYWORD1>
- <KEYWORD1>GCGEN</KEYWORD1>
- <KEYWORD1>GENO</KEYWORD1>
- <KEYWORD1>GENOPT</KEYWORD1>
- <KEYWORD1>GEOM</KEYWORD1>
- <KEYWORD1>GEOM</KEYWORD1>
- <KEYWORD1>GEOM</KEYWORD1>
- <KEYWORD1>GEOMETRY</KEYWORD1>
- <KEYWORD1>GP</KEYWORD1>
- <KEYWORD1>GPDE</KEYWORD1>
- <KEYWORD1>GPDELE</KEYWORD1>
- <KEYWORD1>GPLI</KEYWORD1>
- <KEYWORD1>GPLIST</KEYWORD1>
- <KEYWORD1>GPLO</KEYWORD1>
- <KEYWORD1>GPLOT</KEYWORD1>
- <KEYWORD1>GRP</KEYWORD1>
- <KEYWORD1>GSUM</KEYWORD1>
- <KEYWORD1>GSUM</KEYWORD1>
- <KEYWORD1>HARF</KEYWORD1>
- <KEYWORD1>HARFRQ</KEYWORD1>
- <KEYWORD1>HELP</KEYWORD1>
- <KEYWORD1>HELP</KEYWORD1>
- <KEYWORD1>HELP</KEYWORD1>
- <KEYWORD1>HELPDISP</KEYWORD1>
- <KEYWORD1>HFSW</KEYWORD1>
- <KEYWORD1>HFSWEEP</KEYWORD1>
- <KEYWORD1>HMAG</KEYWORD1>
- <KEYWORD1>HMAGSOLV</KEYWORD1>
- <KEYWORD1>HPGL</KEYWORD1>
- <KEYWORD1>HPGL</KEYWORD1>
- <KEYWORD1>HPTC</KEYWORD1>
- <KEYWORD1>HPTCREATE</KEYWORD1>
- <KEYWORD1>HPTD</KEYWORD1>
- <KEYWORD1>HPTDELETE</KEYWORD1>
- <KEYWORD1>HRCP</KEYWORD1>
- <KEYWORD1>HRCPLX</KEYWORD1>
- <KEYWORD1>HREX</KEYWORD1>
- <KEYWORD1>HREXP</KEYWORD1>
- <KEYWORD1>HROP</KEYWORD1>
- <KEYWORD1>HROPT</KEYWORD1>
- <KEYWORD1>HROU</KEYWORD1>
- <KEYWORD1>HROUT</KEYWORD1>
- <KEYWORD1>IC</KEYWORD1>
- <KEYWORD1>ICDE</KEYWORD1>
- <KEYWORD1>ICDELE</KEYWORD1>
- <KEYWORD1>ICLI</KEYWORD1>
- <KEYWORD1>ICLIST</KEYWORD1>
- <KEYWORD1>IGES</KEYWORD1>
- <KEYWORD1>IGES</KEYWORD1>
- <KEYWORD1>IGESIN</KEYWORD1>
- <KEYWORD1>IGESOUT</KEYWORD1>
- <KEYWORD1>IMAG</KEYWORD1>
- <KEYWORD1>IMAGIN</KEYWORD1>
- <KEYWORD1>IMME</KEYWORD1>
- <KEYWORD1>IMMED</KEYWORD1>
- <KEYWORD1>IMPD</KEYWORD1>
- <KEYWORD1>IMPD</KEYWORD1>
- <KEYWORD1>INRE</KEYWORD1>
- <KEYWORD1>INRES</KEYWORD1>
- <KEYWORD1>INRT</KEYWORD1>
- <KEYWORD1>INRTIA</KEYWORD1>
- <KEYWORD1>INT1</KEYWORD1>
- <KEYWORD1>INT1</KEYWORD1>
- <KEYWORD1>INTS</KEYWORD1>
- <KEYWORD1>INTSRF</KEYWORD1>
- <KEYWORD1>IOPT</KEYWORD1>
- <KEYWORD1>IOPTN</KEYWORD1>
- <KEYWORD1>IRLF</KEYWORD1>
- <KEYWORD1>IRLF</KEYWORD1>
- <KEYWORD1>IRLI</KEYWORD1>
- <KEYWORD1>IRLIST</KEYWORD1>
- <KEYWORD1>K</KEYWORD1>
- <KEYWORD1>KATT</KEYWORD1>
- <KEYWORD1>KATT</KEYWORD1>
- <KEYWORD1>KBC</KEYWORD1>
- <KEYWORD1>KBET</KEYWORD1>
- <KEYWORD1>KBETW</KEYWORD1>
- <KEYWORD1>KCAL</KEYWORD1>
- <KEYWORD1>KCALC</KEYWORD1>
- <KEYWORD1>KCEN</KEYWORD1>
- <KEYWORD1>KCENTER</KEYWORD1>
- <KEYWORD1>KCLE</KEYWORD1>
- <KEYWORD1>KCLEAR</KEYWORD1>
- <KEYWORD1>KDEL</KEYWORD1>
- <KEYWORD1>KDELE</KEYWORD1>
- <KEYWORD1>KDIS</KEYWORD1>
- <KEYWORD1>KDIST</KEYWORD1>
- <KEYWORD1>KESI</KEYWORD1>
- <KEYWORD1>KESIZE</KEYWORD1>
- <KEYWORD1>KEYO</KEYWORD1>
- <KEYWORD1>KEYOPT</KEYWORD1>
- <KEYWORD1>KEYP</KEYWORD1>
- <KEYWORD1>KEYPTS</KEYWORD1>
- <KEYWORD1>KEYW</KEYWORD1>
- <KEYWORD1>KEYW</KEYWORD1>
- <KEYWORD1>KFIL</KEYWORD1>
- <KEYWORD1>KFILL</KEYWORD1>
- <KEYWORD1>KGEN</KEYWORD1>
- <KEYWORD1>KGEN</KEYWORD1>
- <KEYWORD1>KL</KEYWORD1>
- <KEYWORD1>KLIS</KEYWORD1>
- <KEYWORD1>KLIST</KEYWORD1>
- <KEYWORD1>KMES</KEYWORD1>
- <KEYWORD1>KMESH</KEYWORD1>
- <KEYWORD1>KMOD</KEYWORD1>
- <KEYWORD1>KMODIF</KEYWORD1>
- <KEYWORD1>KMOV</KEYWORD1>
- <KEYWORD1>KMOVE</KEYWORD1>
- <KEYWORD1>KNOD</KEYWORD1>
- <KEYWORD1>KNODE</KEYWORD1>
- <KEYWORD1>KPLO</KEYWORD1>
- <KEYWORD1>KPLOT</KEYWORD1>
- <KEYWORD1>KPSC</KEYWORD1>
- <KEYWORD1>KPSCALE</KEYWORD1>
- <KEYWORD1>KREF</KEYWORD1>
- <KEYWORD1>KREFINE</KEYWORD1>
- <KEYWORD1>KSCA</KEYWORD1>
- <KEYWORD1>KSCALE</KEYWORD1>
- <KEYWORD1>KSCO</KEYWORD1>
- <KEYWORD1>KSCON</KEYWORD1>
- <KEYWORD1>KSEL</KEYWORD1>
- <KEYWORD1>KSEL</KEYWORD1>
- <KEYWORD1>KSLL</KEYWORD1>
- <KEYWORD1>KSLL</KEYWORD1>
- <KEYWORD1>KSLN</KEYWORD1>
- <KEYWORD1>KSLN</KEYWORD1>
- <KEYWORD1>KSUM</KEYWORD1>
- <KEYWORD1>KSUM</KEYWORD1>
- <KEYWORD1>KSYM</KEYWORD1>
- <KEYWORD1>KSYMM</KEYWORD1>
- <KEYWORD1>KTRA</KEYWORD1>
- <KEYWORD1>KTRAN</KEYWORD1>
- <KEYWORD1>KUSE</KEYWORD1>
- <KEYWORD1>KUSE</KEYWORD1>
- <KEYWORD1>KWPA</KEYWORD1>
- <KEYWORD1>KWPAVE</KEYWORD1>
- <KEYWORD1>KWPL</KEYWORD1>
- <KEYWORD1>KWPLAN</KEYWORD1>
- <KEYWORD1>L2AN</KEYWORD1>
- <KEYWORD1>L2ANG</KEYWORD1>
- <KEYWORD1>L2TA</KEYWORD1>
- <KEYWORD1>L2TAN</KEYWORD1>
- <KEYWORD1>L</KEYWORD1>
- <KEYWORD1>LANG</KEYWORD1>
- <KEYWORD1>LANG</KEYWORD1>
- <KEYWORD1>LARC</KEYWORD1>
- <KEYWORD1>LARC</KEYWORD1>
- <KEYWORD1>LARE</KEYWORD1>
- <KEYWORD1>LAREA</KEYWORD1>
- <KEYWORD1>LARG</KEYWORD1>
- <KEYWORD1>LARGE</KEYWORD1>
- <KEYWORD1>LATT</KEYWORD1>
- <KEYWORD1>LATT</KEYWORD1>
- <KEYWORD1>LAYE</KEYWORD1>
- <KEYWORD1>LAYE</KEYWORD1>
- <KEYWORD1>LAYER</KEYWORD1>
- <KEYWORD1>LAYERP26</KEYWORD1>
- <KEYWORD1>LAYL</KEYWORD1>
- <KEYWORD1>LAYLIST</KEYWORD1>
- <KEYWORD1>LAYP</KEYWORD1>
- <KEYWORD1>LAYPLOT</KEYWORD1>
- <KEYWORD1>LCAB</KEYWORD1>
- <KEYWORD1>LCABS</KEYWORD1>
- <KEYWORD1>LCAS</KEYWORD1>
- <KEYWORD1>LCASE</KEYWORD1>
- <KEYWORD1>LCCA</KEYWORD1>
- <KEYWORD1>LCCA</KEYWORD1>
- <KEYWORD1>LCCALC</KEYWORD1>
- <KEYWORD1>LCCAT</KEYWORD1>
- <KEYWORD1>LCDE</KEYWORD1>
- <KEYWORD1>LCDEF</KEYWORD1>
- <KEYWORD1>LCFA</KEYWORD1>
- <KEYWORD1>LCFACT</KEYWORD1>
- <KEYWORD1>LCFI</KEYWORD1>
- <KEYWORD1>LCFILE</KEYWORD1>
- <KEYWORD1>LCLE</KEYWORD1>
- <KEYWORD1>LCLEAR</KEYWORD1>
- <KEYWORD1>LCOM</KEYWORD1>
- <KEYWORD1>LCOMB</KEYWORD1>
- <KEYWORD1>LCOP</KEYWORD1>
- <KEYWORD1>LCOPER</KEYWORD1>
- <KEYWORD1>LCSE</KEYWORD1>
- <KEYWORD1>LCSEL</KEYWORD1>
- <KEYWORD1>LCSL</KEYWORD1>
- <KEYWORD1>LCSL</KEYWORD1>
- <KEYWORD1>LCSU</KEYWORD1>
- <KEYWORD1>LCSUM</KEYWORD1>
- <KEYWORD1>LCWR</KEYWORD1>
- <KEYWORD1>LCWRITE</KEYWORD1>
- <KEYWORD1>LCZE</KEYWORD1>
- <KEYWORD1>LCZERO</KEYWORD1>
- <KEYWORD1>LDEL</KEYWORD1>
- <KEYWORD1>LDELE</KEYWORD1>
- <KEYWORD1>LDIV</KEYWORD1>
- <KEYWORD1>LDIV</KEYWORD1>
- <KEYWORD1>LDRA</KEYWORD1>
- <KEYWORD1>LDRAG</KEYWORD1>
- <KEYWORD1>LDRE</KEYWORD1>
- <KEYWORD1>LDREAD</KEYWORD1>
- <KEYWORD1>LESI</KEYWORD1>
- <KEYWORD1>LESIZE</KEYWORD1>
- <KEYWORD1>LEXT</KEYWORD1>
- <KEYWORD1>LEXTND</KEYWORD1>
- <KEYWORD1>LFIL</KEYWORD1>
- <KEYWORD1>LFILLT</KEYWORD1>
- <KEYWORD1>LFSU</KEYWORD1>
- <KEYWORD1>LFSURF</KEYWORD1>
- <KEYWORD1>LGEN</KEYWORD1>
- <KEYWORD1>LGEN</KEYWORD1>
- <KEYWORD1>LGLU</KEYWORD1>
- <KEYWORD1>LGLUE</KEYWORD1>
- <KEYWORD1>LGWR</KEYWORD1>
- <KEYWORD1>LGWRITE</KEYWORD1>
- <KEYWORD1>LINA</KEYWORD1>
- <KEYWORD1>LINA</KEYWORD1>
- <KEYWORD1>LINE</KEYWORD1>
- <KEYWORD1>LINE</KEYWORD1>
- <KEYWORD1>LINE</KEYWORD1>
- <KEYWORD1>LINES</KEYWORD1>
- <KEYWORD1>LINL</KEYWORD1>
- <KEYWORD1>LINL</KEYWORD1>
- <KEYWORD1>LINP</KEYWORD1>
- <KEYWORD1>LINP</KEYWORD1>
- <KEYWORD1>LINV</KEYWORD1>
- <KEYWORD1>LINV</KEYWORD1>
- <KEYWORD1>LLIS</KEYWORD1>
- <KEYWORD1>LLIST</KEYWORD1>
- <KEYWORD1>LMAT</KEYWORD1>
- <KEYWORD1>LMATRIX</KEYWORD1>
- <KEYWORD1>LMES</KEYWORD1>
- <KEYWORD1>LMESH</KEYWORD1>
- <KEYWORD1>LNCO</KEYWORD1>
- <KEYWORD1>LNCOLLAPSE</KEYWORD1>
- <KEYWORD1>LNDE</KEYWORD1>
- <KEYWORD1>LNDETACH</KEYWORD1>
- <KEYWORD1>LNFI</KEYWORD1>
- <KEYWORD1>LNFILL</KEYWORD1>
- <KEYWORD1>LNME</KEYWORD1>
- <KEYWORD1>LNMERGE</KEYWORD1>
- <KEYWORD1>LNSP</KEYWORD1>
- <KEYWORD1>LNSPLIT</KEYWORD1>
- <KEYWORD1>LNSR</KEYWORD1>
- <KEYWORD1>LNSRCH</KEYWORD1>
- <KEYWORD1>LOCA</KEYWORD1>
- <KEYWORD1>LOCAL</KEYWORD1>
- <KEYWORD1>LOVL</KEYWORD1>
- <KEYWORD1>LOVLAP</KEYWORD1>
- <KEYWORD1>LPLO</KEYWORD1>
- <KEYWORD1>LPLOT</KEYWORD1>
- <KEYWORD1>LPTN</KEYWORD1>
- <KEYWORD1>LPTN</KEYWORD1>
- <KEYWORD1>LREF</KEYWORD1>
- <KEYWORD1>LREFINE</KEYWORD1>
- <KEYWORD1>LREV</KEYWORD1>
- <KEYWORD1>LREVERSE</KEYWORD1>
- <KEYWORD1>LROT</KEYWORD1>
- <KEYWORD1>LROTAT</KEYWORD1>
- <KEYWORD1>LSBA</KEYWORD1>
- <KEYWORD1>LSBA</KEYWORD1>
- <KEYWORD1>LSBL</KEYWORD1>
- <KEYWORD1>LSBL</KEYWORD1>
- <KEYWORD1>LSBV</KEYWORD1>
- <KEYWORD1>LSBV</KEYWORD1>
- <KEYWORD1>LSBW</KEYWORD1>
- <KEYWORD1>LSBW</KEYWORD1>
- <KEYWORD1>LSCL</KEYWORD1>
- <KEYWORD1>LSCLEAR</KEYWORD1>
- <KEYWORD1>LSDE</KEYWORD1>
- <KEYWORD1>LSDELE</KEYWORD1>
- <KEYWORD1>LSEL</KEYWORD1>
- <KEYWORD1>LSEL</KEYWORD1>
- <KEYWORD1>LSLA</KEYWORD1>
- <KEYWORD1>LSLA</KEYWORD1>
- <KEYWORD1>LSLK</KEYWORD1>
- <KEYWORD1>LSLK</KEYWORD1>
- <KEYWORD1>LSOP</KEYWORD1>
- <KEYWORD1>LSOPER</KEYWORD1>
- <KEYWORD1>LSRE</KEYWORD1>
- <KEYWORD1>LSREAD</KEYWORD1>
- <KEYWORD1>LSSC</KEYWORD1>
- <KEYWORD1>LSSCALE</KEYWORD1>
- <KEYWORD1>LSSO</KEYWORD1>
- <KEYWORD1>LSSOLVE</KEYWORD1>
- <KEYWORD1>LSTR</KEYWORD1>
- <KEYWORD1>LSTR</KEYWORD1>
- <KEYWORD1>LSUM</KEYWORD1>
- <KEYWORD1>LSUM</KEYWORD1>
- <KEYWORD1>LSWR</KEYWORD1>
- <KEYWORD1>LSWRITE</KEYWORD1>
- <KEYWORD1>LSYM</KEYWORD1>
- <KEYWORD1>LSYMM</KEYWORD1>
- <KEYWORD1>LTAN</KEYWORD1>
- <KEYWORD1>LTAN</KEYWORD1>
- <KEYWORD1>LTRA</KEYWORD1>
- <KEYWORD1>LTRAN</KEYWORD1>
- <KEYWORD1>LUMP</KEYWORD1>
- <KEYWORD1>LUMPM</KEYWORD1>
- <KEYWORD1>LVSC</KEYWORD1>
- <KEYWORD1>LVSCALE</KEYWORD1>
- <KEYWORD1>LWPL</KEYWORD1>
- <KEYWORD1>LWPLAN</KEYWORD1>
- <KEYWORD1>M</KEYWORD1>
- <KEYWORD1>MAGO</KEYWORD1>
- <KEYWORD1>MAGOPT</KEYWORD1>
- <KEYWORD1>MAGS</KEYWORD1>
- <KEYWORD1>MAGSOLV</KEYWORD1>
- <KEYWORD1>MAST</KEYWORD1>
- <KEYWORD1>MASTER</KEYWORD1>
- <KEYWORD1>MAT</KEYWORD1>
- <KEYWORD1>MATE</KEYWORD1>
- <KEYWORD1>MATER</KEYWORD1>
- <KEYWORD1>MDAM</KEYWORD1>
- <KEYWORD1>MDAMP</KEYWORD1>
- <KEYWORD1>MDEL</KEYWORD1>
- <KEYWORD1>MDELE</KEYWORD1>
- <KEYWORD1>MESH</KEYWORD1>
- <KEYWORD1>MESHING</KEYWORD1>
- <KEYWORD1>MGEN</KEYWORD1>
- <KEYWORD1>MGEN</KEYWORD1>
- <KEYWORD1>MITE</KEYWORD1>
- <KEYWORD1>MITER</KEYWORD1>
- <KEYWORD1>MLIS</KEYWORD1>
- <KEYWORD1>MLIST</KEYWORD1>
- <KEYWORD1>MMF</KEYWORD1>
- <KEYWORD1>MODE</KEYWORD1>
- <KEYWORD1>MODE</KEYWORD1>
- <KEYWORD1>MODM</KEYWORD1>
- <KEYWORD1>MODMSH</KEYWORD1>
- <KEYWORD1>MODO</KEYWORD1>
- <KEYWORD1>MODOPT</KEYWORD1>
- <KEYWORD1>MONI</KEYWORD1>
- <KEYWORD1>MONITOR</KEYWORD1>
- <KEYWORD1>MOPT</KEYWORD1>
- <KEYWORD1>MOPT</KEYWORD1>
- <KEYWORD1>MOVE</KEYWORD1>
- <KEYWORD1>MOVE</KEYWORD1>
- <KEYWORD1>MP</KEYWORD1>
- <KEYWORD1>MPAM</KEYWORD1>
- <KEYWORD1>MPAMOD</KEYWORD1>
- <KEYWORD1>MPCH</KEYWORD1>
- <KEYWORD1>MPCHG</KEYWORD1>
- <KEYWORD1>MPDA</KEYWORD1>
- <KEYWORD1>MPDATA</KEYWORD1>
- <KEYWORD1>MPDE</KEYWORD1>
- <KEYWORD1>MPDELE</KEYWORD1>
- <KEYWORD1>MPDR</KEYWORD1>
- <KEYWORD1>MPDRES</KEYWORD1>
- <KEYWORD1>MPLI</KEYWORD1>
- <KEYWORD1>MPLIST</KEYWORD1>
- <KEYWORD1>MPMO</KEYWORD1>
- <KEYWORD1>MPMOD</KEYWORD1>
- <KEYWORD1>MPPL</KEYWORD1>
- <KEYWORD1>MPPLOT</KEYWORD1>
- <KEYWORD1>MPRE</KEYWORD1>
- <KEYWORD1>MPREAD</KEYWORD1>
- <KEYWORD1>MPRI</KEYWORD1>
- <KEYWORD1>MPRINT</KEYWORD1>
- <KEYWORD1>MPTE</KEYWORD1>
- <KEYWORD1>MPTEMP</KEYWORD1>
- <KEYWORD1>MPTG</KEYWORD1>
- <KEYWORD1>MPTGEN</KEYWORD1>
- <KEYWORD1>MPTR</KEYWORD1>
- <KEYWORD1>MPTRES</KEYWORD1>
- <KEYWORD1>MPUN</KEYWORD1>
- <KEYWORD1>MPUNDO</KEYWORD1>
- <KEYWORD1>MPWR</KEYWORD1>
- <KEYWORD1>MPWRITE</KEYWORD1>
- <KEYWORD1>MSAD</KEYWORD1>
- <KEYWORD1>MSADV</KEYWORD1>
- <KEYWORD1>MSCA</KEYWORD1>
- <KEYWORD1>MSCAP</KEYWORD1>
- <KEYWORD1>MSDA</KEYWORD1>
- <KEYWORD1>MSDATA</KEYWORD1>
- <KEYWORD1>MSHA</KEYWORD1>
- <KEYWORD1>MSHAPE</KEYWORD1>
- <KEYWORD1>MSHK</KEYWORD1>
- <KEYWORD1>MSHKEY</KEYWORD1>
- <KEYWORD1>MSHM</KEYWORD1>
- <KEYWORD1>MSHMID</KEYWORD1>
- <KEYWORD1>MSHP</KEYWORD1>
- <KEYWORD1>MSHPATTERN</KEYWORD1>
- <KEYWORD1>MSME</KEYWORD1>
- <KEYWORD1>MSMETH</KEYWORD1>
- <KEYWORD1>MSNO</KEYWORD1>
- <KEYWORD1>MSNOMF</KEYWORD1>
- <KEYWORD1>MSPR</KEYWORD1>
- <KEYWORD1>MSPROP</KEYWORD1>
- <KEYWORD1>MSQU</KEYWORD1>
- <KEYWORD1>MSQUAD</KEYWORD1>
- <KEYWORD1>MSRE</KEYWORD1>
- <KEYWORD1>MSRELAX</KEYWORD1>
- <KEYWORD1>MSSO</KEYWORD1>
- <KEYWORD1>MSSOLU</KEYWORD1>
- <KEYWORD1>MSSP</KEYWORD1>
- <KEYWORD1>MSSPEC</KEYWORD1>
- <KEYWORD1>MSTE</KEYWORD1>
- <KEYWORD1>MSTERM</KEYWORD1>
- <KEYWORD1>MSVA</KEYWORD1>
- <KEYWORD1>MSVARY</KEYWORD1>
- <KEYWORD1>MXPA</KEYWORD1>
- <KEYWORD1>MXPAND</KEYWORD1>
- <KEYWORD1>N</KEYWORD1>
- <KEYWORD1>NANG</KEYWORD1>
- <KEYWORD1>NANG</KEYWORD1>
- <KEYWORD1>NCNV</KEYWORD1>
- <KEYWORD1>NCNV</KEYWORD1>
- <KEYWORD1>NDEL</KEYWORD1>
- <KEYWORD1>NDELE</KEYWORD1>
- <KEYWORD1>NDIS</KEYWORD1>
- <KEYWORD1>NDIST</KEYWORD1>
- <KEYWORD1>NEQI</KEYWORD1>
- <KEYWORD1>NEQIT</KEYWORD1>
- <KEYWORD1>NFOR</KEYWORD1>
- <KEYWORD1>NFORCE</KEYWORD1>
- <KEYWORD1>NGEN</KEYWORD1>
- <KEYWORD1>NGEN</KEYWORD1>
- <KEYWORD1>NKPT</KEYWORD1>
- <KEYWORD1>NKPT</KEYWORD1>
- <KEYWORD1>NLGE</KEYWORD1>
- <KEYWORD1>NLGEOM</KEYWORD1>
- <KEYWORD1>NLIS</KEYWORD1>
- <KEYWORD1>NLIST</KEYWORD1>
- <KEYWORD1>NLOG</KEYWORD1>
- <KEYWORD1>NLOG</KEYWORD1>
- <KEYWORD1>NLOP</KEYWORD1>
- <KEYWORD1>NLOPT</KEYWORD1>
- <KEYWORD1>NMOD</KEYWORD1>
- <KEYWORD1>NMODIF</KEYWORD1>
- <KEYWORD1>NOCO</KEYWORD1>
- <KEYWORD1>NOCOLOR</KEYWORD1>
- <KEYWORD1>NODE</KEYWORD1>
- <KEYWORD1>NODES</KEYWORD1>
- <KEYWORD1>NOOR</KEYWORD1>
- <KEYWORD1>NOORDER</KEYWORD1>
- <KEYWORD1>NPLO</KEYWORD1>
- <KEYWORD1>NPLOT</KEYWORD1>
- <KEYWORD1>NPRI</KEYWORD1>
- <KEYWORD1>NPRINT</KEYWORD1>
- <KEYWORD1>NREA</KEYWORD1>
- <KEYWORD1>NREAD</KEYWORD1>
- <KEYWORD1>NREF</KEYWORD1>
- <KEYWORD1>NREFINE</KEYWORD1>
- <KEYWORD1>NRLS</KEYWORD1>
- <KEYWORD1>NRLSUM</KEYWORD1>
- <KEYWORD1>NROP</KEYWORD1>
- <KEYWORD1>NROPT</KEYWORD1>
- <KEYWORD1>NROT</KEYWORD1>
- <KEYWORD1>NROTAT</KEYWORD1>
- <KEYWORD1>NRRA</KEYWORD1>
- <KEYWORD1>NRRANG</KEYWORD1>
- <KEYWORD1>NSCA</KEYWORD1>
- <KEYWORD1>NSCALE</KEYWORD1>
- <KEYWORD1>NSEL</KEYWORD1>
- <KEYWORD1>NSEL</KEYWORD1>
- <KEYWORD1>NSLA</KEYWORD1>
- <KEYWORD1>NSLA</KEYWORD1>
- <KEYWORD1>NSLE</KEYWORD1>
- <KEYWORD1>NSLE</KEYWORD1>
- <KEYWORD1>NSLK</KEYWORD1>
- <KEYWORD1>NSLK</KEYWORD1>
- <KEYWORD1>NSLL</KEYWORD1>
- <KEYWORD1>NSLL</KEYWORD1>
- <KEYWORD1>NSLV</KEYWORD1>
- <KEYWORD1>NSLV</KEYWORD1>
- <KEYWORD1>NSOL</KEYWORD1>
- <KEYWORD1>NSOL</KEYWORD1>
- <KEYWORD1>NSOR</KEYWORD1>
- <KEYWORD1>NSORT</KEYWORD1>
- <KEYWORD1>NSTO</KEYWORD1>
- <KEYWORD1>NSTORE</KEYWORD1>
- <KEYWORD1>NSUB</KEYWORD1>
- <KEYWORD1>NSUBST</KEYWORD1>
- <KEYWORD1>NSVR</KEYWORD1>
- <KEYWORD1>NSVR</KEYWORD1>
- <KEYWORD1>NSYM</KEYWORD1>
- <KEYWORD1>NSYM</KEYWORD1>
- <KEYWORD1>NUMC</KEYWORD1>
- <KEYWORD1>NUMCMP</KEYWORD1>
- <KEYWORD1>NUME</KEYWORD1>
- <KEYWORD1>NUMEXP</KEYWORD1>
- <KEYWORD1>NUMM</KEYWORD1>
- <KEYWORD1>NUMMRG</KEYWORD1>
- <KEYWORD1>NUMO</KEYWORD1>
- <KEYWORD1>NUMOFF</KEYWORD1>
- <KEYWORD1>NUMS</KEYWORD1>
- <KEYWORD1>NUMSTR</KEYWORD1>
- <KEYWORD1>NUMV</KEYWORD1>
- <KEYWORD1>NUMVAR</KEYWORD1>
- <KEYWORD1>NUSO</KEYWORD1>
- <KEYWORD1>NUSORT</KEYWORD1>
- <KEYWORD1>NWPA</KEYWORD1>
- <KEYWORD1>NWPAVE</KEYWORD1>
- <KEYWORD1>NWPL</KEYWORD1>
- <KEYWORD1>NWPLAN</KEYWORD1>
- <KEYWORD1>NWRI</KEYWORD1>
- <KEYWORD1>NWRITE</KEYWORD1>
- <KEYWORD1>nx</KEYWORD1>
- <KEYWORD1>ny</KEYWORD1>
- <KEYWORD1>nz</KEYWORD1>
- <KEYWORD1>OMEG</KEYWORD1>
- <KEYWORD1>OMEGA</KEYWORD1>
- <KEYWORD1>OPAD</KEYWORD1>
- <KEYWORD1>OPADD</KEYWORD1>
- <KEYWORD1>OPAN</KEYWORD1>
- <KEYWORD1>OPANL</KEYWORD1>
- <KEYWORD1>OPCL</KEYWORD1>
- <KEYWORD1>OPCLR</KEYWORD1>
- <KEYWORD1>OPDA</KEYWORD1>
- <KEYWORD1>OPDATA</KEYWORD1>
- <KEYWORD1>OPDE</KEYWORD1>
- <KEYWORD1>OPDEL</KEYWORD1>
- <KEYWORD1>OPEQ</KEYWORD1>
- <KEYWORD1>OPEQN</KEYWORD1>
- <KEYWORD1>OPER</KEYWORD1>
- <KEYWORD1>OPERATE</KEYWORD1>
- <KEYWORD1>OPEX</KEYWORD1>
- <KEYWORD1>OPEXE</KEYWORD1>
- <KEYWORD1>OPFA</KEYWORD1>
- <KEYWORD1>OPFACT</KEYWORD1>
- <KEYWORD1>OPFR</KEYWORD1>
- <KEYWORD1>OPFRST</KEYWORD1>
- <KEYWORD1>OPGR</KEYWORD1>
- <KEYWORD1>OPGRAD</KEYWORD1>
- <KEYWORD1>OPKE</KEYWORD1>
- <KEYWORD1>OPKEEP</KEYWORD1>
- <KEYWORD1>OPLF</KEYWORD1>
- <KEYWORD1>OPLFA</KEYWORD1>
- <KEYWORD1>OPLG</KEYWORD1>
- <KEYWORD1>OPLGR</KEYWORD1>
- <KEYWORD1>OPLI</KEYWORD1>
- <KEYWORD1>OPLIST</KEYWORD1>
- <KEYWORD1>OPLO</KEYWORD1>
- <KEYWORD1>OPLOOP</KEYWORD1>
- <KEYWORD1>OPLS</KEYWORD1>
- <KEYWORD1>OPLSW</KEYWORD1>
- <KEYWORD1>OPMA</KEYWORD1>
- <KEYWORD1>OPMAKE</KEYWORD1>
- <KEYWORD1>OPNC</KEYWORD1>
- <KEYWORD1>OPNCONTROL</KEYWORD1>
- <KEYWORD1>OPPR</KEYWORD1>
- <KEYWORD1>OPPRNT</KEYWORD1>
- <KEYWORD1>OPRA</KEYWORD1>
- <KEYWORD1>OPRAND</KEYWORD1>
- <KEYWORD1>OPRE</KEYWORD1>
- <KEYWORD1>OPRESU</KEYWORD1>
- <KEYWORD1>OPRF</KEYWORD1>
- <KEYWORD1>OPRFA</KEYWORD1>
- <KEYWORD1>OPRG</KEYWORD1>
- <KEYWORD1>OPRGR</KEYWORD1>
- <KEYWORD1>OPRS</KEYWORD1>
- <KEYWORD1>OPRSW</KEYWORD1>
- <KEYWORD1>OPSA</KEYWORD1>
- <KEYWORD1>OPSAVE</KEYWORD1>
- <KEYWORD1>OPSE</KEYWORD1>
- <KEYWORD1>OPSEL</KEYWORD1>
- <KEYWORD1>OPSU</KEYWORD1>
- <KEYWORD1>OPSUBP</KEYWORD1>
- <KEYWORD1>OPSW</KEYWORD1>
- <KEYWORD1>OPSWEEP</KEYWORD1>
- <KEYWORD1>OPTY</KEYWORD1>
- <KEYWORD1>OPTYPE</KEYWORD1>
- <KEYWORD1>OPUS</KEYWORD1>
- <KEYWORD1>OPUSER</KEYWORD1>
- <KEYWORD1>OPVA</KEYWORD1>
- <KEYWORD1>OPVAR</KEYWORD1>
- <KEYWORD1>OUTO</KEYWORD1>
- <KEYWORD1>OUTOPT</KEYWORD1>
- <KEYWORD1>OUTP</KEYWORD1>
- <KEYWORD1>OUTPR</KEYWORD1>
- <KEYWORD1>OUTR</KEYWORD1>
- <KEYWORD1>OUTRES</KEYWORD1>
- <KEYWORD1>PADE</KEYWORD1>
- <KEYWORD1>PADELE</KEYWORD1>
- <KEYWORD1>PAGE</KEYWORD1>
- <KEYWORD1>PAGET</KEYWORD1>
- <KEYWORD1>PAPU</KEYWORD1>
- <KEYWORD1>PAPUT</KEYWORD1>
- <KEYWORD1>PARE</KEYWORD1>
- <KEYWORD1>PARESU</KEYWORD1>
- <KEYWORD1>PARR</KEYWORD1>
- <KEYWORD1>PARRES</KEYWORD1>
- <KEYWORD1>PARS</KEYWORD1>
- <KEYWORD1>PARSAV</KEYWORD1>
- <KEYWORD1>PASA</KEYWORD1>
- <KEYWORD1>PASAVE</KEYWORD1>
- <KEYWORD1>PATH</KEYWORD1>
- <KEYWORD1>PATH</KEYWORD1>
- <KEYWORD1>PCAL</KEYWORD1>
- <KEYWORD1>PCALC</KEYWORD1>
- <KEYWORD1>PCIR</KEYWORD1>
- <KEYWORD1>PCIRC</KEYWORD1>
- <KEYWORD1>PCON</KEYWORD1>
- <KEYWORD1>PCONV</KEYWORD1>
- <KEYWORD1>PCOR</KEYWORD1>
- <KEYWORD1>PCORRO</KEYWORD1>
- <KEYWORD1>PCRO</KEYWORD1>
- <KEYWORD1>PCROSS</KEYWORD1>
- <KEYWORD1>PDEF</KEYWORD1>
- <KEYWORD1>PDEF</KEYWORD1>
- <KEYWORD1>PDOT</KEYWORD1>
- <KEYWORD1>PDOT</KEYWORD1>
- <KEYWORD1>PDRA</KEYWORD1>
- <KEYWORD1>PDRAG</KEYWORD1>
- <KEYWORD1>PERB</KEYWORD1>
- <KEYWORD1>PERBC2D</KEYWORD1>
- <KEYWORD1>PEXC</KEYWORD1>
- <KEYWORD1>PEXCLUDE</KEYWORD1>
- <KEYWORD1>PFAC</KEYWORD1>
- <KEYWORD1>PFACT</KEYWORD1>
- <KEYWORD1>PFLU</KEYWORD1>
- <KEYWORD1>PFLUID</KEYWORD1>
- <KEYWORD1>PGAP</KEYWORD1>
- <KEYWORD1>PGAP</KEYWORD1>
- <KEYWORD1>PHYS</KEYWORD1>
- <KEYWORD1>PHYSICS</KEYWORD1>
- <KEYWORD1>PINC</KEYWORD1>
- <KEYWORD1>PINCLUDE</KEYWORD1>
- <KEYWORD1>PINS</KEYWORD1>
- <KEYWORD1>PINSUL</KEYWORD1>
- <KEYWORD1>PIPE</KEYWORD1>
- <KEYWORD1>PIPE</KEYWORD1>
- <KEYWORD1>PIVC</KEYWORD1>
- <KEYWORD1>PIVCHECK</KEYWORD1>
- <KEYWORD1>PLAN</KEYWORD1>
- <KEYWORD1>PLANEWAVE</KEYWORD1>
- <KEYWORD1>PLCO</KEYWORD1>
- <KEYWORD1>PLCONV</KEYWORD1>
- <KEYWORD1>PLCP</KEYWORD1>
- <KEYWORD1>PLCPLX</KEYWORD1>
- <KEYWORD1>PLCR</KEYWORD1>
- <KEYWORD1>PLCRACK</KEYWORD1>
- <KEYWORD1>PLDI</KEYWORD1>
- <KEYWORD1>PLDISP</KEYWORD1>
- <KEYWORD1>PLES</KEYWORD1>
- <KEYWORD1>PLESOL</KEYWORD1>
- <KEYWORD1>PLET</KEYWORD1>
- <KEYWORD1>PLETAB</KEYWORD1>
- <KEYWORD1>PLF2</KEYWORD1>
- <KEYWORD1>PLF2D</KEYWORD1>
- <KEYWORD1>PLLS</KEYWORD1>
- <KEYWORD1>PLLS</KEYWORD1>
- <KEYWORD1>PLNS</KEYWORD1>
- <KEYWORD1>PLNSOL</KEYWORD1>
- <KEYWORD1>PLOT</KEYWORD1>
- <KEYWORD1>PLOT</KEYWORD1>
- <KEYWORD1>PLOT</KEYWORD1>
- <KEYWORD1>PLOTTING</KEYWORD1>
- <KEYWORD1>PLPA</KEYWORD1>
- <KEYWORD1>PLPA</KEYWORD1>
- <KEYWORD1>PLPAGM</KEYWORD1>
- <KEYWORD1>PLPATH</KEYWORD1>
- <KEYWORD1>PLSE</KEYWORD1>
- <KEYWORD1>PLSECT</KEYWORD1>
- <KEYWORD1>PLTI</KEYWORD1>
- <KEYWORD1>PLTIME</KEYWORD1>
- <KEYWORD1>PLTR</KEYWORD1>
- <KEYWORD1>PLTRAC</KEYWORD1>
- <KEYWORD1>PLVA</KEYWORD1>
- <KEYWORD1>PLVA</KEYWORD1>
- <KEYWORD1>PLVAR</KEYWORD1>
- <KEYWORD1>PLVAROPT</KEYWORD1>
- <KEYWORD1>PLVE</KEYWORD1>
- <KEYWORD1>PLVECT</KEYWORD1>
- <KEYWORD1>PMAP</KEYWORD1>
- <KEYWORD1>PMAP</KEYWORD1>
- <KEYWORD1>PMET</KEYWORD1>
- <KEYWORD1>PMETH</KEYWORD1>
- <KEYWORD1>PMGT</KEYWORD1>
- <KEYWORD1>PMGTRAN</KEYWORD1>
- <KEYWORD1>PMOP</KEYWORD1>
- <KEYWORD1>PMOPTS</KEYWORD1>
- <KEYWORD1>POIN</KEYWORD1>
- <KEYWORD1>POINT</KEYWORD1>
- <KEYWORD1>POLY</KEYWORD1>
- <KEYWORD1>POLY</KEYWORD1>
- <KEYWORD1>POPT</KEYWORD1>
- <KEYWORD1>POPT</KEYWORD1>
- <KEYWORD1>PORT</KEYWORD1>
- <KEYWORD1>PORTOPT</KEYWORD1>
- <KEYWORD1>POWE</KEYWORD1>
- <KEYWORD1>POWERH</KEYWORD1>
- <KEYWORD1>PPAT</KEYWORD1>
- <KEYWORD1>PPATH</KEYWORD1>
- <KEYWORD1>PPLO</KEYWORD1>
- <KEYWORD1>PPLOT</KEYWORD1>
- <KEYWORD1>PPRA</KEYWORD1>
- <KEYWORD1>PPRANGE</KEYWORD1>
- <KEYWORD1>PPRE</KEYWORD1>
- <KEYWORD1>PPRES</KEYWORD1>
- <KEYWORD1>PRAN</KEYWORD1>
- <KEYWORD1>PRANGE</KEYWORD1>
- <KEYWORD1>PRCO</KEYWORD1>
- <KEYWORD1>PRCONV</KEYWORD1>
- <KEYWORD1>PRCP</KEYWORD1>
- <KEYWORD1>PRCPLX</KEYWORD1>
- <KEYWORD1>PREC</KEYWORD1>
- <KEYWORD1>PRECISION</KEYWORD1>
- <KEYWORD1>PRED</KEYWORD1>
- <KEYWORD1>PRED</KEYWORD1>
- <KEYWORD1>PRER</KEYWORD1>
- <KEYWORD1>PRERR</KEYWORD1>
- <KEYWORD1>PRES</KEYWORD1>
- <KEYWORD1>PRESOL</KEYWORD1>
- <KEYWORD1>PRET</KEYWORD1>
- <KEYWORD1>PRETAB</KEYWORD1>
- <KEYWORD1>PRI2</KEYWORD1>
- <KEYWORD1>PRI2</KEYWORD1>
- <KEYWORD1>PRIM</KEYWORD1>
- <KEYWORD1>PRIM</KEYWORD1>
- <KEYWORD1>PRIN</KEYWORD1>
- <KEYWORD1>PRINT</KEYWORD1>
- <KEYWORD1>PRIS</KEYWORD1>
- <KEYWORD1>PRISM</KEYWORD1>
- <KEYWORD1>PRIT</KEYWORD1>
- <KEYWORD1>PRITER</KEYWORD1>
- <KEYWORD1>PRNL</KEYWORD1>
- <KEYWORD1>PRNLD</KEYWORD1>
- <KEYWORD1>PRNS</KEYWORD1>
- <KEYWORD1>PRNSOL</KEYWORD1>
- <KEYWORD1>PROD</KEYWORD1>
- <KEYWORD1>PROD</KEYWORD1>
- <KEYWORD1>PRPA</KEYWORD1>
- <KEYWORD1>PRPATH</KEYWORD1>
- <KEYWORD1>PRRF</KEYWORD1>
- <KEYWORD1>PRRFOR</KEYWORD1>
- <KEYWORD1>PRRS</KEYWORD1>
- <KEYWORD1>PRRSOL</KEYWORD1>
- <KEYWORD1>PRSE</KEYWORD1>
- <KEYWORD1>PRSECT</KEYWORD1>
- <KEYWORD1>PRSS</KEYWORD1>
- <KEYWORD1>PRSSOL</KEYWORD1>
- <KEYWORD1>PRTI</KEYWORD1>
- <KEYWORD1>PRTIME</KEYWORD1>
- <KEYWORD1>PRVA</KEYWORD1>
- <KEYWORD1>PRVA</KEYWORD1>
- <KEYWORD1>PRVAR</KEYWORD1>
- <KEYWORD1>PRVAROPT</KEYWORD1>
- <KEYWORD1>PRVE</KEYWORD1>
- <KEYWORD1>PRVECT</KEYWORD1>
- <KEYWORD1>PSCR</KEYWORD1>
- <KEYWORD1>PSCR</KEYWORD1>
- <KEYWORD1>PSDC</KEYWORD1>
- <KEYWORD1>PSDCOM</KEYWORD1>
- <KEYWORD1>PSDF</KEYWORD1>
- <KEYWORD1>PSDFRQ</KEYWORD1>
- <KEYWORD1>PSDR</KEYWORD1>
- <KEYWORD1>PSDRES</KEYWORD1>
- <KEYWORD1>PSDS</KEYWORD1>
- <KEYWORD1>PSDSPL</KEYWORD1>
- <KEYWORD1>PSDU</KEYWORD1>
- <KEYWORD1>PSDUNIT</KEYWORD1>
- <KEYWORD1>PSDV</KEYWORD1>
- <KEYWORD1>PSDVAL</KEYWORD1>
- <KEYWORD1>PSDW</KEYWORD1>
- <KEYWORD1>PSDWAV</KEYWORD1>
- <KEYWORD1>PSEL</KEYWORD1>
- <KEYWORD1>PSEL</KEYWORD1>
- <KEYWORD1>PSOL</KEYWORD1>
- <KEYWORD1>PSOLVE</KEYWORD1>
- <KEYWORD1>PSPE</KEYWORD1>
- <KEYWORD1>PSPEC</KEYWORD1>
- <KEYWORD1>PSPR</KEYWORD1>
- <KEYWORD1>PSPRNG</KEYWORD1>
- <KEYWORD1>PSTR</KEYWORD1>
- <KEYWORD1>PSTRES</KEYWORD1>
- <KEYWORD1>PTEM</KEYWORD1>
- <KEYWORD1>PTEMP</KEYWORD1>
- <KEYWORD1>PTXY</KEYWORD1>
- <KEYWORD1>PTXY</KEYWORD1>
- <KEYWORD1>PUNI</KEYWORD1>
- <KEYWORD1>PUNIT</KEYWORD1>
- <KEYWORD1>PVEC</KEYWORD1>
- <KEYWORD1>PVECT</KEYWORD1>
- <KEYWORD1>QDVA</KEYWORD1>
- <KEYWORD1>QDVAL</KEYWORD1>
- <KEYWORD1>QFAC</KEYWORD1>
- <KEYWORD1>QFACT</KEYWORD1>
- <KEYWORD1>QUAD</KEYWORD1>
- <KEYWORD1>QUAD</KEYWORD1>
- <KEYWORD1>QUOT</KEYWORD1>
- <KEYWORD1>QUOT</KEYWORD1>
- <KEYWORD1>R</KEYWORD1>
- <KEYWORD1>RACE</KEYWORD1>
- <KEYWORD1>RACE</KEYWORD1>
- <KEYWORD1>RALL</KEYWORD1>
- <KEYWORD1>RALL</KEYWORD1>
- <KEYWORD1>RAPP</KEYWORD1>
- <KEYWORD1>RAPPND</KEYWORD1>
- <KEYWORD1>RBE3</KEYWORD1>
- <KEYWORD1>RBE3</KEYWORD1>
- <KEYWORD1>RCON</KEYWORD1>
- <KEYWORD1>RCON</KEYWORD1>
- <KEYWORD1>RDEL</KEYWORD1>
- <KEYWORD1>RDELE</KEYWORD1>
- <KEYWORD1>REAL</KEYWORD1>
- <KEYWORD1>REAL</KEYWORD1>
- <KEYWORD1>REAL</KEYWORD1>
- <KEYWORD1>REALVAR</KEYWORD1>
- <KEYWORD1>RECT</KEYWORD1>
- <KEYWORD1>RECTNG</KEYWORD1>
- <KEYWORD1>REDU</KEYWORD1>
- <KEYWORD1>REDUCE</KEYWORD1>
- <KEYWORD1>REFL</KEYWORD1>
- <KEYWORD1>REFLCOEF</KEYWORD1>
- <KEYWORD1>REOR</KEYWORD1>
- <KEYWORD1>REORDER</KEYWORD1>
- <KEYWORD1>RESE</KEYWORD1>
- <KEYWORD1>RESET</KEYWORD1>
- <KEYWORD1>RESP</KEYWORD1>
- <KEYWORD1>RESP</KEYWORD1>
- <KEYWORD1>RESU</KEYWORD1>
- <KEYWORD1>RESUME</KEYWORD1>
- <KEYWORD1>REXP</KEYWORD1>
- <KEYWORD1>REXPORT</KEYWORD1>
- <KEYWORD1>RFIL</KEYWORD1>
- <KEYWORD1>RFILSZ</KEYWORD1>
- <KEYWORD1>RFOR</KEYWORD1>
- <KEYWORD1>RFORCE</KEYWORD1>
- <KEYWORD1>RIGI</KEYWORD1>
- <KEYWORD1>RIGID</KEYWORD1>
- <KEYWORD1>RIMP</KEYWORD1>
- <KEYWORD1>RIMPORT</KEYWORD1>
- <KEYWORD1>RITE</KEYWORD1>
- <KEYWORD1>RITER</KEYWORD1>
- <KEYWORD1>RLIS</KEYWORD1>
- <KEYWORD1>RLIST</KEYWORD1>
- <KEYWORD1>RMEM</KEYWORD1>
- <KEYWORD1>RMEMRY</KEYWORD1>
- <KEYWORD1>RMOD</KEYWORD1>
- <KEYWORD1>RMODIF</KEYWORD1>
- <KEYWORD1>RMOR</KEYWORD1>
- <KEYWORD1>RMORE</KEYWORD1>
- <KEYWORD1>ROCK</KEYWORD1>
- <KEYWORD1>ROCK</KEYWORD1>
- <KEYWORD1>RPOL</KEYWORD1>
- <KEYWORD1>RPOLY</KEYWORD1>
- <KEYWORD1>RPR4</KEYWORD1>
- <KEYWORD1>RPR4</KEYWORD1>
- <KEYWORD1>RPRI</KEYWORD1>
- <KEYWORD1>RPRISM</KEYWORD1>
- <KEYWORD1>RPSD</KEYWORD1>
- <KEYWORD1>RPSD</KEYWORD1>
- <KEYWORD1>RSPE</KEYWORD1>
- <KEYWORD1>RSPEED</KEYWORD1>
- <KEYWORD1>RSTA</KEYWORD1>
- <KEYWORD1>RSTAT</KEYWORD1>
- <KEYWORD1>RSYS</KEYWORD1>
- <KEYWORD1>RSYS</KEYWORD1>
- <KEYWORD1>RTIM</KEYWORD1>
- <KEYWORD1>RTIMST</KEYWORD1>
- <KEYWORD1>RUN</KEYWORD1>
- <KEYWORD1>RWFR</KEYWORD1>
- <KEYWORD1>RWFRNT</KEYWORD1>
- <KEYWORD1>SABS</KEYWORD1>
- <KEYWORD1>SABS</KEYWORD1>
- <KEYWORD1>SADD</KEYWORD1>
- <KEYWORD1>SADD</KEYWORD1>
- <KEYWORD1>SALL</KEYWORD1>
- <KEYWORD1>SALLOW</KEYWORD1>
- <KEYWORD1>SARP</KEYWORD1>
- <KEYWORD1>SARPLOT</KEYWORD1>
- <KEYWORD1>SAVE</KEYWORD1>
- <KEYWORD1>SAVE</KEYWORD1>
- <KEYWORD1>SBCL</KEYWORD1>
- <KEYWORD1>SBCLIST</KEYWORD1>
- <KEYWORD1>SBCT</KEYWORD1>
- <KEYWORD1>SBCTRAN</KEYWORD1>
- <KEYWORD1>SDEL</KEYWORD1>
- <KEYWORD1>SDELETE</KEYWORD1>
- <KEYWORD1>SE</KEYWORD1>
- <KEYWORD1>SECD</KEYWORD1>
- <KEYWORD1>SECDATA</KEYWORD1>
- <KEYWORD1>SECN</KEYWORD1>
- <KEYWORD1>SECNUM</KEYWORD1>
- <KEYWORD1>SECO</KEYWORD1>
- <KEYWORD1>SECOFFSET</KEYWORD1>
- <KEYWORD1>SECP</KEYWORD1>
- <KEYWORD1>SECPLOT</KEYWORD1>
- <KEYWORD1>SECR</KEYWORD1>
- <KEYWORD1>SECREAD</KEYWORD1>
- <KEYWORD1>SECT</KEYWORD1>
- <KEYWORD1>SECTYPE</KEYWORD1>
- <KEYWORD1>SECW</KEYWORD1>
- <KEYWORD1>SECWRITE</KEYWORD1>
- <KEYWORD1>SED</KEYWORD1>
- <KEYWORD1>SEDL</KEYWORD1>
- <KEYWORD1>SEDLIST</KEYWORD1>
- <KEYWORD1>SEEX</KEYWORD1>
- <KEYWORD1>SEEXP</KEYWORD1>
- <KEYWORD1>SELI</KEYWORD1>
- <KEYWORD1>SELIST</KEYWORD1>
- <KEYWORD1>SELM</KEYWORD1>
- <KEYWORD1>SELM</KEYWORD1>
- <KEYWORD1>SENE</KEYWORD1>
- <KEYWORD1>SENERGY</KEYWORD1>
- <KEYWORD1>SEOP</KEYWORD1>
- <KEYWORD1>SEOPT</KEYWORD1>
- <KEYWORD1>SESY</KEYWORD1>
- <KEYWORD1>SESYMM</KEYWORD1>
- <KEYWORD1>SET</KEYWORD1>
- <KEYWORD1>SETR</KEYWORD1>
- <KEYWORD1>SETRAN</KEYWORD1>
- <KEYWORD1>SEXP</KEYWORD1>
- <KEYWORD1>SEXP</KEYWORD1>
- <KEYWORD1>SF</KEYWORD1>
- <KEYWORD1>SFA</KEYWORD1>
- <KEYWORD1>SFAC</KEYWORD1>
- <KEYWORD1>SFACT</KEYWORD1>
- <KEYWORD1>SFAD</KEYWORD1>
- <KEYWORD1>SFADELE</KEYWORD1>
- <KEYWORD1>SFAL</KEYWORD1>
- <KEYWORD1>SFALIST</KEYWORD1>
- <KEYWORD1>SFBE</KEYWORD1>
- <KEYWORD1>SFBEAM</KEYWORD1>
- <KEYWORD1>SFCA</KEYWORD1>
- <KEYWORD1>SFCALC</KEYWORD1>
- <KEYWORD1>SFCU</KEYWORD1>
- <KEYWORD1>SFCUM</KEYWORD1>
- <KEYWORD1>SFDE</KEYWORD1>
- <KEYWORD1>SFDELE</KEYWORD1>
- <KEYWORD1>SFE</KEYWORD1>
- <KEYWORD1>SFED</KEYWORD1>
- <KEYWORD1>SFEDELE</KEYWORD1>
- <KEYWORD1>SFEL</KEYWORD1>
- <KEYWORD1>SFELIST</KEYWORD1>
- <KEYWORD1>SFFU</KEYWORD1>
- <KEYWORD1>SFFUN</KEYWORD1>
- <KEYWORD1>SFGR</KEYWORD1>
- <KEYWORD1>SFGRAD</KEYWORD1>
- <KEYWORD1>SFL</KEYWORD1>
- <KEYWORD1>SFLD</KEYWORD1>
- <KEYWORD1>SFLDELE</KEYWORD1>
- <KEYWORD1>SFLI</KEYWORD1>
- <KEYWORD1>SFLIST</KEYWORD1>
- <KEYWORD1>SFLL</KEYWORD1>
- <KEYWORD1>SFLLIST</KEYWORD1>
- <KEYWORD1>SFSC</KEYWORD1>
- <KEYWORD1>SFSCALE</KEYWORD1>
- <KEYWORD1>SFTR</KEYWORD1>
- <KEYWORD1>SFTRAN</KEYWORD1>
- <KEYWORD1>SHEL</KEYWORD1>
- <KEYWORD1>SHELL</KEYWORD1>
- <KEYWORD1>SHPP</KEYWORD1>
- <KEYWORD1>SHPP</KEYWORD1>
- <KEYWORD1>SLIS</KEYWORD1>
- <KEYWORD1>SLIST</KEYWORD1>
- <KEYWORD1>SLPP</KEYWORD1>
- <KEYWORD1>SLPPLOT</KEYWORD1>
- <KEYWORD1>SLSP</KEYWORD1>
- <KEYWORD1>SLSPLOT</KEYWORD1>
- <KEYWORD1>SMAL</KEYWORD1>
- <KEYWORD1>SMALL</KEYWORD1>
- <KEYWORD1>SMAX</KEYWORD1>
- <KEYWORD1>SMAX</KEYWORD1>
- <KEYWORD1>SMBO</KEYWORD1>
- <KEYWORD1>SMBODY</KEYWORD1>
- <KEYWORD1>SMCO</KEYWORD1>
- <KEYWORD1>SMCONS</KEYWORD1>
- <KEYWORD1>SMFO</KEYWORD1>
- <KEYWORD1>SMFOR</KEYWORD1>
- <KEYWORD1>SMIN</KEYWORD1>
- <KEYWORD1>SMIN</KEYWORD1>
- <KEYWORD1>SMRT</KEYWORD1>
- <KEYWORD1>SMRTSIZE</KEYWORD1>
- <KEYWORD1>SMSU</KEYWORD1>
- <KEYWORD1>SMSURF</KEYWORD1>
- <KEYWORD1>SMUL</KEYWORD1>
- <KEYWORD1>SMULT</KEYWORD1>
- <KEYWORD1>SOLC</KEYWORD1>
- <KEYWORD1>SOLCONTROL</KEYWORD1>
- <KEYWORD1>SOLU</KEYWORD1>
- <KEYWORD1>SOLU</KEYWORD1>
- <KEYWORD1>SOLU</KEYWORD1>
- <KEYWORD1>SOLUOPT</KEYWORD1>
- <KEYWORD1>SOLV</KEYWORD1>
- <KEYWORD1>SOLVE</KEYWORD1>
- <KEYWORD1>SORT</KEYWORD1>
- <KEYWORD1>SORT</KEYWORD1>
- <KEYWORD1>SOUR</KEYWORD1>
- <KEYWORD1>SOURCE</KEYWORD1>
- <KEYWORD1>SPAC</KEYWORD1>
- <KEYWORD1>SPACE</KEYWORD1>
- <KEYWORD1>SPAR</KEYWORD1>
- <KEYWORD1>SPARM</KEYWORD1>
- <KEYWORD1>SPEC</KEYWORD1>
- <KEYWORD1>SPEC</KEYWORD1>
- <KEYWORD1>SPH4</KEYWORD1>
- <KEYWORD1>SPH4</KEYWORD1>
- <KEYWORD1>SPH5</KEYWORD1>
- <KEYWORD1>SPH5</KEYWORD1>
- <KEYWORD1>SPHE</KEYWORD1>
- <KEYWORD1>SPHERE</KEYWORD1>
- <KEYWORD1>SPLI</KEYWORD1>
- <KEYWORD1>SPLINE</KEYWORD1>
- <KEYWORD1>SPOI</KEYWORD1>
- <KEYWORD1>SPOINT</KEYWORD1>
- <KEYWORD1>SPOP</KEYWORD1>
- <KEYWORD1>SPOPT</KEYWORD1>
- <KEYWORD1>SPRE</KEYWORD1>
- <KEYWORD1>SPREAD</KEYWORD1>
- <KEYWORD1>SPTO</KEYWORD1>
- <KEYWORD1>SPTOPT</KEYWORD1>
- <KEYWORD1>SQRT</KEYWORD1>
- <KEYWORD1>SQRT</KEYWORD1>
- <KEYWORD1>SRCS</KEYWORD1>
- <KEYWORD1>SRCS</KEYWORD1>
- <KEYWORD1>SRSS</KEYWORD1>
- <KEYWORD1>SRSS</KEYWORD1>
- <KEYWORD1>SSLN</KEYWORD1>
- <KEYWORD1>SSLN</KEYWORD1>
- <KEYWORD1>SSTI</KEYWORD1>
- <KEYWORD1>SSTIF</KEYWORD1>
- <KEYWORD1>SSUM</KEYWORD1>
- <KEYWORD1>SSUM</KEYWORD1>
- <KEYWORD1>STAT</KEYWORD1>
- <KEYWORD1>STAT</KEYWORD1>
- <KEYWORD1>STEF</KEYWORD1>
- <KEYWORD1>STEF</KEYWORD1>
- <KEYWORD1>STOR</KEYWORD1>
- <KEYWORD1>STORE</KEYWORD1>
- <KEYWORD1>SUBO</KEYWORD1>
- <KEYWORD1>SUBOPT</KEYWORD1>
- <KEYWORD1>SUBS</KEYWORD1>
- <KEYWORD1>SUBSET</KEYWORD1>
- <KEYWORD1>SUMT</KEYWORD1>
- <KEYWORD1>SUMTYPE</KEYWORD1>
- <KEYWORD1>SV</KEYWORD1>
- <KEYWORD1>SVTY</KEYWORD1>
- <KEYWORD1>SVTYP</KEYWORD1>
- <KEYWORD1>TALL</KEYWORD1>
- <KEYWORD1>TALLOW</KEYWORD1>
- <KEYWORD1>TB</KEYWORD1>
- <KEYWORD1>TBCO</KEYWORD1>
- <KEYWORD1>TBCOPY</KEYWORD1>
- <KEYWORD1>TBDA</KEYWORD1>
- <KEYWORD1>TBDATA</KEYWORD1>
- <KEYWORD1>TBDE</KEYWORD1>
- <KEYWORD1>TBDELE</KEYWORD1>
- <KEYWORD1>TBLE</KEYWORD1>
- <KEYWORD1>TBLE</KEYWORD1>
- <KEYWORD1>TBLI</KEYWORD1>
- <KEYWORD1>TBLIST</KEYWORD1>
- <KEYWORD1>TBMO</KEYWORD1>
- <KEYWORD1>TBMODIF</KEYWORD1>
- <KEYWORD1>TBPL</KEYWORD1>
- <KEYWORD1>TBPLOT</KEYWORD1>
- <KEYWORD1>TBPT</KEYWORD1>
- <KEYWORD1>TBPT</KEYWORD1>
- <KEYWORD1>TBTE</KEYWORD1>
- <KEYWORD1>TBTEMP</KEYWORD1>
- <KEYWORD1>TCHG</KEYWORD1>
- <KEYWORD1>TCHG</KEYWORD1>
- <KEYWORD1>TEE</KEYWORD1>
- <KEYWORD1>TERM</KEYWORD1>
- <KEYWORD1>TERM</KEYWORD1>
- <KEYWORD1>TIME</KEYWORD1>
- <KEYWORD1>TIME</KEYWORD1>
- <KEYWORD1>TIME</KEYWORD1>
- <KEYWORD1>TIMERANGE</KEYWORD1>
- <KEYWORD1>TIMI</KEYWORD1>
- <KEYWORD1>TIMINT</KEYWORD1>
- <KEYWORD1>TIMP</KEYWORD1>
- <KEYWORD1>TIMP</KEYWORD1>
- <KEYWORD1>TINT</KEYWORD1>
- <KEYWORD1>TINTP</KEYWORD1>
- <KEYWORD1>TOFF</KEYWORD1>
- <KEYWORD1>TOFFST</KEYWORD1>
- <KEYWORD1>TOPD</KEYWORD1>
- <KEYWORD1>TOPDEF</KEYWORD1>
- <KEYWORD1>TOPE</KEYWORD1>
- <KEYWORD1>TOPEXE</KEYWORD1>
- <KEYWORD1>TOPI</KEYWORD1>
- <KEYWORD1>TOPITER</KEYWORD1>
- <KEYWORD1>TORQ2D</KEYWORD1>
- <KEYWORD1>TORQ</KEYWORD1>
- <KEYWORD1>TORQ</KEYWORD1>
- <KEYWORD1>TORQ</KEYWORD1>
- <KEYWORD1>TORQC2D</KEYWORD1>
- <KEYWORD1>TORQSUM</KEYWORD1>
- <KEYWORD1>TORU</KEYWORD1>
- <KEYWORD1>TORUS</KEYWORD1>
- <KEYWORD1>TOTA</KEYWORD1>
- <KEYWORD1>TOTAL</KEYWORD1>
- <KEYWORD1>TRAN</KEYWORD1>
- <KEYWORD1>TRAN</KEYWORD1>
- <KEYWORD1>TRANS</KEYWORD1>
- <KEYWORD1>TRANSFER</KEYWORD1>
- <KEYWORD1>TREF</KEYWORD1>
- <KEYWORD1>TREF</KEYWORD1>
- <KEYWORD1>TRNO</KEYWORD1>
- <KEYWORD1>TRNOPT</KEYWORD1>
- <KEYWORD1>TRPD</KEYWORD1>
- <KEYWORD1>TRPDEL</KEYWORD1>
- <KEYWORD1>TRPL</KEYWORD1>
- <KEYWORD1>TRPLIS</KEYWORD1>
- <KEYWORD1>TRPO</KEYWORD1>
- <KEYWORD1>TRPOIN</KEYWORD1>
- <KEYWORD1>TRTI</KEYWORD1>
- <KEYWORD1>TRTIME</KEYWORD1>
- <KEYWORD1>TSHA</KEYWORD1>
- <KEYWORD1>TSHAP</KEYWORD1>
- <KEYWORD1>TSRE</KEYWORD1>
- <KEYWORD1>TSRES</KEYWORD1>
- <KEYWORD1>TUNI</KEYWORD1>
- <KEYWORD1>TUNIF</KEYWORD1>
- <KEYWORD1>TVAR</KEYWORD1>
- <KEYWORD1>TVAR</KEYWORD1>
- <KEYWORD1>TYPE</KEYWORD1>
- <KEYWORD1>TYPE</KEYWORD1>
- <KEYWORD1>UIMP</KEYWORD1>
- <KEYWORD1>UIMP</KEYWORD1>
- <KEYWORD1>UPCO</KEYWORD1>
- <KEYWORD1>UPCOORD</KEYWORD1>
- <KEYWORD1>UPGE</KEYWORD1>
- <KEYWORD1>UPGEOM</KEYWORD1>
- <KEYWORD1>USRC</KEYWORD1>
- <KEYWORD1>USRCAL</KEYWORD1>
- <KEYWORD1>V</KEYWORD1>
- <KEYWORD1>VA</KEYWORD1>
- <KEYWORD1>VADD</KEYWORD1>
- <KEYWORD1>VADD</KEYWORD1>
- <KEYWORD1>VALV</KEYWORD1>
- <KEYWORD1>VALVE</KEYWORD1>
- <KEYWORD1>VARD</KEYWORD1>
- <KEYWORD1>VARDEL</KEYWORD1>
- <KEYWORD1>VARN</KEYWORD1>
- <KEYWORD1>VARNAM</KEYWORD1>
- <KEYWORD1>VATT</KEYWORD1>
- <KEYWORD1>VATT</KEYWORD1>
- <KEYWORD1>VCLE</KEYWORD1>
- <KEYWORD1>VCLEAR</KEYWORD1>
- <KEYWORD1>VCRO</KEYWORD1>
- <KEYWORD1>VCROSS</KEYWORD1>
- <KEYWORD1>VCVF</KEYWORD1>
- <KEYWORD1>VCVFILL</KEYWORD1>
- <KEYWORD1>VDDA</KEYWORD1>
- <KEYWORD1>VDDAM</KEYWORD1>
- <KEYWORD1>VDEL</KEYWORD1>
- <KEYWORD1>VDELE</KEYWORD1>
- <KEYWORD1>VDGL</KEYWORD1>
- <KEYWORD1>VDGL</KEYWORD1>
- <KEYWORD1>VDOT</KEYWORD1>
- <KEYWORD1>VDOT</KEYWORD1>
- <KEYWORD1>VDRA</KEYWORD1>
- <KEYWORD1>VDRAG</KEYWORD1>
- <KEYWORD1>VEXT</KEYWORD1>
- <KEYWORD1>VEXT</KEYWORD1>
- <KEYWORD1>VGEN</KEYWORD1>
- <KEYWORD1>VGEN</KEYWORD1>
- <KEYWORD1>VGET</KEYWORD1>
- <KEYWORD1>VGET</KEYWORD1>
- <KEYWORD1>VGLU</KEYWORD1>
- <KEYWORD1>VGLUE</KEYWORD1>
- <KEYWORD1>VIMP</KEYWORD1>
- <KEYWORD1>VIMP</KEYWORD1>
- <KEYWORD1>VINP</KEYWORD1>
- <KEYWORD1>VINP</KEYWORD1>
- <KEYWORD1>VINV</KEYWORD1>
- <KEYWORD1>VINV</KEYWORD1>
- <KEYWORD1>VLIS</KEYWORD1>
- <KEYWORD1>VLIST</KEYWORD1>
- <KEYWORD1>VLSC</KEYWORD1>
- <KEYWORD1>VLSCALE</KEYWORD1>
- <KEYWORD1>VMES</KEYWORD1>
- <KEYWORD1>VMESH</KEYWORD1>
- <KEYWORD1>VOFF</KEYWORD1>
- <KEYWORD1>VOFFST</KEYWORD1>
- <KEYWORD1>VOLU</KEYWORD1>
- <KEYWORD1>VOLUMES</KEYWORD1>
- <KEYWORD1>VOVL</KEYWORD1>
- <KEYWORD1>VOVLAP</KEYWORD1>
- <KEYWORD1>VPLO</KEYWORD1>
- <KEYWORD1>VPLOT</KEYWORD1>
- <KEYWORD1>VPTN</KEYWORD1>
- <KEYWORD1>VPTN</KEYWORD1>
- <KEYWORD1>VPUT</KEYWORD1>
- <KEYWORD1>VPUT</KEYWORD1>
- <KEYWORD1>VROT</KEYWORD1>
- <KEYWORD1>VROTAT</KEYWORD1>
- <KEYWORD1>VSBA</KEYWORD1>
- <KEYWORD1>VSBA</KEYWORD1>
- <KEYWORD1>VSBV</KEYWORD1>
- <KEYWORD1>VSBV</KEYWORD1>
- <KEYWORD1>VSBW</KEYWORD1>
- <KEYWORD1>VSBW</KEYWORD1>
- <KEYWORD1>VSEL</KEYWORD1>
- <KEYWORD1>VSEL</KEYWORD1>
- <KEYWORD1>VSLA</KEYWORD1>
- <KEYWORD1>VSLA</KEYWORD1>
- <KEYWORD1>VSUM</KEYWORD1>
- <KEYWORD1>VSUM</KEYWORD1>
- <KEYWORD1>VSWE</KEYWORD1>
- <KEYWORD1>VSWEEP</KEYWORD1>
- <KEYWORD1>VSYM</KEYWORD1>
- <KEYWORD1>VSYMM</KEYWORD1>
- <KEYWORD1>VTRA</KEYWORD1>
- <KEYWORD1>VTRAN</KEYWORD1>
- <KEYWORD1>VTYP</KEYWORD1>
- <KEYWORD1>VTYPE</KEYWORD1>
- <KEYWORD1>WAVE</KEYWORD1>
- <KEYWORD1>WAVES</KEYWORD1>
- <KEYWORD1>WERA</KEYWORD1>
- <KEYWORD1>WERASE</KEYWORD1>
- <KEYWORD1>WFRO</KEYWORD1>
- <KEYWORD1>WFRONT</KEYWORD1>
- <KEYWORD1>WMOR</KEYWORD1>
- <KEYWORD1>WMORE</KEYWORD1>
- <KEYWORD1>WPAV</KEYWORD1>
- <KEYWORD1>WPAVE</KEYWORD1>
- <KEYWORD1>WPCS</KEYWORD1>
- <KEYWORD1>WPCSYS</KEYWORD1>
- <KEYWORD1>WPLA</KEYWORD1>
- <KEYWORD1>WPLANE</KEYWORD1>
- <KEYWORD1>WPOF</KEYWORD1>
- <KEYWORD1>WPOFFS</KEYWORD1>
- <KEYWORD1>WPRO</KEYWORD1>
- <KEYWORD1>WPROTA</KEYWORD1>
- <KEYWORD1>WPST</KEYWORD1>
- <KEYWORD1>WPSTYL</KEYWORD1>
- <KEYWORD1>WRIT</KEYWORD1>
- <KEYWORD1>WRITE</KEYWORD1>
- <KEYWORD1>WSOR</KEYWORD1>
- <KEYWORD1>WSORT</KEYWORD1>
- <KEYWORD1>WSTA</KEYWORD1>
- <KEYWORD1>WSTART</KEYWORD1>
- <KEYWORD1>XVAR</KEYWORD1>
- <KEYWORD1>XVAR</KEYWORD1>
- <KEYWORD1>XVAROPT</KEYWORD1>
-
-<!-- Material properties (short notation) -->
-
- <KEYWORD1>ex</KEYWORD1>
- <KEYWORD1>ey</KEYWORD1>
- <KEYWORD1>ez</KEYWORD1>
- <KEYWORD1>nuxy</KEYWORD1>
- <KEYWORD1>nuxz</KEYWORD1>
- <KEYWORD1>nuyz</KEYWORD1>
- <KEYWORD1>gxy</KEYWORD1>
- <KEYWORD1>gxz</KEYWORD1>
- <KEYWORD1>gyz</KEYWORD1>
- <KEYWORD1>alpx</KEYWORD1>
- <KEYWORD1>alpy</KEYWORD1>
- <KEYWORD1>alpz</KEYWORD1>
- <KEYWORD1>kxx</KEYWORD1>
- <KEYWORD1>kyy</KEYWORD1>
- <KEYWORD1>kzz</KEYWORD1>
- <KEYWORD1>dens</KEYWORD1>
- <KEYWORD1>damp</KEYWORD1>
- <KEYWORD1>mu</KEYWORD1>
- <KEYWORD1>prxy</KEYWORD1>
-
-<!-- *get functions (abbreviated) -->
-
- <KEYWORD2>ANGLEK</KEYWORD2>
- <KEYWORD2>ANGLEN</KEYWORD2>
- <KEYWORD2>AREAKP</KEYWORD2>
- <KEYWORD2>AREAND</KEYWORD2>
- <KEYWORD2>ARFACE</KEYWORD2>
- <KEYWORD2>ARNEXT</KEYWORD2>
- <KEYWORD2>ARNODE</KEYWORD2>
- <KEYWORD2>AX</KEYWORD2>
- <KEYWORD2>AY</KEYWORD2>
- <KEYWORD2>AZ</KEYWORD2>
- <KEYWORD2>CENTRX</KEYWORD2>
- <KEYWORD2>CENTRY</KEYWORD2>
- <KEYWORD2>CENTRZ</KEYWORD2>
- <KEYWORD2>DISTEN</KEYWORD2>
- <KEYWORD2>DISTKP</KEYWORD2>
- <KEYWORD2>DISTND</KEYWORD2>
- <KEYWORD2>ELADJ</KEYWORD2>
- <KEYWORD2>ELNEXT</KEYWORD2>
- <KEYWORD2>ENDS</KEYWORD2>
- <KEYWORD2>ENEARN</KEYWORD2>
- <KEYWORD2>ENEXTN</KEYWORD2>
- <KEYWORD2>ENKE</KEYWORD2>
- <KEYWORD2>KNEAR</KEYWORD2>
- <KEYWORD2>KP</KEYWORD2>
- <KEYWORD2>KPNEXT</KEYWORD2>
- <KEYWORD2>KX</KEYWORD2>
- <KEYWORD2>KY</KEYWORD2>
- <KEYWORD2>KZ</KEYWORD2>
- <KEYWORD2>LOC</KEYWORD2>
- <KEYWORD2>LSNEXT</KEYWORD2>
- <KEYWORD2>LSX</KEYWORD2>
- <KEYWORD2>LSY</KEYWORD2>
- <KEYWORD2>LSZ</KEYWORD2>
- <KEYWORD2>LX</KEYWORD2>
- <KEYWORD2>LY</KEYWORD2>
- <KEYWORD2>LZ</KEYWORD2>
- <KEYWORD2>MAG</KEYWORD2>
- <KEYWORD2>NDFACE</KEYWORD2>
- <KEYWORD2>NDNEXT</KEYWORD2>
- <KEYWORD2>NELEM</KEYWORD2>
- <KEYWORD2>NMFACE</KEYWORD2>
- <KEYWORD2>NNEAR</KEYWORD2>
- <KEYWORD2>NODE</KEYWORD2>
- <KEYWORD2>NORMKX</KEYWORD2>
- <KEYWORD2>NORMKY</KEYWORD2>
- <KEYWORD2>NORMKZ</KEYWORD2>
- <KEYWORD2>NORMNX</KEYWORD2>
- <KEYWORD2>NORMNY</KEYWORD2>
- <KEYWORD2>NORMNZ</KEYWORD2>
- <KEYWORD2>NX</KEYWORD2>
- <KEYWORD2>NY</KEYWORD2>
- <KEYWORD2>NZ</KEYWORD2>
- <KEYWORD2>PRES</KEYWORD2>
- <KEYWORD2>ROTX</KEYWORD2>
- <KEYWORD2>ROTY</KEYWORD2>
- <KEYWORD2>ROTZ</KEYWORD2>
- <KEYWORD2>TEMP</KEYWORD2>
- <KEYWORD2>UX</KEYWORD2>
- <KEYWORD2>UY</KEYWORD2>
- <KEYWORD2>UZ</KEYWORD2>
- <KEYWORD2>VLNEXT</KEYWORD2>
- <KEYWORD2>VOLT</KEYWORD2>
- <KEYWORD2>VX</KEYWORD2>
- <KEYWORD2>VY</KEYWORD2>
- <KEYWORD2>VZ</KEYWORD2>
-
- <!-- [Keywords 3] -->
- <!-- command option labels -->
-
- <!-- AADD command -->
- <KEYWORD3>all</KEYWORD3>
-
- <!-- *ABBRES command -->
- <KEYWORD3>new</KEYWORD3>
- <KEYWORD3>change</KEYWORD3>
-
- <!-- *AFUN command -->
- <KEYWORD3>rad</KEYWORD3>
- <KEYWORD3>deg</KEYWORD3>
-
- <!-- ALIST command -->
- <KEYWORD3>hpt</KEYWORD3>
-
- <!-- ALLSEL command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>below</KEYWORD3>
- <KEYWORD3>volu</KEYWORD3>
- <KEYWORD3>area</KEYWORD3>
- <KEYWORD3>line</KEYWORD3>
- <KEYWORD3>kp</KEYWORD3>
- <KEYWORD3>elem</KEYWORD3>
- <KEYWORD3>node</KEYWORD3>
-
- <!-- /ANFILE command -->
- <KEYWORD3>,save</KEYWORD3>
- <KEYWORD3>resume</KEYWORD3>
-
- <!-- /ANNOT command -->
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
- <KEYWORD3>dele</KEYWORD3>
- <KEYWORD3>,save</KEYWORD3>
- <KEYWORD3>scale</KEYWORD3>
- <KEYWORD3>xorig</KEYWORD3>
- <KEYWORD3>yorig</KEYWORD3>
- <KEYWORD3>snap</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
- <KEYWORD3>defa</KEYWORD3>
- <KEYWORD3>refr</KEYWORD3>
-
- <!-- ANTYPE command -->
- <KEYWORD3>static</KEYWORD3>
- <KEYWORD3>buckle</KEYWORD3>
- <KEYWORD3>modal</KEYWORD3>
- <KEYWORD3>harmic</KEYWORD3>
- <KEYWORD3>trans</KEYWORD3>
- <KEYWORD3>substr</KEYWORD3>
- <KEYWORD3>spectr</KEYWORD3>
- <KEYWORD3>new</KEYWORD3>
- <KEYWORD3>rest</KEYWORD3>
-
- <!-- APLOT command -->
- <KEYWORD3>dege</KEYWORD3>
-
- <!-- APPEND command -->
- <KEYWORD3>first</KEYWORD3>
- <KEYWORD3>next</KEYWORD3>
- <KEYWORD3>last</KEYWORD3>
- <KEYWORD3>near</KEYWORD3>
- <KEYWORD3>list</KEYWORD3>
- <KEYWORD3>velo</KEYWORD3>
- <KEYWORD3>acel</KEYWORD3>
-
- <!-- ARCTRM command -->
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>,l</KEYWORD3>
- <KEYWORD3>u</KEYWORD3>
-
- <!-- AREFINE command -->
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>smooth</KEYWORD3>
- <KEYWORD3>clean</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
-
- <!-- ARSPLIT command -->
- <KEYWORD3>tight</KEYWORD3>
-
- <!--ARSYM command -->
- <KEYWORD3>x</KEYWORD3>
- <KEYWORD3>y</KEYWORD3>
- <KEYWORD3>z</KEYWORD3>
-
- <!--ASBA, ASBL, ASBV, ASBW commands -->
- <KEYWORD3>sepo</KEYWORD3>
- <KEYWORD3>delete</KEYWORD3>
- <KEYWORD3>keep</KEYWORD3>
-
- <!-- ASEL command -->
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>,r</KEYWORD3>
- <KEYWORD3>,a</KEYWORD3>
- <KEYWORD3>u</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>none</KEYWORD3>
- <KEYWORD3>inve</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
- <KEYWORD3>area</KEYWORD3>
- <KEYWORD3>ext</KEYWORD3>
- <KEYWORD3>loc</KEYWORD3>
- <KEYWORD3>x</KEYWORD3>
- <KEYWORD3>y</KEYWORD3>
- <KEYWORD3>z</KEYWORD3>
- <KEYWORD3>hpt</KEYWORD3>
- <KEYWORD3>,mat</KEYWORD3>
- <KEYWORD3>,type</KEYWORD3>
- <KEYWORD3>,real</KEYWORD3>
- <KEYWORD3>,esys</KEYWORD3>
- <KEYWORD3>acca</KEYWORD3>
-
- <!-- ASLL, ASLV commands -->
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>,r</KEYWORD3>
- <KEYWORD3>,a</KEYWORD3>
- <KEYWORD3>u</KEYWORD3>
-
- <!-- /ASSIGN command -->
- <KEYWORD3>emat</KEYWORD3>
- <KEYWORD3>esav</KEYWORD3>
- <KEYWORD3>full</KEYWORD3>
- <KEYWORD3>redm</KEYWORD3>
- <KEYWORD3>mode</KEYWORD3>
- <KEYWORD3>rdsp</KEYWORD3>
- <KEYWORD3>rfrq</KEYWORD3>
- <KEYWORD3>tri</KEYWORD3>
- <KEYWORD3>rst</KEYWORD3>
- <KEYWORD3>rth</KEYWORD3>
- <KEYWORD3>rmg</KEYWORD3>
- <KEYWORD3>erot</KEYWORD3>
- <KEYWORD3>osav</KEYWORD3>
- <KEYWORD3>rfl</KEYWORD3>
- <KEYWORD3>seld</KEYWORD3>
-
- <!-- ASUM command -->
- <KEYWORD3>default</KEYWORD3>
- <KEYWORD3>fine</KEYWORD3>
-
- <!-- AUTOTS command -->
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
-
- <!-- /AXLAB command -->
- <KEYWORD3>x</KEYWORD3>
- <KEYWORD3>y</KEYWORD3>
-
- <!-- /BATCH command -->
- <KEYWORD3>list</KEYWORD3>
-
- <!-- /BEND command -->
- <KEYWORD3>lr</KEYWORD3>
- <KEYWORD3>sr</KEYWORD3>
-
- <!-- BF, BFA, BFADELE, BFALIST, BFCUM, BFDELE, BFE, BFECUM, BFEDELE, BFELIST, BFESCAL -->
- <!-- BFK, BFKDELE, BFKLIST, BFL, BFLDELE, BFLIST, BFLLIST, BFSCALE, BFUNIF, BFV, -->
- <!-- BFVDELE, BFVLIST commands -->
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>flue</KEYWORD3>
- <KEYWORD3>hgen</KEYWORD3>
- <KEYWORD3>js</KEYWORD3>
- <KEYWORD3>vltg</KEYWORD3>
- <KEYWORD3>mvdi</KEYWORD3>
- <KEYWORD3>chrgd</KEYWORD3>
- <KEYWORD3>forc</KEYWORD3>
- <KEYWORD3>repl</KEYWORD3>
- <KEYWORD3>add</KEYWORD3>
- <KEYWORD3>igno</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
-
- <!-- BIOT command -->
- <KEYWORD3>new</KEYWORD3>
- <KEYWORD3>sum</KEYWORD3>
-
- <!-- BOPTN command -->
- <KEYWORD3>defa</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
- <KEYWORD3>keep</KEYWORD3>
- <KEYWORD3>nwarn</KEYWORD3>
- <KEYWORD3>version</KEYWORD3>
- <KEYWORD3>no</KEYWORD3>
- <KEYWORD3>yes</KEYWORD3>
- <KEYWORD3>rv52</KEYWORD3>
- <KEYWORD3>rv51</KEYWORD3>
-
- <!-- BUCOPT command -->
- <KEYWORD3>subsp</KEYWORD3>
- <KEYWORD3>lanb</KEYWORD3>
- <KEYWORD3>reduc</KEYWORD3>
-
- <!-- CDREAD, CDWRITE commands -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>db</KEYWORD3>
- <KEYWORD3>solid</KEYWORD3>
- <KEYWORD3>comb</KEYWORD3>
- <KEYWORD3>geom</KEYWORD3>
- <KEYWORD3>cm</KEYWORD3>
- <KEYWORD3>,mat</KEYWORD3>
- <KEYWORD3>load</KEYWORD3>
- <KEYWORD3>blocked</KEYWORD3>
- <KEYWORD3>unblocked</KEYWORD3>
-
- <!-- CELIST command -->
- <KEYWORD3>any</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
-
- <!-- CERIG command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>uxyz</KEYWORD3>
- <KEYWORD3>rxyz</KEYWORD3>
- <KEYWORD3>ux</KEYWORD3>
- <KEYWORD3>uy</KEYWORD3>
- <KEYWORD3>uz</KEYWORD3>
- <KEYWORD3>rotx</KEYWORD3>
- <KEYWORD3>roty</KEYWORD3>
- <KEYWORD3>rotz</KEYWORD3>
-
- <!-- CFOPEN command -->
- <KEYWORD3>append</KEYWORD3>
-
- <!-- CHECK command -->
- <KEYWORD3>,esel</KEYWORD3>
- <KEYWORD3>warn</KEYWORD3>
- <KEYWORD3>err</KEYWORD3>
-
- <!-- CLEAR command -->
- <KEYWORD3>start</KEYWORD3>
- <KEYWORD3>nostart</KEYWORD3>
-
- <!-- CLOCAL, CS, CSKP, CSWPLA commands -->
- <KEYWORD3>cart</KEYWORD3>
- <KEYWORD3>cylin</KEYWORD3>
- <KEYWORD3>sphe</KEYWORD3>
- <KEYWORD3>toro</KEYWORD3>
-
- <!-- CM command -->
- <KEYWORD3>volu</KEYWORD3>
- <KEYWORD3>area</KEYWORD3>
- <KEYWORD3>line</KEYWORD3>
- <KEYWORD3>kp</KEYWORD3>
- <KEYWORD3>elem</KEYWORD3>
- <KEYWORD3>node</KEYWORD3>
-
- <!-- CMAP command -->
- <KEYWORD3>create</KEYWORD3>
-
- <!-- CMEDIT command -->
- <KEYWORD3>add</KEYWORD3>
- <KEYWORD3>dele</KEYWORD3>
-
- <!-- CMPLOT command -->
- <KEYWORD3>,n</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
-
- <!-- CMSEL command -->
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>,r</KEYWORD3>
- <KEYWORD3>,a</KEYWORD3>
- <KEYWORD3>u</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>none</KEYWORD3>
-
- <!-- CNVTOL command -->
- <KEYWORD3>stat</KEYWORD3>
- <KEYWORD3>u</KEYWORD3>
- <KEYWORD3>rot</KEYWORD3>
- <KEYWORD3>,f</KEYWORD3>
- <KEYWORD3>,m</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>heat</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>v</KEYWORD3>
- <KEYWORD3>flow</KEYWORD3>
- <KEYWORD3>vf</KEYWORD3>
- <KEYWORD3>volt</KEYWORD3>
- <KEYWORD3>emf</KEYWORD3>
- <KEYWORD3>curr</KEYWORD3>
- <KEYWORD3>amps</KEYWORD3>
- <KEYWORD3>curt</KEYWORD3>
- <KEYWORD3>mag</KEYWORD3>
- <KEYWORD3>,a</KEYWORD3>
- <KEYWORD3>flux</KEYWORD3>
- <KEYWORD3>csg</KEYWORD3>
- <KEYWORD3>vltg</KEYWORD3>
-
- <!-- COLOR command -->
- <KEYWORD3>axes</KEYWORD3>
- <KEYWORD3>axnum</KEYWORD3>
- <KEYWORD3>num</KEYWORD3>
- <KEYWORD3>outl</KEYWORD3>
- <KEYWORD3>elem</KEYWORD3>
- <KEYWORD3>line</KEYWORD3>
- <KEYWORD3>area</KEYWORD3>
- <KEYWORD3>volu</KEYWORD3>
- <KEYWORD3>isurf</KEYWORD3>
- <KEYWORD3>wbak</KEYWORD3>
- <KEYWORD3>u</KEYWORD3>
- <KEYWORD3>rot</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>v</KEYWORD3>
- <KEYWORD3>enke</KEYWORD3>
- <KEYWORD3>ends</KEYWORD3>
- <KEYWORD3>sp01</KEYWORD3>
- <KEYWORD3>sp02</KEYWORD3>
- <KEYWORD3>sp03</KEYWORD3>
- <KEYWORD3>sp04</KEYWORD3>
- <KEYWORD3>sp05</KEYWORD3>
- <KEYWORD3>sp06</KEYWORD3>
- <KEYWORD3>volt</KEYWORD3>
- <KEYWORD3>mag</KEYWORD3>
- <KEYWORD3>,a</KEYWORD3>
- <KEYWORD3>emf</KEYWORD3>
- <KEYWORD3>curr</KEYWORD3>
- <KEYWORD3>,f</KEYWORD3>
- <KEYWORD3>,m</KEYWORD3>
- <KEYWORD3>heat</KEYWORD3>
- <KEYWORD3>flow</KEYWORD3>
- <KEYWORD3>vf</KEYWORD3>
- <KEYWORD3>amps</KEYWORD3>
- <KEYWORD3>flux</KEYWORD3>
- <KEYWORD3>csg</KEYWORD3>
- <KEYWORD3>curt</KEYWORD3>
- <KEYWORD3>vltg</KEYWORD3>
- <KEYWORD3>mast</KEYWORD3>
- <KEYWORD3>,cp</KEYWORD3>
- <KEYWORD3>,ce</KEYWORD3>
- <KEYWORD3>nfor</KEYWORD3>
- <KEYWORD3>nmom</KEYWORD3>
- <KEYWORD3>rfor</KEYWORD3>
- <KEYWORD3>rmom</KEYWORD3>
- <KEYWORD3>path</KEYWORD3>
- <KEYWORD3>grbak</KEYWORD3>
- <KEYWORD3>grid</KEYWORD3>
- <KEYWORD3>axlab</KEYWORD3>
- <KEYWORD3>curve</KEYWORD3>
- <KEYWORD3>cm</KEYWORD3>
- <KEYWORD3>cntr</KEYWORD3>
- <KEYWORD3>smax</KEYWORD3>
- <KEYWORD3>smin</KEYWORD3>
- <KEYWORD3>mred</KEYWORD3>
- <KEYWORD3>cblu</KEYWORD3>
- <KEYWORD3>ygre</KEYWORD3>
- <KEYWORD3>dgra</KEYWORD3>
- <KEYWORD3>mage</KEYWORD3>
- <KEYWORD3>cyan</KEYWORD3>
- <KEYWORD3>yell</KEYWORD3>
- <KEYWORD3>lgra</KEYWORD3>
- <KEYWORD3>bmag</KEYWORD3>
- <KEYWORD3>gcya</KEYWORD3>
- <KEYWORD3>oran</KEYWORD3>
- <KEYWORD3>whit</KEYWORD3>
- <KEYWORD3>blue</KEYWORD3>
- <KEYWORD3>gree</KEYWORD3>
- <KEYWORD3>red</KEYWORD3>
- <KEYWORD3>blac</KEYWORD3>
-
- <!-- CONFIG command -->
- <KEYWORD3>nres</KEYWORD3>
- <KEYWORD3>nbuf</KEYWORD3>
- <KEYWORD3>nproc</KEYWORD3>
- <KEYWORD3>locfl</KEYWORD3>
- <KEYWORD3>szbio</KEYWORD3>
- <KEYWORD3>ncont</KEYWORD3>
- <KEYWORD3>order</KEYWORD3>
- <KEYWORD3>fsplit</KEYWORD3>
- <KEYWORD3>mxnd</KEYWORD3>
- <KEYWORD3>mxel</KEYWORD3>
- <KEYWORD3>mxkp</KEYWORD3>
- <KEYWORD3>mxls</KEYWORD3>
- <KEYWORD3>mxar</KEYWORD3>
- <KEYWORD3>mxvl</KEYWORD3>
- <KEYWORD3>mxrl</KEYWORD3>
- <KEYWORD3>mxcp</KEYWORD3>
- <KEYWORD3>mxce</KEYWORD3>
- <KEYWORD3>nlcontrol</KEYWORD3>
-
- <!-- CP command -->
- <KEYWORD3>high</KEYWORD3>
- <KEYWORD3>next</KEYWORD3>
-
- <!-- CPDELE, CPLIST commands -->
- <KEYWORD3>any</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
-
- <!-- CPINTF, D, DA, DADELE, DDELE, DK, DL, DLDELE, DOF, DOFSEL, FKLIST commands -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>ux</KEYWORD3>
- <KEYWORD3>uy</KEYWORD3>
- <KEYWORD3>uz</KEYWORD3>
- <KEYWORD3>rotx</KEYWORD3>
- <KEYWORD3>roty</KEYWORD3>
- <KEYWORD3>rotz</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>vx</KEYWORD3>
- <KEYWORD3>vy</KEYWORD3>
- <KEYWORD3>vz</KEYWORD3>
- <KEYWORD3>volt</KEYWORD3>
- <KEYWORD3>emf</KEYWORD3>
- <KEYWORD3>curr</KEYWORD3>
- <KEYWORD3>mag</KEYWORD3>
- <KEYWORD3>ax</KEYWORD3>
- <KEYWORD3>ay</KEYWORD3>
- <KEYWORD3>az</KEYWORD3>
- <KEYWORD3>enke</KEYWORD3>
- <KEYWORD3>ends</KEYWORD3>
- <KEYWORD3>sp01</KEYWORD3>
- <KEYWORD3>sp02</KEYWORD3>
- <KEYWORD3>sp03</KEYWORD3>
- <KEYWORD3>sp04</KEYWORD3>
- <KEYWORD3>sp05</KEYWORD3>
- <KEYWORD3>sp06</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
- <KEYWORD3>symm</KEYWORD3>
- <KEYWORD3>asym</KEYWORD3>
- <KEYWORD3>delete</KEYWORD3>
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>,a</KEYWORD3>
- <KEYWORD3>u</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
- <KEYWORD3>rot</KEYWORD3>
- <KEYWORD3>disp</KEYWORD3>
- <KEYWORD3>v</KEYWORD3>
- <KEYWORD3>en</KEYWORD3>
- <KEYWORD3>fx</KEYWORD3>
- <KEYWORD3>fy</KEYWORD3>
- <KEYWORD3>fz</KEYWORD3>
- <KEYWORD3>,f</KEYWORD3>
- <KEYWORD3>mx</KEYWORD3>
- <KEYWORD3>my</KEYWORD3>
- <KEYWORD3>mz</KEYWORD3>
- <KEYWORD3>,m</KEYWORD3>
- <KEYWORD3>forc</KEYWORD3>
- <KEYWORD3>heat</KEYWORD3>
- <KEYWORD3>flow</KEYWORD3>
- <KEYWORD3>amps</KEYWORD3>
- <KEYWORD3>chrg</KEYWORD3>
- <KEYWORD3>flux</KEYWORD3>
- <KEYWORD3>csgx</KEYWORD3>
- <KEYWORD3>csgy</KEYWORD3>
- <KEYWORD3>csgz</KEYWORD3>
- <KEYWORD3>csg</KEYWORD3>
-
- <!-- CQC command -->
- <KEYWORD3>disp</KEYWORD3>
- <KEYWORD3>velo</KEYWORD3>
- <KEYWORD3>acel</KEYWORD3>
-
- <!-- CSDELE, CSLIST commands -->
- <KEYWORD3>all</KEYWORD3>
-
- <!-- CUTCONTROL command -->
- <KEYWORD3>plslimit</KEYWORD3>
- <KEYWORD3>crplimit</KEYWORD3>
- <KEYWORD3>dsplimit</KEYWORD3>
- <KEYWORD3>npoint</KEYWORD3>
- <KEYWORD3>noiterpredict</KEYWORD3>
-
- <!-- DCUM command -->
- <KEYWORD3>repl</KEYWORD3>
- <KEYWORD3>add</KEYWORD3>
- <KEYWORD3>igno</KEYWORD3>
-
- <!-- DEL command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>_prm</KEYWORD3>
-
- <!-- DELTIM command -->
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
-
- <!-- DESIZE command -->
- <KEYWORD3>defa</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
-
- <!-- DESOL, DNSOL commands -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>x</KEYWORD3>
- <KEYWORD3>y</KEYWORD3>
- <KEYWORD3>z</KEYWORD3>
- <KEYWORD3>xy</KEYWORD3>
- <KEYWORD3>yz</KEYWORD3>
- <KEYWORD3>zx</KEYWORD3>
- <KEYWORD3>epel</KEYWORD3>
- <KEYWORD3>eppl</KEYWORD3>
- <KEYWORD3>epcr</KEYWORD3>
- <KEYWORD3>epth</KEYWORD3>
- <KEYWORD3>epsw</KEYWORD3>
- <KEYWORD3>nl</KEYWORD3>
- <KEYWORD3>sepl</KEYWORD3>
- <KEYWORD3>srat</KEYWORD3>
- <KEYWORD3>hpres</KEYWORD3>
- <KEYWORD3>epeq</KEYWORD3>
- <KEYWORD3>psv</KEYWORD3>
- <KEYWORD3>plwk</KEYWORD3>
- <KEYWORD3>tg</KEYWORD3>
- <KEYWORD3>tf</KEYWORD3>
- <KEYWORD3>pg</KEYWORD3>
- <KEYWORD3>ef</KEYWORD3>
- <KEYWORD3>,d</KEYWORD3>
- <KEYWORD3>h</KEYWORD3>
- <KEYWORD3>b</KEYWORD3>
- <KEYWORD3>fmag</KEYWORD3>
- <KEYWORD3>,f</KEYWORD3>
- <KEYWORD3>,m</KEYWORD3>
- <KEYWORD3>heat</KEYWORD3>
- <KEYWORD3>flow</KEYWORD3>
- <KEYWORD3>amps</KEYWORD3>
- <KEYWORD3>flux</KEYWORD3>
- <KEYWORD3>vf</KEYWORD3>
- <KEYWORD3>csg</KEYWORD3>
- <KEYWORD3>u</KEYWORD3>
- <KEYWORD3>rot</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>volt</KEYWORD3>
- <KEYWORD3>mag</KEYWORD3>
- <KEYWORD3>v</KEYWORD3>
- <KEYWORD3>,a</KEYWORD3>
- <KEYWORD3>enke</KEYWORD3>
- <KEYWORD3>ends</KEYWORD3>
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>int</KEYWORD3>
- <KEYWORD3>eqv</KEYWORD3>
- <KEYWORD3>sum</KEYWORD3>
- <KEYWORD3>ttot</KEYWORD3>
- <KEYWORD3>hflu</KEYWORD3>
- <KEYWORD3>hflm</KEYWORD3>
- <KEYWORD3>cond</KEYWORD3>
- <KEYWORD3>pcoe</KEYWORD3>
- <KEYWORD3>ptot</KEYWORD3>
- <KEYWORD3>mach</KEYWORD3>
- <KEYWORD3>strm</KEYWORD3>
- <KEYWORD3>dens</KEYWORD3>
- <KEYWORD3>visc</KEYWORD3>
- <KEYWORD3>evis</KEYWORD3>
- <KEYWORD3>cmuv</KEYWORD3>
- <KEYWORD3>econ</KEYWORD3>
- <KEYWORD3>yplu</KEYWORD3>
- <KEYWORD3>tauw</KEYWORD3>
-
- <!-- DEVDISP command -->
- <KEYWORD3>dither</KEYWORD3>
- <KEYWORD3>font</KEYWORD3>
- <KEYWORD3>text</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
-
- <!-- DEVICE command -->
- <KEYWORD3>vector</KEYWORD3>
- <KEYWORD3>dither</KEYWORD3>
- <KEYWORD3>anim</KEYWORD3>
- <KEYWORD3>font</KEYWORD3>
- <KEYWORD3>text</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
-
- <!-- DIM command -->
- <KEYWORD3>array</KEYWORD3>
- <KEYWORD3>char</KEYWORD3>
- <KEYWORD3>table</KEYWORD3>
- <KEYWORD3>time</KEYWORD3>
- <KEYWORD3>x</KEYWORD3>
- <KEYWORD3>y</KEYWORD3>
- <KEYWORD3>z</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>velocity</KEYWORD3>
- <KEYWORD3>pressure</KEYWORD3>
-
- <!-- /DSCALE command -->
- <KEYWORD3>auto</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>user</KEYWORD3>
-
- <!-- DSUM command -->
- <KEYWORD3>disp</KEYWORD3>
- <KEYWORD3>velo</KEYWORD3>
- <KEYWORD3>acel</KEYWORD3>
-
- <!-- DSYM command -->
- <KEYWORD3>symm</KEYWORD3>
- <KEYWORD3>asym</KEYWORD3>
- <KEYWORD3>x</KEYWORD3>
- <KEYWORD3>y</KEYWORD3>
- <KEYWORD3>z</KEYWORD3>
-
- <!-- DUMP command -->
- <KEYWORD3>head</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
-
- <!-- /DV3D command -->
- <KEYWORD3>anim</KEYWORD3>
- <KEYWORD3>dgen</KEYWORD3>
- <KEYWORD3>dlist</KEYWORD3>
-
- <!-- EDBOUND command -->
- <KEYWORD3>add</KEYWORD3>
- <KEYWORD3>dele</KEYWORD3>
- <KEYWORD3>list</KEYWORD3>
- <KEYWORD3>slide</KEYWORD3>
- <KEYWORD3>cycl</KEYWORD3>
-
- <!-- EDCDELE, EDCGEN commands -->
- <KEYWORD3>ants</KEYWORD3>
- <KEYWORD3>assc</KEYWORD3>
- <KEYWORD3>asts</KEYWORD3>
- <KEYWORD3>drawbead</KEYWORD3>
- <KEYWORD3>ents</KEYWORD3>
- <KEYWORD3>ess</KEYWORD3>
- <KEYWORD3>ests</KEYWORD3>
- <KEYWORD3>nts</KEYWORD3>
- <KEYWORD3>osts</KEYWORD3>
- <KEYWORD3>rntr</KEYWORD3>
- <KEYWORD3>rotr</KEYWORD3>
- <KEYWORD3>se</KEYWORD3>
- <KEYWORD3>ss</KEYWORD3>
- <KEYWORD3>sts</KEYWORD3>
- <KEYWORD3>tdns</KEYWORD3>
- <KEYWORD3>tdss</KEYWORD3>
- <KEYWORD3>tnts</KEYWORD3>
- <KEYWORD3>tsts</KEYWORD3>
-
- <!-- EDCRB, EDCURVE, EDLCS commands -->
- <KEYWORD3>add</KEYWORD3>
- <KEYWORD3>dele</KEYWORD3>
- <KEYWORD3>list</KEYWORD3>
-
- <!-- EDCSC command -->
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
-
- <!-- EDDAMP command -->
- <KEYWORD3>all</KEYWORD3>
-
- <!-- EDDRELAX command -->
- <KEYWORD3>ansys</KEYWORD3>
- <KEYWORD3>dyna</KEYWORD3>
-
- <!-- EDELE command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
-
- <!-- EDENERGY, EDFPLOT commands -->
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
-
- <!-- EDHIST, EDIVELO commands -->
- <KEYWORD3>list</KEYWORD3>
- <KEYWORD3>dele</KEYWORD3>
-
- <!-- EDLDPLOT, EDLOAD command -->
- <KEYWORD3>fx</KEYWORD3>
- <KEYWORD3>fy</KEYWORD3>
- <KEYWORD3>fz</KEYWORD3>
- <KEYWORD3>mx</KEYWORD3>
- <KEYWORD3>my</KEYWORD3>
- <KEYWORD3>mz</KEYWORD3>
- <KEYWORD3>ux</KEYWORD3>
- <KEYWORD3>uy</KEYWORD3>
- <KEYWORD3>uz</KEYWORD3>
- <KEYWORD3>rotx</KEYWORD3>
- <KEYWORD3>roty</KEYWORD3>
- <KEYWORD3>rotz</KEYWORD3>
- <KEYWORD3>vx</KEYWORD3>
- <KEYWORD3>vy</KEYWORD3>
- <KEYWORD3>vz</KEYWORD3>
- <KEYWORD3>ax</KEYWORD3>
- <KEYWORD3>ay</KEYWORD3>
- <KEYWORD3>az</KEYWORD3>
- <KEYWORD3>aclx</KEYWORD3>
- <KEYWORD3>acly</KEYWORD3>
- <KEYWORD3>aclz</KEYWORD3>
- <KEYWORD3>omgx</KEYWORD3>
- <KEYWORD3>omgy</KEYWORD3>
- <KEYWORD3>omgz</KEYWORD3>
- <KEYWORD3>press</KEYWORD3>
- <KEYWORD3>rbux</KEYWORD3>
- <KEYWORD3>rbuy</KEYWORD3>
- <KEYWORD3>rbuz</KEYWORD3>
- <KEYWORD3>rbrx</KEYWORD3>
- <KEYWORD3>rbry</KEYWORD3>
- <KEYWORD3>rbrz</KEYWORD3>
- <KEYWORD3>rbvx</KEYWORD3>
- <KEYWORD3>rbvy</KEYWORD3>
- <KEYWORD3>rbvz</KEYWORD3>
- <KEYWORD3>rbfx</KEYWORD3>
- <KEYWORD3>rbfy</KEYWORD3>
- <KEYWORD3>rbfz</KEYWORD3>
- <KEYWORD3>rbmx</KEYWORD3>
- <KEYWORD3>rbmy</KEYWORD3>
- <KEYWORD3>rbmz</KEYWORD3>
- <KEYWORD3>add</KEYWORD3>
- <KEYWORD3>dele</KEYWORD3>
- <KEYWORD3>list</KEYWORD3>
-
- <!-- EDMP command -->
- <KEYWORD3>hgls</KEYWORD3>
- <KEYWORD3>rigid</KEYWORD3>
- <KEYWORD3>cable</KEYWORD3>
- <KEYWORD3>ortho</KEYWORD3>
-
- <!-- EDNROT, EDOPT commands -->
- <KEYWORD3>add</KEYWORD3>
- <KEYWORD3>dele</KEYWORD3>
- <KEYWORD3>list</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>ux</KEYWORD3>
- <KEYWORD3>uy</KEYWORD3>
- <KEYWORD3>uz</KEYWORD3>
- <KEYWORD3>rotx</KEYWORD3>
- <KEYWORD3>roty</KEYWORD3>
- <KEYWORD3>rotz</KEYWORD3>
- <KEYWORD3>ansys</KEYWORD3>
- <KEYWORD3>taurus</KEYWORD3>
- <KEYWORD3>both</KEYWORD3>
-
- <!-- EDOUT, EDREAD commands -->
- <KEYWORD3>glstat</KEYWORD3>
- <KEYWORD3>bndout</KEYWORD3>
- <KEYWORD3>rwforc</KEYWORD3>
- <KEYWORD3>deforc</KEYWORD3>
- <KEYWORD3>,matsum</KEYWORD3>
- <KEYWORD3>ncforc</KEYWORD3>
- <KEYWORD3>rcforc</KEYWORD3>
- <KEYWORD3>defgeo</KEYWORD3>
- <KEYWORD3>spcforc</KEYWORD3>
- <KEYWORD3>swforc</KEYWORD3>
- <KEYWORD3>rbdout</KEYWORD3>
- <KEYWORD3>gceout</KEYWORD3>
- <KEYWORD3>sleout</KEYWORD3>
- <KEYWORD3>jntforc</KEYWORD3>
- <KEYWORD3>nodout</KEYWORD3>
- <KEYWORD3>elout</KEYWORD3>
-
- <!-- EDWELD command -->
- <KEYWORD3>add</KEYWORD3>
- <KEYWORD3>dele</KEYWORD3>
- <KEYWORD3>list</KEYWORD3>
-
- <!-- EDWRITE command -->
- <KEYWORD3>ansys</KEYWORD3>
- <KEYWORD3>taurus</KEYWORD3>
- <KEYWORD3>both</KEYWORD3>
- <KEYWORD3>pcreate</KEYWORD3>
- <KEYWORD3>pupdate</KEYWORD3>
- <KEYWORD3>plist</KEYWORD3>
-
- <!-- EKILL, ELIST commands -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
-
- <!-- *ELSEIF command -->
- <KEYWORD3>eq</KEYWORD3>
- <KEYWORD3>ne</KEYWORD3>
- <KEYWORD3>lt</KEYWORD3>
- <KEYWORD3>gt</KEYWORD3>
- <KEYWORD3>le</KEYWORD3>
- <KEYWORD3>ge</KEYWORD3>
- <KEYWORD3>ablt</KEYWORD3>
- <KEYWORD3>abgt</KEYWORD3>
-
- <!-- EMID command -->
- <KEYWORD3>add</KEYWORD3>
- <KEYWORD3>remove</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>either</KEYWORD3>
- <KEYWORD3>both</KEYWORD3>
-
- <!-- EMODIF command -->
- <KEYWORD3>p</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>,mat</KEYWORD3>
- <KEYWORD3>,type</KEYWORD3>
- <KEYWORD3>,real</KEYWORD3>
- <KEYWORD3>,esys</KEYWORD3>
- <KEYWORD3>secnum</KEYWORD3>
-
- <!-- EMORE, EN commands -->
- <KEYWORD3>p</KEYWORD3>
-
- <!-- EMUNIT command -->
- <KEYWORD3>mks</KEYWORD3>
- <KEYWORD3>muzro</KEYWORD3>
- <KEYWORD3>epzro</KEYWORD3>
-
- <!-- ENGEN, ENORM, ENSYM commands -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
-
- <!-- EQSLV command -->
- <KEYWORD3>front</KEYWORD3>
- <KEYWORD3>sparse</KEYWORD3>
- <KEYWORD3>jcg</KEYWORD3>
- <KEYWORD3>jcgout</KEYWORD3>
- <KEYWORD3>iccg</KEYWORD3>
- <KEYWORD3>pcg</KEYWORD3>
- <KEYWORD3>pcgout</KEYWORD3>
- <KEYWORD3>iter</KEYWORD3>
-
- <!-- EREFINE command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>smooth</KEYWORD3>
- <KEYWORD3>clean</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
-
- <!-- ERESX command -->
- <KEYWORD3>defa</KEYWORD3>
- <KEYWORD3>yes</KEYWORD3>
- <KEYWORD3>no</KEYWORD3>
-
- <!-- ERNORM command -->
- <KEYWORD3>on</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
-
- <!-- ESEL command -->
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>,r</KEYWORD3>
- <KEYWORD3>,a</KEYWORD3>
- <KEYWORD3>u</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>none</KEYWORD3>
- <KEYWORD3>inve</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
- <KEYWORD3>elem</KEYWORD3>
- <KEYWORD3>adj</KEYWORD3>
- <KEYWORD3>,type</KEYWORD3>
- <KEYWORD3>ename</KEYWORD3>
- <KEYWORD3>,mat</KEYWORD3>
- <KEYWORD3>,real</KEYWORD3>
- <KEYWORD3>,esys</KEYWORD3>
- <KEYWORD3>live</KEYWORD3>
- <KEYWORD3>layer</KEYWORD3>
- <KEYWORD3>sec</KEYWORD3>
- <KEYWORD3>pinc</KEYWORD3>
- <KEYWORD3>pexc</KEYWORD3>
- <KEYWORD3>sfe</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>conv</KEYWORD3>
- <KEYWORD3>hflux</KEYWORD3>
- <KEYWORD3>fsi</KEYWORD3>
- <KEYWORD3>impd</KEYWORD3>
- <KEYWORD3>shld</KEYWORD3>
- <KEYWORD3>mxwf</KEYWORD3>
- <KEYWORD3>chrgs</KEYWORD3>
- <KEYWORD3>inf</KEYWORD3>
- <KEYWORD3>bfe</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>flue</KEYWORD3>
- <KEYWORD3>hgen</KEYWORD3>
- <KEYWORD3>js</KEYWORD3>
- <KEYWORD3>mvdi</KEYWORD3>
- <KEYWORD3>chrgd</KEYWORD3>
- <KEYWORD3>etab</KEYWORD3>
-
- <!-- ESLA, ESLL, ESLN, ESLV commands -->
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>,r</KEYWORD3>
- <KEYWORD3>,a</KEYWORD3>
- <KEYWORD3>u</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>active</KEYWORD3>
- <KEYWORD3>inactive</KEYWORD3>
- <KEYWORD3>corner</KEYWORD3>
- <KEYWORD3>mid</KEYWORD3>
-
- <!-- ESOL command -->
- <KEYWORD3>p</KEYWORD3>
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>x</KEYWORD3>
- <KEYWORD3>y</KEYWORD3>
- <KEYWORD3>z</KEYWORD3>
- <KEYWORD3>xy</KEYWORD3>
- <KEYWORD3>yz</KEYWORD3>
- <KEYWORD3>zx</KEYWORD3>
- <KEYWORD3>int</KEYWORD3>
- <KEYWORD3>eqv</KEYWORD3>
- <KEYWORD3>epel</KEYWORD3>
- <KEYWORD3>eppl</KEYWORD3>
- <KEYWORD3>epcr</KEYWORD3>
- <KEYWORD3>epth</KEYWORD3>
- <KEYWORD3>nl</KEYWORD3>
- <KEYWORD3>sepl</KEYWORD3>
- <KEYWORD3>srat</KEYWORD3>
- <KEYWORD3>hpres</KEYWORD3>
- <KEYWORD3>epeq</KEYWORD3>
- <KEYWORD3>psv</KEYWORD3>
- <KEYWORD3>plwk</KEYWORD3>
- <KEYWORD3>cont</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
- <KEYWORD3>pene</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>sfric</KEYWORD3>
- <KEYWORD3>stot</KEYWORD3>
- <KEYWORD3>slide</KEYWORD3>
- <KEYWORD3>tg</KEYWORD3>
- <KEYWORD3>sum</KEYWORD3>
- <KEYWORD3>tf</KEYWORD3>
- <KEYWORD3>pg</KEYWORD3>
- <KEYWORD3>ef</KEYWORD3>
- <KEYWORD3>,d</KEYWORD3>
- <KEYWORD3>h</KEYWORD3>
- <KEYWORD3>b</KEYWORD3>
- <KEYWORD3>fmag</KEYWORD3>
- <KEYWORD3>,f</KEYWORD3>
- <KEYWORD3>,m</KEYWORD3>
- <KEYWORD3>heat</KEYWORD3>
- <KEYWORD3>flow</KEYWORD3>
- <KEYWORD3>amps</KEYWORD3>
- <KEYWORD3>flux</KEYWORD3>
- <KEYWORD3>vf</KEYWORD3>
- <KEYWORD3>csg</KEYWORD3>
- <KEYWORD3>sene</KEYWORD3>
- <KEYWORD3>kene</KEYWORD3>
- <KEYWORD3>jheat</KEYWORD3>
- <KEYWORD3>js</KEYWORD3>
- <KEYWORD3>jt</KEYWORD3>
- <KEYWORD3>mre</KEYWORD3>
- <KEYWORD3>volu</KEYWORD3>
- <KEYWORD3>bfe</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
-
- <!-- ESORT command -->
- <KEYWORD3>etab</KEYWORD3>
-
- <!-- ESURF command -->
- <KEYWORD3>top</KEYWORD3>
- <KEYWORD3>bottom</KEYWORD3>
- <KEYWORD3>reverse</KEYWORD3>
- <KEYWORD3>tri</KEYWORD3>
-
- <!-- ESYM command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
-
- <!-- ETABLE command -->
- <KEYWORD3>refl</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
- <KEYWORD3>eras</KEYWORD3>
- <KEYWORD3>u</KEYWORD3>
- <KEYWORD3>x</KEYWORD3>
- <KEYWORD3>y</KEYWORD3>
- <KEYWORD3>z</KEYWORD3>
- <KEYWORD3>rot</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>volt</KEYWORD3>
- <KEYWORD3>mag</KEYWORD3>
- <KEYWORD3>v</KEYWORD3>
- <KEYWORD3>,a</KEYWORD3>
- <KEYWORD3>curr</KEYWORD3>
- <KEYWORD3>emf</KEYWORD3>
- <KEYWORD3>enke</KEYWORD3>
- <KEYWORD3>ends</KEYWORD3>
- <KEYWORD3>sp01</KEYWORD3>
- <KEYWORD3>sp02</KEYWORD3>
- <KEYWORD3>sp03</KEYWORD3>
- <KEYWORD3>sp04</KEYWORD3>
- <KEYWORD3>sp05</KEYWORD3>
- <KEYWORD3>sp06</KEYWORD3>
- <KEYWORD3>ttot</KEYWORD3>
- <KEYWORD3>hflu</KEYWORD3>
- <KEYWORD3>hflm</KEYWORD3>
- <KEYWORD3>cond</KEYWORD3>
- <KEYWORD3>pcoe</KEYWORD3>
- <KEYWORD3>ptot</KEYWORD3>
- <KEYWORD3>mach</KEYWORD3>
- <KEYWORD3>strm</KEYWORD3>
- <KEYWORD3>dens</KEYWORD3>
- <KEYWORD3>visc</KEYWORD3>
- <KEYWORD3>evis</KEYWORD3>
- <KEYWORD3>econ</KEYWORD3>
- <KEYWORD3>yplu</KEYWORD3>
- <KEYWORD3>tauw</KEYWORD3>
- <KEYWORD3>lmd1</KEYWORD3>
- <KEYWORD3>lmd2</KEYWORD3>
- <KEYWORD3>lmd3</KEYWORD3>
- <KEYWORD3>lmd4</KEYWORD3>
- <KEYWORD3>lmd5</KEYWORD3>
- <KEYWORD3>lmd6</KEYWORD3>
- <KEYWORD3>emd1</KEYWORD3>
- <KEYWORD3>emd2</KEYWORD3>
- <KEYWORD3>emd3</KEYWORD3>
- <KEYWORD3>emd4</KEYWORD3>
- <KEYWORD3>emd5</KEYWORD3>
- <KEYWORD3>emd6</KEYWORD3>
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>xy</KEYWORD3>
- <KEYWORD3>yz</KEYWORD3>
- <KEYWORD3>zx</KEYWORD3>
- <KEYWORD3>int</KEYWORD3>
- <KEYWORD3>eqv</KEYWORD3>
- <KEYWORD3>epto</KEYWORD3>
- <KEYWORD3>epel</KEYWORD3>
- <KEYWORD3>eppl</KEYWORD3>
- <KEYWORD3>epcr</KEYWORD3>
- <KEYWORD3>epth</KEYWORD3>
- <KEYWORD3>epsw</KEYWORD3>
- <KEYWORD3>nl</KEYWORD3>
- <KEYWORD3>sepl</KEYWORD3>
- <KEYWORD3>srat</KEYWORD3>
- <KEYWORD3>hpres</KEYWORD3>
- <KEYWORD3>epeq</KEYWORD3>
- <KEYWORD3>psv</KEYWORD3>
- <KEYWORD3>plwk</KEYWORD3>
- <KEYWORD3>tg</KEYWORD3>
- <KEYWORD3>sum</KEYWORD3>
- <KEYWORD3>tf</KEYWORD3>
- <KEYWORD3>pg</KEYWORD3>
- <KEYWORD3>ef</KEYWORD3>
- <KEYWORD3>,d</KEYWORD3>
- <KEYWORD3>h</KEYWORD3>
- <KEYWORD3>b</KEYWORD3>
- <KEYWORD3>fmag</KEYWORD3>
- <KEYWORD3>serr</KEYWORD3>
- <KEYWORD3>sdsg</KEYWORD3>
- <KEYWORD3>terr</KEYWORD3>
- <KEYWORD3>tdsg</KEYWORD3>
- <KEYWORD3>,f</KEYWORD3>
- <KEYWORD3>,m</KEYWORD3>
- <KEYWORD3>heat</KEYWORD3>
- <KEYWORD3>flow</KEYWORD3>
- <KEYWORD3>amps</KEYWORD3>
- <KEYWORD3>flux</KEYWORD3>
- <KEYWORD3>vf</KEYWORD3>
- <KEYWORD3>csg</KEYWORD3>
- <KEYWORD3>sene</KEYWORD3>
- <KEYWORD3>aene</KEYWORD3>
- <KEYWORD3>tene</KEYWORD3>
- <KEYWORD3>kene</KEYWORD3>
- <KEYWORD3>jheat</KEYWORD3>
- <KEYWORD3>js</KEYWORD3>
- <KEYWORD3>jt</KEYWORD3>
- <KEYWORD3>mre</KEYWORD3>
- <KEYWORD3>volu</KEYWORD3>
- <KEYWORD3>cent</KEYWORD3>
- <KEYWORD3>bfe</KEYWORD3>
- <KEYWORD3>smisc</KEYWORD3>
- <KEYWORD3>nmisc</KEYWORD3>
- <KEYWORD3>surf</KEYWORD3>
- <KEYWORD3>cont</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
- <KEYWORD3>pene</KEYWORD3>
- <KEYWORD3>sfric</KEYWORD3>
- <KEYWORD3>stot</KEYWORD3>
- <KEYWORD3>slide</KEYWORD3>
- <KEYWORD3>gap</KEYWORD3>
- <KEYWORD3>topo</KEYWORD3>
-
- <!-- ETCHG command -->
- <KEYWORD3>eti</KEYWORD3>
- <KEYWORD3>ite</KEYWORD3>
- <KEYWORD3>tts</KEYWORD3>
- <KEYWORD3>stt</KEYWORD3>
- <KEYWORD3>mtt</KEYWORD3>
- <KEYWORD3>fts</KEYWORD3>
- <KEYWORD3>ets</KEYWORD3>
-
- <!-- ETDELE, ETLIST commands -->
- <KEYWORD3>all</KEYWORD3>
-
- <!-- EWRITE command -->
- <KEYWORD3>elem</KEYWORD3>
- <KEYWORD3>short</KEYWORD3>
- <KEYWORD3>long1</KEYWORD3>
-
- <!-- /EXIT command -->
- <KEYWORD3>model</KEYWORD3>
- <KEYWORD3>solu</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>nosave</KEYWORD3>
-
- <!-- /EXPAND command -->
- <KEYWORD3>rect</KEYWORD3>
- <KEYWORD3>polar</KEYWORD3>
- <KEYWORD3>modal</KEYWORD3>
- <KEYWORD3>full</KEYWORD3>
- <KEYWORD3>half</KEYWORD3>
-
- <!-- EXPASS command -->
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
-
- <!-- EXPSOL command -->
- <KEYWORD3>yes</KEYWORD3>
- <KEYWORD3>no</KEYWORD3>
-
- <!-- EXTOPT command -->
- <KEYWORD3>on</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
- <KEYWORD3>attr</KEYWORD3>
- <KEYWORD3>esize</KEYWORD3>
- <KEYWORD3>aclear</KEYWORD3>
-
- <!-- F, FDELE, FK, FKDELE commands -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
- <KEYWORD3>fx</KEYWORD3>
- <KEYWORD3>fy</KEYWORD3>
- <KEYWORD3>fz</KEYWORD3>
- <KEYWORD3>mx</KEYWORD3>
- <KEYWORD3>my</KEYWORD3>
- <KEYWORD3>mz</KEYWORD3>
- <KEYWORD3>heat</KEYWORD3>
- <KEYWORD3>flow</KEYWORD3>
- <KEYWORD3>amps</KEYWORD3>
- <KEYWORD3>chrg</KEYWORD3>
- <KEYWORD3>flux</KEYWORD3>
- <KEYWORD3>csgx</KEYWORD3>
- <KEYWORD3>csgy</KEYWORD3>
- <KEYWORD3>csgz</KEYWORD3>
-
- <!-- /FACET command -->
- <KEYWORD3>fine</KEYWORD3>
- <KEYWORD3>norml</KEYWORD3>
- <KEYWORD3>wire</KEYWORD3>
-
- <!-- FCUM command -->
- <KEYWORD3>repl</KEYWORD3>
- <KEYWORD3>add</KEYWORD3>
- <KEYWORD3>igno</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
-
- <!-- /FDELE command -->
- <KEYWORD3>emat</KEYWORD3>
- <KEYWORD3>esav</KEYWORD3>
- <KEYWORD3>full</KEYWORD3>
- <KEYWORD3>sub</KEYWORD3>
- <KEYWORD3>mode</KEYWORD3>
- <KEYWORD3>tri</KEYWORD3>
- <KEYWORD3>dsub</KEYWORD3>
- <KEYWORD3>usub</KEYWORD3>
- <KEYWORD3>osav</KEYWORD3>
- <KEYWORD3>seld</KEYWORD3>
- <KEYWORD3>keep</KEYWORD3>
- <KEYWORD3>dele</KEYWORD3>
-
- <!-- FELIST command -->
- <KEYWORD3>all</KEYWORD3>
-
- <!-- FILL command -->
- <KEYWORD3>p</KEYWORD3>
-
- <!-- FLDATA1 command -->
- <KEYWORD3>solu</KEYWORD3>
- <KEYWORD3>flow</KEYWORD3>
- <KEYWORD3>turb</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>comp</KEYWORD3>
- <KEYWORD3>swrl</KEYWORD3>
- <KEYWORD3>tran</KEYWORD3>
- <KEYWORD3>spec</KEYWORD3>
- <KEYWORD3>true</KEYWORD3>
- <KEYWORD3>t</KEYWORD3>
- <KEYWORD3>false</KEYWORD3>
- <KEYWORD3>,f</KEYWORD3>
-
- <!-- FLDATA2 command -->
- <KEYWORD3>iter</KEYWORD3>
- <KEYWORD3>exec</KEYWORD3>
- <KEYWORD3>appe</KEYWORD3>
- <KEYWORD3>over</KEYWORD3>
-
- <!-- FLDATA3 command -->
- <KEYWORD3>term</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>vx</KEYWORD3>
- <KEYWORD3>vy</KEYWORD3>
- <KEYWORD3>vz</KEYWORD3>
- <KEYWORD3>enke</KEYWORD3>
- <KEYWORD3>ends</KEYWORD3>
-
- <!-- FLDATA4 command -->
- <KEYWORD3>time</KEYWORD3>
- <KEYWORD3>step</KEYWORD3>
- <KEYWORD3>istep</KEYWORD3>
- <KEYWORD3>bc</KEYWORD3>
- <KEYWORD3>numb</KEYWORD3>
- <KEYWORD3>glob</KEYWORD3>
- <KEYWORD3>tend</KEYWORD3>
- <KEYWORD3>appe</KEYWORD3>
- <KEYWORD3>sumf</KEYWORD3>
- <KEYWORD3>over</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>vx</KEYWORD3>
- <KEYWORD3>vy</KEYWORD3>
- <KEYWORD3>vz</KEYWORD3>
- <KEYWORD3>enke</KEYWORD3>
- <KEYWORD3>ends</KEYWORD3>
-
- <!-- FLDATA4A command -->
- <KEYWORD3>step</KEYWORD3>
- <KEYWORD3>appe</KEYWORD3>
- <KEYWORD3>sumf</KEYWORD3>
- <KEYWORD3>over</KEYWORD3>
-
- <!-- FLDATA5 command -->
- <KEYWORD3>outp</KEYWORD3>
- <KEYWORD3>sumf</KEYWORD3>
- <KEYWORD3>debg</KEYWORD3>
- <KEYWORD3>resi</KEYWORD3>
- <KEYWORD3>dens</KEYWORD3>
- <KEYWORD3>visc</KEYWORD3>
- <KEYWORD3>cond</KEYWORD3>
- <KEYWORD3>evis</KEYWORD3>
- <KEYWORD3>econ</KEYWORD3>
- <KEYWORD3>ttot</KEYWORD3>
- <KEYWORD3>hflu</KEYWORD3>
- <KEYWORD3>hflm</KEYWORD3>
- <KEYWORD3>spht</KEYWORD3>
- <KEYWORD3>strm</KEYWORD3>
- <KEYWORD3>mach</KEYWORD3>
- <KEYWORD3>ptot</KEYWORD3>
- <KEYWORD3>pcoe</KEYWORD3>
- <KEYWORD3>yplu</KEYWORD3>
- <KEYWORD3>tauw</KEYWORD3>
- <KEYWORD3>lmd</KEYWORD3>
- <KEYWORD3>emd</KEYWORD3>
-
- <!-- FLDATA6 command -->
- <KEYWORD3>conv</KEYWORD3>
- <KEYWORD3>outp</KEYWORD3>
- <KEYWORD3>iter</KEYWORD3>
- <KEYWORD3>land</KEYWORD3>
- <KEYWORD3>bloc</KEYWORD3>
- <KEYWORD3>bnow</KEYWORD3>
-
- <!-- FLDATA7 command -->
- <KEYWORD3>prot</KEYWORD3>
- <KEYWORD3>dens</KEYWORD3>
- <KEYWORD3>visc</KEYWORD3>
- <KEYWORD3>cond</KEYWORD3>
- <KEYWORD3>spht</KEYWORD3>
- <KEYWORD3>constant</KEYWORD3>
- <KEYWORD3>liquid</KEYWORD3>
- <KEYWORD3>table</KEYWORD3>
- <KEYWORD3>powl</KEYWORD3>
- <KEYWORD3>carr</KEYWORD3>
- <KEYWORD3>bing</KEYWORD3>
- <KEYWORD3>usrv</KEYWORD3>
- <KEYWORD3>air</KEYWORD3>
- <KEYWORD3>air_b</KEYWORD3>
- <KEYWORD3>air-si</KEYWORD3>
- <KEYWORD3>air-si_b</KEYWORD3>
- <KEYWORD3>air-cm</KEYWORD3>
- <KEYWORD3>air-cm_b</KEYWORD3>
- <KEYWORD3>air-mm</KEYWORD3>
- <KEYWORD3>air-mm_b</KEYWORD3>
- <KEYWORD3>air-ft</KEYWORD3>
- <KEYWORD3>air-ft_b</KEYWORD3>
- <KEYWORD3>air-in</KEYWORD3>
- <KEYWORD3>air-in_b</KEYWORD3>
- <KEYWORD3>cmix</KEYWORD3>
- <KEYWORD3>user</KEYWORD3>
-
- <!-- FLDATA8 command -->
- <KEYWORD3>nomi</KEYWORD3>
- <KEYWORD3>dens</KEYWORD3>
- <KEYWORD3>visc</KEYWORD3>
- <KEYWORD3>cond</KEYWORD3>
- <KEYWORD3>spht</KEYWORD3>
-
- <!-- FLDATA9 command -->
- <KEYWORD3>cof1</KEYWORD3>
- <KEYWORD3>dens</KEYWORD3>
- <KEYWORD3>visc</KEYWORD3>
- <KEYWORD3>cond</KEYWORD3>
- <KEYWORD3>spht</KEYWORD3>
-
- <!-- FLDATA10 command -->
- <KEYWORD3>cof2</KEYWORD3>
- <KEYWORD3>dens</KEYWORD3>
- <KEYWORD3>visc</KEYWORD3>
- <KEYWORD3>cond</KEYWORD3>
- <KEYWORD3>spht</KEYWORD3>
-
- <!-- FLDATA11 command -->
- <KEYWORD3>cof3</KEYWORD3>
- <KEYWORD3>dens</KEYWORD3>
- <KEYWORD3>visc</KEYWORD3>
- <KEYWORD3>cond</KEYWORD3>
- <KEYWORD3>spht</KEYWORD3>
-
- <!-- FLDATA12 command -->
- <KEYWORD3>prop</KEYWORD3>
- <KEYWORD3>ivis</KEYWORD3>
- <KEYWORD3>ufrq</KEYWORD3>
-
- <!-- FLDATA13 command -->
- <KEYWORD3>vary</KEYWORD3>
- <KEYWORD3>dens</KEYWORD3>
- <KEYWORD3>visc</KEYWORD3>
- <KEYWORD3>cond</KEYWORD3>
- <KEYWORD3>spht</KEYWORD3>
- <KEYWORD3>t</KEYWORD3>
- <KEYWORD3>,f</KEYWORD3>
-
- <!-- FLDATA14 command -->
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>nomi</KEYWORD3>
- <KEYWORD3>bulk</KEYWORD3>
- <KEYWORD3>ttot</KEYWORD3>
-
- <!-- FLDATA15 command -->
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>refe</KEYWORD3>
-
- <!-- FLDATA16 command -->
- <KEYWORD3>bulk</KEYWORD3>
- <KEYWORD3>beta</KEYWORD3>
-
- <!-- FLDATA17 command -->
- <KEYWORD3>gamm</KEYWORD3>
- <KEYWORD3>comp</KEYWORD3>
-
- <!-- FLDATA18 command -->
- <KEYWORD3>meth</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>vx</KEYWORD3>
- <KEYWORD3>vy</KEYWORD3>
- <KEYWORD3>vz</KEYWORD3>
- <KEYWORD3>enke</KEYWORD3>
- <KEYWORD3>ends</KEYWORD3>
-
- <!-- FLDATA19 command -->
- <KEYWORD3>tdma</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>vx</KEYWORD3>
- <KEYWORD3>vy</KEYWORD3>
- <KEYWORD3>vz</KEYWORD3>
- <KEYWORD3>enke</KEYWORD3>
- <KEYWORD3>ends</KEYWORD3>
-
- <!-- FLDATA20 command -->
- <KEYWORD3>srch</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>vx</KEYWORD3>
- <KEYWORD3>vy</KEYWORD3>
- <KEYWORD3>vz</KEYWORD3>
- <KEYWORD3>enke</KEYWORD3>
- <KEYWORD3>ends</KEYWORD3>
-
- <!-- FLDATA20A command -->
- <KEYWORD3>pgmr</KEYWORD3>
- <KEYWORD3>fill</KEYWORD3>
- <KEYWORD3>modp</KEYWORD3>
-
- <!-- FLDATA21 command -->
- <KEYWORD3>conv</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>vx</KEYWORD3>
- <KEYWORD3>vy</KEYWORD3>
- <KEYWORD3>vz</KEYWORD3>
- <KEYWORD3>enke</KEYWORD3>
- <KEYWORD3>ends</KEYWORD3>
-
- <!-- FLDATA22 command -->
- <KEYWORD3>maxi</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>vx</KEYWORD3>
- <KEYWORD3>vy</KEYWORD3>
- <KEYWORD3>vz</KEYWORD3>
- <KEYWORD3>enke</KEYWORD3>
- <KEYWORD3>ends</KEYWORD3>
-
- <!-- FLDATA23 command -->
- <KEYWORD3>delt</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>vx</KEYWORD3>
- <KEYWORD3>vy</KEYWORD3>
- <KEYWORD3>vz</KEYWORD3>
- <KEYWORD3>enke</KEYWORD3>
- <KEYWORD3>ends</KEYWORD3>
-
- <!-- FLDATA24 command -->
- <KEYWORD3>turb</KEYWORD3>
- <KEYWORD3>modl</KEYWORD3>
- <KEYWORD3>rati</KEYWORD3>
- <KEYWORD3>inin</KEYWORD3>
- <KEYWORD3>insf</KEYWORD3>
- <KEYWORD3>sctk</KEYWORD3>
- <KEYWORD3>sctd</KEYWORD3>
- <KEYWORD3>cmu</KEYWORD3>
- <KEYWORD3>c1</KEYWORD3>
- <KEYWORD3>c2</KEYWORD3>
- <KEYWORD3>buc3</KEYWORD3>
- <KEYWORD3>buc4</KEYWORD3>
- <KEYWORD3>beta</KEYWORD3>
- <KEYWORD3>kapp</KEYWORD3>
- <KEYWORD3>ewll</KEYWORD3>
- <KEYWORD3>wall</KEYWORD3>
- <KEYWORD3>vand</KEYWORD3>
- <KEYWORD3>tran</KEYWORD3>
- <KEYWORD3>zels</KEYWORD3>
-
- <!-- FLDATA24A command -->
- <KEYWORD3>rngt</KEYWORD3>
- <KEYWORD3>sctk</KEYWORD3>
- <KEYWORD3>sctd</KEYWORD3>
- <KEYWORD3>cmu</KEYWORD3>
- <KEYWORD3>c1</KEYWORD3>
- <KEYWORD3>c2</KEYWORD3>
- <KEYWORD3>beta</KEYWORD3>
- <KEYWORD3>etai</KEYWORD3>
-
- <!-- FLDATA24B command -->
- <KEYWORD3>nket</KEYWORD3>
- <KEYWORD3>sctk</KEYWORD3>
- <KEYWORD3>sctd</KEYWORD3>
- <KEYWORD3>c2</KEYWORD3>
- <KEYWORD3>c1mx</KEYWORD3>
-
- <!-- FLDATA24C command -->
- <KEYWORD3>girt</KEYWORD3>
- <KEYWORD3>sctk</KEYWORD3>
- <KEYWORD3>sctd</KEYWORD3>
- <KEYWORD3>g0</KEYWORD3>
- <KEYWORD3>g1</KEYWORD3>
- <KEYWORD3>g2</KEYWORD3>
- <KEYWORD3>g3</KEYWORD3>
- <KEYWORD3>g4</KEYWORD3>
-
- <!-- FLDATA24D command -->
- <KEYWORD3>szlt</KEYWORD3>
- <KEYWORD3>sctk</KEYWORD3>
- <KEYWORD3>sctd</KEYWORD3>
- <KEYWORD3>szl1</KEYWORD3>
- <KEYWORD3>szl2</KEYWORD3>
- <KEYWORD3>szl3</KEYWORD3>
-
- <!-- FLDATA25 command -->
- <KEYWORD3>relx</KEYWORD3>
- <KEYWORD3>vx</KEYWORD3>
- <KEYWORD3>vy</KEYWORD3>
- <KEYWORD3>vz</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>enke</KEYWORD3>
- <KEYWORD3>ends</KEYWORD3>
- <KEYWORD3>evis</KEYWORD3>
- <KEYWORD3>econ</KEYWORD3>
- <KEYWORD3>dens</KEYWORD3>
- <KEYWORD3>visc</KEYWORD3>
- <KEYWORD3>cond</KEYWORD3>
- <KEYWORD3>spht</KEYWORD3>
-
- <!-- FLDATA26 command -->
- <KEYWORD3>stab</KEYWORD3>
- <KEYWORD3>turb</KEYWORD3>
- <KEYWORD3>mome</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>visc</KEYWORD3>
-
- <!-- FLDATA27 command -->
- <KEYWORD3>prin</KEYWORD3>
- <KEYWORD3>vx</KEYWORD3>
- <KEYWORD3>vy</KEYWORD3>
- <KEYWORD3>vz</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>enke</KEYWORD3>
- <KEYWORD3>ends</KEYWORD3>
- <KEYWORD3>dens</KEYWORD3>
- <KEYWORD3>visc</KEYWORD3>
- <KEYWORD3>cond</KEYWORD3>
- <KEYWORD3>spht</KEYWORD3>
- <KEYWORD3>evis</KEYWORD3>
- <KEYWORD3>econ</KEYWORD3>
-
- <!-- FLDATA28 command -->
- <KEYWORD3>modr</KEYWORD3>
- <KEYWORD3>vx</KEYWORD3>
- <KEYWORD3>vy</KEYWORD3>
- <KEYWORD3>vz</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>enke</KEYWORD3>
- <KEYWORD3>ends</KEYWORD3>
- <KEYWORD3>dens</KEYWORD3>
- <KEYWORD3>visc</KEYWORD3>
- <KEYWORD3>cond</KEYWORD3>
- <KEYWORD3>spht</KEYWORD3>
- <KEYWORD3>evis</KEYWORD3>
- <KEYWORD3>econ</KEYWORD3>
- <KEYWORD3>ttot</KEYWORD3>
- <KEYWORD3>t</KEYWORD3>
- <KEYWORD3>,f</KEYWORD3>
-
- <!-- FLDATA29 command -->
- <KEYWORD3>modv</KEYWORD3>
- <KEYWORD3>vx</KEYWORD3>
- <KEYWORD3>vy</KEYWORD3>
- <KEYWORD3>vz</KEYWORD3>
- <KEYWORD3>sp01</KEYWORD3>
- <KEYWORD3>sp02</KEYWORD3>
- <KEYWORD3>sp03</KEYWORD3>
- <KEYWORD3>sp04</KEYWORD3>
- <KEYWORD3>sp05</KEYWORD3>
- <KEYWORD3>sp06</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>enke</KEYWORD3>
- <KEYWORD3>ends</KEYWORD3>
- <KEYWORD3>dens</KEYWORD3>
- <KEYWORD3>visc</KEYWORD3>
- <KEYWORD3>cond</KEYWORD3>
- <KEYWORD3>spht</KEYWORD3>
- <KEYWORD3>evis</KEYWORD3>
- <KEYWORD3>econ</KEYWORD3>
- <KEYWORD3>ttot</KEYWORD3>
- <KEYWORD3>lmd</KEYWORD3>
- <KEYWORD3>emd</KEYWORD3>
-
- <!-- FLDATA30 command -->
- <KEYWORD3>quad</KEYWORD3>
- <KEYWORD3>momd</KEYWORD3>
- <KEYWORD3>moms</KEYWORD3>
- <KEYWORD3>prsd</KEYWORD3>
- <KEYWORD3>prss</KEYWORD3>
- <KEYWORD3>thrd</KEYWORD3>
- <KEYWORD3>thrs</KEYWORD3>
- <KEYWORD3>trbd</KEYWORD3>
- <KEYWORD3>trbs</KEYWORD3>
-
- <!-- FLDATA31 command -->
- <KEYWORD3>capp</KEYWORD3>
- <KEYWORD3>velo</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>umin</KEYWORD3>
- <KEYWORD3>umax</KEYWORD3>
- <KEYWORD3>vmin</KEYWORD3>
- <KEYWORD3>vmax</KEYWORD3>
- <KEYWORD3>wmin</KEYWORD3>
- <KEYWORD3>wmax</KEYWORD3>
- <KEYWORD3>tmin</KEYWORD3>
- <KEYWORD3>tmax</KEYWORD3>
- <KEYWORD3>pmin</KEYWORD3>
- <KEYWORD3>pmax</KEYWORD3>
-
- <!-- FLDATA32 command -->
- <KEYWORD3>rest</KEYWORD3>
- <KEYWORD3>nset</KEYWORD3>
- <KEYWORD3>iter</KEYWORD3>
- <KEYWORD3>lstp</KEYWORD3>
- <KEYWORD3>time</KEYWORD3>
- <KEYWORD3>rfil</KEYWORD3>
- <KEYWORD3>wfil</KEYWORD3>
- <KEYWORD3>over</KEYWORD3>
- <KEYWORD3>clear</KEYWORD3>
-
- <!-- FLDATA33 command -->
- <KEYWORD3>advm</KEYWORD3>
- <KEYWORD3>mome</KEYWORD3>
- <KEYWORD3>turb</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>msu</KEYWORD3>
- <KEYWORD3>supg</KEYWORD3>
-
- <!-- FLIST command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
-
- <!-- FLLIST command -->
- <KEYWORD3>all</KEYWORD3>
-
- <!-- FLST command -->
- <KEYWORD3>noor</KEYWORD3>
- <KEYWORD3>order</KEYWORD3>
-
- <!-- /FOCUS command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>auto</KEYWORD3>
- <KEYWORD3>user</KEYWORD3>
-
- <!-- FORCE command -->
- <KEYWORD3>total</KEYWORD3>
- <KEYWORD3>static</KEYWORD3>
- <KEYWORD3>damp</KEYWORD3>
- <KEYWORD3>inert</KEYWORD3>
-
- <!-- FORM command -->
- <KEYWORD3>reco</KEYWORD3>
- <KEYWORD3>ten</KEYWORD3>
- <KEYWORD3>long</KEYWORD3>
-
- <!-- /FORMAT command -->
- <KEYWORD3>g</KEYWORD3>
- <KEYWORD3>,f</KEYWORD3>
- <KEYWORD3>e</KEYWORD3>
-
- <!-- FP command -->
- <KEYWORD3>all</KEYWORD3>
-
- <!-- FSLIST command -->
- <KEYWORD3>all</KEYWORD3>
-
- <!-- FSUM command -->
- <KEYWORD3>rsys</KEYWORD3>
-
- <!-- /FTYPE command -->
- <KEYWORD3>emat</KEYWORD3>
- <KEYWORD3>esav</KEYWORD3>
- <KEYWORD3>full</KEYWORD3>
- <KEYWORD3>redm</KEYWORD3>
- <KEYWORD3>sub</KEYWORD3>
- <KEYWORD3>mode</KEYWORD3>
- <KEYWORD3>tri</KEYWORD3>
- <KEYWORD3>dsub</KEYWORD3>
- <KEYWORD3>usub</KEYWORD3>
- <KEYWORD3>erot</KEYWORD3>
- <KEYWORD3>osav</KEYWORD3>
- <KEYWORD3>seld</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>ext</KEYWORD3>
- <KEYWORD3>int</KEYWORD3>
-
- <!-- GAPLIST command -->
- <KEYWORD3>open</KEYWORD3>
- <KEYWORD3>closed</KEYWORD3>
-
- <!-- GAPMERGE command -->
- <KEYWORD3>toler</KEYWORD3>
- <KEYWORD3>iter</KEYWORD3>
-
- <!-- GAPOPT command -->
- <KEYWORD3>toler</KEYWORD3>
- <KEYWORD3>oesele</KEYWORD3>
- <KEYWORD3>merge</KEYWORD3>
- <KEYWORD3>remain</KEYWORD3>
-
- <!-- GAPPLOT command -->
- <KEYWORD3>open</KEYWORD3>
- <KEYWORD3>closed</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
-
- <!-- GAUGE command -->
- <KEYWORD3>tree</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
-
- <!-- GCGEN command -->
- <KEYWORD3>tri</KEYWORD3>
- <KEYWORD3>bot</KEYWORD3>
-
- <!-- /GCMD command -->
- <KEYWORD3>all</KEYWORD3>
-
- <!-- *GET command -->
- <KEYWORD3>active</KEYWORD3>
- <KEYWORD3>int</KEYWORD3>
- <KEYWORD3>imme</KEYWORD3>
- <KEYWORD3>menu</KEYWORD3>
- <KEYWORD3>prkey</KEYWORD3>
- <KEYWORD3>units</KEYWORD3>
- <KEYWORD3>rout</KEYWORD3>
- <KEYWORD3>time</KEYWORD3>
- <KEYWORD3>wall</KEYWORD3>
- <KEYWORD3>cpu</KEYWORD3>
- <KEYWORD3>dbase</KEYWORD3>
- <KEYWORD3>ldate</KEYWORD3>
- <KEYWORD3>dbase</KEYWORD3>
- <KEYWORD3>ltime</KEYWORD3>
- <KEYWORD3>rev</KEYWORD3>
- <KEYWORD3>title</KEYWORD3>
- <KEYWORD3>jobnam</KEYWORD3>
-
- <KEYWORD3>parm</KEYWORD3>
- <KEYWORD3>max</KEYWORD3>
- <KEYWORD3>basic</KEYWORD3>
- <KEYWORD3>loc</KEYWORD3>
- <KEYWORD3>,type</KEYWORD3>
- <KEYWORD3>dim</KEYWORD3>
- <KEYWORD3>x</KEYWORD3>
- <KEYWORD3>y</KEYWORD3>
- <KEYWORD3>z</KEYWORD3>
-
- <KEYWORD3>cmd</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
- <KEYWORD3>nargs</KEYWORD3>
- <KEYWORD3>field</KEYWORD3>
-
- <KEYWORD3>comp</KEYWORD3>
- <KEYWORD3>ncomp</KEYWORD3>
- <KEYWORD3>name</KEYWORD3>
- <KEYWORD3>,type</KEYWORD3>
- <KEYWORD3>nscomp</KEYWORD3>
- <KEYWORD3>sname</KEYWORD3>
-
- <KEYWORD3>graph</KEYWORD3>
- <KEYWORD3>active</KEYWORD3>
- <KEYWORD3>angle</KEYWORD3>
- <KEYWORD3>contour</KEYWORD3>
- <KEYWORD3>dist</KEYWORD3>
- <KEYWORD3>dscale</KEYWORD3>
- <KEYWORD3>dmult</KEYWORD3>
- <KEYWORD3>edge</KEYWORD3>
- <KEYWORD3>focus</KEYWORD3>
- <KEYWORD3>gline</KEYWORD3>
- <KEYWORD3>mode</KEYWORD3>
- <KEYWORD3>normal</KEYWORD3>
- <KEYWORD3>range</KEYWORD3>
- <KEYWORD3>xmin</KEYWORD3>
- <KEYWORD3>ymin</KEYWORD3>
- <KEYWORD3>xmax</KEYWORD3>
- <KEYWORD3>ymax</KEYWORD3>
- <KEYWORD3>ratio</KEYWORD3>
- <KEYWORD3>sscale</KEYWORD3>
- <KEYWORD3>smult</KEYWORD3>
- <KEYWORD3>,type</KEYWORD3>
- <KEYWORD3>vcone</KEYWORD3>
- <KEYWORD3>view</KEYWORD3>
- <KEYWORD3>vscale</KEYWORD3>
- <KEYWORD3>vratio</KEYWORD3>
- <KEYWORD3>display</KEYWORD3>
- <KEYWORD3>erase</KEYWORD3>
- <KEYWORD3>ndist</KEYWORD3>
- <KEYWORD3>number</KEYWORD3>
- <KEYWORD3>plopts</KEYWORD3>
- <KEYWORD3>seg</KEYWORD3>
- <KEYWORD3>shrink</KEYWORD3>
-
- <KEYWORD3>active</KEYWORD3>
- <KEYWORD3>,csys</KEYWORD3>
- <KEYWORD3>,dsys</KEYWORD3>
- <KEYWORD3>,mat</KEYWORD3>
- <KEYWORD3>,type</KEYWORD3>
- <KEYWORD3>,real</KEYWORD3>
- <KEYWORD3>,esys</KEYWORD3>
- <KEYWORD3>,cp</KEYWORD3>
- <KEYWORD3>,ce</KEYWORD3>
- <KEYWORD3>wfront</KEYWORD3>
- <KEYWORD3>max</KEYWORD3>
- <KEYWORD3>rms</KEYWORD3>
-
- <KEYWORD3>cdsy</KEYWORD3>
- <KEYWORD3>loc</KEYWORD3>
- <KEYWORD3>ang</KEYWORD3>
- <KEYWORD3>xy</KEYWORD3>
- <KEYWORD3>yz</KEYWORD3>
- <KEYWORD3>zx</KEYWORD3>
- <KEYWORD3>attr</KEYWORD3>
-
- <KEYWORD3>node</KEYWORD3>
- <KEYWORD3>loc</KEYWORD3>
- <KEYWORD3>,nsel</KEYWORD3>
- <KEYWORD3>nxth</KEYWORD3>
- <KEYWORD3>nxtl</KEYWORD3>
- <KEYWORD3>,f</KEYWORD3>
- <KEYWORD3>fx</KEYWORD3>
- <KEYWORD3>mx</KEYWORD3>
- <KEYWORD3>csgx</KEYWORD3>
- <KEYWORD3>,d</KEYWORD3>
- <KEYWORD3>ux</KEYWORD3>
- <KEYWORD3>rotx</KEYWORD3>
- <KEYWORD3>vx</KEYWORD3>
- <KEYWORD3>ax</KEYWORD3>
- <KEYWORD3>hgen</KEYWORD3>
- <KEYWORD3>num</KEYWORD3>
- <KEYWORD3>max</KEYWORD3>
- <KEYWORD3>min</KEYWORD3>
- <KEYWORD3>count</KEYWORD3>
- <KEYWORD3>mxloc</KEYWORD3>
- <KEYWORD3>mnloc</KEYWORD3>
-
- <KEYWORD3>elem</KEYWORD3>
- <KEYWORD3>cent</KEYWORD3>
- <KEYWORD3>adj</KEYWORD3>
- <KEYWORD3>attr</KEYWORD3>
- <KEYWORD3>leng</KEYWORD3>
- <KEYWORD3>lproj</KEYWORD3>
- <KEYWORD3>area</KEYWORD3>
- <KEYWORD3>aproj</KEYWORD3>
- <KEYWORD3>volu</KEYWORD3>
- <KEYWORD3>,esel</KEYWORD3>
- <KEYWORD3>nxth</KEYWORD3>
- <KEYWORD3>nxtl</KEYWORD3>
- <KEYWORD3>hgen</KEYWORD3>
- <KEYWORD3>hcoe</KEYWORD3>
- <KEYWORD3>tbulk</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>shpar</KEYWORD3>
- <KEYWORD3>angd</KEYWORD3>
- <KEYWORD3>aspe</KEYWORD3>
- <KEYWORD3>jacr</KEYWORD3>
- <KEYWORD3>maxa</KEYWORD3>
- <KEYWORD3>para</KEYWORD3>
- <KEYWORD3>warp</KEYWORD3>
- <KEYWORD3>num</KEYWORD3>
- <KEYWORD3>,ksel</KEYWORD3>
- <KEYWORD3>nxth</KEYWORD3>
- <KEYWORD3>nxtl</KEYWORD3>
- <KEYWORD3>div</KEYWORD3>
-
- <KEYWORD3>kp</KEYWORD3>
- <KEYWORD3>ior</KEYWORD3>
- <KEYWORD3>imc</KEYWORD3>
- <KEYWORD3>irp</KEYWORD3>
- <KEYWORD3>ixv</KEYWORD3>
- <KEYWORD3>iyv</KEYWORD3>
- <KEYWORD3>izv</KEYWORD3>
- <KEYWORD3>nrelm</KEYWORD3>
-
- <KEYWORD3>line</KEYWORD3>
- <KEYWORD3>,lsel</KEYWORD3>
-
- <KEYWORD3>area</KEYWORD3>
- <KEYWORD3>,asel</KEYWORD3>
- <KEYWORD3>loop</KEYWORD3>
-
- <KEYWORD3>volu</KEYWORD3>
- <KEYWORD3>,vsel</KEYWORD3>
- <KEYWORD3>shell</KEYWORD3>
-
- <KEYWORD3>etyp</KEYWORD3>
-
- <KEYWORD3>rcon</KEYWORD3>
-
- <KEYWORD3>ex</KEYWORD3>
- <KEYWORD3>alpx</KEYWORD3>
- <KEYWORD3>reft</KEYWORD3>
- <KEYWORD3>prxy</KEYWORD3>
- <KEYWORD3>nuxy</KEYWORD3>
- <KEYWORD3>gxy</KEYWORD3>
- <KEYWORD3>damp</KEYWORD3>
- <KEYWORD3>mu</KEYWORD3>
- <KEYWORD3>dnes</KEYWORD3>
- <KEYWORD3>c</KEYWORD3>
- <KEYWORD3>enth</KEYWORD3>
- <KEYWORD3>kxx</KEYWORD3>
- <KEYWORD3>hf</KEYWORD3>
- <KEYWORD3>emis</KEYWORD3>
- <KEYWORD3>qrate</KEYWORD3>
- <KEYWORD3>visc</KEYWORD3>
- <KEYWORD3>sonc</KEYWORD3>
- <KEYWORD3>rsvx</KEYWORD3>
- <KEYWORD3>perx</KEYWORD3>
- <KEYWORD3>murx</KEYWORD3>
- <KEYWORD3>mgxx</KEYWORD3>
- <KEYWORD3>lsst</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
-
- <KEYWORD3>fldata</KEYWORD3>
- <KEYWORD3>flow</KEYWORD3>
- <KEYWORD3>turb</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>comp</KEYWORD3>
- <KEYWORD3>swrl</KEYWORD3>
- <KEYWORD3>tran</KEYWORD3>
- <KEYWORD3>spec</KEYWORD3>
- <KEYWORD3>exec</KEYWORD3>
- <KEYWORD3>appe</KEYWORD3>
- <KEYWORD3>over</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>vx</KEYWORD3>
- <KEYWORD3>vy</KEYWORD3>
- <KEYWORD3>vz</KEYWORD3>
- <KEYWORD3>enke</KEYWORD3>
- <KEYWORD3>ends</KEYWORD3>
- <KEYWORD3>step</KEYWORD3>
- <KEYWORD3>istep</KEYWORD3>
- <KEYWORD3>bc</KEYWORD3>
- <KEYWORD3>numb</KEYWORD3>
- <KEYWORD3>glob</KEYWORD3>
- <KEYWORD3>tend</KEYWORD3>
- <KEYWORD3>appe</KEYWORD3>
- <KEYWORD3>sumf</KEYWORD3>
- <KEYWORD3>over</KEYWORD3>
- <KEYWORD3>sumf</KEYWORD3>
- <KEYWORD3>debg</KEYWORD3>
- <KEYWORD3>resi</KEYWORD3>
- <KEYWORD3>dens</KEYWORD3>
- <KEYWORD3>visc</KEYWORD3>
- <KEYWORD3>cond</KEYWORD3>
- <KEYWORD3>evis</KEYWORD3>
- <KEYWORD3>econ</KEYWORD3>
- <KEYWORD3>ttot</KEYWORD3>
- <KEYWORD3>hflu</KEYWORD3>
- <KEYWORD3>hflm</KEYWORD3>
- <KEYWORD3>spht</KEYWORD3>
- <KEYWORD3>strm</KEYWORD3>
- <KEYWORD3>mach</KEYWORD3>
- <KEYWORD3>ptot</KEYWORD3>
- <KEYWORD3>pcoe</KEYWORD3>
- <KEYWORD3>yplu</KEYWORD3>
- <KEYWORD3>tauw</KEYWORD3>
- <KEYWORD3>lmd</KEYWORD3>
- <KEYWORD3>emd</KEYWORD3>
- <KEYWORD3>outp</KEYWORD3>
- <KEYWORD3>iter</KEYWORD3>
- <KEYWORD3>dens</KEYWORD3>
- <KEYWORD3>visc</KEYWORD3>
- <KEYWORD3>cond</KEYWORD3>
- <KEYWORD3>ivis</KEYWORD3>
- <KEYWORD3>ufrq</KEYWORD3>
- <KEYWORD3>nomi</KEYWORD3>
- <KEYWORD3>bulk</KEYWORD3>
- <KEYWORD3>ttot</KEYWORD3>
- <KEYWORD3>refe</KEYWORD3>
- <KEYWORD3>beta</KEYWORD3>
- <KEYWORD3>comp</KEYWORD3>
- <KEYWORD3>fill</KEYWORD3>
- <KEYWORD3>modp</KEYWORD3>
- <KEYWORD3>modl</KEYWORD3>
- <KEYWORD3>rati</KEYWORD3>
- <KEYWORD3>inin</KEYWORD3>
- <KEYWORD3>insf</KEYWORD3>
- <KEYWORD3>sctk</KEYWORD3>
- <KEYWORD3>sctd</KEYWORD3>
- <KEYWORD3>cmu</KEYWORD3>
- <KEYWORD3>c1</KEYWORD3>
- <KEYWORD3>c2</KEYWORD3>
- <KEYWORD3>buc3</KEYWORD3>
- <KEYWORD3>buc4</KEYWORD3>
- <KEYWORD3>beta</KEYWORD3>
- <KEYWORD3>kapp</KEYWORD3>
- <KEYWORD3>ewll</KEYWORD3>
- <KEYWORD3>wall</KEYWORD3>
- <KEYWORD3>vand</KEYWORD3>
- <KEYWORD3>tran</KEYWORD3>
- <KEYWORD3>zels</KEYWORD3>
- <KEYWORD3>sctk</KEYWORD3>
- <KEYWORD3>sctd</KEYWORD3>
- <KEYWORD3>cmu</KEYWORD3>
- <KEYWORD3>c1</KEYWORD3>
- <KEYWORD3>c2</KEYWORD3>
- <KEYWORD3>etai</KEYWORD3>
- <KEYWORD3>c1mx</KEYWORD3>
- <KEYWORD3>g0</KEYWORD3>
- <KEYWORD3>g1</KEYWORD3>
- <KEYWORD3>g2</KEYWORD3>
- <KEYWORD3>g3</KEYWORD3>
- <KEYWORD3>g4</KEYWORD3>
- <KEYWORD3>szl1</KEYWORD3>
- <KEYWORD3>szl2</KEYWORD3>
- <KEYWORD3>szl3</KEYWORD3>
- <KEYWORD3>evis</KEYWORD3>
- <KEYWORD3>econ</KEYWORD3>
- <KEYWORD3>mome</KEYWORD3>
- <KEYWORD3>sp01</KEYWORD3>
- <KEYWORD3>sp02</KEYWORD3>
- <KEYWORD3>sp03</KEYWORD3>
- <KEYWORD3>sp04</KEYWORD3>
- <KEYWORD3>sp05</KEYWORD3>
- <KEYWORD3>sp06</KEYWORD3>
- <KEYWORD3>momd</KEYWORD3>
- <KEYWORD3>moms</KEYWORD3>
- <KEYWORD3>prsd</KEYWORD3>
- <KEYWORD3>prss</KEYWORD3>
- <KEYWORD3>thrd</KEYWORD3>
- <KEYWORD3>thrs</KEYWORD3>
- <KEYWORD3>trbd</KEYWORD3>
- <KEYWORD3>trbs</KEYWORD3>
- <KEYWORD3>velo</KEYWORD3>
- <KEYWORD3>umin</KEYWORD3>
- <KEYWORD3>umax</KEYWORD3>
- <KEYWORD3>vmin</KEYWORD3>
- <KEYWORD3>vmax</KEYWORD3>
- <KEYWORD3>wmin</KEYWORD3>
- <KEYWORD3>wmax</KEYWORD3>
- <KEYWORD3>tmin</KEYWORD3>
- <KEYWORD3>tmax</KEYWORD3>
- <KEYWORD3>pmin</KEYWORD3>
- <KEYWORD3>pmax</KEYWORD3>
- <KEYWORD3>nset</KEYWORD3>
- <KEYWORD3>iter</KEYWORD3>
- <KEYWORD3>lstp</KEYWORD3>
- <KEYWORD3>time</KEYWORD3>
- <KEYWORD3>rfil</KEYWORD3>
- <KEYWORD3>wfil</KEYWORD3>
- <KEYWORD3>over</KEYWORD3>
- <KEYWORD3>clear</KEYWORD3>
-
- <KEYWORD3>msdata</KEYWORD3>
- <KEYWORD3>spec</KEYWORD3>
- <KEYWORD3>ugas</KEYWORD3>
-
- <KEYWORD3>msprop</KEYWORD3>
- <KEYWORD3>cond</KEYWORD3>
- <KEYWORD3>mdif</KEYWORD3>
- <KEYWORD3>spht</KEYWORD3>
- <KEYWORD3>nomi</KEYWORD3>
- <KEYWORD3>cof1</KEYWORD3>
- <KEYWORD3>cof2</KEYWORD3>
- <KEYWORD3>cof3</KEYWORD3>
-
- <KEYWORD3>msspec</KEYWORD3>
- <KEYWORD3>name</KEYWORD3>
- <KEYWORD3>molw</KEYWORD3>
- <KEYWORD3>schm</KEYWORD3>
-
- <KEYWORD3>msrelax</KEYWORD3>
- <KEYWORD3>conc</KEYWORD3>
- <KEYWORD3>emdi</KEYWORD3>
- <KEYWORD3>stab</KEYWORD3>
-
- <KEYWORD3>mssolu</KEYWORD3>
- <KEYWORD3>nswe</KEYWORD3>
- <KEYWORD3>maxi</KEYWORD3>
- <KEYWORD3>nsrc</KEYWORD3>
- <KEYWORD3>conv</KEYWORD3>
- <KEYWORD3>delt</KEYWORD3>
-
- <KEYWORD3>msmeth</KEYWORD3>
-
- <KEYWORD3>mscap</KEYWORD3>
- <KEYWORD3>key</KEYWORD3>
- <KEYWORD3>upp</KEYWORD3>
- <KEYWORD3>low</KEYWORD3>
-
- <KEYWORD3>msvary</KEYWORD3>
-
- <KEYWORD3>msnomf</KEYWORD3>
-
- <KEYWORD3>active</KEYWORD3>
- <KEYWORD3>anty</KEYWORD3>
- <KEYWORD3>solu</KEYWORD3>
- <KEYWORD3>dtime</KEYWORD3>
- <KEYWORD3>ncmls</KEYWORD3>
- <KEYWORD3>ncmss</KEYWORD3>
- <KEYWORD3>eqit</KEYWORD3>
- <KEYWORD3>ncmit</KEYWORD3>
- <KEYWORD3>cnvg</KEYWORD3>
- <KEYWORD3>mxdvl</KEYWORD3>
- <KEYWORD3>resfrq</KEYWORD3>
- <KEYWORD3>reseig</KEYWORD3>
- <KEYWORD3>dsprm</KEYWORD3>
- <KEYWORD3>focv</KEYWORD3>
- <KEYWORD3>mocv</KEYWORD3>
- <KEYWORD3>hfcv</KEYWORD3>
- <KEYWORD3>mfcv</KEYWORD3>
- <KEYWORD3>cscv</KEYWORD3>
- <KEYWORD3>cucv</KEYWORD3>
- <KEYWORD3>ffcv</KEYWORD3>
- <KEYWORD3>dicv</KEYWORD3>
- <KEYWORD3>rocv</KEYWORD3>
- <KEYWORD3>tecv</KEYWORD3>
- <KEYWORD3>vmcv</KEYWORD3>
- <KEYWORD3>smcv</KEYWORD3>
- <KEYWORD3>vocv</KEYWORD3>
- <KEYWORD3>prcv</KEYWORD3>
- <KEYWORD3>vecv</KEYWORD3>
- <KEYWORD3>nc48</KEYWORD3>
- <KEYWORD3>nc49</KEYWORD3>
- <KEYWORD3>crprat</KEYWORD3>
- <KEYWORD3>psinc</KEYWORD3>
-
- <KEYWORD3>elem</KEYWORD3>
- <KEYWORD3>mtot</KEYWORD3>
- <KEYWORD3>mc</KEYWORD3>
- <KEYWORD3>ior</KEYWORD3>
- <KEYWORD3>imc</KEYWORD3>
- <KEYWORD3>fmc</KEYWORD3>
- <KEYWORD3>mmor</KEYWORD3>
- <KEYWORD3>mmmc</KEYWORD3>
-
- <KEYWORD3>mode</KEYWORD3>
- <KEYWORD3>freq</KEYWORD3>
- <KEYWORD3>pfact</KEYWORD3>
- <KEYWORD3>mcoef</KEYWORD3>
- <KEYWORD3>damp</KEYWORD3>
-
- <KEYWORD3>active</KEYWORD3>
- <KEYWORD3>,set</KEYWORD3>
- <KEYWORD3>lstp</KEYWORD3>
- <KEYWORD3>sbst</KEYWORD3>
- <KEYWORD3>time</KEYWORD3>
- <KEYWORD3>rsys</KEYWORD3>
-
- <KEYWORD3>node</KEYWORD3>
- <KEYWORD3>u</KEYWORD3>
- <KEYWORD3>sum</KEYWORD3>
- <KEYWORD3>rot</KEYWORD3>
- <KEYWORD3>ntemp</KEYWORD3>
- <KEYWORD3>volt</KEYWORD3>
- <KEYWORD3>mag</KEYWORD3>
- <KEYWORD3>v</KEYWORD3>
- <KEYWORD3>,a</KEYWORD3>
- <KEYWORD3>curr</KEYWORD3>
- <KEYWORD3>emf</KEYWORD3>
- <KEYWORD3>rf</KEYWORD3>
- <KEYWORD3>fx</KEYWORD3>
- <KEYWORD3>fy</KEYWORD3>
- <KEYWORD3>fz</KEYWORD3>
- <KEYWORD3>mx</KEYWORD3>
- <KEYWORD3>my</KEYWORD3>
- <KEYWORD3>mz</KEYWORD3>
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>int</KEYWORD3>
- <KEYWORD3>eqv</KEYWORD3>
- <KEYWORD3>epto</KEYWORD3>
- <KEYWORD3>epel</KEYWORD3>
- <KEYWORD3>eppl</KEYWORD3>
- <KEYWORD3>epcr</KEYWORD3>
- <KEYWORD3>epth</KEYWORD3>
- <KEYWORD3>epsw</KEYWORD3>
- <KEYWORD3>nl</KEYWORD3>
- <KEYWORD3>sepl</KEYWORD3>
- <KEYWORD3>srat</KEYWORD3>
- <KEYWORD3>hpres</KEYWORD3>
- <KEYWORD3>epeq</KEYWORD3>
- <KEYWORD3>psv</KEYWORD3>
- <KEYWORD3>plwk</KEYWORD3>
- <KEYWORD3>tg</KEYWORD3>
- <KEYWORD3>tf</KEYWORD3>
- <KEYWORD3>pg</KEYWORD3>
- <KEYWORD3>ef</KEYWORD3>
- <KEYWORD3>,d</KEYWORD3>
- <KEYWORD3>h</KEYWORD3>
- <KEYWORD3>b</KEYWORD3>
- <KEYWORD3>fmag</KEYWORD3>
- <KEYWORD3>hs</KEYWORD3>
- <KEYWORD3>bfe</KEYWORD3>
- <KEYWORD3>ttot</KEYWORD3>
- <KEYWORD3>hflu</KEYWORD3>
- <KEYWORD3>hflm</KEYWORD3>
- <KEYWORD3>conc</KEYWORD3>
- <KEYWORD3>pcoe</KEYWORD3>
- <KEYWORD3>ptot</KEYWORD3>
- <KEYWORD3>mach</KEYWORD3>
- <KEYWORD3>strm</KEYWORD3>
- <KEYWORD3>evis</KEYWORD3>
- <KEYWORD3>cmuv</KEYWORD3>
- <KEYWORD3>econ</KEYWORD3>
- <KEYWORD3>yplu</KEYWORD3>
- <KEYWORD3>tauw</KEYWORD3>
-
- <KEYWORD3>elem</KEYWORD3>
- <KEYWORD3>serr</KEYWORD3>
- <KEYWORD3>sdsg</KEYWORD3>
- <KEYWORD3>terr</KEYWORD3>
- <KEYWORD3>tdsg</KEYWORD3>
- <KEYWORD3>sene</KEYWORD3>
- <KEYWORD3>tene</KEYWORD3>
- <KEYWORD3>kene</KEYWORD3>
- <KEYWORD3>jheat</KEYWORD3>
- <KEYWORD3>js</KEYWORD3>
- <KEYWORD3>volu</KEYWORD3>
- <KEYWORD3>etab</KEYWORD3>
- <KEYWORD3>smisc</KEYWORD3>
- <KEYWORD3>nmisc</KEYWORD3>
-
- <KEYWORD3>etab</KEYWORD3>
- <KEYWORD3>ncol</KEYWORD3>
- <KEYWORD3>nleng</KEYWORD3>
-
- <KEYWORD3>sort</KEYWORD3>
- <KEYWORD3>max</KEYWORD3>
- <KEYWORD3>min</KEYWORD3>
- <KEYWORD3>imax</KEYWORD3>
- <KEYWORD3>imin</KEYWORD3>
-
- <KEYWORD3>ssum</KEYWORD3>
- <KEYWORD3>item</KEYWORD3>
-
- <KEYWORD3>fsum</KEYWORD3>
-
- <KEYWORD3>path</KEYWORD3>
- <KEYWORD3>last</KEYWORD3>
- <KEYWORD3>nval</KEYWORD3>
-
- <KEYWORD3>kcalc</KEYWORD3>
- <KEYWORD3>k</KEYWORD3>
-
- <KEYWORD3>intsrf</KEYWORD3>
-
- <KEYWORD3>plnsol</KEYWORD3>
- <KEYWORD3>bmax</KEYWORD3>
- <KEYWORD3>bmin</KEYWORD3>
-
- <KEYWORD3>prerr</KEYWORD3>
- <KEYWORD3>sepc</KEYWORD3>
- <KEYWORD3>tepc</KEYWORD3>
- <KEYWORD3>sersm</KEYWORD3>
- <KEYWORD3>tersm</KEYWORD3>
- <KEYWORD3>sensm</KEYWORD3>
- <KEYWORD3>tensm</KEYWORD3>
-
- <KEYWORD3>section</KEYWORD3>
- <KEYWORD3>inside</KEYWORD3>
- <KEYWORD3>sx</KEYWORD3>
- <KEYWORD3>sy</KEYWORD3>
- <KEYWORD3>sz</KEYWORD3>
- <KEYWORD3>sxxy</KEYWORD3>
- <KEYWORD3>syz</KEYWORD3>
- <KEYWORD3>szx</KEYWORD3>
- <KEYWORD3>center</KEYWORD3>
- <KEYWORD3>outside</KEYWORD3>
-
- <KEYWORD3>vari</KEYWORD3>
- <KEYWORD3>extrem</KEYWORD3>
- <KEYWORD3>vmax</KEYWORD3>
- <KEYWORD3>tmax</KEYWORD3>
- <KEYWORD3>vmin</KEYWORD3>
- <KEYWORD3>tmin</KEYWORD3>
- <KEYWORD3>vlast</KEYWORD3>
- <KEYWORD3>tlast</KEYWORD3>
- <KEYWORD3>cvar</KEYWORD3>
- <KEYWORD3>rtime</KEYWORD3>
- <KEYWORD3>itime</KEYWORD3>
- <KEYWORD3>t</KEYWORD3>
- <KEYWORD3>rset</KEYWORD3>
- <KEYWORD3>iset</KEYWORD3>
- <KEYWORD3>nsets</KEYWORD3>
-
- <KEYWORD3>opt</KEYWORD3>
- <KEYWORD3>total</KEYWORD3>
- <KEYWORD3>feas</KEYWORD3>
- <KEYWORD3>term</KEYWORD3>
- <KEYWORD3>best</KEYWORD3>
-
- <KEYWORD3>topo</KEYWORD3>
- <KEYWORD3>act</KEYWORD3>
- <KEYWORD3>conv</KEYWORD3>
- <KEYWORD3>comp</KEYWORD3>
- <KEYWORD3>porv</KEYWORD3>
- <KEYWORD3>loads</KEYWORD3>
-
- <KEYWORD3>runst</KEYWORD3>
- <KEYWORD3>rspeed</KEYWORD3>
- <KEYWORD3>mips</KEYWORD3>
- <KEYWORD3>smflop</KEYWORD3>
- <KEYWORD3>vmflop</KEYWORD3>
- <KEYWORD3>rfilsz</KEYWORD3>
- <KEYWORD3>emat</KEYWORD3>
- <KEYWORD3>erot</KEYWORD3>
- <KEYWORD3>esav</KEYWORD3>
- <KEYWORD3>full</KEYWORD3>
- <KEYWORD3>mode</KEYWORD3>
- <KEYWORD3>rdsp</KEYWORD3>
- <KEYWORD3>redm</KEYWORD3>
- <KEYWORD3>rfrq</KEYWORD3>
- <KEYWORD3>rgeom</KEYWORD3>
- <KEYWORD3>rst</KEYWORD3>
- <KEYWORD3>tri</KEYWORD3>
- <KEYWORD3>rtimst</KEYWORD3>
- <KEYWORD3>tfirst</KEYWORD3>
- <KEYWORD3>titer</KEYWORD3>
- <KEYWORD3>eqprep</KEYWORD3>
- <KEYWORD3>,solve</KEYWORD3>
- <KEYWORD3>bsub</KEYWORD3>
- <KEYWORD3>eigen</KEYWORD3>
- <KEYWORD3>elform</KEYWORD3>
- <KEYWORD3>elstrs</KEYWORD3>
- <KEYWORD3>nelm</KEYWORD3>
- <KEYWORD3>rmemry</KEYWORD3>
- <KEYWORD3>wsreq</KEYWORD3>
- <KEYWORD3>wsavail</KEYWORD3>
- <KEYWORD3>dbpsize</KEYWORD3>
- <KEYWORD3>dbpdisk</KEYWORD3>
- <KEYWORD3>dbpmem</KEYWORD3>
- <KEYWORD3>dbsize</KEYWORD3>
- <KEYWORD3>dbmem</KEYWORD3>
- <KEYWORD3>scrsize</KEYWORD3>
- <KEYWORD3>scravail</KEYWORD3>
- <KEYWORD3>iomem</KEYWORD3>
- <KEYWORD3>iopsiz</KEYWORD3>
- <KEYWORD3>iobuf</KEYWORD3>
- <KEYWORD3>rwfrnt</KEYWORD3>
- <KEYWORD3>rms</KEYWORD3>
- <KEYWORD3>mean</KEYWORD3>
-
- <KEYWORD3>,nsel</KEYWORD3>
- <KEYWORD3>,esel</KEYWORD3>
- <KEYWORD3>,ksel</KEYWORD3>
- <KEYWORD3>,lsel</KEYWORD3>
- <KEYWORD3>,asel</KEYWORD3>
- <KEYWORD3>,vsel</KEYWORD3>
- <KEYWORD3>ndnext</KEYWORD3>
- <KEYWORD3>elnext</KEYWORD3>
- <KEYWORD3>kpnext</KEYWORD3>
- <KEYWORD3>lsnext</KEYWORD3>
- <KEYWORD3>arnext</KEYWORD3>
- <KEYWORD3>vlnext</KEYWORD3>
- <KEYWORD3>centrx</KEYWORD3>
- <KEYWORD3>centry</KEYWORD3>
- <KEYWORD3>centrz</KEYWORD3>
- <KEYWORD3>nx</KEYWORD3>
- <KEYWORD3>ny</KEYWORD3>
- <KEYWORD3>nz</KEYWORD3>
- <KEYWORD3>kx</KEYWORD3>
- <KEYWORD3>ky</KEYWORD3>
- <KEYWORD3>kz</KEYWORD3>
- <KEYWORD3>lx</KEYWORD3>
- <KEYWORD3>ly</KEYWORD3>
- <KEYWORD3>lz</KEYWORD3>
- <KEYWORD3>lsx</KEYWORD3>
- <KEYWORD3>lsy</KEYWORD3>
- <KEYWORD3>lsz</KEYWORD3>
- <KEYWORD3>node</KEYWORD3>
- <KEYWORD3>kp</KEYWORD3>
- <KEYWORD3>distnd</KEYWORD3>
- <KEYWORD3>distkp</KEYWORD3>
- <KEYWORD3>disten</KEYWORD3>
- <KEYWORD3>anglen</KEYWORD3>
- <KEYWORD3>anglek</KEYWORD3>
- <KEYWORD3>nnear</KEYWORD3>
- <KEYWORD3>knear</KEYWORD3>
- <KEYWORD3>enearn</KEYWORD3>
- <KEYWORD3>areand</KEYWORD3>
- <KEYWORD3>areakp</KEYWORD3>
- <KEYWORD3>arnode</KEYWORD3>
- <KEYWORD3>normnx</KEYWORD3>
- <KEYWORD3>normny</KEYWORD3>
- <KEYWORD3>normnz</KEYWORD3>
- <KEYWORD3>normkx</KEYWORD3>
- <KEYWORD3>normky</KEYWORD3>
- <KEYWORD3>normkz</KEYWORD3>
- <KEYWORD3>enextn</KEYWORD3>
- <KEYWORD3>nelem</KEYWORD3>
- <KEYWORD3>eladj</KEYWORD3>
- <KEYWORD3>ndface</KEYWORD3>
- <KEYWORD3>nmface</KEYWORD3>
- <KEYWORD3>arface</KEYWORD3>
- <KEYWORD3>ux</KEYWORD3>
- <KEYWORD3>uy</KEYWORD3>
- <KEYWORD3>uz</KEYWORD3>
- <KEYWORD3>rotx</KEYWORD3>
- <KEYWORD3>roty</KEYWORD3>
- <KEYWORD3>rotz</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>vx</KEYWORD3>
- <KEYWORD3>vy</KEYWORD3>
- <KEYWORD3>vz</KEYWORD3>
- <KEYWORD3>enke</KEYWORD3>
- <KEYWORD3>ends</KEYWORD3>
- <KEYWORD3>volt</KEYWORD3>
- <KEYWORD3>mag</KEYWORD3>
- <KEYWORD3>ax</KEYWORD3>
- <KEYWORD3>ay</KEYWORD3>
- <KEYWORD3>az</KEYWORD3>
-
- <!-- /GFORMAT command -->
- <KEYWORD3>g</KEYWORD3>
- <KEYWORD3>,f</KEYWORD3>
- <KEYWORD3>e</KEYWORD3>
-
- <!-- /GLINE command -->
- <KEYWORD3>all</KEYWORD3>
-
- <!-- *GO command -->
- <KEYWORD3>stop</KEYWORD3>
-
- <!-- GP command -->
- <KEYWORD3>p</KEYWORD3>
- <KEYWORD3>fx</KEYWORD3>
- <KEYWORD3>fy</KEYWORD3>
- <KEYWORD3>fz</KEYWORD3>
- <KEYWORD3>mx</KEYWORD3>
- <KEYWORD3>my</KEYWORD3>
- <KEYWORD3>mz</KEYWORD3>
-
- <!-- GPLIST command -->
- <KEYWORD3>all</KEYWORD3>
-
- <!-- /GRAPHICS command -->
- <KEYWORD3>full</KEYWORD3>
- <KEYWORD3>power</KEYWORD3>
-
- <!-- /GROPT command -->
- <KEYWORD3>axdv</KEYWORD3>
- <KEYWORD3>axnm</KEYWORD3>
- <KEYWORD3>axnsc</KEYWORD3>
- <KEYWORD3>ascal</KEYWORD3>
- <KEYWORD3>logx</KEYWORD3>
- <KEYWORD3>logy</KEYWORD3>
- <KEYWORD3>fill</KEYWORD3>
- <KEYWORD3>cgrid</KEYWORD3>
- <KEYWORD3>dig1</KEYWORD3>
- <KEYWORD3>dig2</KEYWORD3>
- <KEYWORD3>view</KEYWORD3>
- <KEYWORD3>revx</KEYWORD3>
- <KEYWORD3>revy</KEYWORD3>
- <KEYWORD3>divx</KEYWORD3>
- <KEYWORD3>divy</KEYWORD3>
- <KEYWORD3>ltyp</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
- <KEYWORD3>front</KEYWORD3>
-
- <!-- GRP command -->
- <KEYWORD3>disp</KEYWORD3>
- <KEYWORD3>velo</KEYWORD3>
- <KEYWORD3>acel</KEYWORD3>
-
- <!-- /GST command -->
- <KEYWORD3>on</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
-
- <!-- /GTHK command -->
- <KEYWORD3>axis</KEYWORD3>
- <KEYWORD3>grid</KEYWORD3>
- <KEYWORD3>curve</KEYWORD3>
-
- <!-- /GTYPE command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>node</KEYWORD3>
- <KEYWORD3>elem</KEYWORD3>
- <KEYWORD3>keyp</KEYWORD3>
- <KEYWORD3>line</KEYWORD3>
- <KEYWORD3>area</KEYWORD3>
- <KEYWORD3>volu</KEYWORD3>
- <KEYWORD3>grph</KEYWORD3>
-
- <!-- /HEADER command -->
- <KEYWORD3>on</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
-
- <!-- HPGL command -->
- <KEYWORD3>model</KEYWORD3>
- <KEYWORD3>paper</KEYWORD3>
- <KEYWORD3>color</KEYWORD3>
- <KEYWORD3>direct</KEYWORD3>
-
- <!-- HPTCREATE command -->
- <KEYWORD3>line</KEYWORD3>
- <KEYWORD3>area</KEYWORD3>
- <KEYWORD3>coord</KEYWORD3>
- <KEYWORD3>ratio</KEYWORD3>
-
- <!-- HPTDELETE command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
-
- <!-- HREXP command -->
- <KEYWORD3>all</KEYWORD3>
-
- <!-- HROPT command -->
- <KEYWORD3>full</KEYWORD3>
- <KEYWORD3>reduc</KEYWORD3>
- <KEYWORD3>msup</KEYWORD3>
-
- <!-- HROUT command -->
- <KEYWORD3>on</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
-
- <!-- IC command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
- <KEYWORD3>ux</KEYWORD3>
- <KEYWORD3>uy</KEYWORD3>
- <KEYWORD3>uz</KEYWORD3>
- <KEYWORD3>rotx</KEYWORD3>
- <KEYWORD3>roty</KEYWORD3>
- <KEYWORD3>rotz</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>vx</KEYWORD3>
- <KEYWORD3>vy</KEYWORD3>
- <KEYWORD3>vz</KEYWORD3>
- <KEYWORD3>enke</KEYWORD3>
- <KEYWORD3>ends</KEYWORD3>
- <KEYWORD3>sp01</KEYWORD3>
- <KEYWORD3>so02</KEYWORD3>
- <KEYWORD3>sp03</KEYWORD3>
- <KEYWORD3>sp04</KEYWORD3>
- <KEYWORD3>sp05</KEYWORD3>
- <KEYWORD3>sp06</KEYWORD3>
- <KEYWORD3>volt</KEYWORD3>
- <KEYWORD3>mag</KEYWORD3>
- <KEYWORD3>ax</KEYWORD3>
- <KEYWORD3>ay</KEYWORD3>
- <KEYWORD3>az</KEYWORD3>
-
- <!-- ICLIST command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
- <KEYWORD3>disp</KEYWORD3>
- <KEYWORD3>velo</KEYWORD3>
-
- <!-- *IF command -->
- <KEYWORD3>eq</KEYWORD3>
- <KEYWORD3>ne</KEYWORD3>
- <KEYWORD3>lt</KEYWORD3>
- <KEYWORD3>gt</KEYWORD3>
- <KEYWORD3>le</KEYWORD3>
- <KEYWORD3>ge</KEYWORD3>
- <KEYWORD3>ablt</KEYWORD3>
- <KEYWORD3>abgt</KEYWORD3>
- <KEYWORD3>stop</KEYWORD3>
- <KEYWORD3>exit</KEYWORD3>
- <KEYWORD3>cycle</KEYWORD3>
- <KEYWORD3>then</KEYWORD3>
-
- <!-- INRES command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>basic</KEYWORD3>
- <KEYWORD3>nsol</KEYWORD3>
- <KEYWORD3>rsol</KEYWORD3>
- <KEYWORD3>esol</KEYWORD3>
- <KEYWORD3>nload</KEYWORD3>
- <KEYWORD3>strs</KEYWORD3>
- <KEYWORD3>epel</KEYWORD3>
- <KEYWORD3>epth</KEYWORD3>
- <KEYWORD3>eppl</KEYWORD3>
- <KEYWORD3>epcr</KEYWORD3>
- <KEYWORD3>fgrad</KEYWORD3>
- <KEYWORD3>fflux</KEYWORD3>
- <KEYWORD3>misc</KEYWORD3>
-
- <!-- INTSRF command -->
- <KEYWORD3>pres</KEYWORD3>
-
- <!-- IOPTN command -->
- <KEYWORD3>stat</KEYWORD3>
- <KEYWORD3>defa</KEYWORD3>
- <KEYWORD3>merg</KEYWORD3>
- <KEYWORD3>yes</KEYWORD3>
- <KEYWORD3>no</KEYWORD3>
- <KEYWORD3>solid</KEYWORD3>
- <KEYWORD3>gtoler</KEYWORD3>
- <KEYWORD3>file</KEYWORD3>
- <KEYWORD3>iges</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
- <KEYWORD3>small</KEYWORD3>
-
- <!-- K command -->
- <KEYWORD3>p</KEYWORD3>
-
- <!-- KBETW command -->
- <KEYWORD3>p</KEYWORD3>
- <KEYWORD3>ratio</KEYWORD3>
- <KEYWORD3>dist</KEYWORD3>
-
- <!-- KCENTER command -->
- <KEYWORD3>p</KEYWORD3>
- <KEYWORD3>kp</KEYWORD3>
- <KEYWORD3>line</KEYWORD3>
-
- <!-- KCLEAR, KDELE, KDIST, KESIZE, KFILL, KGEN, KL, KLIST, KMESH, KMODIF, -->
- <!-- KMOVE, KNODE, KPLOT, KPSCALE, KSCALE, KSCON commands -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
- <KEYWORD3>coord</KEYWORD3>
- <KEYWORD3>hpt</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
-
- <!-- KREFINE command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>smooth</KEYWORD3>
- <KEYWORD3>clean</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
-
- <!-- KSEL command -->
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>,r</KEYWORD3>
- <KEYWORD3>,a</KEYWORD3>
- <KEYWORD3>u</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>none</KEYWORD3>
- <KEYWORD3>inve</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
- <KEYWORD3>,mat</KEYWORD3>
- <KEYWORD3>,type</KEYWORD3>
- <KEYWORD3>,real</KEYWORD3>
- <KEYWORD3>,esys</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>kp</KEYWORD3>
- <KEYWORD3>ext</KEYWORD3>
- <KEYWORD3>hpt</KEYWORD3>
- <KEYWORD3>loc</KEYWORD3>
- <KEYWORD3>x</KEYWORD3>
- <KEYWORD3>y</KEYWORD3>
- <KEYWORD3>z</KEYWORD3>
-
- <!-- KSLL, KSLN commands -->
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>,r</KEYWORD3>
- <KEYWORD3>,a</KEYWORD3>
- <KEYWORD3>u</KEYWORD3>
-
- <!-- KSYMM, KTRAN, KWPAVE, KWPLAN commands -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
- <KEYWORD3>x</KEYWORD3>
- <KEYWORD3>y</KEYWORD3>
- <KEYWORD3>z</KEYWORD3>
-
- <!-- L, L2ANG, L2TAN, LANG, LARC, LAREA commands -->
- <KEYWORD3>p</KEYWORD3>
-
- <!-- LAYER, LAYERP26 commands -->
- <KEYWORD3>fcmax</KEYWORD3>
-
- <!-- LAYLIST, LCABS, LCCAT, LCFACT, LCLEAR, LCOMB, LCSL, LCSUM, LDELE, -->
- <!-- LDIV, LDRAG, LESIZE, LEXTND, LFILLT, LGEN, LGLUE, /LIGHT, LINA, -->
- <!-- LINL, LINP, LINV, LMESH, LNFILL, LNMERGE, LOVLAP, LPLOT, LPTN, -->
- <!-- LREVERSE, LROTAT, LSSCALE, LSTR commands -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
-
- <!-- LCDEF command -->
- <KEYWORD3>erase</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
-
- <!-- LCOPER command -->
- <KEYWORD3>zero</KEYWORD3>
- <KEYWORD3>squa</KEYWORD3>
- <KEYWORD3>sqrt</KEYWORD3>
- <KEYWORD3>lprin</KEYWORD3>
- <KEYWORD3>add</KEYWORD3>
- <KEYWORD3>sub</KEYWORD3>
- <KEYWORD3>srss</KEYWORD3>
- <KEYWORD3>min</KEYWORD3>
- <KEYWORD3>max</KEYWORD3>
- <KEYWORD3>abmn</KEYWORD3>
- <KEYWORD3>abmx</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>mult</KEYWORD3>
-
- <!-- LCSEL command -->
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>,r</KEYWORD3>
- <KEYWORD3>,a</KEYWORD3>
- <KEYWORD3>u</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>none</KEYWORD3>
- <KEYWORD3>inve</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
-
- <!-- LDREAD command -->
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>forc</KEYWORD3>
- <KEYWORD3>hgen</KEYWORD3>
- <KEYWORD3>hflu</KEYWORD3>
- <KEYWORD3>ehflu</KEYWORD3>
- <KEYWORD3>js</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>reac</KEYWORD3>
- <KEYWORD3>hflm</KEYWORD3>
- <KEYWORD3>last</KEYWORD3>
-
- <!-- LGWRITE command -->
- <KEYWORD3>none</KEYWORD3>
- <KEYWORD3>comment</KEYWORD3>
- <KEYWORD3>remove</KEYWORD3>
-
- <!-- LLIST command -->
- <KEYWORD3>radius</KEYWORD3>
- <KEYWORD3>layer</KEYWORD3>
- <KEYWORD3>hpt</KEYWORD3>
- <KEYWORD3>orient</KEYWORD3>
-
- <!-- LNSEARCH command -->
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
- <KEYWORD3>auto</KEYWORD3>
-
- <!-- LOCAL command -->
- <KEYWORD3>cart</KEYWORD3>
- <KEYWORD3>cylin</KEYWORD3>
- <KEYWORD3>sphe</KEYWORD3>
- <KEYWORD3>toro</KEYWORD3>
-
- <!-- LREFINE command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>smooth</KEYWORD3>
- <KEYWORD3>clean</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
-
- <!-- LSBA, LSBL, LSBV, LSBW commands -->
- <KEYWORD3>p</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>sepo</KEYWORD3>
- <KEYWORD3>delete</KEYWORD3>
- <KEYWORD3>keep</KEYWORD3>
-
- <!-- LSCLEAR command -->
- <KEYWORD3>solid</KEYWORD3>
- <KEYWORD3>fe</KEYWORD3>
- <KEYWORD3>iner</KEYWORD3>
- <KEYWORD3>lfact</KEYWORD3>
- <KEYWORD3>lsopt</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
-
- <!-- LSEL command -->
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>,r</KEYWORD3>
- <KEYWORD3>,a</KEYWORD3>
- <KEYWORD3>u</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>none</KEYWORD3>
- <KEYWORD3>inve</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
- <KEYWORD3>line</KEYWORD3>
- <KEYWORD3>ext</KEYWORD3>
- <KEYWORD3>loc</KEYWORD3>
- <KEYWORD3>x</KEYWORD3>
- <KEYWORD3>y</KEYWORD3>
- <KEYWORD3>z</KEYWORD3>
- <KEYWORD3>tan1</KEYWORD3>
- <KEYWORD3>tan2</KEYWORD3>
- <KEYWORD3>ndiv</KEYWORD3>
- <KEYWORD3>space</KEYWORD3>
- <KEYWORD3>,mat</KEYWORD3>
- <KEYWORD3>,type</KEYWORD3>
- <KEYWORD3>,real</KEYWORD3>
- <KEYWORD3>,esys</KEYWORD3>
- <KEYWORD3>sec</KEYWORD3>
- <KEYWORD3>lenght</KEYWORD3>
- <KEYWORD3>radius</KEYWORD3>
- <KEYWORD3>hpt</KEYWORD3>
- <KEYWORD3>lcca</KEYWORD3>
-
- <!-- LSLA, LSLK commands -->
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>,r</KEYWORD3>
- <KEYWORD3>,a</KEYWORD3>
- <KEYWORD3>u</KEYWORD3>
-
- <!-- LSREAD, LSWRITE commands -->
- <KEYWORD3>stat</KEYWORD3>
- <KEYWORD3>init</KEYWORD3>
-
- <!-- LSYMM, LTAN, LTRAN, LWPLAN commands -->
- <KEYWORD3>x</KEYWORD3>
- <KEYWORD3>y</KEYWORD3>
- <KEYWORD3>z</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
-
- <!-- LUMPM command -->
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
-
- <!-- M, MONITOR commands -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
- <KEYWORD3>ux</KEYWORD3>
- <KEYWORD3>uy</KEYWORD3>
- <KEYWORD3>uz</KEYWORD3>
- <KEYWORD3>rotx</KEYWORD3>
- <KEYWORD3>roty</KEYWORD3>
- <KEYWORD3>rotz</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>fx</KEYWORD3>
- <KEYWORD3>fy</KEYWORD3>
- <KEYWORD3>fz</KEYWORD3>
- <KEYWORD3>mx</KEYWORD3>
- <KEYWORD3>my</KEYWORD3>
- <KEYWORD3>mz</KEYWORD3>
- <KEYWORD3>heat</KEYWORD3>
-
- <!-- MDELE, MGEN, MLIST commands -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
-
- <!-- /MENU command -->
- <KEYWORD3>on</KEYWORD3>
- <KEYWORD3>grph</KEYWORD3>
-
- <!-- *MFOURI command -->
- <KEYWORD3>fit</KEYWORD3>
- <KEYWORD3>eval</KEYWORD3>
-
- <!-- *MFUN command -->
- <KEYWORD3>copy</KEYWORD3>
- <KEYWORD3>tran</KEYWORD3>
-
- <!-- MODMSH command -->
- <KEYWORD3>stat</KEYWORD3>
- <KEYWORD3>nocheck</KEYWORD3>
- <KEYWORD3>check</KEYWORD3>
- <KEYWORD3>detach</KEYWORD3>
-
- <!-- MODOPT command -->
- <KEYWORD3>subsp</KEYWORD3>
- <KEYWORD3>lanb</KEYWORD3>
- <KEYWORD3>reduc</KEYWORD3>
- <KEYWORD3>unsym</KEYWORD3>
- <KEYWORD3>damp</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
-
- <!-- *MOPER command -->
- <KEYWORD3>mult</KEYWORD3>
- <KEYWORD3>solv</KEYWORD3>
- <KEYWORD3>sort</KEYWORD3>
- <KEYWORD3>covar</KEYWORD3>
- <KEYWORD3>corr</KEYWORD3>
-
- <!-- MOPT command -->
- <KEYWORD3>expnd</KEYWORD3>
- <KEYWORD3>tetexpnd</KEYWORD3>
- <KEYWORD3>trans</KEYWORD3>
- <KEYWORD3>iesz</KEYWORD3>
- <KEYWORD3>amesh</KEYWORD3>
- <KEYWORD3>default</KEYWORD3>
- <KEYWORD3>main</KEYWORD3>
- <KEYWORD3>alternate</KEYWORD3>
- <KEYWORD3>alt2</KEYWORD3>
- <KEYWORD3>qmesh</KEYWORD3>
- <KEYWORD3>vmesh</KEYWORD3>
- <KEYWORD3>split</KEYWORD3>
- <KEYWORD3>lsmo</KEYWORD3>
- <KEYWORD3>clear</KEYWORD3>
- <KEYWORD3>pyra</KEYWORD3>
- <KEYWORD3>timp</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
- <KEYWORD3>defa</KEYWORD3>
-
- <!-- MOVE command -->
- <KEYWORD3>p</KEYWORD3>
-
- <!-- MP, MPDATA commands -->
- <KEYWORD3>ex</KEYWORD3>
- <KEYWORD3>ey</KEYWORD3>
- <KEYWORD3>ez</KEYWORD3>
- <KEYWORD3>alpx</KEYWORD3>
- <KEYWORD3>alpy</KEYWORD3>
- <KEYWORD3>alpz</KEYWORD3>
- <KEYWORD3>reft</KEYWORD3>
- <KEYWORD3>prxy</KEYWORD3>
- <KEYWORD3>pryz</KEYWORD3>
- <KEYWORD3>prxz</KEYWORD3>
- <KEYWORD3>nuxy</KEYWORD3>
- <KEYWORD3>nuyz</KEYWORD3>
- <KEYWORD3>nuzx</KEYWORD3>
- <KEYWORD3>gxy</KEYWORD3>
- <KEYWORD3>gyz</KEYWORD3>
- <KEYWORD3>gxz</KEYWORD3>
- <KEYWORD3>damp</KEYWORD3>
- <KEYWORD3>mu</KEYWORD3>
- <KEYWORD3>dens</KEYWORD3>
- <KEYWORD3>c</KEYWORD3>
- <KEYWORD3>enth</KEYWORD3>
- <KEYWORD3>kxx</KEYWORD3>
- <KEYWORD3>kyy</KEYWORD3>
- <KEYWORD3>kzz</KEYWORD3>
- <KEYWORD3>hf</KEYWORD3>
- <KEYWORD3>emis</KEYWORD3>
- <KEYWORD3>qrate</KEYWORD3>
- <KEYWORD3>visc</KEYWORD3>
- <KEYWORD3>sonc</KEYWORD3>
- <KEYWORD3>rsvx</KEYWORD3>
- <KEYWORD3>rsvy</KEYWORD3>
- <KEYWORD3>rsvz</KEYWORD3>
- <KEYWORD3>perx</KEYWORD3>
- <KEYWORD3>pery</KEYWORD3>
- <KEYWORD3>perz</KEYWORD3>
- <KEYWORD3>murx</KEYWORD3>
- <KEYWORD3>mury</KEYWORD3>
- <KEYWORD3>murz</KEYWORD3>
- <KEYWORD3>mgxx</KEYWORD3>
- <KEYWORD3>mgyy</KEYWORD3>
- <KEYWORD3>mgzz</KEYWORD3>
- <KEYWORD3>lsst</KEYWORD3>
-
- <!-- MPCHG, MPDELE commands -->
- <KEYWORD3>all</KEYWORD3>
-
- <!-- /MPLIB command -->
- <KEYWORD3>read</KEYWORD3>
- <KEYWORD3>write</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
-
- <!-- MPLIST command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>evlt</KEYWORD3>
-
- <!-- MSADV command -->
- <KEYWORD3>msu</KEYWORD3>
- <KEYWORD3>supg</KEYWORD3>
-
- <!-- MSCAP command -->
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
-
- <!-- *MSG command -->
- <KEYWORD3>info</KEYWORD3>
- <KEYWORD3>note</KEYWORD3>
- <KEYWORD3>warn</KEYWORD3>
- <KEYWORD3>error</KEYWORD3>
- <KEYWORD3>fatal</KEYWORD3>
- <KEYWORD3>ui</KEYWORD3>
-
- <!-- MSHAPE command -->
- <KEYWORD3>2d</KEYWORD3>
- <KEYWORD3>3d</KEYWORD3>
-
- <!-- MSPROP command -->
- <KEYWORD3>dens</KEYWORD3>
- <KEYWORD3>visc</KEYWORD3>
- <KEYWORD3>cond</KEYWORD3>
- <KEYWORD3>mdif</KEYWORD3>
- <KEYWORD3>spht</KEYWORD3>
- <KEYWORD3>constant</KEYWORD3>
- <KEYWORD3>liquid</KEYWORD3>
- <KEYWORD3>gas</KEYWORD3>
-
- <!-- /MSTART command -->
- <KEYWORD3>main</KEYWORD3>
- <KEYWORD3>input</KEYWORD3>
- <KEYWORD3>grph</KEYWORD3>
- <KEYWORD3>tool</KEYWORD3>
- <KEYWORD3>zoom</KEYWORD3>
- <KEYWORD3>work</KEYWORD3>
- <KEYWORD3>wpset</KEYWORD3>
- <KEYWORD3>abbr</KEYWORD3>
- <KEYWORD3>parm</KEYWORD3>
- <KEYWORD3>sele</KEYWORD3>
- <KEYWORD3>anno</KEYWORD3>
- <KEYWORD3>hard</KEYWORD3>
- <KEYWORD3>help</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
-
- <!-- MSVARY command -->
- <KEYWORD3>dens</KEYWORD3>
- <KEYWORD3>visc</KEYWORD3>
- <KEYWORD3>cond</KEYWORD3>
- <KEYWORD3>mdif</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
-
- <!-- MXPAND command -->
- <KEYWORD3>no</KEYWORD3>
- <KEYWORD3>yes</KEYWORD3>
-
- <!-- N, NDELE, NDIST, NGEN, NKPT commands -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
-
- <!-- NLGEOM, NOORDER commands -->
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
-
- <!-- NLIST, NMODIF commands -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
- <KEYWORD3>coord</KEYWORD3>
-
- <!-- NREFINE, NROTAT, NSCALE commands -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>smooth</KEYWORD3>
- <KEYWORD3>clean</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
-
- <!-- NRLSUM command -->
- <KEYWORD3>disp</KEYWORD3>
- <KEYWORD3>velo</KEYWORD3>
- <KEYWORD3>acel</KEYWORD3>
-
- <!-- NROPT command -->
- <KEYWORD3>auto</KEYWORD3>
- <KEYWORD3>full</KEYWORD3>
- <KEYWORD3>modi</KEYWORD3>
- <KEYWORD3>init</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
-
- <!-- NSEL, NSOL, NSORT commands -->
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>,r</KEYWORD3>
- <KEYWORD3>,a</KEYWORD3>
- <KEYWORD3>u</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>none</KEYWORD3>
- <KEYWORD3>inve</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
- <KEYWORD3>node</KEYWORD3>
- <KEYWORD3>ext</KEYWORD3>
- <KEYWORD3>loc</KEYWORD3>
- <KEYWORD3>x</KEYWORD3>
- <KEYWORD3>y</KEYWORD3>
- <KEYWORD3>z</KEYWORD3>
- <KEYWORD3>ang</KEYWORD3>
- <KEYWORD3>xy</KEYWORD3>
- <KEYWORD3>yz</KEYWORD3>
- <KEYWORD3>zx</KEYWORD3>
- <KEYWORD3>,m</KEYWORD3>
- <KEYWORD3>,cp</KEYWORD3>
- <KEYWORD3>,ce</KEYWORD3>
- <KEYWORD3>,d</KEYWORD3>
- <KEYWORD3>u</KEYWORD3>
- <KEYWORD3>ux</KEYWORD3>
- <KEYWORD3>uy</KEYWORD3>
- <KEYWORD3>uz</KEYWORD3>
- <KEYWORD3>rot</KEYWORD3>
- <KEYWORD3>rotx</KEYWORD3>
- <KEYWORD3>roty</KEYWORD3>
- <KEYWORD3>rotz</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>volt</KEYWORD3>
- <KEYWORD3>mag</KEYWORD3>
- <KEYWORD3>v</KEYWORD3>
- <KEYWORD3>vx</KEYWORD3>
- <KEYWORD3>vy</KEYWORD3>
- <KEYWORD3>vz</KEYWORD3>
- <KEYWORD3>,a</KEYWORD3>
- <KEYWORD3>ax</KEYWORD3>
- <KEYWORD3>ay</KEYWORD3>
- <KEYWORD3>az</KEYWORD3>
- <KEYWORD3>curr</KEYWORD3>
- <KEYWORD3>emf</KEYWORD3>
- <KEYWORD3>enke</KEYWORD3>
- <KEYWORD3>ends</KEYWORD3>
- <KEYWORD3>,f</KEYWORD3>
- <KEYWORD3>fx</KEYWORD3>
- <KEYWORD3>fy</KEYWORD3>
- <KEYWORD3>fz</KEYWORD3>
- <KEYWORD3>,m</KEYWORD3>
- <KEYWORD3>mx</KEYWORD3>
- <KEYWORD3>my</KEYWORD3>
- <KEYWORD3>mz</KEYWORD3>
- <KEYWORD3>heat</KEYWORD3>
- <KEYWORD3>flow</KEYWORD3>
- <KEYWORD3>amps</KEYWORD3>
- <KEYWORD3>flux</KEYWORD3>
- <KEYWORD3>csg</KEYWORD3>
- <KEYWORD3>csgx</KEYWORD3>
- <KEYWORD3>csgy</KEYWORD3>
- <KEYWORD3>csgz</KEYWORD3>
- <KEYWORD3>chrg</KEYWORD3>
- <KEYWORD3>chrgd</KEYWORD3>
- <KEYWORD3>,bf</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>flue</KEYWORD3>
- <KEYWORD3>hgen</KEYWORD3>
- <KEYWORD3>js</KEYWORD3>
- <KEYWORD3>jsx</KEYWORD3>
- <KEYWORD3>jsy</KEYWORD3>
- <KEYWORD3>jsz</KEYWORD3>
- <KEYWORD3>mvdi</KEYWORD3>
- <KEYWORD3>int</KEYWORD3>
- <KEYWORD3>eqv</KEYWORD3>
- <KEYWORD3>epto</KEYWORD3>
- <KEYWORD3>epel</KEYWORD3>
- <KEYWORD3>eppl</KEYWORD3>
- <KEYWORD3>epcr</KEYWORD3>
- <KEYWORD3>epth</KEYWORD3>
- <KEYWORD3>epsw</KEYWORD3>
- <KEYWORD3>nl</KEYWORD3>
- <KEYWORD3>sepl</KEYWORD3>
- <KEYWORD3>srat</KEYWORD3>
- <KEYWORD3>hpres</KEYWORD3>
- <KEYWORD3>epeq</KEYWORD3>
- <KEYWORD3>psv</KEYWORD3>
- <KEYWORD3>plwk</KEYWORD3>
- <KEYWORD3>cont</KEYWORD3>
- <KEYWORD3>pene</KEYWORD3>
- <KEYWORD3>sfric</KEYWORD3>
- <KEYWORD3>stot</KEYWORD3>
- <KEYWORD3>slide</KEYWORD3>
- <KEYWORD3>tg</KEYWORD3>
- <KEYWORD3>tf</KEYWORD3>
- <KEYWORD3>pg</KEYWORD3>
- <KEYWORD3>ef</KEYWORD3>
- <KEYWORD3>,d</KEYWORD3>
- <KEYWORD3>h</KEYWORD3>
- <KEYWORD3>b</KEYWORD3>
- <KEYWORD3>fmag</KEYWORD3>
- <KEYWORD3>topo</KEYWORD3>
- <KEYWORD3>ttot</KEYWORD3>
- <KEYWORD3>hflu</KEYWORD3>
- <KEYWORD3>hflm</KEYWORD3>
- <KEYWORD3>cond</KEYWORD3>
- <KEYWORD3>pcoe</KEYWORD3>
- <KEYWORD3>ptot</KEYWORD3>
- <KEYWORD3>mach</KEYWORD3>
- <KEYWORD3>strm</KEYWORD3>
- <KEYWORD3>dens</KEYWORD3>
- <KEYWORD3>visc</KEYWORD3>
- <KEYWORD3>evis</KEYWORD3>
- <KEYWORD3>cmuv</KEYWORD3>
- <KEYWORD3>econ</KEYWORD3>
- <KEYWORD3>yplu</KEYWORD3>
- <KEYWORD3>tauw</KEYWORD3>
-
- <!-- NSLA, NSLE, NSLK, NSLL, NSLV commands -->
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>,r</KEYWORD3>
- <KEYWORD3>,a</KEYWORD3>
- <KEYWORD3>u</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>active</KEYWORD3>
- <KEYWORD3>inactive</KEYWORD3>
- <KEYWORD3>corner</KEYWORD3>
- <KEYWORD3>mid</KEYWORD3>
-
- <!-- NSUBST command -->
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
-
- <!-- NSYM command -->
- <KEYWORD3>x</KEYWORD3>
- <KEYWORD3>y</KEYWORD3>
- <KEYWORD3>z</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
-
- <!-- NUMCMP, NUMMRG, NUMOFF, NUMSTR commands -->
- <KEYWORD3>node</KEYWORD3>
- <KEYWORD3>elem</KEYWORD3>
- <KEYWORD3>kp</KEYWORD3>
- <KEYWORD3>line</KEYWORD3>
- <KEYWORD3>area</KEYWORD3>
- <KEYWORD3>volu</KEYWORD3>
- <KEYWORD3>,mat</KEYWORD3>
- <KEYWORD3>,type</KEYWORD3>
- <KEYWORD3>,real</KEYWORD3>
- <KEYWORD3>,cp</KEYWORD3>
- <KEYWORD3>,ce</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>low</KEYWORD3>
- <KEYWORD3>high</KEYWORD3>
- <KEYWORD3>,csys</KEYWORD3>
- <KEYWORD3>defa</KEYWORD3>
-
- <!-- NUMEXP command -->
- <KEYWORD3>yes</KEYWORD3>
- <KEYWORD3>no</KEYWORD3>
-
- <!-- NWPLAN command -->
- <KEYWORD3>p</KEYWORD3>
-
- <!-- OPDEL, OPLIST, OPRFA, OPRGR, OPRSW commands -->
- <KEYWORD3>all</KEYWORD3>
-
- <!-- OPFACT command -->
- <KEYWORD3>full</KEYWORD3>
-
- <!-- OPGRAD, OPSWEEP commands -->
- <KEYWORD3>best</KEYWORD3>
- <KEYWORD3>last</KEYWORD3>
- <KEYWORD3>,n</KEYWORD3>
-
- <!-- OPKEEP commmand -->
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
-
- <!-- OPLFA command -->
- <KEYWORD3>main</KEYWORD3>
- <KEYWORD3>2fac</KEYWORD3>
- <KEYWORD3>3fac</KEYWORD3>
-
- <!-- OPLOOP command -->
- <KEYWORD3>top</KEYWORD3>
- <KEYWORD3>prep</KEYWORD3>
- <KEYWORD3>ignore</KEYWORD3>
- <KEYWORD3>process</KEYWORD3>
- <KEYWORD3>scalar</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
-
- <!-- OPNCONTROL command -->
- <KEYWORD3>temp</KEYWORD3>
-
- <!-- OPPRNT command -->
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
- <KEYWORD3>full</KEYWORD3>
-
- <!-- OPTYPE command -->
- <KEYWORD3>subp</KEYWORD3>
- <KEYWORD3>first</KEYWORD3>
- <KEYWORD3>rand</KEYWORD3>
- <KEYWORD3>run</KEYWORD3>
- <KEYWORD3>fact</KEYWORD3>
- <KEYWORD3>grad</KEYWORD3>
- <KEYWORD3>sweep</KEYWORD3>
- <KEYWORD3>user</KEYWORD3>
-
- <!-- OPVAR command -->
- <KEYWORD3>dv</KEYWORD3>
- <KEYWORD3>sv</KEYWORD3>
- <KEYWORD3>obj</KEYWORD3>
- <KEYWORD3>del</KEYWORD3>
-
- <!-- OUTPR command -->
- <KEYWORD3>basic</KEYWORD3>
- <KEYWORD3>nsol</KEYWORD3>
- <KEYWORD3>rsol</KEYWORD3>
- <KEYWORD3>esol</KEYWORD3>
- <KEYWORD3>nload</KEYWORD3>
- <KEYWORD3>veng</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>none</KEYWORD3>
- <KEYWORD3>last</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
- <KEYWORD3>erase</KEYWORD3>
-
- <!-- /OUTPUT command -->
- <KEYWORD3>term</KEYWORD3>
- <KEYWORD3>append</KEYWORD3>
-
- <!-- OUTRES command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>basic</KEYWORD3>
- <KEYWORD3>nsol</KEYWORD3>
- <KEYWORD3>rsol</KEYWORD3>
- <KEYWORD3>esol</KEYWORD3>
- <KEYWORD3>nload</KEYWORD3>
- <KEYWORD3>strs</KEYWORD3>
- <KEYWORD3>epel</KEYWORD3>
- <KEYWORD3>epth</KEYWORD3>
- <KEYWORD3>eppl</KEYWORD3>
- <KEYWORD3>epcr</KEYWORD3>
- <KEYWORD3>fgrad</KEYWORD3>
- <KEYWORD3>fflux</KEYWORD3>
- <KEYWORD3>misc</KEYWORD3>
- <KEYWORD3>none</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>last</KEYWORD3>
-
- <!-- PADELE command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>name</KEYWORD3>
-
- <!-- PAGET, PAPUT commands -->
- <KEYWORD3>points</KEYWORD3>
- <KEYWORD3>table</KEYWORD3>
- <KEYWORD3>label</KEYWORD3>
-
- <!-- PARESU command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>path</KEYWORD3>
-
- <!-- PARRES command -->
- <KEYWORD3>new</KEYWORD3>
- <KEYWORD3>change</KEYWORD3>
-
- <!-- PARSAV command -->
- <KEYWORD3>scalar</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
-
- <!-- PASAVE command -->
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
-
- <!-- /PBC command -->
- <KEYWORD3>u</KEYWORD3>
- <KEYWORD3>ux</KEYWORD3>
- <KEYWORD3>uy</KEYWORD3>
- <KEYWORD3>uz</KEYWORD3>
- <KEYWORD3>rot</KEYWORD3>
- <KEYWORD3>rotx</KEYWORD3>
- <KEYWORD3>roty</KEYWORD3>
- <KEYWORD3>rotz</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>v</KEYWORD3>
- <KEYWORD3>vx</KEYWORD3>
- <KEYWORD3>vy</KEYWORD3>
- <KEYWORD3>vz</KEYWORD3>
- <KEYWORD3>sp01</KEYWORD3>
- <KEYWORD3>sp02</KEYWORD3>
- <KEYWORD3>sp03</KEYWORD3>
- <KEYWORD3>sp04</KEYWORD3>
- <KEYWORD3>sp05</KEYWORD3>
- <KEYWORD3>sp06</KEYWORD3>
- <KEYWORD3>enke</KEYWORD3>
- <KEYWORD3>ends</KEYWORD3>
- <KEYWORD3>volt</KEYWORD3>
- <KEYWORD3>mag</KEYWORD3>
- <KEYWORD3>,a</KEYWORD3>
- <KEYWORD3>chrg</KEYWORD3>
- <KEYWORD3>,f</KEYWORD3>
- <KEYWORD3>forc</KEYWORD3>
- <KEYWORD3>fx</KEYWORD3>
- <KEYWORD3>fy</KEYWORD3>
- <KEYWORD3>fz</KEYWORD3>
- <KEYWORD3>,m</KEYWORD3>
- <KEYWORD3>mome</KEYWORD3>
- <KEYWORD3>mx</KEYWORD3>
- <KEYWORD3>my</KEYWORD3>
- <KEYWORD3>mz</KEYWORD3>
- <KEYWORD3>heat</KEYWORD3>
- <KEYWORD3>flow</KEYWORD3>
- <KEYWORD3>amps</KEYWORD3>
- <KEYWORD3>flux</KEYWORD3>
- <KEYWORD3>csg</KEYWORD3>
- <KEYWORD3>mast</KEYWORD3>
- <KEYWORD3>,cp</KEYWORD3>
- <KEYWORD3>,ce</KEYWORD3>
- <KEYWORD3>nfor</KEYWORD3>
- <KEYWORD3>nmom</KEYWORD3>
- <KEYWORD3>rfor</KEYWORD3>
- <KEYWORD3>rmom</KEYWORD3>
- <KEYWORD3>path</KEYWORD3>
- <KEYWORD3>acel</KEYWORD3>
- <KEYWORD3>acelx</KEYWORD3>
- <KEYWORD3>acely</KEYWORD3>
- <KEYWORD3>acelz</KEYWORD3>
- <KEYWORD3>omeg</KEYWORD3>
- <KEYWORD3>omegx</KEYWORD3>
- <KEYWORD3>omegy</KEYWORD3>
- <KEYWORD3>omegz</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
-
- <!-- /PBF command -->
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>flue</KEYWORD3>
- <KEYWORD3>hgen</KEYWORD3>
- <KEYWORD3>js</KEYWORD3>
- <KEYWORD3>jsx</KEYWORD3>
- <KEYWORD3>jsy</KEYWORD3>
- <KEYWORD3>jsz</KEYWORD3>
- <KEYWORD3>phase</KEYWORD3>
- <KEYWORD3>mvdi</KEYWORD3>
- <KEYWORD3>chrgd</KEYWORD3>
- <KEYWORD3>vltg</KEYWORD3>
- <KEYWORD3>forc</KEYWORD3>
-
- <!-- PCALC command -->
- <KEYWORD3>add</KEYWORD3>
- <KEYWORD3>mult</KEYWORD3>
- <KEYWORD3>div</KEYWORD3>
- <KEYWORD3>exp</KEYWORD3>
- <KEYWORD3>deri</KEYWORD3>
- <KEYWORD3>intg</KEYWORD3>
- <KEYWORD3>sin</KEYWORD3>
- <KEYWORD3>cos</KEYWORD3>
- <KEYWORD3>asin</KEYWORD3>
- <KEYWORD3>acos</KEYWORD3>
- <KEYWORD3>log</KEYWORD3>
-
- <!-- PCONV command -->
- <KEYWORD3>stat</KEYWORD3>
- <KEYWORD3>erase</KEYWORD3>
- <KEYWORD3>dele</KEYWORD3>
- <KEYWORD3>se</KEYWORD3>
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>epel</KEYWORD3>
- <KEYWORD3>u</KEYWORD3>
- <KEYWORD3>rot</KEYWORD3>
- <KEYWORD3>eqv</KEYWORD3>
- <KEYWORD3>sum</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
- <KEYWORD3>top</KEYWORD3>
- <KEYWORD3>mid</KEYWORD3>
- <KEYWORD3>bot</KEYWORD3>
- <KEYWORD3>x</KEYWORD3>
- <KEYWORD3>y</KEYWORD3>
- <KEYWORD3>z</KEYWORD3>
- <KEYWORD3>xy</KEYWORD3>
- <KEYWORD3>yz</KEYWORD3>
- <KEYWORD3>xz</KEYWORD3>
- <KEYWORD3>int</KEYWORD3>
-
- <!-- /PCOPY command -->
- <KEYWORD3>now</KEYWORD3>
-
- <!-- PDEF command -->
- <KEYWORD3>avg</KEYWORD3>
- <KEYWORD3>noav</KEYWORD3>
- <KEYWORD3>u</KEYWORD3>
- <KEYWORD3>x</KEYWORD3>
- <KEYWORD3>y</KEYWORD3>
- <KEYWORD3>z</KEYWORD3>
- <KEYWORD3>sum</KEYWORD3>
- <KEYWORD3>rot</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>volt</KEYWORD3>
- <KEYWORD3>mag</KEYWORD3>
- <KEYWORD3>v</KEYWORD3>
- <KEYWORD3>,a</KEYWORD3>
- <KEYWORD3>curr</KEYWORD3>
- <KEYWORD3>emf</KEYWORD3>
- <KEYWORD3>enke</KEYWORD3>
- <KEYWORD3>ends</KEYWORD3>
- <KEYWORD3>xy</KEYWORD3>
- <KEYWORD3>yz</KEYWORD3>
- <KEYWORD3>xz</KEYWORD3>
- <KEYWORD3>eqv</KEYWORD3>
- <KEYWORD3>epto</KEYWORD3>
- <KEYWORD3>epel</KEYWORD3>
- <KEYWORD3>eppl</KEYWORD3>
- <KEYWORD3>epcr</KEYWORD3>
- <KEYWORD3>epth</KEYWORD3>
- <KEYWORD3>epsw</KEYWORD3>
- <KEYWORD3>nl</KEYWORD3>
- <KEYWORD3>sepl</KEYWORD3>
- <KEYWORD3>srat</KEYWORD3>
- <KEYWORD3>hpres</KEYWORD3>
- <KEYWORD3>epeq</KEYWORD3>
- <KEYWORD3>psv</KEYWORD3>
- <KEYWORD3>plwk</KEYWORD3>
- <KEYWORD3>tg</KEYWORD3>
- <KEYWORD3>tf</KEYWORD3>
- <KEYWORD3>pg</KEYWORD3>
- <KEYWORD3>ef</KEYWORD3>
- <KEYWORD3>,d</KEYWORD3>
- <KEYWORD3>h</KEYWORD3>
- <KEYWORD3>b</KEYWORD3>
- <KEYWORD3>fmag</KEYWORD3>
- <KEYWORD3>etab</KEYWORD3>
- <KEYWORD3>bfe</KEYWORD3>
- <KEYWORD3>ttot</KEYWORD3>
- <KEYWORD3>hflu</KEYWORD3>
- <KEYWORD3>hflm</KEYWORD3>
- <KEYWORD3>cond</KEYWORD3>
- <KEYWORD3>pcoe</KEYWORD3>
- <KEYWORD3>ptot</KEYWORD3>
- <KEYWORD3>mach</KEYWORD3>
- <KEYWORD3>strm</KEYWORD3>
- <KEYWORD3>dens</KEYWORD3>
- <KEYWORD3>visc</KEYWORD3>
- <KEYWORD3>evis</KEYWORD3>
- <KEYWORD3>cmuv</KEYWORD3>
- <KEYWORD3>econ</KEYWORD3>
- <KEYWORD3>yplu</KEYWORD3>
- <KEYWORD3>tauw</KEYWORD3>
- <KEYWORD3>spht</KEYWORD3>
-
- <!-- PDRAG command -->
- <KEYWORD3>x</KEYWORD3>
- <KEYWORD3>y</KEYWORD3>
- <KEYWORD3>z</KEYWORD3>
-
- <!-- PEXCLUDE command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
-
- <!-- PFACT command -->
- <KEYWORD3>base</KEYWORD3>
- <KEYWORD3>node</KEYWORD3>
- <KEYWORD3>wave</KEYWORD3>
- <KEYWORD3>spat</KEYWORD3>
-
- <!-- PHYSICS command -->
- <KEYWORD3>write</KEYWORD3>
- <KEYWORD3>read</KEYWORD3>
- <KEYWORD3>list</KEYWORD3>
- <KEYWORD3>delete</KEYWORD3>
- <KEYWORD3>clear</KEYWORD3>
- <KEYWORD3>status</KEYWORD3>
-
- <!-- PINCLUDE command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
-
- <!-- PIVCHECK command -->
- <KEYWORD3>on</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
-
- <!-- PLCONV command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>se</KEYWORD3>
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>epel</KEYWORD3>
- <KEYWORD3>u</KEYWORD3>
- <KEYWORD3>rot</KEYWORD3>
- <KEYWORD3>top</KEYWORD3>
- <KEYWORD3>mid</KEYWORD3>
- <KEYWORD3>bot</KEYWORD3>
- <KEYWORD3>xy</KEYWORD3>
- <KEYWORD3>yz</KEYWORD3>
- <KEYWORD3>xz</KEYWORD3>
- <KEYWORD3>int</KEYWORD3>
- <KEYWORD3>eqv</KEYWORD3>
- <KEYWORD3>epel</KEYWORD3>
- <KEYWORD3>u</KEYWORD3>
- <KEYWORD3>rot</KEYWORD3>
-
- <!-- PLESOL command -->
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>x</KEYWORD3>
- <KEYWORD3>y</KEYWORD3>
- <KEYWORD3>z</KEYWORD3>
- <KEYWORD3>xy</KEYWORD3>
- <KEYWORD3>yz</KEYWORD3>
- <KEYWORD3>xz</KEYWORD3>
- <KEYWORD3>int</KEYWORD3>
- <KEYWORD3>eqv</KEYWORD3>
- <KEYWORD3>epto</KEYWORD3>
- <KEYWORD3>epel</KEYWORD3>
- <KEYWORD3>eppl</KEYWORD3>
- <KEYWORD3>epcr</KEYWORD3>
- <KEYWORD3>epth</KEYWORD3>
- <KEYWORD3>epsw</KEYWORD3>
- <KEYWORD3>nl</KEYWORD3>
- <KEYWORD3>sepl</KEYWORD3>
- <KEYWORD3>srat</KEYWORD3>
- <KEYWORD3>hpres</KEYWORD3>
- <KEYWORD3>epeq</KEYWORD3>
- <KEYWORD3>psv</KEYWORD3>
- <KEYWORD3>plwk</KEYWORD3>
- <KEYWORD3>cont</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
- <KEYWORD3>pene</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>sfric</KEYWORD3>
- <KEYWORD3>stot</KEYWORD3>
- <KEYWORD3>slide</KEYWORD3>
- <KEYWORD3>gap</KEYWORD3>
- <KEYWORD3>tg</KEYWORD3>
- <KEYWORD3>tf</KEYWORD3>
- <KEYWORD3>pg</KEYWORD3>
- <KEYWORD3>ef</KEYWORD3>
- <KEYWORD3>,d</KEYWORD3>
- <KEYWORD3>h</KEYWORD3>
- <KEYWORD3>b</KEYWORD3>
- <KEYWORD3>fmag</KEYWORD3>
- <KEYWORD3>serr</KEYWORD3>
- <KEYWORD3>sdsg</KEYWORD3>
- <KEYWORD3>terr</KEYWORD3>
- <KEYWORD3>tdsg</KEYWORD3>
- <KEYWORD3>,f</KEYWORD3>
- <KEYWORD3>,m</KEYWORD3>
- <KEYWORD3>heat</KEYWORD3>
- <KEYWORD3>flow</KEYWORD3>
- <KEYWORD3>amps</KEYWORD3>
- <KEYWORD3>flux</KEYWORD3>
- <KEYWORD3>vf</KEYWORD3>
- <KEYWORD3>csg</KEYWORD3>
- <KEYWORD3>sene</KEYWORD3>
- <KEYWORD3>tene</KEYWORD3>
- <KEYWORD3>kene</KEYWORD3>
- <KEYWORD3>jheat</KEYWORD3>
- <KEYWORD3>js</KEYWORD3>
- <KEYWORD3>jt</KEYWORD3>
- <KEYWORD3>mre</KEYWORD3>
- <KEYWORD3>volu</KEYWORD3>
- <KEYWORD3>cent</KEYWORD3>
- <KEYWORD3>bfe</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>smisc</KEYWORD3>
- <KEYWORD3>nmisc</KEYWORD3>
- <KEYWORD3>topo</KEYWORD3>
-
- <!-- PLETAB command -->
- <KEYWORD3>noav</KEYWORD3>
- <KEYWORD3>avg</KEYWORD3>
-
- <!-- PLNSOL command -->
- <KEYWORD3>u</KEYWORD3>
- <KEYWORD3>x</KEYWORD3>
- <KEYWORD3>y</KEYWORD3>
- <KEYWORD3>z</KEYWORD3>
- <KEYWORD3>sum</KEYWORD3>
- <KEYWORD3>rot</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>volt</KEYWORD3>
- <KEYWORD3>mag</KEYWORD3>
- <KEYWORD3>v</KEYWORD3>
- <KEYWORD3>y</KEYWORD3>
- <KEYWORD3>enke</KEYWORD3>
- <KEYWORD3>ends</KEYWORD3>
- <KEYWORD3>sp01</KEYWORD3>
- <KEYWORD3>sp02</KEYWORD3>
- <KEYWORD3>sp03</KEYWORD3>
- <KEYWORD3>sp04</KEYWORD3>
- <KEYWORD3>sp05</KEYWORD3>
- <KEYWORD3>sp06</KEYWORD3>
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>int</KEYWORD3>
- <KEYWORD3>eqv</KEYWORD3>
- <KEYWORD3>epto</KEYWORD3>
- <KEYWORD3>xy</KEYWORD3>
- <KEYWORD3>yz</KEYWORD3>
- <KEYWORD3>xz</KEYWORD3>
- <KEYWORD3>epel</KEYWORD3>
- <KEYWORD3>eppl</KEYWORD3>
- <KEYWORD3>epcr</KEYWORD3>
- <KEYWORD3>epth</KEYWORD3>
- <KEYWORD3>epsw</KEYWORD3>
- <KEYWORD3>nl</KEYWORD3>
- <KEYWORD3>sepl</KEYWORD3>
- <KEYWORD3>srat</KEYWORD3>
- <KEYWORD3>hpres</KEYWORD3>
- <KEYWORD3>epeq</KEYWORD3>
- <KEYWORD3>psv</KEYWORD3>
- <KEYWORD3>plwk</KEYWORD3>
- <KEYWORD3>cont</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
- <KEYWORD3>pene</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>sfric</KEYWORD3>
- <KEYWORD3>stot</KEYWORD3>
- <KEYWORD3>slide</KEYWORD3>
- <KEYWORD3>gap</KEYWORD3>
- <KEYWORD3>tg</KEYWORD3>
- <KEYWORD3>tf</KEYWORD3>
- <KEYWORD3>pg</KEYWORD3>
- <KEYWORD3>ef</KEYWORD3>
- <KEYWORD3>,d</KEYWORD3>
- <KEYWORD3>h</KEYWORD3>
- <KEYWORD3>b</KEYWORD3>
- <KEYWORD3>fmag</KEYWORD3>
- <KEYWORD3>bfe</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>topo</KEYWORD3>
- <KEYWORD3>ttot</KEYWORD3>
- <KEYWORD3>hflu</KEYWORD3>
- <KEYWORD3>hflm</KEYWORD3>
- <KEYWORD3>cond</KEYWORD3>
- <KEYWORD3>pcoe</KEYWORD3>
- <KEYWORD3>ptot</KEYWORD3>
- <KEYWORD3>mach</KEYWORD3>
- <KEYWORD3>strm</KEYWORD3>
- <KEYWORD3>dens</KEYWORD3>
- <KEYWORD3>visc</KEYWORD3>
- <KEYWORD3>spht</KEYWORD3>
- <KEYWORD3>evis</KEYWORD3>
- <KEYWORD3>cmuv</KEYWORD3>
- <KEYWORD3>econ</KEYWORD3>
- <KEYWORD3>yplu</KEYWORD3>
- <KEYWORD3>tauw</KEYWORD3>
- <KEYWORD3>lmd1</KEYWORD3>
- <KEYWORD3>lmd2</KEYWORD3>
- <KEYWORD3>lmd3</KEYWORD3>
- <KEYWORD3>lmd4</KEYWORD3>
- <KEYWORD3>lmd5</KEYWORD3>
- <KEYWORD3>lmd6</KEYWORD3>
- <KEYWORD3>emd1</KEYWORD3>
- <KEYWORD3>emd2</KEYWORD3>
- <KEYWORD3>emd3</KEYWORD3>
- <KEYWORD3>emd4</KEYWORD3>
- <KEYWORD3>emd5</KEYWORD3>
- <KEYWORD3>emd6</KEYWORD3>
-
- <!-- /PLOPTS command -->
- <KEYWORD3>leg1</KEYWORD3>
- <KEYWORD3>leg2</KEYWORD3>
- <KEYWORD3>info</KEYWORD3>
- <KEYWORD3>frame</KEYWORD3>
- <KEYWORD3>title</KEYWORD3>
- <KEYWORD3>minm</KEYWORD3>
- <KEYWORD3>logo</KEYWORD3>
- <KEYWORD3>wins</KEYWORD3>
- <KEYWORD3>wp</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
- <KEYWORD3>auto</KEYWORD3>
-
- <!-- PLOT command -->
- <KEYWORD3>all</KEYWORD3>
-
- <!-- PLPAGM command -->
- <KEYWORD3>node</KEYWORD3>
-
- <!-- PLPATH command -->
- <KEYWORD3>xg</KEYWORD3>
- <KEYWORD3>yg</KEYWORD3>
- <KEYWORD3>zg</KEYWORD3>
- <KEYWORD3>s</KEYWORD3>
-
- <!-- PLSECT command -->
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>x</KEYWORD3>
- <KEYWORD3>y</KEYWORD3>
- <KEYWORD3>z</KEYWORD3>
- <KEYWORD3>xy</KEYWORD3>
- <KEYWORD3>yz</KEYWORD3>
- <KEYWORD3>xz</KEYWORD3>
- <KEYWORD3>int</KEYWORD3>
- <KEYWORD3>eqv</KEYWORD3>
-
- <!-- PLTRAC command -->
- <KEYWORD3>fluid</KEYWORD3>
- <KEYWORD3>elec</KEYWORD3>
- <KEYWORD3>magn</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>v</KEYWORD3>
- <KEYWORD3>x</KEYWORD3>
- <KEYWORD3>y</KEYWORD3>
- <KEYWORD3>z</KEYWORD3>
- <KEYWORD3>sum</KEYWORD3>
- <KEYWORD3>enke</KEYWORD3>
- <KEYWORD3>ends</KEYWORD3>
- <KEYWORD3>ttot</KEYWORD3>
- <KEYWORD3>cond</KEYWORD3>
- <KEYWORD3>pcoe</KEYWORD3>
- <KEYWORD3>ptot</KEYWORD3>
- <KEYWORD3>mach</KEYWORD3>
- <KEYWORD3>strm</KEYWORD3>
- <KEYWORD3>dens</KEYWORD3>
- <KEYWORD3>visc</KEYWORD3>
- <KEYWORD3>spht</KEYWORD3>
- <KEYWORD3>evis</KEYWORD3>
- <KEYWORD3>cmuv</KEYWORD3>
- <KEYWORD3>econ</KEYWORD3>
- <KEYWORD3>volt</KEYWORD3>
-
- <!-- PLVECT command -->
- <KEYWORD3>rast</KEYWORD3>
- <KEYWORD3>vect</KEYWORD3>
- <KEYWORD3>elem</KEYWORD3>
- <KEYWORD3>node</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
- <KEYWORD3>u</KEYWORD3>
- <KEYWORD3>rot</KEYWORD3>
- <KEYWORD3>v</KEYWORD3>
- <KEYWORD3>,a</KEYWORD3>
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>epto</KEYWORD3>
- <KEYWORD3>epel</KEYWORD3>
- <KEYWORD3>eppl</KEYWORD3>
- <KEYWORD3>epcr</KEYWORD3>
- <KEYWORD3>epth</KEYWORD3>
- <KEYWORD3>tg</KEYWORD3>
- <KEYWORD3>tf</KEYWORD3>
- <KEYWORD3>pg</KEYWORD3>
- <KEYWORD3>ef</KEYWORD3>
- <KEYWORD3>,d</KEYWORD3>
- <KEYWORD3>h</KEYWORD3>
- <KEYWORD3>b</KEYWORD3>
- <KEYWORD3>fmag</KEYWORD3>
- <KEYWORD3>js</KEYWORD3>
- <KEYWORD3>jt</KEYWORD3>
-
- <!-- PMAP command -->
- <KEYWORD3>uniform</KEYWORD3>
- <KEYWORD3>accurate</KEYWORD3>
-
- <!-- /PMETH command -->
- <KEYWORD3>on</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
-
- <!-- /PNUM command -->
- <KEYWORD3>node</KEYWORD3>
- <KEYWORD3>elem</KEYWORD3>
- <KEYWORD3>,mat</KEYWORD3>
- <KEYWORD3>,type</KEYWORD3>
- <KEYWORD3>,real</KEYWORD3>
- <KEYWORD3>,esys</KEYWORD3>
- <KEYWORD3>loc</KEYWORD3>
- <KEYWORD3>kp</KEYWORD3>
- <KEYWORD3>line</KEYWORD3>
- <KEYWORD3>area</KEYWORD3>
- <KEYWORD3>volu</KEYWORD3>
- <KEYWORD3>sval</KEYWORD3>
- <KEYWORD3>tabnam</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
-
- <!-- POPT command -->
- <KEYWORD3>b31.1</KEYWORD3>
- <KEYWORD3>nc</KEYWORD3>
-
- <!-- PORTOPT command -->
- <KEYWORD3>coax</KEYWORD3>
- <KEYWORD3>te10</KEYWORD3>
- <KEYWORD3>te11circ</KEYWORD3>
- <KEYWORD3>tm01circ</KEYWORD3>
-
- <!-- PPATH command -->
- <KEYWORD3>pick</KEYWORD3>
-
- <!-- PRED command -->
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
-
- <!-- PRESOL command -->
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>epto</KEYWORD3>
- <KEYWORD3>epel</KEYWORD3>
- <KEYWORD3>eppl</KEYWORD3>
- <KEYWORD3>epcr</KEYWORD3>
- <KEYWORD3>epsw</KEYWORD3>
- <KEYWORD3>nl</KEYWORD3>
- <KEYWORD3>cont</KEYWORD3>
- <KEYWORD3>tg</KEYWORD3>
- <KEYWORD3>tf</KEYWORD3>
- <KEYWORD3>pg</KEYWORD3>
- <KEYWORD3>ef</KEYWORD3>
- <KEYWORD3>,d</KEYWORD3>
- <KEYWORD3>h</KEYWORD3>
- <KEYWORD3>b</KEYWORD3>
- <KEYWORD3>fmag</KEYWORD3>
- <KEYWORD3>,f</KEYWORD3>
- <KEYWORD3>,m</KEYWORD3>
- <KEYWORD3>heat</KEYWORD3>
- <KEYWORD3>flow</KEYWORD3>
- <KEYWORD3>amps</KEYWORD3>
- <KEYWORD3>flux</KEYWORD3>
- <KEYWORD3>vf</KEYWORD3>
- <KEYWORD3>csg</KEYWORD3>
- <KEYWORD3>forc</KEYWORD3>
- <KEYWORD3>bfe</KEYWORD3>
- <KEYWORD3>elem</KEYWORD3>
- <KEYWORD3>serr</KEYWORD3>
- <KEYWORD3>sdsg</KEYWORD3>
- <KEYWORD3>terr</KEYWORD3>
- <KEYWORD3>tdsg</KEYWORD3>
- <KEYWORD3>sene</KEYWORD3>
- <KEYWORD3>tene</KEYWORD3>
- <KEYWORD3>kene</KEYWORD3>
- <KEYWORD3>jheat</KEYWORD3>
- <KEYWORD3>js</KEYWORD3>
- <KEYWORD3>jt</KEYWORD3>
- <KEYWORD3>mre</KEYWORD3>
- <KEYWORD3>volu</KEYWORD3>
- <KEYWORD3>cent</KEYWORD3>
- <KEYWORD3>smisc</KEYWORD3>
- <KEYWORD3>nmisc</KEYWORD3>
- <KEYWORD3>topo</KEYWORD3>
-
- <!-- PRNLD, PRRFOR, PRRSOL commands -->
- <KEYWORD3>fx</KEYWORD3>
- <KEYWORD3>fy</KEYWORD3>
- <KEYWORD3>fz</KEYWORD3>
- <KEYWORD3>,f</KEYWORD3>
- <KEYWORD3>mx</KEYWORD3>
- <KEYWORD3>ym</KEYWORD3>
- <KEYWORD3>mz</KEYWORD3>
- <KEYWORD3>,m</KEYWORD3>
- <KEYWORD3>heat</KEYWORD3>
- <KEYWORD3>flow</KEYWORD3>
- <KEYWORD3>vfx</KEYWORD3>
- <KEYWORD3>vfy</KEYWORD3>
- <KEYWORD3>vfz</KEYWORD3>
- <KEYWORD3>vf</KEYWORD3>
- <KEYWORD3>amps</KEYWORD3>
- <KEYWORD3>curt</KEYWORD3>
- <KEYWORD3>vltg</KEYWORD3>
- <KEYWORD3>flux</KEYWORD3>
- <KEYWORD3>csgx</KEYWORD3>
- <KEYWORD3>csgy</KEYWORD3>
- <KEYWORD3>csgz</KEYWORD3>
- <KEYWORD3>csg</KEYWORD3>
-
- <!-- PRNSOL, PRSSOL commands -->
- <KEYWORD3>u</KEYWORD3>
- <KEYWORD3>x</KEYWORD3>
- <KEYWORD3>y</KEYWORD3>
- <KEYWORD3>z</KEYWORD3>
- <KEYWORD3>comp</KEYWORD3>
- <KEYWORD3>rot</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>volt</KEYWORD3>
- <KEYWORD3>mag</KEYWORD3>
- <KEYWORD3>v</KEYWORD3>
- <KEYWORD3>,a</KEYWORD3>
- <KEYWORD3>curr</KEYWORD3>
- <KEYWORD3>emf</KEYWORD3>
- <KEYWORD3>enke</KEYWORD3>
- <KEYWORD3>ends</KEYWORD3>
- <KEYWORD3>sp01</KEYWORD3>
- <KEYWORD3>sp02</KEYWORD3>
- <KEYWORD3>sp03</KEYWORD3>
- <KEYWORD3>sp04</KEYWORD3>
- <KEYWORD3>sp05</KEYWORD3>
- <KEYWORD3>sp06</KEYWORD3>
- <KEYWORD3>dof</KEYWORD3>
-
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>comp</KEYWORD3>
- <KEYWORD3>prin</KEYWORD3>
- <KEYWORD3>epto</KEYWORD3>
- <KEYWORD3>epel</KEYWORD3>
- <KEYWORD3>eppl</KEYWORD3>
- <KEYWORD3>epcr</KEYWORD3>
- <KEYWORD3>epth</KEYWORD3>
- <KEYWORD3>epsw</KEYWORD3>
- <KEYWORD3>nl</KEYWORD3>
- <KEYWORD3>cont</KEYWORD3>
- <KEYWORD3>tg</KEYWORD3>
- <KEYWORD3>tf</KEYWORD3>
- <KEYWORD3>pg</KEYWORD3>
- <KEYWORD3>ef</KEYWORD3>
- <KEYWORD3>,d</KEYWORD3>
- <KEYWORD3>h</KEYWORD3>
- <KEYWORD3>b</KEYWORD3>
- <KEYWORD3>fmag</KEYWORD3>
- <KEYWORD3>bfe</KEYWORD3>
- <KEYWORD3>topo</KEYWORD3>
-
- <KEYWORD3>ttot</KEYWORD3>
- <KEYWORD3>hflu</KEYWORD3>
- <KEYWORD3>hflm</KEYWORD3>
- <KEYWORD3>cond</KEYWORD3>
- <KEYWORD3>pcoe</KEYWORD3>
- <KEYWORD3>ptot</KEYWORD3>
- <KEYWORD3>mach</KEYWORD3>
- <KEYWORD3>strm</KEYWORD3>
- <KEYWORD3>dens</KEYWORD3>
- <KEYWORD3>visc</KEYWORD3>
- <KEYWORD3>spht</KEYWORD3>
- <KEYWORD3>evis</KEYWORD3>
- <KEYWORD3>cmuv</KEYWORD3>
- <KEYWORD3>econ</KEYWORD3>
- <KEYWORD3>yplu</KEYWORD3>
- <KEYWORD3>tauw</KEYWORD3>
- <KEYWORD3>lmd</KEYWORD3>
- <KEYWORD3>emd</KEYWORD3>
-
- <!-- PRVECT command -->
- <KEYWORD3>u</KEYWORD3>
- <KEYWORD3>rot</KEYWORD3>
- <KEYWORD3>v</KEYWORD3>
- <KEYWORD3>,a</KEYWORD3>
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>epto</KEYWORD3>
- <KEYWORD3>epel</KEYWORD3>
- <KEYWORD3>eppl</KEYWORD3>
- <KEYWORD3>epcr</KEYWORD3>
- <KEYWORD3>epth</KEYWORD3>
- <KEYWORD3>tg</KEYWORD3>
- <KEYWORD3>tf</KEYWORD3>
- <KEYWORD3>pg</KEYWORD3>
- <KEYWORD3>ef</KEYWORD3>
- <KEYWORD3>,d</KEYWORD3>
- <KEYWORD3>h</KEYWORD3>
- <KEYWORD3>b</KEYWORD3>
- <KEYWORD3>fmag</KEYWORD3>
- <KEYWORD3>js</KEYWORD3>
- <KEYWORD3>jt</KEYWORD3>
-
- <!-- PSCR command -->
- <KEYWORD3>cmap</KEYWORD3>
- <KEYWORD3>lwid</KEYWORD3>
- <KEYWORD3>color</KEYWORD3>
- <KEYWORD3>tranx</KEYWORD3>
- <KEYWORD3>trany</KEYWORD3>
- <KEYWORD3>rotate</KEYWORD3>
- <KEYWORD3>scale</KEYWORD3>
- <KEYWORD3>tiff</KEYWORD3>
- <KEYWORD3>epsi</KEYWORD3>
-
- <!-- PSDRES command -->
- <KEYWORD3>disp</KEYWORD3>
- <KEYWORD3>velo</KEYWORD3>
- <KEYWORD3>acel</KEYWORD3>
- <KEYWORD3>rel</KEYWORD3>
- <KEYWORD3>abs</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
-
- <!-- PSDUNIT command -->
- <KEYWORD3>disp</KEYWORD3>
- <KEYWORD3>velo</KEYWORD3>
- <KEYWORD3>acel</KEYWORD3>
- <KEYWORD3>accg</KEYWORD3>
- <KEYWORD3>forc</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
-
- <!-- /PSEARCH command -->
- <KEYWORD3>off</KEYWORD3>
-
- <!-- PSEL command -->
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>,r</KEYWORD3>
- <KEYWORD3>,a</KEYWORD3>
- <KEYWORD3>u</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>none</KEYWORD3>
- <KEYWORD3>inv</KEYWORD3>
-
- <!-- /PSF command -->
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>norm</KEYWORD3>
- <KEYWORD3>tanx</KEYWORD3>
- <KEYWORD3>tany</KEYWORD3>
- <KEYWORD3>conv</KEYWORD3>
- <KEYWORD3>hcoef</KEYWORD3>
- <KEYWORD3>tbulk</KEYWORD3>
- <KEYWORD3>rad</KEYWORD3>
- <KEYWORD3>emis</KEYWORD3>
- <KEYWORD3>tamb</KEYWORD3>
- <KEYWORD3>hflux</KEYWORD3>
- <KEYWORD3>fsi</KEYWORD3>
- <KEYWORD3>impd</KEYWORD3>
- <KEYWORD3>shld</KEYWORD3>
- <KEYWORD3>cond</KEYWORD3>
- <KEYWORD3>mur</KEYWORD3>
- <KEYWORD3>mxwf</KEYWORD3>
- <KEYWORD3>inf</KEYWORD3>
- <KEYWORD3>chrgs</KEYWORD3>
- <KEYWORD3>mci</KEYWORD3>
-
- <!-- PSOLVE command -->
- <KEYWORD3>cgsol</KEYWORD3>
- <KEYWORD3>eigdamp</KEYWORD3>
- <KEYWORD3>eigexp</KEYWORD3>
- <KEYWORD3>eigfull</KEYWORD3>
- <KEYWORD3>eigreduc</KEYWORD3>
- <KEYWORD3>eigunsym</KEYWORD3>
- <KEYWORD3>elform</KEYWORD3>
- <KEYWORD3>elprep</KEYWORD3>
- <KEYWORD3>redwrite</KEYWORD3>
- <KEYWORD3>triang</KEYWORD3>
-
- <!-- PSPRNG command -->
- <KEYWORD3>tran</KEYWORD3>
- <KEYWORD3>rot</KEYWORD3>
-
- <!-- PSTRES command -->
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
-
- <!-- /PSYMB command -->
- <KEYWORD3>cs</KEYWORD3>
- <KEYWORD3>ndir</KEYWORD3>
- <KEYWORD3>,esys</KEYWORD3>
- <KEYWORD3>ldir</KEYWORD3>
- <KEYWORD3>layr</KEYWORD3>
- <KEYWORD3>pcon</KEYWORD3>
- <KEYWORD3>econ</KEYWORD3>
- <KEYWORD3>dot</KEYWORD3>
- <KEYWORD3>xnod</KEYWORD3>
- <KEYWORD3>defa</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
-
- <!-- PTEMP command -->
- <KEYWORD3>none</KEYWORD3>
-
- <!-- PTXY command -->
- <KEYWORD3>stat</KEYWORD3>
- <KEYWORD3>dele</KEYWORD3>
-
- <!-- PUNIT command -->
- <KEYWORD3>ftin</KEYWORD3>
- <KEYWORD3>metric</KEYWORD3>
-
- <!-- PVECT command -->
- <KEYWORD3>norm</KEYWORD3>
- <KEYWORD3>tang</KEYWORD3>
- <KEYWORD3>radi</KEYWORD3>
-
- <!-- QUAD command -->
- <KEYWORD3>p</KEYWORD3>
-
- <!-- /RATIO command -->
- <KEYWORD3>all</KEYWORD3>
-
- <!-- RBE3 command -->
- <KEYWORD3>ux</KEYWORD3>
- <KEYWORD3>uy</KEYWORD3>
- <KEYWORD3>uz</KEYWORD3>
- <KEYWORD3>rotx</KEYWORD3>
- <KEYWORD3>roty</KEYWORD3>
- <KEYWORD3>rotz</KEYWORD3>
- <KEYWORD3>uxyz</KEYWORD3>
- <KEYWORD3>rxyz</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
-
- <!-- RDELE command -->
- <KEYWORD3>all</KEYWORD3>
-
- <!-- /REPLOT command -->
- <KEYWORD3>resize</KEYWORD3>
- <KEYWORD3>fast</KEYWORD3>
-
- <!-- REXPORT command -->
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>dyna</KEYWORD3>
-
- <!-- RFORCE command -->
- <KEYWORD3>p</KEYWORD3>
- <KEYWORD3>,f</KEYWORD3>
- <KEYWORD3>x</KEYWORD3>
- <KEYWORD3>y</KEYWORD3>
- <KEYWORD3>z</KEYWORD3>
- <KEYWORD3>,m</KEYWORD3>
- <KEYWORD3>heat</KEYWORD3>
- <KEYWORD3>flow</KEYWORD3>
- <KEYWORD3>amps</KEYWORD3>
- <KEYWORD3>flux</KEYWORD3>
- <KEYWORD3>vf</KEYWORD3>
- <KEYWORD3>csg</KEYWORD3>
- <KEYWORD3>vltg</KEYWORD3>
- <KEYWORD3>durt</KEYWORD3>
-
- <!-- /RGB command -->
- <KEYWORD3>index</KEYWORD3>
- <KEYWORD3>cntr</KEYWORD3>
-
- <!-- RIGID command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>ux</KEYWORD3>
- <KEYWORD3>uy</KEYWORD3>
- <KEYWORD3>uz</KEYWORD3>
- <KEYWORD3>rotx</KEYWORD3>
- <KEYWORD3>roty</KEYWORD3>
- <KEYWORD3>rotz</KEYWORD3>
- <KEYWORD3>none</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
-
- <!-- RIMPORT command -->
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>dyna</KEYWORD3>
- <KEYWORD3>elem</KEYWORD3>
- <KEYWORD3>stress</KEYWORD3>
-
- <!-- RLIST command -->
- <KEYWORD3>all</KEYWORD3>
-
- <!-- RSYS command -->
- <KEYWORD3>solu</KEYWORD3>
-
- <!-- SARPLOT command -->
- <KEYWORD3>factor</KEYWORD3>
- <KEYWORD3>area</KEYWORD3>
- <KEYWORD3>narrow</KEYWORD3>
-
- <!-- /SECLIB command -->
- <KEYWORD3>read</KEYWORD3>
- <KEYWORD3>status</KEYWORD3>
-
- <!-- SECOFFSET command -->
- <KEYWORD3>cent</KEYWORD3>
- <KEYWORD3>shrc</KEYWORD3>
- <KEYWORD3>origin</KEYWORD3>
- <KEYWORD3>user</KEYWORD3>
-
- <!-- SECREAD, SECWRITE commands -->
- <KEYWORD3>library</KEYWORD3>
- <KEYWORD3>mesh</KEYWORD3>
-
- <!-- SECTYPE command -->
- <KEYWORD3>beam</KEYWORD3>
- <KEYWORD3>rect</KEYWORD3>
- <KEYWORD3>quad</KEYWORD3>
- <KEYWORD3>csolid</KEYWORD3>
- <KEYWORD3>ctube</KEYWORD3>
- <KEYWORD3>chan</KEYWORD3>
- <KEYWORD3>i</KEYWORD3>
- <KEYWORD3>z</KEYWORD3>
- <KEYWORD3>,l</KEYWORD3>
- <KEYWORD3>t</KEYWORD3>
- <KEYWORD3>hats</KEYWORD3>
- <KEYWORD3>hrec</KEYWORD3>
- <KEYWORD3>asec</KEYWORD3>
- <KEYWORD3>mesh</KEYWORD3>
-
- <!-- SEDLIST command -->
- <KEYWORD3>all</KEYWORD3>
-
- <!-- SEEXP command -->
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
-
- <!-- /SEG command -->
- <KEYWORD3>singl</KEYWORD3>
- <KEYWORD3>multi</KEYWORD3>
- <KEYWORD3>delet</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
- <KEYWORD3>pc</KEYWORD3>
-
- <!-- SESYMM command -->
- <KEYWORD3>x</KEYWORD3>
- <KEYWORD3>y</KEYWORD3>
- <KEYWORD3>z</KEYWORD3>
-
- <!-- *SET command -->
-
- <!-- SET command -->
- <KEYWORD3>first</KEYWORD3>
- <KEYWORD3>last</KEYWORD3>
- <KEYWORD3>next</KEYWORD3>
- <KEYWORD3>near</KEYWORD3>
- <KEYWORD3>list</KEYWORD3>
- <KEYWORD3>none</KEYWORD3>
-
- <!-- SF command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>conv</KEYWORD3>
- <KEYWORD3>hflux</KEYWORD3>
- <KEYWORD3>rad</KEYWORD3>
- <KEYWORD3>fsi</KEYWORD3>
- <KEYWORD3>impd</KEYWORD3>
- <KEYWORD3>ptot</KEYWORD3>
- <KEYWORD3>mxwf</KEYWORD3>
- <KEYWORD3>mci</KEYWORD3>
- <KEYWORD3>chrgs</KEYWORD3>
- <KEYWORD3>inf</KEYWORD3>
- <KEYWORD3>port</KEYWORD3>
- <KEYWORD3>shld</KEYWORD3>
-
- <!-- SFA command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>conv</KEYWORD3>
- <KEYWORD3>hflux</KEYWORD3>
- <KEYWORD3>rad</KEYWORD3>
- <KEYWORD3>fsi</KEYWORD3>
- <KEYWORD3>impd</KEYWORD3>
- <KEYWORD3>mxwf</KEYWORD3>
- <KEYWORD3>mci</KEYWORD3>
- <KEYWORD3>mxwf</KEYWORD3>
- <KEYWORD3>chrgs</KEYWORD3>
- <KEYWORD3>inf</KEYWORD3>
- <KEYWORD3>port</KEYWORD3>
- <KEYWORD3>shld</KEYWORD3>
-
- <!-- SFACT command -->
- <KEYWORD3>,sf</KEYWORD3>
- <KEYWORD3>ms</KEYWORD3>
-
- <!-- SFADELE, SFALIST, SFBEAM commands -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
-
- <!-- SFCUM command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>conv</KEYWORD3>
- <KEYWORD3>hflux</KEYWORD3>
- <KEYWORD3>selv</KEYWORD3>
- <KEYWORD3>chrgs</KEYWORD3>
- <KEYWORD3>mxwf</KEYWORD3>
- <KEYWORD3>inf</KEYWORD3>
- <KEYWORD3>repl</KEYWORD3>
- <KEYWORD3>add</KEYWORD3>
- <KEYWORD3>igno</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
-
- <!-- SFDELE command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>conv</KEYWORD3>
- <KEYWORD3>hflux</KEYWORD3>
- <KEYWORD3>rad</KEYWORD3>
- <KEYWORD3>mxwf</KEYWORD3>
- <KEYWORD3>chrgs</KEYWORD3>
- <KEYWORD3>mci</KEYWORD3>
- <KEYWORD3>inf</KEYWORD3>
- <KEYWORD3>selv</KEYWORD3>
- <KEYWORD3>fsi</KEYWORD3>
- <KEYWORD3>impd</KEYWORD3>
- <KEYWORD3>port</KEYWORD3>
- <KEYWORD3>shld</KEYWORD3>
-
- <!-- SFE, SFEDELE, SFELIST commands -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>conv</KEYWORD3>
- <KEYWORD3>hflux</KEYWORD3>
- <KEYWORD3>rad</KEYWORD3>
- <KEYWORD3>mxwf</KEYWORD3>
- <KEYWORD3>chrgs</KEYWORD3>
- <KEYWORD3>mci</KEYWORD3>
- <KEYWORD3>inf</KEYWORD3>
- <KEYWORD3>selv</KEYWORD3>
- <KEYWORD3>fsi</KEYWORD3>
- <KEYWORD3>impd</KEYWORD3>
- <KEYWORD3>port</KEYWORD3>
- <KEYWORD3>shld</KEYWORD3>
-
- <!-- SFFUN, SFGRAD commands -->
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>conv</KEYWORD3>
- <KEYWORD3>hflux</KEYWORD3>
- <KEYWORD3>chrgs</KEYWORD3>
- <KEYWORD3>status</KEYWORD3>
- <KEYWORD3>x</KEYWORD3>
- <KEYWORD3>y</KEYWORD3>
- <KEYWORD3>z</KEYWORD3>
-
- <!-- SFL, SFLDELE, SFLIST, SFLLIST, SFSCALE commands -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>conv</KEYWORD3>
- <KEYWORD3>hflux</KEYWORD3>
- <KEYWORD3>rad</KEYWORD3>
- <KEYWORD3>fsi</KEYWORD3>
- <KEYWORD3>impd</KEYWORD3>
- <KEYWORD3>mci</KEYWORD3>
- <KEYWORD3>mxwf</KEYWORD3>
- <KEYWORD3>chrgs</KEYWORD3>
- <KEYWORD3>inf</KEYWORD3>
- <KEYWORD3>port</KEYWORD3>
- <KEYWORD3>shdl</KEYWORD3>
- <KEYWORD3>selv</KEYWORD3>
-
- <!-- /SHADE command -->
- <KEYWORD3>facet</KEYWORD3>
- <KEYWORD3>gouraud</KEYWORD3>
- <KEYWORD3>phong</KEYWORD3>
-
- <!-- SHELL command -->
- <KEYWORD3>top</KEYWORD3>
- <KEYWORD3>mid</KEYWORD3>
- <KEYWORD3>bot</KEYWORD3>
-
- <!-- /SHOW command -->
- <KEYWORD3>term</KEYWORD3>
- <KEYWORD3>file</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>pscr</KEYWORD3>
- <KEYWORD3>hpgl</KEYWORD3>
- <KEYWORD3>hpgl2</KEYWORD3>
- <KEYWORD3>vrml</KEYWORD3>
-
- <!-- /SHOWDISP command -->
- <KEYWORD3>hpgl</KEYWORD3>
- <KEYWORD3>hpgl2</KEYWORD3>
- <KEYWORD3>interleaf</KEYWORD3>
- <KEYWORD3>postscript</KEYWORD3>
- <KEYWORD3>dump</KEYWORD3>
-
- <!-- SHPP command -->
- <KEYWORD3>on</KEYWORD3>
- <KEYWORD3>warn</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>silent</KEYWORD3>
- <KEYWORD3>status</KEYWORD3>
- <KEYWORD3>summary</KEYWORD3>
- <KEYWORD3>default</KEYWORD3>
- <KEYWORD3>object</KEYWORD3>
- <KEYWORD3>modify</KEYWORD3>
- <KEYWORD3>angd</KEYWORD3>
- <KEYWORD3>aspect</KEYWORD3>
- <KEYWORD3>paral</KEYWORD3>
- <KEYWORD3>maxang</KEYWORD3>
- <KEYWORD3>jacrat</KEYWORD3>
- <KEYWORD3>warp</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>yes</KEYWORD3>
- <KEYWORD3>no</KEYWORD3>
-
- <!-- SLPPLOT, SLSPLOT commands -->
- <KEYWORD3>factor</KEYWORD3>
- <KEYWORD3>radius</KEYWORD3>
- <KEYWORD3>length</KEYWORD3>
-
- <!-- SMRTSIZE command -->
- <KEYWORD3>stat</KEYWORD3>
- <KEYWORD3>defa</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
-
- <!-- SOLCONTROL command -->
- <KEYWORD3>on</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
-
- <!-- SOLU command -->
- <KEYWORD3>allf</KEYWORD3>
- <KEYWORD3>aldlf</KEYWORD3>
- <KEYWORD3>arcl</KEYWORD3>
- <KEYWORD3>cnvg</KEYWORD3>
- <KEYWORD3>crprat</KEYWORD3>
- <KEYWORD3>cscv</KEYWORD3>
- <KEYWORD3>cucv</KEYWORD3>
- <KEYWORD3>dicv</KEYWORD3>
- <KEYWORD3>dsprm</KEYWORD3>
- <KEYWORD3>dtime</KEYWORD3>
- <KEYWORD3>eqit</KEYWORD3>
- <KEYWORD3>ffcv</KEYWORD3>
- <KEYWORD3>focv</KEYWORD3>
- <KEYWORD3>hfcv</KEYWORD3>
- <KEYWORD3>nc48</KEYWORD3>
- <KEYWORD3>nc49</KEYWORD3>
- <KEYWORD3>ncmit</KEYWORD3>
- <KEYWORD3>ncmls</KEYWORD3>
- <KEYWORD3>ncmss</KEYWORD3>
- <KEYWORD3>mfcv</KEYWORD3>
- <KEYWORD3>mocv</KEYWORD3>
- <KEYWORD3>mxdvl</KEYWORD3>
- <KEYWORD3>prcv</KEYWORD3>
- <KEYWORD3>psinc</KEYWORD3>
- <KEYWORD3>resfrq</KEYWORD3>
- <KEYWORD3>reseig</KEYWORD3>
- <KEYWORD3>rocv</KEYWORD3>
- <KEYWORD3>smcv</KEYWORD3>
- <KEYWORD3>tecv</KEYWORD3>
- <KEYWORD3>vecv</KEYWORD3>
- <KEYWORD3>vocv</KEYWORD3>
- <KEYWORD3>vmcv</KEYWORD3>
-
- <!-- SPOPT command -->
- <KEYWORD3>sprs</KEYWORD3>
- <KEYWORD3>mprs</KEYWORD3>
- <KEYWORD3>ddam</KEYWORD3>
- <KEYWORD3>psd</KEYWORD3>
- <KEYWORD3>no</KEYWORD3>
- <KEYWORD3>yes</KEYWORD3>
-
- <!-- SRSS command -->
- <KEYWORD3>disp</KEYWORD3>
- <KEYWORD3>velo</KEYWORD3>
- <KEYWORD3>acel</KEYWORD3>
-
- <!-- /SSCALE command -->
- <KEYWORD3>all</KEYWORD3>
-
- <!-- SSTIF command -->
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
-
- <!-- *STATUS command -->
- <KEYWORD3>argx</KEYWORD3>
-
- <!-- /STATUS command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>title</KEYWORD3>
- <KEYWORD3>units</KEYWORD3>
- <KEYWORD3>mem</KEYWORD3>
- <KEYWORD3>db</KEYWORD3>
- <KEYWORD3>config</KEYWORD3>
- <KEYWORD3>global</KEYWORD3>
- <KEYWORD3>solu</KEYWORD3>
- <KEYWORD3>phys</KEYWORD3>
-
- <!-- STORE command -->
- <KEYWORD3>merge</KEYWORD3>
- <KEYWORD3>new</KEYWORD3>
- <KEYWORD3>appen</KEYWORD3>
- <KEYWORD3>alloc</KEYWORD3>
- <KEYWORD3>psd</KEYWORD3>
-
- <!-- SUBOPT command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>part</KEYWORD3>
- <KEYWORD3>none</KEYWORD3>
-
- <!-- SUBSET command -->
- <KEYWORD3>first</KEYWORD3>
- <KEYWORD3>last</KEYWORD3>
- <KEYWORD3>next</KEYWORD3>
- <KEYWORD3>near</KEYWORD3>
- <KEYWORD3>list</KEYWORD3>
- <KEYWORD3>velo</KEYWORD3>
- <KEYWORD3>acel</KEYWORD3>
-
- <!-- SUMTYPE command -->
- <KEYWORD3>comp</KEYWORD3>
- <KEYWORD3>prin</KEYWORD3>
-
- <!-- TB command -->
- <KEYWORD3>bkin</KEYWORD3>
- <KEYWORD3>mkin</KEYWORD3>
- <KEYWORD3>miso</KEYWORD3>
- <KEYWORD3>biso</KEYWORD3>
- <KEYWORD3>aniso</KEYWORD3>
- <KEYWORD3>dp</KEYWORD3>
- <KEYWORD3>melas</KEYWORD3>
- <KEYWORD3>user</KEYWORD3>
- <KEYWORD3>kinh</KEYWORD3>
- <KEYWORD3>anand</KEYWORD3>
- <KEYWORD3>creep</KEYWORD3>
- <KEYWORD3>swell</KEYWORD3>
- <KEYWORD3>bh</KEYWORD3>
- <KEYWORD3>piez</KEYWORD3>
- <KEYWORD3>fail</KEYWORD3>
- <KEYWORD3>mooney</KEYWORD3>
- <KEYWORD3>water</KEYWORD3>
- <KEYWORD3>anel</KEYWORD3>
- <KEYWORD3>concr</KEYWORD3>
- <KEYWORD3>hflm</KEYWORD3>
- <KEYWORD3>fcon</KEYWORD3>
- <KEYWORD3>pflow</KEYWORD3>
- <KEYWORD3>evisc</KEYWORD3>
- <KEYWORD3>plaw</KEYWORD3>
- <KEYWORD3>foam</KEYWORD3>
- <KEYWORD3>honey</KEYWORD3>
- <KEYWORD3>comp</KEYWORD3>
- <KEYWORD3>nl</KEYWORD3>
- <KEYWORD3>eos</KEYWORD3>
-
- <!-- TBDELE, TBLIST commands -->
- <KEYWORD3>all</KEYWORD3>
-
- <!-- TBPLOT command -->
- <KEYWORD3>mkin</KEYWORD3>
- <KEYWORD3>kinh</KEYWORD3>
- <KEYWORD3>melas</KEYWORD3>
- <KEYWORD3>miso</KEYWORD3>
- <KEYWORD3>bkin</KEYWORD3>
- <KEYWORD3>biso</KEYWORD3>
- <KEYWORD3>bh</KEYWORD3>
- <KEYWORD3>nb</KEYWORD3>
- <KEYWORD3>mh</KEYWORD3>
- <KEYWORD3>sbh</KEYWORD3>
- <KEYWORD3>snb</KEYWORD3>
- <KEYWORD3>smh</KEYWORD3>
-
- <!-- TBPT command -->
- <KEYWORD3>defi</KEYWORD3>
- <KEYWORD3>dele</KEYWORD3>
-
- <!-- TEE command -->
- <KEYWORD3>wt</KEYWORD3>
- <KEYWORD3>uft</KEYWORD3>
-
- <!-- TERM command -->
- <KEYWORD3>copy</KEYWORD3>
- <KEYWORD3>loop</KEYWORD3>
- <KEYWORD3>noprom</KEYWORD3>
-
- <!-- TIMINT command -->
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>struc</KEYWORD3>
- <KEYWORD3>therm</KEYWORD3>
- <KEYWORD3>elect</KEYWORD3>
- <KEYWORD3>mag</KEYWORD3>
- <KEYWORD3>fluid</KEYWORD3>
-
- <!-- TIMP command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
-
- <!-- TRANSFER command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
-
- <!-- /TRIAD command -->
- <KEYWORD3>orig</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>lbot</KEYWORD3>
- <KEYWORD3>rbot</KEYWORD3>
- <KEYWORD3>ltop</KEYWORD3>
- <KEYWORD3>rtop</KEYWORD3>
-
- <!-- /TRLCY command -->
- <KEYWORD3>elem</KEYWORD3>
- <KEYWORD3>area</KEYWORD3>
- <KEYWORD3>volu</KEYWORD3>
- <KEYWORD3>isurf</KEYWORD3>
- <KEYWORD3>cm</KEYWORD3>
- <KEYWORD3>curve</KEYWORD3>
-
- <!-- TRNOPT command -->
- <KEYWORD3>full</KEYWORD3>
- <KEYWORD3>reduc</KEYWORD3>
- <KEYWORD3>msup</KEYWORD3>
- <KEYWORD3>damp</KEYWORD3>
- <KEYWORD3>nodamp</KEYWORD3>
-
- <!-- TRPDEL, TRPLIS, TRPOIN commands -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
-
- <!-- TSHAP command -->
- <KEYWORD3>iine</KEYWORD3>
- <KEYWORD3>line</KEYWORD3>
- <KEYWORD3>para</KEYWORD3>
- <KEYWORD3>arc</KEYWORD3>
- <KEYWORD3>carc</KEYWORD3>
- <KEYWORD3>circ</KEYWORD3>
- <KEYWORD3>tria</KEYWORD3>
- <KEYWORD3>tri6</KEYWORD3>
- <KEYWORD3>quad</KEYWORD3>
- <KEYWORD3>qua8</KEYWORD3>
- <KEYWORD3>cyli</KEYWORD3>
- <KEYWORD3>cone</KEYWORD3>
- <KEYWORD3>sphe</KEYWORD3>
- <KEYWORD3>pilo</KEYWORD3>
-
- <!-- /TYPE command -->
- <KEYWORD3>basic</KEYWORD3>
- <KEYWORD3>sect</KEYWORD3>
- <KEYWORD3>hidc</KEYWORD3>
- <KEYWORD3>hidd</KEYWORD3>
- <KEYWORD3>hidp</KEYWORD3>
- <KEYWORD3>cap</KEYWORD3>
- <KEYWORD3>zbuf</KEYWORD3>
- <KEYWORD3>zcap</KEYWORD3>
- <KEYWORD3>zqsl</KEYWORD3>
- <KEYWORD3>hqsl</KEYWORD3>
-
- <!-- /UI command -->
- <KEYWORD3>help</KEYWORD3>
- <KEYWORD3>view</KEYWORD3>
- <KEYWORD3>wpse</KEYWORD3>
- <KEYWORD3>wpvi</KEYWORD3>
- <KEYWORD3>result</KEYWORD3>
- <KEYWORD3>query</KEYWORD3>
- <KEYWORD3>copy</KEYWORD3>
- <KEYWORD3>anno</KEYWORD3>
- <KEYWORD3>select</KEYWORD3>
- <KEYWORD3>,nsel</KEYWORD3>
- <KEYWORD3>,esel</KEYWORD3>
- <KEYWORD3>,ksel</KEYWORD3>
- <KEYWORD3>,lsel</KEYWORD3>
- <KEYWORD3>,asel</KEYWORD3>
- <KEYWORD3>,vsel</KEYWORD3>
- <KEYWORD3>refresh</KEYWORD3>
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>,r</KEYWORD3>
- <KEYWORD3>,a</KEYWORD3>
- <KEYWORD3>u</KEYWORD3>
- <KEYWORD3>node</KEYWORD3>
- <KEYWORD3>element</KEYWORD3>
- <KEYWORD3>grid</KEYWORD3>
- <KEYWORD3>format</KEYWORD3>
- <KEYWORD3>pscr</KEYWORD3>
- <KEYWORD3>tiff</KEYWORD3>
- <KEYWORD3>epsi</KEYWORD3>
- <KEYWORD3>bmp</KEYWORD3>
- <KEYWORD3>wmf</KEYWORD3>
- <KEYWORD3>emf</KEYWORD3>
- <KEYWORD3>screen</KEYWORD3>
- <KEYWORD3>full</KEYWORD3>
- <KEYWORD3>graph</KEYWORD3>
- <KEYWORD3>color</KEYWORD3>
- <KEYWORD3>mono</KEYWORD3>
- <KEYWORD3>grey</KEYWORD3>
- <KEYWORD3>krev</KEYWORD3>
- <KEYWORD3>norm</KEYWORD3>
- <KEYWORD3>reverse</KEYWORD3>
- <KEYWORD3>orient</KEYWORD3>
- <KEYWORD3>landscape</KEYWORD3>
- <KEYWORD3>portrait</KEYWORD3>
- <KEYWORD3>compress</KEYWORD3>
- <KEYWORD3>yes</KEYWORD3>
- <KEYWORD3>no</KEYWORD3>
-
- <!-- /UIS command -->
- <KEYWORD3>msgpop</KEYWORD3>
- <KEYWORD3>replot</KEYWORD3>
- <KEYWORD3>abort</KEYWORD3>
- <KEYWORD3>dyna</KEYWORD3>
- <KEYWORD3>pick</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
- <KEYWORD3>defa</KEYWORD3>
-
- <!-- /UNITS command -->
- <KEYWORD3>user</KEYWORD3>
- <KEYWORD3>si</KEYWORD3>
- <KEYWORD3>cgs</KEYWORD3>
- <KEYWORD3>bft</KEYWORD3>
- <KEYWORD3>bin</KEYWORD3>
-
- <!-- UPCOORD command -->
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
-
- <!-- /USER command -->
- <KEYWORD3>all</KEYWORD3>
-
- <!-- USRCAL command -->
- <KEYWORD3>usrefl</KEYWORD3>
- <KEYWORD3>userfl</KEYWORD3>
- <KEYWORD3>usercv</KEYWORD3>
- <KEYWORD3>userpr</KEYWORD3>
- <KEYWORD3>userfx</KEYWORD3>
- <KEYWORD3>userch</KEYWORD3>
- <KEYWORD3>userfd</KEYWORD3>
- <KEYWORD3>userou</KEYWORD3>
- <KEYWORD3>usermc</KEYWORD3>
- <KEYWORD3>usolbeg</KEYWORD3>
- <KEYWORD3>uldbeg</KEYWORD3>
- <KEYWORD3>ussbeg</KEYWORD3>
- <KEYWORD3>uitbeg</KEYWORD3>
- <KEYWORD3>uitfin</KEYWORD3>
- <KEYWORD3>ussfin</KEYWORD3>
- <KEYWORD3>uldfin</KEYWORD3>
- <KEYWORD3>usolfin</KEYWORD3>
- <KEYWORD3>uanbeg</KEYWORD3>
- <KEYWORD3>uanfin</KEYWORD3>
- <KEYWORD3>uelmatx</KEYWORD3>
-
- <!-- VA, VADD, VCLEAR, /VCONE, VCVFILL, VDELE, VDGL, VDRAG, VEXT commands -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
-
- <!-- *VFILL command -->
- <KEYWORD3>data</KEYWORD3>
- <KEYWORD3>ramp</KEYWORD3>
- <KEYWORD3>rand</KEYWORD3>
- <KEYWORD3>gdis</KEYWORD3>
- <KEYWORD3>tria</KEYWORD3>
- <KEYWORD3>beta</KEYWORD3>
- <KEYWORD3>gamm</KEYWORD3>
-
- <!-- *VFUN command -->
- <KEYWORD3>acos</KEYWORD3>
- <KEYWORD3>asin</KEYWORD3>
- <KEYWORD3>asort</KEYWORD3>
- <KEYWORD3>atan</KEYWORD3>
- <KEYWORD3>comp</KEYWORD3>
- <KEYWORD3>copy</KEYWORD3>
- <KEYWORD3>cos</KEYWORD3>
- <KEYWORD3>cosh</KEYWORD3>
- <KEYWORD3>dircos</KEYWORD3>
- <KEYWORD3>dsort</KEYWORD3>
- <KEYWORD3>euler</KEYWORD3>
- <KEYWORD3>exp</KEYWORD3>
- <KEYWORD3>expa</KEYWORD3>
- <KEYWORD3>log</KEYWORD3>
- <KEYWORD3>log10</KEYWORD3>
- <KEYWORD3>nint</KEYWORD3>
- <KEYWORD3>not</KEYWORD3>
- <KEYWORD3>pwr</KEYWORD3>
- <KEYWORD3>sin</KEYWORD3>
- <KEYWORD3>sinh</KEYWORD3>
- <KEYWORD3>sqrt</KEYWORD3>
- <KEYWORD3>tan</KEYWORD3>
- <KEYWORD3>tanh</KEYWORD3>
- <KEYWORD3>tang</KEYWORD3>
- <KEYWORD3>norm</KEYWORD3>
- <KEYWORD3>local</KEYWORD3>
- <KEYWORD3>global</KEYWORD3>
-
- <!-- VGEN command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
-
- <!-- *VGET command -->
- <KEYWORD3>node</KEYWORD3>
- <KEYWORD3>loc</KEYWORD3>
- <KEYWORD3>x</KEYWORD3>
- <KEYWORD3>y</KEYWORD3>
- <KEYWORD3>z</KEYWORD3>
- <KEYWORD3>ang</KEYWORD3>
- <KEYWORD3>xy</KEYWORD3>
- <KEYWORD3>yz</KEYWORD3>
- <KEYWORD3>zx</KEYWORD3>
- <KEYWORD3>,nsel</KEYWORD3>
-
- <KEYWORD3>elem</KEYWORD3>
- <KEYWORD3>cent</KEYWORD3>
- <KEYWORD3>adj</KEYWORD3>
- <KEYWORD3>attr</KEYWORD3>
- <KEYWORD3>geom</KEYWORD3>
- <KEYWORD3>,esel</KEYWORD3>
- <KEYWORD3>shpar</KEYWORD3>
-
- <KEYWORD3>kp</KEYWORD3>
- <KEYWORD3>div</KEYWORD3>
- <KEYWORD3>,ksel</KEYWORD3>
-
- <KEYWORD3>line</KEYWORD3>
- <KEYWORD3>leng</KEYWORD3>
- <KEYWORD3>,lsel</KEYWORD3>
-
- <KEYWORD3>area</KEYWORD3>
- <KEYWORD3>loop</KEYWORD3>
- <KEYWORD3>,asel</KEYWORD3>
-
- <KEYWORD3>volu</KEYWORD3>
- <KEYWORD3>shell</KEYWORD3>
- <KEYWORD3>volu</KEYWORD3>
- <KEYWORD3>,vsel</KEYWORD3>
-
- <KEYWORD3>cdsy</KEYWORD3>
-
- <KEYWORD3>rcon</KEYWORD3>
- <KEYWORD3>const</KEYWORD3>
-
- <KEYWORD3>const</KEYWORD3>
- <KEYWORD3>bkin</KEYWORD3>
- <KEYWORD3>mkin</KEYWORD3>
- <KEYWORD3>miso</KEYWORD3>
- <KEYWORD3>biso</KEYWORD3>
- <KEYWORD3>aniso</KEYWORD3>
- <KEYWORD3>dp</KEYWORD3>
- <KEYWORD3>melas</KEYWORD3>
- <KEYWORD3>user</KEYWORD3>
- <KEYWORD3>kinh</KEYWORD3>
- <KEYWORD3>anand</KEYWORD3>
- <KEYWORD3>creep</KEYWORD3>
- <KEYWORD3>swell</KEYWORD3>
- <KEYWORD3>bh</KEYWORD3>
- <KEYWORD3>piez</KEYWORD3>
- <KEYWORD3>fail</KEYWORD3>
- <KEYWORD3>mooney</KEYWORD3>
- <KEYWORD3>water</KEYWORD3>
- <KEYWORD3>anel</KEYWORD3>
- <KEYWORD3>concr</KEYWORD3>
- <KEYWORD3>hflm</KEYWORD3>
- <KEYWORD3>fcon</KEYWORD3>
- <KEYWORD3>pflow</KEYWORD3>
- <KEYWORD3>evisc</KEYWORD3>
- <KEYWORD3>plaw</KEYWORD3>
- <KEYWORD3>foam</KEYWORD3>
- <KEYWORD3>honey</KEYWORD3>
- <KEYWORD3>comp</KEYWORD3>
- <KEYWORD3>nl</KEYWORD3>
- <KEYWORD3>eos</KEYWORD3>
-
- <KEYWORD3>u</KEYWORD3>
- <KEYWORD3>rot</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>volt</KEYWORD3>
- <KEYWORD3>mag</KEYWORD3>
- <KEYWORD3>v</KEYWORD3>
- <KEYWORD3>,a</KEYWORD3>
- <KEYWORD3>curr</KEYWORD3>
- <KEYWORD3>emf</KEYWORD3>
- <KEYWORD3>enke</KEYWORD3>
- <KEYWORD3>ends</KEYWORD3>
-
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>int</KEYWORD3>
- <KEYWORD3>eqv</KEYWORD3>
- <KEYWORD3>epto</KEYWORD3>
- <KEYWORD3>epel</KEYWORD3>
- <KEYWORD3>eppl</KEYWORD3>
- <KEYWORD3>epcr</KEYWORD3>
- <KEYWORD3>epth</KEYWORD3>
- <KEYWORD3>epsw</KEYWORD3>
-
- <KEYWORD3>nl</KEYWORD3>
- <KEYWORD3>sepl</KEYWORD3>
- <KEYWORD3>srat</KEYWORD3>
- <KEYWORD3>hpres</KEYWORD3>
- <KEYWORD3>epeq</KEYWORD3>
- <KEYWORD3>psv</KEYWORD3>
- <KEYWORD3>plwk</KEYWORD3>
- <KEYWORD3>hs</KEYWORD3>
- <KEYWORD3>bfe</KEYWORD3>
- <KEYWORD3>tg</KEYWORD3>
- <KEYWORD3>tf</KEYWORD3>
- <KEYWORD3>pg</KEYWORD3>
- <KEYWORD3>ef</KEYWORD3>
- <KEYWORD3>,d</KEYWORD3>
- <KEYWORD3>h</KEYWORD3>
- <KEYWORD3>b</KEYWORD3>
- <KEYWORD3>fmag</KEYWORD3>
-
- <KEYWORD3>ttot</KEYWORD3>
- <KEYWORD3>hflu</KEYWORD3>
- <KEYWORD3>hflm</KEYWORD3>
- <KEYWORD3>cond</KEYWORD3>
- <KEYWORD3>pcoe</KEYWORD3>
- <KEYWORD3>ptot</KEYWORD3>
- <KEYWORD3>mach</KEYWORD3>
- <KEYWORD3>strm</KEYWORD3>
- <KEYWORD3>dens</KEYWORD3>
- <KEYWORD3>visc</KEYWORD3>
- <KEYWORD3>evis</KEYWORD3>
- <KEYWORD3>econ</KEYWORD3>
- <KEYWORD3>yplu</KEYWORD3>
- <KEYWORD3>tauw</KEYWORD3>
-
- <KEYWORD3>etab</KEYWORD3>
-
- <!-- VGLUE, VIMP, VINP, VINV, VLIST, VLSCALE, VMESH, VOFFST commands -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
-
- <!-- /VIEW command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>wp</KEYWORD3>
-
- <!-- *VOPER command -->
- <KEYWORD3>add</KEYWORD3>
- <KEYWORD3>sub</KEYWORD3>
- <KEYWORD3>mult</KEYWORD3>
- <KEYWORD3>div</KEYWORD3>
- <KEYWORD3>min</KEYWORD3>
- <KEYWORD3>max</KEYWORD3>
- <KEYWORD3>lt</KEYWORD3>
- <KEYWORD3>le</KEYWORD3>
- <KEYWORD3>eq</KEYWORD3>
- <KEYWORD3>ne</KEYWORD3>
- <KEYWORD3>ge</KEYWORD3>
- <KEYWORD3>gt</KEYWORD3>
- <KEYWORD3>der1</KEYWORD3>
- <KEYWORD3>der2</KEYWORD3>
- <KEYWORD3>int1</KEYWORD3>
- <KEYWORD3>int2</KEYWORD3>
- <KEYWORD3>dot</KEYWORD3>
- <KEYWORD3>cross</KEYWORD3>
- <KEYWORD3>gath</KEYWORD3>
- <KEYWORD3>scat</KEYWORD3>
-
- <!-- VOVLAP, VPTN commands -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
-
- <!-- VPLOT command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>dege</KEYWORD3>
-
- <!-- *VPUT command -->
- <KEYWORD3>node</KEYWORD3>
- <KEYWORD3>u</KEYWORD3>
- <KEYWORD3>x</KEYWORD3>
- <KEYWORD3>y</KEYWORD3>
- <KEYWORD3>z</KEYWORD3>
- <KEYWORD3>rot</KEYWORD3>
- <KEYWORD3>temp</KEYWORD3>
- <KEYWORD3>pres</KEYWORD3>
- <KEYWORD3>volt</KEYWORD3>
- <KEYWORD3>mag</KEYWORD3>
- <KEYWORD3>v</KEYWORD3>
- <KEYWORD3>,a</KEYWORD3>
- <KEYWORD3>curr</KEYWORD3>
- <KEYWORD3>emf</KEYWORD3>
- <KEYWORD3>enke</KEYWORD3>
- <KEYWORD3>ends</KEYWORD3>
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>xy</KEYWORD3>
- <KEYWORD3>yz</KEYWORD3>
- <KEYWORD3>xz</KEYWORD3>
- <KEYWORD3>int</KEYWORD3>
- <KEYWORD3>eqv</KEYWORD3>
- <KEYWORD3>epto</KEYWORD3>
- <KEYWORD3>epel</KEYWORD3>
- <KEYWORD3>eppl</KEYWORD3>
- <KEYWORD3>epcr</KEYWORD3>
- <KEYWORD3>epth</KEYWORD3>
- <KEYWORD3>epsw</KEYWORD3>
- <KEYWORD3>nl</KEYWORD3>
- <KEYWORD3>sepl</KEYWORD3>
- <KEYWORD3>srat</KEYWORD3>
- <KEYWORD3>hpres</KEYWORD3>
- <KEYWORD3>epeq</KEYWORD3>
- <KEYWORD3>psv</KEYWORD3>
- <KEYWORD3>plwk</KEYWORD3>
- <KEYWORD3>tg</KEYWORD3>
- <KEYWORD3>tf</KEYWORD3>
- <KEYWORD3>pg</KEYWORD3>
- <KEYWORD3>ef</KEYWORD3>
- <KEYWORD3>,d</KEYWORD3>
- <KEYWORD3>h</KEYWORD3>
- <KEYWORD3>b</KEYWORD3>
- <KEYWORD3>fmag</KEYWORD3>
- <KEYWORD3>ttot</KEYWORD3>
- <KEYWORD3>hflu</KEYWORD3>
- <KEYWORD3>hflm</KEYWORD3>
- <KEYWORD3>cond</KEYWORD3>
- <KEYWORD3>pcoe</KEYWORD3>
- <KEYWORD3>ptot</KEYWORD3>
- <KEYWORD3>mach</KEYWORD3>
- <KEYWORD3>strm</KEYWORD3>
- <KEYWORD3>dens</KEYWORD3>
- <KEYWORD3>visc</KEYWORD3>
- <KEYWORD3>evis</KEYWORD3>
- <KEYWORD3>econ</KEYWORD3>
- <KEYWORD3>yplu</KEYWORD3>
- <KEYWORD3>tauw</KEYWORD3>
-
- <KEYWORD3>elem</KEYWORD3>
- <KEYWORD3>etab</KEYWORD3>
-
- <!-- VROTAT command -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
-
- <!-- VSBA, VSBV, VSBW commands -->
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
- <KEYWORD3>sepo</KEYWORD3>
- <KEYWORD3>delete</KEYWORD3>
- <KEYWORD3>keep</KEYWORD3>
-
- <!-- *VSCFUN command -->
- <KEYWORD3>max</KEYWORD3>
- <KEYWORD3>min</KEYWORD3>
- <KEYWORD3>lmax</KEYWORD3>
- <KEYWORD3>lmin</KEYWORD3>
- <KEYWORD3>first</KEYWORD3>
- <KEYWORD3>last</KEYWORD3>
- <KEYWORD3>sum</KEYWORD3>
- <KEYWORD3>medi</KEYWORD3>
- <KEYWORD3>mean</KEYWORD3>
- <KEYWORD3>vari</KEYWORD3>
- <KEYWORD3>stdv</KEYWORD3>
- <KEYWORD3>rms</KEYWORD3>
- <KEYWORD3>num</KEYWORD3>
-
- <!-- VSEL, VSLA commands -->
- <KEYWORD3>s</KEYWORD3>
- <KEYWORD3>,r</KEYWORD3>
- <KEYWORD3>,a</KEYWORD3>
- <KEYWORD3>u</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>none</KEYWORD3>
- <KEYWORD3>inve</KEYWORD3>
- <KEYWORD3>stat</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
- <KEYWORD3>volu</KEYWORD3>
- <KEYWORD3>loc</KEYWORD3>
- <KEYWORD3>x</KEYWORD3>
- <KEYWORD3>y</KEYWORD3>
- <KEYWORD3>z</KEYWORD3>
- <KEYWORD3>,mat</KEYWORD3>
- <KEYWORD3>,type</KEYWORD3>
- <KEYWORD3>,real</KEYWORD3>
- <KEYWORD3>,esys</KEYWORD3>
-
- <!-- VSUM command -->
- <KEYWORD3>default</KEYWORD3>
- <KEYWORD3>fine</KEYWORD3>
-
- <!-- VSWEEP command -->
- <KEYWORD3>p</KEYWORD3>
-
- <!-- VSYMM, VTRAN, /VUP commands -->
- <KEYWORD3>x</KEYWORD3>
- <KEYWORD3>y</KEYWORD3>
- <KEYWORD3>z</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>p</KEYWORD3>
- <KEYWORD3>-x</KEYWORD3>
- <KEYWORD3>-y</KEYWORD3>
- <KEYWORD3>-z</KEYWORD3>
-
- <!-- WAVES command -->
- <KEYWORD3>max</KEYWORD3>
- <KEYWORD3>rms</KEYWORD3>
-
- <!-- /WINDOW command -->
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>on</KEYWORD3>
- <KEYWORD3>full</KEYWORD3>
- <KEYWORD3>left</KEYWORD3>
- <KEYWORD3>righ</KEYWORD3>
- <KEYWORD3>top</KEYWORD3>
- <KEYWORD3>bot</KEYWORD3>
- <KEYWORD3>ltop</KEYWORD3>
- <KEYWORD3>lbot</KEYWORD3>
- <KEYWORD3>rtop</KEYWORD3>
- <KEYWORD3>rbot</KEYWORD3>
- <KEYWORD3>squa</KEYWORD3>
- <KEYWORD3>dele</KEYWORD3>
-
- <!-- WPAVE command -->
- <KEYWORD3>p</KEYWORD3>
-
- <!-- WSORT command -->
- <KEYWORD3>x</KEYWORD3>
- <KEYWORD3>y</KEYWORD3>
- <KEYWORD3>z</KEYWORD3>
- <KEYWORD3>all</KEYWORD3>
- <KEYWORD3>max</KEYWORD3>
- <KEYWORD3>rms</KEYWORD3>
-
- <!-- WSTART command -->
- <KEYWORD3>all</KEYWORD3>
-
- <!-- /YRANGE command -->
- <KEYWORD3>all</KEYWORD3>
-
- <!-- /ZOOM command -->
- <KEYWORD3>off</KEYWORD3>
- <KEYWORD3>back</KEYWORD3>
- <KEYWORD3>scrn</KEYWORD3>
- <KEYWORD3>rect</KEYWORD3>
-
- </KEYWORDS>
- </RULES>
-</MODE>
-
+<?xml version="1.0"?>
+
+<!DOCTYPE MODE SYSTEM "xmode.dtd">
+
+<!--
+
+ Version 0.9.8 - generated by Randolf Mock on 11/22/2003
+ Randolf.Mock at siemens.com
+
+ <KEYWORD1>: ANSYS commands
+ <KEYWORD2>: abbreviated *get commands
+ <KEYWORD3>: ANSYS command options
+
+-->
+
+<!-- The keywords and functions defined here are those of ANSYS 5.7 -->
+
+<MODE>
+ <PROPS>
+ <PROPERTY NAME="lineComment" VALUE="!" />
+ </PROPS>
+ <RULES IGNORE_CASE="TRUE" HIGHLIGHT_DIGITS="TRUE">
+
+ <!-- labels - eg :test -->
+ <EOL_SPAN TYPE="LABEL" AT_LINE_START="TRUE">:</EOL_SPAN>
+
+ <!-- comments -->
+ <EOL_SPAN TYPE="COMMENT1">!</EOL_SPAN>
+
+ <!-- literals -->
+ <SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">
+ <BEGIN>'</BEGIN>
+ <END>'</END>
+ </SPAN>
+
+<!-- Special treatment of the ANSYS commands
+ beginning with a '/' or '*' character -->
+
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*ABBR</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*ABB</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*AFUN</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*AFU</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*ASK</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*CFCLOS</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*CFC</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*CFOPEN</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*CFO</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*CFWRITE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*CFW</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*CREATE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*CRE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*CYCLE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*CYC</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*DEL</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*DIM</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*DO</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*ELSEIF</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*ELSE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*ENDDO</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*ENDIF</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*END</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*EVAL</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*EVA</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*EXIT</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*EXI</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*GET</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*GO</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*IF</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*LIST</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*LIS</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*MFOURI</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*MFO</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*MFUN</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*MFU</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*MOONEY</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*MOO</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*MOPER</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*MOP</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*MSG</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*REPEAT</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*REP</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*SET</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*STATUS</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*STA</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*TREAD</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*TRE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*ULIB</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*ULI</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*USE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VABS</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VAB</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VCOL</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VCO</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VCUM</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VCU</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VEDIT</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VED</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VFACT</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VFA</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VFILL</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VFI</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VFUN</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VFU</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VGET</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VGE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VITRP</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VIT</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VLEN</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VLE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VMASK</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VMA</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VOPER</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VOP</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VPLOT</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VPL</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VPUT</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VPU</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VREAD</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VRE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VSCFUN</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VSC</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VSTAT</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VST</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VWRITE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">*VWR</SEQ>
+
+
+
+
+
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/ANFILE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/ANF</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/ANGLE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/ANG</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/ANNOT</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/ANN</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/ANUM</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/ANU</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/ASSIGN</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/ASS</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/AUTO</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/AUT</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/AUX15</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/AUX2</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/AUX</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/AXLAB</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/AXL</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/BATCH</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/BAT</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CLABEL</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CLA</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CLEAR</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CLE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CLOG</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CLO</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CMAP</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CMA</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/COLOR</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/COL</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/COM</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CONFIG</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CONTOUR</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CON</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/COPY</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/COP</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CPLANE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CPL</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CTYPE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CTY</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CVAL</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/CVA</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/DELETE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/DEL</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/DEVDISP</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/DEVICE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/DEV</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/DIST</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/DIS</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/DSCALE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/DSC</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/DV3D</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/DV3</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/EDGE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/EDG</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/EFACET</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/EFA</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/EOF</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/ERASE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/ERA</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/ESHAPE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/ESH</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/EXIT</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/EXI</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/EXPAND</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/EXP</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/FACET</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/FAC</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/FDELE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/FDE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/FILNAME</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/FIL</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/FOCUS</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/FOC</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/FORMAT</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/FOR</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/FTYPE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/FTY</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GCMD</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GCM</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GCOLUMN</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GCO</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GFILE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GFI</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GFORMAT</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GFO</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GLINE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GLI</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GMARKER</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GMA</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GOLIST</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GOL</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GOPR</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GOP</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GO</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GRAPHICS</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GRA</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GRESUME</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GRE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GRID</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GRI</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GROPT</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GRO</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GRTYP</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GRT</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GSAVE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GSA</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GST</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GTHK</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GTH</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GTYPE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/GTY</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/HEADER</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/HEA</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/INPUT</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/INP</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/LARC</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/LAR</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/LIGHT</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/LIG</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/LINE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/LIN</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/LSPEC</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/LSP</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/LSYMBOL</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/LSY</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/MENU</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/MEN</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/MPLIB</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/MPL</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/MREP</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/MRE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/MSTART</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/MST</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/NERR</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/NER</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/NOERASE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/NOE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/NOLIST</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/NOL</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/NOPR</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/NOP</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/NORMAL</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/NOR</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/NUMBER</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/NUM</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/OPT</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/OUTPUT</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/OUt</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PAGE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PAG</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PBC</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PBF</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PCIRCLE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PCI</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PCOPY</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PCO</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PLOPTS</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PLO</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PMACRO</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PMA</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PMETH</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PME</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PMORE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PMO</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PNUM</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PNU</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/POLYGON</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/POL</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/POST26</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/POST1</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/POS</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PREP7</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PRE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PSEARCH</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PSE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PSF</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PSPEC</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PSP</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PSTATUS</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PST</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PSYMB</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PSY</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PWEDGE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/PWE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/QUIT</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/QUI</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/RATIO</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/RAT</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/RENAME</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/REN</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/REPLOT</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/REP</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/RESET</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/RES</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/RGB</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/RUNST</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/RUN</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/SECLIB</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/SEC</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/SEG</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/SHADE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/SHA</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/SHOWDISP</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/SHOW</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/SHO</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/SHRINK</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/SHR</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/SOLU</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/SOL</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/SSCALE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/SSC</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/STATUS</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/STA</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/STITLE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/STI</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/SYP</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/SYS</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/TITLE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/TIT</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/TLABEL</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/TLA</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/TRIAD</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/TRI</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/TRLCY</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/TRL</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/TSPEC</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/TSP</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/TYPE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/TYP</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/UCMD</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/UCM</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/UIS</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/UI</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/UNITS</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/UNI</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/USER</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/USE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/VCONE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/VCO</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/VIEW</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/VIE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/VSCALE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/VSC</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/VUP</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/WAIT</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/WAI</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/WINDOW</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/WIN</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/XRANGE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/XRA</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/YRANGE</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/YRA</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/ZOOM</SEQ>
+ <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">/ZOO</SEQ>
+
+
+
+ <SEQ TYPE="OPERATOR">+</SEQ>
+ <SEQ TYPE="OPERATOR">-</SEQ>
+ <SEQ TYPE="OPERATOR">$</SEQ>
+ <SEQ TYPE="OPERATOR">=</SEQ>
+ <SEQ TYPE="OPERATOR">(</SEQ>
+ <SEQ TYPE="OPERATOR">)</SEQ>
+ <SEQ TYPE="OPERATOR">,</SEQ>
+ <SEQ TYPE="NULL">;</SEQ>
+ <SEQ TYPE="OPERATOR">*</SEQ>
+ <SEQ TYPE="OPERATOR">/</SEQ>
+
+ <!-- *msg command: variable formats -->
+ <SEQ TYPE="KEYWORD2">%C</SEQ> <!-- alphamuneric format -->
+ <SEQ TYPE="KEYWORD2">%G</SEQ> <!-- double precision format -->
+ <SEQ TYPE="KEYWORD2">%I</SEQ> <!-- integer format -->
+ <SEQ TYPE="KEYWORD2">%/</SEQ> <!-- line break -->
+
+ <!-- variables -->
+ <SPAN TYPE="FUNCTION" NO_LINE_BREAK="TRUE">
+ <BEGIN>%</BEGIN>
+ <END>%</END>
+ </SPAN>
+
+ <KEYWORDS>
+
+<!-- ANSYS Commands (incl. abbreviated version) -->
+
+ <KEYWORD1>A</KEYWORD1>
+ <KEYWORD1>AADD</KEYWORD1>
+ <KEYWORD1>AADD</KEYWORD1>
+ <KEYWORD1>AATT</KEYWORD1>
+ <KEYWORD1>AATT</KEYWORD1>
+ <KEYWORD1>ABBR</KEYWORD1>
+ <KEYWORD1>ABBRES</KEYWORD1>
+ <KEYWORD1>ABBS</KEYWORD1>
+ <KEYWORD1>ABBSAV</KEYWORD1>
+ <KEYWORD1>ABS</KEYWORD1>
+ <KEYWORD1>ACCA</KEYWORD1>
+ <KEYWORD1>ACCAT</KEYWORD1>
+ <KEYWORD1>ACEL</KEYWORD1>
+ <KEYWORD1>ACEL</KEYWORD1>
+ <KEYWORD1>ACLE</KEYWORD1>
+ <KEYWORD1>ACLEAR</KEYWORD1>
+ <KEYWORD1>ADAP</KEYWORD1>
+ <KEYWORD1>ADAPT</KEYWORD1>
+ <KEYWORD1>ADD</KEYWORD1>
+ <KEYWORD1>ADDA</KEYWORD1>
+ <KEYWORD1>ADDAM</KEYWORD1>
+ <KEYWORD1>ADEL</KEYWORD1>
+ <KEYWORD1>ADELE</KEYWORD1>
+ <KEYWORD1>ADGL</KEYWORD1>
+ <KEYWORD1>ADGL</KEYWORD1>
+ <KEYWORD1>ADRA</KEYWORD1>
+ <KEYWORD1>ADRAG</KEYWORD1>
+ <KEYWORD1>AFIL</KEYWORD1>
+ <KEYWORD1>AFILLT</KEYWORD1>
+ <KEYWORD1>AFLI</KEYWORD1>
+ <KEYWORD1>AFLIST</KEYWORD1>
+ <KEYWORD1>AFSU</KEYWORD1>
+ <KEYWORD1>AFSURF</KEYWORD1>
+ <KEYWORD1>AGEN</KEYWORD1>
+ <KEYWORD1>AGEN</KEYWORD1>
+ <KEYWORD1>AGLU</KEYWORD1>
+ <KEYWORD1>AGLUE</KEYWORD1>
+ <KEYWORD1>AINA</KEYWORD1>
+ <KEYWORD1>AINA</KEYWORD1>
+ <KEYWORD1>AINP</KEYWORD1>
+ <KEYWORD1>AINP</KEYWORD1>
+ <KEYWORD1>AINV</KEYWORD1>
+ <KEYWORD1>AINV</KEYWORD1>
+ <KEYWORD1>AL</KEYWORD1>
+ <KEYWORD1>ALIS</KEYWORD1>
+ <KEYWORD1>ALIST</KEYWORD1>
+ <KEYWORD1>ALLS</KEYWORD1>
+ <KEYWORD1>ALLSEL</KEYWORD1>
+ <KEYWORD1>ALPF</KEYWORD1>
+ <KEYWORD1>ALPFILL</KEYWORD1>
+ <KEYWORD1>ALPH</KEYWORD1>
+ <KEYWORD1>ALPHAD</KEYWORD1>
+ <KEYWORD1>AMAP</KEYWORD1>
+ <KEYWORD1>AMAP</KEYWORD1>
+ <KEYWORD1>AMES</KEYWORD1>
+ <KEYWORD1>AMESH</KEYWORD1>
+ <KEYWORD1>ANCN</KEYWORD1>
+ <KEYWORD1>ANCNTR</KEYWORD1>
+ <KEYWORD1>ANCU</KEYWORD1>
+ <KEYWORD1>ANCUT</KEYWORD1>
+ <KEYWORD1>ANDA</KEYWORD1>
+ <KEYWORD1>ANDATA</KEYWORD1>
+ <KEYWORD1>ANDS</KEYWORD1>
+ <KEYWORD1>ANDSCL</KEYWORD1>
+ <KEYWORD1>ANDY</KEYWORD1>
+ <KEYWORD1>ANDYNA</KEYWORD1>
+ <KEYWORD1>ANFL</KEYWORD1>
+ <KEYWORD1>ANFLOW</KEYWORD1>
+ <KEYWORD1>ANIM</KEYWORD1>
+ <KEYWORD1>ANIM</KEYWORD1>
+ <KEYWORD1>ANIS</KEYWORD1>
+ <KEYWORD1>ANISOS</KEYWORD1>
+ <KEYWORD1>ANMO</KEYWORD1>
+ <KEYWORD1>ANMODE</KEYWORD1>
+ <KEYWORD1>ANOR</KEYWORD1>
+ <KEYWORD1>ANORM</KEYWORD1>
+ <KEYWORD1>ANTI</KEYWORD1>
+ <KEYWORD1>ANTIME</KEYWORD1>
+ <KEYWORD1>ANTY</KEYWORD1>
+ <KEYWORD1>ANTYPE</KEYWORD1>
+ <KEYWORD1>AOFF</KEYWORD1>
+ <KEYWORD1>AOFFST</KEYWORD1>
+ <KEYWORD1>AOVL</KEYWORD1>
+ <KEYWORD1>AOVLAP</KEYWORD1>
+ <KEYWORD1>APLO</KEYWORD1>
+ <KEYWORD1>APLOT</KEYWORD1>
+ <KEYWORD1>APPE</KEYWORD1>
+ <KEYWORD1>APPEND</KEYWORD1>
+ <KEYWORD1>APTN</KEYWORD1>
+ <KEYWORD1>APTN</KEYWORD1>
+ <KEYWORD1>ARCL</KEYWORD1>
+ <KEYWORD1>ARCLEN</KEYWORD1>
+ <KEYWORD1>ARCO</KEYWORD1>
+ <KEYWORD1>ARCOLLAPSE</KEYWORD1>
+ <KEYWORD1>ARCT</KEYWORD1>
+ <KEYWORD1>ARCTRM</KEYWORD1>
+ <KEYWORD1>ARDE</KEYWORD1>
+ <KEYWORD1>ARDETACH</KEYWORD1>
+ <KEYWORD1>AREA</KEYWORD1>
+ <KEYWORD1>AREAS</KEYWORD1>
+ <KEYWORD1>AREF</KEYWORD1>
+ <KEYWORD1>AREFINE</KEYWORD1>
+ <KEYWORD1>AREV</KEYWORD1>
+ <KEYWORD1>AREVERSE</KEYWORD1>
+ <KEYWORD1>ARFI</KEYWORD1>
+ <KEYWORD1>ARFILL</KEYWORD1>
+ <KEYWORD1>ARME</KEYWORD1>
+ <KEYWORD1>ARMERGE</KEYWORD1>
+ <KEYWORD1>AROT</KEYWORD1>
+ <KEYWORD1>AROTAT</KEYWORD1>
+ <KEYWORD1>ARSC</KEYWORD1>
+ <KEYWORD1>ARSCALE</KEYWORD1>
+ <KEYWORD1>ARSP</KEYWORD1>
+ <KEYWORD1>ARSPLIT</KEYWORD1>
+ <KEYWORD1>ARSY</KEYWORD1>
+ <KEYWORD1>ARSYM</KEYWORD1>
+ <KEYWORD1>ASBA</KEYWORD1>
+ <KEYWORD1>ASBA</KEYWORD1>
+ <KEYWORD1>ASBL</KEYWORD1>
+ <KEYWORD1>ASBL</KEYWORD1>
+ <KEYWORD1>ASBV</KEYWORD1>
+ <KEYWORD1>ASBV</KEYWORD1>
+ <KEYWORD1>ASBW</KEYWORD1>
+ <KEYWORD1>ASBW</KEYWORD1>
+ <KEYWORD1>ASEL</KEYWORD1>
+ <KEYWORD1>ASEL</KEYWORD1>
+ <KEYWORD1>ASKI</KEYWORD1>
+ <KEYWORD1>ASKIN</KEYWORD1>
+ <KEYWORD1>ASLL</KEYWORD1>
+ <KEYWORD1>ASLL</KEYWORD1>
+ <KEYWORD1>ASLV</KEYWORD1>
+ <KEYWORD1>ASLV</KEYWORD1>
+ <KEYWORD1>ASUB</KEYWORD1>
+ <KEYWORD1>ASUB</KEYWORD1>
+ <KEYWORD1>ASUM</KEYWORD1>
+ <KEYWORD1>ASUM</KEYWORD1>
+ <KEYWORD1>ATAN</KEYWORD1>
+ <KEYWORD1>ATAN</KEYWORD1>
+ <KEYWORD1>ATRA</KEYWORD1>
+ <KEYWORD1>ATRAN</KEYWORD1>
+ <KEYWORD1>ATYP</KEYWORD1>
+ <KEYWORD1>ATYPE</KEYWORD1>
+ <KEYWORD1>AUTO</KEYWORD1>
+ <KEYWORD1>AUTOTS</KEYWORD1>
+ <KEYWORD1>AVPR</KEYWORD1>
+ <KEYWORD1>AVPRIN</KEYWORD1>
+ <KEYWORD1>AVRE</KEYWORD1>
+ <KEYWORD1>AVRES</KEYWORD1>
+ <KEYWORD1>BELL</KEYWORD1>
+ <KEYWORD1>BELLOW</KEYWORD1>
+ <KEYWORD1>BEND</KEYWORD1>
+ <KEYWORD1>BEND</KEYWORD1>
+ <KEYWORD1>BETA</KEYWORD1>
+ <KEYWORD1>BETAD</KEYWORD1>
+ <KEYWORD1>BF</KEYWORD1>
+ <KEYWORD1>BFA</KEYWORD1>
+ <KEYWORD1>BFAD</KEYWORD1>
+ <KEYWORD1>BFADELE</KEYWORD1>
+ <KEYWORD1>BFAL</KEYWORD1>
+ <KEYWORD1>BFALIST</KEYWORD1>
+ <KEYWORD1>BFCU</KEYWORD1>
+ <KEYWORD1>BFCUM</KEYWORD1>
+ <KEYWORD1>BFDE</KEYWORD1>
+ <KEYWORD1>BFDELE</KEYWORD1>
+ <KEYWORD1>BFE</KEYWORD1>
+ <KEYWORD1>BFEC</KEYWORD1>
+ <KEYWORD1>BFECUM</KEYWORD1>
+ <KEYWORD1>BFED</KEYWORD1>
+ <KEYWORD1>BFEDELE</KEYWORD1>
+ <KEYWORD1>BFEL</KEYWORD1>
+ <KEYWORD1>BFELIST</KEYWORD1>
+ <KEYWORD1>BFES</KEYWORD1>
+ <KEYWORD1>BFESCAL</KEYWORD1>
+ <KEYWORD1>BFIN</KEYWORD1>
+ <KEYWORD1>BFINT</KEYWORD1>
+ <KEYWORD1>BFK</KEYWORD1>
+ <KEYWORD1>BFKD</KEYWORD1>
+ <KEYWORD1>BFKDELE</KEYWORD1>
+ <KEYWORD1>BFKL</KEYWORD1>
+ <KEYWORD1>BFKLIST</KEYWORD1>
+ <KEYWORD1>BFL</KEYWORD1>
+ <KEYWORD1>BFLD</KEYWORD1>
+ <KEYWORD1>BFLDELE</KEYWORD1>
+ <KEYWORD1>BFLI</KEYWORD1>
+ <KEYWORD1>BFLIST</KEYWORD1>
+ <KEYWORD1>BFLL</KEYWORD1>
+ <KEYWORD1>BFLLIST</KEYWORD1>
+ <KEYWORD1>BFSC</KEYWORD1>
+ <KEYWORD1>BFSCALE</KEYWORD1>
+ <KEYWORD1>BFTR</KEYWORD1>
+ <KEYWORD1>BFTRAN</KEYWORD1>
+ <KEYWORD1>BFUN</KEYWORD1>
+ <KEYWORD1>BFUNIF</KEYWORD1>
+ <KEYWORD1>BFV</KEYWORD1>
+ <KEYWORD1>BFVD</KEYWORD1>
+ <KEYWORD1>BFVDELE</KEYWORD1>
+ <KEYWORD1>BFVL</KEYWORD1>
+ <KEYWORD1>BFVLIST</KEYWORD1>
+ <KEYWORD1>BIOO</KEYWORD1>
+ <KEYWORD1>BIOOPT</KEYWORD1>
+ <KEYWORD1>BIOT</KEYWORD1>
+ <KEYWORD1>BIOT</KEYWORD1>
+ <KEYWORD1>BLC4</KEYWORD1>
+ <KEYWORD1>BLC4</KEYWORD1>
+ <KEYWORD1>BLC5</KEYWORD1>
+ <KEYWORD1>BLC5</KEYWORD1>
+ <KEYWORD1>BLOC</KEYWORD1>
+ <KEYWORD1>BLOCK</KEYWORD1>
+ <KEYWORD1>BOOL</KEYWORD1>
+ <KEYWORD1>BOOL</KEYWORD1>
+ <KEYWORD1>BOPT</KEYWORD1>
+ <KEYWORD1>BOPTN</KEYWORD1>
+ <KEYWORD1>BRAN</KEYWORD1>
+ <KEYWORD1>BRANCH</KEYWORD1>
+ <KEYWORD1>BSPL</KEYWORD1>
+ <KEYWORD1>BSPLIN</KEYWORD1>
+ <KEYWORD1>BTOL</KEYWORD1>
+ <KEYWORD1>BTOL</KEYWORD1>
+ <KEYWORD1>BUCO</KEYWORD1>
+ <KEYWORD1>BUCOPT</KEYWORD1>
+ <KEYWORD1>CALC</KEYWORD1>
+ <KEYWORD1>CALC</KEYWORD1>
+ <KEYWORD1>CBDO</KEYWORD1>
+ <KEYWORD1>CBDOF</KEYWORD1>
+ <KEYWORD1>CDRE</KEYWORD1>
+ <KEYWORD1>CDREAD</KEYWORD1>
+ <KEYWORD1>CDWR</KEYWORD1>
+ <KEYWORD1>CDWRITE</KEYWORD1>
+ <KEYWORD1>CE</KEYWORD1>
+ <KEYWORD1>CECM</KEYWORD1>
+ <KEYWORD1>CECMOD</KEYWORD1>
+ <KEYWORD1>CECY</KEYWORD1>
+ <KEYWORD1>CECYC</KEYWORD1>
+ <KEYWORD1>CEDE</KEYWORD1>
+ <KEYWORD1>CEDELE</KEYWORD1>
+ <KEYWORD1>CEIN</KEYWORD1>
+ <KEYWORD1>CEINTF</KEYWORD1>
+ <KEYWORD1>CELI</KEYWORD1>
+ <KEYWORD1>CELIST</KEYWORD1>
+ <KEYWORD1>CENT</KEYWORD1>
+ <KEYWORD1>CENTER</KEYWORD1>
+ <KEYWORD1>CEQN</KEYWORD1>
+ <KEYWORD1>CEQN</KEYWORD1>
+ <KEYWORD1>CERI</KEYWORD1>
+ <KEYWORD1>CERIG</KEYWORD1>
+ <KEYWORD1>CESG</KEYWORD1>
+ <KEYWORD1>CESGEN</KEYWORD1>
+ <KEYWORD1>CFAC</KEYWORD1>
+ <KEYWORD1>CFACT</KEYWORD1>
+ <KEYWORD1>CGLO</KEYWORD1>
+ <KEYWORD1>CGLOC</KEYWORD1>
+ <KEYWORD1>CGOM</KEYWORD1>
+ <KEYWORD1>CGOMGA</KEYWORD1>
+ <KEYWORD1>CHEC</KEYWORD1>
+ <KEYWORD1>CHECK</KEYWORD1>
+ <KEYWORD1>CHKM</KEYWORD1>
+ <KEYWORD1>CHKMSH</KEYWORD1>
+ <KEYWORD1>CIRC</KEYWORD1>
+ <KEYWORD1>CIRCLE</KEYWORD1>
+ <KEYWORD1>CLOC</KEYWORD1>
+ <KEYWORD1>CLOCAL</KEYWORD1>
+ <KEYWORD1>CLOG</KEYWORD1>
+ <KEYWORD1>CLOG</KEYWORD1>
+ <KEYWORD1>CLRM</KEYWORD1>
+ <KEYWORD1>CLRMSHLN</KEYWORD1>
+ <KEYWORD1>CM</KEYWORD1>
+ <KEYWORD1>CMDE</KEYWORD1>
+ <KEYWORD1>CMDELE</KEYWORD1>
+ <KEYWORD1>CMED</KEYWORD1>
+ <KEYWORD1>CMEDIT</KEYWORD1>
+ <KEYWORD1>CMGR</KEYWORD1>
+ <KEYWORD1>CMGRP</KEYWORD1>
+ <KEYWORD1>CMLI</KEYWORD1>
+ <KEYWORD1>CMLIST</KEYWORD1>
+ <KEYWORD1>CMPL</KEYWORD1>
+ <KEYWORD1>CMPLOT</KEYWORD1>
+ <KEYWORD1>CMSE</KEYWORD1>
+ <KEYWORD1>CMSEL</KEYWORD1>
+ <KEYWORD1>CNVT</KEYWORD1>
+ <KEYWORD1>CNVTOL</KEYWORD1>
+ <KEYWORD1>CON4</KEYWORD1>
+ <KEYWORD1>CON4</KEYWORD1>
+ <KEYWORD1>CONE</KEYWORD1>
+ <KEYWORD1>CONE</KEYWORD1>
+ <KEYWORD1>CONJ</KEYWORD1>
+ <KEYWORD1>CONJUG</KEYWORD1>
+ <KEYWORD1>COUP</KEYWORD1>
+ <KEYWORD1>COUPLE</KEYWORD1>
+ <KEYWORD1>COVA</KEYWORD1>
+ <KEYWORD1>COVAL</KEYWORD1>
+ <KEYWORD1>CP</KEYWORD1>
+ <KEYWORD1>CPDE</KEYWORD1>
+ <KEYWORD1>CPDELE</KEYWORD1>
+ <KEYWORD1>CPIN</KEYWORD1>
+ <KEYWORD1>CPINTF</KEYWORD1>
+ <KEYWORD1>CPLG</KEYWORD1>
+ <KEYWORD1>CPLGEN</KEYWORD1>
+ <KEYWORD1>CPLI</KEYWORD1>
+ <KEYWORD1>CPLIST</KEYWORD1>
+ <KEYWORD1>CPNG</KEYWORD1>
+ <KEYWORD1>CPNGEN</KEYWORD1>
+ <KEYWORD1>CPSG</KEYWORD1>
+ <KEYWORD1>CPSGEN</KEYWORD1>
+ <KEYWORD1>CQC</KEYWORD1>
+ <KEYWORD1>CRPL</KEYWORD1>
+ <KEYWORD1>CRPLIM</KEYWORD1>
+ <KEYWORD1>CS</KEYWORD1>
+ <KEYWORD1>CSCI</KEYWORD1>
+ <KEYWORD1>CSCIR</KEYWORD1>
+ <KEYWORD1>CSDE</KEYWORD1>
+ <KEYWORD1>CSDELE</KEYWORD1>
+ <KEYWORD1>CSKP</KEYWORD1>
+ <KEYWORD1>CSKP</KEYWORD1>
+ <KEYWORD1>CSLI</KEYWORD1>
+ <KEYWORD1>CSLIST</KEYWORD1>
+ <KEYWORD1>CSWP</KEYWORD1>
+ <KEYWORD1>CSWPLA</KEYWORD1>
+ <KEYWORD1>CSYS</KEYWORD1>
+ <KEYWORD1>CSYS</KEYWORD1>
+ <KEYWORD1>CURR2D</KEYWORD1>
+ <KEYWORD1>CURR</KEYWORD1>
+ <KEYWORD1>CUTC</KEYWORD1>
+ <KEYWORD1>CUTCONTROL</KEYWORD1>
+ <KEYWORD1>CVAR</KEYWORD1>
+ <KEYWORD1>CVAR</KEYWORD1>
+ <KEYWORD1>CYCG</KEYWORD1>
+ <KEYWORD1>CYCGEN</KEYWORD1>
+ <KEYWORD1>CYCS</KEYWORD1>
+ <KEYWORD1>CYCSOL</KEYWORD1>
+ <KEYWORD1>CYL4</KEYWORD1>
+ <KEYWORD1>CYL4</KEYWORD1>
+ <KEYWORD1>CYL5</KEYWORD1>
+ <KEYWORD1>CYL5</KEYWORD1>
+ <KEYWORD1>CYLI</KEYWORD1>
+ <KEYWORD1>CYLIND</KEYWORD1>
+ <KEYWORD1>D</KEYWORD1>
+ <KEYWORD1>DA</KEYWORD1>
+ <KEYWORD1>DADE</KEYWORD1>
+ <KEYWORD1>DADELE</KEYWORD1>
+ <KEYWORD1>DALI</KEYWORD1>
+ <KEYWORD1>DALIST</KEYWORD1>
+ <KEYWORD1>DATA</KEYWORD1>
+ <KEYWORD1>DATA</KEYWORD1>
+ <KEYWORD1>DATA</KEYWORD1>
+ <KEYWORD1>DATADEF</KEYWORD1>
+ <KEYWORD1>DCGO</KEYWORD1>
+ <KEYWORD1>DCGOMG</KEYWORD1>
+ <KEYWORD1>DCUM</KEYWORD1>
+ <KEYWORD1>DCUM</KEYWORD1>
+ <KEYWORD1>DDEL</KEYWORD1>
+ <KEYWORD1>DDELE</KEYWORD1>
+ <KEYWORD1>DEAC</KEYWORD1>
+ <KEYWORD1>DEACT</KEYWORD1>
+ <KEYWORD1>DEFI</KEYWORD1>
+ <KEYWORD1>DEFINE</KEYWORD1>
+ <KEYWORD1>DELT</KEYWORD1>
+ <KEYWORD1>DELTIM</KEYWORD1>
+ <KEYWORD1>DERI</KEYWORD1>
+ <KEYWORD1>DERIV</KEYWORD1>
+ <KEYWORD1>DESI</KEYWORD1>
+ <KEYWORD1>DESIZE</KEYWORD1>
+ <KEYWORD1>DESO</KEYWORD1>
+ <KEYWORD1>DESOL</KEYWORD1>
+ <KEYWORD1>DETA</KEYWORD1>
+ <KEYWORD1>DETAB</KEYWORD1>
+ <KEYWORD1>DIG</KEYWORD1>
+ <KEYWORD1>DIGI</KEYWORD1>
+ <KEYWORD1>DIGIT</KEYWORD1>
+ <KEYWORD1>DISP</KEYWORD1>
+ <KEYWORD1>DISPLAY</KEYWORD1>
+ <KEYWORD1>DK</KEYWORD1>
+ <KEYWORD1>DKDE</KEYWORD1>
+ <KEYWORD1>DKDELE</KEYWORD1>
+ <KEYWORD1>DKLI</KEYWORD1>
+ <KEYWORD1>DKLIST</KEYWORD1>
+ <KEYWORD1>DL</KEYWORD1>
+ <KEYWORD1>DLDE</KEYWORD1>
+ <KEYWORD1>DLDELE</KEYWORD1>
+ <KEYWORD1>DLIS</KEYWORD1>
+ <KEYWORD1>DLIST</KEYWORD1>
+ <KEYWORD1>DLLI</KEYWORD1>
+ <KEYWORD1>DLLIST</KEYWORD1>
+ <KEYWORD1>DMOV</KEYWORD1>
+ <KEYWORD1>DMOVE</KEYWORD1>
+ <KEYWORD1>DMPR</KEYWORD1>
+ <KEYWORD1>DMPRAT</KEYWORD1>
+ <KEYWORD1>DNSO</KEYWORD1>
+ <KEYWORD1>DNSOL</KEYWORD1>
+ <KEYWORD1>DOF</KEYWORD1>
+ <KEYWORD1>DOFS</KEYWORD1>
+ <KEYWORD1>DOFSEL</KEYWORD1>
+ <KEYWORD1>DOME</KEYWORD1>
+ <KEYWORD1>DOMEGA</KEYWORD1>
+ <KEYWORD1>DSCA</KEYWORD1>
+ <KEYWORD1>DSCALE</KEYWORD1>
+ <KEYWORD1>DSET</KEYWORD1>
+ <KEYWORD1>DSET</KEYWORD1>
+ <KEYWORD1>DSUM</KEYWORD1>
+ <KEYWORD1>DSUM</KEYWORD1>
+ <KEYWORD1>DSUR</KEYWORD1>
+ <KEYWORD1>DSURF</KEYWORD1>
+ <KEYWORD1>DSYM</KEYWORD1>
+ <KEYWORD1>DSYM</KEYWORD1>
+ <KEYWORD1>DSYS</KEYWORD1>
+ <KEYWORD1>DSYS</KEYWORD1>
+ <KEYWORD1>DTRA</KEYWORD1>
+ <KEYWORD1>DTRAN</KEYWORD1>
+ <KEYWORD1>DUMP</KEYWORD1>
+ <KEYWORD1>DUMP</KEYWORD1>
+ <KEYWORD1>DYNO</KEYWORD1>
+ <KEYWORD1>DYNOPT</KEYWORD1>
+ <KEYWORD1>E</KEYWORD1>
+ <KEYWORD1>EALI</KEYWORD1>
+ <KEYWORD1>EALIVE</KEYWORD1>
+ <KEYWORD1>EDBO</KEYWORD1>
+ <KEYWORD1>EDBOUND</KEYWORD1>
+ <KEYWORD1>EDBV</KEYWORD1>
+ <KEYWORD1>EDBVIS</KEYWORD1>
+ <KEYWORD1>EDCD</KEYWORD1>
+ <KEYWORD1>EDCDELE</KEYWORD1>
+ <KEYWORD1>EDCG</KEYWORD1>
+ <KEYWORD1>EDCGEN</KEYWORD1>
+ <KEYWORD1>EDCL</KEYWORD1>
+ <KEYWORD1>EDCLIST</KEYWORD1>
+ <KEYWORD1>EDCO</KEYWORD1>
+ <KEYWORD1>EDCONTACT</KEYWORD1>
+ <KEYWORD1>EDCP</KEYWORD1>
+ <KEYWORD1>EDCPU</KEYWORD1>
+ <KEYWORD1>EDCR</KEYWORD1>
+ <KEYWORD1>EDCRB</KEYWORD1>
+ <KEYWORD1>EDCS</KEYWORD1>
+ <KEYWORD1>EDCSC</KEYWORD1>
+ <KEYWORD1>EDCT</KEYWORD1>
+ <KEYWORD1>EDCTS</KEYWORD1>
+ <KEYWORD1>EDCU</KEYWORD1>
+ <KEYWORD1>EDCURVE</KEYWORD1>
+ <KEYWORD1>EDDA</KEYWORD1>
+ <KEYWORD1>EDDAMP</KEYWORD1>
+ <KEYWORD1>EDDR</KEYWORD1>
+ <KEYWORD1>EDDRELAX</KEYWORD1>
+ <KEYWORD1>EDEL</KEYWORD1>
+ <KEYWORD1>EDELE</KEYWORD1>
+ <KEYWORD1>EDEN</KEYWORD1>
+ <KEYWORD1>EDENERGY</KEYWORD1>
+ <KEYWORD1>EDFP</KEYWORD1>
+ <KEYWORD1>EDFPLOT</KEYWORD1>
+ <KEYWORD1>EDHG</KEYWORD1>
+ <KEYWORD1>EDHGLS</KEYWORD1>
+ <KEYWORD1>EDHI</KEYWORD1>
+ <KEYWORD1>EDHIST</KEYWORD1>
+ <KEYWORD1>EDHT</KEYWORD1>
+ <KEYWORD1>EDHTIME</KEYWORD1>
+ <KEYWORD1>EDIN</KEYWORD1>
+ <KEYWORD1>EDINT</KEYWORD1>
+ <KEYWORD1>EDIV</KEYWORD1>
+ <KEYWORD1>EDIVELO</KEYWORD1>
+ <KEYWORD1>EDLC</KEYWORD1>
+ <KEYWORD1>EDLCS</KEYWORD1>
+ <KEYWORD1>EDLD</KEYWORD1>
+ <KEYWORD1>EDLDPLOT</KEYWORD1>
+ <KEYWORD1>EDLO</KEYWORD1>
+ <KEYWORD1>EDLOAD</KEYWORD1>
+ <KEYWORD1>EDMP</KEYWORD1>
+ <KEYWORD1>EDMP</KEYWORD1>
+ <KEYWORD1>EDND</KEYWORD1>
+ <KEYWORD1>EDNDTSD</KEYWORD1>
+ <KEYWORD1>EDNR</KEYWORD1>
+ <KEYWORD1>EDNROT</KEYWORD1>
+ <KEYWORD1>EDOP</KEYWORD1>
+ <KEYWORD1>EDOPT</KEYWORD1>
+ <KEYWORD1>EDOU</KEYWORD1>
+ <KEYWORD1>EDOUT</KEYWORD1>
+ <KEYWORD1>EDRE</KEYWORD1>
+ <KEYWORD1>EDREAD</KEYWORD1>
+ <KEYWORD1>EDRS</KEYWORD1>
+ <KEYWORD1>EDRST</KEYWORD1>
+ <KEYWORD1>EDSH</KEYWORD1>
+ <KEYWORD1>EDSHELL</KEYWORD1>
+ <KEYWORD1>EDSO</KEYWORD1>
+ <KEYWORD1>EDSOLV</KEYWORD1>
+ <KEYWORD1>EDST</KEYWORD1>
+ <KEYWORD1>EDSTART</KEYWORD1>
+ <KEYWORD1>EDWE</KEYWORD1>
+ <KEYWORD1>EDWELD</KEYWORD1>
+ <KEYWORD1>EDWR</KEYWORD1>
+ <KEYWORD1>EDWRITE</KEYWORD1>
+ <KEYWORD1>EGEN</KEYWORD1>
+ <KEYWORD1>EGEN</KEYWORD1>
+ <KEYWORD1>EINT</KEYWORD1>
+ <KEYWORD1>EINTF</KEYWORD1>
+ <KEYWORD1>EKIL</KEYWORD1>
+ <KEYWORD1>EKILL</KEYWORD1>
+ <KEYWORD1>ELEM</KEYWORD1>
+ <KEYWORD1>ELEM</KEYWORD1>
+ <KEYWORD1>ELIS</KEYWORD1>
+ <KEYWORD1>ELIST</KEYWORD1>
+ <KEYWORD1>EMAG</KEYWORD1>
+ <KEYWORD1>EMAGERR</KEYWORD1>
+ <KEYWORD1>EMF</KEYWORD1>
+ <KEYWORD1>EMID</KEYWORD1>
+ <KEYWORD1>EMID</KEYWORD1>
+ <KEYWORD1>EMIS</KEYWORD1>
+ <KEYWORD1>EMIS</KEYWORD1>
+ <KEYWORD1>EMOD</KEYWORD1>
+ <KEYWORD1>EMODIF</KEYWORD1>
+ <KEYWORD1>EMOR</KEYWORD1>
+ <KEYWORD1>EMORE</KEYWORD1>
+ <KEYWORD1>EMSY</KEYWORD1>
+ <KEYWORD1>EMSYM</KEYWORD1>
+ <KEYWORD1>EMUN</KEYWORD1>
+ <KEYWORD1>EMUNIT</KEYWORD1>
+ <KEYWORD1>EN</KEYWORD1>
+ <KEYWORD1>ENGE</KEYWORD1>
+ <KEYWORD1>ENGEN</KEYWORD1>
+ <KEYWORD1>ENOR</KEYWORD1>
+ <KEYWORD1>ENORM</KEYWORD1>
+ <KEYWORD1>ENSY</KEYWORD1>
+ <KEYWORD1>ENSYM</KEYWORD1>
+ <KEYWORD1>EPLO</KEYWORD1>
+ <KEYWORD1>EPLOT</KEYWORD1>
+ <KEYWORD1>EQSL</KEYWORD1>
+ <KEYWORD1>EQSLV</KEYWORD1>
+ <KEYWORD1>ERAS</KEYWORD1>
+ <KEYWORD1>ERASE</KEYWORD1>
+ <KEYWORD1>EREA</KEYWORD1>
+ <KEYWORD1>EREAD</KEYWORD1>
+ <KEYWORD1>EREF</KEYWORD1>
+ <KEYWORD1>EREFINE</KEYWORD1>
+ <KEYWORD1>ERES</KEYWORD1>
+ <KEYWORD1>ERESX</KEYWORD1>
+ <KEYWORD1>ERNO</KEYWORD1>
+ <KEYWORD1>ERNORM</KEYWORD1>
+ <KEYWORD1>ERRA</KEYWORD1>
+ <KEYWORD1>ERRANG</KEYWORD1>
+ <KEYWORD1>ESEL</KEYWORD1>
+ <KEYWORD1>ESEL</KEYWORD1>
+ <KEYWORD1>ESIZ</KEYWORD1>
+ <KEYWORD1>ESIZE</KEYWORD1>
+ <KEYWORD1>ESLA</KEYWORD1>
+ <KEYWORD1>ESLA</KEYWORD1>
+ <KEYWORD1>ESLL</KEYWORD1>
+ <KEYWORD1>ESLL</KEYWORD1>
+ <KEYWORD1>ESLN</KEYWORD1>
+ <KEYWORD1>ESLN</KEYWORD1>
+ <KEYWORD1>ESLV</KEYWORD1>
+ <KEYWORD1>ESLV</KEYWORD1>
+ <KEYWORD1>ESOL</KEYWORD1>
+ <KEYWORD1>ESOL</KEYWORD1>
+ <KEYWORD1>ESOR</KEYWORD1>
+ <KEYWORD1>ESORT</KEYWORD1>
+ <KEYWORD1>ESTI</KEYWORD1>
+ <KEYWORD1>ESTIF</KEYWORD1>
+ <KEYWORD1>ESUR</KEYWORD1>
+ <KEYWORD1>ESURF</KEYWORD1>
+ <KEYWORD1>ESYM</KEYWORD1>
+ <KEYWORD1>ESYM</KEYWORD1>
+ <KEYWORD1>ESYS</KEYWORD1>
+ <KEYWORD1>ESYS</KEYWORD1>
+ <KEYWORD1>ET</KEYWORD1>
+ <KEYWORD1>ETAB</KEYWORD1>
+ <KEYWORD1>ETABLE</KEYWORD1>
+ <KEYWORD1>ETCH</KEYWORD1>
+ <KEYWORD1>ETCHG</KEYWORD1>
+ <KEYWORD1>ETDE</KEYWORD1>
+ <KEYWORD1>ETDELE</KEYWORD1>
+ <KEYWORD1>ETLI</KEYWORD1>
+ <KEYWORD1>ETLIST</KEYWORD1>
+ <KEYWORD1>ETYP</KEYWORD1>
+ <KEYWORD1>ETYPE</KEYWORD1>
+ <KEYWORD1>EUSO</KEYWORD1>
+ <KEYWORD1>EUSORT</KEYWORD1>
+ <KEYWORD1>EWRI</KEYWORD1>
+ <KEYWORD1>EWRITE</KEYWORD1>
+ <KEYWORD1>EXP</KEYWORD1>
+ <KEYWORD1>EXPA</KEYWORD1>
+ <KEYWORD1>EXPA</KEYWORD1>
+ <KEYWORD1>EXPAND</KEYWORD1>
+ <KEYWORD1>EXPASS</KEYWORD1>
+ <KEYWORD1>EXPS</KEYWORD1>
+ <KEYWORD1>EXPSOL</KEYWORD1>
+ <KEYWORD1>EXTO</KEYWORD1>
+ <KEYWORD1>EXTOPT</KEYWORD1>
+ <KEYWORD1>EXTR</KEYWORD1>
+ <KEYWORD1>EXTREM</KEYWORD1>
+ <KEYWORD1>FATI</KEYWORD1>
+ <KEYWORD1>FATIGUE</KEYWORD1>
+ <KEYWORD1>FCUM</KEYWORD1>
+ <KEYWORD1>FCUM</KEYWORD1>
+ <KEYWORD1>FDEL</KEYWORD1>
+ <KEYWORD1>FDELE</KEYWORD1>
+ <KEYWORD1>FE</KEYWORD1>
+ <KEYWORD1>FEBO</KEYWORD1>
+ <KEYWORD1>FEBODY</KEYWORD1>
+ <KEYWORD1>FECO</KEYWORD1>
+ <KEYWORD1>FECONS</KEYWORD1>
+ <KEYWORD1>FEFO</KEYWORD1>
+ <KEYWORD1>FEFOR</KEYWORD1>
+ <KEYWORD1>FELI</KEYWORD1>
+ <KEYWORD1>FELIST</KEYWORD1>
+ <KEYWORD1>FESU</KEYWORD1>
+ <KEYWORD1>FESURF</KEYWORD1>
+ <KEYWORD1>FILE</KEYWORD1>
+ <KEYWORD1>FILE</KEYWORD1>
+ <KEYWORD1>FILE</KEYWORD1>
+ <KEYWORD1>FILE</KEYWORD1>
+ <KEYWORD1>FILEAUX2</KEYWORD1>
+ <KEYWORD1>FILEDISP</KEYWORD1>
+ <KEYWORD1>FILL</KEYWORD1>
+ <KEYWORD1>FILL</KEYWORD1>
+ <KEYWORD1>FILL</KEYWORD1>
+ <KEYWORD1>FILLDATA</KEYWORD1>
+ <KEYWORD1>FINI</KEYWORD1>
+ <KEYWORD1>FINISH</KEYWORD1>
+ <KEYWORD1>FITE</KEYWORD1>
+ <KEYWORD1>FITEM</KEYWORD1>
+ <KEYWORD1>FK</KEYWORD1>
+ <KEYWORD1>FKDE</KEYWORD1>
+ <KEYWORD1>FKDELE</KEYWORD1>
+ <KEYWORD1>FKLI</KEYWORD1>
+ <KEYWORD1>FKLIST</KEYWORD1>
+ <KEYWORD1>FL</KEYWORD1>
+ <KEYWORD1>FLAN</KEYWORD1>
+ <KEYWORD1>FLANGE</KEYWORD1>
+ <KEYWORD1>FLDA</KEYWORD1>
+ <KEYWORD1>FLDATA</KEYWORD1>
+ <KEYWORD1>FLDATA10</KEYWORD1>
+ <KEYWORD1>FLDATA11</KEYWORD1>
+ <KEYWORD1>FLDATA12</KEYWORD1>
+ <KEYWORD1>FLDATA13</KEYWORD1>
+ <KEYWORD1>FLDATA14</KEYWORD1>
+ <KEYWORD1>FLDATA15</KEYWORD1>
+ <KEYWORD1>FLDATA16</KEYWORD1>
+ <KEYWORD1>FLDATA17</KEYWORD1>
+ <KEYWORD1>FLDATA18</KEYWORD1>
+ <KEYWORD1>FLDATA19</KEYWORD1>
+ <KEYWORD1>FLDATA1</KEYWORD1>
+ <KEYWORD1>FLDATA20</KEYWORD1>
+ <KEYWORD1>FLDATA20A</KEYWORD1>
+ <KEYWORD1>FLDATA21</KEYWORD1>
+ <KEYWORD1>FLDATA22</KEYWORD1>
+ <KEYWORD1>FLDATA23</KEYWORD1>
+ <KEYWORD1>FLDATA24</KEYWORD1>
+ <KEYWORD1>FLDATA24A</KEYWORD1>
+ <KEYWORD1>FLDATA24B</KEYWORD1>
+ <KEYWORD1>FLDATA24C</KEYWORD1>
+ <KEYWORD1>FLDATA24D</KEYWORD1>
+ <KEYWORD1>FLDATA25</KEYWORD1>
+ <KEYWORD1>FLDATA26</KEYWORD1>
+ <KEYWORD1>FLDATA27</KEYWORD1>
+ <KEYWORD1>FLDATA28</KEYWORD1>
+ <KEYWORD1>FLDATA29</KEYWORD1>
+ <KEYWORD1>FLDATA2</KEYWORD1>
+ <KEYWORD1>FLDATA30</KEYWORD1>
+ <KEYWORD1>FLDATA31</KEYWORD1>
+ <KEYWORD1>FLDATA32</KEYWORD1>
+ <KEYWORD1>FLDATA33</KEYWORD1>
+ <KEYWORD1>FLDATA37</KEYWORD1>
+ <KEYWORD1>FLDATA3</KEYWORD1>
+ <KEYWORD1>FLDATA4</KEYWORD1>
+ <KEYWORD1>FLDATA4A</KEYWORD1>
+ <KEYWORD1>FLDATA5</KEYWORD1>
+ <KEYWORD1>FLDATA6</KEYWORD1>
+ <KEYWORD1>FLDATA7</KEYWORD1>
+ <KEYWORD1>FLDATA8</KEYWORD1>
+ <KEYWORD1>FLDATA9</KEYWORD1>
+ <KEYWORD1>FLDATA</KEYWORD1>
+ <KEYWORD1>FLIS</KEYWORD1>
+ <KEYWORD1>FLIST</KEYWORD1>
+ <KEYWORD1>FLLI</KEYWORD1>
+ <KEYWORD1>FLLIST</KEYWORD1>
+ <KEYWORD1>FLOC</KEYWORD1>
+ <KEYWORD1>FLOCHECK</KEYWORD1>
+ <KEYWORD1>FLOT</KEYWORD1>
+ <KEYWORD1>FLOTRAN</KEYWORD1>
+ <KEYWORD1>FLRE</KEYWORD1>
+ <KEYWORD1>FLREAD</KEYWORD1>
+ <KEYWORD1>FLST</KEYWORD1>
+ <KEYWORD1>FLST</KEYWORD1>
+ <KEYWORD1>FLUX</KEYWORD1>
+ <KEYWORD1>FLUXV</KEYWORD1>
+ <KEYWORD1>FMAG</KEYWORD1>
+ <KEYWORD1>FMAG</KEYWORD1>
+ <KEYWORD1>FMAGBC</KEYWORD1>
+ <KEYWORD1>FMAGSUM</KEYWORD1>
+ <KEYWORD1>FOR2</KEYWORD1>
+ <KEYWORD1>FOR2D</KEYWORD1>
+ <KEYWORD1>FORC</KEYWORD1>
+ <KEYWORD1>FORCE</KEYWORD1>
+ <KEYWORD1>FORM</KEYWORD1>
+ <KEYWORD1>FORM</KEYWORD1>
+ <KEYWORD1>FP</KEYWORD1>
+ <KEYWORD1>FPLI</KEYWORD1>
+ <KEYWORD1>FPLIST</KEYWORD1>
+ <KEYWORD1>FREQ</KEYWORD1>
+ <KEYWORD1>FREQ</KEYWORD1>
+ <KEYWORD1>FS</KEYWORD1>
+ <KEYWORD1>FSCA</KEYWORD1>
+ <KEYWORD1>FSCALE</KEYWORD1>
+ <KEYWORD1>FSDE</KEYWORD1>
+ <KEYWORD1>FSDELE</KEYWORD1>
+ <KEYWORD1>FSLI</KEYWORD1>
+ <KEYWORD1>FSLIST</KEYWORD1>
+ <KEYWORD1>FSNO</KEYWORD1>
+ <KEYWORD1>FSNODE</KEYWORD1>
+ <KEYWORD1>FSPL</KEYWORD1>
+ <KEYWORD1>FSPLOT</KEYWORD1>
+ <KEYWORD1>FSSE</KEYWORD1>
+ <KEYWORD1>FSSECT</KEYWORD1>
+ <KEYWORD1>FSUM</KEYWORD1>
+ <KEYWORD1>FSUM</KEYWORD1>
+ <KEYWORD1>FTCA</KEYWORD1>
+ <KEYWORD1>FTCALC</KEYWORD1>
+ <KEYWORD1>FTRA</KEYWORD1>
+ <KEYWORD1>FTRAN</KEYWORD1>
+ <KEYWORD1>FTSI</KEYWORD1>
+ <KEYWORD1>FTSIZE</KEYWORD1>
+ <KEYWORD1>FTWR</KEYWORD1>
+ <KEYWORD1>FTWRITE</KEYWORD1>
+ <KEYWORD1>FVME</KEYWORD1>
+ <KEYWORD1>FVMESH</KEYWORD1>
+ <KEYWORD1>GAP</KEYWORD1>
+ <KEYWORD1>GAPF</KEYWORD1>
+ <KEYWORD1>GAPFINISH</KEYWORD1>
+ <KEYWORD1>GAPL</KEYWORD1>
+ <KEYWORD1>GAPLIST</KEYWORD1>
+ <KEYWORD1>GAPM</KEYWORD1>
+ <KEYWORD1>GAPMERGE</KEYWORD1>
+ <KEYWORD1>GAPO</KEYWORD1>
+ <KEYWORD1>GAPOPT</KEYWORD1>
+ <KEYWORD1>GAPP</KEYWORD1>
+ <KEYWORD1>GAPPLOT</KEYWORD1>
+ <KEYWORD1>GAUG</KEYWORD1>
+ <KEYWORD1>GAUGE</KEYWORD1>
+ <KEYWORD1>GCGE</KEYWORD1>
+ <KEYWORD1>GCGEN</KEYWORD1>
+ <KEYWORD1>GENO</KEYWORD1>
+ <KEYWORD1>GENOPT</KEYWORD1>
+ <KEYWORD1>GEOM</KEYWORD1>
+ <KEYWORD1>GEOM</KEYWORD1>
+ <KEYWORD1>GEOM</KEYWORD1>
+ <KEYWORD1>GEOMETRY</KEYWORD1>
+ <KEYWORD1>GP</KEYWORD1>
+ <KEYWORD1>GPDE</KEYWORD1>
+ <KEYWORD1>GPDELE</KEYWORD1>
+ <KEYWORD1>GPLI</KEYWORD1>
+ <KEYWORD1>GPLIST</KEYWORD1>
+ <KEYWORD1>GPLO</KEYWORD1>
+ <KEYWORD1>GPLOT</KEYWORD1>
+ <KEYWORD1>GRP</KEYWORD1>
+ <KEYWORD1>GSUM</KEYWORD1>
+ <KEYWORD1>GSUM</KEYWORD1>
+ <KEYWORD1>HARF</KEYWORD1>
+ <KEYWORD1>HARFRQ</KEYWORD1>
+ <KEYWORD1>HELP</KEYWORD1>
+ <KEYWORD1>HELP</KEYWORD1>
+ <KEYWORD1>HELP</KEYWORD1>
+ <KEYWORD1>HELPDISP</KEYWORD1>
+ <KEYWORD1>HFSW</KEYWORD1>
+ <KEYWORD1>HFSWEEP</KEYWORD1>
+ <KEYWORD1>HMAG</KEYWORD1>
+ <KEYWORD1>HMAGSOLV</KEYWORD1>
+ <KEYWORD1>HPGL</KEYWORD1>
+ <KEYWORD1>HPGL</KEYWORD1>
+ <KEYWORD1>HPTC</KEYWORD1>
+ <KEYWORD1>HPTCREATE</KEYWORD1>
+ <KEYWORD1>HPTD</KEYWORD1>
+ <KEYWORD1>HPTDELETE</KEYWORD1>
+ <KEYWORD1>HRCP</KEYWORD1>
+ <KEYWORD1>HRCPLX</KEYWORD1>
+ <KEYWORD1>HREX</KEYWORD1>
+ <KEYWORD1>HREXP</KEYWORD1>
+ <KEYWORD1>HROP</KEYWORD1>
+ <KEYWORD1>HROPT</KEYWORD1>
+ <KEYWORD1>HROU</KEYWORD1>
+ <KEYWORD1>HROUT</KEYWORD1>
+ <KEYWORD1>IC</KEYWORD1>
+ <KEYWORD1>ICDE</KEYWORD1>
+ <KEYWORD1>ICDELE</KEYWORD1>
+ <KEYWORD1>ICLI</KEYWORD1>
+ <KEYWORD1>ICLIST</KEYWORD1>
+ <KEYWORD1>IGES</KEYWORD1>
+ <KEYWORD1>IGES</KEYWORD1>
+ <KEYWORD1>IGESIN</KEYWORD1>
+ <KEYWORD1>IGESOUT</KEYWORD1>
+ <KEYWORD1>IMAG</KEYWORD1>
+ <KEYWORD1>IMAGIN</KEYWORD1>
+ <KEYWORD1>IMME</KEYWORD1>
+ <KEYWORD1>IMMED</KEYWORD1>
+ <KEYWORD1>IMPD</KEYWORD1>
+ <KEYWORD1>IMPD</KEYWORD1>
+ <KEYWORD1>INRE</KEYWORD1>
+ <KEYWORD1>INRES</KEYWORD1>
+ <KEYWORD1>INRT</KEYWORD1>
+ <KEYWORD1>INRTIA</KEYWORD1>
+ <KEYWORD1>INT1</KEYWORD1>
+ <KEYWORD1>INT1</KEYWORD1>
+ <KEYWORD1>INTS</KEYWORD1>
+ <KEYWORD1>INTSRF</KEYWORD1>
+ <KEYWORD1>IOPT</KEYWORD1>
+ <KEYWORD1>IOPTN</KEYWORD1>
+ <KEYWORD1>IRLF</KEYWORD1>
+ <KEYWORD1>IRLF</KEYWORD1>
+ <KEYWORD1>IRLI</KEYWORD1>
+ <KEYWORD1>IRLIST</KEYWORD1>
+ <KEYWORD1>K</KEYWORD1>
+ <KEYWORD1>KATT</KEYWORD1>
+ <KEYWORD1>KATT</KEYWORD1>
+ <KEYWORD1>KBC</KEYWORD1>
+ <KEYWORD1>KBET</KEYWORD1>
+ <KEYWORD1>KBETW</KEYWORD1>
+ <KEYWORD1>KCAL</KEYWORD1>
+ <KEYWORD1>KCALC</KEYWORD1>
+ <KEYWORD1>KCEN</KEYWORD1>
+ <KEYWORD1>KCENTER</KEYWORD1>
+ <KEYWORD1>KCLE</KEYWORD1>
+ <KEYWORD1>KCLEAR</KEYWORD1>
+ <KEYWORD1>KDEL</KEYWORD1>
+ <KEYWORD1>KDELE</KEYWORD1>
+ <KEYWORD1>KDIS</KEYWORD1>
+ <KEYWORD1>KDIST</KEYWORD1>
+ <KEYWORD1>KESI</KEYWORD1>
+ <KEYWORD1>KESIZE</KEYWORD1>
+ <KEYWORD1>KEYO</KEYWORD1>
+ <KEYWORD1>KEYOPT</KEYWORD1>
+ <KEYWORD1>KEYP</KEYWORD1>
+ <KEYWORD1>KEYPTS</KEYWORD1>
+ <KEYWORD1>KEYW</KEYWORD1>
+ <KEYWORD1>KEYW</KEYWORD1>
+ <KEYWORD1>KFIL</KEYWORD1>
+ <KEYWORD1>KFILL</KEYWORD1>
+ <KEYWORD1>KGEN</KEYWORD1>
+ <KEYWORD1>KGEN</KEYWORD1>
+ <KEYWORD1>KL</KEYWORD1>
+ <KEYWORD1>KLIS</KEYWORD1>
+ <KEYWORD1>KLIST</KEYWORD1>
+ <KEYWORD1>KMES</KEYWORD1>
+ <KEYWORD1>KMESH</KEYWORD1>
+ <KEYWORD1>KMOD</KEYWORD1>
+ <KEYWORD1>KMODIF</KEYWORD1>
+ <KEYWORD1>KMOV</KEYWORD1>
+ <KEYWORD1>KMOVE</KEYWORD1>
+ <KEYWORD1>KNOD</KEYWORD1>
+ <KEYWORD1>KNODE</KEYWORD1>
+ <KEYWORD1>KPLO</KEYWORD1>
+ <KEYWORD1>KPLOT</KEYWORD1>
+ <KEYWORD1>KPSC</KEYWORD1>
+ <KEYWORD1>KPSCALE</KEYWORD1>
+ <KEYWORD1>KREF</KEYWORD1>
+ <KEYWORD1>KREFINE</KEYWORD1>
+ <KEYWORD1>KSCA</KEYWORD1>
+ <KEYWORD1>KSCALE</KEYWORD1>
+ <KEYWORD1>KSCO</KEYWORD1>
+ <KEYWORD1>KSCON</KEYWORD1>
+ <KEYWORD1>KSEL</KEYWORD1>
+ <KEYWORD1>KSEL</KEYWORD1>
+ <KEYWORD1>KSLL</KEYWORD1>
+ <KEYWORD1>KSLL</KEYWORD1>
+ <KEYWORD1>KSLN</KEYWORD1>
+ <KEYWORD1>KSLN</KEYWORD1>
+ <KEYWORD1>KSUM</KEYWORD1>
+ <KEYWORD1>KSUM</KEYWORD1>
+ <KEYWORD1>KSYM</KEYWORD1>
+ <KEYWORD1>KSYMM</KEYWORD1>
+ <KEYWORD1>KTRA</KEYWORD1>
+ <KEYWORD1>KTRAN</KEYWORD1>
+ <KEYWORD1>KUSE</KEYWORD1>
+ <KEYWORD1>KUSE</KEYWORD1>
+ <KEYWORD1>KWPA</KEYWORD1>
+ <KEYWORD1>KWPAVE</KEYWORD1>
+ <KEYWORD1>KWPL</KEYWORD1>
+ <KEYWORD1>KWPLAN</KEYWORD1>
+ <KEYWORD1>L2AN</KEYWORD1>
+ <KEYWORD1>L2ANG</KEYWORD1>
+ <KEYWORD1>L2TA</KEYWORD1>
+ <KEYWORD1>L2TAN</KEYWORD1>
+ <KEYWORD1>L</KEYWORD1>
+ <KEYWORD1>LANG</KEYWORD1>
+ <KEYWORD1>LANG</KEYWORD1>
+ <KEYWORD1>LARC</KEYWORD1>
+ <KEYWORD1>LARC</KEYWORD1>
+ <KEYWORD1>LARE</KEYWORD1>
+ <KEYWORD1>LAREA</KEYWORD1>
+ <KEYWORD1>LARG</KEYWORD1>
+ <KEYWORD1>LARGE</KEYWORD1>
+ <KEYWORD1>LATT</KEYWORD1>
+ <KEYWORD1>LATT</KEYWORD1>
+ <KEYWORD1>LAYE</KEYWORD1>
+ <KEYWORD1>LAYE</KEYWORD1>
+ <KEYWORD1>LAYER</KEYWORD1>
+ <KEYWORD1>LAYERP26</KEYWORD1>
+ <KEYWORD1>LAYL</KEYWORD1>
+ <KEYWORD1>LAYLIST</KEYWORD1>
+ <KEYWORD1>LAYP</KEYWORD1>
+ <KEYWORD1>LAYPLOT</KEYWORD1>
+ <KEYWORD1>LCAB</KEYWORD1>
+ <KEYWORD1>LCABS</KEYWORD1>
+ <KEYWORD1>LCAS</KEYWORD1>
+ <KEYWORD1>LCASE</KEYWORD1>
+ <KEYWORD1>LCCA</KEYWORD1>
+ <KEYWORD1>LCCA</KEYWORD1>
+ <KEYWORD1>LCCALC</KEYWORD1>
+ <KEYWORD1>LCCAT</KEYWORD1>
+ <KEYWORD1>LCDE</KEYWORD1>
+ <KEYWORD1>LCDEF</KEYWORD1>
+ <KEYWORD1>LCFA</KEYWORD1>
+ <KEYWORD1>LCFACT</KEYWORD1>
+ <KEYWORD1>LCFI</KEYWORD1>
+ <KEYWORD1>LCFILE</KEYWORD1>
+ <KEYWORD1>LCLE</KEYWORD1>
+ <KEYWORD1>LCLEAR</KEYWORD1>
+ <KEYWORD1>LCOM</KEYWORD1>
+ <KEYWORD1>LCOMB</KEYWORD1>
+ <KEYWORD1>LCOP</KEYWORD1>
+ <KEYWORD1>LCOPER</KEYWORD1>
+ <KEYWORD1>LCSE</KEYWORD1>
+ <KEYWORD1>LCSEL</KEYWORD1>
+ <KEYWORD1>LCSL</KEYWORD1>
+ <KEYWORD1>LCSL</KEYWORD1>
+ <KEYWORD1>LCSU</KEYWORD1>
+ <KEYWORD1>LCSUM</KEYWORD1>
+ <KEYWORD1>LCWR</KEYWORD1>
+ <KEYWORD1>LCWRITE</KEYWORD1>
+ <KEYWORD1>LCZE</KEYWORD1>
+ <KEYWORD1>LCZERO</KEYWORD1>
+ <KEYWORD1>LDEL</KEYWORD1>
+ <KEYWORD1>LDELE</KEYWORD1>
+ <KEYWORD1>LDIV</KEYWORD1>
+ <KEYWORD1>LDIV</KEYWORD1>
+ <KEYWORD1>LDRA</KEYWORD1>
+ <KEYWORD1>LDRAG</KEYWORD1>
+ <KEYWORD1>LDRE</KEYWORD1>
+ <KEYWORD1>LDREAD</KEYWORD1>
+ <KEYWORD1>LESI</KEYWORD1>
+ <KEYWORD1>LESIZE</KEYWORD1>
+ <KEYWORD1>LEXT</KEYWORD1>
+ <KEYWORD1>LEXTND</KEYWORD1>
+ <KEYWORD1>LFIL</KEYWORD1>
+ <KEYWORD1>LFILLT</KEYWORD1>
+ <KEYWORD1>LFSU</KEYWORD1>
+ <KEYWORD1>LFSURF</KEYWORD1>
+ <KEYWORD1>LGEN</KEYWORD1>
+ <KEYWORD1>LGEN</KEYWORD1>
+ <KEYWORD1>LGLU</KEYWORD1>
+ <KEYWORD1>LGLUE</KEYWORD1>
+ <KEYWORD1>LGWR</KEYWORD1>
+ <KEYWORD1>LGWRITE</KEYWORD1>
+ <KEYWORD1>LINA</KEYWORD1>
+ <KEYWORD1>LINA</KEYWORD1>
+ <KEYWORD1>LINE</KEYWORD1>
+ <KEYWORD1>LINE</KEYWORD1>
+ <KEYWORD1>LINE</KEYWORD1>
+ <KEYWORD1>LINES</KEYWORD1>
+ <KEYWORD1>LINL</KEYWORD1>
+ <KEYWORD1>LINL</KEYWORD1>
+ <KEYWORD1>LINP</KEYWORD1>
+ <KEYWORD1>LINP</KEYWORD1>
+ <KEYWORD1>LINV</KEYWORD1>
+ <KEYWORD1>LINV</KEYWORD1>
+ <KEYWORD1>LLIS</KEYWORD1>
+ <KEYWORD1>LLIST</KEYWORD1>
+ <KEYWORD1>LMAT</KEYWORD1>
+ <KEYWORD1>LMATRIX</KEYWORD1>
+ <KEYWORD1>LMES</KEYWORD1>
+ <KEYWORD1>LMESH</KEYWORD1>
+ <KEYWORD1>LNCO</KEYWORD1>
+ <KEYWORD1>LNCOLLAPSE</KEYWORD1>
+ <KEYWORD1>LNDE</KEYWORD1>
+ <KEYWORD1>LNDETACH</KEYWORD1>
+ <KEYWORD1>LNFI</KEYWORD1>
+ <KEYWORD1>LNFILL</KEYWORD1>
+ <KEYWORD1>LNME</KEYWORD1>
+ <KEYWORD1>LNMERGE</KEYWORD1>
+ <KEYWORD1>LNSP</KEYWORD1>
+ <KEYWORD1>LNSPLIT</KEYWORD1>
+ <KEYWORD1>LNSR</KEYWORD1>
+ <KEYWORD1>LNSRCH</KEYWORD1>
+ <KEYWORD1>LOCA</KEYWORD1>
+ <KEYWORD1>LOCAL</KEYWORD1>
+ <KEYWORD1>LOVL</KEYWORD1>
+ <KEYWORD1>LOVLAP</KEYWORD1>
+ <KEYWORD1>LPLO</KEYWORD1>
+ <KEYWORD1>LPLOT</KEYWORD1>
+ <KEYWORD1>LPTN</KEYWORD1>
+ <KEYWORD1>LPTN</KEYWORD1>
+ <KEYWORD1>LREF</KEYWORD1>
+ <KEYWORD1>LREFINE</KEYWORD1>
+ <KEYWORD1>LREV</KEYWORD1>
+ <KEYWORD1>LREVERSE</KEYWORD1>
+ <KEYWORD1>LROT</KEYWORD1>
+ <KEYWORD1>LROTAT</KEYWORD1>
+ <KEYWORD1>LSBA</KEYWORD1>
+ <KEYWORD1>LSBA</KEYWORD1>
+ <KEYWORD1>LSBL</KEYWORD1>
+ <KEYWORD1>LSBL</KEYWORD1>
+ <KEYWORD1>LSBV</KEYWORD1>
+ <KEYWORD1>LSBV</KEYWORD1>
+ <KEYWORD1>LSBW</KEYWORD1>
+ <KEYWORD1>LSBW</KEYWORD1>
+ <KEYWORD1>LSCL</KEYWORD1>
+ <KEYWORD1>LSCLEAR</KEYWORD1>
+ <KEYWORD1>LSDE</KEYWORD1>
+ <KEYWORD1>LSDELE</KEYWORD1>
+ <KEYWORD1>LSEL</KEYWORD1>
+ <KEYWORD1>LSEL</KEYWORD1>
+ <KEYWORD1>LSLA</KEYWORD1>
+ <KEYWORD1>LSLA</KEYWORD1>
+ <KEYWORD1>LSLK</KEYWORD1>
+ <KEYWORD1>LSLK</KEYWORD1>
+ <KEYWORD1>LSOP</KEYWORD1>
+ <KEYWORD1>LSOPER</KEYWORD1>
+ <KEYWORD1>LSRE</KEYWORD1>
+ <KEYWORD1>LSREAD</KEYWORD1>
+ <KEYWORD1>LSSC</KEYWORD1>
+ <KEYWORD1>LSSCALE</KEYWORD1>
+ <KEYWORD1>LSSO</KEYWORD1>
+ <KEYWORD1>LSSOLVE</KEYWORD1>
+ <KEYWORD1>LSTR</KEYWORD1>
+ <KEYWORD1>LSTR</KEYWORD1>
+ <KEYWORD1>LSUM</KEYWORD1>
+ <KEYWORD1>LSUM</KEYWORD1>
+ <KEYWORD1>LSWR</KEYWORD1>
+ <KEYWORD1>LSWRITE</KEYWORD1>
+ <KEYWORD1>LSYM</KEYWORD1>
+ <KEYWORD1>LSYMM</KEYWORD1>
+ <KEYWORD1>LTAN</KEYWORD1>
+ <KEYWORD1>LTAN</KEYWORD1>
+ <KEYWORD1>LTRA</KEYWORD1>
+ <KEYWORD1>LTRAN</KEYWORD1>
+ <KEYWORD1>LUMP</KEYWORD1>
+ <KEYWORD1>LUMPM</KEYWORD1>
+ <KEYWORD1>LVSC</KEYWORD1>
+ <KEYWORD1>LVSCALE</KEYWORD1>
+ <KEYWORD1>LWPL</KEYWORD1>
+ <KEYWORD1>LWPLAN</KEYWORD1>
+ <KEYWORD1>M</KEYWORD1>
+ <KEYWORD1>MAGO</KEYWORD1>
+ <KEYWORD1>MAGOPT</KEYWORD1>
+ <KEYWORD1>MAGS</KEYWORD1>
+ <KEYWORD1>MAGSOLV</KEYWORD1>
+ <KEYWORD1>MAST</KEYWORD1>
+ <KEYWORD1>MASTER</KEYWORD1>
+ <KEYWORD1>MAT</KEYWORD1>
+ <KEYWORD1>MATE</KEYWORD1>
+ <KEYWORD1>MATER</KEYWORD1>
+ <KEYWORD1>MDAM</KEYWORD1>
+ <KEYWORD1>MDAMP</KEYWORD1>
+ <KEYWORD1>MDEL</KEYWORD1>
+ <KEYWORD1>MDELE</KEYWORD1>
+ <KEYWORD1>MESH</KEYWORD1>
+ <KEYWORD1>MESHING</KEYWORD1>
+ <KEYWORD1>MGEN</KEYWORD1>
+ <KEYWORD1>MGEN</KEYWORD1>
+ <KEYWORD1>MITE</KEYWORD1>
+ <KEYWORD1>MITER</KEYWORD1>
+ <KEYWORD1>MLIS</KEYWORD1>
+ <KEYWORD1>MLIST</KEYWORD1>
+ <KEYWORD1>MMF</KEYWORD1>
+ <KEYWORD1>MODE</KEYWORD1>
+ <KEYWORD1>MODE</KEYWORD1>
+ <KEYWORD1>MODM</KEYWORD1>
+ <KEYWORD1>MODMSH</KEYWORD1>
+ <KEYWORD1>MODO</KEYWORD1>
+ <KEYWORD1>MODOPT</KEYWORD1>
+ <KEYWORD1>MONI</KEYWORD1>
+ <KEYWORD1>MONITOR</KEYWORD1>
+ <KEYWORD1>MOPT</KEYWORD1>
+ <KEYWORD1>MOPT</KEYWORD1>
+ <KEYWORD1>MOVE</KEYWORD1>
+ <KEYWORD1>MOVE</KEYWORD1>
+ <KEYWORD1>MP</KEYWORD1>
+ <KEYWORD1>MPAM</KEYWORD1>
+ <KEYWORD1>MPAMOD</KEYWORD1>
+ <KEYWORD1>MPCH</KEYWORD1>
+ <KEYWORD1>MPCHG</KEYWORD1>
+ <KEYWORD1>MPDA</KEYWORD1>
+ <KEYWORD1>MPDATA</KEYWORD1>
+ <KEYWORD1>MPDE</KEYWORD1>
+ <KEYWORD1>MPDELE</KEYWORD1>
+ <KEYWORD1>MPDR</KEYWORD1>
+ <KEYWORD1>MPDRES</KEYWORD1>
+ <KEYWORD1>MPLI</KEYWORD1>
+ <KEYWORD1>MPLIST</KEYWORD1>
+ <KEYWORD1>MPMO</KEYWORD1>
+ <KEYWORD1>MPMOD</KEYWORD1>
+ <KEYWORD1>MPPL</KEYWORD1>
+ <KEYWORD1>MPPLOT</KEYWORD1>
+ <KEYWORD1>MPRE</KEYWORD1>
+ <KEYWORD1>MPREAD</KEYWORD1>
+ <KEYWORD1>MPRI</KEYWORD1>
+ <KEYWORD1>MPRINT</KEYWORD1>
+ <KEYWORD1>MPTE</KEYWORD1>
+ <KEYWORD1>MPTEMP</KEYWORD1>
+ <KEYWORD1>MPTG</KEYWORD1>
+ <KEYWORD1>MPTGEN</KEYWORD1>
+ <KEYWORD1>MPTR</KEYWORD1>
+ <KEYWORD1>MPTRES</KEYWORD1>
+ <KEYWORD1>MPUN</KEYWORD1>
+ <KEYWORD1>MPUNDO</KEYWORD1>
+ <KEYWORD1>MPWR</KEYWORD1>
+ <KEYWORD1>MPWRITE</KEYWORD1>
+ <KEYWORD1>MSAD</KEYWORD1>
+ <KEYWORD1>MSADV</KEYWORD1>
+ <KEYWORD1>MSCA</KEYWORD1>
+ <KEYWORD1>MSCAP</KEYWORD1>
+ <KEYWORD1>MSDA</KEYWORD1>
+ <KEYWORD1>MSDATA</KEYWORD1>
+ <KEYWORD1>MSHA</KEYWORD1>
+ <KEYWORD1>MSHAPE</KEYWORD1>
+ <KEYWORD1>MSHK</KEYWORD1>
+ <KEYWORD1>MSHKEY</KEYWORD1>
+ <KEYWORD1>MSHM</KEYWORD1>
+ <KEYWORD1>MSHMID</KEYWORD1>
+ <KEYWORD1>MSHP</KEYWORD1>
+ <KEYWORD1>MSHPATTERN</KEYWORD1>
+ <KEYWORD1>MSME</KEYWORD1>
+ <KEYWORD1>MSMETH</KEYWORD1>
+ <KEYWORD1>MSNO</KEYWORD1>
+ <KEYWORD1>MSNOMF</KEYWORD1>
+ <KEYWORD1>MSPR</KEYWORD1>
+ <KEYWORD1>MSPROP</KEYWORD1>
+ <KEYWORD1>MSQU</KEYWORD1>
+ <KEYWORD1>MSQUAD</KEYWORD1>
+ <KEYWORD1>MSRE</KEYWORD1>
+ <KEYWORD1>MSRELAX</KEYWORD1>
+ <KEYWORD1>MSSO</KEYWORD1>
+ <KEYWORD1>MSSOLU</KEYWORD1>
+ <KEYWORD1>MSSP</KEYWORD1>
+ <KEYWORD1>MSSPEC</KEYWORD1>
+ <KEYWORD1>MSTE</KEYWORD1>
+ <KEYWORD1>MSTERM</KEYWORD1>
+ <KEYWORD1>MSVA</KEYWORD1>
+ <KEYWORD1>MSVARY</KEYWORD1>
+ <KEYWORD1>MXPA</KEYWORD1>
+ <KEYWORD1>MXPAND</KEYWORD1>
+ <KEYWORD1>N</KEYWORD1>
+ <KEYWORD1>NANG</KEYWORD1>
+ <KEYWORD1>NANG</KEYWORD1>
+ <KEYWORD1>NCNV</KEYWORD1>
+ <KEYWORD1>NCNV</KEYWORD1>
+ <KEYWORD1>NDEL</KEYWORD1>
+ <KEYWORD1>NDELE</KEYWORD1>
+ <KEYWORD1>NDIS</KEYWORD1>
+ <KEYWORD1>NDIST</KEYWORD1>
+ <KEYWORD1>NEQI</KEYWORD1>
+ <KEYWORD1>NEQIT</KEYWORD1>
+ <KEYWORD1>NFOR</KEYWORD1>
+ <KEYWORD1>NFORCE</KEYWORD1>
+ <KEYWORD1>NGEN</KEYWORD1>
+ <KEYWORD1>NGEN</KEYWORD1>
+ <KEYWORD1>NKPT</KEYWORD1>
+ <KEYWORD1>NKPT</KEYWORD1>
+ <KEYWORD1>NLGE</KEYWORD1>
+ <KEYWORD1>NLGEOM</KEYWORD1>
+ <KEYWORD1>NLIS</KEYWORD1>
+ <KEYWORD1>NLIST</KEYWORD1>
+ <KEYWORD1>NLOG</KEYWORD1>
+ <KEYWORD1>NLOG</KEYWORD1>
+ <KEYWORD1>NLOP</KEYWORD1>
+ <KEYWORD1>NLOPT</KEYWORD1>
+ <KEYWORD1>NMOD</KEYWORD1>
+ <KEYWORD1>NMODIF</KEYWORD1>
+ <KEYWORD1>NOCO</KEYWORD1>
+ <KEYWORD1>NOCOLOR</KEYWORD1>
+ <KEYWORD1>NODE</KEYWORD1>
+ <KEYWORD1>NODES</KEYWORD1>
+ <KEYWORD1>NOOR</KEYWORD1>
+ <KEYWORD1>NOORDER</KEYWORD1>
+ <KEYWORD1>NPLO</KEYWORD1>
+ <KEYWORD1>NPLOT</KEYWORD1>
+ <KEYWORD1>NPRI</KEYWORD1>
+ <KEYWORD1>NPRINT</KEYWORD1>
+ <KEYWORD1>NREA</KEYWORD1>
+ <KEYWORD1>NREAD</KEYWORD1>
+ <KEYWORD1>NREF</KEYWORD1>
+ <KEYWORD1>NREFINE</KEYWORD1>
+ <KEYWORD1>NRLS</KEYWORD1>
+ <KEYWORD1>NRLSUM</KEYWORD1>
+ <KEYWORD1>NROP</KEYWORD1>
+ <KEYWORD1>NROPT</KEYWORD1>
+ <KEYWORD1>NROT</KEYWORD1>
+ <KEYWORD1>NROTAT</KEYWORD1>
+ <KEYWORD1>NRRA</KEYWORD1>
+ <KEYWORD1>NRRANG</KEYWORD1>
+ <KEYWORD1>NSCA</KEYWORD1>
+ <KEYWORD1>NSCALE</KEYWORD1>
+ <KEYWORD1>NSEL</KEYWORD1>
+ <KEYWORD1>NSEL</KEYWORD1>
+ <KEYWORD1>NSLA</KEYWORD1>
+ <KEYWORD1>NSLA</KEYWORD1>
+ <KEYWORD1>NSLE</KEYWORD1>
+ <KEYWORD1>NSLE</KEYWORD1>
+ <KEYWORD1>NSLK</KEYWORD1>
+ <KEYWORD1>NSLK</KEYWORD1>
+ <KEYWORD1>NSLL</KEYWORD1>
+ <KEYWORD1>NSLL</KEYWORD1>
+ <KEYWORD1>NSLV</KEYWORD1>
+ <KEYWORD1>NSLV</KEYWORD1>
+ <KEYWORD1>NSOL</KEYWORD1>
+ <KEYWORD1>NSOL</KEYWORD1>
+ <KEYWORD1>NSOR</KEYWORD1>
+ <KEYWORD1>NSORT</KEYWORD1>
+ <KEYWORD1>NSTO</KEYWORD1>
+ <KEYWORD1>NSTORE</KEYWORD1>
+ <KEYWORD1>NSUB</KEYWORD1>
+ <KEYWORD1>NSUBST</KEYWORD1>
+ <KEYWORD1>NSVR</KEYWORD1>
+ <KEYWORD1>NSVR</KEYWORD1>
+ <KEYWORD1>NSYM</KEYWORD1>
+ <KEYWORD1>NSYM</KEYWORD1>
+ <KEYWORD1>NUMC</KEYWORD1>
+ <KEYWORD1>NUMCMP</KEYWORD1>
+ <KEYWORD1>NUME</KEYWORD1>
+ <KEYWORD1>NUMEXP</KEYWORD1>
+ <KEYWORD1>NUMM</KEYWORD1>
+ <KEYWORD1>NUMMRG</KEYWORD1>
+ <KEYWORD1>NUMO</KEYWORD1>
+ <KEYWORD1>NUMOFF</KEYWORD1>
+ <KEYWORD1>NUMS</KEYWORD1>
+ <KEYWORD1>NUMSTR</KEYWORD1>
+ <KEYWORD1>NUMV</KEYWORD1>
+ <KEYWORD1>NUMVAR</KEYWORD1>
+ <KEYWORD1>NUSO</KEYWORD1>
+ <KEYWORD1>NUSORT</KEYWORD1>
+ <KEYWORD1>NWPA</KEYWORD1>
+ <KEYWORD1>NWPAVE</KEYWORD1>
+ <KEYWORD1>NWPL</KEYWORD1>
+ <KEYWORD1>NWPLAN</KEYWORD1>
+ <KEYWORD1>NWRI</KEYWORD1>
+ <KEYWORD1>NWRITE</KEYWORD1>
+ <KEYWORD1>nx</KEYWORD1>
+ <KEYWORD1>ny</KEYWORD1>
+ <KEYWORD1>nz</KEYWORD1>
+ <KEYWORD1>OMEG</KEYWORD1>
+ <KEYWORD1>OMEGA</KEYWORD1>
+ <KEYWORD1>OPAD</KEYWORD1>
+ <KEYWORD1>OPADD</KEYWORD1>
+ <KEYWORD1>OPAN</KEYWORD1>
+ <KEYWORD1>OPANL</KEYWORD1>
+ <KEYWORD1>OPCL</KEYWORD1>
+ <KEYWORD1>OPCLR</KEYWORD1>
+ <KEYWORD1>OPDA</KEYWORD1>
+ <KEYWORD1>OPDATA</KEYWORD1>
+ <KEYWORD1>OPDE</KEYWORD1>
+ <KEYWORD1>OPDEL</KEYWORD1>
+ <KEYWORD1>OPEQ</KEYWORD1>
+ <KEYWORD1>OPEQN</KEYWORD1>
+ <KEYWORD1>OPER</KEYWORD1>
+ <KEYWORD1>OPERATE</KEYWORD1>
+ <KEYWORD1>OPEX</KEYWORD1>
+ <KEYWORD1>OPEXE</KEYWORD1>
+ <KEYWORD1>OPFA</KEYWORD1>
+ <KEYWORD1>OPFACT</KEYWORD1>
+ <KEYWORD1>OPFR</KEYWORD1>
+ <KEYWORD1>OPFRST</KEYWORD1>
+ <KEYWORD1>OPGR</KEYWORD1>
+ <KEYWORD1>OPGRAD</KEYWORD1>
+ <KEYWORD1>OPKE</KEYWORD1>
+ <KEYWORD1>OPKEEP</KEYWORD1>
+ <KEYWORD1>OPLF</KEYWORD1>
+ <KEYWORD1>OPLFA</KEYWORD1>
+ <KEYWORD1>OPLG</KEYWORD1>
+ <KEYWORD1>OPLGR</KEYWORD1>
+ <KEYWORD1>OPLI</KEYWORD1>
+ <KEYWORD1>OPLIST</KEYWORD1>
+ <KEYWORD1>OPLO</KEYWORD1>
+ <KEYWORD1>OPLOOP</KEYWORD1>
+ <KEYWORD1>OPLS</KEYWORD1>
+ <KEYWORD1>OPLSW</KEYWORD1>
+ <KEYWORD1>OPMA</KEYWORD1>
+ <KEYWORD1>OPMAKE</KEYWORD1>
+ <KEYWORD1>OPNC</KEYWORD1>
+ <KEYWORD1>OPNCONTROL</KEYWORD1>
+ <KEYWORD1>OPPR</KEYWORD1>
+ <KEYWORD1>OPPRNT</KEYWORD1>
+ <KEYWORD1>OPRA</KEYWORD1>
+ <KEYWORD1>OPRAND</KEYWORD1>
+ <KEYWORD1>OPRE</KEYWORD1>
+ <KEYWORD1>OPRESU</KEYWORD1>
+ <KEYWORD1>OPRF</KEYWORD1>
+ <KEYWORD1>OPRFA</KEYWORD1>
+ <KEYWORD1>OPRG</KEYWORD1>
+ <KEYWORD1>OPRGR</KEYWORD1>
+ <KEYWORD1>OPRS</KEYWORD1>
+ <KEYWORD1>OPRSW</KEYWORD1>
+ <KEYWORD1>OPSA</KEYWORD1>
+ <KEYWORD1>OPSAVE</KEYWORD1>
+ <KEYWORD1>OPSE</KEYWORD1>
+ <KEYWORD1>OPSEL</KEYWORD1>
+ <KEYWORD1>OPSU</KEYWORD1>
+ <KEYWORD1>OPSUBP</KEYWORD1>
+ <KEYWORD1>OPSW</KEYWORD1>
+ <KEYWORD1>OPSWEEP</KEYWORD1>
+ <KEYWORD1>OPTY</KEYWORD1>
+ <KEYWORD1>OPTYPE</KEYWORD1>
+ <KEYWORD1>OPUS</KEYWORD1>
+ <KEYWORD1>OPUSER</KEYWORD1>
+ <KEYWORD1>OPVA</KEYWORD1>
+ <KEYWORD1>OPVAR</KEYWORD1>
+ <KEYWORD1>OUTO</KEYWORD1>
+ <KEYWORD1>OUTOPT</KEYWORD1>
+ <KEYWORD1>OUTP</KEYWORD1>
+ <KEYWORD1>OUTPR</KEYWORD1>
+ <KEYWORD1>OUTR</KEYWORD1>
+ <KEYWORD1>OUTRES</KEYWORD1>
+ <KEYWORD1>PADE</KEYWORD1>
+ <KEYWORD1>PADELE</KEYWORD1>
+ <KEYWORD1>PAGE</KEYWORD1>
+ <KEYWORD1>PAGET</KEYWORD1>
+ <KEYWORD1>PAPU</KEYWORD1>
+ <KEYWORD1>PAPUT</KEYWORD1>
+ <KEYWORD1>PARE</KEYWORD1>
+ <KEYWORD1>PARESU</KEYWORD1>
+ <KEYWORD1>PARR</KEYWORD1>
+ <KEYWORD1>PARRES</KEYWORD1>
+ <KEYWORD1>PARS</KEYWORD1>
+ <KEYWORD1>PARSAV</KEYWORD1>
+ <KEYWORD1>PASA</KEYWORD1>
+ <KEYWORD1>PASAVE</KEYWORD1>
+ <KEYWORD1>PATH</KEYWORD1>
+ <KEYWORD1>PATH</KEYWORD1>
+ <KEYWORD1>PCAL</KEYWORD1>
+ <KEYWORD1>PCALC</KEYWORD1>
+ <KEYWORD1>PCIR</KEYWORD1>
+ <KEYWORD1>PCIRC</KEYWORD1>
+ <KEYWORD1>PCON</KEYWORD1>
+ <KEYWORD1>PCONV</KEYWORD1>
+ <KEYWORD1>PCOR</KEYWORD1>
+ <KEYWORD1>PCORRO</KEYWORD1>
+ <KEYWORD1>PCRO</KEYWORD1>
+ <KEYWORD1>PCROSS</KEYWORD1>
+ <KEYWORD1>PDEF</KEYWORD1>
+ <KEYWORD1>PDEF</KEYWORD1>
+ <KEYWORD1>PDOT</KEYWORD1>
+ <KEYWORD1>PDOT</KEYWORD1>
+ <KEYWORD1>PDRA</KEYWORD1>
+ <KEYWORD1>PDRAG</KEYWORD1>
+ <KEYWORD1>PERB</KEYWORD1>
+ <KEYWORD1>PERBC2D</KEYWORD1>
+ <KEYWORD1>PEXC</KEYWORD1>
+ <KEYWORD1>PEXCLUDE</KEYWORD1>
+ <KEYWORD1>PFAC</KEYWORD1>
+ <KEYWORD1>PFACT</KEYWORD1>
+ <KEYWORD1>PFLU</KEYWORD1>
+ <KEYWORD1>PFLUID</KEYWORD1>
+ <KEYWORD1>PGAP</KEYWORD1>
+ <KEYWORD1>PGAP</KEYWORD1>
+ <KEYWORD1>PHYS</KEYWORD1>
+ <KEYWORD1>PHYSICS</KEYWORD1>
+ <KEYWORD1>PINC</KEYWORD1>
+ <KEYWORD1>PINCLUDE</KEYWORD1>
+ <KEYWORD1>PINS</KEYWORD1>
+ <KEYWORD1>PINSUL</KEYWORD1>
+ <KEYWORD1>PIPE</KEYWORD1>
+ <KEYWORD1>PIPE</KEYWORD1>
+ <KEYWORD1>PIVC</KEYWORD1>
+ <KEYWORD1>PIVCHECK</KEYWORD1>
+ <KEYWORD1>PLAN</KEYWORD1>
+ <KEYWORD1>PLANEWAVE</KEYWORD1>
+ <KEYWORD1>PLCO</KEYWORD1>
+ <KEYWORD1>PLCONV</KEYWORD1>
+ <KEYWORD1>PLCP</KEYWORD1>
+ <KEYWORD1>PLCPLX</KEYWORD1>
+ <KEYWORD1>PLCR</KEYWORD1>
+ <KEYWORD1>PLCRACK</KEYWORD1>
+ <KEYWORD1>PLDI</KEYWORD1>
+ <KEYWORD1>PLDISP</KEYWORD1>
+ <KEYWORD1>PLES</KEYWORD1>
+ <KEYWORD1>PLESOL</KEYWORD1>
+ <KEYWORD1>PLET</KEYWORD1>
+ <KEYWORD1>PLETAB</KEYWORD1>
+ <KEYWORD1>PLF2</KEYWORD1>
+ <KEYWORD1>PLF2D</KEYWORD1>
+ <KEYWORD1>PLLS</KEYWORD1>
+ <KEYWORD1>PLLS</KEYWORD1>
+ <KEYWORD1>PLNS</KEYWORD1>
+ <KEYWORD1>PLNSOL</KEYWORD1>
+ <KEYWORD1>PLOT</KEYWORD1>
+ <KEYWORD1>PLOT</KEYWORD1>
+ <KEYWORD1>PLOT</KEYWORD1>
+ <KEYWORD1>PLOTTING</KEYWORD1>
+ <KEYWORD1>PLPA</KEYWORD1>
+ <KEYWORD1>PLPA</KEYWORD1>
+ <KEYWORD1>PLPAGM</KEYWORD1>
+ <KEYWORD1>PLPATH</KEYWORD1>
+ <KEYWORD1>PLSE</KEYWORD1>
+ <KEYWORD1>PLSECT</KEYWORD1>
+ <KEYWORD1>PLTI</KEYWORD1>
+ <KEYWORD1>PLTIME</KEYWORD1>
+ <KEYWORD1>PLTR</KEYWORD1>
+ <KEYWORD1>PLTRAC</KEYWORD1>
+ <KEYWORD1>PLVA</KEYWORD1>
+ <KEYWORD1>PLVA</KEYWORD1>
+ <KEYWORD1>PLVAR</KEYWORD1>
+ <KEYWORD1>PLVAROPT</KEYWORD1>
+ <KEYWORD1>PLVE</KEYWORD1>
+ <KEYWORD1>PLVECT</KEYWORD1>
+ <KEYWORD1>PMAP</KEYWORD1>
+ <KEYWORD1>PMAP</KEYWORD1>
+ <KEYWORD1>PMET</KEYWORD1>
+ <KEYWORD1>PMETH</KEYWORD1>
+ <KEYWORD1>PMGT</KEYWORD1>
+ <KEYWORD1>PMGTRAN</KEYWORD1>
+ <KEYWORD1>PMOP</KEYWORD1>
+ <KEYWORD1>PMOPTS</KEYWORD1>
+ <KEYWORD1>POIN</KEYWORD1>
+ <KEYWORD1>POINT</KEYWORD1>
+ <KEYWORD1>POLY</KEYWORD1>
+ <KEYWORD1>POLY</KEYWORD1>
+ <KEYWORD1>POPT</KEYWORD1>
+ <KEYWORD1>POPT</KEYWORD1>
+ <KEYWORD1>PORT</KEYWORD1>
+ <KEYWORD1>PORTOPT</KEYWORD1>
+ <KEYWORD1>POWE</KEYWORD1>
+ <KEYWORD1>POWERH</KEYWORD1>
+ <KEYWORD1>PPAT</KEYWORD1>
+ <KEYWORD1>PPATH</KEYWORD1>
+ <KEYWORD1>PPLO</KEYWORD1>
+ <KEYWORD1>PPLOT</KEYWORD1>
+ <KEYWORD1>PPRA</KEYWORD1>
+ <KEYWORD1>PPRANGE</KEYWORD1>
+ <KEYWORD1>PPRE</KEYWORD1>
+ <KEYWORD1>PPRES</KEYWORD1>
+ <KEYWORD1>PRAN</KEYWORD1>
+ <KEYWORD1>PRANGE</KEYWORD1>
+ <KEYWORD1>PRCO</KEYWORD1>
+ <KEYWORD1>PRCONV</KEYWORD1>
+ <KEYWORD1>PRCP</KEYWORD1>
+ <KEYWORD1>PRCPLX</KEYWORD1>
+ <KEYWORD1>PREC</KEYWORD1>
+ <KEYWORD1>PRECISION</KEYWORD1>
+ <KEYWORD1>PRED</KEYWORD1>
+ <KEYWORD1>PRED</KEYWORD1>
+ <KEYWORD1>PRER</KEYWORD1>
+ <KEYWORD1>PRERR</KEYWORD1>
+ <KEYWORD1>PRES</KEYWORD1>
+ <KEYWORD1>PRESOL</KEYWORD1>
+ <KEYWORD1>PRET</KEYWORD1>
+ <KEYWORD1>PRETAB</KEYWORD1>
+ <KEYWORD1>PRI2</KEYWORD1>
+ <KEYWORD1>PRI2</KEYWORD1>
+ <KEYWORD1>PRIM</KEYWORD1>
+ <KEYWORD1>PRIM</KEYWORD1>
+ <KEYWORD1>PRIN</KEYWORD1>
+ <KEYWORD1>PRINT</KEYWORD1>
+ <KEYWORD1>PRIS</KEYWORD1>
+ <KEYWORD1>PRISM</KEYWORD1>
+ <KEYWORD1>PRIT</KEYWORD1>
+ <KEYWORD1>PRITER</KEYWORD1>
+ <KEYWORD1>PRNL</KEYWORD1>
+ <KEYWORD1>PRNLD</KEYWORD1>
+ <KEYWORD1>PRNS</KEYWORD1>
+ <KEYWORD1>PRNSOL</KEYWORD1>
+ <KEYWORD1>PROD</KEYWORD1>
+ <KEYWORD1>PROD</KEYWORD1>
+ <KEYWORD1>PRPA</KEYWORD1>
+ <KEYWORD1>PRPATH</KEYWORD1>
+ <KEYWORD1>PRRF</KEYWORD1>
+ <KEYWORD1>PRRFOR</KEYWORD1>
+ <KEYWORD1>PRRS</KEYWORD1>
+ <KEYWORD1>PRRSOL</KEYWORD1>
+ <KEYWORD1>PRSE</KEYWORD1>
+ <KEYWORD1>PRSECT</KEYWORD1>
+ <KEYWORD1>PRSS</KEYWORD1>
+ <KEYWORD1>PRSSOL</KEYWORD1>
+ <KEYWORD1>PRTI</KEYWORD1>
+ <KEYWORD1>PRTIME</KEYWORD1>
+ <KEYWORD1>PRVA</KEYWORD1>
+ <KEYWORD1>PRVA</KEYWORD1>
+ <KEYWORD1>PRVAR</KEYWORD1>
+ <KEYWORD1>PRVAROPT</KEYWORD1>
+ <KEYWORD1>PRVE</KEYWORD1>
+ <KEYWORD1>PRVECT</KEYWORD1>
+ <KEYWORD1>PSCR</KEYWORD1>
+ <KEYWORD1>PSCR</KEYWORD1>
+ <KEYWORD1>PSDC</KEYWORD1>
+ <KEYWORD1>PSDCOM</KEYWORD1>
+ <KEYWORD1>PSDF</KEYWORD1>
+ <KEYWORD1>PSDFRQ</KEYWORD1>
+ <KEYWORD1>PSDR</KEYWORD1>
+ <KEYWORD1>PSDRES</KEYWORD1>
+ <KEYWORD1>PSDS</KEYWORD1>
+ <KEYWORD1>PSDSPL</KEYWORD1>
+ <KEYWORD1>PSDU</KEYWORD1>
+ <KEYWORD1>PSDUNIT</KEYWORD1>
+ <KEYWORD1>PSDV</KEYWORD1>
+ <KEYWORD1>PSDVAL</KEYWORD1>
+ <KEYWORD1>PSDW</KEYWORD1>
+ <KEYWORD1>PSDWAV</KEYWORD1>
+ <KEYWORD1>PSEL</KEYWORD1>
+ <KEYWORD1>PSEL</KEYWORD1>
+ <KEYWORD1>PSOL</KEYWORD1>
+ <KEYWORD1>PSOLVE</KEYWORD1>
+ <KEYWORD1>PSPE</KEYWORD1>
+ <KEYWORD1>PSPEC</KEYWORD1>
+ <KEYWORD1>PSPR</KEYWORD1>
+ <KEYWORD1>PSPRNG</KEYWORD1>
+ <KEYWORD1>PSTR</KEYWORD1>
+ <KEYWORD1>PSTRES</KEYWORD1>
+ <KEYWORD1>PTEM</KEYWORD1>
+ <KEYWORD1>PTEMP</KEYWORD1>
+ <KEYWORD1>PTXY</KEYWORD1>
+ <KEYWORD1>PTXY</KEYWORD1>
+ <KEYWORD1>PUNI</KEYWORD1>
+ <KEYWORD1>PUNIT</KEYWORD1>
+ <KEYWORD1>PVEC</KEYWORD1>
+ <KEYWORD1>PVECT</KEYWORD1>
+ <KEYWORD1>QDVA</KEYWORD1>
+ <KEYWORD1>QDVAL</KEYWORD1>
+ <KEYWORD1>QFAC</KEYWORD1>
+ <KEYWORD1>QFACT</KEYWORD1>
+ <KEYWORD1>QUAD</KEYWORD1>
+ <KEYWORD1>QUAD</KEYWORD1>
+ <KEYWORD1>QUOT</KEYWORD1>
+ <KEYWORD1>QUOT</KEYWORD1>
+ <KEYWORD1>R</KEYWORD1>
+ <KEYWORD1>RACE</KEYWORD1>
+ <KEYWORD1>RACE</KEYWORD1>
+ <KEYWORD1>RALL</KEYWORD1>
+ <KEYWORD1>RALL</KEYWORD1>
+ <KEYWORD1>RAPP</KEYWORD1>
+ <KEYWORD1>RAPPND</KEYWORD1>
+ <KEYWORD1>RBE3</KEYWORD1>
+ <KEYWORD1>RBE3</KEYWORD1>
+ <KEYWORD1>RCON</KEYWORD1>
+ <KEYWORD1>RCON</KEYWORD1>
+ <KEYWORD1>RDEL</KEYWORD1>
+ <KEYWORD1>RDELE</KEYWORD1>
+ <KEYWORD1>REAL</KEYWORD1>
+ <KEYWORD1>REAL</KEYWORD1>
+ <KEYWORD1>REAL</KEYWORD1>
+ <KEYWORD1>REALVAR</KEYWORD1>
+ <KEYWORD1>RECT</KEYWORD1>
+ <KEYWORD1>RECTNG</KEYWORD1>
+ <KEYWORD1>REDU</KEYWORD1>
+ <KEYWORD1>REDUCE</KEYWORD1>
+ <KEYWORD1>REFL</KEYWORD1>
+ <KEYWORD1>REFLCOEF</KEYWORD1>
+ <KEYWORD1>REOR</KEYWORD1>
+ <KEYWORD1>REORDER</KEYWORD1>
+ <KEYWORD1>RESE</KEYWORD1>
+ <KEYWORD1>RESET</KEYWORD1>
+ <KEYWORD1>RESP</KEYWORD1>
+ <KEYWORD1>RESP</KEYWORD1>
+ <KEYWORD1>RESU</KEYWORD1>
+ <KEYWORD1>RESUME</KEYWORD1>
+ <KEYWORD1>REXP</KEYWORD1>
+ <KEYWORD1>REXPORT</KEYWORD1>
+ <KEYWORD1>RFIL</KEYWORD1>
+ <KEYWORD1>RFILSZ</KEYWORD1>
+ <KEYWORD1>RFOR</KEYWORD1>
+ <KEYWORD1>RFORCE</KEYWORD1>
+ <KEYWORD1>RIGI</KEYWORD1>
+ <KEYWORD1>RIGID</KEYWORD1>
+ <KEYWORD1>RIMP</KEYWORD1>
+ <KEYWORD1>RIMPORT</KEYWORD1>
+ <KEYWORD1>RITE</KEYWORD1>
+ <KEYWORD1>RITER</KEYWORD1>
+ <KEYWORD1>RLIS</KEYWORD1>
+ <KEYWORD1>RLIST</KEYWORD1>
+ <KEYWORD1>RMEM</KEYWORD1>
+ <KEYWORD1>RMEMRY</KEYWORD1>
+ <KEYWORD1>RMOD</KEYWORD1>
+ <KEYWORD1>RMODIF</KEYWORD1>
+ <KEYWORD1>RMOR</KEYWORD1>
+ <KEYWORD1>RMORE</KEYWORD1>
+ <KEYWORD1>ROCK</KEYWORD1>
+ <KEYWORD1>ROCK</KEYWORD1>
+ <KEYWORD1>RPOL</KEYWORD1>
+ <KEYWORD1>RPOLY</KEYWORD1>
+ <KEYWORD1>RPR4</KEYWORD1>
+ <KEYWORD1>RPR4</KEYWORD1>
+ <KEYWORD1>RPRI</KEYWORD1>
+ <KEYWORD1>RPRISM</KEYWORD1>
+ <KEYWORD1>RPSD</KEYWORD1>
+ <KEYWORD1>RPSD</KEYWORD1>
+ <KEYWORD1>RSPE</KEYWORD1>
+ <KEYWORD1>RSPEED</KEYWORD1>
+ <KEYWORD1>RSTA</KEYWORD1>
+ <KEYWORD1>RSTAT</KEYWORD1>
+ <KEYWORD1>RSYS</KEYWORD1>
+ <KEYWORD1>RSYS</KEYWORD1>
+ <KEYWORD1>RTIM</KEYWORD1>
+ <KEYWORD1>RTIMST</KEYWORD1>
+ <KEYWORD1>RUN</KEYWORD1>
+ <KEYWORD1>RWFR</KEYWORD1>
+ <KEYWORD1>RWFRNT</KEYWORD1>
+ <KEYWORD1>SABS</KEYWORD1>
+ <KEYWORD1>SABS</KEYWORD1>
+ <KEYWORD1>SADD</KEYWORD1>
+ <KEYWORD1>SADD</KEYWORD1>
+ <KEYWORD1>SALL</KEYWORD1>
+ <KEYWORD1>SALLOW</KEYWORD1>
+ <KEYWORD1>SARP</KEYWORD1>
+ <KEYWORD1>SARPLOT</KEYWORD1>
+ <KEYWORD1>SAVE</KEYWORD1>
+ <KEYWORD1>SAVE</KEYWORD1>
+ <KEYWORD1>SBCL</KEYWORD1>
+ <KEYWORD1>SBCLIST</KEYWORD1>
+ <KEYWORD1>SBCT</KEYWORD1>
+ <KEYWORD1>SBCTRAN</KEYWORD1>
+ <KEYWORD1>SDEL</KEYWORD1>
+ <KEYWORD1>SDELETE</KEYWORD1>
+ <KEYWORD1>SE</KEYWORD1>
+ <KEYWORD1>SECD</KEYWORD1>
+ <KEYWORD1>SECDATA</KEYWORD1>
+ <KEYWORD1>SECN</KEYWORD1>
+ <KEYWORD1>SECNUM</KEYWORD1>
+ <KEYWORD1>SECO</KEYWORD1>
+ <KEYWORD1>SECOFFSET</KEYWORD1>
+ <KEYWORD1>SECP</KEYWORD1>
+ <KEYWORD1>SECPLOT</KEYWORD1>
+ <KEYWORD1>SECR</KEYWORD1>
+ <KEYWORD1>SECREAD</KEYWORD1>
+ <KEYWORD1>SECT</KEYWORD1>
+ <KEYWORD1>SECTYPE</KEYWORD1>
+ <KEYWORD1>SECW</KEYWORD1>
+ <KEYWORD1>SECWRITE</KEYWORD1>
+ <KEYWORD1>SED</KEYWORD1>
+ <KEYWORD1>SEDL</KEYWORD1>
+ <KEYWORD1>SEDLIST</KEYWORD1>
+ <KEYWORD1>SEEX</KEYWORD1>
+ <KEYWORD1>SEEXP</KEYWORD1>
+ <KEYWORD1>SELI</KEYWORD1>
+ <KEYWORD1>SELIST</KEYWORD1>
+ <KEYWORD1>SELM</KEYWORD1>
+ <KEYWORD1>SELM</KEYWORD1>
+ <KEYWORD1>SENE</KEYWORD1>
+ <KEYWORD1>SENERGY</KEYWORD1>
+ <KEYWORD1>SEOP</KEYWORD1>
+ <KEYWORD1>SEOPT</KEYWORD1>
+ <KEYWORD1>SESY</KEYWORD1>
+ <KEYWORD1>SESYMM</KEYWORD1>
+ <KEYWORD1>SET</KEYWORD1>
+ <KEYWORD1>SETR</KEYWORD1>
+ <KEYWORD1>SETRAN</KEYWORD1>
+ <KEYWORD1>SEXP</KEYWORD1>
+ <KEYWORD1>SEXP</KEYWORD1>
+ <KEYWORD1>SF</KEYWORD1>
+ <KEYWORD1>SFA</KEYWORD1>
+ <KEYWORD1>SFAC</KEYWORD1>
+ <KEYWORD1>SFACT</KEYWORD1>
+ <KEYWORD1>SFAD</KEYWORD1>
+ <KEYWORD1>SFADELE</KEYWORD1>
+ <KEYWORD1>SFAL</KEYWORD1>
+ <KEYWORD1>SFALIST</KEYWORD1>
+ <KEYWORD1>SFBE</KEYWORD1>
+ <KEYWORD1>SFBEAM</KEYWORD1>
+ <KEYWORD1>SFCA</KEYWORD1>
+ <KEYWORD1>SFCALC</KEYWORD1>
+ <KEYWORD1>SFCU</KEYWORD1>
+ <KEYWORD1>SFCUM</KEYWORD1>
+ <KEYWORD1>SFDE</KEYWORD1>
+ <KEYWORD1>SFDELE</KEYWORD1>
+ <KEYWORD1>SFE</KEYWORD1>
+ <KEYWORD1>SFED</KEYWORD1>
+ <KEYWORD1>SFEDELE</KEYWORD1>
+ <KEYWORD1>SFEL</KEYWORD1>
+ <KEYWORD1>SFELIST</KEYWORD1>
+ <KEYWORD1>SFFU</KEYWORD1>
+ <KEYWORD1>SFFUN</KEYWORD1>
+ <KEYWORD1>SFGR</KEYWORD1>
+ <KEYWORD1>SFGRAD</KEYWORD1>
+ <KEYWORD1>SFL</KEYWORD1>
+ <KEYWORD1>SFLD</KEYWORD1>
+ <KEYWORD1>SFLDELE</KEYWORD1>
+ <KEYWORD1>SFLI</KEYWORD1>
+ <KEYWORD1>SFLIST</KEYWORD1>
+ <KEYWORD1>SFLL</KEYWORD1>
+ <KEYWORD1>SFLLIST</KEYWORD1>
+ <KEYWORD1>SFSC</KEYWORD1>
+ <KEYWORD1>SFSCALE</KEYWORD1>
+ <KEYWORD1>SFTR</KEYWORD1>
+ <KEYWORD1>SFTRAN</KEYWORD1>
+ <KEYWORD1>SHEL</KEYWORD1>
+ <KEYWORD1>SHELL</KEYWORD1>
+ <KEYWORD1>SHPP</KEYWORD1>
+ <KEYWORD1>SHPP</KEYWORD1>
+ <KEYWORD1>SLIS</KEYWORD1>
+ <KEYWORD1>SLIST</KEYWORD1>
+ <KEYWORD1>SLPP</KEYWORD1>
+ <KEYWORD1>SLPPLOT</KEYWORD1>
+ <KEYWORD1>SLSP</KEYWORD1>
+ <KEYWORD1>SLSPLOT</KEYWORD1>
+ <KEYWORD1>SMAL</KEYWORD1>
+ <KEYWORD1>SMALL</KEYWORD1>
+ <KEYWORD1>SMAX</KEYWORD1>
+ <KEYWORD1>SMAX</KEYWORD1>
+ <KEYWORD1>SMBO</KEYWORD1>
+ <KEYWORD1>SMBODY</KEYWORD1>
+ <KEYWORD1>SMCO</KEYWORD1>
+ <KEYWORD1>SMCONS</KEYWORD1>
+ <KEYWORD1>SMFO</KEYWORD1>
+ <KEYWORD1>SMFOR</KEYWORD1>
+ <KEYWORD1>SMIN</KEYWORD1>
+ <KEYWORD1>SMIN</KEYWORD1>
+ <KEYWORD1>SMRT</KEYWORD1>
+ <KEYWORD1>SMRTSIZE</KEYWORD1>
+ <KEYWORD1>SMSU</KEYWORD1>
+ <KEYWORD1>SMSURF</KEYWORD1>
+ <KEYWORD1>SMUL</KEYWORD1>
+ <KEYWORD1>SMULT</KEYWORD1>
+ <KEYWORD1>SOLC</KEYWORD1>
+ <KEYWORD1>SOLCONTROL</KEYWORD1>
+ <KEYWORD1>SOLU</KEYWORD1>
+ <KEYWORD1>SOLU</KEYWORD1>
+ <KEYWORD1>SOLU</KEYWORD1>
+ <KEYWORD1>SOLUOPT</KEYWORD1>
+ <KEYWORD1>SOLV</KEYWORD1>
+ <KEYWORD1>SOLVE</KEYWORD1>
+ <KEYWORD1>SORT</KEYWORD1>
+ <KEYWORD1>SORT</KEYWORD1>
+ <KEYWORD1>SOUR</KEYWORD1>
+ <KEYWORD1>SOURCE</KEYWORD1>
+ <KEYWORD1>SPAC</KEYWORD1>
+ <KEYWORD1>SPACE</KEYWORD1>
+ <KEYWORD1>SPAR</KEYWORD1>
+ <KEYWORD1>SPARM</KEYWORD1>
+ <KEYWORD1>SPEC</KEYWORD1>
+ <KEYWORD1>SPEC</KEYWORD1>
+ <KEYWORD1>SPH4</KEYWORD1>
+ <KEYWORD1>SPH4</KEYWORD1>
+ <KEYWORD1>SPH5</KEYWORD1>
+ <KEYWORD1>SPH5</KEYWORD1>
+ <KEYWORD1>SPHE</KEYWORD1>
+ <KEYWORD1>SPHERE</KEYWORD1>
+ <KEYWORD1>SPLI</KEYWORD1>
+ <KEYWORD1>SPLINE</KEYWORD1>
+ <KEYWORD1>SPOI</KEYWORD1>
+ <KEYWORD1>SPOINT</KEYWORD1>
+ <KEYWORD1>SPOP</KEYWORD1>
+ <KEYWORD1>SPOPT</KEYWORD1>
+ <KEYWORD1>SPRE</KEYWORD1>
+ <KEYWORD1>SPREAD</KEYWORD1>
+ <KEYWORD1>SPTO</KEYWORD1>
+ <KEYWORD1>SPTOPT</KEYWORD1>
+ <KEYWORD1>SQRT</KEYWORD1>
+ <KEYWORD1>SQRT</KEYWORD1>
+ <KEYWORD1>SRCS</KEYWORD1>
+ <KEYWORD1>SRCS</KEYWORD1>
+ <KEYWORD1>SRSS</KEYWORD1>
+ <KEYWORD1>SRSS</KEYWORD1>
+ <KEYWORD1>SSLN</KEYWORD1>
+ <KEYWORD1>SSLN</KEYWORD1>
+ <KEYWORD1>SSTI</KEYWORD1>
+ <KEYWORD1>SSTIF</KEYWORD1>
+ <KEYWORD1>SSUM</KEYWORD1>
+ <KEYWORD1>SSUM</KEYWORD1>
+ <KEYWORD1>STAT</KEYWORD1>
+ <KEYWORD1>STAT</KEYWORD1>
+ <KEYWORD1>STEF</KEYWORD1>
+ <KEYWORD1>STEF</KEYWORD1>
+ <KEYWORD1>STOR</KEYWORD1>
+ <KEYWORD1>STORE</KEYWORD1>
+ <KEYWORD1>SUBO</KEYWORD1>
+ <KEYWORD1>SUBOPT</KEYWORD1>
+ <KEYWORD1>SUBS</KEYWORD1>
+ <KEYWORD1>SUBSET</KEYWORD1>
+ <KEYWORD1>SUMT</KEYWORD1>
+ <KEYWORD1>SUMTYPE</KEYWORD1>
+ <KEYWORD1>SV</KEYWORD1>
+ <KEYWORD1>SVTY</KEYWORD1>
+ <KEYWORD1>SVTYP</KEYWORD1>
+ <KEYWORD1>TALL</KEYWORD1>
+ <KEYWORD1>TALLOW</KEYWORD1>
+ <KEYWORD1>TB</KEYWORD1>
+ <KEYWORD1>TBCO</KEYWORD1>
+ <KEYWORD1>TBCOPY</KEYWORD1>
+ <KEYWORD1>TBDA</KEYWORD1>
+ <KEYWORD1>TBDATA</KEYWORD1>
+ <KEYWORD1>TBDE</KEYWORD1>
+ <KEYWORD1>TBDELE</KEYWORD1>
+ <KEYWORD1>TBLE</KEYWORD1>
+ <KEYWORD1>TBLE</KEYWORD1>
+ <KEYWORD1>TBLI</KEYWORD1>
+ <KEYWORD1>TBLIST</KEYWORD1>
+ <KEYWORD1>TBMO</KEYWORD1>
+ <KEYWORD1>TBMODIF</KEYWORD1>
+ <KEYWORD1>TBPL</KEYWORD1>
+ <KEYWORD1>TBPLOT</KEYWORD1>
+ <KEYWORD1>TBPT</KEYWORD1>
+ <KEYWORD1>TBPT</KEYWORD1>
+ <KEYWORD1>TBTE</KEYWORD1>
+ <KEYWORD1>TBTEMP</KEYWORD1>
+ <KEYWORD1>TCHG</KEYWORD1>
+ <KEYWORD1>TCHG</KEYWORD1>
+ <KEYWORD1>TEE</KEYWORD1>
+ <KEYWORD1>TERM</KEYWORD1>
+ <KEYWORD1>TERM</KEYWORD1>
+ <KEYWORD1>TIME</KEYWORD1>
+ <KEYWORD1>TIME</KEYWORD1>
+ <KEYWORD1>TIME</KEYWORD1>
+ <KEYWORD1>TIMERANGE</KEYWORD1>
+ <KEYWORD1>TIMI</KEYWORD1>
+ <KEYWORD1>TIMINT</KEYWORD1>
+ <KEYWORD1>TIMP</KEYWORD1>
+ <KEYWORD1>TIMP</KEYWORD1>
+ <KEYWORD1>TINT</KEYWORD1>
+ <KEYWORD1>TINTP</KEYWORD1>
+ <KEYWORD1>TOFF</KEYWORD1>
+ <KEYWORD1>TOFFST</KEYWORD1>
+ <KEYWORD1>TOPD</KEYWORD1>
+ <KEYWORD1>TOPDEF</KEYWORD1>
+ <KEYWORD1>TOPE</KEYWORD1>
+ <KEYWORD1>TOPEXE</KEYWORD1>
+ <KEYWORD1>TOPI</KEYWORD1>
+ <KEYWORD1>TOPITER</KEYWORD1>
+ <KEYWORD1>TORQ2D</KEYWORD1>
+ <KEYWORD1>TORQ</KEYWORD1>
+ <KEYWORD1>TORQ</KEYWORD1>
+ <KEYWORD1>TORQ</KEYWORD1>
+ <KEYWORD1>TORQC2D</KEYWORD1>
+ <KEYWORD1>TORQSUM</KEYWORD1>
+ <KEYWORD1>TORU</KEYWORD1>
+ <KEYWORD1>TORUS</KEYWORD1>
+ <KEYWORD1>TOTA</KEYWORD1>
+ <KEYWORD1>TOTAL</KEYWORD1>
+ <KEYWORD1>TRAN</KEYWORD1>
+ <KEYWORD1>TRAN</KEYWORD1>
+ <KEYWORD1>TRANS</KEYWORD1>
+ <KEYWORD1>TRANSFER</KEYWORD1>
+ <KEYWORD1>TREF</KEYWORD1>
+ <KEYWORD1>TREF</KEYWORD1>
+ <KEYWORD1>TRNO</KEYWORD1>
+ <KEYWORD1>TRNOPT</KEYWORD1>
+ <KEYWORD1>TRPD</KEYWORD1>
+ <KEYWORD1>TRPDEL</KEYWORD1>
+ <KEYWORD1>TRPL</KEYWORD1>
+ <KEYWORD1>TRPLIS</KEYWORD1>
+ <KEYWORD1>TRPO</KEYWORD1>
+ <KEYWORD1>TRPOIN</KEYWORD1>
+ <KEYWORD1>TRTI</KEYWORD1>
+ <KEYWORD1>TRTIME</KEYWORD1>
+ <KEYWORD1>TSHA</KEYWORD1>
+ <KEYWORD1>TSHAP</KEYWORD1>
+ <KEYWORD1>TSRE</KEYWORD1>
+ <KEYWORD1>TSRES</KEYWORD1>
+ <KEYWORD1>TUNI</KEYWORD1>
+ <KEYWORD1>TUNIF</KEYWORD1>
+ <KEYWORD1>TVAR</KEYWORD1>
+ <KEYWORD1>TVAR</KEYWORD1>
+ <KEYWORD1>TYPE</KEYWORD1>
+ <KEYWORD1>TYPE</KEYWORD1>
+ <KEYWORD1>UIMP</KEYWORD1>
+ <KEYWORD1>UIMP</KEYWORD1>
+ <KEYWORD1>UPCO</KEYWORD1>
+ <KEYWORD1>UPCOORD</KEYWORD1>
+ <KEYWORD1>UPGE</KEYWORD1>
+ <KEYWORD1>UPGEOM</KEYWORD1>
+ <KEYWORD1>USRC</KEYWORD1>
+ <KEYWORD1>USRCAL</KEYWORD1>
+ <KEYWORD1>V</KEYWORD1>
+ <KEYWORD1>VA</KEYWORD1>
+ <KEYWORD1>VADD</KEYWORD1>
+ <KEYWORD1>VADD</KEYWORD1>
+ <KEYWORD1>VALV</KEYWORD1>
+ <KEYWORD1>VALVE</KEYWORD1>
+ <KEYWORD1>VARD</KEYWORD1>
+ <KEYWORD1>VARDEL</KEYWORD1>
+ <KEYWORD1>VARN</KEYWORD1>
+ <KEYWORD1>VARNAM</KEYWORD1>
+ <KEYWORD1>VATT</KEYWORD1>
+ <KEYWORD1>VATT</KEYWORD1>
+ <KEYWORD1>VCLE</KEYWORD1>
+ <KEYWORD1>VCLEAR</KEYWORD1>
+ <KEYWORD1>VCRO</KEYWORD1>
+ <KEYWORD1>VCROSS</KEYWORD1>
+ <KEYWORD1>VCVF</KEYWORD1>
+ <KEYWORD1>VCVFILL</KEYWORD1>
+ <KEYWORD1>VDDA</KEYWORD1>
+ <KEYWORD1>VDDAM</KEYWORD1>
+ <KEYWORD1>VDEL</KEYWORD1>
+ <KEYWORD1>VDELE</KEYWORD1>
+ <KEYWORD1>VDGL</KEYWORD1>
+ <KEYWORD1>VDGL</KEYWORD1>
+ <KEYWORD1>VDOT</KEYWORD1>
+ <KEYWORD1>VDOT</KEYWORD1>
+ <KEYWORD1>VDRA</KEYWORD1>
+ <KEYWORD1>VDRAG</KEYWORD1>
+ <KEYWORD1>VEXT</KEYWORD1>
+ <KEYWORD1>VEXT</KEYWORD1>
+ <KEYWORD1>VGEN</KEYWORD1>
+ <KEYWORD1>VGEN</KEYWORD1>
+ <KEYWORD1>VGET</KEYWORD1>
+ <KEYWORD1>VGET</KEYWORD1>
+ <KEYWORD1>VGLU</KEYWORD1>
+ <KEYWORD1>VGLUE</KEYWORD1>
+ <KEYWORD1>VIMP</KEYWORD1>
+ <KEYWORD1>VIMP</KEYWORD1>
+ <KEYWORD1>VINP</KEYWORD1>
+ <KEYWORD1>VINP</KEYWORD1>
+ <KEYWORD1>VINV</KEYWORD1>
+ <KEYWORD1>VINV</KEYWORD1>
+ <KEYWORD1>VLIS</KEYWORD1>
+ <KEYWORD1>VLIST</KEYWORD1>
+ <KEYWORD1>VLSC</KEYWORD1>
+ <KEYWORD1>VLSCALE</KEYWORD1>
+ <KEYWORD1>VMES</KEYWORD1>
+ <KEYWORD1>VMESH</KEYWORD1>
+ <KEYWORD1>VOFF</KEYWORD1>
+ <KEYWORD1>VOFFST</KEYWORD1>
+ <KEYWORD1>VOLU</KEYWORD1>
+ <KEYWORD1>VOLUMES</KEYWORD1>
+ <KEYWORD1>VOVL</KEYWORD1>
+ <KEYWORD1>VOVLAP</KEYWORD1>
+ <KEYWORD1>VPLO</KEYWORD1>
+ <KEYWORD1>VPLOT</KEYWORD1>
+ <KEYWORD1>VPTN</KEYWORD1>
+ <KEYWORD1>VPTN</KEYWORD1>
+ <KEYWORD1>VPUT</KEYWORD1>
+ <KEYWORD1>VPUT</KEYWORD1>
+ <KEYWORD1>VROT</KEYWORD1>
+ <KEYWORD1>VROTAT</KEYWORD1>
+ <KEYWORD1>VSBA</KEYWORD1>
+ <KEYWORD1>VSBA</KEYWORD1>
+ <KEYWORD1>VSBV</KEYWORD1>
+ <KEYWORD1>VSBV</KEYWORD1>
+ <KEYWORD1>VSBW</KEYWORD1>
+ <KEYWORD1>VSBW</KEYWORD1>
+ <KEYWORD1>VSEL</KEYWORD1>
+ <KEYWORD1>VSEL</KEYWORD1>
+ <KEYWORD1>VSLA</KEYWORD1>
+ <KEYWORD1>VSLA</KEYWORD1>
+ <KEYWORD1>VSUM</KEYWORD1>
+ <KEYWORD1>VSUM</KEYWORD1>
+ <KEYWORD1>VSWE</KEYWORD1>
+ <KEYWORD1>VSWEEP</KEYWORD1>
+ <KEYWORD1>VSYM</KEYWORD1>
+ <KEYWORD1>VSYMM</KEYWORD1>
+ <KEYWORD1>VTRA</KEYWORD1>
+ <KEYWORD1>VTRAN</KEYWORD1>
+ <KEYWORD1>VTYP</KEYWORD1>
+ <KEYWORD1>VTYPE</KEYWORD1>
+ <KEYWORD1>WAVE</KEYWORD1>
+ <KEYWORD1>WAVES</KEYWORD1>
+ <KEYWORD1>WERA</KEYWORD1>
+ <KEYWORD1>WERASE</KEYWORD1>
+ <KEYWORD1>WFRO</KEYWORD1>
+ <KEYWORD1>WFRONT</KEYWORD1>
+ <KEYWORD1>WMOR</KEYWORD1>
+ <KEYWORD1>WMORE</KEYWORD1>
+ <KEYWORD1>WPAV</KEYWORD1>
+ <KEYWORD1>WPAVE</KEYWORD1>
+ <KEYWORD1>WPCS</KEYWORD1>
+ <KEYWORD1>WPCSYS</KEYWORD1>
+ <KEYWORD1>WPLA</KEYWORD1>
+ <KEYWORD1>WPLANE</KEYWORD1>
+ <KEYWORD1>WPOF</KEYWORD1>
+ <KEYWORD1>WPOFFS</KEYWORD1>
+ <KEYWORD1>WPRO</KEYWORD1>
+ <KEYWORD1>WPROTA</KEYWORD1>
+ <KEYWORD1>WPST</KEYWORD1>
+ <KEYWORD1>WPSTYL</KEYWORD1>
+ <KEYWORD1>WRIT</KEYWORD1>
+ <KEYWORD1>WRITE</KEYWORD1>
+ <KEYWORD1>WSOR</KEYWORD1>
+ <KEYWORD1>WSORT</KEYWORD1>
+ <KEYWORD1>WSTA</KEYWORD1>
+ <KEYWORD1>WSTART</KEYWORD1>
+ <KEYWORD1>XVAR</KEYWORD1>
+ <KEYWORD1>XVAR</KEYWORD1>
+ <KEYWORD1>XVAROPT</KEYWORD1>
+
+<!-- Material properties (short notation) -->
+
+ <KEYWORD1>ex</KEYWORD1>
+ <KEYWORD1>ey</KEYWORD1>
+ <KEYWORD1>ez</KEYWORD1>
+ <KEYWORD1>nuxy</KEYWORD1>
+ <KEYWORD1>nuxz</KEYWORD1>
+ <KEYWORD1>nuyz</KEYWORD1>
+ <KEYWORD1>gxy</KEYWORD1>
+ <KEYWORD1>gxz</KEYWORD1>
+ <KEYWORD1>gyz</KEYWORD1>
+ <KEYWORD1>alpx</KEYWORD1>
+ <KEYWORD1>alpy</KEYWORD1>
+ <KEYWORD1>alpz</KEYWORD1>
+ <KEYWORD1>kxx</KEYWORD1>
+ <KEYWORD1>kyy</KEYWORD1>
+ <KEYWORD1>kzz</KEYWORD1>
+ <KEYWORD1>dens</KEYWORD1>
+ <KEYWORD1>damp</KEYWORD1>
+ <KEYWORD1>mu</KEYWORD1>
+ <KEYWORD1>prxy</KEYWORD1>
+
+<!-- *get functions (abbreviated) -->
+
+ <KEYWORD2>ANGLEK</KEYWORD2>
+ <KEYWORD2>ANGLEN</KEYWORD2>
+ <KEYWORD2>AREAKP</KEYWORD2>
+ <KEYWORD2>AREAND</KEYWORD2>
+ <KEYWORD2>ARFACE</KEYWORD2>
+ <KEYWORD2>ARNEXT</KEYWORD2>
+ <KEYWORD2>ARNODE</KEYWORD2>
+ <KEYWORD2>AX</KEYWORD2>
+ <KEYWORD2>AY</KEYWORD2>
+ <KEYWORD2>AZ</KEYWORD2>
+ <KEYWORD2>CENTRX</KEYWORD2>
+ <KEYWORD2>CENTRY</KEYWORD2>
+ <KEYWORD2>CENTRZ</KEYWORD2>
+ <KEYWORD2>DISTEN</KEYWORD2>
+ <KEYWORD2>DISTKP</KEYWORD2>
+ <KEYWORD2>DISTND</KEYWORD2>
+ <KEYWORD2>ELADJ</KEYWORD2>
+ <KEYWORD2>ELNEXT</KEYWORD2>
+ <KEYWORD2>ENDS</KEYWORD2>
+ <KEYWORD2>ENEARN</KEYWORD2>
+ <KEYWORD2>ENEXTN</KEYWORD2>
+ <KEYWORD2>ENKE</KEYWORD2>
+ <KEYWORD2>KNEAR</KEYWORD2>
+ <KEYWORD2>KP</KEYWORD2>
+ <KEYWORD2>KPNEXT</KEYWORD2>
+ <KEYWORD2>KX</KEYWORD2>
+ <KEYWORD2>KY</KEYWORD2>
+ <KEYWORD2>KZ</KEYWORD2>
+ <KEYWORD2>LOC</KEYWORD2>
+ <KEYWORD2>LSNEXT</KEYWORD2>
+ <KEYWORD2>LSX</KEYWORD2>
+ <KEYWORD2>LSY</KEYWORD2>
+ <KEYWORD2>LSZ</KEYWORD2>
+ <KEYWORD2>LX</KEYWORD2>
+ <KEYWORD2>LY</KEYWORD2>
+ <KEYWORD2>LZ</KEYWORD2>
+ <KEYWORD2>MAG</KEYWORD2>
+ <KEYWORD2>NDFACE</KEYWORD2>
+ <KEYWORD2>NDNEXT</KEYWORD2>
+ <KEYWORD2>NELEM</KEYWORD2>
+ <KEYWORD2>NMFACE</KEYWORD2>
+ <KEYWORD2>NNEAR</KEYWORD2>
+ <KEYWORD2>NODE</KEYWORD2>
+ <KEYWORD2>NORMKX</KEYWORD2>
+ <KEYWORD2>NORMKY</KEYWORD2>
+ <KEYWORD2>NORMKZ</KEYWORD2>
+ <KEYWORD2>NORMNX</KEYWORD2>
+ <KEYWORD2>NORMNY</KEYWORD2>
+ <KEYWORD2>NORMNZ</KEYWORD2>
+ <KEYWORD2>NX</KEYWORD2>
+ <KEYWORD2>NY</KEYWORD2>
+ <KEYWORD2>NZ</KEYWORD2>
+ <KEYWORD2>PRES</KEYWORD2>
+ <KEYWORD2>ROTX</KEYWORD2>
+ <KEYWORD2>ROTY</KEYWORD2>
+ <KEYWORD2>ROTZ</KEYWORD2>
+ <KEYWORD2>TEMP</KEYWORD2>
+ <KEYWORD2>UX</KEYWORD2>
+ <KEYWORD2>UY</KEYWORD2>
+ <KEYWORD2>UZ</KEYWORD2>
+ <KEYWORD2>VLNEXT</KEYWORD2>
+ <KEYWORD2>VOLT</KEYWORD2>
+ <KEYWORD2>VX</KEYWORD2>
+ <KEYWORD2>VY</KEYWORD2>
+ <KEYWORD2>VZ</KEYWORD2>
+
+ <!-- [Keywords 3] -->
+ <!-- command option labels -->
+
+ <!-- AADD command -->
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- *ABBRES command -->
+ <KEYWORD3>new</KEYWORD3>
+ <KEYWORD3>change</KEYWORD3>
+
+ <!-- *AFUN command -->
+ <KEYWORD3>rad</KEYWORD3>
+ <KEYWORD3>deg</KEYWORD3>
+
+ <!-- ALIST command -->
+ <KEYWORD3>hpt</KEYWORD3>
+
+ <!-- ALLSEL command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>below</KEYWORD3>
+ <KEYWORD3>volu</KEYWORD3>
+ <KEYWORD3>area</KEYWORD3>
+ <KEYWORD3>line</KEYWORD3>
+ <KEYWORD3>kp</KEYWORD3>
+ <KEYWORD3>elem</KEYWORD3>
+ <KEYWORD3>node</KEYWORD3>
+
+ <!-- /ANFILE command -->
+ <KEYWORD3>,save</KEYWORD3>
+ <KEYWORD3>resume</KEYWORD3>
+
+ <!-- /ANNOT command -->
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+ <KEYWORD3>dele</KEYWORD3>
+ <KEYWORD3>,save</KEYWORD3>
+ <KEYWORD3>scale</KEYWORD3>
+ <KEYWORD3>xorig</KEYWORD3>
+ <KEYWORD3>yorig</KEYWORD3>
+ <KEYWORD3>snap</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+ <KEYWORD3>defa</KEYWORD3>
+ <KEYWORD3>refr</KEYWORD3>
+
+ <!-- ANTYPE command -->
+ <KEYWORD3>static</KEYWORD3>
+ <KEYWORD3>buckle</KEYWORD3>
+ <KEYWORD3>modal</KEYWORD3>
+ <KEYWORD3>harmic</KEYWORD3>
+ <KEYWORD3>trans</KEYWORD3>
+ <KEYWORD3>substr</KEYWORD3>
+ <KEYWORD3>spectr</KEYWORD3>
+ <KEYWORD3>new</KEYWORD3>
+ <KEYWORD3>rest</KEYWORD3>
+
+ <!-- APLOT command -->
+ <KEYWORD3>dege</KEYWORD3>
+
+ <!-- APPEND command -->
+ <KEYWORD3>first</KEYWORD3>
+ <KEYWORD3>next</KEYWORD3>
+ <KEYWORD3>last</KEYWORD3>
+ <KEYWORD3>near</KEYWORD3>
+ <KEYWORD3>list</KEYWORD3>
+ <KEYWORD3>velo</KEYWORD3>
+ <KEYWORD3>acel</KEYWORD3>
+
+ <!-- ARCTRM command -->
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>,l</KEYWORD3>
+ <KEYWORD3>u</KEYWORD3>
+
+ <!-- AREFINE command -->
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>smooth</KEYWORD3>
+ <KEYWORD3>clean</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+
+ <!-- ARSPLIT command -->
+ <KEYWORD3>tight</KEYWORD3>
+
+ <!--ARSYM command -->
+ <KEYWORD3>x</KEYWORD3>
+ <KEYWORD3>y</KEYWORD3>
+ <KEYWORD3>z</KEYWORD3>
+
+ <!--ASBA, ASBL, ASBV, ASBW commands -->
+ <KEYWORD3>sepo</KEYWORD3>
+ <KEYWORD3>delete</KEYWORD3>
+ <KEYWORD3>keep</KEYWORD3>
+
+ <!-- ASEL command -->
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>,r</KEYWORD3>
+ <KEYWORD3>,a</KEYWORD3>
+ <KEYWORD3>u</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>none</KEYWORD3>
+ <KEYWORD3>inve</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+ <KEYWORD3>area</KEYWORD3>
+ <KEYWORD3>ext</KEYWORD3>
+ <KEYWORD3>loc</KEYWORD3>
+ <KEYWORD3>x</KEYWORD3>
+ <KEYWORD3>y</KEYWORD3>
+ <KEYWORD3>z</KEYWORD3>
+ <KEYWORD3>hpt</KEYWORD3>
+ <KEYWORD3>,mat</KEYWORD3>
+ <KEYWORD3>,type</KEYWORD3>
+ <KEYWORD3>,real</KEYWORD3>
+ <KEYWORD3>,esys</KEYWORD3>
+ <KEYWORD3>acca</KEYWORD3>
+
+ <!-- ASLL, ASLV commands -->
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>,r</KEYWORD3>
+ <KEYWORD3>,a</KEYWORD3>
+ <KEYWORD3>u</KEYWORD3>
+
+ <!-- /ASSIGN command -->
+ <KEYWORD3>emat</KEYWORD3>
+ <KEYWORD3>esav</KEYWORD3>
+ <KEYWORD3>full</KEYWORD3>
+ <KEYWORD3>redm</KEYWORD3>
+ <KEYWORD3>mode</KEYWORD3>
+ <KEYWORD3>rdsp</KEYWORD3>
+ <KEYWORD3>rfrq</KEYWORD3>
+ <KEYWORD3>tri</KEYWORD3>
+ <KEYWORD3>rst</KEYWORD3>
+ <KEYWORD3>rth</KEYWORD3>
+ <KEYWORD3>rmg</KEYWORD3>
+ <KEYWORD3>erot</KEYWORD3>
+ <KEYWORD3>osav</KEYWORD3>
+ <KEYWORD3>rfl</KEYWORD3>
+ <KEYWORD3>seld</KEYWORD3>
+
+ <!-- ASUM command -->
+ <KEYWORD3>default</KEYWORD3>
+ <KEYWORD3>fine</KEYWORD3>
+
+ <!-- AUTOTS command -->
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+
+ <!-- /AXLAB command -->
+ <KEYWORD3>x</KEYWORD3>
+ <KEYWORD3>y</KEYWORD3>
+
+ <!-- /BATCH command -->
+ <KEYWORD3>list</KEYWORD3>
+
+ <!-- /BEND command -->
+ <KEYWORD3>lr</KEYWORD3>
+ <KEYWORD3>sr</KEYWORD3>
+
+ <!-- BF, BFA, BFADELE, BFALIST, BFCUM, BFDELE, BFE, BFECUM, BFEDELE, BFELIST, BFESCAL -->
+ <!-- BFK, BFKDELE, BFKLIST, BFL, BFLDELE, BFLIST, BFLLIST, BFSCALE, BFUNIF, BFV, -->
+ <!-- BFVDELE, BFVLIST commands -->
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>flue</KEYWORD3>
+ <KEYWORD3>hgen</KEYWORD3>
+ <KEYWORD3>js</KEYWORD3>
+ <KEYWORD3>vltg</KEYWORD3>
+ <KEYWORD3>mvdi</KEYWORD3>
+ <KEYWORD3>chrgd</KEYWORD3>
+ <KEYWORD3>forc</KEYWORD3>
+ <KEYWORD3>repl</KEYWORD3>
+ <KEYWORD3>add</KEYWORD3>
+ <KEYWORD3>igno</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+
+ <!-- BIOT command -->
+ <KEYWORD3>new</KEYWORD3>
+ <KEYWORD3>sum</KEYWORD3>
+
+ <!-- BOPTN command -->
+ <KEYWORD3>defa</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+ <KEYWORD3>keep</KEYWORD3>
+ <KEYWORD3>nwarn</KEYWORD3>
+ <KEYWORD3>version</KEYWORD3>
+ <KEYWORD3>no</KEYWORD3>
+ <KEYWORD3>yes</KEYWORD3>
+ <KEYWORD3>rv52</KEYWORD3>
+ <KEYWORD3>rv51</KEYWORD3>
+
+ <!-- BUCOPT command -->
+ <KEYWORD3>subsp</KEYWORD3>
+ <KEYWORD3>lanb</KEYWORD3>
+ <KEYWORD3>reduc</KEYWORD3>
+
+ <!-- CDREAD, CDWRITE commands -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>db</KEYWORD3>
+ <KEYWORD3>solid</KEYWORD3>
+ <KEYWORD3>comb</KEYWORD3>
+ <KEYWORD3>geom</KEYWORD3>
+ <KEYWORD3>cm</KEYWORD3>
+ <KEYWORD3>,mat</KEYWORD3>
+ <KEYWORD3>load</KEYWORD3>
+ <KEYWORD3>blocked</KEYWORD3>
+ <KEYWORD3>unblocked</KEYWORD3>
+
+ <!-- CELIST command -->
+ <KEYWORD3>any</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- CERIG command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>uxyz</KEYWORD3>
+ <KEYWORD3>rxyz</KEYWORD3>
+ <KEYWORD3>ux</KEYWORD3>
+ <KEYWORD3>uy</KEYWORD3>
+ <KEYWORD3>uz</KEYWORD3>
+ <KEYWORD3>rotx</KEYWORD3>
+ <KEYWORD3>roty</KEYWORD3>
+ <KEYWORD3>rotz</KEYWORD3>
+
+ <!-- CFOPEN command -->
+ <KEYWORD3>append</KEYWORD3>
+
+ <!-- CHECK command -->
+ <KEYWORD3>,esel</KEYWORD3>
+ <KEYWORD3>warn</KEYWORD3>
+ <KEYWORD3>err</KEYWORD3>
+
+ <!-- CLEAR command -->
+ <KEYWORD3>start</KEYWORD3>
+ <KEYWORD3>nostart</KEYWORD3>
+
+ <!-- CLOCAL, CS, CSKP, CSWPLA commands -->
+ <KEYWORD3>cart</KEYWORD3>
+ <KEYWORD3>cylin</KEYWORD3>
+ <KEYWORD3>sphe</KEYWORD3>
+ <KEYWORD3>toro</KEYWORD3>
+
+ <!-- CM command -->
+ <KEYWORD3>volu</KEYWORD3>
+ <KEYWORD3>area</KEYWORD3>
+ <KEYWORD3>line</KEYWORD3>
+ <KEYWORD3>kp</KEYWORD3>
+ <KEYWORD3>elem</KEYWORD3>
+ <KEYWORD3>node</KEYWORD3>
+
+ <!-- CMAP command -->
+ <KEYWORD3>create</KEYWORD3>
+
+ <!-- CMEDIT command -->
+ <KEYWORD3>add</KEYWORD3>
+ <KEYWORD3>dele</KEYWORD3>
+
+ <!-- CMPLOT command -->
+ <KEYWORD3>,n</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+
+ <!-- CMSEL command -->
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>,r</KEYWORD3>
+ <KEYWORD3>,a</KEYWORD3>
+ <KEYWORD3>u</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>none</KEYWORD3>
+
+ <!-- CNVTOL command -->
+ <KEYWORD3>stat</KEYWORD3>
+ <KEYWORD3>u</KEYWORD3>
+ <KEYWORD3>rot</KEYWORD3>
+ <KEYWORD3>,f</KEYWORD3>
+ <KEYWORD3>,m</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>heat</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>v</KEYWORD3>
+ <KEYWORD3>flow</KEYWORD3>
+ <KEYWORD3>vf</KEYWORD3>
+ <KEYWORD3>volt</KEYWORD3>
+ <KEYWORD3>emf</KEYWORD3>
+ <KEYWORD3>curr</KEYWORD3>
+ <KEYWORD3>amps</KEYWORD3>
+ <KEYWORD3>curt</KEYWORD3>
+ <KEYWORD3>mag</KEYWORD3>
+ <KEYWORD3>,a</KEYWORD3>
+ <KEYWORD3>flux</KEYWORD3>
+ <KEYWORD3>csg</KEYWORD3>
+ <KEYWORD3>vltg</KEYWORD3>
+
+ <!-- COLOR command -->
+ <KEYWORD3>axes</KEYWORD3>
+ <KEYWORD3>axnum</KEYWORD3>
+ <KEYWORD3>num</KEYWORD3>
+ <KEYWORD3>outl</KEYWORD3>
+ <KEYWORD3>elem</KEYWORD3>
+ <KEYWORD3>line</KEYWORD3>
+ <KEYWORD3>area</KEYWORD3>
+ <KEYWORD3>volu</KEYWORD3>
+ <KEYWORD3>isurf</KEYWORD3>
+ <KEYWORD3>wbak</KEYWORD3>
+ <KEYWORD3>u</KEYWORD3>
+ <KEYWORD3>rot</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>v</KEYWORD3>
+ <KEYWORD3>enke</KEYWORD3>
+ <KEYWORD3>ends</KEYWORD3>
+ <KEYWORD3>sp01</KEYWORD3>
+ <KEYWORD3>sp02</KEYWORD3>
+ <KEYWORD3>sp03</KEYWORD3>
+ <KEYWORD3>sp04</KEYWORD3>
+ <KEYWORD3>sp05</KEYWORD3>
+ <KEYWORD3>sp06</KEYWORD3>
+ <KEYWORD3>volt</KEYWORD3>
+ <KEYWORD3>mag</KEYWORD3>
+ <KEYWORD3>,a</KEYWORD3>
+ <KEYWORD3>emf</KEYWORD3>
+ <KEYWORD3>curr</KEYWORD3>
+ <KEYWORD3>,f</KEYWORD3>
+ <KEYWORD3>,m</KEYWORD3>
+ <KEYWORD3>heat</KEYWORD3>
+ <KEYWORD3>flow</KEYWORD3>
+ <KEYWORD3>vf</KEYWORD3>
+ <KEYWORD3>amps</KEYWORD3>
+ <KEYWORD3>flux</KEYWORD3>
+ <KEYWORD3>csg</KEYWORD3>
+ <KEYWORD3>curt</KEYWORD3>
+ <KEYWORD3>vltg</KEYWORD3>
+ <KEYWORD3>mast</KEYWORD3>
+ <KEYWORD3>,cp</KEYWORD3>
+ <KEYWORD3>,ce</KEYWORD3>
+ <KEYWORD3>nfor</KEYWORD3>
+ <KEYWORD3>nmom</KEYWORD3>
+ <KEYWORD3>rfor</KEYWORD3>
+ <KEYWORD3>rmom</KEYWORD3>
+ <KEYWORD3>path</KEYWORD3>
+ <KEYWORD3>grbak</KEYWORD3>
+ <KEYWORD3>grid</KEYWORD3>
+ <KEYWORD3>axlab</KEYWORD3>
+ <KEYWORD3>curve</KEYWORD3>
+ <KEYWORD3>cm</KEYWORD3>
+ <KEYWORD3>cntr</KEYWORD3>
+ <KEYWORD3>smax</KEYWORD3>
+ <KEYWORD3>smin</KEYWORD3>
+ <KEYWORD3>mred</KEYWORD3>
+ <KEYWORD3>cblu</KEYWORD3>
+ <KEYWORD3>ygre</KEYWORD3>
+ <KEYWORD3>dgra</KEYWORD3>
+ <KEYWORD3>mage</KEYWORD3>
+ <KEYWORD3>cyan</KEYWORD3>
+ <KEYWORD3>yell</KEYWORD3>
+ <KEYWORD3>lgra</KEYWORD3>
+ <KEYWORD3>bmag</KEYWORD3>
+ <KEYWORD3>gcya</KEYWORD3>
+ <KEYWORD3>oran</KEYWORD3>
+ <KEYWORD3>whit</KEYWORD3>
+ <KEYWORD3>blue</KEYWORD3>
+ <KEYWORD3>gree</KEYWORD3>
+ <KEYWORD3>red</KEYWORD3>
+ <KEYWORD3>blac</KEYWORD3>
+
+ <!-- CONFIG command -->
+ <KEYWORD3>nres</KEYWORD3>
+ <KEYWORD3>nbuf</KEYWORD3>
+ <KEYWORD3>nproc</KEYWORD3>
+ <KEYWORD3>locfl</KEYWORD3>
+ <KEYWORD3>szbio</KEYWORD3>
+ <KEYWORD3>ncont</KEYWORD3>
+ <KEYWORD3>order</KEYWORD3>
+ <KEYWORD3>fsplit</KEYWORD3>
+ <KEYWORD3>mxnd</KEYWORD3>
+ <KEYWORD3>mxel</KEYWORD3>
+ <KEYWORD3>mxkp</KEYWORD3>
+ <KEYWORD3>mxls</KEYWORD3>
+ <KEYWORD3>mxar</KEYWORD3>
+ <KEYWORD3>mxvl</KEYWORD3>
+ <KEYWORD3>mxrl</KEYWORD3>
+ <KEYWORD3>mxcp</KEYWORD3>
+ <KEYWORD3>mxce</KEYWORD3>
+ <KEYWORD3>nlcontrol</KEYWORD3>
+
+ <!-- CP command -->
+ <KEYWORD3>high</KEYWORD3>
+ <KEYWORD3>next</KEYWORD3>
+
+ <!-- CPDELE, CPLIST commands -->
+ <KEYWORD3>any</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- CPINTF, D, DA, DADELE, DDELE, DK, DL, DLDELE, DOF, DOFSEL, FKLIST commands -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>ux</KEYWORD3>
+ <KEYWORD3>uy</KEYWORD3>
+ <KEYWORD3>uz</KEYWORD3>
+ <KEYWORD3>rotx</KEYWORD3>
+ <KEYWORD3>roty</KEYWORD3>
+ <KEYWORD3>rotz</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>vx</KEYWORD3>
+ <KEYWORD3>vy</KEYWORD3>
+ <KEYWORD3>vz</KEYWORD3>
+ <KEYWORD3>volt</KEYWORD3>
+ <KEYWORD3>emf</KEYWORD3>
+ <KEYWORD3>curr</KEYWORD3>
+ <KEYWORD3>mag</KEYWORD3>
+ <KEYWORD3>ax</KEYWORD3>
+ <KEYWORD3>ay</KEYWORD3>
+ <KEYWORD3>az</KEYWORD3>
+ <KEYWORD3>enke</KEYWORD3>
+ <KEYWORD3>ends</KEYWORD3>
+ <KEYWORD3>sp01</KEYWORD3>
+ <KEYWORD3>sp02</KEYWORD3>
+ <KEYWORD3>sp03</KEYWORD3>
+ <KEYWORD3>sp04</KEYWORD3>
+ <KEYWORD3>sp05</KEYWORD3>
+ <KEYWORD3>sp06</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+ <KEYWORD3>symm</KEYWORD3>
+ <KEYWORD3>asym</KEYWORD3>
+ <KEYWORD3>delete</KEYWORD3>
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>,a</KEYWORD3>
+ <KEYWORD3>u</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+ <KEYWORD3>rot</KEYWORD3>
+ <KEYWORD3>disp</KEYWORD3>
+ <KEYWORD3>v</KEYWORD3>
+ <KEYWORD3>en</KEYWORD3>
+ <KEYWORD3>fx</KEYWORD3>
+ <KEYWORD3>fy</KEYWORD3>
+ <KEYWORD3>fz</KEYWORD3>
+ <KEYWORD3>,f</KEYWORD3>
+ <KEYWORD3>mx</KEYWORD3>
+ <KEYWORD3>my</KEYWORD3>
+ <KEYWORD3>mz</KEYWORD3>
+ <KEYWORD3>,m</KEYWORD3>
+ <KEYWORD3>forc</KEYWORD3>
+ <KEYWORD3>heat</KEYWORD3>
+ <KEYWORD3>flow</KEYWORD3>
+ <KEYWORD3>amps</KEYWORD3>
+ <KEYWORD3>chrg</KEYWORD3>
+ <KEYWORD3>flux</KEYWORD3>
+ <KEYWORD3>csgx</KEYWORD3>
+ <KEYWORD3>csgy</KEYWORD3>
+ <KEYWORD3>csgz</KEYWORD3>
+ <KEYWORD3>csg</KEYWORD3>
+
+ <!-- CQC command -->
+ <KEYWORD3>disp</KEYWORD3>
+ <KEYWORD3>velo</KEYWORD3>
+ <KEYWORD3>acel</KEYWORD3>
+
+ <!-- CSDELE, CSLIST commands -->
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- CUTCONTROL command -->
+ <KEYWORD3>plslimit</KEYWORD3>
+ <KEYWORD3>crplimit</KEYWORD3>
+ <KEYWORD3>dsplimit</KEYWORD3>
+ <KEYWORD3>npoint</KEYWORD3>
+ <KEYWORD3>noiterpredict</KEYWORD3>
+
+ <!-- DCUM command -->
+ <KEYWORD3>repl</KEYWORD3>
+ <KEYWORD3>add</KEYWORD3>
+ <KEYWORD3>igno</KEYWORD3>
+
+ <!-- DEL command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>_prm</KEYWORD3>
+
+ <!-- DELTIM command -->
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+
+ <!-- DESIZE command -->
+ <KEYWORD3>defa</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+
+ <!-- DESOL, DNSOL commands -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>x</KEYWORD3>
+ <KEYWORD3>y</KEYWORD3>
+ <KEYWORD3>z</KEYWORD3>
+ <KEYWORD3>xy</KEYWORD3>
+ <KEYWORD3>yz</KEYWORD3>
+ <KEYWORD3>zx</KEYWORD3>
+ <KEYWORD3>epel</KEYWORD3>
+ <KEYWORD3>eppl</KEYWORD3>
+ <KEYWORD3>epcr</KEYWORD3>
+ <KEYWORD3>epth</KEYWORD3>
+ <KEYWORD3>epsw</KEYWORD3>
+ <KEYWORD3>nl</KEYWORD3>
+ <KEYWORD3>sepl</KEYWORD3>
+ <KEYWORD3>srat</KEYWORD3>
+ <KEYWORD3>hpres</KEYWORD3>
+ <KEYWORD3>epeq</KEYWORD3>
+ <KEYWORD3>psv</KEYWORD3>
+ <KEYWORD3>plwk</KEYWORD3>
+ <KEYWORD3>tg</KEYWORD3>
+ <KEYWORD3>tf</KEYWORD3>
+ <KEYWORD3>pg</KEYWORD3>
+ <KEYWORD3>ef</KEYWORD3>
+ <KEYWORD3>,d</KEYWORD3>
+ <KEYWORD3>h</KEYWORD3>
+ <KEYWORD3>b</KEYWORD3>
+ <KEYWORD3>fmag</KEYWORD3>
+ <KEYWORD3>,f</KEYWORD3>
+ <KEYWORD3>,m</KEYWORD3>
+ <KEYWORD3>heat</KEYWORD3>
+ <KEYWORD3>flow</KEYWORD3>
+ <KEYWORD3>amps</KEYWORD3>
+ <KEYWORD3>flux</KEYWORD3>
+ <KEYWORD3>vf</KEYWORD3>
+ <KEYWORD3>csg</KEYWORD3>
+ <KEYWORD3>u</KEYWORD3>
+ <KEYWORD3>rot</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>volt</KEYWORD3>
+ <KEYWORD3>mag</KEYWORD3>
+ <KEYWORD3>v</KEYWORD3>
+ <KEYWORD3>,a</KEYWORD3>
+ <KEYWORD3>enke</KEYWORD3>
+ <KEYWORD3>ends</KEYWORD3>
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>int</KEYWORD3>
+ <KEYWORD3>eqv</KEYWORD3>
+ <KEYWORD3>sum</KEYWORD3>
+ <KEYWORD3>ttot</KEYWORD3>
+ <KEYWORD3>hflu</KEYWORD3>
+ <KEYWORD3>hflm</KEYWORD3>
+ <KEYWORD3>cond</KEYWORD3>
+ <KEYWORD3>pcoe</KEYWORD3>
+ <KEYWORD3>ptot</KEYWORD3>
+ <KEYWORD3>mach</KEYWORD3>
+ <KEYWORD3>strm</KEYWORD3>
+ <KEYWORD3>dens</KEYWORD3>
+ <KEYWORD3>visc</KEYWORD3>
+ <KEYWORD3>evis</KEYWORD3>
+ <KEYWORD3>cmuv</KEYWORD3>
+ <KEYWORD3>econ</KEYWORD3>
+ <KEYWORD3>yplu</KEYWORD3>
+ <KEYWORD3>tauw</KEYWORD3>
+
+ <!-- DEVDISP command -->
+ <KEYWORD3>dither</KEYWORD3>
+ <KEYWORD3>font</KEYWORD3>
+ <KEYWORD3>text</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+
+ <!-- DEVICE command -->
+ <KEYWORD3>vector</KEYWORD3>
+ <KEYWORD3>dither</KEYWORD3>
+ <KEYWORD3>anim</KEYWORD3>
+ <KEYWORD3>font</KEYWORD3>
+ <KEYWORD3>text</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+
+ <!-- DIM command -->
+ <KEYWORD3>array</KEYWORD3>
+ <KEYWORD3>char</KEYWORD3>
+ <KEYWORD3>table</KEYWORD3>
+ <KEYWORD3>time</KEYWORD3>
+ <KEYWORD3>x</KEYWORD3>
+ <KEYWORD3>y</KEYWORD3>
+ <KEYWORD3>z</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>velocity</KEYWORD3>
+ <KEYWORD3>pressure</KEYWORD3>
+
+ <!-- /DSCALE command -->
+ <KEYWORD3>auto</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>user</KEYWORD3>
+
+ <!-- DSUM command -->
+ <KEYWORD3>disp</KEYWORD3>
+ <KEYWORD3>velo</KEYWORD3>
+ <KEYWORD3>acel</KEYWORD3>
+
+ <!-- DSYM command -->
+ <KEYWORD3>symm</KEYWORD3>
+ <KEYWORD3>asym</KEYWORD3>
+ <KEYWORD3>x</KEYWORD3>
+ <KEYWORD3>y</KEYWORD3>
+ <KEYWORD3>z</KEYWORD3>
+
+ <!-- DUMP command -->
+ <KEYWORD3>head</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- /DV3D command -->
+ <KEYWORD3>anim</KEYWORD3>
+ <KEYWORD3>dgen</KEYWORD3>
+ <KEYWORD3>dlist</KEYWORD3>
+
+ <!-- EDBOUND command -->
+ <KEYWORD3>add</KEYWORD3>
+ <KEYWORD3>dele</KEYWORD3>
+ <KEYWORD3>list</KEYWORD3>
+ <KEYWORD3>slide</KEYWORD3>
+ <KEYWORD3>cycl</KEYWORD3>
+
+ <!-- EDCDELE, EDCGEN commands -->
+ <KEYWORD3>ants</KEYWORD3>
+ <KEYWORD3>assc</KEYWORD3>
+ <KEYWORD3>asts</KEYWORD3>
+ <KEYWORD3>drawbead</KEYWORD3>
+ <KEYWORD3>ents</KEYWORD3>
+ <KEYWORD3>ess</KEYWORD3>
+ <KEYWORD3>ests</KEYWORD3>
+ <KEYWORD3>nts</KEYWORD3>
+ <KEYWORD3>osts</KEYWORD3>
+ <KEYWORD3>rntr</KEYWORD3>
+ <KEYWORD3>rotr</KEYWORD3>
+ <KEYWORD3>se</KEYWORD3>
+ <KEYWORD3>ss</KEYWORD3>
+ <KEYWORD3>sts</KEYWORD3>
+ <KEYWORD3>tdns</KEYWORD3>
+ <KEYWORD3>tdss</KEYWORD3>
+ <KEYWORD3>tnts</KEYWORD3>
+ <KEYWORD3>tsts</KEYWORD3>
+
+ <!-- EDCRB, EDCURVE, EDLCS commands -->
+ <KEYWORD3>add</KEYWORD3>
+ <KEYWORD3>dele</KEYWORD3>
+ <KEYWORD3>list</KEYWORD3>
+
+ <!-- EDCSC command -->
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+
+ <!-- EDDAMP command -->
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- EDDRELAX command -->
+ <KEYWORD3>ansys</KEYWORD3>
+ <KEYWORD3>dyna</KEYWORD3>
+
+ <!-- EDELE command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+
+ <!-- EDENERGY, EDFPLOT commands -->
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+
+ <!-- EDHIST, EDIVELO commands -->
+ <KEYWORD3>list</KEYWORD3>
+ <KEYWORD3>dele</KEYWORD3>
+
+ <!-- EDLDPLOT, EDLOAD command -->
+ <KEYWORD3>fx</KEYWORD3>
+ <KEYWORD3>fy</KEYWORD3>
+ <KEYWORD3>fz</KEYWORD3>
+ <KEYWORD3>mx</KEYWORD3>
+ <KEYWORD3>my</KEYWORD3>
+ <KEYWORD3>mz</KEYWORD3>
+ <KEYWORD3>ux</KEYWORD3>
+ <KEYWORD3>uy</KEYWORD3>
+ <KEYWORD3>uz</KEYWORD3>
+ <KEYWORD3>rotx</KEYWORD3>
+ <KEYWORD3>roty</KEYWORD3>
+ <KEYWORD3>rotz</KEYWORD3>
+ <KEYWORD3>vx</KEYWORD3>
+ <KEYWORD3>vy</KEYWORD3>
+ <KEYWORD3>vz</KEYWORD3>
+ <KEYWORD3>ax</KEYWORD3>
+ <KEYWORD3>ay</KEYWORD3>
+ <KEYWORD3>az</KEYWORD3>
+ <KEYWORD3>aclx</KEYWORD3>
+ <KEYWORD3>acly</KEYWORD3>
+ <KEYWORD3>aclz</KEYWORD3>
+ <KEYWORD3>omgx</KEYWORD3>
+ <KEYWORD3>omgy</KEYWORD3>
+ <KEYWORD3>omgz</KEYWORD3>
+ <KEYWORD3>press</KEYWORD3>
+ <KEYWORD3>rbux</KEYWORD3>
+ <KEYWORD3>rbuy</KEYWORD3>
+ <KEYWORD3>rbuz</KEYWORD3>
+ <KEYWORD3>rbrx</KEYWORD3>
+ <KEYWORD3>rbry</KEYWORD3>
+ <KEYWORD3>rbrz</KEYWORD3>
+ <KEYWORD3>rbvx</KEYWORD3>
+ <KEYWORD3>rbvy</KEYWORD3>
+ <KEYWORD3>rbvz</KEYWORD3>
+ <KEYWORD3>rbfx</KEYWORD3>
+ <KEYWORD3>rbfy</KEYWORD3>
+ <KEYWORD3>rbfz</KEYWORD3>
+ <KEYWORD3>rbmx</KEYWORD3>
+ <KEYWORD3>rbmy</KEYWORD3>
+ <KEYWORD3>rbmz</KEYWORD3>
+ <KEYWORD3>add</KEYWORD3>
+ <KEYWORD3>dele</KEYWORD3>
+ <KEYWORD3>list</KEYWORD3>
+
+ <!-- EDMP command -->
+ <KEYWORD3>hgls</KEYWORD3>
+ <KEYWORD3>rigid</KEYWORD3>
+ <KEYWORD3>cable</KEYWORD3>
+ <KEYWORD3>ortho</KEYWORD3>
+
+ <!-- EDNROT, EDOPT commands -->
+ <KEYWORD3>add</KEYWORD3>
+ <KEYWORD3>dele</KEYWORD3>
+ <KEYWORD3>list</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>ux</KEYWORD3>
+ <KEYWORD3>uy</KEYWORD3>
+ <KEYWORD3>uz</KEYWORD3>
+ <KEYWORD3>rotx</KEYWORD3>
+ <KEYWORD3>roty</KEYWORD3>
+ <KEYWORD3>rotz</KEYWORD3>
+ <KEYWORD3>ansys</KEYWORD3>
+ <KEYWORD3>taurus</KEYWORD3>
+ <KEYWORD3>both</KEYWORD3>
+
+ <!-- EDOUT, EDREAD commands -->
+ <KEYWORD3>glstat</KEYWORD3>
+ <KEYWORD3>bndout</KEYWORD3>
+ <KEYWORD3>rwforc</KEYWORD3>
+ <KEYWORD3>deforc</KEYWORD3>
+ <KEYWORD3>,matsum</KEYWORD3>
+ <KEYWORD3>ncforc</KEYWORD3>
+ <KEYWORD3>rcforc</KEYWORD3>
+ <KEYWORD3>defgeo</KEYWORD3>
+ <KEYWORD3>spcforc</KEYWORD3>
+ <KEYWORD3>swforc</KEYWORD3>
+ <KEYWORD3>rbdout</KEYWORD3>
+ <KEYWORD3>gceout</KEYWORD3>
+ <KEYWORD3>sleout</KEYWORD3>
+ <KEYWORD3>jntforc</KEYWORD3>
+ <KEYWORD3>nodout</KEYWORD3>
+ <KEYWORD3>elout</KEYWORD3>
+
+ <!-- EDWELD command -->
+ <KEYWORD3>add</KEYWORD3>
+ <KEYWORD3>dele</KEYWORD3>
+ <KEYWORD3>list</KEYWORD3>
+
+ <!-- EDWRITE command -->
+ <KEYWORD3>ansys</KEYWORD3>
+ <KEYWORD3>taurus</KEYWORD3>
+ <KEYWORD3>both</KEYWORD3>
+ <KEYWORD3>pcreate</KEYWORD3>
+ <KEYWORD3>pupdate</KEYWORD3>
+ <KEYWORD3>plist</KEYWORD3>
+
+ <!-- EKILL, ELIST commands -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+
+ <!-- *ELSEIF command -->
+ <KEYWORD3>eq</KEYWORD3>
+ <KEYWORD3>ne</KEYWORD3>
+ <KEYWORD3>lt</KEYWORD3>
+ <KEYWORD3>gt</KEYWORD3>
+ <KEYWORD3>le</KEYWORD3>
+ <KEYWORD3>ge</KEYWORD3>
+ <KEYWORD3>ablt</KEYWORD3>
+ <KEYWORD3>abgt</KEYWORD3>
+
+ <!-- EMID command -->
+ <KEYWORD3>add</KEYWORD3>
+ <KEYWORD3>remove</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>either</KEYWORD3>
+ <KEYWORD3>both</KEYWORD3>
+
+ <!-- EMODIF command -->
+ <KEYWORD3>p</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>,mat</KEYWORD3>
+ <KEYWORD3>,type</KEYWORD3>
+ <KEYWORD3>,real</KEYWORD3>
+ <KEYWORD3>,esys</KEYWORD3>
+ <KEYWORD3>secnum</KEYWORD3>
+
+ <!-- EMORE, EN commands -->
+ <KEYWORD3>p</KEYWORD3>
+
+ <!-- EMUNIT command -->
+ <KEYWORD3>mks</KEYWORD3>
+ <KEYWORD3>muzro</KEYWORD3>
+ <KEYWORD3>epzro</KEYWORD3>
+
+ <!-- ENGEN, ENORM, ENSYM commands -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+
+ <!-- EQSLV command -->
+ <KEYWORD3>front</KEYWORD3>
+ <KEYWORD3>sparse</KEYWORD3>
+ <KEYWORD3>jcg</KEYWORD3>
+ <KEYWORD3>jcgout</KEYWORD3>
+ <KEYWORD3>iccg</KEYWORD3>
+ <KEYWORD3>pcg</KEYWORD3>
+ <KEYWORD3>pcgout</KEYWORD3>
+ <KEYWORD3>iter</KEYWORD3>
+
+ <!-- EREFINE command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>smooth</KEYWORD3>
+ <KEYWORD3>clean</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+
+ <!-- ERESX command -->
+ <KEYWORD3>defa</KEYWORD3>
+ <KEYWORD3>yes</KEYWORD3>
+ <KEYWORD3>no</KEYWORD3>
+
+ <!-- ERNORM command -->
+ <KEYWORD3>on</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+
+ <!-- ESEL command -->
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>,r</KEYWORD3>
+ <KEYWORD3>,a</KEYWORD3>
+ <KEYWORD3>u</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>none</KEYWORD3>
+ <KEYWORD3>inve</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+ <KEYWORD3>elem</KEYWORD3>
+ <KEYWORD3>adj</KEYWORD3>
+ <KEYWORD3>,type</KEYWORD3>
+ <KEYWORD3>ename</KEYWORD3>
+ <KEYWORD3>,mat</KEYWORD3>
+ <KEYWORD3>,real</KEYWORD3>
+ <KEYWORD3>,esys</KEYWORD3>
+ <KEYWORD3>live</KEYWORD3>
+ <KEYWORD3>layer</KEYWORD3>
+ <KEYWORD3>sec</KEYWORD3>
+ <KEYWORD3>pinc</KEYWORD3>
+ <KEYWORD3>pexc</KEYWORD3>
+ <KEYWORD3>sfe</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>conv</KEYWORD3>
+ <KEYWORD3>hflux</KEYWORD3>
+ <KEYWORD3>fsi</KEYWORD3>
+ <KEYWORD3>impd</KEYWORD3>
+ <KEYWORD3>shld</KEYWORD3>
+ <KEYWORD3>mxwf</KEYWORD3>
+ <KEYWORD3>chrgs</KEYWORD3>
+ <KEYWORD3>inf</KEYWORD3>
+ <KEYWORD3>bfe</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>flue</KEYWORD3>
+ <KEYWORD3>hgen</KEYWORD3>
+ <KEYWORD3>js</KEYWORD3>
+ <KEYWORD3>mvdi</KEYWORD3>
+ <KEYWORD3>chrgd</KEYWORD3>
+ <KEYWORD3>etab</KEYWORD3>
+
+ <!-- ESLA, ESLL, ESLN, ESLV commands -->
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>,r</KEYWORD3>
+ <KEYWORD3>,a</KEYWORD3>
+ <KEYWORD3>u</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>active</KEYWORD3>
+ <KEYWORD3>inactive</KEYWORD3>
+ <KEYWORD3>corner</KEYWORD3>
+ <KEYWORD3>mid</KEYWORD3>
+
+ <!-- ESOL command -->
+ <KEYWORD3>p</KEYWORD3>
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>x</KEYWORD3>
+ <KEYWORD3>y</KEYWORD3>
+ <KEYWORD3>z</KEYWORD3>
+ <KEYWORD3>xy</KEYWORD3>
+ <KEYWORD3>yz</KEYWORD3>
+ <KEYWORD3>zx</KEYWORD3>
+ <KEYWORD3>int</KEYWORD3>
+ <KEYWORD3>eqv</KEYWORD3>
+ <KEYWORD3>epel</KEYWORD3>
+ <KEYWORD3>eppl</KEYWORD3>
+ <KEYWORD3>epcr</KEYWORD3>
+ <KEYWORD3>epth</KEYWORD3>
+ <KEYWORD3>nl</KEYWORD3>
+ <KEYWORD3>sepl</KEYWORD3>
+ <KEYWORD3>srat</KEYWORD3>
+ <KEYWORD3>hpres</KEYWORD3>
+ <KEYWORD3>epeq</KEYWORD3>
+ <KEYWORD3>psv</KEYWORD3>
+ <KEYWORD3>plwk</KEYWORD3>
+ <KEYWORD3>cont</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+ <KEYWORD3>pene</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>sfric</KEYWORD3>
+ <KEYWORD3>stot</KEYWORD3>
+ <KEYWORD3>slide</KEYWORD3>
+ <KEYWORD3>tg</KEYWORD3>
+ <KEYWORD3>sum</KEYWORD3>
+ <KEYWORD3>tf</KEYWORD3>
+ <KEYWORD3>pg</KEYWORD3>
+ <KEYWORD3>ef</KEYWORD3>
+ <KEYWORD3>,d</KEYWORD3>
+ <KEYWORD3>h</KEYWORD3>
+ <KEYWORD3>b</KEYWORD3>
+ <KEYWORD3>fmag</KEYWORD3>
+ <KEYWORD3>,f</KEYWORD3>
+ <KEYWORD3>,m</KEYWORD3>
+ <KEYWORD3>heat</KEYWORD3>
+ <KEYWORD3>flow</KEYWORD3>
+ <KEYWORD3>amps</KEYWORD3>
+ <KEYWORD3>flux</KEYWORD3>
+ <KEYWORD3>vf</KEYWORD3>
+ <KEYWORD3>csg</KEYWORD3>
+ <KEYWORD3>sene</KEYWORD3>
+ <KEYWORD3>kene</KEYWORD3>
+ <KEYWORD3>jheat</KEYWORD3>
+ <KEYWORD3>js</KEYWORD3>
+ <KEYWORD3>jt</KEYWORD3>
+ <KEYWORD3>mre</KEYWORD3>
+ <KEYWORD3>volu</KEYWORD3>
+ <KEYWORD3>bfe</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+
+ <!-- ESORT command -->
+ <KEYWORD3>etab</KEYWORD3>
+
+ <!-- ESURF command -->
+ <KEYWORD3>top</KEYWORD3>
+ <KEYWORD3>bottom</KEYWORD3>
+ <KEYWORD3>reverse</KEYWORD3>
+ <KEYWORD3>tri</KEYWORD3>
+
+ <!-- ESYM command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+
+ <!-- ETABLE command -->
+ <KEYWORD3>refl</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+ <KEYWORD3>eras</KEYWORD3>
+ <KEYWORD3>u</KEYWORD3>
+ <KEYWORD3>x</KEYWORD3>
+ <KEYWORD3>y</KEYWORD3>
+ <KEYWORD3>z</KEYWORD3>
+ <KEYWORD3>rot</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>volt</KEYWORD3>
+ <KEYWORD3>mag</KEYWORD3>
+ <KEYWORD3>v</KEYWORD3>
+ <KEYWORD3>,a</KEYWORD3>
+ <KEYWORD3>curr</KEYWORD3>
+ <KEYWORD3>emf</KEYWORD3>
+ <KEYWORD3>enke</KEYWORD3>
+ <KEYWORD3>ends</KEYWORD3>
+ <KEYWORD3>sp01</KEYWORD3>
+ <KEYWORD3>sp02</KEYWORD3>
+ <KEYWORD3>sp03</KEYWORD3>
+ <KEYWORD3>sp04</KEYWORD3>
+ <KEYWORD3>sp05</KEYWORD3>
+ <KEYWORD3>sp06</KEYWORD3>
+ <KEYWORD3>ttot</KEYWORD3>
+ <KEYWORD3>hflu</KEYWORD3>
+ <KEYWORD3>hflm</KEYWORD3>
+ <KEYWORD3>cond</KEYWORD3>
+ <KEYWORD3>pcoe</KEYWORD3>
+ <KEYWORD3>ptot</KEYWORD3>
+ <KEYWORD3>mach</KEYWORD3>
+ <KEYWORD3>strm</KEYWORD3>
+ <KEYWORD3>dens</KEYWORD3>
+ <KEYWORD3>visc</KEYWORD3>
+ <KEYWORD3>evis</KEYWORD3>
+ <KEYWORD3>econ</KEYWORD3>
+ <KEYWORD3>yplu</KEYWORD3>
+ <KEYWORD3>tauw</KEYWORD3>
+ <KEYWORD3>lmd1</KEYWORD3>
+ <KEYWORD3>lmd2</KEYWORD3>
+ <KEYWORD3>lmd3</KEYWORD3>
+ <KEYWORD3>lmd4</KEYWORD3>
+ <KEYWORD3>lmd5</KEYWORD3>
+ <KEYWORD3>lmd6</KEYWORD3>
+ <KEYWORD3>emd1</KEYWORD3>
+ <KEYWORD3>emd2</KEYWORD3>
+ <KEYWORD3>emd3</KEYWORD3>
+ <KEYWORD3>emd4</KEYWORD3>
+ <KEYWORD3>emd5</KEYWORD3>
+ <KEYWORD3>emd6</KEYWORD3>
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>xy</KEYWORD3>
+ <KEYWORD3>yz</KEYWORD3>
+ <KEYWORD3>zx</KEYWORD3>
+ <KEYWORD3>int</KEYWORD3>
+ <KEYWORD3>eqv</KEYWORD3>
+ <KEYWORD3>epto</KEYWORD3>
+ <KEYWORD3>epel</KEYWORD3>
+ <KEYWORD3>eppl</KEYWORD3>
+ <KEYWORD3>epcr</KEYWORD3>
+ <KEYWORD3>epth</KEYWORD3>
+ <KEYWORD3>epsw</KEYWORD3>
+ <KEYWORD3>nl</KEYWORD3>
+ <KEYWORD3>sepl</KEYWORD3>
+ <KEYWORD3>srat</KEYWORD3>
+ <KEYWORD3>hpres</KEYWORD3>
+ <KEYWORD3>epeq</KEYWORD3>
+ <KEYWORD3>psv</KEYWORD3>
+ <KEYWORD3>plwk</KEYWORD3>
+ <KEYWORD3>tg</KEYWORD3>
+ <KEYWORD3>sum</KEYWORD3>
+ <KEYWORD3>tf</KEYWORD3>
+ <KEYWORD3>pg</KEYWORD3>
+ <KEYWORD3>ef</KEYWORD3>
+ <KEYWORD3>,d</KEYWORD3>
+ <KEYWORD3>h</KEYWORD3>
+ <KEYWORD3>b</KEYWORD3>
+ <KEYWORD3>fmag</KEYWORD3>
+ <KEYWORD3>serr</KEYWORD3>
+ <KEYWORD3>sdsg</KEYWORD3>
+ <KEYWORD3>terr</KEYWORD3>
+ <KEYWORD3>tdsg</KEYWORD3>
+ <KEYWORD3>,f</KEYWORD3>
+ <KEYWORD3>,m</KEYWORD3>
+ <KEYWORD3>heat</KEYWORD3>
+ <KEYWORD3>flow</KEYWORD3>
+ <KEYWORD3>amps</KEYWORD3>
+ <KEYWORD3>flux</KEYWORD3>
+ <KEYWORD3>vf</KEYWORD3>
+ <KEYWORD3>csg</KEYWORD3>
+ <KEYWORD3>sene</KEYWORD3>
+ <KEYWORD3>aene</KEYWORD3>
+ <KEYWORD3>tene</KEYWORD3>
+ <KEYWORD3>kene</KEYWORD3>
+ <KEYWORD3>jheat</KEYWORD3>
+ <KEYWORD3>js</KEYWORD3>
+ <KEYWORD3>jt</KEYWORD3>
+ <KEYWORD3>mre</KEYWORD3>
+ <KEYWORD3>volu</KEYWORD3>
+ <KEYWORD3>cent</KEYWORD3>
+ <KEYWORD3>bfe</KEYWORD3>
+ <KEYWORD3>smisc</KEYWORD3>
+ <KEYWORD3>nmisc</KEYWORD3>
+ <KEYWORD3>surf</KEYWORD3>
+ <KEYWORD3>cont</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+ <KEYWORD3>pene</KEYWORD3>
+ <KEYWORD3>sfric</KEYWORD3>
+ <KEYWORD3>stot</KEYWORD3>
+ <KEYWORD3>slide</KEYWORD3>
+ <KEYWORD3>gap</KEYWORD3>
+ <KEYWORD3>topo</KEYWORD3>
+
+ <!-- ETCHG command -->
+ <KEYWORD3>eti</KEYWORD3>
+ <KEYWORD3>ite</KEYWORD3>
+ <KEYWORD3>tts</KEYWORD3>
+ <KEYWORD3>stt</KEYWORD3>
+ <KEYWORD3>mtt</KEYWORD3>
+ <KEYWORD3>fts</KEYWORD3>
+ <KEYWORD3>ets</KEYWORD3>
+
+ <!-- ETDELE, ETLIST commands -->
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- EWRITE command -->
+ <KEYWORD3>elem</KEYWORD3>
+ <KEYWORD3>short</KEYWORD3>
+ <KEYWORD3>long1</KEYWORD3>
+
+ <!-- /EXIT command -->
+ <KEYWORD3>model</KEYWORD3>
+ <KEYWORD3>solu</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>nosave</KEYWORD3>
+
+ <!-- /EXPAND command -->
+ <KEYWORD3>rect</KEYWORD3>
+ <KEYWORD3>polar</KEYWORD3>
+ <KEYWORD3>modal</KEYWORD3>
+ <KEYWORD3>full</KEYWORD3>
+ <KEYWORD3>half</KEYWORD3>
+
+ <!-- EXPASS command -->
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+
+ <!-- EXPSOL command -->
+ <KEYWORD3>yes</KEYWORD3>
+ <KEYWORD3>no</KEYWORD3>
+
+ <!-- EXTOPT command -->
+ <KEYWORD3>on</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+ <KEYWORD3>attr</KEYWORD3>
+ <KEYWORD3>esize</KEYWORD3>
+ <KEYWORD3>aclear</KEYWORD3>
+
+ <!-- F, FDELE, FK, FKDELE commands -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+ <KEYWORD3>fx</KEYWORD3>
+ <KEYWORD3>fy</KEYWORD3>
+ <KEYWORD3>fz</KEYWORD3>
+ <KEYWORD3>mx</KEYWORD3>
+ <KEYWORD3>my</KEYWORD3>
+ <KEYWORD3>mz</KEYWORD3>
+ <KEYWORD3>heat</KEYWORD3>
+ <KEYWORD3>flow</KEYWORD3>
+ <KEYWORD3>amps</KEYWORD3>
+ <KEYWORD3>chrg</KEYWORD3>
+ <KEYWORD3>flux</KEYWORD3>
+ <KEYWORD3>csgx</KEYWORD3>
+ <KEYWORD3>csgy</KEYWORD3>
+ <KEYWORD3>csgz</KEYWORD3>
+
+ <!-- /FACET command -->
+ <KEYWORD3>fine</KEYWORD3>
+ <KEYWORD3>norml</KEYWORD3>
+ <KEYWORD3>wire</KEYWORD3>
+
+ <!-- FCUM command -->
+ <KEYWORD3>repl</KEYWORD3>
+ <KEYWORD3>add</KEYWORD3>
+ <KEYWORD3>igno</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+
+ <!-- /FDELE command -->
+ <KEYWORD3>emat</KEYWORD3>
+ <KEYWORD3>esav</KEYWORD3>
+ <KEYWORD3>full</KEYWORD3>
+ <KEYWORD3>sub</KEYWORD3>
+ <KEYWORD3>mode</KEYWORD3>
+ <KEYWORD3>tri</KEYWORD3>
+ <KEYWORD3>dsub</KEYWORD3>
+ <KEYWORD3>usub</KEYWORD3>
+ <KEYWORD3>osav</KEYWORD3>
+ <KEYWORD3>seld</KEYWORD3>
+ <KEYWORD3>keep</KEYWORD3>
+ <KEYWORD3>dele</KEYWORD3>
+
+ <!-- FELIST command -->
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- FILL command -->
+ <KEYWORD3>p</KEYWORD3>
+
+ <!-- FLDATA1 command -->
+ <KEYWORD3>solu</KEYWORD3>
+ <KEYWORD3>flow</KEYWORD3>
+ <KEYWORD3>turb</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>comp</KEYWORD3>
+ <KEYWORD3>swrl</KEYWORD3>
+ <KEYWORD3>tran</KEYWORD3>
+ <KEYWORD3>spec</KEYWORD3>
+ <KEYWORD3>true</KEYWORD3>
+ <KEYWORD3>t</KEYWORD3>
+ <KEYWORD3>false</KEYWORD3>
+ <KEYWORD3>,f</KEYWORD3>
+
+ <!-- FLDATA2 command -->
+ <KEYWORD3>iter</KEYWORD3>
+ <KEYWORD3>exec</KEYWORD3>
+ <KEYWORD3>appe</KEYWORD3>
+ <KEYWORD3>over</KEYWORD3>
+
+ <!-- FLDATA3 command -->
+ <KEYWORD3>term</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>vx</KEYWORD3>
+ <KEYWORD3>vy</KEYWORD3>
+ <KEYWORD3>vz</KEYWORD3>
+ <KEYWORD3>enke</KEYWORD3>
+ <KEYWORD3>ends</KEYWORD3>
+
+ <!-- FLDATA4 command -->
+ <KEYWORD3>time</KEYWORD3>
+ <KEYWORD3>step</KEYWORD3>
+ <KEYWORD3>istep</KEYWORD3>
+ <KEYWORD3>bc</KEYWORD3>
+ <KEYWORD3>numb</KEYWORD3>
+ <KEYWORD3>glob</KEYWORD3>
+ <KEYWORD3>tend</KEYWORD3>
+ <KEYWORD3>appe</KEYWORD3>
+ <KEYWORD3>sumf</KEYWORD3>
+ <KEYWORD3>over</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>vx</KEYWORD3>
+ <KEYWORD3>vy</KEYWORD3>
+ <KEYWORD3>vz</KEYWORD3>
+ <KEYWORD3>enke</KEYWORD3>
+ <KEYWORD3>ends</KEYWORD3>
+
+ <!-- FLDATA4A command -->
+ <KEYWORD3>step</KEYWORD3>
+ <KEYWORD3>appe</KEYWORD3>
+ <KEYWORD3>sumf</KEYWORD3>
+ <KEYWORD3>over</KEYWORD3>
+
+ <!-- FLDATA5 command -->
+ <KEYWORD3>outp</KEYWORD3>
+ <KEYWORD3>sumf</KEYWORD3>
+ <KEYWORD3>debg</KEYWORD3>
+ <KEYWORD3>resi</KEYWORD3>
+ <KEYWORD3>dens</KEYWORD3>
+ <KEYWORD3>visc</KEYWORD3>
+ <KEYWORD3>cond</KEYWORD3>
+ <KEYWORD3>evis</KEYWORD3>
+ <KEYWORD3>econ</KEYWORD3>
+ <KEYWORD3>ttot</KEYWORD3>
+ <KEYWORD3>hflu</KEYWORD3>
+ <KEYWORD3>hflm</KEYWORD3>
+ <KEYWORD3>spht</KEYWORD3>
+ <KEYWORD3>strm</KEYWORD3>
+ <KEYWORD3>mach</KEYWORD3>
+ <KEYWORD3>ptot</KEYWORD3>
+ <KEYWORD3>pcoe</KEYWORD3>
+ <KEYWORD3>yplu</KEYWORD3>
+ <KEYWORD3>tauw</KEYWORD3>
+ <KEYWORD3>lmd</KEYWORD3>
+ <KEYWORD3>emd</KEYWORD3>
+
+ <!-- FLDATA6 command -->
+ <KEYWORD3>conv</KEYWORD3>
+ <KEYWORD3>outp</KEYWORD3>
+ <KEYWORD3>iter</KEYWORD3>
+ <KEYWORD3>land</KEYWORD3>
+ <KEYWORD3>bloc</KEYWORD3>
+ <KEYWORD3>bnow</KEYWORD3>
+
+ <!-- FLDATA7 command -->
+ <KEYWORD3>prot</KEYWORD3>
+ <KEYWORD3>dens</KEYWORD3>
+ <KEYWORD3>visc</KEYWORD3>
+ <KEYWORD3>cond</KEYWORD3>
+ <KEYWORD3>spht</KEYWORD3>
+ <KEYWORD3>constant</KEYWORD3>
+ <KEYWORD3>liquid</KEYWORD3>
+ <KEYWORD3>table</KEYWORD3>
+ <KEYWORD3>powl</KEYWORD3>
+ <KEYWORD3>carr</KEYWORD3>
+ <KEYWORD3>bing</KEYWORD3>
+ <KEYWORD3>usrv</KEYWORD3>
+ <KEYWORD3>air</KEYWORD3>
+ <KEYWORD3>air_b</KEYWORD3>
+ <KEYWORD3>air-si</KEYWORD3>
+ <KEYWORD3>air-si_b</KEYWORD3>
+ <KEYWORD3>air-cm</KEYWORD3>
+ <KEYWORD3>air-cm_b</KEYWORD3>
+ <KEYWORD3>air-mm</KEYWORD3>
+ <KEYWORD3>air-mm_b</KEYWORD3>
+ <KEYWORD3>air-ft</KEYWORD3>
+ <KEYWORD3>air-ft_b</KEYWORD3>
+ <KEYWORD3>air-in</KEYWORD3>
+ <KEYWORD3>air-in_b</KEYWORD3>
+ <KEYWORD3>cmix</KEYWORD3>
+ <KEYWORD3>user</KEYWORD3>
+
+ <!-- FLDATA8 command -->
+ <KEYWORD3>nomi</KEYWORD3>
+ <KEYWORD3>dens</KEYWORD3>
+ <KEYWORD3>visc</KEYWORD3>
+ <KEYWORD3>cond</KEYWORD3>
+ <KEYWORD3>spht</KEYWORD3>
+
+ <!-- FLDATA9 command -->
+ <KEYWORD3>cof1</KEYWORD3>
+ <KEYWORD3>dens</KEYWORD3>
+ <KEYWORD3>visc</KEYWORD3>
+ <KEYWORD3>cond</KEYWORD3>
+ <KEYWORD3>spht</KEYWORD3>
+
+ <!-- FLDATA10 command -->
+ <KEYWORD3>cof2</KEYWORD3>
+ <KEYWORD3>dens</KEYWORD3>
+ <KEYWORD3>visc</KEYWORD3>
+ <KEYWORD3>cond</KEYWORD3>
+ <KEYWORD3>spht</KEYWORD3>
+
+ <!-- FLDATA11 command -->
+ <KEYWORD3>cof3</KEYWORD3>
+ <KEYWORD3>dens</KEYWORD3>
+ <KEYWORD3>visc</KEYWORD3>
+ <KEYWORD3>cond</KEYWORD3>
+ <KEYWORD3>spht</KEYWORD3>
+
+ <!-- FLDATA12 command -->
+ <KEYWORD3>prop</KEYWORD3>
+ <KEYWORD3>ivis</KEYWORD3>
+ <KEYWORD3>ufrq</KEYWORD3>
+
+ <!-- FLDATA13 command -->
+ <KEYWORD3>vary</KEYWORD3>
+ <KEYWORD3>dens</KEYWORD3>
+ <KEYWORD3>visc</KEYWORD3>
+ <KEYWORD3>cond</KEYWORD3>
+ <KEYWORD3>spht</KEYWORD3>
+ <KEYWORD3>t</KEYWORD3>
+ <KEYWORD3>,f</KEYWORD3>
+
+ <!-- FLDATA14 command -->
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>nomi</KEYWORD3>
+ <KEYWORD3>bulk</KEYWORD3>
+ <KEYWORD3>ttot</KEYWORD3>
+
+ <!-- FLDATA15 command -->
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>refe</KEYWORD3>
+
+ <!-- FLDATA16 command -->
+ <KEYWORD3>bulk</KEYWORD3>
+ <KEYWORD3>beta</KEYWORD3>
+
+ <!-- FLDATA17 command -->
+ <KEYWORD3>gamm</KEYWORD3>
+ <KEYWORD3>comp</KEYWORD3>
+
+ <!-- FLDATA18 command -->
+ <KEYWORD3>meth</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>vx</KEYWORD3>
+ <KEYWORD3>vy</KEYWORD3>
+ <KEYWORD3>vz</KEYWORD3>
+ <KEYWORD3>enke</KEYWORD3>
+ <KEYWORD3>ends</KEYWORD3>
+
+ <!-- FLDATA19 command -->
+ <KEYWORD3>tdma</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>vx</KEYWORD3>
+ <KEYWORD3>vy</KEYWORD3>
+ <KEYWORD3>vz</KEYWORD3>
+ <KEYWORD3>enke</KEYWORD3>
+ <KEYWORD3>ends</KEYWORD3>
+
+ <!-- FLDATA20 command -->
+ <KEYWORD3>srch</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>vx</KEYWORD3>
+ <KEYWORD3>vy</KEYWORD3>
+ <KEYWORD3>vz</KEYWORD3>
+ <KEYWORD3>enke</KEYWORD3>
+ <KEYWORD3>ends</KEYWORD3>
+
+ <!-- FLDATA20A command -->
+ <KEYWORD3>pgmr</KEYWORD3>
+ <KEYWORD3>fill</KEYWORD3>
+ <KEYWORD3>modp</KEYWORD3>
+
+ <!-- FLDATA21 command -->
+ <KEYWORD3>conv</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>vx</KEYWORD3>
+ <KEYWORD3>vy</KEYWORD3>
+ <KEYWORD3>vz</KEYWORD3>
+ <KEYWORD3>enke</KEYWORD3>
+ <KEYWORD3>ends</KEYWORD3>
+
+ <!-- FLDATA22 command -->
+ <KEYWORD3>maxi</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>vx</KEYWORD3>
+ <KEYWORD3>vy</KEYWORD3>
+ <KEYWORD3>vz</KEYWORD3>
+ <KEYWORD3>enke</KEYWORD3>
+ <KEYWORD3>ends</KEYWORD3>
+
+ <!-- FLDATA23 command -->
+ <KEYWORD3>delt</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>vx</KEYWORD3>
+ <KEYWORD3>vy</KEYWORD3>
+ <KEYWORD3>vz</KEYWORD3>
+ <KEYWORD3>enke</KEYWORD3>
+ <KEYWORD3>ends</KEYWORD3>
+
+ <!-- FLDATA24 command -->
+ <KEYWORD3>turb</KEYWORD3>
+ <KEYWORD3>modl</KEYWORD3>
+ <KEYWORD3>rati</KEYWORD3>
+ <KEYWORD3>inin</KEYWORD3>
+ <KEYWORD3>insf</KEYWORD3>
+ <KEYWORD3>sctk</KEYWORD3>
+ <KEYWORD3>sctd</KEYWORD3>
+ <KEYWORD3>cmu</KEYWORD3>
+ <KEYWORD3>c1</KEYWORD3>
+ <KEYWORD3>c2</KEYWORD3>
+ <KEYWORD3>buc3</KEYWORD3>
+ <KEYWORD3>buc4</KEYWORD3>
+ <KEYWORD3>beta</KEYWORD3>
+ <KEYWORD3>kapp</KEYWORD3>
+ <KEYWORD3>ewll</KEYWORD3>
+ <KEYWORD3>wall</KEYWORD3>
+ <KEYWORD3>vand</KEYWORD3>
+ <KEYWORD3>tran</KEYWORD3>
+ <KEYWORD3>zels</KEYWORD3>
+
+ <!-- FLDATA24A command -->
+ <KEYWORD3>rngt</KEYWORD3>
+ <KEYWORD3>sctk</KEYWORD3>
+ <KEYWORD3>sctd</KEYWORD3>
+ <KEYWORD3>cmu</KEYWORD3>
+ <KEYWORD3>c1</KEYWORD3>
+ <KEYWORD3>c2</KEYWORD3>
+ <KEYWORD3>beta</KEYWORD3>
+ <KEYWORD3>etai</KEYWORD3>
+
+ <!-- FLDATA24B command -->
+ <KEYWORD3>nket</KEYWORD3>
+ <KEYWORD3>sctk</KEYWORD3>
+ <KEYWORD3>sctd</KEYWORD3>
+ <KEYWORD3>c2</KEYWORD3>
+ <KEYWORD3>c1mx</KEYWORD3>
+
+ <!-- FLDATA24C command -->
+ <KEYWORD3>girt</KEYWORD3>
+ <KEYWORD3>sctk</KEYWORD3>
+ <KEYWORD3>sctd</KEYWORD3>
+ <KEYWORD3>g0</KEYWORD3>
+ <KEYWORD3>g1</KEYWORD3>
+ <KEYWORD3>g2</KEYWORD3>
+ <KEYWORD3>g3</KEYWORD3>
+ <KEYWORD3>g4</KEYWORD3>
+
+ <!-- FLDATA24D command -->
+ <KEYWORD3>szlt</KEYWORD3>
+ <KEYWORD3>sctk</KEYWORD3>
+ <KEYWORD3>sctd</KEYWORD3>
+ <KEYWORD3>szl1</KEYWORD3>
+ <KEYWORD3>szl2</KEYWORD3>
+ <KEYWORD3>szl3</KEYWORD3>
+
+ <!-- FLDATA25 command -->
+ <KEYWORD3>relx</KEYWORD3>
+ <KEYWORD3>vx</KEYWORD3>
+ <KEYWORD3>vy</KEYWORD3>
+ <KEYWORD3>vz</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>enke</KEYWORD3>
+ <KEYWORD3>ends</KEYWORD3>
+ <KEYWORD3>evis</KEYWORD3>
+ <KEYWORD3>econ</KEYWORD3>
+ <KEYWORD3>dens</KEYWORD3>
+ <KEYWORD3>visc</KEYWORD3>
+ <KEYWORD3>cond</KEYWORD3>
+ <KEYWORD3>spht</KEYWORD3>
+
+ <!-- FLDATA26 command -->
+ <KEYWORD3>stab</KEYWORD3>
+ <KEYWORD3>turb</KEYWORD3>
+ <KEYWORD3>mome</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>visc</KEYWORD3>
+
+ <!-- FLDATA27 command -->
+ <KEYWORD3>prin</KEYWORD3>
+ <KEYWORD3>vx</KEYWORD3>
+ <KEYWORD3>vy</KEYWORD3>
+ <KEYWORD3>vz</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>enke</KEYWORD3>
+ <KEYWORD3>ends</KEYWORD3>
+ <KEYWORD3>dens</KEYWORD3>
+ <KEYWORD3>visc</KEYWORD3>
+ <KEYWORD3>cond</KEYWORD3>
+ <KEYWORD3>spht</KEYWORD3>
+ <KEYWORD3>evis</KEYWORD3>
+ <KEYWORD3>econ</KEYWORD3>
+
+ <!-- FLDATA28 command -->
+ <KEYWORD3>modr</KEYWORD3>
+ <KEYWORD3>vx</KEYWORD3>
+ <KEYWORD3>vy</KEYWORD3>
+ <KEYWORD3>vz</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>enke</KEYWORD3>
+ <KEYWORD3>ends</KEYWORD3>
+ <KEYWORD3>dens</KEYWORD3>
+ <KEYWORD3>visc</KEYWORD3>
+ <KEYWORD3>cond</KEYWORD3>
+ <KEYWORD3>spht</KEYWORD3>
+ <KEYWORD3>evis</KEYWORD3>
+ <KEYWORD3>econ</KEYWORD3>
+ <KEYWORD3>ttot</KEYWORD3>
+ <KEYWORD3>t</KEYWORD3>
+ <KEYWORD3>,f</KEYWORD3>
+
+ <!-- FLDATA29 command -->
+ <KEYWORD3>modv</KEYWORD3>
+ <KEYWORD3>vx</KEYWORD3>
+ <KEYWORD3>vy</KEYWORD3>
+ <KEYWORD3>vz</KEYWORD3>
+ <KEYWORD3>sp01</KEYWORD3>
+ <KEYWORD3>sp02</KEYWORD3>
+ <KEYWORD3>sp03</KEYWORD3>
+ <KEYWORD3>sp04</KEYWORD3>
+ <KEYWORD3>sp05</KEYWORD3>
+ <KEYWORD3>sp06</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>enke</KEYWORD3>
+ <KEYWORD3>ends</KEYWORD3>
+ <KEYWORD3>dens</KEYWORD3>
+ <KEYWORD3>visc</KEYWORD3>
+ <KEYWORD3>cond</KEYWORD3>
+ <KEYWORD3>spht</KEYWORD3>
+ <KEYWORD3>evis</KEYWORD3>
+ <KEYWORD3>econ</KEYWORD3>
+ <KEYWORD3>ttot</KEYWORD3>
+ <KEYWORD3>lmd</KEYWORD3>
+ <KEYWORD3>emd</KEYWORD3>
+
+ <!-- FLDATA30 command -->
+ <KEYWORD3>quad</KEYWORD3>
+ <KEYWORD3>momd</KEYWORD3>
+ <KEYWORD3>moms</KEYWORD3>
+ <KEYWORD3>prsd</KEYWORD3>
+ <KEYWORD3>prss</KEYWORD3>
+ <KEYWORD3>thrd</KEYWORD3>
+ <KEYWORD3>thrs</KEYWORD3>
+ <KEYWORD3>trbd</KEYWORD3>
+ <KEYWORD3>trbs</KEYWORD3>
+
+ <!-- FLDATA31 command -->
+ <KEYWORD3>capp</KEYWORD3>
+ <KEYWORD3>velo</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>umin</KEYWORD3>
+ <KEYWORD3>umax</KEYWORD3>
+ <KEYWORD3>vmin</KEYWORD3>
+ <KEYWORD3>vmax</KEYWORD3>
+ <KEYWORD3>wmin</KEYWORD3>
+ <KEYWORD3>wmax</KEYWORD3>
+ <KEYWORD3>tmin</KEYWORD3>
+ <KEYWORD3>tmax</KEYWORD3>
+ <KEYWORD3>pmin</KEYWORD3>
+ <KEYWORD3>pmax</KEYWORD3>
+
+ <!-- FLDATA32 command -->
+ <KEYWORD3>rest</KEYWORD3>
+ <KEYWORD3>nset</KEYWORD3>
+ <KEYWORD3>iter</KEYWORD3>
+ <KEYWORD3>lstp</KEYWORD3>
+ <KEYWORD3>time</KEYWORD3>
+ <KEYWORD3>rfil</KEYWORD3>
+ <KEYWORD3>wfil</KEYWORD3>
+ <KEYWORD3>over</KEYWORD3>
+ <KEYWORD3>clear</KEYWORD3>
+
+ <!-- FLDATA33 command -->
+ <KEYWORD3>advm</KEYWORD3>
+ <KEYWORD3>mome</KEYWORD3>
+ <KEYWORD3>turb</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>msu</KEYWORD3>
+ <KEYWORD3>supg</KEYWORD3>
+
+ <!-- FLIST command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+
+ <!-- FLLIST command -->
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- FLST command -->
+ <KEYWORD3>noor</KEYWORD3>
+ <KEYWORD3>order</KEYWORD3>
+
+ <!-- /FOCUS command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>auto</KEYWORD3>
+ <KEYWORD3>user</KEYWORD3>
+
+ <!-- FORCE command -->
+ <KEYWORD3>total</KEYWORD3>
+ <KEYWORD3>static</KEYWORD3>
+ <KEYWORD3>damp</KEYWORD3>
+ <KEYWORD3>inert</KEYWORD3>
+
+ <!-- FORM command -->
+ <KEYWORD3>reco</KEYWORD3>
+ <KEYWORD3>ten</KEYWORD3>
+ <KEYWORD3>long</KEYWORD3>
+
+ <!-- /FORMAT command -->
+ <KEYWORD3>g</KEYWORD3>
+ <KEYWORD3>,f</KEYWORD3>
+ <KEYWORD3>e</KEYWORD3>
+
+ <!-- FP command -->
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- FSLIST command -->
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- FSUM command -->
+ <KEYWORD3>rsys</KEYWORD3>
+
+ <!-- /FTYPE command -->
+ <KEYWORD3>emat</KEYWORD3>
+ <KEYWORD3>esav</KEYWORD3>
+ <KEYWORD3>full</KEYWORD3>
+ <KEYWORD3>redm</KEYWORD3>
+ <KEYWORD3>sub</KEYWORD3>
+ <KEYWORD3>mode</KEYWORD3>
+ <KEYWORD3>tri</KEYWORD3>
+ <KEYWORD3>dsub</KEYWORD3>
+ <KEYWORD3>usub</KEYWORD3>
+ <KEYWORD3>erot</KEYWORD3>
+ <KEYWORD3>osav</KEYWORD3>
+ <KEYWORD3>seld</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>ext</KEYWORD3>
+ <KEYWORD3>int</KEYWORD3>
+
+ <!-- GAPLIST command -->
+ <KEYWORD3>open</KEYWORD3>
+ <KEYWORD3>closed</KEYWORD3>
+
+ <!-- GAPMERGE command -->
+ <KEYWORD3>toler</KEYWORD3>
+ <KEYWORD3>iter</KEYWORD3>
+
+ <!-- GAPOPT command -->
+ <KEYWORD3>toler</KEYWORD3>
+ <KEYWORD3>oesele</KEYWORD3>
+ <KEYWORD3>merge</KEYWORD3>
+ <KEYWORD3>remain</KEYWORD3>
+
+ <!-- GAPPLOT command -->
+ <KEYWORD3>open</KEYWORD3>
+ <KEYWORD3>closed</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- GAUGE command -->
+ <KEYWORD3>tree</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+
+ <!-- GCGEN command -->
+ <KEYWORD3>tri</KEYWORD3>
+ <KEYWORD3>bot</KEYWORD3>
+
+ <!-- /GCMD command -->
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- *GET command -->
+ <KEYWORD3>active</KEYWORD3>
+ <KEYWORD3>int</KEYWORD3>
+ <KEYWORD3>imme</KEYWORD3>
+ <KEYWORD3>menu</KEYWORD3>
+ <KEYWORD3>prkey</KEYWORD3>
+ <KEYWORD3>units</KEYWORD3>
+ <KEYWORD3>rout</KEYWORD3>
+ <KEYWORD3>time</KEYWORD3>
+ <KEYWORD3>wall</KEYWORD3>
+ <KEYWORD3>cpu</KEYWORD3>
+ <KEYWORD3>dbase</KEYWORD3>
+ <KEYWORD3>ldate</KEYWORD3>
+ <KEYWORD3>dbase</KEYWORD3>
+ <KEYWORD3>ltime</KEYWORD3>
+ <KEYWORD3>rev</KEYWORD3>
+ <KEYWORD3>title</KEYWORD3>
+ <KEYWORD3>jobnam</KEYWORD3>
+
+ <KEYWORD3>parm</KEYWORD3>
+ <KEYWORD3>max</KEYWORD3>
+ <KEYWORD3>basic</KEYWORD3>
+ <KEYWORD3>loc</KEYWORD3>
+ <KEYWORD3>,type</KEYWORD3>
+ <KEYWORD3>dim</KEYWORD3>
+ <KEYWORD3>x</KEYWORD3>
+ <KEYWORD3>y</KEYWORD3>
+ <KEYWORD3>z</KEYWORD3>
+
+ <KEYWORD3>cmd</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+ <KEYWORD3>nargs</KEYWORD3>
+ <KEYWORD3>field</KEYWORD3>
+
+ <KEYWORD3>comp</KEYWORD3>
+ <KEYWORD3>ncomp</KEYWORD3>
+ <KEYWORD3>name</KEYWORD3>
+ <KEYWORD3>,type</KEYWORD3>
+ <KEYWORD3>nscomp</KEYWORD3>
+ <KEYWORD3>sname</KEYWORD3>
+
+ <KEYWORD3>graph</KEYWORD3>
+ <KEYWORD3>active</KEYWORD3>
+ <KEYWORD3>angle</KEYWORD3>
+ <KEYWORD3>contour</KEYWORD3>
+ <KEYWORD3>dist</KEYWORD3>
+ <KEYWORD3>dscale</KEYWORD3>
+ <KEYWORD3>dmult</KEYWORD3>
+ <KEYWORD3>edge</KEYWORD3>
+ <KEYWORD3>focus</KEYWORD3>
+ <KEYWORD3>gline</KEYWORD3>
+ <KEYWORD3>mode</KEYWORD3>
+ <KEYWORD3>normal</KEYWORD3>
+ <KEYWORD3>range</KEYWORD3>
+ <KEYWORD3>xmin</KEYWORD3>
+ <KEYWORD3>ymin</KEYWORD3>
+ <KEYWORD3>xmax</KEYWORD3>
+ <KEYWORD3>ymax</KEYWORD3>
+ <KEYWORD3>ratio</KEYWORD3>
+ <KEYWORD3>sscale</KEYWORD3>
+ <KEYWORD3>smult</KEYWORD3>
+ <KEYWORD3>,type</KEYWORD3>
+ <KEYWORD3>vcone</KEYWORD3>
+ <KEYWORD3>view</KEYWORD3>
+ <KEYWORD3>vscale</KEYWORD3>
+ <KEYWORD3>vratio</KEYWORD3>
+ <KEYWORD3>display</KEYWORD3>
+ <KEYWORD3>erase</KEYWORD3>
+ <KEYWORD3>ndist</KEYWORD3>
+ <KEYWORD3>number</KEYWORD3>
+ <KEYWORD3>plopts</KEYWORD3>
+ <KEYWORD3>seg</KEYWORD3>
+ <KEYWORD3>shrink</KEYWORD3>
+
+ <KEYWORD3>active</KEYWORD3>
+ <KEYWORD3>,csys</KEYWORD3>
+ <KEYWORD3>,dsys</KEYWORD3>
+ <KEYWORD3>,mat</KEYWORD3>
+ <KEYWORD3>,type</KEYWORD3>
+ <KEYWORD3>,real</KEYWORD3>
+ <KEYWORD3>,esys</KEYWORD3>
+ <KEYWORD3>,cp</KEYWORD3>
+ <KEYWORD3>,ce</KEYWORD3>
+ <KEYWORD3>wfront</KEYWORD3>
+ <KEYWORD3>max</KEYWORD3>
+ <KEYWORD3>rms</KEYWORD3>
+
+ <KEYWORD3>cdsy</KEYWORD3>
+ <KEYWORD3>loc</KEYWORD3>
+ <KEYWORD3>ang</KEYWORD3>
+ <KEYWORD3>xy</KEYWORD3>
+ <KEYWORD3>yz</KEYWORD3>
+ <KEYWORD3>zx</KEYWORD3>
+ <KEYWORD3>attr</KEYWORD3>
+
+ <KEYWORD3>node</KEYWORD3>
+ <KEYWORD3>loc</KEYWORD3>
+ <KEYWORD3>,nsel</KEYWORD3>
+ <KEYWORD3>nxth</KEYWORD3>
+ <KEYWORD3>nxtl</KEYWORD3>
+ <KEYWORD3>,f</KEYWORD3>
+ <KEYWORD3>fx</KEYWORD3>
+ <KEYWORD3>mx</KEYWORD3>
+ <KEYWORD3>csgx</KEYWORD3>
+ <KEYWORD3>,d</KEYWORD3>
+ <KEYWORD3>ux</KEYWORD3>
+ <KEYWORD3>rotx</KEYWORD3>
+ <KEYWORD3>vx</KEYWORD3>
+ <KEYWORD3>ax</KEYWORD3>
+ <KEYWORD3>hgen</KEYWORD3>
+ <KEYWORD3>num</KEYWORD3>
+ <KEYWORD3>max</KEYWORD3>
+ <KEYWORD3>min</KEYWORD3>
+ <KEYWORD3>count</KEYWORD3>
+ <KEYWORD3>mxloc</KEYWORD3>
+ <KEYWORD3>mnloc</KEYWORD3>
+
+ <KEYWORD3>elem</KEYWORD3>
+ <KEYWORD3>cent</KEYWORD3>
+ <KEYWORD3>adj</KEYWORD3>
+ <KEYWORD3>attr</KEYWORD3>
+ <KEYWORD3>leng</KEYWORD3>
+ <KEYWORD3>lproj</KEYWORD3>
+ <KEYWORD3>area</KEYWORD3>
+ <KEYWORD3>aproj</KEYWORD3>
+ <KEYWORD3>volu</KEYWORD3>
+ <KEYWORD3>,esel</KEYWORD3>
+ <KEYWORD3>nxth</KEYWORD3>
+ <KEYWORD3>nxtl</KEYWORD3>
+ <KEYWORD3>hgen</KEYWORD3>
+ <KEYWORD3>hcoe</KEYWORD3>
+ <KEYWORD3>tbulk</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>shpar</KEYWORD3>
+ <KEYWORD3>angd</KEYWORD3>
+ <KEYWORD3>aspe</KEYWORD3>
+ <KEYWORD3>jacr</KEYWORD3>
+ <KEYWORD3>maxa</KEYWORD3>
+ <KEYWORD3>para</KEYWORD3>
+ <KEYWORD3>warp</KEYWORD3>
+ <KEYWORD3>num</KEYWORD3>
+ <KEYWORD3>,ksel</KEYWORD3>
+ <KEYWORD3>nxth</KEYWORD3>
+ <KEYWORD3>nxtl</KEYWORD3>
+ <KEYWORD3>div</KEYWORD3>
+
+ <KEYWORD3>kp</KEYWORD3>
+ <KEYWORD3>ior</KEYWORD3>
+ <KEYWORD3>imc</KEYWORD3>
+ <KEYWORD3>irp</KEYWORD3>
+ <KEYWORD3>ixv</KEYWORD3>
+ <KEYWORD3>iyv</KEYWORD3>
+ <KEYWORD3>izv</KEYWORD3>
+ <KEYWORD3>nrelm</KEYWORD3>
+
+ <KEYWORD3>line</KEYWORD3>
+ <KEYWORD3>,lsel</KEYWORD3>
+
+ <KEYWORD3>area</KEYWORD3>
+ <KEYWORD3>,asel</KEYWORD3>
+ <KEYWORD3>loop</KEYWORD3>
+
+ <KEYWORD3>volu</KEYWORD3>
+ <KEYWORD3>,vsel</KEYWORD3>
+ <KEYWORD3>shell</KEYWORD3>
+
+ <KEYWORD3>etyp</KEYWORD3>
+
+ <KEYWORD3>rcon</KEYWORD3>
+
+ <KEYWORD3>ex</KEYWORD3>
+ <KEYWORD3>alpx</KEYWORD3>
+ <KEYWORD3>reft</KEYWORD3>
+ <KEYWORD3>prxy</KEYWORD3>
+ <KEYWORD3>nuxy</KEYWORD3>
+ <KEYWORD3>gxy</KEYWORD3>
+ <KEYWORD3>damp</KEYWORD3>
+ <KEYWORD3>mu</KEYWORD3>
+ <KEYWORD3>dnes</KEYWORD3>
+ <KEYWORD3>c</KEYWORD3>
+ <KEYWORD3>enth</KEYWORD3>
+ <KEYWORD3>kxx</KEYWORD3>
+ <KEYWORD3>hf</KEYWORD3>
+ <KEYWORD3>emis</KEYWORD3>
+ <KEYWORD3>qrate</KEYWORD3>
+ <KEYWORD3>visc</KEYWORD3>
+ <KEYWORD3>sonc</KEYWORD3>
+ <KEYWORD3>rsvx</KEYWORD3>
+ <KEYWORD3>perx</KEYWORD3>
+ <KEYWORD3>murx</KEYWORD3>
+ <KEYWORD3>mgxx</KEYWORD3>
+ <KEYWORD3>lsst</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+
+ <KEYWORD3>fldata</KEYWORD3>
+ <KEYWORD3>flow</KEYWORD3>
+ <KEYWORD3>turb</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>comp</KEYWORD3>
+ <KEYWORD3>swrl</KEYWORD3>
+ <KEYWORD3>tran</KEYWORD3>
+ <KEYWORD3>spec</KEYWORD3>
+ <KEYWORD3>exec</KEYWORD3>
+ <KEYWORD3>appe</KEYWORD3>
+ <KEYWORD3>over</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>vx</KEYWORD3>
+ <KEYWORD3>vy</KEYWORD3>
+ <KEYWORD3>vz</KEYWORD3>
+ <KEYWORD3>enke</KEYWORD3>
+ <KEYWORD3>ends</KEYWORD3>
+ <KEYWORD3>step</KEYWORD3>
+ <KEYWORD3>istep</KEYWORD3>
+ <KEYWORD3>bc</KEYWORD3>
+ <KEYWORD3>numb</KEYWORD3>
+ <KEYWORD3>glob</KEYWORD3>
+ <KEYWORD3>tend</KEYWORD3>
+ <KEYWORD3>appe</KEYWORD3>
+ <KEYWORD3>sumf</KEYWORD3>
+ <KEYWORD3>over</KEYWORD3>
+ <KEYWORD3>sumf</KEYWORD3>
+ <KEYWORD3>debg</KEYWORD3>
+ <KEYWORD3>resi</KEYWORD3>
+ <KEYWORD3>dens</KEYWORD3>
+ <KEYWORD3>visc</KEYWORD3>
+ <KEYWORD3>cond</KEYWORD3>
+ <KEYWORD3>evis</KEYWORD3>
+ <KEYWORD3>econ</KEYWORD3>
+ <KEYWORD3>ttot</KEYWORD3>
+ <KEYWORD3>hflu</KEYWORD3>
+ <KEYWORD3>hflm</KEYWORD3>
+ <KEYWORD3>spht</KEYWORD3>
+ <KEYWORD3>strm</KEYWORD3>
+ <KEYWORD3>mach</KEYWORD3>
+ <KEYWORD3>ptot</KEYWORD3>
+ <KEYWORD3>pcoe</KEYWORD3>
+ <KEYWORD3>yplu</KEYWORD3>
+ <KEYWORD3>tauw</KEYWORD3>
+ <KEYWORD3>lmd</KEYWORD3>
+ <KEYWORD3>emd</KEYWORD3>
+ <KEYWORD3>outp</KEYWORD3>
+ <KEYWORD3>iter</KEYWORD3>
+ <KEYWORD3>dens</KEYWORD3>
+ <KEYWORD3>visc</KEYWORD3>
+ <KEYWORD3>cond</KEYWORD3>
+ <KEYWORD3>ivis</KEYWORD3>
+ <KEYWORD3>ufrq</KEYWORD3>
+ <KEYWORD3>nomi</KEYWORD3>
+ <KEYWORD3>bulk</KEYWORD3>
+ <KEYWORD3>ttot</KEYWORD3>
+ <KEYWORD3>refe</KEYWORD3>
+ <KEYWORD3>beta</KEYWORD3>
+ <KEYWORD3>comp</KEYWORD3>
+ <KEYWORD3>fill</KEYWORD3>
+ <KEYWORD3>modp</KEYWORD3>
+ <KEYWORD3>modl</KEYWORD3>
+ <KEYWORD3>rati</KEYWORD3>
+ <KEYWORD3>inin</KEYWORD3>
+ <KEYWORD3>insf</KEYWORD3>
+ <KEYWORD3>sctk</KEYWORD3>
+ <KEYWORD3>sctd</KEYWORD3>
+ <KEYWORD3>cmu</KEYWORD3>
+ <KEYWORD3>c1</KEYWORD3>
+ <KEYWORD3>c2</KEYWORD3>
+ <KEYWORD3>buc3</KEYWORD3>
+ <KEYWORD3>buc4</KEYWORD3>
+ <KEYWORD3>beta</KEYWORD3>
+ <KEYWORD3>kapp</KEYWORD3>
+ <KEYWORD3>ewll</KEYWORD3>
+ <KEYWORD3>wall</KEYWORD3>
+ <KEYWORD3>vand</KEYWORD3>
+ <KEYWORD3>tran</KEYWORD3>
+ <KEYWORD3>zels</KEYWORD3>
+ <KEYWORD3>sctk</KEYWORD3>
+ <KEYWORD3>sctd</KEYWORD3>
+ <KEYWORD3>cmu</KEYWORD3>
+ <KEYWORD3>c1</KEYWORD3>
+ <KEYWORD3>c2</KEYWORD3>
+ <KEYWORD3>etai</KEYWORD3>
+ <KEYWORD3>c1mx</KEYWORD3>
+ <KEYWORD3>g0</KEYWORD3>
+ <KEYWORD3>g1</KEYWORD3>
+ <KEYWORD3>g2</KEYWORD3>
+ <KEYWORD3>g3</KEYWORD3>
+ <KEYWORD3>g4</KEYWORD3>
+ <KEYWORD3>szl1</KEYWORD3>
+ <KEYWORD3>szl2</KEYWORD3>
+ <KEYWORD3>szl3</KEYWORD3>
+ <KEYWORD3>evis</KEYWORD3>
+ <KEYWORD3>econ</KEYWORD3>
+ <KEYWORD3>mome</KEYWORD3>
+ <KEYWORD3>sp01</KEYWORD3>
+ <KEYWORD3>sp02</KEYWORD3>
+ <KEYWORD3>sp03</KEYWORD3>
+ <KEYWORD3>sp04</KEYWORD3>
+ <KEYWORD3>sp05</KEYWORD3>
+ <KEYWORD3>sp06</KEYWORD3>
+ <KEYWORD3>momd</KEYWORD3>
+ <KEYWORD3>moms</KEYWORD3>
+ <KEYWORD3>prsd</KEYWORD3>
+ <KEYWORD3>prss</KEYWORD3>
+ <KEYWORD3>thrd</KEYWORD3>
+ <KEYWORD3>thrs</KEYWORD3>
+ <KEYWORD3>trbd</KEYWORD3>
+ <KEYWORD3>trbs</KEYWORD3>
+ <KEYWORD3>velo</KEYWORD3>
+ <KEYWORD3>umin</KEYWORD3>
+ <KEYWORD3>umax</KEYWORD3>
+ <KEYWORD3>vmin</KEYWORD3>
+ <KEYWORD3>vmax</KEYWORD3>
+ <KEYWORD3>wmin</KEYWORD3>
+ <KEYWORD3>wmax</KEYWORD3>
+ <KEYWORD3>tmin</KEYWORD3>
+ <KEYWORD3>tmax</KEYWORD3>
+ <KEYWORD3>pmin</KEYWORD3>
+ <KEYWORD3>pmax</KEYWORD3>
+ <KEYWORD3>nset</KEYWORD3>
+ <KEYWORD3>iter</KEYWORD3>
+ <KEYWORD3>lstp</KEYWORD3>
+ <KEYWORD3>time</KEYWORD3>
+ <KEYWORD3>rfil</KEYWORD3>
+ <KEYWORD3>wfil</KEYWORD3>
+ <KEYWORD3>over</KEYWORD3>
+ <KEYWORD3>clear</KEYWORD3>
+
+ <KEYWORD3>msdata</KEYWORD3>
+ <KEYWORD3>spec</KEYWORD3>
+ <KEYWORD3>ugas</KEYWORD3>
+
+ <KEYWORD3>msprop</KEYWORD3>
+ <KEYWORD3>cond</KEYWORD3>
+ <KEYWORD3>mdif</KEYWORD3>
+ <KEYWORD3>spht</KEYWORD3>
+ <KEYWORD3>nomi</KEYWORD3>
+ <KEYWORD3>cof1</KEYWORD3>
+ <KEYWORD3>cof2</KEYWORD3>
+ <KEYWORD3>cof3</KEYWORD3>
+
+ <KEYWORD3>msspec</KEYWORD3>
+ <KEYWORD3>name</KEYWORD3>
+ <KEYWORD3>molw</KEYWORD3>
+ <KEYWORD3>schm</KEYWORD3>
+
+ <KEYWORD3>msrelax</KEYWORD3>
+ <KEYWORD3>conc</KEYWORD3>
+ <KEYWORD3>emdi</KEYWORD3>
+ <KEYWORD3>stab</KEYWORD3>
+
+ <KEYWORD3>mssolu</KEYWORD3>
+ <KEYWORD3>nswe</KEYWORD3>
+ <KEYWORD3>maxi</KEYWORD3>
+ <KEYWORD3>nsrc</KEYWORD3>
+ <KEYWORD3>conv</KEYWORD3>
+ <KEYWORD3>delt</KEYWORD3>
+
+ <KEYWORD3>msmeth</KEYWORD3>
+
+ <KEYWORD3>mscap</KEYWORD3>
+ <KEYWORD3>key</KEYWORD3>
+ <KEYWORD3>upp</KEYWORD3>
+ <KEYWORD3>low</KEYWORD3>
+
+ <KEYWORD3>msvary</KEYWORD3>
+
+ <KEYWORD3>msnomf</KEYWORD3>
+
+ <KEYWORD3>active</KEYWORD3>
+ <KEYWORD3>anty</KEYWORD3>
+ <KEYWORD3>solu</KEYWORD3>
+ <KEYWORD3>dtime</KEYWORD3>
+ <KEYWORD3>ncmls</KEYWORD3>
+ <KEYWORD3>ncmss</KEYWORD3>
+ <KEYWORD3>eqit</KEYWORD3>
+ <KEYWORD3>ncmit</KEYWORD3>
+ <KEYWORD3>cnvg</KEYWORD3>
+ <KEYWORD3>mxdvl</KEYWORD3>
+ <KEYWORD3>resfrq</KEYWORD3>
+ <KEYWORD3>reseig</KEYWORD3>
+ <KEYWORD3>dsprm</KEYWORD3>
+ <KEYWORD3>focv</KEYWORD3>
+ <KEYWORD3>mocv</KEYWORD3>
+ <KEYWORD3>hfcv</KEYWORD3>
+ <KEYWORD3>mfcv</KEYWORD3>
+ <KEYWORD3>cscv</KEYWORD3>
+ <KEYWORD3>cucv</KEYWORD3>
+ <KEYWORD3>ffcv</KEYWORD3>
+ <KEYWORD3>dicv</KEYWORD3>
+ <KEYWORD3>rocv</KEYWORD3>
+ <KEYWORD3>tecv</KEYWORD3>
+ <KEYWORD3>vmcv</KEYWORD3>
+ <KEYWORD3>smcv</KEYWORD3>
+ <KEYWORD3>vocv</KEYWORD3>
+ <KEYWORD3>prcv</KEYWORD3>
+ <KEYWORD3>vecv</KEYWORD3>
+ <KEYWORD3>nc48</KEYWORD3>
+ <KEYWORD3>nc49</KEYWORD3>
+ <KEYWORD3>crprat</KEYWORD3>
+ <KEYWORD3>psinc</KEYWORD3>
+
+ <KEYWORD3>elem</KEYWORD3>
+ <KEYWORD3>mtot</KEYWORD3>
+ <KEYWORD3>mc</KEYWORD3>
+ <KEYWORD3>ior</KEYWORD3>
+ <KEYWORD3>imc</KEYWORD3>
+ <KEYWORD3>fmc</KEYWORD3>
+ <KEYWORD3>mmor</KEYWORD3>
+ <KEYWORD3>mmmc</KEYWORD3>
+
+ <KEYWORD3>mode</KEYWORD3>
+ <KEYWORD3>freq</KEYWORD3>
+ <KEYWORD3>pfact</KEYWORD3>
+ <KEYWORD3>mcoef</KEYWORD3>
+ <KEYWORD3>damp</KEYWORD3>
+
+ <KEYWORD3>active</KEYWORD3>
+ <KEYWORD3>,set</KEYWORD3>
+ <KEYWORD3>lstp</KEYWORD3>
+ <KEYWORD3>sbst</KEYWORD3>
+ <KEYWORD3>time</KEYWORD3>
+ <KEYWORD3>rsys</KEYWORD3>
+
+ <KEYWORD3>node</KEYWORD3>
+ <KEYWORD3>u</KEYWORD3>
+ <KEYWORD3>sum</KEYWORD3>
+ <KEYWORD3>rot</KEYWORD3>
+ <KEYWORD3>ntemp</KEYWORD3>
+ <KEYWORD3>volt</KEYWORD3>
+ <KEYWORD3>mag</KEYWORD3>
+ <KEYWORD3>v</KEYWORD3>
+ <KEYWORD3>,a</KEYWORD3>
+ <KEYWORD3>curr</KEYWORD3>
+ <KEYWORD3>emf</KEYWORD3>
+ <KEYWORD3>rf</KEYWORD3>
+ <KEYWORD3>fx</KEYWORD3>
+ <KEYWORD3>fy</KEYWORD3>
+ <KEYWORD3>fz</KEYWORD3>
+ <KEYWORD3>mx</KEYWORD3>
+ <KEYWORD3>my</KEYWORD3>
+ <KEYWORD3>mz</KEYWORD3>
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>int</KEYWORD3>
+ <KEYWORD3>eqv</KEYWORD3>
+ <KEYWORD3>epto</KEYWORD3>
+ <KEYWORD3>epel</KEYWORD3>
+ <KEYWORD3>eppl</KEYWORD3>
+ <KEYWORD3>epcr</KEYWORD3>
+ <KEYWORD3>epth</KEYWORD3>
+ <KEYWORD3>epsw</KEYWORD3>
+ <KEYWORD3>nl</KEYWORD3>
+ <KEYWORD3>sepl</KEYWORD3>
+ <KEYWORD3>srat</KEYWORD3>
+ <KEYWORD3>hpres</KEYWORD3>
+ <KEYWORD3>epeq</KEYWORD3>
+ <KEYWORD3>psv</KEYWORD3>
+ <KEYWORD3>plwk</KEYWORD3>
+ <KEYWORD3>tg</KEYWORD3>
+ <KEYWORD3>tf</KEYWORD3>
+ <KEYWORD3>pg</KEYWORD3>
+ <KEYWORD3>ef</KEYWORD3>
+ <KEYWORD3>,d</KEYWORD3>
+ <KEYWORD3>h</KEYWORD3>
+ <KEYWORD3>b</KEYWORD3>
+ <KEYWORD3>fmag</KEYWORD3>
+ <KEYWORD3>hs</KEYWORD3>
+ <KEYWORD3>bfe</KEYWORD3>
+ <KEYWORD3>ttot</KEYWORD3>
+ <KEYWORD3>hflu</KEYWORD3>
+ <KEYWORD3>hflm</KEYWORD3>
+ <KEYWORD3>conc</KEYWORD3>
+ <KEYWORD3>pcoe</KEYWORD3>
+ <KEYWORD3>ptot</KEYWORD3>
+ <KEYWORD3>mach</KEYWORD3>
+ <KEYWORD3>strm</KEYWORD3>
+ <KEYWORD3>evis</KEYWORD3>
+ <KEYWORD3>cmuv</KEYWORD3>
+ <KEYWORD3>econ</KEYWORD3>
+ <KEYWORD3>yplu</KEYWORD3>
+ <KEYWORD3>tauw</KEYWORD3>
+
+ <KEYWORD3>elem</KEYWORD3>
+ <KEYWORD3>serr</KEYWORD3>
+ <KEYWORD3>sdsg</KEYWORD3>
+ <KEYWORD3>terr</KEYWORD3>
+ <KEYWORD3>tdsg</KEYWORD3>
+ <KEYWORD3>sene</KEYWORD3>
+ <KEYWORD3>tene</KEYWORD3>
+ <KEYWORD3>kene</KEYWORD3>
+ <KEYWORD3>jheat</KEYWORD3>
+ <KEYWORD3>js</KEYWORD3>
+ <KEYWORD3>volu</KEYWORD3>
+ <KEYWORD3>etab</KEYWORD3>
+ <KEYWORD3>smisc</KEYWORD3>
+ <KEYWORD3>nmisc</KEYWORD3>
+
+ <KEYWORD3>etab</KEYWORD3>
+ <KEYWORD3>ncol</KEYWORD3>
+ <KEYWORD3>nleng</KEYWORD3>
+
+ <KEYWORD3>sort</KEYWORD3>
+ <KEYWORD3>max</KEYWORD3>
+ <KEYWORD3>min</KEYWORD3>
+ <KEYWORD3>imax</KEYWORD3>
+ <KEYWORD3>imin</KEYWORD3>
+
+ <KEYWORD3>ssum</KEYWORD3>
+ <KEYWORD3>item</KEYWORD3>
+
+ <KEYWORD3>fsum</KEYWORD3>
+
+ <KEYWORD3>path</KEYWORD3>
+ <KEYWORD3>last</KEYWORD3>
+ <KEYWORD3>nval</KEYWORD3>
+
+ <KEYWORD3>kcalc</KEYWORD3>
+ <KEYWORD3>k</KEYWORD3>
+
+ <KEYWORD3>intsrf</KEYWORD3>
+
+ <KEYWORD3>plnsol</KEYWORD3>
+ <KEYWORD3>bmax</KEYWORD3>
+ <KEYWORD3>bmin</KEYWORD3>
+
+ <KEYWORD3>prerr</KEYWORD3>
+ <KEYWORD3>sepc</KEYWORD3>
+ <KEYWORD3>tepc</KEYWORD3>
+ <KEYWORD3>sersm</KEYWORD3>
+ <KEYWORD3>tersm</KEYWORD3>
+ <KEYWORD3>sensm</KEYWORD3>
+ <KEYWORD3>tensm</KEYWORD3>
+
+ <KEYWORD3>section</KEYWORD3>
+ <KEYWORD3>inside</KEYWORD3>
+ <KEYWORD3>sx</KEYWORD3>
+ <KEYWORD3>sy</KEYWORD3>
+ <KEYWORD3>sz</KEYWORD3>
+ <KEYWORD3>sxxy</KEYWORD3>
+ <KEYWORD3>syz</KEYWORD3>
+ <KEYWORD3>szx</KEYWORD3>
+ <KEYWORD3>center</KEYWORD3>
+ <KEYWORD3>outside</KEYWORD3>
+
+ <KEYWORD3>vari</KEYWORD3>
+ <KEYWORD3>extrem</KEYWORD3>
+ <KEYWORD3>vmax</KEYWORD3>
+ <KEYWORD3>tmax</KEYWORD3>
+ <KEYWORD3>vmin</KEYWORD3>
+ <KEYWORD3>tmin</KEYWORD3>
+ <KEYWORD3>vlast</KEYWORD3>
+ <KEYWORD3>tlast</KEYWORD3>
+ <KEYWORD3>cvar</KEYWORD3>
+ <KEYWORD3>rtime</KEYWORD3>
+ <KEYWORD3>itime</KEYWORD3>
+ <KEYWORD3>t</KEYWORD3>
+ <KEYWORD3>rset</KEYWORD3>
+ <KEYWORD3>iset</KEYWORD3>
+ <KEYWORD3>nsets</KEYWORD3>
+
+ <KEYWORD3>opt</KEYWORD3>
+ <KEYWORD3>total</KEYWORD3>
+ <KEYWORD3>feas</KEYWORD3>
+ <KEYWORD3>term</KEYWORD3>
+ <KEYWORD3>best</KEYWORD3>
+
+ <KEYWORD3>topo</KEYWORD3>
+ <KEYWORD3>act</KEYWORD3>
+ <KEYWORD3>conv</KEYWORD3>
+ <KEYWORD3>comp</KEYWORD3>
+ <KEYWORD3>porv</KEYWORD3>
+ <KEYWORD3>loads</KEYWORD3>
+
+ <KEYWORD3>runst</KEYWORD3>
+ <KEYWORD3>rspeed</KEYWORD3>
+ <KEYWORD3>mips</KEYWORD3>
+ <KEYWORD3>smflop</KEYWORD3>
+ <KEYWORD3>vmflop</KEYWORD3>
+ <KEYWORD3>rfilsz</KEYWORD3>
+ <KEYWORD3>emat</KEYWORD3>
+ <KEYWORD3>erot</KEYWORD3>
+ <KEYWORD3>esav</KEYWORD3>
+ <KEYWORD3>full</KEYWORD3>
+ <KEYWORD3>mode</KEYWORD3>
+ <KEYWORD3>rdsp</KEYWORD3>
+ <KEYWORD3>redm</KEYWORD3>
+ <KEYWORD3>rfrq</KEYWORD3>
+ <KEYWORD3>rgeom</KEYWORD3>
+ <KEYWORD3>rst</KEYWORD3>
+ <KEYWORD3>tri</KEYWORD3>
+ <KEYWORD3>rtimst</KEYWORD3>
+ <KEYWORD3>tfirst</KEYWORD3>
+ <KEYWORD3>titer</KEYWORD3>
+ <KEYWORD3>eqprep</KEYWORD3>
+ <KEYWORD3>,solve</KEYWORD3>
+ <KEYWORD3>bsub</KEYWORD3>
+ <KEYWORD3>eigen</KEYWORD3>
+ <KEYWORD3>elform</KEYWORD3>
+ <KEYWORD3>elstrs</KEYWORD3>
+ <KEYWORD3>nelm</KEYWORD3>
+ <KEYWORD3>rmemry</KEYWORD3>
+ <KEYWORD3>wsreq</KEYWORD3>
+ <KEYWORD3>wsavail</KEYWORD3>
+ <KEYWORD3>dbpsize</KEYWORD3>
+ <KEYWORD3>dbpdisk</KEYWORD3>
+ <KEYWORD3>dbpmem</KEYWORD3>
+ <KEYWORD3>dbsize</KEYWORD3>
+ <KEYWORD3>dbmem</KEYWORD3>
+ <KEYWORD3>scrsize</KEYWORD3>
+ <KEYWORD3>scravail</KEYWORD3>
+ <KEYWORD3>iomem</KEYWORD3>
+ <KEYWORD3>iopsiz</KEYWORD3>
+ <KEYWORD3>iobuf</KEYWORD3>
+ <KEYWORD3>rwfrnt</KEYWORD3>
+ <KEYWORD3>rms</KEYWORD3>
+ <KEYWORD3>mean</KEYWORD3>
+
+ <KEYWORD3>,nsel</KEYWORD3>
+ <KEYWORD3>,esel</KEYWORD3>
+ <KEYWORD3>,ksel</KEYWORD3>
+ <KEYWORD3>,lsel</KEYWORD3>
+ <KEYWORD3>,asel</KEYWORD3>
+ <KEYWORD3>,vsel</KEYWORD3>
+ <KEYWORD3>ndnext</KEYWORD3>
+ <KEYWORD3>elnext</KEYWORD3>
+ <KEYWORD3>kpnext</KEYWORD3>
+ <KEYWORD3>lsnext</KEYWORD3>
+ <KEYWORD3>arnext</KEYWORD3>
+ <KEYWORD3>vlnext</KEYWORD3>
+ <KEYWORD3>centrx</KEYWORD3>
+ <KEYWORD3>centry</KEYWORD3>
+ <KEYWORD3>centrz</KEYWORD3>
+ <KEYWORD3>nx</KEYWORD3>
+ <KEYWORD3>ny</KEYWORD3>
+ <KEYWORD3>nz</KEYWORD3>
+ <KEYWORD3>kx</KEYWORD3>
+ <KEYWORD3>ky</KEYWORD3>
+ <KEYWORD3>kz</KEYWORD3>
+ <KEYWORD3>lx</KEYWORD3>
+ <KEYWORD3>ly</KEYWORD3>
+ <KEYWORD3>lz</KEYWORD3>
+ <KEYWORD3>lsx</KEYWORD3>
+ <KEYWORD3>lsy</KEYWORD3>
+ <KEYWORD3>lsz</KEYWORD3>
+ <KEYWORD3>node</KEYWORD3>
+ <KEYWORD3>kp</KEYWORD3>
+ <KEYWORD3>distnd</KEYWORD3>
+ <KEYWORD3>distkp</KEYWORD3>
+ <KEYWORD3>disten</KEYWORD3>
+ <KEYWORD3>anglen</KEYWORD3>
+ <KEYWORD3>anglek</KEYWORD3>
+ <KEYWORD3>nnear</KEYWORD3>
+ <KEYWORD3>knear</KEYWORD3>
+ <KEYWORD3>enearn</KEYWORD3>
+ <KEYWORD3>areand</KEYWORD3>
+ <KEYWORD3>areakp</KEYWORD3>
+ <KEYWORD3>arnode</KEYWORD3>
+ <KEYWORD3>normnx</KEYWORD3>
+ <KEYWORD3>normny</KEYWORD3>
+ <KEYWORD3>normnz</KEYWORD3>
+ <KEYWORD3>normkx</KEYWORD3>
+ <KEYWORD3>normky</KEYWORD3>
+ <KEYWORD3>normkz</KEYWORD3>
+ <KEYWORD3>enextn</KEYWORD3>
+ <KEYWORD3>nelem</KEYWORD3>
+ <KEYWORD3>eladj</KEYWORD3>
+ <KEYWORD3>ndface</KEYWORD3>
+ <KEYWORD3>nmface</KEYWORD3>
+ <KEYWORD3>arface</KEYWORD3>
+ <KEYWORD3>ux</KEYWORD3>
+ <KEYWORD3>uy</KEYWORD3>
+ <KEYWORD3>uz</KEYWORD3>
+ <KEYWORD3>rotx</KEYWORD3>
+ <KEYWORD3>roty</KEYWORD3>
+ <KEYWORD3>rotz</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>vx</KEYWORD3>
+ <KEYWORD3>vy</KEYWORD3>
+ <KEYWORD3>vz</KEYWORD3>
+ <KEYWORD3>enke</KEYWORD3>
+ <KEYWORD3>ends</KEYWORD3>
+ <KEYWORD3>volt</KEYWORD3>
+ <KEYWORD3>mag</KEYWORD3>
+ <KEYWORD3>ax</KEYWORD3>
+ <KEYWORD3>ay</KEYWORD3>
+ <KEYWORD3>az</KEYWORD3>
+
+ <!-- /GFORMAT command -->
+ <KEYWORD3>g</KEYWORD3>
+ <KEYWORD3>,f</KEYWORD3>
+ <KEYWORD3>e</KEYWORD3>
+
+ <!-- /GLINE command -->
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- *GO command -->
+ <KEYWORD3>stop</KEYWORD3>
+
+ <!-- GP command -->
+ <KEYWORD3>p</KEYWORD3>
+ <KEYWORD3>fx</KEYWORD3>
+ <KEYWORD3>fy</KEYWORD3>
+ <KEYWORD3>fz</KEYWORD3>
+ <KEYWORD3>mx</KEYWORD3>
+ <KEYWORD3>my</KEYWORD3>
+ <KEYWORD3>mz</KEYWORD3>
+
+ <!-- GPLIST command -->
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- /GRAPHICS command -->
+ <KEYWORD3>full</KEYWORD3>
+ <KEYWORD3>power</KEYWORD3>
+
+ <!-- /GROPT command -->
+ <KEYWORD3>axdv</KEYWORD3>
+ <KEYWORD3>axnm</KEYWORD3>
+ <KEYWORD3>axnsc</KEYWORD3>
+ <KEYWORD3>ascal</KEYWORD3>
+ <KEYWORD3>logx</KEYWORD3>
+ <KEYWORD3>logy</KEYWORD3>
+ <KEYWORD3>fill</KEYWORD3>
+ <KEYWORD3>cgrid</KEYWORD3>
+ <KEYWORD3>dig1</KEYWORD3>
+ <KEYWORD3>dig2</KEYWORD3>
+ <KEYWORD3>view</KEYWORD3>
+ <KEYWORD3>revx</KEYWORD3>
+ <KEYWORD3>revy</KEYWORD3>
+ <KEYWORD3>divx</KEYWORD3>
+ <KEYWORD3>divy</KEYWORD3>
+ <KEYWORD3>ltyp</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+ <KEYWORD3>front</KEYWORD3>
+
+ <!-- GRP command -->
+ <KEYWORD3>disp</KEYWORD3>
+ <KEYWORD3>velo</KEYWORD3>
+ <KEYWORD3>acel</KEYWORD3>
+
+ <!-- /GST command -->
+ <KEYWORD3>on</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+
+ <!-- /GTHK command -->
+ <KEYWORD3>axis</KEYWORD3>
+ <KEYWORD3>grid</KEYWORD3>
+ <KEYWORD3>curve</KEYWORD3>
+
+ <!-- /GTYPE command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>node</KEYWORD3>
+ <KEYWORD3>elem</KEYWORD3>
+ <KEYWORD3>keyp</KEYWORD3>
+ <KEYWORD3>line</KEYWORD3>
+ <KEYWORD3>area</KEYWORD3>
+ <KEYWORD3>volu</KEYWORD3>
+ <KEYWORD3>grph</KEYWORD3>
+
+ <!-- /HEADER command -->
+ <KEYWORD3>on</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+
+ <!-- HPGL command -->
+ <KEYWORD3>model</KEYWORD3>
+ <KEYWORD3>paper</KEYWORD3>
+ <KEYWORD3>color</KEYWORD3>
+ <KEYWORD3>direct</KEYWORD3>
+
+ <!-- HPTCREATE command -->
+ <KEYWORD3>line</KEYWORD3>
+ <KEYWORD3>area</KEYWORD3>
+ <KEYWORD3>coord</KEYWORD3>
+ <KEYWORD3>ratio</KEYWORD3>
+
+ <!-- HPTDELETE command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+
+ <!-- HREXP command -->
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- HROPT command -->
+ <KEYWORD3>full</KEYWORD3>
+ <KEYWORD3>reduc</KEYWORD3>
+ <KEYWORD3>msup</KEYWORD3>
+
+ <!-- HROUT command -->
+ <KEYWORD3>on</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+
+ <!-- IC command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+ <KEYWORD3>ux</KEYWORD3>
+ <KEYWORD3>uy</KEYWORD3>
+ <KEYWORD3>uz</KEYWORD3>
+ <KEYWORD3>rotx</KEYWORD3>
+ <KEYWORD3>roty</KEYWORD3>
+ <KEYWORD3>rotz</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>vx</KEYWORD3>
+ <KEYWORD3>vy</KEYWORD3>
+ <KEYWORD3>vz</KEYWORD3>
+ <KEYWORD3>enke</KEYWORD3>
+ <KEYWORD3>ends</KEYWORD3>
+ <KEYWORD3>sp01</KEYWORD3>
+ <KEYWORD3>so02</KEYWORD3>
+ <KEYWORD3>sp03</KEYWORD3>
+ <KEYWORD3>sp04</KEYWORD3>
+ <KEYWORD3>sp05</KEYWORD3>
+ <KEYWORD3>sp06</KEYWORD3>
+ <KEYWORD3>volt</KEYWORD3>
+ <KEYWORD3>mag</KEYWORD3>
+ <KEYWORD3>ax</KEYWORD3>
+ <KEYWORD3>ay</KEYWORD3>
+ <KEYWORD3>az</KEYWORD3>
+
+ <!-- ICLIST command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+ <KEYWORD3>disp</KEYWORD3>
+ <KEYWORD3>velo</KEYWORD3>
+
+ <!-- *IF command -->
+ <KEYWORD3>eq</KEYWORD3>
+ <KEYWORD3>ne</KEYWORD3>
+ <KEYWORD3>lt</KEYWORD3>
+ <KEYWORD3>gt</KEYWORD3>
+ <KEYWORD3>le</KEYWORD3>
+ <KEYWORD3>ge</KEYWORD3>
+ <KEYWORD3>ablt</KEYWORD3>
+ <KEYWORD3>abgt</KEYWORD3>
+ <KEYWORD3>stop</KEYWORD3>
+ <KEYWORD3>exit</KEYWORD3>
+ <KEYWORD3>cycle</KEYWORD3>
+ <KEYWORD3>then</KEYWORD3>
+
+ <!-- INRES command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>basic</KEYWORD3>
+ <KEYWORD3>nsol</KEYWORD3>
+ <KEYWORD3>rsol</KEYWORD3>
+ <KEYWORD3>esol</KEYWORD3>
+ <KEYWORD3>nload</KEYWORD3>
+ <KEYWORD3>strs</KEYWORD3>
+ <KEYWORD3>epel</KEYWORD3>
+ <KEYWORD3>epth</KEYWORD3>
+ <KEYWORD3>eppl</KEYWORD3>
+ <KEYWORD3>epcr</KEYWORD3>
+ <KEYWORD3>fgrad</KEYWORD3>
+ <KEYWORD3>fflux</KEYWORD3>
+ <KEYWORD3>misc</KEYWORD3>
+
+ <!-- INTSRF command -->
+ <KEYWORD3>pres</KEYWORD3>
+
+ <!-- IOPTN command -->
+ <KEYWORD3>stat</KEYWORD3>
+ <KEYWORD3>defa</KEYWORD3>
+ <KEYWORD3>merg</KEYWORD3>
+ <KEYWORD3>yes</KEYWORD3>
+ <KEYWORD3>no</KEYWORD3>
+ <KEYWORD3>solid</KEYWORD3>
+ <KEYWORD3>gtoler</KEYWORD3>
+ <KEYWORD3>file</KEYWORD3>
+ <KEYWORD3>iges</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+ <KEYWORD3>small</KEYWORD3>
+
+ <!-- K command -->
+ <KEYWORD3>p</KEYWORD3>
+
+ <!-- KBETW command -->
+ <KEYWORD3>p</KEYWORD3>
+ <KEYWORD3>ratio</KEYWORD3>
+ <KEYWORD3>dist</KEYWORD3>
+
+ <!-- KCENTER command -->
+ <KEYWORD3>p</KEYWORD3>
+ <KEYWORD3>kp</KEYWORD3>
+ <KEYWORD3>line</KEYWORD3>
+
+ <!-- KCLEAR, KDELE, KDIST, KESIZE, KFILL, KGEN, KL, KLIST, KMESH, KMODIF, -->
+ <!-- KMOVE, KNODE, KPLOT, KPSCALE, KSCALE, KSCON commands -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+ <KEYWORD3>coord</KEYWORD3>
+ <KEYWORD3>hpt</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+
+ <!-- KREFINE command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>smooth</KEYWORD3>
+ <KEYWORD3>clean</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+
+ <!-- KSEL command -->
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>,r</KEYWORD3>
+ <KEYWORD3>,a</KEYWORD3>
+ <KEYWORD3>u</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>none</KEYWORD3>
+ <KEYWORD3>inve</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+ <KEYWORD3>,mat</KEYWORD3>
+ <KEYWORD3>,type</KEYWORD3>
+ <KEYWORD3>,real</KEYWORD3>
+ <KEYWORD3>,esys</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>kp</KEYWORD3>
+ <KEYWORD3>ext</KEYWORD3>
+ <KEYWORD3>hpt</KEYWORD3>
+ <KEYWORD3>loc</KEYWORD3>
+ <KEYWORD3>x</KEYWORD3>
+ <KEYWORD3>y</KEYWORD3>
+ <KEYWORD3>z</KEYWORD3>
+
+ <!-- KSLL, KSLN commands -->
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>,r</KEYWORD3>
+ <KEYWORD3>,a</KEYWORD3>
+ <KEYWORD3>u</KEYWORD3>
+
+ <!-- KSYMM, KTRAN, KWPAVE, KWPLAN commands -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+ <KEYWORD3>x</KEYWORD3>
+ <KEYWORD3>y</KEYWORD3>
+ <KEYWORD3>z</KEYWORD3>
+
+ <!-- L, L2ANG, L2TAN, LANG, LARC, LAREA commands -->
+ <KEYWORD3>p</KEYWORD3>
+
+ <!-- LAYER, LAYERP26 commands -->
+ <KEYWORD3>fcmax</KEYWORD3>
+
+ <!-- LAYLIST, LCABS, LCCAT, LCFACT, LCLEAR, LCOMB, LCSL, LCSUM, LDELE, -->
+ <!-- LDIV, LDRAG, LESIZE, LEXTND, LFILLT, LGEN, LGLUE, /LIGHT, LINA, -->
+ <!-- LINL, LINP, LINV, LMESH, LNFILL, LNMERGE, LOVLAP, LPLOT, LPTN, -->
+ <!-- LREVERSE, LROTAT, LSSCALE, LSTR commands -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+
+ <!-- LCDEF command -->
+ <KEYWORD3>erase</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- LCOPER command -->
+ <KEYWORD3>zero</KEYWORD3>
+ <KEYWORD3>squa</KEYWORD3>
+ <KEYWORD3>sqrt</KEYWORD3>
+ <KEYWORD3>lprin</KEYWORD3>
+ <KEYWORD3>add</KEYWORD3>
+ <KEYWORD3>sub</KEYWORD3>
+ <KEYWORD3>srss</KEYWORD3>
+ <KEYWORD3>min</KEYWORD3>
+ <KEYWORD3>max</KEYWORD3>
+ <KEYWORD3>abmn</KEYWORD3>
+ <KEYWORD3>abmx</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>mult</KEYWORD3>
+
+ <!-- LCSEL command -->
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>,r</KEYWORD3>
+ <KEYWORD3>,a</KEYWORD3>
+ <KEYWORD3>u</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>none</KEYWORD3>
+ <KEYWORD3>inve</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+
+ <!-- LDREAD command -->
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>forc</KEYWORD3>
+ <KEYWORD3>hgen</KEYWORD3>
+ <KEYWORD3>hflu</KEYWORD3>
+ <KEYWORD3>ehflu</KEYWORD3>
+ <KEYWORD3>js</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>reac</KEYWORD3>
+ <KEYWORD3>hflm</KEYWORD3>
+ <KEYWORD3>last</KEYWORD3>
+
+ <!-- LGWRITE command -->
+ <KEYWORD3>none</KEYWORD3>
+ <KEYWORD3>comment</KEYWORD3>
+ <KEYWORD3>remove</KEYWORD3>
+
+ <!-- LLIST command -->
+ <KEYWORD3>radius</KEYWORD3>
+ <KEYWORD3>layer</KEYWORD3>
+ <KEYWORD3>hpt</KEYWORD3>
+ <KEYWORD3>orient</KEYWORD3>
+
+ <!-- LNSEARCH command -->
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+ <KEYWORD3>auto</KEYWORD3>
+
+ <!-- LOCAL command -->
+ <KEYWORD3>cart</KEYWORD3>
+ <KEYWORD3>cylin</KEYWORD3>
+ <KEYWORD3>sphe</KEYWORD3>
+ <KEYWORD3>toro</KEYWORD3>
+
+ <!-- LREFINE command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>smooth</KEYWORD3>
+ <KEYWORD3>clean</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+
+ <!-- LSBA, LSBL, LSBV, LSBW commands -->
+ <KEYWORD3>p</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>sepo</KEYWORD3>
+ <KEYWORD3>delete</KEYWORD3>
+ <KEYWORD3>keep</KEYWORD3>
+
+ <!-- LSCLEAR command -->
+ <KEYWORD3>solid</KEYWORD3>
+ <KEYWORD3>fe</KEYWORD3>
+ <KEYWORD3>iner</KEYWORD3>
+ <KEYWORD3>lfact</KEYWORD3>
+ <KEYWORD3>lsopt</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- LSEL command -->
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>,r</KEYWORD3>
+ <KEYWORD3>,a</KEYWORD3>
+ <KEYWORD3>u</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>none</KEYWORD3>
+ <KEYWORD3>inve</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+ <KEYWORD3>line</KEYWORD3>
+ <KEYWORD3>ext</KEYWORD3>
+ <KEYWORD3>loc</KEYWORD3>
+ <KEYWORD3>x</KEYWORD3>
+ <KEYWORD3>y</KEYWORD3>
+ <KEYWORD3>z</KEYWORD3>
+ <KEYWORD3>tan1</KEYWORD3>
+ <KEYWORD3>tan2</KEYWORD3>
+ <KEYWORD3>ndiv</KEYWORD3>
+ <KEYWORD3>space</KEYWORD3>
+ <KEYWORD3>,mat</KEYWORD3>
+ <KEYWORD3>,type</KEYWORD3>
+ <KEYWORD3>,real</KEYWORD3>
+ <KEYWORD3>,esys</KEYWORD3>
+ <KEYWORD3>sec</KEYWORD3>
+ <KEYWORD3>lenght</KEYWORD3>
+ <KEYWORD3>radius</KEYWORD3>
+ <KEYWORD3>hpt</KEYWORD3>
+ <KEYWORD3>lcca</KEYWORD3>
+
+ <!-- LSLA, LSLK commands -->
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>,r</KEYWORD3>
+ <KEYWORD3>,a</KEYWORD3>
+ <KEYWORD3>u</KEYWORD3>
+
+ <!-- LSREAD, LSWRITE commands -->
+ <KEYWORD3>stat</KEYWORD3>
+ <KEYWORD3>init</KEYWORD3>
+
+ <!-- LSYMM, LTAN, LTRAN, LWPLAN commands -->
+ <KEYWORD3>x</KEYWORD3>
+ <KEYWORD3>y</KEYWORD3>
+ <KEYWORD3>z</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+
+ <!-- LUMPM command -->
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+
+ <!-- M, MONITOR commands -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+ <KEYWORD3>ux</KEYWORD3>
+ <KEYWORD3>uy</KEYWORD3>
+ <KEYWORD3>uz</KEYWORD3>
+ <KEYWORD3>rotx</KEYWORD3>
+ <KEYWORD3>roty</KEYWORD3>
+ <KEYWORD3>rotz</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>fx</KEYWORD3>
+ <KEYWORD3>fy</KEYWORD3>
+ <KEYWORD3>fz</KEYWORD3>
+ <KEYWORD3>mx</KEYWORD3>
+ <KEYWORD3>my</KEYWORD3>
+ <KEYWORD3>mz</KEYWORD3>
+ <KEYWORD3>heat</KEYWORD3>
+
+ <!-- MDELE, MGEN, MLIST commands -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+
+ <!-- /MENU command -->
+ <KEYWORD3>on</KEYWORD3>
+ <KEYWORD3>grph</KEYWORD3>
+
+ <!-- *MFOURI command -->
+ <KEYWORD3>fit</KEYWORD3>
+ <KEYWORD3>eval</KEYWORD3>
+
+ <!-- *MFUN command -->
+ <KEYWORD3>copy</KEYWORD3>
+ <KEYWORD3>tran</KEYWORD3>
+
+ <!-- MODMSH command -->
+ <KEYWORD3>stat</KEYWORD3>
+ <KEYWORD3>nocheck</KEYWORD3>
+ <KEYWORD3>check</KEYWORD3>
+ <KEYWORD3>detach</KEYWORD3>
+
+ <!-- MODOPT command -->
+ <KEYWORD3>subsp</KEYWORD3>
+ <KEYWORD3>lanb</KEYWORD3>
+ <KEYWORD3>reduc</KEYWORD3>
+ <KEYWORD3>unsym</KEYWORD3>
+ <KEYWORD3>damp</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+
+ <!-- *MOPER command -->
+ <KEYWORD3>mult</KEYWORD3>
+ <KEYWORD3>solv</KEYWORD3>
+ <KEYWORD3>sort</KEYWORD3>
+ <KEYWORD3>covar</KEYWORD3>
+ <KEYWORD3>corr</KEYWORD3>
+
+ <!-- MOPT command -->
+ <KEYWORD3>expnd</KEYWORD3>
+ <KEYWORD3>tetexpnd</KEYWORD3>
+ <KEYWORD3>trans</KEYWORD3>
+ <KEYWORD3>iesz</KEYWORD3>
+ <KEYWORD3>amesh</KEYWORD3>
+ <KEYWORD3>default</KEYWORD3>
+ <KEYWORD3>main</KEYWORD3>
+ <KEYWORD3>alternate</KEYWORD3>
+ <KEYWORD3>alt2</KEYWORD3>
+ <KEYWORD3>qmesh</KEYWORD3>
+ <KEYWORD3>vmesh</KEYWORD3>
+ <KEYWORD3>split</KEYWORD3>
+ <KEYWORD3>lsmo</KEYWORD3>
+ <KEYWORD3>clear</KEYWORD3>
+ <KEYWORD3>pyra</KEYWORD3>
+ <KEYWORD3>timp</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+ <KEYWORD3>defa</KEYWORD3>
+
+ <!-- MOVE command -->
+ <KEYWORD3>p</KEYWORD3>
+
+ <!-- MP, MPDATA commands -->
+ <KEYWORD3>ex</KEYWORD3>
+ <KEYWORD3>ey</KEYWORD3>
+ <KEYWORD3>ez</KEYWORD3>
+ <KEYWORD3>alpx</KEYWORD3>
+ <KEYWORD3>alpy</KEYWORD3>
+ <KEYWORD3>alpz</KEYWORD3>
+ <KEYWORD3>reft</KEYWORD3>
+ <KEYWORD3>prxy</KEYWORD3>
+ <KEYWORD3>pryz</KEYWORD3>
+ <KEYWORD3>prxz</KEYWORD3>
+ <KEYWORD3>nuxy</KEYWORD3>
+ <KEYWORD3>nuyz</KEYWORD3>
+ <KEYWORD3>nuzx</KEYWORD3>
+ <KEYWORD3>gxy</KEYWORD3>
+ <KEYWORD3>gyz</KEYWORD3>
+ <KEYWORD3>gxz</KEYWORD3>
+ <KEYWORD3>damp</KEYWORD3>
+ <KEYWORD3>mu</KEYWORD3>
+ <KEYWORD3>dens</KEYWORD3>
+ <KEYWORD3>c</KEYWORD3>
+ <KEYWORD3>enth</KEYWORD3>
+ <KEYWORD3>kxx</KEYWORD3>
+ <KEYWORD3>kyy</KEYWORD3>
+ <KEYWORD3>kzz</KEYWORD3>
+ <KEYWORD3>hf</KEYWORD3>
+ <KEYWORD3>emis</KEYWORD3>
+ <KEYWORD3>qrate</KEYWORD3>
+ <KEYWORD3>visc</KEYWORD3>
+ <KEYWORD3>sonc</KEYWORD3>
+ <KEYWORD3>rsvx</KEYWORD3>
+ <KEYWORD3>rsvy</KEYWORD3>
+ <KEYWORD3>rsvz</KEYWORD3>
+ <KEYWORD3>perx</KEYWORD3>
+ <KEYWORD3>pery</KEYWORD3>
+ <KEYWORD3>perz</KEYWORD3>
+ <KEYWORD3>murx</KEYWORD3>
+ <KEYWORD3>mury</KEYWORD3>
+ <KEYWORD3>murz</KEYWORD3>
+ <KEYWORD3>mgxx</KEYWORD3>
+ <KEYWORD3>mgyy</KEYWORD3>
+ <KEYWORD3>mgzz</KEYWORD3>
+ <KEYWORD3>lsst</KEYWORD3>
+
+ <!-- MPCHG, MPDELE commands -->
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- /MPLIB command -->
+ <KEYWORD3>read</KEYWORD3>
+ <KEYWORD3>write</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+
+ <!-- MPLIST command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>evlt</KEYWORD3>
+
+ <!-- MSADV command -->
+ <KEYWORD3>msu</KEYWORD3>
+ <KEYWORD3>supg</KEYWORD3>
+
+ <!-- MSCAP command -->
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+
+ <!-- *MSG command -->
+ <KEYWORD3>info</KEYWORD3>
+ <KEYWORD3>note</KEYWORD3>
+ <KEYWORD3>warn</KEYWORD3>
+ <KEYWORD3>error</KEYWORD3>
+ <KEYWORD3>fatal</KEYWORD3>
+ <KEYWORD3>ui</KEYWORD3>
+
+ <!-- MSHAPE command -->
+ <KEYWORD3>2d</KEYWORD3>
+ <KEYWORD3>3d</KEYWORD3>
+
+ <!-- MSPROP command -->
+ <KEYWORD3>dens</KEYWORD3>
+ <KEYWORD3>visc</KEYWORD3>
+ <KEYWORD3>cond</KEYWORD3>
+ <KEYWORD3>mdif</KEYWORD3>
+ <KEYWORD3>spht</KEYWORD3>
+ <KEYWORD3>constant</KEYWORD3>
+ <KEYWORD3>liquid</KEYWORD3>
+ <KEYWORD3>gas</KEYWORD3>
+
+ <!-- /MSTART command -->
+ <KEYWORD3>main</KEYWORD3>
+ <KEYWORD3>input</KEYWORD3>
+ <KEYWORD3>grph</KEYWORD3>
+ <KEYWORD3>tool</KEYWORD3>
+ <KEYWORD3>zoom</KEYWORD3>
+ <KEYWORD3>work</KEYWORD3>
+ <KEYWORD3>wpset</KEYWORD3>
+ <KEYWORD3>abbr</KEYWORD3>
+ <KEYWORD3>parm</KEYWORD3>
+ <KEYWORD3>sele</KEYWORD3>
+ <KEYWORD3>anno</KEYWORD3>
+ <KEYWORD3>hard</KEYWORD3>
+ <KEYWORD3>help</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+
+ <!-- MSVARY command -->
+ <KEYWORD3>dens</KEYWORD3>
+ <KEYWORD3>visc</KEYWORD3>
+ <KEYWORD3>cond</KEYWORD3>
+ <KEYWORD3>mdif</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+
+ <!-- MXPAND command -->
+ <KEYWORD3>no</KEYWORD3>
+ <KEYWORD3>yes</KEYWORD3>
+
+ <!-- N, NDELE, NDIST, NGEN, NKPT commands -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+
+ <!-- NLGEOM, NOORDER commands -->
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+
+ <!-- NLIST, NMODIF commands -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+ <KEYWORD3>coord</KEYWORD3>
+
+ <!-- NREFINE, NROTAT, NSCALE commands -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>smooth</KEYWORD3>
+ <KEYWORD3>clean</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+
+ <!-- NRLSUM command -->
+ <KEYWORD3>disp</KEYWORD3>
+ <KEYWORD3>velo</KEYWORD3>
+ <KEYWORD3>acel</KEYWORD3>
+
+ <!-- NROPT command -->
+ <KEYWORD3>auto</KEYWORD3>
+ <KEYWORD3>full</KEYWORD3>
+ <KEYWORD3>modi</KEYWORD3>
+ <KEYWORD3>init</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+
+ <!-- NSEL, NSOL, NSORT commands -->
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>,r</KEYWORD3>
+ <KEYWORD3>,a</KEYWORD3>
+ <KEYWORD3>u</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>none</KEYWORD3>
+ <KEYWORD3>inve</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+ <KEYWORD3>node</KEYWORD3>
+ <KEYWORD3>ext</KEYWORD3>
+ <KEYWORD3>loc</KEYWORD3>
+ <KEYWORD3>x</KEYWORD3>
+ <KEYWORD3>y</KEYWORD3>
+ <KEYWORD3>z</KEYWORD3>
+ <KEYWORD3>ang</KEYWORD3>
+ <KEYWORD3>xy</KEYWORD3>
+ <KEYWORD3>yz</KEYWORD3>
+ <KEYWORD3>zx</KEYWORD3>
+ <KEYWORD3>,m</KEYWORD3>
+ <KEYWORD3>,cp</KEYWORD3>
+ <KEYWORD3>,ce</KEYWORD3>
+ <KEYWORD3>,d</KEYWORD3>
+ <KEYWORD3>u</KEYWORD3>
+ <KEYWORD3>ux</KEYWORD3>
+ <KEYWORD3>uy</KEYWORD3>
+ <KEYWORD3>uz</KEYWORD3>
+ <KEYWORD3>rot</KEYWORD3>
+ <KEYWORD3>rotx</KEYWORD3>
+ <KEYWORD3>roty</KEYWORD3>
+ <KEYWORD3>rotz</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>volt</KEYWORD3>
+ <KEYWORD3>mag</KEYWORD3>
+ <KEYWORD3>v</KEYWORD3>
+ <KEYWORD3>vx</KEYWORD3>
+ <KEYWORD3>vy</KEYWORD3>
+ <KEYWORD3>vz</KEYWORD3>
+ <KEYWORD3>,a</KEYWORD3>
+ <KEYWORD3>ax</KEYWORD3>
+ <KEYWORD3>ay</KEYWORD3>
+ <KEYWORD3>az</KEYWORD3>
+ <KEYWORD3>curr</KEYWORD3>
+ <KEYWORD3>emf</KEYWORD3>
+ <KEYWORD3>enke</KEYWORD3>
+ <KEYWORD3>ends</KEYWORD3>
+ <KEYWORD3>,f</KEYWORD3>
+ <KEYWORD3>fx</KEYWORD3>
+ <KEYWORD3>fy</KEYWORD3>
+ <KEYWORD3>fz</KEYWORD3>
+ <KEYWORD3>,m</KEYWORD3>
+ <KEYWORD3>mx</KEYWORD3>
+ <KEYWORD3>my</KEYWORD3>
+ <KEYWORD3>mz</KEYWORD3>
+ <KEYWORD3>heat</KEYWORD3>
+ <KEYWORD3>flow</KEYWORD3>
+ <KEYWORD3>amps</KEYWORD3>
+ <KEYWORD3>flux</KEYWORD3>
+ <KEYWORD3>csg</KEYWORD3>
+ <KEYWORD3>csgx</KEYWORD3>
+ <KEYWORD3>csgy</KEYWORD3>
+ <KEYWORD3>csgz</KEYWORD3>
+ <KEYWORD3>chrg</KEYWORD3>
+ <KEYWORD3>chrgd</KEYWORD3>
+ <KEYWORD3>,bf</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>flue</KEYWORD3>
+ <KEYWORD3>hgen</KEYWORD3>
+ <KEYWORD3>js</KEYWORD3>
+ <KEYWORD3>jsx</KEYWORD3>
+ <KEYWORD3>jsy</KEYWORD3>
+ <KEYWORD3>jsz</KEYWORD3>
+ <KEYWORD3>mvdi</KEYWORD3>
+ <KEYWORD3>int</KEYWORD3>
+ <KEYWORD3>eqv</KEYWORD3>
+ <KEYWORD3>epto</KEYWORD3>
+ <KEYWORD3>epel</KEYWORD3>
+ <KEYWORD3>eppl</KEYWORD3>
+ <KEYWORD3>epcr</KEYWORD3>
+ <KEYWORD3>epth</KEYWORD3>
+ <KEYWORD3>epsw</KEYWORD3>
+ <KEYWORD3>nl</KEYWORD3>
+ <KEYWORD3>sepl</KEYWORD3>
+ <KEYWORD3>srat</KEYWORD3>
+ <KEYWORD3>hpres</KEYWORD3>
+ <KEYWORD3>epeq</KEYWORD3>
+ <KEYWORD3>psv</KEYWORD3>
+ <KEYWORD3>plwk</KEYWORD3>
+ <KEYWORD3>cont</KEYWORD3>
+ <KEYWORD3>pene</KEYWORD3>
+ <KEYWORD3>sfric</KEYWORD3>
+ <KEYWORD3>stot</KEYWORD3>
+ <KEYWORD3>slide</KEYWORD3>
+ <KEYWORD3>tg</KEYWORD3>
+ <KEYWORD3>tf</KEYWORD3>
+ <KEYWORD3>pg</KEYWORD3>
+ <KEYWORD3>ef</KEYWORD3>
+ <KEYWORD3>,d</KEYWORD3>
+ <KEYWORD3>h</KEYWORD3>
+ <KEYWORD3>b</KEYWORD3>
+ <KEYWORD3>fmag</KEYWORD3>
+ <KEYWORD3>topo</KEYWORD3>
+ <KEYWORD3>ttot</KEYWORD3>
+ <KEYWORD3>hflu</KEYWORD3>
+ <KEYWORD3>hflm</KEYWORD3>
+ <KEYWORD3>cond</KEYWORD3>
+ <KEYWORD3>pcoe</KEYWORD3>
+ <KEYWORD3>ptot</KEYWORD3>
+ <KEYWORD3>mach</KEYWORD3>
+ <KEYWORD3>strm</KEYWORD3>
+ <KEYWORD3>dens</KEYWORD3>
+ <KEYWORD3>visc</KEYWORD3>
+ <KEYWORD3>evis</KEYWORD3>
+ <KEYWORD3>cmuv</KEYWORD3>
+ <KEYWORD3>econ</KEYWORD3>
+ <KEYWORD3>yplu</KEYWORD3>
+ <KEYWORD3>tauw</KEYWORD3>
+
+ <!-- NSLA, NSLE, NSLK, NSLL, NSLV commands -->
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>,r</KEYWORD3>
+ <KEYWORD3>,a</KEYWORD3>
+ <KEYWORD3>u</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>active</KEYWORD3>
+ <KEYWORD3>inactive</KEYWORD3>
+ <KEYWORD3>corner</KEYWORD3>
+ <KEYWORD3>mid</KEYWORD3>
+
+ <!-- NSUBST command -->
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+
+ <!-- NSYM command -->
+ <KEYWORD3>x</KEYWORD3>
+ <KEYWORD3>y</KEYWORD3>
+ <KEYWORD3>z</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+
+ <!-- NUMCMP, NUMMRG, NUMOFF, NUMSTR commands -->
+ <KEYWORD3>node</KEYWORD3>
+ <KEYWORD3>elem</KEYWORD3>
+ <KEYWORD3>kp</KEYWORD3>
+ <KEYWORD3>line</KEYWORD3>
+ <KEYWORD3>area</KEYWORD3>
+ <KEYWORD3>volu</KEYWORD3>
+ <KEYWORD3>,mat</KEYWORD3>
+ <KEYWORD3>,type</KEYWORD3>
+ <KEYWORD3>,real</KEYWORD3>
+ <KEYWORD3>,cp</KEYWORD3>
+ <KEYWORD3>,ce</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>low</KEYWORD3>
+ <KEYWORD3>high</KEYWORD3>
+ <KEYWORD3>,csys</KEYWORD3>
+ <KEYWORD3>defa</KEYWORD3>
+
+ <!-- NUMEXP command -->
+ <KEYWORD3>yes</KEYWORD3>
+ <KEYWORD3>no</KEYWORD3>
+
+ <!-- NWPLAN command -->
+ <KEYWORD3>p</KEYWORD3>
+
+ <!-- OPDEL, OPLIST, OPRFA, OPRGR, OPRSW commands -->
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- OPFACT command -->
+ <KEYWORD3>full</KEYWORD3>
+
+ <!-- OPGRAD, OPSWEEP commands -->
+ <KEYWORD3>best</KEYWORD3>
+ <KEYWORD3>last</KEYWORD3>
+ <KEYWORD3>,n</KEYWORD3>
+
+ <!-- OPKEEP commmand -->
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+
+ <!-- OPLFA command -->
+ <KEYWORD3>main</KEYWORD3>
+ <KEYWORD3>2fac</KEYWORD3>
+ <KEYWORD3>3fac</KEYWORD3>
+
+ <!-- OPLOOP command -->
+ <KEYWORD3>top</KEYWORD3>
+ <KEYWORD3>prep</KEYWORD3>
+ <KEYWORD3>ignore</KEYWORD3>
+ <KEYWORD3>process</KEYWORD3>
+ <KEYWORD3>scalar</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- OPNCONTROL command -->
+ <KEYWORD3>temp</KEYWORD3>
+
+ <!-- OPPRNT command -->
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+ <KEYWORD3>full</KEYWORD3>
+
+ <!-- OPTYPE command -->
+ <KEYWORD3>subp</KEYWORD3>
+ <KEYWORD3>first</KEYWORD3>
+ <KEYWORD3>rand</KEYWORD3>
+ <KEYWORD3>run</KEYWORD3>
+ <KEYWORD3>fact</KEYWORD3>
+ <KEYWORD3>grad</KEYWORD3>
+ <KEYWORD3>sweep</KEYWORD3>
+ <KEYWORD3>user</KEYWORD3>
+
+ <!-- OPVAR command -->
+ <KEYWORD3>dv</KEYWORD3>
+ <KEYWORD3>sv</KEYWORD3>
+ <KEYWORD3>obj</KEYWORD3>
+ <KEYWORD3>del</KEYWORD3>
+
+ <!-- OUTPR command -->
+ <KEYWORD3>basic</KEYWORD3>
+ <KEYWORD3>nsol</KEYWORD3>
+ <KEYWORD3>rsol</KEYWORD3>
+ <KEYWORD3>esol</KEYWORD3>
+ <KEYWORD3>nload</KEYWORD3>
+ <KEYWORD3>veng</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>none</KEYWORD3>
+ <KEYWORD3>last</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+ <KEYWORD3>erase</KEYWORD3>
+
+ <!-- /OUTPUT command -->
+ <KEYWORD3>term</KEYWORD3>
+ <KEYWORD3>append</KEYWORD3>
+
+ <!-- OUTRES command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>basic</KEYWORD3>
+ <KEYWORD3>nsol</KEYWORD3>
+ <KEYWORD3>rsol</KEYWORD3>
+ <KEYWORD3>esol</KEYWORD3>
+ <KEYWORD3>nload</KEYWORD3>
+ <KEYWORD3>strs</KEYWORD3>
+ <KEYWORD3>epel</KEYWORD3>
+ <KEYWORD3>epth</KEYWORD3>
+ <KEYWORD3>eppl</KEYWORD3>
+ <KEYWORD3>epcr</KEYWORD3>
+ <KEYWORD3>fgrad</KEYWORD3>
+ <KEYWORD3>fflux</KEYWORD3>
+ <KEYWORD3>misc</KEYWORD3>
+ <KEYWORD3>none</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>last</KEYWORD3>
+
+ <!-- PADELE command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>name</KEYWORD3>
+
+ <!-- PAGET, PAPUT commands -->
+ <KEYWORD3>points</KEYWORD3>
+ <KEYWORD3>table</KEYWORD3>
+ <KEYWORD3>label</KEYWORD3>
+
+ <!-- PARESU command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>path</KEYWORD3>
+
+ <!-- PARRES command -->
+ <KEYWORD3>new</KEYWORD3>
+ <KEYWORD3>change</KEYWORD3>
+
+ <!-- PARSAV command -->
+ <KEYWORD3>scalar</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- PASAVE command -->
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- /PBC command -->
+ <KEYWORD3>u</KEYWORD3>
+ <KEYWORD3>ux</KEYWORD3>
+ <KEYWORD3>uy</KEYWORD3>
+ <KEYWORD3>uz</KEYWORD3>
+ <KEYWORD3>rot</KEYWORD3>
+ <KEYWORD3>rotx</KEYWORD3>
+ <KEYWORD3>roty</KEYWORD3>
+ <KEYWORD3>rotz</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>v</KEYWORD3>
+ <KEYWORD3>vx</KEYWORD3>
+ <KEYWORD3>vy</KEYWORD3>
+ <KEYWORD3>vz</KEYWORD3>
+ <KEYWORD3>sp01</KEYWORD3>
+ <KEYWORD3>sp02</KEYWORD3>
+ <KEYWORD3>sp03</KEYWORD3>
+ <KEYWORD3>sp04</KEYWORD3>
+ <KEYWORD3>sp05</KEYWORD3>
+ <KEYWORD3>sp06</KEYWORD3>
+ <KEYWORD3>enke</KEYWORD3>
+ <KEYWORD3>ends</KEYWORD3>
+ <KEYWORD3>volt</KEYWORD3>
+ <KEYWORD3>mag</KEYWORD3>
+ <KEYWORD3>,a</KEYWORD3>
+ <KEYWORD3>chrg</KEYWORD3>
+ <KEYWORD3>,f</KEYWORD3>
+ <KEYWORD3>forc</KEYWORD3>
+ <KEYWORD3>fx</KEYWORD3>
+ <KEYWORD3>fy</KEYWORD3>
+ <KEYWORD3>fz</KEYWORD3>
+ <KEYWORD3>,m</KEYWORD3>
+ <KEYWORD3>mome</KEYWORD3>
+ <KEYWORD3>mx</KEYWORD3>
+ <KEYWORD3>my</KEYWORD3>
+ <KEYWORD3>mz</KEYWORD3>
+ <KEYWORD3>heat</KEYWORD3>
+ <KEYWORD3>flow</KEYWORD3>
+ <KEYWORD3>amps</KEYWORD3>
+ <KEYWORD3>flux</KEYWORD3>
+ <KEYWORD3>csg</KEYWORD3>
+ <KEYWORD3>mast</KEYWORD3>
+ <KEYWORD3>,cp</KEYWORD3>
+ <KEYWORD3>,ce</KEYWORD3>
+ <KEYWORD3>nfor</KEYWORD3>
+ <KEYWORD3>nmom</KEYWORD3>
+ <KEYWORD3>rfor</KEYWORD3>
+ <KEYWORD3>rmom</KEYWORD3>
+ <KEYWORD3>path</KEYWORD3>
+ <KEYWORD3>acel</KEYWORD3>
+ <KEYWORD3>acelx</KEYWORD3>
+ <KEYWORD3>acely</KEYWORD3>
+ <KEYWORD3>acelz</KEYWORD3>
+ <KEYWORD3>omeg</KEYWORD3>
+ <KEYWORD3>omegx</KEYWORD3>
+ <KEYWORD3>omegy</KEYWORD3>
+ <KEYWORD3>omegz</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- /PBF command -->
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>flue</KEYWORD3>
+ <KEYWORD3>hgen</KEYWORD3>
+ <KEYWORD3>js</KEYWORD3>
+ <KEYWORD3>jsx</KEYWORD3>
+ <KEYWORD3>jsy</KEYWORD3>
+ <KEYWORD3>jsz</KEYWORD3>
+ <KEYWORD3>phase</KEYWORD3>
+ <KEYWORD3>mvdi</KEYWORD3>
+ <KEYWORD3>chrgd</KEYWORD3>
+ <KEYWORD3>vltg</KEYWORD3>
+ <KEYWORD3>forc</KEYWORD3>
+
+ <!-- PCALC command -->
+ <KEYWORD3>add</KEYWORD3>
+ <KEYWORD3>mult</KEYWORD3>
+ <KEYWORD3>div</KEYWORD3>
+ <KEYWORD3>exp</KEYWORD3>
+ <KEYWORD3>deri</KEYWORD3>
+ <KEYWORD3>intg</KEYWORD3>
+ <KEYWORD3>sin</KEYWORD3>
+ <KEYWORD3>cos</KEYWORD3>
+ <KEYWORD3>asin</KEYWORD3>
+ <KEYWORD3>acos</KEYWORD3>
+ <KEYWORD3>log</KEYWORD3>
+
+ <!-- PCONV command -->
+ <KEYWORD3>stat</KEYWORD3>
+ <KEYWORD3>erase</KEYWORD3>
+ <KEYWORD3>dele</KEYWORD3>
+ <KEYWORD3>se</KEYWORD3>
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>epel</KEYWORD3>
+ <KEYWORD3>u</KEYWORD3>
+ <KEYWORD3>rot</KEYWORD3>
+ <KEYWORD3>eqv</KEYWORD3>
+ <KEYWORD3>sum</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+ <KEYWORD3>top</KEYWORD3>
+ <KEYWORD3>mid</KEYWORD3>
+ <KEYWORD3>bot</KEYWORD3>
+ <KEYWORD3>x</KEYWORD3>
+ <KEYWORD3>y</KEYWORD3>
+ <KEYWORD3>z</KEYWORD3>
+ <KEYWORD3>xy</KEYWORD3>
+ <KEYWORD3>yz</KEYWORD3>
+ <KEYWORD3>xz</KEYWORD3>
+ <KEYWORD3>int</KEYWORD3>
+
+ <!-- /PCOPY command -->
+ <KEYWORD3>now</KEYWORD3>
+
+ <!-- PDEF command -->
+ <KEYWORD3>avg</KEYWORD3>
+ <KEYWORD3>noav</KEYWORD3>
+ <KEYWORD3>u</KEYWORD3>
+ <KEYWORD3>x</KEYWORD3>
+ <KEYWORD3>y</KEYWORD3>
+ <KEYWORD3>z</KEYWORD3>
+ <KEYWORD3>sum</KEYWORD3>
+ <KEYWORD3>rot</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>volt</KEYWORD3>
+ <KEYWORD3>mag</KEYWORD3>
+ <KEYWORD3>v</KEYWORD3>
+ <KEYWORD3>,a</KEYWORD3>
+ <KEYWORD3>curr</KEYWORD3>
+ <KEYWORD3>emf</KEYWORD3>
+ <KEYWORD3>enke</KEYWORD3>
+ <KEYWORD3>ends</KEYWORD3>
+ <KEYWORD3>xy</KEYWORD3>
+ <KEYWORD3>yz</KEYWORD3>
+ <KEYWORD3>xz</KEYWORD3>
+ <KEYWORD3>eqv</KEYWORD3>
+ <KEYWORD3>epto</KEYWORD3>
+ <KEYWORD3>epel</KEYWORD3>
+ <KEYWORD3>eppl</KEYWORD3>
+ <KEYWORD3>epcr</KEYWORD3>
+ <KEYWORD3>epth</KEYWORD3>
+ <KEYWORD3>epsw</KEYWORD3>
+ <KEYWORD3>nl</KEYWORD3>
+ <KEYWORD3>sepl</KEYWORD3>
+ <KEYWORD3>srat</KEYWORD3>
+ <KEYWORD3>hpres</KEYWORD3>
+ <KEYWORD3>epeq</KEYWORD3>
+ <KEYWORD3>psv</KEYWORD3>
+ <KEYWORD3>plwk</KEYWORD3>
+ <KEYWORD3>tg</KEYWORD3>
+ <KEYWORD3>tf</KEYWORD3>
+ <KEYWORD3>pg</KEYWORD3>
+ <KEYWORD3>ef</KEYWORD3>
+ <KEYWORD3>,d</KEYWORD3>
+ <KEYWORD3>h</KEYWORD3>
+ <KEYWORD3>b</KEYWORD3>
+ <KEYWORD3>fmag</KEYWORD3>
+ <KEYWORD3>etab</KEYWORD3>
+ <KEYWORD3>bfe</KEYWORD3>
+ <KEYWORD3>ttot</KEYWORD3>
+ <KEYWORD3>hflu</KEYWORD3>
+ <KEYWORD3>hflm</KEYWORD3>
+ <KEYWORD3>cond</KEYWORD3>
+ <KEYWORD3>pcoe</KEYWORD3>
+ <KEYWORD3>ptot</KEYWORD3>
+ <KEYWORD3>mach</KEYWORD3>
+ <KEYWORD3>strm</KEYWORD3>
+ <KEYWORD3>dens</KEYWORD3>
+ <KEYWORD3>visc</KEYWORD3>
+ <KEYWORD3>evis</KEYWORD3>
+ <KEYWORD3>cmuv</KEYWORD3>
+ <KEYWORD3>econ</KEYWORD3>
+ <KEYWORD3>yplu</KEYWORD3>
+ <KEYWORD3>tauw</KEYWORD3>
+ <KEYWORD3>spht</KEYWORD3>
+
+ <!-- PDRAG command -->
+ <KEYWORD3>x</KEYWORD3>
+ <KEYWORD3>y</KEYWORD3>
+ <KEYWORD3>z</KEYWORD3>
+
+ <!-- PEXCLUDE command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+
+ <!-- PFACT command -->
+ <KEYWORD3>base</KEYWORD3>
+ <KEYWORD3>node</KEYWORD3>
+ <KEYWORD3>wave</KEYWORD3>
+ <KEYWORD3>spat</KEYWORD3>
+
+ <!-- PHYSICS command -->
+ <KEYWORD3>write</KEYWORD3>
+ <KEYWORD3>read</KEYWORD3>
+ <KEYWORD3>list</KEYWORD3>
+ <KEYWORD3>delete</KEYWORD3>
+ <KEYWORD3>clear</KEYWORD3>
+ <KEYWORD3>status</KEYWORD3>
+
+ <!-- PINCLUDE command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+
+ <!-- PIVCHECK command -->
+ <KEYWORD3>on</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+
+ <!-- PLCONV command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>se</KEYWORD3>
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>epel</KEYWORD3>
+ <KEYWORD3>u</KEYWORD3>
+ <KEYWORD3>rot</KEYWORD3>
+ <KEYWORD3>top</KEYWORD3>
+ <KEYWORD3>mid</KEYWORD3>
+ <KEYWORD3>bot</KEYWORD3>
+ <KEYWORD3>xy</KEYWORD3>
+ <KEYWORD3>yz</KEYWORD3>
+ <KEYWORD3>xz</KEYWORD3>
+ <KEYWORD3>int</KEYWORD3>
+ <KEYWORD3>eqv</KEYWORD3>
+ <KEYWORD3>epel</KEYWORD3>
+ <KEYWORD3>u</KEYWORD3>
+ <KEYWORD3>rot</KEYWORD3>
+
+ <!-- PLESOL command -->
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>x</KEYWORD3>
+ <KEYWORD3>y</KEYWORD3>
+ <KEYWORD3>z</KEYWORD3>
+ <KEYWORD3>xy</KEYWORD3>
+ <KEYWORD3>yz</KEYWORD3>
+ <KEYWORD3>xz</KEYWORD3>
+ <KEYWORD3>int</KEYWORD3>
+ <KEYWORD3>eqv</KEYWORD3>
+ <KEYWORD3>epto</KEYWORD3>
+ <KEYWORD3>epel</KEYWORD3>
+ <KEYWORD3>eppl</KEYWORD3>
+ <KEYWORD3>epcr</KEYWORD3>
+ <KEYWORD3>epth</KEYWORD3>
+ <KEYWORD3>epsw</KEYWORD3>
+ <KEYWORD3>nl</KEYWORD3>
+ <KEYWORD3>sepl</KEYWORD3>
+ <KEYWORD3>srat</KEYWORD3>
+ <KEYWORD3>hpres</KEYWORD3>
+ <KEYWORD3>epeq</KEYWORD3>
+ <KEYWORD3>psv</KEYWORD3>
+ <KEYWORD3>plwk</KEYWORD3>
+ <KEYWORD3>cont</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+ <KEYWORD3>pene</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>sfric</KEYWORD3>
+ <KEYWORD3>stot</KEYWORD3>
+ <KEYWORD3>slide</KEYWORD3>
+ <KEYWORD3>gap</KEYWORD3>
+ <KEYWORD3>tg</KEYWORD3>
+ <KEYWORD3>tf</KEYWORD3>
+ <KEYWORD3>pg</KEYWORD3>
+ <KEYWORD3>ef</KEYWORD3>
+ <KEYWORD3>,d</KEYWORD3>
+ <KEYWORD3>h</KEYWORD3>
+ <KEYWORD3>b</KEYWORD3>
+ <KEYWORD3>fmag</KEYWORD3>
+ <KEYWORD3>serr</KEYWORD3>
+ <KEYWORD3>sdsg</KEYWORD3>
+ <KEYWORD3>terr</KEYWORD3>
+ <KEYWORD3>tdsg</KEYWORD3>
+ <KEYWORD3>,f</KEYWORD3>
+ <KEYWORD3>,m</KEYWORD3>
+ <KEYWORD3>heat</KEYWORD3>
+ <KEYWORD3>flow</KEYWORD3>
+ <KEYWORD3>amps</KEYWORD3>
+ <KEYWORD3>flux</KEYWORD3>
+ <KEYWORD3>vf</KEYWORD3>
+ <KEYWORD3>csg</KEYWORD3>
+ <KEYWORD3>sene</KEYWORD3>
+ <KEYWORD3>tene</KEYWORD3>
+ <KEYWORD3>kene</KEYWORD3>
+ <KEYWORD3>jheat</KEYWORD3>
+ <KEYWORD3>js</KEYWORD3>
+ <KEYWORD3>jt</KEYWORD3>
+ <KEYWORD3>mre</KEYWORD3>
+ <KEYWORD3>volu</KEYWORD3>
+ <KEYWORD3>cent</KEYWORD3>
+ <KEYWORD3>bfe</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>smisc</KEYWORD3>
+ <KEYWORD3>nmisc</KEYWORD3>
+ <KEYWORD3>topo</KEYWORD3>
+
+ <!-- PLETAB command -->
+ <KEYWORD3>noav</KEYWORD3>
+ <KEYWORD3>avg</KEYWORD3>
+
+ <!-- PLNSOL command -->
+ <KEYWORD3>u</KEYWORD3>
+ <KEYWORD3>x</KEYWORD3>
+ <KEYWORD3>y</KEYWORD3>
+ <KEYWORD3>z</KEYWORD3>
+ <KEYWORD3>sum</KEYWORD3>
+ <KEYWORD3>rot</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>volt</KEYWORD3>
+ <KEYWORD3>mag</KEYWORD3>
+ <KEYWORD3>v</KEYWORD3>
+ <KEYWORD3>y</KEYWORD3>
+ <KEYWORD3>enke</KEYWORD3>
+ <KEYWORD3>ends</KEYWORD3>
+ <KEYWORD3>sp01</KEYWORD3>
+ <KEYWORD3>sp02</KEYWORD3>
+ <KEYWORD3>sp03</KEYWORD3>
+ <KEYWORD3>sp04</KEYWORD3>
+ <KEYWORD3>sp05</KEYWORD3>
+ <KEYWORD3>sp06</KEYWORD3>
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>int</KEYWORD3>
+ <KEYWORD3>eqv</KEYWORD3>
+ <KEYWORD3>epto</KEYWORD3>
+ <KEYWORD3>xy</KEYWORD3>
+ <KEYWORD3>yz</KEYWORD3>
+ <KEYWORD3>xz</KEYWORD3>
+ <KEYWORD3>epel</KEYWORD3>
+ <KEYWORD3>eppl</KEYWORD3>
+ <KEYWORD3>epcr</KEYWORD3>
+ <KEYWORD3>epth</KEYWORD3>
+ <KEYWORD3>epsw</KEYWORD3>
+ <KEYWORD3>nl</KEYWORD3>
+ <KEYWORD3>sepl</KEYWORD3>
+ <KEYWORD3>srat</KEYWORD3>
+ <KEYWORD3>hpres</KEYWORD3>
+ <KEYWORD3>epeq</KEYWORD3>
+ <KEYWORD3>psv</KEYWORD3>
+ <KEYWORD3>plwk</KEYWORD3>
+ <KEYWORD3>cont</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+ <KEYWORD3>pene</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>sfric</KEYWORD3>
+ <KEYWORD3>stot</KEYWORD3>
+ <KEYWORD3>slide</KEYWORD3>
+ <KEYWORD3>gap</KEYWORD3>
+ <KEYWORD3>tg</KEYWORD3>
+ <KEYWORD3>tf</KEYWORD3>
+ <KEYWORD3>pg</KEYWORD3>
+ <KEYWORD3>ef</KEYWORD3>
+ <KEYWORD3>,d</KEYWORD3>
+ <KEYWORD3>h</KEYWORD3>
+ <KEYWORD3>b</KEYWORD3>
+ <KEYWORD3>fmag</KEYWORD3>
+ <KEYWORD3>bfe</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>topo</KEYWORD3>
+ <KEYWORD3>ttot</KEYWORD3>
+ <KEYWORD3>hflu</KEYWORD3>
+ <KEYWORD3>hflm</KEYWORD3>
+ <KEYWORD3>cond</KEYWORD3>
+ <KEYWORD3>pcoe</KEYWORD3>
+ <KEYWORD3>ptot</KEYWORD3>
+ <KEYWORD3>mach</KEYWORD3>
+ <KEYWORD3>strm</KEYWORD3>
+ <KEYWORD3>dens</KEYWORD3>
+ <KEYWORD3>visc</KEYWORD3>
+ <KEYWORD3>spht</KEYWORD3>
+ <KEYWORD3>evis</KEYWORD3>
+ <KEYWORD3>cmuv</KEYWORD3>
+ <KEYWORD3>econ</KEYWORD3>
+ <KEYWORD3>yplu</KEYWORD3>
+ <KEYWORD3>tauw</KEYWORD3>
+ <KEYWORD3>lmd1</KEYWORD3>
+ <KEYWORD3>lmd2</KEYWORD3>
+ <KEYWORD3>lmd3</KEYWORD3>
+ <KEYWORD3>lmd4</KEYWORD3>
+ <KEYWORD3>lmd5</KEYWORD3>
+ <KEYWORD3>lmd6</KEYWORD3>
+ <KEYWORD3>emd1</KEYWORD3>
+ <KEYWORD3>emd2</KEYWORD3>
+ <KEYWORD3>emd3</KEYWORD3>
+ <KEYWORD3>emd4</KEYWORD3>
+ <KEYWORD3>emd5</KEYWORD3>
+ <KEYWORD3>emd6</KEYWORD3>
+
+ <!-- /PLOPTS command -->
+ <KEYWORD3>leg1</KEYWORD3>
+ <KEYWORD3>leg2</KEYWORD3>
+ <KEYWORD3>info</KEYWORD3>
+ <KEYWORD3>frame</KEYWORD3>
+ <KEYWORD3>title</KEYWORD3>
+ <KEYWORD3>minm</KEYWORD3>
+ <KEYWORD3>logo</KEYWORD3>
+ <KEYWORD3>wins</KEYWORD3>
+ <KEYWORD3>wp</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+ <KEYWORD3>auto</KEYWORD3>
+
+ <!-- PLOT command -->
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- PLPAGM command -->
+ <KEYWORD3>node</KEYWORD3>
+
+ <!-- PLPATH command -->
+ <KEYWORD3>xg</KEYWORD3>
+ <KEYWORD3>yg</KEYWORD3>
+ <KEYWORD3>zg</KEYWORD3>
+ <KEYWORD3>s</KEYWORD3>
+
+ <!-- PLSECT command -->
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>x</KEYWORD3>
+ <KEYWORD3>y</KEYWORD3>
+ <KEYWORD3>z</KEYWORD3>
+ <KEYWORD3>xy</KEYWORD3>
+ <KEYWORD3>yz</KEYWORD3>
+ <KEYWORD3>xz</KEYWORD3>
+ <KEYWORD3>int</KEYWORD3>
+ <KEYWORD3>eqv</KEYWORD3>
+
+ <!-- PLTRAC command -->
+ <KEYWORD3>fluid</KEYWORD3>
+ <KEYWORD3>elec</KEYWORD3>
+ <KEYWORD3>magn</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>v</KEYWORD3>
+ <KEYWORD3>x</KEYWORD3>
+ <KEYWORD3>y</KEYWORD3>
+ <KEYWORD3>z</KEYWORD3>
+ <KEYWORD3>sum</KEYWORD3>
+ <KEYWORD3>enke</KEYWORD3>
+ <KEYWORD3>ends</KEYWORD3>
+ <KEYWORD3>ttot</KEYWORD3>
+ <KEYWORD3>cond</KEYWORD3>
+ <KEYWORD3>pcoe</KEYWORD3>
+ <KEYWORD3>ptot</KEYWORD3>
+ <KEYWORD3>mach</KEYWORD3>
+ <KEYWORD3>strm</KEYWORD3>
+ <KEYWORD3>dens</KEYWORD3>
+ <KEYWORD3>visc</KEYWORD3>
+ <KEYWORD3>spht</KEYWORD3>
+ <KEYWORD3>evis</KEYWORD3>
+ <KEYWORD3>cmuv</KEYWORD3>
+ <KEYWORD3>econ</KEYWORD3>
+ <KEYWORD3>volt</KEYWORD3>
+
+ <!-- PLVECT command -->
+ <KEYWORD3>rast</KEYWORD3>
+ <KEYWORD3>vect</KEYWORD3>
+ <KEYWORD3>elem</KEYWORD3>
+ <KEYWORD3>node</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+ <KEYWORD3>u</KEYWORD3>
+ <KEYWORD3>rot</KEYWORD3>
+ <KEYWORD3>v</KEYWORD3>
+ <KEYWORD3>,a</KEYWORD3>
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>epto</KEYWORD3>
+ <KEYWORD3>epel</KEYWORD3>
+ <KEYWORD3>eppl</KEYWORD3>
+ <KEYWORD3>epcr</KEYWORD3>
+ <KEYWORD3>epth</KEYWORD3>
+ <KEYWORD3>tg</KEYWORD3>
+ <KEYWORD3>tf</KEYWORD3>
+ <KEYWORD3>pg</KEYWORD3>
+ <KEYWORD3>ef</KEYWORD3>
+ <KEYWORD3>,d</KEYWORD3>
+ <KEYWORD3>h</KEYWORD3>
+ <KEYWORD3>b</KEYWORD3>
+ <KEYWORD3>fmag</KEYWORD3>
+ <KEYWORD3>js</KEYWORD3>
+ <KEYWORD3>jt</KEYWORD3>
+
+ <!-- PMAP command -->
+ <KEYWORD3>uniform</KEYWORD3>
+ <KEYWORD3>accurate</KEYWORD3>
+
+ <!-- /PMETH command -->
+ <KEYWORD3>on</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+
+ <!-- /PNUM command -->
+ <KEYWORD3>node</KEYWORD3>
+ <KEYWORD3>elem</KEYWORD3>
+ <KEYWORD3>,mat</KEYWORD3>
+ <KEYWORD3>,type</KEYWORD3>
+ <KEYWORD3>,real</KEYWORD3>
+ <KEYWORD3>,esys</KEYWORD3>
+ <KEYWORD3>loc</KEYWORD3>
+ <KEYWORD3>kp</KEYWORD3>
+ <KEYWORD3>line</KEYWORD3>
+ <KEYWORD3>area</KEYWORD3>
+ <KEYWORD3>volu</KEYWORD3>
+ <KEYWORD3>sval</KEYWORD3>
+ <KEYWORD3>tabnam</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+
+ <!-- POPT command -->
+ <KEYWORD3>b31.1</KEYWORD3>
+ <KEYWORD3>nc</KEYWORD3>
+
+ <!-- PORTOPT command -->
+ <KEYWORD3>coax</KEYWORD3>
+ <KEYWORD3>te10</KEYWORD3>
+ <KEYWORD3>te11circ</KEYWORD3>
+ <KEYWORD3>tm01circ</KEYWORD3>
+
+ <!-- PPATH command -->
+ <KEYWORD3>pick</KEYWORD3>
+
+ <!-- PRED command -->
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+
+ <!-- PRESOL command -->
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>epto</KEYWORD3>
+ <KEYWORD3>epel</KEYWORD3>
+ <KEYWORD3>eppl</KEYWORD3>
+ <KEYWORD3>epcr</KEYWORD3>
+ <KEYWORD3>epsw</KEYWORD3>
+ <KEYWORD3>nl</KEYWORD3>
+ <KEYWORD3>cont</KEYWORD3>
+ <KEYWORD3>tg</KEYWORD3>
+ <KEYWORD3>tf</KEYWORD3>
+ <KEYWORD3>pg</KEYWORD3>
+ <KEYWORD3>ef</KEYWORD3>
+ <KEYWORD3>,d</KEYWORD3>
+ <KEYWORD3>h</KEYWORD3>
+ <KEYWORD3>b</KEYWORD3>
+ <KEYWORD3>fmag</KEYWORD3>
+ <KEYWORD3>,f</KEYWORD3>
+ <KEYWORD3>,m</KEYWORD3>
+ <KEYWORD3>heat</KEYWORD3>
+ <KEYWORD3>flow</KEYWORD3>
+ <KEYWORD3>amps</KEYWORD3>
+ <KEYWORD3>flux</KEYWORD3>
+ <KEYWORD3>vf</KEYWORD3>
+ <KEYWORD3>csg</KEYWORD3>
+ <KEYWORD3>forc</KEYWORD3>
+ <KEYWORD3>bfe</KEYWORD3>
+ <KEYWORD3>elem</KEYWORD3>
+ <KEYWORD3>serr</KEYWORD3>
+ <KEYWORD3>sdsg</KEYWORD3>
+ <KEYWORD3>terr</KEYWORD3>
+ <KEYWORD3>tdsg</KEYWORD3>
+ <KEYWORD3>sene</KEYWORD3>
+ <KEYWORD3>tene</KEYWORD3>
+ <KEYWORD3>kene</KEYWORD3>
+ <KEYWORD3>jheat</KEYWORD3>
+ <KEYWORD3>js</KEYWORD3>
+ <KEYWORD3>jt</KEYWORD3>
+ <KEYWORD3>mre</KEYWORD3>
+ <KEYWORD3>volu</KEYWORD3>
+ <KEYWORD3>cent</KEYWORD3>
+ <KEYWORD3>smisc</KEYWORD3>
+ <KEYWORD3>nmisc</KEYWORD3>
+ <KEYWORD3>topo</KEYWORD3>
+
+ <!-- PRNLD, PRRFOR, PRRSOL commands -->
+ <KEYWORD3>fx</KEYWORD3>
+ <KEYWORD3>fy</KEYWORD3>
+ <KEYWORD3>fz</KEYWORD3>
+ <KEYWORD3>,f</KEYWORD3>
+ <KEYWORD3>mx</KEYWORD3>
+ <KEYWORD3>ym</KEYWORD3>
+ <KEYWORD3>mz</KEYWORD3>
+ <KEYWORD3>,m</KEYWORD3>
+ <KEYWORD3>heat</KEYWORD3>
+ <KEYWORD3>flow</KEYWORD3>
+ <KEYWORD3>vfx</KEYWORD3>
+ <KEYWORD3>vfy</KEYWORD3>
+ <KEYWORD3>vfz</KEYWORD3>
+ <KEYWORD3>vf</KEYWORD3>
+ <KEYWORD3>amps</KEYWORD3>
+ <KEYWORD3>curt</KEYWORD3>
+ <KEYWORD3>vltg</KEYWORD3>
+ <KEYWORD3>flux</KEYWORD3>
+ <KEYWORD3>csgx</KEYWORD3>
+ <KEYWORD3>csgy</KEYWORD3>
+ <KEYWORD3>csgz</KEYWORD3>
+ <KEYWORD3>csg</KEYWORD3>
+
+ <!-- PRNSOL, PRSSOL commands -->
+ <KEYWORD3>u</KEYWORD3>
+ <KEYWORD3>x</KEYWORD3>
+ <KEYWORD3>y</KEYWORD3>
+ <KEYWORD3>z</KEYWORD3>
+ <KEYWORD3>comp</KEYWORD3>
+ <KEYWORD3>rot</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>volt</KEYWORD3>
+ <KEYWORD3>mag</KEYWORD3>
+ <KEYWORD3>v</KEYWORD3>
+ <KEYWORD3>,a</KEYWORD3>
+ <KEYWORD3>curr</KEYWORD3>
+ <KEYWORD3>emf</KEYWORD3>
+ <KEYWORD3>enke</KEYWORD3>
+ <KEYWORD3>ends</KEYWORD3>
+ <KEYWORD3>sp01</KEYWORD3>
+ <KEYWORD3>sp02</KEYWORD3>
+ <KEYWORD3>sp03</KEYWORD3>
+ <KEYWORD3>sp04</KEYWORD3>
+ <KEYWORD3>sp05</KEYWORD3>
+ <KEYWORD3>sp06</KEYWORD3>
+ <KEYWORD3>dof</KEYWORD3>
+
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>comp</KEYWORD3>
+ <KEYWORD3>prin</KEYWORD3>
+ <KEYWORD3>epto</KEYWORD3>
+ <KEYWORD3>epel</KEYWORD3>
+ <KEYWORD3>eppl</KEYWORD3>
+ <KEYWORD3>epcr</KEYWORD3>
+ <KEYWORD3>epth</KEYWORD3>
+ <KEYWORD3>epsw</KEYWORD3>
+ <KEYWORD3>nl</KEYWORD3>
+ <KEYWORD3>cont</KEYWORD3>
+ <KEYWORD3>tg</KEYWORD3>
+ <KEYWORD3>tf</KEYWORD3>
+ <KEYWORD3>pg</KEYWORD3>
+ <KEYWORD3>ef</KEYWORD3>
+ <KEYWORD3>,d</KEYWORD3>
+ <KEYWORD3>h</KEYWORD3>
+ <KEYWORD3>b</KEYWORD3>
+ <KEYWORD3>fmag</KEYWORD3>
+ <KEYWORD3>bfe</KEYWORD3>
+ <KEYWORD3>topo</KEYWORD3>
+
+ <KEYWORD3>ttot</KEYWORD3>
+ <KEYWORD3>hflu</KEYWORD3>
+ <KEYWORD3>hflm</KEYWORD3>
+ <KEYWORD3>cond</KEYWORD3>
+ <KEYWORD3>pcoe</KEYWORD3>
+ <KEYWORD3>ptot</KEYWORD3>
+ <KEYWORD3>mach</KEYWORD3>
+ <KEYWORD3>strm</KEYWORD3>
+ <KEYWORD3>dens</KEYWORD3>
+ <KEYWORD3>visc</KEYWORD3>
+ <KEYWORD3>spht</KEYWORD3>
+ <KEYWORD3>evis</KEYWORD3>
+ <KEYWORD3>cmuv</KEYWORD3>
+ <KEYWORD3>econ</KEYWORD3>
+ <KEYWORD3>yplu</KEYWORD3>
+ <KEYWORD3>tauw</KEYWORD3>
+ <KEYWORD3>lmd</KEYWORD3>
+ <KEYWORD3>emd</KEYWORD3>
+
+ <!-- PRVECT command -->
+ <KEYWORD3>u</KEYWORD3>
+ <KEYWORD3>rot</KEYWORD3>
+ <KEYWORD3>v</KEYWORD3>
+ <KEYWORD3>,a</KEYWORD3>
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>epto</KEYWORD3>
+ <KEYWORD3>epel</KEYWORD3>
+ <KEYWORD3>eppl</KEYWORD3>
+ <KEYWORD3>epcr</KEYWORD3>
+ <KEYWORD3>epth</KEYWORD3>
+ <KEYWORD3>tg</KEYWORD3>
+ <KEYWORD3>tf</KEYWORD3>
+ <KEYWORD3>pg</KEYWORD3>
+ <KEYWORD3>ef</KEYWORD3>
+ <KEYWORD3>,d</KEYWORD3>
+ <KEYWORD3>h</KEYWORD3>
+ <KEYWORD3>b</KEYWORD3>
+ <KEYWORD3>fmag</KEYWORD3>
+ <KEYWORD3>js</KEYWORD3>
+ <KEYWORD3>jt</KEYWORD3>
+
+ <!-- PSCR command -->
+ <KEYWORD3>cmap</KEYWORD3>
+ <KEYWORD3>lwid</KEYWORD3>
+ <KEYWORD3>color</KEYWORD3>
+ <KEYWORD3>tranx</KEYWORD3>
+ <KEYWORD3>trany</KEYWORD3>
+ <KEYWORD3>rotate</KEYWORD3>
+ <KEYWORD3>scale</KEYWORD3>
+ <KEYWORD3>tiff</KEYWORD3>
+ <KEYWORD3>epsi</KEYWORD3>
+
+ <!-- PSDRES command -->
+ <KEYWORD3>disp</KEYWORD3>
+ <KEYWORD3>velo</KEYWORD3>
+ <KEYWORD3>acel</KEYWORD3>
+ <KEYWORD3>rel</KEYWORD3>
+ <KEYWORD3>abs</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+
+ <!-- PSDUNIT command -->
+ <KEYWORD3>disp</KEYWORD3>
+ <KEYWORD3>velo</KEYWORD3>
+ <KEYWORD3>acel</KEYWORD3>
+ <KEYWORD3>accg</KEYWORD3>
+ <KEYWORD3>forc</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+
+ <!-- /PSEARCH command -->
+ <KEYWORD3>off</KEYWORD3>
+
+ <!-- PSEL command -->
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>,r</KEYWORD3>
+ <KEYWORD3>,a</KEYWORD3>
+ <KEYWORD3>u</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>none</KEYWORD3>
+ <KEYWORD3>inv</KEYWORD3>
+
+ <!-- /PSF command -->
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>norm</KEYWORD3>
+ <KEYWORD3>tanx</KEYWORD3>
+ <KEYWORD3>tany</KEYWORD3>
+ <KEYWORD3>conv</KEYWORD3>
+ <KEYWORD3>hcoef</KEYWORD3>
+ <KEYWORD3>tbulk</KEYWORD3>
+ <KEYWORD3>rad</KEYWORD3>
+ <KEYWORD3>emis</KEYWORD3>
+ <KEYWORD3>tamb</KEYWORD3>
+ <KEYWORD3>hflux</KEYWORD3>
+ <KEYWORD3>fsi</KEYWORD3>
+ <KEYWORD3>impd</KEYWORD3>
+ <KEYWORD3>shld</KEYWORD3>
+ <KEYWORD3>cond</KEYWORD3>
+ <KEYWORD3>mur</KEYWORD3>
+ <KEYWORD3>mxwf</KEYWORD3>
+ <KEYWORD3>inf</KEYWORD3>
+ <KEYWORD3>chrgs</KEYWORD3>
+ <KEYWORD3>mci</KEYWORD3>
+
+ <!-- PSOLVE command -->
+ <KEYWORD3>cgsol</KEYWORD3>
+ <KEYWORD3>eigdamp</KEYWORD3>
+ <KEYWORD3>eigexp</KEYWORD3>
+ <KEYWORD3>eigfull</KEYWORD3>
+ <KEYWORD3>eigreduc</KEYWORD3>
+ <KEYWORD3>eigunsym</KEYWORD3>
+ <KEYWORD3>elform</KEYWORD3>
+ <KEYWORD3>elprep</KEYWORD3>
+ <KEYWORD3>redwrite</KEYWORD3>
+ <KEYWORD3>triang</KEYWORD3>
+
+ <!-- PSPRNG command -->
+ <KEYWORD3>tran</KEYWORD3>
+ <KEYWORD3>rot</KEYWORD3>
+
+ <!-- PSTRES command -->
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+
+ <!-- /PSYMB command -->
+ <KEYWORD3>cs</KEYWORD3>
+ <KEYWORD3>ndir</KEYWORD3>
+ <KEYWORD3>,esys</KEYWORD3>
+ <KEYWORD3>ldir</KEYWORD3>
+ <KEYWORD3>layr</KEYWORD3>
+ <KEYWORD3>pcon</KEYWORD3>
+ <KEYWORD3>econ</KEYWORD3>
+ <KEYWORD3>dot</KEYWORD3>
+ <KEYWORD3>xnod</KEYWORD3>
+ <KEYWORD3>defa</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+
+ <!-- PTEMP command -->
+ <KEYWORD3>none</KEYWORD3>
+
+ <!-- PTXY command -->
+ <KEYWORD3>stat</KEYWORD3>
+ <KEYWORD3>dele</KEYWORD3>
+
+ <!-- PUNIT command -->
+ <KEYWORD3>ftin</KEYWORD3>
+ <KEYWORD3>metric</KEYWORD3>
+
+ <!-- PVECT command -->
+ <KEYWORD3>norm</KEYWORD3>
+ <KEYWORD3>tang</KEYWORD3>
+ <KEYWORD3>radi</KEYWORD3>
+
+ <!-- QUAD command -->
+ <KEYWORD3>p</KEYWORD3>
+
+ <!-- /RATIO command -->
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- RBE3 command -->
+ <KEYWORD3>ux</KEYWORD3>
+ <KEYWORD3>uy</KEYWORD3>
+ <KEYWORD3>uz</KEYWORD3>
+ <KEYWORD3>rotx</KEYWORD3>
+ <KEYWORD3>roty</KEYWORD3>
+ <KEYWORD3>rotz</KEYWORD3>
+ <KEYWORD3>uxyz</KEYWORD3>
+ <KEYWORD3>rxyz</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- RDELE command -->
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- /REPLOT command -->
+ <KEYWORD3>resize</KEYWORD3>
+ <KEYWORD3>fast</KEYWORD3>
+
+ <!-- REXPORT command -->
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>dyna</KEYWORD3>
+
+ <!-- RFORCE command -->
+ <KEYWORD3>p</KEYWORD3>
+ <KEYWORD3>,f</KEYWORD3>
+ <KEYWORD3>x</KEYWORD3>
+ <KEYWORD3>y</KEYWORD3>
+ <KEYWORD3>z</KEYWORD3>
+ <KEYWORD3>,m</KEYWORD3>
+ <KEYWORD3>heat</KEYWORD3>
+ <KEYWORD3>flow</KEYWORD3>
+ <KEYWORD3>amps</KEYWORD3>
+ <KEYWORD3>flux</KEYWORD3>
+ <KEYWORD3>vf</KEYWORD3>
+ <KEYWORD3>csg</KEYWORD3>
+ <KEYWORD3>vltg</KEYWORD3>
+ <KEYWORD3>durt</KEYWORD3>
+
+ <!-- /RGB command -->
+ <KEYWORD3>index</KEYWORD3>
+ <KEYWORD3>cntr</KEYWORD3>
+
+ <!-- RIGID command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>ux</KEYWORD3>
+ <KEYWORD3>uy</KEYWORD3>
+ <KEYWORD3>uz</KEYWORD3>
+ <KEYWORD3>rotx</KEYWORD3>
+ <KEYWORD3>roty</KEYWORD3>
+ <KEYWORD3>rotz</KEYWORD3>
+ <KEYWORD3>none</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- RIMPORT command -->
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>dyna</KEYWORD3>
+ <KEYWORD3>elem</KEYWORD3>
+ <KEYWORD3>stress</KEYWORD3>
+
+ <!-- RLIST command -->
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- RSYS command -->
+ <KEYWORD3>solu</KEYWORD3>
+
+ <!-- SARPLOT command -->
+ <KEYWORD3>factor</KEYWORD3>
+ <KEYWORD3>area</KEYWORD3>
+ <KEYWORD3>narrow</KEYWORD3>
+
+ <!-- /SECLIB command -->
+ <KEYWORD3>read</KEYWORD3>
+ <KEYWORD3>status</KEYWORD3>
+
+ <!-- SECOFFSET command -->
+ <KEYWORD3>cent</KEYWORD3>
+ <KEYWORD3>shrc</KEYWORD3>
+ <KEYWORD3>origin</KEYWORD3>
+ <KEYWORD3>user</KEYWORD3>
+
+ <!-- SECREAD, SECWRITE commands -->
+ <KEYWORD3>library</KEYWORD3>
+ <KEYWORD3>mesh</KEYWORD3>
+
+ <!-- SECTYPE command -->
+ <KEYWORD3>beam</KEYWORD3>
+ <KEYWORD3>rect</KEYWORD3>
+ <KEYWORD3>quad</KEYWORD3>
+ <KEYWORD3>csolid</KEYWORD3>
+ <KEYWORD3>ctube</KEYWORD3>
+ <KEYWORD3>chan</KEYWORD3>
+ <KEYWORD3>i</KEYWORD3>
+ <KEYWORD3>z</KEYWORD3>
+ <KEYWORD3>,l</KEYWORD3>
+ <KEYWORD3>t</KEYWORD3>
+ <KEYWORD3>hats</KEYWORD3>
+ <KEYWORD3>hrec</KEYWORD3>
+ <KEYWORD3>asec</KEYWORD3>
+ <KEYWORD3>mesh</KEYWORD3>
+
+ <!-- SEDLIST command -->
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- SEEXP command -->
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+
+ <!-- /SEG command -->
+ <KEYWORD3>singl</KEYWORD3>
+ <KEYWORD3>multi</KEYWORD3>
+ <KEYWORD3>delet</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+ <KEYWORD3>pc</KEYWORD3>
+
+ <!-- SESYMM command -->
+ <KEYWORD3>x</KEYWORD3>
+ <KEYWORD3>y</KEYWORD3>
+ <KEYWORD3>z</KEYWORD3>
+
+ <!-- *SET command -->
+
+ <!-- SET command -->
+ <KEYWORD3>first</KEYWORD3>
+ <KEYWORD3>last</KEYWORD3>
+ <KEYWORD3>next</KEYWORD3>
+ <KEYWORD3>near</KEYWORD3>
+ <KEYWORD3>list</KEYWORD3>
+ <KEYWORD3>none</KEYWORD3>
+
+ <!-- SF command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>conv</KEYWORD3>
+ <KEYWORD3>hflux</KEYWORD3>
+ <KEYWORD3>rad</KEYWORD3>
+ <KEYWORD3>fsi</KEYWORD3>
+ <KEYWORD3>impd</KEYWORD3>
+ <KEYWORD3>ptot</KEYWORD3>
+ <KEYWORD3>mxwf</KEYWORD3>
+ <KEYWORD3>mci</KEYWORD3>
+ <KEYWORD3>chrgs</KEYWORD3>
+ <KEYWORD3>inf</KEYWORD3>
+ <KEYWORD3>port</KEYWORD3>
+ <KEYWORD3>shld</KEYWORD3>
+
+ <!-- SFA command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>conv</KEYWORD3>
+ <KEYWORD3>hflux</KEYWORD3>
+ <KEYWORD3>rad</KEYWORD3>
+ <KEYWORD3>fsi</KEYWORD3>
+ <KEYWORD3>impd</KEYWORD3>
+ <KEYWORD3>mxwf</KEYWORD3>
+ <KEYWORD3>mci</KEYWORD3>
+ <KEYWORD3>mxwf</KEYWORD3>
+ <KEYWORD3>chrgs</KEYWORD3>
+ <KEYWORD3>inf</KEYWORD3>
+ <KEYWORD3>port</KEYWORD3>
+ <KEYWORD3>shld</KEYWORD3>
+
+ <!-- SFACT command -->
+ <KEYWORD3>,sf</KEYWORD3>
+ <KEYWORD3>ms</KEYWORD3>
+
+ <!-- SFADELE, SFALIST, SFBEAM commands -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+
+ <!-- SFCUM command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>conv</KEYWORD3>
+ <KEYWORD3>hflux</KEYWORD3>
+ <KEYWORD3>selv</KEYWORD3>
+ <KEYWORD3>chrgs</KEYWORD3>
+ <KEYWORD3>mxwf</KEYWORD3>
+ <KEYWORD3>inf</KEYWORD3>
+ <KEYWORD3>repl</KEYWORD3>
+ <KEYWORD3>add</KEYWORD3>
+ <KEYWORD3>igno</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+
+ <!-- SFDELE command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>conv</KEYWORD3>
+ <KEYWORD3>hflux</KEYWORD3>
+ <KEYWORD3>rad</KEYWORD3>
+ <KEYWORD3>mxwf</KEYWORD3>
+ <KEYWORD3>chrgs</KEYWORD3>
+ <KEYWORD3>mci</KEYWORD3>
+ <KEYWORD3>inf</KEYWORD3>
+ <KEYWORD3>selv</KEYWORD3>
+ <KEYWORD3>fsi</KEYWORD3>
+ <KEYWORD3>impd</KEYWORD3>
+ <KEYWORD3>port</KEYWORD3>
+ <KEYWORD3>shld</KEYWORD3>
+
+ <!-- SFE, SFEDELE, SFELIST commands -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>conv</KEYWORD3>
+ <KEYWORD3>hflux</KEYWORD3>
+ <KEYWORD3>rad</KEYWORD3>
+ <KEYWORD3>mxwf</KEYWORD3>
+ <KEYWORD3>chrgs</KEYWORD3>
+ <KEYWORD3>mci</KEYWORD3>
+ <KEYWORD3>inf</KEYWORD3>
+ <KEYWORD3>selv</KEYWORD3>
+ <KEYWORD3>fsi</KEYWORD3>
+ <KEYWORD3>impd</KEYWORD3>
+ <KEYWORD3>port</KEYWORD3>
+ <KEYWORD3>shld</KEYWORD3>
+
+ <!-- SFFUN, SFGRAD commands -->
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>conv</KEYWORD3>
+ <KEYWORD3>hflux</KEYWORD3>
+ <KEYWORD3>chrgs</KEYWORD3>
+ <KEYWORD3>status</KEYWORD3>
+ <KEYWORD3>x</KEYWORD3>
+ <KEYWORD3>y</KEYWORD3>
+ <KEYWORD3>z</KEYWORD3>
+
+ <!-- SFL, SFLDELE, SFLIST, SFLLIST, SFSCALE commands -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>conv</KEYWORD3>
+ <KEYWORD3>hflux</KEYWORD3>
+ <KEYWORD3>rad</KEYWORD3>
+ <KEYWORD3>fsi</KEYWORD3>
+ <KEYWORD3>impd</KEYWORD3>
+ <KEYWORD3>mci</KEYWORD3>
+ <KEYWORD3>mxwf</KEYWORD3>
+ <KEYWORD3>chrgs</KEYWORD3>
+ <KEYWORD3>inf</KEYWORD3>
+ <KEYWORD3>port</KEYWORD3>
+ <KEYWORD3>shdl</KEYWORD3>
+ <KEYWORD3>selv</KEYWORD3>
+
+ <!-- /SHADE command -->
+ <KEYWORD3>facet</KEYWORD3>
+ <KEYWORD3>gouraud</KEYWORD3>
+ <KEYWORD3>phong</KEYWORD3>
+
+ <!-- SHELL command -->
+ <KEYWORD3>top</KEYWORD3>
+ <KEYWORD3>mid</KEYWORD3>
+ <KEYWORD3>bot</KEYWORD3>
+
+ <!-- /SHOW command -->
+ <KEYWORD3>term</KEYWORD3>
+ <KEYWORD3>file</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>pscr</KEYWORD3>
+ <KEYWORD3>hpgl</KEYWORD3>
+ <KEYWORD3>hpgl2</KEYWORD3>
+ <KEYWORD3>vrml</KEYWORD3>
+
+ <!-- /SHOWDISP command -->
+ <KEYWORD3>hpgl</KEYWORD3>
+ <KEYWORD3>hpgl2</KEYWORD3>
+ <KEYWORD3>interleaf</KEYWORD3>
+ <KEYWORD3>postscript</KEYWORD3>
+ <KEYWORD3>dump</KEYWORD3>
+
+ <!-- SHPP command -->
+ <KEYWORD3>on</KEYWORD3>
+ <KEYWORD3>warn</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>silent</KEYWORD3>
+ <KEYWORD3>status</KEYWORD3>
+ <KEYWORD3>summary</KEYWORD3>
+ <KEYWORD3>default</KEYWORD3>
+ <KEYWORD3>object</KEYWORD3>
+ <KEYWORD3>modify</KEYWORD3>
+ <KEYWORD3>angd</KEYWORD3>
+ <KEYWORD3>aspect</KEYWORD3>
+ <KEYWORD3>paral</KEYWORD3>
+ <KEYWORD3>maxang</KEYWORD3>
+ <KEYWORD3>jacrat</KEYWORD3>
+ <KEYWORD3>warp</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>yes</KEYWORD3>
+ <KEYWORD3>no</KEYWORD3>
+
+ <!-- SLPPLOT, SLSPLOT commands -->
+ <KEYWORD3>factor</KEYWORD3>
+ <KEYWORD3>radius</KEYWORD3>
+ <KEYWORD3>length</KEYWORD3>
+
+ <!-- SMRTSIZE command -->
+ <KEYWORD3>stat</KEYWORD3>
+ <KEYWORD3>defa</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+
+ <!-- SOLCONTROL command -->
+ <KEYWORD3>on</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+
+ <!-- SOLU command -->
+ <KEYWORD3>allf</KEYWORD3>
+ <KEYWORD3>aldlf</KEYWORD3>
+ <KEYWORD3>arcl</KEYWORD3>
+ <KEYWORD3>cnvg</KEYWORD3>
+ <KEYWORD3>crprat</KEYWORD3>
+ <KEYWORD3>cscv</KEYWORD3>
+ <KEYWORD3>cucv</KEYWORD3>
+ <KEYWORD3>dicv</KEYWORD3>
+ <KEYWORD3>dsprm</KEYWORD3>
+ <KEYWORD3>dtime</KEYWORD3>
+ <KEYWORD3>eqit</KEYWORD3>
+ <KEYWORD3>ffcv</KEYWORD3>
+ <KEYWORD3>focv</KEYWORD3>
+ <KEYWORD3>hfcv</KEYWORD3>
+ <KEYWORD3>nc48</KEYWORD3>
+ <KEYWORD3>nc49</KEYWORD3>
+ <KEYWORD3>ncmit</KEYWORD3>
+ <KEYWORD3>ncmls</KEYWORD3>
+ <KEYWORD3>ncmss</KEYWORD3>
+ <KEYWORD3>mfcv</KEYWORD3>
+ <KEYWORD3>mocv</KEYWORD3>
+ <KEYWORD3>mxdvl</KEYWORD3>
+ <KEYWORD3>prcv</KEYWORD3>
+ <KEYWORD3>psinc</KEYWORD3>
+ <KEYWORD3>resfrq</KEYWORD3>
+ <KEYWORD3>reseig</KEYWORD3>
+ <KEYWORD3>rocv</KEYWORD3>
+ <KEYWORD3>smcv</KEYWORD3>
+ <KEYWORD3>tecv</KEYWORD3>
+ <KEYWORD3>vecv</KEYWORD3>
+ <KEYWORD3>vocv</KEYWORD3>
+ <KEYWORD3>vmcv</KEYWORD3>
+
+ <!-- SPOPT command -->
+ <KEYWORD3>sprs</KEYWORD3>
+ <KEYWORD3>mprs</KEYWORD3>
+ <KEYWORD3>ddam</KEYWORD3>
+ <KEYWORD3>psd</KEYWORD3>
+ <KEYWORD3>no</KEYWORD3>
+ <KEYWORD3>yes</KEYWORD3>
+
+ <!-- SRSS command -->
+ <KEYWORD3>disp</KEYWORD3>
+ <KEYWORD3>velo</KEYWORD3>
+ <KEYWORD3>acel</KEYWORD3>
+
+ <!-- /SSCALE command -->
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- SSTIF command -->
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+
+ <!-- *STATUS command -->
+ <KEYWORD3>argx</KEYWORD3>
+
+ <!-- /STATUS command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>title</KEYWORD3>
+ <KEYWORD3>units</KEYWORD3>
+ <KEYWORD3>mem</KEYWORD3>
+ <KEYWORD3>db</KEYWORD3>
+ <KEYWORD3>config</KEYWORD3>
+ <KEYWORD3>global</KEYWORD3>
+ <KEYWORD3>solu</KEYWORD3>
+ <KEYWORD3>phys</KEYWORD3>
+
+ <!-- STORE command -->
+ <KEYWORD3>merge</KEYWORD3>
+ <KEYWORD3>new</KEYWORD3>
+ <KEYWORD3>appen</KEYWORD3>
+ <KEYWORD3>alloc</KEYWORD3>
+ <KEYWORD3>psd</KEYWORD3>
+
+ <!-- SUBOPT command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>part</KEYWORD3>
+ <KEYWORD3>none</KEYWORD3>
+
+ <!-- SUBSET command -->
+ <KEYWORD3>first</KEYWORD3>
+ <KEYWORD3>last</KEYWORD3>
+ <KEYWORD3>next</KEYWORD3>
+ <KEYWORD3>near</KEYWORD3>
+ <KEYWORD3>list</KEYWORD3>
+ <KEYWORD3>velo</KEYWORD3>
+ <KEYWORD3>acel</KEYWORD3>
+
+ <!-- SUMTYPE command -->
+ <KEYWORD3>comp</KEYWORD3>
+ <KEYWORD3>prin</KEYWORD3>
+
+ <!-- TB command -->
+ <KEYWORD3>bkin</KEYWORD3>
+ <KEYWORD3>mkin</KEYWORD3>
+ <KEYWORD3>miso</KEYWORD3>
+ <KEYWORD3>biso</KEYWORD3>
+ <KEYWORD3>aniso</KEYWORD3>
+ <KEYWORD3>dp</KEYWORD3>
+ <KEYWORD3>melas</KEYWORD3>
+ <KEYWORD3>user</KEYWORD3>
+ <KEYWORD3>kinh</KEYWORD3>
+ <KEYWORD3>anand</KEYWORD3>
+ <KEYWORD3>creep</KEYWORD3>
+ <KEYWORD3>swell</KEYWORD3>
+ <KEYWORD3>bh</KEYWORD3>
+ <KEYWORD3>piez</KEYWORD3>
+ <KEYWORD3>fail</KEYWORD3>
+ <KEYWORD3>mooney</KEYWORD3>
+ <KEYWORD3>water</KEYWORD3>
+ <KEYWORD3>anel</KEYWORD3>
+ <KEYWORD3>concr</KEYWORD3>
+ <KEYWORD3>hflm</KEYWORD3>
+ <KEYWORD3>fcon</KEYWORD3>
+ <KEYWORD3>pflow</KEYWORD3>
+ <KEYWORD3>evisc</KEYWORD3>
+ <KEYWORD3>plaw</KEYWORD3>
+ <KEYWORD3>foam</KEYWORD3>
+ <KEYWORD3>honey</KEYWORD3>
+ <KEYWORD3>comp</KEYWORD3>
+ <KEYWORD3>nl</KEYWORD3>
+ <KEYWORD3>eos</KEYWORD3>
+
+ <!-- TBDELE, TBLIST commands -->
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- TBPLOT command -->
+ <KEYWORD3>mkin</KEYWORD3>
+ <KEYWORD3>kinh</KEYWORD3>
+ <KEYWORD3>melas</KEYWORD3>
+ <KEYWORD3>miso</KEYWORD3>
+ <KEYWORD3>bkin</KEYWORD3>
+ <KEYWORD3>biso</KEYWORD3>
+ <KEYWORD3>bh</KEYWORD3>
+ <KEYWORD3>nb</KEYWORD3>
+ <KEYWORD3>mh</KEYWORD3>
+ <KEYWORD3>sbh</KEYWORD3>
+ <KEYWORD3>snb</KEYWORD3>
+ <KEYWORD3>smh</KEYWORD3>
+
+ <!-- TBPT command -->
+ <KEYWORD3>defi</KEYWORD3>
+ <KEYWORD3>dele</KEYWORD3>
+
+ <!-- TEE command -->
+ <KEYWORD3>wt</KEYWORD3>
+ <KEYWORD3>uft</KEYWORD3>
+
+ <!-- TERM command -->
+ <KEYWORD3>copy</KEYWORD3>
+ <KEYWORD3>loop</KEYWORD3>
+ <KEYWORD3>noprom</KEYWORD3>
+
+ <!-- TIMINT command -->
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>struc</KEYWORD3>
+ <KEYWORD3>therm</KEYWORD3>
+ <KEYWORD3>elect</KEYWORD3>
+ <KEYWORD3>mag</KEYWORD3>
+ <KEYWORD3>fluid</KEYWORD3>
+
+ <!-- TIMP command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+
+ <!-- TRANSFER command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+
+ <!-- /TRIAD command -->
+ <KEYWORD3>orig</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>lbot</KEYWORD3>
+ <KEYWORD3>rbot</KEYWORD3>
+ <KEYWORD3>ltop</KEYWORD3>
+ <KEYWORD3>rtop</KEYWORD3>
+
+ <!-- /TRLCY command -->
+ <KEYWORD3>elem</KEYWORD3>
+ <KEYWORD3>area</KEYWORD3>
+ <KEYWORD3>volu</KEYWORD3>
+ <KEYWORD3>isurf</KEYWORD3>
+ <KEYWORD3>cm</KEYWORD3>
+ <KEYWORD3>curve</KEYWORD3>
+
+ <!-- TRNOPT command -->
+ <KEYWORD3>full</KEYWORD3>
+ <KEYWORD3>reduc</KEYWORD3>
+ <KEYWORD3>msup</KEYWORD3>
+ <KEYWORD3>damp</KEYWORD3>
+ <KEYWORD3>nodamp</KEYWORD3>
+
+ <!-- TRPDEL, TRPLIS, TRPOIN commands -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+
+ <!-- TSHAP command -->
+ <KEYWORD3>iine</KEYWORD3>
+ <KEYWORD3>line</KEYWORD3>
+ <KEYWORD3>para</KEYWORD3>
+ <KEYWORD3>arc</KEYWORD3>
+ <KEYWORD3>carc</KEYWORD3>
+ <KEYWORD3>circ</KEYWORD3>
+ <KEYWORD3>tria</KEYWORD3>
+ <KEYWORD3>tri6</KEYWORD3>
+ <KEYWORD3>quad</KEYWORD3>
+ <KEYWORD3>qua8</KEYWORD3>
+ <KEYWORD3>cyli</KEYWORD3>
+ <KEYWORD3>cone</KEYWORD3>
+ <KEYWORD3>sphe</KEYWORD3>
+ <KEYWORD3>pilo</KEYWORD3>
+
+ <!-- /TYPE command -->
+ <KEYWORD3>basic</KEYWORD3>
+ <KEYWORD3>sect</KEYWORD3>
+ <KEYWORD3>hidc</KEYWORD3>
+ <KEYWORD3>hidd</KEYWORD3>
+ <KEYWORD3>hidp</KEYWORD3>
+ <KEYWORD3>cap</KEYWORD3>
+ <KEYWORD3>zbuf</KEYWORD3>
+ <KEYWORD3>zcap</KEYWORD3>
+ <KEYWORD3>zqsl</KEYWORD3>
+ <KEYWORD3>hqsl</KEYWORD3>
+
+ <!-- /UI command -->
+ <KEYWORD3>help</KEYWORD3>
+ <KEYWORD3>view</KEYWORD3>
+ <KEYWORD3>wpse</KEYWORD3>
+ <KEYWORD3>wpvi</KEYWORD3>
+ <KEYWORD3>result</KEYWORD3>
+ <KEYWORD3>query</KEYWORD3>
+ <KEYWORD3>copy</KEYWORD3>
+ <KEYWORD3>anno</KEYWORD3>
+ <KEYWORD3>select</KEYWORD3>
+ <KEYWORD3>,nsel</KEYWORD3>
+ <KEYWORD3>,esel</KEYWORD3>
+ <KEYWORD3>,ksel</KEYWORD3>
+ <KEYWORD3>,lsel</KEYWORD3>
+ <KEYWORD3>,asel</KEYWORD3>
+ <KEYWORD3>,vsel</KEYWORD3>
+ <KEYWORD3>refresh</KEYWORD3>
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>,r</KEYWORD3>
+ <KEYWORD3>,a</KEYWORD3>
+ <KEYWORD3>u</KEYWORD3>
+ <KEYWORD3>node</KEYWORD3>
+ <KEYWORD3>element</KEYWORD3>
+ <KEYWORD3>grid</KEYWORD3>
+ <KEYWORD3>format</KEYWORD3>
+ <KEYWORD3>pscr</KEYWORD3>
+ <KEYWORD3>tiff</KEYWORD3>
+ <KEYWORD3>epsi</KEYWORD3>
+ <KEYWORD3>bmp</KEYWORD3>
+ <KEYWORD3>wmf</KEYWORD3>
+ <KEYWORD3>emf</KEYWORD3>
+ <KEYWORD3>screen</KEYWORD3>
+ <KEYWORD3>full</KEYWORD3>
+ <KEYWORD3>graph</KEYWORD3>
+ <KEYWORD3>color</KEYWORD3>
+ <KEYWORD3>mono</KEYWORD3>
+ <KEYWORD3>grey</KEYWORD3>
+ <KEYWORD3>krev</KEYWORD3>
+ <KEYWORD3>norm</KEYWORD3>
+ <KEYWORD3>reverse</KEYWORD3>
+ <KEYWORD3>orient</KEYWORD3>
+ <KEYWORD3>landscape</KEYWORD3>
+ <KEYWORD3>portrait</KEYWORD3>
+ <KEYWORD3>compress</KEYWORD3>
+ <KEYWORD3>yes</KEYWORD3>
+ <KEYWORD3>no</KEYWORD3>
+
+ <!-- /UIS command -->
+ <KEYWORD3>msgpop</KEYWORD3>
+ <KEYWORD3>replot</KEYWORD3>
+ <KEYWORD3>abort</KEYWORD3>
+ <KEYWORD3>dyna</KEYWORD3>
+ <KEYWORD3>pick</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+ <KEYWORD3>defa</KEYWORD3>
+
+ <!-- /UNITS command -->
+ <KEYWORD3>user</KEYWORD3>
+ <KEYWORD3>si</KEYWORD3>
+ <KEYWORD3>cgs</KEYWORD3>
+ <KEYWORD3>bft</KEYWORD3>
+ <KEYWORD3>bin</KEYWORD3>
+
+ <!-- UPCOORD command -->
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+
+ <!-- /USER command -->
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- USRCAL command -->
+ <KEYWORD3>usrefl</KEYWORD3>
+ <KEYWORD3>userfl</KEYWORD3>
+ <KEYWORD3>usercv</KEYWORD3>
+ <KEYWORD3>userpr</KEYWORD3>
+ <KEYWORD3>userfx</KEYWORD3>
+ <KEYWORD3>userch</KEYWORD3>
+ <KEYWORD3>userfd</KEYWORD3>
+ <KEYWORD3>userou</KEYWORD3>
+ <KEYWORD3>usermc</KEYWORD3>
+ <KEYWORD3>usolbeg</KEYWORD3>
+ <KEYWORD3>uldbeg</KEYWORD3>
+ <KEYWORD3>ussbeg</KEYWORD3>
+ <KEYWORD3>uitbeg</KEYWORD3>
+ <KEYWORD3>uitfin</KEYWORD3>
+ <KEYWORD3>ussfin</KEYWORD3>
+ <KEYWORD3>uldfin</KEYWORD3>
+ <KEYWORD3>usolfin</KEYWORD3>
+ <KEYWORD3>uanbeg</KEYWORD3>
+ <KEYWORD3>uanfin</KEYWORD3>
+ <KEYWORD3>uelmatx</KEYWORD3>
+
+ <!-- VA, VADD, VCLEAR, /VCONE, VCVFILL, VDELE, VDGL, VDRAG, VEXT commands -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+
+ <!-- *VFILL command -->
+ <KEYWORD3>data</KEYWORD3>
+ <KEYWORD3>ramp</KEYWORD3>
+ <KEYWORD3>rand</KEYWORD3>
+ <KEYWORD3>gdis</KEYWORD3>
+ <KEYWORD3>tria</KEYWORD3>
+ <KEYWORD3>beta</KEYWORD3>
+ <KEYWORD3>gamm</KEYWORD3>
+
+ <!-- *VFUN command -->
+ <KEYWORD3>acos</KEYWORD3>
+ <KEYWORD3>asin</KEYWORD3>
+ <KEYWORD3>asort</KEYWORD3>
+ <KEYWORD3>atan</KEYWORD3>
+ <KEYWORD3>comp</KEYWORD3>
+ <KEYWORD3>copy</KEYWORD3>
+ <KEYWORD3>cos</KEYWORD3>
+ <KEYWORD3>cosh</KEYWORD3>
+ <KEYWORD3>dircos</KEYWORD3>
+ <KEYWORD3>dsort</KEYWORD3>
+ <KEYWORD3>euler</KEYWORD3>
+ <KEYWORD3>exp</KEYWORD3>
+ <KEYWORD3>expa</KEYWORD3>
+ <KEYWORD3>log</KEYWORD3>
+ <KEYWORD3>log10</KEYWORD3>
+ <KEYWORD3>nint</KEYWORD3>
+ <KEYWORD3>not</KEYWORD3>
+ <KEYWORD3>pwr</KEYWORD3>
+ <KEYWORD3>sin</KEYWORD3>
+ <KEYWORD3>sinh</KEYWORD3>
+ <KEYWORD3>sqrt</KEYWORD3>
+ <KEYWORD3>tan</KEYWORD3>
+ <KEYWORD3>tanh</KEYWORD3>
+ <KEYWORD3>tang</KEYWORD3>
+ <KEYWORD3>norm</KEYWORD3>
+ <KEYWORD3>local</KEYWORD3>
+ <KEYWORD3>global</KEYWORD3>
+
+ <!-- VGEN command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+
+ <!-- *VGET command -->
+ <KEYWORD3>node</KEYWORD3>
+ <KEYWORD3>loc</KEYWORD3>
+ <KEYWORD3>x</KEYWORD3>
+ <KEYWORD3>y</KEYWORD3>
+ <KEYWORD3>z</KEYWORD3>
+ <KEYWORD3>ang</KEYWORD3>
+ <KEYWORD3>xy</KEYWORD3>
+ <KEYWORD3>yz</KEYWORD3>
+ <KEYWORD3>zx</KEYWORD3>
+ <KEYWORD3>,nsel</KEYWORD3>
+
+ <KEYWORD3>elem</KEYWORD3>
+ <KEYWORD3>cent</KEYWORD3>
+ <KEYWORD3>adj</KEYWORD3>
+ <KEYWORD3>attr</KEYWORD3>
+ <KEYWORD3>geom</KEYWORD3>
+ <KEYWORD3>,esel</KEYWORD3>
+ <KEYWORD3>shpar</KEYWORD3>
+
+ <KEYWORD3>kp</KEYWORD3>
+ <KEYWORD3>div</KEYWORD3>
+ <KEYWORD3>,ksel</KEYWORD3>
+
+ <KEYWORD3>line</KEYWORD3>
+ <KEYWORD3>leng</KEYWORD3>
+ <KEYWORD3>,lsel</KEYWORD3>
+
+ <KEYWORD3>area</KEYWORD3>
+ <KEYWORD3>loop</KEYWORD3>
+ <KEYWORD3>,asel</KEYWORD3>
+
+ <KEYWORD3>volu</KEYWORD3>
+ <KEYWORD3>shell</KEYWORD3>
+ <KEYWORD3>volu</KEYWORD3>
+ <KEYWORD3>,vsel</KEYWORD3>
+
+ <KEYWORD3>cdsy</KEYWORD3>
+
+ <KEYWORD3>rcon</KEYWORD3>
+ <KEYWORD3>const</KEYWORD3>
+
+ <KEYWORD3>const</KEYWORD3>
+ <KEYWORD3>bkin</KEYWORD3>
+ <KEYWORD3>mkin</KEYWORD3>
+ <KEYWORD3>miso</KEYWORD3>
+ <KEYWORD3>biso</KEYWORD3>
+ <KEYWORD3>aniso</KEYWORD3>
+ <KEYWORD3>dp</KEYWORD3>
+ <KEYWORD3>melas</KEYWORD3>
+ <KEYWORD3>user</KEYWORD3>
+ <KEYWORD3>kinh</KEYWORD3>
+ <KEYWORD3>anand</KEYWORD3>
+ <KEYWORD3>creep</KEYWORD3>
+ <KEYWORD3>swell</KEYWORD3>
+ <KEYWORD3>bh</KEYWORD3>
+ <KEYWORD3>piez</KEYWORD3>
+ <KEYWORD3>fail</KEYWORD3>
+ <KEYWORD3>mooney</KEYWORD3>
+ <KEYWORD3>water</KEYWORD3>
+ <KEYWORD3>anel</KEYWORD3>
+ <KEYWORD3>concr</KEYWORD3>
+ <KEYWORD3>hflm</KEYWORD3>
+ <KEYWORD3>fcon</KEYWORD3>
+ <KEYWORD3>pflow</KEYWORD3>
+ <KEYWORD3>evisc</KEYWORD3>
+ <KEYWORD3>plaw</KEYWORD3>
+ <KEYWORD3>foam</KEYWORD3>
+ <KEYWORD3>honey</KEYWORD3>
+ <KEYWORD3>comp</KEYWORD3>
+ <KEYWORD3>nl</KEYWORD3>
+ <KEYWORD3>eos</KEYWORD3>
+
+ <KEYWORD3>u</KEYWORD3>
+ <KEYWORD3>rot</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>volt</KEYWORD3>
+ <KEYWORD3>mag</KEYWORD3>
+ <KEYWORD3>v</KEYWORD3>
+ <KEYWORD3>,a</KEYWORD3>
+ <KEYWORD3>curr</KEYWORD3>
+ <KEYWORD3>emf</KEYWORD3>
+ <KEYWORD3>enke</KEYWORD3>
+ <KEYWORD3>ends</KEYWORD3>
+
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>int</KEYWORD3>
+ <KEYWORD3>eqv</KEYWORD3>
+ <KEYWORD3>epto</KEYWORD3>
+ <KEYWORD3>epel</KEYWORD3>
+ <KEYWORD3>eppl</KEYWORD3>
+ <KEYWORD3>epcr</KEYWORD3>
+ <KEYWORD3>epth</KEYWORD3>
+ <KEYWORD3>epsw</KEYWORD3>
+
+ <KEYWORD3>nl</KEYWORD3>
+ <KEYWORD3>sepl</KEYWORD3>
+ <KEYWORD3>srat</KEYWORD3>
+ <KEYWORD3>hpres</KEYWORD3>
+ <KEYWORD3>epeq</KEYWORD3>
+ <KEYWORD3>psv</KEYWORD3>
+ <KEYWORD3>plwk</KEYWORD3>
+ <KEYWORD3>hs</KEYWORD3>
+ <KEYWORD3>bfe</KEYWORD3>
+ <KEYWORD3>tg</KEYWORD3>
+ <KEYWORD3>tf</KEYWORD3>
+ <KEYWORD3>pg</KEYWORD3>
+ <KEYWORD3>ef</KEYWORD3>
+ <KEYWORD3>,d</KEYWORD3>
+ <KEYWORD3>h</KEYWORD3>
+ <KEYWORD3>b</KEYWORD3>
+ <KEYWORD3>fmag</KEYWORD3>
+
+ <KEYWORD3>ttot</KEYWORD3>
+ <KEYWORD3>hflu</KEYWORD3>
+ <KEYWORD3>hflm</KEYWORD3>
+ <KEYWORD3>cond</KEYWORD3>
+ <KEYWORD3>pcoe</KEYWORD3>
+ <KEYWORD3>ptot</KEYWORD3>
+ <KEYWORD3>mach</KEYWORD3>
+ <KEYWORD3>strm</KEYWORD3>
+ <KEYWORD3>dens</KEYWORD3>
+ <KEYWORD3>visc</KEYWORD3>
+ <KEYWORD3>evis</KEYWORD3>
+ <KEYWORD3>econ</KEYWORD3>
+ <KEYWORD3>yplu</KEYWORD3>
+ <KEYWORD3>tauw</KEYWORD3>
+
+ <KEYWORD3>etab</KEYWORD3>
+
+ <!-- VGLUE, VIMP, VINP, VINV, VLIST, VLSCALE, VMESH, VOFFST commands -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+
+ <!-- /VIEW command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>wp</KEYWORD3>
+
+ <!-- *VOPER command -->
+ <KEYWORD3>add</KEYWORD3>
+ <KEYWORD3>sub</KEYWORD3>
+ <KEYWORD3>mult</KEYWORD3>
+ <KEYWORD3>div</KEYWORD3>
+ <KEYWORD3>min</KEYWORD3>
+ <KEYWORD3>max</KEYWORD3>
+ <KEYWORD3>lt</KEYWORD3>
+ <KEYWORD3>le</KEYWORD3>
+ <KEYWORD3>eq</KEYWORD3>
+ <KEYWORD3>ne</KEYWORD3>
+ <KEYWORD3>ge</KEYWORD3>
+ <KEYWORD3>gt</KEYWORD3>
+ <KEYWORD3>der1</KEYWORD3>
+ <KEYWORD3>der2</KEYWORD3>
+ <KEYWORD3>int1</KEYWORD3>
+ <KEYWORD3>int2</KEYWORD3>
+ <KEYWORD3>dot</KEYWORD3>
+ <KEYWORD3>cross</KEYWORD3>
+ <KEYWORD3>gath</KEYWORD3>
+ <KEYWORD3>scat</KEYWORD3>
+
+ <!-- VOVLAP, VPTN commands -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+
+ <!-- VPLOT command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>dege</KEYWORD3>
+
+ <!-- *VPUT command -->
+ <KEYWORD3>node</KEYWORD3>
+ <KEYWORD3>u</KEYWORD3>
+ <KEYWORD3>x</KEYWORD3>
+ <KEYWORD3>y</KEYWORD3>
+ <KEYWORD3>z</KEYWORD3>
+ <KEYWORD3>rot</KEYWORD3>
+ <KEYWORD3>temp</KEYWORD3>
+ <KEYWORD3>pres</KEYWORD3>
+ <KEYWORD3>volt</KEYWORD3>
+ <KEYWORD3>mag</KEYWORD3>
+ <KEYWORD3>v</KEYWORD3>
+ <KEYWORD3>,a</KEYWORD3>
+ <KEYWORD3>curr</KEYWORD3>
+ <KEYWORD3>emf</KEYWORD3>
+ <KEYWORD3>enke</KEYWORD3>
+ <KEYWORD3>ends</KEYWORD3>
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>xy</KEYWORD3>
+ <KEYWORD3>yz</KEYWORD3>
+ <KEYWORD3>xz</KEYWORD3>
+ <KEYWORD3>int</KEYWORD3>
+ <KEYWORD3>eqv</KEYWORD3>
+ <KEYWORD3>epto</KEYWORD3>
+ <KEYWORD3>epel</KEYWORD3>
+ <KEYWORD3>eppl</KEYWORD3>
+ <KEYWORD3>epcr</KEYWORD3>
+ <KEYWORD3>epth</KEYWORD3>
+ <KEYWORD3>epsw</KEYWORD3>
+ <KEYWORD3>nl</KEYWORD3>
+ <KEYWORD3>sepl</KEYWORD3>
+ <KEYWORD3>srat</KEYWORD3>
+ <KEYWORD3>hpres</KEYWORD3>
+ <KEYWORD3>epeq</KEYWORD3>
+ <KEYWORD3>psv</KEYWORD3>
+ <KEYWORD3>plwk</KEYWORD3>
+ <KEYWORD3>tg</KEYWORD3>
+ <KEYWORD3>tf</KEYWORD3>
+ <KEYWORD3>pg</KEYWORD3>
+ <KEYWORD3>ef</KEYWORD3>
+ <KEYWORD3>,d</KEYWORD3>
+ <KEYWORD3>h</KEYWORD3>
+ <KEYWORD3>b</KEYWORD3>
+ <KEYWORD3>fmag</KEYWORD3>
+ <KEYWORD3>ttot</KEYWORD3>
+ <KEYWORD3>hflu</KEYWORD3>
+ <KEYWORD3>hflm</KEYWORD3>
+ <KEYWORD3>cond</KEYWORD3>
+ <KEYWORD3>pcoe</KEYWORD3>
+ <KEYWORD3>ptot</KEYWORD3>
+ <KEYWORD3>mach</KEYWORD3>
+ <KEYWORD3>strm</KEYWORD3>
+ <KEYWORD3>dens</KEYWORD3>
+ <KEYWORD3>visc</KEYWORD3>
+ <KEYWORD3>evis</KEYWORD3>
+ <KEYWORD3>econ</KEYWORD3>
+ <KEYWORD3>yplu</KEYWORD3>
+ <KEYWORD3>tauw</KEYWORD3>
+
+ <KEYWORD3>elem</KEYWORD3>
+ <KEYWORD3>etab</KEYWORD3>
+
+ <!-- VROTAT command -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+
+ <!-- VSBA, VSBV, VSBW commands -->
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+ <KEYWORD3>sepo</KEYWORD3>
+ <KEYWORD3>delete</KEYWORD3>
+ <KEYWORD3>keep</KEYWORD3>
+
+ <!-- *VSCFUN command -->
+ <KEYWORD3>max</KEYWORD3>
+ <KEYWORD3>min</KEYWORD3>
+ <KEYWORD3>lmax</KEYWORD3>
+ <KEYWORD3>lmin</KEYWORD3>
+ <KEYWORD3>first</KEYWORD3>
+ <KEYWORD3>last</KEYWORD3>
+ <KEYWORD3>sum</KEYWORD3>
+ <KEYWORD3>medi</KEYWORD3>
+ <KEYWORD3>mean</KEYWORD3>
+ <KEYWORD3>vari</KEYWORD3>
+ <KEYWORD3>stdv</KEYWORD3>
+ <KEYWORD3>rms</KEYWORD3>
+ <KEYWORD3>num</KEYWORD3>
+
+ <!-- VSEL, VSLA commands -->
+ <KEYWORD3>s</KEYWORD3>
+ <KEYWORD3>,r</KEYWORD3>
+ <KEYWORD3>,a</KEYWORD3>
+ <KEYWORD3>u</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>none</KEYWORD3>
+ <KEYWORD3>inve</KEYWORD3>
+ <KEYWORD3>stat</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+ <KEYWORD3>volu</KEYWORD3>
+ <KEYWORD3>loc</KEYWORD3>
+ <KEYWORD3>x</KEYWORD3>
+ <KEYWORD3>y</KEYWORD3>
+ <KEYWORD3>z</KEYWORD3>
+ <KEYWORD3>,mat</KEYWORD3>
+ <KEYWORD3>,type</KEYWORD3>
+ <KEYWORD3>,real</KEYWORD3>
+ <KEYWORD3>,esys</KEYWORD3>
+
+ <!-- VSUM command -->
+ <KEYWORD3>default</KEYWORD3>
+ <KEYWORD3>fine</KEYWORD3>
+
+ <!-- VSWEEP command -->
+ <KEYWORD3>p</KEYWORD3>
+
+ <!-- VSYMM, VTRAN, /VUP commands -->
+ <KEYWORD3>x</KEYWORD3>
+ <KEYWORD3>y</KEYWORD3>
+ <KEYWORD3>z</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>p</KEYWORD3>
+ <KEYWORD3>-x</KEYWORD3>
+ <KEYWORD3>-y</KEYWORD3>
+ <KEYWORD3>-z</KEYWORD3>
+
+ <!-- WAVES command -->
+ <KEYWORD3>max</KEYWORD3>
+ <KEYWORD3>rms</KEYWORD3>
+
+ <!-- /WINDOW command -->
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>on</KEYWORD3>
+ <KEYWORD3>full</KEYWORD3>
+ <KEYWORD3>left</KEYWORD3>
+ <KEYWORD3>righ</KEYWORD3>
+ <KEYWORD3>top</KEYWORD3>
+ <KEYWORD3>bot</KEYWORD3>
+ <KEYWORD3>ltop</KEYWORD3>
+ <KEYWORD3>lbot</KEYWORD3>
+ <KEYWORD3>rtop</KEYWORD3>
+ <KEYWORD3>rbot</KEYWORD3>
+ <KEYWORD3>squa</KEYWORD3>
+ <KEYWORD3>dele</KEYWORD3>
+
+ <!-- WPAVE command -->
+ <KEYWORD3>p</KEYWORD3>
+
+ <!-- WSORT command -->
+ <KEYWORD3>x</KEYWORD3>
+ <KEYWORD3>y</KEYWORD3>
+ <KEYWORD3>z</KEYWORD3>
+ <KEYWORD3>all</KEYWORD3>
+ <KEYWORD3>max</KEYWORD3>
+ <KEYWORD3>rms</KEYWORD3>
+
+ <!-- WSTART command -->
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- /YRANGE command -->
+ <KEYWORD3>all</KEYWORD3>
+
+ <!-- /ZOOM command -->
+ <KEYWORD3>off</KEYWORD3>
+ <KEYWORD3>back</KEYWORD3>
+ <KEYWORD3>scrn</KEYWORD3>
+ <KEYWORD3>rect</KEYWORD3>
+
+ </KEYWORDS>
+ </RULES>
+</MODE>
+
diff --git a/jEdit/modes/applescript.xml b/jEdit/modes/applescript.xml
index 665fc8a..edb1e00 100644
--- a/jEdit/modes/applescript.xml
+++ b/jEdit/modes/applescript.xml
@@ -1,280 +1,280 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE MODE SYSTEM "xmode.dtd">
-
-<!-- AppleScript mode by Kris Kopicki (21/8/2002) -->
-<MODE>
- <PROPS>
- <PROPERTY NAME="doubleBracketIndent" VALUE="false" />
- <PROPERTY NAME="commentStart" VALUE="(*" />
- <PROPERTY NAME="commentEnd" VALUE="*)" />
- <PROPERTY NAME="lineComment" VALUE="--" />
- <PROPERTY NAME="wordBreakChars" VALUE=",+-=<>/?^&*" />
- </PROPS>
- <RULES IGNORE_CASE="TRUE" HIGHLIGHT_DIGITS="TRUE">
-
- <SPAN TYPE="COMMENT1">
- <BEGIN>(*</BEGIN>
- <END>*)</END>
- </SPAN>
- <EOL_SPAN TYPE="COMMENT1">--</EOL_SPAN>
-
- <SPAN TYPE="LITERAL1" ESCAPE="\" NO_LINE_BREAK="TRUE">
- <BEGIN>"</BEGIN>
- <END>"</END>
- </SPAN>
- <SPAN TYPE="LITERAL1" ESCAPE="\" NO_LINE_BREAK="TRUE">
- <BEGIN>'</BEGIN>
- <END>'</END>
- </SPAN>
-
- <SEQ TYPE="OPERATOR">(</SEQ>
- <SEQ TYPE="OPERATOR">)</SEQ>
- <SEQ TYPE="OPERATOR">+</SEQ>
- <SEQ TYPE="OPERATOR">-</SEQ>
- <SEQ TYPE="OPERATOR">^</SEQ>
- <SEQ TYPE="OPERATOR">*</SEQ>
- <SEQ TYPE="OPERATOR">/</SEQ>
- <SEQ TYPE="OPERATOR">&</SEQ>
- <SEQ TYPE="OPERATOR"><</SEQ>
- <SEQ TYPE="OPERATOR"><=</SEQ>
- <SEQ TYPE="OPERATOR">></SEQ>
- <SEQ TYPE="OPERATOR">>=</SEQ>
- <SEQ TYPE="OPERATOR">=</SEQ>
- <SEQ TYPE="OPERATOR">Â</SEQ>
-
- <!-- Constants -->
- <SEQ_REGEXP
- TYPE="LITERAL2"
- HASH_CHAR="application"
- AT_WORD_START="TRUE"
- >application[\t\s]+responses</SEQ_REGEXP>
- <SEQ_REGEXP
- TYPE="LITERAL2"
- HASH_CHAR="current"
- AT_WORD_START="TRUE"
- >current[\t\s]+application</SEQ_REGEXP>
- <SEQ_REGEXP
- TYPE="LITERAL2"
- HASH_CHAR="white"
- AT_WORD_START="TRUE"
- >white[\t\s]+space</SEQ_REGEXP>
-
- <!-- Text Styles -->
- <SEQ_REGEXP
- TYPE="LITERAL2"
- HASH_CHAR="all"
- >all[\t\s]+caps</SEQ_REGEXP>
- <SEQ_REGEXP
- TYPE="LITERAL2"
- HASH_CHAR="all"
- AT_WORD_START="TRUE"
- >all[\t\s]+lowercase</SEQ_REGEXP>
- <SEQ_REGEXP
- TYPE="LITERAL2"
- HASH_CHAR="small"
- AT_WORD_START="TRUE"
- >small[\t\s]+caps</SEQ_REGEXP>
-
- <!-- Predefined Variables -->
- <SEQ_REGEXP
- TYPE="KEYWORD3"
- HASH_CHAR="missing"
- AT_WORD_START="TRUE"
- >missing[\t\s]+value</SEQ_REGEXP>
-
- <KEYWORDS>
- <!-- Keywords -->
- <KEYWORD1>script</KEYWORD1>
- <KEYWORD1>property</KEYWORD1>
- <KEYWORD1>prop</KEYWORD1>
- <KEYWORD1>end</KEYWORD1>
- <KEYWORD1>copy</KEYWORD1>
- <KEYWORD1>to</KEYWORD1>
- <KEYWORD1>set</KEYWORD1>
- <KEYWORD1>global</KEYWORD1>
- <KEYWORD1>local</KEYWORD1>
- <KEYWORD1>on</KEYWORD1>
- <KEYWORD1>to</KEYWORD1>
- <KEYWORD1>of</KEYWORD1>
- <KEYWORD1>in</KEYWORD1>
- <KEYWORD1>given</KEYWORD1>
- <KEYWORD1>with</KEYWORD1>
- <KEYWORD1>without</KEYWORD1>
- <KEYWORD1>return</KEYWORD1>
- <KEYWORD1>continue</KEYWORD1>
- <KEYWORD1>tell</KEYWORD1>
- <KEYWORD1>if</KEYWORD1>
- <KEYWORD1>then</KEYWORD1>
- <KEYWORD1>else</KEYWORD1>
- <KEYWORD1>repeat</KEYWORD1>
- <KEYWORD1>times</KEYWORD1>
- <KEYWORD1>while</KEYWORD1>
- <KEYWORD1>until</KEYWORD1>
- <KEYWORD1>from</KEYWORD1>
- <KEYWORD1>exit</KEYWORD1>
- <KEYWORD1>try</KEYWORD1>
- <KEYWORD1>error</KEYWORD1>
- <KEYWORD1>considering</KEYWORD1>
- <KEYWORD1>ignoring</KEYWORD1>
- <KEYWORD1>timeout</KEYWORD1>
- <KEYWORD1>transaction</KEYWORD1>
- <KEYWORD1>my</KEYWORD1>
- <KEYWORD1>get</KEYWORD1>
- <KEYWORD1>put</KEYWORD1>
- <KEYWORD1>into</KEYWORD1>
- <KEYWORD1>is</KEYWORD1>
-
- <!-- References -->
- <KEYWORD2>each</KEYWORD2>
- <KEYWORD2>some</KEYWORD2>
- <KEYWORD2>every</KEYWORD2>
- <KEYWORD2>whose</KEYWORD2>
- <KEYWORD2>where</KEYWORD2>
- <KEYWORD2>id</KEYWORD2>
- <KEYWORD2>index</KEYWORD2>
- <KEYWORD2>first</KEYWORD2>
- <KEYWORD2>second</KEYWORD2>
- <KEYWORD2>third</KEYWORD2>
- <KEYWORD2>fourth</KEYWORD2>
- <KEYWORD2>fifth</KEYWORD2>
- <KEYWORD2>sixth</KEYWORD2>
- <KEYWORD2>seventh</KEYWORD2>
- <KEYWORD2>eighth</KEYWORD2>
- <KEYWORD2>ninth</KEYWORD2>
- <KEYWORD2>tenth</KEYWORD2>
- <KEYWORD2>last</KEYWORD2>
- <KEYWORD2>front</KEYWORD2>
- <KEYWORD2>back</KEYWORD2>
- <KEYWORD2>st</KEYWORD2>
- <KEYWORD2>nd</KEYWORD2>
- <KEYWORD2>rd</KEYWORD2>
- <KEYWORD2>th</KEYWORD2>
- <KEYWORD2>middle</KEYWORD2>
- <KEYWORD2>named</KEYWORD2>
- <KEYWORD2>through</KEYWORD2>
- <KEYWORD2>thru</KEYWORD2>
- <KEYWORD2>before</KEYWORD2>
- <KEYWORD2>after</KEYWORD2>
- <KEYWORD2>beginning</KEYWORD2>
- <KEYWORD2>the</KEYWORD2>
-
- <!-- Commands -->
- <KEYWORD3>close</KEYWORD3>
- <KEYWORD3>copy</KEYWORD3>
- <KEYWORD3>count</KEYWORD3>
- <KEYWORD3>delete</KEYWORD3>
- <KEYWORD3>duplicate</KEYWORD3>
- <KEYWORD3>exists</KEYWORD3>
- <KEYWORD3>launch</KEYWORD3>
- <KEYWORD3>make</KEYWORD3>
- <KEYWORD3>move</KEYWORD3>
- <KEYWORD3>open</KEYWORD3>
- <KEYWORD3>print</KEYWORD3>
- <KEYWORD3>quit</KEYWORD3>
- <KEYWORD3>reopen</KEYWORD3>
- <KEYWORD3>run</KEYWORD3>
- <KEYWORD3>save</KEYWORD3>
- <KEYWORD3>saving</KEYWORD3>
-
- <!-- Predefined Variables -->
- <LITERAL2>it</LITERAL2>
- <LITERAL2>me</LITERAL2>
- <LITERAL2>version</LITERAL2>
- <LITERAL2>pi</LITERAL2>
- <LITERAL2>result</LITERAL2>
- <LITERAL2>space</LITERAL2>
- <LITERAL2>tab</LITERAL2>
- <LITERAL2>anything</LITERAL2>
-
- <!-- Constants -->
- <LITERAL2>case</LITERAL2>
- <LITERAL2>diacriticals</LITERAL2>
- <LITERAL2>expansion</LITERAL2>
- <LITERAL2>hyphens</LITERAL2>
- <LITERAL2>punctuation</LITERAL2>
-
- <!-- Text Styles -->
- <LITERAL2>bold</LITERAL2>
- <LITERAL2>condensed</LITERAL2>
- <LITERAL2>expanded</LITERAL2>
- <LITERAL2>hidden</LITERAL2>
- <LITERAL2>italic</LITERAL2>
- <LITERAL2>outline</LITERAL2>
- <LITERAL2>plain</LITERAL2>
- <LITERAL2>shadow</LITERAL2>
- <LITERAL2>strikethrough</LITERAL2>
- <LITERAL2>subscript</LITERAL2>
- <LITERAL2>superscript</LITERAL2>
- <LITERAL2>underline</LITERAL2>
-
- <!-- Save options -->
- <LITERAL2>ask</LITERAL2>
- <LITERAL2>no</LITERAL2>
- <LITERAL2>yes</LITERAL2>
-
- <!-- Booleans -->
- <LITERAL2>false</LITERAL2>
- <LITERAL2>true</LITERAL2>
-
- <!-- Date & Time -->
- <LITERAL2>weekday</LITERAL2>
- <LITERAL2>monday</LITERAL2>
- <LITERAL2>mon</LITERAL2>
- <LITERAL2>tuesday</LITERAL2>
- <LITERAL2>tue</LITERAL2>
- <LITERAL2>wednesday</LITERAL2>
- <LITERAL2>wed</LITERAL2>
- <LITERAL2>thursday</LITERAL2>
- <LITERAL2>thu</LITERAL2>
- <LITERAL2>friday</LITERAL2>
- <LITERAL2>fri</LITERAL2>
- <LITERAL2>saturday</LITERAL2>
- <LITERAL2>sat</LITERAL2>
- <LITERAL2>sunday</LITERAL2>
- <LITERAL2>sun</LITERAL2>
-
- <LITERAL2>month</LITERAL2>
- <LITERAL2>january</LITERAL2>
- <LITERAL2>jan</LITERAL2>
- <LITERAL2>february</LITERAL2>
- <LITERAL2>feb</LITERAL2>
- <LITERAL2>march</LITERAL2>
- <LITERAL2>mar</LITERAL2>
- <LITERAL2>april</LITERAL2>
- <LITERAL2>apr</LITERAL2>
- <LITERAL2>may</LITERAL2>
- <LITERAL2>june</LITERAL2>
- <LITERAL2>jun</LITERAL2>
- <LITERAL2>july</LITERAL2>
- <LITERAL2>jul</LITERAL2>
- <LITERAL2>august</LITERAL2>
- <LITERAL2>aug</LITERAL2>
- <LITERAL2>september</LITERAL2>
- <LITERAL2>sep</LITERAL2>
- <LITERAL2>october</LITERAL2>
- <LITERAL2>oct</LITERAL2>
- <LITERAL2>november</LITERAL2>
- <LITERAL2>nov</LITERAL2>
- <LITERAL2>december</LITERAL2>
- <LITERAL2>dec</LITERAL2>
-
- <LITERAL2>minutes</LITERAL2>
- <LITERAL2>hours</LITERAL2>
- <LITERAL2>days</LITERAL2>
- <LITERAL2>weeks</LITERAL2>
-
- <!-- Operators -->
- <OPERATOR>div</OPERATOR>
- <OPERATOR>mod</OPERATOR>
- <OPERATOR>and</OPERATOR>
- <OPERATOR>not</OPERATOR>
- <OPERATOR>or</OPERATOR>
- <OPERATOR>as</OPERATOR>
- <OPERATOR>contains</OPERATOR>
- <OPERATOR>equal</OPERATOR>
- <OPERATOR>equals</OPERATOR>
- <OPERATOR>isn't</OPERATOR>
- </KEYWORDS>
- </RULES>
-</MODE>
+<?xml version="1.0"?>
+
+<!DOCTYPE MODE SYSTEM "xmode.dtd">
+
+<!-- AppleScript mode by Kris Kopicki (21/8/2002) -->
+<MODE>
+ <PROPS>
+ <PROPERTY NAME="doubleBracketIndent" VALUE="false" />
+ <PROPERTY NAME="commentStart" VALUE="(*" />
+ <PROPERTY NAME="commentEnd" VALUE="*)" />
+ <PROPERTY NAME="lineComment" VALUE="--" />
+ <PROPERTY NAME="wordBreakChars" VALUE=",+-=<>/?^&*" />
+ </PROPS>
+ <RULES IGNORE_CASE="TRUE" HIGHLIGHT_DIGITS="TRUE">
+
+ <SPAN TYPE="COMMENT1">
+ <BEGIN>(*</BEGIN>
+ <END>*)</END>
+ </SPAN>
+ <EOL_SPAN TYPE="COMMENT1">--</EOL_SPAN>
+
+ <SPAN TYPE="LITERAL1" ESCAPE="\" NO_LINE_BREAK="TRUE">
+ <BEGIN>"</BEGIN>
+ <END>"</END>
+ </SPAN>
+ <SPAN TYPE="LITERAL1" ESCAPE="\" NO_LINE_BREAK="TRUE">
+ <BEGIN>'</BEGIN>
+ <END>'</END>
+ </SPAN>
+
+ <SEQ TYPE="OPERATOR">(</SEQ>
+ <SEQ TYPE="OPERATOR">)</SEQ>
+ <SEQ TYPE="OPERATOR">+</SEQ>
+ <SEQ TYPE="OPERATOR">-</SEQ>
+ <SEQ TYPE="OPERATOR">^</SEQ>
+ <SEQ TYPE="OPERATOR">*</SEQ>
+ <SEQ TYPE="OPERATOR">/</SEQ>
+ <SEQ TYPE="OPERATOR">&</SEQ>
+ <SEQ TYPE="OPERATOR"><</SEQ>
+ <SEQ TYPE="OPERATOR"><=</SEQ>
+ <SEQ TYPE="OPERATOR">></SEQ>
+ <SEQ TYPE="OPERATOR">>=</SEQ>
+ <SEQ TYPE="OPERATOR">=</SEQ>
+ <SEQ TYPE="OPERATOR">Â</SEQ>
+
+ <!-- Constants -->
+ <SEQ_REGEXP
+ TYPE="LITERAL2"
+ HASH_CHAR="application"
+ AT_WORD_START="TRUE"
+ >application[\t\s]+responses</SEQ_REGEXP>
+ <SEQ_REGEXP
+ TYPE="LITERAL2"
+ HASH_CHAR="current"
+ AT_WORD_START="TRUE"
+ >current[\t\s]+application</SEQ_REGEXP>
+ <SEQ_REGEXP
+ TYPE="LITERAL2"
+ HASH_CHAR="white"
+ AT_WORD_START="TRUE"
+ >white[\t\s]+space</SEQ_REGEXP>
+
+ <!-- Text Styles -->
+ <SEQ_REGEXP
+ TYPE="LITERAL2"
+ HASH_CHAR="all"
+ >all[\t\s]+caps</SEQ_REGEXP>
+ <SEQ_REGEXP
+ TYPE="LITERAL2"
+ HASH_CHAR="all"
+ AT_WORD_START="TRUE"
+ >all[\t\s]+lowercase</SEQ_REGEXP>
+ <SEQ_REGEXP
+ TYPE="LITERAL2"
+ HASH_CHAR="small"
+ AT_WORD_START="TRUE"
+ >small[\t\s]+caps</SEQ_REGEXP>
+
+ <!-- Predefined Variables -->
+ <SEQ_REGEXP
+ TYPE="KEYWORD3"
+ HASH_CHAR="missing"
+ AT_WORD_START="TRUE"
+ >missing[\t\s]+value</SEQ_REGEXP>
+
+ <KEYWORDS>
+ <!-- Keywords -->
+ <KEYWORD1>script</KEYWORD1>
+ <KEYWORD1>property</KEYWORD1>
+ <KEYWORD1>prop</KEYWORD1>
+ <KEYWORD1>end</KEYWORD1>
+ <KEYWORD1>copy</KEYWORD1>
+ <KEYWORD1>to</KEYWORD1>
+ <KEYWORD1>set</KEYWORD1>
+ <KEYWORD1>global</KEYWORD1>
+ <KEYWORD1>local</KEYWORD1>
+ <KEYWORD1>on</KEYWORD1>
+ <KEYWORD1>to</KEYWORD1>
+ <KEYWORD1>of</KEYWORD1>
+ <KEYWORD1>in</KEYWORD1>
+ <KEYWORD1>given</KEYWORD1>
+ <KEYWORD1>with</KEYWORD1>
+ <KEYWORD1>without</KEYWORD1>
+ <KEYWORD1>return</KEYWORD1>
+ <KEYWORD1>continue</KEYWORD1>
+ <KEYWORD1>tell</KEYWORD1>
+ <KEYWORD1>if</KEYWORD1>
+ <KEYWORD1>then</KEYWORD1>
+ <KEYWORD1>else</KEYWORD1>
+ <KEYWORD1>repeat</KEYWORD1>
+ <KEYWORD1>times</KEYWORD1>
+ <KEYWORD1>while</KEYWORD1>
+ <KEYWORD1>until</KEYWORD1>
+ <KEYWORD1>from</KEYWORD1>
+ <KEYWORD1>exit</KEYWORD1>
+ <KEYWORD1>try</KEYWORD1>
+ <KEYWORD1>error</KEYWORD1>
+ <KEYWORD1>considering</KEYWORD1>
+ <KEYWORD1>ignoring</KEYWORD1>
+ <KEYWORD1>timeout</KEYWORD1>
+ <KEYWORD1>transaction</KEYWORD1>
+ <KEYWORD1>my</KEYWORD1>
+ <KEYWORD1>get</KEYWORD1>
+ <KEYWORD1>put</KEYWORD1>
+ <KEYWORD1>into</KEYWORD1>
+ <KEYWORD1>is</KEYWORD1>
+
+ <!-- References -->
+ <KEYWORD2>each</KEYWORD2>
+ <KEYWORD2>some</KEYWORD2>
+ <KEYWORD2>every</KEYWORD2>
+ <KEYWORD2>whose</KEYWORD2>
+ <KEYWORD2>where</KEYWORD2>
+ <KEYWORD2>id</KEYWORD2>
+ <KEYWORD2>index</KEYWORD2>
+ <KEYWORD2>first</KEYWORD2>
+ <KEYWORD2>second</KEYWORD2>
+ <KEYWORD2>third</KEYWORD2>
+ <KEYWORD2>fourth</KEYWORD2>
+ <KEYWORD2>fifth</KEYWORD2>
+ <KEYWORD2>sixth</KEYWORD2>
+ <KEYWORD2>seventh</KEYWORD2>
+ <KEYWORD2>eighth</KEYWORD2>
+ <KEYWORD2>ninth</KEYWORD2>
+ <KEYWORD2>tenth</KEYWORD2>
+ <KEYWORD2>last</KEYWORD2>
+ <KEYWORD2>front</KEYWORD2>
+ <KEYWORD2>back</KEYWORD2>
+ <KEYWORD2>st</KEYWORD2>
+ <KEYWORD2>nd</KEYWORD2>
+ <KEYWORD2>rd</KEYWORD2>
+ <KEYWORD2>th</KEYWORD2>
+ <KEYWORD2>middle</KEYWORD2>
+ <KEYWORD2>named</KEYWORD2>
+ <KEYWORD2>through</KEYWORD2>
+ <KEYWORD2>thru</KEYWORD2>
+ <KEYWORD2>before</KEYWORD2>
+ <KEYWORD2>after</KEYWORD2>
+ <KEYWORD2>beginning</KEYWORD2>
+ <KEYWORD2>the</KEYWORD2>
+
+ <!-- Commands -->
+ <KEYWORD3>close</KEYWORD3>
+ <KEYWORD3>copy</KEYWORD3>
+ <KEYWORD3>count</KEYWORD3>
+ <KEYWORD3>delete</KEYWORD3>
+ <KEYWORD3>duplicate</KEYWORD3>
+ <KEYWORD3>exists</KEYWORD3>
+ <KEYWORD3>launch</KEYWORD3>
+ <KEYWORD3>make</KEYWORD3>
+ <KEYWORD3>move</KEYWORD3>
+ <KEYWORD3>open</KEYWORD3>
+ <KEYWORD3>print</KEYWORD3>
+ <KEYWORD3>quit</KEYWORD3>
+ <KEYWORD3>reopen</KEYWORD3>
+ <KEYWORD3>run</KEYWORD3>
+ <KEYWORD3>save</KEYWORD3>
+ <KEYWORD3>saving</KEYWORD3>
+
+ <!-- Predefined Variables -->
+ <LITERAL2>it</LITERAL2>
+ <LITERAL2>me</LITERAL2>
+ <LITERAL2>version</LITERAL2>
+ <LITERAL2>pi</LITERAL2>
+ <LITERAL2>result</LITERAL2>
+ <LITERAL2>space</LITERAL2>
+ <LITERAL2>tab</LITERAL2>
+ <LITERAL2>anything</LITERAL2>
+
+ <!-- Constants -->
+ <LITERAL2>case</LITERAL2>
+ <LITERAL2>diacriticals</LITERAL2>
+ <LITERAL2>expansion</LITERAL2>
+ <LITERAL2>hyphens</LITERAL2>
+ <LITERAL2>punctuation</LITERAL2>
+
+ <!-- Text Styles -->
+ <LITERAL2>bold</LITERAL2>
+ <LITERAL2>condensed</LITERAL2>
+ <LITERAL2>expanded</LITERAL2>
+ <LITERAL2>hidden</LITERAL2>
+ <LITERAL2>italic</LITERAL2>
+ <LITERAL2>outline</LITERAL2>
+ <LITERAL2>plain</LITERAL2>
+ <LITERAL2>shadow</LITERAL2>
+ <LITERAL2>strikethrough</LITERAL2>
+ <LITERAL2>subscript</LITERAL2>
+ <LITERAL2>superscript</LITERAL2>
+ <LITERAL2>underline</LITERAL2>
+
+ <!-- Save options -->
+ <LITERAL2>ask</LITERAL2>
+ <LITERAL2>no</LITERAL2>
+ <LITERAL2>yes</LITERAL2>
+
+ <!-- Booleans -->
+ <LITERAL2>false</LITERAL2>
+ <LITERAL2>true</LITERAL2>
+
+ <!-- Date & Time -->
+ <LITERAL2>weekday</LITERAL2>
+ <LITERAL2>monday</LITERAL2>
+ <LITERAL2>mon</LITERAL2>
+ <LITERAL2>tuesday</LITERAL2>
+ <LITERAL2>tue</LITERAL2>
+ <LITERAL2>wednesday</LITERAL2>
+ <LITERAL2>wed</LITERAL2>
+ <LITERAL2>thursday</LITERAL2>
+ <LITERAL2>thu</LITERAL2>
+ <LITERAL2>friday</LITERAL2>
+ <LITERAL2>fri</LITERAL2>
+ <LITERAL2>saturday</LITERAL2>
+ <LITERAL2>sat</LITERAL2>
+ <LITERAL2>sunday</LITERAL2>
+ <LITERAL2>sun</LITERAL2>
+
+ <LITERAL2>month</LITERAL2>
+ <LITERAL2>january</LITERAL2>
+ <LITERAL2>jan</LITERAL2>
+ <LITERAL2>february</LITERAL2>
+ <LITERAL2>feb</LITERAL2>
+ <LITERAL2>march</LITERAL2>
+ <LITERAL2>mar</LITERAL2>
+ <LITERAL2>april</LITERAL2>
+ <LITERAL2>apr</LITERAL2>
+ <LITERAL2>may</LITERAL2>
+ <LITERAL2>june</LITERAL2>
+ <LITERAL2>jun</LITERAL2>
+ <LITERAL2>july</LITERAL2>
+ <LITERAL2>jul</LITERAL2>
+ <LITERAL2>august</LITERAL2>
+ <LITERAL2>aug</LITERAL2>
+ <LITERAL2>september</LITERAL2>
+ <LITERAL2>sep</LITERAL2>
+ <LITERAL2>october</LITERAL2>
+ <LITERAL2>oct</LITERAL2>
+ <LITERAL2>november</LITERAL2>
+ <LITERAL2>nov</LITERAL2>
+ <LITERAL2>december</LITERAL2>
+ <LITERAL2>dec</LITERAL2>
+
+ <LITERAL2>minutes</LITERAL2>
+ <LITERAL2>hours</LITERAL2>
+ <LITERAL2>days</LITERAL2>
+ <LITERAL2>weeks</LITERAL2>
+
+ <!-- Operators -->
+ <OPERATOR>div</OPERATOR>
+ <OPERATOR>mod</OPERATOR>
+ <OPERATOR>and</OPERATOR>
+ <OPERATOR>not</OPERATOR>
+ <OPERATOR>or</OPERATOR>
+ <OPERATOR>as</OPERATOR>
+ <OPERATOR>contains</OPERATOR>
+ <OPERATOR>equal</OPERATOR>
+ <OPERATOR>equals</OPERATOR>
+ <OPERATOR>isn't</OPERATOR>
+ </KEYWORDS>
+ </RULES>
+</MODE>
diff --git a/jEdit/modes/asp.xml b/jEdit/modes/asp.xml
index 01735ba..9bb08a5 100644
--- a/jEdit/modes/asp.xml
+++ b/jEdit/modes/asp.xml
@@ -1,518 +1,518 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE MODE SYSTEM "xmode.dtd">
-
-<!-- ASP mode by Andre Kaplan
- Updated by Simon Ruggier -->
-<MODE>
- <PROPS>
- <PROPERTY NAME="commentStart" VALUE="<!--" />
- <PROPERTY NAME="commentEnd" VALUE="-->" />
- </PROPS>
-
- <RULES IGNORE_CASE="TRUE">
- <SEQ TYPE="MARKUP" DELEGATE="ASPVB"><%@LANGUAGE="VBSCRIPT"%</SEQ>
- <SEQ TYPE="MARKUP" DELEGATE="ASPJS"><%@LANGUAGE="JSCRIPT"%</SEQ>
- <SEQ TYPE="MARKUP" DELEGATE="ASPJS"><%@LANGUAGE="JAVASCRIPT"%</SEQ>
- <SEQ TYPE="MARKUP" DELEGATE="ASPPL"><%@LANGUAGE="PERLSCRIPT"%</SEQ>
-
- <!-- Inlined server-side VBScript -->
- <SPAN TYPE="MARKUP" DELEGATE="vbscript::MAIN">
- <BEGIN><%</BEGIN>
- <END>%></END>
- </SPAN>
-
- <!-- Server-side VBScript -->
- <SPAN TYPE="MARKUP" DELEGATE="vbscript::MAIN">
- <BEGIN><script language="vbscript" runat="server"></BEGIN>
- <END></script></END>
- </SPAN>
-
- <!-- Server-side Javascript -->
- <SPAN TYPE="MARKUP" DELEGATE="javascript::MAIN">
- <BEGIN><script language="jscript" runat="server"></BEGIN>
- <END></script></END>
- </SPAN>
-
- <SPAN TYPE="MARKUP" DELEGATE="javascript::MAIN">
- <BEGIN><script language="javascript" runat="server"></BEGIN>
- <END></script></END>
- </SPAN>
-
- <!-- Server-side PerlScript -->
- <SPAN TYPE="MARKUP" DELEGATE="perl::MAIN">
- <BEGIN><script language="perlscript" runat="server"></BEGIN>
- <END></script></END>
- </SPAN>
-
- <!-- Client-side javascript -->
- <SPAN TYPE="MARKUP" DELEGATE="ASPVB_CSJS">
- <BEGIN><script language="jscript"></BEGIN>
- <END></script></END>
- </SPAN>
-
- <SPAN TYPE="MARKUP" DELEGATE="ASPVB_CSJS">
- <BEGIN><script language="javascript"></BEGIN>
- <END></script></END>
- </SPAN>
-
- <SPAN TYPE="MARKUP" DELEGATE="ASPVB_CSJS">
- <BEGIN><script></BEGIN>
- <END></script></END>
- </SPAN>
-
- <!-- Server-Side include -->
- <SPAN TYPE="MARKUP">
- <BEGIN><!--#</BEGIN>
- <END>--></END>
- </SPAN>
-
- <!-- SGML comment -->
- <SPAN TYPE="COMMENT1" DELEGATE="ASPVB_SGML">
- <BEGIN><!--</BEGIN>
- <END>--></END>
- </SPAN>
-
- <!-- stylesheet -->
- <SPAN TYPE="MARKUP" DELEGATE="ASPVB_STYLE">
- <BEGIN><STYLE></BEGIN>
- <END></STYLE></END>
- </SPAN>
-
- <!-- markup tags -->
- <SPAN TYPE="MARKUP" DELEGATE="ASPVB_TAGS">
- <BEGIN><</BEGIN>
- <END>></END>
- </SPAN>
-
- <!-- SGML entities -->
- <SPAN TYPE="LITERAL2" NO_WORD_BREAK="TRUE">
- <BEGIN>&</BEGIN>
- <END>;</END>
- </SPAN>
- </RULES>
-
- <!-- ******************************************************************
- ASP with VBScript as default script engine
- ****************************************************************** -->
- <RULES SET="ASPVB" IGNORE_CASE="TRUE">
- <!-- Inlined server-side VBScript -->
- <SPAN TYPE="MARKUP" DELEGATE="vbscript::MAIN">
- <BEGIN><%</BEGIN>
- <END>%></END>
- </SPAN>
-
- <!-- Server-side VBScript -->
- <SPAN TYPE="MARKUP" DELEGATE="vbscript::MAIN">
- <BEGIN><script language="vbscript" runat="server"></BEGIN>
- <END></script></END>
- </SPAN>
-
- <!-- Server-side Javascript -->
- <SPAN TYPE="MARKUP" DELEGATE="javascript::MAIN">
- <BEGIN><script language="jscript" runat="server"></BEGIN>
- <END></script></END>
- </SPAN>
-
- <SPAN TYPE="MARKUP" DELEGATE="javascript::MAIN">
- <BEGIN><script language="javascript" runat="server"></BEGIN>
- <END></script></END>
- </SPAN>
-
- <!-- Server-side PerlScript -->
- <SPAN TYPE="MARKUP" DELEGATE="perl::MAIN">
- <BEGIN><script language="perlscript" runat="server"></BEGIN>
- <END></script></END>
- </SPAN>
-
- <!-- Client-side javascript -->
- <SPAN TYPE="MARKUP" DELEGATE="ASPVB_CSJS">
- <BEGIN><script language="jscript"</BEGIN>
- <END></script></END>
- </SPAN>
-
- <SPAN TYPE="MARKUP" DELEGATE="ASPVB_CSJS">
- <BEGIN><script language="javascript"</BEGIN>
- <END></script></END>
- </SPAN>
-
- <SPAN TYPE="MARKUP" DELEGATE="ASPVB_CSJS">
- <BEGIN><script></BEGIN>
- <END></script></END>
- </SPAN>
-
- <!-- Server-Side include -->
- <SPAN TYPE="MARKUP">
- <BEGIN><!--#</BEGIN>
- <END>--></END>
- </SPAN>
-
- <!-- SGML comment -->
- <SPAN TYPE="COMMENT1" DELEGATE="ASPVB_SGML">
- <BEGIN><!--</BEGIN>
- <END>--></END>
- </SPAN>
-
- <!-- stylesheet -->
- <SPAN TYPE="MARKUP" DELEGATE="ASPVB_STYLE">
- <BEGIN><STYLE></BEGIN>
- <END></STYLE></END>
- </SPAN>
-
- <!-- markup tags -->
- <SPAN TYPE="MARKUP" DELEGATE="ASPVB_TAGS">
- <BEGIN></</BEGIN>
- <END>></END>
- </SPAN>
-
- <SPAN TYPE="MARKUP" DELEGATE="ASPVB_TAGS">
- <BEGIN><</BEGIN>
- <END>></END>
- </SPAN>
-
- <!-- SGML entities -->
- <SPAN TYPE="LITERAL2" NO_WORD_BREAK="TRUE">
- <BEGIN>&</BEGIN>
- <END>;</END>
- </SPAN>
- </RULES>
-
- <!-- ******************************************************************
- ASP with JScript as default script engine
- ****************************************************************** -->
- <RULES SET="ASPJS" IGNORE_CASE="TRUE">
- <!-- Inlined server-side Javascript -->
- <SPAN TYPE="MARKUP" DELEGATE="javascript::MAIN">
- <BEGIN><%</BEGIN>
- <END>%></END>
- </SPAN>
-
- <!-- Server-side VBScript -->
- <SPAN TYPE="MARKUP" DELEGATE="vbscript::MAIN">
- <BEGIN><script language="vbscript" runat="server"></BEGIN>
- <END></script></END>
- </SPAN>
-
- <!-- Server-side Javascript -->
- <SPAN TYPE="MARKUP" DELEGATE="javascript::MAIN">
- <BEGIN><script language="jscript" runat="server"></BEGIN>
- <END></script></END>
- </SPAN>
-
- <SPAN TYPE="MARKUP" DELEGATE="javascript::MAIN">
- <BEGIN><script language="javascript" runat="server"></BEGIN>
- <END></script></END>
- </SPAN>
-
- <!-- Server-side PerlScript -->
- <SPAN TYPE="MARKUP" DELEGATE="perl::MAIN">
- <BEGIN><script language="perlscript" runat="server"></BEGIN>
- <END></script></END>
- </SPAN>
-
- <!-- Client-side javascript -->
- <SPAN TYPE="MARKUP" DELEGATE="ASPJS_CSJS">
- <BEGIN><script language="jscript"</BEGIN>
- <END></script></END>
- </SPAN>
-
- <SPAN TYPE="MARKUP" DELEGATE="ASPJS_CSJS">
- <BEGIN><script language="javascript"</BEGIN>
- <END></script></END>
- </SPAN>
-
- <SPAN TYPE="MARKUP" DELEGATE="ASPJS_CSJS">
- <BEGIN><script></BEGIN>
- <END></script></END>
- </SPAN>
-
- <!-- Server-Side include -->
- <SPAN TYPE="MARKUP">
- <BEGIN><!--#</BEGIN>
- <END>--></END>
- </SPAN>
-
- <!-- SGML comment -->
- <SPAN TYPE="COMMENT1" DELEGATE="ASPJS_SGML">
- <BEGIN><!--</BEGIN>
- <END>--></END>
- </SPAN>
-
- <!-- stylesheet -->
- <SPAN TYPE="MARKUP" DELEGATE="ASPJS_STYLE">
- <BEGIN><STYLE></BEGIN>
- <END></STYLE></END>
- </SPAN>
-
- <!-- markup tags -->
- <SPAN TYPE="MARKUP" DELEGATE="ASPJS_TAGS">
- <BEGIN></</BEGIN>
- <END>></END>
- </SPAN>
-
- <SPAN TYPE="MARKUP" DELEGATE="ASPJS_TAGS">
- <BEGIN><</BEGIN>
- <END>></END>
- </SPAN>
-
- <!-- SGML entities -->
- <SPAN TYPE="LITERAL2" NO_WORD_BREAK="TRUE">
- <BEGIN>&</BEGIN>
- <END>;</END>
- </SPAN>
- </RULES>
-
- <!-- ******************************************************************
- ASP with PerlScript as default script engine
- ****************************************************************** -->
- <RULES SET="ASPPL" IGNORE_CASE="TRUE">
- <!-- Inlined server-side Perlscript -->
- <SPAN TYPE="MARKUP" DELEGATE="perl::MAIN">
- <BEGIN><%</BEGIN>
- <END>%></END>
- </SPAN>
-
- <!-- Server-side VBScript -->
- <SPAN TYPE="MARKUP" DELEGATE="vbscript::MAIN">
- <BEGIN><script language="vbscript" runat="server"></BEGIN>
- <END></script></END>
- </SPAN>
-
- <!-- Server-side Javascript -->
- <SPAN TYPE="MARKUP" DELEGATE="javascript::MAIN">
- <BEGIN><script language="jscript" runat="server"></BEGIN>
- <END></script></END>
- </SPAN>
-
- <SPAN TYPE="MARKUP" DELEGATE="javascript::MAIN">
- <BEGIN><script language="javascript" runat="server"</BEGIN>
- <END></script></END>
- </SPAN>
-
- <!-- Server-side PerlScript -->
- <SPAN TYPE="MARKUP" DELEGATE="perl::MAIN">
- <BEGIN><script language="perlscript" runat="server"></BEGIN>
- <END></script></END>
- </SPAN>
-
- <!-- Client-side javascript -->
- <SPAN TYPE="MARKUP" DELEGATE="ASPPL_CSJS">
- <BEGIN><script language="jscript"</BEGIN>
- <END></script></END>
- </SPAN>
-
- <SPAN TYPE="MARKUP" DELEGATE="ASPPL_CSJS">
- <BEGIN><script language="javascript"</BEGIN>
- <END></script></END>
- </SPAN>
-
- <SPAN TYPE="MARKUP" DELEGATE="ASPPL_CSJS">
- <BEGIN><script></BEGIN>
- <END></script></END>
- </SPAN>
-
- <!-- Server-Side include -->
- <SPAN TYPE="MARKUP">
- <BEGIN><!--#</BEGIN>
- <END>--></END>
- </SPAN>
-
- <!-- SGML comment -->
- <SPAN TYPE="COMMENT1" DELEGATE="ASPPL_SGML">
- <BEGIN><!--</BEGIN>
- <END>--></END>
- </SPAN>
-
- <!-- stylesheet -->
- <SPAN TYPE="MARKUP" DELEGATE="ASPPL_STYLE">
- <BEGIN><STYLE></BEGIN>
- <END></STYLE></END>
- </SPAN>
-
- <!-- markup tags -->
- <SPAN TYPE="MARKUP" DELEGATE="ASPPL_TAGS">
- <BEGIN></</BEGIN>
- <END>></END>
- </SPAN>
-
- <SPAN TYPE="MARKUP" DELEGATE="ASPPL_TAGS">
- <BEGIN><</BEGIN>
- <END>></END>
- </SPAN>
-
- <!-- SGML entities -->
- <SPAN TYPE="LITERAL2" NO_WORD_BREAK="TRUE">
- <BEGIN>&</BEGIN>
- <END>;</END>
- </SPAN>
- </RULES>
-
- <!-- ******************************************************************
- HTML Tags
- ****************************************************************** -->
- <RULES SET="ASPVB_TAGS" DEFAULT="MARKUP">
- <!-- Server-side VBScript -->
- <SPAN TYPE="MARKUP" DELEGATE="vbscript::MAIN">
- <BEGIN><%</BEGIN>
- <END>%></END>
- </SPAN>
-
- <SPAN TYPE="LITERAL1" DELEGATE ="ASPVB_LIT1">
- <BEGIN>"</BEGIN>
- <END>"</END>
- </SPAN>
-
- <SPAN TYPE="LITERAL1" DELEGATE ="ASPVB_LIT1">
- <BEGIN>'</BEGIN>
- <END>'</END>
- </SPAN>
-
- <SEQ TYPE="OPERATOR">=</SEQ>
- </RULES>
-
- <RULES SET="ASPVB_LIT1" DEFAULT="LITERAL1">
- <!-- Server-side VBScript -->
- <SPAN TYPE="MARKUP" DELEGATE="vbscript::MAIN">
- <BEGIN><%</BEGIN>
- <END>%></END>
- </SPAN>
- </RULES>
-
- <RULES SET="ASPJS_TAGS" DEFAULT="MARKUP">
- <!-- Server-side JavaScript -->
- <SPAN TYPE="MARKUP" DELEGATE="javascript::MAIN">
- <BEGIN><%</BEGIN>
- <END>%></END>
- </SPAN>
-
- <SPAN TYPE="LITERAL1" DELEGATE ="ASPJS_LIT1">
- <BEGIN>"</BEGIN>
- <END>"</END>
- </SPAN>
-
- <SPAN TYPE="LITERAL1" DELEGATE ="ASPJS_LIT1">
- <BEGIN>'</BEGIN>
- <END>'</END>
- </SPAN>
-
- <SEQ TYPE="OPERATOR">=</SEQ>
- </RULES>
-
- <RULES SET="ASPJS_LIT1" DEFAULT="LITERAL1">
- <!-- Server-side JavaScript -->
- <SPAN TYPE="MARKUP" DELEGATE="javascript::MAIN">
- <BEGIN><%</BEGIN>
- <END>%></END>
- </SPAN>
- </RULES>
-
- <RULES SET="ASPPL_TAGS" DEFAULT="MARKUP">
- <!-- Server-side PerlScript -->
- <SPAN TYPE="MARKUP" DELEGATE="perl::MAIN">
- <BEGIN><%</BEGIN>
- <END>%></END>
- </SPAN>
-
- <SPAN TYPE="LITERAL1" DELEGATE ="ASPPL_LIT1">
- <BEGIN>"</BEGIN>
- <END>"</END>
- </SPAN>
-
- <SPAN TYPE="LITERAL1" DELEGATE ="ASPPL_LIT1">
- <BEGIN>'</BEGIN>
- <END>'</END>
- </SPAN>
-
- <SEQ TYPE="OPERATOR">=</SEQ>
- </RULES>
-
- <RULES SET="ASPPL_LIT1" DEFAULT="LITERAL1">
- <!-- Server-side PerlScript -->
- <SPAN TYPE="MARKUP" DELEGATE="perl::MAIN">
- <BEGIN><%</BEGIN>
- <END>%></END>
- </SPAN>
- </RULES>
-
- <!-- These three rules sets handle server side scripts being mixed into client side javascript -->
- <RULES SET="ASPVB_CSJS">
- <!-- Server-side VBScript -->
- <SPAN TYPE="MARKUP" DELEGATE="vbscript::MAIN">
- <BEGIN><%</BEGIN>
- <END>%></END>
- </SPAN>
- <IMPORT DELEGATE="javascript::MAIN"/>
- </RULES>
-
- <RULES SET="ASPJS_CSJS">
- <!-- Server-side JavaScript -->
- <SPAN TYPE="MARKUP" DELEGATE="javascript::MAIN">
- <BEGIN><%</BEGIN>
- <END>%></END>
- </SPAN>
- <IMPORT DELEGATE="javascript::MAIN"/>
- </RULES>
-
- <RULES SET="ASPPL_CSJS">
- <!-- Server-side PerlScript -->
- <SPAN TYPE="MARKUP" DELEGATE="perl::MAIN">
- <BEGIN><%</BEGIN>
- <END>%></END>
- </SPAN>
- <IMPORT DELEGATE="javascript::MAIN"/>
- </RULES>
-
- <!-- These three rules sets handle server side scripts being mixed into stylesheets -->
- <RULES SET="ASPVB_STYLE">
- <!-- Server-side VBScript -->
- <SPAN TYPE="MARKUP" DELEGATE="vbscript::MAIN">
- <BEGIN><%</BEGIN>
- <END>%></END>
- </SPAN>
- <IMPORT DELEGATE="css::MAIN"/>
- </RULES>
-
- <RULES SET="ASPJS_STYLE">
- <!-- Server-side JavaScript -->
- <SPAN TYPE="MARKUP" DELEGATE="javascript::MAIN">
- <BEGIN><%</BEGIN>
- <END>%></END>
- </SPAN>
- <IMPORT DELEGATE="css::MAIN"/>
- </RULES>
-
- <RULES SET="ASPPL_STYLE">
- <!-- Server-side PerlScript -->
- <SPAN TYPE="MARKUP" DELEGATE="perl::MAIN">
- <BEGIN><%</BEGIN>
- <END>%></END>
- </SPAN>
- <IMPORT DELEGATE="css::MAIN"/>
- </RULES>
-
- <!-- These three rules sets handle server side scripts being mixed into SGML Comments -->
- <RULES SET="ASPVB_SGML" DEFAULT="COMMENT1">
- <!-- Server-side VBScript -->
- <SPAN TYPE="MARKUP" DELEGATE="vbscript::MAIN">
- <BEGIN><%</BEGIN>
- <END>%></END>
- </SPAN>
- </RULES>
-
- <RULES SET="ASPJS_SGML" DEFAULT="COMMENT1">
- <!-- Server-side JavaScript -->
- <SPAN TYPE="MARKUP" DELEGATE="javascript::MAIN">
- <BEGIN><%</BEGIN>
- <END>%></END>
- </SPAN>
- </RULES>
-
- <RULES SET="ASPPL_SGML" DEFAULT="COMMENT1">
- <!-- Server-side PerlScript -->
- <SPAN TYPE="MARKUP" DELEGATE="perl::MAIN">
- <BEGIN><%</BEGIN>
- <END>%></END>
- </SPAN>
- </RULES>
-</MODE>
-
+<?xml version="1.0"?>
+
+<!DOCTYPE MODE SYSTEM "xmode.dtd">
+
+<!-- ASP mode by Andre Kaplan
+ Updated by Simon Ruggier -->
+<MODE>
+ <PROPS>
+ <PROPERTY NAME="commentStart" VALUE="<!--" />
+ <PROPERTY NAME="commentEnd" VALUE="-->" />
+ </PROPS>
+
+ <RULES IGNORE_CASE="TRUE">
+ <SEQ TYPE="MARKUP" DELEGATE="ASPVB"><%@LANGUAGE="VBSCRIPT"%</SEQ>
+ <SEQ TYPE="MARKUP" DELEGATE="ASPJS"><%@LANGUAGE="JSCRIPT"%</SEQ>
+ <SEQ TYPE="MARKUP" DELEGATE="ASPJS"><%@LANGUAGE="JAVASCRIPT"%</SEQ>
+ <SEQ TYPE="MARKUP" DELEGATE="ASPPL"><%@LANGUAGE="PERLSCRIPT"%</SEQ>
+
+ <!-- Inlined server-side VBScript -->
+ <SPAN TYPE="MARKUP" DELEGATE="vbscript::MAIN">
+ <BEGIN><%</BEGIN>
+ <END>%></END>
+ </SPAN>
+
+ <!-- Server-side VBScript -->
+ <SPAN TYPE="MARKUP" DELEGATE="vbscript::MAIN">
+ <BEGIN><script language="vbscript" runat="server"></BEGIN>
+ <END></script></END>
+ </SPAN>
+
+ <!-- Server-side Javascript -->
+ <SPAN TYPE="MARKUP" DELEGATE="javascript::MAIN">
+ <BEGIN><script language="jscript" runat="server"></BEGIN>
+ <END></script></END>
+ </SPAN>
+
+ <SPAN TYPE="MARKUP" DELEGATE="javascript::MAIN">
+ <BEGIN><script language="javascript" runat="server"></BEGIN>
+ <END></script></END>
+ </SPAN>
+
+ <!-- Server-side PerlScript -->
+ <SPAN TYPE="MARKUP" DELEGATE="perl::MAIN">
+ <BEGIN><script language="perlscript" runat="server"></BEGIN>
+ <END></script></END>
+ </SPAN>
+
+ <!-- Client-side javascript -->
+ <SPAN TYPE="MARKUP" DELEGATE="ASPVB_CSJS">
+ <BEGIN><script language="jscript"></BEGIN>
+ <END></script></END>
+ </SPAN>
+
+ <SPAN TYPE="MARKUP" DELEGATE="ASPVB_CSJS">
+ <BEGIN><script language="javascript"></BEGIN>
+ <END></script></END>
+ </SPAN>
+
+ <SPAN TYPE="MARKUP" DELEGATE="ASPVB_CSJS">
+ <BEGIN><script></BEGIN>
+ <END></script></END>
+ </SPAN>
+
+ <!-- Server-Side include -->
+ <SPAN TYPE="MARKUP">
+ <BEGIN><!--#</BEGIN>
+ <END>--></END>
+ </SPAN>
+
+ <!-- SGML comment -->
+ <SPAN TYPE="COMMENT1" DELEGATE="ASPVB_SGML">
+ <BEGIN><!--</BEGIN>
+ <END>--></END>
+ </SPAN>
+
+ <!-- stylesheet -->
+ <SPAN TYPE="MARKUP" DELEGATE="ASPVB_STYLE">
+ <BEGIN><STYLE></BEGIN>
+ <END></STYLE></END>
+ </SPAN>
+
+ <!-- markup tags -->
+ <SPAN TYPE="MARKUP" DELEGATE="ASPVB_TAGS">
+ <BEGIN><</BEGIN>
+ <END>></END>
+ </SPAN>
+
+ <!-- SGML entities -->
+ <SPAN TYPE="LITERAL2" NO_WORD_BREAK="TRUE">
+ <BEGIN>&</BEGIN>
+ <END>;</END>
+ </SPAN>
+ </RULES>
+
+ <!-- ******************************************************************
+ ASP with VBScript as default script engine
+ ****************************************************************** -->
+ <RULES SET="ASPVB" IGNORE_CASE="TRUE">
+ <!-- Inlined server-side VBScript -->
+ <SPAN TYPE="MARKUP" DELEGATE="vbscript::MAIN">
+ <BEGIN><%</BEGIN>
+ <END>%></END>
+ </SPAN>
+
+ <!-- Server-side VBScript -->
+ <SPAN TYPE="MARKUP" DELEGATE="vbscript::MAIN">
+ <BEGIN><script language="vbscript" runat="server"></BEGIN>
+ <END></script></END>
+ </SPAN>
+
+ <!-- Server-side Javascript -->
+ <SPAN TYPE="MARKUP" DELEGATE="javascript::MAIN">
+ <BEGIN><script language="jscript" runat="server"></BEGIN>
+ <END></script></END>
+ </SPAN>
+
+ <SPAN TYPE="MARKUP" DELEGATE="javascript::MAIN">
+ <BEGIN><script language="javascript" runat="server"></BEGIN>
+ <END></script></END>
+ </SPAN>
+
+ <!-- Server-side PerlScript -->
+ <SPAN TYPE="MARKUP" DELEGATE="perl::MAIN">
+ <BEGIN><script language="perlscript" runat="server"></BEGIN>
+ <END></script></END>
+ </SPAN>
+
+ <!-- Client-side javascript -->
+ <SPAN TYPE="MARKUP" DELEGATE="ASPVB_CSJS">
+ <BEGIN><script language="jscript"</BEGIN>
+ <END></script></END>
+ </SPAN>
+
+ <SPAN TYPE="MARKUP" DELEGATE="ASPVB_CSJS">
+ <BEGIN><script language="javascript"</BEGIN>
+ <END></script></END>
+ </SPAN>
+
+ <SPAN TYPE="MARKUP" DELEGATE="ASPVB_CSJS">
+ <BEGIN><script></BEGIN>
+ <END></script></END>
+ </SPAN>
+
+ <!-- Server-Side include -->
+ <SPAN TYPE="MARKUP">
+ <BEGIN><!--#</BEGIN>
+ <END>--></END>
+ </SPAN>
+
+ <!-- SGML comment -->
+ <SPAN TYPE="COMMENT1" DELEGATE="ASPVB_SGML">
+ <BEGIN><!--</BEGIN>
+ <END>--></END>
+ </SPAN>
+
+ <!-- stylesheet -->
+ <SPAN TYPE="MARKUP" DELEGATE="ASPVB_STYLE">
+ <BEGIN><STYLE></BEGIN>
+ <END></STYLE></END>
+ </SPAN>
+
+ <!-- markup tags -->
+ <SPAN TYPE="MARKUP" DELEGATE="ASPVB_TAGS">
+ <BEGIN></</BEGIN>
+ <END>></END>
+ </SPAN>
+
+ <SPAN TYPE="MARKUP" DELEGATE="ASPVB_TAGS">
+ <BEGIN><</BEGIN>
+ <END>></END>
+ </SPAN>
+
+ <!-- SGML entities -->
+ <SPAN TYPE="LITERAL2" NO_WORD_BREAK="TRUE">
+ <BEGIN>&</BEGIN>
+ <END>;</END>
+ </SPAN>
+ </RULES>
+
+ <!-- ******************************************************************
+ ASP with JScript as default script engine
+ ****************************************************************** -->
+ <RULES SET="ASPJS" IGNORE_CASE="TRUE">
+ <!-- Inlined server-side Javascript -->
+ <SPAN TYPE="MARKUP" DELEGATE="javascript::MAIN">
+ <BEGIN><%</BEGIN>
+ <END>%></END>
+ </SPAN>
+
+ <!-- Server-side VBScript -->
+ <SPAN TYPE="MARKUP" DELEGATE="vbscript::MAIN">
+ <BEGIN><script language="vbscript" runat="server"></BEGIN>
+ <END></script></END>
+ </SPAN>
+
+ <!-- Server-side Javascript -->
+ <SPAN TYPE="MARKUP" DELEGATE="javascript::MAIN">
+ <BEGIN><script language="jscript" runat="server"></BEGIN>
+ <END></script></END>
+ </SPAN>
+
+ <SPAN TYPE="MARKUP" DELEGATE="javascript::MAIN">
+ <BEGIN><script language="javascript" runat="server"></BEGIN>
+ <END></script></END>
+ </SPAN>
+
+ <!-- Server-side PerlScript -->
+ <SPAN TYPE="MARKUP" DELEGATE="perl::MAIN">
+ <BEGIN><script language="perlscript" runat="server"></BEGIN>
+ <END></script></END>
+ </SPAN>
+
+ <!-- Client-side javascript -->
+ <SPAN TYPE="MARKUP" DELEGATE="ASPJS_CSJS">
+ <BEGIN><script language="jscript"</BEGIN>
+ <END></script></END>
+ </SPAN>
+
+ <SPAN TYPE="MARKUP" DELEGATE="ASPJS_CSJS">
+ <BEGIN><script language="javascript"</BEGIN>
+ <END></script></END>
+ </SPAN>
+
+ <SPAN TYPE="MARKUP" DELEGATE="ASPJS_CSJS">
+ <BEGIN><script></BEGIN>
+ <END></script></END>
+ </SPAN>
+
+ <!-- Server-Side include -->
+ <SPAN TYPE="MARKUP">
+ <BEGIN><!--#</BEGIN>
+ <END>--></END>
+ </SPAN>
+
+ <!-- SGML comment -->
+ <SPAN TYPE="COMMENT1" DELEGATE="ASPJS_SGML">
+ <BEGIN><!--</BEGIN>
+ <END>--></END>
+ </SPAN>
+
+ <!-- stylesheet -->
+ <SPAN TYPE="MARKUP" DELEGATE="ASPJS_STYLE">
+ <BEGIN><STYLE></BEGIN>
+ <END></STYLE></END>
+ </SPAN>
+
+ <!-- markup tags -->
+ <SPAN TYPE="MARKUP" DELEGATE="ASPJS_TAGS">
+ <BEGIN></</BEGIN>
+ <END>></END>
+ </SPAN>
+
+ <SPAN TYPE="MARKUP" DELEGATE="ASPJS_TAGS">
+ <BEGIN><</BEGIN>
+ <END>></END>
+ </SPAN>
+
+ <!-- SGML entities -->
+ <SPAN TYPE="LITERAL2" NO_WORD_BREAK="TRUE">
+ <BEGIN>&</BEGIN>
+ <END>;</END>
+ </SPAN>
+ </RULES>
+
+ <!-- ******************************************************************
+ ASP with PerlScript as default script engine
+ ****************************************************************** -->
+ <RULES SET="ASPPL" IGNORE_CASE="TRUE">
+ <!-- Inlined server-side Perlscript -->
+ <SPAN TYPE="MARKUP" DELEGATE="perl::MAIN">
+ <BEGIN><%</BEGIN>
+ <END>%></END>
+ </SPAN>
+
+ <!-- Server-side VBScript -->
+ <SPAN TYPE="MARKUP" DELEGATE="vbscript::MAIN">
+ <BEGIN><script language="vbscript" runat="server"></BEGIN>
+ <END></script></END>
+ </SPAN>
+
+ <!-- Server-side Javascript -->
+ <SPAN TYPE="MARKUP" DELEGATE="javascript::MAIN">
+ <BEGIN><script language="jscript" runat="server"></BEGIN>
+ <END></script></END>
+ </SPAN>
+
+ <SPAN TYPE="MARKUP" DELEGATE="javascript::MAIN">
+ <BEGIN><script language="javascript" runat="server"</BEGIN>
+ <END></script></END>
+ </SPAN>
+
+ <!-- Server-side PerlScript -->
+ <SPAN TYPE="MARKUP" DELEGATE="perl::MAIN">
+ <BEGIN><script language="perlscript" runat="server"></BEGIN>
+ <END></script></END>
+ </SPAN>
+
+ <!-- Client-side javascript -->
+ <SPAN TYPE="MARKUP" DELEGATE="ASPPL_CSJS">
+ <BEGIN><script language="jscript"</BEGIN>
+ <END></script></END>
+ </SPAN>
+
+ <SPAN TYPE="MARKUP" DELEGATE="ASPPL_CSJS">
+ <BEGIN><script language="javascript"</BEGIN>
+ <END></script></END>
+ </SPAN>
+
+ <SPAN TYPE="MARKUP" DELEGATE="ASPPL_CSJS">
+ <BEGIN><script></BEGIN>
+ <END></script></END>
+ </SPAN>
+
+ <!-- Server-Side include -->
+ <SPAN TYPE="MARKUP">
+ <BEGIN><!--#</BEGIN>
+ <END>--></END>
+ </SPAN>
+
+ <!-- SGML comment -->
+ <SPAN TYPE="COMMENT1" DELEGATE="ASPPL_SGML">
+ <BEGIN><!--</BEGIN>
+ <END>--></END>
+ </SPAN>
+
+ <!-- stylesheet -->
+ <SPAN TYPE="MARKUP" DELEGATE="ASPPL_STYLE">
+ <BEGIN><STYLE></BEGIN>
+ <END></STYLE></END>
+ </SPAN>
+
+ <!-- markup tags -->
+ <SPAN TYPE="MARKUP" DELEGATE="ASPPL_TAGS">
+ <BEGIN></</BEGIN>
+ <END>></END>
+ </SPAN>
+
+ <SPAN TYPE="MARKUP" DELEGATE="ASPPL_TAGS">
+ <BEGIN><</BEGIN>
+ <END>></END>
+ </SPAN>
+
+ <!-- SGML entities -->
+ <SPAN TYPE="LITERAL2" NO_WORD_BREAK="TRUE">
+ <BEGIN>&</BEGIN>
+ <END>;</END>
+ </SPAN>
+ </RULES>
+
+ <!-- ******************************************************************
+ HTML Tags
+ ****************************************************************** -->
+ <RULES SET="ASPVB_TAGS" DEFAULT="MARKUP">
+ <!-- Server-side VBScript -->
+ <SPAN TYPE="MARKUP" DELEGATE="vbscript::MAIN">
+ <BEGIN><%</BEGIN>
+ <END>%></END>
+ </SPAN>
+
+ <SPAN TYPE="LITERAL1" DELEGATE ="ASPVB_LIT1">
+ <BEGIN>"</BEGIN>
+ <END>"</END>
+ </SPAN>
+
+ <SPAN TYPE="LITERAL1" DELEGATE ="ASPVB_LIT1">
+ <BEGIN>'</BEGIN>
+ <END>'</END>
+ </SPAN>
+
+ <SEQ TYPE="OPERATOR">=</SEQ>
+ </RULES>
+
+ <RULES SET="ASPVB_LIT1" DEFAULT="LITERAL1">
+ <!-- Server-side VBScript -->
+ <SPAN TYPE="MARKUP" DELEGATE="vbscript::MAIN">
+ <BEGIN><%</BEGIN>
+ <END>%></END>
+ </SPAN>
+ </RULES>
+
+ <RULES SET="ASPJS_TAGS" DEFAULT="MARKUP">
+ <!-- Server-side JavaScript -->
+ <SPAN TYPE="MARKUP" DELEGATE="javascript::MAIN">
+ <BEGIN><%</BEGIN>
+ <END>%></END>
+ </SPAN>
+
+ <SPAN TYPE="LITERAL1" DELEGATE ="ASPJS_LIT1">
+ <BEGIN>"</BEGIN>
+ <END>"</END>
+ </SPAN>
+
+ <SPAN TYPE="LITERAL1" DELEGATE ="ASPJS_LIT1">
+ <BEGIN>'</BEGIN>
+ <END>'</END>
+ </SPAN>
+
+ <SEQ TYPE="OPERATOR">=</SEQ>
+ </RULES>
+
+ <RULES SET="ASPJS_LIT1" DEFAULT="LITERAL1">
+ <!-- Server-side JavaScript -->
+ <SPAN TYPE="MARKUP" DELEGATE="javascript::MAIN">
+ <BEGIN><%</BEGIN>
+ <END>%></END>
+ </SPAN>
+ </RULES>
+
+ <RULES SET="ASPPL_TAGS" DEFAULT="MARKUP">
+ <!-- Server-side PerlScript -->
+ <SPAN TYPE="MARKUP" DELEGATE="perl::MAIN">
+ <BEGIN><%</BEGIN>
+ <END>%></END>
+ </SPAN>
+
+ <SPAN TYPE="LITERAL1" DELEGATE ="ASPPL_LIT1">
+ <BEGIN>"</BEGIN>
+ <END>"</END>
+ </SPAN>
+
+ <SPAN TYPE="LITERAL1" DELEGATE ="ASPPL_LIT1">
+ <BEGIN>'</BEGIN>
+ <END>'</END>
+ </SPAN>
+
+ <SEQ TYPE="OPERATOR">=</SEQ>
+ </RULES>
+
+ <RULES SET="ASPPL_LIT1" DEFAULT="LITERAL1">
+ <!-- Server-side PerlScript -->
+ <SPAN TYPE="MARKUP" DELEGATE="perl::MAIN">
+ <BEGIN><%</BEGIN>
+ <END>%></END>
+ </SPAN>
+ </RULES>
+
+ <!-- These three rules sets handle server side scripts being mixed into client side javascript -->
+ <RULES SET="ASPVB_CSJS">
+ <!-- Server-side VBScript -->
+ <SPAN TYPE="MARKUP" DELEGATE="vbscript::MAIN">
+ <BEGIN><%</BEGIN>
+ <END>%></END>
+ </SPAN>
+ <IMPORT DELEGATE="javascript::MAIN"/>
+ </RULES>
+
+ <RULES SET="ASPJS_CSJS">
+ <!-- Server-side JavaScript -->
+ <SPAN TYPE="MARKUP" DELEGATE="javascript::MAIN">
+ <BEGIN><%</BEGIN>
+ <END>%></END>
+ </SPAN>
+ <IMPORT DELEGATE="javascript::MAIN"/>
+ </RULES>
+
+ <RULES SET="ASPPL_CSJS">
+ <!-- Server-side PerlScript -->
+ <SPAN TYPE="MARKUP" DELEGATE="perl::MAIN">
+ <BEGIN><%</BEGIN>
+ <END>%></END>
+ </SPAN>
+ <IMPORT DELEGATE="javascript::MAIN"/>
+ </RULES>
+
+ <!-- These three rules sets handle server side scripts being mixed into stylesheets -->
+ <RULES SET="ASPVB_STYLE">
+ <!-- Server-side VBScript -->
+ <SPAN TYPE="MARKUP" DELEGATE="vbscript::MAIN">
+ <BEGIN><%</BEGIN>
+ <END>%></END>
+ </SPAN>
+ <IMPORT DELEGATE="css::MAIN"/>
+ </RULES>
+
+ <RULES SET="ASPJS_STYLE">
+ <!-- Server-side JavaScript -->
+ <SPAN TYPE="MARKUP" DELEGATE="javascript::MAIN">
+ <BEGIN><%</BEGIN>
+ <END>%></END>
+ </SPAN>
+ <IMPORT DELEGATE="css::MAIN"/>
+ </RULES>
+
+ <RULES SET="ASPPL_STYLE">
+ <!-- Server-side PerlScript -->
+ <SPAN TYPE="MARKUP" DELEGATE="perl::MAIN">
+ <BEGIN><%</BEGIN>
+ <END>%></END>
+ </SPAN>
+ <IMPORT DELEGATE="css::MAIN"/>
+ </RULES>
+
+ <!-- These three rules sets handle server side scripts being mixed into SGML Comments -->
+ <RULES SET="ASPVB_SGML" DEFAULT="COMMENT1">
+ <!-- Server-side VBScript -->
+ <SPAN TYPE="MARKUP" DELEGATE="vbscript::MAIN">
+ <BEGIN><%</BEGIN>
+ <END>%></END>
+ </SPAN>
+ </RULES>
+
+ <RULES SET="ASPJS_SGML" DEFAULT="COMMENT1">
+ <!-- Server-side JavaScript -->
+ <SPAN TYPE="MARKUP" DELEGATE="javascript::MAIN">
+ <BEGIN><%</BEGIN>
+ <END>%></END>
+ </SPAN>
+ </RULES>
+
+ <RULES SET="ASPPL_SGML" DEFAULT="COMMENT1">
+ <!-- Server-side PerlScript -->
+ <SPAN TYPE="MARKUP" DELEGATE="perl::MAIN">
+ <BEGIN><%</BEGIN>
+ <END>%></END>
+ </SPAN>
+ </RULES>
+</MODE>
+
diff --git a/jEdit/modes/aspect-j.xml b/jEdit/modes/aspect-j.xml
index 94af02e..7695d3e 100644
--- a/jEdit/modes/aspect-j.xml
+++ b/jEdit/modes/aspect-j.xml
@@ -1,167 +1,167 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE MODE SYSTEM "xmode.dtd">
-
-<MODE>
- <PROPS>
- <PROPERTY NAME="indentOpenBrackets" VALUE="{" />
- <PROPERTY NAME="indentCloseBrackets" VALUE="}" />
- <PROPERTY NAME="indentPrevLine"
- VALUE="\s*(((if|while)\s*\(|else\s*|else\s+if\s*\(|for\s*\(.*\))[^{;]*)" />
- <!-- set this to 'true' if you want to use GNU coding style -->
- <PROPERTY NAME="doubleBracketIndent" VALUE="false" />
- <PROPERTY NAME="commentStart" VALUE="/*" />
- <PROPERTY NAME="commentEnd" VALUE="*/" />
- <PROPERTY NAME="lineComment" VALUE="//" />
- <PROPERTY NAME="wordBreakChars" VALUE=",+-=<>/?^&*" />
- </PROPS>
- <RULES IGNORE_CASE="FALSE"
- HIGHLIGHT_DIGITS="TRUE"
- DIGIT_RE="(0x)?[\p{XDigit}]+[lLdDfF]?">
-
- <!-- Silly comment -->
- <SEQ TYPE="COMMENT1">/**/</SEQ>
-
- <!-- Javadoc comment -->
- <SPAN TYPE="COMMENT3" DELEGATE="java::JAVADOC">
- <BEGIN>/**</BEGIN>
- <END>*/</END>
- </SPAN>
-
- <!-- Java comment (C style) -->
- <SPAN TYPE="COMMENT1">
- <BEGIN>/*</BEGIN>
- <END>*/</END>
- </SPAN>
-
- <SPAN TYPE="LITERAL1" ESCAPE="\" NO_LINE_BREAK="TRUE">
- <BEGIN>"</BEGIN>
- <END>"</END>
- </SPAN>
- <SPAN TYPE="LITERAL1" ESCAPE="\" NO_LINE_BREAK="TRUE">
- <BEGIN>'</BEGIN>
- <END>'</END>
- </SPAN>
-
- <EOL_SPAN TYPE="COMMENT2">//</EOL_SPAN>
-
- <SEQ TYPE="OPERATOR">=</SEQ>
- <SEQ TYPE="OPERATOR">!</SEQ>
- <SEQ TYPE="OPERATOR">>=</SEQ>
- <SEQ TYPE="OPERATOR"><=</SEQ>
- <SEQ TYPE="OPERATOR">+</SEQ>
- <SEQ TYPE="OPERATOR">-</SEQ>
- <SEQ TYPE="OPERATOR">/</SEQ>
-
- <!-- workaround to stop "*" from being colorized
- in import statements. -->
- <SEQ TYPE="NULL">.*</SEQ>
-
- <SEQ TYPE="OPERATOR">*</SEQ>
- <SEQ TYPE="OPERATOR">></SEQ>
- <SEQ TYPE="OPERATOR"><</SEQ>
- <SEQ TYPE="OPERATOR">%</SEQ>
- <SEQ TYPE="OPERATOR">&</SEQ>
- <SEQ TYPE="OPERATOR">|</SEQ>
- <SEQ TYPE="OPERATOR">^</SEQ>
- <SEQ TYPE="OPERATOR">~</SEQ>
- <SEQ TYPE="OPERATOR">}</SEQ>
- <SEQ TYPE="OPERATOR">{</SEQ>
- <MARK_PREVIOUS TYPE="LABEL" MATCH_TYPE="OPERATOR"
- AT_WHITESPACE_END="TRUE">:</MARK_PREVIOUS>
-
- <!-- Function calls -->
- <MARK_PREVIOUS TYPE="FUNCTION" MATCH_TYPE="OPERATOR">(</MARK_PREVIOUS>
- <SEQ TYPE="OPERATOR">)</SEQ>
-
- <KEYWORDS>
- <KEYWORD1>abstract</KEYWORD1>
- <KEYWORD1>break</KEYWORD1>
- <KEYWORD1>case</KEYWORD1>
- <KEYWORD1>catch</KEYWORD1>
- <KEYWORD1>continue</KEYWORD1>
- <KEYWORD1>default</KEYWORD1>
- <KEYWORD1>do</KEYWORD1>
- <KEYWORD1>else</KEYWORD1>
- <KEYWORD1>extends</KEYWORD1>
- <KEYWORD1>final</KEYWORD1>
- <KEYWORD1>finally</KEYWORD1>
- <KEYWORD1>for</KEYWORD1>
- <KEYWORD1>if</KEYWORD1>
- <KEYWORD1>implements</KEYWORD1>
- <KEYWORD1>instanceof</KEYWORD1>
- <KEYWORD1>native</KEYWORD1>
- <KEYWORD1>new</KEYWORD1>
- <KEYWORD1>private</KEYWORD1>
- <KEYWORD1>protected</KEYWORD1>
- <KEYWORD1>public</KEYWORD1>
- <KEYWORD1>return</KEYWORD1>
- <KEYWORD1>static</KEYWORD1>
- <KEYWORD1>switch</KEYWORD1>
- <KEYWORD1>synchronized</KEYWORD1>
- <KEYWORD1>throw</KEYWORD1>
- <KEYWORD1>throws</KEYWORD1>
- <KEYWORD1>transient</KEYWORD1>
- <KEYWORD1>try</KEYWORD1>
- <KEYWORD1>volatile</KEYWORD1>
- <KEYWORD1>while</KEYWORD1>
-
- <KEYWORD2>package</KEYWORD2>
- <KEYWORD2>import</KEYWORD2>
-
- <KEYWORD3>boolean</KEYWORD3>
- <KEYWORD3>byte</KEYWORD3>
- <KEYWORD3>char</KEYWORD3>
- <KEYWORD3>class</KEYWORD3>
- <KEYWORD3>double</KEYWORD3>
- <KEYWORD3>float</KEYWORD3>
- <KEYWORD3>int</KEYWORD3>
- <KEYWORD3>interface</KEYWORD3>
- <KEYWORD3>long</KEYWORD3>
- <KEYWORD3>short</KEYWORD3>
- <KEYWORD3>void</KEYWORD3>
-
- <FUNCTION>assert</FUNCTION>
- <KEYWORD1>strictfp</KEYWORD1>
-
- <LITERAL2>false</LITERAL2>
- <LITERAL2>null</LITERAL2>
- <LITERAL2>super</LITERAL2>
- <LITERAL2>this</LITERAL2>
- <LITERAL2>true</LITERAL2>
-
- <INVALID>goto</INVALID>
- <INVALID>const</INVALID>
-
- <KEYWORD4>args</KEYWORD4>
- <KEYWORD4>percflow</KEYWORD4>
- <KEYWORD4>get</KEYWORD4>
- <KEYWORD4>set</KEYWORD4>
- <KEYWORD4>preinitialization</KEYWORD4>
- <KEYWORD4>handler</KEYWORD4>
- <KEYWORD4>adviceexecution</KEYWORD4>
- <KEYWORD4>cflow</KEYWORD4>
- <KEYWORD4>target</KEYWORD4>
- <KEYWORD4>cflowbelow</KEYWORD4>
- <KEYWORD4>withincode</KEYWORD4>
- <KEYWORD4>declare</KEYWORD4>
- <KEYWORD4>precedence</KEYWORD4>
- <KEYWORD4>issingleton</KEYWORD4>
- <KEYWORD4>perthis</KEYWORD4>
- <KEYWORD4>pertarget</KEYWORD4>
- <KEYWORD4>privileged</KEYWORD4>
- <KEYWORD4>after</KEYWORD4>
- <KEYWORD4>around</KEYWORD4>
- <KEYWORD4>aspect</KEYWORD4>
- <KEYWORD4>before</KEYWORD4>
- <KEYWORD4>call</KEYWORD4>
- <KEYWORD4>execution</KEYWORD4>
- <KEYWORD4>initialization</KEYWORD4>
- <KEYWORD4>pointcut</KEYWORD4>
- <KEYWORD4>proceed</KEYWORD4>
- <KEYWORD4>staticinitialization</KEYWORD4>
- <KEYWORD4>within</KEYWORD4>
- <KEYWORD4>..</KEYWORD4>
- </KEYWORDS>
- </RULES>
-</MODE>
+<?xml version="1.0"?>
+
+<!DOCTYPE MODE SYSTEM "xmode.dtd">
+
+<MODE>
+ <PROPS>
+ <PROPERTY NAME="indentOpenBrackets" VALUE="{" />
+ <PROPERTY NAME="indentCloseBrackets" VALUE="}" />
+ <PROPERTY NAME="indentPrevLine"
+ VALUE="\s*(((if|while)\s*\(|else\s*|else\s+if\s*\(|for\s*\(.*\))[^{;]*)" />
+ <!-- set this to 'true' if you want to use GNU coding style -->
+ <PROPERTY NAME="doubleBracketIndent" VALUE="false" />
+ <PROPERTY NAME="commentStart" VALUE="/*" />
+ <PROPERTY NAME="commentEnd" VALUE="*/" />
+ <PROPERTY NAME="lineComment" VALUE="//" />
+ <PROPERTY NAME="wordBreakChars" VALUE=",+-=<>/?^&*" />
+ </PROPS>
+ <RULES IGNORE_CASE="FALSE"
+ HIGHLIGHT_DIGITS="TRUE"
+ DIGIT_RE="(0x)?[\p{XDigit}]+[lLdDfF]?">
+
+ <!-- Silly comment -->
+ <SEQ TYPE="COMMENT1">/**/</SEQ>
+
+ <!-- Javadoc comment -->
+ <SPAN TYPE="COMMENT3" DELEGATE="java::JAVADOC">
+ <BEGIN>/**</BEGIN>
+ <END>*/</END>
+ </SPAN>
+
+ <!-- Java comment (C style) -->
+ <SPAN TYPE="COMMENT1">
+ <BEGIN>/*</BEGIN>
+ <END>*/</END>
+ </SPAN>
+
+ <SPAN TYPE="LITERAL1" ESCAPE="\" NO_LINE_BREAK="TRUE">
+ <BEGIN>"</BEGIN>
+ <END>"</END>
+ </SPAN>
+ <SPAN TYPE="LITERAL1" ESCAPE="\" NO_LINE_BREAK="TRUE">
+ <BEGIN>'</BEGIN>
+ <END>'</END>
+ </SPAN>
+
+ <EOL_SPAN TYPE="COMMENT2">//</EOL_SPAN>
+
+ <SEQ TYPE="OPERATOR">=</SEQ>
+ <SEQ TYPE="OPERATOR">!</SEQ>
+ <SEQ TYPE="OPERATOR">>=</SEQ>
+ <SEQ TYPE="OPERATOR"><=</SEQ>
+ <SEQ TYPE="OPERATOR">+</SEQ>
+ <SEQ TYPE="OPERATOR">-</SEQ>
+ <SEQ TYPE="OPERATOR">/</SEQ>
+
+ <!-- workaround to stop "*" from being colorized
+ in import statements. -->
+ <SEQ TYPE="NULL">.*</SEQ>
+
+ <SEQ TYPE="OPERATOR">*</SEQ>
+ <SEQ TYPE="OPERATOR">></SEQ>
+ <SEQ TYPE="OPERATOR"><</SEQ>
+ <SEQ TYPE="OPERATOR">%</SEQ>
+ <SEQ TYPE="OPERATOR">&</SEQ>
+ <SEQ TYPE="OPERATOR">|</SEQ>
+ <SEQ TYPE="OPERATOR">^</SEQ>
+ <SEQ TYPE="OPERATOR">~</SEQ>
+ <SEQ TYPE="OPERATOR">}</SEQ>
+ <SEQ TYPE="OPERATOR">{</SEQ>
+ <MARK_PREVIOUS TYPE="LABEL" MATCH_TYPE="OPERATOR"
+ AT_WHITESPACE_END="TRUE">:</MARK_PREVIOUS>
+
+ <!-- Function calls -->
+ <MARK_PREVIOUS TYPE="FUNCTION" MATCH_TYPE="OPERATOR">(</MARK_PREVIOUS>
+ <SEQ TYPE="OPERATOR">)</SEQ>
+
+ <KEYWORDS>
+ <KEYWORD1>abstract</KEYWORD1>
+ <KEYWORD1>break</KEYWORD1>
+ <KEYWORD1>case</KEYWORD1>
+ <KEYWORD1>catch</KEYWORD1>
+ <KEYWORD1>continue</KEYWORD1>
+ <KEYWORD1>default</KEYWORD1>
+ <KEYWORD1>do</KEYWORD1>
+ <KEYWORD1>else</KEYWORD1>
+ <KEYWORD1>extends</KEYWORD1>
+ <KEYWORD1>final</KEYWORD1>
+ <KEYWORD1>finally</KEYWORD1>
+ <KEYWORD1>for</KEYWORD1>
+ <KEYWORD1>if</KEYWORD1>
+ <KEYWORD1>implements</KEYWORD1>
+ <KEYWORD1>instanceof</KEYWORD1>
+ <KEYWORD1>native</KEYWORD1>
+ <KEYWORD1>new</KEYWORD1>
+ <KEYWORD1>private</KEYWORD1>
+ <KEYWORD1>protected</KEYWORD1>
+ <KEYWORD1>public</KEYWORD1>
+ <KEYWORD1>return</KEYWORD1>
+ <KEYWORD1>static</KEYWORD1>
+ <KEYWORD1>switch</KEYWORD1>
+ <KEYWORD1>synchronized</KEYWORD1>
+ <KEYWORD1>throw</KEYWORD1>
+ <KEYWORD1>throws</KEYWORD1>
+ <KEYWORD1>transient</KEYWORD1>
+ <KEYWORD1>try</KEYWORD1>
+ <KEYWORD1>volatile</KEYWORD1>
+ <KEYWORD1>while</KEYWORD1>
+
+ <KEYWORD2>package</KEYWORD2>
+ <KEYWORD2>import</KEYWORD2>
+
+ <KEYWORD3>boolean</KEYWORD3>
+ <KEYWORD3>byte</KEYWORD3>
+ <KEYWORD3>char</KEYWORD3>
+ <KEYWORD3>class</KEYWORD3>
+ <KEYWORD3>double</KEYWORD3>
+ <KEYWORD3>float</KEYWORD3>
+ <KEYWORD3>int</KEYWORD3>
+ <KEYWORD3>interface</KEYWORD3>
+ <KEYWORD3>long</KEYWORD3>
+ <KEYWORD3>short</KEYWORD3>
+ <KEYWORD3>void</KEYWORD3>
+
+ <FUNCTION>assert</FUNCTION>
+ <KEYWORD1>strictfp</KEYWORD1>
+
+ <LITERAL2>false</LITERAL2>
+ <LITERAL2>null</LITERAL2>
+ <LITERAL2>super</LITERAL2>
+ <LITERAL2>this</LITERAL2>
+ <LITERAL2>true</LITERAL2>
+
+ <INVALID>goto</INVALID>
+ <INVALID>const</INVALID>
+
+ <KEYWORD4>args</KEYWORD4>
+ <KEYWORD4>percflow</KEYWORD4>
+ <KEYWORD4>get</KEYWORD4>
+ <KEYWORD4>set</KEYWORD4>
+ <KEYWORD4>preinitialization</KEYWORD4>
+ <KEYWORD4>handler</KEYWORD4>
+ <KEYWORD4>adviceexecution</KEYWORD4>
+ <KEYWORD4>cflow</KEYWORD4>
+ <KEYWORD4>target</KEYWORD4>
+ <KEYWORD4>cflowbelow</KEYWORD4>
+ <KEYWORD4>withincode</KEYWORD4>
+ <KEYWORD4>declare</KEYWORD4>
+ <KEYWORD4>precedence</KEYWORD4>
+ <KEYWORD4>issingleton</KEYWORD4>
+ <KEYWORD4>perthis</KEYWORD4>
+ <KEYWORD4>pertarget</KEYWORD4>
+ <KEYWORD4>privileged</KEYWORD4>
+ <KEYWORD4>after</KEYWORD4>
+ <KEYWORD4>around</KEYWORD4>
+ <KEYWORD4>aspect</KEYWORD4>
+ <KEYWORD4>before</KEYWORD4>
+ <KEYWORD4>call</KEYWORD4>
+ <KEYWORD4>execution</KEYWORD4>
+ <KEYWORD4>initialization</KEYWORD4>
+ <KEYWORD4>pointcut</KEYWORD4>
+ <KEYWORD4>proceed</KEYWORD4>
+ <KEYWORD4>staticinitialization</KEYWORD4>
+ <KEYWORD4>within</KEYWORD4>
+ <KEYWORD4>..</KEYWORD4>
+ </KEYWORDS>
+ </RULES>
+</MODE>
diff --git a/jEdit/modes/assembly-m68k.xml b/jEdit/modes/assembly-m68k.xml
index 03a6c4c..505c06a 100644
--- a/jEdit/modes/assembly-m68k.xml
+++ b/jEdit/modes/assembly-m68k.xml
@@ -1,508 +1,508 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE MODE SYSTEM "xmode.dtd">
-
-<!--
- M68000 Assembly mode by Igor Lesik (curoles at yahoo.com)
- version 0.2 (July 24, 2006)
- TODO: i)add missing size qualifiers, ii)add Xcc like instructions
--->
-
-<MODE>
-
- <PROPS>
- <PROPERTY NAME="lineComment" VALUE=";" />
- </PROPS>
-
- <RULES IGNORE_CASE="TRUE" HIGHLIGHT_DIGITS="TRUE" DIGIT_RE="(0x\p{XDigit}+|\d+)">
-
- <EOL_SPAN TYPE="COMMENT1">;</EOL_SPAN>
- <EOL_SPAN TYPE="COMMENT2">*</EOL_SPAN>
-
- <SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">
- <BEGIN>'</BEGIN>
- <END>'</END>
- </SPAN>
-
- <SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">
- <BEGIN>"</BEGIN>
- <END>"</END>
- </SPAN>
-
-
-
- <MARK_FOLLOWING TYPE="KEYWORD2" AT_LINE_START="TRUE">$</MARK_FOLLOWING>
-
- <MARK_PREVIOUS TYPE="LABEL" MATCH_TYPE="OPERATOR"
- AT_LINE_START="TRUE">:</MARK_PREVIOUS>
-
- <SEQ TYPE="NULL">,</SEQ>
- <SEQ TYPE="NULL">:</SEQ>
- <SEQ TYPE="NULL">(</SEQ>
- <SEQ TYPE="NULL">)</SEQ>
- <SEQ TYPE="NULL">]</SEQ>
- <SEQ TYPE="NULL">[</SEQ>
- <SEQ TYPE="NULL">$</SEQ>
-
- <SEQ TYPE="OPERATOR">+</SEQ>
- <SEQ TYPE="OPERATOR">-</SEQ>
- <SEQ TYPE="OPERATOR">/</SEQ>
- <SEQ TYPE="OPERATOR">*</SEQ>
- <SEQ TYPE="OPERATOR">%</SEQ>
-
- <SEQ TYPE="OPERATOR">|</SEQ>
- <SEQ TYPE="OPERATOR">^</SEQ>
- <SEQ TYPE="OPERATOR">&</SEQ>
- <SEQ TYPE="OPERATOR">~</SEQ>
- <SEQ TYPE="OPERATOR">!</SEQ>
-
- <SEQ TYPE="OPERATOR">=</SEQ>
- <SEQ TYPE="OPERATOR"><</SEQ>
- <SEQ TYPE="OPERATOR">></SEQ>
-
- <KEYWORDS>
-
- <!-- ************************* REGISTERS ********************************* -->
- <!-- For sake of commonality with existing asm86 mode we use Keyword3 for registers-->
-
- <!-- General-purpose data registers -->
- <KEYWORD3>D0</KEYWORD3>
- <KEYWORD3>D1</KEYWORD3>
- <KEYWORD3>D2</KEYWORD3>
- <KEYWORD3>D3</KEYWORD3>
- <KEYWORD3>D4</KEYWORD3>
- <KEYWORD3>D5</KEYWORD3>
- <KEYWORD3>D6</KEYWORD3>
- <KEYWORD3>D7</KEYWORD3>
-
- <!-- Address registers -->
- <KEYWORD3>A0</KEYWORD3>
- <KEYWORD3>A1</KEYWORD3>
- <KEYWORD3>A2</KEYWORD3>
- <KEYWORD3>A3</KEYWORD3>
- <KEYWORD3>A4</KEYWORD3>
- <KEYWORD3>A5</KEYWORD3>
- <KEYWORD3>A6</KEYWORD3>
- <KEYWORD3>A7</KEYWORD3>
-
- <!-- Floating-point data registers -->
- <KEYWORD3>FP0</KEYWORD3>
- <KEYWORD3>FP1</KEYWORD3>
- <KEYWORD3>FP2</KEYWORD3>
- <KEYWORD3>FP3</KEYWORD3>
- <KEYWORD3>FP4</KEYWORD3>
- <KEYWORD3>FP5</KEYWORD3>
- <KEYWORD3>FP6</KEYWORD3>
- <KEYWORD3>FP7</KEYWORD3>
-
- <KEYWORD3>SP</KEYWORD3>
- <KEYWORD3>CCR</KEYWORD3>
-
- <!-- ************************** DIRECTIVES ********************************** -->
-
- <!-- Assembler directives give instructions to the assembler (not the 68000 chip which will execute
- your program) on how to assemble your program.
- These directives may be grouped into the following categories.-->
-
- <!-- Miscellaneous -->
- <KEYWORD1>OPT</KEYWORD1>
- <KEYWORD1>INCLUDE</KEYWORD1>
- <KEYWORD1>FAIL</KEYWORD1>
- <KEYWORD1>END</KEYWORD1>
- <KEYWORD1>REG</KEYWORD1>
-
- <!-- Listing Control -->
- <KEYWORD1>PAGE</KEYWORD1>
- <KEYWORD1>LIST</KEYWORD1>
- <KEYWORD1>NOLIST</KEYWORD1>
- <KEYWORD1>SPC</KEYWORD1>
- <KEYWORD1>TTL</KEYWORD1>
-
- <!-- Section Control -->
- <KEYWORD1>ORG</KEYWORD1>
-
- <!-- Symbol Definition -->
- <KEYWORD1>EQU</KEYWORD1>
- <KEYWORD1>SET</KEYWORD1>
-
- <!-- Data Definition -->
- <KEYWORD1>DS</KEYWORD1>
- <KEYWORD1>DC</KEYWORD1>
-
- <!-- Structured Programming Constructs -->
- <KEYWORD1>FOR</KEYWORD1>
- <KEYWORD1>ENDF</KEYWORD1>
- <KEYWORD1>IF</KEYWORD1>
- <KEYWORD1>THEN</KEYWORD1>
- <KEYWORD1>ELSE</KEYWORD1>
- <KEYWORD1>ENDI</KEYWORD1>
- <KEYWORD1>REPEAT</KEYWORD1>
- <KEYWORD1>UNTIL</KEYWORD1>
- <KEYWORD1>WHILE</KEYWORD1>
- <KEYWORD1>DO</KEYWORD1>
- <KEYWORD1>ENDW</KEYWORD1>
-
- <KEYWORD1>MACRO</KEYWORD1>
-
-
- <!-- *************************** INSTRUCTIONS **************************************** -->
- <FUNCTION>ABCD</FUNCTION>
- <FUNCTION>ADD</FUNCTION>
- <FUNCTION>ADD.B</FUNCTION>
- <FUNCTION>ADD.W</FUNCTION>
- <FUNCTION>ADD.L</FUNCTION>
- <FUNCTION>ADDA</FUNCTION>
- <FUNCTION>ADDA.W</FUNCTION>
- <FUNCTION>ADDA.L</FUNCTION>
- <FUNCTION>ADDI</FUNCTION>
- <FUNCTION>ADDI.B</FUNCTION>
- <FUNCTION>ADDI.W</FUNCTION>
- <FUNCTION>ADDI.L</FUNCTION>
- <FUNCTION>ADDQ</FUNCTION>
- <FUNCTION>ADDQ.B</FUNCTION>
- <FUNCTION>ADDQ.W</FUNCTION>
- <FUNCTION>ADDQ.L</FUNCTION>
- <FUNCTION>ADDX</FUNCTION>
- <FUNCTION>ADDX.B</FUNCTION>
- <FUNCTION>ADDX.W</FUNCTION>
- <FUNCTION>ADDX.L</FUNCTION>
- <FUNCTION>AND</FUNCTION>
- <FUNCTION>AND.B</FUNCTION>
- <FUNCTION>AND.W</FUNCTION>
- <FUNCTION>AND.L</FUNCTION>
- <FUNCTION>ANDI</FUNCTION>
- <FUNCTION>ANDI.B</FUNCTION>
- <FUNCTION>ANDI.W</FUNCTION>
- <FUNCTION>ANDI.L</FUNCTION>
- <FUNCTION>ASL</FUNCTION>
- <FUNCTION>ASL.B</FUNCTION>
- <FUNCTION>ASL.W</FUNCTION>
- <FUNCTION>ASL.L</FUNCTION>
- <FUNCTION>ASR</FUNCTION>
- <FUNCTION>ASR.B</FUNCTION>
- <FUNCTION>ASR.W</FUNCTION>
- <FUNCTION>ASR.L</FUNCTION>
- <!-- Bcc -->
- <FUNCTION>BCC</FUNCTION>
- <FUNCTION>BCS</FUNCTION>
- <FUNCTION>BEQ</FUNCTION>
- <FUNCTION>BGE</FUNCTION>
- <FUNCTION>BGT</FUNCTION>
- <FUNCTION>BHI</FUNCTION>
- <FUNCTION>BLE</FUNCTION>
- <FUNCTION>BLS</FUNCTION>
- <FUNCTION>BLT</FUNCTION>
- <FUNCTION>BMI</FUNCTION>
- <FUNCTION>BNE</FUNCTION>
- <FUNCTION>BPL</FUNCTION>
- <FUNCTION>BVC</FUNCTION>
- <FUNCTION>BVS</FUNCTION>
- <FUNCTION>BCHG</FUNCTION>
- <FUNCTION>BCLR</FUNCTION>
- <FUNCTION>BFCHG</FUNCTION>
- <FUNCTION>BFCLR</FUNCTION>
- <FUNCTION>BFEXTS</FUNCTION>
- <FUNCTION>BFEXTU</FUNCTION>
- <FUNCTION>BFFF0</FUNCTION>
- <FUNCTION>BFINS</FUNCTION>
- <FUNCTION>BFSET</FUNCTION>
- <FUNCTION>BFTST</FUNCTION>
- <FUNCTION>BGND</FUNCTION>
- <FUNCTION>BKPT</FUNCTION>
- <FUNCTION>BRA</FUNCTION>
- <FUNCTION>BSET</FUNCTION>
- <FUNCTION>BSR</FUNCTION>
- <FUNCTION>BTST</FUNCTION>
- <FUNCTION>CALLM</FUNCTION>
- <FUNCTION>CAS</FUNCTION>
- <FUNCTION>CAS2</FUNCTION>
- <FUNCTION>CHK</FUNCTION>
- <FUNCTION>CHK2</FUNCTION>
- <FUNCTION>CINV</FUNCTION>
- <FUNCTION>CLR</FUNCTION>
- <FUNCTION>CLR.B</FUNCTION>
- <FUNCTION>CLR.W</FUNCTION>
- <FUNCTION>CLR.L</FUNCTION>
- <FUNCTION>CMP</FUNCTION>
- <FUNCTION>CMP.B</FUNCTION>
- <FUNCTION>CMP.W</FUNCTION>
- <FUNCTION>CMP.L</FUNCTION>
- <FUNCTION>CMPA</FUNCTION>
- <FUNCTION>CMPA.W</FUNCTION>
- <FUNCTION>CMPA.L</FUNCTION>
- <FUNCTION>CMPI</FUNCTION>
- <FUNCTION>CMPI.B</FUNCTION>
- <FUNCTION>CMPI.W</FUNCTION>
- <FUNCTION>CMPI.L</FUNCTION>
- <FUNCTION>CMPM</FUNCTION>
- <FUNCTION>CMPM.B</FUNCTION>
- <FUNCTION>CMPM.W</FUNCTION>
- <FUNCTION>CMPM.L</FUNCTION>
- <FUNCTION>CMP2</FUNCTION>
- <FUNCTION>CMP2.B</FUNCTION>
- <FUNCTION>CMP2.W</FUNCTION>
- <FUNCTION>CMP2.L</FUNCTION>
- <!-- FUNCTION>cpBcc</FUNCTION>
- <FUNCTION>cpDBcc</FUNCTION>
- <FUNCTION>cpGEN</FUNCTION>
- <FUNCTION>cpRESTORE</FUNCTION>
- <FUNCTION>cpSAVE</FUNCTION>
- <FUNCTION>cpScc</FUNCTION>
- <FUNCTION>cpTRAPcc</FUNCTION -->
- <FUNCTION>CPUSH</FUNCTION>
- <!-- DBcc -->
- <FUNCTION>DBCC</FUNCTION>
- <FUNCTION>DBCS</FUNCTION>
- <FUNCTION>DBEQ</FUNCTION>
- <FUNCTION>DBGE</FUNCTION>
- <FUNCTION>DBGT</FUNCTION>
- <FUNCTION>DBHI</FUNCTION>
- <FUNCTION>DBLE</FUNCTION>
- <FUNCTION>DBLS</FUNCTION>
- <FUNCTION>DBLT</FUNCTION>
- <FUNCTION>DBMI</FUNCTION>
- <FUNCTION>DBNE</FUNCTION>
- <FUNCTION>DBPL</FUNCTION>
- <FUNCTION>DBVC</FUNCTION>
- <FUNCTION>DBVS</FUNCTION>
-
- <FUNCTION>DIVS</FUNCTION>
- <FUNCTION>DIVSL</FUNCTION>
- <FUNCTION>DIVU</FUNCTION>
- <FUNCTION>DIVUL</FUNCTION>
- <FUNCTION>EOR</FUNCTION>
- <FUNCTION>EOR.B</FUNCTION>
- <FUNCTION>EOR.W</FUNCTION>
- <FUNCTION>EOR.L</FUNCTION>
- <FUNCTION>EORI</FUNCTION>
- <FUNCTION>EORI.B</FUNCTION>
- <FUNCTION>EORI.W</FUNCTION>
- <FUNCTION>EORI.L</FUNCTION>
- <FUNCTION>EXG</FUNCTION>
- <FUNCTION>EXT</FUNCTION>
- <FUNCTION>EXTB</FUNCTION>
- <FUNCTION>FABS</FUNCTION>
- <FUNCTION>FSABS</FUNCTION>
- <FUNCTION>FDABS</FUNCTION>
- <FUNCTION>FACOS</FUNCTION>
- <FUNCTION>FADD</FUNCTION>
- <FUNCTION>FSADD</FUNCTION>
- <FUNCTION>FDADD</FUNCTION>
- <FUNCTION>FASIN</FUNCTION>
- <FUNCTION>FATAN</FUNCTION>
- <FUNCTION>FATANH</FUNCTION>
- <!--FUNCTION>FBcc</FUNCTION-->
- <FUNCTION>FCMP</FUNCTION>
- <FUNCTION>FCOS</FUNCTION>
- <FUNCTION>FCOSH</FUNCTION>
- <!--FUNCTION>FDBcc</FUNCTION-->
- <FUNCTION>FDIV</FUNCTION>
- <FUNCTION>FSDIV</FUNCTION>
- <FUNCTION>FDDIV</FUNCTION>
- <FUNCTION>FETOX</FUNCTION>
- <FUNCTION>FETOXM1</FUNCTION>
- <FUNCTION>FGETEXP</FUNCTION>
- <FUNCTION>FGETMAN</FUNCTION>
- <FUNCTION>FINT</FUNCTION>
- <FUNCTION>FINTRZ</FUNCTION>
- <FUNCTION>FLOG10</FUNCTION>
- <FUNCTION>FLOG2</FUNCTION>
- <FUNCTION>FLOGN</FUNCTION>
- <FUNCTION>FLOGNP1</FUNCTION>
- <FUNCTION>FMOD</FUNCTION>
- <FUNCTION>FMOVE</FUNCTION>
- <FUNCTION>FSMOVE</FUNCTION>
- <FUNCTION>FDMOVE</FUNCTION>
- <FUNCTION>FMOVECR</FUNCTION>
- <FUNCTION>FMOVEM</FUNCTION>
- <FUNCTION>FMUL</FUNCTION>
- <FUNCTION>FSMUL</FUNCTION>
- <FUNCTION>FDMUL</FUNCTION>
- <FUNCTION>FNEG</FUNCTION>
- <FUNCTION>FSNEG</FUNCTION>
- <FUNCTION>FDNEG</FUNCTION>
- <FUNCTION>FNOP</FUNCTION>
- <FUNCTION>FREM</FUNCTION>
- <FUNCTION>FRESTORE</FUNCTION>
- <FUNCTION>FSAVE</FUNCTION>
- <FUNCTION>FSCALE</FUNCTION>
- <!--FUNCTION>FScc</FUNCTION-->
- <FUNCTION>FSGLMUL</FUNCTION>
- <FUNCTION>FSIN</FUNCTION>
- <FUNCTION>FSINCOS</FUNCTION>
- <FUNCTION>FSINH</FUNCTION>
- <FUNCTION>FSQRT</FUNCTION>
- <FUNCTION>FSSQRT</FUNCTION>
- <FUNCTION>FDSQRT</FUNCTION>
- <FUNCTION>FSUB</FUNCTION>
- <FUNCTION>FSSUB</FUNCTION>
- <FUNCTION>FDSUB</FUNCTION>
- <FUNCTION>FTAN</FUNCTION>
- <FUNCTION>FTANH</FUNCTION>
- <FUNCTION>FTENTOX</FUNCTION>
- <!--FUNCTION>FTRAPcc</FUNCTION-->
- <FUNCTION>FTST</FUNCTION>
- <FUNCTION>FTWOTOX</FUNCTION>
- <FUNCTION>ILLEGAL</FUNCTION>
- <FUNCTION>JMP</FUNCTION>
- <FUNCTION>JSR</FUNCTION>
- <FUNCTION>LEA</FUNCTION>
- <FUNCTION>LINK</FUNCTION>
- <FUNCTION>LPSTOP</FUNCTION>
- <FUNCTION>LSL</FUNCTION>
- <FUNCTION>LSL.B</FUNCTION>
- <FUNCTION>LSL.W</FUNCTION>
- <FUNCTION>LSL.L</FUNCTION>
- <FUNCTION>LSR</FUNCTION>
- <FUNCTION>LSR.B</FUNCTION>
- <FUNCTION>LSR.W</FUNCTION>
- <FUNCTION>LSR.L</FUNCTION>
- <FUNCTION>MOVE</FUNCTION>
- <FUNCTION>MOVE.B</FUNCTION>
- <FUNCTION>MOVE.W</FUNCTION>
- <FUNCTION>MOVE.L</FUNCTION>
- <FUNCTION>MOVEA</FUNCTION>
- <FUNCTION>MOVEA.W</FUNCTION>
- <FUNCTION>MOVEA.L</FUNCTION>
- <FUNCTION>MOVE16</FUNCTION>
- <FUNCTION>MOVEC</FUNCTION>
- <FUNCTION>MOVEM</FUNCTION>
- <FUNCTION>MOVEP</FUNCTION>
- <FUNCTION>MOVEQ</FUNCTION>
- <FUNCTION>MOVES</FUNCTION>
- <FUNCTION>MULS</FUNCTION>
- <FUNCTION>MULU</FUNCTION>
- <FUNCTION>NBCD</FUNCTION>
- <FUNCTION>NEG</FUNCTION>
- <FUNCTION>NEG.B</FUNCTION>
- <FUNCTION>NEG.W</FUNCTION>
- <FUNCTION>NEG.L</FUNCTION>
- <FUNCTION>NEGX</FUNCTION>
- <FUNCTION>NEGX.B</FUNCTION>
- <FUNCTION>NEGX.W</FUNCTION>
- <FUNCTION>NEGX.L</FUNCTION>
- <FUNCTION>NOP</FUNCTION>
- <FUNCTION>NOT</FUNCTION>
- <FUNCTION>NOT.B</FUNCTION>
- <FUNCTION>NOT.W</FUNCTION>
- <FUNCTION>NOT.L</FUNCTION>
- <FUNCTION>OR</FUNCTION>
- <FUNCTION>OR.B</FUNCTION>
- <FUNCTION>OR.W</FUNCTION>
- <FUNCTION>OR.L</FUNCTION>
- <FUNCTION>ORI</FUNCTION>
- <FUNCTION>ORI.B</FUNCTION>
- <FUNCTION>ORI.W</FUNCTION>
- <FUNCTION>ORI.L</FUNCTION>
- <FUNCTION>PACK</FUNCTION>
- <!--FUNCTION>PBcc</FUNCTION-->
- <!--FUNCTION>PDBcc</FUNCTION-->
- <FUNCTION>PEA</FUNCTION>
- <FUNCTION>PFLUSH</FUNCTION>
- <FUNCTION>PFLUSHA</FUNCTION>
- <FUNCTION>PFLUSHR</FUNCTION>
- <FUNCTION>PFLUSHS</FUNCTION>
- <FUNCTION>PLOAD</FUNCTION>
- <FUNCTION>PMOVE</FUNCTION>
- <FUNCTION>PRESTORE</FUNCTION>
- <FUNCTION>PSAVE</FUNCTION>
- <!--FUNCTION>PScc</FUNCTION-->
- <FUNCTION>PTEST</FUNCTION>
- <!--FUNCTION>PTRAPcc</FUNCTION-->
- <FUNCTION>PVALID</FUNCTION>
- <FUNCTION>RESET</FUNCTION>
- <FUNCTION>ROL</FUNCTION>
- <FUNCTION>ROL.B</FUNCTION>
- <FUNCTION>ROL.W</FUNCTION>
- <FUNCTION>ROL.L</FUNCTION>
- <FUNCTION>ROR</FUNCTION>
- <FUNCTION>ROR.B</FUNCTION>
- <FUNCTION>ROR.W</FUNCTION>
- <FUNCTION>ROR.L</FUNCTION>
- <FUNCTION>ROXL</FUNCTION>
- <FUNCTION>ROXL.B</FUNCTION>
- <FUNCTION>ROXL.W</FUNCTION>
- <FUNCTION>ROXL.L</FUNCTION>
- <FUNCTION>ROXR</FUNCTION>
- <FUNCTION>ROXR.B</FUNCTION>
- <FUNCTION>ROXR.W</FUNCTION>
- <FUNCTION>ROXR.L</FUNCTION>
- <FUNCTION>RTD</FUNCTION>
- <FUNCTION>RTE</FUNCTION>
- <FUNCTION>RTM</FUNCTION>
- <FUNCTION>RTR</FUNCTION>
- <FUNCTION>RTS</FUNCTION>
- <FUNCTION>SBCD</FUNCTION>
- <!--Scc-->
- <FUNCTION>SCC</FUNCTION>
- <FUNCTION>SCS</FUNCTION>
- <FUNCTION>SEQ</FUNCTION>
- <FUNCTION>SF</FUNCTION>
- <FUNCTION>SGE</FUNCTION>
- <FUNCTION>SGT</FUNCTION>
- <FUNCTION>SHI</FUNCTION>
- <FUNCTION>SLE</FUNCTION>
- <FUNCTION>SLS</FUNCTION>
- <FUNCTION>SLT</FUNCTION>
- <FUNCTION>SMI</FUNCTION>
- <FUNCTION>SNE</FUNCTION>
- <FUNCTION>SPL</FUNCTION>
- <FUNCTION>ST</FUNCTION>
- <FUNCTION>SVC</FUNCTION>
- <FUNCTION>SVS</FUNCTION>
-
- <FUNCTION>STOP</FUNCTION>
- <FUNCTION>SUB</FUNCTION>
- <FUNCTION>SUB.B</FUNCTION>
- <FUNCTION>SUB.W</FUNCTION>
- <FUNCTION>SUB.L</FUNCTION>
- <FUNCTION>SUBA</FUNCTION>
- <FUNCTION>SUBI</FUNCTION>
- <FUNCTION>SUBI.B</FUNCTION>
- <FUNCTION>SUBI.W</FUNCTION>
- <FUNCTION>SUBI.L</FUNCTION>
- <FUNCTION>SUBQ</FUNCTION>
- <FUNCTION>SUBQ.B</FUNCTION>
- <FUNCTION>SUBQ.W</FUNCTION>
- <FUNCTION>SUBQ.L</FUNCTION>
- <FUNCTION>SUBX</FUNCTION>
- <FUNCTION>SUBX.B</FUNCTION>
- <FUNCTION>SUBX.W</FUNCTION>
- <FUNCTION>SUBX.L</FUNCTION>
- <FUNCTION>SWAP</FUNCTION>
- <FUNCTION>TAS</FUNCTION>
- <FUNCTION>TBLS</FUNCTION>
- <FUNCTION>TBLSN</FUNCTION>
- <FUNCTION>TBLU</FUNCTION>
- <FUNCTION>TBLUN</FUNCTION>
- <FUNCTION>TRAP</FUNCTION>
- <!--TRAPcc-->
- <FUNCTION>TRAPCC</FUNCTION>
- <FUNCTION>TRAPCS</FUNCTION>
- <FUNCTION>TRAPEQ</FUNCTION>
- <FUNCTION>TRAPF</FUNCTION>
- <FUNCTION>TRAPGE</FUNCTION>
- <FUNCTION>TRAPGT</FUNCTION>
- <FUNCTION>TRAPHI</FUNCTION>
- <FUNCTION>TRAPLE</FUNCTION>
- <FUNCTION>TRAPLS</FUNCTION>
- <FUNCTION>TRAPLT</FUNCTION>
- <FUNCTION>TRAPMI</FUNCTION>
- <FUNCTION>TRAPNE</FUNCTION>
- <FUNCTION>TRAPPL</FUNCTION>
- <FUNCTION>TRAPT</FUNCTION>
- <FUNCTION>TRAPVC</FUNCTION>
- <FUNCTION>TRAPVS</FUNCTION>
-
- <FUNCTION>TRAPV</FUNCTION>
- <FUNCTION>TST</FUNCTION>
- <FUNCTION>TST.B</FUNCTION>
- <FUNCTION>TST.W</FUNCTION>
- <FUNCTION>TST.L</FUNCTION>
- <FUNCTION>UNLK</FUNCTION>
- <FUNCTION>UNPK</FUNCTION>
-
-
- </KEYWORDS>
- </RULES>
-</MODE>
+<?xml version="1.0"?>
+
+<!DOCTYPE MODE SYSTEM "xmode.dtd">
+
+<!--
+ M68000 Assembly mode by Igor Lesik (curoles at yahoo.com)
+ version 0.2 (July 24, 2006)
+ TODO: i)add missing size qualifiers, ii)add Xcc like instructions
+-->
+
+<MODE>
+
+ <PROPS>
+ <PROPERTY NAME="lineComment" VALUE=";" />
+ </PROPS>
+
+ <RULES IGNORE_CASE="TRUE" HIGHLIGHT_DIGITS="TRUE" DIGIT_RE="(0x\p{XDigit}+|\d+)">
+
+ <EOL_SPAN TYPE="COMMENT1">;</EOL_SPAN>
+ <EOL_SPAN TYPE="COMMENT2">*</EOL_SPAN>
+
+ <SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">
+ <BEGIN>'</BEGIN>
+ <END>'</END>
+ </SPAN>
+
+ <SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">
+ <BEGIN>"</BEGIN>
+ <END>"</END>
+ </SPAN>
+
+
+
+ <MARK_FOLLOWING TYPE="KEYWORD2" AT_LINE_START="TRUE">$</MARK_FOLLOWING>
+
+ <MARK_PREVIOUS TYPE="LABEL" MATCH_TYPE="OPERATOR"
+ AT_LINE_START="TRUE">:</MARK_PREVIOUS>
+
+ <SEQ TYPE="NULL">,</SEQ>
+ <SEQ TYPE="NULL">:</SEQ>
+ <SEQ TYPE="NULL">(</SEQ>
+ <SEQ TYPE="NULL">)</SEQ>
+ <SEQ TYPE="NULL">]</SEQ>
+ <SEQ TYPE="NULL">[</SEQ>
+ <SEQ TYPE="NULL">$</SEQ>
+
+ <SEQ TYPE="OPERATOR">+</SEQ>
+ <SEQ TYPE="OPERATOR">-</SEQ>
+ <SEQ TYPE="OPERATOR">/</SEQ>
+ <SEQ TYPE="OPERATOR">*</SEQ>
+ <SEQ TYPE="OPERATOR">%</SEQ>
+
+ <SEQ TYPE="OPERATOR">|</SEQ>
+ <SEQ TYPE="OPERATOR">^</SEQ>
+ <SEQ TYPE="OPERATOR">&</SEQ>
+ <SEQ TYPE="OPERATOR">~</SEQ>
+ <SEQ TYPE="OPERATOR">!</SEQ>
+
+ <SEQ TYPE="OPERATOR">=</SEQ>
+ <SEQ TYPE="OPERATOR"><</SEQ>
+ <SEQ TYPE="OPERATOR">></SEQ>
+
+ <KEYWORDS>
+
+ <!-- ************************* REGISTERS ********************************* -->
+ <!-- For sake of commonality with existing asm86 mode we use Keyword3 for registers-->
+
+ <!-- General-purpose data registers -->
+ <KEYWORD3>D0</KEYWORD3>
+ <KEYWORD3>D1</KEYWORD3>
+ <KEYWORD3>D2</KEYWORD3>
+ <KEYWORD3>D3</KEYWORD3>
+ <KEYWORD3>D4</KEYWORD3>
+ <KEYWORD3>D5</KEYWORD3>
+ <KEYWORD3>D6</KEYWORD3>
+ <KEYWORD3>D7</KEYWORD3>
+
+ <!-- Address registers -->
+ <KEYWORD3>A0</KEYWORD3>
+ <KEYWORD3>A1</KEYWORD3>
+ <KEYWORD3>A2</KEYWORD3>
+ <KEYWORD3>A3</KEYWORD3>
+ <KEYWORD3>A4</KEYWORD3>
+ <KEYWORD3>A5</KEYWORD3>
+ <KEYWORD3>A6</KEYWORD3>
+ <KEYWORD3>A7</KEYWORD3>
+
+ <!-- Floating-point data registers -->
+ <KEYWORD3>FP0</KEYWORD3>
+ <KEYWORD3>FP1</KEYWORD3>
+ <KEYWORD3>FP2</KEYWORD3>
+ <KEYWORD3>FP3</KEYWORD3>
+ <KEYWORD3>FP4</KEYWORD3>
+ <KEYWORD3>FP5</KEYWORD3>
+ <KEYWORD3>FP6</KEYWORD3>
+ <KEYWORD3>FP7</KEYWORD3>
+
+ <KEYWORD3>SP</KEYWORD3>
+ <KEYWORD3>CCR</KEYWORD3>
+
+ <!-- ************************** DIRECTIVES ********************************** -->
+
+ <!-- Assembler directives give instructions to the assembler (not the 68000 chip which will execute
+ your program) on how to assemble your program.
+ These directives may be grouped into the following categories.-->
+
+ <!-- Miscellaneous -->
+ <KEYWORD1>OPT</KEYWORD1>
+ <KEYWORD1>INCLUDE</KEYWORD1>
+ <KEYWORD1>FAIL</KEYWORD1>
+ <KEYWORD1>END</KEYWORD1>
+ <KEYWORD1>REG</KEYWORD1>
+
+ <!-- Listing Control -->
+ <KEYWORD1>PAGE</KEYWORD1>
+ <KEYWORD1>LIST</KEYWORD1>
+ <KEYWORD1>NOLIST</KEYWORD1>
+ <KEYWORD1>SPC</KEYWORD1>
+ <KEYWORD1>TTL</KEYWORD1>
+
+ <!-- Section Control -->
+ <KEYWORD1>ORG</KEYWORD1>
+
+ <!-- Symbol Definition -->
+ <KEYWORD1>EQU</KEYWORD1>
+ <KEYWORD1>SET</KEYWORD1>
+
+ <!-- Data Definition -->
+ <KEYWORD1>DS</KEYWORD1>
+ <KEYWORD1>DC</KEYWORD1>
+
+ <!-- Structured Programming Constructs -->
+ <KEYWORD1>FOR</KEYWORD1>
+ <KEYWORD1>ENDF</KEYWORD1>
+ <KEYWORD1>IF</KEYWORD1>
+ <KEYWORD1>THEN</KEYWORD1>
+ <KEYWORD1>ELSE</KEYWORD1>
+ <KEYWORD1>ENDI</KEYWORD1>
+ <KEYWORD1>REPEAT</KEYWORD1>
+ <KEYWORD1>UNTIL</KEYWORD1>
+ <KEYWORD1>WHILE</KEYWORD1>
+ <KEYWORD1>DO</KEYWORD1>
+ <KEYWORD1>ENDW</KEYWORD1>
+
+ <KEYWORD1>MACRO</KEYWORD1>
+
+
+ <!-- *************************** INSTRUCTIONS **************************************** -->
+ <FUNCTION>ABCD</FUNCTION>
+ <FUNCTION>ADD</FUNCTION>
+ <FUNCTION>ADD.B</FUNCTION>
+ <FUNCTION>ADD.W</FUNCTION>
+ <FUNCTION>ADD.L</FUNCTION>
+ <FUNCTION>ADDA</FUNCTION>
+ <FUNCTION>ADDA.W</FUNCTION>
+ <FUNCTION>ADDA.L</FUNCTION>
+ <FUNCTION>ADDI</FUNCTION>
+ <FUNCTION>ADDI.B</FUNCTION>
+ <FUNCTION>ADDI.W</FUNCTION>
+ <FUNCTION>ADDI.L</FUNCTION>
+ <FUNCTION>ADDQ</FUNCTION>
+ <FUNCTION>ADDQ.B</FUNCTION>
+ <FUNCTION>ADDQ.W</FUNCTION>
+ <FUNCTION>ADDQ.L</FUNCTION>
+ <FUNCTION>ADDX</FUNCTION>
+ <FUNCTION>ADDX.B</FUNCTION>
+ <FUNCTION>ADDX.W</FUNCTION>
+ <FUNCTION>ADDX.L</FUNCTION>
+ <FUNCTION>AND</FUNCTION>
+ <FUNCTION>AND.B</FUNCTION>
+ <FUNCTION>AND.W</FUNCTION>
+ <FUNCTION>AND.L</FUNCTION>
+ <FUNCTION>ANDI</FUNCTION>
+ <FUNCTION>ANDI.B</FUNCTION>
+ <FUNCTION>ANDI.W</FUNCTION>
+ <FUNCTION>ANDI.L</FUNCTION>
+ <FUNCTION>ASL</FUNCTION>
+ <FUNCTION>ASL.B</FUNCTION>
+ <FUNCTION>ASL.W</FUNCTION>
+ <FUNCTION>ASL.L</FUNCTION>
+ <FUNCTION>ASR</FUNCTION>
+ <FUNCTION>ASR.B</FUNCTION>
+ <FUNCTION>ASR.W</FUNCTION>
+ <FUNCTION>ASR.L</FUNCTION>
+ <!-- Bcc -->
+ <FUNCTION>BCC</FUNCTION>
+ <FUNCTION>BCS</FUNCTION>
+ <FUNCTION>BEQ</FUNCTION>
+ <FUNCTION>BGE</FUNCTION>
+ <FUNCTION>BGT</FUNCTION>
+ <FUNCTION>BHI</FUNCTION>
+ <FUNCTION>BLE</FUNCTION>
+ <FUNCTION>BLS</FUNCTION>
+ <FUNCTION>BLT</FUNCTION>
+ <FUNCTION>BMI</FUNCTION>
+ <FUNCTION>BNE</FUNCTION>
+ <FUNCTION>BPL</FUNCTION>
+ <FUNCTION>BVC</FUNCTION>
+ <FUNCTION>BVS</FUNCTION>
+ <FUNCTION>BCHG</FUNCTION>
+ <FUNCTION>BCLR</FUNCTION>
+ <FUNCTION>BFCHG</FUNCTION>
+ <FUNCTION>BFCLR</FUNCTION>
+ <FUNCTION>BFEXTS</FUNCTION>
+ <FUNCTION>BFEXTU</FUNCTION>
+ <FUNCTION>BFFF0</FUNCTION>
+ <FUNCTION>BFINS</FUNCTION>
+ <FUNCTION>BFSET</FUNCTION>
+ <FUNCTION>BFTST</FUNCTION>
+ <FUNCTION>BGND</FUNCTION>
+ <FUNCTION>BKPT</FUNCTION>
+ <FUNCTION>BRA</FUNCTION>
+ <FUNCTION>BSET</FUNCTION>
+ <FUNCTION>BSR</FUNCTION>
+ <FUNCTION>BTST</FUNCTION>
+ <FUNCTION>CALLM</FUNCTION>
+ <FUNCTION>CAS</FUNCTION>
+ <FUNCTION>CAS2</FUNCTION>
+ <FUNCTION>CHK</FUNCTION>
+ <FUNCTION>CHK2</FUNCTION>
+ <FUNCTION>CINV</FUNCTION>
+ <FUNCTION>CLR</FUNCTION>
+ <FUNCTION>CLR.B</FUNCTION>
+ <FUNCTION>CLR.W</FUNCTION>
+ <FUNCTION>CLR.L</FUNCTION>
+ <FUNCTION>CMP</FUNCTION>
+ <FUNCTION>CMP.B</FUNCTION>
+ <FUNCTION>CMP.W</FUNCTION>
+ <FUNCTION>CMP.L</FUNCTION>
+ <FUNCTION>CMPA</FUNCTION>
+ <FUNCTION>CMPA.W</FUNCTION>
+ <FUNCTION>CMPA.L</FUNCTION>
+ <FUNCTION>CMPI</FUNCTION>
+ <FUNCTION>CMPI.B</FUNCTION>
+ <FUNCTION>CMPI.W</FUNCTION>
+ <FUNCTION>CMPI.L</FUNCTION>
+ <FUNCTION>CMPM</FUNCTION>
+ <FUNCTION>CMPM.B</FUNCTION>
+ <FUNCTION>CMPM.W</FUNCTION>
+ <FUNCTION>CMPM.L</FUNCTION>
+ <FUNCTION>CMP2</FUNCTION>
+ <FUNCTION>CMP2.B</FUNCTION>
+ <FUNCTION>CMP2.W</FUNCTION>
+ <FUNCTION>CMP2.L</FUNCTION>
+ <!-- FUNCTION>cpBcc</FUNCTION>
+ <FUNCTION>cpDBcc</FUNCTION>
+ <FUNCTION>cpGEN</FUNCTION>
+ <FUNCTION>cpRESTORE</FUNCTION>
+ <FUNCTION>cpSAVE</FUNCTION>
+ <FUNCTION>cpScc</FUNCTION>
+ <FUNCTION>cpTRAPcc</FUNCTION -->
+ <FUNCTION>CPUSH</FUNCTION>
+ <!-- DBcc -->
+ <FUNCTION>DBCC</FUNCTION>
+ <FUNCTION>DBCS</FUNCTION>
+ <FUNCTION>DBEQ</FUNCTION>
+ <FUNCTION>DBGE</FUNCTION>
+ <FUNCTION>DBGT</FUNCTION>
+ <FUNCTION>DBHI</FUNCTION>
+ <FUNCTION>DBLE</FUNCTION>
+ <FUNCTION>DBLS</FUNCTION>
+ <FUNCTION>DBLT</FUNCTION>
+ <FUNCTION>DBMI</FUNCTION>
+ <FUNCTION>DBNE</FUNCTION>
+ <FUNCTION>DBPL</FUNCTION>
+ <FUNCTION>DBVC</FUNCTION>
+ <FUNCTION>DBVS</FUNCTION>
+
+ <FUNCTION>DIVS</FUNCTION>
+ <FUNCTION>DIVSL</FUNCTION>
+ <FUNCTION>DIVU</FUNCTION>
+ <FUNCTION>DIVUL</FUNCTION>
+ <FUNCTION>EOR</FUNCTION>
+ <FUNCTION>EOR.B</FUNCTION>
+ <FUNCTION>EOR.W</FUNCTION>
+ <FUNCTION>EOR.L</FUNCTION>
+ <FUNCTION>EORI</FUNCTION>
+ <FUNCTION>EORI.B</FUNCTION>
+ <FUNCTION>EORI.W</FUNCTION>
+ <FUNCTION>EORI.L</FUNCTION>
+ <FUNCTION>EXG</FUNCTION>
+ <FUNCTION>EXT</FUNCTION>
+ <FUNCTION>EXTB</FUNCTION>
+ <FUNCTION>FABS</FUNCTION>
+ <FUNCTION>FSABS</FUNCTION>
+ <FUNCTION>FDABS</FUNCTION>
+ <FUNCTION>FACOS</FUNCTION>
+ <FUNCTION>FADD</FUNCTION>
+ <FUNCTION>FSADD</FUNCTION>
+ <FUNCTION>FDADD</FUNCTION>
+ <FUNCTION>FASIN</FUNCTION>
+ <FUNCTION>FATAN</FUNCTION>
+ <FUNCTION>FATANH</FUNCTION>
+ <!--FUNCTION>FBcc</FUNCTION-->
+ <FUNCTION>FCMP</FUNCTION>
+ <FUNCTION>FCOS</FUNCTION>
+ <FUNCTION>FCOSH</FUNCTION>
+ <!--FUNCTION>FDBcc</FUNCTION-->
+ <FUNCTION>FDIV</FUNCTION>
+ <FUNCTION>FSDIV</FUNCTION>
+ <FUNCTION>FDDIV</FUNCTION>
+ <FUNCTION>FETOX</FUNCTION>
+ <FUNCTION>FETOXM1</FUNCTION>
+ <FUNCTION>FGETEXP</FUNCTION>
+ <FUNCTION>FGETMAN</FUNCTION>
+ <FUNCTION>FINT</FUNCTION>
+ <FUNCTION>FINTRZ</FUNCTION>
+ <FUNCTION>FLOG10</FUNCTION>
+ <FUNCTION>FLOG2</FUNCTION>
+ <FUNCTION>FLOGN</FUNCTION>
+ <FUNCTION>FLOGNP1</FUNCTION>
+ <FUNCTION>FMOD</FUNCTION>
+ <FUNCTION>FMOVE</FUNCTION>
+ <FUNCTION>FSMOVE</FUNCTION>
+ <FUNCTION>FDMOVE</FUNCTION>
+ <FUNCTION>FMOVECR</FUNCTION>
+ <FUNCTION>FMOVEM</FUNCTION>
+ <FUNCTION>FMUL</FUNCTION>
+ <FUNCTION>FSMUL</FUNCTION>
+ <FUNCTION>FDMUL</FUNCTION>
+ <FUNCTION>FNEG</FUNCTION>
+ <FUNCTION>FSNEG</FUNCTION>
+ <FUNCTION>FDNEG</FUNCTION>
+ <FUNCTION>FNOP</FUNCTION>
+ <FUNCTION>FREM</FUNCTION>
+ <FUNCTION>FRESTORE</FUNCTION>
+ <FUNCTION>FSAVE</FUNCTION>
+ <FUNCTION>FSCALE</FUNCTION>
+ <!--FUNCTION>FScc</FUNCTION-->
+ <FUNCTION>FSGLMUL</FUNCTION>
+ <FUNCTION>FSIN</FUNCTION>
+ <FUNCTION>FSINCOS</FUNCTION>
+ <FUNCTION>FSINH</FUNCTION>
+ <FUNCTION>FSQRT</FUNCTION>
+ <FUNCTION>FSSQRT</FUNCTION>
+ <FUNCTION>FDSQRT</FUNCTION>
+ <FUNCTION>FSUB</FUNCTION>
+ <FUNCTION>FSSUB</FUNCTION>
+ <FUNCTION>FDSUB</FUNCTION>
+ <FUNCTION>FTAN</FUNCTION>
+ <FUNCTION>FTANH</FUNCTION>
+ <FUNCTION>FTENTOX</FUNCTION>
+ <!--FUNCTION>FTRAPcc</FUNCTION-->
+ <FUNCTION>FTST</FUNCTION>
+ <FUNCTION>FTWOTOX</FUNCTION>
+ <FUNCTION>ILLEGAL</FUNCTION>
+ <FUNCTION>JMP</FUNCTION>
+ <FUNCTION>JSR</FUNCTION>
+ <FUNCTION>LEA</FUNCTION>
+ <FUNCTION>LINK</FUNCTION>
+ <FUNCTION>LPSTOP</FUNCTION>
+ <FUNCTION>LSL</FUNCTION>
+ <FUNCTION>LSL.B</FUNCTION>
+ <FUNCTION>LSL.W</FUNCTION>
+ <FUNCTION>LSL.L</FUNCTION>
+ <FUNCTION>LSR</FUNCTION>
+ <FUNCTION>LSR.B</FUNCTION>
+ <FUNCTION>LSR.W</FUNCTION>
+ <FUNCTION>LSR.L</FUNCTION>
+ <FUNCTION>MOVE</FUNCTION>
+ <FUNCTION>MOVE.B</FUNCTION>
+ <FUNCTION>MOVE.W</FUNCTION>
+ <FUNCTION>MOVE.L</FUNCTION>
+ <FUNCTION>MOVEA</FUNCTION>
+ <FUNCTION>MOVEA.W</FUNCTION>
+ <FUNCTION>MOVEA.L</FUNCTION>
+ <FUNCTION>MOVE16</FUNCTION>
+ <FUNCTION>MOVEC</FUNCTION>
+ <FUNCTION>MOVEM</FUNCTION>
+ <FUNCTION>MOVEP</FUNCTION>
+ <FUNCTION>MOVEQ</FUNCTION>
+ <FUNCTION>MOVES</FUNCTION>
+ <FUNCTION>MULS</FUNCTION>
+ <FUNCTION>MULU</FUNCTION>
+ <FUNCTION>NBCD</FUNCTION>
+ <FUNCTION>NEG</FUNCTION>
+ <FUNCTION>NEG.B</FUNCTION>
+ <FUNCTION>NEG.W</FUNCTION>
+ <FUNCTION>NEG.L</FUNCTION>
+ <FUNCTION>NEGX</FUNCTION>
+ <FUNCTION>NEGX.B</FUNCTION>
+ <FUNCTION>NEGX.W</FUNCTION>
+ <FUNCTION>NEGX.L</FUNCTION>
+ <FUNCTION>NOP</FUNCTION>
+ <FUNCTION>NOT</FUNCTION>
+ <FUNCTION>NOT.B</FUNCTION>
+ <FUNCTION>NOT.W</FUNCTION>
+ <FUNCTION>NOT.L</FUNCTION>
+ <FUNCTION>OR</FUNCTION>
+ <FUNCTION>OR.B</FUNCTION>
+ <FUNCTION>OR.W</FUNCTION>
+ <FUNCTION>OR.L</FUNCTION>
+ <FUNCTION>ORI</FUNCTION>
+ <FUNCTION>ORI.B</FUNCTION>
+ <FUNCTION>ORI.W</FUNCTION>
+ <FUNCTION>ORI.L</FUNCTION>
+ <FUNCTION>PACK</FUNCTION>
+ <!--FUNCTION>PBcc</FUNCTION-->
+ <!--FUNCTION>PDBcc</FUNCTION-->
+ <FUNCTION>PEA</FUNCTION>
+ <FUNCTION>PFLUSH</FUNCTION>
+ <FUNCTION>PFLUSHA</FUNCTION>
+ <FUNCTION>PFLUSHR</FUNCTION>
+ <FUNCTION>PFLUSHS</FUNCTION>
+ <FUNCTION>PLOAD</FUNCTION>
+ <FUNCTION>PMOVE</FUNCTION>
+ <FUNCTION>PRESTORE</FUNCTION>
+ <FUNCTION>PSAVE</FUNCTION>
+ <!--FUNCTION>PScc</FUNCTION-->
+ <FUNCTION>PTEST</FUNCTION>
+ <!--FUNCTION>PTRAPcc</FUNCTION-->
+ <FUNCTION>PVALID</FUNCTION>
+ <FUNCTION>RESET</FUNCTION>
+ <FUNCTION>ROL</FUNCTION>
+ <FUNCTION>ROL.B</FUNCTION>
+ <FUNCTION>ROL.W</FUNCTION>
+ <FUNCTION>ROL.L</FUNCTION>
+ <FUNCTION>ROR</FUNCTION>
+ <FUNCTION>ROR.B</FUNCTION>
+ <FUNCTION>ROR.W</FUNCTION>
+ <FUNCTION>ROR.L</FUNCTION>
+ <FUNCTION>ROXL</FUNCTION>
+ <FUNCTION>ROXL.B</FUNCTION>
+ <FUNCTION>ROXL.W</FUNCTION>
+ <FUNCTION>ROXL.L</FUNCTION>
+ <FUNCTION>ROXR</FUNCTION>
+ <FUNCTION>ROXR.B</FUNCTION>
+ <FUNCTION>ROXR.W</FUNCTION>
+ <FUNCTION>ROXR.L</FUNCTION>
+ <FUNCTION>RTD</FUNCTION>
+ <FUNCTION>RTE</FUNCTION>
+ <FUNCTION>RTM</FUNCTION>
+ <FUNCTION>RTR</FUNCTION>
+ <FUNCTION>RTS</FUNCTION>
+ <FUNCTION>SBCD</FUNCTION>
+ <!--Scc-->
+ <FUNCTION>SCC</FUNCTION>
+ <FUNCTION>SCS</FUNCTION>
+ <FUNCTION>SEQ</FUNCTION>
+ <FUNCTION>SF</FUNCTION>
+ <FUNCTION>SGE</FUNCTION>
+ <FUNCTION>SGT</FUNCTION>
+ <FUNCTION>SHI</FUNCTION>
+ <FUNCTION>SLE</FUNCTION>
+ <FUNCTION>SLS</FUNCTION>
+ <FUNCTION>SLT</FUNCTION>
+ <FUNCTION>SMI</FUNCTION>
+ <FUNCTION>SNE</FUNCTION>
+ <FUNCTION>SPL</FUNCTION>
+ <FUNCTION>ST</FUNCTION>
+ <FUNCTION>SVC</FUNCTION>
+ <FUNCTION>SVS</FUNCTION>
+
+ <FUNCTION>STOP</FUNCTION>
+ <FUNCTION>SUB</FUNCTION>
+ <FUNCTION>SUB.B</FUNCTION>
+ <FUNCTION>SUB.W</FUNCTION>
+ <FUNCTION>SUB.L</FUNCTION>
+ <FUNCTION>SUBA</FUNCTION>
+ <FUNCTION>SUBI</FUNCTION>
+ <FUNCTION>SUBI.B</FUNCTION>
+ <FUNCTION>SUBI.W</FUNCTION>
+ <FUNCTION>SUBI.L</FUNCTION>
+ <FUNCTION>SUBQ</FUNCTION>
+ <FUNCTION>SUBQ.B</FUNCTION>
+ <FUNCTION>SUBQ.W</FUNCTION>
+ <FUNCTION>SUBQ.L</FUNCTION>
+ <FUNCTION>SUBX</FUNCTION>
+ <FUNCTION>SUBX.B</FUNCTION>
+ <FUNCTION>SUBX.W</FUNCTION>
+ <FUNCTION>SUBX.L</FUNCTION>
+ <FUNCTION>SWAP</FUNCTION>
+ <FUNCTION>TAS</FUNCTION>
+ <FUNCTION>TBLS</FUNCTION>
+ <FUNCTION>TBLSN</FUNCTION>
+ <FUNCTION>TBLU</FUNCTION>
+ <FUNCTION>TBLUN</FUNCTION>
+ <FUNCTION>TRAP</FUNCTION>
+ <!--TRAPcc-->
+ <FUNCTION>TRAPCC</FUNCTION>
+ <FUNCTION>TRAPCS</FUNCTION>
+ <FUNCTION>TRAPEQ</FUNCTION>
+ <FUNCTION>TRAPF</FUNCTION>
+ <FUNCTION>TRAPGE</FUNCTION>
+ <FUNCTION>TRAPGT</FUNCTION>
+ <FUNCTION>TRAPHI</FUNCTION>
+ <FUNCTION>TRAPLE</FUNCTION>
+ <FUNCTION>TRAPLS</FUNCTION>
+ <FUNCTION>TRAPLT</FUNCTION>
+ <FUNCTION>TRAPMI</FUNCTION>
+ <FUNCTION>TRAPNE</FUNCTION>
+ <FUNCTION>TRAPPL</FUNCTION>
+ <FUNCTION>TRAPT</FUNCTION>
+ <FUNCTION>TRAPVC</FUNCTION>
+ <FUNCTION>TRAPVS</FUNCTION>
+
+ <FUNCTION>TRAPV</FUNCTION>
+ <FUNCTION>TST</FUNCTION>
+ <FUNCTION>TST.B</FUNCTION>
+ <FUNCTION>TST.W</FUNCTION>
+ <FUNCTION>TST.L</FUNCTION>
+ <FUNCTION>UNLK</FUNCTION>
+ <FUNCTION>UNPK</FUNCTION>
+
+
+ </KEYWORDS>
+ </RULES>
+</MODE>
diff --git a/jEdit/modes/assembly-macro32.xml b/jEdit/modes/assembly-macro32.xml
index 763d17e..59c2dc3 100644
--- a/jEdit/modes/assembly-macro32.xml
+++ b/jEdit/modes/assembly-macro32.xml
@@ -1,577 +1,577 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE MODE SYSTEM "xmode.dtd">
-
-<!--
- VAX Macro32 Assembly mode by Mark Wickens (m.wickens at rhodium-consulting.com)
- based on
- x86 Assembly mode by Kristian Ovaska (kristian.ovaska at helsinki.fi)
--->
-
-<MODE>
-
- <PROPS>
- <PROPERTY NAME="lineComment" VALUE=";" />
- </PROPS>
-
- <RULES HIGHLIGHT_DIGITS="TRUE" IGNORE_CASE="TRUE">
- <EOL_SPAN TYPE="COMMENT1">;</EOL_SPAN>
-
- <SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">
- <BEGIN>'</BEGIN>
- <END>'</END>
- </SPAN>
-
- <SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">
- <BEGIN>"</BEGIN>
- <END>"</END>
- </SPAN>
-
- <!-- NASM: label inside a macro -->
- <MARK_FOLLOWING TYPE="LABEL" MATCH_TYPE="OPERATOR"
- AT_LINE_START="TRUE">%%</MARK_FOLLOWING>
-
- <MARK_FOLLOWING TYPE="KEYWORD2" AT_LINE_START="TRUE">%</MARK_FOLLOWING>
-
- <MARK_PREVIOUS TYPE="LABEL" MATCH_TYPE="OPERATOR"
- AT_LINE_START="TRUE">:</MARK_PREVIOUS>
-
- <!-- Unary Operators -->
- <SEQ TYPE="OPERATOR">B^</SEQ>
- <SEQ TYPE="OPERATOR">D^</SEQ>
- <SEQ TYPE="OPERATOR">O^</SEQ>
- <SEQ TYPE="OPERATOR">X^</SEQ>
- <SEQ TYPE="OPERATOR">A^</SEQ>
- <SEQ TYPE="OPERATOR">M^</SEQ>
- <SEQ TYPE="OPERATOR">F^</SEQ>
- <SEQ TYPE="OPERATOR">C^</SEQ>
- <SEQ TYPE="OPERATOR">L^</SEQ>
- <SEQ TYPE="OPERATOR">G^</SEQ>
- <SEQ TYPE="OPERATOR">^</SEQ>
-
- <!-- Binary Operators -->
- <SEQ TYPE="OPERATOR">+</SEQ>
- <SEQ TYPE="OPERATOR">-</SEQ>
- <SEQ TYPE="OPERATOR">/</SEQ>
- <SEQ TYPE="OPERATOR">*</SEQ>
- <SEQ TYPE="OPERATOR">@</SEQ>
- <SEQ TYPE="OPERATOR">#</SEQ>
- <SEQ TYPE="OPERATOR">&</SEQ>
- <SEQ TYPE="OPERATOR">!</SEQ>
- <SEQ TYPE="OPERATOR">\</SEQ>
-
- <KEYWORDS>
- <!-- Directives -->
- <KEYWORD1>.ADDRESS</KEYWORD1>
- <KEYWORD1>.ALIGN</KEYWORD1>
- <KEYWORD1>.ALIGN</KEYWORD1>
- <KEYWORD1>.ASCIC</KEYWORD1>
- <KEYWORD1>.ASCID</KEYWORD1>
- <KEYWORD1>.ASCII</KEYWORD1>
- <KEYWORD1>.ASCIZ</KEYWORD1>
- <KEYWORD1>.BLKA</KEYWORD1>
- <KEYWORD1>.BLKB</KEYWORD1>
- <KEYWORD1>.BLKD</KEYWORD1>
- <KEYWORD1>.BLKF</KEYWORD1>
- <KEYWORD1>.BLKG</KEYWORD1>
- <KEYWORD1>.BLKH</KEYWORD1>
- <KEYWORD1>.BLKL</KEYWORD1>
- <KEYWORD1>.BLKO</KEYWORD1>
- <KEYWORD1>.BLKQ</KEYWORD1>
- <KEYWORD1>.BLKW</KEYWORD1>
- <KEYWORD1>.BYTE</KEYWORD1>
- <KEYWORD1>.CROSS</KEYWORD1>
- <KEYWORD1>.CROSS</KEYWORD1>
- <KEYWORD1>.DEBUG</KEYWORD1>
- <KEYWORD1>.DEFAULT</KEYWORD1>
- <KEYWORD1>.D_FLOATING</KEYWORD1>
- <KEYWORD1>.DISABLE</KEYWORD1>
- <KEYWORD1>.DOUBLE</KEYWORD1>
- <KEYWORD1>.DSABL</KEYWORD1>
- <KEYWORD1>.ENABL</KEYWORD1>
- <KEYWORD1>.ENABLE</KEYWORD1>
- <KEYWORD1>.END</KEYWORD1>
- <KEYWORD1>.ENDC</KEYWORD1>
- <KEYWORD1>.ENDM</KEYWORD1>
- <KEYWORD1>.ENDR</KEYWORD1>
- <KEYWORD1>.ENTRY</KEYWORD1>
- <KEYWORD1>.ERROR</KEYWORD1>
- <KEYWORD1>.EVEN</KEYWORD1>
- <KEYWORD1>.EXTERNAL</KEYWORD1>
- <KEYWORD1>.EXTRN</KEYWORD1>
- <KEYWORD1>.F_FLOATING</KEYWORD1>
- <KEYWORD1>.FLOAT</KEYWORD1>
- <KEYWORD1>.G_FLOATING</KEYWORD1>
- <KEYWORD1>.GLOBAL</KEYWORD1>
- <KEYWORD1>.GLOBL</KEYWORD1>
- <KEYWORD1>.H_FLOATING</KEYWORD1>
- <KEYWORD1>.IDENT</KEYWORD1>
- <KEYWORD1>.IF</KEYWORD1>
- <KEYWORD1>.IFF</KEYWORD1>
- <KEYWORD1>.IF_FALSE</KEYWORD1>
- <KEYWORD1>.IFT</KEYWORD1>
- <KEYWORD1>.IFTF</KEYWORD1>
- <KEYWORD1>.IF_TRUE</KEYWORD1>
- <KEYWORD1>.IF_TRUE_FALSE</KEYWORD1>
- <KEYWORD1>.IIF</KEYWORD1>
- <KEYWORD1>.IRP</KEYWORD1>
- <KEYWORD1>.IRPC</KEYWORD1>
- <KEYWORD1>.LIBRARY</KEYWORD1>
- <KEYWORD1>.LINK</KEYWORD1>
- <KEYWORD1>.LIST</KEYWORD1>
- <KEYWORD1>.LONG</KEYWORD1>
- <KEYWORD1>.MACRO</KEYWORD1>
- <KEYWORD1>.MASK</KEYWORD1>
- <KEYWORD1>.MCALL</KEYWORD1>
- <KEYWORD1>.MDELETE</KEYWORD1>
- <KEYWORD1>.MEXIT</KEYWORD1>
- <KEYWORD1>.NARG</KEYWORD1>
- <KEYWORD1>.NCHR</KEYWORD1>
- <KEYWORD1>.NLIST</KEYWORD1>
- <KEYWORD1>.NOCROSS</KEYWORD1>
- <KEYWORD1>.NOCROSS</KEYWORD1>
- <KEYWORD1>.NOSHOW</KEYWORD1>
- <KEYWORD1>.NOSHOW</KEYWORD1>
- <KEYWORD1>.NTYPE</KEYWORD1>
- <KEYWORD1>.OCTA</KEYWORD1>
- <KEYWORD1>.OCTA</KEYWORD1>
- <KEYWORD1>.ODD</KEYWORD1>
- <KEYWORD1>.OPDEF</KEYWORD1>
- <KEYWORD1>.PACKED</KEYWORD1>
- <KEYWORD1>.PAGE</KEYWORD1>
- <KEYWORD1>.PRINT</KEYWORD1>
- <KEYWORD1>.PSECT</KEYWORD1>
- <KEYWORD1>.PSECT</KEYWORD1>
- <KEYWORD1>.QUAD</KEYWORD1>
- <KEYWORD1>.QUAD</KEYWORD1>
- <KEYWORD1>.REF1</KEYWORD1>
- <KEYWORD1>.REF2</KEYWORD1>
- <KEYWORD1>.REF4</KEYWORD1>
- <KEYWORD1>.REF8</KEYWORD1>
- <KEYWORD1>.REF16</KEYWORD1>
- <KEYWORD1>.REPEAT</KEYWORD1>
- <KEYWORD1>.REPT</KEYWORD1>
- <KEYWORD1>.RESTORE</KEYWORD1>
- <KEYWORD1>.RESTORE_PSECT</KEYWORD1>
- <KEYWORD1>.SAVE</KEYWORD1>
- <KEYWORD1>.SAVE_PSECT</KEYWORD1>
- <KEYWORD1>.SBTTL</KEYWORD1>
- <KEYWORD1>.SHOW</KEYWORD1>
- <KEYWORD1>.SHOW</KEYWORD1>
- <KEYWORD1>.SIGNED_BYTE</KEYWORD1>
- <KEYWORD1>.SIGNED_WORD</KEYWORD1>
- <KEYWORD1>.SUBTITLE</KEYWORD1>
- <KEYWORD1>.TITLE</KEYWORD1>
- <KEYWORD1>.TRANSFER</KEYWORD1>
- <KEYWORD1>.WARN</KEYWORD1>
- <KEYWORD1>.WEAK</KEYWORD1>
- <KEYWORD1>.WORD</KEYWORD1>
-
- <!-- Registers -->
- <KEYWORD3>R0</KEYWORD3>
- <KEYWORD3>R1</KEYWORD3>
- <KEYWORD3>R2</KEYWORD3>
- <KEYWORD3>R3</KEYWORD3>
- <KEYWORD3>R4</KEYWORD3>
- <KEYWORD3>R5</KEYWORD3>
- <KEYWORD3>R6</KEYWORD3>
- <KEYWORD3>R7</KEYWORD3>
- <KEYWORD3>R8</KEYWORD3>
- <KEYWORD3>R9</KEYWORD3>
- <KEYWORD3>R10</KEYWORD3>
- <KEYWORD3>R11</KEYWORD3>
- <KEYWORD3>R12</KEYWORD3>
- <KEYWORD3>AP</KEYWORD3>
- <KEYWORD3>FP</KEYWORD3>
- <KEYWORD3>SP</KEYWORD3>
- <KEYWORD3>PC</KEYWORD3>
-
- <!-- Instructions -->
- <FUNCTION>ACBB</FUNCTION>
- <FUNCTION>ACBD</FUNCTION>
- <FUNCTION>ACBF</FUNCTION>
- <FUNCTION>ACBG</FUNCTION>
- <FUNCTION>ACBH</FUNCTION>
- <FUNCTION>ACBL</FUNCTION>
- <FUNCTION>ACBW</FUNCTION>
- <FUNCTION>ADAWI</FUNCTION>
- <FUNCTION>ADDB2</FUNCTION>
- <FUNCTION>ADDB3</FUNCTION>
- <FUNCTION>ADDD2</FUNCTION>
- <FUNCTION>ADDD3</FUNCTION>
- <FUNCTION>ADDF2</FUNCTION>
- <FUNCTION>ADDF3</FUNCTION>
- <FUNCTION>ADDG2</FUNCTION>
- <FUNCTION>ADDG3</FUNCTION>
- <FUNCTION>ADDH2</FUNCTION>
- <FUNCTION>ADDH3</FUNCTION>
- <FUNCTION>ADDL2</FUNCTION>
- <FUNCTION>ADDL3</FUNCTION>
- <FUNCTION>ADDP4</FUNCTION>
- <FUNCTION>ADDP6</FUNCTION>
- <FUNCTION>ADDW2</FUNCTION>
- <FUNCTION>ADDW3</FUNCTION>
- <FUNCTION>ADWC</FUNCTION>
- <FUNCTION>AOBLEQ</FUNCTION>
- <FUNCTION>AOBLSS</FUNCTION>
- <FUNCTION>ASHL</FUNCTION>
- <FUNCTION>ASHP</FUNCTION>
- <FUNCTION>ASHQ</FUNCTION>
- <FUNCTION>BBC</FUNCTION>
- <FUNCTION>BBCC</FUNCTION>
- <FUNCTION>BBCCI</FUNCTION>
- <FUNCTION>BBCS</FUNCTION>
- <FUNCTION>BBS</FUNCTION>
- <FUNCTION>BBSC</FUNCTION>
- <FUNCTION>BBSS</FUNCTION>
- <FUNCTION>BBSSI</FUNCTION>
- <FUNCTION>BCC</FUNCTION>
- <FUNCTION>BCS</FUNCTION>
- <FUNCTION>BEQL</FUNCTION>
- <FUNCTION>BEQLU</FUNCTION>
- <FUNCTION>BGEQ</FUNCTION>
- <FUNCTION>BGEQU</FUNCTION>
- <FUNCTION>BGTR</FUNCTION>
- <FUNCTION>BGTRU</FUNCTION>
- <FUNCTION>BICB2</FUNCTION>
- <FUNCTION>BICB3</FUNCTION>
- <FUNCTION>BICL2</FUNCTION>
- <FUNCTION>BICL3</FUNCTION>
- <FUNCTION>BICPSW</FUNCTION>
- <FUNCTION>BICW2</FUNCTION>
- <FUNCTION>BICW3</FUNCTION>
- <FUNCTION>BISB2</FUNCTION>
- <FUNCTION>BISB3</FUNCTION>
- <FUNCTION>BISL2</FUNCTION>
- <FUNCTION>BISL3</FUNCTION>
- <FUNCTION>BISPSW</FUNCTION>
- <FUNCTION>BISW2</FUNCTION>
- <FUNCTION>BISW3</FUNCTION>
- <FUNCTION>BITB</FUNCTION>
- <FUNCTION>BITL</FUNCTION>
- <FUNCTION>BITW</FUNCTION>
- <FUNCTION>BLBC</FUNCTION>
- <FUNCTION>BLBS</FUNCTION>
- <FUNCTION>BLEQ</FUNCTION>
- <FUNCTION>BLEQU</FUNCTION>
- <FUNCTION>BLSS</FUNCTION>
- <FUNCTION>BLSSU</FUNCTION>
- <FUNCTION>BNEQ</FUNCTION>
- <FUNCTION>BNEQU</FUNCTION>
- <FUNCTION>BPT</FUNCTION>
- <FUNCTION>BRB</FUNCTION>
- <FUNCTION>BRW</FUNCTION>
- <FUNCTION>BSBB</FUNCTION>
- <FUNCTION>BSBW</FUNCTION>
- <FUNCTION>BVC</FUNCTION>
- <FUNCTION>BVS</FUNCTION>
- <FUNCTION>CALLG</FUNCTION>
- <FUNCTION>CALLS</FUNCTION>
- <FUNCTION>CASEB</FUNCTION>
- <FUNCTION>CASEL</FUNCTION>
- <FUNCTION>CASEW</FUNCTION>
- <FUNCTION>CHME</FUNCTION>
- <FUNCTION>CHMK</FUNCTION>
- <FUNCTION>CHMS</FUNCTION>
- <FUNCTION>CHMU</FUNCTION>
- <FUNCTION>CLRB</FUNCTION>
- <FUNCTION>CLRD</FUNCTION>
- <FUNCTION>CLRF</FUNCTION>
- <FUNCTION>CLRG</FUNCTION>
- <FUNCTION>CLRH</FUNCTION>
- <FUNCTION>CLRL</FUNCTION>
- <FUNCTION>CLRO</FUNCTION>
- <FUNCTION>CLRQ</FUNCTION>
- <FUNCTION>CLRW</FUNCTION>
- <FUNCTION>CMPB</FUNCTION>
- <FUNCTION>CMPC3</FUNCTION>
- <FUNCTION>CMPC5</FUNCTION>
- <FUNCTION>CMPD</FUNCTION>
- <FUNCTION>CMPF</FUNCTION>
- <FUNCTION>CMPG</FUNCTION>
- <FUNCTION>CMPH</FUNCTION>
- <FUNCTION>CMPL</FUNCTION>
- <FUNCTION>CMPP3</FUNCTION>
- <FUNCTION>CMPP4</FUNCTION>
- <FUNCTION>CMPV</FUNCTION>
- <FUNCTION>CMPW</FUNCTION>
- <FUNCTION>CMPZV</FUNCTION>
- <FUNCTION>CRC</FUNCTION>
- <FUNCTION>CVTBD</FUNCTION>
- <FUNCTION>CVTBF</FUNCTION>
- <FUNCTION>CVTBG</FUNCTION>
- <FUNCTION>CVTBH</FUNCTION>
- <FUNCTION>CVTBL</FUNCTION>
- <FUNCTION>CVTBW</FUNCTION>
- <FUNCTION>CVTDB</FUNCTION>
- <FUNCTION>CVTDF</FUNCTION>
- <FUNCTION>CVTDH</FUNCTION>
- <FUNCTION>CVTDL</FUNCTION>
- <FUNCTION>CVTDW</FUNCTION>
- <FUNCTION>CVTFB</FUNCTION>
- <FUNCTION>CVTFD</FUNCTION>
- <FUNCTION>CVTFG</FUNCTION>
- <FUNCTION>CVTFH</FUNCTION>
- <FUNCTION>CVTFL</FUNCTION>
- <FUNCTION>CVTFW</FUNCTION>
- <FUNCTION>CVTGB</FUNCTION>
- <FUNCTION>CVTGF</FUNCTION>
- <FUNCTION>CVTGH</FUNCTION>
- <FUNCTION>CVTGL</FUNCTION>
- <FUNCTION>CVTGW</FUNCTION>
- <FUNCTION>CVTHB</FUNCTION>
- <FUNCTION>CVTHD</FUNCTION>
- <FUNCTION>CVTHF</FUNCTION>
- <FUNCTION>CVTHG</FUNCTION>
- <FUNCTION>CVTHL</FUNCTION>
- <FUNCTION>CVTHW</FUNCTION>
- <FUNCTION>CVTLB</FUNCTION>
- <FUNCTION>CVTLD</FUNCTION>
- <FUNCTION>CVTLF</FUNCTION>
- <FUNCTION>CVTLG</FUNCTION>
- <FUNCTION>CVTLH</FUNCTION>
- <FUNCTION>CVTLP</FUNCTION>
- <FUNCTION>CVTLW</FUNCTION>
- <FUNCTION>CVTPL</FUNCTION>
- <FUNCTION>CVTPS</FUNCTION>
- <FUNCTION>CVTPT</FUNCTION>
- <FUNCTION>CVTRDL</FUNCTION>
- <FUNCTION>CVTRFL</FUNCTION>
- <FUNCTION>CVTRGL</FUNCTION>
- <FUNCTION>CVTRHL</FUNCTION>
- <FUNCTION>CVTSP</FUNCTION>
- <FUNCTION>CVTTP</FUNCTION>
- <FUNCTION>CVTWB</FUNCTION>
- <FUNCTION>CVTWD</FUNCTION>
- <FUNCTION>CVTWF</FUNCTION>
- <FUNCTION>CVTWG</FUNCTION>
- <FUNCTION>CVTWH</FUNCTION>
- <FUNCTION>CVTWL</FUNCTION>
- <FUNCTION>DECB</FUNCTION>
- <FUNCTION>DECL</FUNCTION>
- <FUNCTION>DECW</FUNCTION>
- <FUNCTION>DIVB2</FUNCTION>
- <FUNCTION>DIVB3</FUNCTION>
- <FUNCTION>DIVD2</FUNCTION>
- <FUNCTION>DIVD3</FUNCTION>
- <FUNCTION>DIVF2</FUNCTION>
- <FUNCTION>DIVF3</FUNCTION>
- <FUNCTION>DIVG2</FUNCTION>
- <FUNCTION>DIVG3</FUNCTION>
- <FUNCTION>DIVH2</FUNCTION>
- <FUNCTION>DIVH3</FUNCTION>
- <FUNCTION>DIVL2</FUNCTION>
- <FUNCTION>DIVL3</FUNCTION>
- <FUNCTION>DIVP</FUNCTION>
- <FUNCTION>DIVW2</FUNCTION>
- <FUNCTION>DIVW3</FUNCTION>
- <FUNCTION>EDITPC</FUNCTION>
- <FUNCTION>EDIV</FUNCTION>
- <FUNCTION>EMODD</FUNCTION>
- <FUNCTION>EMODF</FUNCTION>
- <FUNCTION>EMODG</FUNCTION>
- <FUNCTION>EMODH</FUNCTION>
- <FUNCTION>EMUL</FUNCTION>
- <FUNCTION>EXTV</FUNCTION>
- <FUNCTION>EXTZV</FUNCTION>
- <FUNCTION>FFC</FUNCTION>
- <FUNCTION>FFS</FUNCTION>
- <FUNCTION>HALT</FUNCTION>
- <FUNCTION>INCB</FUNCTION>
- <FUNCTION>INCL</FUNCTION>
- <FUNCTION>INCW</FUNCTION>
- <FUNCTION>INDEX</FUNCTION>
- <FUNCTION>INSQHI</FUNCTION>
- <FUNCTION>INSQTI</FUNCTION>
- <FUNCTION>INSQUE</FUNCTION>
- <FUNCTION>INSV</FUNCTION>
- <FUNCTION>IOTA</FUNCTION>
- <FUNCTION>JMP</FUNCTION>
- <FUNCTION>JSB</FUNCTION>
- <FUNCTION>LDPCTX</FUNCTION>
- <FUNCTION>LOCC</FUNCTION>
- <FUNCTION>MATCHC</FUNCTION>
- <FUNCTION>MCOMB</FUNCTION>
- <FUNCTION>MCOML</FUNCTION>
- <FUNCTION>MCOMW</FUNCTION>
- <FUNCTION>MFPR</FUNCTION>
- <FUNCTION>MFVP</FUNCTION>
- <FUNCTION>MNEGB</FUNCTION>
- <FUNCTION>MNEGD</FUNCTION>
- <FUNCTION>MNEGF</FUNCTION>
- <FUNCTION>MNEGG</FUNCTION>
- <FUNCTION>MNEGH</FUNCTION>
- <FUNCTION>MNEGL</FUNCTION>
- <FUNCTION>MNEGW</FUNCTION>
- <FUNCTION>MOVAB</FUNCTION>
- <FUNCTION>MOVAD</FUNCTION>
- <FUNCTION>MOVAF</FUNCTION>
- <FUNCTION>MOVAG</FUNCTION>
- <FUNCTION>MOVAH</FUNCTION>
- <FUNCTION>MOVAL</FUNCTION>
- <FUNCTION>MOVAO</FUNCTION>
- <FUNCTION>MOVAQ</FUNCTION>
- <FUNCTION>MOVAW</FUNCTION>
- <FUNCTION>MOVB</FUNCTION>
- <FUNCTION>MOVC3</FUNCTION>
- <FUNCTION>MOVC5</FUNCTION>
- <FUNCTION>MOVD</FUNCTION>
- <FUNCTION>MOVF</FUNCTION>
- <FUNCTION>MOVG</FUNCTION>
- <FUNCTION>MOVH</FUNCTION>
- <FUNCTION>MOVL</FUNCTION>
- <FUNCTION>MOVO</FUNCTION>
- <FUNCTION>MOVP</FUNCTION>
- <FUNCTION>MOVPSL</FUNCTION>
- <FUNCTION>MOVQ</FUNCTION>
- <FUNCTION>MOVTC</FUNCTION>
- <FUNCTION>MOVTUC</FUNCTION>
- <FUNCTION>MOVW</FUNCTION>
- <FUNCTION>MOVZBL</FUNCTION>
- <FUNCTION>MOVZBW</FUNCTION>
- <FUNCTION>MOVZWL</FUNCTION>
- <FUNCTION>MTPR</FUNCTION>
- <FUNCTION>MTVP</FUNCTION>
- <FUNCTION>MULB2</FUNCTION>
- <FUNCTION>MULB3</FUNCTION>
- <FUNCTION>MULD2</FUNCTION>
- <FUNCTION>MULD3</FUNCTION>
- <FUNCTION>MULF2</FUNCTION>
- <FUNCTION>MULF3</FUNCTION>
- <FUNCTION>MULG2</FUNCTION>
- <FUNCTION>MULG3</FUNCTION>
- <FUNCTION>MULH2</FUNCTION>
- <FUNCTION>MULH3</FUNCTION>
- <FUNCTION>MULL2</FUNCTION>
- <FUNCTION>MULL3</FUNCTION>
- <FUNCTION>MULP</FUNCTION>
- <FUNCTION>MULW2</FUNCTION>
- <FUNCTION>MULW3</FUNCTION>
- <FUNCTION>NOP</FUNCTION>
- <FUNCTION>POLYD</FUNCTION>
- <FUNCTION>POLYF</FUNCTION>
- <FUNCTION>POLYG</FUNCTION>
- <FUNCTION>POLYH</FUNCTION>
- <FUNCTION>POPR</FUNCTION>
- <FUNCTION>PROBER</FUNCTION>
- <FUNCTION>PROBEW</FUNCTION>
- <FUNCTION>PUSHAB</FUNCTION>
- <FUNCTION>PUSHABL</FUNCTION>
- <FUNCTION>PUSHAL</FUNCTION>
- <FUNCTION>PUSHAD</FUNCTION>
- <FUNCTION>PUSHAF</FUNCTION>
- <FUNCTION>PUSHAG</FUNCTION>
- <FUNCTION>PUSHAH</FUNCTION>
- <FUNCTION>PUSHAL</FUNCTION>
- <FUNCTION>PUSHAO</FUNCTION>
- <FUNCTION>PUSHAQ</FUNCTION>
- <FUNCTION>PUSHAW</FUNCTION>
- <FUNCTION>PUSHL</FUNCTION>
- <FUNCTION>PUSHR</FUNCTION>
- <FUNCTION>REI</FUNCTION>
- <FUNCTION>REMQHI</FUNCTION>
- <FUNCTION>REMQTI</FUNCTION>
- <FUNCTION>REMQUE</FUNCTION>
- <FUNCTION>RET</FUNCTION>
- <FUNCTION>ROTL</FUNCTION>
- <FUNCTION>RSB</FUNCTION>
- <FUNCTION>SBWC</FUNCTION>
- <FUNCTION>SCANC</FUNCTION>
- <FUNCTION>SKPC</FUNCTION>
- <FUNCTION>SOBGEQ</FUNCTION>
- <FUNCTION>SOBGTR</FUNCTION>
- <FUNCTION>SPANC</FUNCTION>
- <FUNCTION>SUBB2</FUNCTION>
- <FUNCTION>SUBB3</FUNCTION>
- <FUNCTION>SUBD2</FUNCTION>
- <FUNCTION>SUBD3</FUNCTION>
- <FUNCTION>SUBF2</FUNCTION>
- <FUNCTION>SUBF3</FUNCTION>
- <FUNCTION>SUBG2</FUNCTION>
- <FUNCTION>SUBG3</FUNCTION>
- <FUNCTION>SUBH2</FUNCTION>
- <FUNCTION>SUBH3</FUNCTION>
- <FUNCTION>SUBL2</FUNCTION>
- <FUNCTION>SUBL3</FUNCTION>
- <FUNCTION>SUBP4</FUNCTION>
- <FUNCTION>SUBP6</FUNCTION>
- <FUNCTION>SUBW2</FUNCTION>
- <FUNCTION>SUBW3</FUNCTION>
- <FUNCTION>SVPCTX</FUNCTION>
- <FUNCTION>TSTB</FUNCTION>
- <FUNCTION>TSTD</FUNCTION>
- <FUNCTION>TSTF</FUNCTION>
- <FUNCTION>TSTG</FUNCTION>
- <FUNCTION>TSTH</FUNCTION>
- <FUNCTION>TSTL</FUNCTION>
- <FUNCTION>TSTW</FUNCTION>
- <FUNCTION>VGATHL</FUNCTION>
- <FUNCTION>VGATHQ</FUNCTION>
- <FUNCTION>VLDL</FUNCTION>
- <FUNCTION>VLDQ</FUNCTION>
- <FUNCTION>VSADDD</FUNCTION>
- <FUNCTION>VSADDF</FUNCTION>
- <FUNCTION>VSADDG</FUNCTION>
- <FUNCTION>VSADDL</FUNCTION>
- <FUNCTION>VSBICL</FUNCTION>
- <FUNCTION>VSBISL</FUNCTION>
- <FUNCTION>VSCATL</FUNCTION>
- <FUNCTION>VSCATQ</FUNCTION>
- <FUNCTION>VSCMPD</FUNCTION>
- <FUNCTION>VSCMPF</FUNCTION>
- <FUNCTION>VSCMPG</FUNCTION>
- <FUNCTION>VSCMPL</FUNCTION>
- <FUNCTION>VSDIVD</FUNCTION>
- <FUNCTION>VSDIVF</FUNCTION>
- <FUNCTION>VSDIVG</FUNCTION>
- <FUNCTION>VSMERGE</FUNCTION>
- <FUNCTION>VSMULD</FUNCTION>
- <FUNCTION>VSMULF</FUNCTION>
- <FUNCTION>VSMULG</FUNCTION>
- <FUNCTION>VSMULL</FUNCTION>
- <FUNCTION>VSSLLL</FUNCTION>
- <FUNCTION>VSSRLL</FUNCTION>
- <FUNCTION>VSSUBD</FUNCTION>
- <FUNCTION>VSSUBF</FUNCTION>
- <FUNCTION>VSSUBG</FUNCTION>
- <FUNCTION>VSSUBL</FUNCTION>
- <FUNCTION>VSTL</FUNCTION>
- <FUNCTION>VSTQ</FUNCTION>
- <FUNCTION>VSXORL</FUNCTION>
- <FUNCTION>VSYNC</FUNCTION>
- <FUNCTION>VVADDD</FUNCTION>
- <FUNCTION>VVADDF</FUNCTION>
- <FUNCTION>VVADDG</FUNCTION>
- <FUNCTION>VVADDL</FUNCTION>
- <FUNCTION>VVBICL</FUNCTION>
- <FUNCTION>VVBISL</FUNCTION>
- <FUNCTION>VVCMPD</FUNCTION>
- <FUNCTION>VVCMPF</FUNCTION>
- <FUNCTION>VVCMPG</FUNCTION>
- <FUNCTION>VVCMPL</FUNCTION>
- <FUNCTION>VVCVT</FUNCTION>
- <FUNCTION>VVDIVD</FUNCTION>
- <FUNCTION>VVDIVF</FUNCTION>
- <FUNCTION>VVDIVG</FUNCTION>
- <FUNCTION>VVMERGE</FUNCTION>
- <FUNCTION>VVMULD</FUNCTION>
- <FUNCTION>VVMULF</FUNCTION>
- <FUNCTION>VVMULG</FUNCTION>
- <FUNCTION>VVMULL</FUNCTION>
- <FUNCTION>VVSLLL</FUNCTION>
- <FUNCTION>VVSRLL</FUNCTION>
- <FUNCTION>VVSUBD</FUNCTION>
- <FUNCTION>VVSUBF</FUNCTION>
- <FUNCTION>VVSUBG</FUNCTION>
- <FUNCTION>VVSUBL</FUNCTION>
- <FUNCTION>VVXORL</FUNCTION>
- <FUNCTION>XFC</FUNCTION>
- <FUNCTION>XORB2</FUNCTION>
- <FUNCTION>XORB3</FUNCTION>
- <FUNCTION>XORL2</FUNCTION>
- <FUNCTION>XORL3</FUNCTION>
- <FUNCTION>XORW2</FUNCTION>
- <FUNCTION>XORW3</FUNCTION>
- </KEYWORDS>
- </RULES>
-</MODE>
+<?xml version="1.0"?>
+
+<!DOCTYPE MODE SYSTEM "xmode.dtd">
+
+<!--
+ VAX Macro32 Assembly mode by Mark Wickens (m.wickens at rhodium-consulting.com)
+ based on
+ x86 Assembly mode by Kristian Ovaska (kristian.ovaska at helsinki.fi)
+-->
+
+<MODE>
+
+ <PROPS>
+ <PROPERTY NAME="lineComment" VALUE=";" />
+ </PROPS>
+
+ <RULES HIGHLIGHT_DIGITS="TRUE" IGNORE_CASE="TRUE">
+ <EOL_SPAN TYPE="COMMENT1">;</EOL_SPAN>
+
+ <SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">
+ <BEGIN>'</BEGIN>
+ <END>'</END>
+ </SPAN>
+
+ <SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">
+ <BEGIN>"</BEGIN>
+ <END>"</END>
+ </SPAN>
+
+ <!-- NASM: label inside a macro -->
+ <MARK_FOLLOWING TYPE="LABEL" MATCH_TYPE="OPERATOR"
+ AT_LINE_START="TRUE">%%</MARK_FOLLOWING>
+
+ <MARK_FOLLOWING TYPE="KEYWORD2" AT_LINE_START="TRUE">%</MARK_FOLLOWING>
+
+ <MARK_PREVIOUS TYPE="LABEL" MATCH_TYPE="OPERATOR"
+ AT_LINE_START="TRUE">:</MARK_PREVIOUS>
+
+ <!-- Unary Operators -->
+ <SEQ TYPE="OPERATOR">B^</SEQ>
+ <SEQ TYPE="OPERATOR">D^</SEQ>
+ <SEQ TYPE="OPERATOR">O^</SEQ>
+ <SEQ TYPE="OPERATOR">X^</SEQ>
+ <SEQ TYPE="OPERATOR">A^</SEQ>
+ <SEQ TYPE="OPERATOR">M^</SEQ>
+ <SEQ TYPE="OPERATOR">F^</SEQ>
+ <SEQ TYPE="OPERATOR">C^</SEQ>
+ <SEQ TYPE="OPERATOR">L^</SEQ>
+ <SEQ TYPE="OPERATOR">G^</SEQ>
+ <SEQ TYPE="OPERATOR">^</SEQ>
+
+ <!-- Binary Operators -->
+ <SEQ TYPE="OPERATOR">+</SEQ>
+ <SEQ TYPE="OPERATOR">-</SEQ>
+ <SEQ TYPE="OPERATOR">/</SEQ>
+ <SEQ TYPE="OPERATOR">*</SEQ>
+ <SEQ TYPE="OPERATOR">@</SEQ>
+ <SEQ TYPE="OPERATOR">#</SEQ>
+ <SEQ TYPE="OPERATOR">&</SEQ>
+ <SEQ TYPE="OPERATOR">!</SEQ>
+ <SEQ TYPE="OPERATOR">\</SEQ>
+
+ <KEYWORDS>
+ <!-- Directives -->
+ <KEYWORD1>.ADDRESS</KEYWORD1>
+ <KEYWORD1>.ALIGN</KEYWORD1>
+ <KEYWORD1>.ALIGN</KEYWORD1>
+ <KEYWORD1>.ASCIC</KEYWORD1>
+ <KEYWORD1>.ASCID</KEYWORD1>
+ <KEYWORD1>.ASCII</KEYWORD1>
+ <KEYWORD1>.ASCIZ</KEYWORD1>
+ <KEYWORD1>.BLKA</KEYWORD1>
+ <KEYWORD1>.BLKB</KEYWORD1>
+ <KEYWORD1>.BLKD</KEYWORD1>
+ <KEYWORD1>.BLKF</KEYWORD1>
+ <KEYWORD1>.BLKG</KEYWORD1>
+ <KEYWORD1>.BLKH</KEYWORD1>
+ <KEYWORD1>.BLKL</KEYWORD1>
+ <KEYWORD1>.BLKO</KEYWORD1>
+ <KEYWORD1>.BLKQ</KEYWORD1>
+ <KEYWORD1>.BLKW</KEYWORD1>
+ <KEYWORD1>.BYTE</KEYWORD1>
+ <KEYWORD1>.CROSS</KEYWORD1>
+ <KEYWORD1>.CROSS</KEYWORD1>
+ <KEYWORD1>.DEBUG</KEYWORD1>
+ <KEYWORD1>.DEFAULT</KEYWORD1>
+ <KEYWORD1>.D_FLOATING</KEYWORD1>
+ <KEYWORD1>.DISABLE</KEYWORD1>
+ <KEYWORD1>.DOUBLE</KEYWORD1>
+ <KEYWORD1>.DSABL</KEYWORD1>
+ <KEYWORD1>.ENABL</KEYWORD1>
+ <KEYWORD1>.ENABLE</KEYWORD1>
+ <KEYWORD1>.END</KEYWORD1>
+ <KEYWORD1>.ENDC</KEYWORD1>
+ <KEYWORD1>.ENDM</KEYWORD1>
+ <KEYWORD1>.ENDR</KEYWORD1>
+ <KEYWORD1>.ENTRY</KEYWORD1>
+ <KEYWORD1>.ERROR</KEYWORD1>
+ <KEYWORD1>.EVEN</KEYWORD1>
+ <KEYWORD1>.EXTERNAL</KEYWORD1>
+ <KEYWORD1>.EXTRN</KEYWORD1>
+ <KEYWORD1>.F_FLOATING</KEYWORD1>
+ <KEYWORD1>.FLOAT</KEYWORD1>
+ <KEYWORD1>.G_FLOATING</KEYWORD1>
+ <KEYWORD1>.GLOBAL</KEYWORD1>
+ <KEYWORD1>.GLOBL</KEYWORD1>
+ <KEYWORD1>.H_FLOATING</KEYWORD1>
+ <KEYWORD1>.IDENT</KEYWORD1>
+ <KEYWORD1>.IF</KEYWORD1>
+ <KEYWORD1>.IFF</KEYWORD1>
+ <KEYWORD1>.IF_FALSE</KEYWORD1>
+ <KEYWORD1>.IFT</KEYWORD1>
+ <KEYWORD1>.IFTF</KEYWORD1>
+ <KEYWORD1>.IF_TRUE</KEYWORD1>
+ <KEYWORD1>.IF_TRUE_FALSE</KEYWORD1>
+ <KEYWORD1>.IIF</KEYWORD1>
+ <KEYWORD1>.IRP</KEYWORD1>
+ <KEYWORD1>.IRPC</KEYWORD1>
+ <KEYWORD1>.LIBRARY</KEYWORD1>
+ <KEYWORD1>.LINK</KEYWORD1>
+ <KEYWORD1>.LIST</KEYWORD1>
+ <KEYWORD1>.LONG</KEYWORD1>
+ <KEYWORD1>.MACRO</KEYWORD1>
+ <KEYWORD1>.MASK</KEYWORD1>
+ <KEYWORD1>.MCALL</KEYWORD1>
+ <KEYWORD1>.MDELETE</KEYWORD1>
+ <KEYWORD1>.MEXIT</KEYWORD1>
+ <KEYWORD1>.NARG</KEYWORD1>
+ <KEYWORD1>.NCHR</KEYWORD1>
+ <KEYWORD1>.NLIST</KEYWORD1>
+ <KEYWORD1>.NOCROSS</KEYWORD1>
+ <KEYWORD1>.NOCROSS</KEYWORD1>
+ <KEYWORD1>.NOSHOW</KEYWORD1>
+ <KEYWORD1>.NOSHOW</KEYWORD1>
+ <KEYWORD1>.NTYPE</KEYWORD1>
+ <KEYWORD1>.OCTA</KEYWORD1>
+ <KEYWORD1>.OCTA</KEYWORD1>
+ <KEYWORD1>.ODD</KEYWORD1>
+ <KEYWORD1>.OPDEF</KEYWORD1>
+ <KEYWORD1>.PACKED</KEYWORD1>
+ <KEYWORD1>.PAGE</KEYWORD1>
+ <KEYWORD1>.PRINT</KEYWORD1>
+ <KEYWORD1>.PSECT</KEYWORD1>
+ <KEYWORD1>.PSECT</KEYWORD1>
+ <KEYWORD1>.QUAD</KEYWORD1>
+ <KEYWORD1>.QUAD</KEYWORD1>
+ <KEYWORD1>.REF1</KEYWORD1>
+ <KEYWORD1>.REF2</KEYWORD1>
+ <KEYWORD1>.REF4</KEYWORD1>
+ <KEYWORD1>.REF8</KEYWORD1>
+ <KEYWORD1>.REF16</KEYWORD1>
+ <KEYWORD1>.REPEAT</KEYWORD1>
+ <KEYWORD1>.REPT</KEYWORD1>
+ <KEYWORD1>.RESTORE</KEYWORD1>
+ <KEYWORD1>.RESTORE_PSECT</KEYWORD1>
+ <KEYWORD1>.SAVE</KEYWORD1>
+ <KEYWORD1>.SAVE_PSECT</KEYWORD1>
+ <KEYWORD1>.SBTTL</KEYWORD1>
+ <KEYWORD1>.SHOW</KEYWORD1>
+ <KEYWORD1>.SHOW</KEYWORD1>
+ <KEYWORD1>.SIGNED_BYTE</KEYWORD1>
+ <KEYWORD1>.SIGNED_WORD</KEYWORD1>
+ <KEYWORD1>.SUBTITLE</KEYWORD1>
+ <KEYWORD1>.TITLE</KEYWORD1>
+ <KEYWORD1>.TRANSFER</KEYWORD1>
+ <KEYWORD1>.WARN</KEYWORD1>
+ <KEYWORD1>.WEAK</KEYWORD1>
+ <KEYWORD1>.WORD</KEYWORD1>
+
+ <!-- Registers -->
+ <KEYWORD3>R0</KEYWORD3>
+ <KEYWORD3>R1</KEYWORD3>
+ <KEYWORD3>R2</KEYWORD3>
+ <KEYWORD3>R3</KEYWORD3>
+ <KEYWORD3>R4</KEYWORD3>
+ <KEYWORD3>R5</KEYWORD3>
+ <KEYWORD3>R6</KEYWORD3>
+ <KEYWORD3>R7</KEYWORD3>
+ <KEYWORD3>R8</KEYWORD3>
+ <KEYWORD3>R9</KEYWORD3>
+ <KEYWORD3>R10</KEYWORD3>
+ <KEYWORD3>R11</KEYWORD3>
+ <KEYWORD3>R12</KEYWORD3>
+ <KEYWORD3>AP</KEYWORD3>
+ <KEYWORD3>FP</KEYWORD3>
+ <KEYWORD3>SP</KEYWORD3>
+ <KEYWORD3>PC</KEYWORD3>
+
+ <!-- Instructions -->
+ <FUNCTION>ACBB</FUNCTION>
+ <FUNCTION>ACBD</FUNCTION>
+ <FUNCTION>ACBF</FUNCTION>
+ <FUNCTION>ACBG</FUNCTION>
+ <FUNCTION>ACBH</FUNCTION>
+ <FUNCTION>ACBL</FUNCTION>
+ <FUNCTION>ACBW</FUNCTION>
+ <FUNCTION>ADAWI</FUNCTION>
+ <FUNCTION>ADDB2</FUNCTION>
+ <FUNCTION>ADDB3</FUNCTION>
+ <FUNCTION>ADDD2</FUNCTION>
+ <FUNCTION>ADDD3</FUNCTION>
+ <FUNCTION>ADDF2</FUNCTION>
+ <FUNCTION>ADDF3</FUNCTION>
+ <FUNCTION>ADDG2</FUNCTION>
+ <FUNCTION>ADDG3</FUNCTION>
+ <FUNCTION>ADDH2</FUNCTION>
+ <FUNCTION>ADDH3</FUNCTION>
+ <FUNCTION>ADDL2</FUNCTION>
+ <FUNCTION>ADDL3</FUNCTION>
+ <FUNCTION>ADDP4</FUNCTION>
+ <FUNCTION>ADDP6</FUNCTION>
+ <FUNCTION>ADDW2</FUNCTION>
+ <FUNCTION>ADDW3</FUNCTION>
+ <FUNCTION>ADWC</FUNCTION>
+ <FUNCTION>AOBLEQ</FUNCTION>
+ <FUNCTION>AOBLSS</FUNCTION>
+ <FUNCTION>ASHL</FUNCTION>
+ <FUNCTION>ASHP</FUNCTION>
+ <FUNCTION>ASHQ</FUNCTION>
+ <FUNCTION>BBC</FUNCTION>
+ <FUNCTION>BBCC</FUNCTION>
+ <FUNCTION>BBCCI</FUNCTION>
+ <FUNCTION>BBCS</FUNCTION>
+ <FUNCTION>BBS</FUNCTION>
+ <FUNCTION>BBSC</FUNCTION>
+ <FUNCTION>BBSS</FUNCTION>
+ <FUNCTION>BBSSI</FUNCTION>
+ <FUNCTION>BCC</FUNCTION>
+ <FUNCTION>BCS</FUNCTION>
+ <FUNCTION>BEQL</FUNCTION>
+ <FUNCTION>BEQLU</FUNCTION>
+ <FUNCTION>BGEQ</FUNCTION>
+ <FUNCTION>BGEQU</FUNCTION>
+ <FUNCTION>BGTR</FUNCTION>
+ <FUNCTION>BGTRU</FUNCTION>
+ <FUNCTION>BICB2</FUNCTION>
+ <FUNCTION>BICB3</FUNCTION>
+ <FUNCTION>BICL2</FUNCTION>
+ <FUNCTION>BICL3</FUNCTION>
+ <FUNCTION>BICPSW</FUNCTION>
+ <FUNCTION>BICW2</FUNCTION>
+ <FUNCTION>BICW3</FUNCTION>
+ <FUNCTION>BISB2</FUNCTION>
+ <FUNCTION>BISB3</FUNCTION>
+ <FUNCTION>BISL2</FUNCTION>
+ <FUNCTION>BISL3</FUNCTION>
+ <FUNCTION>BISPSW</FUNCTION>
+ <FUNCTION>BISW2</FUNCTION>
+ <FUNCTION>BISW3</FUNCTION>
+ <FUNCTION>BITB</FUNCTION>
+ <FUNCTION>BITL</FUNCTION>
+ <FUNCTION>BITW</FUNCTION>
+ <FUNCTION>BLBC</FUNCTION>
+ <FUNCTION>BLBS</FUNCTION>
+ <FUNCTION>BLEQ</FUNCTION>
+ <FUNCTION>BLEQU</FUNCTION>
+ <FUNCTION>BLSS</FUNCTION>
+ <FUNCTION>BLSSU</FUNCTION>
+ <FUNCTION>BNEQ</FUNCTION>
+ <FUNCTION>BNEQU</FUNCTION>
+ <FUNCTION>BPT</FUNCTION>
+ <FUNCTION>BRB</FUNCTION>
+ <FUNCTION>BRW</FUNCTION>
+ <FUNCTION>BSBB</FUNCTION>
+ <FUNCTION>BSBW</FUNCTION>
+ <FUNCTION>BVC</FUNCTION>
+ <FUNCTION>BVS</FUNCTION>
+ <FUNCTION>CALLG</FUNCTION>
+ <FUNCTION>CALLS</FUNCTION>
+ <FUNCTION>CASEB</FUNCTION>
+ <FUNCTION>CASEL</FUNCTION>
+ <FUNCTION>CASEW</FUNCTION>
+ <FUNCTION>CHME</FUNCTION>
+ <FUNCTION>CHMK</FUNCTION>
+ <FUNCTION>CHMS</FUNCTION>
+ <FUNCTION>CHMU</FUNCTION>
+ <FUNCTION>CLRB</FUNCTION>
+ <FUNCTION>CLRD</FUNCTION>
+ <FUNCTION>CLRF</FUNCTION>
+ <FUNCTION>CLRG</FUNCTION>
+ <FUNCTION>CLRH</FUNCTION>
+ <FUNCTION>CLRL</FUNCTION>
+ <FUNCTION>CLRO</FUNCTION>
+ <FUNCTION>CLRQ</FUNCTION>
+ <FUNCTION>CLRW</FUNCTION>
+ <FUNCTION>CMPB</FUNCTION>
+ <FUNCTION>CMPC3</FUNCTION>
+ <FUNCTION>CMPC5</FUNCTION>
+ <FUNCTION>CMPD</FUNCTION>
+ <FUNCTION>CMPF</FUNCTION>
+ <FUNCTION>CMPG</FUNCTION>
+ <FUNCTION>CMPH</FUNCTION>
+ <FUNCTION>CMPL</FUNCTION>
+ <FUNCTION>CMPP3</FUNCTION>
+ <FUNCTION>CMPP4</FUNCTION>
+ <FUNCTION>CMPV</FUNCTION>
+ <FUNCTION>CMPW</FUNCTION>
+ <FUNCTION>CMPZV</FUNCTION>
+ <FUNCTION>CRC</FUNCTION>
+ <FUNCTION>CVTBD</FUNCTION>
+ <FUNCTION>CVTBF</FUNCTION>
+ <FUNCTION>CVTBG</FUNCTION>
+ <FUNCTION>CVTBH</FUNCTION>
+ <FUNCTION>CVTBL</FUNCTION>
+ <FUNCTION>CVTBW</FUNCTION>
+ <FUNCTION>CVTDB</FUNCTION>
+ <FUNCTION>CVTDF</FUNCTION>
+ <FUNCTION>CVTDH</FUNCTION>
+ <FUNCTION>CVTDL</FUNCTION>
+ <FUNCTION>CVTDW</FUNCTION>
+ <FUNCTION>CVTFB</FUNCTION>
+ <FUNCTION>CVTFD</FUNCTION>
+ <FUNCTION>CVTFG</FUNCTION>
+ <FUNCTION>CVTFH</FUNCTION>
+ <FUNCTION>CVTFL</FUNCTION>
+ <FUNCTION>CVTFW</FUNCTION>
+ <FUNCTION>CVTGB</FUNCTION>
+ <FUNCTION>CVTGF</FUNCTION>
+ <FUNCTION>CVTGH</FUNCTION>
+ <FUNCTION>CVTGL</FUNCTION>
+ <FUNCTION>CVTGW</FUNCTION>
+ <FUNCTION>CVTHB</FUNCTION>
+ <FUNCTION>CVTHD</FUNCTION>
+ <FUNCTION>CVTHF</FUNCTION>
+ <FUNCTION>CVTHG</FUNCTION>
+ <FUNCTION>CVTHL</FUNCTION>
+ <FUNCTION>CVTHW</FUNCTION>
+ <FUNCTION>CVTLB</FUNCTION>
+ <FUNCTION>CVTLD</FUNCTION>
+ <FUNCTION>CVTLF</FUNCTION>
+ <FUNCTION>CVTLG</FUNCTION>
+ <FUNCTION>CVTLH</FUNCTION>
+ <FUNCTION>CVTLP</FUNCTION>
+ <FUNCTION>CVTLW</FUNCTION>
+ <FUNCTION>CVTPL</FUNCTION>
+ <FUNCTION>CVTPS</FUNCTION>
+ <FUNCTION>CVTPT</FUNCTION>
+ <FUNCTION>CVTRDL</FUNCTION>
+ <FUNCTION>CVTRFL</FUNCTION>
+ <FUNCTION>CVTRGL</FUNCTION>
+ <FUNCTION>CVTRHL</FUNCTION>
+ <FUNCTION>CVTSP</FUNCTION>
+ <FUNCTION>CVTTP</FUNCTION>
+ <FUNCTION>CVTWB</FUNCTION>
+ <FUNCTION>CVTWD</FUNCTION>
+ <FUNCTION>CVTWF</FUNCTION>
+ <FUNCTION>CVTWG</FUNCTION>
+ <FUNCTION>CVTWH</FUNCTION>
+ <FUNCTION>CVTWL</FUNCTION>
+ <FUNCTION>DECB</FUNCTION>
+ <FUNCTION>DECL</FUNCTION>
+ <FUNCTION>DECW</FUNCTION>
+ <FUNCTION>DIVB2</FUNCTION>
+ <FUNCTION>DIVB3</FUNCTION>
+ <FUNCTION>DIVD2</FUNCTION>
+ <FUNCTION>DIVD3</FUNCTION>
+ <FUNCTION>DIVF2</FUNCTION>
+ <FUNCTION>DIVF3</FUNCTION>
+ <FUNCTION>DIVG2</FUNCTION>
+ <FUNCTION>DIVG3</FUNCTION>
+ <FUNCTION>DIVH2</FUNCTION>
+ <FUNCTION>DIVH3</FUNCTION>
+ <FUNCTION>DIVL2</FUNCTION>
+ <FUNCTION>DIVL3</FUNCTION>
+ <FUNCTION>DIVP</FUNCTION>
+ <FUNCTION>DIVW2</FUNCTION>
+ <FUNCTION>DIVW3</FUNCTION>
+ <FUNCTION>EDITPC</FUNCTION>
+ <FUNCTION>EDIV</FUNCTION>
+ <FUNCTION>EMODD</FUNCTION>
+ <FUNCTION>EMODF</FUNCTION>
+ <FUNCTION>EMODG</FUNCTION>
+ <FUNCTION>EMODH</FUNCTION>
+ <FUNCTION>EMUL</FUNCTION>
+ <FUNCTION>EXTV</FUNCTION>
+ <FUNCTION>EXTZV</FUNCTION>
+ <FUNCTION>FFC</FUNCTION>
+ <FUNCTION>FFS</FUNCTION>
+ <FUNCTION>HALT</FUNCTION>
+ <FUNCTION>INCB</FUNCTION>
+ <FUNCTION>INCL</FUNCTION>
+ <FUNCTION>INCW</FUNCTION>
+ <FUNCTION>INDEX</FUNCTION>
+ <FUNCTION>INSQHI</FUNCTION>
+ <FUNCTION>INSQTI</FUNCTION>
+ <FUNCTION>INSQUE</FUNCTION>
+ <FUNCTION>INSV</FUNCTION>
+ <FUNCTION>IOTA</FUNCTION>
+ <FUNCTION>JMP</FUNCTION>
+ <FUNCTION>JSB</FUNCTION>
+ <FUNCTION>LDPCTX</FUNCTION>
+ <FUNCTION>LOCC</FUNCTION>
+ <FUNCTION>MATCHC</FUNCTION>
+ <FUNCTION>MCOMB</FUNCTION>
+ <FUNCTION>MCOML</FUNCTION>
+ <FUNCTION>MCOMW</FUNCTION>
+ <FUNCTION>MFPR</FUNCTION>
+ <FUNCTION>MFVP</FUNCTION>
+ <FUNCTION>MNEGB</FUNCTION>
+ <FUNCTION>MNEGD</FUNCTION>
+ <FUNCTION>MNEGF</FUNCTION>
+ <FUNCTION>MNEGG</FUNCTION>
+ <FUNCTION>MNEGH</FUNCTION>
+ <FUNCTION>MNEGL</FUNCTION>
+ <FUNCTION>MNEGW</FUNCTION>
+ <FUNCTION>MOVAB</FUNCTION>
+ <FUNCTION>MOVAD</FUNCTION>
+ <FUNCTION>MOVAF</FUNCTION>
+ <FUNCTION>MOVAG</FUNCTION>
+ <FUNCTION>MOVAH</FUNCTION>
+ <FUNCTION>MOVAL</FUNCTION>
+ <FUNCTION>MOVAO</FUNCTION>
+ <FUNCTION>MOVAQ</FUNCTION>
+ <FUNCTION>MOVAW</FUNCTION>
+ <FUNCTION>MOVB</FUNCTION>
+ <FUNCTION>MOVC3</FUNCTION>
+ <FUNCTION>MOVC5</FUNCTION>
+ <FUNCTION>MOVD</FUNCTION>
+ <FUNCTION>MOVF</FUNCTION>
+ <FUNCTION>MOVG</FUNCTION>
+ <FUNCTION>MOVH</FUNCTION>
+ <FUNCTION>MOVL</FUNCTION>
+ <FUNCTION>MOVO</FUNCTION>
+ <FUNCTION>MOVP</FUNCTION>
+ <FUNCTION>MOVPSL</FUNCTION>
+ <FUNCTION>MOVQ</FUNCTION>
+ <FUNCTION>MOVTC</FUNCTION>
+ <FUNCTION>MOVTUC</FUNCTION>
+ <FUNCTION>MOVW</FUNCTION>
+ <FUNCTION>MOVZBL</FUNCTION>
+ <FUNCTION>MOVZBW</FUNCTION>
+ <FUNCTION>MOVZWL</FUNCTION>
+ <FUNCTION>MTPR</FUNCTION>
+ <FUNCTION>MTVP</FUNCTION>
+ <FUNCTION>MULB2</FUNCTION>
+ <FUNCTION>MULB3</FUNCTION>
+ <FUNCTION>MULD2</FUNCTION>
+ <FUNCTION>MULD3</FUNCTION>
+ <FUNCTION>MULF2</FUNCTION>
+ <FUNCTION>MULF3</FUNCTION>
+ <FUNCTION>MULG2</FUNCTION>
+ <FUNCTION>MULG3</FUNCTION>
+ <FUNCTION>MULH2</FUNCTION>
+ <FUNCTION>MULH3</FUNCTION>
+ <FUNCTION>MULL2</FUNCTION>
+ <FUNCTION>MULL3</FUNCTION>
+ <FUNCTION>MULP</FUNCTION>
+ <FUNCTION>MULW2</FUNCTION>
+ <FUNCTION>MULW3</FUNCTION>
+ <FUNCTION>NOP</FUNCTION>
+ <FUNCTION>POLYD</FUNCTION>
+ <FUNCTION>POLYF</FUNCTION>
+ <FUNCTION>POLYG</FUNCTION>
+ <FUNCTION>POLYH</FUNCTION>
+ <FUNCTION>POPR</FUNCTION>
+ <FUNCTION>PROBER</FUNCTION>
+ <FUNCTION>PROBEW</FUNCTION>
+ <FUNCTION>PUSHAB</FUNCTION>
+ <FUNCTION>PUSHABL</FUNCTION>
+ <FUNCTION>PUSHAL</FUNCTION>
+ <FUNCTION>PUSHAD</FUNCTION>
+ <FUNCTION>PUSHAF</FUNCTION>
+ <FUNCTION>PUSHAG</FUNCTION>
+ <FUNCTION>PUSHAH</FUNCTION>
+ <FUNCTION>PUSHAL</FUNCTION>
+ <FUNCTION>PUSHAO</FUNCTION>
+ <FUNCTION>PUSHAQ</FUNCTION>
+ <FUNCTION>PUSHAW</FUNCTION>
+ <FUNCTION>PUSHL</FUNCTION>
+ <FUNCTION>PUSHR</FUNCTION>
+ <FUNCTION>REI</FUNCTION>
+ <FUNCTION>REMQHI</FUNCTION>
+ <FUNCTION>REMQTI</FUNCTION>
+ <FUNCTION>REMQUE</FUNCTION>
+ <FUNCTION>RET</FUNCTION>
+ <FUNCTION>ROTL</FUNCTION>
+ <FUNCTION>RSB</FUNCTION>
+ <FUNCTION>SBWC</FUNCTION>
+ <FUNCTION>SCANC</FUNCTION>
+ <FUNCTION>SKPC</FUNCTION>
+ <FUNCTION>SOBGEQ</FUNCTION>
+ <FUNCTION>SOBGTR</FUNCTION>
+ <FUNCTION>SPANC</FUNCTION>
+ <FUNCTION>SUBB2</FUNCTION>
+ <FUNCTION>SUBB3</FUNCTION>
+ <FUNCTION>SUBD2</FUNCTION>
+ <FUNCTION>SUBD3</FUNCTION>
+ <FUNCTION>SUBF2</FUNCTION>
+ <FUNCTION>SUBF3</FUNCTION>
+ <FUNCTION>SUBG2</FUNCTION>
+ <FUNCTION>SUBG3</FUNCTION>
+ <FUNCTION>SUBH2</FUNCTION>
+ <FUNCTION>SUBH3</FUNCTION>
+ <FUNCTION>SUBL2</FUNCTION>
+ <FUNCTION>SUBL3</FUNCTION>
+ <FUNCTION>SUBP4</FUNCTION>
+ <FUNCTION>SUBP6</FUNCTION>
+ <FUNCTION>SUBW2</FUNCTION>
+ <FUNCTION>SUBW3</FUNCTION>
+ <FUNCTION>SVPCTX</FUNCTION>
+ <FUNCTION>TSTB</FUNCTION>
+ <FUNCTION>TSTD</FUNCTION>
+ <FUNCTION>TSTF</FUNCTION>
+ <FUNCTION>TSTG</FUNCTION>
+ <FUNCTION>TSTH</FUNCTION>
+ <FUNCTION>TSTL</FUNCTION>
+ <FUNCTION>TSTW</FUNCTION>
+ <FUNCTION>VGATHL</FUNCTION>
+ <FUNCTION>VGATHQ</FUNCTION>
+ <FUNCTION>VLDL</FUNCTION>
+ <FUNCTION>VLDQ</FUNCTION>
+ <FUNCTION>VSADDD</FUNCTION>
+ <FUNCTION>VSADDF</FUNCTION>
+ <FUNCTION>VSADDG</FUNCTION>
+ <FUNCTION>VSADDL</FUNCTION>
+ <FUNCTION>VSBICL</FUNCTION>
+ <FUNCTION>VSBISL</FUNCTION>
+ <FUNCTION>VSCATL</FUNCTION>
+ <FUNCTION>VSCATQ</FUNCTION>
+ <FUNCTION>VSCMPD</FUNCTION>
+ <FUNCTION>VSCMPF</FUNCTION>
+ <FUNCTION>VSCMPG</FUNCTION>
+ <FUNCTION>VSCMPL</FUNCTION>
+ <FUNCTION>VSDIVD</FUNCTION>
+ <FUNCTION>VSDIVF</FUNCTION>
+ <FUNCTION>VSDIVG</FUNCTION>
+ <FUNCTION>VSMERGE</FUNCTION>
+ <FUNCTION>VSMULD</FUNCTION>
+ <FUNCTION>VSMULF</FUNCTION>
+ <FUNCTION>VSMULG</FUNCTION>
+ <FUNCTION>VSMULL</FUNCTION>
+ <FUNCTION>VSSLLL</FUNCTION>
+ <FUNCTION>VSSRLL</FUNCTION>
+ <FUNCTION>VSSUBD</FUNCTION>
+ <FUNCTION>VSSUBF</FUNCTION>
+ <FUNCTION>VSSUBG</FUNCTION>
+ <FUNCTION>VSSUBL</FUNCTION>
+ <FUNCTION>VSTL</FUNCTION>
+ <FUNCTION>VSTQ</FUNCTION>
+ <FUNCTION>VSXORL</FUNCTION>
+ <FUNCTION>VSYNC</FUNCTION>
+ <FUNCTION>VVADDD</FUNCTION>
+ <FUNCTION>VVADDF</FUNCTION>
+ <FUNCTION>VVADDG</FUNCTION>
+ <FUNCTION>VVADDL</FUNCTION>
+ <FUNCTION>VVBICL</FUNCTION>
+ <FUNCTION>VVBISL</FUNCTION>
+ <FUNCTION>VVCMPD</FUNCTION>
+ <FUNCTION>VVCMPF</FUNCTION>
+ <FUNCTION>VVCMPG</FUNCTION>
+ <FUNCTION>VVCMPL</FUNCTION>
+ <FUNCTION>VVCVT</FUNCTION>
+ <FUNCTION>VVDIVD</FUNCTION>
+ <FUNCTION>VVDIVF</FUNCTION>
+ <FUNCTION>VVDIVG</FUNCTION>
+ <FUNCTION>VVMERGE</FUNCTION>
+ <FUNCTION>VVMULD</FUNCTION>
+ <FUNCTION>VVMULF</FUNCTION>
+ <FUNCTION>VVMULG</FUNCTION>
+ <FUNCTION>VVMULL</FUNCTION>
+ <FUNCTION>VVSLLL</FUNCTION>
+ <FUNCTION>VVSRLL</FUNCTION>
+ <FUNCTION>VVSUBD</FUNCTION>
+ <FUNCTION>VVSUBF</FUNCTION>
+ <FUNCTION>VVSUBG</FUNCTION>
+ <FUNCTION>VVSUBL</FUNCTION>
+ <FUNCTION>VVXORL</FUNCTION>
+ <FUNCTION>XFC</FUNCTION>
+ <FUNCTION>XORB2</FUNCTION>
+ <FUNCTION>XORB3</FUNCTION>
+ <FUNCTION>XORL2</FUNCTION>
+ <FUNCTION>XORL3</FUNCTION>
+ <FUNCTION>XORW2</FUNCTION>
+ <FUNCTION>XORW3</FUNCTION>
+ </KEYWORDS>
+ </RULES>
+</MODE>
diff --git a/jEdit/modes/assembly-mcs51.xml b/jEdit/modes/assembly-mcs51.xml
index 113e196..0ecb1df 100644
--- a/jEdit/modes/assembly-mcs51.xml
+++ b/jEdit/modes/assembly-mcs51.xml
@@ -1,237 +1,237 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE MODE SYSTEM "xmode.dtd">
-
-<!--
- MCS51 Assembly mode by Mirco Bova (mirco.bova at libero.it)
-
- - KEIL syntax
--->
-
-<MODE>
-
- <PROPS>
- <PROPERTY NAME="lineComment" VALUE=";" />
- </PROPS>
-
- <RULES HIGHLIGHT_DIGITS="TRUE" IGNORE_CASE="TRUE">
- <EOL_SPAN TYPE="COMMENT1">;</EOL_SPAN>
-
- <SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">
- <BEGIN>'</BEGIN>
- <END>'</END>
- </SPAN>
-
- <SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">
- <BEGIN>"</BEGIN>
- <END>"</END>
- </SPAN>
-
- <!-- NASM: label inside a macro -->
- <MARK_FOLLOWING TYPE="LABEL" MATCH_TYPE="OPERATOR"
- AT_LINE_START="TRUE">%%</MARK_FOLLOWING>
-
- <MARK_FOLLOWING TYPE="KEYWORD2" AT_LINE_START="TRUE">$</MARK_FOLLOWING>
-
- <MARK_PREVIOUS TYPE="LABEL" MATCH_TYPE="OPERATOR"
- AT_LINE_START="TRUE">:</MARK_PREVIOUS>
-
- <SEQ TYPE="NULL">,</SEQ>
- <SEQ TYPE="NULL">:</SEQ>
- <SEQ TYPE="NULL">(</SEQ>
- <SEQ TYPE="NULL">)</SEQ>
- <SEQ TYPE="NULL">]</SEQ>
- <SEQ TYPE="NULL">[</SEQ>
- <SEQ TYPE="NULL">$</SEQ>
-
- <SEQ TYPE="OPERATOR">+</SEQ>
- <SEQ TYPE="OPERATOR">-</SEQ>
- <SEQ TYPE="OPERATOR">/</SEQ>
- <SEQ TYPE="OPERATOR">*</SEQ>
- <SEQ TYPE="OPERATOR">%</SEQ>
-
- <SEQ TYPE="OPERATOR">|</SEQ>
- <SEQ TYPE="OPERATOR">^</SEQ>
- <SEQ TYPE="OPERATOR">&</SEQ>
- <SEQ TYPE="OPERATOR">~</SEQ>
- <SEQ TYPE="OPERATOR">!</SEQ>
-
- <SEQ TYPE="OPERATOR">=</SEQ>
- <SEQ TYPE="OPERATOR"><</SEQ>
- <SEQ TYPE="OPERATOR">></SEQ>
-
- <KEYWORDS>
- <KEYWORD1>MOD</KEYWORD1>
- <KEYWORD1>SHR</KEYWORD1>
- <KEYWORD1>SHL</KEYWORD1>
- <KEYWORD1>NOT</KEYWORD1>
- <KEYWORD1>AND</KEYWORD1>
- <KEYWORD1>OR</KEYWORD1>
- <KEYWORD1>XOR</KEYWORD1>
- <KEYWORD1>HIGH</KEYWORD1>
- <KEYWORD1>LOW</KEYWORD1>
- <KEYWORD1>LT</KEYWORD1>
- <KEYWORD1>LE</KEYWORD1>
- <KEYWORD1>NE</KEYWORD1>
- <KEYWORD1>EQ</KEYWORD1>
- <KEYWORD1>GE</KEYWORD1>
- <KEYWORD1>GT</KEYWORD1>
- <KEYWORD1>DPTR</KEYWORD1>
- <KEYWORD1>PC</KEYWORD1>
- <KEYWORD1>EQU</KEYWORD1>
- <KEYWORD1>SET</KEYWORD1>
- <KEYWORD1>NUMBER</KEYWORD1>
- <KEYWORD1>CSEG</KEYWORD1>
- <KEYWORD1>XSEG</KEYWORD1>
- <KEYWORD1>DSEG</KEYWORD1>
- <KEYWORD1>ISEG</KEYWORD1>
- <KEYWORD1>BSEG</KEYWORD1>
- <KEYWORD1>RSEG</KEYWORD1>
- <KEYWORD1>NUL</KEYWORD1>
- <KEYWORD1>DB</KEYWORD1>
- <KEYWORD1>DW</KEYWORD1>
- <KEYWORD1>DWR</KEYWORD1>
- <KEYWORD1>DS</KEYWORD1>
- <KEYWORD1>DBIT</KEYWORD1>
- <KEYWORD1>ORG</KEYWORD1>
- <KEYWORD1>USING</KEYWORD1>
- <KEYWORD1>END</KEYWORD1>
- <KEYWORD1>NAME</KEYWORD1>
- <KEYWORD1>PUBLIC</KEYWORD1>
- <KEYWORD1>EXTRN</KEYWORD1>
- <KEYWORD1>SEGMENT</KEYWORD1>
- <KEYWORD1>UNIT</KEYWORD1>
- <KEYWORD1>BITADDRESSABLE</KEYWORD1>
- <KEYWORD1>INPAGE</KEYWORD1>
- <KEYWORD1>INBLOCK</KEYWORD1>
- <KEYWORD1>PAGE</KEYWORD1>
- <KEYWORD1>OVERLAYABLE</KEYWORD1>
- <KEYWORD1>AT</KEYWORD1>
- <KEYWORD1>STACKLEN</KEYWORD1>
- <KEYWORD1>SBIT</KEYWORD1>
- <KEYWORD1>SFR</KEYWORD1>
- <KEYWORD1>SFR16</KEYWORD1>
- <KEYWORD1>__ERROR__</KEYWORD1>
- <KEYWORD1>ACALL</KEYWORD1>
- <KEYWORD1>ADD</KEYWORD1>
- <KEYWORD1>ADDC</KEYWORD1>
- <KEYWORD1>AJMP</KEYWORD1>
- <KEYWORD1>ANL</KEYWORD1>
- <KEYWORD1>CALL</KEYWORD1>
- <KEYWORD1>CJNE</KEYWORD1>
- <KEYWORD1>CLR</KEYWORD1>
- <KEYWORD1>CPL</KEYWORD1>
- <KEYWORD1>DA</KEYWORD1>
- <KEYWORD1>DEC</KEYWORD1>
- <KEYWORD1>DIV</KEYWORD1>
- <KEYWORD1>DJNZ</KEYWORD1>
- <KEYWORD1>INC</KEYWORD1>
- <KEYWORD1>JB</KEYWORD1>
- <KEYWORD1>JBC</KEYWORD1>
- <KEYWORD1>JC</KEYWORD1>
- <KEYWORD1>JMP</KEYWORD1>
- <KEYWORD1>JNB</KEYWORD1>
- <KEYWORD1>JNC</KEYWORD1>
- <KEYWORD1>JNZ</KEYWORD1>
- <KEYWORD1>JZ</KEYWORD1>
- <KEYWORD1>LCALL</KEYWORD1>
- <KEYWORD1>LJMP</KEYWORD1>
- <KEYWORD1>MOV</KEYWORD1>
- <KEYWORD1>MOVC</KEYWORD1>
- <KEYWORD1>MOVX</KEYWORD1>
- <KEYWORD1>MUL</KEYWORD1>
- <KEYWORD1>NOP</KEYWORD1>
- <KEYWORD1>ORL</KEYWORD1>
- <KEYWORD1>POP</KEYWORD1>
- <KEYWORD1>PUSH</KEYWORD1>
- <KEYWORD1>RET</KEYWORD1>
- <KEYWORD1>RETI</KEYWORD1>
- <KEYWORD1>RL</KEYWORD1>
- <KEYWORD1>RLC</KEYWORD1>
- <KEYWORD1>RR</KEYWORD1>
- <KEYWORD1>RRC</KEYWORD1>
- <KEYWORD1>SETB</KEYWORD1>
- <KEYWORD1>SJMP</KEYWORD1>
- <KEYWORD1>SUBB</KEYWORD1>
- <KEYWORD1>SWAP</KEYWORD1>
- <KEYWORD1>XCH</KEYWORD1>
- <KEYWORD1>XCHD</KEYWORD1>
- <KEYWORD1>XRL</KEYWORD1>
- <KEYWORD1>IF</KEYWORD1>
- <KEYWORD1>ELSEIF</KEYWORD1>
- <KEYWORD1>ELSE</KEYWORD1>
- <KEYWORD1>ENDIF</KEYWORD1>
- <KEYWORD1>MACRO</KEYWORD1>
- <KEYWORD1>REPT</KEYWORD1>
- <KEYWORD1>IRP</KEYWORD1>
- <KEYWORD1>IRPC</KEYWORD1>
- <KEYWORD1>ENDM</KEYWORD1>
- <KEYWORD1>EXITM</KEYWORD1>
- <KEYWORD1>LOCAL</KEYWORD1>
- <KEYWORD1>DPTX</KEYWORD1>
- <KEYWORD1>DPTN</KEYWORD1>
- <KEYWORD1>DPTR8</KEYWORD1>
- <KEYWORD1>DPTR16</KEYWORD1>
- <KEYWORD1>WR0</KEYWORD1>
- <KEYWORD1>WR2</KEYWORD1>
- <KEYWORD1>WR4</KEYWORD1>
- <KEYWORD1>WR6</KEYWORD1>
- <KEYWORD1>DR0</KEYWORD1>
- <KEYWORD1>DR4</KEYWORD1>
- <KEYWORD1>RJC</KEYWORD1>
- <KEYWORD1>RJNC</KEYWORD1>
- <KEYWORD1>RJZ</KEYWORD1>
- <KEYWORD1>RJNZ</KEYWORD1>
- <KEYWORD1>JMPI</KEYWORD1>
- <KEYWORD1>MOVB</KEYWORD1>
- <KEYWORD1>PUSHA</KEYWORD1>
- <KEYWORD1>POPA</KEYWORD1>
- <KEYWORD1>SUB</KEYWORD1>
- <KEYWORD1>ADDM</KEYWORD1>
- <KEYWORD1>SUBM</KEYWORD1>
- <KEYWORD1>SLEEP</KEYWORD1>
- <KEYWORD1>SYNC</KEYWORD1>
- <KEYWORD1>DEFINE</KEYWORD1>
- <KEYWORD1>SUBSTR</KEYWORD1>
- <KEYWORD1>THEN</KEYWORD1>
- <KEYWORD1>LEN</KEYWORD1>
- <KEYWORD1>EQS</KEYWORD1>
- <KEYWORD1>IF</KEYWORD1>
- <KEYWORD1>FI</KEYWORD1>
-
- <KEYWORD2>$IF</KEYWORD2>
- <KEYWORD2>$ELSEIF</KEYWORD2>
- <KEYWORD2>$ELSE</KEYWORD2>
- <KEYWORD2>$ENDIF</KEYWORD2>
- <KEYWORD2>$MOD167</KEYWORD2>
- <KEYWORD2>$CASE</KEYWORD2>
- <KEYWORD2>$SEGMENTED</KEYWORD2>
- <KEYWORD2>$INCLUDE</KEYWORD2>
-
- <!-- memory types -->
- <KEYWORD2>CODE</KEYWORD2>
- <KEYWORD2>XDATA</KEYWORD2>
- <KEYWORD2>DATA</KEYWORD2>
- <KEYWORD2>IDATA</KEYWORD2>
- <KEYWORD2>BIT</KEYWORD2>
-
- <!-- Registers -->
- <KEYWORD3>R0</KEYWORD3>
- <KEYWORD3>R1</KEYWORD3>
- <KEYWORD3>R2</KEYWORD3>
- <KEYWORD3>R3</KEYWORD3>
- <KEYWORD3>R4</KEYWORD3>
- <KEYWORD3>R5</KEYWORD3>
- <KEYWORD3>R6</KEYWORD3>
- <KEYWORD3>R7</KEYWORD3>
-
- <KEYWORD3>SP</KEYWORD3>
- <KEYWORD3>A</KEYWORD3>
- <KEYWORD3>C</KEYWORD3>
- <KEYWORD3>AB</KEYWORD3>
-
- <!-- Instructions -->
-
- </KEYWORDS>
- </RULES>
-</MODE>
+<?xml version="1.0"?>
+
+<!DOCTYPE MODE SYSTEM "xmode.dtd">
+
+<!--
+ MCS51 Assembly mode by Mirco Bova (mirco.bova at libero.it)
+
+ - KEIL syntax
+-->
+
+<MODE>
+
+ <PROPS>
+ <PROPERTY NAME="lineComment" VALUE=";" />
+ </PROPS>
+
+ <RULES HIGHLIGHT_DIGITS="TRUE" IGNORE_CASE="TRUE">
+ <EOL_SPAN TYPE="COMMENT1">;</EOL_SPAN>
+
+ <SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">
+ <BEGIN>'</BEGIN>
+ <END>'</END>
+ </SPAN>
+
+ <SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">
+ <BEGIN>"</BEGIN>
+ <END>"</END>
+ </SPAN>
+
+ <!-- NASM: label inside a macro -->
+ <MARK_FOLLOWING TYPE="LABEL" MATCH_TYPE="OPERATOR"
+ AT_LINE_START="TRUE">%%</MARK_FOLLOWING>
+
+ <MARK_FOLLOWING TYPE="KEYWORD2" AT_LINE_START="TRUE">$</MARK_FOLLOWING>
+
+ <MARK_PREVIOUS TYPE="LABEL" MATCH_TYPE="OPERATOR"
+ AT_LINE_START="TRUE">:</MARK_PREVIOUS>
+
+ <SEQ TYPE="NULL">,</SEQ>
+ <SEQ TYPE="NULL">:</SEQ>
+ <SEQ TYPE="NULL">(</SEQ>
+ <SEQ TYPE="NULL">)</SEQ>
+ <SEQ TYPE="NULL">]</SEQ>
+ <SEQ TYPE="NULL">[</SEQ>
+ <SEQ TYPE="NULL">$</SEQ>
+
+ <SEQ TYPE="OPERATOR">+</SEQ>
+ <SEQ TYPE="OPERATOR">-</SEQ>
+ <SEQ TYPE="OPERATOR">/</SEQ>
+ <SEQ TYPE="OPERATOR">*</SEQ>
+ <SEQ TYPE="OPERATOR">%</SEQ>
+
+ <SEQ TYPE="OPERATOR">|</SEQ>
+ <SEQ TYPE="OPERATOR">^</SEQ>
+ <SEQ TYPE="OPERATOR">&</SEQ>
+ <SEQ TYPE="OPERATOR">~</SEQ>
+ <SEQ TYPE="OPERATOR">!</SEQ>
+
+ <SEQ TYPE="OPERATOR">=</SEQ>
+ <SEQ TYPE="OPERATOR"><</SEQ>
+ <SEQ TYPE="OPERATOR">></SEQ>
+
+ <KEYWORDS>
+ <KEYWORD1>MOD</KEYWORD1>
+ <KEYWORD1>SHR</KEYWORD1>
+ <KEYWORD1>SHL</KEYWORD1>
+ <KEYWORD1>NOT</KEYWORD1>
+ <KEYWORD1>AND</KEYWORD1>
+ <KEYWORD1>OR</KEYWORD1>
+ <KEYWORD1>XOR</KEYWORD1>
+ <KEYWORD1>HIGH</KEYWORD1>
+ <KEYWORD1>LOW</KEYWORD1>
+ <KEYWORD1>LT</KEYWORD1>
+ <KEYWORD1>LE</KEYWORD1>
+ <KEYWORD1>NE</KEYWORD1>
+ <KEYWORD1>EQ</KEYWORD1>
+ <KEYWORD1>GE</KEYWORD1>
+ <KEYWORD1>GT</KEYWORD1>
+ <KEYWORD1>DPTR</KEYWORD1>
+ <KEYWORD1>PC</KEYWORD1>
+ <KEYWORD1>EQU</KEYWORD1>
+ <KEYWORD1>SET</KEYWORD1>
+ <KEYWORD1>NUMBER</KEYWORD1>
+ <KEYWORD1>CSEG</KEYWORD1>
+ <KEYWORD1>XSEG</KEYWORD1>
+ <KEYWORD1>DSEG</KEYWORD1>
+ <KEYWORD1>ISEG</KEYWORD1>
+ <KEYWORD1>BSEG</KEYWORD1>
+ <KEYWORD1>RSEG</KEYWORD1>
+ <KEYWORD1>NUL</KEYWORD1>
+ <KEYWORD1>DB</KEYWORD1>
+ <KEYWORD1>DW</KEYWORD1>
+ <KEYWORD1>DWR</KEYWORD1>
+ <KEYWORD1>DS</KEYWORD1>
+ <KEYWORD1>DBIT</KEYWORD1>
+ <KEYWORD1>ORG</KEYWORD1>
+ <KEYWORD1>USING</KEYWORD1>
+ <KEYWORD1>END</KEYWORD1>
+ <KEYWORD1>NAME</KEYWORD1>
+ <KEYWORD1>PUBLIC</KEYWORD1>
+ <KEYWORD1>EXTRN</KEYWORD1>
+ <KEYWORD1>SEGMENT</KEYWORD1>
+ <KEYWORD1>UNIT</KEYWORD1>
+ <KEYWORD1>BITADDRESSABLE</KEYWORD1>
+ <KEYWORD1>INPAGE</KEYWORD1>
+ <KEYWORD1>INBLOCK</KEYWORD1>
+ <KEYWORD1>PAGE</KEYWORD1>
+ <KEYWORD1>OVERLAYABLE</KEYWORD1>
+ <KEYWORD1>AT</KEYWORD1>
+ <KEYWORD1>STACKLEN</KEYWORD1>
+ <KEYWORD1>SBIT</KEYWORD1>
+ <KEYWORD1>SFR</KEYWORD1>
+ <KEYWORD1>SFR16</KEYWORD1>
+ <KEYWORD1>__ERROR__</KEYWORD1>
+ <KEYWORD1>ACALL</KEYWORD1>
+ <KEYWORD1>ADD</KEYWORD1>
+ <KEYWORD1>ADDC</KEYWORD1>
+ <KEYWORD1>AJMP</KEYWORD1>
+ <KEYWORD1>ANL</KEYWORD1>
+ <KEYWORD1>CALL</KEYWORD1>
+ <KEYWORD1>CJNE</KEYWORD1>
+ <KEYWORD1>CLR</KEYWORD1>
+ <KEYWORD1>CPL</KEYWORD1>
+ <KEYWORD1>DA</KEYWORD1>
+ <KEYWORD1>DEC</KEYWORD1>
+ <KEYWORD1>DIV</KEYWORD1>
+ <KEYWORD1>DJNZ</KEYWORD1>
+ <KEYWORD1>INC</KEYWORD1>
+ <KEYWORD1>JB</KEYWORD1>
+ <KEYWORD1>JBC</KEYWORD1>
+ <KEYWORD1>JC</KEYWORD1>
+ <KEYWORD1>JMP</KEYWORD1>
+ <KEYWORD1>JNB</KEYWORD1>
+ <KEYWORD1>JNC</KEYWORD1>
+ <KEYWORD1>JNZ</KEYWORD1>
+ <KEYWORD1>JZ</KEYWORD1>
+ <KEYWORD1>LCALL</KEYWORD1>
+ <KEYWORD1>LJMP</KEYWORD1>
+ <KEYWORD1>MOV</KEYWORD1>
+ <KEYWORD1>MOVC</KEYWORD1>
+ <KEYWORD1>MOVX</KEYWORD1>
+ <KEYWORD1>MUL</KEYWORD1>
+ <KEYWORD1>NOP</KEYWORD1>
+ <KEYWORD1>ORL</KEYWORD1>
+ <KEYWORD1>POP</KEYWORD1>
+ <KEYWORD1>PUSH</KEYWORD1>
+ <KEYWORD1>RET</KEYWORD1>
+ <KEYWORD1>RETI</KEYWORD1>
+ <KEYWORD1>RL</KEYWORD1>
+ <KEYWORD1>RLC</KEYWORD1>
+ <KEYWORD1>RR</KEYWORD1>
+ <KEYWORD1>RRC</KEYWORD1>
+ <KEYWORD1>SETB</KEYWORD1>
+ <KEYWORD1>SJMP</KEYWORD1>
+ <KEYWORD1>SUBB</KEYWORD1>
+ <KEYWORD1>SWAP</KEYWORD1>
+ <KEYWORD1>XCH</KEYWORD1>
+ <KEYWORD1>XCHD</KEYWORD1>
+ <KEYWORD1>XRL</KEYWORD1>
+ <KEYWORD1>IF</KEYWORD1>
+ <KEYWORD1>ELSEIF</KEYWORD1>
+ <KEYWORD1>ELSE</KEYWORD1>
+ <KEYWORD1>ENDIF</KEYWORD1>
+ <KEYWORD1>MACRO</KEYWORD1>
+ <KEYWORD1>REPT</KEYWORD1>
+ <KEYWORD1>IRP</KEYWORD1>
+ <KEYWORD1>IRPC</KEYWORD1>
+ <KEYWORD1>ENDM</KEYWORD1>
+ <KEYWORD1>EXITM</KEYWORD1>
+ <KEYWORD1>LOCAL</KEYWORD1>
+ <KEYWORD1>DPTX</KEYWORD1>
+ <KEYWORD1>DPTN</KEYWORD1>
+ <KEYWORD1>DPTR8</KEYWORD1>
+ <KEYWORD1>DPTR16</KEYWORD1>
+ <KEYWORD1>WR0</KEYWORD1>
+ <KEYWORD1>WR2</KEYWORD1>
+ <KEYWORD1>WR4</KEYWORD1>
+ <KEYWORD1>WR6</KEYWORD1>
+ <KEYWORD1>DR0</KEYWORD1>
+ <KEYWORD1>DR4</KEYWORD1>
+ <KEYWORD1>RJC</KEYWORD1>
+ <KEYWORD1>RJNC</KEYWORD1>
+ <KEYWORD1>RJZ</KEYWORD1>
+ <KEYWORD1>RJNZ</KEYWORD1>
+ <KEYWORD1>JMPI</KEYWORD1>
+ <KEYWORD1>MOVB</KEYWORD1>
+ <KEYWORD1>PUSHA</KEYWORD1>
+ <KEYWORD1>POPA</KEYWORD1>
+ <KEYWORD1>SUB</KEYWORD1>
+ <KEYWORD1>ADDM</KEYWORD1>
+ <KEYWORD1>SUBM</KEYWORD1>
+ <KEYWORD1>SLEEP</KEYWORD1>
+ <KEYWORD1>SYNC</KEYWORD1>
+ <KEYWORD1>DEFINE</KEYWORD1>
+ <KEYWORD1>SUBSTR</KEYWORD1>
+ <KEYWORD1>THEN</KEYWORD1>
+ <KEYWORD1>LEN</KEYWORD1>
+ <KEYWORD1>EQS</KEYWORD1>
+ <KEYWORD1>IF</KEYWORD1>
+ <KEYWORD1>FI</KEYWORD1>
+
+ <KEYWORD2>$IF</KEYWORD2>
+ <KEYWORD2>$ELSEIF</KEYWORD2>
+ <KEYWORD2>$ELSE</KEYWORD2>
+ <KEYWORD2>$ENDIF</KEYWORD2>
+ <KEYWORD2>$MOD167</KEYWORD2>
+ <KEYWORD2>$CASE</KEYWORD2>
+ <KEYWORD2>$SEGMENTED</KEYWORD2>
+ <KEYWORD2>$INCLUDE</KEYWORD2>
+
+ <!-- memory types -->
+ <KEYWORD2>CODE</KEYWORD2>
+ <KEYWORD2>XDATA</KEYWORD2>
+ <KEYWORD2>DATA</KEYWORD2>
+ <KEYWORD2>IDATA</KEYWORD2>
+ <KEYWORD2>BIT</KEYWORD2>
+
+ <!-- Registers -->
+ <KEYWORD3>R0</KEYWORD3>
+ <KEYWORD3>R1</KEYWORD3>
+ <KEYWORD3>R2</KEYWORD3>
+ <KEYWORD3>R3</KEYWORD3>
+ <KEYWORD3>R4</KEYWORD3>
+ <KEYWORD3>R5</KEYWORD3>
+ <KEYWORD3>R6</KEYWORD3>
+ <KEYWORD3>R7</KEYWORD3>
+
+ <KEYWORD3>SP</KEYWORD3>
+ <KEYWORD3>A</KEYWORD3>
+ <KEYWORD3>C</KEYWORD3>
+ <KEYWORD3>AB</KEYWORD3>
+
+ <!-- Instructions -->
+
+ </KEYWORDS>
+ </RULES>
+</MODE>
diff --git a/jEdit/modes/assembly-parrot.xml b/jEdit/modes/assembly-parrot.xml
index 212e182..0e6cd75 100644
--- a/jEdit/modes/assembly-parrot.xml
+++ b/jEdit/modes/assembly-parrot.xml
@@ -1,138 +1,138 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE MODE SYSTEM "xmode.dtd">
-
-<MODE>
- <PROPS>
- <PROPERTY NAME="lineComment" VALUE="#" />
- </PROPS>
- <RULES IGNORE_CASE="FALSE"
- HIGHLIGHT_DIGITS="TRUE"
- DIGIT_RE="(0x[\p{XDigit}]+|[\p{Digit}]+)"
- >
-
- <SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">
- <BEGIN>"</BEGIN>
- <END>"</END>
- </SPAN>
-
- <EOL_SPAN TYPE="COMMENT1">#</EOL_SPAN>
-
- <MARK_PREVIOUS TYPE="LABEL" MATCH_TYPE="OPERATOR"
- AT_LINE_START="TRUE">:</MARK_PREVIOUS>
-
- <SEQ TYPE="OPERATOR">,</SEQ>
-
- <SEQ_REGEXP TYPE="LITERAL2"
- HASH_CHARS="ISNP"
- AT_WORD_START="TRUE"
- >[ISNP]\d{1,2}</SEQ_REGEXP>
-
- <KEYWORDS>
- <KEYWORD1>abs</KEYWORD1>
- <KEYWORD1>acos</KEYWORD1>
- <KEYWORD1>add</KEYWORD1>
- <KEYWORD1>and</KEYWORD1>
- <KEYWORD1>asec</KEYWORD1>
- <KEYWORD1>asin</KEYWORD1>
- <KEYWORD1>atan</KEYWORD1>
- <KEYWORD1>bounds</KEYWORD1>
- <KEYWORD1>branch</KEYWORD1>
- <KEYWORD1>bsr</KEYWORD1>
- <KEYWORD1>chopm</KEYWORD1>
- <KEYWORD1>cleari</KEYWORD1>
- <KEYWORD1>clearn</KEYWORD1>
- <KEYWORD1>clearp</KEYWORD1>
- <KEYWORD1>clears</KEYWORD1>
- <KEYWORD1>clone</KEYWORD1>
- <KEYWORD1>close</KEYWORD1>
- <KEYWORD1>cmod</KEYWORD1>
- <KEYWORD1>concat</KEYWORD1>
- <KEYWORD1>cos</KEYWORD1>
- <KEYWORD1>cosh</KEYWORD1>
- <KEYWORD1>debug</KEYWORD1>
- <KEYWORD1>dec</KEYWORD1>
- <KEYWORD1>div</KEYWORD1>
- <KEYWORD1>end</KEYWORD1>
- <KEYWORD1>entrytype</KEYWORD1>
- <KEYWORD1>eq</KEYWORD1>
- <KEYWORD1>err</KEYWORD1>
- <KEYWORD1>exp</KEYWORD1>
- <KEYWORD1>find_global</KEYWORD1>
- <KEYWORD1>find_type</KEYWORD1>
- <KEYWORD1>ge</KEYWORD1>
- <KEYWORD1>getfile</KEYWORD1>
- <KEYWORD1>getline</KEYWORD1>
- <KEYWORD1>getpackage</KEYWORD1>
- <KEYWORD1>gt</KEYWORD1>
- <KEYWORD1>if</KEYWORD1>
- <KEYWORD1>inc</KEYWORD1>
- <KEYWORD1>index</KEYWORD1>
- <KEYWORD1>jsr</KEYWORD1>
- <KEYWORD1>jump</KEYWORD1>
- <KEYWORD1>le</KEYWORD1>
- <KEYWORD1>length</KEYWORD1>
- <KEYWORD1>ln</KEYWORD1>
- <KEYWORD1>log2</KEYWORD1>
- <KEYWORD1>log10</KEYWORD1>
- <KEYWORD1>lt</KEYWORD1>
- <KEYWORD1>mod</KEYWORD1>
- <KEYWORD1>mul</KEYWORD1>
- <KEYWORD1>ne</KEYWORD1>
- <KEYWORD1>new</KEYWORD1>
- <KEYWORD1>newinterp</KEYWORD1>
- <KEYWORD1>noop</KEYWORD1>
- <KEYWORD1>not</KEYWORD1>
- <KEYWORD1>not</KEYWORD1>
- <KEYWORD1>open</KEYWORD1>
- <KEYWORD1>or</KEYWORD1>
- <KEYWORD1>ord</KEYWORD1>
- <KEYWORD1>pack</KEYWORD1>
- <KEYWORD1>pop</KEYWORD1>
- <KEYWORD1>popi</KEYWORD1>
- <KEYWORD1>popn</KEYWORD1>
- <KEYWORD1>popp</KEYWORD1>
- <KEYWORD1>pops</KEYWORD1>
- <KEYWORD1>pow</KEYWORD1>
- <KEYWORD1>print</KEYWORD1>
- <KEYWORD1>profile</KEYWORD1>
- <KEYWORD1>push</KEYWORD1>
- <KEYWORD1>pushi</KEYWORD1>
- <KEYWORD1>pushn</KEYWORD1>
- <KEYWORD1>pushp</KEYWORD1>
- <KEYWORD1>pushs</KEYWORD1>
- <KEYWORD1>read</KEYWORD1>
- <KEYWORD1>readline</KEYWORD1>
- <KEYWORD1>repeat</KEYWORD1>
- <KEYWORD1>restore</KEYWORD1>
- <KEYWORD1>ret</KEYWORD1>
- <KEYWORD1>rotate_up</KEYWORD1>
- <KEYWORD1>runinterp</KEYWORD1>
- <KEYWORD1>save</KEYWORD1>
- <KEYWORD1>sec</KEYWORD1>
- <KEYWORD1>sech</KEYWORD1>
- <KEYWORD1>set</KEYWORD1>
- <KEYWORD1>set_keyed</KEYWORD1>
- <KEYWORD1>setfile</KEYWORD1>
- <KEYWORD1>setline</KEYWORD1>
- <KEYWORD1>setpackage</KEYWORD1>
- <KEYWORD1>shl</KEYWORD1>
- <KEYWORD1>shr</KEYWORD1>
- <KEYWORD1>sin</KEYWORD1>
- <KEYWORD1>sinh</KEYWORD1>
- <KEYWORD1>sleep</KEYWORD1>
- <KEYWORD1>sub</KEYWORD1>
- <KEYWORD1>substr</KEYWORD1>
- <KEYWORD1>tan</KEYWORD1>
- <KEYWORD1>tanh</KEYWORD1>
- <KEYWORD1>time</KEYWORD1>
- <KEYWORD1>trace</KEYWORD1>
- <KEYWORD1>typeof</KEYWORD1>
- <KEYWORD1>unless</KEYWORD1>
- <KEYWORD1>warningsoff</KEYWORD1>
- <KEYWORD1>warningson</KEYWORD1>
- <KEYWORD1>write</KEYWORD1>
- <KEYWORD1>xor</KEYWORD1>
- </KEYWORDS>
- </RULES>
-</MODE>
+<?xml version="1.0"?>
+
+<!DOCTYPE MODE SYSTEM "xmode.dtd">
+
+<MODE>
+ <PROPS>
+ <PROPERTY NAME="lineComment" VALUE="#" />
+ </PROPS>
+ <RULES IGNORE_CASE="FALSE"
+ HIGHLIGHT_DIGITS="TRUE"
+ DIGIT_RE="(0x[\p{XDigit}]+|[\p{Digit}]+)"
+ >
+
+ <SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">
+ <BEGIN>"</BEGIN>
+ <END>"</END>
+ </SPAN>
+
+ <EOL_SPAN TYPE="COMMENT1">#</EOL_SPAN>
+
+ <MARK_PREVIOUS TYPE="LABEL" MATCH_TYPE="OPERATOR"
+ AT_LINE_START="TRUE">:</MARK_PREVIOUS>
+
+ <SEQ TYPE="OPERATOR">,</SEQ>
+
+ <SEQ_REGEXP TYPE="LITERAL2"
+ HASH_CHARS="ISNP"
+ AT_WORD_START="TRUE"
+ >[ISNP]\d{1,2}</SEQ_REGEXP>
+
+ <KEYWORDS>
+ <KEYWORD1>abs</KEYWORD1>
+ <KEYWORD1>acos</KEYWORD1>
+ <KEYWORD1>add</KEYWORD1>
+ <KEYWORD1>and</KEYWORD1>
+ <KEYWORD1>asec</KEYWORD1>
+ <KEYWORD1>asin</KEYWORD1>
+ <KEYWORD1>atan</KEYWORD1>
+ <KEYWORD1>bounds</KEYWORD1>
+ <KEYWORD1>branch</KEYWORD1>
+ <KEYWORD1>bsr</KEYWORD1>
+ <KEYWORD1>chopm</KEYWORD1>
+ <KEYWORD1>cleari</KEYWORD1>
+ <KEYWORD1>clearn</KEYWORD1>
+ <KEYWORD1>clearp</KEYWORD1>
+ <KEYWORD1>clears</KEYWORD1>
+ <KEYWORD1>clone</KEYWORD1>
+ <KEYWORD1>close</KEYWORD1>
+ <KEYWORD1>cmod</KEYWORD1>
+ <KEYWORD1>concat</KEYWORD1>
+ <KEYWORD1>cos</KEYWORD1>
+ <KEYWORD1>cosh</KEYWORD1>
+ <KEYWORD1>debug</KEYWORD1>
+ <KEYWORD1>dec</KEYWORD1>
+ <KEYWORD1>div</KEYWORD1>
+ <KEYWORD1>end</KEYWORD1>
+ <KEYWORD1>entrytype</KEYWORD1>
+ <KEYWORD1>eq</KEYWORD1>
+ <KEYWORD1>err</KEYWORD1>
+ <KEYWORD1>exp</KEYWORD1>
+ <KEYWORD1>find_global</KEYWORD1>
+ <KEYWORD1>find_type</KEYWORD1>
+ <KEYWORD1>ge</KEYWORD1>
+ <KEYWORD1>getfile</KEYWORD1>
+ <KEYWORD1>getline</KEYWORD1>
+ <KEYWORD1>getpackage</KEYWORD1>
+ <KEYWORD1>gt</KEYWORD1>
+ <KEYWORD1>if</KEYWORD1>
+ <KEYWORD1>inc</KEYWORD1>
+ <KEYWORD1>index</KEYWORD1>
+ <KEYWORD1>jsr</KEYWORD1>
+ <KEYWORD1>jump</KEYWORD1>
+ <KEYWORD1>le</KEYWORD1>
+ <KEYWORD1>length</KEYWORD1>
+ <KEYWORD1>ln</KEYWORD1>
+ <KEYWORD1>log2</KEYWORD1>
+ <KEYWORD1>log10</KEYWORD1>
+ <KEYWORD1>lt</KEYWORD1>
+ <KEYWORD1>mod</KEYWORD1>
+ <KEYWORD1>mul</KEYWORD1>
+ <KEYWORD1>ne</KEYWORD1>
+ <KEYWORD1>new</KEYWORD1>
+ <KEYWORD1>newinterp</KEYWORD1>
+ <KEYWORD1>noop</KEYWORD1>
+ <KEYWORD1>not</KEYWORD1>
+ <KEYWORD1>not</KEYWORD1>
+ <KEYWORD1>open</KEYWORD1>
+ <KEYWORD1>or</KEYWORD1>
+ <KEYWORD1>ord</KEYWORD1>
+ <KEYWORD1>pack</KEYWORD1>
+ <KEYWORD1>pop</KEYWORD1>
+ <KEYWORD1>popi</KEYWORD1>
+ <KEYWORD1>popn</KEYWORD1>
+ <KEYWORD1>popp</KEYWORD1>
+ <KEYWORD1>pops</KEYWORD1>
+ <KEYWORD1>pow</KEYWORD1>
+ <KEYWORD1>print</KEYWORD1>
+ <KEYWORD1>profile</KEYWORD1>
+ <KEYWORD1>push</KEYWORD1>
+ <KEYWORD1>pushi</KEYWORD1>
+ <KEYWORD1>pushn</KEYWORD1>
+ <KEYWORD1>pushp</KEYWORD1>
+ <KEYWORD1>pushs</KEYWORD1>
+ <KEYWORD1>read</KEYWORD1>
+ <KEYWORD1>readline</KEYWORD1>
+ <KEYWORD1>repeat</KEYWORD1>
+ <KEYWORD1>restore</KEYWORD1>
+ <KEYWORD1>ret</KEYWORD1>
+ <KEYWORD1>rotate_up</KEYWORD1>
+ <KEYWORD1>runinterp</KEYWORD1>
+ <KEYWORD1>save</KEYWORD1>
+ <KEYWORD1>sec</KEYWORD1>
+ <KEYWORD1>sech</KEYWORD1>
+ <KEYWORD1>set</KEYWORD1>
+ <KEYWORD1>set_keyed</KEYWORD1>
+ <KEYWORD1>setfile</KEYWORD1>
+ <KEYWORD1>setline</KEYWORD1>
+ <KEYWORD1>setpackage</KEYWORD1>
+ <KEYWORD1>shl</KEYWORD1>
+ <KEYWORD1>shr</KEYWORD1>
+ <KEYWORD1>sin</KEYWORD1>
+ <KEYWORD1>sinh</KEYWORD1>
+ <KEYWORD1>sleep</KEYWORD1>
+ <KEYWORD1>sub</KEYWORD1>
+ <KEYWORD1>substr</KEYWORD1>
+ <KEYWORD1>tan</KEYWORD1>
+ <KEYWORD1>tanh</KEYWORD1>
+ <KEYWORD1>time</KEYWORD1>
+ <KEYWORD1>trace</KEYWORD1>
+ <KEYWORD1>typeof</KEYWORD1>
+ <KEYWORD1>unless</KEYWORD1>
+ <KEYWORD1>warningsoff</KEYWORD1>
+ <KEYWORD1>warningson</KEYWORD1>
+ <KEYWORD1>write</KEYWORD1>
+ <KEYWORD1>xor</KEYWORD1>
+ </KEYWORDS>
+ </RULES>
+</MODE>
diff --git a/jEdit/modes/assembly-r2000.xml b/jEdit/modes/assembly-r2000.xml
index 89d0aa9..084dc2d 100644
--- a/jEdit/modes/assembly-r2000.xml
+++ b/jEdit/modes/assembly-r2000.xml
@@ -1,259 +1,259 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE MODE SYSTEM "xmode.dtd">
-
-<!-- MIPS/SPIM Assembly Mode from
- Marc Rummel marc.rummel at stud.uni-karlsruhe.de
- SIPM Homepage: http://www.cs.wisc.edu/~larus/spim.html
--->
-
-<MODE>
-
- <PROPS>
- <PROPERTY NAME="blockComment" VALUE="#" />
- <PROPERTY NAME="wordBreakChars" VALUE=",()" />
- </PROPS>
-
- <RULES HIGHLIGHT_DIGITS="TRUE" IGNORE_CASE="TRUE">
- <!-- Comment -->
- <EOL_SPAN TYPE="COMMENT1">#</EOL_SPAN>
-
- <!-- Strings -->
- <SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">
- <BEGIN>'</BEGIN>
- <END>'</END>
- </SPAN>
-
- <SPAN TYPE="LITERAL1" ESCAPE="\" NO_LINE_BREAK="TRUE">
- <BEGIN>"</BEGIN>
- <END>"</END>
- </SPAN>
-
- <!-- Labels -->
- <MARK_PREVIOUS TYPE="LABEL" AT_LINE_START="TRUE">:</MARK_PREVIOUS>
-
- <!-- Assembler directives -->
- <KEYWORDS>
- <KEYWORD1>.align</KEYWORD1>
- <KEYWORD1>.ascii</KEYWORD1>
- <KEYWORD1>.asciiz</KEYWORD1>
- <KEYWORD1>.byte</KEYWORD1>
- <KEYWORD1>.data</KEYWORD1>
- <KEYWORD1>.double</KEYWORD1>
- <KEYWORD1>.extern</KEYWORD1>
- <KEYWORD1>.float</KEYWORD1>
- <KEYWORD1>.globl</KEYWORD1>
- <KEYWORD1>.half</KEYWORD1>
- <KEYWORD1>.kdata</KEYWORD1>
- <KEYWORD1>.ktext</KEYWORD1>
- <KEYWORD1>.space</KEYWORD1>
- <KEYWORD1>.text</KEYWORD1>
- <KEYWORD1>.word</KEYWORD1>
-
- <!-- MIPS/SPIM Operations -->
- <FUNCTION>add</FUNCTION>
- <FUNCTION>addi</FUNCTION>
- <FUNCTION>addu</FUNCTION>
- <FUNCTION>addiu</FUNCTION>
- <FUNCTION>and</FUNCTION>
- <FUNCTION>andi</FUNCTION>
- <FUNCTION>div</FUNCTION>
- <FUNCTION>divu</FUNCTION>
- <FUNCTION>mul</FUNCTION>
- <FUNCTION>mulo</FUNCTION>
- <FUNCTION>mulou</FUNCTION>
- <FUNCTION>mult</FUNCTION>
- <FUNCTION>multu</FUNCTION>
- <FUNCTION>neg</FUNCTION>
- <FUNCTION>negu</FUNCTION>
- <FUNCTION>nor</FUNCTION>
- <FUNCTION>not</FUNCTION>
- <FUNCTION>or</FUNCTION>
- <FUNCTION>ori</FUNCTION>
- <FUNCTION>rem</FUNCTION>
- <FUNCTION>remu</FUNCTION>
- <FUNCTION>rol</FUNCTION>
- <FUNCTION>ror</FUNCTION>
- <FUNCTION>sll</FUNCTION>
- <FUNCTION>sllv</FUNCTION>
- <FUNCTION>sra</FUNCTION>
- <FUNCTION>srav</FUNCTION>
- <FUNCTION>srl</FUNCTION>
- <FUNCTION>srlv</FUNCTION>
- <FUNCTION>sub</FUNCTION>
- <FUNCTION>subu</FUNCTION>
- <FUNCTION>xor</FUNCTION>
- <FUNCTION>xori</FUNCTION>
- <FUNCTION>li</FUNCTION>
- <FUNCTION>lui</FUNCTION>
- <FUNCTION>seq</FUNCTION>
- <FUNCTION>sge</FUNCTION>
- <FUNCTION>sgt</FUNCTION>
- <FUNCTION>sgtu</FUNCTION>
- <FUNCTION>sle</FUNCTION>
- <FUNCTION>sleu</FUNCTION>
- <FUNCTION>slt</FUNCTION>
- <FUNCTION>slti</FUNCTION>
- <FUNCTION>sltu</FUNCTION>
- <FUNCTION>sltiu</FUNCTION>
- <FUNCTION>sne</FUNCTION>
- <FUNCTION>b</FUNCTION>
- <FUNCTION>bczt</FUNCTION>
- <FUNCTION>bczf</FUNCTION>
- <FUNCTION>beq</FUNCTION>
- <FUNCTION>beqz</FUNCTION>
- <FUNCTION>bge</FUNCTION>
- <FUNCTION>bgeu</FUNCTION>
- <FUNCTION>bgez</FUNCTION>
- <FUNCTION>bgezal</FUNCTION>
- <FUNCTION>bgt</FUNCTION>
- <FUNCTION>bgtu</FUNCTION>
- <FUNCTION>bgtz</FUNCTION>
- <FUNCTION>ble</FUNCTION>
- <FUNCTION>bleu</FUNCTION>
- <FUNCTION>blez</FUNCTION>
- <FUNCTION>bgezal</FUNCTION>
- <FUNCTION>bltzal</FUNCTION>
- <FUNCTION>blt</FUNCTION>
- <FUNCTION>bltu</FUNCTION>
- <FUNCTION>bltz</FUNCTION>
- <FUNCTION>bne</FUNCTION>
- <FUNCTION>bnez</FUNCTION>
- <FUNCTION>j</FUNCTION>
- <FUNCTION>jal</FUNCTION>
- <FUNCTION>jalr</FUNCTION>
- <FUNCTION>jr</FUNCTION>
- <FUNCTION>la</FUNCTION>
- <FUNCTION>lb</FUNCTION>
- <FUNCTION>blu</FUNCTION>
- <FUNCTION>lh</FUNCTION>
- <FUNCTION>lhu</FUNCTION>
- <FUNCTION>lw</FUNCTION>
- <FUNCTION>lwcz</FUNCTION>
- <FUNCTION>lwl</FUNCTION>
- <FUNCTION>lwr</FUNCTION>
- <FUNCTION>ulh</FUNCTION>
- <FUNCTION>ulhu</FUNCTION>
- <FUNCTION>ulw</FUNCTION>
- <FUNCTION>sb</FUNCTION>
- <FUNCTION>sd</FUNCTION>
- <FUNCTION>sh</FUNCTION>
- <FUNCTION>sw</FUNCTION>
- <FUNCTION>swcz</FUNCTION>
- <FUNCTION>swl</FUNCTION>
- <FUNCTION>swr</FUNCTION>
- <FUNCTION>ush</FUNCTION>
- <FUNCTION>usw</FUNCTION>
- <FUNCTION>move</FUNCTION>
- <FUNCTION>mfhi</FUNCTION>
- <FUNCTION>mflo</FUNCTION>
- <FUNCTION>mthi</FUNCTION>
- <FUNCTION>mtlo</FUNCTION>
- <FUNCTION>mfcz</FUNCTION>
- <FUNCTION>mfc1.d</FUNCTION>
- <FUNCTION>mtcz</FUNCTION>
- <FUNCTION>abs.d</FUNCTION>
- <FUNCTION>abs.s</FUNCTION>
- <FUNCTION>add.d</FUNCTION>
- <FUNCTION>add.s</FUNCTION>
- <FUNCTION>c.eq.d</FUNCTION>
- <FUNCTION>c.eq.s</FUNCTION>
- <FUNCTION>c.le.d</FUNCTION>
- <FUNCTION>c.le.s</FUNCTION>
- <FUNCTION>c.lt.d</FUNCTION>
- <FUNCTION>c.lt.s</FUNCTION>
- <FUNCTION>cvt.d.s</FUNCTION>
- <FUNCTION>cbt.d.w</FUNCTION>
- <FUNCTION>cvt.s.d</FUNCTION>
- <FUNCTION>cvt.s.w</FUNCTION>
- <FUNCTION>cvt.w.d</FUNCTION>
- <FUNCTION>cvt.w.s</FUNCTION>
- <FUNCTION>div.d</FUNCTION>
- <FUNCTION>div.s</FUNCTION>
- <FUNCTION>l.d</FUNCTION>
- <FUNCTION>l.s</FUNCTION>
- <FUNCTION>mov.d</FUNCTION>
- <FUNCTION>mov.s</FUNCTION>
- <FUNCTION>mul.d</FUNCTION>
- <FUNCTION>mul.s</FUNCTION>
- <FUNCTION>neg.d</FUNCTION>
- <FUNCTION>neg.s</FUNCTION>
- <FUNCTION>s.d</FUNCTION>
- <FUNCTION>s.s</FUNCTION>
- <FUNCTION>sub.d</FUNCTION>
- <FUNCTION>sub.s</FUNCTION>
- <FUNCTION>rfe</FUNCTION>
- <FUNCTION>syscall</FUNCTION>
- <FUNCTION>break</FUNCTION>
- <FUNCTION>nop</FUNCTION>
-
- <!-- Integer Registers -->
- <KEYWORD2>$zero</KEYWORD2>
- <KEYWORD2>$at</KEYWORD2>
- <KEYWORD2>$v0</KEYWORD2>
- <KEYWORD2>$v1</KEYWORD2>
- <KEYWORD2>$a0</KEYWORD2>
- <KEYWORD2>$a1</KEYWORD2>
- <KEYWORD2>$a2</KEYWORD2>
- <KEYWORD2>$a3</KEYWORD2>
- <KEYWORD2>$t0</KEYWORD2>
- <KEYWORD2>$t1</KEYWORD2>
- <KEYWORD2>$t2</KEYWORD2>
- <KEYWORD2>$t3</KEYWORD2>
- <KEYWORD2>$t4</KEYWORD2>
- <KEYWORD2>$t5</KEYWORD2>
- <KEYWORD2>$t6</KEYWORD2>
- <KEYWORD2>$t7</KEYWORD2>
- <KEYWORD2>$s0</KEYWORD2>
- <KEYWORD2>$s1</KEYWORD2>
- <KEYWORD2>$s2</KEYWORD2>
- <KEYWORD2>$s3</KEYWORD2>
- <KEYWORD2>$s4</KEYWORD2>
- <KEYWORD2>$s5</KEYWORD2>
- <KEYWORD2>$s6</KEYWORD2>
- <KEYWORD2>$s7</KEYWORD2>
- <KEYWORD2>$t8</KEYWORD2>
- <KEYWORD2>$t9</KEYWORD2>
- <KEYWORD2>$k0</KEYWORD2>
- <KEYWORD2>$k1</KEYWORD2>
- <KEYWORD2>$gp</KEYWORD2>
- <KEYWORD2>$sp</KEYWORD2>
- <KEYWORD2>$fp</KEYWORD2>
- <KEYWORD2>$ra</KEYWORD2>
-
- <!-- Floating Point Registers -->
- <KEYWORD3>$f0</KEYWORD3>
- <KEYWORD3>$f1</KEYWORD3>
- <KEYWORD3>$f2</KEYWORD3>
- <KEYWORD3>$f3</KEYWORD3>
- <KEYWORD3>$f4</KEYWORD3>
- <KEYWORD3>$f5</KEYWORD3>
- <KEYWORD3>$f6</KEYWORD3>
- <KEYWORD3>$f7</KEYWORD3>
- <KEYWORD3>$f8</KEYWORD3>
- <KEYWORD3>$f9</KEYWORD3>
- <KEYWORD3>$f10</KEYWORD3>
- <KEYWORD3>$f11</KEYWORD3>
- <KEYWORD3>$f12</KEYWORD3>
- <KEYWORD3>$f13</KEYWORD3>
- <KEYWORD3>$f14</KEYWORD3>
- <KEYWORD3>$f15</KEYWORD3>
- <KEYWORD3>$f16</KEYWORD3>
- <KEYWORD3>$f17</KEYWORD3>
- <KEYWORD3>$f18</KEYWORD3>
- <KEYWORD3>$f19</KEYWORD3>
- <KEYWORD3>$f20</KEYWORD3>
- <KEYWORD3>$f21</KEYWORD3>
- <KEYWORD3>$f22</KEYWORD3>
- <KEYWORD3>$f23</KEYWORD3>
- <KEYWORD3>$f24</KEYWORD3>
- <KEYWORD3>$f25</KEYWORD3>
- <KEYWORD3>$f26</KEYWORD3>
- <KEYWORD3>$f27</KEYWORD3>
- <KEYWORD3>$f28</KEYWORD3>
- <KEYWORD3>$f29</KEYWORD3>
- <KEYWORD3>$f30</KEYWORD3>
- <KEYWORD3>$f31</KEYWORD3>
- </KEYWORDS>
- </RULES>
-</MODE>
+<?xml version="1.0"?>
+
+<!DOCTYPE MODE SYSTEM "xmode.dtd">
+
+<!-- MIPS/SPIM Assembly Mode from
+ Marc Rummel marc.rummel at stud.uni-karlsruhe.de
+ SIPM Homepage: http://www.cs.wisc.edu/~larus/spim.html
+-->
+
+<MODE>
+
+ <PROPS>
+ <PROPERTY NAME="blockComment" VALUE="#" />
+ <PROPERTY NAME="wordBreakChars" VALUE=",()" />
+ </PROPS>
+
+ <RULES HIGHLIGHT_DIGITS="TRUE" IGNORE_CASE="TRUE">
+ <!-- Comment -->
+ <EOL_SPAN TYPE="COMMENT1">#</EOL_SPAN>
+
+ <!-- Strings -->
+ <SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">
+ <BEGIN>'</BEGIN>
+ <END>'</END>
+ </SPAN>
+
+ <SPAN TYPE="LITERAL1" ESCAPE="\" NO_LINE_BREAK="TRUE">
+ <BEGIN>"</BEGIN>
+ <END>"</END>
+ </SPAN>
+
+ <!-- Labels -->
+ <MARK_PREVIOUS TYPE="LABEL" AT_LINE_START="TRUE">:</MARK_PREVIOUS>
+
+ <!-- Assembler directives -->
+ <KEYWORDS>
+ <KEYWORD1>.align</KEYWORD1>
+ <KEYWORD1>.ascii</KEYWORD1>
+ <KEYWORD1>.asciiz</KEYWORD1>
+ <KEYWORD1>.byte</KEYWORD1>
+ <KEYWORD1>.data</KEYWORD1>
+ <KEYWORD1>.double</KEYWORD1>
+ <KEYWORD1>.extern</KEYWORD1>
+ <KEYWORD1>.float</KEYWORD1>
+ <KEYWORD1>.globl</KEYWORD1>
+ <KEYWORD1>.half</KEYWORD1>
+ <KEYWORD1>.kdata</KEYWORD1>
+ <KEYWORD1>.ktext</KEYWORD1>
+ <KEYWORD1>.space</KEYWORD1>
+ <KEYWORD1>.text</KEYWORD1>
+ <KEYWORD1>.word</KEYWORD1>
+
+ <!-- MIPS/SPIM Operations -->
+ <FUNCTION>add</FUNCTION>
+ <FUNCTION>addi</FUNCTION>
+ <FUNCTION>addu</FUNCTION>
+ <FUNCTION>addiu</FUNCTION>
+ <FUNCTION>and</FUNCTION>
+ <FUNCTION>andi</FUNCTION>
+ <FUNCTION>div</FUNCTION>
+ <FUNCTION>divu</FUNCTION>
+ <FUNCTION>mul</FUNCTION>
+ <FUNCTION>mulo</FUNCTION>
+ <FUNCTION>mulou</FUNCTION>
+ <FUNCTION>mult</FUNCTION>
+ <FUNCTION>multu</FUNCTION>
+ <FUNCTION>neg</FUNCTION>
+ <FUNCTION>negu</FUNCTION>
+ <FUNCTION>nor</FUNCTION>
+ <FUNCTION>not</FUNCTION>
+ <FUNCTION>or</FUNCTION>
+ <FUNCTION>ori</FUNCTION>
+ <FUNCTION>rem</FUNCTION>
+ <FUNCTION>remu</FUNCTION>
+ <FUNCTION>rol</FUNCTION>
+ <FUNCTION>ror</FUNCTION>
+ <FUNCTION>sll</FUNCTION>
+ <FUNCTION>sllv</FUNCTION>
+ <FUNCTION>sra</FUNCTION>
+ <FUNCTION>srav</FUNCTION>
+ <FUNCTION>srl</FUNCTION>
+ <FUNCTION>srlv</FUNCTION>
+ <FUNCTION>sub</FUNCTION>
+ <FUNCTION>subu</FUNCTION>
+ <FUNCTION>xor</FUNCTION>
+ <FUNCTION>xori</FUNCTION>
+ <FUNCTION>li</FUNCTION>
+ <FUNCTION>lui</FUNCTION>
+ <FUNCTION>seq</FUNCTION>
+ <FUNCTION>sge</FUNCTION>
+ <FUNCTION>sgt</FUNCTION>
+ <FUNCTION>sgtu</FUNCTION>
+ <FUNCTION>sle</FUNCTION>
+ <FUNCTION>sleu</FUNCTION>
+ <FUNCTION>slt</FUNCTION>
+ <FUNCTION>slti</FUNCTION>
+ <FUNCTION>sltu</FUNCTION>
+ <FUNCTION>sltiu</FUNCTION>
+ <FUNCTION>sne</FUNCTION>
+ <FUNCTION>b</FUNCTION>
+ <FUNCTION>bczt</FUNCTION>
+ <FUNCTION>bczf</FUNCTION>
+ <FUNCTION>beq</FUNCTION>
+ <FUNCTION>beqz</FUNCTION>
+ <FUNCTION>bge</FUNCTION>
+ <FUNCTION>bgeu</FUNCTION>
+ <FUNCTION>bgez</FUNCTION>
+ <FUNCTION>bgezal</FUNCTION>
+ <FUNCTION>bgt</FUNCTION>
+ <FUNCTION>bgtu</FUNCTION>
+ <FUNCTION>bgtz</FUNCTION>
+ <FUNCTION>ble</FUNCTION>
+ <FUNCTION>bleu</FUNCTION>
+ <FUNCTION>blez</FUNCTION>
+ <FUNCTION>bgezal</FUNCTION>
+ <FUNCTION>bltzal</FUNCTION>
+ <FUNCTION>blt</FUNCTION>
+ <FUNCTION>bltu</FUNCTION>
+ <FUNCTION>bltz</FUNCTION>
+ <FUNCTION>bne</FUNCTION>
+ <FUNCTION>bnez</FUNCTION>
+ <FUNCTION>j</FUNCTION>
+ <FUNCTION>jal</FUNCTION>
+ <FUNCTION>jalr</FUNCTION>
+ <FUNCTION>jr</FUNCTION>
+ <FUNCTION>la</FUNCTION>
+ <FUNCTION>lb</FUNCTION>
+ <FUNCTION>blu</FUNCTION>
+ <FUNCTION>lh</FUNCTION>
+ <FUNCTION>lhu</FUNCTION>
+ <FUNCTION>lw</FUNCTION>
+ <FUNCTION>lwcz</FUNCTION>
+ <FUNCTION>lwl</FUNCTION>
+ <FUNCTION>lwr</FUNCTION>
+ <FUNCTION>ulh</FUNCTION>
+ <FUNCTION>ulhu</FUNCTION>
+ <FUNCTION>ulw</FUNCTION>
+ <FUNCTION>sb</FUNCTION>
+ <FUNCTION>sd</FUNCTION>
+ <FUNCTION>sh</FUNCTION>
+ <FUNCTION>sw</FUNCTION>
+ <FUNCTION>swcz</FUNCTION>
+ <FUNCTION>swl</FUNCTION>
+ <FUNCTION>swr</FUNCTION>
+ <FUNCTION>ush</FUNCTION>
+ <FUNCTION>usw</FUNCTION>
+ <FUNCTION>move</FUNCTION>
+ <FUNCTION>mfhi</FUNCTION>
+ <FUNCTION>mflo</FUNCTION>
+ <FUNCTION>mthi</FUNCTION>
+ <FUNCTION>mtlo</FUNCTION>
+ <FUNCTION>mfcz</FUNCTION>
+ <FUNCTION>mfc1.d</FUNCTION>
+ <FUNCTION>mtcz</FUNCTION>
+ <FUNCTION>abs.d</FUNCTION>
+ <FUNCTION>abs.s</FUNCTION>
+ <FUNCTION>add.d</FUNCTION>
+ <FUNCTION>add.s</FUNCTION>
+ <FUNCTION>c.eq.d</FUNCTION>
+ <FUNCTION>c.eq.s</FUNCTION>
+ <FUNCTION>c.le.d</FUNCTION>
+ <FUNCTION>c.le.s</FUNCTION>
+ <FUNCTION>c.lt.d</FUNCTION>
+ <FUNCTION>c.lt.s</FUNCTION>
+ <FUNCTION>cvt.d.s</FUNCTION>
+ <FUNCTION>cbt.d.w</FUNCTION>
+ <FUNCTION>cvt.s.d</FUNCTION>
+ <FUNCTION>cvt.s.w</FUNCTION>
+ <FUNCTION>cvt.w.d</FUNCTION>
+ <FUNCTION>cvt.w.s</FUNCTION>
+ <FUNCTION>div.d</FUNCTION>
+ <FUNCTION>div.s</FUNCTION>
+ <FUNCTION>l.d</FUNCTION>
+ <FUNCTION>l.s</FUNCTION>
+ <FUNCTION>mov.d</FUNCTION>
+ <FUNCTION>mov.s</FUNCTION>
+ <FUNCTION>mul.d</FUNCTION>
+ <FUNCTION>mul.s</FUNCTION>
+ <FUNCTION>neg.d</FUNCTION>
+ <FUNCTION>neg.s</FUNCTION>
+ <FUNCTION>s.d</FUNCTION>
+ <FUNCTION>s.s</FUNCTION>
+ <FUNCTION>sub.d</FUNCTION>
+ <FUNCTION>sub.s</FUNCTION>
+ <FUNCTION>rfe</FUNCTION>
+ <FUNCTION>syscall</FUNCTION>
+ <FUNCTION>break</FUNCTION>
+ <FUNCTION>nop</FUNCTION>
+
+ <!-- Integer Registers -->
+ <KEYWORD2>$zero</KEYWORD2>
+ <KEYWORD2>$at</KEYWORD2>
+ <KEYWORD2>$v0</KEYWORD2>
+ <KEYWORD2>$v1</KEYWORD2>
+ <KEYWORD2>$a0</KEYWORD2>
+ <KEYWORD2>$a1</KEYWORD2>
+ <KEYWORD2>$a2</KEYWORD2>
+ <KEYWORD2>$a3</KEYWORD2>
+ <KEYWORD2>$t0</KEYWORD2>
+ <KEYWORD2>$t1</KEYWORD2>
+ <KEYWORD2>$t2</KEYWORD2>
+ <KEYWORD2>$t3</KEYWORD2>
+ <KEYWORD2>$t4</KEYWORD2>
+ <KEYWORD2>$t5</KEYWORD2>
+ <KEYWORD2>$t6</KEYWORD2>
+ <KEYWORD2>$t7</KEYWORD2>
+ <KEYWORD2>$s0</KEYWORD2>
+ <KEYWORD2>$s1</KEYWORD2>
+ <KEYWORD2>$s2</KEYWORD2>
+ <KEYWORD2>$s3</KEYWORD2>
+ <KEYWORD2>$s4</KEYWORD2>
+ <KEYWORD2>$s5</KEYWORD2>
+ <KEYWORD2>$s6</KEYWORD2>
+ <KEYWORD2>$s7</KEYWORD2>
+ <KEYWORD2>$t8</KEYWORD2>
+ <KEYWORD2>$t9</KEYWORD2>
+ <KEYWORD2>$k0</KEYWORD2>
+ <KEYWORD2>$k1</KEYWORD2>
+ <KEYWORD2>$gp</KEYWORD2>
+ <KEYWORD2>$sp</KEYWORD2>
+ <KEYWORD2>$fp</KEYWORD2>
+ <KEYWORD2>$ra</KEYWORD2>
+
+ <!-- Floating Point Registers -->
+ <KEYWORD3>$f0</KEYWORD3>
+ <KEYWORD3>$f1</KEYWORD3>
+ <KEYWORD3>$f2</KEYWORD3>
+ <KEYWORD3>$f3</KEYWORD3>
+ <KEYWORD3>$f4</KEYWORD3>
+ <KEYWORD3>$f5</KEYWORD3>
+ <KEYWORD3>$f6</KEYWORD3>
+ <KEYWORD3>$f7</KEYWORD3>
+ <KEYWORD3>$f8</KEYWORD3>
+ <KEYWORD3>$f9</KEYWORD3>
+ <KEYWORD3>$f10</KEYWORD3>
+ <KEYWORD3>$f11</KEYWORD3>
+ <KEYWORD3>$f12</KEYWORD3>
+ <KEYWORD3>$f13</KEYWORD3>
+ <KEYWORD3>$f14</KEYWORD3>
+ <KEYWORD3>$f15</KEYWORD3>
+ <KEYWORD3>$f16</KEYWORD3>
+ <KEYWORD3>$f17</KEYWORD3>
+ <KEYWORD3>$f18</KEYWORD3>
+ <KEYWORD3>$f19</KEYWORD3>
+ <KEYWORD3>$f20</KEYWORD3>
+ <KEYWORD3>$f21</KEYWORD3>
+ <KEYWORD3>$f22</KEYWORD3>
+ <KEYWORD3>$f23</KEYWORD3>
+ <KEYWORD3>$f24</KEYWORD3>
+ <KEYWORD3>$f25</KEYWORD3>
+ <KEYWORD3>$f26</KEYWORD3>
+ <KEYWORD3>$f27</KEYWORD3>
+ <KEYWORD3>$f28</KEYWORD3>
+ <KEYWORD3>$f29</KEYWORD3>
+ <KEYWORD3>$f30</KEYWORD3>
+ <KEYWORD3>$f31</KEYWORD3>
+ </KEYWORDS>
+ </RULES>
+</MODE>
diff --git a/jEdit/modes/assembly-x86.xml b/jEdit/modes/assembly-x86.xml
index 7cd45d6..bf609af 100644
--- a/jEdit/modes/assembly-x86.xml
+++ b/jEdit/modes/assembly-x86.xml
@@ -1,864 +1,864 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE MODE SYSTEM "xmode.dtd">
-
-<!--
- x86 Assembly mode by Kristian Ovaska (kristian.ovaska at helsinki.fi)
-
- - Intel syntax
- - Instructions and registers of Pentium III/Athlon
- (including FPU, MMX, 3DNow! and SSE)
- - Full NASM 0.98 & MASM 6.15 keyword support, partial TASM support
--->
-
-<MODE>
-
- <PROPS>
- <PROPERTY NAME="lineComment" VALUE=";" />
- </PROPS>
-
- <RULES HIGHLIGHT_DIGITS="TRUE" IGNORE_CASE="TRUE"
- DIGIT_RE="(0x)?[\p{Digit}a-fA-F_]+[hHdD]?">
- <EOL_SPAN TYPE="COMMENT1">;</EOL_SPAN>
-
- <SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">
- <BEGIN>'</BEGIN>
- <END>'</END>
- </SPAN>
-
- <SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">
- <BEGIN>"</BEGIN>
- <END>"</END>
- </SPAN>
-
- <!-- NASM: label inside a macro -->
- <MARK_FOLLOWING TYPE="LABEL" MATCH_TYPE="OPERATOR"
- AT_LINE_START="TRUE">%%</MARK_FOLLOWING>
-
- <MARK_FOLLOWING TYPE="KEYWORD2" AT_LINE_START="TRUE">%</MARK_FOLLOWING>
-
- <MARK_PREVIOUS TYPE="LABEL" MATCH_TYPE="OPERATOR"
- AT_LINE_START="TRUE">:</MARK_PREVIOUS>
-
- <SEQ TYPE="OPERATOR">+</SEQ>
- <SEQ TYPE="OPERATOR">-</SEQ>
- <SEQ TYPE="OPERATOR">/</SEQ>
- <SEQ TYPE="OPERATOR">*</SEQ>
- <SEQ TYPE="OPERATOR">%</SEQ>
-
- <SEQ TYPE="OPERATOR">|</SEQ>
- <SEQ TYPE="OPERATOR">^</SEQ>
- <SEQ TYPE="OPERATOR">&</SEQ>
- <SEQ TYPE="OPERATOR">~</SEQ>
- <SEQ TYPE="OPERATOR">!</SEQ>
-
- <SEQ TYPE="OPERATOR">=</SEQ>
- <SEQ TYPE="OPERATOR"><</SEQ>
- <SEQ TYPE="OPERATOR">></SEQ>
-
- <KEYWORDS>
- <KEYWORD1>.186</KEYWORD1>
- <KEYWORD1>.286</KEYWORD1>
- <KEYWORD1>.286P</KEYWORD1>
- <KEYWORD1>.287</KEYWORD1>
- <KEYWORD1>.386</KEYWORD1>
- <KEYWORD1>.386P</KEYWORD1>
- <KEYWORD1>.387</KEYWORD1>
- <KEYWORD1>.486</KEYWORD1>
- <KEYWORD1>.486P</KEYWORD1>
- <KEYWORD1>.586</KEYWORD1>
- <KEYWORD1>.586P</KEYWORD1>
- <KEYWORD1>.686</KEYWORD1>
- <KEYWORD1>.686P</KEYWORD1>
- <KEYWORD1>.8086</KEYWORD1>
- <KEYWORD1>.8087</KEYWORD1>
- <KEYWORD1>.ALPHA</KEYWORD1>
- <KEYWORD1>.BREAK</KEYWORD1>
- <KEYWORD1>.BSS</KEYWORD1>
- <KEYWORD1>.CODE</KEYWORD1>
- <KEYWORD1>.CONST</KEYWORD1>
- <KEYWORD1>.CONTINUE</KEYWORD1>
- <KEYWORD1>.CREF</KEYWORD1>
- <KEYWORD1>.DATA</KEYWORD1>
- <KEYWORD1>.DATA?</KEYWORD1>
- <KEYWORD1>.DOSSEG</KEYWORD1>
- <KEYWORD1>.ELSE</KEYWORD1>
- <KEYWORD1>.ELSEIF</KEYWORD1>
- <KEYWORD1>.ENDIF</KEYWORD1>
- <KEYWORD1>.ENDW</KEYWORD1>
- <KEYWORD1>.ERR</KEYWORD1>
- <KEYWORD1>.ERR1</KEYWORD1>
- <KEYWORD1>.ERR2</KEYWORD1>
- <KEYWORD1>.ERRB</KEYWORD1>
- <KEYWORD1>.ERRDEF</KEYWORD1>
- <KEYWORD1>.ERRDIF</KEYWORD1>
- <KEYWORD1>.ERRDIFI</KEYWORD1>
- <KEYWORD1>.ERRE</KEYWORD1>
- <KEYWORD1>.ERRIDN</KEYWORD1>
- <KEYWORD1>.ERRIDNI</KEYWORD1>
- <KEYWORD1>.ERRNB</KEYWORD1>
- <KEYWORD1>.ERRNDEF</KEYWORD1>
- <KEYWORD1>.ERRNZ</KEYWORD1>
- <KEYWORD1>.EXIT</KEYWORD1>
- <KEYWORD1>.FARDATA</KEYWORD1>
- <KEYWORD1>.FARDATA?</KEYWORD1>
- <KEYWORD1>.IF</KEYWORD1>
- <KEYWORD1>.K3D</KEYWORD1>
- <KEYWORD1>.LALL</KEYWORD1>
- <KEYWORD1>.LFCOND</KEYWORD1>
- <KEYWORD1>.LIST</KEYWORD1>
- <KEYWORD1>.LISTALL</KEYWORD1>
- <KEYWORD1>.LISTIF</KEYWORD1>
- <KEYWORD1>.LISTMACRO</KEYWORD1>
- <KEYWORD1>.LISTMACROALL</KEYWORD1>
- <KEYWORD1>.MMX</KEYWORD1>
- <KEYWORD1>.MODEL</KEYWORD1>
- <KEYWORD1>.MSFLOAT</KEYWORD1>
- <KEYWORD1>.NO87</KEYWORD1>
- <KEYWORD1>.NOCREF</KEYWORD1>
- <KEYWORD1>.NOLIST</KEYWORD1>
- <KEYWORD1>.NOLISTIF</KEYWORD1>
- <KEYWORD1>.NOLISTMACRO</KEYWORD1>
- <KEYWORD1>.RADIX</KEYWORD1>
- <KEYWORD1>.REPEAT</KEYWORD1>
- <KEYWORD1>.SALL</KEYWORD1>
- <KEYWORD1>.SEQ</KEYWORD1>
- <KEYWORD1>.SFCOND&l